1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-12-13 12:31:07 +01:00

treewide: remove formatting excludes

This removes the last three formatting excludes so that the entire
project is formatted by nixfmt. This is the first step towards moving
to the RFC style format.
This commit is contained in:
Robert Helgesson 2024-12-13 13:20:31 +01:00
parent 3066cc58f5
commit a17d730ab5
No known key found for this signature in database
GPG key ID: 96E745BD17AA17ED
4 changed files with 540 additions and 574 deletions

14
format
View file

@ -23,23 +23,9 @@ for arg do
esac esac
done done
# The excludes are for files touched by open pull requests and we want
# to avoid merge conflicts.
excludes=(
modules/files.nix
modules/home-environment.nix
modules/programs/zsh.nix
)
exclude_args=()
for e in "${excludes[@]}"; do
exclude_args+=(-e "$e")
done
git_root=$(git rev-parse --show-toplevel) git_root=$(git rev-parse --show-toplevel)
git ls-files -z --cached --others --full-name -- "${files[@]}" | git ls-files -z --cached --others --full-name -- "${files[@]}" |
grep -z '\.nix$' | grep -z '\.nix$' |
grep -z -v "${exclude_args[@]}" |
sed -z "s|^|$git_root/|" | sed -z "s|^|$git_root/|" |
xargs -0 nixfmt "${nixfmt_args[@]}" xargs -0 nixfmt "${nixfmt_args[@]}"

View file

