neovim configuration using rocks.nvim plugin manager
1local Util = require("utils")
2
3vim.g.mapleader = vim.keycode("<space>")
4vim.g.maplocalleader = vim.keycode("<cr>")
5
6-- Fix default keymap errors
7vim.keymap.set("x", "<c-c>", "<esc>")
8-- Add undo break-points
9vim.keymap.set("i", ",", ",<c-g>u")
10vim.keymap.set("i", ".", ".<c-g>u")
11vim.keymap.set("i", ";", ";<c-g>u")
12
13-- Native-like keymaps
14-- keymaps that follows native keymap and make it more consistent
15vim.keymap.set("n", "-", "<cmd>e %:h<cr>", { desc = "open dir" })
16
17-- Breaking remaps on native keymaps
18vim.keymap.set("n", "g/", "gcc", { remap = true })
19vim.keymap.set("x", "g/", "gc", { remap = true })
20vim.keymap.set("n", "Q", "q")
21vim.keymap.set("n", "q", "<cmd>close<cr>")
22-- -- fast indent/dedenting
23-- vim.keymap.set("n", "<", "<<")
24-- vim.keymap.set("x", "<", "<gv")
25-- vim.keymap.set("n", ">", ">>")
26-- vim.keymap.set("x", ">", ">gv")
27
28-- quickfix list
29vim.keymap.set("n", "<c-j>", "<cmd>cnext<cr>")
30vim.keymap.set("n", "<c-k>", "<cmd>cprev<cr>")
31vim.keymap.set("n", "<c-q>", function()
32 local wininfos = vim.fn.getwininfo()
33 local is_quickfix_open = vim.iter(wininfos):any(function(info)
34 return info.quickfix == 1 and info.loclist ~= 1
35 end)
36 if is_quickfix_open then
37 vim.cmd.cclose()
38 else
39 vim.cmd.copen()
40 end
41end)
42
43vim.keymap.set("n", "<cs-tab>", "<cmd>tabprev<cr>", { desc = "Prev tab" })
44vim.keymap.set("n", "<c-tab>", "<cmd>tabnext<cr>", { desc = "Next tab" })
45
46-- ways to exit select mode without substituting
47vim.keymap.set("s", "<left>", "<c-g><c-v>I")
48vim.keymap.set("s", "<right>", "<c-g><c-v>A")
49
50-- other useful mappings
51vim.keymap.set("x", "J", ":m '>+1<cr>gv", { silent = true, desc = "Move down" })
52vim.keymap.set("x", "K", ":m '<-2<cr>gv", { silent = true, desc = "Move up" })
53
54-- credit: https://www.reddit.com/r/neovim/comments/1k4efz8/comment/mo9t5xq
55vim.keymap.set("n", "ycc", function()
56 return 'yy' .. vim.v.count1 .. "gcc']p"
57end, { remap = true, expr = true })
58
59-- TODO: make it work with v:count
60vim.keymap.set("n", "zh", "shiftwidth() . 'zh'", { expr = true })
61vim.keymap.set("n", "zl", "shiftwidth() . 'zl'", { expr = true })
62
63-- easy register mappings
64vim.keymap.set("n", "+", '"+')
65vim.keymap.set("n", "_", '"_')
66
67-- diagnostics
68vim.keymap.set("n", "<leader>cd", vim.diagnostic.open_float, { desc = "Line Diagnostics" })
69-- stylua: ignore start
70vim.keymap.set({ "n", "x" }, "]d", function() vim.diagnostic.jump({ count = 1, float = true }) end, { desc = "Next Diagnostic" })
71vim.keymap.set({ "n", "x" }, "[d", function() vim.diagnostic.jump({ count = -1, float = true }) end, { desc = "Prev Diagnostic" })
72vim.keymap.set({ "n", "x" }, "]e", function() vim.diagnostic.jump({ count = 1, float = true, severity = vim.diagnostic.severity.ERROR }) end, { desc = "Next Error" })
73vim.keymap.set({ "n", "x" }, "[e", function() vim.diagnostic.jump({ count = -1, float = true, severity = vim.diagnostic.severity.ERROR }) end, { desc = "Prev Error" })
74vim.keymap.set({ "n", "x" }, "]w", function() vim.diagnostic.jump({ count = 1, float = true, severity = vim.diagnostic.severity.WARN }) end, { desc = "Next Warning" })
75vim.keymap.set({ "n", "x" }, "[w", function() vim.diagnostic.jump({ count = -1, float = true, severity = vim.diagnostic.severity.WARN }) end, { desc = "Prev Warning" })
76-- stylua: ignore end
77
78-- format
79vim.keymap.set("n", "<leader>cf", "<cmd>Format<cr>", { desc = "Format" })
80
81-- snippets
82vim.keymap.set({ "i", "s" }, "<c-l>", function()
83 return vim.snippet.active({ direction = 1 }) and vim.snippet.jump(1)
84end, { silent = true })
85vim.keymap.set({ "i", "s" }, "<c-h>", function()
86 return vim.snippet.active({ direction = -1 }) and vim.snippet.jump(-1)
87end, { silent = true })
88vim.keymap.set({ "i", "s" }, "<tab>", function()
89 return vim.snippet.active({ direction = 1 }) and vim.snippet.jump(1)
90end, { silent = true })
91vim.keymap.set({ "i", "s" }, "<s-tab>", function()
92 return vim.snippet.active({ direction = -1 }) and vim.snippet.jump(-1)
93end, { silent = true })
94
95-- lsp
96vim.api.nvim_create_autocmd("LspAttach", {
97 group = vim.api.nvim_create_augroup("UserLspAttach", { clear = false }),
98 callback = function(ev)
99 vim.keymap.set("n", "grr", vim.lsp.buf.references, { buffer = ev.buf })
100 vim.keymap.set("n", "gd", vim.lsp.buf.definition, { buffer = ev.buf })
101 vim.keymap.set("n", "gry", vim.lsp.buf.type_definition, { buffer = ev.buf })
102 vim.keymap.set("n", "gri", vim.lsp.buf.implementation, { buffer = ev.buf })
103 vim.keymap.set("n", "grd", vim.lsp.buf.declaration, { buffer = ev.buf })
104 vim.keymap.set("i", "<c-s>", vim.lsp.buf.signature_help, { buffer = ev.buf })
105 vim.keymap.set({ "n", "i" }, "<f2>", function()
106 vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
107 end, { buffer = ev.buf })
108 end,
109})
110
111vim.api.nvim_create_autocmd("User", {
112 pattern = "GitAttach",
113 callback = function(ev)
114 vim.keymap.set({ "x", "o" }, "ih", ":<c-u>Gitsigns select_hunk<cr>", { desc = "Select Hunk", buffer = ev.buf })
115 vim.keymap.set({ "x", "o" }, "ah", ":<c-u>Gitsigns select_hunk<cr>", { desc = "Select Hunk", buffer = ev.buf })
116 vim.keymap.set({ "n", "x" }, "]h", "<cmd>Gitsigns next_hunk<cr>", { desc = "Next Hunk", buffer = ev.buf })
117 vim.keymap.set({ "n", "x" }, "[h", "<cmd>Gitsigns prev_hunk<cr>", { desc = "Prev Hunk", buffer = ev.buf })
118 vim.keymap.set("n", "<leader>gu", "<cmd>Gitsigns undo_stage_hunk<cr>", { desc = "Undo Stage Hunk", buffer = ev.buf })
119 vim.keymap.set("n", "<leader>gA", "<cmd>Gitsigns stage_buffer<cr>", { desc = "Stage Buffer", buffer = ev.buf })
120 vim.keymap.set("n", "<leader>gb", "<cmd>Gitsigns blame_line<cr>", { desc = "Stage Buffer", buffer = ev.buf })
121 vim.keymap.set("n", "<leader>gR", "<cmd>Gitsigns reset_buffer<cr>", { desc = "Reset Buffer", buffer = ev.buf })
122 vim.keymap.set("n", "<leader>gp", "<cmd>Gitsigns preview_hunk_inline<cr>", { desc = "Preview Inline", buffer = ev.buf })
123 vim.keymap.set("n", "<leader>gP", "<cmd>Gitsigns preview_hunk<cr>", { desc = "Preview Hunk", buffer = ev.buf })
124 vim.keymap.set("n", "<leader>gk", "<cmd>Gitsigns blame_line<cr>", { desc = "Blame Line", buffer = ev.buf })
125 vim.keymap.set({ "n", "x" }, "<leader>ga", "<cmd>Gitsigns stage_hunk<cr>", { desc = "Stage Hunk", buffer = ev.buf })
126 vim.keymap.set({ "n", "x" }, "<leader>gr", "<cmd>Gitsigns reset_hunk<cr>", { desc = "Reset Hunk", buffer = ev.buf })
127 end,
128})