this repo has no description
1local function qflist_is_open()
2 local is_open = false
3 for _, win in ipairs(vim.fn.getwininfo()) do
4 if win.quickfix == 1 then
5 is_open = true
6 break
7 end
8 end
9 return is_open
10end
11
12local function toggle_qf_list()
13 if qflist_is_open() then
14 vim.cmd("cclose")
15 else
16 vim.cmd("copen")
17 end
18end
19
20-- movement
21vim.keymap.set("n", "<C-h>", "<C-w>h")
22vim.keymap.set("n", "<C-j>", "<C-w>j")
23vim.keymap.set("n", "<C-k>", "<C-w>k")
24vim.keymap.set("n", "<C-l>", "<C-w>l")
25vim.keymap.set("n", "<M-l>", "5zl")
26vim.keymap.set("n", "<M-h>", "5zh")
27vim.keymap.set("n", "H", ":bp<cr>")
28vim.keymap.set("n", "L", ":bn<cr>")
29
30vim.keymap.set("n", "E", "<cmd>Neotree toggle reveal position=current<cr>")
31vim.keymap.set("n", "<leader>e", "<cmd>Neotree toggle reveal position=left<cr>")
32
33-- buffers
34vim.keymap.set("n", "<leader>BD", "<cmd>bufdo bd<cr>")
35vim.keymap.set("n", "<leader>BT", "<cmd>!trash %<cr>")
36-- Prevents the pane from being removed when closing a buffer
37vim.keymap.set("n", "<leader>d", "<cmd>bp<bar>sp<bar>bn<bar>bd<cr>")
38vim.keymap.set("n", "<leader>D", "<cmd>bp<bar>sp<bar>bn<bar>bd!<cr>")
39vim.keymap.set("n", "<leader>v/", "<cmd>vsp<cr>")
40vim.keymap.set("n", "<leader>v?", "<cmd>sp<cr>")
41
42-- tabs
43vim.keymap.set("n", "<C-t>", "<cmd>tabnext<cr>")
44vim.keymap.set("n", "<C-S-t>", "<cmd>tabprev<cr>")
45vim.keymap.set("n", "<leader>tn", "<cmd>tabnew<cr>")
46vim.keymap.set("n", "<leader>td", "<cmd>tabclose<cr>")
47
48-- comments
49vim.keymap.set("n", "<leader>/", "<cmd>CommentToggle<cr>")
50vim.keymap.set("v", "<leader>/", ":'<,'>CommentToggle<cr>")
51
52
53-- telescope
54vim.keymap.set("n",
55 "<leader>f",
56 "<cmd>Telescope find_files find_command=rg,--ignore,--hidden,--files,--iglob=!.git sort_mru=true<cr>"
57)
58vim.keymap.set("n", "<leader>b", "<cmd>Telescope buffers<cr>")
59vim.keymap.set("n", "<leader>sp", "<cmd>Telescope live_grep<cr>")
60vim.keymap.set("n", "<leader>sh", "<cmd>Telescope help_tags<cr>")
61vim.keymap.set("n", "<leader>sc", "<cmd>Telescope commands<cr>")
62
63vim.keymap.set("n", "<leader>h", "<cmd>noh<cr>")
64
65vim.keymap.set("n", "<leader>M", "<cmd>messages<cr>")
66
67vim.keymap.set("n", "<leader>T", ":term ")
68
69vim.keymap.set("n", "<leader>m", function()
70 vim.diagnostic.setqflist({ open = true, focus = true })
71end)
72vim.keymap.set("n", "<leader>cc", toggle_qf_list)
73vim.keymap.set("n", "<leader>cn", "<cmd>cnext<cr>")
74vim.keymap.set("n", "<leader>cp", "<cmd>cprev<cr>")
75
76-- write/quit
77vim.keymap.set("n", "<leader>w", "<cmd>w<cr>")
78vim.keymap.set("n", "<leader>X", "<cmd>x<cr>")
79vim.keymap.set("n", "<leader>q", "<cmd>q<cr>")
80vim.keymap.set("n", "<leader>Q", "<cmd>qa<cr>")
81
82-- lsp
83vim.keymap.set("n", "[d", "<cmd>lua vim.diagnostic.goto_prev()<cr>")
84vim.keymap.set("n", "]d", "<cmd>lua vim.diagnostic.goto_next()<cr>")
85vim.keymap.set("n", "K", "<cmd>lua vim.lsp.buf.hover()<cr>")
86vim.keymap.set("n", "gs", "<cmd>Telescope lsp_document_symbols<cr>")
87vim.keymap.set("n", "gS", "<cmd>Telescope lsp_dynamic_workspace_symbols<cr>")
88vim.keymap.set("n", "gD", "<cmd>lua vim.lsp.buf.declaration()<cr>")
89vim.keymap.set("n", "gd", "<cmd>lua vim.lsp.buf.definition()<cr>")
90vim.keymap.set("n", "gi", "<cmd>lua vim.lsp.buf.implementation()<cr>")
91vim.keymap.set("n", "gr", "<cmd>lua vim.lsp.buf.references()<cr>")
92vim.keymap.set("n", "g.", "<cmd>lua vim.lsp.buf.code_action()<cr>")
93vim.keymap.set("n", "<leader>R", "<cmd>lua vim.lsp.buf.rename()<cr>")
94vim.keymap.set("n", "<leader>F", "<cmd>Format<CR>")
95
96-- trouble
97vim.keymap.set("n", "<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", { desc = "Diagnostics (Trouble)" })
98vim.keymap.set("n", "<leader>xX", "<cmd>Trouble diagnostics toggle filter.buf=0<cr>",
99 { desc = "Buffer Diagnostics (Trouble)" })
100vim.keymap.set("n", "<leader>cs", "<cmd>Trouble symbols_float toggle<cr>",
101 { desc = "Symbols (Trouble)" })
102vim.keymap.set("n", "<leader>cS", "<cmd>Trouble symbols toggle<cr>",
103 { desc = "Symbols (Trouble)" })
104vim.keymap.set("n", "<leader>cl", "<cmd>Trouble lsp toggle focus=false<cr>",
105 { desc = "LSP Definitions / references / ... (Trouble)" })
106vim.keymap.set("n", "<leader>xL", "<cmd>Trouble loclist toggle<cr>", { desc = "Location List (Trouble)" })
107vim.keymap.set("n", "<leader>xQ", "<cmd>Trouble qflist toggle<cr>", { desc = "Quickfix List (Trouble)" })
108
109-- git
110vim.keymap.set("n", "[g", "<cmd>Gitsigns prev_hunk<cr>")
111vim.keymap.set("n", "]g", "<cmd>Gitsigns next_hunk<cr>")
112vim.keymap.set("n", "<leader>gg", "<cmd>LazyGit<cr>")
113vim.keymap.set("n", "<leader>gs", "<cmd>Telescope git_status<cr>")
114vim.keymap.set("n", "<leader>gd", "<cmd>Gitsigns diffthis vertical=true HEAD<cr>")
115vim.keymap.set("n", "<leader>Gd", ":Gitsigns diffthis vertical=true ")
116vim.keymap.set("n", "<leader>GD", ":DiffviewOpen ")
117vim.keymap.set("n", "<leader>gh", "<cmd>DiffviewFileHistory %<cr>")
118vim.keymap.set("n", "<leader>gH", "<cmd>DiffviewFileHistory<cr>")
119vim.keymap.set("n", "<leader>gb", "<cmd>Gitsigns toggle_current_line_blame<cr>")
120
121vim.keymap.set("n", "<leader>Z", "<cmd>Goyo<cr>")
122
123vim.keymap.set("v", "<leader>gl", function()
124 require("gitlinker").get_buf_range_url("n", {
125 action_callback = require("gitlinker.actions").copy_to_clipboard
126 })
127end, { silent = true })
128
129vim.keymap.set("v", "<leader>gl", function()
130 require("gitlinker").get_buf_range_url("v", {
131 action_callback = require("gitlinker.actions").copy_to_clipboard
132 })
133end, { silent = true })
134
135vim.keymap.set("n", "<leader>y", function()
136 local filepath = vim.fn.expand('%:.')
137 local line = vim.fn.line('.')
138 local ref = filepath .. ':' .. line
139 vim.fn.system('pbcopy', ref)
140 vim.notify('Copied: ' .. ref, vim.log.levels.INFO)
141end, { desc = "Copy filepath:line to clipboard" })
142
143-- claude edit
144vim.api.nvim_create_user_command("Claude", function(opts)
145 vim.ui.input({ prompt = "Claude: " }, function(input)
146 if not input or input == "" then return end
147 local ref = string.format("@%s:%d-%d", vim.fn.expand("%:."), opts.line1, opts.line2)
148 local prompt = string.format("%s (in %s)", input, ref)
149 vim.cmd(vim.o.columns >= 160 and "botright vnew" or "botright new")
150 vim.fn.jobstart({ "claude", "--permission-mode", "acceptEdits", prompt }, { term = true })
151 end)
152end, { range = true })
153vim.keymap.set({ "n", "v" }, "<leader>C", ":Claude<cr>", { desc = "Claude edit" })
154
155vim.keymap.set("n", "<leader>PP", "<cmd>Lazy<cr>")
156
157vim.keymap.set("n", "<leader>LC", "<cmd>ConfigLocalEdit<cr>")
158
159-- personal notes shortcuts
160vim.keymap.set("n", "<leader>sn", function()
161 -- create a new note file under `.sethetter/notes/$(timestamp).md` and open it
162 local timestamp = os.date("%Y%m%d%H%M%S")
163 vim.fn.system("mkdir -p .sethetter/notes/")
164 vim.cmd("edit .sethetter/notes/" .. timestamp .. ".md")
165end, { desc = "New personal note" })
166
167vim.keymap.set("n", "<leader>st", "<cmd>e .sethetter/TODO.md<cr>", { desc = "Open personal TODO list" })
168
169vim.keymap.set("n", "<leader>sN", function()
170 require("telescope.builtin").find_files({
171 cwd = ".sethetter/notes",
172 prompt_title = "Notes",
173 previewer = true,
174 })
175end, { desc = "Browse notes" })