From 8e8a483e97b76d1965dd67afc8af183255f55da3 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Fri, 14 Feb 2025 13:20:17 -0600 Subject: [PATCH] Formatting with nixfmt-rfc-style and setup nixd language server --- .helix/languages.toml | 9 + flake.nix | 33 +- lib/modules/home/default.nix | 3558 +++++++++-------- lib/templates/nix-flake/.helix/languages.toml | 2 +- lib/templates/nix-flake/flake.nix | 83 +- packages/checks/default.nix | 8 +- packages/shells/default.nix | 6 +- 7 files changed, 1903 insertions(+), 1796 deletions(-) create mode 100644 .helix/languages.toml diff --git a/.helix/languages.toml b/.helix/languages.toml new file mode 100644 index 0000000..0b818c8 --- /dev/null +++ b/.helix/languages.toml @@ -0,0 +1,9 @@ +[[language]] +auto-format = true +file-types = ["nix"] +name = "nix" +scope = "source.nix" + +[language.formatter] +args = ["-"] +command = "nixfmt" diff --git a/flake.nix b/flake.nix index 2617159..9e528c1 100644 --- a/flake.nix +++ b/flake.nix @@ -1,9 +1,12 @@ { - outputs = inputs: let - lib = import ./lib inputs; - in + outputs = + inputs: + let + lib = import ./lib inputs; + uGenPkgs = lib.genPkgs inputs.nixpkgs-unstable; + in { - packages = lib.genPkgs inputs.nixpkgs-unstable (import ./packages); + packages = uGenPkgs (import ./packages); nixosConfigurations = import ./packages/hosts inputs; # homeConfigurations = import ./packages/users; @@ -11,23 +14,26 @@ templates = import ./lib/templates; diskoConfigurations = import ./lib/disko inputs; - checks = import ./packages/checks; - devShells = import ./packages/shells; + checks = uGenPkgs (import ./packages/checks inputs); + devShells = uGenPkgs (import ./packages/shells inputs); nixosModules = import ./lib/modules/nixos inputs; homeManagerModules = import ./lib/modules/home inputs; # overlays = import ./lib/overlays inputs; - formatter = lib.genPkgs inputs.nixpkgs-unstable (p: p.nixfmt-rfc-style); + formatter = uGenPkgs (p: p.nixfmt-rfc-style); /* - TODO: nix-on-droid for phone terminal usage? mobile-nixos? - TODO: nix-darwin for work? - TODO: nixos ISO? + TODO: nix-on-droid for phone terminal usage? mobile-nixos? + TODO: nix-darwin for work? + TODO: nixos ISO? */ } - // (import ./nix/constants.nix inputs); + // (import ./nix/constants.nix inputs) + // { + flakeLib = lib; + }; inputs = { # stable inputs @@ -75,7 +81,10 @@ }; nixConfig = { - extra-experimental-features = ["nix-command" "flakes"]; + extra-experimental-features = [ + "nix-command" + "flakes" + ]; extra-substituters = [ "https://cache.nixos.org/" diff --git a/lib/modules/home/default.nix b/lib/modules/home/default.nix index 78c6817..758377a 100644 --- a/lib/modules/home/default.nix +++ b/lib/modules/home/default.nix @@ -1,8 +1,10 @@ -{self, ...}: let +{ self, ... }: +let inherit (self) outputs; inherit (outputs) homeManagerModules constants; inherit (constants) style; -in { +in +{ bat = { programs.bat = { enable = true; @@ -10,16 +12,16 @@ in { theme = "ansi"; }; /* - themes = { - "Catppuccin-mocha" = builtins.readFile (pkgs.fetchFromGitHub - { - owner = "catppuccin"; - repo = "bat"; - rev = "477622171ec0529505b0ca3cada68fc9433648c6"; - sha256 = "6WVKQErGdaqb++oaXnY3i6/GuH2FhTgK0v4TN4Y0Wbw="; - } - + "/Catppuccin-mocha.tmTheme"); - }; + themes = { + "Catppuccin-mocha" = builtins.readFile (pkgs.fetchFromGitHub + { + owner = "catppuccin"; + repo = "bat"; + rev = "477622171ec0529505b0ca3cada68fc9433648c6"; + sha256 = "6WVKQErGdaqb++oaXnY3i6/GuH2FhTgK0v4TN4Y0Wbw="; + } + + "/Catppuccin-mocha.tmTheme"); + }; */ }; @@ -28,228 +30,246 @@ in { }; }; - eww = {config, ...}: { - # programs.eww = { - # enable = true; - # }; + eww = + { config, ... }: + { + # programs.eww = { + # enable = true; + # }; - home.file.".config/eww".source = config.lib.file.mkOutOfStoreSymlink /etc/nixos/flake/modules/home-manager/eww; - }; - - mako = { - config, - pkgs, - ... - }: { - services.mako = { - enable = true; - extraConfig = with style.colors.withHashPrefix; '' - border-size=2 - border-radius=5 - padding=10,15 - max-visible=5 - default-timeout=15000 - font=Symbols Nerd Font ${toString style.font.size},${style.font.name} ${toString style.font.size} - anchor=top-right - on-notify=exec ${pkgs.mpv}/bin/mpv --volume=50 ~/.notify.wav - actions=1 - icons=1 - width=400 - height=150 - - background-color=${bg}DD - text-color=${text} - border-color=${primary} - progress-color=${primary} - - [urgency=high] - border-color=${urgent} - - [urgency=high] - background-color=${urgent}EE - border-color=${urgent} - text-color=${bg} - ''; + home.file.".config/eww".source = + config.lib.file.mkOutOfStoreSymlink /etc/nixos/flake/modules/home-manager/eww; }; - }; - tofi = { - config, - pkgs, - ... - }: { - programs.tofi = { - enable = true; - settings = { - font = "${pkgs.iosevkaLyteTerm}/share/fonts/truetype/IosevkaLyteTerm-regular.ttf"; - font-size = 12; - text-color = "#f8f8f8"; - prompt-color = "#f38ba8"; - selection-color = "#66d9ef"; - background-color = "#1e1e2e"; - outline-width = 0; - border-width = 1; - border-color = "#66d9ef"; - width = 640; - height = 400; + mako = + { + config, + pkgs, + ... + }: + { + services.mako = { + enable = true; + extraConfig = with style.colors.withHashPrefix; '' + border-size=2 + border-radius=5 + padding=10,15 + max-visible=5 + default-timeout=15000 + font=Symbols Nerd Font ${toString style.font.size},${style.font.name} ${toString style.font.size} + anchor=top-right + on-notify=exec ${pkgs.mpv}/bin/mpv --volume=50 ~/.notify.wav + actions=1 + icons=1 + width=400 + height=150 - fuzzy-match = "true"; + background-color=${bg}DD + text-color=${text} + border-color=${primary} + progress-color=${primary} + + [urgency=high] + border-color=${urgent} + + [urgency=high] + background-color=${urgent}EE + border-color=${urgent} + text-color=${bg} + ''; }; }; - }; - broot = {}; + tofi = + { + config, + pkgs, + ... + }: + { + programs.tofi = { + enable = true; + settings = { + font = "${pkgs.iosevkaLyteTerm}/share/fonts/truetype/IosevkaLyteTerm-regular.ttf"; + font-size = 12; + text-color = "#f8f8f8"; + prompt-color = "#f38ba8"; + selection-color = "#66d9ef"; + background-color = "#1e1e2e"; + outline-width = 0; + border-width = 1; + border-color = "#66d9ef"; + width = 640; + height = 400; - emacs = {pkgs, ...}: { - programs.emacs = { - enable = false; - /* - extraConfig = '' - ''; - */ - extraPackages = epkgs: (with epkgs; [ - magit - ]); - }; - - programs.fish = { - shellAliases = { - e = "emacs"; - }; - }; - }; - - cargo = {config, ...}: { - home.file."${config.home.homeDirectory}/.cargo/config.toml" = { - enable = true; - text = '' - [build] - rustdocflags = ["--default-theme=ayu"] - ''; - }; - - /* - home.sessionVariables = { - RUSTDOCFLAGS = "--default-theme=ayu"; - }; - */ - }; - - common = { - pkgs, - lib, - config, - ... - }: { - imports = with homeManagerModules; [ - # nix-colors.homeManagerModules.default - fish - bat - homeManagerModules.helix - git - jujutsu - zellij - htop - sshconfig - - /* - broot - nnn - tmux - */ - ]; - - programs.home-manager.enable = true; - - # services.ssh-agent.enable = true; - - home = { - username = lib.mkDefault "lytedev"; - homeDirectory = lib.mkDefault "/home/lytedev"; - stateVersion = lib.mkDefault "24.05"; - - sessionVariables = { - TERMINAL = "ghostty"; - EDITOR = "hx"; - VISUAL = "hx"; - PAGER = "less"; - MANPAGER = "less"; - }; - - packages = with pkgs; [ - # tools I use when editing nix code - # kanidm - nil - alejandra - gnupg - (pkgs.buildEnv { - name = "my-common-scripts"; - paths = [./scripts/common]; - }) - ]; - }; - - programs.direnv = { - enable = true; - nix-direnv.enable = true; - }; - - programs.skim = { - # https://github.com/lotabout/skim/issues/494 - enable = false; - enableFishIntegration = true; - defaultOptions = ["--no-clear-start" "--color=16" "--height=20"]; - }; - - programs.atuin = { - enable = true; - enableBashIntegration = config.programs.bash.enable; - enableFishIntegration = config.programs.fish.enable; - enableZshIntegration = config.programs.zsh.enable; - enableNushellIntegration = config.programs.nushell.enable; - - flags = [ - "--disable-up-arrow" - ]; - - settings = { - auto_sync = true; - sync_frequency = "1m"; - sync_address = "https://atuin.h.lyte.dev"; - keymap_mode = "vim-insert"; - inline_height = 20; - show_preview = true; - - sync = { - records = true; - }; - - dotfiles = { - enabled = true; + fuzzy-match = "true"; }; }; }; - programs.fzf = { - # using good ol' fzf until skim sucks less out of the box I guess - enable = true; + broot = { }; + + emacs = + { pkgs, ... }: + { + programs.emacs = { + enable = false; + /* + extraConfig = '' + ''; + */ + extraPackages = + epkgs: + (with epkgs; [ + magit + ]); + }; + + programs.fish = { + shellAliases = { + e = "emacs"; + }; + }; + }; + + cargo = + { config, ... }: + { + home.file."${config.home.homeDirectory}/.cargo/config.toml" = { + enable = true; + text = '' + [build] + rustdocflags = ["--default-theme=ayu"] + ''; + }; + /* - enableFishIntegration = true; - defaultCommand = "fd --type f"; - defaultOptions = ["--height 40%"]; - fileWidgetOptions = ["--preview 'head {}'"]; + home.sessionVariables = { + RUSTDOCFLAGS = "--default-theme=ayu"; + }; */ }; - # TODO: regular cron or something? - programs.nix-index = { - enable = true; + common = + { + pkgs, + lib, + config, + ... + }: + { + imports = with homeManagerModules; [ + # nix-colors.homeManagerModules.default + fish + bat + homeManagerModules.helix + git + jujutsu + zellij + htop + sshconfig - enableBashIntegration = config.programs.bash.enable; - enableFishIntegration = config.programs.fish.enable; - enableZshIntegration = config.programs.zsh.enable; + /* + broot + nnn + tmux + */ + ]; + + programs.home-manager.enable = true; + + # services.ssh-agent.enable = true; + + home = { + username = lib.mkDefault "lytedev"; + homeDirectory = lib.mkDefault "/home/lytedev"; + stateVersion = lib.mkDefault "24.05"; + + sessionVariables = { + TERMINAL = "ghostty"; + EDITOR = "hx"; + VISUAL = "hx"; + PAGER = "less"; + MANPAGER = "less"; + }; + + packages = with pkgs; [ + # tools I use when editing nix code + # kanidm + alejandra + gnupg + (pkgs.buildEnv { + name = "my-common-scripts"; + paths = [ ./scripts/common ]; + }) + ]; + }; + + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; + + programs.skim = { + # https://github.com/lotabout/skim/issues/494 + enable = false; + enableFishIntegration = true; + defaultOptions = [ + "--no-clear-start" + "--color=16" + "--height=20" + ]; + }; + + programs.atuin = { + enable = true; + enableBashIntegration = config.programs.bash.enable; + enableFishIntegration = config.programs.fish.enable; + enableZshIntegration = config.programs.zsh.enable; + enableNushellIntegration = config.programs.nushell.enable; + + flags = [ + "--disable-up-arrow" + ]; + + settings = { + auto_sync = true; + sync_frequency = "1m"; + sync_address = "https://atuin.h.lyte.dev"; + keymap_mode = "vim-insert"; + inline_height = 20; + show_preview = true; + + sync = { + records = true; + }; + + dotfiles = { + enabled = true; + }; + }; + }; + + programs.fzf = { + # using good ol' fzf until skim sucks less out of the box I guess + enable = true; + /* + enableFishIntegration = true; + defaultCommand = "fd --type f"; + defaultOptions = ["--height 40%"]; + fileWidgetOptions = ["--preview 'head {}'"]; + */ + }; + + # TODO: regular cron or something? + programs.nix-index = { + enable = true; + + enableBashIntegration = config.programs.bash.enable; + enableFishIntegration = config.programs.fish.enable; + enableZshIntegration = config.programs.zsh.enable; + }; }; - }; desktop = { imports = with homeManagerModules; [ @@ -260,42 +280,44 @@ in { # ewwbar = {}; - firefox = {pkgs, ...}: { - programs.firefox = { - /* - TODO: this should be able to work on macos, no? - TODO: enable color scheme/theme by default - */ - enable = true; - profiles = { - daniel = { - id = 0; - settings = { - "general.smoothScroll" = true; - "browser.zoom.siteSpecific" = true; + firefox = + { pkgs, ... }: + { + programs.firefox = { + /* + TODO: this should be able to work on macos, no? + TODO: enable color scheme/theme by default + */ + enable = true; + profiles = { + daniel = { + id = 0; + settings = { + "general.smoothScroll" = true; + "browser.zoom.siteSpecific" = true; + }; + + extraConfig = '' + user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); + // user_pref("full-screen-api.ignore-widgets", true); + user_pref("media.ffmpeg.vaapi.enabled", true); + user_pref("media.rdd-vpx.enabled", true); + ''; + + userChrome = '' + #webrtcIndicator { + display: none; + } + ''; + + /* + userContent = '' + ''; + */ }; - - extraConfig = '' - user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); - // user_pref("full-screen-api.ignore-widgets", true); - user_pref("media.ffmpeg.vaapi.enabled", true); - user_pref("media.rdd-vpx.enabled", true); - ''; - - userChrome = '' - #webrtcIndicator { - display: none; - } - ''; - - /* - userContent = '' - ''; - */ }; }; }; - }; firefox-no-tabs = { programs.firefox = { @@ -325,874 +347,914 @@ in { }; }; - fish = {pkgs, ...}: { - home = { - packages = [ - pkgs.gawk # used in prompt - ]; - }; - - programs.eza = { - enable = true; - }; - - programs.fish = { - enable = true; - # I load long scripts from files for a better editing experience - shellInit = builtins.readFile ./fish/shellInit.fish; - interactiveShellInit = builtins.readFile ./fish/interactiveShellInit.fish; - loginShellInit = ""; - functions = { - # TODO: I think these should be loaded from fish files too for better editor experience? - d = '' - # --wraps=cd --description "Quickly jump to NICE_HOME (or given relative or absolute path) and list files." - if count $argv > /dev/null - cd $argv - else - cd $NICE_HOME - end - la - ''; - - c = '' - if count $argv > /dev/null - cd $NICE_HOME && d $argv - else - d $NICE_HOME - end - ''; - - ltl = '' - set d $argv[1] . - set -l l "" - for f in $d[1]/* - if test -z $l; set l $f; continue; end - if command test $f -nt $l; and test ! -d $f - set l $f - end - end - echo $l - ''; - - has_command = "command --quiet --search $argv[1]"; - }; - shellAbbrs = {}; - shellAliases = { - # TODO: an alias that wraps `rm` such that if we run it without git committing first (when in a git repo) - ls = "eza --group-directories-first --classify"; - l = "ls"; - ll = "ls --long --group"; - la = "ll --all"; - lA = "la --all"; # --all twice to show . and .. - tree = "ls --tree --level=3"; - lt = "ll --sort=modified"; - lat = "la --sort=modified"; - lc = "lt --sort=accessed"; - lT = "lt --reverse"; - lC = "lc --reverse"; - lD = "la --only-dirs"; - "cd.." = "d .."; - "cdc" = "d $XDG_CONFIG_HOME"; - "cdn" = "d $NOTES_PATH"; - "cdl" = "d $XDG_DOWNLOAD_DIR"; - "cdg" = "d $XDG_GAMES_DIR"; - ".." = "d .."; - "..." = "d ../.."; - "...." = "d ../../.."; - "....." = "d ../../../.."; - "......" = "d ../../../../.."; - "......." = "d ../../../../../.."; - "........" = "d ../../../../../../.."; - "........." = "d ../../../../../../../.."; - p = "ping"; - dc = "docker compose"; - pc = "podman-compose"; - k = "kubectl"; - kg = "kubectl get"; - v = "$EDITOR"; - sv = "sudo $EDITOR"; - kssh = "kitty +kitten ssh"; - }; - }; - }; - - jujutsu = {...}: { - programs.jujutsu = { - enable = true; - settings = { - user = { - email = "daniel@lyte.dev"; - name = "Daniel Flanagan"; - }; - }; - }; - }; - - git = {lib, ...}: let - email = lib.mkDefault "daniel@lyte.dev"; - in { - programs.git = { - enable = true; - - userName = lib.mkDefault "Daniel Flanagan"; - userEmail = email; - - delta = { - enable = true; - options = {}; - }; - - lfs = { - enable = true; - }; - - /* - signing = { - signByDefault = false; - key = ~/.ssh/personal-ed25519; - }; - */ - - aliases = { - a = "add -A"; - ac = "commit -a"; - acm = "commit -a -m"; - c = "commit"; - cm = "commit -m"; - co = "checkout"; - - b = "rev-parse --symbolic-full-name HEAD"; - cnv = "commit --no-verify"; - cns = "commit --no-gpg-sign"; - cnvs = "commit --no-verify --no-gpg-sign"; - cnsv = "commit --no-verify --no-gpg-sign"; - - d = "diff"; - ds = "diff --staged"; - dt = "difftool"; - - f = "fetch"; - fa = "fetch --all"; - - l = "log --graph --abbrev-commit --decorate --oneline --all"; - plainlog = " log --pretty=format:'%h %ad%x09%an%x09%s' --date=short --decorate"; - ls = "ls-files"; - mm = "merge master"; - p = "push"; - pf = "push --force-with-lease"; - pl = "pull"; - rim = "rebase -i master"; - s = "status"; - }; - - # TODO: https://blog.scottlowe.org/2023/12/15/conditional-git-configuration/ - extraConfig = { - commit = { - verbose = true; - # gpgSign = true; - }; - - tag = { - # gpgSign = true; - sort = "version:refname"; - }; - - # include.path = local.gitconfig - - gpg.format = "ssh"; - log.date = "local"; - - init.defaultBranch = "main"; - - merge.conflictstyle = "zdiff3"; - - push.autoSetupRemote = true; - pull.ff = "only"; - - branch.autoSetupMerge = true; - - sendemail = { - smtpserver = "smtp.mailgun.org"; - smtpuser = email; - smtrpencryption = "tls"; - smtpserverport = 587; - }; - - url = { - # TODO: how to have per-machine not-in-git configuration? - "git@git.hq.bill.com:" = { - insteadOf = "https://git.hq.bill.com"; - }; - }; - }; - }; - - programs.fish.functions = { - g = { - wraps = "git"; - body = '' - if test (count $argv) -gt 0 - git $argv - else - git status - end - ''; - }; - lag = { - wraps = "g"; - body = '' - lA - g $argv - ''; - }; - }; - }; - - gnome = {pkgs, ...}: { - dconf = { - enable = true; - settings = { - "org/gnome/settings-daemon/plugins/media-keys" = { - screensaver = ["l"]; # lock screen - mic-mute = ["v"]; - }; - - "org/gnome/desktop/peripherals/keyboard" = { - # gnome key repeat - repeat-interval = 7; - delay = 200; - }; - "org/gnome/desktop/wm/preferences" = { - resize-with-right-button = true; - # mouse-button-modifier = ''; # default - }; - "org/gnome/desktop/wm/keybindings" = { - minimize = ["h"]; - show-desktop = ["d"]; - move-to-workspace-left = ["h"]; - move-to-workspace-right = ["l"]; - switch-to-workspace-left = ["h"]; - switch-to-workspace-right = ["l"]; - # mouse-button-modifier = ''; # default - }; - "org/gnome/desktop/interface" = { - show-battery-percentage = true; - clock-show-weekday = true; - font-name = "IosevkaLyteTerm 12"; - monospace-font-name = "IosevkaLyteTerm 12"; - color-scheme = "prefer-dark"; - # scaling-factor = 1.75; - }; - "org/gnome/mutter" = { - experimental-features = ["variable-refresh-rate"]; - }; - - "org/gnome/shell" = { - disable-user-extensions = false; - enabled-extensions = with pkgs.gnomeExtensions; [ - tiling-shell.extensionUuid - appindicator.extensionUuid - blur-my-shell.extensionUuid - ]; - }; - - "org/gnome/shell/extensions/tilingshell" = { - inner-gaps = 8; - outer-gaps = 8; - window-border-width = 2; - window-border-color = "rgba(116,199,236,0.47)"; - focus-window-right = ["l"]; - focus-window-left = ["h"]; - focus-window-up = ["k"]; - focus-window-down = ["j"]; - }; - }; - }; - - home.packages = with pkgs.gnomeExtensions; [ - tiling-shell - blur-my-shell - appindicator - ]; - - programs.gnome-shell = { - enable = true; - extensions = [{package = pkgs.gnomeExtensions.gsconnect;}]; - }; - - programs.firefox.package = pkgs.firefox.override { - nativeMessagingHosts = with pkgs; [bitwarden]; - }; - }; - - helix = { - config, - pkgs, - ... - }: { - # helix rust debugger stuff - # https://github.com/helix-editor/helix/wiki/Debugger-Configurations - home.file."${config.xdg.configHome}/lldb_vscode_rustc_primer.py" = { - text = '' - import subprocess - import pathlib - import lldb - - # Determine the sysroot for the active Rust interpreter - rustlib_etc = pathlib.Path(subprocess.getoutput('rustc --print sysroot')) / 'lib' / 'rustlib' / 'etc' - if not rustlib_etc.exists(): - raise RuntimeError('Unable to determine rustc sysroot') - - # Load lldb_lookup.py and execute lldb_commands with the correct path - lldb.debugger.HandleCommand(f"""command script import "{rustlib_etc / 'lldb_lookup.py'}" """) - lldb.debugger.HandleCommand(f"""command source -s 0 "{rustlib_etc / 'lldb_commands'}" """) - ''; - }; - - /* - NOTE: Currently, helix crashes when editing markdown in certain scenarios, - presumably due to an old markdown treesitter grammar - https://github.com/helix-editor/helix/issues/9011 - https://github.com/helix-editor/helix/issues/8821 - https://github.com/tree-sitter-grammars/tree-sitter-markdown/issues/114 - */ - - programs.helix = { - enable = true; - languages = { - language-server = { - lexical = { - command = "lexical"; - args = ["start"]; - }; - - /* - next-ls = { - command = "next-ls"; - args = ["--stdout"]; - }; - - deno = { - command = "deno"; - args = ["lsp"]; - config = { - enable = true; - lint = true; - unstable = true; - }; - }; - */ - }; - - language = [ - /* - { - name = "heex"; - scope = "source.heex"; - injection-regex = "heex"; - language-servers = ["lexical"]; # "lexical" "next-ls" ? - auto-format = true; - file-types = ["heex"]; - roots = ["mix.exs" "mix.lock"]; - indent = { - tab-width = 2; - unit = " "; - }; - } - { - name = "elixir"; - language-servers = ["lexical"]; # "lexical" "next-ls" ? - auto-format = true; - } - */ - { - name = "rust"; - - debugger = { - name = "lldb-vscode"; - transport = "stdio"; - command = "lldb-vscode"; - templates = [ - { - name = "binary"; - request = "launch"; - completion = [ - { - name = "binary"; - completion = "filename"; - } - ]; - args = { - program = "{0}"; - initCommands = ["command script import ${config.xdg.configHome}/lldb_vscode_rustc_primer.py"]; - }; - } - ]; - }; - } - { - name = "html"; - file-types = ["html"]; - scope = "source.html"; - auto-format = false; - } - { - name = "nix"; - file-types = ["nix"]; - scope = "source.nix"; - auto-format = true; - formatter = { - command = "alejandra"; - args = ["-"]; - }; - } - { - name = "fish"; - file-types = ["fish"]; - scope = "source.fish"; - auto-format = true; - indent = { - tab-width = 2; - unit = "\t"; - }; - } - { - name = "toml"; - file-types = ["toml"]; - scope = "source.toml"; - auto-format = true; - } - - /* - { - name = "javascript"; - language-id = "javascript"; - grammar = "javascript"; - scope = "source.js"; - injection-regex = "^(js|javascript)$"; - file-types = ["js" "mjs"]; - shebangs = ["deno"]; - language-servers = ["deno"]; - roots = ["deno.jsonc" "deno.json"]; - formatter = { - command = "deno"; - args = ["fmt"]; - }; - auto-format = true; - comment-token = "//"; - indent = { - tab-width = 2; - unit = "\t"; - }; - } - - { - name = "typescript"; - language-id = "typescript"; - grammar = "typescript"; - scope = "source.ts"; - injection-regex = "^(ts|typescript)$"; - file-types = ["ts"]; - shebangs = ["deno"]; - language-servers = ["deno"]; - roots = ["deno.jsonc" "deno.json"]; - formatter = { - command = "deno"; - args = ["fmt"]; - }; - auto-format = true; - comment-token = "//"; - indent = { - tab-width = 2; - unit = "\t"; - }; - } - - { - name = "jsonc"; - language-id = "json"; - grammar = "jsonc"; - scope = "source.jsonc"; - injection-regex = "^(jsonc)$"; - roots = ["deno.jsonc" "deno.json"]; - file-types = ["jsonc"]; - language-servers = ["deno"]; - indent = { - tab-width = 2; - unit = " "; - }; - auto-format = true; - } - */ + fish = + { pkgs, ... }: + { + home = { + packages = [ + pkgs.gawk # used in prompt ]; }; - settings = { - theme = "custom"; + programs.eza = { + enable = true; + }; - editor = { - soft-wrap.enable = true; - auto-pairs = false; - bufferline = "multiple"; - rulers = [81 121]; - cursorline = true; + programs.fish = { + enable = true; + # I load long scripts from files for a better editing experience + shellInit = builtins.readFile ./fish/shellInit.fish; + interactiveShellInit = builtins.readFile ./fish/interactiveShellInit.fish; + loginShellInit = ""; + functions = { + # TODO: I think these should be loaded from fish files too for better editor experience? + d = '' + # --wraps=cd --description "Quickly jump to NICE_HOME (or given relative or absolute path) and list files." + if count $argv > /dev/null + cd $argv + else + cd $NICE_HOME + end + la + ''; - /* - auto-save = false; - completion-trigger-len = 1; - color-modes = false; - scrolloff = 8; - */ + c = '' + if count $argv > /dev/null + cd $NICE_HOME && d $argv + else + d $NICE_HOME + end + ''; - inline-diagnostics = { - cursor-line = "hint"; - other-lines = "error"; - }; + ltl = '' + set d $argv[1] . + set -l l "" + for f in $d[1]/* + if test -z $l; set l $f; continue; end + if command test $f -nt $l; and test ! -d $f + set l $f + end + end + echo $l + ''; - cursor-shape = { - normal = "block"; - insert = "bar"; - select = "underline"; - }; + has_command = "command --quiet --search $argv[1]"; + }; + shellAbbrs = { }; + shellAliases = { + # TODO: an alias that wraps `rm` such that if we run it without git committing first (when in a git repo) + ls = "eza --group-directories-first --classify"; + l = "ls"; + ll = "ls --long --group"; + la = "ll --all"; + lA = "la --all"; # --all twice to show . and .. + tree = "ls --tree --level=3"; + lt = "ll --sort=modified"; + lat = "la --sort=modified"; + lc = "lt --sort=accessed"; + lT = "lt --reverse"; + lC = "lc --reverse"; + lD = "la --only-dirs"; + "cd.." = "d .."; + "cdc" = "d $XDG_CONFIG_HOME"; + "cdn" = "d $NOTES_PATH"; + "cdl" = "d $XDG_DOWNLOAD_DIR"; + "cdg" = "d $XDG_GAMES_DIR"; + ".." = "d .."; + "..." = "d ../.."; + "...." = "d ../../.."; + "....." = "d ../../../.."; + "......" = "d ../../../../.."; + "......." = "d ../../../../../.."; + "........" = "d ../../../../../../.."; + "........." = "d ../../../../../../../.."; + p = "ping"; + dc = "docker compose"; + pc = "podman-compose"; + k = "kubectl"; + kg = "kubectl get"; + v = "$EDITOR"; + sv = "sudo $EDITOR"; + kssh = "kitty +kitten ssh"; + }; + }; + }; - file-picker.hidden = false; - indent-guides = { - render = true; - character = "▏"; - }; - - lsp = { - display-messages = true; - # display-inlay-hints = true; - }; - statusline = { - separator = " "; - mode = { - "normal" = "N"; - "insert" = "I"; - "select" = "S"; - }; - left = [ - "file-name" - "mode" - /* - "selections" - "primary-selection-length" - "position" - "position-percentage" - */ - "spinner" - "diagnostics" - "workspace-diagnostics" - ]; - /* - center = ["file-name"]; - right = ["version-control" "total-line-numbers" "file-encoding"]; - */ + jujutsu = + { ... }: + { + programs.jujutsu = { + enable = true; + settings = { + user = { + email = "daniel@lyte.dev"; + name = "Daniel Flanagan"; }; }; - keys = { - insert = { - j = { - k = "normal_mode"; - j = "normal_mode"; - K = "normal_mode"; - J = "normal_mode"; - }; + }; + }; + + git = + { lib, ... }: + let + email = lib.mkDefault "daniel@lyte.dev"; + in + { + programs.git = { + enable = true; + + userName = lib.mkDefault "Daniel Flanagan"; + userEmail = email; + + delta = { + enable = true; + options = { }; + }; + + lfs = { + enable = true; + }; + + /* + signing = { + signByDefault = false; + key = ~/.ssh/personal-ed25519; + }; + */ + + aliases = { + a = "add -A"; + ac = "commit -a"; + acm = "commit -a -m"; + c = "commit"; + cm = "commit -m"; + co = "checkout"; + + b = "rev-parse --symbolic-full-name HEAD"; + cnv = "commit --no-verify"; + cns = "commit --no-gpg-sign"; + cnvs = "commit --no-verify --no-gpg-sign"; + cnsv = "commit --no-verify --no-gpg-sign"; + + d = "diff"; + ds = "diff --staged"; + dt = "difftool"; + + f = "fetch"; + fa = "fetch --all"; + + l = "log --graph --abbrev-commit --decorate --oneline --all"; + plainlog = " log --pretty=format:'%h %ad%x09%an%x09%s' --date=short --decorate"; + ls = "ls-files"; + mm = "merge master"; + p = "push"; + pf = "push --force-with-lease"; + pl = "pull"; + rim = "rebase -i master"; + s = "status"; + }; + + # TODO: https://blog.scottlowe.org/2023/12/15/conditional-git-configuration/ + extraConfig = { + commit = { + verbose = true; + # gpgSign = true; }; - normal = { - "C-k" = "jump_view_up"; - "C-j" = "jump_view_down"; - "C-h" = "jump_view_left"; - "C-l" = "jump_view_right"; - "C-q" = ":quit-all!"; - # "L" = "repeat_last_motion"; - space = { - q = ":reflow 80"; - Q = ":reflow 120"; - C = ":bc!"; - h = ":toggle lsp.display-inlay-hints"; - # O = ["select_textobject_inner WORD", ":pipe-to xargs xdg-open"]; - }; + tag = { + # gpgSign = true; + sort = "version:refname"; }; - select = { - space = { - q = ":reflow 80"; - Q = ":reflow 120"; + # include.path = local.gitconfig + + gpg.format = "ssh"; + log.date = "local"; + + init.defaultBranch = "main"; + + merge.conflictstyle = "zdiff3"; + + push.autoSetupRemote = true; + pull.ff = "only"; + + branch.autoSetupMerge = true; + + sendemail = { + smtpserver = "smtp.mailgun.org"; + smtpuser = email; + smtrpencryption = "tls"; + smtpserverport = 587; + }; + + url = { + # TODO: how to have per-machine not-in-git configuration? + "git@git.hq.bill.com:" = { + insteadOf = "https://git.hq.bill.com"; }; - # "L" = "repeat_last_motion"; }; }; }; - themes = with style.colors.withHashPrefix; { - custom = { - "type" = orange; + programs.fish.functions = { + g = { + wraps = "git"; + body = '' + if test (count $argv) -gt 0 + git $argv + else + git status + end + ''; + }; + lag = { + wraps = "g"; + body = '' + lA + g $argv + ''; + }; + }; + }; - "constructor" = blue; - - "constant" = orange; - "constant.builtin" = orange; - "constant.character" = yellow; - "constant.character.escape" = orange; - - "string" = green; - "string.regexp" = orange; - "string.special" = blue; - - "comment" = { - fg = fgdim; - modifiers = ["italic"]; + gnome = + { pkgs, ... }: + { + dconf = { + enable = true; + settings = { + "org/gnome/settings-daemon/plugins/media-keys" = { + screensaver = [ "l" ]; # lock screen + mic-mute = [ "v" ]; }; - "variable" = text; - "variable.parameter" = { - fg = red; - modifiers = ["italic"]; + "org/gnome/desktop/peripherals/keyboard" = { + # gnome key repeat + repeat-interval = 7; + delay = 200; }; - "variable.builtin" = red; - "variable.other.member" = text; - - "label" = blue; - - "punctuation" = fgdim; - "punctuation.special" = blue; - - "keyword" = purple; - "keyword.storage.modifier.ref" = yellow; - "keyword.control.conditional" = { - fg = purple; - modifiers = ["italic"]; + "org/gnome/desktop/wm/preferences" = { + resize-with-right-button = true; + # mouse-button-modifier = ''; # default + }; + "org/gnome/desktop/wm/keybindings" = { + minimize = [ "h" ]; + show-desktop = [ "d" ]; + move-to-workspace-left = [ "h" ]; + move-to-workspace-right = [ "l" ]; + switch-to-workspace-left = [ "h" ]; + switch-to-workspace-right = [ "l" ]; + # mouse-button-modifier = ''; # default + }; + "org/gnome/desktop/interface" = { + show-battery-percentage = true; + clock-show-weekday = true; + font-name = "IosevkaLyteTerm 12"; + monospace-font-name = "IosevkaLyteTerm 12"; + color-scheme = "prefer-dark"; + # scaling-factor = 1.75; + }; + "org/gnome/mutter" = { + experimental-features = [ "variable-refresh-rate" ]; }; - "operator" = blue; - - "function" = blue; - "function.macro" = purple; - - "tag" = purple; - "attribute" = blue; - - "namespace" = { - fg = blue; - modifiers = ["italic"]; + "org/gnome/shell" = { + disable-user-extensions = false; + enabled-extensions = with pkgs.gnomeExtensions; [ + tiling-shell.extensionUuid + appindicator.extensionUuid + blur-my-shell.extensionUuid + ]; }; - "special" = blue; + "org/gnome/shell/extensions/tilingshell" = { + inner-gaps = 8; + outer-gaps = 8; + window-border-width = 2; + window-border-color = "rgba(116,199,236,0.47)"; + focus-window-right = [ "l" ]; + focus-window-left = [ "h" ]; + focus-window-up = [ "k" ]; + focus-window-down = [ "j" ]; + }; + }; + }; - "markup.heading.marker" = { - fg = orange; - modifiers = ["bold"]; - }; - "markup.heading.1" = blue; - "markup.heading.2" = yellow; - "markup.heading.3" = green; - "markup.heading.4" = orange; - "markup.heading.5" = red; - "markup.heading.6" = fg3; - "markup.list" = purple; - "markup.bold" = {modifiers = ["bold"];}; - "markup.italic" = {modifiers = ["italic"];}; - "markup.strikethrough" = {modifiers = ["crossed_out"];}; - "markup.link.url" = { - fg = red; - modifiers = ["underlined"]; - }; - "markup.link.text" = blue; - "markup.raw" = red; + home.packages = with pkgs.gnomeExtensions; [ + tiling-shell + blur-my-shell + appindicator + ]; - "diff.plus" = green; - "diff.minus" = red; - "diff.delta" = blue; + programs.gnome-shell = { + enable = true; + extensions = [ { package = pkgs.gnomeExtensions.gsconnect; } ]; + }; - "ui.linenr" = {fg = fgdim;}; - "ui.linenr.selected" = {fg = fg2;}; + programs.firefox.package = pkgs.firefox.override { + nativeMessagingHosts = with pkgs; [ bitwarden ]; + }; + }; - "ui.statusline" = { - fg = fgdim; - bg = bg; - }; - "ui.statusline.inactive" = { - fg = fg3; - bg = bg2; - }; - "ui.statusline.normal" = { - fg = bg; - bg = purple; - modifiers = ["bold"]; - }; - "ui.statusline.insert" = { - fg = bg; - bg = green; - modifiers = ["bold"]; - }; - "ui.statusline.select" = { - fg = bg; - bg = red; - modifiers = ["bold"]; + helix = + { + config, + pkgs, + ... + }: + { + # helix rust debugger stuff + # https://github.com/helix-editor/helix/wiki/Debugger-Configurations + home.file."${config.xdg.configHome}/lldb_vscode_rustc_primer.py" = { + text = '' + import subprocess + import pathlib + import lldb + + # Determine the sysroot for the active Rust interpreter + rustlib_etc = pathlib.Path(subprocess.getoutput('rustc --print sysroot')) / 'lib' / 'rustlib' / 'etc' + if not rustlib_etc.exists(): + raise RuntimeError('Unable to determine rustc sysroot') + + # Load lldb_lookup.py and execute lldb_commands with the correct path + lldb.debugger.HandleCommand(f"""command script import "{rustlib_etc / 'lldb_lookup.py'}" """) + lldb.debugger.HandleCommand(f"""command source -s 0 "{rustlib_etc / 'lldb_commands'}" """) + ''; + }; + + /* + NOTE: Currently, helix crashes when editing markdown in certain scenarios, + presumably due to an old markdown treesitter grammar + https://github.com/helix-editor/helix/issues/9011 + https://github.com/helix-editor/helix/issues/8821 + https://github.com/tree-sitter-grammars/tree-sitter-markdown/issues/114 + */ + + programs.helix = { + enable = true; + languages = { + language-server = { + lexical = { + command = "lexical"; + args = [ "start" ]; + }; + + /* + next-ls = { + command = "next-ls"; + args = ["--stdout"]; + }; + + deno = { + command = "deno"; + args = ["lsp"]; + config = { + enable = true; + lint = true; + unstable = true; + }; + }; + */ }; - "ui.popup" = { - fg = text; - bg = bg2; - }; - "ui.window" = {fg = fgdim;}; - "ui.help" = { - fg = fg2; - bg = bg2; - }; + language = [ + /* + { + name = "heex"; + scope = "source.heex"; + injection-regex = "heex"; + language-servers = ["lexical"]; # "lexical" "next-ls" ? + auto-format = true; + file-types = ["heex"]; + roots = ["mix.exs" "mix.lock"]; + indent = { + tab-width = 2; + unit = " "; + }; + } + { + name = "elixir"; + language-servers = ["lexical"]; # "lexical" "next-ls" ? + auto-format = true; + } + */ + { + name = "rust"; - "ui.bufferline" = { - fg = fgdim; - bg = bg2; - }; - "ui.bufferline.background" = {bg = bg2;}; + debugger = { + name = "lldb-vscode"; + transport = "stdio"; + command = "lldb-vscode"; + templates = [ + { + name = "binary"; + request = "launch"; + completion = [ + { + name = "binary"; + completion = "filename"; + } + ]; + args = { + program = "{0}"; + initCommands = [ "command script import ${config.xdg.configHome}/lldb_vscode_rustc_primer.py" ]; + }; + } + ]; + }; + } + { + name = "html"; + file-types = [ "html" ]; + scope = "source.html"; + auto-format = false; + } + { + name = "nix"; + file-types = [ "nix" ]; + scope = "source.nix"; + auto-format = true; + formatter = { + command = "alejandra"; + args = [ "-" ]; + }; + } + { + name = "fish"; + file-types = [ "fish" ]; + scope = "source.fish"; + auto-format = true; + indent = { + tab-width = 2; + unit = "\t"; + }; + } + { + name = "toml"; + file-types = [ "toml" ]; + scope = "source.toml"; + auto-format = true; + } - "ui.text" = text; - "ui.text.focus" = { - fg = text; - bg = bg3; - modifiers = ["bold"]; - }; - "ui.text.inactive" = {fg = fg2;}; + /* + { + name = "javascript"; + language-id = "javascript"; + grammar = "javascript"; + scope = "source.js"; + injection-regex = "^(js|javascript)$"; + file-types = ["js" "mjs"]; + shebangs = ["deno"]; + language-servers = ["deno"]; + roots = ["deno.jsonc" "deno.json"]; + formatter = { + command = "deno"; + args = ["fmt"]; + }; + auto-format = true; + comment-token = "//"; + indent = { + tab-width = 2; + unit = "\t"; + }; + } - "ui.virtual" = fg2; - "ui.virtual.ruler" = {bg = bg3;}; - "ui.virtual.indent-guide" = bg3; - "ui.virtual.inlay-hint" = { - fg = bg3; - bg = bg; - }; + { + name = "typescript"; + language-id = "typescript"; + grammar = "typescript"; + scope = "source.ts"; + injection-regex = "^(ts|typescript)$"; + file-types = ["ts"]; + shebangs = ["deno"]; + language-servers = ["deno"]; + roots = ["deno.jsonc" "deno.json"]; + formatter = { + command = "deno"; + args = ["fmt"]; + }; + auto-format = true; + comment-token = "//"; + indent = { + tab-width = 2; + unit = "\t"; + }; + } - "ui.selection" = {bg = bg5;}; + { + name = "jsonc"; + language-id = "json"; + grammar = "jsonc"; + scope = "source.jsonc"; + injection-regex = "^(jsonc)$"; + roots = ["deno.jsonc" "deno.json"]; + file-types = ["jsonc"]; + language-servers = ["deno"]; + indent = { + tab-width = 2; + unit = " "; + }; + auto-format = true; + } + */ + ]; + }; - "ui.cursor" = { - fg = bg; - bg = text; - }; - "ui.cursor.primary" = { - fg = bg; - bg = red; - }; - "ui.cursor.match" = { - fg = orange; - modifiers = ["bold"]; - }; + settings = { + theme = "custom"; - "ui.cursor.primary.normal" = { - fg = bg; - bg = text; - }; - "ui.cursor.primary.insert" = { - fg = bg; - bg = text; - }; - "ui.cursor.primary.select" = { - fg = bg; - bg = text; - }; + editor = { + soft-wrap.enable = true; + auto-pairs = false; + bufferline = "multiple"; + rulers = [ + 81 + 121 + ]; + cursorline = true; - "ui.cursor.normal" = { - fg = bg; - bg = fg; - }; - "ui.cursor.insert" = { - fg = bg; - bg = fg; - }; - "ui.cursor.select" = { - fg = bg; - bg = fg; - }; + /* + auto-save = false; + completion-trigger-len = 1; + color-modes = false; + scrolloff = 8; + */ - "ui.cursorline.primary" = {bg = bg3;}; + inline-diagnostics = { + cursor-line = "hint"; + other-lines = "error"; + }; - "ui.highlight" = { - bg = bg3; - fg = bg; - modifiers = ["bold"]; - }; + cursor-shape = { + normal = "block"; + insert = "bar"; + select = "underline"; + }; - "ui.menu" = { - fg = fg3; - bg = bg2; - }; - "ui.menu.selected" = { - fg = text; - bg = bg3; - modifiers = ["bold"]; - }; + file-picker.hidden = false; + indent-guides = { + render = true; + character = "▏"; + }; - "diagnostic.error" = { - underline = { - color = red; - style = "curl"; + lsp = { + display-messages = true; + # display-inlay-hints = true; + }; + statusline = { + separator = " "; + mode = { + "normal" = "N"; + "insert" = "I"; + "select" = "S"; + }; + left = [ + "file-name" + "mode" + /* + "selections" + "primary-selection-length" + "position" + "position-percentage" + */ + "spinner" + "diagnostics" + "workspace-diagnostics" + ]; + /* + center = ["file-name"]; + right = ["version-control" "total-line-numbers" "file-encoding"]; + */ }; }; - "diagnostic.warning" = { - underline = { - color = orange; - style = "curl"; + keys = { + insert = { + j = { + k = "normal_mode"; + j = "normal_mode"; + K = "normal_mode"; + J = "normal_mode"; + }; + }; + + normal = { + "C-k" = "jump_view_up"; + "C-j" = "jump_view_down"; + "C-h" = "jump_view_left"; + "C-l" = "jump_view_right"; + "C-q" = ":quit-all!"; + # "L" = "repeat_last_motion"; + space = { + q = ":reflow 80"; + Q = ":reflow 120"; + C = ":bc!"; + h = ":toggle lsp.display-inlay-hints"; + # O = ["select_textobject_inner WORD", ":pipe-to xargs xdg-open"]; + }; + }; + + select = { + space = { + q = ":reflow 80"; + Q = ":reflow 120"; + }; + # "L" = "repeat_last_motion"; }; }; - "diagnostic.info" = { - underline = { - color = blue; - style = "curl"; + }; + + themes = with style.colors.withHashPrefix; { + custom = { + "type" = orange; + + "constructor" = blue; + + "constant" = orange; + "constant.builtin" = orange; + "constant.character" = yellow; + "constant.character.escape" = orange; + + "string" = green; + "string.regexp" = orange; + "string.special" = blue; + + "comment" = { + fg = fgdim; + modifiers = [ "italic" ]; }; - }; - "diagnostic.hint" = { - underline = { - color = blue; - style = "curl"; + + "variable" = text; + "variable.parameter" = { + fg = red; + modifiers = [ "italic" ]; }; - }; + "variable.builtin" = red; + "variable.other.member" = text; - error = red; - warning = orange; - info = blue; - hint = yellow; - "ui.background" = { - bg = bg; - fg = fgdim; - }; + "label" = blue; - /* - "ui.cursorline.primary" = { bg = "default" } - "ui.cursorline.secondary" = { bg = "default" } - */ - "ui.cursorcolumn.primary" = {bg = bg3;}; - "ui.cursorcolumn.secondary" = {bg = bg3;}; + "punctuation" = fgdim; + "punctuation.special" = blue; - "ui.bufferline.active" = { - fg = primary; - bg = bg3; - underline = { - color = primary; - style = ""; + "keyword" = purple; + "keyword.storage.modifier.ref" = yellow; + "keyword.control.conditional" = { + fg = purple; + modifiers = [ "italic" ]; + }; + + "operator" = blue; + + "function" = blue; + "function.macro" = purple; + + "tag" = purple; + "attribute" = blue; + + "namespace" = { + fg = blue; + modifiers = [ "italic" ]; + }; + + "special" = blue; + + "markup.heading.marker" = { + fg = orange; + modifiers = [ "bold" ]; + }; + "markup.heading.1" = blue; + "markup.heading.2" = yellow; + "markup.heading.3" = green; + "markup.heading.4" = orange; + "markup.heading.5" = red; + "markup.heading.6" = fg3; + "markup.list" = purple; + "markup.bold" = { + modifiers = [ "bold" ]; + }; + "markup.italic" = { + modifiers = [ "italic" ]; + }; + "markup.strikethrough" = { + modifiers = [ "crossed_out" ]; + }; + "markup.link.url" = { + fg = red; + modifiers = [ "underlined" ]; + }; + "markup.link.text" = blue; + "markup.raw" = red; + + "diff.plus" = green; + "diff.minus" = red; + "diff.delta" = blue; + + "ui.linenr" = { + fg = fgdim; + }; + "ui.linenr.selected" = { + fg = fg2; + }; + + "ui.statusline" = { + fg = fgdim; + bg = bg; + }; + "ui.statusline.inactive" = { + fg = fg3; + bg = bg2; + }; + "ui.statusline.normal" = { + fg = bg; + bg = purple; + modifiers = [ "bold" ]; + }; + "ui.statusline.insert" = { + fg = bg; + bg = green; + modifiers = [ "bold" ]; + }; + "ui.statusline.select" = { + fg = bg; + bg = red; + modifiers = [ "bold" ]; + }; + + "ui.popup" = { + fg = text; + bg = bg2; + }; + "ui.window" = { + fg = fgdim; + }; + "ui.help" = { + fg = fg2; + bg = bg2; + }; + + "ui.bufferline" = { + fg = fgdim; + bg = bg2; + }; + "ui.bufferline.background" = { + bg = bg2; + }; + + "ui.text" = text; + "ui.text.focus" = { + fg = text; + bg = bg3; + modifiers = [ "bold" ]; + }; + "ui.text.inactive" = { + fg = fg2; + }; + + "ui.virtual" = fg2; + "ui.virtual.ruler" = { + bg = bg3; + }; + "ui.virtual.indent-guide" = bg3; + "ui.virtual.inlay-hint" = { + fg = bg3; + bg = bg; + }; + + "ui.selection" = { + bg = bg5; + }; + + "ui.cursor" = { + fg = bg; + bg = text; + }; + "ui.cursor.primary" = { + fg = bg; + bg = red; + }; + "ui.cursor.match" = { + fg = orange; + modifiers = [ "bold" ]; + }; + + "ui.cursor.primary.normal" = { + fg = bg; + bg = text; + }; + "ui.cursor.primary.insert" = { + fg = bg; + bg = text; + }; + "ui.cursor.primary.select" = { + fg = bg; + bg = text; + }; + + "ui.cursor.normal" = { + fg = bg; + bg = fg; + }; + "ui.cursor.insert" = { + fg = bg; + bg = fg; + }; + "ui.cursor.select" = { + fg = bg; + bg = fg; + }; + + "ui.cursorline.primary" = { + bg = bg3; + }; + + "ui.highlight" = { + bg = bg3; + fg = bg; + modifiers = [ "bold" ]; + }; + + "ui.menu" = { + fg = fg3; + bg = bg2; + }; + "ui.menu.selected" = { + fg = text; + bg = bg3; + modifiers = [ "bold" ]; + }; + + "diagnostic.error" = { + underline = { + color = red; + style = "curl"; + }; + }; + "diagnostic.warning" = { + underline = { + color = orange; + style = "curl"; + }; + }; + "diagnostic.info" = { + underline = { + color = blue; + style = "curl"; + }; + }; + "diagnostic.hint" = { + underline = { + color = blue; + style = "curl"; + }; + }; + + error = red; + warning = orange; + info = blue; + hint = yellow; + "ui.background" = { + bg = bg; + fg = fgdim; + }; + + /* + "ui.cursorline.primary" = { bg = "default" } + "ui.cursorline.secondary" = { bg = "default" } + */ + "ui.cursorcolumn.primary" = { + bg = bg3; + }; + "ui.cursorcolumn.secondary" = { + bg = bg3; + }; + + "ui.bufferline.active" = { + fg = primary; + bg = bg3; + underline = { + color = primary; + style = ""; + }; }; }; }; }; }; - }; htop = { programs.htop = { enable = true; settings = { /* - hide_kernel_threads = 1; - hide_userland_threads = 1; - show_program_path = 0; - header_margin = 0; - show_cpu_frequency = 1; - highlight_base_name = 1; - tree_view = 0; - htop_version = "3.2.2"; - config_reader_min_version = 3; + hide_kernel_threads = 1; + hide_userland_threads = 1; + show_program_path = 0; + header_margin = 0; + show_cpu_frequency = 1; + highlight_base_name = 1; + tree_view = 0; + htop_version = "3.2.2"; + config_reader_min_version = 3; */ fields = "0 48 17 18 38 39 40 2 46 47 49 1"; hide_kernel_threads = 1; @@ -1238,23 +1300,23 @@ in { all_branches_collapsed = 0; /* - screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command - .sort_key=PERCENT_MEM - .tree_sort_key=PID - .tree_view=0 - .tree_view_always_by_pid=0 - .sort_direction=-1 - .tree_sort_direction=1 - .all_branches_collapsed=0 + screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command + .sort_key=PERCENT_MEM + .tree_sort_key=PID + .tree_view=0 + .tree_view_always_by_pid=0 + .sort_direction=-1 + .tree_sort_direction=1 + .all_branches_collapsed=0 - screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE Command - .sort_key=IO_RATE - .tree_sort_key=PID - .tree_view=0 - .tree_view_always_by_pid=0 - .sort_direction=-1 - .tree_sort_direction=1 - .all_branches_collapsed=0 + screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE Command + .sort_key=IO_RATE + .tree_sort_key=PID + .tree_view=0 + .tree_view_always_by_pid=0 + .sort_direction=-1 + .tree_sort_direction=1 + .all_branches_collapsed=0 */ }; }; @@ -1269,41 +1331,43 @@ in { ]; }; - niri = { - pkgs, - config, - ... - }: { - home.packages = with pkgs; [ - niri - fuzzel - # xdg-desktop-portal-gnome - # xdg-desktop-portal-gtk - ]; + niri = + { + pkgs, + config, + ... + }: + { + home.packages = with pkgs; [ + niri + fuzzel + # xdg-desktop-portal-gnome + # xdg-desktop-portal-gtk + ]; - services.gnome-keyring.enable = true; - # xdg.portal = { - # enable = true; - # extraPortals = with pkgs; [xdg-desktop-portal-gtk xdg-desktop-portal-gnome]; - # config = { - # common = { - # default = ["gtk"]; - # }; - # niri = { - # default = ["gtk"]; - # }; - # }; - # }; + services.gnome-keyring.enable = true; + # xdg.portal = { + # enable = true; + # extraPortals = with pkgs; [xdg-desktop-portal-gtk xdg-desktop-portal-gnome]; + # config = { + # common = { + # default = ["gtk"]; + # }; + # niri = { + # default = ["gtk"]; + # }; + # }; + # }; - home.file."${config.xdg.configHome}/niri" = { - source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/niri; + home.file."${config.xdg.configHome}/niri" = { + source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/niri; + }; + + home.file."${config.xdg.configHome}/fuzzel" = { + source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/fuzzel; + }; }; - home.file."${config.xdg.configHome}/fuzzel" = { - source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/fuzzel; - }; - }; - iex = { home.file.".iex.exs" = { enable = true; @@ -1342,80 +1406,83 @@ in { # kitty = {}; - linux = {pkgs, ...}: { - home = { - sessionVariables = { - MOZ_ENABLE_WAYLAND = "1"; - }; - }; - - programs.fish = { - shellAliases = { - disks = "df -h && lsblk"; - sctl = "sudo systemctl"; - bt = "bluetoothctl"; - pa = "pulsemixer"; - sctlu = "systemctl --user"; - }; - - functions = { - pp = '' - if test (count $argv) -gt 0 - while true; ping -O -i 1 -w 5 -c 10000000 $argv; sleep 1; end - else - while true; ping -O -i 1 -w 5 -c 10000000 1.1.1.1; sleep 1; end - end - ''; - }; - }; - - home.packages = [ - (pkgs.buildEnv { - name = "my-linux-scripts"; - paths = [./scripts/linux]; - }) - ]; - }; - - linux-desktop-environment-config = { - pkgs, - # font, - ... - }: { - imports = with homeManagerModules; [ - linux - desktop - firefox - ]; - - gtk.theme = { - name = "catppuccin-mocha-blue-compact+default"; - package = - (pkgs.catppuccin-gtk.overrideAttrs { - src = pkgs.fetchFromGitHub { - owner = "catppuccin"; - repo = "gtk"; - rev = "v1.0.3"; - fetchSubmodules = true; - hash = "sha256-q5/VcFsm3vNEw55zq/vcM11eo456SYE5TQA3g2VQjGc="; - }; - - postUnpack = ""; - }) - .override - { - accents = ["sapphire"]; - variant = "mocha"; - size = "compact"; + linux = + { pkgs, ... }: + { + home = { + sessionVariables = { + MOZ_ENABLE_WAYLAND = "1"; }; + }; + + programs.fish = { + shellAliases = { + disks = "df -h && lsblk"; + sctl = "sudo systemctl"; + bt = "bluetoothctl"; + pa = "pulsemixer"; + sctlu = "systemctl --user"; + }; + + functions = { + pp = '' + if test (count $argv) -gt 0 + while true; ping -O -i 1 -w 5 -c 10000000 $argv; sleep 1; end + else + while true; ping -O -i 1 -w 5 -c 10000000 1.1.1.1; sleep 1; end + end + ''; + }; + }; + + home.packages = [ + (pkgs.buildEnv { + name = "my-linux-scripts"; + paths = [ ./scripts/linux ]; + }) + ]; }; - home.pointerCursor = { - name = "Bibata-Modern-Classic"; - package = pkgs.bibata-cursors; - size = 40; # TODO: this doesn't seem to work -- at least in Sway - # some icons are also missing (hand2?) + + linux-desktop-environment-config = + { + pkgs, + # font, + ... + }: + { + imports = with homeManagerModules; [ + linux + desktop + firefox + ]; + + gtk.theme = { + name = "catppuccin-mocha-blue-compact+default"; + package = + (pkgs.catppuccin-gtk.overrideAttrs { + src = pkgs.fetchFromGitHub { + owner = "catppuccin"; + repo = "gtk"; + rev = "v1.0.3"; + fetchSubmodules = true; + hash = "sha256-q5/VcFsm3vNEw55zq/vcM11eo456SYE5TQA3g2VQjGc="; + }; + + postUnpack = ""; + }).override + { + accents = [ "sapphire" ]; + variant = "mocha"; + size = "compact"; + }; + }; + home.pointerCursor = { + name = "Bibata-Modern-Classic"; + package = pkgs.bibata-cursors; + size = 40; # TODO: this doesn't seem to work -- at least in Sway + # some icons are also missing (hand2?) + }; }; - }; macos = { imports = with homeManagerModules; [ @@ -1428,47 +1495,56 @@ in { # nnn = {}; - password-manager = {pkgs, ...}: { - imports = with homeManagerModules; [ - pass - ]; + password-manager = + { pkgs, ... }: + { + imports = with homeManagerModules; [ + pass + ]; - home.packages = with pkgs; [ - passage - rage - age-plugin-yubikey - bitwarden-cli - oath-toolkit - # bitwarden-desktop - ]; - }; - - pass = {pkgs, ...}: { - programs.password-store = { - enable = true; - package = pkgs.pass.withExtensions (exts: [exts.pass-otp]); + home.packages = with pkgs; [ + passage + rage + age-plugin-yubikey + bitwarden-cli + oath-toolkit + # bitwarden-desktop + ]; }; - }; - senpai = {config, ...}: { - programs.senpai = { - enable = true; - config = { - address = "irc+insecure://beefcake.hare-cod.ts.net:6667"; - nickname = "lytedev"; - password-cmd = ["pass" "soju"]; + pass = + { pkgs, ... }: + { + programs.password-store = { + enable = true; + package = pkgs.pass.withExtensions (exts: [ exts.pass-otp ]); }; }; - home.file."${config.xdg.configHome}/senpai/senpai.scfg" = { - enable = true; - text = '' - address irc+insecure://beefcake:6667 - nickname lytedev - password-cmd pass soju - ''; + senpai = + { config, ... }: + { + programs.senpai = { + enable = true; + config = { + address = "irc+insecure://beefcake.hare-cod.ts.net:6667"; + nickname = "lytedev"; + password-cmd = [ + "pass" + "soju" + ]; + }; + }; + + home.file."${config.xdg.configHome}/senpai/senpai.scfg" = { + enable = true; + text = '' + address irc+insecure://beefcake:6667 + nickname lytedev + password-cmd pass soju + ''; + }; }; - }; sway = { imports = [ @@ -1484,547 +1560,553 @@ in { }; /* - sway-laptop = {}; - swaylock = {}; - tmux = {}; - wallpaper-manager = {}; - waybar = {}; + sway-laptop = {}; + swaylock = {}; + tmux = {}; + wallpaper-manager = {}; + waybar = {}; */ - wezterm = { - pkgs, - config, - ... - }: { - home.packages = with pkgs; [ - wezterm - ]; + wezterm = + { + pkgs, + config, + ... + }: + { + home.packages = with pkgs; [ + wezterm + ]; - home.file."${config.xdg.configHome}/wezterm" = { - source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/wezterm; - }; - }; - - ghostty = { - pkgs, - config, - ... - }: { - home.packages = with pkgs; [ - ghostty - ]; - - home.file."${config.xdg.configHome}/ghostty" = { - source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/ghostty; - }; - }; - - zellij = {lib, ...}: { - # zellij does not support modern terminal keyboard input: - # https://github.com/zellij-org/zellij/issues/735 - programs.zellij = { - enable = true; - # This causes fish to start zellij immediately - # enableFishIntegration = true; - - # uses home manager's toKDL generator - settings = { - pane_frames = false; - simplified_ui = true; - default_mode = "locked"; - mouse_mode = true; - copy_clipboard = "primary"; - copy_on_select = true; - mirror_session = false; - - # keybinds = with builtins; let - # binder = bind: let - # keys = elemAt bind 0; - # action = elemAt bind 1; - # argKeys = map (k: "\"${k}\"") (lib.lists.flatten [keys]); - # in { - # name = "bind ${concatStringsSep " " argKeys}"; - # value = action; - # }; - # layer = binds: (listToAttrs (map binder binds)); - # in { - # # _props = {clear-defaults = true;}; - # normal = {}; - # locked = layer [ - # [["Ctrl g"] {SwitchToMode = "Normal";}] - # [["Ctrl L"] {NewPane = "Right";}] - # [["Ctrl Z"] {NewPane = "Right";}] - # [["Ctrl J"] {NewPane = "Down";}] - # [["Ctrl h"] {MoveFocus = "Left";}] - # [["Ctrl l"] {MoveFocus = "Right";}] - # [["Ctrl j"] {MoveFocus = "Down";}] - # [["Ctrl k"] {MoveFocus = "Up";}] - # ]; - # resize = layer [ - # [["Ctrl n"] {SwitchToMode = "Normal";}] - # [["h" "Left"] {Resize = "Increase Left";}] - # [["j" "Down"] {Resize = "Increase Down";}] - # [["k" "Up"] {Resize = "Increase Up";}] - # [["l" "Right"] {Resize = "Increase Right";}] - # [["H"] {Resize = "Decrease Left";}] - # [["J"] {Resize = "Decrease Down";}] - # [["K"] {Resize = "Decrease Up";}] - # [["L"] {Resize = "Decrease Right";}] - # [["=" "+"] {Resize = "Increase";}] - # [["-"] {Resize = "Decrease";}] - # ]; - # pane = layer [ - # [["Ctrl p"] {SwitchToMode = "Normal";}] - # [["h" "Left"] {MoveFocus = "Left";}] - # [["l" "Right"] {MoveFocus = "Right";}] - # [["j" "Down"] {MoveFocus = "Down";}] - # [["k" "Up"] {MoveFocus = "Up";}] - # [["p"] {SwitchFocus = [];}] - # [ - # ["n"] - # { - # NewPane = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["d"] - # { - # NewPane = "Down"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["r"] - # { - # NewPane = "Right"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["x"] - # { - # CloseFocus = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["f"] - # { - # ToggleFocusFullscreen = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["z"] - # { - # TogglePaneFrames = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["w"] - # { - # ToggleFloatingPanes = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["e"] - # { - # TogglePaneEmbedOrFloating = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["c"] - # { - # SwitchToMode = "RenamePane"; - # PaneNameInput = 0; - # } - # ] - # ]; - # move = layer [ - # [["Ctrl h"] {SwitchToMode = "Normal";}] - # [["n" "Tab"] {MovePane = [];}] - # [["p"] {MovePaneBackwards = [];}] - # [["h" "Left"] {MovePane = "Left";}] - # [["j" "Down"] {MovePane = "Down";}] - # [["k" "Up"] {MovePane = "Up";}] - # [["l" "Right"] {MovePane = "Right";}] - # ]; - # tab = layer [ - # [["Ctrl t"] {SwitchToMode = "Normal";}] - # [ - # ["r"] - # { - # SwitchToMode = "RenameTab"; - # TabNameInput = 0; - # } - # ] - # [["h" "Left" "Up" "k"] {GoToPreviousTab = [];}] - # [["l" "Right" "Down" "j"] {GoToNextTab = [];}] - # [ - # ["n"] - # { - # NewTab = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["x"] - # { - # CloseTab = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["s"] - # { - # ToggleActiveSyncTab = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["1"] - # { - # GoToTab = 1; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["2"] - # { - # GoToTab = 2; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["3"] - # { - # GoToTab = 3; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["4"] - # { - # GoToTab = 4; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["5"] - # { - # GoToTab = 5; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["6"] - # { - # GoToTab = 6; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["7"] - # { - # GoToTab = 7; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["8"] - # { - # GoToTab = 8; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["9"] - # { - # GoToTab = 9; - # SwitchToMode = "Normal"; - # } - # ] - # [["Tab"] {ToggleTab = [];}] - # ]; - # scroll = layer [ - # [["Ctrl s"] {SwitchToMode = "Normal";}] - # [ - # ["e"] - # { - # EditScrollback = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["s"] - # { - # SwitchToMode = "EnterSearch"; - # SearchInput = 0; - # } - # ] - # [ - # ["Ctrl c"] - # { - # ScrollToBottom = []; - # SwitchToMode = "Normal"; - # } - # ] - # [["j" "Down"] {ScrollDown = [];}] - # [["k" "Up"] {ScrollUp = [];}] - # [["Ctrl f" "PageDown" "Right" "l"] {PageScrollDown = [];}] - # [["Ctrl b" "PageUp" "Left" "h"] {PageScrollUp = [];}] - # [["d"] {HalfPageScrollDown = [];}] - # [["u"] {HalfPageScrollUp = [];}] - # # uncomment this and adjust key if using copy_on_select=false - # # bind "Alt c" { Copy; } - # ]; - # search = layer [ - # [["Ctrl s"] {SwitchToMode = "Normal";}] - # [ - # ["Ctrl c"] - # { - # ScrollToBottom = []; - # SwitchToMode = "Normal"; - # } - # ] - # [["j" "Down"] {ScrollDown = [];}] - # [["k" "Up"] {ScrollUp = [];}] - # [["Ctrl f" "PageDown" "Right" "l"] {PageScrollDown = [];}] - # [["Ctrl b" "PageUp" "Left" "h"] {PageScrollUp = [];}] - # [["d"] {HalfPageScrollDown = [];}] - # [["u"] {HalfPageScrollUp = [];}] - # [["n"] {Search = "down";}] - # [["p"] {Search = "up";}] - # [["c"] {SearchToggleOption = "CaseSensitivity";}] - # [["w"] {SearchToggleOption = "Wrap";}] - # [["o"] {SearchToggleOption = "WholeWord";}] - # ]; - # entersearch = layer [ - # [["Ctrl c" "Esc"] {SwitchToMode = "Scroll";}] - # [["Enter"] {SwitchToMode = "Search";}] - # ]; - # renametab = layer [ - # [["Ctrl c"] {SwitchToMode = "Normal";}] - # [ - # ["Esc"] - # { - # UndoRenameTab = []; - # SwitchToMode = "Tab"; - # } - # ] - # ]; - # renamepane = layer [ - # [["Ctrl c"] {SwitchToMode = "Normal";}] - # [ - # ["Esc"] - # { - # UndoRenamePane = []; - # SwitchToMode = "Pane"; - # } - # ] - # ]; - # session = layer [ - # [["Ctrl o"] {SwitchToMode = "Normal";}] - # [["Ctrl s"] {SwitchToMode = "Scroll";}] - # [["d"] {Detach = [];}] - # ]; - # tmux = layer [ - # [["["] {SwitchToMode = "Scroll";}] - # [ - # ["Ctrl b"] - # { - # Write = 2; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["\\\""] - # { - # NewPane = "Down"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["%"] - # { - # NewPane = "Right"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["z"] - # { - # ToggleFocusFullscreen = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["c"] - # { - # NewTab = []; - # SwitchToMode = "Normal"; - # } - # ] - # [[","] {SwitchToMode = "RenameTab";}] - # [ - # ["p"] - # { - # GoToPreviousTab = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["n"] - # { - # GoToNextTab = []; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["Left"] - # { - # MoveFocus = "Left"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["Right"] - # { - # MoveFocus = "Right"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["Down"] - # { - # MoveFocus = "Down"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["Up"] - # { - # MoveFocus = "Up"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["h"] - # { - # MoveFocus = "Left"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["l"] - # { - # MoveFocus = "Right"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["j"] - # { - # MoveFocus = "Down"; - # SwitchToMode = "Normal"; - # } - # ] - # [ - # ["k"] - # { - # MoveFocus = "Up"; - # SwitchToMode = "Normal"; - # } - # ] - # [["o"] {FocusNextPane = [];}] - # [["d"] {Detach = [];}] - # [["Space"] {NextSwapLayout = [];}] - # [ - # ["x"] - # { - # CloseFocus = []; - # SwitchToMode = "Normal"; - # } - # ] - # ]; - # "shared_except \"locked\"" = layer [ - # [["Ctrl g"] {SwitchToMode = "Locked";}] - # [["Ctrl q"] {Quit = [];}] - # [["Alt n"] {NewPane = [];}] - # [["Alt h" "Alt Left"] {MoveFocusOrTab = "Left";}] - # [["Alt l" "Alt Right"] {MoveFocusOrTab = "Right";}] - # [["Alt j" "Alt Down"] {MoveFocus = "Down";}] - # [["Alt k" "Alt Up"] {MoveFocus = "Up";}] - # [["Alt ]" "Alt +"] {Resize = "Increase";}] - # [["Alt -"] {Resize = "Decrease";}] - # [["Alt ["] {PreviousSwapLayout = [];}] - # [["Alt ]"] {NextSwapLayout = [];}] - # ]; - # "shared_except \"normal\" \"locked\"" = layer [ - # [["Enter" "Esc"] {SwitchToMode = "Normal";}] - # ]; - # "shared_except \"pane\" \"locked\"" = layer [ - # [["Ctrl p"] {SwitchToMode = "Pane";}] - # ]; - # "shared_except \"resize\" \"locked\"" = layer [ - # [["Ctrl n"] {SwitchToMode = "Resize";}] - # ]; - # "shared_except \"scroll\" \"locked\"" = layer [ - # [["Ctrl s"] {SwitchToMode = "Scroll";}] - # ]; - # "shared_except \"session\" \"locked\"" = layer [ - # [["Ctrl o"] {SwitchToMode = "Session";}] - # ]; - # "shared_except \"tab\" \"locked\"" = layer [ - # [["Ctrl t"] {SwitchToMode = "Tab";}] - # ]; - # "shared_except \"move\" \"locked\"" = layer [ - # [["Ctrl h"] {SwitchToMode = "Move";}] - # ]; - # "shared_except \"tmux\" \"locked\"" = layer [ - # [["Ctrl b"] {SwitchToMode = "Tmux";}] - # ]; - # }; - - # default_layout = "compact"; - theme = "match"; - - themes = { - match = with style.colors.withHashPrefix; { - fg = fg; - bg = bg; - - black = bg; - white = fg; - - red = red; - green = green; - yellow = yellow; - blue = blue; - magenta = purple; - cyan = blue; - orange = orange; - }; - }; - # TODO: port config - - ui = { - pane_frames = { - rounded_corners = true; - hide_session_name = true; - }; - }; + home.file."${config.xdg.configHome}/wezterm" = { + source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/wezterm; }; }; - home.shellAliases = { - z = "zellij"; + ghostty = + { + pkgs, + config, + ... + }: + { + home.packages = with pkgs; [ + ghostty + ]; + + home.file."${config.xdg.configHome}/ghostty" = { + source = config.lib.file.mkOutOfStoreSymlink /etc/nix/flake/modules/home-manager/ghostty; + }; + }; + + zellij = + { lib, ... }: + { + # zellij does not support modern terminal keyboard input: + # https://github.com/zellij-org/zellij/issues/735 + programs.zellij = { + enable = true; + # This causes fish to start zellij immediately + # enableFishIntegration = true; + + # uses home manager's toKDL generator + settings = { + pane_frames = false; + simplified_ui = true; + default_mode = "locked"; + mouse_mode = true; + copy_clipboard = "primary"; + copy_on_select = true; + mirror_session = false; + + # keybinds = with builtins; let + # binder = bind: let + # keys = elemAt bind 0; + # action = elemAt bind 1; + # argKeys = map (k: "\"${k}\"") (lib.lists.flatten [keys]); + # in { + # name = "bind ${concatStringsSep " " argKeys}"; + # value = action; + # }; + # layer = binds: (listToAttrs (map binder binds)); + # in { + # # _props = {clear-defaults = true;}; + # normal = {}; + # locked = layer [ + # [["Ctrl g"] {SwitchToMode = "Normal";}] + # [["Ctrl L"] {NewPane = "Right";}] + # [["Ctrl Z"] {NewPane = "Right";}] + # [["Ctrl J"] {NewPane = "Down";}] + # [["Ctrl h"] {MoveFocus = "Left";}] + # [["Ctrl l"] {MoveFocus = "Right";}] + # [["Ctrl j"] {MoveFocus = "Down";}] + # [["Ctrl k"] {MoveFocus = "Up";}] + # ]; + # resize = layer [ + # [["Ctrl n"] {SwitchToMode = "Normal";}] + # [["h" "Left"] {Resize = "Increase Left";}] + # [["j" "Down"] {Resize = "Increase Down";}] + # [["k" "Up"] {Resize = "Increase Up";}] + # [["l" "Right"] {Resize = "Increase Right";}] + # [["H"] {Resize = "Decrease Left";}] + # [["J"] {Resize = "Decrease Down";}] + # [["K"] {Resize = "Decrease Up";}] + # [["L"] {Resize = "Decrease Right";}] + # [["=" "+"] {Resize = "Increase";}] + # [["-"] {Resize = "Decrease";}] + # ]; + # pane = layer [ + # [["Ctrl p"] {SwitchToMode = "Normal";}] + # [["h" "Left"] {MoveFocus = "Left";}] + # [["l" "Right"] {MoveFocus = "Right";}] + # [["j" "Down"] {MoveFocus = "Down";}] + # [["k" "Up"] {MoveFocus = "Up";}] + # [["p"] {SwitchFocus = [];}] + # [ + # ["n"] + # { + # NewPane = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["d"] + # { + # NewPane = "Down"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["r"] + # { + # NewPane = "Right"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["x"] + # { + # CloseFocus = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["f"] + # { + # ToggleFocusFullscreen = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["z"] + # { + # TogglePaneFrames = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["w"] + # { + # ToggleFloatingPanes = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["e"] + # { + # TogglePaneEmbedOrFloating = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["c"] + # { + # SwitchToMode = "RenamePane"; + # PaneNameInput = 0; + # } + # ] + # ]; + # move = layer [ + # [["Ctrl h"] {SwitchToMode = "Normal";}] + # [["n" "Tab"] {MovePane = [];}] + # [["p"] {MovePaneBackwards = [];}] + # [["h" "Left"] {MovePane = "Left";}] + # [["j" "Down"] {MovePane = "Down";}] + # [["k" "Up"] {MovePane = "Up";}] + # [["l" "Right"] {MovePane = "Right";}] + # ]; + # tab = layer [ + # [["Ctrl t"] {SwitchToMode = "Normal";}] + # [ + # ["r"] + # { + # SwitchToMode = "RenameTab"; + # TabNameInput = 0; + # } + # ] + # [["h" "Left" "Up" "k"] {GoToPreviousTab = [];}] + # [["l" "Right" "Down" "j"] {GoToNextTab = [];}] + # [ + # ["n"] + # { + # NewTab = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["x"] + # { + # CloseTab = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["s"] + # { + # ToggleActiveSyncTab = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["1"] + # { + # GoToTab = 1; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["2"] + # { + # GoToTab = 2; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["3"] + # { + # GoToTab = 3; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["4"] + # { + # GoToTab = 4; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["5"] + # { + # GoToTab = 5; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["6"] + # { + # GoToTab = 6; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["7"] + # { + # GoToTab = 7; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["8"] + # { + # GoToTab = 8; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["9"] + # { + # GoToTab = 9; + # SwitchToMode = "Normal"; + # } + # ] + # [["Tab"] {ToggleTab = [];}] + # ]; + # scroll = layer [ + # [["Ctrl s"] {SwitchToMode = "Normal";}] + # [ + # ["e"] + # { + # EditScrollback = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["s"] + # { + # SwitchToMode = "EnterSearch"; + # SearchInput = 0; + # } + # ] + # [ + # ["Ctrl c"] + # { + # ScrollToBottom = []; + # SwitchToMode = "Normal"; + # } + # ] + # [["j" "Down"] {ScrollDown = [];}] + # [["k" "Up"] {ScrollUp = [];}] + # [["Ctrl f" "PageDown" "Right" "l"] {PageScrollDown = [];}] + # [["Ctrl b" "PageUp" "Left" "h"] {PageScrollUp = [];}] + # [["d"] {HalfPageScrollDown = [];}] + # [["u"] {HalfPageScrollUp = [];}] + # # uncomment this and adjust key if using copy_on_select=false + # # bind "Alt c" { Copy; } + # ]; + # search = layer [ + # [["Ctrl s"] {SwitchToMode = "Normal";}] + # [ + # ["Ctrl c"] + # { + # ScrollToBottom = []; + # SwitchToMode = "Normal"; + # } + # ] + # [["j" "Down"] {ScrollDown = [];}] + # [["k" "Up"] {ScrollUp = [];}] + # [["Ctrl f" "PageDown" "Right" "l"] {PageScrollDown = [];}] + # [["Ctrl b" "PageUp" "Left" "h"] {PageScrollUp = [];}] + # [["d"] {HalfPageScrollDown = [];}] + # [["u"] {HalfPageScrollUp = [];}] + # [["n"] {Search = "down";}] + # [["p"] {Search = "up";}] + # [["c"] {SearchToggleOption = "CaseSensitivity";}] + # [["w"] {SearchToggleOption = "Wrap";}] + # [["o"] {SearchToggleOption = "WholeWord";}] + # ]; + # entersearch = layer [ + # [["Ctrl c" "Esc"] {SwitchToMode = "Scroll";}] + # [["Enter"] {SwitchToMode = "Search";}] + # ]; + # renametab = layer [ + # [["Ctrl c"] {SwitchToMode = "Normal";}] + # [ + # ["Esc"] + # { + # UndoRenameTab = []; + # SwitchToMode = "Tab"; + # } + # ] + # ]; + # renamepane = layer [ + # [["Ctrl c"] {SwitchToMode = "Normal";}] + # [ + # ["Esc"] + # { + # UndoRenamePane = []; + # SwitchToMode = "Pane"; + # } + # ] + # ]; + # session = layer [ + # [["Ctrl o"] {SwitchToMode = "Normal";}] + # [["Ctrl s"] {SwitchToMode = "Scroll";}] + # [["d"] {Detach = [];}] + # ]; + # tmux = layer [ + # [["["] {SwitchToMode = "Scroll";}] + # [ + # ["Ctrl b"] + # { + # Write = 2; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["\\\""] + # { + # NewPane = "Down"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["%"] + # { + # NewPane = "Right"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["z"] + # { + # ToggleFocusFullscreen = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["c"] + # { + # NewTab = []; + # SwitchToMode = "Normal"; + # } + # ] + # [[","] {SwitchToMode = "RenameTab";}] + # [ + # ["p"] + # { + # GoToPreviousTab = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["n"] + # { + # GoToNextTab = []; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["Left"] + # { + # MoveFocus = "Left"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["Right"] + # { + # MoveFocus = "Right"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["Down"] + # { + # MoveFocus = "Down"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["Up"] + # { + # MoveFocus = "Up"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["h"] + # { + # MoveFocus = "Left"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["l"] + # { + # MoveFocus = "Right"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["j"] + # { + # MoveFocus = "Down"; + # SwitchToMode = "Normal"; + # } + # ] + # [ + # ["k"] + # { + # MoveFocus = "Up"; + # SwitchToMode = "Normal"; + # } + # ] + # [["o"] {FocusNextPane = [];}] + # [["d"] {Detach = [];}] + # [["Space"] {NextSwapLayout = [];}] + # [ + # ["x"] + # { + # CloseFocus = []; + # SwitchToMode = "Normal"; + # } + # ] + # ]; + # "shared_except \"locked\"" = layer [ + # [["Ctrl g"] {SwitchToMode = "Locked";}] + # [["Ctrl q"] {Quit = [];}] + # [["Alt n"] {NewPane = [];}] + # [["Alt h" "Alt Left"] {MoveFocusOrTab = "Left";}] + # [["Alt l" "Alt Right"] {MoveFocusOrTab = "Right";}] + # [["Alt j" "Alt Down"] {MoveFocus = "Down";}] + # [["Alt k" "Alt Up"] {MoveFocus = "Up";}] + # [["Alt ]" "Alt +"] {Resize = "Increase";}] + # [["Alt -"] {Resize = "Decrease";}] + # [["Alt ["] {PreviousSwapLayout = [];}] + # [["Alt ]"] {NextSwapLayout = [];}] + # ]; + # "shared_except \"normal\" \"locked\"" = layer [ + # [["Enter" "Esc"] {SwitchToMode = "Normal";}] + # ]; + # "shared_except \"pane\" \"locked\"" = layer [ + # [["Ctrl p"] {SwitchToMode = "Pane";}] + # ]; + # "shared_except \"resize\" \"locked\"" = layer [ + # [["Ctrl n"] {SwitchToMode = "Resize";}] + # ]; + # "shared_except \"scroll\" \"locked\"" = layer [ + # [["Ctrl s"] {SwitchToMode = "Scroll";}] + # ]; + # "shared_except \"session\" \"locked\"" = layer [ + # [["Ctrl o"] {SwitchToMode = "Session";}] + # ]; + # "shared_except \"tab\" \"locked\"" = layer [ + # [["Ctrl t"] {SwitchToMode = "Tab";}] + # ]; + # "shared_except \"move\" \"locked\"" = layer [ + # [["Ctrl h"] {SwitchToMode = "Move";}] + # ]; + # "shared_except \"tmux\" \"locked\"" = layer [ + # [["Ctrl b"] {SwitchToMode = "Tmux";}] + # ]; + # }; + + # default_layout = "compact"; + theme = "match"; + + themes = { + match = with style.colors.withHashPrefix; { + fg = fg; + bg = bg; + + black = bg; + white = fg; + + red = red; + green = green; + yellow = yellow; + blue = blue; + magenta = purple; + cyan = blue; + orange = orange; + }; + }; + # TODO: port config + + ui = { + pane_frames = { + rounded_corners = true; + hide_session_name = true; + }; + }; + }; + }; + + home.shellAliases = { + z = "zellij"; + }; }; - }; sshconfig = { programs.ssh = { diff --git a/lib/templates/nix-flake/.helix/languages.toml b/lib/templates/nix-flake/.helix/languages.toml index 55c2894..0b818c8 100644 --- a/lib/templates/nix-flake/.helix/languages.toml +++ b/lib/templates/nix-flake/.helix/languages.toml @@ -6,4 +6,4 @@ scope = "source.nix" [language.formatter] args = ["-"] -command = "alejandra" +command = "nixfmt" diff --git a/lib/templates/nix-flake/flake.nix b/lib/templates/nix-flake/flake.nix index f43f022..2f9fb9c 100644 --- a/lib/templates/nix-flake/flake.nix +++ b/lib/templates/nix-flake/flake.nix @@ -4,45 +4,56 @@ inputs.pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix"; inputs.pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs"; - outputs = { - self, - nixpkgs, - pre-commit-hooks, - ... - }: let - systems = ["aarch64-linux" "aarch64-darwin" "x86_64-darwin" "x86_64-linux"]; - forSystems = nixpkgs.lib.genAttrs systems; - pkgsFor = system: (import nixpkgs {inherit system;}); - genPkgs = func: (forSystems (system: func (pkgsFor system))); - in { - formatter = genPkgs (pkgs: pkgs.alejandra); + outputs = + { + self, + nixpkgs, + pre-commit-hooks, + ... + }: + let + systems = [ + "aarch64-linux" + "aarch64-darwin" + "x86_64-darwin" + "x86_64-linux" + ]; + forSystems = nixpkgs.lib.genAttrs systems; + pkgsFor = system: (import nixpkgs { inherit system; }); + genPkgs = func: (forSystems (system: func (pkgsFor system))); + in + { + formatter = genPkgs (pkgs: pkgs.nixfmt-rfc-style); - checks = genPkgs (pkgs: { - pre-commit-check = pre-commit-hooks.lib.${pkgs.system}.run { - src = ./.; - hooks = { - alejandra.enable = true; + checks = genPkgs (pkgs: { + pre-commit-check = pre-commit-hooks.lib.${pkgs.system}.run { + src = ./.; + hooks = { + nixfmt-rfc-style.enable = true; + }; }; - }; - }); + }); - devShells = genPkgs (pkgs: { - nix = pkgs.mkShell { - packages = with pkgs; [nil alejandra]; - inherit (self.outputs.checks.${pkgs.system}.pre-commit-check) shellHook; - }; + devShells = genPkgs (pkgs: { + nix = pkgs.mkShell { + packages = with pkgs; [ + nixd + nixfmt-rfc-style + ]; + inherit (self.outputs.checks.${pkgs.system}.pre-commit-check) shellHook; + }; - default = self.outputs.devShells.${pkgs.system}.nix; - }); + default = self.outputs.devShells.${pkgs.system}.nix; + }); - /* - packages = genPkgs (pkgs: import ./pkgs {inherit pkgs;}); - overlays = import ./overlays self; - nixosModules = import ./modules/nixos; - homeManagerModules = import ./modules/home-manager; - nixosConfigurations = import ./nixos; - homeConfigurations = import ./home - templates = import ./templates; - */ - }; + /* + packages = genPkgs (pkgs: import ./pkgs {inherit pkgs;}); + overlays = import ./overlays self; + nixosModules = import ./modules/nixos; + homeManagerModules = import ./modules/home-manager; + nixosConfigurations = import ./nixos; + homeConfigurations = import ./home + templates = import ./templates; + */ + }; } diff --git a/packages/checks/default.nix b/packages/checks/default.nix index 849e79d..7916a26 100644 --- a/packages/checks/default.nix +++ b/packages/checks/default.nix @@ -1,12 +1,10 @@ +{ git-hooks, ... }: +{ pkgs, ... }: { - pkgs, - git-hooks, - ... -}: { git-hooks = git-hooks.lib.${pkgs.system}.run { src = ./.; hooks = { - alejandra.enable = true; + nixfmt-rfc-style.enable = true; }; }; } diff --git a/packages/shells/default.nix b/packages/shells/default.nix index e472667..b99ec4a 100644 --- a/packages/shells/default.nix +++ b/packages/shells/default.nix @@ -1,8 +1,6 @@ +{ self, ... }: +{ pkgs, ... }: { - self, - pkgs, - ... -}: { default = pkgs.mkShell { inherit (self.outputs.checks.${pkgs.system}.git-hooks) shellHook; packages = with pkgs; [