From ed3d2e8ef8d4893b2709d8faccba090161442a06 Mon Sep 17 00:00:00 2001 From: langedev Date: Sun, 19 Nov 2023 19:03:46 -0800 Subject: [PATCH 01/61] Initial commit lol --- flake.lock | 48 +++++++++++++++ flake.nix | 23 +++++++ home.nix | 54 ++++++++++++++++ programs/alacritty/default.nix | 32 ++++++++++ programs/fish/default.nix | 43 +++++++++++++ programs/fish/functions/fish_prompt.fish | 13 ++++ .../fish/functions/fish_right_prompt.fish | 61 +++++++++++++++++++ programs/fish/functions/git_branch_name.fish | 4 ++ programs/fish/functions/git_is_dirty.fish | 1 + programs/fish/functions/git_is_repo.fish | 5 ++ programs/fish/functions/git_is_staged.fish | 3 + programs/fish/functions/git_is_touched.fish | 6 ++ programs/fish/functions/git_is_worktree.fish | 2 + programs/fish/functions/n.fish | 30 +++++++++ programs/fish/functions/ssh.fish | 1 + programs/nnn/default.nix | 11 ++++ programs/pywal/default.nix | 8 +++ programs/rofi/default.nix | 30 +++++++++ 18 files changed, 375 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 home.nix create mode 100644 programs/alacritty/default.nix create mode 100644 programs/fish/default.nix create mode 100644 programs/fish/functions/fish_prompt.fish create mode 100644 programs/fish/functions/fish_right_prompt.fish create mode 100644 programs/fish/functions/git_branch_name.fish create mode 100644 programs/fish/functions/git_is_dirty.fish create mode 100644 programs/fish/functions/git_is_repo.fish create mode 100644 programs/fish/functions/git_is_staged.fish create mode 100644 programs/fish/functions/git_is_touched.fish create mode 100644 programs/fish/functions/git_is_worktree.fish create mode 100644 programs/fish/functions/n.fish create mode 100644 programs/fish/functions/ssh.fish create mode 100644 programs/nnn/default.nix create mode 100644 programs/pywal/default.nix create mode 100644 programs/rofi/default.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..e1632a9 --- /dev/null +++ b/flake.lock @@ -0,0 +1,48 @@ +{ + "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1700013383, + "narHash": "sha256-ZBhrew3BrUEv48i+3Mp2pDjLU6dcue8BKMz6tCDSyfc=", + "owner": "langedev", + "repo": "home-manager", + "rev": "6498661f3856a685c4fa7a19d0f8cbe17c08d8bd", + "type": "github" + }, + "original": { + "owner": "langedev", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1699825797, + "narHash": "sha256-W2m42mVt4/O6CJFbECPfLApmi8bO+qscbmSeEKrSHEg=", + "owner": "langedev", + "repo": "nixpkgs", + "rev": "a69768a1c385042d46ff57396c49d26df5ac035c", + "type": "github" + }, + "original": { + "owner": "langedev", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..ec6e780 --- /dev/null +++ b/flake.nix @@ -0,0 +1,23 @@ +{ + description = "Home Manager configuration of pan"; + + inputs = { + # Specify the source of Home Manager and Nixpkgs. + nixpkgs.url = "github:langedev/nixpkgs/nixos-unstable"; + home-manager = { + url = "github:langedev/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { nixpkgs, home-manager, ... }: + let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in { + homeConfigurations."pan" = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + modules = [ ./home.nix ]; + }; + }; +} diff --git a/home.nix b/home.nix new file mode 100644 index 0000000..b5b997e --- /dev/null +++ b/home.nix @@ -0,0 +1,54 @@ +{ config, pkgs, ... }: + +{ + nixpkgs.config.allowUnfree = true; + home.username = "pan"; + home.homeDirectory = "/home/pan"; + + xdg.enable = true; + + imports = [ + ./programs/alacritty + ./programs/pywal + ./programs/fish + ./programs/nnn + ./programs/rofi + ]; + + home.packages = with pkgs; [ + eww-wayland # eww widgets + socat # For hyprland scripts + swww # Wallpaper engine + trash-cli # Trash application + dunst # Notification Manager + wlr-randr # Xrandr for wayland + + # Applications + syncthing # For syncing files between computers + discord # Chat app + gimp # Photo editting + mpv # Video player + pamixer # Volume control + playerctl # Control media + wget # Download web stuff + zathura # PDF viewer + feh # Image viewer + sshfs # SSH File system + appimage-run # Lets you run app images + + # Development stuff, can be removed + nodejs # For compiling JS stuff + jq # May be critical for scripts? + ]; + # home.file = {}; + + home.sessionVariables = { + EDITOR = "nvim"; + VISUAL = "nvim"; + BROWSER = "librewolf"; + }; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; + home.stateVersion = "23.05"; # don't change lol, u know why +} diff --git a/programs/alacritty/default.nix b/programs/alacritty/default.nix new file mode 100644 index 0000000..49c8763 --- /dev/null +++ b/programs/alacritty/default.nix @@ -0,0 +1,32 @@ +{ config, pkgs, ... }: + +{ + programs.alacritty.enable = true; + + + programs.alacritty.settings = { + font = let fam = "Cascadia Code"; in { + normal = { + family = fam; + style = "Regular"; + }; + bold = { + family = fam; + style = "Bold"; + }; + italic = { + family = fam; + style = "Italic"; + }; + bold_italic = { + family = fam; + style = "Bold Italic"; + }; + offset = { + x = 0; + y = 0; + }; + size = 24.0; + }; + }; +} diff --git a/programs/fish/default.nix b/programs/fish/default.nix new file mode 100644 index 0000000..93c6018 --- /dev/null +++ b/programs/fish/default.nix @@ -0,0 +1,43 @@ +{ config, pkgs, ... }: + +{ + programs.fish.enable = true; + + programs.fish.interactiveShellInit = '' + cat ~/.cache/wal/sequences + ''; + + programs.fish.functions = { + fish_greeting = ""; + fish_prompt = '' + ${builtins.readFile ./functions/fish_prompt.fish} + ''; + fish_right_prompt = '' + ${builtins.readFile ./functions/fish_right_prompt.fish} + ''; + git_branch_name = '' + ${builtins.readFile ./functions/git_branch_name.fish} + ''; + git_is_dirty = '' + ${builtins.readFile ./functions/git_is_dirty.fish} + ''; + git_is_repo = '' + ${builtins.readFile ./functions/git_is_repo.fish} + ''; + git_is_staged = '' + ${builtins.readFile ./functions/git_is_staged.fish} + ''; + git_is_touched = '' + ${builtins.readFile ./functions/git_is_touched.fish} + ''; + git_is_worktree = '' + ${builtins.readFile ./functions/git_is_worktree.fish} + ''; + n = '' + ${builtins.readFile ./functions/n.fish} + ''; + ssh = '' + ${builtins.readFile ./functions/ssh.fish} + ''; + }; +} diff --git a/programs/fish/functions/fish_prompt.fish b/programs/fish/functions/fish_prompt.fish new file mode 100644 index 0000000..1740f57 --- /dev/null +++ b/programs/fish/functions/fish_prompt.fish @@ -0,0 +1,13 @@ +set -l last_command_status $status + +set -l symbol 'τ' + +set -l normal_color (set_color normal) +set -l symbol_color (set_color blue -o) +set -l error_color (set_color red -o) + +if test $last_command_status -eq 0 + echo -n -s $symbol_color $symbol " " $normal_color +else + echo -n -s $error_color $symbol " " $normal_color +end diff --git a/programs/fish/functions/fish_right_prompt.fish b/programs/fish/functions/fish_right_prompt.fish new file mode 100644 index 0000000..f46799d --- /dev/null +++ b/programs/fish/functions/fish_right_prompt.fish @@ -0,0 +1,61 @@ +set -l cwd +set -l cwd_color (set_color blue) +set -l normal_color (set_color normal) +set -l branch_color (set_color yellow) +set -l meta_color (set_color red) + +if git_is_repo + echo -n -s $branch_color (git_branch_name) $normal_color + set -l git_meta "" + if test (command git ls-files --others --exclude-standard | wc -w 2> /dev/null) -gt 0 + set git_meta "$git_meta?" + end + if test (command git rev-list --walk-reflogs --count refs/stash 2> /dev/null) + set git_meta "$git_meta\$" + end + if git_is_touched + git_is_dirty && set git_meta "$git_meta⨯" + git_is_staged && set git_meta "$git_meta●" + end + set -l commit_count (command git rev-list --count --left-right (git remote)/(git_branch_name)"...HEAD" 2> /dev/null) + if test $commit_count + set -l behind (echo $commit_count | cut -f 1) + set -l ahead (echo $commit_count | cut -f 2) + if test $behind -gt 0 + set git_meta "$git_meta🠋" + end + if test $ahead -gt 0 + set git_meta "$git_meta🠉" + end + end + if test $git_meta + echo -n -s $meta_color " " $git_meta " " $normal_color + else + echo -n -s " " + end + + + set root_folder (command git rev-parse --show-toplevel 2> /dev/null) + set parent_root_folder (dirname $root_folder) + set cwd (echo $PWD | sed -e "s|$parent_root_folder/||") +else + set cwd (prompt_pwd) +end + + +echo -n -s $cwd_color "$cwd" +set_color --dim + +set -l S (math $CMD_DURATION/1000) +set -l M (math $S/60) + + +echo -n -s " " +if test $M -gt 1 + echo -n -s $M m +else if test $S -gt 1 + echo -n -s $S s +else + echo -n -s $CMD_DURATION ms +end +set_color normal diff --git a/programs/fish/functions/git_branch_name.fish b/programs/fish/functions/git_branch_name.fish new file mode 100644 index 0000000..20b4149 --- /dev/null +++ b/programs/fish/functions/git_branch_name.fish @@ -0,0 +1,4 @@ +git_is_repo; and begin + command git symbolic-ref --short HEAD 2> /dev/null; + or command git show-ref --head -s --abbrev | head -n1 2> /dev/null +end diff --git a/programs/fish/functions/git_is_dirty.fish b/programs/fish/functions/git_is_dirty.fish new file mode 100644 index 0000000..f92e54d --- /dev/null +++ b/programs/fish/functions/git_is_dirty.fish @@ -0,0 +1 @@ +git_is_worktree; and not command git diff --no-ext-diff --quiet --exit-code diff --git a/programs/fish/functions/git_is_repo.fish b/programs/fish/functions/git_is_repo.fish new file mode 100644 index 0000000..00a2cfc --- /dev/null +++ b/programs/fish/functions/git_is_repo.fish @@ -0,0 +1,5 @@ +test -d .git +or begin + set -l info (command git rev-parse --git-dir --is-bare-repository 2>/dev/null) + and test $info[2] = false +end diff --git a/programs/fish/functions/git_is_staged.fish b/programs/fish/functions/git_is_staged.fish new file mode 100644 index 0000000..ef6b7ac --- /dev/null +++ b/programs/fish/functions/git_is_staged.fish @@ -0,0 +1,3 @@ +git_is_repo; and begin + not command git diff --cached --no-ext-diff --quiet --exit-code +end diff --git a/programs/fish/functions/git_is_touched.fish b/programs/fish/functions/git_is_touched.fish new file mode 100644 index 0000000..5605630 --- /dev/null +++ b/programs/fish/functions/git_is_touched.fish @@ -0,0 +1,6 @@ +git_is_worktree; and begin + # The first checks for staged changes, the second for unstaged ones. + # We put them in this order because checking staged changes is *fast*. + not command git diff-index --cached --quiet HEAD -- >/dev/null 2>&1 + or not command git diff --no-ext-diff --quiet --exit-code >/dev/null 2>&1 +end diff --git a/programs/fish/functions/git_is_worktree.fish b/programs/fish/functions/git_is_worktree.fish new file mode 100644 index 0000000..8b2c700 --- /dev/null +++ b/programs/fish/functions/git_is_worktree.fish @@ -0,0 +1,2 @@ +git_is_repo +and test (command git rev-parse --is-inside-git-dir) = false diff --git a/programs/fish/functions/n.fish b/programs/fish/functions/n.fish new file mode 100644 index 0000000..86eb7c3 --- /dev/null +++ b/programs/fish/functions/n.fish @@ -0,0 +1,30 @@ +# Block nesting of nnn in subshells +if test -n "$NNNLVL" + if [ (expr $NNNLVL + 0) -ge 1 ] + exit + return + end +end + +# The default behaviour is to cd on quit (nnn checks if NNN_TMPFILE is set) +# To cd on quit only on ^G, remove the "-x" as in: +# set NNN_TMPFILE "$XDG_CONFIG_HOME/nnn/.lastd" +# NOTE: NNN_TMPFILE is fixed, should not be modified +if test -n "$XDG_CONFIG_HOME" + set -x NNN_TMPFILE "$XDG_CONFIG_HOME/nnn/.lastd" +else + set -x NNN_TMPFILE "$HOME/.config/nnn/.lastd" +end + +# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn +# stty start undef +# stty stop undef +# stty lwrap undef +# stty lnext undef + +nnn -T v $argv + +if test -e $NNN_TMPFILE + source $NNN_TMPFILE + rm $NNN_TMPFILE +end diff --git a/programs/fish/functions/ssh.fish b/programs/fish/functions/ssh.fish new file mode 100644 index 0000000..ec2b82e --- /dev/null +++ b/programs/fish/functions/ssh.fish @@ -0,0 +1 @@ +command ssh -o IPQoS=0 $argv; diff --git a/programs/nnn/default.nix b/programs/nnn/default.nix new file mode 100644 index 0000000..e5f27c9 --- /dev/null +++ b/programs/nnn/default.nix @@ -0,0 +1,11 @@ +{ config, pkgs, ... }: + +{ + programs.nnn.enable = true; + home.sessionVariables = { + NNN_FCOLORS = "0000E6310000000000000000"; + NNN_OPTS = "eH"; + NNN_FIFO = "/tmp/nnn.fifo"; + NNN_TRASH = "1"; + }; +} diff --git a/programs/pywal/default.nix b/programs/pywal/default.nix new file mode 100644 index 0000000..f754d3e --- /dev/null +++ b/programs/pywal/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, ... }: + +{ + programs.pywal.enable = true; + home.packages = with pkgs; [ + pywalfox # Update librewolf's colorscheme based on pywal + ]; +} diff --git a/programs/rofi/default.nix b/programs/rofi/default.nix new file mode 100644 index 0000000..e24db42 --- /dev/null +++ b/programs/rofi/default.nix @@ -0,0 +1,30 @@ +{ config, pkgs, ... }: + +{ + programs.rofi.enable = true; + programs.rofi.package = pkgs.rofi-wayland; + programs.wofi.settings = { + show = "dmenu"; # Default to dmenu + prompt = ""; + hide_scroll = true; + insensitive = true; + location = "bottom_right"; + dynamic_lines = true; + yoffset = -100; + xoffset = -40; + height = "50%"; + width = "50%"; + }; + programs.wofi.style = '' + window { + background: rgba(0, 0, 0, 255); + font-size: 4rem; + } + #entry, #input { + margin: 2px; + background: #FFFFFF; + border-width: 2px; + border-color: #000000; + } + ''; +} From f10217bbae93f191098cf0bdafb26ef21635ccb1 Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 01:31:41 -0800 Subject: [PATCH 02/61] Add hyprland --- flake.lock | 129 +++++++++++++++++++++++++++++++++++- flake.nix | 10 ++- home.nix | 1 + programs/hypr/default.conf | 52 +++++++++++++++ programs/hypr/default.nix | 9 +++ programs/hypr/keybinds.conf | 50 ++++++++++++++ 6 files changed, 248 insertions(+), 3 deletions(-) create mode 100644 programs/hypr/default.conf create mode 100644 programs/hypr/default.nix create mode 100644 programs/hypr/keybinds.conf diff --git a/flake.lock b/flake.lock index e1632a9..4336bb3 100644 --- a/flake.lock +++ b/flake.lock @@ -20,7 +20,70 @@ "type": "github" } }, + "hyprland": { + "inputs": { + "hyprland-protocols": "hyprland-protocols", + "nixpkgs": "nixpkgs", + "systems": "systems", + "wlroots": "wlroots", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1700397206, + "narHash": "sha256-ityVJcy3I/E8soXctwWveg58+cXOSQXhDIcU6YR2gjI=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "646f4bc63861e03b01fed3833bb65d1d014e1bf3", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1691753796, + "narHash": "sha256-zOEwiWoXk3j3+EoF3ySUJmberFewWlagvewDRuWYAso=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "0c2ce70625cb30aef199cb388f99e19a61a6ce03", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, "nixpkgs": { + "locked": { + "lastModified": 1698134075, + "narHash": "sha256-foCD+nuKzfh49bIoiCBur4+Fx1nozo+4C/6k8BYk4sg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8efd5d1e283604f75a808a20e6cde0ef313d07d4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { "locked": { "lastModified": 1699825797, "narHash": "sha256-W2m42mVt4/O6CJFbECPfLApmi8bO+qscbmSeEKrSHEg=", @@ -39,7 +102,71 @@ "root": { "inputs": { "home-manager": "home-manager", - "nixpkgs": "nixpkgs" + "hyprland": "hyprland", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "wlroots": { + "flake": false, + "locked": { + "host": "gitlab.freedesktop.org", + "lastModified": 1699292815, + "narHash": "sha256-HXu98PyBMKEWLqiTb8viuLDznud/SdkdJsx5A5CWx7I=", + "owner": "wlroots", + "repo": "wlroots", + "rev": "5de9e1a99d6642c2d09d589aa37ff0a8945dcee1", + "type": "gitlab" + }, + "original": { + "host": "gitlab.freedesktop.org", + "owner": "wlroots", + "repo": "wlroots", + "rev": "5de9e1a99d6642c2d09d589aa37ff0a8945dcee1", + "type": "gitlab" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1697981233, + "narHash": "sha256-y8q4XUwx+gVK7i2eLjfR32lVo7TYvEslyzrmzYEaPZU=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "22e7a65ff9633e1dedfa5317fdffc49f68de2ff2", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index ec6e780..d9d68e4 100644 --- a/flake.nix +++ b/flake.nix @@ -4,20 +4,26 @@ inputs = { # Specify the source of Home Manager and Nixpkgs. nixpkgs.url = "github:langedev/nixpkgs/nixos-unstable"; + home-manager = { url = "github:langedev/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + + hyprland.url = "github:hyprwm/Hyprland"; }; - outputs = { nixpkgs, home-manager, ... }: + outputs = { nixpkgs, home-manager, hyprland, ... }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; in { homeConfigurations."pan" = home-manager.lib.homeManagerConfiguration { inherit pkgs; - modules = [ ./home.nix ]; + modules = [ + hyprland.homeManagerModules.default + ./home.nix + ]; }; }; } diff --git a/home.nix b/home.nix index b5b997e..6ce9508 100644 --- a/home.nix +++ b/home.nix @@ -8,6 +8,7 @@ xdg.enable = true; imports = [ + ./programs/hypr ./programs/alacritty ./programs/pywal ./programs/fish diff --git a/programs/hypr/default.conf b/programs/hypr/default.conf new file mode 100644 index 0000000..4b1dc22 --- /dev/null +++ b/programs/hypr/default.conf @@ -0,0 +1,52 @@ +monitor=,preferred,auto,1 +monitor=HDMI-A-1,disable + +exec-once = swww init +exec-once = swww img $HOME/med/pix/bg.png + +input { + kb_layout = us + follow_mouse = 1 + accel_profile = flat + sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. +} + +general { + gaps_in = 3 + gaps_out = 3 + border_size = 2 + col.active_border = rgb(F5C2E7) + col.inactive_border = rgb(1E1D2F) + + layout = master +} + +decoration { + rounding = 2 + blur { + size = 12 + } +} + +animations { + enabled = yes + + animation = windows, 1, 4, default, popin 50% + animation = windowsOut, 1, 4, default, popin 50% + animation = windowsMove, 1, 3, default + animation = border, 1, 3, default + animation = fade, 1, 3, default + animation = workspaces, 1, 3, default +} + +master { + no_gaps_when_only = true + new_is_master = false +} + +Binds { + workspace_back_and_forth = true +} + +windowrule = opacity 0.9 0.9,^(Alacritty)$ +windowrule = opacity 0.94 0.94,^(discord)$ diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix new file mode 100644 index 0000000..510e74b --- /dev/null +++ b/programs/hypr/default.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + wayland.windowManager.hyprland.enable = true; + wayland.windowManager.hyprland.extraConfig = '' + ${builtins.readFile ./default.conf} + ${builtins.readFile ./keybinds.conf} + ''; +} diff --git a/programs/hypr/keybinds.conf b/programs/hypr/keybinds.conf new file mode 100644 index 0000000..4ed1c58 --- /dev/null +++ b/programs/hypr/keybinds.conf @@ -0,0 +1,50 @@ +$mainMod = SUPER + +# Exec programs +bind = $mainMod, return, exec, alacritty +bind = $mainMod SHIFT, return, exec, rofi -show run +# bind = $mainMod SHIFT, P, exec, screenshot + +# Hyprland Management +bind = $mainMod SHIFT, Q, exit, + +# Bars stuff +bind = $mainMod, TAB, exec, eww open --toggle + +# Workspace / Monitor Management +bind = $mainMod, h, focusmonitor, l +bind = $mainMod, l, focusmonitor, r +bind = $mainMod, j, cyclenext, +bind = $mainMod, k, cyclenext, prev + +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Window Management +bind = $mainMod, C, killactive, + +bind = $mainMod, F, togglefloating, +bind = $mainMod SHIFT, F, fullscreen, + +bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1 +bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2 +bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3 +bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4 +bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5 +bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6 +bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7 +bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8 +bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9 +bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow From b9f1a52ee2230af6b4f56538530f02f99fa03213 Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 01:38:11 -0800 Subject: [PATCH 03/61] Add dunst --- home.nix | 1 + programs/dunst/default.nix | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 programs/dunst/default.nix diff --git a/home.nix b/home.nix index 6ce9508..8085393 100644 --- a/home.nix +++ b/home.nix @@ -9,6 +9,7 @@ imports = [ ./programs/hypr + ./programs/dunst ./programs/alacritty ./programs/pywal ./programs/fish diff --git a/programs/dunst/default.nix b/programs/dunst/default.nix new file mode 100644 index 0000000..3d9661f --- /dev/null +++ b/programs/dunst/default.nix @@ -0,0 +1,27 @@ +{ config, pkgs, ... }: + +{ + services.dunst.enable = true; + services.dunst.settings = { + global = { + frame_color = "#8AADF4"; + separator_color = "frame"; + }; + + urgency_low = { + background = "#24273A"; + foreground = "#CAD3F5"; + }; + + urgency_normal = { + background = "#24273A"; + foreground = "#CAD3F5"; + }; + + urgency_critical = { + background = "#24273A"; + foreground = "#CAD3F5"; + frame_color = "#F5A97F"; + }; + }; +} From 28590820e5ed538f3fb1e8e55e1d51412e5fde6d Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 01:56:34 -0800 Subject: [PATCH 04/61] Add git and remove ~/.manpager --- home.nix | 4 ++++ programs/git/default.nix | 12 ++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 programs/git/default.nix diff --git a/home.nix b/home.nix index 8085393..3cdee8d 100644 --- a/home.nix +++ b/home.nix @@ -10,6 +10,7 @@ imports = [ ./programs/hypr ./programs/dunst + ./programs/git ./programs/alacritty ./programs/pywal ./programs/fish @@ -50,6 +51,9 @@ BROWSER = "librewolf"; }; + # Enable man pages, but ensure ~/.manpage isn't created + programs.man.enable = true; + programs.man.generateCaches = false; # Let Home Manager install and manage itself. programs.home-manager.enable = true; home.stateVersion = "23.05"; # don't change lol, u know why diff --git a/programs/git/default.nix b/programs/git/default.nix new file mode 100644 index 0000000..107376d --- /dev/null +++ b/programs/git/default.nix @@ -0,0 +1,12 @@ +{ config, pkgs, ... }: + +{ + programs.git.enable = true; + programs.git.userName = "langedev"; + programs.git.userEmail = "public@daltonlange.com"; + programs.git.extraConfig = { + safe = { + directory = "/etc/nixos"; + }; + }; +} From 92adc76e0cff4e4df4f684e98ee54819f58bacad Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 02:22:10 -0800 Subject: [PATCH 05/61] Add XDG, and move program installations to better modules --- home.nix | 8 +------- programs/hypr/default.nix | 5 +++++ programs/nnn/default.nix | 3 +++ programs/xdg/default.nix | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 programs/xdg/default.nix diff --git a/home.nix b/home.nix index 3cdee8d..d5b7845 100644 --- a/home.nix +++ b/home.nix @@ -5,9 +5,8 @@ home.username = "pan"; home.homeDirectory = "/home/pan"; - xdg.enable = true; - imports = [ + ./programs/xdg ./programs/hypr ./programs/dunst ./programs/git @@ -20,11 +19,6 @@ home.packages = with pkgs; [ eww-wayland # eww widgets - socat # For hyprland scripts - swww # Wallpaper engine - trash-cli # Trash application - dunst # Notification Manager - wlr-randr # Xrandr for wayland # Applications syncthing # For syncing files between computers diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix index 510e74b..8fc5589 100644 --- a/programs/hypr/default.nix +++ b/programs/hypr/default.nix @@ -6,4 +6,9 @@ ${builtins.readFile ./default.conf} ${builtins.readFile ./keybinds.conf} ''; + home.packages = with pkgs; [ + socat # For hyprland scripts + swww # Wallpaper engine + wlr-randr # Xrandr for wayland + ]; } diff --git a/programs/nnn/default.nix b/programs/nnn/default.nix index e5f27c9..583a7b2 100644 --- a/programs/nnn/default.nix +++ b/programs/nnn/default.nix @@ -8,4 +8,7 @@ NNN_FIFO = "/tmp/nnn.fifo"; NNN_TRASH = "1"; }; + home.packages = with pkgs; [ + trash-cli # Trash program for nnn + ]; } diff --git a/programs/xdg/default.nix b/programs/xdg/default.nix new file mode 100644 index 0000000..835b5fa --- /dev/null +++ b/programs/xdg/default.nix @@ -0,0 +1,16 @@ +{ config, pkgs, ... }: + +{ + xdg.enable = true; + xdg.userDirs.enable = true; + xdg.userDirs = { + desktop = "${config.home.homeDirectory}/dwn"; + download = "${config.home.homeDirectory}/dwn"; + documents = "${config.home.homeDirectory}/dox"; + publicShare = "${config.home.homeDirectory}/dox/public"; + templates = "${config.home.homeDirectory}/dox/templates"; + music = "${config.home.homeDirectory}/med/mus"; + pictures = "${config.home.homeDirectory}/med/pix"; + videos = "${config.home.homeDirectory}/med/vid"; + }; +} From 7ad25b1983ba2bec3c96fd253306d954457a1dfb Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 02:22:55 -0800 Subject: [PATCH 06/61] Remove extra rofi data --- programs/rofi/default.nix | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/programs/rofi/default.nix b/programs/rofi/default.nix index e24db42..1db30ee 100644 --- a/programs/rofi/default.nix +++ b/programs/rofi/default.nix @@ -3,28 +3,4 @@ { programs.rofi.enable = true; programs.rofi.package = pkgs.rofi-wayland; - programs.wofi.settings = { - show = "dmenu"; # Default to dmenu - prompt = ""; - hide_scroll = true; - insensitive = true; - location = "bottom_right"; - dynamic_lines = true; - yoffset = -100; - xoffset = -40; - height = "50%"; - width = "50%"; - }; - programs.wofi.style = '' - window { - background: rgba(0, 0, 0, 255); - font-size: 4rem; - } - #entry, #input { - margin: 2px; - background: #FFFFFF; - border-width: 2px; - border-color: #000000; - } - ''; } From f3ba0c3ab81691dcfb332672c6be34a2c28b58a7 Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 02:51:44 -0800 Subject: [PATCH 07/61] Add nvim support --- home.nix | 1 + programs/nvim/default.nix | 74 +++++++++++++++++++++++++++++++++++++++ programs/nvim/init.vim | 67 +++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 programs/nvim/default.nix create mode 100644 programs/nvim/init.vim diff --git a/home.nix b/home.nix index d5b7845..8540bab 100644 --- a/home.nix +++ b/home.nix @@ -15,6 +15,7 @@ ./programs/fish ./programs/nnn ./programs/rofi + ./programs/nvim ]; home.packages = with pkgs; [ diff --git a/programs/nvim/default.nix b/programs/nvim/default.nix new file mode 100644 index 0000000..bd19ffd --- /dev/null +++ b/programs/nvim/default.nix @@ -0,0 +1,74 @@ +{ config, pkgs, ... }: + +{ + programs.neovim.enable = true; + programs.neovim.extraConfig = '' + ${builtins.readFile ./init.vim} + ''; + programs.neovim.plugins = with pkgs.vimPlugins; [ + { # Personal Wiki + plugin = vimwiki; + config = '' + let g:vimwiki_list = [{'path': '~/dox/wiki', 'links_space_char': '_', + \ 'ext': '.md', 'syntax': 'markdown'}] + ''; + } + { # NNN in vim + plugin = nnn-vim; + config = '' + let g:nnn#layout = { 'window': { + \ 'width': 0.35, + \ 'height': 0.5, + \ 'xoffset': 1.0, + \ 'highlight': 'Debug' } } " hover window + let g:nnn#action = { + \ '': 'tab split', + \ '': 'split', + \ '': 'vsplit' } + let g:nnn#command = 'nnn -HoeT v' + let g:nnn#replace_netrw = 1 + ''; + } + { # Fuzzy searches + plugin = fzf-vim; + config = '' + map :Files + map :Ag + ''; + } + { # Auto completions + plugin = coc-nvim; + config = '' + function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' + endfunction + + inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() + inoremap pumvisible() ? "\" : "\" + ''; + } + vim-commentary # multi-line comments + vim-fugitive # Git Plugin + vimtex # Latex support + tagbar # File tagging + + # === LOOK AND FEEL === + { # Status Bar + plugin = vim-airline; + config = '' + let g:airline#extensions#tagbar#flags = 'fs' + ''; + } + { # Rainbow Parenthesis + plugin = rainbow; + config = '' + let g:rainbow_actve = 1 + ''; + } + vim-polyglot # Syntax Highlighting + ]; +} diff --git a/programs/nvim/init.vim b/programs/nvim/init.vim new file mode 100644 index 0000000..a40649a --- /dev/null +++ b/programs/nvim/init.vim @@ -0,0 +1,67 @@ +syntax on +let mapleader =" " +set encoding=utf-8 +set nocompatible +filetype plugin on +set list + +set updatetime=300 + +" Easy Split Navigation +nnoremap +nnoremap +nnoremap +nnoremap + +" Indentation +set tabstop=2 softtabstop=0 shiftwidth=2 smarttab expandtab + +" Searching +set smartcase + +" Backups +set noswapfile +set nobackup +set undodir=~/.config/nvim/undodir +set undofile + +" Right column at 80 lines for good coding practice. +set colorcolumn=80 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" QoL +set showmatch " Show matching Brackets +set number relativenumber " Side numbers + +" Fuzzy finding by allowing searching into subfolders +set path+=** +set wildmenu +" use :find to find, and * to make it fuzzy. +" Also make use of :b. + +" Delete trailing white space and newlines at end of file on save. +autocmd BufWritePre * %s/\s\+$//e +autocmd BufWritePre * %s/\n\+\%$//e + +" Easy copy and pasting to external programs +map "+yy +map "+P + +autocmd BufRead,BufNewFile *.md call WritingMode() +autocmd BufRead,BufNewFile *.tex call WritingMode() +autocmd BufRead,BufNewFile *.svx call WritingMode() + +autocmd BufRead,BufNewFile *.py call PythonMode() + +function! WritingMode() + setlocal textwidth=80 + setlocal wrap linebreak nolist + setlocal whichwrap+=<,>,h,l + nnoremap j gj + nnoremap k gk + setlocal spell spelllang=en_us +endfunction +function! PythonMode() + setlocal foldmethod=indent + setlocal foldlevel=99 +endfunction From 3fad5809b934ad34cba6d58bdcd0eecebb20abff Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 09:52:17 -0800 Subject: [PATCH 08/61] Add mpv support [untested] --- home.nix | 15 ++++++++------- programs/mpv/default.nix | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 programs/mpv/default.nix diff --git a/home.nix b/home.nix index 8540bab..3db3a7a 100644 --- a/home.nix +++ b/home.nix @@ -16,27 +16,28 @@ ./programs/nnn ./programs/rofi ./programs/nvim + ./programs/mpv ]; home.packages = with pkgs; [ - eww-wayland # eww widgets - # Applications - syncthing # For syncing files between computers discord # Chat app gimp # Photo editting - mpv # Video player pamixer # Volume control playerctl # Control media wget # Download web stuff - zathura # PDF viewer feh # Image viewer - sshfs # SSH File system appimage-run # Lets you run app images - # Development stuff, can be removed nodejs # For compiling JS stuff jq # May be critical for scripts? + + # Check if want settings? + zathura # PDF viewer + + # Expand into other areas + sshfs # SSH File system (SSH) + eww-wayland # eww widgets (EWW) ]; # home.file = {}; diff --git a/programs/mpv/default.nix b/programs/mpv/default.nix new file mode 100644 index 0000000..bc41ad5 --- /dev/null +++ b/programs/mpv/default.nix @@ -0,0 +1,14 @@ +{ config, pkgs, ... }: + +{ + programs.mpv.enable = true; + programs.mpv.config = { + volume-max = 150; + force-window = "yes"; + script-opts = "ytdl_hook-ytdl_path=yt-dlp"; + ytdl-format = "bestvideo[height<=?1080][vcodec!=vp9]+bestaudio/best"; + }; + home.packages = with pkgs; [ + yt-dlp + ]; +} From 7f324958a57132edae61a4de8964dfab282fc63d Mon Sep 17 00:00:00 2001 From: langedev Date: Mon, 20 Nov 2023 10:28:36 -0800 Subject: [PATCH 09/61] Add eww and SSH --- home.nix | 30 +++++++------- programs/eww/config/eww.scss | 8 ++++ programs/eww/config/eww.yuck | 0 programs/eww/config/modules/bar.yuck | 40 +++++++++++++++++++ .../config/modules/components/hyprwindow.yuck | 5 +++ .../modules/components/hyprworkspaces.yuck | 17 ++++++++ .../eww/config/modules/components/index.html | 18 +++++++++ .../config/modules/components/internet.yuck | 8 ++++ .../modules/components/japaneseaudio.yuck | 11 +++++ .../modules/components/japanesebattery.yuck | 9 +++++ .../modules/components/japanesedate.yuck | 9 +++++ programs/eww/config/modules/index.html | 16 ++++++++ programs/eww/config/modules/powerbar.yuck | 15 +++++++ .../config/scripts/change-active-workspace | 21 ++++++++++ .../eww/config/scripts/get-active-workspace | 3 ++ programs/eww/config/scripts/get-window-title | 3 ++ programs/eww/config/scripts/get-workspaces | 11 +++++ programs/eww/config/scripts/index.html | 20 ++++++++++ programs/eww/config/scripts/japanesedate | 31 ++++++++++++++ programs/eww/config/scripts/medpreview | 3 ++ programs/eww/config/variables.yuck | 0 programs/eww/config/windows.yuck | 32 +++++++++++++++ programs/eww/default.nix | 7 ++++ programs/ssh/default.nix | 8 ++++ 24 files changed, 309 insertions(+), 16 deletions(-) create mode 100644 programs/eww/config/eww.scss create mode 100644 programs/eww/config/eww.yuck create mode 100644 programs/eww/config/modules/bar.yuck create mode 100644 programs/eww/config/modules/components/hyprwindow.yuck create mode 100644 programs/eww/config/modules/components/hyprworkspaces.yuck create mode 100644 programs/eww/config/modules/components/index.html create mode 100644 programs/eww/config/modules/components/internet.yuck create mode 100644 programs/eww/config/modules/components/japaneseaudio.yuck create mode 100644 programs/eww/config/modules/components/japanesebattery.yuck create mode 100644 programs/eww/config/modules/components/japanesedate.yuck create mode 100644 programs/eww/config/modules/index.html create mode 100644 programs/eww/config/modules/powerbar.yuck create mode 100644 programs/eww/config/scripts/change-active-workspace create mode 100644 programs/eww/config/scripts/get-active-workspace create mode 100644 programs/eww/config/scripts/get-window-title create mode 100644 programs/eww/config/scripts/get-workspaces create mode 100644 programs/eww/config/scripts/index.html create mode 100644 programs/eww/config/scripts/japanesedate create mode 100644 programs/eww/config/scripts/medpreview create mode 100644 programs/eww/config/variables.yuck create mode 100644 programs/eww/config/windows.yuck create mode 100644 programs/eww/default.nix create mode 100644 programs/ssh/default.nix diff --git a/home.nix b/home.nix index 3db3a7a..11310c2 100644 --- a/home.nix +++ b/home.nix @@ -6,17 +6,19 @@ home.homeDirectory = "/home/pan"; imports = [ - ./programs/xdg - ./programs/hypr - ./programs/dunst - ./programs/git ./programs/alacritty - ./programs/pywal + ./programs/dunst + ./programs/eww ./programs/fish - ./programs/nnn - ./programs/rofi - ./programs/nvim + ./programs/git + ./programs/hypr ./programs/mpv + ./programs/nnn + ./programs/nvim + ./programs/pywal + ./programs/rofi + ./programs/ssh + ./programs/xdg ]; home.packages = with pkgs; [ @@ -28,16 +30,12 @@ wget # Download web stuff feh # Image viewer appimage-run # Lets you run app images - # Development stuff, can be removed + zathura # PDF viewer + ani-cli # Easy anime player + + # Development stuff nodejs # For compiling JS stuff jq # May be critical for scripts? - - # Check if want settings? - zathura # PDF viewer - - # Expand into other areas - sshfs # SSH File system (SSH) - eww-wayland # eww widgets (EWW) ]; # home.file = {}; diff --git a/programs/eww/config/eww.scss b/programs/eww/config/eww.scss new file mode 100644 index 0000000..559b968 --- /dev/null +++ b/programs/eww/config/eww.scss @@ -0,0 +1,8 @@ +box { + background-color: #1E1D2F; + color: #D9E0EE; +} + +progressbar > trough { + min-width: 40px; +} diff --git a/programs/eww/config/eww.yuck b/programs/eww/config/eww.yuck new file mode 100644 index 0000000..e69de29 diff --git a/programs/eww/config/modules/bar.yuck b/programs/eww/config/modules/bar.yuck new file mode 100644 index 0000000..137bb51 --- /dev/null +++ b/programs/eww/config/modules/bar.yuck @@ -0,0 +1,40 @@ +(include "./widgets/components/hyprwindow.yuck") +(include "./widgets/components/hyprworkspaces.yuck") +(include "./widgets/components/internet.yuck") +(include "./widgets/components/japanesedate.yuck") +(include "./widgets/components/japaneseaudio.yuck") + +(defwidget bar [] + (centerbox :orientation "horizontal" + :style "padding: 0px 8px" + (box :halign "start" + :spacing 18 + :space-evenly false + (hyprworkspaces) + (hyprwindow) + ) + "" + (box :halign "end" + :spacing 18 + :space-evenly false + (eventbox :onhover "eww open preview" + :onhoverlost "eww close preview" + barplayer + ) + (internet) + (japaneseaudio) + (japanesedate) + (label :style "color: #FAE3B0" + :text bartime + ) + ) + ) +) + +(defpoll bartime :interval "10s" + "date '+%H:%M'" +) + +(deflisten barplayer :initial "" + "playerctl --follow metadata --format '{{ artist }} - {{ title }}' || true" +) diff --git a/programs/eww/config/modules/components/hyprwindow.yuck b/programs/eww/config/modules/components/hyprwindow.yuck new file mode 100644 index 0000000..2e2d519 --- /dev/null +++ b/programs/eww/config/modules/components/hyprwindow.yuck @@ -0,0 +1,5 @@ +(defwidget hyprwindow [] + (label :text "${hyprwindow_listener}") +) + +(deflisten hyprwindow_listener :initial "" "bash $XDG_CONFIG_HOME/eww/scripts/get-window-title") diff --git a/programs/eww/config/modules/components/hyprworkspaces.yuck b/programs/eww/config/modules/components/hyprworkspaces.yuck new file mode 100644 index 0000000..aa44634 --- /dev/null +++ b/programs/eww/config/modules/components/hyprworkspaces.yuck @@ -0,0 +1,17 @@ +(defwidget hyprworkspaces [] + (eventbox :onscroll "bash ~/.config/eww/scripts/change-active-workspace {} ${current_workspace}" :class "workspaces-widget" + (box :space-evenly false + :spacing 5 + (for workspace in workspaces + (eventbox :onclick "hyprctl dispatch workspace ${workspace.id}" + (box :class "workspace-entry ${workspace.id == current_workspace ? "current" : ""} ${workspace.windows > 0 ? "occupied" : "empty"}" + (label :text "${workspace.id}") + ) + ) + ) + ) + ) + ) + +(deflisten workspaces :initial "[]" "bash $XDG_CONFIG_HOME/eww/scripts/get-workspaces") +(deflisten current_workspace :initial "1" "bash $XDG_CONFIG_HOME/eww/scripts/get-active-workspace") diff --git a/programs/eww/config/modules/components/index.html b/programs/eww/config/modules/components/index.html new file mode 100644 index 0000000..f47c072 --- /dev/null +++ b/programs/eww/config/modules/components/index.html @@ -0,0 +1,18 @@ + + + + +Directory listing for /eww/widgets/components/ + + +

Directory listing for /eww/widgets/components/

+
+ +
+ + diff --git a/programs/eww/config/modules/components/internet.yuck b/programs/eww/config/modules/components/internet.yuck new file mode 100644 index 0000000..64aec24 --- /dev/null +++ b/programs/eww/config/modules/components/internet.yuck @@ -0,0 +1,8 @@ +(defwidget internet [] + (box :spacing 0 :space-evenly false :style "color: #f5c2e7" + network + ) +) + +(defpoll network :interval "30s" + "iwgetid -r") diff --git a/programs/eww/config/modules/components/japaneseaudio.yuck b/programs/eww/config/modules/components/japaneseaudio.yuck new file mode 100644 index 0000000..74bbc98 --- /dev/null +++ b/programs/eww/config/modules/components/japaneseaudio.yuck @@ -0,0 +1,11 @@ +(defwidget japaneseaudio [] + (eventbox :onscroll "bash -c 'if [ '{}' = 'up' ]; then pamixer -i 5; else pamixer -d 5; fi'" + (box :spacing 0 :space-evenly false :style "color: #96CDFB" + volume + "音" + ) + ) +) + +(defpoll volume :interval "1s" + "pamixer --get-volume") diff --git a/programs/eww/config/modules/components/japanesebattery.yuck b/programs/eww/config/modules/components/japanesebattery.yuck new file mode 100644 index 0000000..40d45cf --- /dev/null +++ b/programs/eww/config/modules/components/japanesebattery.yuck @@ -0,0 +1,9 @@ +(defwidget japanesebattery [] + (box :spacing 0 :space-evenly false :style "color: #FAB387" + power + "電" + ) +) + +(defpoll power :interval "1m" + "cat /sys/class/power_supply/BAT1/capacity") diff --git a/programs/eww/config/modules/components/japanesedate.yuck b/programs/eww/config/modules/components/japanesedate.yuck new file mode 100644 index 0000000..fe43c00 --- /dev/null +++ b/programs/eww/config/modules/components/japanesedate.yuck @@ -0,0 +1,9 @@ +(defwidget japanesedate [] + (label :style "color: #DDB6F2" + :text japanesedate_time + ) +) + +(defpoll japanesedate_time :interval "100s" + "bash $XDG_CONFIG_HOME/eww/scripts/japanesedate" +) diff --git a/programs/eww/config/modules/index.html b/programs/eww/config/modules/index.html new file mode 100644 index 0000000..dd51262 --- /dev/null +++ b/programs/eww/config/modules/index.html @@ -0,0 +1,16 @@ + + + + +Directory listing for /eww/widgets/ + + +

Directory listing for /eww/widgets/

+
+ +
+ + diff --git a/programs/eww/config/modules/powerbar.yuck b/programs/eww/config/modules/powerbar.yuck new file mode 100644 index 0000000..ac1ac1f --- /dev/null +++ b/programs/eww/config/modules/powerbar.yuck @@ -0,0 +1,15 @@ +(defwidget powerbar [] + (box + :orientation "vertical" + :spacing 8 + :space-evenly false + :style "color: #FAB387" + (progress + :orientation "v" + :value {100 - power}) + "電" + ) +) + +(defpoll power :interval "1m" + "cat /sys/class/power_supply/BAT1/capacity") diff --git a/programs/eww/config/scripts/change-active-workspace b/programs/eww/config/scripts/change-active-workspace new file mode 100644 index 0000000..ffaf9fc --- /dev/null +++ b/programs/eww/config/scripts/change-active-workspace @@ -0,0 +1,21 @@ +#!/bin/sh +function clamp { + min=$1 + max=$2 + val=$3 + python -c "print(max($min, min($val, $max)))" +} + +direction=$1 +current=$2 +if test "$direction" = "down" +then + target=$(clamp 1 10 $(($current+1))) + echo "jumping to $target" + hyprctl dispatch workspace $target +elif test "$direction" = "up" +then + target=$(clamp 1 10 $(($current-1))) + echo "jumping to $target" + hyprctl dispatch workspace $target +fi diff --git a/programs/eww/config/scripts/get-active-workspace b/programs/eww/config/scripts/get-active-workspace new file mode 100644 index 0000000..b97efdf --- /dev/null +++ b/programs/eww/config/scripts/get-active-workspace @@ -0,0 +1,3 @@ +#!/bin/sh +hyprctl monitors -j | jq --raw-output .[0].activeWorkspace.id +socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 grep '^workspace>>' | stdbuf -o0 awk -F '>>|,' '{print $2}' diff --git a/programs/eww/config/scripts/get-window-title b/programs/eww/config/scripts/get-window-title new file mode 100644 index 0000000..c1be34a --- /dev/null +++ b/programs/eww/config/scripts/get-window-title @@ -0,0 +1,3 @@ +#!/bin/sh +hyprctl activewindow -j | jq --raw-output .title +socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 grep '^activewindow>>' | stdbuf -o0 awk -F '>>|,' '{print $3}' diff --git a/programs/eww/config/scripts/get-workspaces b/programs/eww/config/scripts/get-workspaces new file mode 100644 index 0000000..68d7108 --- /dev/null +++ b/programs/eww/config/scripts/get-workspaces @@ -0,0 +1,11 @@ +#!/bin/sh + +spaces (){ + WORKSPACE_WINDOWS=$(hyprctl workspaces -j | jq 'map({key: .id | tostring, value: .windows}) | from_entries') + seq 1 10 | jq --argjson windows "${WORKSPACE_WINDOWS}" --slurp -Mc 'map(tostring) | map({id: ., windows: ($windows[.]//0)})' +} + +spaces +socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do + spaces +done diff --git a/programs/eww/config/scripts/index.html b/programs/eww/config/scripts/index.html new file mode 100644 index 0000000..590c85c --- /dev/null +++ b/programs/eww/config/scripts/index.html @@ -0,0 +1,20 @@ + + + + +Directory listing for /eww/scripts/ + + +

Directory listing for /eww/scripts/

+
+ +
+ + diff --git a/programs/eww/config/scripts/japanesedate b/programs/eww/config/scripts/japanesedate new file mode 100644 index 0000000..7360f73 --- /dev/null +++ b/programs/eww/config/scripts/japanesedate @@ -0,0 +1,31 @@ +#!/bin/sh + +readarray -t dateparts <<<"$(date "+%0m月%0d日%n%u")" + +echo -n "${dateparts[0]}[" + +case ${dateparts[1]} in + 1) + echo -n "月" + ;; + 2) + echo -n "火" + ;; + 3) + echo -n "水" + ;; + 4) + echo -n "木" + ;; + 5) + echo -n "金" + ;; + 6) + echo -n "土" + ;; + 7) + echo -n "日" + ;; +esac + +echo "]" diff --git a/programs/eww/config/scripts/medpreview b/programs/eww/config/scripts/medpreview new file mode 100644 index 0000000..3b35839 --- /dev/null +++ b/programs/eww/config/scripts/medpreview @@ -0,0 +1,3 @@ +#!/bin/sh + +playerctl --follow metadata mpris:artUrl | stdbuf -o0 cut -c 8- diff --git a/programs/eww/config/variables.yuck b/programs/eww/config/variables.yuck new file mode 100644 index 0000000..e69de29 diff --git a/programs/eww/config/windows.yuck b/programs/eww/config/windows.yuck new file mode 100644 index 0000000..29fb7c9 --- /dev/null +++ b/programs/eww/config/windows.yuck @@ -0,0 +1,32 @@ +(include "./widgets/bar.yuck") +(include "./widgets/powerbar.yuck") + +(defwindow bar0 + :monitor 0 + :geometry (geometry :width "100%" + :height "29px" + :anchor "top center") + :stacking "fg" + :exclusive true + (bar) +) + +(defwindow preview + :monitor 0 + :geometry (geometry :x "100px" + :y "5px" + :anchor "top right") + (image :path mediapreview) +) + +(defwindow powerbar0 + :monitor 0 + :geometry (geometry :x "100px" + :y "5px" + :anchor "top right") + (powerbar) +) + +(deflisten mediapreview :initial "hello?" + "bash $XDG_CONFIG_HOME/eww/scripts/medpreview" +) diff --git a/programs/eww/default.nix b/programs/eww/default.nix new file mode 100644 index 0000000..135aed8 --- /dev/null +++ b/programs/eww/default.nix @@ -0,0 +1,7 @@ +{ config, pkgs, ... }: + +{ + programs.eww.enable = true; + programs.eww.package = pkgs.eww-wayland; + programs.eww.configDir = ./config; +} diff --git a/programs/ssh/default.nix b/programs/ssh/default.nix new file mode 100644 index 0000000..4e0f26f --- /dev/null +++ b/programs/ssh/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, ... }: + +{ + programs.ssh.enable = true; + home.packages = with pkgs; [ + sshfs # SSH File system + ]; +} From ce9124c7edca2f52c128cc27ff7ef619fe03cb1a Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Sat, 20 Jan 2024 14:03:54 -0800 Subject: [PATCH 10/61] Move to Xonsh, add hypr scripts --- flake.lock | 61 ++++++++++++++++------- home.nix | 9 ++++ programs/git/default.nix | 4 +- programs/hypr/default.conf | 32 +++++++++++- programs/hypr/default.nix | 9 +++- programs/hypr/keybinds.conf | 39 ++++++--------- programs/hypr/scripts/changeprimary.xsh | 27 ++++++++++ programs/hypr/scripts/changesecondary.xsh | 27 ++++++++++ programs/hypr/scripts/initdb.xsh | 13 +++++ programs/lutris/default.nix | 16 ++++++ programs/spotify/default.nix | 18 +++++++ programs/xdg/default.nix | 2 + programs/xonsh/default.nix | 15 ++++++ 13 files changed, 224 insertions(+), 48 deletions(-) create mode 100755 programs/hypr/scripts/changeprimary.xsh create mode 100755 programs/hypr/scripts/changesecondary.xsh create mode 100755 programs/hypr/scripts/initdb.xsh create mode 100644 programs/lutris/default.nix create mode 100644 programs/spotify/default.nix create mode 100644 programs/xonsh/default.nix diff --git a/flake.lock b/flake.lock index 4336bb3..d1e7624 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1700013383, - "narHash": "sha256-ZBhrew3BrUEv48i+3Mp2pDjLU6dcue8BKMz6tCDSyfc=", + "lastModified": 1701728041, + "narHash": "sha256-x0pyrI1vC8evVDxCxyO6olOyr4wlFg9+VS3C3p4xFYQ=", "owner": "langedev", "repo": "home-manager", - "rev": "6498661f3856a685c4fa7a19d0f8cbe17c08d8bd", + "rev": "ac7216918cd65f3824ba7817dea8f22e61221eaf", "type": "github" }, "original": { @@ -29,11 +29,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1700397206, - "narHash": "sha256-ityVJcy3I/E8soXctwWveg58+cXOSQXhDIcU6YR2gjI=", + "lastModified": 1705782792, + "narHash": "sha256-AnNvfQK3BQtri7JUmTsaAWAOBzCxEf5t3VaGm0Kezjk=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "646f4bc63861e03b01fed3833bb65d1d014e1bf3", + "rev": "4d403dac3244aab217fb9bf17a68e9a009fcadd8", "type": "github" }, "original": { @@ -67,13 +67,35 @@ "type": "github" } }, + "hyprlang": { + "inputs": { + "nixpkgs": [ + "hyprland", + "xdph", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1704287638, + "narHash": "sha256-TuRXJGwtK440AXQNl5eiqmQqY4LZ/9+z/R7xC0ie3iA=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "6624f2bb66d4d27975766e81f77174adbe58ec97", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1698134075, - "narHash": "sha256-foCD+nuKzfh49bIoiCBur4+Fx1nozo+4C/6k8BYk4sg=", + "lastModified": 1705133751, + "narHash": "sha256-rCIsyE80jgiOU78gCWN3A0wE0tR2GI5nH6MlS+HaaSQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "8efd5d1e283604f75a808a20e6cde0ef313d07d4", + "rev": "9b19f5e77dd906cb52dade0b7bd280339d2a1f3d", "type": "github" }, "original": { @@ -85,11 +107,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1699825797, - "narHash": "sha256-W2m42mVt4/O6CJFbECPfLApmi8bO+qscbmSeEKrSHEg=", + "lastModified": 1701902328, + "narHash": "sha256-3tiiSEgQRPps0aV40belvLk1k4Max7oRh/+hZGLtfGc=", "owner": "langedev", "repo": "nixpkgs", - "rev": "a69768a1c385042d46ff57396c49d26df5ac035c", + "rev": "162f092c27afe0949253753f088c2babfba5b902", "type": "github" }, "original": { @@ -125,18 +147,18 @@ "flake": false, "locked": { "host": "gitlab.freedesktop.org", - "lastModified": 1699292815, - "narHash": "sha256-HXu98PyBMKEWLqiTb8viuLDznud/SdkdJsx5A5CWx7I=", + "lastModified": 1703963193, + "narHash": "sha256-ke8drv6PTrdQDruWbajrRJffP9A9PU6FRyjJGNZRTs4=", "owner": "wlroots", "repo": "wlroots", - "rev": "5de9e1a99d6642c2d09d589aa37ff0a8945dcee1", + "rev": "f81c3d93cd6f61b20ae784297679283438def8df", "type": "gitlab" }, "original": { "host": "gitlab.freedesktop.org", "owner": "wlroots", "repo": "wlroots", - "rev": "5de9e1a99d6642c2d09d589aa37ff0a8945dcee1", + "rev": "f81c3d93cd6f61b20ae784297679283438def8df", "type": "gitlab" } }, @@ -146,6 +168,7 @@ "hyprland", "hyprland-protocols" ], + "hyprlang": "hyprlang", "nixpkgs": [ "hyprland", "nixpkgs" @@ -156,11 +179,11 @@ ] }, "locked": { - "lastModified": 1697981233, - "narHash": "sha256-y8q4XUwx+gVK7i2eLjfR32lVo7TYvEslyzrmzYEaPZU=", + "lastModified": 1704659450, + "narHash": "sha256-3lyoUVtUWz1LuxbltAtkJSK2IlVXmKhxCRU2/0PYCms=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "22e7a65ff9633e1dedfa5317fdffc49f68de2ff2", + "rev": "6a5de92769d5b7038134044053f90e7458f6a197", "type": "github" }, "original": { diff --git a/home.nix b/home.nix index 11310c2..254d4fb 100644 --- a/home.nix +++ b/home.nix @@ -12,11 +12,13 @@ ./programs/fish ./programs/git ./programs/hypr + ./programs/lutris ./programs/mpv ./programs/nnn ./programs/nvim ./programs/pywal ./programs/rofi + ./programs/spotify ./programs/ssh ./programs/xdg ]; @@ -32,6 +34,9 @@ appimage-run # Lets you run app images zathura # PDF viewer ani-cli # Easy anime player + lutgen # LUT generator + + texlive.combined.scheme-full # Latex # Development stuff nodejs # For compiling JS stuff @@ -45,6 +50,10 @@ BROWSER = "librewolf"; }; + home.sessionPath = [ + "$HOME/prog/scripts" + ]; + # Enable man pages, but ensure ~/.manpage isn't created programs.man.enable = true; programs.man.generateCaches = false; diff --git a/programs/git/default.nix b/programs/git/default.nix index 107376d..9f134ee 100644 --- a/programs/git/default.nix +++ b/programs/git/default.nix @@ -2,8 +2,8 @@ { programs.git.enable = true; - programs.git.userName = "langedev"; - programs.git.userEmail = "public@daltonlange.com"; + programs.git.userName = "JuliaLange"; + programs.git.userEmail = "git@julialange.com"; programs.git.extraConfig = { safe = { directory = "/etc/nixos"; diff --git a/programs/hypr/default.conf b/programs/hypr/default.conf index 4b1dc22..d92465d 100644 --- a/programs/hypr/default.conf +++ b/programs/hypr/default.conf @@ -1,5 +1,32 @@ -monitor=,preferred,auto,1 +monitor=DP-2,2560x1440@144,0x0,1 +monitor=DP-1,2560x1440@144,-2560x0,1 monitor=HDMI-A-1,disable +env = HYPR_MON_PRIMARY, DP-2 +env = HYPR_MON_SECONDARY, DP-1 + +# Primaries +workspace=name:home, monitor:DP-2, persistent:true, default:true +workspace=name:game, monitor:DP-2, persistent:true +workspace=name:etc0, monitor:DP-2, persistent:true +# Secondaries +workspace=name:chat, monitor:DP-1, persistent:true, default:true +workspace=name:misc0, monitor:DP-1, persistent:true +# Switches +workspace=name:web , monitor:DP-1, persistent:true +workspace=name:med , monitor:DP-1, persistent:true + +windowrule = workspace name:web, librewolf +windowrulev2 = workspace name:med, librewolf,title:Picture-in-Picture +windowrule = workspace name:chat, discord + +env = LIBVA_DRIVER_NAME,nvidia +env = XDG_SESSION_TYPE,wayland +env = GBM_BACKEND,nvidia-drm +env = __GLX_VENDOR_LIBRARY_NAME,nvidia +env = WLR_NO_HARDWARE_CURSORS,1 + +env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db +exec-once = $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh exec-once = swww init exec-once = swww img $HOME/med/pix/bg.png @@ -8,7 +35,8 @@ input { kb_layout = us follow_mouse = 1 accel_profile = flat - sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. + sensitivity = -0.52 + #sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. } general { diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix index 8fc5589..e1234a3 100644 --- a/programs/hypr/default.nix +++ b/programs/hypr/default.nix @@ -1,14 +1,21 @@ { config, pkgs, ... }: - +let rootPath = ./.; in { wayland.windowManager.hyprland.enable = true; wayland.windowManager.hyprland.extraConfig = '' ${builtins.readFile ./default.conf} ${builtins.readFile ./keybinds.conf} ''; + # wayland.windowManager.hyprland.enableNvidiaPatches = true; home.packages = with pkgs; [ socat # For hyprland scripts swww # Wallpaper engine wlr-randr # Xrandr for wayland + xdg-desktop-portal-hyprland # XDP for hyprland ]; + xdg.configFile."hypr-scripts" = { + source = rootPath + "/scripts"; + target = "hypr/scripts"; + executable = true; + }; } diff --git a/programs/hypr/keybinds.conf b/programs/hypr/keybinds.conf index 4ed1c58..ab4d5a0 100644 --- a/programs/hypr/keybinds.conf +++ b/programs/hypr/keybinds.conf @@ -3,30 +3,26 @@ $mainMod = SUPER # Exec programs bind = $mainMod, return, exec, alacritty bind = $mainMod SHIFT, return, exec, rofi -show run -# bind = $mainMod SHIFT, P, exec, screenshot # Hyprland Management bind = $mainMod SHIFT, Q, exit, -# Bars stuff -bind = $mainMod, TAB, exec, eww open --toggle - # Workspace / Monitor Management bind = $mainMod, h, focusmonitor, l bind = $mainMod, l, focusmonitor, r bind = $mainMod, j, cyclenext, bind = $mainMod, k, cyclenext, prev +bind = $mainMod SHIFT, j, swapnext, +bind = $mainMod SHIFT, k, swapnext, prev +bind = $mainMod SHIFT, h, movecurrentworkspacetomonitor, -1 +bind = $mainMod SHIFT, l, movecurrentworkspacetomonitor, +1 -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 -bind = $mainMod, 6, workspace, 6 -bind = $mainMod, 7, workspace, 7 -bind = $mainMod, 8, workspace, 8 -bind = $mainMod, 9, workspace, 9 -bind = $mainMod, 0, workspace, 10 +bind = $mainMod, 1, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh home +bind = $mainMod, 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web +bind = $mainMod, 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med +bind = $mainMod, 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game +binde = $mainMod, 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc +binde = $mainMod, TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh # Window Management bind = $mainMod, C, killactive, @@ -34,16 +30,11 @@ bind = $mainMod, C, killactive, bind = $mainMod, F, togglefloating, bind = $mainMod SHIFT, F, fullscreen, -bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1 -bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2 -bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3 -bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4 -bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5 -bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6 -bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7 -bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8 -bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9 -bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10 +bind = $mainMod SHIFT, 1, movetoworkspacesilent, name:home +bind = $mainMod SHIFT, 2, movetoworkspacesilent, name:web +bind = $mainMod SHIFT, 3, movetoworkspacesilent, name:med +bind = $mainMod SHIFT, 4, movetoworkspacesilent, name:misc +bind = $mainMod SHIFT, TAB, movetoworkspacesilent, r-1 # Move/resize windows with mainMod + LMB/RMB and dragging bindm = $mainMod, mouse:272, movewindow diff --git a/programs/hypr/scripts/changeprimary.xsh b/programs/hypr/scripts/changeprimary.xsh new file mode 100755 index 0000000..9b7e0e7 --- /dev/null +++ b/programs/hypr/scripts/changeprimary.xsh @@ -0,0 +1,27 @@ +#!/usr/bin/env xonsh +import shelve + +# Usage: +# ./changeprimary.xsh workspace +# changes to that workspace +# if workspace is "etc" then changes to etcN where N is a number + +workspace=$ARG1 +monitor=$HYPR_MON_PRIMARY + +current_workspace = "home" + +with shelve.open($HYPR_WORK_DB) as db: + current_workspace = db.get("primary") + if workspace == "etc": + if current_workspace.startswith("etc"): + current = current_workspace[3:] % db.get("primary_extras") + current_workspace = "etc" + str(current) + else: + current_workspace = "etc0" + else: + current_workspace = workspace + db["primary"] = current_workspace + +hyprctl dispatch moveworkspacetomonitor name:@(current_workspace) $HYPR_MON_PRIMARY >> /dev/null +hyprctl dispatch workspace name:@(current_workspace) >> /dev/null diff --git a/programs/hypr/scripts/changesecondary.xsh b/programs/hypr/scripts/changesecondary.xsh new file mode 100755 index 0000000..b4cfdf9 --- /dev/null +++ b/programs/hypr/scripts/changesecondary.xsh @@ -0,0 +1,27 @@ +#!/usr/bin/env xonsh +import shelve +import copy + +# Usage: +# ./changesecondary.xsh +# cycles through the secondary workspaces + +current_secondary = "chat" + +with shelve.open($HYPR_WORK_DB) as db: + workspaces = db.get("secondaries").copy() + current_primary = db.get("primary") + current_secondary = db.get("secondary") + #extras = db.get("secondary_extras") + + if current_primary in workspaces: + workspaces.remove(current_primary) + + current_secondary = workspaces[ + (workspaces.index(current_secondary)+1) % len(workspaces) + ] + db["secondary"] = current_secondary + +# Change primary to bind +hyprctl dispatch moveworkspacetomonitor name:@(current_secondary) $HYPR_MON_SECONDARY +hyprctl dispatch workspace name:@(current_secondary) diff --git a/programs/hypr/scripts/initdb.xsh b/programs/hypr/scripts/initdb.xsh new file mode 100755 index 0000000..8e7af93 --- /dev/null +++ b/programs/hypr/scripts/initdb.xsh @@ -0,0 +1,13 @@ +#!/usr/bin/env xonsh +import shelve + +# Usage: +# ./initdb.xsh +# initialize a db for use hypr workspace scripts + +with shelve.open($HYPR_WORK_DB) as db: + db["primary"] = "home" + db["secondary"] = "chat" + db["secondaries"] = ["chat", "web"] + db["secondary_extras"] = 1 + db["primary_extras"] = 1 diff --git a/programs/lutris/default.nix b/programs/lutris/default.nix new file mode 100644 index 0000000..05993cd --- /dev/null +++ b/programs/lutris/default.nix @@ -0,0 +1,16 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + lutris + wineWowPackages.stable + # (lutris.override { + # extraLibraries = pkgs: [ + # # List library dependencies here + # ]; + # extraPkgs = pkgs: [ + # # List package dependencies here + # ]; + # }) + ]; +} diff --git a/programs/spotify/default.nix b/programs/spotify/default.nix new file mode 100644 index 0000000..7510db3 --- /dev/null +++ b/programs/spotify/default.nix @@ -0,0 +1,18 @@ +{ config, pkgs, ... }: + +{ + services.spotifyd.enable = true; + services.spotifyd.settings = { + global = { + username = "me@daltonlange.com"; + password = "5ThM^G3!FTfH6rH#cJEx"; + backend = "pulseaudio"; + device_name = "onizuka"; + bitrate = 320; + }; + }; + + home.packages = with pkgs; [ + spotify-tui # Spotify TUI player + ]; +} diff --git a/programs/xdg/default.nix b/programs/xdg/default.nix index 835b5fa..81a7a84 100644 --- a/programs/xdg/default.nix +++ b/programs/xdg/default.nix @@ -13,4 +13,6 @@ pictures = "${config.home.homeDirectory}/med/pix"; videos = "${config.home.homeDirectory}/med/vid"; }; + + xdg.mimeApps.enable = true; } diff --git a/programs/xonsh/default.nix b/programs/xonsh/default.nix new file mode 100644 index 0000000..3dd83ce --- /dev/null +++ b/programs/xonsh/default.nix @@ -0,0 +1,15 @@ +{ config, pkgs, ... }: + +{ + programs.xonsh.enable = true; + + programs.xonsh.interactiveShellInit = '' + cat ~/.cache/wal/sequences + ''; + + home.sessionVariables = { + PROMPT = "τ "; + RIGHT_PROMPT = "{YELLOW}{gitstatus: {} }{BLUE}{short_cwd}{DEFAULT}"; + VI_MODE = 1; + }; +} From ea56d7a5dd85551ad8fcd8d096ddec2571aac242 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Fri, 16 Feb 2024 21:24:57 -0800 Subject: [PATCH 11/61] Adds Discord to programs + better discord --- home.nix | 3 +- programs/discord/default.nix | 13 ++ .../discord/plugins/chatlessdisc.plugin.js | 197 ++++++++++++++++++ 3 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 programs/discord/default.nix create mode 100644 programs/discord/plugins/chatlessdisc.plugin.js diff --git a/home.nix b/home.nix index 254d4fb..714ce88 100644 --- a/home.nix +++ b/home.nix @@ -7,6 +7,7 @@ imports = [ ./programs/alacritty + ./programs/discord ./programs/dunst ./programs/eww ./programs/fish @@ -25,7 +26,7 @@ home.packages = with pkgs; [ # Applications - discord # Chat app + beeper # Better Chat App gimp # Photo editting pamixer # Volume control playerctl # Control media diff --git a/programs/discord/default.nix b/programs/discord/default.nix new file mode 100644 index 0000000..4221921 --- /dev/null +++ b/programs/discord/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, ... }: +let rootPath = ./.; in +{ + home.packages = with pkgs; [ + discord # Base app + betterdiscordctl # Better Discord Installer + ]; + # Better Discord plugins + xdg.configFile."better-discord" = { + source = rootPath + "/plugins"; + target = "BetterDiscord/plugins"; + }; +} diff --git a/programs/discord/plugins/chatlessdisc.plugin.js b/programs/discord/plugins/chatlessdisc.plugin.js new file mode 100644 index 0000000..76d78d2 --- /dev/null +++ b/programs/discord/plugins/chatlessdisc.plugin.js @@ -0,0 +1,197 @@ +/** + * @name chatlessdisc + * @version 1.1.0 + * @description removes the chatting from disc, as god intended + * @author Julia Lange + * + */ + +const TITLE = "chatless-disc"; + +function getChat() { + let chatsPotentialChild = document.querySelector( + "div > section[aria-label='Channel header']"); + if (chatsPotentialChild) { + let chat = chatsPotentialChild.parentElement; + return chat; + } + return null; +} + +function removeChat() { + let chat = getChat() + if (chat) chat.style = "display: none"; +} +function restoreChat() { + let chat = getChat() + if (chat) chat.style = "display: flex"; +} + +function expandSidebar() { + let userArea = document.querySelector("section[aria-label='User area']"); + let sidebar = userArea.parentElement; + sidebar.style = "width: 100%"; + removeChat(); + + userArea.childNodes.forEach(node => { + node.style = "justify-content: space-between"; + }); +} + +function contractSidebar() { + let userArea = document.querySelector("section[aria-label='User area']"); + let sidebar = userArea.parentElement; + sidebar.style = ""; + restoreChat(); + + userArea.childNodes.forEach(node => { + node.style = ""; + }); +} + +function addChannelClass() { + let dms = document.querySelector("ul[aria-label='Direct Messages']"); + if (dms == null) return ""; + let friendsElement = dms.childNodes[1] + if (friendsElement == null) return ""; + let channelClassName = friendsElement.className.split(" ")[0] + if (channelClassName != "") { + BdApi.DOM.addStyle(TITLE, `.${channelClassName} { + max-width: 100%; + }`); + } + return channelClassName; +} + +function clickPopOut() { + let popOutButton = document.querySelector("button[aria-label='Pop Out']"); + if (popOutButton == null) return; + popOutButton.click(); +} + +function addToggleButton(button) { + let muteButton = document.querySelector("div > button[aria-label='Mute']"); + if (muteButton == null) return; + let buttonList = muteButton.parentElement; + buttonList.prepend(button) + + enablePortraitStyle() +} + +function enablePortraitStyle() { + let portrait = document.querySelector("div[aria-label='Set Status']"); + if (portrait == null) return; + portrait.style = "width: 100%; min-width: 0px"; +} + +function disablePortaitStyle() { + let portrait = document.querySelector("div[aria-label='Set Status']"); + if (portrait == null) return; + portrait.style = ""; +} + +function enableChanges() { + expandSidebar(); + + return true +} + +function disableChanges() { + contractSidebar(); + + return false +} + +function createToggleButton(onClickFunction) { + let toggleButton = document.createElement("button"); + toggleButton.role = "switch"; + toggleButton.ariaLabel = "Chattless Toggle"; + toggleButton.className = "chattless_button"; + toggleButton.style.cssText = ` + display: flex; + align-items: center; + justify-content: center; + background: transparent;` + toggleButton.addEventListener("click", onClickFunction); + + const div = document.createElement("div"); + div.style.cssText = ` + display: flex; + align-items: center; + justify-content: center;`; + + const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + svg.setAttribute("aria-hidden", "false"); + svg.setAttribute("width", "20"); + svg.setAttribute("height", "20"); + svg.setAttribute("viewBox", "0 0 512.08 512.08"); + + const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); + path.setAttribute("fill", "var(--interactive-normal)"); + path.setAttribute("d", "M256.04,0C134.28,0,35.208,97.248,35.208,216.8c0,66.56,30.208,127.776,83.168,169.216V512.08 \ + l103.552-81.2c11.536,1.776,22.992,2.688,34.112,2.688c121.76,0,220.832-97.232,220.832-216.768C476.872,97.248,377.8,0,256.04,0z \ + M444.872,216.8c0,44.336-16.064,85.056-42.768,116.928L140.408,71.024C172.408,46.656,212.456,32,256.04,32 \ + C360.168,32,444.872,114.912,444.872,216.8z M220.552,398.192l-7.104-1.312l-63.056,49.456v-76.432l-6.592-4.8 \ + C95.128,329.776,67.224,275.712,67.224,216.8c0-47.872,18.848-91.408,49.472-124.256l262.768,263.792 \ + c-33.136,28.096-76.224,45.232-123.408,45.232C244.536,401.568,232.6,400.416,220.552,398.192z"); + + svg.appendChild(path); + div.appendChild(svg); + toggleButton.appendChild(div); + + return toggleButton; +} + + + + + +class chatlessdisc { + + constructor() { + this.enabled = false; + this.channelActionsModule = BdApi.findModuleByProps('selectChannel'); + + this.toggleButton = createToggleButton(async () => { + if (this.enabled) + this.enabled = disableChanges(); + else + this.enabled = enableChanges(); + }); + } + + start() { + this.enabled = enableChanges(); + addToggleButton(this.toggleButton); + this.channelClassName = addChannelClass(); + + BdApi.DOM.addStyle(TITLE, `.chattless_button:hover { + background: rgba(255,255,255,0.125) !important; + }`); + + BdApi.Patcher.instead(TITLE, this.channelActionsModule, + "selectChannel", async (_, args, originalFunction) => { + await originalFunction(...args); + if (this.enabled) { + removeChat(); + if (this.channelClassName == "") + this.channelClassName = addChannelClass(); + } + }); + BdApi.Patcher.instead(TITLE, this.channelActionsModule, + "selectVoiceChannel", async (_, args, originalFunction) => { + await originalFunction(...args); + if (this.enabled) { + await this.channelActionsModule.selectPrivateChannel(args[0]); + clickPopOut(); + } + }); + } + //Turn off and remove all parts of the plugin + stop() { + this.toggleButton.remove() + disableChanges(); + BdApi.Patcher.unpatchAll(TITLE); + BdApi.DOM.removeStyle(TITLE); + } +} From 9eacb3d95c4f98ca795da58666741aa8a54110d8 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Fri, 16 Feb 2024 21:26:37 -0800 Subject: [PATCH 12/61] Updating eww stuff --- programs/eww/config/eww.scss | 13 +++++--- programs/eww/config/eww.yuck | 1 + .../eww/config/modules/components/index.html | 18 ----------- programs/eww/config/modules/index.html | 16 ---------- programs/eww/config/modules/switch.yuck | 15 +++++++++ programs/eww/config/scripts/index.html | 20 ------------ programs/eww/config/windows.yuck | 32 ------------------- 7 files changed, 24 insertions(+), 91 deletions(-) delete mode 100644 programs/eww/config/modules/components/index.html delete mode 100644 programs/eww/config/modules/index.html create mode 100644 programs/eww/config/modules/switch.yuck delete mode 100644 programs/eww/config/scripts/index.html delete mode 100644 programs/eww/config/windows.yuck diff --git a/programs/eww/config/eww.scss b/programs/eww/config/eww.scss index 559b968..aa4eb77 100644 --- a/programs/eww/config/eww.scss +++ b/programs/eww/config/eww.scss @@ -1,8 +1,11 @@ -box { - background-color: #1E1D2F; - color: #D9E0EE; +.content-box { + border: 4px solid yellow; + border-radius: 50px; + background-color: rgba(255,255,255,10); + margin: 2px; + box-shadow: 0 0 0 3px white; } -progressbar > trough { - min-width: 40px; +.switch { + background: transparent; } diff --git a/programs/eww/config/eww.yuck b/programs/eww/config/eww.yuck index e69de29..275b37b 100644 --- a/programs/eww/config/eww.yuck +++ b/programs/eww/config/eww.yuck @@ -0,0 +1 @@ +(include "modules/switch.yuck") diff --git a/programs/eww/config/modules/components/index.html b/programs/eww/config/modules/components/index.html deleted file mode 100644 index f47c072..0000000 --- a/programs/eww/config/modules/components/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - -Directory listing for /eww/widgets/components/ - - -

Directory listing for /eww/widgets/components/

-
- -
- - diff --git a/programs/eww/config/modules/index.html b/programs/eww/config/modules/index.html deleted file mode 100644 index dd51262..0000000 --- a/programs/eww/config/modules/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - -Directory listing for /eww/widgets/ - - -

Directory listing for /eww/widgets/

-
- -
- - diff --git a/programs/eww/config/modules/switch.yuck b/programs/eww/config/modules/switch.yuck new file mode 100644 index 0000000..108583b --- /dev/null +++ b/programs/eww/config/modules/switch.yuck @@ -0,0 +1,15 @@ +(defwindow switch + :monitor 1 + :stacking "fg" + :focusable false + :geometry (geometry :y "60%" + :width "500px" + :height "110px" + :anchor "top center") + (border + "Example contenting") +) + +(defwidget border [] + (box :class "content-box" + (children))) diff --git a/programs/eww/config/scripts/index.html b/programs/eww/config/scripts/index.html deleted file mode 100644 index 590c85c..0000000 --- a/programs/eww/config/scripts/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -Directory listing for /eww/scripts/ - - -

Directory listing for /eww/scripts/

-
- -
- - diff --git a/programs/eww/config/windows.yuck b/programs/eww/config/windows.yuck deleted file mode 100644 index 29fb7c9..0000000 --- a/programs/eww/config/windows.yuck +++ /dev/null @@ -1,32 +0,0 @@ -(include "./widgets/bar.yuck") -(include "./widgets/powerbar.yuck") - -(defwindow bar0 - :monitor 0 - :geometry (geometry :width "100%" - :height "29px" - :anchor "top center") - :stacking "fg" - :exclusive true - (bar) -) - -(defwindow preview - :monitor 0 - :geometry (geometry :x "100px" - :y "5px" - :anchor "top right") - (image :path mediapreview) -) - -(defwindow powerbar0 - :monitor 0 - :geometry (geometry :x "100px" - :y "5px" - :anchor "top right") - (powerbar) -) - -(deflisten mediapreview :initial "hello?" - "bash $XDG_CONFIG_HOME/eww/scripts/medpreview" -) From 7b32e3330c995621e0396789580bd28db86e6e55 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Fri, 16 Feb 2024 21:29:53 -0800 Subject: [PATCH 13/61] expands hypr config into different parts, makes it cool too --- flake.nix | 7 ++- programs/hypr/default.conf | 80 -------------------------- programs/hypr/default.nix | 12 +++- programs/hypr/keybinds.conf | 5 ++ programs/hypr/nvidia.conf | 6 ++ programs/hypr/scripts/initdb.xsh | 2 +- programs/hypr/settings.conf | 59 +++++++++++++++++++ programs/hypr/window_rules.conf | 36 ++++++++++++ programs/hypr/xwaylandvideobridge.conf | 5 ++ 9 files changed, 128 insertions(+), 84 deletions(-) delete mode 100644 programs/hypr/default.conf create mode 100644 programs/hypr/nvidia.conf create mode 100644 programs/hypr/settings.conf create mode 100644 programs/hypr/window_rules.conf create mode 100644 programs/hypr/xwaylandvideobridge.conf diff --git a/flake.nix b/flake.nix index d9d68e4..a77f362 100644 --- a/flake.nix +++ b/flake.nix @@ -11,15 +11,20 @@ }; hyprland.url = "github:hyprwm/Hyprland"; + hyprland-contrib = { + url = "github:hyprwm/contrib"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { nixpkgs, home-manager, hyprland, ... }: + outputs = { nixpkgs, home-manager, hyprland, ... }@inputs: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; in { homeConfigurations."pan" = home-manager.lib.homeManagerConfiguration { inherit pkgs; + extraSpecialArgs = { inherit inputs; }; modules = [ hyprland.homeManagerModules.default ./home.nix diff --git a/programs/hypr/default.conf b/programs/hypr/default.conf deleted file mode 100644 index d92465d..0000000 --- a/programs/hypr/default.conf +++ /dev/null @@ -1,80 +0,0 @@ -monitor=DP-2,2560x1440@144,0x0,1 -monitor=DP-1,2560x1440@144,-2560x0,1 -monitor=HDMI-A-1,disable -env = HYPR_MON_PRIMARY, DP-2 -env = HYPR_MON_SECONDARY, DP-1 - -# Primaries -workspace=name:home, monitor:DP-2, persistent:true, default:true -workspace=name:game, monitor:DP-2, persistent:true -workspace=name:etc0, monitor:DP-2, persistent:true -# Secondaries -workspace=name:chat, monitor:DP-1, persistent:true, default:true -workspace=name:misc0, monitor:DP-1, persistent:true -# Switches -workspace=name:web , monitor:DP-1, persistent:true -workspace=name:med , monitor:DP-1, persistent:true - -windowrule = workspace name:web, librewolf -windowrulev2 = workspace name:med, librewolf,title:Picture-in-Picture -windowrule = workspace name:chat, discord - -env = LIBVA_DRIVER_NAME,nvidia -env = XDG_SESSION_TYPE,wayland -env = GBM_BACKEND,nvidia-drm -env = __GLX_VENDOR_LIBRARY_NAME,nvidia -env = WLR_NO_HARDWARE_CURSORS,1 - -env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db -exec-once = $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh - -exec-once = swww init -exec-once = swww img $HOME/med/pix/bg.png - -input { - kb_layout = us - follow_mouse = 1 - accel_profile = flat - sensitivity = -0.52 - #sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. -} - -general { - gaps_in = 3 - gaps_out = 3 - border_size = 2 - col.active_border = rgb(F5C2E7) - col.inactive_border = rgb(1E1D2F) - - layout = master -} - -decoration { - rounding = 2 - blur { - size = 12 - } -} - -animations { - enabled = yes - - animation = windows, 1, 4, default, popin 50% - animation = windowsOut, 1, 4, default, popin 50% - animation = windowsMove, 1, 3, default - animation = border, 1, 3, default - animation = fade, 1, 3, default - animation = workspaces, 1, 3, default -} - -master { - no_gaps_when_only = true - new_is_master = false -} - -Binds { - workspace_back_and_forth = true -} - -windowrule = opacity 0.9 0.9,^(Alacritty)$ -windowrule = opacity 0.94 0.94,^(discord)$ diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix index e1234a3..b57f85a 100644 --- a/programs/hypr/default.nix +++ b/programs/hypr/default.nix @@ -1,18 +1,26 @@ -{ config, pkgs, ... }: +{ inputs, pkgs, ... }: let rootPath = ./.; in { wayland.windowManager.hyprland.enable = true; wayland.windowManager.hyprland.extraConfig = '' - ${builtins.readFile ./default.conf} + ${builtins.readFile ./window_rules.conf} + ${builtins.readFile ./settings.conf} + ${builtins.readFile ./nvidia.conf} ${builtins.readFile ./keybinds.conf} + ${builtins.readFile ./xwaylandvideobridge.conf} ''; # wayland.windowManager.hyprland.enableNvidiaPatches = true; home.packages = with pkgs; [ socat # For hyprland scripts swww # Wallpaper engine wlr-randr # Xrandr for wayland + wl-clipboard # Clipboard manager for wayland xdg-desktop-portal-hyprland # XDP for hyprland + hyprpicker # Colorpicker, needed for screenshot tool + inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool + xwaylandvideobridge # Allows screensharing with xwayland apps ]; + # Hyprland screenshot tool xdg.configFile."hypr-scripts" = { source = rootPath + "/scripts"; target = "hypr/scripts"; diff --git a/programs/hypr/keybinds.conf b/programs/hypr/keybinds.conf index ab4d5a0..3c9b2d8 100644 --- a/programs/hypr/keybinds.conf +++ b/programs/hypr/keybinds.conf @@ -3,6 +3,8 @@ $mainMod = SUPER # Exec programs bind = $mainMod, return, exec, alacritty bind = $mainMod SHIFT, return, exec, rofi -show run +bind = $mainMod, P, exec, grimblast --freeze copy area +bind = $mainMod SHIFT, P, exec, grimblast --freeze copysave area # Hyprland Management bind = $mainMod SHIFT, Q, exit, @@ -24,6 +26,9 @@ bind = $mainMod, 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game binde = $mainMod, 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc binde = $mainMod, TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh +bind = $mainMod, m, togglespecialworkspace, mus +bind = $mainMod, i, togglespecialworkspace, scratch + # Window Management bind = $mainMod, C, killactive, diff --git a/programs/hypr/nvidia.conf b/programs/hypr/nvidia.conf new file mode 100644 index 0000000..1271144 --- /dev/null +++ b/programs/hypr/nvidia.conf @@ -0,0 +1,6 @@ +# Nivida Settings +env = LIBVA_DRIVER_NAME,nvidia +env = XDG_SESSION_TYPE,wayland +env = GBM_BACKEND,nvidia-drm +env = __GLX_VENDOR_LIBRARY_NAME,nvidia +env = WLR_NO_HARDWARE_CURSORS,1 diff --git a/programs/hypr/scripts/initdb.xsh b/programs/hypr/scripts/initdb.xsh index 8e7af93..85bdad5 100755 --- a/programs/hypr/scripts/initdb.xsh +++ b/programs/hypr/scripts/initdb.xsh @@ -8,6 +8,6 @@ import shelve with shelve.open($HYPR_WORK_DB) as db: db["primary"] = "home" db["secondary"] = "chat" - db["secondaries"] = ["chat", "web"] + db["secondaries"] = ["chat", "web", "med"] db["secondary_extras"] = 1 db["primary_extras"] = 1 diff --git a/programs/hypr/settings.conf b/programs/hypr/settings.conf new file mode 100644 index 0000000..71d0ae2 --- /dev/null +++ b/programs/hypr/settings.conf @@ -0,0 +1,59 @@ +# Monitor Settings +monitor=DP-2,2560x1440@144,0x0,1 +monitor=DP-1,2560x1440@144,-2560x0,1 +monitor=HDMI-A-1,disable + +# Fix screen tearing +env = WLR_DRM_NO_ATOMIC,1 + +# Inits +exec-once = swww init +exec-once = swww img $HOME/med/pix/bg.png + +# Settings +input { + kb_layout = us + follow_mouse = 1 + accel_profile = flat + sensitivity = -0.52 + #sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. +} + +general { + gaps_in = 3 + gaps_out = 3 + border_size = 2 + col.active_border = rgb(F5C2E7) + col.inactive_border = rgb(1E1D2F) + + layout = master + allow_tearing = true +} + +decoration { + rounding = 2 + blur { + enabled = true + size = 12 + passes = 2 + special = true + } + dim_special = 0.2 +} + +animations { + enabled = yes + + animation = windows, 1, 4, default, popin 50% + animation = windowsOut, 1, 4, default, popin 50% + animation = windowsMove, 1, 3, default + animation = border, 1, 3, default + animation = fade, 1, 3, default + animation = workspaces, 1, 3, default +} + +master { + no_gaps_when_only = true + new_is_master = false + mfact = 0.53 +} diff --git a/programs/hypr/window_rules.conf b/programs/hypr/window_rules.conf new file mode 100644 index 0000000..671e13c --- /dev/null +++ b/programs/hypr/window_rules.conf @@ -0,0 +1,36 @@ +env = HYPR_MON_PRIMARY, DP-2 +env = HYPR_MON_SECONDARY, DP-1 + +# Primaries +workspace=name:home, monitor:DP-2, persistent:true, default:true +workspace=name:game, monitor:DP-2, persistent:true +workspace=name:etc0, monitor:DP-2, persistent:true +# Secondaries +workspace=name:chat, monitor:DP-1, persistent:true, default:true +workspace=name:misc0, monitor:DP-1, persistent:true +# Switches +workspace=name:web , monitor:DP-1, persistent:true +workspace=name:med , monitor:DP-1, persistent:true +# Pseudo +workspace=special:mus, persistent:true +workspace=special:scratch, on-created-empty: [float; size 50% 50%; center] alacritty + +windowrule = workspace name:web, librewolf +windowrulev2 = workspace name:med, librewolf,title:Picture-in-Picture +windowrule = workspace name:chat, discord +windowrule = workspace name:chat, Beeper +windowrule = workspace name:game, lutris +windowrule = workspace name:game, explorer.exe +windowrule = workspace name:game, leagueclient.exe +windowrule = workspace name:game, leagueclientux.exe +windowrule = workspace name:game, league of legends.exe +windowrule = immediate, league of legends.exe + +windowrule = opacity 0.9 0.9,^(Alacritty)$ +windowrule = opacity 0.94 0.94,^(discord)$ + +env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db + +exec-once = [workspace special:mus silent;float;size 70% 70%;center] alacritty -e spt +exec-once = [workspace name:chat silent] Discord +exec-once = [workspace name:chat silent] beeper diff --git a/programs/hypr/xwaylandvideobridge.conf b/programs/hypr/xwaylandvideobridge.conf new file mode 100644 index 0000000..4b77ad2 --- /dev/null +++ b/programs/hypr/xwaylandvideobridge.conf @@ -0,0 +1,5 @@ +windowrulev2 = opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$ +windowrulev2 = noanim,class:^(xwaylandvideobridge)$ +windowrulev2 = noinitialfocus,class:^(xwaylandvideobridge)$ +windowrulev2 = maxsize 1 1,class:^(xwaylandvideobridge)$ +windowrulev2 = noblur,class:^(xwaylandvideobridge)$ From 48c4277b9dc5c5e02b7a1cf0fb97e5dbd946be2b Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Fri, 16 Feb 2024 21:32:55 -0800 Subject: [PATCH 14/61] change eww to ags --- flake.lock | 86 +++++++++++++++---- flake.nix | 1 + home.nix | 3 +- programs/ags/config/config.js | 7 ++ programs/ags/config/modules/clock.js | 22 +++++ .../ags/config/modules/workspace-switch.js | 22 +++++ programs/ags/default.nix | 19 ++++ 7 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 programs/ags/config/config.js create mode 100644 programs/ags/config/modules/clock.js create mode 100644 programs/ags/config/modules/workspace-switch.js create mode 100644 programs/ags/default.nix diff --git a/flake.lock b/flake.lock index d1e7624..9b8db53 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,23 @@ { "nodes": { + "ags": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1708045757, + "narHash": "sha256-UDFJzw2MJcd4oHk+xOPkmyM3u+UwrNuKBFsKAVQaoQQ=", + "owner": "Aylur", + "repo": "ags", + "rev": "4ac0dbb473918eda325143c2053bdd428f9708d4", + "type": "github" + }, + "original": { + "owner": "Aylur", + "repo": "ags", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -23,17 +41,17 @@ "hyprland": { "inputs": { "hyprland-protocols": "hyprland-protocols", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "systems": "systems", "wlroots": "wlroots", "xdph": "xdph" }, "locked": { - "lastModified": 1705782792, - "narHash": "sha256-AnNvfQK3BQtri7JUmTsaAWAOBzCxEf5t3VaGm0Kezjk=", + "lastModified": 1708138027, + "narHash": "sha256-xTOrKOamqdVtW+v7j0bUTed8nqfijEMahJ7edgFtWL0=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "4d403dac3244aab217fb9bf17a68e9a009fcadd8", + "rev": "cdcc5aba06f20005842cf966b23af50456dc7142", "type": "github" }, "original": { @@ -42,6 +60,26 @@ "type": "github" } }, + "hyprland-contrib": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1706198673, + "narHash": "sha256-bHlxFd+3QHy6eXtTzzhwVNcyxBSOxTvBuJGNUzI4C4M=", + "owner": "hyprwm", + "repo": "contrib", + "rev": "16884001b26e6955ff4b88b4dfe4c8986e20f153", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "contrib", + "type": "github" + } + }, "hyprland-protocols": { "inputs": { "nixpkgs": [ @@ -91,11 +129,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1705133751, - "narHash": "sha256-rCIsyE80jgiOU78gCWN3A0wE0tR2GI5nH6MlS+HaaSQ=", + "lastModified": 1705496572, + "narHash": "sha256-rPIe9G5EBLXdBdn9ilGc0nq082lzQd0xGGe092R/5QE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9b19f5e77dd906cb52dade0b7bd280339d2a1f3d", + "rev": "842d9d80cfd4560648c785f8a4e6f3b096790e19", "type": "github" }, "original": { @@ -106,6 +144,22 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1707546158, + "narHash": "sha256-nYYJTpzfPMDxI8mzhQsYjIUX+grorqjKEU9Np6Xwy/0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d934204a0f8d9198e1e4515dd6fec76a139c87f0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { "locked": { "lastModified": 1701902328, "narHash": "sha256-3tiiSEgQRPps0aV40belvLk1k4Max7oRh/+hZGLtfGc=", @@ -123,9 +177,11 @@ }, "root": { "inputs": { + "ags": "ags", "home-manager": "home-manager", "hyprland": "hyprland", - "nixpkgs": "nixpkgs_2" + "hyprland-contrib": "hyprland-contrib", + "nixpkgs": "nixpkgs_3" } }, "systems": { @@ -147,18 +203,18 @@ "flake": false, "locked": { "host": "gitlab.freedesktop.org", - "lastModified": 1703963193, - "narHash": "sha256-ke8drv6PTrdQDruWbajrRJffP9A9PU6FRyjJGNZRTs4=", + "lastModified": 1706359063, + "narHash": "sha256-5HUTG0p+nCJv3cn73AmFHRZdfRV5AD5N43g8xAePSKM=", "owner": "wlroots", "repo": "wlroots", - "rev": "f81c3d93cd6f61b20ae784297679283438def8df", + "rev": "00b869c1a96f300a8f25da95d624524895e0ddf2", "type": "gitlab" }, "original": { "host": "gitlab.freedesktop.org", "owner": "wlroots", "repo": "wlroots", - "rev": "f81c3d93cd6f61b20ae784297679283438def8df", + "rev": "00b869c1a96f300a8f25da95d624524895e0ddf2", "type": "gitlab" } }, @@ -179,11 +235,11 @@ ] }, "locked": { - "lastModified": 1704659450, - "narHash": "sha256-3lyoUVtUWz1LuxbltAtkJSK2IlVXmKhxCRU2/0PYCms=", + "lastModified": 1706521509, + "narHash": "sha256-AInZ50acOJ3wzUwGzNr1TmxGTMx+8j6oSTzz4E7Vbp8=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "6a5de92769d5b7038134044053f90e7458f6a197", + "rev": "c06fd88b3da492b8f9067be021b9184f7012b5a8", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a77f362..c40464f 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,7 @@ url = "github:hyprwm/contrib"; inputs.nixpkgs.follows = "nixpkgs"; }; + ags.url = "github:Aylur/ags"; }; outputs = { nixpkgs, home-manager, hyprland, ... }@inputs: diff --git a/home.nix b/home.nix index 714ce88..25641b9 100644 --- a/home.nix +++ b/home.nix @@ -6,10 +6,11 @@ home.homeDirectory = "/home/pan"; imports = [ + # ./programs/eww + ./programs/ags ./programs/alacritty ./programs/discord ./programs/dunst - ./programs/eww ./programs/fish ./programs/git ./programs/hypr diff --git a/programs/ags/config/config.js b/programs/ags/config/config.js new file mode 100644 index 0000000..ec3b3ee --- /dev/null +++ b/programs/ags/config/config.js @@ -0,0 +1,7 @@ +import { Switch } from "./modules/workspace-switch.js"; + +export default { + windows: [ + Switch(1) + ] +} diff --git a/programs/ags/config/modules/clock.js b/programs/ags/config/modules/clock.js new file mode 100644 index 0000000..6f9f462 --- /dev/null +++ b/programs/ags/config/modules/clock.js @@ -0,0 +1,22 @@ +export const Clock = (monitor = 0) => { + + return Widget.Window({ + monitor, + name: `switch${monitor}`, + anchor: ['top', 'left', 'right'], + margins: [864, 1030], + css: 'background: transparent;', + child: container, + }); +}; + +const container = Widget.Box({ + css: ` + min-height: 110px; + min-width: 500px; + border: 4px solid #f4d80a; + border-radius: 50px; + margin: 3px; + box-shadow: 0 0 0 3px white; + `, +}); diff --git a/programs/ags/config/modules/workspace-switch.js b/programs/ags/config/modules/workspace-switch.js new file mode 100644 index 0000000..6b8d6bd --- /dev/null +++ b/programs/ags/config/modules/workspace-switch.js @@ -0,0 +1,22 @@ +export const Switch = (monitor = 0) => { + + return Widget.Window({ + monitor, + name: `switch${monitor}`, + anchor: ['top', 'left', 'right'], + margins: [864, 1030], + css: 'background: transparent;', + child: container, + }); +}; + +const container = Widget.Box({ + css: ` + min-height: 110px; + min-width: 500px; + border: 4px solid #f4d80a; + border-radius: 50px; + margin: 3px; + box-shadow: 0 0 0 3px white; + `, +}); diff --git a/programs/ags/default.nix b/programs/ags/default.nix new file mode 100644 index 0000000..68dfd65 --- /dev/null +++ b/programs/ags/default.nix @@ -0,0 +1,19 @@ +{ inputs, pkgs, ... }: +{ + # add the home manager module + imports = [ inputs.ags.homeManagerModules.default ]; + + programs.ags = { + enable = true; + + # null or path, leave as null if you don't want hm to manage the config + configDir = ./config; + + # additional packages to add to gjs's runtime + extraPackages = with pkgs; [ + gtksourceview + webkitgtk + accountsservice + ]; + }; +} From 2d65ab9d909164d96b17a7a36bcbe4ce2a319eeb Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Fri, 16 Feb 2024 21:39:09 -0800 Subject: [PATCH 15/61] Change font size --- programs/alacritty/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/alacritty/default.nix b/programs/alacritty/default.nix index 49c8763..d3a0378 100644 --- a/programs/alacritty/default.nix +++ b/programs/alacritty/default.nix @@ -26,7 +26,7 @@ x = 0; y = 0; }; - size = 24.0; + size = 18.0; }; }; } From 11cb67905dfad832680b6fcba2b5c49495cb9c30 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Wed, 21 Feb 2024 15:02:45 -0800 Subject: [PATCH 16/61] move from pywal to wallust --- home.nix | 2 +- programs/pywal/default.nix | 8 -------- programs/wal/default.nix | 28 ++++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) delete mode 100644 programs/pywal/default.nix create mode 100644 programs/wal/default.nix diff --git a/home.nix b/home.nix index 25641b9..93b4ce2 100644 --- a/home.nix +++ b/home.nix @@ -18,10 +18,10 @@ ./programs/mpv ./programs/nnn ./programs/nvim - ./programs/pywal ./programs/rofi ./programs/spotify ./programs/ssh + ./programs/wal ./programs/xdg ]; diff --git a/programs/pywal/default.nix b/programs/pywal/default.nix deleted file mode 100644 index f754d3e..0000000 --- a/programs/pywal/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.pywal.enable = true; - home.packages = with pkgs; [ - pywalfox # Update librewolf's colorscheme based on pywal - ]; -} diff --git a/programs/wal/default.nix b/programs/wal/default.nix new file mode 100644 index 0000000..14876da --- /dev/null +++ b/programs/wal/default.nix @@ -0,0 +1,28 @@ +{ config, pkgs, ... }: +let rootPath = ./.; in +{ + home.packages = with pkgs; [ + wallust # A better pywal + pywalfox # Update librewolf's colorscheme based on wal + ]; + xdg.configFile."wallust-config" = { + target = "wallust/wallust.toml"; + text = '' + backend = "wal" + color_space = "lab" + threshold = 20 + filter = "dark16" + + # [[entry]] + # # a relative path to a file where wallust.toml is (~/.config/wallust/) + # template = "dunstrc" + # + # # absolute path to the file to write the template (after templating) + # target = "~/.config/dunst/dunstrc" + ''; + } + xdg.configFile."wallust-templates" = { + source = rootPath + "/templates"; + target = "wallust/"; + } +} From 23d24bede8f4c9f624fe28e0014fbe4912d62549 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Wed, 21 Feb 2024 15:02:57 -0800 Subject: [PATCH 17/61] Some dunst styling --- programs/dunst/default.nix | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/programs/dunst/default.nix b/programs/dunst/default.nix index 3d9661f..dbdc205 100644 --- a/programs/dunst/default.nix +++ b/programs/dunst/default.nix @@ -4,24 +4,35 @@ services.dunst.enable = true; services.dunst.settings = { global = { - frame_color = "#8AADF4"; - separator_color = "frame"; + width = 280; + height = 240; + origin = "bottom-right"; + offset = "0x300"; + + notification_limit = 3; + + progress_bar_max_width = 280; + + gap_size = 4; + corner_radius = 20; }; urgency_low = { - background = "#24273A"; - foreground = "#CAD3F5"; + background = "#FFFFFFCC"; + foreground = "#000000"; + frame_color = "#0000"; }; urgency_normal = { - background = "#24273A"; - foreground = "#CAD3F5"; + background = "#FFFFFFCC"; + foreground = "#000000"; + frame_color = "#0000"; }; urgency_critical = { - background = "#24273A"; - foreground = "#CAD3F5"; - frame_color = "#F5A97F"; + background = "#FFFFFFCC"; + foreground = "#000000"; + frame_color = "#0000"; }; }; } From 57b8fdb27a6f9d1256045acb9a8d066242aeb455 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Wed, 21 Feb 2024 15:04:08 -0800 Subject: [PATCH 18/61] Hyprland rules updating --- flake.lock | 18 +++++++++--------- programs/hypr/default.nix | 1 + programs/hypr/league_rules.conf | 19 +++++++++++++++++++ programs/hypr/window_rules.conf | 4 ---- 4 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 programs/hypr/league_rules.conf diff --git a/flake.lock b/flake.lock index 9b8db53..2ca6ad9 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1708045757, - "narHash": "sha256-UDFJzw2MJcd4oHk+xOPkmyM3u+UwrNuKBFsKAVQaoQQ=", + "lastModified": 1708193735, + "narHash": "sha256-6DmQo9n3mrgpCH9wtSia0dAHXzGmpCjOqG35S0QrxWQ=", "owner": "Aylur", "repo": "ags", - "rev": "4ac0dbb473918eda325143c2053bdd428f9708d4", + "rev": "785f1a941a52c32d1cbe77a5eb935713fe45cddb", "type": "github" }, "original": { @@ -25,11 +25,11 @@ ] }, "locked": { - "lastModified": 1701728041, - "narHash": "sha256-x0pyrI1vC8evVDxCxyO6olOyr4wlFg9+VS3C3p4xFYQ=", + "lastModified": 1708031129, + "narHash": "sha256-EH20hJfNnc1/ODdDVat9B7aKm0B95L3YtkIRwKLvQG8=", "owner": "langedev", "repo": "home-manager", - "rev": "ac7216918cd65f3824ba7817dea8f22e61221eaf", + "rev": "3d6791b3897b526c82920a2ab5f61d71985b3cf8", "type": "github" }, "original": { @@ -47,11 +47,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1708138027, - "narHash": "sha256-xTOrKOamqdVtW+v7j0bUTed8nqfijEMahJ7edgFtWL0=", + "lastModified": 1708215223, + "narHash": "sha256-5z+NPNoiWKoaz3M4LZJ2fP+N7Vl9XGwr4QAV8rh4l4o=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "cdcc5aba06f20005842cf966b23af50456dc7142", + "rev": "683a4b07c514fa3c13cdf09e475283a69fcc7653", "type": "github" }, "original": { diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix index b57f85a..4c2caeb 100644 --- a/programs/hypr/default.nix +++ b/programs/hypr/default.nix @@ -4,6 +4,7 @@ let rootPath = ./.; in wayland.windowManager.hyprland.enable = true; wayland.windowManager.hyprland.extraConfig = '' ${builtins.readFile ./window_rules.conf} + ${builtins.readFile ./league_rules.conf} ${builtins.readFile ./settings.conf} ${builtins.readFile ./nvidia.conf} ${builtins.readFile ./keybinds.conf} diff --git a/programs/hypr/league_rules.conf b/programs/hypr/league_rules.conf new file mode 100644 index 0000000..1f9ef3b --- /dev/null +++ b/programs/hypr/league_rules.conf @@ -0,0 +1,19 @@ +# no opacity +windowrulev2 = opacity 1 1, class:^(league of legends.exe)$ # loading text +windowrulev2 = opacity 1 override, class:^(leagueclientux.exe)$ # client +windowrulev2 = opacity 1 override, class:^(leagueclient.exe)$ # game + +# nice loading text +windowrulev2 = noblur, class:^(leagueclient.exe)$ +windowrulev2 = noborder, class:^(leagueclient.exe)$ +windowrulev2 = nofocus, class:^(leagueclient.exe)$ +windowrulev2 = noshadow, class:^(leagueclient.exe)$ + +# gamer settings (set ingame to borderless) +windowrulev2 = immediate, class:^(league of legends.exe)$ +windowrulev2 = fullscreen, class:^(league of legends.exe)$ + +# workspaces +windowrule = workspace name:game, leagueclient.exe +windowrule = workspace name:game, leagueclientux.exe +windowrule = workspace name:game, league of legends.exe diff --git a/programs/hypr/window_rules.conf b/programs/hypr/window_rules.conf index 671e13c..eeb5e1f 100644 --- a/programs/hypr/window_rules.conf +++ b/programs/hypr/window_rules.conf @@ -21,10 +21,6 @@ windowrule = workspace name:chat, discord windowrule = workspace name:chat, Beeper windowrule = workspace name:game, lutris windowrule = workspace name:game, explorer.exe -windowrule = workspace name:game, leagueclient.exe -windowrule = workspace name:game, leagueclientux.exe -windowrule = workspace name:game, league of legends.exe -windowrule = immediate, league of legends.exe windowrule = opacity 0.9 0.9,^(Alacritty)$ windowrule = opacity 0.94 0.94,^(discord)$ From 364da18441bc9f7073ab9501a020c7522e08ce4e Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Wed, 21 Feb 2024 15:05:15 -0800 Subject: [PATCH 19/61] Fixed wal bug --- programs/wal/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/programs/wal/default.nix b/programs/wal/default.nix index 14876da..d0746b3 100644 --- a/programs/wal/default.nix +++ b/programs/wal/default.nix @@ -20,9 +20,9 @@ let rootPath = ./.; in # # absolute path to the file to write the template (after templating) # target = "~/.config/dunst/dunstrc" ''; - } + }; xdg.configFile."wallust-templates" = { source = rootPath + "/templates"; target = "wallust/"; - } + }; } From fd6a627c11dff3389bd8112caba548aec3d28dee Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Thu, 22 Feb 2024 23:57:21 -0800 Subject: [PATCH 20/61] Add timers for notifications in new services dir --- .gitignore | 1 + home.nix | 2 + services/timers/default.nix | 52 ++++++++++++++++++++++++++ services/timers/scripts/notify-time.sh | 5 +++ 4 files changed, 60 insertions(+) create mode 100644 .gitignore create mode 100644 services/timers/default.nix create mode 100755 services/timers/scripts/notify-time.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c22503 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/**/plugins/*.plugin.js diff --git a/home.nix b/home.nix index 93b4ce2..81a4957 100644 --- a/home.nix +++ b/home.nix @@ -23,6 +23,8 @@ ./programs/ssh ./programs/wal ./programs/xdg + + ./services/timers ]; home.packages = with pkgs; [ diff --git a/services/timers/default.nix b/services/timers/default.nix new file mode 100644 index 0000000..e47f3c9 --- /dev/null +++ b/services/timers/default.nix @@ -0,0 +1,52 @@ +{ config, pkgs, ... }: +let rootPath = ./.; in +{ + systemd.user.timers = { + hourly-time = { + Timer = { + OnCalendar = "hourly"; + }; + Install = { + WantedBy = [ + "timers.target" + ]; + }; + }; + quarterly-time = { + Timer = { + OnCalendar = "*-*-* *:15,30,45:00"; + }; + Install = { + WantedBy = [ + "timers.target" + ]; + }; + }; + }; + systemd.user.services = { + hourly-time = { + Unit = { + Description = "Notify the user every hour of time passing"; + }; + Service = { + Type="simple"; + ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 60000"; + }; + }; + quarterly-time = { + Unit = { + Description = "Notify the user every 15 minutes of time passing, \ + skips hours"; + }; + Service = { + Type="simple"; + ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 10000"; + }; + }; + }; + xdg.configFile."timer-scripts" = { + source = rootPath + "/scripts"; + target = "timer_scripts/"; + executable = true; + }; +} diff --git a/services/timers/scripts/notify-time.sh b/services/timers/scripts/notify-time.sh new file mode 100755 index 0000000..48df2fb --- /dev/null +++ b/services/timers/scripts/notify-time.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +export DISPLAY=":0" +export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" +/home/pan/.nix-profile/bin/notify-send "$(/run/current-system/sw/bin/date +%H:%M)" -t $1 From 07ab459311abf903b00440984ef39a41fefbdbb0 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Thu, 22 Feb 2024 23:59:01 -0800 Subject: [PATCH 21/61] Move from dunst to ags for notifications --- home.nix | 2 +- programs/ags/config/config.js | 6 +- .../notifications/notificationPopup.ts | 71 +++++++++++++++++++ .../config/modules/notifications/style.css | 61 ++++++++++++++++ programs/ags/default.nix | 6 +- programs/dunst/default.nix | 3 + 6 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 programs/ags/config/modules/notifications/notificationPopup.ts create mode 100644 programs/ags/config/modules/notifications/style.css diff --git a/home.nix b/home.nix index 81a4957..b1c70ae 100644 --- a/home.nix +++ b/home.nix @@ -6,11 +6,11 @@ home.homeDirectory = "/home/pan"; imports = [ + # ./programs/dunst # ./programs/eww ./programs/ags ./programs/alacritty ./programs/discord - ./programs/dunst ./programs/fish ./programs/git ./programs/hypr diff --git a/programs/ags/config/config.js b/programs/ags/config/config.js index ec3b3ee..c9500da 100644 --- a/programs/ags/config/config.js +++ b/programs/ags/config/config.js @@ -1,7 +1,9 @@ -import { Switch } from "./modules/workspace-switch.js"; +// import { Switch } from "./modules/workspace-switch.js"; +import { notificationPopup } from "./modules/notifications/notificationPopup.ts" export default { + style: App.configDir + '/modules/notifications/style.css', windows: [ - Switch(1) + notificationPopup() ] } diff --git a/programs/ags/config/modules/notifications/notificationPopup.ts b/programs/ags/config/modules/notifications/notificationPopup.ts new file mode 100644 index 0000000..56ddf80 --- /dev/null +++ b/programs/ags/config/modules/notifications/notificationPopup.ts @@ -0,0 +1,71 @@ +const notifications = await Service.import('notifications'); +const popups = notifications.bind('popups'); + +export const notificationPopup = (monitor = 0) => { + return Widget.Window({ + name: 'notifications', + anchor: ['bottom', 'right'], + child: Widget.Box({ + class_name: 'notifications', + vertical: true, + children: popups.as(popups => popups.map(Notification)), + }), + }); +}; + +/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */ +const Notification = n => { + const title = Widget.Label({ + class_name: 'title', + xalign: 0, + justification: 'left', + hexpand: true, + max_width_chars: 24, + truncate: 'end', + wrap: true, + label: n.summary, + use_markup: true, + }); + + const body = Widget.Label({ + class_name: 'body', + hexpand: true, + use_markup: true, + xalign: 0, + justification: 'left', + label: n.body, + wrap: true, + }); + + const actions = Widget.Box({ + class_name: 'actions', + children: n.actions.map(({ id, label }) => Widget.Button({ + class_name: 'action-button', + on_clicked: () => n.invoke(id), + hexpand: true, + child: Widget.Label(label), + })), + }); + + return Widget.EventBox({ + on_primary_click: () => n.dismiss(), + child: Widget.Box({ + class_name: `notification ${n.urgency}`, + vertical: true, + children: [ + Widget.Box({ + children: [ + Widget.Box({ + vertical: true, + children: [ + title, + body, + ], + }), + ], + }), + actions, + ], + }), + }); +}; diff --git a/programs/ags/config/modules/notifications/style.css b/programs/ags/config/modules/notifications/style.css new file mode 100644 index 0000000..1e819fc --- /dev/null +++ b/programs/ags/config/modules/notifications/style.css @@ -0,0 +1,61 @@ +window#notifications { + all: unset; +} + +window#notifications box.notifications { + padding: .5em; +} + +.icon { + min-width: 68px; + min-height: 68px; + margin-right: 1em; +} + +.icon image { + font-size: 58px; + /* to center the icon */ + margin: 5px; + color: @theme_fg_color; +} + +.icon box { + min-width: 68px; + min-height: 68px; + border-radius: 7px; +} + +.notification { + min-width: 350px; + border-radius: 11px; + padding: 1em; + margin: .5em; + border: 1px solid @wm_borders_edge; + background-color: @theme_bg_color; +} + +.notification.critical { + border: 1px solid lightcoral; +} + +.title { + color: @theme_fg_color; + font-size: 1.4em; +} + +.body { + color: @theme_unfocused_fg_color; +} + +.actions .action-button { + margin: 0 .4em; + margin-top: .8em; +} + +.actions .action-button:first-child { + margin-left: 0; +} + +.actions .action-button:last-child { + margin-right: 0; +} diff --git a/programs/ags/default.nix b/programs/ags/default.nix index 68dfd65..74eae58 100644 --- a/programs/ags/default.nix +++ b/programs/ags/default.nix @@ -3,13 +3,17 @@ # add the home manager module imports = [ inputs.ags.homeManagerModules.default ]; + home.packages = with pkgs; [ + libnotify # Notifications through ags + ]; + programs.ags = { enable = true; # null or path, leave as null if you don't want hm to manage the config configDir = ./config; - # additional packages to add to gjs's runtime + # additional packages to add to ags's runtime extraPackages = with pkgs; [ gtksourceview webkitgtk diff --git a/programs/dunst/default.nix b/programs/dunst/default.nix index dbdc205..3f1e60e 100644 --- a/programs/dunst/default.nix +++ b/programs/dunst/default.nix @@ -1,6 +1,9 @@ { config, pkgs, ... }: { + home.packages = with pkgs; [ + libnotify + ]; services.dunst.enable = true; services.dunst.settings = { global = { From 3758ae814996f61c86e67ae06499c997441d3ffe Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Thu, 22 Feb 2024 23:59:35 -0800 Subject: [PATCH 22/61] Add ags to inits, and update league rules --- programs/hypr/league_rules.conf | 2 +- programs/hypr/settings.conf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/programs/hypr/league_rules.conf b/programs/hypr/league_rules.conf index 1f9ef3b..a2730bc 100644 --- a/programs/hypr/league_rules.conf +++ b/programs/hypr/league_rules.conf @@ -10,7 +10,7 @@ windowrulev2 = nofocus, class:^(leagueclient.exe)$ windowrulev2 = noshadow, class:^(leagueclient.exe)$ # gamer settings (set ingame to borderless) -windowrulev2 = immediate, class:^(league of legends.exe)$ +#windowrulev2 = immediate, class:^(league of legends.exe)$ windowrulev2 = fullscreen, class:^(league of legends.exe)$ # workspaces diff --git a/programs/hypr/settings.conf b/programs/hypr/settings.conf index 71d0ae2..bd6f94c 100644 --- a/programs/hypr/settings.conf +++ b/programs/hypr/settings.conf @@ -9,6 +9,7 @@ env = WLR_DRM_NO_ATOMIC,1 # Inits exec-once = swww init exec-once = swww img $HOME/med/pix/bg.png +exec-once = ags # Settings input { From a38b6655c148fe0eca2375e6f43386286898b361 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Tue, 27 Feb 2024 20:47:08 -0800 Subject: [PATCH 23/61] Add chime to timer --- services/timers/default.nix | 4 ++-- services/timers/scripts/chimes.ogg | Bin 0 -> 262412 bytes services/timers/scripts/notify-time.sh | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 services/timers/scripts/chimes.ogg diff --git a/services/timers/default.nix b/services/timers/default.nix index e47f3c9..8eb16b7 100644 --- a/services/timers/default.nix +++ b/services/timers/default.nix @@ -30,7 +30,7 @@ let rootPath = ./.; in }; Service = { Type="simple"; - ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 60000"; + ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 60000 1"; }; }; quarterly-time = { @@ -40,7 +40,7 @@ let rootPath = ./.; in }; Service = { Type="simple"; - ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 10000"; + ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 10000 0"; }; }; }; diff --git a/services/timers/scripts/chimes.ogg b/services/timers/scripts/chimes.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bd716d057e920a7b2738d07d386f9b48cc1a1bc8 GIT binary patch literal 262412 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 Date: Sat, 16 Mar 2024 11:10:22 -0700 Subject: [PATCH 24/61] Window Swallowing, opacity, and hell workspace --- programs/hypr/keybinds.conf | 2 ++ programs/hypr/settings.conf | 6 ++++++ programs/hypr/window_rules.conf | 11 +++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/programs/hypr/keybinds.conf b/programs/hypr/keybinds.conf index 3c9b2d8..d769a46 100644 --- a/programs/hypr/keybinds.conf +++ b/programs/hypr/keybinds.conf @@ -24,6 +24,7 @@ bind = $mainMod, 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web bind = $mainMod, 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med bind = $mainMod, 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game binde = $mainMod, 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc +binde = $mainMod, _, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh hell binde = $mainMod, TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh bind = $mainMod, m, togglespecialworkspace, mus @@ -39,6 +40,7 @@ bind = $mainMod SHIFT, 1, movetoworkspacesilent, name:home bind = $mainMod SHIFT, 2, movetoworkspacesilent, name:web bind = $mainMod SHIFT, 3, movetoworkspacesilent, name:med bind = $mainMod SHIFT, 4, movetoworkspacesilent, name:misc +bind = $mainMod SHIFT, _, movetoworkspacesilent, name:hell bind = $mainMod SHIFT, TAB, movetoworkspacesilent, r-1 # Move/resize windows with mainMod + LMB/RMB and dragging diff --git a/programs/hypr/settings.conf b/programs/hypr/settings.conf index bd6f94c..77eceff 100644 --- a/programs/hypr/settings.conf +++ b/programs/hypr/settings.conf @@ -58,3 +58,9 @@ master { new_is_master = false mfact = 0.53 } + +misc { + focus_on_activate = true + enable_swallow = true + swallow_regex = ^(Alacritty)$ +} diff --git a/programs/hypr/window_rules.conf b/programs/hypr/window_rules.conf index eeb5e1f..6643f96 100644 --- a/programs/hypr/window_rules.conf +++ b/programs/hypr/window_rules.conf @@ -5,6 +5,7 @@ env = HYPR_MON_SECONDARY, DP-1 workspace=name:home, monitor:DP-2, persistent:true, default:true workspace=name:game, monitor:DP-2, persistent:true workspace=name:etc0, monitor:DP-2, persistent:true +workspace=name:hell, monitor:DP-2, persistent:true # Secondaries workspace=name:chat, monitor:DP-1, persistent:true, default:true workspace=name:misc0, monitor:DP-1, persistent:true @@ -22,8 +23,14 @@ windowrule = workspace name:chat, Beeper windowrule = workspace name:game, lutris windowrule = workspace name:game, explorer.exe -windowrule = opacity 0.9 0.9,^(Alacritty)$ -windowrule = opacity 0.94 0.94,^(discord)$ +windowrulev2 = opacity 0.94 fullscreen:0 + +windowrulev2 = opacity 0.79 override, class:^(Alacritty)$ +windowrulev2 = opacity 1 override, initialTitle:^(Discord Popout)$ +windowrulev2 = opacity 1 override, class:^(firefox)$ +windowrulev2 = opacity 1 override, class:^(Gimp)$ +windowrulev2 = opacity 1 override, class:^(feh)$ +windowrulev2 = opacity 1 override, class:^(mpv)$ env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db From b6b6a956ee2b7e69a43eb3ecdd466c92bd92363c Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Sat, 16 Mar 2024 11:12:22 -0700 Subject: [PATCH 25/61] Switch to upstream repo, change xonsh config --- flake.lock | 151 +++++++++++++++++++++++++++---------- flake.nix | 7 +- home.nix | 6 +- programs/xonsh/default.nix | 24 +++--- programs/xonsh/rc.xsh | 7 ++ 5 files changed, 138 insertions(+), 57 deletions(-) create mode 100644 programs/xonsh/rc.xsh diff --git a/flake.lock b/flake.lock index 2ca6ad9..abe0102 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1708193735, - "narHash": "sha256-6DmQo9n3mrgpCH9wtSia0dAHXzGmpCjOqG35S0QrxWQ=", + "lastModified": 1710523796, + "narHash": "sha256-VlzW+B/6Ifk+BRy1leU0GHuQ4KqlQXLO/pRRCCHcvDQ=", "owner": "Aylur", "repo": "ags", - "rev": "785f1a941a52c32d1cbe77a5eb935713fe45cddb", + "rev": "5dec6c7f37be13781144a7964e75cc00c7d7045f", "type": "github" }, "original": { @@ -25,33 +25,61 @@ ] }, "locked": { - "lastModified": 1708031129, - "narHash": "sha256-EH20hJfNnc1/ODdDVat9B7aKm0B95L3YtkIRwKLvQG8=", - "owner": "langedev", + "lastModified": 1710532761, + "narHash": "sha256-SUXGZNrXX05YA9G6EmgupxhOr3swI1gcxLUeDMUhrEY=", + "owner": "nix-community", "repo": "home-manager", - "rev": "3d6791b3897b526c82920a2ab5f61d71985b3cf8", + "rev": "206f457fffdb9a73596a4cb2211a471bd305243d", "type": "github" }, "original": { - "owner": "langedev", + "owner": "nix-community", "repo": "home-manager", "type": "github" } }, + "hyprcursor": { + "inputs": { + "hyprlang": "hyprlang", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1710257359, + "narHash": "sha256-43re5pzE/cswFAgw92/ugsB3+d5ufDaCcLtl9ztKfBo=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "1761f6cefd77f4fcd2039d930c88d6716ddc4974", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, "hyprland": { "inputs": { + "hyprcursor": "hyprcursor", "hyprland-protocols": "hyprland-protocols", + "hyprlang": "hyprlang_2", "nixpkgs": "nixpkgs_2", - "systems": "systems", + "systems": "systems_2", "wlroots": "wlroots", "xdph": "xdph" }, "locked": { - "lastModified": 1708215223, - "narHash": "sha256-5z+NPNoiWKoaz3M4LZJ2fP+N7Vl9XGwr4QAV8rh4l4o=", + "lastModified": 1710611769, + "narHash": "sha256-gM4cDw45J8mBmM0aR5Ko/zMAA8UWnQhc4uZ5Ydvc4uo=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "683a4b07c514fa3c13cdf09e475283a69fcc7653", + "rev": "0e87a08e15c023325b64920d9e1159f38a090695", "type": "github" }, "original": { @@ -67,11 +95,11 @@ ] }, "locked": { - "lastModified": 1706198673, - "narHash": "sha256-bHlxFd+3QHy6eXtTzzhwVNcyxBSOxTvBuJGNUzI4C4M=", + "lastModified": 1710415616, + "narHash": "sha256-1qVByzzCcKoCmP8ReUSAjKU5V9pfTLHQIM4WI1tvQ9E=", "owner": "hyprwm", "repo": "contrib", - "rev": "16884001b26e6955ff4b88b4dfe4c8986e20f153", + "rev": "75420d09f93346d9d23d5a1e26b42699f6b66cd6", "type": "github" }, "original": { @@ -109,16 +137,42 @@ "inputs": { "nixpkgs": [ "hyprland", - "xdph", + "hyprcursor", "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1709914708, + "narHash": "sha256-bR4o3mynoTa1Wi4ZTjbnsZ6iqVcPGriXp56bZh5UFTk=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "a685493fdbeec01ca8ccdf1f3655c044a8ce2fe2", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprlang_2": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" ] }, "locked": { - "lastModified": 1704287638, - "narHash": "sha256-TuRXJGwtK440AXQNl5eiqmQqY4LZ/9+z/R7xC0ie3iA=", + "lastModified": 1709914708, + "narHash": "sha256-bR4o3mynoTa1Wi4ZTjbnsZ6iqVcPGriXp56bZh5UFTk=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "6624f2bb66d4d27975766e81f77174adbe58ec97", + "rev": "a685493fdbeec01ca8ccdf1f3655c044a8ce2fe2", "type": "github" }, "original": { @@ -129,11 +183,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1705496572, - "narHash": "sha256-rPIe9G5EBLXdBdn9ilGc0nq082lzQd0xGGe092R/5QE=", + "lastModified": 1708475490, + "narHash": "sha256-g1v0TsWBQPX97ziznfJdWhgMyMGtoBFs102xSYO4syU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "842d9d80cfd4560648c785f8a4e6f3b096790e19", + "rev": "0e74ca98a74bc7270d28838369593635a5db3260", "type": "github" }, "original": { @@ -145,11 +199,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1707546158, - "narHash": "sha256-nYYJTpzfPMDxI8mzhQsYjIUX+grorqjKEU9Np6Xwy/0=", + "lastModified": 1710272261, + "narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d934204a0f8d9198e1e4515dd6fec76a139c87f0", + "rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2", "type": "github" }, "original": { @@ -161,18 +215,17 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1701902328, - "narHash": "sha256-3tiiSEgQRPps0aV40belvLk1k4Max7oRh/+hZGLtfGc=", - "owner": "langedev", + "lastModified": 1710451336, + "narHash": "sha256-pP86Pcfu3BrAvRO7R64x7hs+GaQrjFes+mEPowCfkxY=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "162f092c27afe0949253753f088c2babfba5b902", + "rev": "d691274a972b3165335d261cc4671335f5c67de9", "type": "github" }, "original": { - "owner": "langedev", + "id": "nixpkgs", "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "indirect" } }, "root": { @@ -199,22 +252,37 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, "wlroots": { "flake": false, "locked": { "host": "gitlab.freedesktop.org", - "lastModified": 1706359063, - "narHash": "sha256-5HUTG0p+nCJv3cn73AmFHRZdfRV5AD5N43g8xAePSKM=", + "lastModified": 1709983277, + "narHash": "sha256-wXWIJLd4F2JZeMaihWVDW/yYXCLEC8OpeNJZg9a9ly8=", "owner": "wlroots", "repo": "wlroots", - "rev": "00b869c1a96f300a8f25da95d624524895e0ddf2", + "rev": "50eae512d9cecbf0b3b1898bb1f0b40fa05fe19b", "type": "gitlab" }, "original": { "host": "gitlab.freedesktop.org", "owner": "wlroots", "repo": "wlroots", - "rev": "00b869c1a96f300a8f25da95d624524895e0ddf2", + "rev": "50eae512d9cecbf0b3b1898bb1f0b40fa05fe19b", "type": "gitlab" } }, @@ -224,7 +292,10 @@ "hyprland", "hyprland-protocols" ], - "hyprlang": "hyprlang", + "hyprlang": [ + "hyprland", + "hyprlang" + ], "nixpkgs": [ "hyprland", "nixpkgs" @@ -235,11 +306,11 @@ ] }, "locked": { - "lastModified": 1706521509, - "narHash": "sha256-AInZ50acOJ3wzUwGzNr1TmxGTMx+8j6oSTzz4E7Vbp8=", + "lastModified": 1709299639, + "narHash": "sha256-jYqJM5khksLIbqSxCLUUcqEgI+O2LdlSlcMEBs39CAU=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "c06fd88b3da492b8f9067be021b9184f7012b5a8", + "rev": "2d2fb547178ec025da643db57d40a971507b82fe", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index c40464f..5004e37 100644 --- a/flake.nix +++ b/flake.nix @@ -2,14 +2,11 @@ description = "Home Manager configuration of pan"; inputs = { - # Specify the source of Home Manager and Nixpkgs. - nixpkgs.url = "github:langedev/nixpkgs/nixos-unstable"; - + nixpkgs.url = "nixpkgs/nixos-unstable"; home-manager = { - url = "github:langedev/home-manager"; + url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; - hyprland.url = "github:hyprwm/Hyprland"; hyprland-contrib = { url = "github:hyprwm/contrib"; diff --git a/home.nix b/home.nix index b1c70ae..434155e 100644 --- a/home.nix +++ b/home.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, pkgs, xdg, ... }: { nixpkgs.config.allowUnfree = true; @@ -23,6 +23,7 @@ ./programs/ssh ./programs/wal ./programs/xdg + ./programs/xonsh ./services/timers ]; @@ -39,6 +40,7 @@ zathura # PDF viewer ani-cli # Easy anime player lutgen # LUT generator + prismlauncher # Minecraft launcher texlive.combined.scheme-full # Latex @@ -52,6 +54,8 @@ EDITOR = "nvim"; VISUAL = "nvim"; BROWSER = "librewolf"; + GRADLE_USER_HOME = "/home/pan/.local/share" + "/gradle"; + CUDA_CACHE_PATH = "/home/pan/.cache" + "/nv"; }; home.sessionPath = [ diff --git a/programs/xonsh/default.nix b/programs/xonsh/default.nix index 3dd83ce..9700e76 100644 --- a/programs/xonsh/default.nix +++ b/programs/xonsh/default.nix @@ -1,15 +1,17 @@ { config, pkgs, ... }: - +let rootPath = ./.; in { - programs.xonsh.enable = true; - - programs.xonsh.interactiveShellInit = '' - cat ~/.cache/wal/sequences - ''; - - home.sessionVariables = { - PROMPT = "τ "; - RIGHT_PROMPT = "{YELLOW}{gitstatus: {} }{BLUE}{short_cwd}{DEFAULT}"; - VI_MODE = 1; + home.packages = with pkgs; [ + xonsh + ]; + home.sessionVariables = { + PROMPT = "τ "; + RIGHT_PROMPT = "{YELLOW}{gitstatus: {} }{BLUE}{short_cwd}{DEFAULT}"; + VI_MODE = 1; }; + xdg.configFile."xonshrc" = { + source = rootPath + "/rc.xsh"; + target = "xonsh/rc.xsh"; + }; + } diff --git a/programs/xonsh/rc.xsh b/programs/xonsh/rc.xsh new file mode 100644 index 0000000..681ad03 --- /dev/null +++ b/programs/xonsh/rc.xsh @@ -0,0 +1,7 @@ +#!/usr/bin/env xonsh + +if $XONSH_INTERACTIVE: + if '__HM_SESS_VARS_SOURCED' in ${...}: + del $__HM_SESS_VARS_SOURCED + source-bash "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" --suppress-skip-message + cat "$HOME/.cache/wallust/sequences" From 3c2e9b0bf08873cea7fbafb1178d20d11016d84a Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Sat, 16 Mar 2024 11:13:04 -0700 Subject: [PATCH 26/61] temp disable wallust templates while empty --- programs/wal/default.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/programs/wal/default.nix b/programs/wal/default.nix index d0746b3..5d63ae9 100644 --- a/programs/wal/default.nix +++ b/programs/wal/default.nix @@ -3,7 +3,7 @@ let rootPath = ./.; in { home.packages = with pkgs; [ wallust # A better pywal - pywalfox # Update librewolf's colorscheme based on wal + pywalfox-native # Update librewolf's colorscheme based on wal ]; xdg.configFile."wallust-config" = { target = "wallust/wallust.toml"; @@ -21,8 +21,8 @@ let rootPath = ./.; in # target = "~/.config/dunst/dunstrc" ''; }; - xdg.configFile."wallust-templates" = { - source = rootPath + "/templates"; - target = "wallust/"; - }; + #xdg.configFile."wallust-templates" = { + # source = rootPath + "/templates"; + # target = "wallust/"; + #}; } From 269c6f6e673a88caeb74cb97479baeb9bbd9965c Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Mon, 8 Apr 2024 23:01:37 -0700 Subject: [PATCH 27/61] Discord, swap betterdiscord for vesktop Change better discord for vesktop Update hypr rules to call vesktop instead of discord --- programs/discord/default.nix | 9 +- .../discord/plugins/chatlessdisc.plugin.js | 197 ------------------ programs/hypr/window_rules.conf | 2 +- 3 files changed, 2 insertions(+), 206 deletions(-) delete mode 100644 programs/discord/plugins/chatlessdisc.plugin.js diff --git a/programs/discord/default.nix b/programs/discord/default.nix index 4221921..8344f47 100644 --- a/programs/discord/default.nix +++ b/programs/discord/default.nix @@ -1,13 +1,6 @@ { config, pkgs, ... }: -let rootPath = ./.; in { home.packages = with pkgs; [ - discord # Base app - betterdiscordctl # Better Discord Installer + vesktop # Base app ]; - # Better Discord plugins - xdg.configFile."better-discord" = { - source = rootPath + "/plugins"; - target = "BetterDiscord/plugins"; - }; } diff --git a/programs/discord/plugins/chatlessdisc.plugin.js b/programs/discord/plugins/chatlessdisc.plugin.js deleted file mode 100644 index 76d78d2..0000000 --- a/programs/discord/plugins/chatlessdisc.plugin.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @name chatlessdisc - * @version 1.1.0 - * @description removes the chatting from disc, as god intended - * @author Julia Lange - * - */ - -const TITLE = "chatless-disc"; - -function getChat() { - let chatsPotentialChild = document.querySelector( - "div > section[aria-label='Channel header']"); - if (chatsPotentialChild) { - let chat = chatsPotentialChild.parentElement; - return chat; - } - return null; -} - -function removeChat() { - let chat = getChat() - if (chat) chat.style = "display: none"; -} -function restoreChat() { - let chat = getChat() - if (chat) chat.style = "display: flex"; -} - -function expandSidebar() { - let userArea = document.querySelector("section[aria-label='User area']"); - let sidebar = userArea.parentElement; - sidebar.style = "width: 100%"; - removeChat(); - - userArea.childNodes.forEach(node => { - node.style = "justify-content: space-between"; - }); -} - -function contractSidebar() { - let userArea = document.querySelector("section[aria-label='User area']"); - let sidebar = userArea.parentElement; - sidebar.style = ""; - restoreChat(); - - userArea.childNodes.forEach(node => { - node.style = ""; - }); -} - -function addChannelClass() { - let dms = document.querySelector("ul[aria-label='Direct Messages']"); - if (dms == null) return ""; - let friendsElement = dms.childNodes[1] - if (friendsElement == null) return ""; - let channelClassName = friendsElement.className.split(" ")[0] - if (channelClassName != "") { - BdApi.DOM.addStyle(TITLE, `.${channelClassName} { - max-width: 100%; - }`); - } - return channelClassName; -} - -function clickPopOut() { - let popOutButton = document.querySelector("button[aria-label='Pop Out']"); - if (popOutButton == null) return; - popOutButton.click(); -} - -function addToggleButton(button) { - let muteButton = document.querySelector("div > button[aria-label='Mute']"); - if (muteButton == null) return; - let buttonList = muteButton.parentElement; - buttonList.prepend(button) - - enablePortraitStyle() -} - -function enablePortraitStyle() { - let portrait = document.querySelector("div[aria-label='Set Status']"); - if (portrait == null) return; - portrait.style = "width: 100%; min-width: 0px"; -} - -function disablePortaitStyle() { - let portrait = document.querySelector("div[aria-label='Set Status']"); - if (portrait == null) return; - portrait.style = ""; -} - -function enableChanges() { - expandSidebar(); - - return true -} - -function disableChanges() { - contractSidebar(); - - return false -} - -function createToggleButton(onClickFunction) { - let toggleButton = document.createElement("button"); - toggleButton.role = "switch"; - toggleButton.ariaLabel = "Chattless Toggle"; - toggleButton.className = "chattless_button"; - toggleButton.style.cssText = ` - display: flex; - align-items: center; - justify-content: center; - background: transparent;` - toggleButton.addEventListener("click", onClickFunction); - - const div = document.createElement("div"); - div.style.cssText = ` - display: flex; - align-items: center; - justify-content: center;`; - - const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); - svg.setAttribute("aria-hidden", "false"); - svg.setAttribute("width", "20"); - svg.setAttribute("height", "20"); - svg.setAttribute("viewBox", "0 0 512.08 512.08"); - - const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); - path.setAttribute("fill", "var(--interactive-normal)"); - path.setAttribute("d", "M256.04,0C134.28,0,35.208,97.248,35.208,216.8c0,66.56,30.208,127.776,83.168,169.216V512.08 \ - l103.552-81.2c11.536,1.776,22.992,2.688,34.112,2.688c121.76,0,220.832-97.232,220.832-216.768C476.872,97.248,377.8,0,256.04,0z \ - M444.872,216.8c0,44.336-16.064,85.056-42.768,116.928L140.408,71.024C172.408,46.656,212.456,32,256.04,32 \ - C360.168,32,444.872,114.912,444.872,216.8z M220.552,398.192l-7.104-1.312l-63.056,49.456v-76.432l-6.592-4.8 \ - C95.128,329.776,67.224,275.712,67.224,216.8c0-47.872,18.848-91.408,49.472-124.256l262.768,263.792 \ - c-33.136,28.096-76.224,45.232-123.408,45.232C244.536,401.568,232.6,400.416,220.552,398.192z"); - - svg.appendChild(path); - div.appendChild(svg); - toggleButton.appendChild(div); - - return toggleButton; -} - - - - - -class chatlessdisc { - - constructor() { - this.enabled = false; - this.channelActionsModule = BdApi.findModuleByProps('selectChannel'); - - this.toggleButton = createToggleButton(async () => { - if (this.enabled) - this.enabled = disableChanges(); - else - this.enabled = enableChanges(); - }); - } - - start() { - this.enabled = enableChanges(); - addToggleButton(this.toggleButton); - this.channelClassName = addChannelClass(); - - BdApi.DOM.addStyle(TITLE, `.chattless_button:hover { - background: rgba(255,255,255,0.125) !important; - }`); - - BdApi.Patcher.instead(TITLE, this.channelActionsModule, - "selectChannel", async (_, args, originalFunction) => { - await originalFunction(...args); - if (this.enabled) { - removeChat(); - if (this.channelClassName == "") - this.channelClassName = addChannelClass(); - } - }); - BdApi.Patcher.instead(TITLE, this.channelActionsModule, - "selectVoiceChannel", async (_, args, originalFunction) => { - await originalFunction(...args); - if (this.enabled) { - await this.channelActionsModule.selectPrivateChannel(args[0]); - clickPopOut(); - } - }); - } - //Turn off and remove all parts of the plugin - stop() { - this.toggleButton.remove() - disableChanges(); - BdApi.Patcher.unpatchAll(TITLE); - BdApi.DOM.removeStyle(TITLE); - } -} diff --git a/programs/hypr/window_rules.conf b/programs/hypr/window_rules.conf index 6643f96..8d084ea 100644 --- a/programs/hypr/window_rules.conf +++ b/programs/hypr/window_rules.conf @@ -35,5 +35,5 @@ windowrulev2 = opacity 1 override, class:^(mpv)$ env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db exec-once = [workspace special:mus silent;float;size 70% 70%;center] alacritty -e spt -exec-once = [workspace name:chat silent] Discord +exec-once = [workspace name:chat silent] vesktop exec-once = [workspace name:chat silent] beeper From 14a235cdcc56ec8a96fc8a2c2b68ad9264375b88 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Mon, 8 Apr 2024 23:03:32 -0700 Subject: [PATCH 28/61] Hypr, fix nvidia screen tearing issue Fixes an issue causing screen tearing by reducing refresh rate to 60Hz. Disables window swallowing because I accidentally added that to this commit --- programs/hypr/settings.conf | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/programs/hypr/settings.conf b/programs/hypr/settings.conf index 77eceff..ca95da9 100644 --- a/programs/hypr/settings.conf +++ b/programs/hypr/settings.conf @@ -1,11 +1,8 @@ # Monitor Settings -monitor=DP-2,2560x1440@144,0x0,1 +monitor=DP-2,2560x1440@60,0x0,1 monitor=DP-1,2560x1440@144,-2560x0,1 monitor=HDMI-A-1,disable -# Fix screen tearing -env = WLR_DRM_NO_ATOMIC,1 - # Inits exec-once = swww init exec-once = swww img $HOME/med/pix/bg.png @@ -28,7 +25,6 @@ general { col.inactive_border = rgb(1E1D2F) layout = master - allow_tearing = true } decoration { @@ -61,6 +57,6 @@ master { misc { focus_on_activate = true - enable_swallow = true + enable_swallow = false swallow_regex = ^(Alacritty)$ } From 7f6b461f29fc189395bcf9bebd8d9e6f6e6a4975 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Mon, 8 Apr 2024 23:03:47 -0700 Subject: [PATCH 29/61] Hypr, Add kde-polkit client to hypr --- programs/hypr/default.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix index 4c2caeb..645ef5c 100644 --- a/programs/hypr/default.nix +++ b/programs/hypr/default.nix @@ -9,6 +9,7 @@ let rootPath = ./.; in ${builtins.readFile ./nvidia.conf} ${builtins.readFile ./keybinds.conf} ${builtins.readFile ./xwaylandvideobridge.conf} + exec-once=${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1 ''; # wayland.windowManager.hyprland.enableNvidiaPatches = true; home.packages = with pkgs; [ @@ -20,6 +21,7 @@ let rootPath = ./.; in hyprpicker # Colorpicker, needed for screenshot tool inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool xwaylandvideobridge # Allows screensharing with xwayland apps + polkit-kde-agent # Polkit handler ]; # Hyprland screenshot tool xdg.configFile."hypr-scripts" = { From c9cd42eaa3d28ebc9665514844dd6cc754e16378 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Mon, 8 Apr 2024 23:04:16 -0700 Subject: [PATCH 30/61] Hypr, Add window rules for touhou and overwatch --- programs/hypr/league_rules.conf | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/programs/hypr/league_rules.conf b/programs/hypr/league_rules.conf index a2730bc..5c573f0 100644 --- a/programs/hypr/league_rules.conf +++ b/programs/hypr/league_rules.conf @@ -9,11 +9,17 @@ windowrulev2 = noborder, class:^(leagueclient.exe)$ windowrulev2 = nofocus, class:^(leagueclient.exe)$ windowrulev2 = noshadow, class:^(leagueclient.exe)$ -# gamer settings (set ingame to borderless) -#windowrulev2 = immediate, class:^(league of legends.exe)$ +# windowrulev2 = immediate, class:^(league of legends.exe)$ +# windowrulev2 = immediate, class:^(overwatch.exe)$ +# windowrulev2 = immediate, class:^(steam_app_1384160)$ +windowrulev2 = fullscreen, class:^(overwatch.exe)$ +windowrulev2 = fullscreen, class:^(steam_app_1384160)$ windowrulev2 = fullscreen, class:^(league of legends.exe)$ # workspaces windowrule = workspace name:game, leagueclient.exe windowrule = workspace name:game, leagueclientux.exe windowrule = workspace name:game, league of legends.exe +windowrule = workspace name:game, overwatch.exe +windowrule = workspace name:game, 東方紅魔郷.exe +windowrule = workspace name:game, steam_app_1384160 From c97d94408e5baa8cf2903de1b5f54c07bda4012f Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Mon, 8 Apr 2024 23:19:54 -0700 Subject: [PATCH 31/61] Add kitty, obs, and scripts skeleton code Also refactors some flake.nix code to not use dictionaries --- flake.lock | 131 +++++++++-------------------------- flake.nix | 43 ++++++------ home.nix | 10 ++- programs/kitty/default.nix | 12 ++++ programs/obs/default.nix | 11 +++ services/scripts/default.nix | 10 +++ services/scripts/select.nix | 15 ++++ 7 files changed, 111 insertions(+), 121 deletions(-) create mode 100644 programs/kitty/default.nix create mode 100644 programs/obs/default.nix create mode 100644 services/scripts/default.nix create mode 100644 services/scripts/select.nix diff --git a/flake.lock b/flake.lock index abe0102..7c3d189 100644 --- a/flake.lock +++ b/flake.lock @@ -2,14 +2,16 @@ "nodes": { "ags": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1710523796, - "narHash": "sha256-VlzW+B/6Ifk+BRy1leU0GHuQ4KqlQXLO/pRRCCHcvDQ=", + "lastModified": 1712250145, + "narHash": "sha256-8WTGn7It2kZfAmN97Epi3g/Su/w3Hbw/T4dWxE7OrBw=", "owner": "Aylur", "repo": "ags", - "rev": "5dec6c7f37be13781144a7964e75cc00c7d7045f", + "rev": "d589077199ec8a055ef936bf8a1f051b7a0c7e34", "type": "github" }, "original": { @@ -25,11 +27,11 @@ ] }, "locked": { - "lastModified": 1710532761, - "narHash": "sha256-SUXGZNrXX05YA9G6EmgupxhOr3swI1gcxLUeDMUhrEY=", + "lastModified": 1712462372, + "narHash": "sha256-WA3bbBWhd3o1wAgyHZNypjb/LG4oq+IWxFq8ey8yNPU=", "owner": "nix-community", "repo": "home-manager", - "rev": "206f457fffdb9a73596a4cb2211a471bd305243d", + "rev": "a561ad6ab38578c812cc9af3b04f2cc60ebf48c9", "type": "github" }, "original": { @@ -40,7 +42,10 @@ }, "hyprcursor": { "inputs": { - "hyprlang": "hyprlang", + "hyprlang": [ + "hyprland", + "hyprlang" + ], "nixpkgs": [ "hyprland", "nixpkgs" @@ -51,11 +56,11 @@ ] }, "locked": { - "lastModified": 1710257359, - "narHash": "sha256-43re5pzE/cswFAgw92/ugsB3+d5ufDaCcLtl9ztKfBo=", + "lastModified": 1712434681, + "narHash": "sha256-qwmR2p1oc48Bj7gUDvb1oGL19Rjs2PmEmk4ChV01A5o=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "1761f6cefd77f4fcd2039d930c88d6716ddc4974", + "rev": "818d8c4b69e0997483d60b75f701fe14b561a7a3", "type": "github" }, "original": { @@ -68,18 +73,20 @@ "inputs": { "hyprcursor": "hyprcursor", "hyprland-protocols": "hyprland-protocols", - "hyprlang": "hyprlang_2", - "nixpkgs": "nixpkgs_2", - "systems": "systems_2", + "hyprlang": "hyprlang", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems", "wlroots": "wlroots", "xdph": "xdph" }, "locked": { - "lastModified": 1710611769, - "narHash": "sha256-gM4cDw45J8mBmM0aR5Ko/zMAA8UWnQhc4uZ5Ydvc4uo=", + "lastModified": 1712528342, + "narHash": "sha256-5tRzlHnhk28M2ClRshRAEANGE/GF9A1Cl36OXAmi+Ig=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "0e87a08e15c023325b64920d9e1159f38a090695", + "rev": "43b96f03b5af60586a864ea64e8c71b11ea6eb85", "type": "github" }, "original": { @@ -95,11 +102,11 @@ ] }, "locked": { - "lastModified": 1710415616, - "narHash": "sha256-1qVByzzCcKoCmP8ReUSAjKU5V9pfTLHQIM4WI1tvQ9E=", + "lastModified": 1712505318, + "narHash": "sha256-fzlBLhXUN6y7mzEtcGNRDXxFakBEfaj4Bmj5PuoCNaM=", "owner": "hyprwm", "repo": "contrib", - "rev": "75420d09f93346d9d23d5a1e26b42699f6b66cd6", + "rev": "5870244b592c22558b658dbaf94f9e41afb0316f", "type": "github" }, "original": { @@ -134,29 +141,6 @@ } }, "hyprlang": { - "inputs": { - "nixpkgs": [ - "hyprland", - "hyprcursor", - "nixpkgs" - ], - "systems": "systems" - }, - "locked": { - "lastModified": 1709914708, - "narHash": "sha256-bR4o3mynoTa1Wi4ZTjbnsZ6iqVcPGriXp56bZh5UFTk=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "a685493fdbeec01ca8ccdf1f3655c044a8ce2fe2", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprlang_2": { "inputs": { "nixpkgs": [ "hyprland", @@ -168,11 +152,11 @@ ] }, "locked": { - "lastModified": 1709914708, - "narHash": "sha256-bR4o3mynoTa1Wi4ZTjbnsZ6iqVcPGriXp56bZh5UFTk=", + "lastModified": 1711671891, + "narHash": "sha256-C/Wwsy/RLxHP1axFFl+AnwJRWfd8gxDKKoa8nt8Qk3c=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "a685493fdbeec01ca8ccdf1f3655c044a8ce2fe2", + "rev": "c1402612146ba06606ebf64963a02bc1efe11e74", "type": "github" }, "original": { @@ -183,43 +167,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1708475490, - "narHash": "sha256-g1v0TsWBQPX97ziznfJdWhgMyMGtoBFs102xSYO4syU=", + "lastModified": 1712439257, + "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0e74ca98a74bc7270d28838369593635a5db3260", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1710272261, - "narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1710451336, - "narHash": "sha256-pP86Pcfu3BrAvRO7R64x7hs+GaQrjFes+mEPowCfkxY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "d691274a972b3165335d261cc4671335f5c67de9", + "rev": "ff0dbd94265ac470dda06a657d5fe49de93b4599", "type": "github" }, "original": { @@ -234,7 +186,7 @@ "home-manager": "home-manager", "hyprland": "hyprland", "hyprland-contrib": "hyprland-contrib", - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs" } }, "systems": { @@ -252,21 +204,6 @@ "type": "github" } }, - "systems_2": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, "wlroots": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 5004e37..d3ec4c7 100644 --- a/flake.nix +++ b/flake.nix @@ -3,30 +3,31 @@ inputs = { nixpkgs.url = "nixpkgs/nixos-unstable"; - home-manager = { - url = "github:nix-community/home-manager"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + + home-manager.url = "github:nix-community/home-manager"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + hyprland.url = "github:hyprwm/Hyprland"; - hyprland-contrib = { - url = "github:hyprwm/contrib"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + hyprland.inputs.nixpkgs.follows = "nixpkgs"; + + hyprland-contrib.url = "github:hyprwm/contrib"; + hyprland-contrib.inputs.nixpkgs.follows = "nixpkgs"; + ags.url = "github:Aylur/ags"; + ags.inputs.nixpkgs.follows = "nixpkgs"; }; - outputs = { nixpkgs, home-manager, hyprland, ... }@inputs: - let - system = "x86_64-linux"; - pkgs = nixpkgs.legacyPackages.${system}; - in { - homeConfigurations."pan" = home-manager.lib.homeManagerConfiguration { - inherit pkgs; - extraSpecialArgs = { inherit inputs; }; - modules = [ - hyprland.homeManagerModules.default - ./home.nix - ]; - }; + outputs = { nixpkgs, home-manager, hyprland, ... }@inputs: let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in { + homeConfigurations."pan" = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + extraSpecialArgs = { inherit inputs; }; + modules = [ + hyprland.homeManagerModules.default + ./home.nix + ]; }; + }; } diff --git a/home.nix b/home.nix index 434155e..097a0d3 100644 --- a/home.nix +++ b/home.nix @@ -1,4 +1,4 @@ -{ config, pkgs, xdg, ... }: +{ config, pkgs, ... }: { nixpkgs.config.allowUnfree = true; @@ -8,6 +8,7 @@ imports = [ # ./programs/dunst # ./programs/eww + # ./programs/spotify ./programs/ags ./programs/alacritty ./programs/discord @@ -19,12 +20,14 @@ ./programs/nnn ./programs/nvim ./programs/rofi - ./programs/spotify ./programs/ssh ./programs/wal ./programs/xdg ./programs/xonsh + ./programs/obs + ./programs/kitty + # ./services/scripts ./services/timers ]; @@ -41,6 +44,7 @@ ani-cli # Easy anime player lutgen # LUT generator prismlauncher # Minecraft launcher + unzip # Unzip utility texlive.combined.scheme-full # Latex @@ -67,5 +71,5 @@ programs.man.generateCaches = false; # Let Home Manager install and manage itself. programs.home-manager.enable = true; - home.stateVersion = "23.05"; # don't change lol, u know why + home.stateVersion = "23.05"; } diff --git a/programs/kitty/default.nix b/programs/kitty/default.nix new file mode 100644 index 0000000..2bff14d --- /dev/null +++ b/programs/kitty/default.nix @@ -0,0 +1,12 @@ +{ config, pkgs, ... }: + +{ + programs.kitty = { + enable = true; + settings = { + font_family = "Cascadia Code"; + font_size = 18; + enable_audio_bell = "no"; + }; + }; +} diff --git a/programs/obs/default.nix b/programs/obs/default.nix new file mode 100644 index 0000000..edd2865 --- /dev/null +++ b/programs/obs/default.nix @@ -0,0 +1,11 @@ +{ config, pkgs, ... }: +{ + programs.obs-studio = { + enable = true; + plugins = with pkgs.obs-studio-plugins; [ + wlrobs + obs-backgroundremoval + obs-pipewire-audio-capture + ]; + }; +} diff --git a/services/scripts/default.nix b/services/scripts/default.nix new file mode 100644 index 0000000..aa31a14 --- /dev/null +++ b/services/scripts/default.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ... }: + +let + select = import ./select.nix { inherit pkgs; }; +in +{ + home.packages = [ + select + ]; +} diff --git a/services/scripts/select.nix b/services/scripts/select.nix new file mode 100644 index 0000000..c9462ab --- /dev/null +++ b/services/scripts/select.nix @@ -0,0 +1,15 @@ +{ pkgs }: + +pkgs.writeShellApplication { + name = "select"; + + runtimeInputs = [ fzf rofi ]; + + text = '' + if [ ${PPID} -ne 1 ]; then + echo -e $1 | fzf + else + echo -e $1 | rofi -dmenu -p $2 + fi + ''; +} From a07b300be7b7daeb7763291ef76fbb0e9efa9e05 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Tue, 9 Apr 2024 15:07:17 -0700 Subject: [PATCH 32/61] Add zsh, swap alacritty for kitty Adds zsh with nix-your-shell support switch from alacritty to kitty Add zsh Fix ZSH, and switch to ZSH from alacritty Add zsh prompt Swap any-nix-shell for nix-your-shell --- home.nix | 1 + programs/hypr/keybinds.conf | 2 +- programs/hypr/window_rules.conf | 5 +++-- programs/zsh/default.nix | 31 +++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 programs/zsh/default.nix diff --git a/home.nix b/home.nix index 097a0d3..00fedd6 100644 --- a/home.nix +++ b/home.nix @@ -26,6 +26,7 @@ ./programs/xonsh ./programs/obs ./programs/kitty + ./programs/zsh # ./services/scripts ./services/timers diff --git a/programs/hypr/keybinds.conf b/programs/hypr/keybinds.conf index d769a46..26e89e0 100644 --- a/programs/hypr/keybinds.conf +++ b/programs/hypr/keybinds.conf @@ -1,7 +1,7 @@ $mainMod = SUPER # Exec programs -bind = $mainMod, return, exec, alacritty +bind = $mainMod, return, exec, kitty bind = $mainMod SHIFT, return, exec, rofi -show run bind = $mainMod, P, exec, grimblast --freeze copy area bind = $mainMod SHIFT, P, exec, grimblast --freeze copysave area diff --git a/programs/hypr/window_rules.conf b/programs/hypr/window_rules.conf index 8d084ea..57be0c8 100644 --- a/programs/hypr/window_rules.conf +++ b/programs/hypr/window_rules.conf @@ -14,7 +14,7 @@ workspace=name:web , monitor:DP-1, persistent:true workspace=name:med , monitor:DP-1, persistent:true # Pseudo workspace=special:mus, persistent:true -workspace=special:scratch, on-created-empty: [float; size 50% 50%; center] alacritty +workspace=special:scratch, on-created-empty: [float; size 50% 50%; center] kitty windowrule = workspace name:web, librewolf windowrulev2 = workspace name:med, librewolf,title:Picture-in-Picture @@ -26,6 +26,7 @@ windowrule = workspace name:game, explorer.exe windowrulev2 = opacity 0.94 fullscreen:0 windowrulev2 = opacity 0.79 override, class:^(Alacritty)$ +windowrulev2 = opacity 0.79 override, class:^(kitty)$ windowrulev2 = opacity 1 override, initialTitle:^(Discord Popout)$ windowrulev2 = opacity 1 override, class:^(firefox)$ windowrulev2 = opacity 1 override, class:^(Gimp)$ @@ -34,6 +35,6 @@ windowrulev2 = opacity 1 override, class:^(mpv)$ env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db -exec-once = [workspace special:mus silent;float;size 70% 70%;center] alacritty -e spt +# exec-once = [workspace special:mus silent;float;size 70% 70%;center] mus client exec-once = [workspace name:chat silent] vesktop exec-once = [workspace name:chat silent] beeper diff --git a/programs/zsh/default.nix b/programs/zsh/default.nix new file mode 100644 index 0000000..694b981 --- /dev/null +++ b/programs/zsh/default.nix @@ -0,0 +1,31 @@ +{ config, pkgs, ... }: +{ + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + dotDir = ".config/zsh"; + + history.save = 10000; + history.size = 10000; + history.path = "${config.xdg.dataHome}/zsh/history"; + initExtra = '' + # Nix-shell + ${pkgs.nix-your-shell}/bin/nix-your-shell zsh | source /dev/stdin + + # Prompt + autoload -U colors && colors + autoload -Uz vcs_info + precmd_vcs_info() { vcs_info } + precmd_functions+=( precmd_vcs_info ) + setopt prompt_subst + zstyle ':vcs_info:*' check-for-changes true + zstyle ':vcs_info:*' unstagedstr '·*' + zstyle ':vcs_info:*' stagedstr '·+' + zstyle ':vcs_info:git:*' formats '%b%u%c' + export PROMPT="%(0?.%F{white}.%? %F{red})τ%f " + export RPROMPT="%F{yellow}\$vcs_info_msg_0_%f %F{blue}%~%f" + ''; + }; +} From 90087c06063cc119b5c442146d850c78afe79ebc Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Wed, 10 Apr 2024 15:15:08 -0700 Subject: [PATCH 33/61] Add lf --- home.nix | 1 + programs/lf/default.nix | 85 ++++++++++ programs/lf/icons | 361 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 447 insertions(+) create mode 100644 programs/lf/default.nix create mode 100644 programs/lf/icons diff --git a/home.nix b/home.nix index 00fedd6..34a4693 100644 --- a/home.nix +++ b/home.nix @@ -27,6 +27,7 @@ ./programs/obs ./programs/kitty ./programs/zsh + ./programs/lf # ./services/scripts ./services/timers diff --git a/programs/lf/default.nix b/programs/lf/default.nix new file mode 100644 index 0000000..1eb8c30 --- /dev/null +++ b/programs/lf/default.nix @@ -0,0 +1,85 @@ +{ config, pkgs, ... }: + +{ + xdg.configFile."lf/icons".source = ./icons; + + home.packages = with pkgs; [ + trash-cli # Trash program for lf + ]; + + programs.lf = { + enable = true; + settings = { + # Hide specific files rather than "hidden" files + hiddenfiles = [ + "${config.home.homeDirectory}/.librewolf" + "${config.home.homeDirectory}/.nix-defexpr" + "${config.home.homeDirectory}/.nix-profile" + "${config.home.homeDirectory}/.nv" + "${config.home.homeDirectory}/.pki" + "${config.home.homeDirectory}/.steam*" + "${config.home.homeDirectory}/.zshenv" + ]; + ratios = [ + 2 + 3 + ]; + preview = true; + ignorecase = true; + icons = true; + number = true; + relativenumber = true; + }; + commands = { + dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"''; + mkdir = '' + ''${{ + printf "Directory Name: " + read DIR + mkdir $DIR + }} + ''; + mkfile = '' + ''${{ + printf "File Name: " + read FILE + mkdir $FILE + }} + ''; + trash = ''trash "$fx"''; + }; + keybindings = { + ";" = ""; + x = "trash"; + "." = "set hidden!"; + ";d" = "mkdir"; + ";f" = "mkfile"; + ";m" = "dragon-out"; + }; + extraConfig = + let + previewer = + pkgs.writeShellScriptBin "pv.sh" '' + file=$1 + w=$2 + h=$3 + x=$4 + y=$5 + + if [[ "$( ${pkgs.file}/bin/file -Lb --mime-type "$file")" =~ ^image ]]; then + ${pkgs.kitty}/bin/kitty +kitten icat --silent --stdin no --transfer-mode file --place "''${w}x''${h}@''${x}x''${y}" "$file" < /dev/null > /dev/tty + exit 1 + fi + + ${pkgs.pistol}/bin/pistol "$file" + ''; + cleaner = pkgs.writeShellScriptBin "clean.sh" '' + ${pkgs.kitty}/bin/kitty +kitten icat --clear --stdin no --silent --transfer-mode file < /dev/null > /dev/tty + ''; + in + '' + set cleaner ${cleaner}/bin/clean.sh + set previewer ${previewer}/bin/pv.sh + ''; + }; +} diff --git a/programs/lf/icons b/programs/lf/icons new file mode 100644 index 0000000..43dbe5d --- /dev/null +++ b/programs/lf/icons @@ -0,0 +1,361 @@ +# vim:ft=conf + +# These examples require Nerd Fonts or a compatible font to be used. +# See https://www.nerdfonts.com for more information. + +# default values from lf (with matching order) +# ln l # LINK +# or l # ORPHAN +# tw t # STICKY_OTHER_WRITABLE +# ow d # OTHER_WRITABLE +# st t # STICKY +# di d # DIR +# pi p # FIFO +# so s # SOCK +# bd b # BLK +# cd c # CHR +# su u # SETUID +# sg g # SETGID +# ex x # EXEC +# fi - # FILE + +# file types (with matching order) +ln  # LINK +or  # ORPHAN +tw t # STICKY_OTHER_WRITABLE +ow  # OTHER_WRITABLE +st t # STICKY +di  # DIR +pi p # FIFO +so s # SOCK +bd b # BLK +cd c # CHR +su u # SETUID +sg g # SETGID +ex  # EXEC +fi  # FILE + +# file extensions (vim-devicons) +*.styl  +*.sass  +*.scss  +*.htm  +*.html  +*.slim  +*.haml  +*.ejs  +*.css  +*.less  +*.md  +*.mdx  +*.markdown  +*.rmd  +*.json  +*.webmanifest  +*.js  +*.mjs  +*.jsx  +*.rb  +*.gemspec  +*.rake  +*.php  +*.py  +*.pyc  +*.pyo  +*.pyd  +*.coffee  +*.mustache  +*.hbs  +*.conf  +*.ini  +*.yml  +*.yaml  +*.toml  +*.bat  +*.mk  +*.jpg  +*.jpeg  +*.bmp  +*.png  +*.webp  +*.gif  +*.ico  +*.twig  +*.cpp  +*.c++  +*.cxx  +*.cc  +*.cp  +*.c  +*.cs 󰌛 +*.h  +*.hh  +*.hpp  +*.hxx  +*.hs  +*.lhs  +*.nix  +*.lua  +*.java  +*.sh  +*.fish  +*.bash  +*.zsh  +*.ksh  +*.csh  +*.awk  +*.ps1  +*.ml λ +*.mli λ +*.diff  +*.db  +*.sql  +*.dump  +*.clj  +*.cljc  +*.cljs  +*.edn  +*.scala  +*.go  +*.dart  +*.xul  +*.sln  +*.suo  +*.pl  +*.pm  +*.t  +*.rss  +'*.f#'  +*.fsscript  +*.fsx  +*.fs  +*.fsi  +*.rs  +*.rlib  +*.d  +*.erl  +*.hrl  +*.ex  +*.exs  +*.eex  +*.leex  +*.heex  +*.vim  +*.ai  +*.psd  +*.psb  +*.ts  +*.tsx  +*.jl  +*.pp  +*.vue  +*.elm  +*.swift  +*.xcplayground  +*.tex 󰙩 +*.r 󰟔 +*.rproj 󰗆 +*.sol 󰡪 +*.pem  + +# file names (vim-devicons) (case-insensitive not supported in lf) +*gruntfile.coffee  +*gruntfile.js  +*gruntfile.ls  +*gulpfile.coffee  +*gulpfile.js  +*gulpfile.ls  +*mix.lock  +*dropbox  +*.ds_store  +*.gitconfig  +*.gitignore  +*.gitattributes  +*.gitlab-ci.yml  +*.bashrc  +*.zshrc  +*.zshenv  +*.zprofile  +*.vimrc  +*.gvimrc  +*_vimrc  +*_gvimrc  +*.bashprofile  +*favicon.ico  +*license  +*node_modules  +*react.jsx  +*procfile  +*dockerfile  +*docker-compose.yml  +*docker-compose.yaml  +*compose.yml  +*compose.yaml  +*rakefile  +*config.ru  +*gemfile  +*makefile  +*cmakelists.txt  +*robots.txt 󰚩 + +# file names (case-sensitive adaptations) +*Gruntfile.coffee  +*Gruntfile.js  +*Gruntfile.ls  +*Gulpfile.coffee  +*Gulpfile.js  +*Gulpfile.ls  +*Dropbox  +*.DS_Store  +*LICENSE  +*React.jsx  +*Procfile  +*Dockerfile  +*Docker-compose.yml  +*Docker-compose.yaml  +*Rakefile  +*Gemfile  +*Makefile  +*CMakeLists.txt  + +# file patterns (vim-devicons) (patterns not supported in lf) +# .*jquery.*\.js$  +# .*angular.*\.js$  +# .*backbone.*\.js$  +# .*require.*\.js$  +# .*materialize.*\.js$  +# .*materialize.*\.css$  +# .*mootools.*\.js$  +# .*vimrc.*  +# Vagrantfile$  + +# file patterns (file name adaptations) +*jquery.min.js  +*angular.min.js  +*backbone.min.js  +*require.min.js  +*materialize.min.js  +*materialize.min.css  +*mootools.min.js  +*vimrc  +Vagrantfile  + +# archives or compressed (extensions from dircolors defaults) +*.tar  +*.tgz  +*.arc  +*.arj  +*.taz  +*.lha  +*.lz4  +*.lzh  +*.lzma  +*.tlz  +*.txz  +*.tzo  +*.t7z  +*.zip  +*.z  +*.dz  +*.gz  +*.lrz  +*.lz  +*.lzo  +*.xz  +*.zst  +*.tzst  +*.bz2  +*.bz  +*.tbz  +*.tbz2  +*.tz  +*.deb  +*.rpm  +*.jar  +*.war  +*.ear  +*.sar  +*.rar  +*.alz  +*.ace  +*.zoo  +*.cpio  +*.7z  +*.rz  +*.cab  +*.wim  +*.swm  +*.dwm  +*.esd  + +# image formats (extensions from dircolors defaults) +*.jpg  +*.jpeg  +*.mjpg  +*.mjpeg  +*.gif  +*.bmp  +*.pbm  +*.pgm  +*.ppm  +*.tga  +*.xbm  +*.xpm  +*.tif  +*.tiff  +*.png  +*.svg  +*.svgz  +*.mng  +*.pcx  +*.mov  +*.mpg  +*.mpeg  +*.m2v  +*.mkv  +*.webm  +*.ogm  +*.mp4  +*.m4v  +*.mp4v  +*.vob  +*.qt  +*.nuv  +*.wmv  +*.asf  +*.rm  +*.rmvb  +*.flc  +*.avi  +*.fli  +*.flv  +*.gl  +*.dl  +*.xcf  +*.xwd  +*.yuv  +*.cgm  +*.emf  +*.ogv  +*.ogx  + +# audio formats (extensions from dircolors defaults) +*.aac  +*.au  +*.flac  +*.m4a  +*.mid  +*.midi  +*.mka  +*.mp3  +*.mpc  +*.ogg  +*.ra  +*.wav  +*.oga  +*.opus  +*.spx  +*.xspf  + +# other formats +*.pdf  From a4735423b4c46a6ef5cf1bbe54ab4435370bac89 Mon Sep 17 00:00:00 2001 From: JuliaLange Date: Sun, 14 Apr 2024 02:44:42 -0700 Subject: [PATCH 34/61] Hypr, add icon support --- .gitignore | 2 +- programs/hypr/default.nix | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7c22503..fe40c22 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -**/**/plugins/*.plugin.js +hmModules/apps/hypr/icons/ diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix index 645ef5c..f390790 100644 --- a/programs/hypr/default.nix +++ b/programs/hypr/default.nix @@ -10,6 +10,9 @@ let rootPath = ./.; in ${builtins.readFile ./keybinds.conf} ${builtins.readFile ./xwaylandvideobridge.conf} exec-once=${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1 + + env = HYPRCURSOR_THEME,miku + env = HYPRCURSOR_SIZE,64 ''; # wayland.windowManager.hyprland.enableNvidiaPatches = true; home.packages = with pkgs; [ @@ -19,14 +22,22 @@ let rootPath = ./.; in wl-clipboard # Clipboard manager for wayland xdg-desktop-portal-hyprland # XDP for hyprland hyprpicker # Colorpicker, needed for screenshot tool + hyprcursor # Hyprland cursor inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool xwaylandvideobridge # Allows screensharing with xwayland apps polkit-kde-agent # Polkit handler ]; + # Hyprland screenshot tool xdg.configFile."hypr-scripts" = { source = rootPath + "/scripts"; target = "hypr/scripts"; executable = true; }; + + xdg.dataFile."hypr-icons" = { + source = rootPath + "/icons"; + target = "icons/"; + recursive = true; + }; } From ffada2703cf16ed5e3b8e38710fd49ca84152998 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Sun, 14 Apr 2024 05:40:02 -0700 Subject: [PATCH 35/61] Refactor codebase to use nix modules --- flake.lock | 46 +++++----- flake.nix | 13 +-- hmModules/apps/chat/beeper/default.nix | 13 +++ hmModules/apps/chat/default.nix | 8 ++ hmModules/apps/chat/discord/default.nix | 12 +++ hmModules/apps/default.nix | 18 ++++ hmModules/apps/file-browsers/default.nix | 8 ++ hmModules/apps/file-browsers/lf/default.nix | 82 +++++++++++++++++ .../apps/file-browsers}/lf/icons | 0 hmModules/apps/file-browsers/nnn/default.nix | 17 ++++ hmModules/apps/gimp/default.nix | 13 +++ hmModules/apps/git/default.nix | 19 ++++ hmModules/apps/hypr/default.nix | 50 ++++++++++ .../apps}/hypr/keybinds.conf | 0 .../apps}/hypr/league_rules.conf | 0 {programs => hmModules/apps}/hypr/nvidia.conf | 0 .../apps}/hypr/scripts/changeprimary.xsh | 0 .../apps}/hypr/scripts/changesecondary.xsh | 0 .../apps}/hypr/scripts/initdb.xsh | 0 .../apps}/hypr/settings.conf | 0 .../apps}/hypr/window_rules.conf | 0 .../apps}/hypr/xwaylandvideobridge.conf | 0 hmModules/apps/librewolf/default.nix | 16 ++++ hmModules/apps/lutris/default.nix | 22 +++++ hmModules/apps/media-viewers/default.nix | 9 ++ hmModules/apps/media-viewers/feh/default.nix | 13 +++ hmModules/apps/media-viewers/mpv/default.nix | 22 +++++ .../apps/media-viewers/zathura/default.nix | 13 +++ hmModules/apps/neovim/default.nix | 86 ++++++++++++++++++ .../nvim => hmModules/apps/neovim}/init.vim | 3 +- hmModules/apps/obs/default.nix | 17 ++++ hmModules/apps/rofi/default.nix | 14 +++ hmModules/apps/shells/default.nix | 9 ++ hmModules/apps/shells/fish/default.nix | 45 +++++++++ .../shells}/fish/functions/fish_prompt.fish | 0 .../fish/functions/fish_right_prompt.fish | 0 .../fish/functions/git_branch_name.fish | 0 .../shells}/fish/functions/git_is_dirty.fish | 0 .../shells}/fish/functions/git_is_repo.fish | 0 .../shells}/fish/functions/git_is_staged.fish | 0 .../fish/functions/git_is_touched.fish | 0 .../fish/functions/git_is_worktree.fish | 0 .../apps/shells}/fish/functions/n.fish | 0 .../apps/shells}/fish/functions/ssh.fish | 0 hmModules/apps/shells/xonsh/default.nix | 22 +++++ .../apps/shells}/xonsh/rc.xsh | 0 hmModules/apps/shells/zsh/default.nix | 47 ++++++++++ .../terminal-emulators/alacritty/default.nix | 39 ++++++++ hmModules/apps/terminal-emulators/default.nix | 8 ++ .../apps/terminal-emulators/kitty/default.nix | 20 ++++ hmModules/default.nix | 8 ++ hmModules/services/default.nix | 14 +++ hmModules/services/dunst/default.nix | 49 ++++++++++ hmModules/services/home/default.nix | 38 ++++++++ hmModules/services/manpages/default.nix | 15 +++ hmModules/services/ssh/default.nix | 14 +++ hmModules/services/timers/default.nix | 60 ++++++++++++ .../services}/timers/scripts/chimes.ogg | Bin .../services}/timers/scripts/notify-time.sh | 0 hmModules/services/trash/default.nix | 13 +++ hmModules/services/wal/default.nix | 34 +++++++ .../services/widgets}/ags/config/config.js | 0 .../widgets}/ags/config/modules/clock.js | 0 .../notifications/notificationPopup.ts | 0 .../config/modules/notifications/style.css | 0 .../ags/config/modules/workspace-switch.js | 0 hmModules/services/widgets/ags/default.nix | 25 +++++ hmModules/services/widgets/default.nix | 8 ++ .../services/widgets}/eww/config/eww.scss | 0 .../services/widgets}/eww/config/eww.yuck | 0 .../widgets}/eww/config/modules/bar.yuck | 0 .../config/modules/components/hyprwindow.yuck | 0 .../modules/components/hyprworkspaces.yuck | 0 .../config/modules/components/internet.yuck | 0 .../modules/components/japaneseaudio.yuck | 0 .../modules/components/japanesebattery.yuck | 0 .../modules/components/japanesedate.yuck | 0 .../widgets}/eww/config/modules/powerbar.yuck | 0 .../widgets}/eww/config/modules/switch.yuck | 0 .../config/scripts/change-active-workspace | 0 .../eww/config/scripts/get-active-workspace | 0 .../eww/config/scripts/get-window-title | 0 .../eww/config/scripts/get-workspaces | 0 .../widgets}/eww/config/scripts/japanesedate | 0 .../widgets}/eww/config/scripts/medpreview | 0 .../widgets}/eww/config/variables.yuck | 0 hmModules/services/widgets/eww/default.nix | 13 +++ home.nix | 77 ---------------- programs/ags/default.nix | 23 ----- programs/alacritty/default.nix | 32 ------- programs/discord/default.nix | 6 -- programs/dunst/default.nix | 41 --------- programs/eww/default.nix | 7 -- programs/fish/default.nix | 43 --------- programs/git/default.nix | 12 --- programs/hypr/default.nix | 43 --------- programs/kitty/default.nix | 12 --- programs/lf/default.nix | 85 ----------------- programs/lutris/default.nix | 16 ---- programs/mpv/default.nix | 14 --- programs/nnn/default.nix | 14 --- programs/nvim/default.nix | 74 --------------- programs/obs/default.nix | 11 --- programs/rofi/default.nix | 6 -- programs/spotify/default.nix | 18 ---- programs/ssh/default.nix | 8 -- programs/wal/default.nix | 28 ------ programs/xdg/default.nix | 18 ---- programs/xonsh/default.nix | 17 ---- programs/zsh/default.nix | 31 ------- services/scripts/default.nix | 10 -- services/scripts/select.nix | 15 --- services/timers/default.nix | 52 ----------- systems/pan/default.nix | 54 +++++++++++ 114 files changed, 1018 insertions(+), 744 deletions(-) create mode 100644 hmModules/apps/chat/beeper/default.nix create mode 100644 hmModules/apps/chat/default.nix create mode 100644 hmModules/apps/chat/discord/default.nix create mode 100644 hmModules/apps/default.nix create mode 100644 hmModules/apps/file-browsers/default.nix create mode 100644 hmModules/apps/file-browsers/lf/default.nix rename {programs => hmModules/apps/file-browsers}/lf/icons (100%) create mode 100644 hmModules/apps/file-browsers/nnn/default.nix create mode 100644 hmModules/apps/gimp/default.nix create mode 100644 hmModules/apps/git/default.nix create mode 100644 hmModules/apps/hypr/default.nix rename {programs => hmModules/apps}/hypr/keybinds.conf (100%) rename {programs => hmModules/apps}/hypr/league_rules.conf (100%) rename {programs => hmModules/apps}/hypr/nvidia.conf (100%) rename {programs => hmModules/apps}/hypr/scripts/changeprimary.xsh (100%) rename {programs => hmModules/apps}/hypr/scripts/changesecondary.xsh (100%) rename {programs => hmModules/apps}/hypr/scripts/initdb.xsh (100%) rename {programs => hmModules/apps}/hypr/settings.conf (100%) rename {programs => hmModules/apps}/hypr/window_rules.conf (100%) rename {programs => hmModules/apps}/hypr/xwaylandvideobridge.conf (100%) create mode 100644 hmModules/apps/librewolf/default.nix create mode 100644 hmModules/apps/lutris/default.nix create mode 100644 hmModules/apps/media-viewers/default.nix create mode 100644 hmModules/apps/media-viewers/feh/default.nix create mode 100644 hmModules/apps/media-viewers/mpv/default.nix create mode 100644 hmModules/apps/media-viewers/zathura/default.nix create mode 100644 hmModules/apps/neovim/default.nix rename {programs/nvim => hmModules/apps/neovim}/init.vim (93%) create mode 100644 hmModules/apps/obs/default.nix create mode 100644 hmModules/apps/rofi/default.nix create mode 100644 hmModules/apps/shells/default.nix create mode 100644 hmModules/apps/shells/fish/default.nix rename {programs => hmModules/apps/shells}/fish/functions/fish_prompt.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/fish_right_prompt.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/git_branch_name.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/git_is_dirty.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/git_is_repo.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/git_is_staged.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/git_is_touched.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/git_is_worktree.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/n.fish (100%) rename {programs => hmModules/apps/shells}/fish/functions/ssh.fish (100%) create mode 100644 hmModules/apps/shells/xonsh/default.nix rename {programs => hmModules/apps/shells}/xonsh/rc.xsh (100%) create mode 100644 hmModules/apps/shells/zsh/default.nix create mode 100644 hmModules/apps/terminal-emulators/alacritty/default.nix create mode 100644 hmModules/apps/terminal-emulators/default.nix create mode 100644 hmModules/apps/terminal-emulators/kitty/default.nix create mode 100644 hmModules/default.nix create mode 100644 hmModules/services/default.nix create mode 100644 hmModules/services/dunst/default.nix create mode 100644 hmModules/services/home/default.nix create mode 100644 hmModules/services/manpages/default.nix create mode 100644 hmModules/services/ssh/default.nix create mode 100644 hmModules/services/timers/default.nix rename {services => hmModules/services}/timers/scripts/chimes.ogg (100%) rename {services => hmModules/services}/timers/scripts/notify-time.sh (100%) create mode 100644 hmModules/services/trash/default.nix create mode 100644 hmModules/services/wal/default.nix rename {programs => hmModules/services/widgets}/ags/config/config.js (100%) rename {programs => hmModules/services/widgets}/ags/config/modules/clock.js (100%) rename {programs => hmModules/services/widgets}/ags/config/modules/notifications/notificationPopup.ts (100%) rename {programs => hmModules/services/widgets}/ags/config/modules/notifications/style.css (100%) rename {programs => hmModules/services/widgets}/ags/config/modules/workspace-switch.js (100%) create mode 100644 hmModules/services/widgets/ags/default.nix create mode 100644 hmModules/services/widgets/default.nix rename {programs => hmModules/services/widgets}/eww/config/eww.scss (100%) rename {programs => hmModules/services/widgets}/eww/config/eww.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/bar.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/components/hyprwindow.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/components/hyprworkspaces.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/components/internet.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/components/japaneseaudio.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/components/japanesebattery.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/components/japanesedate.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/powerbar.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/modules/switch.yuck (100%) rename {programs => hmModules/services/widgets}/eww/config/scripts/change-active-workspace (100%) rename {programs => hmModules/services/widgets}/eww/config/scripts/get-active-workspace (100%) rename {programs => hmModules/services/widgets}/eww/config/scripts/get-window-title (100%) rename {programs => hmModules/services/widgets}/eww/config/scripts/get-workspaces (100%) rename {programs => hmModules/services/widgets}/eww/config/scripts/japanesedate (100%) rename {programs => hmModules/services/widgets}/eww/config/scripts/medpreview (100%) rename {programs => hmModules/services/widgets}/eww/config/variables.yuck (100%) create mode 100644 hmModules/services/widgets/eww/default.nix delete mode 100644 home.nix delete mode 100644 programs/ags/default.nix delete mode 100644 programs/alacritty/default.nix delete mode 100644 programs/discord/default.nix delete mode 100644 programs/dunst/default.nix delete mode 100644 programs/eww/default.nix delete mode 100644 programs/fish/default.nix delete mode 100644 programs/git/default.nix delete mode 100644 programs/hypr/default.nix delete mode 100644 programs/kitty/default.nix delete mode 100644 programs/lf/default.nix delete mode 100644 programs/lutris/default.nix delete mode 100644 programs/mpv/default.nix delete mode 100644 programs/nnn/default.nix delete mode 100644 programs/nvim/default.nix delete mode 100644 programs/obs/default.nix delete mode 100644 programs/rofi/default.nix delete mode 100644 programs/spotify/default.nix delete mode 100644 programs/ssh/default.nix delete mode 100644 programs/wal/default.nix delete mode 100644 programs/xdg/default.nix delete mode 100644 programs/xonsh/default.nix delete mode 100644 programs/zsh/default.nix delete mode 100644 services/scripts/default.nix delete mode 100644 services/scripts/select.nix delete mode 100644 services/timers/default.nix create mode 100644 systems/pan/default.nix diff --git a/flake.lock b/flake.lock index 7c3d189..3a7bcc5 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1712250145, - "narHash": "sha256-8WTGn7It2kZfAmN97Epi3g/Su/w3Hbw/T4dWxE7OrBw=", + "lastModified": 1712834339, + "narHash": "sha256-gRYAbyxx4Z2s4hMoXHSu3wv2+VSiiR2Nk+AZmCZ6kc4=", "owner": "Aylur", "repo": "ags", - "rev": "d589077199ec8a055ef936bf8a1f051b7a0c7e34", + "rev": "c13bcba224f9ecaaa2f22b1d2895bb62e8face19", "type": "github" }, "original": { @@ -27,11 +27,11 @@ ] }, "locked": { - "lastModified": 1712462372, - "narHash": "sha256-WA3bbBWhd3o1wAgyHZNypjb/LG4oq+IWxFq8ey8yNPU=", + "lastModified": 1713077896, + "narHash": "sha256-Noot8H0EZEAFRQWyGxh9ryvhK96xpIqKbh78X447JWs=", "owner": "nix-community", "repo": "home-manager", - "rev": "a561ad6ab38578c812cc9af3b04f2cc60ebf48c9", + "rev": "630a0992b3627c64e34f179fab68e3d48c6991c0", "type": "github" }, "original": { @@ -82,11 +82,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1712528342, - "narHash": "sha256-5tRzlHnhk28M2ClRshRAEANGE/GF9A1Cl36OXAmi+Ig=", + "lastModified": 1713050186, + "narHash": "sha256-AKdzVa0Zz5PQ1ptQgD0jj8J+UZUW9OeKGZ0mNVnkyI4=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "43b96f03b5af60586a864ea64e8c71b11ea6eb85", + "rev": "0634aaeac6cca12e4f72174c431c2db9da9c0072", "type": "github" }, "original": { @@ -167,11 +167,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1712439257, - "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", + "lastModified": 1712791164, + "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ff0dbd94265ac470dda06a657d5fe49de93b4599", + "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", "type": "github" }, "original": { @@ -207,20 +207,18 @@ "wlroots": { "flake": false, "locked": { - "host": "gitlab.freedesktop.org", - "lastModified": 1709983277, - "narHash": "sha256-wXWIJLd4F2JZeMaihWVDW/yYXCLEC8OpeNJZg9a9ly8=", - "owner": "wlroots", - "repo": "wlroots", - "rev": "50eae512d9cecbf0b3b1898bb1f0b40fa05fe19b", - "type": "gitlab" + "lastModified": 1712935342, + "narHash": "sha256-zzIbTFNFd/as42jyGx23fil2uBDYYv+8GA5JmRq5y9c=", + "owner": "hyprwm", + "repo": "wlroots-hyprland", + "rev": "62eeffbe233d199f520a5755c344e85f8eab7940", + "type": "github" }, "original": { - "host": "gitlab.freedesktop.org", - "owner": "wlroots", - "repo": "wlroots", - "rev": "50eae512d9cecbf0b3b1898bb1f0b40fa05fe19b", - "type": "gitlab" + "owner": "hyprwm", + "repo": "wlroots-hyprland", + "rev": "62eeffbe233d199f520a5755c344e85f8eab7940", + "type": "github" } }, "xdph": { diff --git a/flake.nix b/flake.nix index d3ec4c7..af16e17 100644 --- a/flake.nix +++ b/flake.nix @@ -17,17 +17,18 @@ ags.inputs.nixpkgs.follows = "nixpkgs"; }; - outputs = { nixpkgs, home-manager, hyprland, ... }@inputs: let + outputs = { nixpkgs, home-manager, ... }@inputs: + let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; - in { - homeConfigurations."pan" = home-manager.lib.homeManagerConfiguration { + defaultConfig = extraModules: home-manager.lib.homeManagerConfiguration { inherit pkgs; extraSpecialArgs = { inherit inputs; }; modules = [ - hyprland.homeManagerModules.default - ./home.nix - ]; + ./hmModules + ] ++ extraModules; }; + in { + homeConfigurations.pan = defaultConfig [ ./systems/pan ]; }; } diff --git a/hmModules/apps/chat/beeper/default.nix b/hmModules/apps/chat/beeper/default.nix new file mode 100644 index 0000000..9f43a70 --- /dev/null +++ b/hmModules/apps/chat/beeper/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options.beeper = { + enable = lib.mkEnableOption "Enables beeper"; + }; + + config = lib.mkIf config.beeper.enable { + home.packages = with pkgs; [ + beeper + ]; + }; +} diff --git a/hmModules/apps/chat/default.nix b/hmModules/apps/chat/default.nix new file mode 100644 index 0000000..84ad4e5 --- /dev/null +++ b/hmModules/apps/chat/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./discord + ./beeper + ]; +} diff --git a/hmModules/apps/chat/discord/default.nix b/hmModules/apps/chat/discord/default.nix new file mode 100644 index 0000000..474b6ac --- /dev/null +++ b/hmModules/apps/chat/discord/default.nix @@ -0,0 +1,12 @@ +{ config, pkgs, lib, ... }: +{ + options.discord = { + enable = lib.mkEnableOption "Enables discord"; + }; + + config = lib.mkIf config.discord.enable { + home.packages = with pkgs; [ + vesktop # Base app + ]; + }; +} diff --git a/hmModules/apps/default.nix b/hmModules/apps/default.nix new file mode 100644 index 0000000..4d496dc --- /dev/null +++ b/hmModules/apps/default.nix @@ -0,0 +1,18 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./chat + ./file-browsers + ./gimp + ./git + ./hypr + ./lutris + ./media-viewers + ./neovim + ./obs + ./rofi + ./shells + ./terminal-emulators + ]; +} diff --git a/hmModules/apps/file-browsers/default.nix b/hmModules/apps/file-browsers/default.nix new file mode 100644 index 0000000..118e357 --- /dev/null +++ b/hmModules/apps/file-browsers/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./lf + ./nnn + ]; +} diff --git a/hmModules/apps/file-browsers/lf/default.nix b/hmModules/apps/file-browsers/lf/default.nix new file mode 100644 index 0000000..c37b608 --- /dev/null +++ b/hmModules/apps/file-browsers/lf/default.nix @@ -0,0 +1,82 @@ +{ config, pkgs, lib, ... }: + +{ + options.lf = { + enable = lib.mkEnableOption "Enables lf"; + hiddenfiles = lib.mkOption { default = [ ".*" ]; }; + leader = lib.mkOption { default = ""; }; + }; + + config = lib.mkIf config.lf.enable { + xdg.configFile."lf/icons".source = ./icons; + + programs.lf = { + enable = true; + settings = { + # Hide specific files rather than "hidden" files + hiddenfiles = config.lf.hiddenfiles; + ratios = [ + 2 + 3 + ]; + preview = true; + ignorecase = true; + icons = true; + number = true; + relativenumber = true; + }; + commands = { + dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"''; + mkdir = '' + ''${{ + printf "Directory Name: " + read DIR + mkdir $DIR + }} + ''; + mkfile = '' + ''${{ + printf "File Name: " + read FILE + mkdir $FILE + }} + ''; + }; + keybindings = let + leader = config.lf.leader; + in { + "${leader}" = ""; + "v" = ":toggle; down"; + "." = "set hidden!"; + "${leader}d" = "mkdir"; + "${leader}f" = "mkfile"; + "${leader}m" = "dragon-out"; + }; + extraConfig = + let + previewer = + pkgs.writeShellScriptBin "pv.sh" '' + file=$1 + w=$2 + h=$3 + x=$4 + y=$5 + + if [[ "$( ${pkgs.file}/bin/file -Lb --mime-type "$file")" =~ ^image ]]; then + ${pkgs.kitty}/bin/kitty +kitten icat --silent --stdin no --transfer-mode file --place "''${w}x''${h}@''${x}x''${y}" "$file" < /dev/null > /dev/tty + exit 1 + fi + + ${pkgs.pistol}/bin/pistol "$file" + ''; + cleaner = pkgs.writeShellScriptBin "clean.sh" '' + ${pkgs.kitty}/bin/kitty +kitten icat --clear --stdin no --silent --transfer-mode file < /dev/null > /dev/tty + ''; + in + '' + set cleaner ${cleaner}/bin/clean.sh + set previewer ${previewer}/bin/pv.sh + ''; + }; + }; +} diff --git a/programs/lf/icons b/hmModules/apps/file-browsers/lf/icons similarity index 100% rename from programs/lf/icons rename to hmModules/apps/file-browsers/lf/icons diff --git a/hmModules/apps/file-browsers/nnn/default.nix b/hmModules/apps/file-browsers/nnn/default.nix new file mode 100644 index 0000000..f68cec2 --- /dev/null +++ b/hmModules/apps/file-browsers/nnn/default.nix @@ -0,0 +1,17 @@ +{ config, pkgs, lib, ... }: + +{ + options.nnn = { + enable = lib.mkEnableOption "Enables nnn"; + }; + + config = lib.mkIf config.nnn.enable { + programs.nnn.enable = true; + home.sessionVariables = { + NNN_FCOLORS = "0000E6310000000000000000"; + NNN_OPTS = "eH"; + NNN_FIFO = "/tmp/nnn.fifo"; + NNN_TRASH = lib.mkIf config.trash.enable "1"; + }; + }; +} diff --git a/hmModules/apps/gimp/default.nix b/hmModules/apps/gimp/default.nix new file mode 100644 index 0000000..0998e28 --- /dev/null +++ b/hmModules/apps/gimp/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options.gimp = { + enable = lib.mkEnableOption "Enables gimp"; + }; + + config = lib.mkIf config.gimp.enable { + home.packages = with pkgs; [ + gimp + ]; + }; +} diff --git a/hmModules/apps/git/default.nix b/hmModules/apps/git/default.nix new file mode 100644 index 0000000..0a87ff0 --- /dev/null +++ b/hmModules/apps/git/default.nix @@ -0,0 +1,19 @@ +{ config, pkgs, lib, ... }: + +{ + options.git = { + enable = lib.mkEnableOption "Enables git"; + username = lib.mkOption { default = config.home.username; }; + email = lib.mkOption { + default = "git@" + config.home.username + ".com"; + }; + }; + + config = lib.mkIf config.git.enable { + programs.git = { + enable = true; + userName = config.git.username; + userEmail = config.git.email; + }; + }; +} diff --git a/hmModules/apps/hypr/default.nix b/hmModules/apps/hypr/default.nix new file mode 100644 index 0000000..0c83ffd --- /dev/null +++ b/hmModules/apps/hypr/default.nix @@ -0,0 +1,50 @@ +{ config, inputs, pkgs, lib, ... }: +let rootPath = ./.; in +{ + options.hypr = { + enable = lib.mkEnableOption "Enables hyprland"; + }; + + imports = [ inputs.hyprland.homeManagerModules.default ]; + + config = lib.mkIf config.hypr.enable { + wayland.windowManager.hyprland = { + enable = true; + extraConfig = '' + ${builtins.readFile ./window_rules.conf} + ${builtins.readFile ./league_rules.conf} + ${builtins.readFile ./settings.conf} + ${builtins.readFile ./nvidia.conf} + ${builtins.readFile ./keybinds.conf} + ${builtins.readFile ./xwaylandvideobridge.conf} + exec-once=${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1 + + env = HYPRCURSOR_THEME,miku + env = HYPRCURSOR_SIZE,64 + ''; + }; + home.packages = with pkgs; [ + socat # For hyprland scripts + swww # Wallpaper engine + wlr-randr # Xrandr for wayland + wl-clipboard # Clipboard manager for wayland + xdg-desktop-portal-hyprland # XDP for hyprland + hyprpicker # Colorpicker, needed for screenshot tool + hyprcursor # Hyprland cursor + inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool + polkit-kde-agent # Polkit handler + ]; + # Hyprland screenshot tool + xdg.configFile."hypr-scripts" = { + source = rootPath + "/scripts"; + target = "hypr/scripts"; + executable = true; + }; + + xdg.dataFile."hypr-icons" = { + source = rootPath + "/icons"; + target = "icons/"; + recursive = true; + }; + }; +} diff --git a/programs/hypr/keybinds.conf b/hmModules/apps/hypr/keybinds.conf similarity index 100% rename from programs/hypr/keybinds.conf rename to hmModules/apps/hypr/keybinds.conf diff --git a/programs/hypr/league_rules.conf b/hmModules/apps/hypr/league_rules.conf similarity index 100% rename from programs/hypr/league_rules.conf rename to hmModules/apps/hypr/league_rules.conf diff --git a/programs/hypr/nvidia.conf b/hmModules/apps/hypr/nvidia.conf similarity index 100% rename from programs/hypr/nvidia.conf rename to hmModules/apps/hypr/nvidia.conf diff --git a/programs/hypr/scripts/changeprimary.xsh b/hmModules/apps/hypr/scripts/changeprimary.xsh similarity index 100% rename from programs/hypr/scripts/changeprimary.xsh rename to hmModules/apps/hypr/scripts/changeprimary.xsh diff --git a/programs/hypr/scripts/changesecondary.xsh b/hmModules/apps/hypr/scripts/changesecondary.xsh similarity index 100% rename from programs/hypr/scripts/changesecondary.xsh rename to hmModules/apps/hypr/scripts/changesecondary.xsh diff --git a/programs/hypr/scripts/initdb.xsh b/hmModules/apps/hypr/scripts/initdb.xsh similarity index 100% rename from programs/hypr/scripts/initdb.xsh rename to hmModules/apps/hypr/scripts/initdb.xsh diff --git a/programs/hypr/settings.conf b/hmModules/apps/hypr/settings.conf similarity index 100% rename from programs/hypr/settings.conf rename to hmModules/apps/hypr/settings.conf diff --git a/programs/hypr/window_rules.conf b/hmModules/apps/hypr/window_rules.conf similarity index 100% rename from programs/hypr/window_rules.conf rename to hmModules/apps/hypr/window_rules.conf diff --git a/programs/hypr/xwaylandvideobridge.conf b/hmModules/apps/hypr/xwaylandvideobridge.conf similarity index 100% rename from programs/hypr/xwaylandvideobridge.conf rename to hmModules/apps/hypr/xwaylandvideobridge.conf diff --git a/hmModules/apps/librewolf/default.nix b/hmModules/apps/librewolf/default.nix new file mode 100644 index 0000000..7995cbb --- /dev/null +++ b/hmModules/apps/librewolf/default.nix @@ -0,0 +1,16 @@ +{ config, pkgs, lib, ... }: + +{ + options.librewolf = { + enable = lib.mkEnableOption "Enables librewolf"; + }; + + config = lib.mkIf config.librewolf.enable { + home.packages = with pkgs; [ + librewolf + ]; + home.sessionVariables = { + BROWSER = "librewolf"; + }; + }; +} diff --git a/hmModules/apps/lutris/default.nix b/hmModules/apps/lutris/default.nix new file mode 100644 index 0000000..aa78d39 --- /dev/null +++ b/hmModules/apps/lutris/default.nix @@ -0,0 +1,22 @@ +{ config, pkgs, lib, ... }: + +{ + options.lutris = { + enable = lib.mkEnableOption "Enables lutris"; + }; + + config = lib.mkIf config.lutris.enable { + home.packages = with pkgs; [ + lutris + wineWowPackages.stable + # (lutris.override { + # extraLibraries = pkgs: [ + # # List library dependencies here + # ]; + # extraPkgs = pkgs: [ + # # List package dependencies here + # ]; + # }) + ]; + }; +} diff --git a/hmModules/apps/media-viewers/default.nix b/hmModules/apps/media-viewers/default.nix new file mode 100644 index 0000000..5b26119 --- /dev/null +++ b/hmModules/apps/media-viewers/default.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./feh + ./mpv + ./zathura + ]; +} diff --git a/hmModules/apps/media-viewers/feh/default.nix b/hmModules/apps/media-viewers/feh/default.nix new file mode 100644 index 0000000..c1c4462 --- /dev/null +++ b/hmModules/apps/media-viewers/feh/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options.feh = { + enable = lib.mkEnableOption "Enables feh"; + }; + + config = lib.mkIf config.feh.enable { + programs.feh = { + enable = true; + }; + }; +} diff --git a/hmModules/apps/media-viewers/mpv/default.nix b/hmModules/apps/media-viewers/mpv/default.nix new file mode 100644 index 0000000..e64e5ce --- /dev/null +++ b/hmModules/apps/media-viewers/mpv/default.nix @@ -0,0 +1,22 @@ +{ config, pkgs, lib, ... }: + +{ + options.mpv = { + enable = lib.mkEnableOption "Enables mpv"; + }; + + config = lib.mkIf config.mpv.enable { + home.packages = with pkgs; [ + yt-dlp + ]; + programs.mpv = { + enable = true; + config = { + volume-max = 150; + force-window = "yes"; + script-opts = "ytdl_hook-ytdl_path=yt-dlp"; + ytdl-format = "bestvideo[height<=?1080][vcodec!=vp9]+bestaudio/best"; + }; + }; + }; +} diff --git a/hmModules/apps/media-viewers/zathura/default.nix b/hmModules/apps/media-viewers/zathura/default.nix new file mode 100644 index 0000000..005c2b6 --- /dev/null +++ b/hmModules/apps/media-viewers/zathura/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options.zathura = { + enable = lib.mkEnableOption "Enables zathura"; + }; + + config = lib.mkIf config.zathura.enable { + programs.zathura = { + enable = true; + }; + }; +} diff --git a/hmModules/apps/neovim/default.nix b/hmModules/apps/neovim/default.nix new file mode 100644 index 0000000..e8a805e --- /dev/null +++ b/hmModules/apps/neovim/default.nix @@ -0,0 +1,86 @@ +{ config, pkgs, lib, ... }: + +{ + options.neovim = { + enable = lib.mkEnableOption "Enables neovim"; + }; + + config = lib.mkIf config.neovim.enable { + home.sessionVariables = { + EDITOR = "nvim"; + VISUAL = "nvim"; + }; + programs.neovim = { + enable = true; + extraConfig = '' + ${builtins.readFile ./init.vim} + ''; + plugins = with pkgs.vimPlugins; [ + { # Personal Wiki + plugin = vimwiki; + config = '' + let g:vimwiki_list = [{'path': '~/dox/wiki', 'links_space_char': '_', + \ 'ext': '.md', 'syntax': 'markdown'}] + ''; + } + { # NNN in vim + plugin = nnn-vim; + config = '' + let g:nnn#layout = { 'window': { + \ 'width': 0.35, + \ 'height': 0.5, + \ 'xoffset': 1.0, + \ 'highlight': 'Debug' } } " hover window + let g:nnn#action = { + \ '': 'tab split', + \ '': 'split', + \ '': 'vsplit' } + let g:nnn#command = 'nnn -HoeT v' + let g:nnn#replace_netrw = 1 + ''; + } + { # Fuzzy searches + plugin = fzf-vim; + config = '' + map :Files + map :Ag + ''; + } + { # Auto completions + plugin = coc-nvim; + config = '' + function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' + endfunction + + inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() + inoremap pumvisible() ? "\" : "\" + ''; + } + vim-commentary # multi-line comments + vim-fugitive # Git Plugin + vimtex # Latex support + tagbar # File tagging + + # === LOOK AND FEEL === + { # Status Bar + plugin = vim-airline; + config = '' + let g:airline#extensions#tagbar#flags = 'fs' + ''; + } + { # Rainbow Parenthesis + plugin = rainbow; + config = '' + let g:rainbow_actve = 1 + ''; + } + vim-polyglot # Syntax Highlighting + ]; + }; + }; +} diff --git a/programs/nvim/init.vim b/hmModules/apps/neovim/init.vim similarity index 93% rename from programs/nvim/init.vim rename to hmModules/apps/neovim/init.vim index a40649a..d8b95c9 100644 --- a/programs/nvim/init.vim +++ b/hmModules/apps/neovim/init.vim @@ -14,7 +14,8 @@ nnoremap nnoremap " Indentation -set tabstop=2 softtabstop=0 shiftwidth=2 smarttab expandtab +" set tabstop=2 softtabstop=0 shiftwidth=2 smarttab expandtab +set tabstop=8 softtabstop=0 shiftwidth=8 " Searching set smartcase diff --git a/hmModules/apps/obs/default.nix b/hmModules/apps/obs/default.nix new file mode 100644 index 0000000..a42a495 --- /dev/null +++ b/hmModules/apps/obs/default.nix @@ -0,0 +1,17 @@ +{ config, pkgs, lib, ... }: +{ + options.obs = { + enable = lib.mkEnableOption "Enables obs"; + }; + + config = lib.mkIf config.obs.enable { + programs.obs-studio = { + enable = true; + plugins = with pkgs.obs-studio-plugins; [ + wlrobs + obs-backgroundremoval + obs-pipewire-audio-capture + ]; + }; + }; +} diff --git a/hmModules/apps/rofi/default.nix b/hmModules/apps/rofi/default.nix new file mode 100644 index 0000000..c98e81f --- /dev/null +++ b/hmModules/apps/rofi/default.nix @@ -0,0 +1,14 @@ +{ config, pkgs, lib, ... }: + +{ + options.rofi = { + enable = lib.mkEnableOption "Enables rofi"; + }; + + config = lib.mkIf config.rofi.enable { + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + }; + }; +} diff --git a/hmModules/apps/shells/default.nix b/hmModules/apps/shells/default.nix new file mode 100644 index 0000000..03ae484 --- /dev/null +++ b/hmModules/apps/shells/default.nix @@ -0,0 +1,9 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./fish + ./xonsh + ./zsh + ]; +} diff --git a/hmModules/apps/shells/fish/default.nix b/hmModules/apps/shells/fish/default.nix new file mode 100644 index 0000000..46e6de1 --- /dev/null +++ b/hmModules/apps/shells/fish/default.nix @@ -0,0 +1,45 @@ +{ config, pkgs, lib, ... }: + +{ + options.fish = { + enable = lib.mkEnableOption "Enables fish"; + }; + + config = lib.mkIf config.fish.enable { + programs.fish.enable = true; + + programs.fish.functions = { + fish_greeting = ""; + fish_prompt = '' + ${builtins.readFile ./functions/fish_prompt.fish} + ''; + fish_right_prompt = '' + ${builtins.readFile ./functions/fish_right_prompt.fish} + ''; + git_branch_name = '' + ${builtins.readFile ./functions/git_branch_name.fish} + ''; + git_is_dirty = '' + ${builtins.readFile ./functions/git_is_dirty.fish} + ''; + git_is_repo = '' + ${builtins.readFile ./functions/git_is_repo.fish} + ''; + git_is_staged = '' + ${builtins.readFile ./functions/git_is_staged.fish} + ''; + git_is_touched = '' + ${builtins.readFile ./functions/git_is_touched.fish} + ''; + git_is_worktree = '' + ${builtins.readFile ./functions/git_is_worktree.fish} + ''; + ssh = '' + ${builtins.readFile ./functions/ssh.fish} + ''; + n = lib.mkIf config.nnn.enable '' + ${builtins.readFile ./functions/n.fish} + ''; + }; + }; +} diff --git a/programs/fish/functions/fish_prompt.fish b/hmModules/apps/shells/fish/functions/fish_prompt.fish similarity index 100% rename from programs/fish/functions/fish_prompt.fish rename to hmModules/apps/shells/fish/functions/fish_prompt.fish diff --git a/programs/fish/functions/fish_right_prompt.fish b/hmModules/apps/shells/fish/functions/fish_right_prompt.fish similarity index 100% rename from programs/fish/functions/fish_right_prompt.fish rename to hmModules/apps/shells/fish/functions/fish_right_prompt.fish diff --git a/programs/fish/functions/git_branch_name.fish b/hmModules/apps/shells/fish/functions/git_branch_name.fish similarity index 100% rename from programs/fish/functions/git_branch_name.fish rename to hmModules/apps/shells/fish/functions/git_branch_name.fish diff --git a/programs/fish/functions/git_is_dirty.fish b/hmModules/apps/shells/fish/functions/git_is_dirty.fish similarity index 100% rename from programs/fish/functions/git_is_dirty.fish rename to hmModules/apps/shells/fish/functions/git_is_dirty.fish diff --git a/programs/fish/functions/git_is_repo.fish b/hmModules/apps/shells/fish/functions/git_is_repo.fish similarity index 100% rename from programs/fish/functions/git_is_repo.fish rename to hmModules/apps/shells/fish/functions/git_is_repo.fish diff --git a/programs/fish/functions/git_is_staged.fish b/hmModules/apps/shells/fish/functions/git_is_staged.fish similarity index 100% rename from programs/fish/functions/git_is_staged.fish rename to hmModules/apps/shells/fish/functions/git_is_staged.fish diff --git a/programs/fish/functions/git_is_touched.fish b/hmModules/apps/shells/fish/functions/git_is_touched.fish similarity index 100% rename from programs/fish/functions/git_is_touched.fish rename to hmModules/apps/shells/fish/functions/git_is_touched.fish diff --git a/programs/fish/functions/git_is_worktree.fish b/hmModules/apps/shells/fish/functions/git_is_worktree.fish similarity index 100% rename from programs/fish/functions/git_is_worktree.fish rename to hmModules/apps/shells/fish/functions/git_is_worktree.fish diff --git a/programs/fish/functions/n.fish b/hmModules/apps/shells/fish/functions/n.fish similarity index 100% rename from programs/fish/functions/n.fish rename to hmModules/apps/shells/fish/functions/n.fish diff --git a/programs/fish/functions/ssh.fish b/hmModules/apps/shells/fish/functions/ssh.fish similarity index 100% rename from programs/fish/functions/ssh.fish rename to hmModules/apps/shells/fish/functions/ssh.fish diff --git a/hmModules/apps/shells/xonsh/default.nix b/hmModules/apps/shells/xonsh/default.nix new file mode 100644 index 0000000..34a7a70 --- /dev/null +++ b/hmModules/apps/shells/xonsh/default.nix @@ -0,0 +1,22 @@ +{ config, pkgs, lib, ... }: +let rootPath = ./.; in +{ + options.xonsh = { + enable = lib.mkEnableOption "Enables xonsh"; + }; + + config = lib.mkIf config.xonsh.enable { + home.packages = with pkgs; [ + xonsh + ]; + home.sessionVariables = { + PROMPT = "τ "; + RIGHT_PROMPT = "{YELLOW}{gitstatus: {} }{BLUE}{short_cwd}{DEFAULT}"; + VI_MODE = 1; + }; + xdg.configFile."xonshrc" = { + source = rootPath + "/rc.xsh"; + target = "xonsh/rc.xsh"; + }; + }; +} diff --git a/programs/xonsh/rc.xsh b/hmModules/apps/shells/xonsh/rc.xsh similarity index 100% rename from programs/xonsh/rc.xsh rename to hmModules/apps/shells/xonsh/rc.xsh diff --git a/hmModules/apps/shells/zsh/default.nix b/hmModules/apps/shells/zsh/default.nix new file mode 100644 index 0000000..713a527 --- /dev/null +++ b/hmModules/apps/shells/zsh/default.nix @@ -0,0 +1,47 @@ +{ config, pkgs, lib, ... }: + +{ + options.zsh = { + enable = lib.mkEnableOption "Enable zsh"; + }; + + config = lib.mkIf config.zsh.enable { + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + dotDir = ".config/zsh"; + + history.save = 10000; + history.size = 10000; + history.path = "${config.xdg.dataHome}/zsh/history"; + initExtra = let + lf = lib.optionalString config.lf.enable '' + # Lf change directory command + lfcd () { + cd "$(command lf -print-last-dir "$@")" + } + bindkey -s '^o' 'lfcd\n' + ''; + + in lf + '' + # Nix-shell + ${pkgs.nix-your-shell}/bin/nix-your-shell zsh | source /dev/stdin + + # Prompt + autoload -U colors && colors + autoload -Uz vcs_info + precmd_vcs_info() { vcs_info } + precmd_functions+=( precmd_vcs_info ) + setopt prompt_subst + zstyle ':vcs_info:*' check-for-changes true + zstyle ':vcs_info:*' unstagedstr '·*' + zstyle ':vcs_info:*' stagedstr '·+' + zstyle ':vcs_info:git:*' formats '%b%u%c' + export PROMPT="%(0?.%F{white}.%? %F{red})τ%f " + export RPROMPT="%F{yellow}\$vcs_info_msg_0_%f %F{blue}%~%f" + ''; + }; + }; +} diff --git a/hmModules/apps/terminal-emulators/alacritty/default.nix b/hmModules/apps/terminal-emulators/alacritty/default.nix new file mode 100644 index 0000000..c172d63 --- /dev/null +++ b/hmModules/apps/terminal-emulators/alacritty/default.nix @@ -0,0 +1,39 @@ +{ config, pkgs, lib, ... }: + +{ + options.alacritty = { + enable = lib.mkEnableOption "Enables alacritty"; + font = lib.mkOption { default = ""; }; + font_size = lib.mkOption { default = 18; }; + }; + + config = lib.mkIf config.alacritty.enable { + programs.alacritty.enable = true; + + programs.alacritty.settings = { + font = let fam = config.alacritty.font; in { + normal = { + family = fam; + style = "Regular"; + }; + bold = { + family = fam; + style = "Bold"; + }; + italic = { + family = fam; + style = "Italic"; + }; + bold_italic = { + family = fam; + style = "Bold Italic"; + }; + offset = { + x = 0; + y = 0; + }; + size = config.alacritty.font_size; + }; + }; + }; +} diff --git a/hmModules/apps/terminal-emulators/default.nix b/hmModules/apps/terminal-emulators/default.nix new file mode 100644 index 0000000..ceb550b --- /dev/null +++ b/hmModules/apps/terminal-emulators/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./kitty + ./alacritty + ]; +} diff --git a/hmModules/apps/terminal-emulators/kitty/default.nix b/hmModules/apps/terminal-emulators/kitty/default.nix new file mode 100644 index 0000000..6195726 --- /dev/null +++ b/hmModules/apps/terminal-emulators/kitty/default.nix @@ -0,0 +1,20 @@ +{ config, pkgs, lib, ... }: + +{ + options.kitty = { + enable = lib.mkEnableOption "Enables kitty"; + font = lib.mkOption { default = ""; }; + font_size = lib.mkOption { default = 18; }; + }; + + config = lib.mkIf config.kitty.enable { + programs.kitty = { + enable = true; + settings = { + font_family = config.kitty.font; + font_size = config.kitty.font_size; + enable_audio_bell = "no"; + }; + }; + }; +} diff --git a/hmModules/default.nix b/hmModules/default.nix new file mode 100644 index 0000000..3401811 --- /dev/null +++ b/hmModules/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./apps + ./services + ]; +} diff --git a/hmModules/services/default.nix b/hmModules/services/default.nix new file mode 100644 index 0000000..75bc088 --- /dev/null +++ b/hmModules/services/default.nix @@ -0,0 +1,14 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./dunst + ./home + ./manpages + ./ssh + ./timers + ./trash + ./wal + ./widgets + ]; +} diff --git a/hmModules/services/dunst/default.nix b/hmModules/services/dunst/default.nix new file mode 100644 index 0000000..84e4bcb --- /dev/null +++ b/hmModules/services/dunst/default.nix @@ -0,0 +1,49 @@ +{ config, pkgs, lib, ... }: + +{ + options.dunst = { + enable = lib.mkEnableOption "Enables dunst"; + }; + + config = lib.mkIf config.dunst.enable { + home.packages = with pkgs; [ + libnotify + ]; + services.dunst = { + enable = true; + settings = { + global = { + width = 280; + height = 240; + origin = "bottom-right"; + offset = "0x300"; + + notification_limit = 3; + + progress_bar_max_width = 280; + + gap_size = 4; + corner_radius = 20; + }; + + urgency_low = { + background = "#FFFFFFCC"; + foreground = "#000000"; + frame_color = "#0000"; + }; + + urgency_normal = { + background = "#FFFFFFCC"; + foreground = "#000000"; + frame_color = "#0000"; + }; + + urgency_critical = { + background = "#FFFFFFCC"; + foreground = "#000000"; + frame_color = "#0000"; + }; + }; + }; + }; +} diff --git a/hmModules/services/home/default.nix b/hmModules/services/home/default.nix new file mode 100644 index 0000000..bbb4cf2 --- /dev/null +++ b/hmModules/services/home/default.nix @@ -0,0 +1,38 @@ +{ config, pkgs, lib, ... }: + +{ + options = { + extraPkgs = lib.mkOption { default = []; }; + }; + + config = { + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; + + home.sessionVariables = { + GRADLE_USER_HOME = "${config.xdg.dataHome}/gradle"; + CUDA_CACHE_PATH = "${config.xdg.cacheHome}/nv"; + }; + + xdg = { + enable = true; + mimeApps.enable = true; + userDirs = let + home = config.home.homeDirectory; + in { + enable = true; + documents = "${home}/dox"; + publicShare = "${home}/dox/public"; + templates = "${home}/dox/templates"; + music = "${home}/med/mus"; + pictures = "${home}/med/pix"; + videos = "${home}/med/vid"; + desktop = "${home}/dwn"; + download = "${home}/dwn"; + }; + }; + + home.homeDirectory = "/home/" + config.home.username; + home.packages = config.extraPkgs; + }; +} diff --git a/hmModules/services/manpages/default.nix b/hmModules/services/manpages/default.nix new file mode 100644 index 0000000..678d734 --- /dev/null +++ b/hmModules/services/manpages/default.nix @@ -0,0 +1,15 @@ +{ config, pkgs, lib, ... }: + +{ + options.manpages = { + enable = lib.mkEnableOption "Enables manpager"; + }; + + config = lib.mkIf config.manpages.enable { + programs.man.enable = true; + home.packages = with pkgs; [ + man-pages + man-pages-posix + ]; + }; +} diff --git a/hmModules/services/ssh/default.nix b/hmModules/services/ssh/default.nix new file mode 100644 index 0000000..418ae9c --- /dev/null +++ b/hmModules/services/ssh/default.nix @@ -0,0 +1,14 @@ +{ config, pkgs, lib, ... }: + +{ + options.ssh = { + enable = lib.mkEnableOption "Enables ssh"; + }; + + config = lib.mkIf config.ssh.enable { + programs.ssh.enable = true; + home.packages = with pkgs; [ + sshfs # SSH File system + ]; + }; +} diff --git a/hmModules/services/timers/default.nix b/hmModules/services/timers/default.nix new file mode 100644 index 0000000..548ab30 --- /dev/null +++ b/hmModules/services/timers/default.nix @@ -0,0 +1,60 @@ +{ config, pkgs, lib, ... }: +let rootPath = ./.; in +{ + options.timer = { + enableHourly = lib.mkEnableOption "Enables an hourly notification"; + enableQuarterly = lib.mkEnableOption "Enables a quarterly notification"; + }; + + config = { + systemd.user.timers = { + hourly-time = lib.mkIf config.timer.enableHourly { + Timer = { + OnCalendar = "hourly"; + }; + Install = { + WantedBy = [ + "timers.target" + ]; + }; + }; + quarterly-time = lib.mkIf config.timer.enableQuarterly { + Timer = { + OnCalendar = "*-*-* *:15,30,45:00"; + }; + Install = { + WantedBy = [ + "timers.target" + ]; + }; + }; + }; + + systemd.user.services = { + hourly-time = lib.mkIf config.timer.enableHourly { + Unit = { + Description = "Notify the user every hour of time passing"; + }; + Service = { + Type="simple"; + ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 60000 1"; + }; + }; + quarterly-time = lib.mkIf config.timer.enableQuarterly { + Unit = { + Description = "Notify the user every 15 minutes of time passing, \ + skips hours"; + }; + Service = { + Type="simple"; + ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 10000 0"; + }; + }; + }; + xdg.configFile."timer-scripts" = { + source = rootPath + "/scripts"; + target = "timer_scripts/"; + executable = true; + }; + }; +} diff --git a/services/timers/scripts/chimes.ogg b/hmModules/services/timers/scripts/chimes.ogg similarity index 100% rename from services/timers/scripts/chimes.ogg rename to hmModules/services/timers/scripts/chimes.ogg diff --git a/services/timers/scripts/notify-time.sh b/hmModules/services/timers/scripts/notify-time.sh similarity index 100% rename from services/timers/scripts/notify-time.sh rename to hmModules/services/timers/scripts/notify-time.sh diff --git a/hmModules/services/trash/default.nix b/hmModules/services/trash/default.nix new file mode 100644 index 0000000..cf54f67 --- /dev/null +++ b/hmModules/services/trash/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options.trash = { + enable = lib.mkEnableOption "Enables trash"; + }; + + config = { + home.packages = [ + pkgs.trash-cli + ]; + }; +} diff --git a/hmModules/services/wal/default.nix b/hmModules/services/wal/default.nix new file mode 100644 index 0000000..41930fe --- /dev/null +++ b/hmModules/services/wal/default.nix @@ -0,0 +1,34 @@ +{ config, pkgs, lib, ... }: +let rootPath = ./.; in +{ + options.colors = { + enable = lib.mkEnableOption "Enables setting colors using wallust"; + }; + + config = lib.mkIf config.colors.enable { + home.packages = with pkgs; [ + wallust # A better pywal + pywalfox-native # Update librewolf's colorscheme based on wal + ]; + xdg.configFile."wallust-config" = { + target = "wallust/wallust.toml"; + text = '' + backend = "wal" + color_space = "lab" + threshold = 20 + filter = "dark16" + + # [[entry]] + # # a relative path to a file where wallust.toml is (~/.config/wallust/) + # template = "dunstrc" + # + # # absolute path to the file to write the template (after templating) + # target = "~/.config/dunst/dunstrc" + ''; + }; + #xdg.configFile."wallust-templates" = { + # source = rootPath + "/templates"; + # target = "wallust/"; + #}; + }; +} diff --git a/programs/ags/config/config.js b/hmModules/services/widgets/ags/config/config.js similarity index 100% rename from programs/ags/config/config.js rename to hmModules/services/widgets/ags/config/config.js diff --git a/programs/ags/config/modules/clock.js b/hmModules/services/widgets/ags/config/modules/clock.js similarity index 100% rename from programs/ags/config/modules/clock.js rename to hmModules/services/widgets/ags/config/modules/clock.js diff --git a/programs/ags/config/modules/notifications/notificationPopup.ts b/hmModules/services/widgets/ags/config/modules/notifications/notificationPopup.ts similarity index 100% rename from programs/ags/config/modules/notifications/notificationPopup.ts rename to hmModules/services/widgets/ags/config/modules/notifications/notificationPopup.ts diff --git a/programs/ags/config/modules/notifications/style.css b/hmModules/services/widgets/ags/config/modules/notifications/style.css similarity index 100% rename from programs/ags/config/modules/notifications/style.css rename to hmModules/services/widgets/ags/config/modules/notifications/style.css diff --git a/programs/ags/config/modules/workspace-switch.js b/hmModules/services/widgets/ags/config/modules/workspace-switch.js similarity index 100% rename from programs/ags/config/modules/workspace-switch.js rename to hmModules/services/widgets/ags/config/modules/workspace-switch.js diff --git a/hmModules/services/widgets/ags/default.nix b/hmModules/services/widgets/ags/default.nix new file mode 100644 index 0000000..5d248d1 --- /dev/null +++ b/hmModules/services/widgets/ags/default.nix @@ -0,0 +1,25 @@ +{ config, inputs, pkgs, lib, ... }: +{ + + options.ags = { + enable = lib.mkEnableOption "Enable ags"; + }; + + imports = [ inputs.ags.homeManagerModules.default ]; + + config = lib.mkIf config.ags.enable { + home.packages = with pkgs; [ + libnotify # Notifications through ags + ]; + programs.ags = { + enable = true; + configDir = ./config; + + extraPackages = with pkgs; [ + gtksourceview + webkitgtk + accountsservice + ]; + }; + }; +} diff --git a/hmModules/services/widgets/default.nix b/hmModules/services/widgets/default.nix new file mode 100644 index 0000000..caebead --- /dev/null +++ b/hmModules/services/widgets/default.nix @@ -0,0 +1,8 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./ags + ./eww + ]; +} diff --git a/programs/eww/config/eww.scss b/hmModules/services/widgets/eww/config/eww.scss similarity index 100% rename from programs/eww/config/eww.scss rename to hmModules/services/widgets/eww/config/eww.scss diff --git a/programs/eww/config/eww.yuck b/hmModules/services/widgets/eww/config/eww.yuck similarity index 100% rename from programs/eww/config/eww.yuck rename to hmModules/services/widgets/eww/config/eww.yuck diff --git a/programs/eww/config/modules/bar.yuck b/hmModules/services/widgets/eww/config/modules/bar.yuck similarity index 100% rename from programs/eww/config/modules/bar.yuck rename to hmModules/services/widgets/eww/config/modules/bar.yuck diff --git a/programs/eww/config/modules/components/hyprwindow.yuck b/hmModules/services/widgets/eww/config/modules/components/hyprwindow.yuck similarity index 100% rename from programs/eww/config/modules/components/hyprwindow.yuck rename to hmModules/services/widgets/eww/config/modules/components/hyprwindow.yuck diff --git a/programs/eww/config/modules/components/hyprworkspaces.yuck b/hmModules/services/widgets/eww/config/modules/components/hyprworkspaces.yuck similarity index 100% rename from programs/eww/config/modules/components/hyprworkspaces.yuck rename to hmModules/services/widgets/eww/config/modules/components/hyprworkspaces.yuck diff --git a/programs/eww/config/modules/components/internet.yuck b/hmModules/services/widgets/eww/config/modules/components/internet.yuck similarity index 100% rename from programs/eww/config/modules/components/internet.yuck rename to hmModules/services/widgets/eww/config/modules/components/internet.yuck diff --git a/programs/eww/config/modules/components/japaneseaudio.yuck b/hmModules/services/widgets/eww/config/modules/components/japaneseaudio.yuck similarity index 100% rename from programs/eww/config/modules/components/japaneseaudio.yuck rename to hmModules/services/widgets/eww/config/modules/components/japaneseaudio.yuck diff --git a/programs/eww/config/modules/components/japanesebattery.yuck b/hmModules/services/widgets/eww/config/modules/components/japanesebattery.yuck similarity index 100% rename from programs/eww/config/modules/components/japanesebattery.yuck rename to hmModules/services/widgets/eww/config/modules/components/japanesebattery.yuck diff --git a/programs/eww/config/modules/components/japanesedate.yuck b/hmModules/services/widgets/eww/config/modules/components/japanesedate.yuck similarity index 100% rename from programs/eww/config/modules/components/japanesedate.yuck rename to hmModules/services/widgets/eww/config/modules/components/japanesedate.yuck diff --git a/programs/eww/config/modules/powerbar.yuck b/hmModules/services/widgets/eww/config/modules/powerbar.yuck similarity index 100% rename from programs/eww/config/modules/powerbar.yuck rename to hmModules/services/widgets/eww/config/modules/powerbar.yuck diff --git a/programs/eww/config/modules/switch.yuck b/hmModules/services/widgets/eww/config/modules/switch.yuck similarity index 100% rename from programs/eww/config/modules/switch.yuck rename to hmModules/services/widgets/eww/config/modules/switch.yuck diff --git a/programs/eww/config/scripts/change-active-workspace b/hmModules/services/widgets/eww/config/scripts/change-active-workspace similarity index 100% rename from programs/eww/config/scripts/change-active-workspace rename to hmModules/services/widgets/eww/config/scripts/change-active-workspace diff --git a/programs/eww/config/scripts/get-active-workspace b/hmModules/services/widgets/eww/config/scripts/get-active-workspace similarity index 100% rename from programs/eww/config/scripts/get-active-workspace rename to hmModules/services/widgets/eww/config/scripts/get-active-workspace diff --git a/programs/eww/config/scripts/get-window-title b/hmModules/services/widgets/eww/config/scripts/get-window-title similarity index 100% rename from programs/eww/config/scripts/get-window-title rename to hmModules/services/widgets/eww/config/scripts/get-window-title diff --git a/programs/eww/config/scripts/get-workspaces b/hmModules/services/widgets/eww/config/scripts/get-workspaces similarity index 100% rename from programs/eww/config/scripts/get-workspaces rename to hmModules/services/widgets/eww/config/scripts/get-workspaces diff --git a/programs/eww/config/scripts/japanesedate b/hmModules/services/widgets/eww/config/scripts/japanesedate similarity index 100% rename from programs/eww/config/scripts/japanesedate rename to hmModules/services/widgets/eww/config/scripts/japanesedate diff --git a/programs/eww/config/scripts/medpreview b/hmModules/services/widgets/eww/config/scripts/medpreview similarity index 100% rename from programs/eww/config/scripts/medpreview rename to hmModules/services/widgets/eww/config/scripts/medpreview diff --git a/programs/eww/config/variables.yuck b/hmModules/services/widgets/eww/config/variables.yuck similarity index 100% rename from programs/eww/config/variables.yuck rename to hmModules/services/widgets/eww/config/variables.yuck diff --git a/hmModules/services/widgets/eww/default.nix b/hmModules/services/widgets/eww/default.nix new file mode 100644 index 0000000..7417cdf --- /dev/null +++ b/hmModules/services/widgets/eww/default.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options.eww = { + enable = lib.mkEnableOption "Enables eww"; + }; + + config = lib.mkIf config.eww.enable { + programs.eww.enable = true; + programs.eww.package = pkgs.eww-wayland; + programs.eww.configDir = ./config; + }; +} diff --git a/home.nix b/home.nix deleted file mode 100644 index 34a4693..0000000 --- a/home.nix +++ /dev/null @@ -1,77 +0,0 @@ -{ config, pkgs, ... }: - -{ - nixpkgs.config.allowUnfree = true; - home.username = "pan"; - home.homeDirectory = "/home/pan"; - - imports = [ - # ./programs/dunst - # ./programs/eww - # ./programs/spotify - ./programs/ags - ./programs/alacritty - ./programs/discord - ./programs/fish - ./programs/git - ./programs/hypr - ./programs/lutris - ./programs/mpv - ./programs/nnn - ./programs/nvim - ./programs/rofi - ./programs/ssh - ./programs/wal - ./programs/xdg - ./programs/xonsh - ./programs/obs - ./programs/kitty - ./programs/zsh - ./programs/lf - - # ./services/scripts - ./services/timers - ]; - - home.packages = with pkgs; [ - # Applications - beeper # Better Chat App - gimp # Photo editting - pamixer # Volume control - playerctl # Control media - wget # Download web stuff - feh # Image viewer - appimage-run # Lets you run app images - zathura # PDF viewer - ani-cli # Easy anime player - lutgen # LUT generator - prismlauncher # Minecraft launcher - unzip # Unzip utility - - texlive.combined.scheme-full # Latex - - # Development stuff - nodejs # For compiling JS stuff - jq # May be critical for scripts? - ]; - # home.file = {}; - - home.sessionVariables = { - EDITOR = "nvim"; - VISUAL = "nvim"; - BROWSER = "librewolf"; - GRADLE_USER_HOME = "/home/pan/.local/share" + "/gradle"; - CUDA_CACHE_PATH = "/home/pan/.cache" + "/nv"; - }; - - home.sessionPath = [ - "$HOME/prog/scripts" - ]; - - # Enable man pages, but ensure ~/.manpage isn't created - programs.man.enable = true; - programs.man.generateCaches = false; - # Let Home Manager install and manage itself. - programs.home-manager.enable = true; - home.stateVersion = "23.05"; -} diff --git a/programs/ags/default.nix b/programs/ags/default.nix deleted file mode 100644 index 74eae58..0000000 --- a/programs/ags/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ inputs, pkgs, ... }: -{ - # add the home manager module - imports = [ inputs.ags.homeManagerModules.default ]; - - home.packages = with pkgs; [ - libnotify # Notifications through ags - ]; - - programs.ags = { - enable = true; - - # null or path, leave as null if you don't want hm to manage the config - configDir = ./config; - - # additional packages to add to ags's runtime - extraPackages = with pkgs; [ - gtksourceview - webkitgtk - accountsservice - ]; - }; -} diff --git a/programs/alacritty/default.nix b/programs/alacritty/default.nix deleted file mode 100644 index d3a0378..0000000 --- a/programs/alacritty/default.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.alacritty.enable = true; - - - programs.alacritty.settings = { - font = let fam = "Cascadia Code"; in { - normal = { - family = fam; - style = "Regular"; - }; - bold = { - family = fam; - style = "Bold"; - }; - italic = { - family = fam; - style = "Italic"; - }; - bold_italic = { - family = fam; - style = "Bold Italic"; - }; - offset = { - x = 0; - y = 0; - }; - size = 18.0; - }; - }; -} diff --git a/programs/discord/default.nix b/programs/discord/default.nix deleted file mode 100644 index 8344f47..0000000 --- a/programs/discord/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ config, pkgs, ... }: -{ - home.packages = with pkgs; [ - vesktop # Base app - ]; -} diff --git a/programs/dunst/default.nix b/programs/dunst/default.nix deleted file mode 100644 index 3f1e60e..0000000 --- a/programs/dunst/default.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ config, pkgs, ... }: - -{ - home.packages = with pkgs; [ - libnotify - ]; - services.dunst.enable = true; - services.dunst.settings = { - global = { - width = 280; - height = 240; - origin = "bottom-right"; - offset = "0x300"; - - notification_limit = 3; - - progress_bar_max_width = 280; - - gap_size = 4; - corner_radius = 20; - }; - - urgency_low = { - background = "#FFFFFFCC"; - foreground = "#000000"; - frame_color = "#0000"; - }; - - urgency_normal = { - background = "#FFFFFFCC"; - foreground = "#000000"; - frame_color = "#0000"; - }; - - urgency_critical = { - background = "#FFFFFFCC"; - foreground = "#000000"; - frame_color = "#0000"; - }; - }; -} diff --git a/programs/eww/default.nix b/programs/eww/default.nix deleted file mode 100644 index 135aed8..0000000 --- a/programs/eww/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.eww.enable = true; - programs.eww.package = pkgs.eww-wayland; - programs.eww.configDir = ./config; -} diff --git a/programs/fish/default.nix b/programs/fish/default.nix deleted file mode 100644 index 93c6018..0000000 --- a/programs/fish/default.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.fish.enable = true; - - programs.fish.interactiveShellInit = '' - cat ~/.cache/wal/sequences - ''; - - programs.fish.functions = { - fish_greeting = ""; - fish_prompt = '' - ${builtins.readFile ./functions/fish_prompt.fish} - ''; - fish_right_prompt = '' - ${builtins.readFile ./functions/fish_right_prompt.fish} - ''; - git_branch_name = '' - ${builtins.readFile ./functions/git_branch_name.fish} - ''; - git_is_dirty = '' - ${builtins.readFile ./functions/git_is_dirty.fish} - ''; - git_is_repo = '' - ${builtins.readFile ./functions/git_is_repo.fish} - ''; - git_is_staged = '' - ${builtins.readFile ./functions/git_is_staged.fish} - ''; - git_is_touched = '' - ${builtins.readFile ./functions/git_is_touched.fish} - ''; - git_is_worktree = '' - ${builtins.readFile ./functions/git_is_worktree.fish} - ''; - n = '' - ${builtins.readFile ./functions/n.fish} - ''; - ssh = '' - ${builtins.readFile ./functions/ssh.fish} - ''; - }; -} diff --git a/programs/git/default.nix b/programs/git/default.nix deleted file mode 100644 index 9f134ee..0000000 --- a/programs/git/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.git.enable = true; - programs.git.userName = "JuliaLange"; - programs.git.userEmail = "git@julialange.com"; - programs.git.extraConfig = { - safe = { - directory = "/etc/nixos"; - }; - }; -} diff --git a/programs/hypr/default.nix b/programs/hypr/default.nix deleted file mode 100644 index f390790..0000000 --- a/programs/hypr/default.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ inputs, pkgs, ... }: -let rootPath = ./.; in -{ - wayland.windowManager.hyprland.enable = true; - wayland.windowManager.hyprland.extraConfig = '' - ${builtins.readFile ./window_rules.conf} - ${builtins.readFile ./league_rules.conf} - ${builtins.readFile ./settings.conf} - ${builtins.readFile ./nvidia.conf} - ${builtins.readFile ./keybinds.conf} - ${builtins.readFile ./xwaylandvideobridge.conf} - exec-once=${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1 - - env = HYPRCURSOR_THEME,miku - env = HYPRCURSOR_SIZE,64 - ''; - # wayland.windowManager.hyprland.enableNvidiaPatches = true; - home.packages = with pkgs; [ - socat # For hyprland scripts - swww # Wallpaper engine - wlr-randr # Xrandr for wayland - wl-clipboard # Clipboard manager for wayland - xdg-desktop-portal-hyprland # XDP for hyprland - hyprpicker # Colorpicker, needed for screenshot tool - hyprcursor # Hyprland cursor - inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool - xwaylandvideobridge # Allows screensharing with xwayland apps - polkit-kde-agent # Polkit handler - ]; - - # Hyprland screenshot tool - xdg.configFile."hypr-scripts" = { - source = rootPath + "/scripts"; - target = "hypr/scripts"; - executable = true; - }; - - xdg.dataFile."hypr-icons" = { - source = rootPath + "/icons"; - target = "icons/"; - recursive = true; - }; -} diff --git a/programs/kitty/default.nix b/programs/kitty/default.nix deleted file mode 100644 index 2bff14d..0000000 --- a/programs/kitty/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.kitty = { - enable = true; - settings = { - font_family = "Cascadia Code"; - font_size = 18; - enable_audio_bell = "no"; - }; - }; -} diff --git a/programs/lf/default.nix b/programs/lf/default.nix deleted file mode 100644 index 1eb8c30..0000000 --- a/programs/lf/default.nix +++ /dev/null @@ -1,85 +0,0 @@ -{ config, pkgs, ... }: - -{ - xdg.configFile."lf/icons".source = ./icons; - - home.packages = with pkgs; [ - trash-cli # Trash program for lf - ]; - - programs.lf = { - enable = true; - settings = { - # Hide specific files rather than "hidden" files - hiddenfiles = [ - "${config.home.homeDirectory}/.librewolf" - "${config.home.homeDirectory}/.nix-defexpr" - "${config.home.homeDirectory}/.nix-profile" - "${config.home.homeDirectory}/.nv" - "${config.home.homeDirectory}/.pki" - "${config.home.homeDirectory}/.steam*" - "${config.home.homeDirectory}/.zshenv" - ]; - ratios = [ - 2 - 3 - ]; - preview = true; - ignorecase = true; - icons = true; - number = true; - relativenumber = true; - }; - commands = { - dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"''; - mkdir = '' - ''${{ - printf "Directory Name: " - read DIR - mkdir $DIR - }} - ''; - mkfile = '' - ''${{ - printf "File Name: " - read FILE - mkdir $FILE - }} - ''; - trash = ''trash "$fx"''; - }; - keybindings = { - ";" = ""; - x = "trash"; - "." = "set hidden!"; - ";d" = "mkdir"; - ";f" = "mkfile"; - ";m" = "dragon-out"; - }; - extraConfig = - let - previewer = - pkgs.writeShellScriptBin "pv.sh" '' - file=$1 - w=$2 - h=$3 - x=$4 - y=$5 - - if [[ "$( ${pkgs.file}/bin/file -Lb --mime-type "$file")" =~ ^image ]]; then - ${pkgs.kitty}/bin/kitty +kitten icat --silent --stdin no --transfer-mode file --place "''${w}x''${h}@''${x}x''${y}" "$file" < /dev/null > /dev/tty - exit 1 - fi - - ${pkgs.pistol}/bin/pistol "$file" - ''; - cleaner = pkgs.writeShellScriptBin "clean.sh" '' - ${pkgs.kitty}/bin/kitty +kitten icat --clear --stdin no --silent --transfer-mode file < /dev/null > /dev/tty - ''; - in - '' - set cleaner ${cleaner}/bin/clean.sh - set previewer ${previewer}/bin/pv.sh - ''; - }; -} diff --git a/programs/lutris/default.nix b/programs/lutris/default.nix deleted file mode 100644 index 05993cd..0000000 --- a/programs/lutris/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ config, pkgs, ... }: - -{ - home.packages = with pkgs; [ - lutris - wineWowPackages.stable - # (lutris.override { - # extraLibraries = pkgs: [ - # # List library dependencies here - # ]; - # extraPkgs = pkgs: [ - # # List package dependencies here - # ]; - # }) - ]; -} diff --git a/programs/mpv/default.nix b/programs/mpv/default.nix deleted file mode 100644 index bc41ad5..0000000 --- a/programs/mpv/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.mpv.enable = true; - programs.mpv.config = { - volume-max = 150; - force-window = "yes"; - script-opts = "ytdl_hook-ytdl_path=yt-dlp"; - ytdl-format = "bestvideo[height<=?1080][vcodec!=vp9]+bestaudio/best"; - }; - home.packages = with pkgs; [ - yt-dlp - ]; -} diff --git a/programs/nnn/default.nix b/programs/nnn/default.nix deleted file mode 100644 index 583a7b2..0000000 --- a/programs/nnn/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.nnn.enable = true; - home.sessionVariables = { - NNN_FCOLORS = "0000E6310000000000000000"; - NNN_OPTS = "eH"; - NNN_FIFO = "/tmp/nnn.fifo"; - NNN_TRASH = "1"; - }; - home.packages = with pkgs; [ - trash-cli # Trash program for nnn - ]; -} diff --git a/programs/nvim/default.nix b/programs/nvim/default.nix deleted file mode 100644 index bd19ffd..0000000 --- a/programs/nvim/default.nix +++ /dev/null @@ -1,74 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.neovim.enable = true; - programs.neovim.extraConfig = '' - ${builtins.readFile ./init.vim} - ''; - programs.neovim.plugins = with pkgs.vimPlugins; [ - { # Personal Wiki - plugin = vimwiki; - config = '' - let g:vimwiki_list = [{'path': '~/dox/wiki', 'links_space_char': '_', - \ 'ext': '.md', 'syntax': 'markdown'}] - ''; - } - { # NNN in vim - plugin = nnn-vim; - config = '' - let g:nnn#layout = { 'window': { - \ 'width': 0.35, - \ 'height': 0.5, - \ 'xoffset': 1.0, - \ 'highlight': 'Debug' } } " hover window - let g:nnn#action = { - \ '': 'tab split', - \ '': 'split', - \ '': 'vsplit' } - let g:nnn#command = 'nnn -HoeT v' - let g:nnn#replace_netrw = 1 - ''; - } - { # Fuzzy searches - plugin = fzf-vim; - config = '' - map :Files - map :Ag - ''; - } - { # Auto completions - plugin = coc-nvim; - config = '' - function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' - endfunction - - inoremap - \ pumvisible() ? "\" : - \ check_back_space() ? "\" : - \ coc#refresh() - inoremap pumvisible() ? "\" : "\" - ''; - } - vim-commentary # multi-line comments - vim-fugitive # Git Plugin - vimtex # Latex support - tagbar # File tagging - - # === LOOK AND FEEL === - { # Status Bar - plugin = vim-airline; - config = '' - let g:airline#extensions#tagbar#flags = 'fs' - ''; - } - { # Rainbow Parenthesis - plugin = rainbow; - config = '' - let g:rainbow_actve = 1 - ''; - } - vim-polyglot # Syntax Highlighting - ]; -} diff --git a/programs/obs/default.nix b/programs/obs/default.nix deleted file mode 100644 index edd2865..0000000 --- a/programs/obs/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, pkgs, ... }: -{ - programs.obs-studio = { - enable = true; - plugins = with pkgs.obs-studio-plugins; [ - wlrobs - obs-backgroundremoval - obs-pipewire-audio-capture - ]; - }; -} diff --git a/programs/rofi/default.nix b/programs/rofi/default.nix deleted file mode 100644 index 1db30ee..0000000 --- a/programs/rofi/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.rofi.enable = true; - programs.rofi.package = pkgs.rofi-wayland; -} diff --git a/programs/spotify/default.nix b/programs/spotify/default.nix deleted file mode 100644 index 7510db3..0000000 --- a/programs/spotify/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, pkgs, ... }: - -{ - services.spotifyd.enable = true; - services.spotifyd.settings = { - global = { - username = "me@daltonlange.com"; - password = "5ThM^G3!FTfH6rH#cJEx"; - backend = "pulseaudio"; - device_name = "onizuka"; - bitrate = 320; - }; - }; - - home.packages = with pkgs; [ - spotify-tui # Spotify TUI player - ]; -} diff --git a/programs/ssh/default.nix b/programs/ssh/default.nix deleted file mode 100644 index 4e0f26f..0000000 --- a/programs/ssh/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, pkgs, ... }: - -{ - programs.ssh.enable = true; - home.packages = with pkgs; [ - sshfs # SSH File system - ]; -} diff --git a/programs/wal/default.nix b/programs/wal/default.nix deleted file mode 100644 index 5d63ae9..0000000 --- a/programs/wal/default.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ config, pkgs, ... }: -let rootPath = ./.; in -{ - home.packages = with pkgs; [ - wallust # A better pywal - pywalfox-native # Update librewolf's colorscheme based on wal - ]; - xdg.configFile."wallust-config" = { - target = "wallust/wallust.toml"; - text = '' - backend = "wal" - color_space = "lab" - threshold = 20 - filter = "dark16" - - # [[entry]] - # # a relative path to a file where wallust.toml is (~/.config/wallust/) - # template = "dunstrc" - # - # # absolute path to the file to write the template (after templating) - # target = "~/.config/dunst/dunstrc" - ''; - }; - #xdg.configFile."wallust-templates" = { - # source = rootPath + "/templates"; - # target = "wallust/"; - #}; -} diff --git a/programs/xdg/default.nix b/programs/xdg/default.nix deleted file mode 100644 index 81a7a84..0000000 --- a/programs/xdg/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, pkgs, ... }: - -{ - xdg.enable = true; - xdg.userDirs.enable = true; - xdg.userDirs = { - desktop = "${config.home.homeDirectory}/dwn"; - download = "${config.home.homeDirectory}/dwn"; - documents = "${config.home.homeDirectory}/dox"; - publicShare = "${config.home.homeDirectory}/dox/public"; - templates = "${config.home.homeDirectory}/dox/templates"; - music = "${config.home.homeDirectory}/med/mus"; - pictures = "${config.home.homeDirectory}/med/pix"; - videos = "${config.home.homeDirectory}/med/vid"; - }; - - xdg.mimeApps.enable = true; -} diff --git a/programs/xonsh/default.nix b/programs/xonsh/default.nix deleted file mode 100644 index 9700e76..0000000 --- a/programs/xonsh/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ config, pkgs, ... }: -let rootPath = ./.; in -{ - home.packages = with pkgs; [ - xonsh - ]; - home.sessionVariables = { - PROMPT = "τ "; - RIGHT_PROMPT = "{YELLOW}{gitstatus: {} }{BLUE}{short_cwd}{DEFAULT}"; - VI_MODE = 1; - }; - xdg.configFile."xonshrc" = { - source = rootPath + "/rc.xsh"; - target = "xonsh/rc.xsh"; - }; - -} diff --git a/programs/zsh/default.nix b/programs/zsh/default.nix deleted file mode 100644 index 694b981..0000000 --- a/programs/zsh/default.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ config, pkgs, ... }: -{ - programs.zsh = { - enable = true; - enableCompletion = true; - autosuggestion.enable = true; - syntaxHighlighting.enable = true; - dotDir = ".config/zsh"; - - history.save = 10000; - history.size = 10000; - history.path = "${config.xdg.dataHome}/zsh/history"; - initExtra = '' - # Nix-shell - ${pkgs.nix-your-shell}/bin/nix-your-shell zsh | source /dev/stdin - - # Prompt - autoload -U colors && colors - autoload -Uz vcs_info - precmd_vcs_info() { vcs_info } - precmd_functions+=( precmd_vcs_info ) - setopt prompt_subst - zstyle ':vcs_info:*' check-for-changes true - zstyle ':vcs_info:*' unstagedstr '·*' - zstyle ':vcs_info:*' stagedstr '·+' - zstyle ':vcs_info:git:*' formats '%b%u%c' - export PROMPT="%(0?.%F{white}.%? %F{red})τ%f " - export RPROMPT="%F{yellow}\$vcs_info_msg_0_%f %F{blue}%~%f" - ''; - }; -} diff --git a/services/scripts/default.nix b/services/scripts/default.nix deleted file mode 100644 index aa31a14..0000000 --- a/services/scripts/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ config, pkgs, ... }: - -let - select = import ./select.nix { inherit pkgs; }; -in -{ - home.packages = [ - select - ]; -} diff --git a/services/scripts/select.nix b/services/scripts/select.nix deleted file mode 100644 index c9462ab..0000000 --- a/services/scripts/select.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ pkgs }: - -pkgs.writeShellApplication { - name = "select"; - - runtimeInputs = [ fzf rofi ]; - - text = '' - if [ ${PPID} -ne 1 ]; then - echo -e $1 | fzf - else - echo -e $1 | rofi -dmenu -p $2 - fi - ''; -} diff --git a/services/timers/default.nix b/services/timers/default.nix deleted file mode 100644 index 8eb16b7..0000000 --- a/services/timers/default.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ config, pkgs, ... }: -let rootPath = ./.; in -{ - systemd.user.timers = { - hourly-time = { - Timer = { - OnCalendar = "hourly"; - }; - Install = { - WantedBy = [ - "timers.target" - ]; - }; - }; - quarterly-time = { - Timer = { - OnCalendar = "*-*-* *:15,30,45:00"; - }; - Install = { - WantedBy = [ - "timers.target" - ]; - }; - }; - }; - systemd.user.services = { - hourly-time = { - Unit = { - Description = "Notify the user every hour of time passing"; - }; - Service = { - Type="simple"; - ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 60000 1"; - }; - }; - quarterly-time = { - Unit = { - Description = "Notify the user every 15 minutes of time passing, \ - skips hours"; - }; - Service = { - Type="simple"; - ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 10000 0"; - }; - }; - }; - xdg.configFile."timer-scripts" = { - source = rootPath + "/scripts"; - target = "timer_scripts/"; - executable = true; - }; -} diff --git a/systems/pan/default.nix b/systems/pan/default.nix new file mode 100644 index 0000000..8947e74 --- /dev/null +++ b/systems/pan/default.nix @@ -0,0 +1,54 @@ +{ config, pkgs, ... }: + +{ + home.username = "pan"; + nixpkgs.config.allowUnfree = true; + home.stateVersion = "23.05"; + + hypr.enable = true; + ags.enable = true; + rofi.enable = true; + + timer.enableHourly = true; + timer.enableQuarterly = true; + colors.enable = true; + manpages.enable = true; + + zsh.enable = true; + kitty.enable = true; + kitty.font = "Cascadia Code"; + git.enable = true; + git.username = "Julia Lange"; + git.email = "public@julialange.org"; + ssh.enable = true; + + mpv.enable = true; + zathura.enable = true; + feh.enable = true; + + neovim.enable = true; + lf.enable = true; + lf.hiddenfiles = [ + "${config.home.homeDirectory}/.librewolf" + "${config.home.homeDirectory}/.nix-defexpr" + "${config.home.homeDirectory}/.nix-profile" + "${config.home.homeDirectory}/.nv" + "${config.home.homeDirectory}/.pki" + "${config.home.homeDirectory}/.steam*" + "${config.home.homeDirectory}/.zshenv" + ]; + + gimp.enable = true; + + beeper.enable = true; + discord.enable = true; + + lutris.enable = true; + + extraPkgs = with pkgs; [ + # Applications + ani-cli # Easy anime player + lutgen # LUT generator + prismlauncher # Minecraft launcher + ]; +} From 0352e8e4d33f4ef7f96b19c49b97d0f78bf36024 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Tue, 16 Apr 2024 04:36:26 -0700 Subject: [PATCH 36/61] Neovim, refactor to use modules, lua, and LSP Refactors the neovim config to use nix modules, and changes the plugins to favor the builtin neovim LSP over COC. Changes all code to use lua code instead of vimscript. --- hmModules/apps/neovim/default.nix | 139 ++++++++++---------- hmModules/apps/neovim/init.vim | 68 ---------- hmModules/apps/neovim/options.lua | 57 ++++++++ hmModules/apps/neovim/plugin/lsp.nix | 49 +++++++ hmModules/apps/neovim/plugin/nvimcmp.nix | 72 ++++++++++ hmModules/apps/neovim/plugin/telescope.nix | 40 ++++++ hmModules/apps/neovim/plugin/treesitter.nix | 30 +++++ systems/pan/default.nix | 16 +++ 8 files changed, 337 insertions(+), 134 deletions(-) delete mode 100644 hmModules/apps/neovim/init.vim create mode 100644 hmModules/apps/neovim/options.lua create mode 100644 hmModules/apps/neovim/plugin/lsp.nix create mode 100644 hmModules/apps/neovim/plugin/nvimcmp.nix create mode 100644 hmModules/apps/neovim/plugin/telescope.nix create mode 100644 hmModules/apps/neovim/plugin/treesitter.nix diff --git a/hmModules/apps/neovim/default.nix b/hmModules/apps/neovim/default.nix index e8a805e..91b38c6 100644 --- a/hmModules/apps/neovim/default.nix +++ b/hmModules/apps/neovim/default.nix @@ -3,84 +3,91 @@ { options.neovim = { enable = lib.mkEnableOption "Enables neovim"; + languages = { + nix.enable = lib.mkEnableOption "Enables nix support"; + }; + plugins = { + comments.enable = lib.mkEnableOption "Enables nvim-comment"; + fugitive.enable = lib.mkEnableOption "Enables git-fugitive"; + lualine.enable = lib.mkEnableOption "Enables lualine"; + luasnip.enable = lib.mkEnableOption "Enables luasnip snippets"; + nvimcmp.enable = lib.mkEnableOption "Enables nvim completion"; + telescope = { + enable = lib.mkEnableOption "Enables telescope"; + fzf.enable = lib.mkEnableOption "Enables telescope-fzf"; + }; + treesitter.enable = lib.mkEnableOption "Enables treesitter"; + }; }; + imports = [ + ./plugin/lsp.nix + ./plugin/nvimcmp.nix + ./plugin/telescope.nix + ./plugin/treesitter.nix + ]; + config = lib.mkIf config.neovim.enable { home.sessionVariables = { EDITOR = "nvim"; VISUAL = "nvim"; }; + programs.neovim = { enable = true; - extraConfig = '' - ${builtins.readFile ./init.vim} + viAlias = true; + vimAlias = true; + vimdiffAlias = true; + + extraLuaConfig = '' + ${builtins.readFile ./options.lua} ''; - plugins = with pkgs.vimPlugins; [ - { # Personal Wiki - plugin = vimwiki; - config = '' - let g:vimwiki_list = [{'path': '~/dox/wiki', 'links_space_char': '_', - \ 'ext': '.md', 'syntax': 'markdown'}] - ''; - } - { # NNN in vim - plugin = nnn-vim; - config = '' - let g:nnn#layout = { 'window': { - \ 'width': 0.35, - \ 'height': 0.5, - \ 'xoffset': 1.0, - \ 'highlight': 'Debug' } } " hover window - let g:nnn#action = { - \ '': 'tab split', - \ '': 'split', - \ '': 'vsplit' } - let g:nnn#command = 'nnn -HoeT v' - let g:nnn#replace_netrw = 1 - ''; - } - { # Fuzzy searches - plugin = fzf-vim; - config = '' - map :Files - map :Ag - ''; - } - { # Auto completions - plugin = coc-nvim; - config = '' - function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' - endfunction - inoremap - \ pumvisible() ? "\" : - \ check_back_space() ? "\" : - \ coc#refresh() - inoremap pumvisible() ? "\" : "\" - ''; - } - vim-commentary # multi-line comments - vim-fugitive # Git Plugin - vimtex # Latex support - tagbar # File tagging - - # === LOOK AND FEEL === - { # Status Bar - plugin = vim-airline; - config = '' - let g:airline#extensions#tagbar#flags = 'fs' - ''; - } - { # Rainbow Parenthesis - plugin = rainbow; - config = '' - let g:rainbow_actve = 1 - ''; - } - vim-polyglot # Syntax Highlighting + extraPackages = with pkgs; [ + (lib.mkIf config.neovim.languages.nix.enable nil) ]; + + # Additional packages are added through imports + plugins = let + lopts = lib.lists.optionals; + cfgp = config.neovim.plugins; + cfgl = config.neovim.languages; + + comments = lopts cfgp.comments.enable (with pkgs.vimPlugins; [ + { + plugin = comment-nvim; + type = "lua"; + config = "require(\"Comment\").setup()"; + } + ]); + + fugitive = lopts cfgp.fugitive.enable (with pkgs.vimPlugins; [ + vim-fugitive + ]); + + luasnip-pkg = lopts cfgp.luasnip.enable (with pkgs.vimPlugins; [ + luasnip + friendly-snippets + (lib.mkIf cfgp.nvimcmp.enable cmp_luasnip) + ]); + + lualine = lopts cfgp.lualine.enable (with pkgs.vimPlugins; [ + { + plugin = lualine-nvim; + type = "lua"; + config = '' + require("lualine").setup({ + icons_enabled = true, + }) + ''; + } + nvim-web-devicons + ]); + + nix-pkg = lopts cfgl.nix.enable (with pkgs.vimPlugins; [ + vim-nix + ]); + in comments ++ fugitive ++ luasnip-pkg ++ lualine ++ nix-pkg; }; }; } diff --git a/hmModules/apps/neovim/init.vim b/hmModules/apps/neovim/init.vim deleted file mode 100644 index d8b95c9..0000000 --- a/hmModules/apps/neovim/init.vim +++ /dev/null @@ -1,68 +0,0 @@ -syntax on -let mapleader =" " -set encoding=utf-8 -set nocompatible -filetype plugin on -set list - -set updatetime=300 - -" Easy Split Navigation -nnoremap -nnoremap -nnoremap -nnoremap - -" Indentation -" set tabstop=2 softtabstop=0 shiftwidth=2 smarttab expandtab -set tabstop=8 softtabstop=0 shiftwidth=8 - -" Searching -set smartcase - -" Backups -set noswapfile -set nobackup -set undodir=~/.config/nvim/undodir -set undofile - -" Right column at 80 lines for good coding practice. -set colorcolumn=80 -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -" QoL -set showmatch " Show matching Brackets -set number relativenumber " Side numbers - -" Fuzzy finding by allowing searching into subfolders -set path+=** -set wildmenu -" use :find to find, and * to make it fuzzy. -" Also make use of :b. - -" Delete trailing white space and newlines at end of file on save. -autocmd BufWritePre * %s/\s\+$//e -autocmd BufWritePre * %s/\n\+\%$//e - -" Easy copy and pasting to external programs -map "+yy -map "+P - -autocmd BufRead,BufNewFile *.md call WritingMode() -autocmd BufRead,BufNewFile *.tex call WritingMode() -autocmd BufRead,BufNewFile *.svx call WritingMode() - -autocmd BufRead,BufNewFile *.py call PythonMode() - -function! WritingMode() - setlocal textwidth=80 - setlocal wrap linebreak nolist - setlocal whichwrap+=<,>,h,l - nnoremap j gj - nnoremap k gk - setlocal spell spelllang=en_us -endfunction -function! PythonMode() - setlocal foldmethod=indent - setlocal foldlevel=99 -endfunction diff --git a/hmModules/apps/neovim/options.lua b/hmModules/apps/neovim/options.lua new file mode 100644 index 0000000..9043756 --- /dev/null +++ b/hmModules/apps/neovim/options.lua @@ -0,0 +1,57 @@ +-- Globals +vim.g.mapleader = ' ' +vim.g.maplocalleader = ' ' +vim.opt.list = true +vim.bo.filetype = true +vim.opt.updatetime = 300 + +-- Indentations +vim.opt.tabstop = 2 +vim.opt.softtabstop = 0 +vim.opt.shiftwidth = 2 +vim.opt.smarttab = true +vim.opt.expandtab = true + +-- Style +vim.opt.colorcolumn = "80" +vim.opt.showmatch = true +vim.opt.number = true +vim.opt.relativenumber = true + +-- Easy Split Navigation +-- nnoremap +-- nnoremap +-- nnoremap +-- nnoremap + +-- Searching +vim.opt.smartcase = true + +-- Backups +vim.opt.swapfile = false +vim.opt.backup = false +vim.opt.undofile = true +vim.opt.undodir = '/home/pan/.config/nvim/undodir' + +-- Easy copy and pasting to external programs +-- map "+yy +-- map "+P + +-- autocmd BufRead,BufNewFile *.md call WritingMode() +-- autocmd BufRead,BufNewFile *.tex call WritingMode() +-- autocmd BufRead,BufNewFile *.svx call WritingMode() + +-- autocmd BufRead,BufNewFile *.py call PythonMode() + +-- function! WritingMode() + -- setlocal textwidth=80 + -- setlocal wrap linebreak nolist + -- setlocal whichwrap+=<,>,h,l + -- nnoremap j gj + -- nnoremap k gk + -- setlocal spell spelllang=en_us +-- endfunction +-- function! PythonMode() + -- setlocal foldmethod=indent + -- setlocal foldlevel=99 +-- endfunction diff --git a/hmModules/apps/neovim/plugin/lsp.nix b/hmModules/apps/neovim/plugin/lsp.nix new file mode 100644 index 0000000..ae3806a --- /dev/null +++ b/hmModules/apps/neovim/plugin/lsp.nix @@ -0,0 +1,49 @@ +{ config, pkgs, lib, ... }: + +{ + config = lib.mkIf config.neovim.enable { + programs.neovim.plugins = let + cfgp = config.neovim.plugins; + cfgl = config.neovim.languages; + + configText = '' + local on_attach = function(_, bufnr) + + local bufmap = function(keys, func) + vim.keymap.set('n', keys, func, { buffer = bufnr }) + end + + bufmap('r', vim.lsp.buf.rename) + bufmap('a', vim.lsp.buf.code_action) + + bufmap('gd', vim.lsp.buf.definition) + bufmap('gD', vim.lsp.buf.declaration) + bufmap('gI', vim.lsp.buf.implementation) + bufmap('D', vim.lsp.buf.type_definition) + + '' + lib.strings.optionalString cfgp.telescope.enable '' + bufmap('gr', require('telescope.builtin').lsp_references) + bufmap('s', require('telescope.builtin').lsp_document_symbols) + bufmap('S', require('telescope.builtin').lsp_dynamic_workspace_symbols) + '' + '' + + bufmap('K', vim.lsp.buf.hover) + + vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) + vim.lsp.buf.format() + end, {}) + end + + local capabilities = vim.lsp.protocol.make_client_capabilities() + '' + lib.strings.optionalString cfgl.nix.enable '' + require('lspconfig').nil_ls.setup {} + ''; + in with pkgs.vimPlugins; [ + { + plugin = nvim-lspconfig; + type = "lua"; + config = configText; + } + ]; + }; +} diff --git a/hmModules/apps/neovim/plugin/nvimcmp.nix b/hmModules/apps/neovim/plugin/nvimcmp.nix new file mode 100644 index 0000000..82098ef --- /dev/null +++ b/hmModules/apps/neovim/plugin/nvimcmp.nix @@ -0,0 +1,72 @@ +{ config, pkgs, lib, ... }: + +let + cfgp = config.neovim.plugins; +in { + config = lib.mkIf (config.neovim.enable && cfgp.nvimcmp.enable) { + programs.neovim.plugins = let + + configText = '' + local cmp = require('cmp') + '' + lib.strings.optionalString cfgp.luasnip.enable '' + local luasnip = require('luasnip') + + require('luasnip.loaders.from_vscode').lazy_load() + luasnip.config.setup {} + '' + '' + + cmp.setup { + mapping = cmp.mapping.preset.insert { + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete {}, + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }, + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + '' + lib.strings.optionalString cfgp.luasnip.enable '' + elseif luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + '' + '' + else + fallback() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + '' + lib.strings.optionalString cfgp.luasnip.enable '' + elseif luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + '' + '' + else + fallback() + end + end, { 'i', 's' }), + }, + '' + lib.strings.optionalString cfgp.luasnip.enable '' + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + sources = { + { name = 'luasnip' }, + }, + '' + '' + } + ''; + in with pkgs.vimPlugins; [ + { + plugin = nvim-cmp; + type = "lua"; + config = configText; + } + ]; + }; +} diff --git a/hmModules/apps/neovim/plugin/telescope.nix b/hmModules/apps/neovim/plugin/telescope.nix new file mode 100644 index 0000000..26178ef --- /dev/null +++ b/hmModules/apps/neovim/plugin/telescope.nix @@ -0,0 +1,40 @@ +{ config, pkgs, lib, ... }: + +let + cfgp = config.neovim.plugins; +in { + config = lib.mkIf (config.neovim.enable && cfgp.telescope.enable) { + programs.neovim.plugins = let + configText = '' + require('telescope').setup({ + extensions = { + '' + lib.strings.optionalString cfgp.telescope.fzf.enable '' + fzf = { + fuzzy = true, -- false will only do exact matching + override_generic_sorter = true, -- override the generic sorter + override_file_sorter = true, -- override the file sorter + case_mode = "smart_case", -- or "ignore_case" or "respect_case" + -- the default case_mode is "smart_case" + } + '' + '' + } + }) + + '' + lib.strings.optionalString cfgp.telescope.fzf.enable '' + require('telescope').load_extension('fzf') + ''; + in with pkgs.vimPlugins; [ + { + plugin = telescope-nvim; + type = "lua"; + config = configText; + } + (lib.mkIf cfgp.nvimcmp.enable telescope-fzf-native-nvim) + ]; + + home.packages = with pkgs; [ + (lib.mkIf cfgp.telescope.fzf.enable fzf) + ]; + + }; +} diff --git a/hmModules/apps/neovim/plugin/treesitter.nix b/hmModules/apps/neovim/plugin/treesitter.nix new file mode 100644 index 0000000..bf828b8 --- /dev/null +++ b/hmModules/apps/neovim/plugin/treesitter.nix @@ -0,0 +1,30 @@ +{ config, pkgs, lib, ... }: + +let + cfgp = config.neovim.plugins; + cfgl = config.neovim.languages; +in { + config = lib.mkIf (config.neovim.enable && cfgp.treesitter.enable) { + programs.neovim.plugins = let + configText = '' + require('nvim-treesitter.configs').setup { + ensure_installed = {}, + + auto_install = false, + + highlight = { enable = true }, + + indent = { enable = true }, + } + ''; + + treeplugs = p: lib.lists.optional cfgl.nix.enable p.tree-sitter-nix; + in with pkgs.vimPlugins; [ + { + plugin = (nvim-treesitter.withPlugins treeplugs); + type = "lua"; + config = configText; + } + ]; + }; +} diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 8947e74..fa85073 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -27,6 +27,22 @@ feh.enable = true; neovim.enable = true; + neovim.languages = { + nix.enable = true; + }; + neovim.plugins = { + comments.enable = true; + fugitive.enable = true; + lualine.enable = true; + luasnip.enable = true; + nvimcmp.enable = true; + telescope = { + enable = true; + fzf.enable = true; + }; + treesitter.enable = true; + }; + lf.enable = true; lf.hiddenfiles = [ "${config.home.homeDirectory}/.librewolf" From 92211cc1beca87d18d22f51f3b4c3dad3c9a6d74 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Tue, 16 Apr 2024 04:39:03 -0700 Subject: [PATCH 37/61] Hypr, fix workspace bug, add xonsh for scripts --- hmModules/apps/hypr/default.nix | 1 + hmModules/apps/hypr/keybinds.conf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hmModules/apps/hypr/default.nix b/hmModules/apps/hypr/default.nix index 0c83ffd..b8372d6 100644 --- a/hmModules/apps/hypr/default.nix +++ b/hmModules/apps/hypr/default.nix @@ -32,6 +32,7 @@ let rootPath = ./.; in hyprpicker # Colorpicker, needed for screenshot tool hyprcursor # Hyprland cursor inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool + xonsh polkit-kde-agent # Polkit handler ]; # Hyprland screenshot tool diff --git a/hmModules/apps/hypr/keybinds.conf b/hmModules/apps/hypr/keybinds.conf index 26e89e0..06d307a 100644 --- a/hmModules/apps/hypr/keybinds.conf +++ b/hmModules/apps/hypr/keybinds.conf @@ -39,7 +39,7 @@ bind = $mainMod SHIFT, F, fullscreen, bind = $mainMod SHIFT, 1, movetoworkspacesilent, name:home bind = $mainMod SHIFT, 2, movetoworkspacesilent, name:web bind = $mainMod SHIFT, 3, movetoworkspacesilent, name:med -bind = $mainMod SHIFT, 4, movetoworkspacesilent, name:misc +bind = $mainMod SHIFT, 4, movetoworkspacesilent, name:game bind = $mainMod SHIFT, _, movetoworkspacesilent, name:hell bind = $mainMod SHIFT, TAB, movetoworkspacesilent, r-1 From 14b3dab47666fa53ff7aaa4a25354ce9096840f6 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 17 Apr 2024 20:59:21 -0700 Subject: [PATCH 38/61] Neovim, Add c language support --- hmModules/apps/neovim/default.nix | 2 ++ hmModules/apps/neovim/plugin/lsp.nix | 2 ++ hmModules/apps/neovim/plugin/treesitter.nix | 7 ++++++- systems/pan/default.nix | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hmModules/apps/neovim/default.nix b/hmModules/apps/neovim/default.nix index 91b38c6..4407176 100644 --- a/hmModules/apps/neovim/default.nix +++ b/hmModules/apps/neovim/default.nix @@ -5,6 +5,7 @@ enable = lib.mkEnableOption "Enables neovim"; languages = { nix.enable = lib.mkEnableOption "Enables nix support"; + c.enable = lib.mkEnableOption "Enables c support"; }; plugins = { comments.enable = lib.mkEnableOption "Enables nvim-comment"; @@ -45,6 +46,7 @@ extraPackages = with pkgs; [ (lib.mkIf config.neovim.languages.nix.enable nil) + (lib.mkIf config.neovim.languages.c.enable libclang) ]; # Additional packages are added through imports diff --git a/hmModules/apps/neovim/plugin/lsp.nix b/hmModules/apps/neovim/plugin/lsp.nix index ae3806a..849c9cc 100644 --- a/hmModules/apps/neovim/plugin/lsp.nix +++ b/hmModules/apps/neovim/plugin/lsp.nix @@ -37,6 +37,8 @@ local capabilities = vim.lsp.protocol.make_client_capabilities() '' + lib.strings.optionalString cfgl.nix.enable '' require('lspconfig').nil_ls.setup {} + '' + lib.strings.optionalString cfgl.c.enable '' + require('lspconfig').clangd.setup {} ''; in with pkgs.vimPlugins; [ { diff --git a/hmModules/apps/neovim/plugin/treesitter.nix b/hmModules/apps/neovim/plugin/treesitter.nix index bf828b8..667fb3d 100644 --- a/hmModules/apps/neovim/plugin/treesitter.nix +++ b/hmModules/apps/neovim/plugin/treesitter.nix @@ -18,7 +18,12 @@ in { } ''; - treeplugs = p: lib.lists.optional cfgl.nix.enable p.tree-sitter-nix; + # I've tried many things, and can't get treesitter plugins changing + # dynamically. For not just have them always loaded regardless of config + treeplugs = p: [ + p.tree-sitter-nix + p.tree-sitter-c + ]; in with pkgs.vimPlugins; [ { plugin = (nvim-treesitter.withPlugins treeplugs); diff --git a/systems/pan/default.nix b/systems/pan/default.nix index fa85073..48daee2 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -29,6 +29,7 @@ neovim.enable = true; neovim.languages = { nix.enable = true; + c.enable = true; }; neovim.plugins = { comments.enable = true; From 42a54984175f8aa1c38dd67d36b98aedc46abd8d Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 17 Apr 2024 21:03:24 -0700 Subject: [PATCH 39/61] Lf, add trash-cli support --- flake.lock | 50 ++++++++++----------- hmModules/apps/file-browsers/lf/default.nix | 7 ++- systems/pan/default.nix | 1 + 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/flake.lock b/flake.lock index 3a7bcc5..a6c7c56 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1712834339, - "narHash": "sha256-gRYAbyxx4Z2s4hMoXHSu3wv2+VSiiR2Nk+AZmCZ6kc4=", + "lastModified": 1713301451, + "narHash": "sha256-LzYVqEukjOJjm4HGFe6rtHBiuJxAyPqd2MY1k5ci9QU=", "owner": "Aylur", "repo": "ags", - "rev": "c13bcba224f9ecaaa2f22b1d2895bb62e8face19", + "rev": "33bcaf34d5277031ecb97047fb8ddd44abd8d80e", "type": "github" }, "original": { @@ -27,11 +27,11 @@ ] }, "locked": { - "lastModified": 1713077896, - "narHash": "sha256-Noot8H0EZEAFRQWyGxh9ryvhK96xpIqKbh78X447JWs=", + "lastModified": 1713391096, + "narHash": "sha256-5xkzsy+ILgQlmvDDipL5xqAehnjWBenAQXV4/NLg2dE=", "owner": "nix-community", "repo": "home-manager", - "rev": "630a0992b3627c64e34f179fab68e3d48c6991c0", + "rev": "f46814ec7cbef9c2aef18ca1cbe89f2bb1e8c394", "type": "github" }, "original": { @@ -56,11 +56,11 @@ ] }, "locked": { - "lastModified": 1712434681, - "narHash": "sha256-qwmR2p1oc48Bj7gUDvb1oGL19Rjs2PmEmk4ChV01A5o=", + "lastModified": 1713214463, + "narHash": "sha256-zAOOjqHAbccCRgJSuvTCA0FNLqKswN63LgVo43R7pxw=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "818d8c4b69e0997483d60b75f701fe14b561a7a3", + "rev": "0a53b9957f0b17f1a0036b25198f569969ad43a0", "type": "github" }, "original": { @@ -82,11 +82,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1713050186, - "narHash": "sha256-AKdzVa0Zz5PQ1ptQgD0jj8J+UZUW9OeKGZ0mNVnkyI4=", + "lastModified": 1713376910, + "narHash": "sha256-6cvw+CxacXe+l8/mZ1+ih21vLHvhIC+Erc7LQF0dyrQ=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "0634aaeac6cca12e4f72174c431c2db9da9c0072", + "rev": "82222342f10a7eff0ec9be972153e740d0f95213", "type": "github" }, "original": { @@ -152,11 +152,11 @@ ] }, "locked": { - "lastModified": 1711671891, - "narHash": "sha256-C/Wwsy/RLxHP1axFFl+AnwJRWfd8gxDKKoa8nt8Qk3c=", + "lastModified": 1713121246, + "narHash": "sha256-502X0Q0fhN6tJK7iEUA8CghONKSatW/Mqj4Wappd++0=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "c1402612146ba06606ebf64963a02bc1efe11e74", + "rev": "78fcaa27ae9e1d782faa3ff06c8ea55ddce63706", "type": "github" }, "original": { @@ -167,11 +167,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1713248628, + "narHash": "sha256-NLznXB5AOnniUtZsyy/aPWOk8ussTuePp2acb9U+ISA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "5672bc9dbf9d88246ddab5ac454e82318d094bb8", "type": "github" }, "original": { @@ -207,17 +207,17 @@ "wlroots": { "flake": false, "locked": { - "lastModified": 1712935342, - "narHash": "sha256-zzIbTFNFd/as42jyGx23fil2uBDYYv+8GA5JmRq5y9c=", + "lastModified": 1713124002, + "narHash": "sha256-vPeZCY+sdiGsz4fl3AVVujfyZyQBz6+vZdkUE4hQ+HI=", "owner": "hyprwm", "repo": "wlroots-hyprland", - "rev": "62eeffbe233d199f520a5755c344e85f8eab7940", + "rev": "611a4f24cd2384378f6e500253983107c6656c64", "type": "github" }, "original": { "owner": "hyprwm", "repo": "wlroots-hyprland", - "rev": "62eeffbe233d199f520a5755c344e85f8eab7940", + "rev": "611a4f24cd2384378f6e500253983107c6656c64", "type": "github" } }, @@ -241,11 +241,11 @@ ] }, "locked": { - "lastModified": 1709299639, - "narHash": "sha256-jYqJM5khksLIbqSxCLUUcqEgI+O2LdlSlcMEBs39CAU=", + "lastModified": 1713214484, + "narHash": "sha256-h1bSIsDuPk1FGgvTuSHJyiU2Glu7oAyoPMJutKZmLQ8=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "2d2fb547178ec025da643db57d40a971507b82fe", + "rev": "bb44921534a9cee9635304fdb876c1b3ec3a8f61", "type": "github" }, "original": { diff --git a/hmModules/apps/file-browsers/lf/default.nix b/hmModules/apps/file-browsers/lf/default.nix index c37b608..9e1372c 100644 --- a/hmModules/apps/file-browsers/lf/default.nix +++ b/hmModules/apps/file-browsers/lf/default.nix @@ -10,6 +10,8 @@ config = lib.mkIf config.lf.enable { xdg.configFile."lf/icons".source = ./icons; + + programs.lf = { enable = true; settings = { @@ -27,6 +29,8 @@ }; commands = { dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"''; + trash = lib.mkIf config.trash.enable + ''%${pkgs.trash-cli}/bin/trash "$fx"''; mkdir = '' ''${{ printf "Directory Name: " @@ -38,7 +42,7 @@ ''${{ printf "File Name: " read FILE - mkdir $FILE + touch $FILE }} ''; }; @@ -48,6 +52,7 @@ "${leader}" = ""; "v" = ":toggle; down"; "." = "set hidden!"; + "x" = lib.mkIf config.trash.enable "trash"; "${leader}d" = "mkdir"; "${leader}f" = "mkfile"; "${leader}m" = "dragon-out"; diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 48daee2..3d8fcc4 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -13,6 +13,7 @@ timer.enableQuarterly = true; colors.enable = true; manpages.enable = true; + trash.enable = true; zsh.enable = true; kitty.enable = true; From 6d463dc0c5ea4bf2167f014e3ab267f59f8abd0b Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 18 Apr 2024 00:53:41 -0700 Subject: [PATCH 40/61] Add zoxide and add zoxide support in lf --- hmModules/apps/default.nix | 1 + hmModules/apps/file-browsers/lf/default.nix | 19 +++++++++++++++---- hmModules/apps/zoxide/default.nix | 16 ++++++++++++++++ systems/pan/default.nix | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 hmModules/apps/zoxide/default.nix diff --git a/hmModules/apps/default.nix b/hmModules/apps/default.nix index 4d496dc..735a533 100644 --- a/hmModules/apps/default.nix +++ b/hmModules/apps/default.nix @@ -14,5 +14,6 @@ ./rofi ./shells ./terminal-emulators + ./zoxide ]; } diff --git a/hmModules/apps/file-browsers/lf/default.nix b/hmModules/apps/file-browsers/lf/default.nix index 9e1372c..0ad6060 100644 --- a/hmModules/apps/file-browsers/lf/default.nix +++ b/hmModules/apps/file-browsers/lf/default.nix @@ -10,8 +10,6 @@ config = lib.mkIf config.lf.enable { xdg.configFile."lf/icons".source = ./icons; - - programs.lf = { enable = true; settings = { @@ -29,8 +27,15 @@ }; commands = { dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"''; - trash = lib.mkIf config.trash.enable - ''%${pkgs.trash-cli}/bin/trash "$fx"''; + trash = lib.mkIf config.trash.enable '' + %${pkgs.trash-cli}/bin/trash "$fx" + ''; + zoxide-cd = lib.mkIf config.zoxide.enable '' + ''${{ + result="$(${pkgs.zoxide}/bin/zoxide query -i | sed 's/\\/\\\\/g;s/"/\\"/g')" + ${pkgs.lf}/bin/lf -remote "send $id cd \"$result\"" + }} + ''; mkdir = '' ''${{ printf "Directory Name: " @@ -45,6 +50,11 @@ touch $FILE }} ''; + on-cd = lib.mkIf config.zoxide.enable '' + &{{ + ${pkgs.zoxide}/bin/zoxide add "$PWD" + }} + ''; }; keybindings = let leader = config.lf.leader; @@ -56,6 +66,7 @@ "${leader}d" = "mkdir"; "${leader}f" = "mkfile"; "${leader}m" = "dragon-out"; + "${leader}z" = lib.mkIf config.zoxide.enable "zoxide-cd"; }; extraConfig = let diff --git a/hmModules/apps/zoxide/default.nix b/hmModules/apps/zoxide/default.nix new file mode 100644 index 0000000..859c69b --- /dev/null +++ b/hmModules/apps/zoxide/default.nix @@ -0,0 +1,16 @@ +{ config, pkgs, lib, ... }: + +{ + options.zoxide = { + enable = lib.mkEnableOption "Enables Zoxide"; + }; + + config = lib.mkIf config.zoxide.enable { + programs.zoxide = { + enable = true; + options = [ + "--cmd cd" + ]; + }; + }; +} diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 3d8fcc4..7025f6d 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -55,6 +55,7 @@ "${config.home.homeDirectory}/.steam*" "${config.home.homeDirectory}/.zshenv" ]; + zoxide.enable = true; gimp.enable = true; From 263b6a2a08be5c9f94103c10836a301a72d4f522 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 18 Apr 2024 00:57:36 -0700 Subject: [PATCH 41/61] Neovim, add vimwiki extension --- hmModules/apps/neovim/default.nix | 20 +++++++++++++++++++- systems/pan/default.nix | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/hmModules/apps/neovim/default.nix b/hmModules/apps/neovim/default.nix index 4407176..ecfb29b 100644 --- a/hmModules/apps/neovim/default.nix +++ b/hmModules/apps/neovim/default.nix @@ -18,6 +18,7 @@ fzf.enable = lib.mkEnableOption "Enables telescope-fzf"; }; treesitter.enable = lib.mkEnableOption "Enables treesitter"; + wiki.enable = lib.mkEnableOption "Enables a wiki"; }; }; @@ -89,7 +90,24 @@ nix-pkg = lopts cfgl.nix.enable (with pkgs.vimPlugins; [ vim-nix ]); - in comments ++ fugitive ++ luasnip-pkg ++ lualine ++ nix-pkg; + + wiki = lopts cfgp.wiki.enable (with pkgs.vimPlugins; [ + { + plugin = vimwiki; + type = "lua"; + config = '' + vim.g.vimwiki_list = { + { + path = '${config.xdg.userDirs.documents}/wiki', + links_space_char = '_', + ext = '.md', + syntax = 'markdown', + } + } + ''; + } + ]); + in comments ++ fugitive ++ luasnip-pkg ++ lualine ++ nix-pkg ++ wiki; }; }; } diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 7025f6d..7910e57 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -43,6 +43,7 @@ fzf.enable = true; }; treesitter.enable = true; + wiki.enable = true; }; lf.enable = true; From 0508cddeb0209063889fdad2000e04b5a82afa52 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 18 Apr 2024 01:16:38 -0700 Subject: [PATCH 42/61] neovim: Add file and git finding to telescope --- hmModules/apps/neovim/plugin/telescope.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hmModules/apps/neovim/plugin/telescope.nix b/hmModules/apps/neovim/plugin/telescope.nix index 26178ef..48a96e9 100644 --- a/hmModules/apps/neovim/plugin/telescope.nix +++ b/hmModules/apps/neovim/plugin/telescope.nix @@ -19,6 +19,9 @@ in { '' + '' } }) + local builtin = require('telescope.builtin') + vim.keymap.set('n', 'ff', builtin.find_files, {}) + vim.keymap.set('n', 'fg', builtin.git_files, {}) '' + lib.strings.optionalString cfgp.telescope.fzf.enable '' require('telescope').load_extension('fzf') From 0336466d648262c4b3ab5fe28d47ebd3bfb966f9 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 18 Apr 2024 15:38:03 -0700 Subject: [PATCH 43/61] lf, change lfcd to lf in zshrc --- hmModules/apps/shells/zsh/default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hmModules/apps/shells/zsh/default.nix b/hmModules/apps/shells/zsh/default.nix index 713a527..9e5ee6b 100644 --- a/hmModules/apps/shells/zsh/default.nix +++ b/hmModules/apps/shells/zsh/default.nix @@ -18,11 +18,11 @@ history.path = "${config.xdg.dataHome}/zsh/history"; initExtra = let lf = lib.optionalString config.lf.enable '' - # Lf change directory command - lfcd () { - cd "$(command lf -print-last-dir "$@")" + # Lf changes directory + lf () { + cd "$(command ${pkgs.lf}/bin/lf -print-last-dir "$@")" } - bindkey -s '^o' 'lfcd\n' + bindkey -s '^o' 'lf\n' ''; in lf + '' From 9978fb792162fa3fe0af089b7ed03702d1a913b0 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Sun, 21 Apr 2024 01:19:38 -0700 Subject: [PATCH 44/61] Fish, simplify functions, move n alias call Simplifies the git_ family of functions to make fish_right_prompt more readable. git_prompt function is added, which prints the relevant git prompt information. The git_ family of functions is moved into the git_prompt function, and fish_right_prompt calls git_prompt Going forward I'm trying to have modules in charge of the data for other modules, so I moved the nnn alias call from fish to n, and added a handy "extraFunctions" config option to fish. Maintaining the fish module's control of the functions, but allowing others to add stuff in --- hmModules/apps/file-browsers/nnn/default.nix | 3 + .../nnn/nnn_fish_function.fish} | 0 hmModules/apps/shells/fish/default.nix | 57 +++++++-------- .../shells/fish/functions/fish_prompt.fish | 13 ---- .../fish/functions/fish_right_prompt.fish | 61 ---------------- .../fish/functions/git_branch_name.fish | 4 -- .../shells/fish/functions/git_is_dirty.fish | 1 - .../shells/fish/functions/git_is_repo.fish | 5 -- .../shells/fish/functions/git_is_staged.fish | 3 - .../shells/fish/functions/git_is_touched.fish | 6 -- .../fish/functions/git_is_worktree.fish | 2 - .../shells/fish/functions/git_prompt.fish | 69 +++++++++++++++++++ systems/pan/default.nix | 2 +- 13 files changed, 96 insertions(+), 130 deletions(-) rename hmModules/apps/{shells/fish/functions/n.fish => file-browsers/nnn/nnn_fish_function.fish} (100%) delete mode 100644 hmModules/apps/shells/fish/functions/fish_prompt.fish delete mode 100644 hmModules/apps/shells/fish/functions/fish_right_prompt.fish delete mode 100644 hmModules/apps/shells/fish/functions/git_branch_name.fish delete mode 100644 hmModules/apps/shells/fish/functions/git_is_dirty.fish delete mode 100644 hmModules/apps/shells/fish/functions/git_is_repo.fish delete mode 100644 hmModules/apps/shells/fish/functions/git_is_staged.fish delete mode 100644 hmModules/apps/shells/fish/functions/git_is_touched.fish delete mode 100644 hmModules/apps/shells/fish/functions/git_is_worktree.fish create mode 100644 hmModules/apps/shells/fish/functions/git_prompt.fish diff --git a/hmModules/apps/file-browsers/nnn/default.nix b/hmModules/apps/file-browsers/nnn/default.nix index f68cec2..8900ee7 100644 --- a/hmModules/apps/file-browsers/nnn/default.nix +++ b/hmModules/apps/file-browsers/nnn/default.nix @@ -13,5 +13,8 @@ NNN_FIFO = "/tmp/nnn.fifo"; NNN_TRASH = lib.mkIf config.trash.enable "1"; }; + fish.extraFunctions = lib.mkIf config.fish.enable { + n = ''${builtins.readFile ./nnn_fish_function.fish}''; + }; }; } diff --git a/hmModules/apps/shells/fish/functions/n.fish b/hmModules/apps/file-browsers/nnn/nnn_fish_function.fish similarity index 100% rename from hmModules/apps/shells/fish/functions/n.fish rename to hmModules/apps/file-browsers/nnn/nnn_fish_function.fish diff --git a/hmModules/apps/shells/fish/default.nix b/hmModules/apps/shells/fish/default.nix index 46e6de1..0390a09 100644 --- a/hmModules/apps/shells/fish/default.nix +++ b/hmModules/apps/shells/fish/default.nix @@ -3,43 +3,32 @@ { options.fish = { enable = lib.mkEnableOption "Enables fish"; + extraFunctions = lib.mkOption { + type = with lib.types; attrsOf lines; + default = {}; + }; }; config = lib.mkIf config.fish.enable { - programs.fish.enable = true; - - programs.fish.functions = { - fish_greeting = ""; - fish_prompt = '' - ${builtins.readFile ./functions/fish_prompt.fish} - ''; - fish_right_prompt = '' - ${builtins.readFile ./functions/fish_right_prompt.fish} - ''; - git_branch_name = '' - ${builtins.readFile ./functions/git_branch_name.fish} - ''; - git_is_dirty = '' - ${builtins.readFile ./functions/git_is_dirty.fish} - ''; - git_is_repo = '' - ${builtins.readFile ./functions/git_is_repo.fish} - ''; - git_is_staged = '' - ${builtins.readFile ./functions/git_is_staged.fish} - ''; - git_is_touched = '' - ${builtins.readFile ./functions/git_is_touched.fish} - ''; - git_is_worktree = '' - ${builtins.readFile ./functions/git_is_worktree.fish} - ''; - ssh = '' - ${builtins.readFile ./functions/ssh.fish} - ''; - n = lib.mkIf config.nnn.enable '' - ${builtins.readFile ./functions/n.fish} - ''; + programs.fish = { + enable = true; + functions = { + fish_greeting = ""; + fish_prompt = '' + if test $status -eq 0 + echo -n -s (set_color blue -o) τ " " (set_color normal) + else + echo -n -s (set_color red -o) τ " " (set_color normal) + end + ''; + fish_right_prompt = '' + git_prompt + echo -n -s (set_color blue) (prompt_pwd) " " + echo -n -s (set_color yellow) $CMD_DURATION ms + echo -n -s (set_color normal) + ''; + git_prompt = ''${builtins.readFile ./functions/git_prompt.fish}''; + } // config.fish.extraFunctions; }; }; } diff --git a/hmModules/apps/shells/fish/functions/fish_prompt.fish b/hmModules/apps/shells/fish/functions/fish_prompt.fish deleted file mode 100644 index 1740f57..0000000 --- a/hmModules/apps/shells/fish/functions/fish_prompt.fish +++ /dev/null @@ -1,13 +0,0 @@ -set -l last_command_status $status - -set -l symbol 'τ' - -set -l normal_color (set_color normal) -set -l symbol_color (set_color blue -o) -set -l error_color (set_color red -o) - -if test $last_command_status -eq 0 - echo -n -s $symbol_color $symbol " " $normal_color -else - echo -n -s $error_color $symbol " " $normal_color -end diff --git a/hmModules/apps/shells/fish/functions/fish_right_prompt.fish b/hmModules/apps/shells/fish/functions/fish_right_prompt.fish deleted file mode 100644 index f46799d..0000000 --- a/hmModules/apps/shells/fish/functions/fish_right_prompt.fish +++ /dev/null @@ -1,61 +0,0 @@ -set -l cwd -set -l cwd_color (set_color blue) -set -l normal_color (set_color normal) -set -l branch_color (set_color yellow) -set -l meta_color (set_color red) - -if git_is_repo - echo -n -s $branch_color (git_branch_name) $normal_color - set -l git_meta "" - if test (command git ls-files --others --exclude-standard | wc -w 2> /dev/null) -gt 0 - set git_meta "$git_meta?" - end - if test (command git rev-list --walk-reflogs --count refs/stash 2> /dev/null) - set git_meta "$git_meta\$" - end - if git_is_touched - git_is_dirty && set git_meta "$git_meta⨯" - git_is_staged && set git_meta "$git_meta●" - end - set -l commit_count (command git rev-list --count --left-right (git remote)/(git_branch_name)"...HEAD" 2> /dev/null) - if test $commit_count - set -l behind (echo $commit_count | cut -f 1) - set -l ahead (echo $commit_count | cut -f 2) - if test $behind -gt 0 - set git_meta "$git_meta🠋" - end - if test $ahead -gt 0 - set git_meta "$git_meta🠉" - end - end - if test $git_meta - echo -n -s $meta_color " " $git_meta " " $normal_color - else - echo -n -s " " - end - - - set root_folder (command git rev-parse --show-toplevel 2> /dev/null) - set parent_root_folder (dirname $root_folder) - set cwd (echo $PWD | sed -e "s|$parent_root_folder/||") -else - set cwd (prompt_pwd) -end - - -echo -n -s $cwd_color "$cwd" -set_color --dim - -set -l S (math $CMD_DURATION/1000) -set -l M (math $S/60) - - -echo -n -s " " -if test $M -gt 1 - echo -n -s $M m -else if test $S -gt 1 - echo -n -s $S s -else - echo -n -s $CMD_DURATION ms -end -set_color normal diff --git a/hmModules/apps/shells/fish/functions/git_branch_name.fish b/hmModules/apps/shells/fish/functions/git_branch_name.fish deleted file mode 100644 index 20b4149..0000000 --- a/hmModules/apps/shells/fish/functions/git_branch_name.fish +++ /dev/null @@ -1,4 +0,0 @@ -git_is_repo; and begin - command git symbolic-ref --short HEAD 2> /dev/null; - or command git show-ref --head -s --abbrev | head -n1 2> /dev/null -end diff --git a/hmModules/apps/shells/fish/functions/git_is_dirty.fish b/hmModules/apps/shells/fish/functions/git_is_dirty.fish deleted file mode 100644 index f92e54d..0000000 --- a/hmModules/apps/shells/fish/functions/git_is_dirty.fish +++ /dev/null @@ -1 +0,0 @@ -git_is_worktree; and not command git diff --no-ext-diff --quiet --exit-code diff --git a/hmModules/apps/shells/fish/functions/git_is_repo.fish b/hmModules/apps/shells/fish/functions/git_is_repo.fish deleted file mode 100644 index 00a2cfc..0000000 --- a/hmModules/apps/shells/fish/functions/git_is_repo.fish +++ /dev/null @@ -1,5 +0,0 @@ -test -d .git -or begin - set -l info (command git rev-parse --git-dir --is-bare-repository 2>/dev/null) - and test $info[2] = false -end diff --git a/hmModules/apps/shells/fish/functions/git_is_staged.fish b/hmModules/apps/shells/fish/functions/git_is_staged.fish deleted file mode 100644 index ef6b7ac..0000000 --- a/hmModules/apps/shells/fish/functions/git_is_staged.fish +++ /dev/null @@ -1,3 +0,0 @@ -git_is_repo; and begin - not command git diff --cached --no-ext-diff --quiet --exit-code -end diff --git a/hmModules/apps/shells/fish/functions/git_is_touched.fish b/hmModules/apps/shells/fish/functions/git_is_touched.fish deleted file mode 100644 index 5605630..0000000 --- a/hmModules/apps/shells/fish/functions/git_is_touched.fish +++ /dev/null @@ -1,6 +0,0 @@ -git_is_worktree; and begin - # The first checks for staged changes, the second for unstaged ones. - # We put them in this order because checking staged changes is *fast*. - not command git diff-index --cached --quiet HEAD -- >/dev/null 2>&1 - or not command git diff --no-ext-diff --quiet --exit-code >/dev/null 2>&1 -end diff --git a/hmModules/apps/shells/fish/functions/git_is_worktree.fish b/hmModules/apps/shells/fish/functions/git_is_worktree.fish deleted file mode 100644 index 8b2c700..0000000 --- a/hmModules/apps/shells/fish/functions/git_is_worktree.fish +++ /dev/null @@ -1,2 +0,0 @@ -git_is_repo -and test (command git rev-parse --is-inside-git-dir) = false diff --git a/hmModules/apps/shells/fish/functions/git_prompt.fish b/hmModules/apps/shells/fish/functions/git_prompt.fish new file mode 100644 index 0000000..a0bb65b --- /dev/null +++ b/hmModules/apps/shells/fish/functions/git_prompt.fish @@ -0,0 +1,69 @@ +function git_is_repo + test -d .git + or begin + set -l info (command git rev-parse --git-dir --is-bare-repository 2>/dev/null) + and test $info[2] = false + end +end + +function git_is_worktree + git_is_repo + and test (command git rev-parse --is-inside-git-dir) = false +end + +function git_is_dirty + git_is_worktree; and not command git diff --no-ext-diff --quiet --exit-code +end + +function git_is_staged + git_is_repo; and begin + not command git diff --cached --no-ext-diff --quiet --exit-code + end +end + +function git_branch_name + git_is_repo; and begin + command git symbolic-ref --short HEAD 2> /dev/null; + or command git show-ref --head -s --abbrev | head -n1 2> /dev/null + end +end + +function git_is_touched + git_is_worktree; and begin + # The first checks for staged changes, the second for unstaged ones. + # We put them in this order because checking staged changes is *fast*. + not command git diff-index --cached --quiet HEAD -- >/dev/null 2>&1 + or not command git diff --no-ext-diff --quiet --exit-code >/dev/null 2>&1 + end +end + +if git_is_repo + echo -n -s (set_color yellow) (git_branch_name) (set_color normal) + set -l git_meta "" + if test (command git ls-files --others --exclude-standard | wc -w 2> /dev/null) -gt 0 + set git_meta "$git_meta?" + end + if test (command git rev-list --walk-reflogs --count refs/stash 2> /dev/null) + set git_meta "$git_meta\$" + end + if git_is_touched + git_is_dirty && set git_meta "$git_meta⨯" + git_is_staged && set git_meta "$git_meta●" + end + set -l commit_count (command git rev-list --count --left-right (git remote)/(git_branch_name)"...HEAD" 2> /dev/null) + if test $commit_count + set -l behind (echo $commit_count | cut -f 1) + set -l ahead (echo $commit_count | cut -f 2) + if test $behind -gt 0 + set git_meta "$git_meta🠋" + end + if test $ahead -gt 0 + set git_meta "$git_meta🠉" + end + end + if test $git_meta + echo -n -s (set_color red) " " $git_meta " " (set_color normal) + else + echo -n -s " " + end +end diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 7910e57..d05f21e 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -15,7 +15,7 @@ manpages.enable = true; trash.enable = true; - zsh.enable = true; + fish.enable = true; kitty.enable = true; kitty.font = "Cascadia Code"; git.enable = true; From b16fb477190a873d030bdf828c25d9b6cf95b82e Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Sun, 21 Apr 2024 01:43:11 -0700 Subject: [PATCH 45/61] lf, add fish cd-alias --- hmModules/apps/file-browsers/lf/default.nix | 7 +++++++ hmModules/apps/shells/fish/default.nix | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/hmModules/apps/file-browsers/lf/default.nix b/hmModules/apps/file-browsers/lf/default.nix index 0ad6060..f4ff3da 100644 --- a/hmModules/apps/file-browsers/lf/default.nix +++ b/hmModules/apps/file-browsers/lf/default.nix @@ -10,6 +10,13 @@ config = lib.mkIf config.lf.enable { xdg.configFile."lf/icons".source = ./icons; + fish.extraFunctions = lib.mkIf config.fish.enable { + lf = { + body = ''cd "$(command ${pkgs.lf}/bin/lf -print-last-dir "$argv")"''; + wraps = "${pkgs.lf}/bin/lf"; + }; + }; + programs.lf = { enable = true; settings = { diff --git a/hmModules/apps/shells/fish/default.nix b/hmModules/apps/shells/fish/default.nix index 0390a09..0fc1e53 100644 --- a/hmModules/apps/shells/fish/default.nix +++ b/hmModules/apps/shells/fish/default.nix @@ -1,10 +1,19 @@ { config, pkgs, lib, ... }: - -{ +let + functionModule = with lib.types; submodule { + options = { + body = lib.mkOption { type = lines; }; + wraps = lib.mkOption { + type = nullOr str; + default = null; + }; + }; + }; +in { options.fish = { enable = lib.mkEnableOption "Enables fish"; extraFunctions = lib.mkOption { - type = with lib.types; attrsOf lines; + type = with lib.types; attrsOf (either lines functionModule); default = {}; }; }; From 1b6627bcbe7f91f09b6d8f136b4328ea793592eb Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Tue, 23 Apr 2024 23:17:10 -0700 Subject: [PATCH 46/61] neovim, add rust language support --- hmModules/apps/neovim/default.nix | 13 ++++++++++--- hmModules/apps/neovim/plugin/lsp.nix | 2 ++ hmModules/apps/neovim/plugin/treesitter.nix | 3 ++- systems/pan/default.nix | 3 ++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/hmModules/apps/neovim/default.nix b/hmModules/apps/neovim/default.nix index ecfb29b..3557f90 100644 --- a/hmModules/apps/neovim/default.nix +++ b/hmModules/apps/neovim/default.nix @@ -4,8 +4,9 @@ options.neovim = { enable = lib.mkEnableOption "Enables neovim"; languages = { - nix.enable = lib.mkEnableOption "Enables nix support"; c.enable = lib.mkEnableOption "Enables c support"; + nix.enable = lib.mkEnableOption "Enables nix support"; + rust.enable = lib.mkEnableOption "Enables rust support"; }; plugins = { comments.enable = lib.mkEnableOption "Enables nvim-comment"; @@ -46,8 +47,9 @@ ''; extraPackages = with pkgs; [ - (lib.mkIf config.neovim.languages.nix.enable nil) (lib.mkIf config.neovim.languages.c.enable libclang) + (lib.mkIf config.neovim.languages.nix.enable nil) + (lib.mkIf config.neovim.languages.rust.enable rust-analyzer) ]; # Additional packages are added through imports @@ -91,6 +93,10 @@ vim-nix ]); + rust-pkg = lopts cfgl.rust.enable (with pkgs.vimPlugins; [ + rustaceanvim + ]); + wiki = lopts cfgp.wiki.enable (with pkgs.vimPlugins; [ { plugin = vimwiki; @@ -107,7 +113,8 @@ ''; } ]); - in comments ++ fugitive ++ luasnip-pkg ++ lualine ++ nix-pkg ++ wiki; + in comments ++ fugitive ++ luasnip-pkg ++ lualine ++ + nix-pkg ++ rust-pkg ++ wiki; }; }; } diff --git a/hmModules/apps/neovim/plugin/lsp.nix b/hmModules/apps/neovim/plugin/lsp.nix index 849c9cc..bd06204 100644 --- a/hmModules/apps/neovim/plugin/lsp.nix +++ b/hmModules/apps/neovim/plugin/lsp.nix @@ -39,6 +39,8 @@ require('lspconfig').nil_ls.setup {} '' + lib.strings.optionalString cfgl.c.enable '' require('lspconfig').clangd.setup {} + '' + lib.strings.optionalString cfgl.rust.enable '' + require('lspconfig').rustaceanvim.setup {} ''; in with pkgs.vimPlugins; [ { diff --git a/hmModules/apps/neovim/plugin/treesitter.nix b/hmModules/apps/neovim/plugin/treesitter.nix index 667fb3d..43b2d28 100644 --- a/hmModules/apps/neovim/plugin/treesitter.nix +++ b/hmModules/apps/neovim/plugin/treesitter.nix @@ -21,8 +21,9 @@ in { # I've tried many things, and can't get treesitter plugins changing # dynamically. For not just have them always loaded regardless of config treeplugs = p: [ - p.tree-sitter-nix p.tree-sitter-c + p.tree-sitter-nix + p.tree-sitter-rust ]; in with pkgs.vimPlugins; [ { diff --git a/systems/pan/default.nix b/systems/pan/default.nix index d05f21e..ebe826b 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -29,8 +29,9 @@ neovim.enable = true; neovim.languages = { - nix.enable = true; c.enable = true; + nix.enable = true; + rust.enable = true; }; neovim.plugins = { comments.enable = true; From 1fdf2b9462fd99cde410fa983903a88cf2fea537 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Sun, 26 May 2024 17:42:47 -0700 Subject: [PATCH 47/61] Bump flakes, use hyprland?submodules=1 --- flake.lock | 114 ++++++++++++++++++++++++++++------------------------- flake.nix | 2 +- 2 files changed, 62 insertions(+), 54 deletions(-) diff --git a/flake.lock b/flake.lock index a6c7c56..d23225b 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1713301451, - "narHash": "sha256-LzYVqEukjOJjm4HGFe6rtHBiuJxAyPqd2MY1k5ci9QU=", + "lastModified": 1715703984, + "narHash": "sha256-0BZkMui6aCqswMCouvp0G90tAxDOxVnxTvG6TDZsDaI=", "owner": "Aylur", "repo": "ags", - "rev": "33bcaf34d5277031ecb97047fb8ddd44abd8d80e", + "rev": "11150225e62462bcd431d1e55185e810190a730a", "type": "github" }, "original": { @@ -27,11 +27,11 @@ ] }, "locked": { - "lastModified": 1713391096, - "narHash": "sha256-5xkzsy+ILgQlmvDDipL5xqAehnjWBenAQXV4/NLg2dE=", + "lastModified": 1716736760, + "narHash": "sha256-h3RmnNknKYtVA+EvUSra6QAwfZjC2q1G8YA7W0gat8Y=", "owner": "nix-community", "repo": "home-manager", - "rev": "f46814ec7cbef9c2aef18ca1cbe89f2bb1e8c394", + "rev": "5d151429e1e79107acf6d06dcc5ace4e642ec239", "type": "github" }, "original": { @@ -56,11 +56,11 @@ ] }, "locked": { - "lastModified": 1713214463, - "narHash": "sha256-zAOOjqHAbccCRgJSuvTCA0FNLqKswN63LgVo43R7pxw=", + "lastModified": 1716576411, + "narHash": "sha256-FIN1wMoyePBTtibCbaeJaoKNLuAYIGwLCWAYC1DJanw=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "0a53b9957f0b17f1a0036b25198f569969ad43a0", + "rev": "57298fc4f13c807e50ada2c986a3114b7fc2e621", "type": "github" }, "original": { @@ -72,27 +72,28 @@ "hyprland": { "inputs": { "hyprcursor": "hyprcursor", - "hyprland-protocols": "hyprland-protocols", "hyprlang": "hyprlang", + "hyprwayland-scanner": "hyprwayland-scanner", "nixpkgs": [ "nixpkgs" ], "systems": "systems", - "wlroots": "wlroots", "xdph": "xdph" }, "locked": { - "lastModified": 1713376910, - "narHash": "sha256-6cvw+CxacXe+l8/mZ1+ih21vLHvhIC+Erc7LQF0dyrQ=", - "owner": "hyprwm", - "repo": "Hyprland", - "rev": "82222342f10a7eff0ec9be972153e740d0f95213", - "type": "github" + "lastModified": 1716669967, + "narHash": "sha256-wq91XpwR0tv7e7KwSp0qzvu31EMssznl8DzbNy4M4Hk=", + "ref": "refs/heads/main", + "rev": "553232a3e4c112c8511309e6b685cb614895e714", + "revCount": 4743, + "submodules": true, + "type": "git", + "url": "https://github.com/hyprwm/Hyprland" }, "original": { - "owner": "hyprwm", - "repo": "Hyprland", - "type": "github" + "submodules": true, + "type": "git", + "url": "https://github.com/hyprwm/Hyprland" } }, "hyprland-contrib": { @@ -102,11 +103,11 @@ ] }, "locked": { - "lastModified": 1712505318, - "narHash": "sha256-fzlBLhXUN6y7mzEtcGNRDXxFakBEfaj4Bmj5PuoCNaM=", + "lastModified": 1716228712, + "narHash": "sha256-y+LOXuSRMfkR2Vfwl5K2NVrszi1h5MJpML+msLnVS8U=", "owner": "hyprwm", "repo": "contrib", - "rev": "5870244b592c22558b658dbaf94f9e41afb0316f", + "rev": "33b38358559054d316eb605ccb733980dfa7dc63", "type": "github" }, "original": { @@ -119,10 +120,12 @@ "inputs": { "nixpkgs": [ "hyprland", + "xdph", "nixpkgs" ], "systems": [ "hyprland", + "xdph", "systems" ] }, @@ -152,11 +155,11 @@ ] }, "locked": { - "lastModified": 1713121246, - "narHash": "sha256-502X0Q0fhN6tJK7iEUA8CghONKSatW/Mqj4Wappd++0=", + "lastModified": 1716473782, + "narHash": "sha256-+qLn4lsHU6iL3+HTo1gTQ1tWzet8K9h+IfVemzEQZj8=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "78fcaa27ae9e1d782faa3ff06c8ea55ddce63706", + "rev": "87d5d984109c839482b88b4795db073eb9ed446f", "type": "github" }, "original": { @@ -165,13 +168,38 @@ "type": "github" } }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1716058375, + "narHash": "sha256-CwjWoVnBZE5SBpRx9dgSQGCr4Goxyfcyv3zZbOhVqzk=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "3afed4364790aebe0426077631af1e164a9650cc", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1713248628, - "narHash": "sha256-NLznXB5AOnniUtZsyy/aPWOk8ussTuePp2acb9U+ISA=", + "lastModified": 1716509168, + "narHash": "sha256-4zSIhSRRIoEBwjbPm3YiGtbd8HDWzFxJjw5DYSDy1n8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5672bc9dbf9d88246ddab5ac454e82318d094bb8", + "rev": "bfb7a882678e518398ce9a31a881538679f6f092", "type": "github" }, "original": { @@ -204,29 +232,9 @@ "type": "github" } }, - "wlroots": { - "flake": false, - "locked": { - "lastModified": 1713124002, - "narHash": "sha256-vPeZCY+sdiGsz4fl3AVVujfyZyQBz6+vZdkUE4hQ+HI=", - "owner": "hyprwm", - "repo": "wlroots-hyprland", - "rev": "611a4f24cd2384378f6e500253983107c6656c64", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "wlroots-hyprland", - "rev": "611a4f24cd2384378f6e500253983107c6656c64", - "type": "github" - } - }, "xdph": { "inputs": { - "hyprland-protocols": [ - "hyprland", - "hyprland-protocols" - ], + "hyprland-protocols": "hyprland-protocols", "hyprlang": [ "hyprland", "hyprlang" @@ -241,11 +249,11 @@ ] }, "locked": { - "lastModified": 1713214484, - "narHash": "sha256-h1bSIsDuPk1FGgvTuSHJyiU2Glu7oAyoPMJutKZmLQ8=", + "lastModified": 1716290197, + "narHash": "sha256-1u9Exrc7yx9qtES2brDh7/DDZ8w8ap1nboIOAtCgeuM=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "bb44921534a9cee9635304fdb876c1b3ec3a8f61", + "rev": "91e48d6acd8a5a611d26f925e51559ab743bc438", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index af16e17..b7142f0 100644 --- a/flake.nix +++ b/flake.nix @@ -7,7 +7,7 @@ home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; - hyprland.url = "github:hyprwm/Hyprland"; + hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; hyprland.inputs.nixpkgs.follows = "nixpkgs"; hyprland-contrib.url = "github:hyprwm/contrib"; From 68eb6fe3808ffff02186f0fdfb9d90903425a461 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 27 May 2024 01:55:38 -0700 Subject: [PATCH 48/61] Kitty, remove yes/no prompt on close --- hmModules/apps/terminal-emulators/kitty/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hmModules/apps/terminal-emulators/kitty/default.nix b/hmModules/apps/terminal-emulators/kitty/default.nix index 6195726..b4ae35a 100644 --- a/hmModules/apps/terminal-emulators/kitty/default.nix +++ b/hmModules/apps/terminal-emulators/kitty/default.nix @@ -14,6 +14,7 @@ font_family = config.kitty.font; font_size = config.kitty.font_size; enable_audio_bell = "no"; + confirm_os_window_close = 0; }; }; }; From eb5a9f8d1d7c21d83363930a436c902d4e2b6855 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 27 May 2024 01:55:38 -0700 Subject: [PATCH 49/61] Neovim, filetype to string from boolean --- hmModules/apps/neovim/options.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hmModules/apps/neovim/options.lua b/hmModules/apps/neovim/options.lua index 9043756..dfa4906 100644 --- a/hmModules/apps/neovim/options.lua +++ b/hmModules/apps/neovim/options.lua @@ -2,7 +2,7 @@ vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' vim.opt.list = true -vim.bo.filetype = true +vim.bo.filetype = "on" vim.opt.updatetime = 300 -- Indentations From 3057ff1352b8b4f517b851ce385b486e30c7cace Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 27 May 2024 01:55:38 -0700 Subject: [PATCH 50/61] Hypr, Update settings for 0.40.0 Update refresh rate now that Nvidia Driver 555 is available Remove Cursor environment variable (no longer needed) Explicitly set which graphics card to use Add extra environment variable because everyone says to :))) --- hmModules/apps/hypr/nvidia.conf | 3 ++- hmModules/apps/hypr/settings.conf | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hmModules/apps/hypr/nvidia.conf b/hmModules/apps/hypr/nvidia.conf index 1271144..0e00cc7 100644 --- a/hmModules/apps/hypr/nvidia.conf +++ b/hmModules/apps/hypr/nvidia.conf @@ -3,4 +3,5 @@ env = LIBVA_DRIVER_NAME,nvidia env = XDG_SESSION_TYPE,wayland env = GBM_BACKEND,nvidia-drm env = __GLX_VENDOR_LIBRARY_NAME,nvidia -env = WLR_NO_HARDWARE_CURSORS,1 +env = WLR_RENDERER_ALLOW_SOFTWARE,1 +env = WLR_DRM_DEVICES,/dev/dri/card1 diff --git a/hmModules/apps/hypr/settings.conf b/hmModules/apps/hypr/settings.conf index ca95da9..bc2848c 100644 --- a/hmModules/apps/hypr/settings.conf +++ b/hmModules/apps/hypr/settings.conf @@ -1,5 +1,5 @@ # Monitor Settings -monitor=DP-2,2560x1440@60,0x0,1 +monitor=DP-2,2560x1440@144,0x0,1 monitor=DP-1,2560x1440@144,-2560x0,1 monitor=HDMI-A-1,disable From 26a879aa3aa81c717805b2bc2e0c0e802c3e9ed0 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 27 May 2024 01:55:38 -0700 Subject: [PATCH 51/61] Pan, add gnucash for financial management --- systems/pan/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/systems/pan/default.nix b/systems/pan/default.nix index ebe826b..5b5fa8c 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -71,5 +71,6 @@ ani-cli # Easy anime player lutgen # LUT generator prismlauncher # Minecraft launcher + gnucash # Personal Finance Manager ]; } From 3953f7f39b67d1fb517790485e544b2bf9640b57 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 27 May 2024 01:55:38 -0700 Subject: [PATCH 52/61] Git, add signing --- hmModules/apps/git/default.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hmModules/apps/git/default.nix b/hmModules/apps/git/default.nix index 0a87ff0..e164daa 100644 --- a/hmModules/apps/git/default.nix +++ b/hmModules/apps/git/default.nix @@ -14,6 +14,12 @@ enable = true; userName = config.git.username; userEmail = config.git.email; + extraConfig = { + user.signingkey = "${config.home.homeDirectory}/.ssh/id_ed25519.pub"; + gpg.format = "ssh"; + commit.gpgSign = "true"; + tag.gpgSign = "true"; + }; }; }; } From c3db864c6f9e20d5e8f2274efaccec32f2a2531e Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 5 Jun 2024 00:37:17 -0700 Subject: [PATCH 53/61] Pan, add java8 to play beta minecraft --- systems/pan/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 5b5fa8c..6562521 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -71,6 +71,7 @@ ani-cli # Easy anime player lutgen # LUT generator prismlauncher # Minecraft launcher + jdk8 # For playing older minecraft gnucash # Personal Finance Manager ]; } From dc662f82f010040ef234771a8f0a094408d37815 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 5 Jun 2024 00:43:23 -0700 Subject: [PATCH 54/61] Flake update 2024-06-05 --- flake.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/flake.lock b/flake.lock index d23225b..362a7a9 100644 --- a/flake.lock +++ b/flake.lock @@ -27,11 +27,11 @@ ] }, "locked": { - "lastModified": 1716736760, - "narHash": "sha256-h3RmnNknKYtVA+EvUSra6QAwfZjC2q1G8YA7W0gat8Y=", + "lastModified": 1717525419, + "narHash": "sha256-5z2422pzWnPXHgq2ms8lcCfttM0dz+hg+x1pCcNkAws=", "owner": "nix-community", "repo": "home-manager", - "rev": "5d151429e1e79107acf6d06dcc5ace4e642ec239", + "rev": "a7117efb3725e6197dd95424136f79147aa35e5b", "type": "github" }, "original": { @@ -81,11 +81,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1716669967, - "narHash": "sha256-wq91XpwR0tv7e7KwSp0qzvu31EMssznl8DzbNy4M4Hk=", + "lastModified": 1717509465, + "narHash": "sha256-ObX7qHLYwCDrKVi6Log7Uh3powuyR4lL/4txOiENpgI=", "ref": "refs/heads/main", - "rev": "553232a3e4c112c8511309e6b685cb614895e714", - "revCount": 4743, + "rev": "098ac916a6314a2b731532e0c85f357e3cf90d2f", + "revCount": 4762, "submodules": true, "type": "git", "url": "https://github.com/hyprwm/Hyprland" @@ -195,11 +195,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1716509168, - "narHash": "sha256-4zSIhSRRIoEBwjbPm3YiGtbd8HDWzFxJjw5DYSDy1n8=", + "lastModified": 1717196966, + "narHash": "sha256-yZKhxVIKd2lsbOqYd5iDoUIwsRZFqE87smE2Vzf6Ck0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bfb7a882678e518398ce9a31a881538679f6f092", + "rev": "57610d2f8f0937f39dbd72251e9614b1561942d8", "type": "github" }, "original": { From 07ce0cb9fee97439e25478bba8adf61a6e36805d Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 8 Jul 2024 01:11:04 -0700 Subject: [PATCH 55/61] Pan, add zoom for meetings ;-; --- systems/pan/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/systems/pan/default.nix b/systems/pan/default.nix index 6562521..c5473ff 100644 --- a/systems/pan/default.nix +++ b/systems/pan/default.nix @@ -73,5 +73,6 @@ prismlauncher # Minecraft launcher jdk8 # For playing older minecraft gnucash # Personal Finance Manager + zoom-us # Zoom ]; } From f2e9bf0fc233f744dc851f5d2a4fd1fc3a8942f5 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 15 Jul 2024 18:37:14 -0700 Subject: [PATCH 56/61] Flake update 2024-07-15, and hypr cachix fix --- flake.lock | 178 +++++++++++++++++++++++--------- flake.nix | 7 -- hmModules/apps/hypr/default.nix | 7 +- 3 files changed, 138 insertions(+), 54 deletions(-) diff --git a/flake.lock b/flake.lock index 362a7a9..b35f8a9 100644 --- a/flake.lock +++ b/flake.lock @@ -2,16 +2,14 @@ "nodes": { "ags": { "inputs": { - "nixpkgs": [ - "nixpkgs" - ] + "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1715703984, - "narHash": "sha256-0BZkMui6aCqswMCouvp0G90tAxDOxVnxTvG6TDZsDaI=", + "lastModified": 1721074762, + "narHash": "sha256-RhqFBMLh6G5vAo7Jz9mdsworI50E4FAAg7rPho4CNfY=", "owner": "Aylur", "repo": "ags", - "rev": "11150225e62462bcd431d1e55185e810190a730a", + "rev": "8194f0c9546a150525a2022c17aed51df1464b80", "type": "github" }, "original": { @@ -22,16 +20,14 @@ }, "home-manager": { "inputs": { - "nixpkgs": [ - "nixpkgs" - ] + "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1717525419, - "narHash": "sha256-5z2422pzWnPXHgq2ms8lcCfttM0dz+hg+x1pCcNkAws=", + "lastModified": 1720734513, + "narHash": "sha256-neWQ8eNtLTd+YMesb7WjKl1SVCbDyCm46LUgP/g/hdo=", "owner": "nix-community", "repo": "home-manager", - "rev": "a7117efb3725e6197dd95424136f79147aa35e5b", + "rev": "90ae324e2c56af10f20549ab72014804a3064c7f", "type": "github" }, "original": { @@ -56,11 +52,11 @@ ] }, "locked": { - "lastModified": 1716576411, - "narHash": "sha256-FIN1wMoyePBTtibCbaeJaoKNLuAYIGwLCWAYC1DJanw=", + "lastModified": 1720108799, + "narHash": "sha256-AxRkTJlbB8r7aG6gvc7IaLhc2T9TO4/8uqanKRxukBQ=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "57298fc4f13c807e50ada2c986a3114b7fc2e621", + "rev": "a5c0d57325c5f0814c39110a70ca19c070ae9486", "type": "github" }, "original": { @@ -73,19 +69,18 @@ "inputs": { "hyprcursor": "hyprcursor", "hyprlang": "hyprlang", + "hyprutils": "hyprutils", "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": [ - "nixpkgs" - ], + "nixpkgs": "nixpkgs_3", "systems": "systems", "xdph": "xdph" }, "locked": { - "lastModified": 1717509465, - "narHash": "sha256-ObX7qHLYwCDrKVi6Log7Uh3powuyR4lL/4txOiENpgI=", + "lastModified": 1721044084, + "narHash": "sha256-vO6wBIaInnyIQqmsKc28AsFSWeCFgnFilNhv2zoN/tU=", "ref": "refs/heads/main", - "rev": "098ac916a6314a2b731532e0c85f357e3cf90d2f", - "revCount": 4762, + "rev": "bd526822deb9ed47c0b51b534817aa8541fff07b", + "revCount": 4927, "submodules": true, "type": "git", "url": "https://github.com/hyprwm/Hyprland" @@ -98,16 +93,14 @@ }, "hyprland-contrib": { "inputs": { - "nixpkgs": [ - "nixpkgs" - ] + "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1716228712, - "narHash": "sha256-y+LOXuSRMfkR2Vfwl5K2NVrszi1h5MJpML+msLnVS8U=", + "lastModified": 1720709712, + "narHash": "sha256-78j/cY+AXoMIqqiNc1vWx237EPfpERAcYsb57ABUbwQ=", "owner": "hyprwm", "repo": "contrib", - "rev": "33b38358559054d316eb605ccb733980dfa7dc63", + "rev": "65d42dcbfde2229a75ccdb195c318dfe241f9ade", "type": "github" }, "original": { @@ -130,11 +123,11 @@ ] }, "locked": { - "lastModified": 1691753796, - "narHash": "sha256-zOEwiWoXk3j3+EoF3ySUJmberFewWlagvewDRuWYAso=", + "lastModified": 1718746314, + "narHash": "sha256-HUklK5u86w2Yh9dOkk4FdsL8eehcOZ95jPhLixGDRQY=", "owner": "hyprwm", "repo": "hyprland-protocols", - "rev": "0c2ce70625cb30aef199cb388f99e19a61a6ce03", + "rev": "1b61f0093afff20ab44d88ad707aed8bf2215290", "type": "github" }, "original": { @@ -144,6 +137,35 @@ } }, "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1720381373, + "narHash": "sha256-lyC/EZdHULsaAKVryK11lgHY9u6pXr7qR4irnxNWC7k=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "5df0174fd09de4ac5475233d65ffc703e89b82eb", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprutils": { "inputs": { "nixpkgs": [ "hyprland", @@ -155,16 +177,16 @@ ] }, "locked": { - "lastModified": 1716473782, - "narHash": "sha256-+qLn4lsHU6iL3+HTo1gTQ1tWzet8K9h+IfVemzEQZj8=", + "lastModified": 1720545076, + "narHash": "sha256-Pxacc2uoxI00koXp5+CyNqHOTQlqNlK0rlRHDBHX4+g=", "owner": "hyprwm", - "repo": "hyprlang", - "rev": "87d5d984109c839482b88b4795db073eb9ed446f", + "repo": "hyprutils", + "rev": "6174a2a25f4e216c0f1d0c4278adc23c476b1d09", "type": "github" }, "original": { "owner": "hyprwm", - "repo": "hyprlang", + "repo": "hyprutils", "type": "github" } }, @@ -180,11 +202,11 @@ ] }, "locked": { - "lastModified": 1716058375, - "narHash": "sha256-CwjWoVnBZE5SBpRx9dgSQGCr4Goxyfcyv3zZbOhVqzk=", + "lastModified": 1720215857, + "narHash": "sha256-JPdL+Qul+jEueAn8CARfcWP83eJgwkhMejQYfDvrgvU=", "owner": "hyprwm", "repo": "hyprwayland-scanner", - "rev": "3afed4364790aebe0426077631af1e164a9650cc", + "rev": "d5fa094ca27e0039be5e94c0a80ae433145af8bb", "type": "github" }, "original": { @@ -195,11 +217,75 @@ }, "nixpkgs": { "locked": { - "lastModified": 1717196966, - "narHash": "sha256-yZKhxVIKd2lsbOqYd5iDoUIwsRZFqE87smE2Vzf6Ck0=", + "lastModified": 1718714799, + "narHash": "sha256-FUZpz9rg3gL8NVPKbqU8ei1VkPLsTIfAJ2fdAf5qjak=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "57610d2f8f0937f39dbd72251e9614b1561942d8", + "rev": "c00d587b1a1afbf200b1d8f0b0e4ba9deb1c7f0e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1719848872, + "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1720542800, + "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "feb2849fdeb70028c70d73b848214b00d324a497", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1712163089, + "narHash": "sha256-Um+8kTIrC19vD4/lUCN9/cU9kcOsD1O1m+axJqQPyMM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fd281bd6b7d3e32ddfa399853946f782553163b5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1720957393, + "narHash": "sha256-oedh2RwpjEa+TNxhg5Je9Ch6d3W1NKi7DbRO1ziHemA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "693bc46d169f5af9c992095736e82c3488bf7dbb", "type": "github" }, "original": { @@ -214,7 +300,7 @@ "home-manager": "home-manager", "hyprland": "hyprland", "hyprland-contrib": "hyprland-contrib", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_5" } }, "systems": { @@ -249,11 +335,11 @@ ] }, "locked": { - "lastModified": 1716290197, - "narHash": "sha256-1u9Exrc7yx9qtES2brDh7/DDZ8w8ap1nboIOAtCgeuM=", + "lastModified": 1720194466, + "narHash": "sha256-Rizg9efi6ue95zOp0MeIV2ZedNo+5U9G2l6yirgBUnA=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "91e48d6acd8a5a611d26f925e51559ab743bc438", + "rev": "b9b97e5ba23fe7bd5fa4df54696102e8aa863cf6", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index b7142f0..aab3597 100644 --- a/flake.nix +++ b/flake.nix @@ -5,16 +5,9 @@ nixpkgs.url = "nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; - home-manager.inputs.nixpkgs.follows = "nixpkgs"; - hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; - hyprland.inputs.nixpkgs.follows = "nixpkgs"; - hyprland-contrib.url = "github:hyprwm/contrib"; - hyprland-contrib.inputs.nixpkgs.follows = "nixpkgs"; - ags.url = "github:Aylur/ags"; - ags.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { nixpkgs, home-manager, ... }@inputs: diff --git a/hmModules/apps/hypr/default.nix b/hmModules/apps/hypr/default.nix index b8372d6..45c67df 100644 --- a/hmModules/apps/hypr/default.nix +++ b/hmModules/apps/hypr/default.nix @@ -7,7 +7,12 @@ let rootPath = ./.; in imports = [ inputs.hyprland.homeManagerModules.default ]; - config = lib.mkIf config.hypr.enable { + config = { + nix.settings = { + substituters = ["https://hyprland.cachix.org"]; + trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="]; + }; + } // lib.mkIf config.hypr.enable { wayland.windowManager.hyprland = { enable = true; extraConfig = '' From 65282e05c952c7167fad90d6094c7b78e1d7d45d Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Sat, 12 Oct 2024 21:19:23 -0700 Subject: [PATCH 57/61] Global, Hypr, Systems, Flake update 2024-10-21 Refactored systems to be dependant on host. So that jibril and onizuka can have separate profiles. Doing this split up the systems/ folder, and also forced a flake update to test. This was done midway through the hypr rework, and would have been difficult to decouple, so I just did a big commit instead <3 Refactored the entire hypr system to use settings and nix rather than its native config. This is working and tested on Jibril, but is missing the scripts used for switching workspaces on Onizuka. --- flake.lock | 239 ++++++++++++++---- flake.nix | 5 +- hmModules/apps/default.nix | 1 + hmModules/apps/hypr/default.nix | 228 +++++++++++++++-- hmModules/apps/hypr/keybinds.conf | 48 ---- hmModules/apps/hypr/league_rules.conf | 25 -- hmModules/apps/hypr/nvidia.conf | 7 - hmModules/apps/hypr/scripts/initdb.xsh | 13 - hmModules/apps/hypr/settings.conf | 62 ----- hmModules/apps/hypr/window_rules.conf | 40 --- hmModules/apps/hypr/xwaylandvideobridge.conf | 5 - hmModules/apps/librewolf/default.nix | 2 + .../apps/terminal-emulators/kitty/default.nix | 2 + hmModules/services/home/default.nix | 5 + systems/jibril/default.nix | 110 ++++++++ systems/{pan => onizuka}/default.nix | 54 ++++ 16 files changed, 572 insertions(+), 274 deletions(-) delete mode 100644 hmModules/apps/hypr/keybinds.conf delete mode 100644 hmModules/apps/hypr/league_rules.conf delete mode 100644 hmModules/apps/hypr/nvidia.conf delete mode 100755 hmModules/apps/hypr/scripts/initdb.xsh delete mode 100644 hmModules/apps/hypr/settings.conf delete mode 100644 hmModules/apps/hypr/window_rules.conf delete mode 100644 hmModules/apps/hypr/xwaylandvideobridge.conf create mode 100644 systems/jibril/default.nix rename systems/{pan => onizuka}/default.nix (59%) diff --git a/flake.lock b/flake.lock index b35f8a9..4e753bc 100644 --- a/flake.lock +++ b/flake.lock @@ -2,14 +2,15 @@ "nodes": { "ags": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "systems": "systems" }, "locked": { - "lastModified": 1721074762, - "narHash": "sha256-RhqFBMLh6G5vAo7Jz9mdsworI50E4FAAg7rPho4CNfY=", + "lastModified": 1728326430, + "narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=", "owner": "Aylur", "repo": "ags", - "rev": "8194f0c9546a150525a2022c17aed51df1464b80", + "rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d", "type": "github" }, "original": { @@ -18,16 +19,87 @@ "type": "github" } }, + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1729527199, + "narHash": "sha256-D5/YksfRga8Akd04ZtIkuYSIOjXVrAzQIQBSeplokzU=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "8d732fa8aff8b12ef2b1e2f00fc8153e41312b72", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1720734513, - "narHash": "sha256-neWQ8eNtLTd+YMesb7WjKl1SVCbDyCm46LUgP/g/hdo=", + "lastModified": 1729551526, + "narHash": "sha256-7LAGY32Xl14OVQp3y6M43/0AtHYYvV6pdyBcp3eoz0s=", "owner": "nix-community", "repo": "home-manager", - "rev": "90ae324e2c56af10f20549ab72014804a3064c7f", + "rev": "5ec753a1fc4454df9285d8b3ec0809234defb975", "type": "github" }, "original": { @@ -52,11 +124,11 @@ ] }, "locked": { - "lastModified": 1720108799, - "narHash": "sha256-AxRkTJlbB8r7aG6gvc7IaLhc2T9TO4/8uqanKRxukBQ=", + "lastModified": 1728669738, + "narHash": "sha256-EDNAU9AYcx8OupUzbTbWE1d3HYdeG0wO6Msg3iL1muk=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "a5c0d57325c5f0814c39110a70ca19c070ae9486", + "rev": "0264e698149fcb857a66a53018157b41f8d97bb0", "type": "github" }, "original": { @@ -67,26 +139,27 @@ }, "hyprland": { "inputs": { + "aquamarine": "aquamarine", "hyprcursor": "hyprcursor", + "hyprland-protocols": "hyprland-protocols", "hyprlang": "hyprlang", "hyprutils": "hyprutils", "hyprwayland-scanner": "hyprwayland-scanner", "nixpkgs": "nixpkgs_3", - "systems": "systems", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems_2", "xdph": "xdph" }, "locked": { - "lastModified": 1721044084, - "narHash": "sha256-vO6wBIaInnyIQqmsKc28AsFSWeCFgnFilNhv2zoN/tU=", + "lastModified": 1729715559, + "narHash": "sha256-DigThx4MJv4tWEimqYzxymIZFUcTgQ3D1vZyG8FD9VA=", "ref": "refs/heads/main", - "rev": "bd526822deb9ed47c0b51b534817aa8541fff07b", - "revCount": 4927, - "submodules": true, + "rev": "cdac64970e894c3211d94da8925fbf905b52a594", + "revCount": 5369, "type": "git", "url": "https://github.com/hyprwm/Hyprland" }, "original": { - "submodules": true, "type": "git", "url": "https://github.com/hyprwm/Hyprland" } @@ -96,11 +169,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1720709712, - "narHash": "sha256-78j/cY+AXoMIqqiNc1vWx237EPfpERAcYsb57ABUbwQ=", + "lastModified": 1729224425, + "narHash": "sha256-w9dNUedNe2qnhHuhcRf7A1l29+/6DxdMfwN6g4U3c/w=", "owner": "hyprwm", "repo": "contrib", - "rev": "65d42dcbfde2229a75ccdb195c318dfe241f9ade", + "rev": "d72bc8b1cd30d448bd438e8328f8eeb4c0f2ddb6", "type": "github" }, "original": { @@ -113,21 +186,19 @@ "inputs": { "nixpkgs": [ "hyprland", - "xdph", "nixpkgs" ], "systems": [ "hyprland", - "xdph", "systems" ] }, "locked": { - "lastModified": 1718746314, - "narHash": "sha256-HUklK5u86w2Yh9dOkk4FdsL8eehcOZ95jPhLixGDRQY=", + "lastModified": 1728345020, + "narHash": "sha256-xGbkc7U/Roe0/Cv3iKlzijIaFBNguasI31ynL2IlEoM=", "owner": "hyprwm", "repo": "hyprland-protocols", - "rev": "1b61f0093afff20ab44d88ad707aed8bf2215290", + "rev": "a7c183800e74f337753de186522b9017a07a8cee", "type": "github" }, "original": { @@ -152,11 +223,11 @@ ] }, "locked": { - "lastModified": 1720381373, - "narHash": "sha256-lyC/EZdHULsaAKVryK11lgHY9u6pXr7qR4irnxNWC7k=", + "lastModified": 1728168612, + "narHash": "sha256-AnB1KfiXINmuiW7BALYrKqcjCnsLZPifhb/7BsfPbns=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "5df0174fd09de4ac5475233d65ffc703e89b82eb", + "rev": "f054f2e44d6a0b74607a6bc0f52dba337a3db38e", "type": "github" }, "original": { @@ -177,11 +248,11 @@ ] }, "locked": { - "lastModified": 1720545076, - "narHash": "sha256-Pxacc2uoxI00koXp5+CyNqHOTQlqNlK0rlRHDBHX4+g=", + "lastModified": 1728941256, + "narHash": "sha256-WRypmcZ2Bw94lLmcmxYokVOHPJSZ7T06V49QZ4tkZeQ=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "6174a2a25f4e216c0f1d0c4278adc23c476b1d09", + "rev": "fd4be8b9ca932f7384e454bcd923c5451ef2aa85", "type": "github" }, "original": { @@ -202,11 +273,11 @@ ] }, "locked": { - "lastModified": 1720215857, - "narHash": "sha256-JPdL+Qul+jEueAn8CARfcWP83eJgwkhMejQYfDvrgvU=", + "lastModified": 1726874836, + "narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=", "owner": "hyprwm", "repo": "hyprwayland-scanner", - "rev": "d5fa094ca27e0039be5e94c0a80ae433145af8bb", + "rev": "500c81a9e1a76760371049a8d99e008ea77aa59e", "type": "github" }, "original": { @@ -217,11 +288,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1718714799, - "narHash": "sha256-FUZpz9rg3gL8NVPKbqU8ei1VkPLsTIfAJ2fdAf5qjak=", + "lastModified": 1725634671, + "narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c00d587b1a1afbf200b1d8f0b0e4ba9deb1c7f0e", + "rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", "type": "github" }, "original": { @@ -231,13 +302,29 @@ "type": "github" } }, - "nixpkgs_2": { + "nixpkgs-stable": { "locked": { - "lastModified": 1719848872, - "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=", + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { @@ -249,11 +336,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1720542800, - "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=", + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "feb2849fdeb70028c70d73b848214b00d324a497", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", "type": "github" }, "original": { @@ -281,11 +368,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1720957393, - "narHash": "sha256-oedh2RwpjEa+TNxhg5Je9Ch6d3W1NKi7DbRO1ziHemA=", + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "693bc46d169f5af9c992095736e82c3488bf7dbb", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", "type": "github" }, "original": { @@ -294,6 +381,30 @@ "type": "indirect" } }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1729104314, + "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { "ags": "ags", @@ -318,13 +429,39 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, "xdph": { "inputs": { - "hyprland-protocols": "hyprland-protocols", + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], "hyprlang": [ "hyprland", "hyprlang" ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], "nixpkgs": [ "hyprland", "nixpkgs" @@ -335,11 +472,11 @@ ] }, "locked": { - "lastModified": 1720194466, - "narHash": "sha256-Rizg9efi6ue95zOp0MeIV2ZedNo+5U9G2l6yirgBUnA=", + "lastModified": 1728166987, + "narHash": "sha256-w6dVTguAn9zJ+7aPOhBQgDz8bn6YZ7b56cY8Kg5HJRI=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "b9b97e5ba23fe7bd5fa4df54696102e8aa863cf6", + "rev": "fb9c8d665af0588bb087f97d0f673ddf0d501787", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index aab3597..e1f211a 100644 --- a/flake.nix +++ b/flake.nix @@ -5,7 +5,7 @@ nixpkgs.url = "nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; - hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; + hyprland.url = "git+https://github.com/hyprwm/Hyprland"; hyprland-contrib.url = "github:hyprwm/contrib"; ags.url = "github:Aylur/ags"; }; @@ -22,6 +22,7 @@ ] ++ extraModules; }; in { - homeConfigurations.pan = defaultConfig [ ./systems/pan ]; + homeConfigurations."pan@onizuka" = defaultConfig [ ./systems/onizuka ]; + homeConfigurations."pan@jibril" = defaultConfig [ ./systems/jibril ]; }; } diff --git a/hmModules/apps/default.nix b/hmModules/apps/default.nix index 735a533..ef1c1b2 100644 --- a/hmModules/apps/default.nix +++ b/hmModules/apps/default.nix @@ -7,6 +7,7 @@ ./gimp ./git ./hypr + ./librewolf ./lutris ./media-viewers ./neovim diff --git a/hmModules/apps/hypr/default.nix b/hmModules/apps/hypr/default.nix index 45c67df..a28db98 100644 --- a/hmModules/apps/hypr/default.nix +++ b/hmModules/apps/hypr/default.nix @@ -3,51 +3,237 @@ let rootPath = ./.; in { options.hypr = { enable = lib.mkEnableOption "Enables hyprland"; + mod_key = lib.mkOption { default = "SUPER"; }; + monitor = { + details = lib.mkOption { default = []; }; + }; + workspace = { + workspaces = lib.mkOption { default = {}; }; + scratchpad.enable = lib.mkEnableOption "Enables a scratchpad"; + defaults = lib.mkOption { default = {}; }; + # primary-secondary = { + # enable = lib.mkEnableOption "Enables the primary-secondary navigation style"; + # primary = lib.mkOption { default = "DP-1"; }; + # secondary = lib.mkOption { default = "DP-2"; }; + # secondaries = lib.mkOption { default = []; }; + # }; + }; + windows.opaque = lib.mkOption { default = []; }; + background = { + enable = lib.mkEnableOption "Enables a wallpaper"; + path = lib.mkOption { default = ""; }; + }; + cursor = { + enable = lib.mkEnableOption "Enables custom cursor"; + theme = lib.mkOption { default = ""; }; + size = lib.mkOption { default = 64; }; + }; + xwayland.videobridge.enable = lib.mkEnableOption "Enable xwaylandvideobridge"; + mouse.sensitivity = lib.mkOption { default = 0; }; + master.mfact = lib.mkOption { default = 0.55; }; + polkit.enable = lib.mkEnableOption "Enables polkit agent"; + screenshot.enable = lib.mkEnableOption "Enables Screenshotting"; }; imports = [ inputs.hyprland.homeManagerModules.default ]; - config = { + config = let + lopts = lib.lists.optionals; + in { nix.settings = { substituters = ["https://hyprland.cachix.org"]; trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="]; }; } // lib.mkIf config.hypr.enable { - wayland.windowManager.hyprland = { + wayland.windowManager.hyprland = let + mod = config.hypr.mod_key; + # p-s = let + # chw = config.hypr.workspace; + # findDefaultWs = id: if (builtins.hasAttr id chw.workspaces) + # then (builtins.head (builtins.getAttr id chw.workspaces)) + # else ""; + # in with config.hypr.workspace; lib.mkIf primary-secondary.enable { + # primaryWs = findDefaultWs primary-secondary.primary; + # secondaryWs = findDefaultWs primary-secondary.secondary; + # }; + in { enable = true; - extraConfig = '' - ${builtins.readFile ./window_rules.conf} - ${builtins.readFile ./league_rules.conf} - ${builtins.readFile ./settings.conf} - ${builtins.readFile ./nvidia.conf} - ${builtins.readFile ./keybinds.conf} - ${builtins.readFile ./xwaylandvideobridge.conf} - exec-once=${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1 + settings = { + monitor = config.hypr.monitor.details; + workspace = let + wsMonitor = monitor: wrksps: map (ws: + if ws == (builtins.head wrksps) + then "name:"+ws+", monitor:"+monitor+", persistent:true, default:true" + else "name:"+ws+", monitor:"+monitor+", persistent:true" + ) wrksps; + makeRules = wsAttr: builtins.concatLists (builtins.attrValues ( + builtins.mapAttrs wsMonitor wsAttr + )); + in makeRules config.hypr.workspace.workspaces + ++ lopts config.hypr.workspace.scratchpad.enable [ + "special:scratch, on-created-empty: [float; size 50% 50%; center] ${config.defaultApps.terminal}" + ]; + input = { + accel_profile = "flat"; + sensitivity = config.hypr.mouse.sensitivity; + }; + general = { + gaps_in = 3; + gaps_out = 3; + border_size = 2; + "col.active_border" = "rgb(F5C2E7)"; + "col.inactive_border" = "rgb(1E1D2F)"; + layout = "master"; + }; + decoration = { + rounding = 2; + blur = { + enabled = true; + size = 12; + passes = 2; + special = true; + }; + }; + animation = [ + "windows, 1, 4, default, popin 50%" + "windowsOut, 1, 4, default, popin 50%" + "windowsMove, 1, 3, default" + "border, 1, 3, default" + "fade, 1, 3, default" + "workspaces, 1, 3, default" + ]; + master = { + no_gaps_when_only = 1; + mfact = config.hypr.master.mfact; + }; + misc = { + focus_on_activate = true; + }; - env = HYPRCURSOR_THEME,miku - env = HYPRCURSOR_SIZE,64 - ''; + exec-once = lopts config.hypr.polkit.enable [ + "${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1" + ] ++ lopts config.hypr.background.enable [ + "${pkgs.swww}/swww init" + "${pkgs.swww}/swww img ${config.hypr.background.path}" + ] ++ lopts config.ags.enable [ + "ags" + ] ++ lopts config.beeper.enable [ + "[workspace name:chat silent] Beeper" + ]; + + env = with config.hypr; [ + # "HYPR_MON_PRIMARY, ${workspace.primary-secondary.primary}" + # "HYPR_MON_SECONDARY, ${workspace.primary-secondary.secondary}" + "HYPR_WORK_DB, ${config.xdg.cacheHome}/hypr/workspace.db" + ] ++ lopts cursor.enable [ + "HYPRCURSOR_THEME,${cursor.theme}" + "HYPRCURSOR_SIZE,${cursor.size}" + ] ++ lopts config.nvidia.enable [ + "LIBVA_DRIVER_NAME,nvidia" + "XDG_SESSION_TYPE,wayland" + "GBM_BACKEND,nvidia-drm" + "__GLX_VENDOR_LIBRARY_NAME,nvidia" + "WLR_RENDERER_ALLOW_SOFTWARE,1" + "WLR_DRM_DEVICES,/dev/dri/card1" + ]; + + windowrulev2 = let + workspaceDefaults = wsname: applist: map ( + app: "workspace " + wsname + ", " + app + ) applist; + allDefault = wsAttr: builtins.concatLists (builtins.attrValues ( + builtins.mapAttrs workspaceDefaults wsAttr + )); + in allDefault config.hypr.workspace.defaults + ++ lopts config.hypr.xwayland.videobridge.enable [ + "opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$" + "noanim,class:^(xwaylandvideobridge)$" + "noinitialfocus,class:^(xwaylandvideobridge)$" + "maxsize 1 1,class:^(xwaylandvideobridge)$" + "noblur,class:^(xwaylandvideobridge)$" + ] ++ map (id: "opacity 1 override, " + id) config.hypr.windows.opaque + ++ [ + "opacity 0.94 fullscreen:0" + "opacity 0.79 override, class:^(${config.defaultApps.terminal})$" + ]; + + # 1, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh home + # 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web + # 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med + # 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game + # 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc + # _, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh hell + # TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh + # + # SHIFT, 1, movetoworkspacesilent, name:home + # SHIFT, 2, movetoworkspacesilent, name:web + # SHIFT, 3, movetoworkspacesilent, name:med + # SHIFT, 4, movetoworkspacesilent, name:game + # SHIFT, TAB, movetoworkspacesilent, r-1 + + bind = let + modPrefix = kb: if (lib.strings.hasPrefix "&" kb) + then ("${mod}" + kb) + else ("${mod}, " + kb); + in map modPrefix ([ + "return, exec, ${config.defaultApps.terminal}" + "&SHIFT, Q, exit" + "h, focusmonitor, l" + "l, focusmonitor, r" + "j, cyclenext," + "k, cyclenext, prev" + "&SHIFT, h, movecurrentworkspacetomonitor, -1" + "&SHIFT, l, movecurrentworkspacetomonitor, +1" + "&SHIFT, j, swapnext," + "&SHIFT, k, swapnext, prev" + "c, killactive" + "f, togglefloating" + "&SHIFT, f, fullscreen" + ] ++ (let + workspaces = builtins.concatLists ( + builtins.attrValues config.hypr.workspace.workspaces); + wsBinds = with builtins; wrksps: depth: if depth > (length wrksps) + then [] + else let ws = builtins.elemAt wrksps (depth -1); in [ + "${toString depth}, workspace, name:${ws}" + "&SHIFT, ${toString depth}, movetoworkspacesilent, name:${ws}" + ] ++ wsBinds wrksps (depth + 1); + in wsBinds workspaces 1) ++ lopts config.rofi.enable [ + "&SHIFT, return, exec, ${pkgs.rofi}/rofi -show run" + ] ++ lopts config.hypr.screenshot.enable [ + "P, exec, ${pkgs.grimblast}/grimblast --freeze copy area" + "&SHIFT, P, exec, ${pkgs.grimblast}/grimblast --freeze copysave area" + ] ++ lopts config.hypr.workspace.scratchpad.enable [ + "i, togglespecialworkspace, scratch" + ]); + + bindm = map (kb: "${mod}, " + kb) [ + "mouse:272, movewindow" + "mouse:273, movewindow" + ]; + }; }; + home.packages = with pkgs; [ - socat # For hyprland scripts - swww # Wallpaper engine wlr-randr # Xrandr for wayland wl-clipboard # Clipboard manager for wayland xdg-desktop-portal-hyprland # XDP for hyprland + ] ++ lopts config.hypr.xwayland.videobridge.enable [ + xwaylandvideobridge + ] ++ lopts config.hypr.cursor.enable [ + hyprcursor + ] ++ lopts config.hypr.screenshot.enable [ hyprpicker # Colorpicker, needed for screenshot tool - hyprcursor # Hyprland cursor - inputs.hyprland-contrib.packages.${pkgs.system}.grimblast # Screenshot tool - xonsh - polkit-kde-agent # Polkit handler + inputs.hyprland-contrib.packages.${pkgs.system}.grimblast ]; - # Hyprland screenshot tool + xdg.configFile."hypr-scripts" = { source = rootPath + "/scripts"; target = "hypr/scripts"; executable = true; }; - xdg.dataFile."hypr-icons" = { + xdg.dataFile."hypr-icons" = lib.mkIf config.hypr.cursor.enable { source = rootPath + "/icons"; target = "icons/"; recursive = true; diff --git a/hmModules/apps/hypr/keybinds.conf b/hmModules/apps/hypr/keybinds.conf deleted file mode 100644 index 06d307a..0000000 --- a/hmModules/apps/hypr/keybinds.conf +++ /dev/null @@ -1,48 +0,0 @@ -$mainMod = SUPER - -# Exec programs -bind = $mainMod, return, exec, kitty -bind = $mainMod SHIFT, return, exec, rofi -show run -bind = $mainMod, P, exec, grimblast --freeze copy area -bind = $mainMod SHIFT, P, exec, grimblast --freeze copysave area - -# Hyprland Management -bind = $mainMod SHIFT, Q, exit, - -# Workspace / Monitor Management -bind = $mainMod, h, focusmonitor, l -bind = $mainMod, l, focusmonitor, r -bind = $mainMod, j, cyclenext, -bind = $mainMod, k, cyclenext, prev -bind = $mainMod SHIFT, j, swapnext, -bind = $mainMod SHIFT, k, swapnext, prev -bind = $mainMod SHIFT, h, movecurrentworkspacetomonitor, -1 -bind = $mainMod SHIFT, l, movecurrentworkspacetomonitor, +1 - -bind = $mainMod, 1, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh home -bind = $mainMod, 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web -bind = $mainMod, 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med -bind = $mainMod, 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game -binde = $mainMod, 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc -binde = $mainMod, _, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh hell -binde = $mainMod, TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh - -bind = $mainMod, m, togglespecialworkspace, mus -bind = $mainMod, i, togglespecialworkspace, scratch - -# Window Management -bind = $mainMod, C, killactive, - -bind = $mainMod, F, togglefloating, -bind = $mainMod SHIFT, F, fullscreen, - -bind = $mainMod SHIFT, 1, movetoworkspacesilent, name:home -bind = $mainMod SHIFT, 2, movetoworkspacesilent, name:web -bind = $mainMod SHIFT, 3, movetoworkspacesilent, name:med -bind = $mainMod SHIFT, 4, movetoworkspacesilent, name:game -bind = $mainMod SHIFT, _, movetoworkspacesilent, name:hell -bind = $mainMod SHIFT, TAB, movetoworkspacesilent, r-1 - -# Move/resize windows with mainMod + LMB/RMB and dragging -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow diff --git a/hmModules/apps/hypr/league_rules.conf b/hmModules/apps/hypr/league_rules.conf deleted file mode 100644 index 5c573f0..0000000 --- a/hmModules/apps/hypr/league_rules.conf +++ /dev/null @@ -1,25 +0,0 @@ -# no opacity -windowrulev2 = opacity 1 1, class:^(league of legends.exe)$ # loading text -windowrulev2 = opacity 1 override, class:^(leagueclientux.exe)$ # client -windowrulev2 = opacity 1 override, class:^(leagueclient.exe)$ # game - -# nice loading text -windowrulev2 = noblur, class:^(leagueclient.exe)$ -windowrulev2 = noborder, class:^(leagueclient.exe)$ -windowrulev2 = nofocus, class:^(leagueclient.exe)$ -windowrulev2 = noshadow, class:^(leagueclient.exe)$ - -# windowrulev2 = immediate, class:^(league of legends.exe)$ -# windowrulev2 = immediate, class:^(overwatch.exe)$ -# windowrulev2 = immediate, class:^(steam_app_1384160)$ -windowrulev2 = fullscreen, class:^(overwatch.exe)$ -windowrulev2 = fullscreen, class:^(steam_app_1384160)$ -windowrulev2 = fullscreen, class:^(league of legends.exe)$ - -# workspaces -windowrule = workspace name:game, leagueclient.exe -windowrule = workspace name:game, leagueclientux.exe -windowrule = workspace name:game, league of legends.exe -windowrule = workspace name:game, overwatch.exe -windowrule = workspace name:game, 東方紅魔郷.exe -windowrule = workspace name:game, steam_app_1384160 diff --git a/hmModules/apps/hypr/nvidia.conf b/hmModules/apps/hypr/nvidia.conf deleted file mode 100644 index 0e00cc7..0000000 --- a/hmModules/apps/hypr/nvidia.conf +++ /dev/null @@ -1,7 +0,0 @@ -# Nivida Settings -env = LIBVA_DRIVER_NAME,nvidia -env = XDG_SESSION_TYPE,wayland -env = GBM_BACKEND,nvidia-drm -env = __GLX_VENDOR_LIBRARY_NAME,nvidia -env = WLR_RENDERER_ALLOW_SOFTWARE,1 -env = WLR_DRM_DEVICES,/dev/dri/card1 diff --git a/hmModules/apps/hypr/scripts/initdb.xsh b/hmModules/apps/hypr/scripts/initdb.xsh deleted file mode 100755 index 85bdad5..0000000 --- a/hmModules/apps/hypr/scripts/initdb.xsh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env xonsh -import shelve - -# Usage: -# ./initdb.xsh -# initialize a db for use hypr workspace scripts - -with shelve.open($HYPR_WORK_DB) as db: - db["primary"] = "home" - db["secondary"] = "chat" - db["secondaries"] = ["chat", "web", "med"] - db["secondary_extras"] = 1 - db["primary_extras"] = 1 diff --git a/hmModules/apps/hypr/settings.conf b/hmModules/apps/hypr/settings.conf deleted file mode 100644 index bc2848c..0000000 --- a/hmModules/apps/hypr/settings.conf +++ /dev/null @@ -1,62 +0,0 @@ -# Monitor Settings -monitor=DP-2,2560x1440@144,0x0,1 -monitor=DP-1,2560x1440@144,-2560x0,1 -monitor=HDMI-A-1,disable - -# Inits -exec-once = swww init -exec-once = swww img $HOME/med/pix/bg.png -exec-once = ags - -# Settings -input { - kb_layout = us - follow_mouse = 1 - accel_profile = flat - sensitivity = -0.52 - #sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. -} - -general { - gaps_in = 3 - gaps_out = 3 - border_size = 2 - col.active_border = rgb(F5C2E7) - col.inactive_border = rgb(1E1D2F) - - layout = master -} - -decoration { - rounding = 2 - blur { - enabled = true - size = 12 - passes = 2 - special = true - } - dim_special = 0.2 -} - -animations { - enabled = yes - - animation = windows, 1, 4, default, popin 50% - animation = windowsOut, 1, 4, default, popin 50% - animation = windowsMove, 1, 3, default - animation = border, 1, 3, default - animation = fade, 1, 3, default - animation = workspaces, 1, 3, default -} - -master { - no_gaps_when_only = true - new_is_master = false - mfact = 0.53 -} - -misc { - focus_on_activate = true - enable_swallow = false - swallow_regex = ^(Alacritty)$ -} diff --git a/hmModules/apps/hypr/window_rules.conf b/hmModules/apps/hypr/window_rules.conf deleted file mode 100644 index 57be0c8..0000000 --- a/hmModules/apps/hypr/window_rules.conf +++ /dev/null @@ -1,40 +0,0 @@ -env = HYPR_MON_PRIMARY, DP-2 -env = HYPR_MON_SECONDARY, DP-1 - -# Primaries -workspace=name:home, monitor:DP-2, persistent:true, default:true -workspace=name:game, monitor:DP-2, persistent:true -workspace=name:etc0, monitor:DP-2, persistent:true -workspace=name:hell, monitor:DP-2, persistent:true -# Secondaries -workspace=name:chat, monitor:DP-1, persistent:true, default:true -workspace=name:misc0, monitor:DP-1, persistent:true -# Switches -workspace=name:web , monitor:DP-1, persistent:true -workspace=name:med , monitor:DP-1, persistent:true -# Pseudo -workspace=special:mus, persistent:true -workspace=special:scratch, on-created-empty: [float; size 50% 50%; center] kitty - -windowrule = workspace name:web, librewolf -windowrulev2 = workspace name:med, librewolf,title:Picture-in-Picture -windowrule = workspace name:chat, discord -windowrule = workspace name:chat, Beeper -windowrule = workspace name:game, lutris -windowrule = workspace name:game, explorer.exe - -windowrulev2 = opacity 0.94 fullscreen:0 - -windowrulev2 = opacity 0.79 override, class:^(Alacritty)$ -windowrulev2 = opacity 0.79 override, class:^(kitty)$ -windowrulev2 = opacity 1 override, initialTitle:^(Discord Popout)$ -windowrulev2 = opacity 1 override, class:^(firefox)$ -windowrulev2 = opacity 1 override, class:^(Gimp)$ -windowrulev2 = opacity 1 override, class:^(feh)$ -windowrulev2 = opacity 1 override, class:^(mpv)$ - -env = HYPR_WORK_DB,$XDG_CACHE_HOME/hypr/workspace.db - -# exec-once = [workspace special:mus silent;float;size 70% 70%;center] mus client -exec-once = [workspace name:chat silent] vesktop -exec-once = [workspace name:chat silent] beeper diff --git a/hmModules/apps/hypr/xwaylandvideobridge.conf b/hmModules/apps/hypr/xwaylandvideobridge.conf deleted file mode 100644 index 4b77ad2..0000000 --- a/hmModules/apps/hypr/xwaylandvideobridge.conf +++ /dev/null @@ -1,5 +0,0 @@ -windowrulev2 = opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$ -windowrulev2 = noanim,class:^(xwaylandvideobridge)$ -windowrulev2 = noinitialfocus,class:^(xwaylandvideobridge)$ -windowrulev2 = maxsize 1 1,class:^(xwaylandvideobridge)$ -windowrulev2 = noblur,class:^(xwaylandvideobridge)$ diff --git a/hmModules/apps/librewolf/default.nix b/hmModules/apps/librewolf/default.nix index 7995cbb..f298127 100644 --- a/hmModules/apps/librewolf/default.nix +++ b/hmModules/apps/librewolf/default.nix @@ -3,6 +3,7 @@ { options.librewolf = { enable = lib.mkEnableOption "Enables librewolf"; + make_default = lib.mkEnableOption "Makes librewolf the default browser"; }; config = lib.mkIf config.librewolf.enable { @@ -12,5 +13,6 @@ home.sessionVariables = { BROWSER = "librewolf"; }; + defaultApps.browser = lib.mkIf config.librewolf.make_default "librewolf"; }; } diff --git a/hmModules/apps/terminal-emulators/kitty/default.nix b/hmModules/apps/terminal-emulators/kitty/default.nix index b4ae35a..23b8161 100644 --- a/hmModules/apps/terminal-emulators/kitty/default.nix +++ b/hmModules/apps/terminal-emulators/kitty/default.nix @@ -3,6 +3,7 @@ { options.kitty = { enable = lib.mkEnableOption "Enables kitty"; + make_default = lib.mkEnableOption "Makes kitty default terminal emulator"; font = lib.mkOption { default = ""; }; font_size = lib.mkOption { default = 18; }; }; @@ -17,5 +18,6 @@ confirm_os_window_close = 0; }; }; + defaultApps.terminal = lib.mkIf config.kitty.make_default "kitty"; }; } diff --git a/hmModules/services/home/default.nix b/hmModules/services/home/default.nix index bbb4cf2..7bf691a 100644 --- a/hmModules/services/home/default.nix +++ b/hmModules/services/home/default.nix @@ -3,6 +3,11 @@ { options = { extraPkgs = lib.mkOption { default = []; }; + nvidia.enable = lib.mkEnableOption "Enables nvidia requirements"; + defaultApps = { + terminal = lib.mkOption { default = ""; }; + browser = lib.mkOption { default = ""; }; + }; }; config = { diff --git a/systems/jibril/default.nix b/systems/jibril/default.nix new file mode 100644 index 0000000..109e666 --- /dev/null +++ b/systems/jibril/default.nix @@ -0,0 +1,110 @@ +{ config, ... }: + +{ + home.username = "pan"; + nixpkgs.config.allowUnfree = true; + home.stateVersion = "23.05"; + + hypr.enable = true; + hypr.monitor = { + details = [ + "eDP-2,2256x1504@60,0x0,1" + ]; + }; + hypr.workspace = { + workspaces = { + "eDP-1" = [ + "home" + "web" + "chat" + "med" + ]; + }; + scratchpad.enable = true; + defaults = { + "name:web" = [ "class:(librewolf)" ]; + "name:med" = [ "class:(librewolf),title:Picture-in-Picture" ]; + "name:chat" = [ "class:(Beeper)" ]; + }; + }; + hypr.windows.opaque = [ + "initialTitle:^(Discord Popout)$" + "class:^(firefox)$" + "class:^(Gimp)$" + "class:^(feh)$" + "class:^(mpv)$" + ]; + hypr.background = { + enable = true; + path = "${config.home.homeDirectory}/med/pix/bg.png"; + }; + # hypr.cursor = { + # enable = true; + # theme = "miku"; + # }; + hypr = { + screenshot.enable = true; + mouse.sensitivity = -0.52; + polkit.enable = true; + master.mfact = 0.53; + xwayland.videobridge.enable = true; + }; + # ags.enable = true; + rofi.enable = true; + + timer.enableHourly = true; + timer.enableQuarterly = true; + colors.enable = true; + manpages.enable = true; + trash.enable = true; + + fish.enable = true; + kitty.enable = true; + kitty.make_default = true; + kitty.font = "Cascadia Code"; + git.enable = true; + git.username = "Julia Lange"; + git.email = "public@julialange.org"; + ssh.enable = true; + librewolf.enable = true; + librewolf.make_default = true; + + mpv.enable = true; + zathura.enable = true; + feh.enable = true; + + neovim.enable = true; + neovim.languages = { + c.enable = true; + nix.enable = true; + rust.enable = true; + }; + neovim.plugins = { + comments.enable = true; + fugitive.enable = true; + lualine.enable = true; + luasnip.enable = true; + nvimcmp.enable = true; + telescope = { + enable = true; + fzf.enable = true; + }; + treesitter.enable = true; + wiki.enable = true; + }; + + lf.enable = true; + lf.hiddenfiles = [ + "${config.home.homeDirectory}/.librewolf" + "${config.home.homeDirectory}/.nix-defexpr" + "${config.home.homeDirectory}/.nix-profile" + "${config.home.homeDirectory}/.nv" + "${config.home.homeDirectory}/.pki" + ]; + zoxide.enable = true; + + gimp.enable = true; + + beeper.enable = true; + discord.enable = true; +} diff --git a/systems/pan/default.nix b/systems/onizuka/default.nix similarity index 59% rename from systems/pan/default.nix rename to systems/onizuka/default.nix index c5473ff..f59b05b 100644 --- a/systems/pan/default.nix +++ b/systems/onizuka/default.nix @@ -6,6 +6,57 @@ home.stateVersion = "23.05"; hypr.enable = true; + hypr.monitor = { + details = [ + "DP-2,2560x1440@144,0x0,1" + "DP-1,2560x1440@144,-2560x0,1" + "HDMI-A-1,disable" + ]; + primary = "DP-2"; + secondary = "DP-1"; + }; + hypr.workspace = { + workspaces = { + "DP-2" = [ + "home" + "web" + "med" + "game" + ]; + "DP-1" = [ + "chat" + ]; + }; + scratchpad.enable = true; + defaults = { + "name:web" = [ "librewolf" ]; + "name:med" = [ "librewolf,title:Picture-in-Picture" ]; + "name:chat" = [ "Beeper" ]; + "name:game" = [ "lutris" "explorer.exe" ]; + }; + }; + windows.opaque = [ + "initialTitle:^(Discord Popout)$" + "class:^(firefox)$" + "class:^(Gimp)$" + "class:^(feh)$" + "class:^(mpv)$" + ]; + hypr.background = { + enable = true; + path = "${config.home.homeDirectory}/med/pix/bg.png"; + }; + hypr.cursor = { + enable = true; + theme = "miku"; + }; + hypr = { + screenshot.enable = true; + mouse.sensitivity = -0.52; + polkit.enable = true; + master.mfact = 0.53; + xwayland.videobridge.enable = true; + }; ags.enable = true; rofi.enable = true; @@ -17,11 +68,14 @@ fish.enable = true; kitty.enable = true; + kitty.make_default = true; kitty.font = "Cascadia Code"; git.enable = true; git.username = "Julia Lange"; git.email = "public@julialange.org"; ssh.enable = true; + librewolf.enable = true; + librewolf.make_default = true; mpv.enable = true; zathura.enable = true; From d1dbda98cdb4239bbc8bd02d8ace5f28ab13c747 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Fri, 25 Oct 2024 10:51:21 -0700 Subject: [PATCH 58/61] Hypr, fix package nix store paths --- hmModules/apps/hypr/default.nix | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hmModules/apps/hypr/default.nix b/hmModules/apps/hypr/default.nix index a28db98..138e067 100644 --- a/hmModules/apps/hypr/default.nix +++ b/hmModules/apps/hypr/default.nix @@ -26,7 +26,7 @@ let rootPath = ./.; in cursor = { enable = lib.mkEnableOption "Enables custom cursor"; theme = lib.mkOption { default = ""; }; - size = lib.mkOption { default = 64; }; + size = lib.mkOption { default = "64"; }; }; xwayland.videobridge.enable = lib.mkEnableOption "Enable xwaylandvideobridge"; mouse.sensitivity = lib.mkOption { default = 0; }; @@ -111,10 +111,10 @@ let rootPath = ./.; in }; exec-once = lopts config.hypr.polkit.enable [ - "${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1" + "${pkgs.polkit-kde-agent}/bin/libexec/polkit-kde-authentication-agent-1" ] ++ lopts config.hypr.background.enable [ - "${pkgs.swww}/swww init" - "${pkgs.swww}/swww img ${config.hypr.background.path}" + "${pkgs.swww}/bin/swww-daemon" + "${pkgs.swww}/bin/swww img ${config.hypr.background.path}" ] ++ lopts config.ags.enable [ "ags" ] ++ lopts config.beeper.enable [ @@ -176,7 +176,7 @@ let rootPath = ./.; in then ("${mod}" + kb) else ("${mod}, " + kb); in map modPrefix ([ - "return, exec, ${config.defaultApps.terminal}" + "Return, exec, ${config.defaultApps.terminal}" "&SHIFT, Q, exit" "h, focusmonitor, l" "l, focusmonitor, r" @@ -199,10 +199,10 @@ let rootPath = ./.; in "&SHIFT, ${toString depth}, movetoworkspacesilent, name:${ws}" ] ++ wsBinds wrksps (depth + 1); in wsBinds workspaces 1) ++ lopts config.rofi.enable [ - "&SHIFT, return, exec, ${pkgs.rofi}/rofi -show run" + "&SHIFT, return, exec, ${pkgs.rofi}/bin/rofi -show run" ] ++ lopts config.hypr.screenshot.enable [ - "P, exec, ${pkgs.grimblast}/grimblast --freeze copy area" - "&SHIFT, P, exec, ${pkgs.grimblast}/grimblast --freeze copysave area" + "P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copy area" + "&SHIFT, P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copysave area" ] ++ lopts config.hypr.workspace.scratchpad.enable [ "i, togglespecialworkspace, scratch" ]); From b57482b98b2508a764efea51d9216892560d5a33 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Fri, 25 Oct 2024 11:17:42 -0700 Subject: [PATCH 59/61] Hypr, update from no_gaps_when_only --- hmModules/apps/hypr/default.nix | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/hmModules/apps/hypr/default.nix b/hmModules/apps/hypr/default.nix index 138e067..58a441a 100644 --- a/hmModules/apps/hypr/default.nix +++ b/hmModules/apps/hypr/default.nix @@ -70,6 +70,11 @@ let rootPath = ./.; in builtins.mapAttrs wsMonitor wsAttr )); in makeRules config.hypr.workspace.workspaces + ++ [ + "w[t1], gapsout:0, gapsin:0" + "w[tg1], gapsout:0, gapsin:0" + "f[1], gapsout:0, gapsin:0" + ] ++ lopts config.hypr.workspace.scratchpad.enable [ "special:scratch, on-created-empty: [float; size 50% 50%; center] ${config.defaultApps.terminal}" ]; @@ -103,7 +108,6 @@ let rootPath = ./.; in "workspaces, 1, 3, default" ]; master = { - no_gaps_when_only = 1; mfact = config.hypr.master.mfact; }; misc = { @@ -144,7 +148,15 @@ let rootPath = ./.; in allDefault = wsAttr: builtins.concatLists (builtins.attrValues ( builtins.mapAttrs workspaceDefaults wsAttr )); - in allDefault config.hypr.workspace.defaults + in allDefault config.hypr.workspace.defaults + ++ [ + "bordersize 0, floating:0, onworkspace:w[t1]" + "rounding 0, floating:0, onworkspace:w[t1]" + "bordersize 0, floating:0, onworkspace:w[tg1]" + "rounding 0, floating:0, onworkspace:w[tg1]" + "bordersize 0, floating:0, onworkspace:f[1]" + "rounding 0, floating:0, onworkspace:f[1]" + ] ++ lopts config.hypr.xwayland.videobridge.enable [ "opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$" "noanim,class:^(xwaylandvideobridge)$" From 7e81e09ca43b81a090f01fac9954f599b027d93e Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 11 Nov 2024 12:43:00 -0800 Subject: [PATCH 60/61] Hypr, move from xonsh to python3 --- hmModules/apps/hypr/scripts/changeprimary.py | 61 +++++++++++++++++++ hmModules/apps/hypr/scripts/changeprimary.xsh | 27 -------- .../apps/hypr/scripts/changesecondary.py | 36 +++++++++++ .../apps/hypr/scripts/changesecondary.xsh | 27 -------- 4 files changed, 97 insertions(+), 54 deletions(-) create mode 100755 hmModules/apps/hypr/scripts/changeprimary.py delete mode 100755 hmModules/apps/hypr/scripts/changeprimary.xsh create mode 100755 hmModules/apps/hypr/scripts/changesecondary.py delete mode 100755 hmModules/apps/hypr/scripts/changesecondary.xsh diff --git a/hmModules/apps/hypr/scripts/changeprimary.py b/hmModules/apps/hypr/scripts/changeprimary.py new file mode 100755 index 0000000..9b88129 --- /dev/null +++ b/hmModules/apps/hypr/scripts/changeprimary.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +import shelve +import os +import sys +import subprocess + +# Usage: +# ./changeprimary.xsh workspace +# changes to that workspace +# if workspace is "etc" then changes to etcN where N is a number + +def changeprimary(workspace, pmonitor, smonitor, dbpath): + current_primary = "" + current_secondary = "" + + with shelve.open(dbpath) as db: + current_primary = db.get("primary") + current_secondary = db.get("secondary") + + old_primary = current_primary + current_primary = workspace + + if current_primary == current_secondary: + workspaces = db.get("secondaries").copy() + if old_primary in workspaces: + current_secondary = old_primary + else: + current_secondary = workspaces[ + (workspaces.index(current_secondary)+1) % len(workspaces) + ] + + db["primary"] = current_primary + db["secondary"] = current_secondary + + subprocess.run([ + "hyprctl", "dispatch", "moveworkspacetomonitor", + "name:" + current_secondary, smonitor + ]) + subprocess.run([ + "hyprctl", "dispatch", "workspace", + "name:" + current_secondary + ]) + subprocess.run([ + "hyprctl", "dispatch", "moveworkspacetomonitor", + "name:" + current_primary, pmonitor + ]) + subprocess.run([ + "hyprctl", "dispatch", "workspace", + "name:" + current_primary + ]) + +if __name__ == "__main__": + try: + workspace=sys.argv[1] + primary_monitor=os.environ["HYPR_MON_PRIMARY"] + secondary_monitor=os.environ["HYPR_MON_SECONDARY"] + db=os.environ["HYPR_WORK_DB"] + changeprimary(workspace, primary_monitor, secondary_monitor, db) + except KeyError: + print("Please set HYPR_MON_PRIMARY and HYPR_WORK_DB") + sys.exit(1) diff --git a/hmModules/apps/hypr/scripts/changeprimary.xsh b/hmModules/apps/hypr/scripts/changeprimary.xsh deleted file mode 100755 index 9b7e0e7..0000000 --- a/hmModules/apps/hypr/scripts/changeprimary.xsh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env xonsh -import shelve - -# Usage: -# ./changeprimary.xsh workspace -# changes to that workspace -# if workspace is "etc" then changes to etcN where N is a number - -workspace=$ARG1 -monitor=$HYPR_MON_PRIMARY - -current_workspace = "home" - -with shelve.open($HYPR_WORK_DB) as db: - current_workspace = db.get("primary") - if workspace == "etc": - if current_workspace.startswith("etc"): - current = current_workspace[3:] % db.get("primary_extras") - current_workspace = "etc" + str(current) - else: - current_workspace = "etc0" - else: - current_workspace = workspace - db["primary"] = current_workspace - -hyprctl dispatch moveworkspacetomonitor name:@(current_workspace) $HYPR_MON_PRIMARY >> /dev/null -hyprctl dispatch workspace name:@(current_workspace) >> /dev/null diff --git a/hmModules/apps/hypr/scripts/changesecondary.py b/hmModules/apps/hypr/scripts/changesecondary.py new file mode 100755 index 0000000..2eb2b46 --- /dev/null +++ b/hmModules/apps/hypr/scripts/changesecondary.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +import shelve +import copy + +# Usage: +# ./changesecondary.xsh +# cycles through the secondary workspaces + +def cyclesecondary(monitor, dbpath): + current_secondary = "" + + with shelve.open(dbpath) as db: + workspaces = db.get("secondaries").copy() + current_primary = db.get("primary") + current_secondary = db.get("secondary") + + if current_primary in workspaces: + workspaces.remove(current_primary) + + current_secondary = workspaces[ + (workspaces.index(current_secondary)+1) % len(workspaces) + ] + db["secondary"] = current_secondary + + # Change primary to bind + hyprctl dispatch moveworkspacetomonitor name:@(current_secondary) $HYPR_MON_SECONDARY + hyprctl dispatch workspace name:@(current_secondary) + +if __name__ == "__main__": + try: + monitor=os.environ["HYPR_MON_SECONDARY"] + db=os.environ["HYPR_WORK_DB"] + cyclesecondary(monitor, db) + except KeyError: + print("Please set HYPR_MON_PRIMARY and HYPR_WORK_DB") + sys.exit(1) diff --git a/hmModules/apps/hypr/scripts/changesecondary.xsh b/hmModules/apps/hypr/scripts/changesecondary.xsh deleted file mode 100755 index b4cfdf9..0000000 --- a/hmModules/apps/hypr/scripts/changesecondary.xsh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env xonsh -import shelve -import copy - -# Usage: -# ./changesecondary.xsh -# cycles through the secondary workspaces - -current_secondary = "chat" - -with shelve.open($HYPR_WORK_DB) as db: - workspaces = db.get("secondaries").copy() - current_primary = db.get("primary") - current_secondary = db.get("secondary") - #extras = db.get("secondary_extras") - - if current_primary in workspaces: - workspaces.remove(current_primary) - - current_secondary = workspaces[ - (workspaces.index(current_secondary)+1) % len(workspaces) - ] - db["secondary"] = current_secondary - -# Change primary to bind -hyprctl dispatch moveworkspacetomonitor name:@(current_secondary) $HYPR_MON_SECONDARY -hyprctl dispatch workspace name:@(current_secondary) From 985a5ea6e6604f5d40bc49a1c6c1a6f82c6e9ecf Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 11 Nov 2024 12:43:38 -0800 Subject: [PATCH 61/61] pan@jibril, enable miku cursor --- systems/jibril/default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/systems/jibril/default.nix b/systems/jibril/default.nix index 109e666..f27a420 100644 --- a/systems/jibril/default.nix +++ b/systems/jibril/default.nix @@ -38,10 +38,10 @@ enable = true; path = "${config.home.homeDirectory}/med/pix/bg.png"; }; - # hypr.cursor = { - # enable = true; - # theme = "miku"; - # }; + hypr.cursor = { + enable = true; + theme = "miku"; + }; hypr = { screenshot.enable = true; mouse.sensitivity = -0.52;