diff options
Diffstat (limited to 'modules/by-name/fi/fish/module.nix')
| -rw-r--r-- | modules/by-name/fi/fish/module.nix | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/modules/by-name/fi/fish/module.nix b/modules/by-name/fi/fish/module.nix index 7f16fc08..6f13e39f 100644 --- a/modules/by-name/fi/fish/module.nix +++ b/modules/by-name/fi/fish/module.nix @@ -30,22 +30,46 @@ mkBinding = mode: base_key: binding: let sets_mode_to = if binding ? sets_mode_to - then "--sets-mode ${binding.sets_mode_to}" + then "--sets-mode ${binding.sets_mode_to} " else ""; - - key = lib.escape ["$" "*"] base_key; in if binding ? cmd - then '' - bind --mode "${mode}" ${sets_mode_to} --preset ${lib.escapeShellArg key} ${lib.escapeShellArg binding.cmd} + then let + mkCmd = cmd: "'${cmd}'"; + escaped_key = + if base_key == "" + then ''""'' + else + lib.escape [ + "\"" + "(" + ")" + "$" + ";" + "*" + "&" + "|" + "~" + "<" + ">" + "^" + ] + base_key; + escaped_cmd = + if builtins.isList binding.cmd + then builtins.concatStringsSep " " (builtins.map mkCmd binding.cmd) + else mkCmd binding.cmd; + in '' + bind --mode "${mode}" ${sets_mode_to}--preset ${escaped_key} ${escaped_cmd} '' else builtins.concatStringsSep "" (lib.mapAttrsToList - (new_key: value: mkBinding mode "${key + "," + new_key}" value) + (new_key: value: mkBinding mode "${base_key + "," + new_key}" value) binding); mkMode = mode: attr: builtins.concatStringsSep "" (lib.mapAttrsToList (mkBinding mode) attr); keymappings = '' + fish_vi_key_bindings bind --erase --all '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList mkMode keymappings_raw); |
