Skip to content

Commit 0d12da1

Browse files
committed
nvim config edits
1 parent 779413c commit 0d12da1

File tree

5 files changed

+495
-335
lines changed

5 files changed

+495
-335
lines changed

home/nvim/lua/aucmd.lua

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ vim.api.nvim_create_autocmd("LspAttach", {
1212
end, { desc = "Restart all active LSP clients" })
1313

1414
-- mappings
15-
vim.keymap.set("n", "<cr>", vim.diagnostic.open_float, { buffer = event.buf, desc = "lsp: open diagnostic" })
15+
vim.keymap.set("n", "<cr>", function()
16+
vim.cmd("normal! zz")
17+
vim.diagnostic.open_float()
18+
end, { buffer = event.buf, desc = "lsp: open diagnostic" })
1619
vim.keymap.set("n", "gd", vim.lsp.buf.definition, { buffer = event.buf, desc = "lsp: show definition" })
1720
vim.keymap.set("n", "gD", vim.lsp.buf.type_definition, { buffer = event.buf, desc = "lsp: show type definition" })
1821
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { buffer = event.buf, desc = "lsp: show implementations" })
19-
-- vim.keymap.set("n", "go", vim.lsp.buf.document_symbol, { buffer = event.buf, desc = "lsp: outline symbols" })
2022
vim.keymap.set("n", "<leader>r", vim.lsp.buf.rename, { buffer = event.buf, desc = "lsp: rename symbol" })
2123
vim.keymap.set("n", "<leader>?", vim.lsp.buf.code_action, { buffer = event.buf, desc = "lsp: run code action" })
2224
vim.keymap.set("n", "<leader>qd", vim.diagnostic.setqflist, { buffer = event.buf, desc = "lsp: list diagnostics" })
@@ -30,6 +32,16 @@ vim.api.nvim_create_autocmd("LspAttach", {
3032
includeDeclaration = false,
3133
})
3234
end, { buffer = event.buf, desc = "lsp: show refs" })
35+
36+
-- autocmds
37+
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
38+
group = vim.api.nvim_create_augroup("draw_references_document_highlight", { clear = true }),
39+
callback = vim.lsp.buf.document_highlight,
40+
})
41+
vim.api.nvim_create_autocmd("CursorMoved", {
42+
group = vim.api.nvim_create_augroup("clear_references_document_highlight", { clear = true }),
43+
callback = vim.lsp.buf.clear_references,
44+
})
3345
end,
3446
})
3547