@ -8,22 +8,22 @@ let
homeDirectory = config.home.homeDirectory; homeDirectory = config.home.homeDirectory;
fileType = (import lib/file-type.nix { fileType =
inherit homeDirectory lib pkgs; (import lib/file-type.nix { inherit homeDirectory lib pkgs; }).fileType;
}).fileType;
sourceStorePath = file: sourceStorePath = file:
let let
sourcePath = toString file.source; sourcePath = toString file.source;
sourceName = config.lib.strings.storeFileName (baseNameOf sourcePath); sourceName = config.lib.strings.storeFileName (baseNameOf sourcePath);
in in if builtins.hasContext sourcePath then
if builtins.hasContext sourcePath file.source
then file.source else
else builtins.path { path = file.source; name = sourceName; }; builtins.path {
path = file.source;
name = sourceName;
};
in in {
{
options = { options = {
home.file = mkOption { home.file = mkOption {
description = "Attribute set of files to link into the user home."; description = "Attribute set of files to link into the user home.";
@ -39,11 +39,9 @@ in
}; };
config = { config = {
assertions = [( assertions = [
let (let
dups = dups = attrNames (filterAttrs (n: v: v > 1)
attrNames
(filterAttrs (n: v: v > 1)
(foldAttrs (acc: v: acc + v) 0 (foldAttrs (acc: v: acc + v) 0
(mapAttrsToList (n: v: { ${v.target} = 1; }) cfg))); (mapAttrsToList (n: v: { ${v.target} = 1; }) cfg)));
dupsStr = concatStringsSep ", " dups; dupsStr = concatStringsSep ", " dups;
@ -65,19 +63,17 @@ in
let let
pathStr = toString path; pathStr = toString path;
name = hm.strings.storeFileName (baseNameOf pathStr); name = hm.strings.storeFileName (baseNameOf pathStr);
in in pkgs.runCommandLocal name { } "ln -s ${escapeShellArg pathStr} $out";
pkgs.runCommandLocal name {} ''ln -s ${escapeShellArg pathStr} $out'';
# This verifies that the links we are about to create will not # This verifies that the links we are about to create will not
# overwrite an existing file. # overwrite an existing file.
home.activation.checkLinkTargets = hm.dag.entryBefore ["writeBoundary"] ( home.activation.checkLinkTargets = hm.dag.entryBefore [ "writeBoundary" ]
let (let
# Paths that should be forcibly overwritten by Home Manager. # Paths that should be forcibly overwritten by Home Manager.
# Caveat emptor! # Caveat emptor!
forcedPaths = forcedPaths =
concatMapStringsSep " " (p: ''"$HOME"/${escapeShellArg p}'') concatMapStringsSep " " (p: ''"$HOME"/${escapeShellArg p}'')
(mapAttrsToList (n: v: v.target) (mapAttrsToList (n: v: v.target) (filterAttrs (n: v: v.force) cfg));
(filterAttrs (n: v: v.force) cfg));
storeDir = escapeShellArg builtins.storeDir; storeDir = escapeShellArg builtins.storeDir;
@ -87,8 +83,7 @@ in
inherit (config.lib.bash) initHomeManagerLib; inherit (config.lib.bash) initHomeManagerLib;
inherit forcedPaths storeDir; inherit forcedPaths storeDir;
}; };
in in ''
''
function checkNewGenCollision() { function checkNewGenCollision() {
local newGenFiles local newGenFiles
newGenFiles="$(readlink -e "$newGenPath/home-files")" newGenFiles="$(readlink -e "$newGenPath/home-files")"
@ -97,8 +92,7 @@ in
} }
checkNewGenCollision || exit 1 checkNewGenCollision || exit 1
'' '');
);
# This activation script will # This activation script will
# #
@ -121,8 +115,7 @@ in
# and a failure during the intermediate state FA ∩ FB will not # and a failure during the intermediate state FA ∩ FB will not
# result in lost links because this set of links are in both the # result in lost links because this set of links are in both the
# source and target generation. # source and target generation.
home.activation.linkGeneration = hm.dag.entryAfter ["writeBoundary"] ( home.activation.linkGeneration = hm.dag.entryAfter [ "writeBoundary" ] (let
let
link = pkgs.writeShellScript "link" '' link = pkgs.writeShellScript "link" ''
${config.lib.bash.initHomeManagerLib} ${config.lib.bash.initHomeManagerLib}
@ -154,7 +147,9 @@ in
# A symbolic link whose target path matches this pattern will be # A symbolic link whose target path matches this pattern will be
# considered part of a Home Manager generation. # considered part of a Home Manager generation.
homeFilePattern="$(readlink -e ${escapeShellArg builtins.storeDir})/*-home-manager-files/*" homeFilePattern="$(readlink -e ${
escapeShellArg builtins.storeDir
})/*-home-manager-files/*"
newGenFiles="$1" newGenFiles="$1"
shift 1 shift 1
@ -185,8 +180,7 @@ in
fi fi
done done
''; '';
in in ''
''
function linkNewGen() { function linkNewGen() {
_i "Creating home file links in %s" "$HOME" _i "Creating home file links in %s" "$HOME"
@ -238,12 +232,10 @@ in
fi fi
linkNewGen linkNewGen
'' '');
);
home.activation.checkFilesChanged = hm.dag.entryBefore ["linkGeneration"] ( home.activation.checkFilesChanged = hm.dag.entryBefore [ "linkGeneration" ]
let (let homeDirArg = escapeShellArg homeDirectory;
homeDirArg = escapeShellArg homeDirectory;
in '' in ''
function _cmp() { function _cmp() {
if [[ -d $1 && -d $2 ]]; then if [[ -d $1 && -d $2 ]]; then
@ -261,14 +253,12 @@ in
_cmp ${sourceArg} ${homeDirArg}/${targetArg} \ _cmp ${sourceArg} ${homeDirArg}/${targetArg} \
&& changedFiles[${targetArg}]=0 \ && changedFiles[${targetArg}]=0 \
|| changedFiles[${targetArg}]=1 || changedFiles[${targetArg}]=1
'') (filter (v: v.onChange != "") (attrValues cfg)) '') (filter (v: v.onChange != "") (attrValues cfg)) + ''
+ ''
unset -f _cmp unset -f _cmp
'' '');
);
home.activation.onFilesChange = hm.dag.entryAfter ["linkGeneration"] ( home.activation.onFilesChange = hm.dag.entryAfter [ "linkGeneration" ]
concatMapStrings (v: '' (concatMapStrings (v: ''
if (( ''${changedFiles[${escapeShellArg v.target}]} == 1 )); then if (( ''${changedFiles[${escapeShellArg v.target}]} == 1 )); then
if [[ -v DRY_RUN || -v VERBOSE ]]; then if [[ -v DRY_RUN || -v VERBOSE ]]; then
echo "Running onChange hook for" ${escapeShellArg v.target} echo "Running onChange hook for" ${escapeShellArg v.target}
@ -277,17 +267,13 @@ in
${v.onChange} ${v.onChange}
fi fi
fi fi
'') (filter (v: v.onChange != "") (attrValues cfg)) '') (filter (v: v.onChange != "") (attrValues cfg)));
);
# Symlink directories and files that have the right execute bit. # Symlink directories and files that have the right execute bit.
# Copy files that need their execute bit changed. # Copy files that need their execute bit changed.
home-files = pkgs.runCommandLocal home-files = pkgs.runCommandLocal "home-manager-files" {
"home-manager-files"
{
nativeBuildInputs = [ pkgs.xorg.lndir ]; nativeBuildInputs = [ pkgs.xorg.lndir ];
} } (''
(''
mkdir -p $out mkdir -p $out
# Needed in case /nix is a symbolic link. # Needed in case /nix is a symbolic link.
@ -349,18 +335,15 @@ in
fi fi
fi fi
} }
'' + concatStrings ( '' + concatStrings (mapAttrsToList (n: v: ''
mapAttrsToList (n: v: ''
insertFile ${ insertFile ${
escapeShellArgs [ escapeShellArgs [
(sourceStorePath v) (sourceStorePath v)
v.target v.target
(if v.executable == null (if v.executable == null then "inherit" else toString v.executable)
then "inherit"
else toString v.executable)
(toString v.recursive) (toString v.recursive)
]} ]
'') cfg }
)); '') cfg));
}; };
} }

View file

@ -113,10 +113,10 @@ let
options = { options = {
layout = mkOption { layout = mkOption {
type = with types; nullOr str; type = with types; nullOr str;
default = default = if versionAtLeast config.home.stateVersion "19.09" then
if versionAtLeast config.home.stateVersion "19.09" null
then null else
else "us"; "us";
defaultText = literalExpression "null"; defaultText = literalExpression "null";
description = '' description = ''
Keyboard layout. If `null`, then the system Keyboard layout. If `null`, then the system
@ -148,9 +148,7 @@ let
variant = mkOption { variant = mkOption {
type = with types; nullOr str; type = with types; nullOr str;
default = default =
if versionAtLeast config.home.stateVersion "19.09" if versionAtLeast config.home.stateVersion "19.09" then null else "";
then null
else "";
defaultText = literalExpression "null"; defaultText = literalExpression "null";
example = "colemak"; example = "colemak";
description = '' description = ''
@ -164,9 +162,7 @@ let
}; };
}; };
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
imports = [ imports = [
@ -257,7 +253,10 @@ in
home.sessionVariables = mkOption { home.sessionVariables = mkOption {
default = { }; default = { };
type = with types; lazyAttrsOf (oneOf [ str path int float ]); type = with types; lazyAttrsOf (oneOf [ str path int float ]);
example = { EDITOR = "emacs"; GS_OPTIONS = "-sPAPERSIZE=a4"; }; example = {
EDITOR = "emacs";
GS_OPTIONS = "-sPAPERSIZE=a4";
};
description = '' description = ''
Environment variables to always set at login. Environment variables to always set at login.
@ -494,15 +493,12 @@ in
} }
]; ];
warnings = warnings = let
let
hmRelease = config.home.version.release; hmRelease = config.home.version.release;
nixpkgsRelease = lib.trivial.release; nixpkgsRelease = lib.trivial.release;
releaseMismatch = releaseMismatch = config.home.enableNixpkgsReleaseCheck && hmRelease
config.home.enableNixpkgsReleaseCheck != nixpkgsRelease;
&& hmRelease != nixpkgsRelease; in optional releaseMismatch ''
in
optional releaseMismatch ''
You are using You are using
Home Manager version ${hmRelease} and Home Manager version ${hmRelease} and
@ -519,52 +515,38 @@ in
to your configuration. to your configuration.
''; '';
home.username = home.username = mkIf (versionOlder config.home.stateVersion "20.09")
mkIf (versionOlder config.home.stateVersion "20.09")
(mkDefault (builtins.getEnv "USER")); (mkDefault (builtins.getEnv "USER"));
home.homeDirectory = home.homeDirectory = mkIf (versionOlder config.home.stateVersion "20.09")
mkIf (versionOlder config.home.stateVersion "20.09")
(mkDefault (builtins.getEnv "HOME")); (mkDefault (builtins.getEnv "HOME"));
home.profileDirectory = home.profileDirectory = if config.submoduleSupport.enable
if config.submoduleSupport.enable && config.submoduleSupport.externalPackageInstall then
&& config.submoduleSupport.externalPackageInstall "/etc/profiles/per-user/${cfg.username}"
then "/etc/profiles/per-user/${cfg.username}" else if config.nix.enable
else if config.nix.enable && (config.nix.settings.use-xdg-base-directories or false) && (config.nix.settings.use-xdg-base-directories or false) then
then "${config.xdg.stateHome}/nix/profile" "${config.xdg.stateHome}/nix/profile"
else cfg.homeDirectory + "/.nix-profile"; else
cfg.homeDirectory + "/.nix-profile";
programs.bash.shellAliases = cfg.shellAliases; programs.bash.shellAliases = cfg.shellAliases;
programs.zsh.shellAliases = cfg.shellAliases; programs.zsh.shellAliases = cfg.shellAliases;
programs.fish.shellAliases = cfg.shellAliases; programs.fish.shellAliases = cfg.shellAliases;
home.sessionVariables = home.sessionVariables =
let let maybeSet = n: v: optionalAttrs (v != null) { ${n} = v; };
maybeSet = n: v: optionalAttrs (v != null) { ${n} = v; }; in (maybeSet "LANG" cfg.language.base)
in // (maybeSet "LC_CTYPE" cfg.language.ctype)
(maybeSet "LANG" cfg.language.base) // (maybeSet "LC_NUMERIC" cfg.language.numeric)
// // (maybeSet "LC_TIME" cfg.language.time)
(maybeSet "LC_CTYPE" cfg.language.ctype) // (maybeSet "LC_COLLATE" cfg.language.collate)
// // (maybeSet "LC_MONETARY" cfg.language.monetary)
(maybeSet "LC_NUMERIC" cfg.language.numeric) // (maybeSet "LC_MESSAGES" cfg.language.messages)
// // (maybeSet "LC_PAPER" cfg.language.paper)
(maybeSet "LC_TIME" cfg.language.time) // (maybeSet "LC_NAME" cfg.language.name)
// // (maybeSet "LC_ADDRESS" cfg.language.address)
(maybeSet "LC_COLLATE" cfg.language.collate) // (maybeSet "LC_TELEPHONE" cfg.language.telephone)
// // (maybeSet "LC_MEASUREMENT" cfg.language.measurement);
(maybeSet "LC_MONETARY" cfg.language.monetary)
//
(maybeSet "LC_MESSAGES" cfg.language.messages)
//
(maybeSet "LC_PAPER" cfg.language.paper)
//
(maybeSet "LC_NAME" cfg.language.name)
//
(maybeSet "LC_ADDRESS" cfg.language.address)
//
(maybeSet "LC_TELEPHONE" cfg.language.telephone)
//
(maybeSet "LC_MEASUREMENT" cfg.language.measurement);
# Provide a file holding all session variables. # Provide a file holding all session variables.
home.sessionVariablesPackage = pkgs.writeTextFile { home.sessionVariablesPackage = pkgs.writeTextFile {
@ -602,14 +584,10 @@ in
# In case the user has moved from a user-install of Home Manager # In case the user has moved from a user-install of Home Manager
# to a submodule managed one we attempt to uninstall the # to a submodule managed one we attempt to uninstall the
# `home-manager-path` package if it is installed. # `home-manager-path` package if it is installed.
home.activation.installPackages = hm.dag.entryAfter ["writeBoundary"] ( home.activation.installPackages = hm.dag.entryAfter [ "writeBoundary" ]
if config.submoduleSupport.externalPackageInstall (if config.submoduleSupport.externalPackageInstall then ''
then
''
nixProfileRemove home-manager-path nixProfileRemove home-manager-path
'' '' else ''
else
''
function nixReplaceProfile() { function nixReplaceProfile() {
local oldNix="$(command -v nix)" local oldNix="$(command -v nix)"
@ -637,14 +615,12 @@ in
fi fi
unset -f nixReplaceProfile unset -f nixReplaceProfile
unset INSTALL_CMD INSTALL_CMD_ACTUAL LIST_CMD REMOVE_CMD_SYNTAX unset INSTALL_CMD INSTALL_CMD_ACTUAL LIST_CMD REMOVE_CMD_SYNTAX
'' '');
);
# Text containing Bash commands that will initialize the Home Manager Bash # Text containing Bash commands that will initialize the Home Manager Bash
# library. Most importantly, this will prepare for using translated strings # library. Most importantly, this will prepare for using translated strings
# in the `hm-modules` text domain. # in the `hm-modules` text domain.
lib.bash.initHomeManagerLib = lib.bash.initHomeManagerLib = let
let
domainDir = pkgs.runCommand "hm-modules-messages" { domainDir = pkgs.runCommand "hm-modules-messages" {
nativeBuildInputs = [ pkgs.buildPackages.gettext ]; nativeBuildInputs = [ pkgs.buildPackages.gettext ];
} '' } ''
@ -655,22 +631,19 @@ in
msgfmt -o "$out/$lang/LC_MESSAGES/hm-modules.mo" "$path" msgfmt -o "$out/$lang/LC_MESSAGES/hm-modules.mo" "$path"
done done
''; '';
in in ''
''
export TEXTDOMAIN=hm-modules export TEXTDOMAIN=hm-modules
export TEXTDOMAINDIR=${domainDir} export TEXTDOMAINDIR=${domainDir}
source ${../lib/bash/home-manager.sh} source ${../lib/bash/home-manager.sh}
''; '';
home.activationPackage = home.activationPackage = let
let
mkCmd = res: '' mkCmd = res: ''
_iNote "Activating %s" "${res.name}" _iNote "Activating %s" "${res.name}"
${res.data} ${res.data}
''; '';
sortedCommands = hm.dag.topoSort cfg.activation; sortedCommands = hm.dag.topoSort cfg.activation;
activationCmds = activationCmds = if sortedCommands ? result then
if sortedCommands ? result then
concatStringsSep "\n" (map mkCmd sortedCommands.result) concatStringsSep "\n" (map mkCmd sortedCommands.result)
else else
abort ("Dependency cycle in activation script: " abort ("Dependency cycle in activation script: "
@ -678,8 +651,8 @@ in
# Programs that always should be available on the activation # Programs that always should be available on the activation
# script's PATH. # script's PATH.
activationBinPaths = lib.makeBinPath ( activationBinPaths = lib.makeBinPath (with pkgs;
with pkgs; [ [
bash bash
coreutils coreutils
diffutils # For `cmp` and `diff`. diffutils # For `cmp` and `diff`.
@ -689,17 +662,13 @@ in
gnused gnused
jq jq
ncurses # For `tput`. ncurses # For `tput`.
] ] ++ config.home.extraActivationPath) + (
++ config.home.extraActivationPath
)
+ (
# Add path of the Nix binaries, if a Nix package is configured, then # Add path of the Nix binaries, if a Nix package is configured, then
# use that one, otherwise grab the path of the nix-env tool. # use that one, otherwise grab the path of the nix-env tool.
if config.nix.enable && config.nix.package != null then if config.nix.enable && config.nix.package != null then
":${config.nix.package}/bin" ":${config.nix.package}/bin"
else else
":$(${pkgs.coreutils}/bin/dirname $(${pkgs.coreutils}/bin/readlink -m $(type -p nix-env)))" ":$(${pkgs.coreutils}/bin/dirname $(${pkgs.coreutils}/bin/readlink -m $(type -p nix-env)))")
)
+ optionalString (!cfg.emptyActivationPath) "\${PATH:+:}$PATH"; + optionalString (!cfg.emptyActivationPath) "\${PATH:+:}$PATH";
activationScript = pkgs.writeShellScript "activation-script" '' activationScript = pkgs.writeShellScript "activation-script" ''
@ -720,13 +689,7 @@ in
${activationCmds} ${activationCmds}
''; '';
in in pkgs.runCommand "home-manager-generation" { preferLocalBuild = true; } ''
pkgs.runCommand
"home-manager-generation"
{
preferLocalBuild = true;
}
''
mkdir -p $out mkdir -p $out
echo "${config.home.version.full}" > $out/hm-version echo "${config.home.version.full}" > $out/hm-version

View file

@ -6,21 +6,21 @@ let
cfg = config.programs.zsh; cfg = config.programs.zsh;
relToDotDir = file: (optionalString (cfg.dotDir != null) (cfg.dotDir + "/")) + file; relToDotDir = file:
(optionalString (cfg.dotDir != null) (cfg.dotDir + "/")) + file;
pluginsDir = if cfg.dotDir != null then pluginsDir =
relToDotDir "plugins" else ".zsh/plugins"; if cfg.dotDir != null then relToDotDir "plugins" else ".zsh/plugins";
envVarsStr = config.lib.zsh.exportAll cfg.sessionVariables; envVarsStr = config.lib.zsh.exportAll cfg.sessionVariables;
localVarsStr = config.lib.zsh.defineAll cfg.localVariables; localVarsStr = config.lib.zsh.defineAll cfg.localVariables;
aliasesStr = concatStringsSep "\n" ( aliasesStr = concatStringsSep "\n" (mapAttrsToList
mapAttrsToList (k: v: "alias -- ${lib.escapeShellArg k}=${lib.escapeShellArg v}") cfg.shellAliases (k: v: "alias -- ${lib.escapeShellArg k}=${lib.escapeShellArg v}")
); cfg.shellAliases);
dirHashesStr = concatStringsSep "\n" ( dirHashesStr = concatStringsSep "\n"
mapAttrsToList (k: v: ''hash -d ${k}="${v}"'') cfg.dirHashes (mapAttrsToList (k: v: ''hash -d ${k}="${v}"'') cfg.dirHashes);
);
zdotdir = "$HOME/" + lib.escapeShellArg cfg.dotDir; zdotdir = "$HOME/" + lib.escapeShellArg cfg.dotDir;
@ -64,14 +64,16 @@ let
path = mkOption { path = mkOption {
type = types.str; type = types.str;
default = if versionAtLeast stateVersion "20.03" default = if versionAtLeast stateVersion "20.03" then
then "$HOME/.zsh_history" "$HOME/.zsh_history"
else relToDotDir ".zsh_history"; else
relToDotDir ".zsh_history";
defaultText = literalExpression '' defaultText = literalExpression ''
"$HOME/.zsh_history" if state version 20.03, "$HOME/.zsh_history" if state version 20.03,
"$ZDOTDIR/.zsh_history" otherwise "$ZDOTDIR/.zsh_history" otherwise
''; '';
example = literalExpression ''"''${config.xdg.dataHome}/zsh/zsh_history"''; example =
literalExpression ''"''${config.xdg.dataHome}/zsh/zsh_history"'';
description = "History file location"; description = "History file location";
}; };
@ -273,13 +275,25 @@ let
}; };
}; };
in in {
{
imports = [ imports = [
(mkRenamedOptionModule [ "programs" "zsh" "enableAutosuggestions" ] [ "programs" "zsh" "autosuggestion" "enable" ]) (mkRenamedOptionModule [ "programs" "zsh" "enableAutosuggestions" ] [
(mkRenamedOptionModule [ "programs" "zsh" "enableSyntaxHighlighting" ] [ "programs" "zsh" "syntaxHighlighting" "enable" ]) "programs"
(mkRenamedOptionModule [ "programs" "zsh" "zproof" ] [ "programs" "zsh" "zprof" ]) "zsh"
"autosuggestion"
"enable"
])
(mkRenamedOptionModule [ "programs" "zsh" "enableSyntaxHighlighting" ] [
"programs"
"zsh"
"syntaxHighlighting"
"enable"
])
(mkRenamedOptionModule [ "programs" "zsh" "zproof" ] [
"programs"
"zsh"
"zprof"
])
]; ];
options = { options = {
@ -374,7 +388,8 @@ in
completionInit = mkOption { completionInit = mkOption {
default = "autoload -U compinit && compinit"; default = "autoload -U compinit && compinit";
description = "Initialization commands to run when completion is enabled."; description =
"Initialization commands to run when completion is enabled.";
type = types.lines; type = types.lines;
}; };
@ -415,7 +430,8 @@ in
}; };
strategy = mkOption { strategy = mkOption {
type = types.listOf (types.enum [ "history" "completion" "match_prev_cmd" ]); type = types.listOf
(types.enum [ "history" "completion" "match_prev_cmd" ]);
default = [ "history" ]; default = [ "history" ];
description = '' description = ''
`ZSH_AUTOSUGGEST_STRATEGY` is an array that specifies how suggestions should be generated. `ZSH_AUTOSUGGEST_STRATEGY` is an array that specifies how suggestions should be generated.
@ -457,7 +473,8 @@ in
initExtraBeforeCompInit = mkOption { initExtraBeforeCompInit = mkOption {
default = ""; default = "";
type = types.lines; type = types.lines;
description = "Extra commands that should be added to {file}`.zshrc` before compinit."; description =
"Extra commands that should be added to {file}`.zshrc` before compinit.";
}; };
initExtra = mkOption { initExtra = mkOption {
@ -481,7 +498,8 @@ in
profileExtra = mkOption { profileExtra = mkOption {
default = ""; default = "";
type = types.lines; type = types.lines;
description = "Extra commands that should be added to {file}`.zprofile`."; description =
"Extra commands that should be added to {file}`.zprofile`.";
}; };
loginExtra = mkOption { loginExtra = mkOption {
@ -493,7 +511,8 @@ in
logoutExtra = mkOption { logoutExtra = mkOption {
default = ""; default = "";
type = types.lines; type = types.lines;
description = "Extra commands that should be added to {file}`.zlogout`."; description =
"Extra commands that should be added to {file}`.zlogout`.";
}; };
plugins = mkOption { plugins = mkOption {
@ -638,18 +657,20 @@ in
# Oh-My-Zsh/Prezto calls compinit during initialization, # Oh-My-Zsh/Prezto calls compinit during initialization,
# calling it twice causes slight start up slowdown # calling it twice causes slight start up slowdown
# as all $fpath entries will be traversed again. # as all $fpath entries will be traversed again.
${optionalString (cfg.enableCompletion && !cfg.oh-my-zsh.enable && !cfg.prezto.enable) ${optionalString
cfg.completionInit (cfg.enableCompletion && !cfg.oh-my-zsh.enable && !cfg.prezto.enable)
}'' cfg.completionInit}''
(optionalString cfg.autosuggestion.enable '' (optionalString cfg.autosuggestion.enable ''
source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh
${optionalString (cfg.autosuggestion.strategy != [ ]) '' ${optionalString (cfg.autosuggestion.strategy != [ ]) ''
ZSH_AUTOSUGGEST_STRATEGY=(${concatStringsSep " " cfg.autosuggestion.strategy}) ZSH_AUTOSUGGEST_STRATEGY=(${
'' concatStringsSep " " cfg.autosuggestion.strategy
} })
''}
'') '')
(optionalString (cfg.autosuggestion.enable && cfg.autosuggestion.highlight != null) '' (optionalString
(cfg.autosuggestion.enable && cfg.autosuggestion.highlight != null) ''
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="${cfg.autosuggestion.highlight}" ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="${cfg.autosuggestion.highlight}"
'') '')
@ -658,20 +679,17 @@ in
${cfg.oh-my-zsh.extraConfig} ${cfg.oh-my-zsh.extraConfig}
# oh-my-zsh configuration generated by NixOS # oh-my-zsh configuration generated by NixOS
${optionalString (cfg.oh-my-zsh.plugins != [ ]) ${optionalString (cfg.oh-my-zsh.plugins != [ ])
"plugins=(${concatStringsSep " " cfg.oh-my-zsh.plugins})" "plugins=(${concatStringsSep " " cfg.oh-my-zsh.plugins})"}
}
${optionalString (cfg.oh-my-zsh.custom != "") ${optionalString (cfg.oh-my-zsh.custom != "")
"ZSH_CUSTOM=\"${cfg.oh-my-zsh.custom}\"" ''ZSH_CUSTOM="${cfg.oh-my-zsh.custom}"''}
}
${optionalString (cfg.oh-my-zsh.theme != "") ${optionalString (cfg.oh-my-zsh.theme != "")
"ZSH_THEME=\"${cfg.oh-my-zsh.theme}\"" ''ZSH_THEME="${cfg.oh-my-zsh.theme}"''}
}
source $ZSH/oh-my-zsh.sh source $ZSH/oh-my-zsh.sh
'') '')
'' ''
${optionalString cfg.prezto.enable ${optionalString cfg.prezto.enable (builtins.readFile
(builtins.readFile "${pkgs.zsh-prezto}/share/zsh-prezto/runcoms/zshrc")} "${pkgs.zsh-prezto}/share/zsh-prezto/runcoms/zshrc")}
${concatStrings (map (plugin: '' ${concatStrings (map (plugin: ''
if [[ -f "$HOME/${pluginsDir}/${plugin.name}/${plugin.file}" ]]; then if [[ -f "$HOME/${pluginsDir}/${plugin.name}/${plugin.file}" ]]; then
@ -683,30 +701,49 @@ in
# See https://github.com/nix-community/home-manager/issues/177. # See https://github.com/nix-community/home-manager/issues/177.
HISTSIZE="${toString cfg.history.size}" HISTSIZE="${toString cfg.history.size}"
SAVEHIST="${toString cfg.history.save}" SAVEHIST="${toString cfg.history.save}"
${optionalString (cfg.history.ignorePatterns != []) "HISTORY_IGNORE=${lib.escapeShellArg "(${lib.concatStringsSep "|" cfg.history.ignorePatterns})"}"} ${optionalString (cfg.history.ignorePatterns != [ ])
${if versionAtLeast config.home.stateVersion "20.03" "HISTORY_IGNORE=${
then ''HISTFILE="${cfg.history.path}"'' lib.escapeShellArg
else ''HISTFILE="$HOME/${cfg.history.path}"''} "(${lib.concatStringsSep "|" cfg.history.ignorePatterns})"
}"}
${if versionAtLeast config.home.stateVersion "20.03" then
''HISTFILE="${cfg.history.path}"''
else
''HISTFILE="$HOME/${cfg.history.path}"''}
mkdir -p "$(dirname "$HISTFILE")" mkdir -p "$(dirname "$HISTFILE")"
setopt HIST_FCNTL_LOCK setopt HIST_FCNTL_LOCK
${if cfg.history.append then "setopt" else "unsetopt"} APPEND_HISTORY ${if cfg.history.append then "setopt" else "unsetopt"} APPEND_HISTORY
${if cfg.history.ignoreDups then "setopt" else "unsetopt"} HIST_IGNORE_DUPS ${
${if cfg.history.ignoreAllDups then "setopt" else "unsetopt"} HIST_IGNORE_ALL_DUPS if cfg.history.ignoreDups then "setopt" else "unsetopt"
${if cfg.history.ignoreSpace then "setopt" else "unsetopt"} HIST_IGNORE_SPACE } HIST_IGNORE_DUPS
${if cfg.history.expireDuplicatesFirst then "setopt" else "unsetopt"} HIST_EXPIRE_DUPS_FIRST ${
if cfg.history.ignoreAllDups then "setopt" else "unsetopt"
} HIST_IGNORE_ALL_DUPS
${
if cfg.history.ignoreSpace then "setopt" else "unsetopt"
} HIST_IGNORE_SPACE
${
if cfg.history.expireDuplicatesFirst then "setopt" else "unsetopt"
} HIST_EXPIRE_DUPS_FIRST
${if cfg.history.share then "setopt" else "unsetopt"} SHARE_HISTORY ${if cfg.history.share then "setopt" else "unsetopt"} SHARE_HISTORY
${if cfg.history.extended then "setopt" else "unsetopt"} EXTENDED_HISTORY ${
${if cfg.autocd != null then "${if cfg.autocd then "setopt" else "unsetopt"} autocd" else ""} if cfg.history.extended then "setopt" else "unsetopt"
} EXTENDED_HISTORY
${if cfg.autocd != null then
"${if cfg.autocd then "setopt" else "unsetopt"} autocd"
else
""}
${cfg.initExtra} ${cfg.initExtra}
# Aliases # Aliases
${aliasesStr} ${aliasesStr}
'' ''
] ] ++ (mapAttrsToList
++ (mapAttrsToList (k: v: "alias -g -- ${lib.escapeShellArg k}=${lib.escapeShellArg v}") cfg.shellGlobalAliases) (k: v: "alias -g -- ${lib.escapeShellArg k}=${lib.escapeShellArg v}")
++ [ ('' cfg.shellGlobalAliases) ++ [
(''
# Named Directory Hashes # Named Directory Hashes
${dirHashesStr} ${dirHashesStr}
'') '')
@ -716,17 +753,18 @@ in
# https://github.com/zsh-users/zsh-syntax-highlighting#faq # https://github.com/zsh-users/zsh-syntax-highlighting#faq
'' ''
source ${cfg.syntaxHighlighting.package}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh source ${cfg.syntaxHighlighting.package}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
ZSH_HIGHLIGHT_HIGHLIGHTERS+=(${lib.concatStringsSep " " (map lib.escapeShellArg cfg.syntaxHighlighting.highlighters)}) ZSH_HIGHLIGHT_HIGHLIGHTERS+=(${
${lib.concatStringsSep "\n" ( lib.concatStringsSep " "
lib.mapAttrsToList (map lib.escapeShellArg cfg.syntaxHighlighting.highlighters)
(name: value: "ZSH_HIGHLIGHT_STYLES+=(${lib.escapeShellArg name} ${lib.escapeShellArg value})") })
cfg.syntaxHighlighting.styles ${lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value:
)} "ZSH_HIGHLIGHT_STYLES+=(${lib.escapeShellArg name} ${
${lib.concatStringsSep "\n" ( lib.escapeShellArg value
lib.mapAttrsToList })") cfg.syntaxHighlighting.styles)}
(name: value: "ZSH_HIGHLIGHT_PATTERNS+=(${lib.escapeShellArg name} ${lib.escapeShellArg value})") ${lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value:
cfg.syntaxHighlighting.patterns "ZSH_HIGHLIGHT_PATTERNS+=(${lib.escapeShellArg name} ${
)} lib.escapeShellArg value
})") cfg.syntaxHighlighting.patterns)}
'') '')
(optionalString (cfg.historySubstringSearch.enable or false) (optionalString (cfg.historySubstringSearch.enable or false)
@ -735,17 +773,14 @@ in
'' ''
source ${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh source ${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh
${lib.concatMapStringsSep "\n" ${lib.concatMapStringsSep "\n"
(upKey: "bindkey \"${upKey}\" history-substring-search-up") (upKey: ''bindkey "${upKey}" history-substring-search-up'')
(lib.toList cfg.historySubstringSearch.searchUpKey) (lib.toList cfg.historySubstringSearch.searchUpKey)}
}
${lib.concatMapStringsSep "\n" ${lib.concatMapStringsSep "\n"
(downKey: "bindkey \"${downKey}\" history-substring-search-down") (downKey: ''bindkey "${downKey}" history-substring-search-down'')
(lib.toList cfg.historySubstringSearch.searchDownKey) (lib.toList cfg.historySubstringSearch.searchDownKey)}
}
'') '')
(optionalString cfg.zprof.enable (optionalString cfg.zprof.enable ''
''
zprof zprof
'') '')
]); ]);
@ -762,8 +797,7 @@ in
# but allow the user to opt out. # but allow the user to opt out.
programs.zsh.enableCompletion = mkDefault true; programs.zsh.enableCompletion = mkDefault true;
home.file = home.file = foldl' (a: b: a // b) { }
foldl' (a: b: a // b) {}
(map (plugin: { "${pluginsDir}/${plugin.name}".source = plugin.src; }) (map (plugin: { "${pluginsDir}/${plugin.name}".source = plugin.src; })
cfg.plugins); cfg.plugins);
}) })