home-manager/modules/programs/zsh/prezto.nix
Emily 3228f92b90 treewide: manually convert some docs to Markdown
These files all have options that trip up the `nix-doc-munge`
conversion tool for one reason or another (syntax that clashes with
Markdown, options that were already using Markdown syntax despite not
being marked that way, output that differs slightly after conversion,
syntax too elaborate to convert with some cheap regular expressions,
...). Translate them manually and do a little copyediting to options
in the vicinity while we're at it.
2023-07-17 16:49:35 +01:00

570 lines
18 KiB
Nix

{ config, pkgs, lib, ... }:
with lib;
let
cfg = config.programs.zsh.prezto;
relToDotDir = file:
(optionalString (config.programs.zsh.dotDir != null)
(config.programs.zsh.dotDir + "/")) + file;
preztoModule = types.submodule {
options = {
enable = mkEnableOption "prezto";
caseSensitive = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description =
"Set case-sensitivity for completion, history lookup, etc.";
};
color = mkOption {
type = types.nullOr types.bool;
default = true;
example = false;
description = lib.mdDoc ''
Color output (automatically set to `false` on dumb terminals).
'';
};
pmoduleDirs = mkOption {
type = types.listOf types.path;
default = [ ];
example = [ "$HOME/.zprezto-contrib" ];
description = "Add additional directories to load prezto modules from.";
};
extraConfig = mkOption {
type = types.lines;
default = "";
description = ''
Additional configuration to add to <filename>.zpreztorc</filename>.
'';
};
extraModules = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "attr" "stat" ];
description = lib.mdDoc ''
Set the Zsh modules to load ({manpage}`zshmodules(1)`).
'';
};
extraFunctions = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "zargs" "zmv" ];
description = lib.mdDoc ''
Set the Zsh functions to load ({manpage}`zshcontrib(1)`).
'';
};
pmodules = mkOption {
type = types.listOf types.str;
default = [
"environment"
"terminal"
"editor"
"history"
"directory"
"spectrum"
"utility"
"completion"
"prompt"
];
description =
"Set the Prezto modules to load (browse modules). The order matters.";
};
autosuggestions.color = mkOption {
type = types.nullOr types.str;
default = null;
example = "fg=blue";
description = "Set the query found color.";
};
completions.ignoredHosts = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "0.0.0.0" "127.0.0.1" ];
description = lib.mdDoc ''
Set the entries to ignore in static {file}`/etc/hosts` for
host completion.
'';
};
editor = {
keymap = mkOption {
type = types.nullOr (types.enum [ "emacs" "vi" ]);
default = "emacs";
example = "vi";
description = lib.mdDoc ''
Set the key mapping style to `emacs` or `vi`.
'';
};
dotExpansion = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = lib.mdDoc ''
Automatically convert `....` to `../..`
'';
};
promptContext = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = "Allow the Zsh prompt context to be shown.";
};
};
git.submoduleIgnore = mkOption {
type = types.nullOr (types.enum [ "dirty" "untracked" "all" "none" ]);
default = null;
example = "all";
description = lib.mdDoc ''
Ignore submodules when they are `dirty`, `untracked`, `all`,
or `none`.
'';
};
gnuUtility.prefix = mkOption {
type = types.nullOr types.str;
default = null;
example = "g";
description = "Set the command prefix on non-GNU systems.";
};
historySubstring = {
foundColor = mkOption {
type = types.nullOr types.str;
default = null;
example = "fg=blue";
description = "Set the query found color.";
};
notFoundColor = mkOption {
type = types.nullOr types.str;
default = null;
example = "fg=red";
description = "Set the query not found color.";
};
globbingFlags = mkOption {
type = types.nullOr types.str;
default = null;
description = "Set the search globbing flags.";
};
};
macOS.dashKeyword = mkOption {
type = types.nullOr types.str;
default = null;
example = "manpages";
description = lib.mdDoc ''
Set the keyword used by {command}`mand` to open man pages
in Dash.app.
'';
};
prompt = {
theme = mkOption {
type = types.nullOr types.str;
default = "sorin";
example = "pure";
description = lib.mdDoc ''
Set the prompt theme to load. Setting it to `random`
loads a random theme. Automatically set to `off` on dumb
terminals.
'';
};
pwdLength = mkOption {
type = types.nullOr (types.enum [ "short" "long" "full" ]);
default = null;
example = "short";
description = lib.mdDoc ''
Set the working directory prompt display length. By
default, it is set to `short`. Set it to `long` (without `~`
expansion) for longer or `full` (with `~` expansion) for
even longer prompt display.
'';
};
showReturnVal = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = ''
Set the prompt to display the return code along with an
indicator for non-zero return codes. This is not supported by all prompts.
'';
};
};
python = {
virtualenvAutoSwitch = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = "Auto switch to Python virtualenv on directory change.";
};
virtualenvInitialize = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description =
"Automatically initialize virtualenvwrapper if pre-requisites are met.";
};
};
ruby.chrubyAutoSwitch = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = "Auto switch the Ruby version on directory change.";
};
screen = {
autoStartLocal = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description =
"Auto start a session when Zsh is launched in a local terminal.";
};
autoStartRemote = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description =
"Auto start a session when Zsh is launched in a SSH connection.";
};
};
ssh.identities = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "id_rsa" "id_rsa2" "id_github" ];
description = "Set the SSH identities to load into the agent.";
};
syntaxHighlighting = {
highlighters = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "main" "brackets" "pattern" "line" "cursor" "root" ];
description = ''
Set syntax highlighters. By default, only the main
highlighter is enabled.
'';
};
styles = mkOption {
type = types.attrsOf types.str;
default = { };
example = {
builtin = "bg=blue";
command = "bg=blue";
function = "bg=blue";
};
description = "Set syntax highlighting styles.";
};
pattern = mkOption {
type = types.attrsOf types.str;
default = { };
example = { "rm*-rf*" = "fg=white,bold,bg=red"; };
description = "Set syntax pattern styles.";
};
};
terminal = {
autoTitle = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = "Auto set the tab and window titles.";
};
windowTitleFormat = mkOption {
type = types.nullOr types.str;
default = null;
example = "%n@%m: %s";
description = "Set the window title format.";
};
tabTitleFormat = mkOption {
type = types.nullOr types.str;
default = null;
example = "%m: %s";
description = "Set the tab title format.";
};
multiplexerTitleFormat = mkOption {
type = types.nullOr types.str;
default = null;
example = "%s";
description = "Set the multiplexer title format.";
};
};
tmux = {
autoStartLocal = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description =
"Auto start a session when Zsh is launched in a local terminal.";
};
autoStartRemote = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description =
"Auto start a session when Zsh is launched in a SSH connection.";
};
itermIntegration = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = "Integrate with iTerm2.";
};
defaultSessionName = mkOption {
type = types.nullOr types.str;
default = null;
example = "YOUR DEFAULT SESSION NAME";
description = "Set the default session name.";
};
};
utility.safeOps = mkOption {
type = types.nullOr types.bool;
default = null;
example = true;
description = lib.mdDoc ''
Enabled safe options. This aliases {command}`cp`,
{command}`ln`, {command}`mv` and {command}`rm` so that they
prompt before deleting or overwriting files. Set to `no` to
disable this safer behavior.
'';
};
};
};
in {
meta.maintainers = [ maintainers.nickhu ];
options = {
programs.zsh = {
prezto = mkOption {
type = preztoModule;
default = { };
description = "Options to configure prezto.";
};
};
};
config = mkIf cfg.enable (mkMerge [{
home.file."${relToDotDir ".zprofile"}".text =
builtins.readFile "${pkgs.zsh-prezto}/share/zsh-prezto/runcoms/zprofile";
home.file."${relToDotDir ".zlogin"}".text =
builtins.readFile "${pkgs.zsh-prezto}/share/zsh-prezto/runcoms/zlogin";
home.file."${relToDotDir ".zlogout"}".text =
builtins.readFile "${pkgs.zsh-prezto}/share/zsh-prezto/runcoms/zlogout";
home.packages = with pkgs; [ zsh-prezto ];
home.file."${relToDotDir ".zshenv"}".text =
builtins.readFile "${pkgs.zsh-prezto}/share/zsh-prezto/runcoms/zshenv";
home.file."${relToDotDir ".zpreztorc"}".text = ''
# Generated by Nix
${optionalString (cfg.caseSensitive != null) ''
zstyle ':prezto:*:*' case-sensitive '${
lib.hm.booleans.yesNo cfg.caseSensitive
}'
''}
${optionalString (cfg.color != null) ''
zstyle ':prezto:*:*' color '${lib.hm.booleans.yesNo cfg.color}'
''}
${optionalString (cfg.pmoduleDirs != [ ]) ''
zstyle ':prezto:load' pmodule-dirs ${
builtins.concatStringsSep " " cfg.pmoduleDirs
}
''}
${optionalString (cfg.extraModules != [ ]) ''
zstyle ':prezto:load' zmodule ${
strings.concatMapStringsSep " " strings.escapeShellArg
cfg.extraModules
}
''}
${optionalString (cfg.extraFunctions != [ ]) ''
zstyle ':prezto:load' zfunction ${
strings.concatMapStringsSep " " strings.escapeShellArg
cfg.extraFunctions
}
''}
${optionalString (cfg.pmodules != [ ]) ''
zstyle ':prezto:load' pmodule \
${
strings.concatMapStringsSep " \\\n " strings.escapeShellArg
cfg.pmodules
}
''}
${optionalString (cfg.autosuggestions.color != null) ''
zstyle ':prezto:module:autosuggestions:color' found '${cfg.autosuggestions.color}'
''}
${optionalString (cfg.completions.ignoredHosts != [ ]) ''
zstyle ':prezto:module:completion:*:hosts' etc-host-ignores \
${
strings.concatMapStringsSep " " strings.escapeShellArg
cfg.completions.ignoredHosts
}
''}
${optionalString (cfg.editor.keymap != null) ''
zstyle ':prezto:module:editor' key-bindings '${cfg.editor.keymap}'
''}
${optionalString (cfg.editor.dotExpansion != null) ''
zstyle ':prezto:module:editor' dot-expansion '${
lib.hm.booleans.yesNo cfg.editor.dotExpansion
}'
''}
${optionalString (cfg.editor.promptContext != null) ''
zstyle ':prezto:module:editor' ps-context '${
lib.hm.booleans.yesNo cfg.editor.promptContext
}'
''}
${optionalString (cfg.git.submoduleIgnore != null) ''
zstyle ':prezto:module:git:status:ignore' submodules '${cfg.git.submoduleIgnore}'
''}
${optionalString (cfg.gnuUtility.prefix != null) ''
zstyle ':prezto:module:gnu-utility' prefix '${cfg.gnuUtility.prefix}'
''}
${optionalString (cfg.historySubstring.foundColor != null) ''
zstyle ':prezto:module:history-substring-search:color' found '${cfg.historySubstring.foundColor}'
''}
${optionalString (cfg.historySubstring.notFoundColor != null) ''
zstyle ':prezto:module:history-substring-search:color' not-found '${cfg.historySubstring.notFoundColor}'
''}
${optionalString (cfg.historySubstring.globbingFlags != null) ''
zstyle ':prezto:module:history-substring-search:color' globbing-flags '${cfg.historySubstring.globbingFlags}'
''}
${optionalString (cfg.macOS.dashKeyword != null) ''
zstyle ':prezto:module:osx:man' dash-keyword '${cfg.macOS.dashKeyword}'
''}
${optionalString (cfg.prompt.theme != null) ''
zstyle ':prezto:module:prompt' theme '${cfg.prompt.theme}'
''}
${optionalString (cfg.prompt.pwdLength != null) ''
zstyle ':prezto:module:prompt' pwd-length '${cfg.prompt.pwdLength}'
''}
${optionalString (cfg.prompt.showReturnVal != null) ''
zstyle ':prezto:module:prompt' show-return-val '${
lib.hm.booleans.yesNo cfg.prompt.showReturnVal
}'
''}
${optionalString (cfg.python.virtualenvAutoSwitch != null) ''
zstyle ':prezto:module:python:virtualenv' auto-switch '${
lib.hm.booleans.yesNo cfg.python.virtualenvAutoSwitch
}'
''}
${optionalString (cfg.python.virtualenvInitialize != null) ''
zstyle ':prezto:module:python:virtualenv' initialize '${
lib.hm.booleans.yesNo cfg.python.virtualenvInitialize
}'
''}
${optionalString (cfg.ruby.chrubyAutoSwitch != null) ''
zstyle ':prezto:module:ruby:chruby' auto-switch '${
lib.hm.booleans.yesNo cfg.ruby.chrubyAutoSwitch
}'
''}
${optionalString (cfg.screen.autoStartLocal != null) ''
zstyle ':prezto:module:screen:auto-start' local '${
lib.hm.booleans.yesNo cfg.screen.autoStartLocal
}'
''}
${optionalString (cfg.screen.autoStartRemote != null) ''
zstyle ':prezto:module:screen:auto-start' remote '${
lib.hm.booleans.yesNo cfg.screen.autoStartRemote
}'
''}
${optionalString (cfg.ssh.identities != [ ]) ''
zstyle ':prezto:module:ssh:load' identities \
${
strings.concatMapStringsSep " " strings.escapeShellArg
cfg.ssh.identities
}
''}
${optionalString (cfg.syntaxHighlighting.highlighters != [ ]) ''
zstyle ':prezto:module:syntax-highlighting' highlighters \
${
strings.concatMapStringsSep " \\\n " strings.escapeShellArg
cfg.syntaxHighlighting.highlighters
}
''}
${optionalString (cfg.syntaxHighlighting.styles != { }) ''
zstyle ':prezto:module:syntax-highlighting' styles \
${
builtins.concatStringsSep " \\\n" (attrsets.mapAttrsToList
(k: v: strings.escapeShellArg k + " " + strings.escapeShellArg v)
cfg.syntaxHighlighting.styles)
}
''}
${optionalString (cfg.syntaxHighlighting.pattern != { }) ''
zstyle ':prezto:module:syntax-highlighting' pattern \
${
builtins.concatStringsSep " \\\n" (attrsets.mapAttrsToList
(k: v: strings.escapeShellArg k + " " + strings.escapeShellArg v)
cfg.syntaxHighlighting.pattern)
}
''}
${optionalString (cfg.terminal.autoTitle != null) ''
zstyle ':prezto:module:terminal' auto-title '${
lib.hm.booleans.yesNo cfg.terminal.autoTitle
}'
''}
${optionalString (cfg.terminal.windowTitleFormat != null) ''
zstyle ':prezto:module:terminal:window-title' format '${cfg.terminal.windowTitleFormat}'
''}
${optionalString (cfg.terminal.tabTitleFormat != null) ''
zstyle ':prezto:module:terminal:tab-title' format '${cfg.terminal.tabTitleFormat}'
''}
${optionalString (cfg.terminal.multiplexerTitleFormat != null) ''
zstyle ':prezto:module:terminal:multiplexer-title' format '${cfg.terminal.multiplexerTitleFormat}'
''}
${optionalString (cfg.tmux.autoStartLocal != null) ''
zstyle ':prezto:module:tmux:auto-start' local '${
lib.hm.booleans.yesNo cfg.tmux.autoStartLocal
}'
''}
${optionalString (cfg.tmux.autoStartRemote != null) ''
zstyle ':prezto:module:tmux:auto-start' remote '${
lib.hm.booleans.yesNo cfg.tmux.autoStartRemote
}'
''}
${optionalString (cfg.tmux.itermIntegration != null) ''
zstyle ':prezto:module:tmux:iterm' integrate '${
lib.hm.booleans.yesNo cfg.tmux.itermIntegration
}'
''}
${optionalString (cfg.tmux.defaultSessionName != null) ''
zstyle ':prezto:module:tmux:session' name '${cfg.tmux.defaultSessionName}'
''}
${optionalString (cfg.utility.safeOps != null) ''
zstyle ':prezto:module:utility' safe-ops '${
lib.hm.booleans.yesNo cfg.utility.safeOps
}'
''}
${cfg.extraConfig}
'';
}]);
}