home/nvim/lua/debugger.lua

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
local M = {}
2+
M = {
3+
namespace = vim.api.nvim_create_namespace("dap-view"),
4+
win = Snacks.win({
5+
enter = false,
6+
show = false,
7+
position = "bottom",
8+
height = 0.25,
9+
on_close = function()
10+
M.watched_expressions = {}
11+
M.expression_results = {}
12+
M.updated_evaluations = {}
13+
end,
14+
keys = {
15+
["<cr>"] = function()
16+
local line = vim.api.nvim_win_get_cursor(0)[1]
17+
Snacks.win({
18+
position = "bottom",
19+
height = 0.25,
20+
width = 0.75,
21+
text = function()
22+
return M.expression_results[line]
23+
end,
24+
})
25+
end,
26+
["d"] = function()
27+
local line = vim.api.nvim_win_get_cursor(0)[1]
28+
table.remove(M.watched_expressions, line)
29+
table.remove(M.expression_results, line)
30+
M._writeWindowContent()
31+
end,
32+
["e"] = function()
33+
local line = vim.api.nvim_win_get_cursor(0)[1]
34+
local exp = vim.fn.input("Expression: ", M.watched_expressions[line])
35+
if exp == "" then
36+
return
37+
end
38+
M.watched_expressions[line] = exp
39+
M._evalExpression(exp, function(result)
40+
M.expression_results[line] = result
41+
end)
42+
end,
43+
},
44+
}),
45+
watched_expressions = {},
46+
expression_results = {},
47+
updated_evaluations = {},
48+
}
49+
50+
local dap = require("dap")
51+
52+
local function split_string_to_table(str)
53+
local lines = {}
54+
for line in str:gmatch("([^\n]*)\n?") do
55+
if line ~= "" then
56+
table.insert(lines, line)
57+
end
58+
end
59+
return lines
60+
end
61+
62+
M._writeWindowContent = function()
63+
if not M.win.buf then
64+
return
65+
end
66+
-- Clear previous content
67+
vim.api.nvim_buf_set_lines(M.win.buf, 0, -1, true, {})
68+
69+
if #M.watched_expressions == 0 then
70+
vim.wo[M.win.win].cursorline = false
71+
vim.api.nvim_buf_set_lines(M.win.buf, 0, -1, false, { "No expressions" })
72+
return
73+
else
74+
vim.wo[M.win.win].cursorline = true
75+
end
76+
77+
vim.api.nvim_buf_set_lines(M.win.buf, 0, #M.watched_expressions + 1, false, M.watched_expressions)
78+
79+
for i = 1, #M.watched_expressions do
80+
local hl_group = M.updated_evaluations[i] and "DiagnosticVirtualTextWarn" or "Comment"
81+
local expr_result = M.expression_results[i]
82+
83+
if expr_result then
84+
local split_lines = split_string_to_table(expr_result)
85+
local virt_lines = vim
86+
.iter(split_lines)
87+
:map(function(r)
88+
return { { r, hl_group } }
89+
end)
90+
:totable()
91+
92+
if not vim.tbl_isempty(virt_lines) then
93+
vim.api.nvim_buf_set_extmark(M.win.buf, M.namespace, i - 1, 0, {
94+
virt_lines = virt_lines,
95+
})
96+
end
97+
end
98+
end
99+
end
100+
101+
local function evalExpressionRecurse(prepend, result)
102+
local session = assert(require("dap").session(), "has active session")
103+
local frame_id = session.current_frame and session.current_frame.id
104+
105+
local var_ref = result and result.variablesReference
106+
if var_ref and var_ref > 0 then
107+
local vars = {}
108+
109+
local var_ref_err, var_ref_result =
110+
session:request("variables", { variablesReference = var_ref, context = "watch", frameId = frame_id })
111+
112+
if var_ref_err then
113+
table.insert(vars, tostring(var_ref_err))
114+
end
115+
116+
if var_ref_result and not var_ref_err then
117+
for _, k in pairs(var_ref_result.variables) do
118+
if k.name ~= "" then
119+
table.insert(vars, prepend .. k.name .. " = " .. k.value)
120+
end
121+
local appendable = evalExpressionRecurse(prepend .. " ", k)
122+
if appendable ~= "" then
123+
table.insert(vars, appendable)
124+
end
125+
end
126+
end
127+
return table.concat(vars, "\n")
128+
end
129+
return ""
130+
end
131+
132+
M._evalExpression = function(expr, callback)
133+
local session = assert(require("dap").session(), "has active session")
134+
local frame_id = session.current_frame and session.current_frame.id
135+
136+
coroutine.wrap(function()
137+
local err, result = session:request("evaluate", { expression = expr, context = "watch", frameId = frame_id })
138+
139+
local expr_result = result and result.result or err and tostring(err):gsub("%s+", " ") or ""
140+
141+
callback(expr_result .. evalExpressionRecurse(" ", result))
142+
end)()
143+
end
144+
145+
M.add_expr = function()
146+
local exp = vim.fn.input("Expression: ")
147+
if exp == "" then
148+
exp = vim.fn.expand("<cexpr>")
149+
end
150+
M.add_watch_expr(exp)
151+
M.open()
152+
end
153+
154+
M.add_watch_expr = function(expr)
155+
if not (#expr > 0 and not vim.tbl_contains(M.watched_expressions, expr)) then
156+
return
157+
end
158+
159+
if not require("dap").session() then
160+
vim.notify("No active session")
161+
return
162+
end
163+
164+
M._evalExpression(expr, function(result)
165+
table.insert(M.expression_results, result)
166+
end)
167+
168+
table.insert(M.watched_expressions, expr)
169+
end
170+
171+
M.open = function()
172+
M.win:show()
173+
M._writeWindowContent()
174+
end
175+
176+
M.toggle = function()
177+
local win = M.win:toggle()
178+
if win:valid() then
179+
M._writeWindowContent()
180+
end
181+
end
182+
183+
local SUBSCRIPTION_ID = "debugger"
184+
185+
dap.listeners.after.evaluate[SUBSCRIPTION_ID] = function()
186+
M._writeWindowContent()
187+
end
188+
189+
dap.listeners.after.variables[SUBSCRIPTION_ID] = function()
190+
M._writeWindowContent()
191+
end
192+
193+
dap.listeners.after.event_stopped[SUBSCRIPTION_ID] = function()
194+
for i, expr in ipairs(M.watched_expressions) do
195+
M._evalExpression(expr, function(result)
196+
M.updated_evaluations[i] = M.expression_results[i] and M.expression_results[i] ~= result
197+
M.expression_results[i] = result
198+
end)
199+
end
200+
end
201+
202+
dap.listeners.after.event_terminated[SUBSCRIPTION_ID] = function()
203+
for k in ipairs(M.expression_results) do
204+
M.expression_results[k] = nil
205+
end
206+
end
207+
208+
return M

home/nvim/lua/maps.lua

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ vim.keymap.set("x", ">", ">gv", { desc = "indent and reselect" })
5050
vim.keymap.set({ "n" }, "<esc>", "<cmd>nohl<cr><esc>", { desc = "escape and clear search" })
5151

5252
-- window movement
53-
vim.keymap.set("n", "<m-h>", "<c-w>h", { desc = "move focus to left window" })
54-
vim.keymap.set("n", "<m-j>", "<c-w>j", { desc = "move focus to window below" })
55-
vim.keymap.set("n", "<m-k>", "<c-w>k", { desc = "move focus to window above" })
56-
vim.keymap.set("n", "<m-l>", "<c-w>l", { desc = "move focus to right window" })
53+
vim.keymap.set("n", "<c-h>", "<c-w>h", { desc = "move focus to left window" })
54+
vim.keymap.set("n", "<c-j>", "<c-w>j", { desc = "move focus to window below" })
55+
vim.keymap.set("n", "<c-k>", "<c-w>k", { desc = "move focus to window above" })
56+
vim.keymap.set("n", "<c-l>", "<c-w>l", { desc = "move focus to right window" })
5757

5858
-- same for terminal and insert mode
59-
vim.keymap.set({ "i", "t" }, "<m-h>", "<c-\\><c-n><c-w>h", { desc = "move focus to left window" })
60-
vim.keymap.set({ "i", "t" }, "<m-j>", "<c-\\><c-n><c-w>j", { desc = "move focus to window below" })
61-
vim.keymap.set({ "i", "t" }, "<m-k>", "<c-\\><c-n><c-w>k", { desc = "move focus to window above" })
62-
vim.keymap.set({ "i", "t" }, "<m-l>", "<c-\\><c-n><c-w>l", { desc = "move focus to right window" })
59+
vim.keymap.set({ "i", "t" }, "<c-h>", "<c-\\><c-n><c-w>h", { desc = "move focus to left window" })
60+
vim.keymap.set({ "i", "t" }, "<c-j>", "<c-\\><c-n><c-w>j", { desc = "move focus to window below" })
61+
vim.keymap.set({ "i", "t" }, "<c-k>", "<c-\\><c-n><c-w>k", { desc = "move focus to window above" })
62+
vim.keymap.set({ "i", "t" }, "<c-l>", "<c-\\><c-n><c-w>l", { desc = "move focus to right window" })
6363

6464
-- window control for terminals
6565
vim.keymap.set({ "t" }, "<c-w>", "<c-\\><c-n><c-w>", { desc = "window control" })
@@ -158,6 +158,6 @@ end, { desc = "open quickfix" })
158158
vim.keymap.set("i", "<cr>", "<cr><c-g>u")
159159

160160
-- zz on cr
161-
vim.keymap.set("n", "<c-l>", function()
161+
vim.keymap.set("n", "<cr>", function()
162162
vim.cmd("normal! zz")
163163
end, { desc = "center sceen" })

home/nvim/lua/options.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ vim.opt.splitbelow = true -- open horizontal splits below the current window
5555
vim.opt.splitright = true -- open vertical splits to the right of the current window
5656

5757
-- diff
58-
vim.opt.diffopt:append({ "linematch:60" }) -- better diff algorithm
58+
vim.opt.diffopt = "internal,filler,closeoff,indent-heuristic,linematch:60,algorithm:histogram" -- better diff algorithm
5959
vim.opt.fillchars:append({ diff = "" }) -- blank indicator
6060

6161
-- detect filetypes

0 commit comments

Comments
 (0)