{lib, ...}: let inherit (lib) map mapAttrsToList toUpper substring mapCartesianProduct toLower ; in { globals = { mapleader = " "; maplocalleader = "\\"; }; keymaps = # Disable Arrow Key Movement - - - - - - - - - - - - - - - - - - - - - - - - ( map (d: { mode = [ "i" "n" ]; key = d; action = ""; }) [ "" "" "" "" ] ) # Better Up/Down - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( mapAttrsToList (d: k: { mode = [ "n" "x" ]; key = k; action = "v:count == 0 ? 'g${k}' : '${k}'"; options = { desc = d; expr = true; silent = true; }; }) { Down = "j"; Up = "k"; } ) # Resize Windows - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( mapAttrsToList ( k: d: let s = if (d == "Increase") then "+" else "-"; in { mode = ["n"]; key = ""; action = "resize ${s}4"; options = { desc = "${d} Window Height"; }; } ) { Up = "Increase"; Down = "Decrease"; Left = "Decrease"; Right = "Increase"; } ) # Buffers - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( mapAttrsToList ( k: d: let # previous -> Prev prettyDir = (toUpper (substring 0 1 d)) + (substring 1 3 d); in { mode = ["n"]; key = k; action = "b${d}"; options = { desc = "${prettyDir} Buffer"; }; } ) { "" = "previous"; "" = "next"; "[b" = "previous"; "]b" = "next"; } ) ++ [ { mode = ["n"]; key = "bD"; action = "bd"; options = { desc = "Delete Buffer and Window"; }; } ] # Clear Search/Diff Update/Redraw - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = [ "i" "n" ]; key = ""; action = "noh"; options = { desc = "Escape and Clear hlsearch"; }; } { mode = ["n"]; key = "ur"; action = "nohlsearchdiffupdatenormal! "; options = { desc = "Redraw / Clear hlsearch / Diff Update"; }; } ] # Better n & N - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( mapCartesianProduct ( { m, d, }: let nn = if (d == "Next") then "Nn" else "nN"; zv = if (m == "n") then ".'zv'" else ""; in { mode = [m]; key = if (d == "Next") then "n" else "N"; action = "'${nn}'[v:searchforward]${zv}"; options = { desc = "${d} Search Result"; expr = true; }; } ) { m = [ "n" "x" "o" ]; d = [ "Next" "Prev" ]; } ) # Undo Break-Points - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( map (c: { mode = ["i"]; key = c; action = "${c}u"; }) [ "," "." ";" ] ) # Search Docs (keywordprog) - - - - - - - - - - - - - - - - - - - - - - - - # https://til.codeinthehole.com/posts/about-how-to-use-keywordprg-effectively/ ++ [ { mode = ["n"]; key = "K"; action = "norm! K"; options = { desc = "Search for word"; }; } ] # Better Indenting - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( map (c: { mode = ["v"]; key = c; action = "${c}gv"; }) [ "<" ">" ] ) # Commenting - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( mapAttrsToList (k: d: { mode = ["n"]; key = "gc${k}"; action = "${k}Vcxnormal gccfxa"; options = { desc = "Add Comment ${d}"; }; }) { o = "Below"; O = "Above"; } ) # New File - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = ["n"]; key = "fn"; action = "enew"; options = { desc = "New File"; }; } ] # Locations/Quickfixes - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = ["n"]; key = "xl"; action = "lopen"; options = { desc = "Location List"; }; } { mode = ["n"]; key = "xq"; action = "copen"; options = { desc = "Quickfix list"; }; } ] ++ ( mapAttrsToList ( k: d: let cmd = substring 0 4 (toLower d); in { mode = ["n"]; key = "${k}q"; action = "c${cmd}"; options = { desc = "${d} Quickfix"; }; } ) { "[" = "Previous"; "]" = "Next"; } ) # Diagnostics - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = ["n"]; key = "cd"; action.__raw = # lua "function() vim.diagnostic.open_float() end"; options = { desc = "Line Diagnostics"; }; } ] ++ ( mapCartesianProduct ( { dir, key, }: let sevs = { d = { key = "nil"; desc = "Diagnostic"; }; e = { key = "vim.diagnostic.severity.ERROR"; desc = "Error"; }; w = { key = "vim.diagnostic.severity.WARN"; desc = "Warning"; }; }; cmd = toLower dir; sev = sevs."${key}".key; in { mode = ["n"]; key = "${ if (dir == "Next") then "]" else "[" }${key}"; action.__raw = # lua "function() vim.diagnostic.goto_${cmd}({ severity = ${sev} }) end"; options = { desc = "${dir} ${sevs."${key}".desc}"; }; } ) { dir = [ "Next" "Prev" ]; key = [ "d" "e" "w" ]; } ) # Quit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = ["n"]; key = "qq"; action = "qa"; options = { desc = "Quit All"; }; } ] # Inspect - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = ["n"]; key = "ui"; action.__raw = # lua "vim.show_pos"; options = { desc = "Inspect Position"; }; } ] # Window Management - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ [ { mode = ["n"]; key = "w"; action = ""; options = { desc = "Windows"; remap = true; }; } { mode = ["n"]; key = "-"; action = "s"; options = { desc = "Split Window Below"; remap = true; }; } { mode = ["n"]; key = "|"; action = "v"; options = { desc = "Split Window Right"; remap = true; }; } { mode = ["n"]; key = "wd"; action = "c"; options = { desc = "Delete Window"; remap = true; }; } ] # Tab Management - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ ( mapAttrsToList (k: a: { mode = ["n"]; key = "${k}"; action = "tab${toLower a}"; options = { desc = if (a == "Only") then "Close Other Tabs" else "${a} Tab"; }; }) { l = "Last"; o = "Only"; f = "First"; "" = "New"; "]" = "Next"; d = "Close"; "[" = "Previous"; } ); }