From 9b76feafd02c84935ca3dea671057ca28b08131f Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Fri, 11 Jul 2025 22:09:02 -0500 Subject: [PATCH] zsh: move oh-my-zsh to separate file zsh is incredibly bloated, moving oh-my-zsh to separate file Signed-off-by: Austin Horstman --- modules/programs/zsh/default.nix | 115 +++++++---------------------- modules/programs/zsh/oh-my-zsh.nix | 102 +++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 90 deletions(-) create mode 100644 modules/programs/zsh/oh-my-zsh.nix diff --git a/modules/programs/zsh/default.nix b/modules/programs/zsh/default.nix index 9a1b801b6..8b38fabc5 100644 --- a/modules/programs/zsh/default.nix +++ b/modules/programs/zsh/default.nix @@ -15,13 +15,12 @@ let optionalString types ; + inherit (config.home) stateVersion; cfg = config.programs.zsh; relToDotDir = file: (optionalString (cfg.dotDir != null) (cfg.dotDir + "/")) + file; - stateVersion = config.home.stateVersion; - bindkeyCommands = { emacs = "bindkey -e"; viins = "bindkey -v"; @@ -30,6 +29,7 @@ let in { imports = [ + ./oh-my-zsh.nix ./prezto.nix ./zsh-abbr.nix (lib.mkRenamedOptionModule @@ -208,57 +208,6 @@ in } ); - ohMyZshModule = types.submodule { - options = { - enable = mkEnableOption "oh-my-zsh"; - - package = lib.mkPackageOption pkgs "oh-my-zsh" { }; - - plugins = mkOption { - default = [ ]; - example = [ - "git" - "sudo" - ]; - type = types.listOf types.str; - description = '' - List of oh-my-zsh plugins - ''; - }; - - custom = mkOption { - default = ""; - type = types.str; - example = "$HOME/my_customizations"; - description = '' - Path to a custom oh-my-zsh package to override config of - oh-my-zsh. See - for more information. - ''; - }; - - theme = mkOption { - default = ""; - example = "robbyrussell"; - type = types.str; - description = '' - Name of the theme to be used by oh-my-zsh. - ''; - }; - - extraConfig = mkOption { - default = ""; - example = '' - zstyle :omz:plugins:ssh-agent identities id_rsa id_rsa2 id_github - ''; - type = types.lines; - description = '' - Extra settings for plugins. - ''; - }; - }; - }; - historySubstringSearchModule = types.submodule { options = { enable = mkEnableOption "history substring search"; @@ -635,12 +584,6 @@ in description = "Plugins to source in {file}`.zshrc`."; }; - oh-my-zsh = mkOption { - type = ohMyZshModule; - default = { }; - description = "Options to configure oh-my-zsh."; - }; - localVariables = mkOption { type = types.attrs; default = { }; @@ -654,6 +597,22 @@ in Extra local variables defined at the top of {file}`.zshrc`. ''; }; + + setOptions = mkOption { + type = types.listOf types.str; + default = [ ]; + example = [ + "EXTENDED_HISTORY" + "RM_STAR_WAIT" + "NO_BEEP" + ]; + description = '' + Configure zsh options. See + {manpage}`zshoptions(1)`. + + To unset an option, prefix it with "NO_". + ''; + }; }; }; @@ -694,13 +653,6 @@ in home.file."${relToDotDir ".zlogout"}".text = cfg.logoutExtra; }) - (mkIf cfg.oh-my-zsh.enable { - home.file."${relToDotDir ".zshenv"}".text = '' - ZSH="${cfg.oh-my-zsh.package}/share/oh-my-zsh"; - ZSH_CACHE_DIR="${config.xdg.cacheHome}/oh-my-zsh"; - ''; - }) - (mkIf (cfg.dotDir != null) { home.file."${relToDotDir ".zshenv"}".text = '' export ZDOTDIR=${zdotdir} @@ -729,10 +681,7 @@ in } { - home.packages = - [ cfg.package ] - ++ lib.optional cfg.enableCompletion pkgs.nix-zsh-completions - ++ lib.optional cfg.oh-my-zsh.enable cfg.oh-my-zsh.package; + home.packages = [ cfg.package ] ++ lib.optional cfg.enableCompletion pkgs.nix-zsh-completions; programs.zsh.initContent = lib.mkMerge [ # zprof must be loaded before everything else, since it @@ -814,20 +763,6 @@ in '' )) - (lib.mkIf cfg.oh-my-zsh.enable ( - mkOrder 800 '' - # oh-my-zsh extra settings for plugins - ${cfg.oh-my-zsh.extraConfig} - # oh-my-zsh configuration generated by NixOS - ${optionalString ( - cfg.oh-my-zsh.plugins != [ ] - ) "plugins=(${concatStringsSep " " cfg.oh-my-zsh.plugins})"} - ${optionalString (cfg.oh-my-zsh.custom != "") ''ZSH_CUSTOM="${cfg.oh-my-zsh.custom}"''} - ${optionalString (cfg.oh-my-zsh.theme != "") ''ZSH_THEME="${cfg.oh-my-zsh.theme}"''} - source $ZSH/oh-my-zsh.sh - '' - )) - (mkOrder 900 ( (lib.concatStrings ( map (plugin: '' @@ -866,6 +801,12 @@ in '' )) + (lib.mkIf (cfg.setOptions != [ ]) ( + mkOrder 950 '' + ${concatStringsSep "\n" (map (option: "setopt ${option}") cfg.setOptions)} + '' + )) + (lib.mkIf (cfg.initExtra != "") cfg.initExtra) (lib.mkIf (aliasesStr != "" || cfg.shellGlobalAliases != { }) ( @@ -930,12 +871,6 @@ in home.file."${relToDotDir ".zshrc"}".text = cfg.initContent; } - (mkIf cfg.oh-my-zsh.enable { - # Make sure we create a cache directory since some plugins expect it to exist - # See: https://github.com/nix-community/home-manager/issues/761 - home.file."${config.xdg.cacheHome}/oh-my-zsh/.keep".text = ""; - }) - (mkIf (cfg.plugins != [ ]) { # Many plugins require compinit to be called # but allow the user to opt out. diff --git a/modules/programs/zsh/oh-my-zsh.nix b/modules/programs/zsh/oh-my-zsh.nix new file mode 100644 index 000000000..9aaee57ac --- /dev/null +++ b/modules/programs/zsh/oh-my-zsh.nix @@ -0,0 +1,102 @@ +{ + config, + lib, + pkgs, + ... +}: +let + inherit (lib) mkOption optionalString types; + + relToDotDir = + file: + (lib.optionalString (config.programs.zsh.dotDir != null) (config.programs.zsh.dotDir + "/")) + file; + + cfg = config.programs.zsh; + + ohMyZshModule = types.submodule { + options = { + enable = lib.mkEnableOption "oh-my-zsh"; + + package = lib.mkPackageOption pkgs "oh-my-zsh" { }; + + plugins = mkOption { + default = [ ]; + example = [ + "git" + "sudo" + ]; + type = types.listOf types.str; + description = '' + List of oh-my-zsh plugins + ''; + }; + + custom = mkOption { + default = ""; + type = types.str; + example = "$HOME/my_customizations"; + description = '' + Path to a custom oh-my-zsh package to override config of + oh-my-zsh. See + for more information. + ''; + }; + + theme = mkOption { + default = ""; + example = "robbyrussell"; + type = types.str; + description = '' + Name of the theme to be used by oh-my-zsh. + ''; + }; + + extraConfig = mkOption { + default = ""; + example = '' + zstyle :omz:plugins:ssh-agent identities id_rsa id_rsa2 id_github + ''; + type = types.lines; + description = '' + Extra settings for plugins. + ''; + }; + }; + }; +in +{ + options.programs.zsh.oh-my-zsh = mkOption { + type = ohMyZshModule; + default = { }; + description = "Options to configure oh-my-zsh."; + }; + + config = lib.mkIf cfg.oh-my-zsh.enable { + home = { + packages = [ cfg.oh-my-zsh.package ]; + + file = { + "${relToDotDir ".zshenv"}".text = '' + ZSH="${cfg.oh-my-zsh.package}/share/oh-my-zsh"; + ZSH_CACHE_DIR="${config.xdg.cacheHome}/oh-my-zsh"; + ''; + + # Make sure we create a cache directory since some plugins expect it to exist + # See: https://github.com/nix-community/home-manager/issues/761 + "${config.xdg.cacheHome}/oh-my-zsh/.keep".text = ""; + }; + }; + + programs.zsh.initContent = lib.mkOrder 800 '' + # oh-my-zsh extra settings for plugins + ${cfg.oh-my-zsh.extraConfig} + # oh-my-zsh configuration generated by NixOS + ${optionalString ( + cfg.oh-my-zsh.plugins != [ ] + ) "plugins=(${lib.concatStringsSep " " cfg.oh-my-zsh.plugins})"} + ${optionalString (cfg.oh-my-zsh.custom != "") ''ZSH_CUSTOM="${cfg.oh-my-zsh.custom}"''} + ${optionalString (cfg.oh-my-zsh.theme != "") ''ZSH_THEME="${cfg.oh-my-zsh.theme}"''} + source $ZSH/oh-my-zsh.sh + ''; + }; +}