{ config, lib, ... }: let cfg = config.input; disableKeymaps = mode: lhss: lib.flip map lhss (lhs: { inherit mode lhs; rhs = ""; }); in { options.input = with lib; with types; { exMode.enable = (mkEnableOption "Ex mode") // { default = true; }; arrowKeys = { disableInMode = mkOption { type = oneOf [ str (uniq (listOf str)) ]; default = [ "n" "v" ]; }; }; pageButtons = { disableInMode = mkOption { type = oneOf [ str (uniq (listOf str)) ]; default = [ "n" "v" "i" ]; }; }; }; config.vim.keymap.set = # Disable the annoying and useless ex-mode lib.optionals (!cfg.exMode.enable) (disableKeymaps "n" [ "Q" "gQ" ]) # Disable arrow keys ++ lib.optionals (cfg.arrowKeys.disableInMode != [ ]) (disableKeymaps cfg.arrowKeys.disableInMode [ "" "" "" "" ]) # Disable PageUp / PageDown ++ lib.optionals (cfg.pageButtons.disableInMode != [ ]) (disableKeymaps cfg.pageButtons.disableInMode [ "" "" ]); }