mirror of
https://github.com/nix-community/home-manager.git
synced 2025-12-06 09:01:04 +01:00
zsh: move history to separate file
zsh is incredibly bloated, moving history to separate file Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
parent
3d95ab3cdc
commit
80a07bc6f7
2 changed files with 231 additions and 205 deletions
|
|
@ -15,7 +15,6 @@ let
|
||||||
optionalString
|
optionalString
|
||||||
types
|
types
|
||||||
;
|
;
|
||||||
inherit (config.home) stateVersion;
|
|
||||||
|
|
||||||
cfg = config.programs.zsh;
|
cfg = config.programs.zsh;
|
||||||
|
|
||||||
|
|
@ -29,6 +28,7 @@ let
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
|
./history.nix
|
||||||
./oh-my-zsh.nix
|
./oh-my-zsh.nix
|
||||||
./prezto.nix
|
./prezto.nix
|
||||||
./zprof.nix
|
./zprof.nix
|
||||||
|
|
@ -45,129 +45,6 @@ in
|
||||||
|
|
||||||
options =
|
options =
|
||||||
let
|
let
|
||||||
historyModule = types.submodule (
|
|
||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
options = {
|
|
||||||
append = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
If set, zsh sessions will append their history list to the history
|
|
||||||
file, rather than replace it. Thus, multiple parallel zsh sessions
|
|
||||||
will all have the new entries from their history lists added to the
|
|
||||||
history file, in the order that they exit.
|
|
||||||
|
|
||||||
This file will still be periodically re-written to trim it when the
|
|
||||||
number of lines grows 20% beyond the value specified by
|
|
||||||
`programs.zsh.history.save`.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
size = mkOption {
|
|
||||||
type = types.int;
|
|
||||||
default = 10000;
|
|
||||||
description = "Number of history lines to keep.";
|
|
||||||
};
|
|
||||||
|
|
||||||
save = mkOption {
|
|
||||||
type = types.int;
|
|
||||||
defaultText = 10000;
|
|
||||||
default = config.size;
|
|
||||||
description = "Number of history lines to save.";
|
|
||||||
};
|
|
||||||
|
|
||||||
path = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default =
|
|
||||||
if lib.versionAtLeast stateVersion "20.03" then
|
|
||||||
"$HOME/.zsh_history"
|
|
||||||
else
|
|
||||||
relToDotDir ".zsh_history";
|
|
||||||
defaultText = literalExpression ''
|
|
||||||
"$HOME/.zsh_history" if state version ≥ 20.03,
|
|
||||||
"$ZDOTDIR/.zsh_history" otherwise
|
|
||||||
'';
|
|
||||||
example = literalExpression ''"''${config.xdg.dataHome}/zsh/zsh_history"'';
|
|
||||||
description = "History file location";
|
|
||||||
};
|
|
||||||
|
|
||||||
ignorePatterns = mkOption {
|
|
||||||
type = types.listOf types.str;
|
|
||||||
default = [ ];
|
|
||||||
example = literalExpression ''[ "rm *" "pkill *" ]'';
|
|
||||||
description = ''
|
|
||||||
Do not enter command lines into the history list
|
|
||||||
if they match any one of the given shell patterns.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
ignoreDups = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = ''
|
|
||||||
Do not enter command lines into the history list
|
|
||||||
if they are duplicates of the previous event.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
ignoreAllDups = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
If a new command line being added to the history list
|
|
||||||
duplicates an older one, the older command is removed
|
|
||||||
from the list (even if it is not the previous event).
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
saveNoDups = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Do not write duplicate entries into the history file.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
findNoDups = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Do not display a line previously found in the history
|
|
||||||
file.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
ignoreSpace = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = ''
|
|
||||||
Do not enter command lines into the history list
|
|
||||||
if the first character is a space.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
expireDuplicatesFirst = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = "Expire duplicates first.";
|
|
||||||
};
|
|
||||||
|
|
||||||
extended = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = "Save timestamp into the history file.";
|
|
||||||
};
|
|
||||||
|
|
||||||
share = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Share command history between zsh sessions.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
pluginModule = types.submodule (
|
pluginModule = types.submodule (
|
||||||
{ config, ... }:
|
{ config, ... }:
|
||||||
{
|
{
|
||||||
|
|
@ -208,30 +85,6 @@ in
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
historySubstringSearchModule = types.submodule {
|
|
||||||
options = {
|
|
||||||
enable = mkEnableOption "history substring search";
|
|
||||||
searchUpKey = mkOption {
|
|
||||||
type = with types; either (listOf str) str;
|
|
||||||
default = [ "^[[A" ];
|
|
||||||
description = ''
|
|
||||||
The key codes to be used when searching up.
|
|
||||||
The default of `^[[A` may correspond to the UP key -- if not, try
|
|
||||||
`$terminfo[kcuu1]`.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
searchDownKey = mkOption {
|
|
||||||
type = with types; either (listOf str) str;
|
|
||||||
default = [ "^[[B" ];
|
|
||||||
description = ''
|
|
||||||
The key codes to be used when searching down.
|
|
||||||
The default of `^[[B` may correspond to the DOWN key -- if not, try
|
|
||||||
`$terminfo[kcud1]`.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
syntaxHighlightingModule = types.submodule {
|
syntaxHighlightingModule = types.submodule {
|
||||||
options = {
|
options = {
|
||||||
enable = mkEnableOption "zsh syntax highlighting";
|
enable = mkEnableOption "zsh syntax highlighting";
|
||||||
|
|
@ -376,12 +229,6 @@ in
|
||||||
description = "Options related to zsh-syntax-highlighting.";
|
description = "Options related to zsh-syntax-highlighting.";
|
||||||
};
|
};
|
||||||
|
|
||||||
historySubstringSearch = mkOption {
|
|
||||||
type = historySubstringSearchModule;
|
|
||||||
default = { };
|
|
||||||
description = "Options related to zsh-history-substring-search.";
|
|
||||||
};
|
|
||||||
|
|
||||||
autosuggestion = {
|
autosuggestion = {
|
||||||
enable = mkOption {
|
enable = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
|
|
@ -425,12 +272,6 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
history = mkOption {
|
|
||||||
type = historyModule;
|
|
||||||
default = { };
|
|
||||||
description = "Options related to commands history configuration.";
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultKeymap = mkOption {
|
defaultKeymap = mkOption {
|
||||||
type = types.nullOr (types.enum (lib.attrNames bindkeyCommands));
|
type = types.nullOr (types.enum (lib.attrNames bindkeyCommands));
|
||||||
default = null;
|
default = null;
|
||||||
|
|
@ -748,41 +589,13 @@ in
|
||||||
))
|
))
|
||||||
|
|
||||||
(mkOrder 900 (
|
(mkOrder 900 (
|
||||||
(lib.concatStrings (
|
lib.concatStrings (
|
||||||
map (plugin: ''
|
map (plugin: ''
|
||||||
if [[ -f "$HOME/${pluginsDir}/${plugin.name}/${plugin.file}" ]]; then
|
if [[ -f "$HOME/${pluginsDir}/${plugin.name}/${plugin.file}" ]]; then
|
||||||
source "$HOME/${pluginsDir}/${plugin.name}/${plugin.file}"
|
source "$HOME/${pluginsDir}/${plugin.name}/${plugin.file}"
|
||||||
fi
|
fi
|
||||||
'') cfg.plugins
|
'') cfg.plugins
|
||||||
))
|
)
|
||||||
+ ''
|
|
||||||
# History options should be set in .zshrc and after oh-my-zsh sourcing.
|
|
||||||
# See https://github.com/nix-community/home-manager/issues/177.
|
|
||||||
HISTSIZE="${toString cfg.history.size}"
|
|
||||||
SAVEHIST="${toString cfg.history.save}"
|
|
||||||
${optionalString (
|
|
||||||
cfg.history.ignorePatterns != [ ]
|
|
||||||
) "HISTORY_IGNORE=${lib.escapeShellArg "(${lib.concatStringsSep "|" cfg.history.ignorePatterns})"}"}
|
|
||||||
${
|
|
||||||
if lib.versionAtLeast stateVersion "20.03" then
|
|
||||||
''HISTFILE="${cfg.history.path}"''
|
|
||||||
else
|
|
||||||
''HISTFILE="$HOME/${cfg.history.path}"''
|
|
||||||
}
|
|
||||||
mkdir -p "$(dirname "$HISTFILE")"
|
|
||||||
|
|
||||||
setopt HIST_FCNTL_LOCK
|
|
||||||
${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.saveNoDups then "setopt" else "unsetopt"} HIST_SAVE_NO_DUPS
|
|
||||||
${if cfg.history.findNoDups then "setopt" else "unsetopt"} HIST_FIND_NO_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.extended then "setopt" else "unsetopt"} EXTENDED_HISTORY
|
|
||||||
${if cfg.autocd != null then "${if cfg.autocd then "setopt" else "unsetopt"} autocd" else ""}
|
|
||||||
''
|
|
||||||
))
|
))
|
||||||
|
|
||||||
(lib.mkIf (cfg.setOptions != [ ]) (
|
(lib.mkIf (cfg.setOptions != [ ]) (
|
||||||
|
|
@ -833,21 +646,6 @@ in
|
||||||
)}
|
)}
|
||||||
''
|
''
|
||||||
))
|
))
|
||||||
|
|
||||||
(lib.mkIf (cfg.historySubstringSearch.enable or false) (
|
|
||||||
mkOrder 1250
|
|
||||||
# Load zsh-history-substring-search after zsh-syntax-highlighting
|
|
||||||
# https://github.com/zsh-users/zsh-history-substring-search#usage
|
|
||||||
''
|
|
||||||
source ${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh
|
|
||||||
${lib.concatMapStringsSep "\n" (upKey: ''bindkey "${upKey}" history-substring-search-up'') (
|
|
||||||
lib.toList cfg.historySubstringSearch.searchUpKey
|
|
||||||
)}
|
|
||||||
${lib.concatMapStringsSep "\n" (downKey: ''bindkey "${downKey}" history-substring-search-down'') (
|
|
||||||
lib.toList cfg.historySubstringSearch.searchDownKey
|
|
||||||
)}
|
|
||||||
''
|
|
||||||
))
|
|
||||||
];
|
];
|
||||||
|
|
||||||
home.file."${relToDotDir ".zshrc"}".text = cfg.initContent;
|
home.file."${relToDotDir ".zshrc"}".text = cfg.initContent;
|
||||||
|
|
|
||||||
228
modules/programs/zsh/history.nix
Normal file
228
modules/programs/zsh/history.nix
Normal file
|
|
@ -0,0 +1,228 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.programs.zsh;
|
||||||
|
|
||||||
|
inherit (lib) literalExpression mkOption types;
|
||||||
|
inherit (config.home) stateVersion;
|
||||||
|
|
||||||
|
relToDotDir = file: (lib.optionalString (cfg.dotDir != null) (cfg.dotDir + "/")) + file;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options =
|
||||||
|
let
|
||||||
|
historyModule = types.submodule (
|
||||||
|
{ config, ... }:
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
append = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
If set, zsh sessions will append their history list to the history
|
||||||
|
file, rather than replace it. Thus, multiple parallel zsh sessions
|
||||||
|
will all have the new entries from their history lists added to the
|
||||||
|
history file, in the order that they exit.
|
||||||
|
|
||||||
|
This file will still be periodically re-written to trim it when the
|
||||||
|
number of lines grows 20% beyond the value specified by
|
||||||
|
`programs.zsh.history.save`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
size = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 10000;
|
||||||
|
description = "Number of history lines to keep.";
|
||||||
|
};
|
||||||
|
|
||||||
|
save = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
defaultText = 10000;
|
||||||
|
default = config.size;
|
||||||
|
description = "Number of history lines to save.";
|
||||||
|
};
|
||||||
|
|
||||||
|
path = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default =
|
||||||
|
if lib.versionAtLeast stateVersion "20.03" then
|
||||||
|
"$HOME/.zsh_history"
|
||||||
|
else
|
||||||
|
relToDotDir ".zsh_history";
|
||||||
|
defaultText = literalExpression ''
|
||||||
|
"$HOME/.zsh_history" if state version ≥ 20.03,
|
||||||
|
"$ZDOTDIR/.zsh_history" otherwise
|
||||||
|
'';
|
||||||
|
example = literalExpression ''"''${config.xdg.dataHome}/zsh/zsh_history"'';
|
||||||
|
description = "History file location";
|
||||||
|
};
|
||||||
|
|
||||||
|
ignorePatterns = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ ];
|
||||||
|
example = literalExpression ''[ "rm *" "pkill *" ]'';
|
||||||
|
description = ''
|
||||||
|
Do not enter command lines into the history list
|
||||||
|
if they match any one of the given shell patterns.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ignoreDups = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
Do not enter command lines into the history list
|
||||||
|
if they are duplicates of the previous event.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ignoreAllDups = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
If a new command line being added to the history list
|
||||||
|
duplicates an older one, the older command is removed
|
||||||
|
from the list (even if it is not the previous event).
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
saveNoDups = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Do not write duplicate entries into the history file.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
findNoDups = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Do not display a line previously found in the history
|
||||||
|
file.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ignoreSpace = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
Do not enter command lines into the history list
|
||||||
|
if the first character is a space.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
expireDuplicatesFirst = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Expire duplicates first.";
|
||||||
|
};
|
||||||
|
|
||||||
|
extended = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Save timestamp into the history file.";
|
||||||
|
};
|
||||||
|
|
||||||
|
share = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Share command history between zsh sessions.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
historySubstringSearchModule = types.submodule {
|
||||||
|
options = {
|
||||||
|
enable = lib.mkEnableOption "history substring search";
|
||||||
|
searchUpKey = mkOption {
|
||||||
|
type = with types; either (listOf str) str;
|
||||||
|
default = [ "^[[A" ];
|
||||||
|
description = ''
|
||||||
|
The key codes to be used when searching up.
|
||||||
|
The default of `^[[A` may correspond to the UP key -- if not, try
|
||||||
|
`$terminfo[kcuu1]`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
searchDownKey = mkOption {
|
||||||
|
type = with types; either (listOf str) str;
|
||||||
|
default = [ "^[[B" ];
|
||||||
|
description = ''
|
||||||
|
The key codes to be used when searching down.
|
||||||
|
The default of `^[[B` may correspond to the DOWN key -- if not, try
|
||||||
|
`$terminfo[kcud1]`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.zsh = {
|
||||||
|
history = mkOption {
|
||||||
|
type = historyModule;
|
||||||
|
default = { };
|
||||||
|
description = "Options related to commands history configuration.";
|
||||||
|
};
|
||||||
|
|
||||||
|
historySubstringSearch = mkOption {
|
||||||
|
type = historySubstringSearchModule;
|
||||||
|
default = { };
|
||||||
|
description = "Options related to zsh-history-substring-search.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
programs.zsh.initContent = lib.mkMerge [
|
||||||
|
(lib.mkOrder 910 ''
|
||||||
|
# History options should be set in .zshrc and after oh-my-zsh sourcing.
|
||||||
|
# See https://github.com/nix-community/home-manager/issues/177.
|
||||||
|
HISTSIZE="${toString cfg.history.size}"
|
||||||
|
SAVEHIST="${toString cfg.history.save}"
|
||||||
|
${lib.optionalString (
|
||||||
|
cfg.history.ignorePatterns != [ ]
|
||||||
|
) "HISTORY_IGNORE=${lib.escapeShellArg "(${lib.concatStringsSep "|" cfg.history.ignorePatterns})"}"}
|
||||||
|
${
|
||||||
|
if lib.versionAtLeast stateVersion "20.03" then
|
||||||
|
''HISTFILE="${cfg.history.path}"''
|
||||||
|
else
|
||||||
|
''HISTFILE="$HOME/${cfg.history.path}"''
|
||||||
|
}
|
||||||
|
mkdir -p "$(dirname "$HISTFILE")"
|
||||||
|
|
||||||
|
setopt HIST_FCNTL_LOCK
|
||||||
|
${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.saveNoDups then "setopt" else "unsetopt"} HIST_SAVE_NO_DUPS
|
||||||
|
${if cfg.history.findNoDups then "setopt" else "unsetopt"} HIST_FIND_NO_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.extended then "setopt" else "unsetopt"} EXTENDED_HISTORY
|
||||||
|
${if cfg.autocd != null then "${if cfg.autocd then "setopt" else "unsetopt"} autocd" else ""}
|
||||||
|
'')
|
||||||
|
|
||||||
|
(lib.mkIf (cfg.historySubstringSearch.enable or false) (
|
||||||
|
lib.mkOrder 1250
|
||||||
|
# Load zsh-history-substring-search after zsh-syntax-highlighting
|
||||||
|
# https://github.com/zsh-users/zsh-history-substring-search#usage
|
||||||
|
''
|
||||||
|
source ${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh
|
||||||
|
${lib.concatMapStringsSep "\n" (upKey: ''bindkey "${upKey}" history-substring-search-up'') (
|
||||||
|
lib.toList cfg.historySubstringSearch.searchUpKey
|
||||||
|
)}
|
||||||
|
${lib.concatMapStringsSep "\n" (downKey: ''bindkey "${downKey}" history-substring-search-down'') (
|
||||||
|
lib.toList cfg.historySubstringSearch.searchDownKey
|
||||||
|
)}
|
||||||
|
''
|
||||||
|
))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue