From 4c74a951949da5d31b28f5c6b0531c171bf13e3e Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 26 Apr 2023 00:46:12 +0000 Subject: [PATCH] home: zsh: port to programs API --- hosts/common/home/zsh/default.nix | 225 +++++++++++++++--------------- hosts/common/programs/default.nix | 1 + 2 files changed, 116 insertions(+), 110 deletions(-) diff --git a/hosts/common/home/zsh/default.nix b/hosts/common/home/zsh/default.nix index bff155bf..10409a79 100644 --- a/hosts/common/home/zsh/default.nix +++ b/hosts/common/home/zsh/default.nix @@ -1,7 +1,7 @@ { config, lib, pkgs, sane-lib, ... }: let - inherit (lib) mkOption types; + inherit (lib) mkIf mkMerge mkOption types; cfg = config.sane.zsh; # powerlevel10k prompt config # p10k.zsh is the auto-generated config, and i overwrite those defaults here, below. @@ -38,124 +38,129 @@ in }; }; - config = { - sane.user.persist.plaintext = [ - # we don't need to full zsh dir -- just the history file -- - # but zsh will sometimes backup the history file and we get fewer errors if we do proper mounts instead of symlinks. - # TODO: should be private? - ".local/share/zsh" - # cache gitstatus otherwise p10k fetched it from the net EVERY BOOT - ".cache/gitstatus" - ]; + config = mkMerge [ + ({ + sane.programs.zsh = { + persist.plaintext = [ + # we don't need to full zsh dir -- just the history file -- + # but zsh will sometimes backup the history file and we get fewer errors if we do proper mounts instead of symlinks. + # TODO: should be private? + ".local/share/zsh" + # cache gitstatus otherwise p10k fetched it from the net EVERY BOOT + ".cache/gitstatus" + ]; - # zsh/prezto complains if zshrc doesn't exist; but it does allow an "empty" file. - sane.user.fs.".config/zsh/.zshrc" = sane-lib.fs.wantedText "# "; + # zsh/prezto complains if zshrc doesn't exist; but it does allow an "empty" file. + fs.".config/zsh/.zshrc" = sane-lib.fs.wantedText "# "; - # enable zsh completions - environment.pathsToLink = [ "/share/zsh" ]; + # prezto = oh-my-zsh fork; controls prompt, auto-completion, etc. + # see: https://github.com/sorin-ionescu/prezto + # i believe this file is auto-sourced by the prezto init.zsh script. + fs.".config/zsh/.zpreztorc" = sane-lib.fs.wantedText '' + zstyle ':prezto:*:*' color 'yes' - programs.zsh = { - enable = true; - histFile = "$HOME/.local/share/zsh/history"; - shellAliases = { - ":q" = "exit"; - # common typos - "cd.." = "cd .."; - "cd../" = "cd ../"; + # modules (they ship with prezto): + # ENVIRONMENT: configures jobs to persist after shell exit; other basic niceties + # TERMINAL: auto-titles terminal (e.g. based on cwd) + # EDITOR: configures shortcuts like Ctrl+U=undo, Ctrl+L=clear + # HISTORY: `history-stat` alias, setopts for good history defaults + # DIRECTORY: sets AUTO_CD, adds `d` alias to list directory stack, and `1`-`9` to cd that far back the stack + # SPECTRUM: helpers for term colors and styling. used by prompts? might be unnecessary + # UTILITY: configures aliases like `ll`, `la`, disables globbing for things like rsync + # adds aliases like `get` to fetch a file. also adds `http-serve` alias?? + # COMPLETION: tab completion. requires `utility` module prior to loading + # TODO: enable AUTO_PARAM_SLASH + zstyle ':prezto:load' pmodule \ + 'environment' \ + 'terminal' \ + 'editor' \ + 'history' \ + 'directory' \ + 'spectrum' \ + 'utility' \ + 'completion' \ + 'prompt' + + # default keymap. try also `vicmd` (vim normal mode, AKA "cmd mode") or `vi`. + zstyle ':prezto:module:editor' key-bindings 'emacs' + + zstyle ':prezto:module:prompt' theme 'powerlevel10k' + + # disable `mv` confirmation (and `rm`, too, unfortunately) + zstyle ':prezto:module:utility' safe-ops 'no' + ''; }; - setOptions = [ - # defaults: - "HIST_IGNORE_DUPS" - "SHARE_HISTORY" - "HIST_FCNTL_LOCK" - # disable `rm *` confirmations - "rmstarsilent" - ]; + }) + (mkIf config.sane.programs.zsh.enabled { + # enable zsh completions + environment.pathsToLink = [ "/share/zsh" ]; - # .zshenv config: - shellInit = '' - ZDOTDIR=$HOME/.config/zsh - ''; + programs.zsh = { + enable = true; + histFile = "$HOME/.local/share/zsh/history"; + shellAliases = { + ":q" = "exit"; + # common typos + "cd.." = "cd .."; + "cd../" = "cd ../"; + }; + setOptions = [ + # defaults: + "HIST_IGNORE_DUPS" + "SHARE_HISTORY" + "HIST_FCNTL_LOCK" + # disable `rm *` confirmations + "rmstarsilent" + ]; - # .zshrc config: - interactiveShellInit = - (builtins.readFile ./p10k.zsh) - + p10k-overrides - + prezto-init - + '' - # zmv is a way to do rich moves/renames, with pattern matching/substitution. - # see for an example: - autoload -Uz zmv + # .zshenv config: + shellInit = '' + ZDOTDIR=$HOME/.config/zsh + ''; - HISTORY_IGNORE='(sane-shutdown *|sane-reboot *|rm *|nixos-rebuild.* switch)' + # .zshrc config: + interactiveShellInit = + (builtins.readFile ./p10k.zsh) + + p10k-overrides + + prezto-init + + '' + # zmv is a way to do rich moves/renames, with pattern matching/substitution. + # see for an example: + autoload -Uz zmv - # extra aliases - # TODO: move to `shellAliases` config? - function nd() { - mkdir -p "$1"; - pushd "$1"; - } - '' - + lib.optionalString cfg.showDeadlines '' - ${pkgs.sane-scripts}/bin/sane-deadlines - '' - + '' - # auto-cd into any of these dirs by typing them and pressing 'enter': - hash -d 3rd="/home/colin/dev/3rd" - hash -d dev="/home/colin/dev" - hash -d knowledge="/home/colin/knowledge" - hash -d nixos="/home/colin/nixos" - hash -d nixpkgs="/home/colin/dev/3rd/nixpkgs" - hash -d ref="/home/colin/ref" - hash -d secrets="/home/colin/knowledge/secrets" - hash -d tmp="/home/colin/tmp" - hash -d uninsane="/home/colin/dev/uninsane" - hash -d Videos="/home/colin/Videos" - ''; + HISTORY_IGNORE='(sane-shutdown *|sane-reboot *|rm *|nixos-rebuild.* switch)' - syntaxHighlighting.enable = true; - vteIntegration = true; - }; + # extra aliases + # TODO: move to `shellAliases` config? + function nd() { + mkdir -p "$1"; + pushd "$1"; + } + '' + + lib.optionalString cfg.showDeadlines '' + ${pkgs.sane-scripts}/bin/sane-deadlines + '' + + '' + # auto-cd into any of these dirs by typing them and pressing 'enter': + hash -d 3rd="/home/colin/dev/3rd" + hash -d dev="/home/colin/dev" + hash -d knowledge="/home/colin/knowledge" + hash -d nixos="/home/colin/nixos" + hash -d nixpkgs="/home/colin/dev/3rd/nixpkgs" + hash -d ref="/home/colin/ref" + hash -d secrets="/home/colin/knowledge/secrets" + hash -d tmp="/home/colin/tmp" + hash -d uninsane="/home/colin/dev/uninsane" + hash -d Videos="/home/colin/Videos" + ''; - # enable a command-not-found hook to show nix packages that might provide the binary typed. - programs.nix-index.enable = true; - programs.command-not-found.enable = false; #< mutually exclusive with nix-index + syntaxHighlighting.enable = true; + vteIntegration = true; + }; - # prezto = oh-my-zsh fork; controls prompt, auto-completion, etc. - # see: https://github.com/sorin-ionescu/prezto - # i believe this file is auto-sourced by the prezto init.zsh script. - sane.user.fs.".config/zsh/.zpreztorc" = sane-lib.fs.wantedText '' - zstyle ':prezto:*:*' color 'yes' - - # modules (they ship with prezto): - # ENVIRONMENT: configures jobs to persist after shell exit; other basic niceties - # TERMINAL: auto-titles terminal (e.g. based on cwd) - # EDITOR: configures shortcuts like Ctrl+U=undo, Ctrl+L=clear - # HISTORY: `history-stat` alias, setopts for good history defaults - # DIRECTORY: sets AUTO_CD, adds `d` alias to list directory stack, and `1`-`9` to cd that far back the stack - # SPECTRUM: helpers for term colors and styling. used by prompts? might be unnecessary - # UTILITY: configures aliases like `ll`, `la`, disables globbing for things like rsync - # adds aliases like `get` to fetch a file. also adds `http-serve` alias?? - # COMPLETION: tab completion. requires `utility` module prior to loading - # TODO: enable AUTO_PARAM_SLASH - zstyle ':prezto:load' pmodule \ - 'environment' \ - 'terminal' \ - 'editor' \ - 'history' \ - 'directory' \ - 'spectrum' \ - 'utility' \ - 'completion' \ - 'prompt' - - # default keymap. try also `vicmd` (vim normal mode, AKA "cmd mode") or `vi`. - zstyle ':prezto:module:editor' key-bindings 'emacs' - - zstyle ':prezto:module:prompt' theme 'powerlevel10k' - - # disable `mv` confirmation (and `rm`, too, unfortunately) - zstyle ':prezto:module:utility' safe-ops 'no' - ''; - }; + # enable a command-not-found hook to show nix packages that might provide the binary typed. + programs.nix-index.enable = true; + programs.command-not-found.enable = false; #< mutually exclusive with nix-index + }) + ]; } diff --git a/hosts/common/programs/default.nix b/hosts/common/programs/default.nix index aad41d50..39d8f0cc 100644 --- a/hosts/common/programs/default.nix +++ b/hosts/common/programs/default.nix @@ -140,6 +140,7 @@ let # yarn # youtube-dl yt-dlp + zsh ; };