Skip to content

Commit d8ecfd7

Browse files
committed
Tidy up Neovim key mappings
1 parent 3b766e4 commit d8ecfd7

2 files changed

Lines changed: 80 additions & 57 deletions

File tree

config/nvim/lua/key-mappings.lua

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,45 @@
1+
local actions = require("actions")
2+
local bufdelete = require("bufdelete")
3+
local gitsigns = require("gitsigns")
4+
local refactoring = require("refactoring")
5+
local telescope = require("telescope.builtin")
6+
local treesj = require("treesj")
7+
local which_key = require("which-key")
8+
19
local map = vim.keymap.set
210

11+
-- The first parameter to map is the modes in which the mappings apply.
12+
--
13+
-- An empty string sets the mapping for:
14+
--
15+
-- * Normal (n)
16+
-- * Visual (x)
17+
-- * Select (s)
18+
-- * Operator (o)
19+
--
20+
-- Note that "v" means both visual (x) and select (s) modes.
21+
--
22+
-- See Neovim's help for map-modes
23+
24+
-- Most of my keys are mapped in normal, visual, and operator modes, but not
25+
-- select mode. I don't want to map printable characters in select mode.
26+
local nxo = { "n", "x", "o" }
27+
328
-- Set up mappings available in all buffers.
429
local function map_global_keys()
5-
local actions = require("actions")
6-
local bufdelete = require("bufdelete")
7-
local gitsigns = require("gitsigns")
8-
local refactoring = require("refactoring")
9-
local repeatable_move = require("nvim-treesitter.textobjects.repeatable_move")
10-
local telescope = require("telescope.builtin")
11-
local treesj = require("treesj")
12-
local which_key = require("which-key")
13-
1430
-- Things I do often enough get a top-level mapping.
15-
map("", "<leader><leader>", telescope.find_files, { desc = "find files" })
16-
map("", "<leader>*", telescope.grep_string, { desc = "find word under cursor" })
17-
map("", "<leader>/", vim.cmd.nohlsearch, { desc = "clear search" })
18-
map("", "<leader>d", vim.diagnostic.open_float, { desc = "show diagnostics under cursor" })
19-
map("", "<leader>e", actions.toggle_neo_tree, { desc = "toggle neo-tree explorer" })
20-
map("", "<leader>f", actions.show_current_file_in_neo_tree, { desc = "show current file in neo-tree" })
21-
map("", "<leader>Q", actions.write_all_and_quit, { desc = "save all files and quit" })
22-
map("", "<leader>R", actions.restore_session, { desc = "restore previoius session" })
23-
map("", "<leader>s", actions.write_all, { desc = "save all files" })
24-
map("", "<leader>S", actions.save_session_and_quit, { desc = "Save session" })
25-
map("", "<leader>W", vim.cmd.close, { desc = "close window" })
26-
map("", "<leader>X", bufdelete.bufdelete, { desc = "close buffer" })
31+
map(nxo, "<leader><leader>", telescope.find_files, { desc = "find files" })
32+
map(nxo, "<leader>*", telescope.grep_string, { desc = "find word under cursor" })
33+
map(nxo, "<leader>/", vim.cmd.nohlsearch, { desc = "clear search" })
34+
map(nxo, "<leader>d", vim.diagnostic.open_float, { desc = "show diagnostics under cursor" })
35+
map(nxo, "<leader>e", actions.toggle_neo_tree, { desc = "toggle neo-tree explorer" })
36+
map(nxo, "<leader>f", actions.show_current_file_in_neo_tree, { desc = "show current file in neo-tree" })
37+
map(nxo, "<leader>Q", actions.write_all_and_quit, { desc = "save all files and quit" })
38+
map(nxo, "<leader>R", actions.restore_session, { desc = "restore previoius session" })
39+
map(nxo, "<leader>s", actions.write_all, { desc = "save all files" })
40+
map(nxo, "<leader>S", actions.save_session_and_quit, { desc = "Save session" })
41+
map(nxo, "<leader>W", vim.cmd.close, { desc = "close window" })
42+
map(nxo, "<leader>X", bufdelete.bufdelete, { desc = "close buffer" })
2743

