{lib, ...}: {
  programs.nixvim = {
    globals = {
      mapleader = " ";
      maplocalleader = " ";
    };
    keymaps = [
      {
        mode = ["n" "i"];
        key = "<Esc>";
        action = "<cmd>noh<CR><Esc>";
        options.desc = "Disable the search highlighting and send Escape";
      }
      {
        key = "hh";
        mode = ["i"];
        action = ''
          function()
            local cmp = require('cmp');
            local luasnip = require('luasnip');

            if cmp.visible() then
                cmp.select_next_item()
            elseif luasnip.expand_or_locally_jumpable() then
                luasnip.expand_or_jump()
            end
          end
        '';
        lua = true;
        options.desc = "completion trigger/ forward in completen menu";
      }
      {
        key = "uu";
        mode = ["i"];
        action = ''
          function()
            local cmp = require('cmp');
            cmp.confirm()
          end
        '';
        lua = true;
        options.desc = "confirm the selected item";
      }

      # FIXME: Add the below keymappings, when alacritty gets support for the kitty
      # keyboard protocol <2023-08-29>
      {
        # "<C-Tab>"
        key = "ztn";
        action = "<cmd>tabnext<CR>";
        options.desc = "cycle to the next tab";
      }
      {
        # "<S-C-Tab>"
        key = "ztp";
        action = "<cmd>tabprevious<CR>";
        options.desc = "cycle to the previous tab";
      }

      # yank/ cut to the system clipboard
      {
        key = "<leader>y";
        action = "\"+y";
        options.desc = "yank to the system clipboard";
      }
      {
        key = "<leader>Y";
        action = "\"+Y";
        options.desc = "yank until the end of the line to the system clipboard";
      }

      # Unmap some old keys
      #{key = "s"; action = "'<Nop>'";}
      #{key = "t"; action = "'<Nop>'";}
      {
        key = "<Up>";
        action = "<Nop>";
      }
      {
        key = "<Down>";
        action = "<Nop>";
      }
      {
        key = "<Left>";
        action = "<Nop>";
      }
      {
        key = "<Right>";
        action = "<Nop>";
      }

      # Center the cursor vertically when moving to the next word during a search.
      {
        key = "l";
        action = "nzzzv";
        options.desc = "Center the cursor vertically when moving to the next word during a search.";
      }
      {
        key = "L";
        action = "Nzzzv";
        options.desc = "Center the cursor vertically when moving to the next word during a search.";
      }
      # remap the other keys to dvorak
      {
        key = "k";
        action = "t";
        options.desc = "go the the right on char";
      }
      {
        key = "K";
        action = "T";
        options.desc = "go to the left on char";
      }
      {
        key = "j";
        action = "k";
        options.desc = "go to the right before the char";
      }
      {
        key = "J";
        action = "K";
        options.desc = "go to the left before the char";
      }

      # Change Vim-keys
      {
        key = "h";
        action = "<left>";
        options.desc = "go left";
      }
      {
        key = "t";
        action = "g<down>";
        options.desc = "go down, with displaylines";
      }
      {
        key = "n";
        action = "g<up>";
        options.desc = "go up, with displaylines";
      }
      {
        key = "s";
        action = "<right>";
        options.desc = "go right";
      }

      # Move display lines
      {
        key = "0";
        action = "g0";
        options.desc = "go to the leftmost character in the screen line";
      }
      {
        key = "$";
        action = "g$";
        options.desc = "go to the rightmost character in the screen line";
      }
      {
        mode = ["n"];
        key = "<Enter>";
        action = "gf";
        options.desc = "open file/url under cursor";
      }
      {
        mode = ["n"];
        key = "<Tab>";
        action = ":";
        options.desc = "jump to command line";
      }

      {
        mode = ["n"];
        key = "\\f";
        action = "function() require('lf').start() end";
        lua = true;
        options.desc = "open lf in a floating window";
      }

      # Splits
      {
        mode = ["n"];
        key = "<C-t>";
        action = "<C-w>p";
        options.desc = "go to previous split";
      }
      {
        mode = ["n"];
        key = "<C-n>";
        action = "<C-w>w";
        options.desc = "go to next split";
      }
      {
        mode = ["n"];
        key = "<leader>-";
        action = "<C-W>s";
        options.desc = "New horizontal split";
      }
      {
        mode = ["n"];
        key = "<leader>|";
        action = "<C-W>v";
        options.desc = "New vertical split";
      }

      {
        mode = ["n"];
        key = "<leader>p";
        action = "\"_dP";
        options.desc = "keep the cut thing in the base register";
      }
      {
        mode = ["n"];
        key = "<leader>c";
        action = "\"_c";
        options.desc = "change without saving to register";
      }

      {
        mode = ["n"];
        key = "<leader>d";
        action = "\"_d";
        options.desc = "delete without saving to register";
      }
      {
        key = "dd";
        mode = ["n"];
        action = ''
          function()
            if vim.api.nvim_get_current_line():match("^%s*$") then
              return '"_dd'
            else
              return "dd"
            end
          end
        '';
        lua = true;
        options = {
          desc = "Pipe all blank line deletions to the blackhole register";
          expr = true;
          silent = true;
        };
      }

      {
        mode = ["n"];
        key = "<leader>s";
        action = ":%s/\\<<C-r><C-w>\\>/<C-r><C-w>/gI<Left><Left><Left>";
        options.desc = "replace for the word under the cursor";
      }

      {
        mode = ["n"];
        key = "<C-s>";
        action = "<cmd>mksession! <CR>";
        options.desc = "overwrite/create a session";
      }

      {
        mode = ["n"];
        key = "<leader>X";
        action = "!!$SHELL <CR>";
        options.desc = "Read the current line and execute that line in your $SHELL. The resulting output will replace the curent line that was being executed.";
      }
      {
        mode = ["t"];
        key = "<Esc><Esc>";
        action = "<C-\\><C-n>";
        options.desc = "Exit terminal mode with <Esc><Esc>";
      }

      # move selected lines in visual mode
      {
        mode = ["v"];
        key = "T";
        action = ":m '>+1<CR>gv=gv";
        options.desc = "move selected lines in visual mode down";
      }
      {
        mode = ["v"];
        key = "N";
        action = ":m '<-2<CR>gv=gv";
        options.desc = "move selected lines in visual mode up";
      }
    ];
  };
}