fish: support flexible abbreviations
https://github.com/fish-shell/fish-shell/releases/tag/3.6.0
This commit is contained in:
parent
e1f3b36ab0
commit
8cedd63eed
|
@ -138,9 +138,76 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
abbrsStr = concatStringsSep "\n"
|
abbrModule = types.submodule {
|
||||||
(mapAttrsToList (k: v: "abbr --add --global -- ${k} ${escapeShellArg v}")
|
options = {
|
||||||
cfg.shellAbbrs);
|
expansion = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The command expanded by an abbreviation.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
position = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
example = "anywhere";
|
||||||
|
description = ''
|
||||||
|
If the position is "command", the abbreviation expands only if
|
||||||
|
the position is a command. If it is "anywhere", the abbreviation
|
||||||
|
expands anywhere.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
regex = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The regular expression pattern matched instead of the literal name.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
setCursor = mkOption {
|
||||||
|
type = with types; (either bool str);
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
The marker indicates the position of the cursor when the abbreviation
|
||||||
|
is expanded. When setCursor is true, the marker is set with a default
|
||||||
|
value of "%".
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
function = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The fish function expanded instead of a literal string.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
abbrsStr = concatStringsSep "\n" (mapAttrsToList (name: def:
|
||||||
|
let
|
||||||
|
mods = with def;
|
||||||
|
cli.toGNUCommandLineShell {
|
||||||
|
mkOption = k: v:
|
||||||
|
if v == null then
|
||||||
|
[ ]
|
||||||
|
else if k == "set-cursor" then
|
||||||
|
[ "--${k}=${lib.generators.mkValueStringDefault { } v}" ]
|
||||||
|
else [
|
||||||
|
"--${k}"
|
||||||
|
(lib.generators.mkValueStringDefault { } v)
|
||||||
|
];
|
||||||
|
} {
|
||||||
|
inherit position regex function;
|
||||||
|
set-cursor = setCursor;
|
||||||
|
};
|
||||||
|
modifiers = if isAttrs def then mods else "";
|
||||||
|
expansion = if isAttrs def then def.expansion else def;
|
||||||
|
in "abbr --add ${modifiers} -- ${name}"
|
||||||
|
+ optionalString (expansion != null) " \"${expansion}\"") cfg.shellAbbrs);
|
||||||
|
|
||||||
aliasesStr = concatStringsSep "\n"
|
aliasesStr = concatStringsSep "\n"
|
||||||
(mapAttrsToList (k: v: "alias ${k} ${escapeShellArg v}") cfg.shellAliases);
|
(mapAttrsToList (k: v: "alias ${k} ${escapeShellArg v}") cfg.shellAliases);
|
||||||
|
@ -199,12 +266,18 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
shellAbbrs = mkOption {
|
shellAbbrs = mkOption {
|
||||||
type = with types; attrsOf str;
|
type = with types; attrsOf (either str abbrModule);
|
||||||
default = { };
|
default = { };
|
||||||
example = {
|
example = literalExpression ''
|
||||||
l = "less";
|
{
|
||||||
gco = "git checkout";
|
l = "less";
|
||||||
};
|
gco = "git checkout";
|
||||||
|
"-C" = {
|
||||||
|
position = "anywhere";
|
||||||
|
expansion = "--color";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
'';
|
||||||
description = ''
|
description = ''
|
||||||
An attribute set that maps aliases (the top level attribute names
|
An attribute set that maps aliases (the top level attribute names
|
||||||
in this option) to abbreviations. Abbreviations are expanded with
|
in this option) to abbreviations. Abbreviations are expanded with
|
||||||
|
|
62
tests/modules/programs/fish/abbrs.nix
Normal file
62
tests/modules/programs/fish/abbrs.nix
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{ config, ... }: {
|
||||||
|
config = {
|
||||||
|
programs.fish = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
shellAbbrs = {
|
||||||
|
l = "less";
|
||||||
|
gco = "git checkout";
|
||||||
|
"-C" = {
|
||||||
|
position = "anywhere";
|
||||||
|
expansion = "--color";
|
||||||
|
};
|
||||||
|
L = {
|
||||||
|
position = "anywhere";
|
||||||
|
setCursor = true;
|
||||||
|
expansion = "% | less";
|
||||||
|
};
|
||||||
|
"!!" = {
|
||||||
|
position = "anywhere";
|
||||||
|
function = "last_history_item";
|
||||||
|
};
|
||||||
|
vim_edit_texts = {
|
||||||
|
position = "command";
|
||||||
|
regex = ".+\\.txt";
|
||||||
|
function = "vim_edit";
|
||||||
|
};
|
||||||
|
"4DIRS" = {
|
||||||
|
setCursor = "!";
|
||||||
|
expansion =
|
||||||
|
"$(string join \\n -- 'for dir in */' 'cd $dir' '!' 'cd ..' 'end')";
|
||||||
|
};
|
||||||
|
dotdot = {
|
||||||
|
regex = "^\\.\\.+$";
|
||||||
|
function = "multicd";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nmt = {
|
||||||
|
description =
|
||||||
|
"if fish.shellAbbrs is set, check fish.config contains valid abbreviations";
|
||||||
|
script = ''
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
'abbr --add -- l less'
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
'abbr --add -- gco "git checkout"'
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
'abbr --add --position anywhere -- -C --color'
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
'abbr --add --position anywhere --set-cursor -- L "% | less"'
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
'abbr --add --function last_history_item --position anywhere -- !!'
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
"abbr --add --function vim_edit --position command --regex '.+\.txt' -- vim_edit_texts"
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
'abbr --add '"'"'--set-cursor=!'"'"' -- 4DIRS "$(string join \n -- '"'"'for dir in */'"'"' '"'"'cd $dir'"'"' '"'"'!'"'"' '"'"'cd ..'"'"' '"'"'end'"'"')'
|
||||||
|
assertFileContains home-files/.config/fish/config.fish \
|
||||||
|
"abbr --add --function multicd --regex '^\.\.+$' -- dotdot"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
{
|
{
|
||||||
|
fish-abbrs = ./abbrs.nix;
|
||||||
fish-format-scripts = ./format-scripts.nix;
|
fish-format-scripts = ./format-scripts.nix;
|
||||||
fish-functions = ./functions.nix;
|
fish-functions = ./functions.nix;
|
||||||
fish-no-functions = ./no-functions.nix;
|
fish-no-functions = ./no-functions.nix;
|
||||||
|
|
Loading…
Reference in a new issue