2844
-- Make command keys do sensible things. There some stuff in kitty.conf to
2945
-- tell Kitty to pass these through to Neovim.
@@ -36,39 +52,29 @@ local function map_global_keys()
3652
map("v", "<D-x>", '"*d', { desc = "cut to system clipboard" })
3753

3854
which_key.register({ ["<leader>c"] = { name = "code changes" } })
39-
map("", "<leader>cj", treesj.join, { desc = "join lines" })
40-
map("", "<leader>cf", refactoring.select_refactor, { desc = "refactor" })
41-
map("", "<leader>cs", treesj.split, { desc = "split lines" })
55+
map(nxo, "<leader>cj", treesj.join, { desc = "join lines" })
56+
map(nxo, "<leader>cf", refactoring.select_refactor, { desc = "refactor" })
57+
map(nxo, "<leader>cs", treesj.split, { desc = "split lines" })
4258

4359
which_key.register({ ["<leader>g"] = { name = "git" } })
44-
map("", "<leader>gb", gitsigns.blame_line, { desc = "git blame" })
45-
map("", "<leader>gc", actions.choose_git_base, { desc = "change git base" })
46-
map("", "<leader>gh", actions.browse_on_github, { desc = "browse on github" })
47-
map("", "<leader>gp", gitsigns.preview_hunk_inline, { desc = "preview hunk" })
60+
map(nxo, "<leader>gb", gitsigns.blame_line, { desc = "git blame" })
61+
map(nxo, "<leader>gc", actions.choose_git_base, { desc = "change git base" })
62+
map(nxo, "<leader>gh", actions.browse_on_github, { desc = "browse on github" })
63+
map(nxo, "<leader>gp", gitsigns.preview_hunk_inline, { desc = "preview hunk" })
4864

4965
which_key.register({ ["<leader>t"] = { name = "telescope" } })
50-
map("", "<leader>t.", telescope.resume, { desc = "repeat last find" })
51-
map("", "<leader>t/", telescope.live_grep, { desc = "live grep" })
52-
map("", "<leader>tb", telescope.buffers, { desc = "find buffers" })
53-
map("", "<leader>td", telescope.diagnostics, { desc = "find diagnostics" })
54-
map("", "<leader>tg", telescope.git_status, { desc = "find git status" })
55-
map("", "<leader>th", telescope.help_tags, { desc = "find help" })
56-
map("", "<leader>tj", telescope.jumplist, { desc = "find in jumplist" })
57-
map("", "<leader>tt", telescope.builtin, { desc = "find telescope builtins" })
66+
map(nxo, "<leader>t.", telescope.resume, { desc = "repeat last find" })
67+
map(nxo, "<leader>t/", telescope.live_grep, { desc = "live grep" })
68+
map(nxo, "<leader>tb", telescope.buffers, { desc = "find buffers" })
69+
map(nxo, "<leader>td", telescope.diagnostics, { desc = "find diagnostics" })
70+
map(nxo, "<leader>tg", telescope.git_status, { desc = "find git status" })
71+
map(nxo, "<leader>th", telescope.help_tags, { desc = "find help" })
72+
map(nxo, "<leader>tj", telescope.jumplist, { desc = "find in jumplist" })
73+
map(nxo, "<leader>tt", telescope.builtin, { desc = "find telescope builtins" })
5874

