{ ... }:
{
  programs.nixvim.globals.mapleader = " ";
  programs.nixvim.globals.maplocalleader = ",";

  programs.nixvim.keymaps = [
    {
      key = "gl";
      action = "<cmd>lua vim.diagnostic.open_float()<cr>";
    }
    {
      key = "<leader>u";
      action = "<cmd>UndotreeToggle<cr>";
    }
    {
      key = "<leader>f";
      action = "<cmd>Telescope fd<cr>";
    }
    {
      key = "<leader>g";
      action = "<cmd>Telescope live_grep<cr>";
    }
    {
      key = "<leader>D";
      action = "<cmd>Telescope diagnostics<cr>";
    }
    {
      key = "<leader>b";
      action = "<cmd>Telescope buffers<cr>";
    }
    {
      key = "<leader>s";
      action = "<cmd>Telescope lsp_document_symbols<cr>";
    }
    {
      key = "<leader>w";
      action = "<C-W>";
    }
    {
      # Unbind F1
      key = "<F1>";
      action = "";
    }
  ];

  programs.nixvim.autoCmd = [
    {
      desc = "LSP Actions";
      event = "LspAttach";
      callback = {
        __raw = ''
          					function(event)
          						local opts = { buffer = event.buf }

          						-- these will be buffer-local keybindings
          						-- because they only work if you have an active language server

          						vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', opts)
          						vim.keymap.set('n', 'gd', '<cmd>Telescope lsp_definitions<cr>', opts)
          						vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', opts)
          						vim.keymap.set('n', 'gi', '<cmd>Telescope lsp_implementations<cr>', opts)
          						vim.keymap.set('n', 'go', '<cmd>Telescope lsp_type_definitions<cr>', opts)
          						vim.keymap.set('n', 'gr', '<cmd>Telescope lsp_references<cr>', opts)
          						vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts)
          						vim.keymap.set('n', '<leader>r', '<cmd>lua vim.lsp.buf.rename()<cr>', opts)
          						vim.keymap.set({ 'n', 'x' }, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', opts)
          						-- vim.keymap.set('n', '<leader>a', '<cmd>lua vim.lsp.buf.code_action()<cr>', opts)
          						vim.keymap.set("n", "<leader>a", require("actions-preview").code_actions, opts)
          						vim.keymap.set("n", "gh", "<cmd>ClangdSwitchSourceHeader<cr>", opts)
          					end
          				'';
      };
    }
  ];
}