5975
-- Move around in the buffer
60-
map({ "n", "x", "o" }, "[g", gitsigns.prev_hunk, { desc = "previous git hunk in buffer" })
61-
map({ "n", "x", "o" }, "]g", gitsigns.next_hunk, { desc = "next git hunk in buffer" })
62-
63-
-- Make , and ; repeat the last move.
64-
map({ "n", "x", "o" }, ";", repeatable_move.repeat_last_move_next)
65-
map({ "n", "x", "o" }, ",", repeatable_move.repeat_last_move_previous)
66-
67-
-- Make repeating the builtins work properly too.
68-
map({ "n", "x", "o" }, "f", repeatable_move.builtin_f)
69-
map({ "n", "x", "o" }, "F", repeatable_move.builtin_F)
70-
map({ "n", "x", "o" }, "t", repeatable_move.builtin_t)
71-
map({ "n", "x", "o" }, "T", repeatable_move.builtin_T)
76+
map(nxo, "[g", gitsigns.prev_hunk, { desc = "previous git hunk in buffer" })
77+
map(nxo, "]g", gitsigns.next_hunk, { desc = "next git hunk in buffer" })
7278

7379
-- Navigate between windows
7480
map("", "<c-h>", "<c-w>h")
@@ -77,23 +83,21 @@ local function map_global_keys()
7783
map("", "<c-l>", "<c-w>l")
7884

7985
-- Reselect the visual area when changing indenting in visual mode
80-
map("v", "<", "<gv")
81-
map("v", ">", ">gv")
86+
map("x", "<", "<gv")
87+
map("x", ">", ">gv")
8288
end
8389

8490
-- Set up mappings for buffers with a language server attached.
8591
local function map_lsp_keys(args)
8692
local buffer = args.buf
8793

88-
local telescope = require("telescope.builtin")
89-
90-
map({ "n", "x", "o" }, "gd", telescope.lsp_definitions, { buffer = buffer, desc = "Go to defintion" })
91-
map({ "n", "x", "o" }, "gr", telescope.lsp_references, { buffer = buffer, desc = "Go to references" })
94+
map(nxo, "gd", telescope.lsp_definitions, { buffer = buffer, desc = "Go to defintion" })
95+
map(nxo, "gr", telescope.lsp_references, { buffer = buffer, desc = "Go to references" })
9296

93-
map("", "<leader>ca", vim.lsp.buf.code_action, { buffer = buffer, desc = "code actions" })
94-
map("", "<leader>cr", vim.lsp.buf.rename, { buffer = buffer, desc = "rename symbol under cursor" })
97+
map(nxo, "<leader>ca", vim.lsp.buf.code_action, { buffer = buffer, desc = "code actions" })
98+
map(nxo, "<leader>cr", vim.lsp.buf.rename, { buffer = buffer, desc = "rename symbol under cursor" })
9599

96-
map("", "<leader>ts", telescope.lsp_document_symbols, { buffer = buffer, desc = "find document symbols" })
100+
map(nxo, "<leader>ts", telescope.lsp_document_symbols, { buffer = buffer, desc = "find document symbols" })
97101
end
98102

99103
-- This sets things up so we tell Kitty when Neovim is open, so it can pass

config/nvim/lua/plugin-specs/treesitter.lua

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,25 @@ local treesitter_spec = {
5050
highlight = { enable = true },
5151
textobjects = treesitter_textobjects,
5252
})
53+
54+
-- Make Treesitter movements are repeatable.
55+
--
56+
-- Taken from:
57+
-- https://github.com/nvim-treesitter/nvim-treesitter-textobjects?tab=readme-ov-file#text-objects-move
58+
59+
local repeatable_move = require("nvim-treesitter.textobjects.repeatable_move")
60+
local map = vim.keymap.set
61+
local nxo = { "n", "x", "o" }
62+
63+
-- Make , and ; repeat the last Treesitter move.
64+
map(nxo, ";", repeatable_move.repeat_last_move_next)
65+
map(nxo, ",", repeatable_move.repeat_last_move_previous)
66+
67+
-- Make repeating the builtins work properly too.
68+
map(nxo, "f", repeatable_move.builtin_f)
69+
map(nxo, "F", repeatable_move.builtin_F)
70+
map(nxo, "t", repeatable_move.builtin_t)
71+
map(nxo, "T", repeatable_move.builtin_T)
5372
end,
5473
}
5574

0 commit comments

Comments
 (0)