diff options
Diffstat (limited to 'home/nvim/autocommands.lua')
| -rw-r--r-- | home/nvim/autocommands.lua | 440 |
1 files changed, 220 insertions, 220 deletions
diff --git a/home/nvim/autocommands.lua b/home/nvim/autocommands.lua index b8bf173..eda0653 100644 --- a/home/nvim/autocommands.lua +++ b/home/nvim/autocommands.lua @@ -1,272 +1,272 @@ local augroup = vim.api.nvim_create_augroup("UserConfig", {}) vim.api.nvim_create_autocmd("TextYankPost", { - desc = "Highlight when yanking (copying) text", - group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }), - callback = function() vim.highlight.on_yank() end, + desc = "Highlight when yanking (copying) text", + group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }), + callback = function() vim.highlight.on_yank() end, }) vim.api.nvim_create_autocmd({ "BufWritePre" }, { - pattern = { "*" }, - command = [[%s/\s\+$//e]], + pattern = { "*" }, + command = [[%s/\s\+$//e]], }) -- Return to last edit position when opening files vim.api.nvim_create_autocmd("BufReadPost", { - group = augroup, - callback = function() - local mark = vim.api.nvim_buf_get_mark(0, '"') - local lcount = vim.api.nvim_buf_line_count(0) - if mark[1] > 0 and mark[1] <= lcount then pcall(vim.api.nvim_win_set_cursor, 0, mark) end - end, + group = augroup, + callback = function() + local mark = vim.api.nvim_buf_get_mark(0, '"') + local lcount = vim.api.nvim_buf_line_count(0) + if mark[1] > 0 and mark[1] <= lcount then pcall(vim.api.nvim_win_set_cursor, 0, mark) end + end, }) -- Auto-close terminal when process exits vim.api.nvim_create_autocmd("TermClose", { - group = augroup, - callback = function() - if vim.v.event.status == 0 then vim.api.nvim_buf_delete(0, {}) end - end, + group = augroup, + callback = function() + if vim.v.event.status == 0 then vim.api.nvim_buf_delete(0, {}) end + end, }) -- Disable line numbers in terminal vim.api.nvim_create_autocmd("TermOpen", { - group = augroup, - callback = function() - vim.opt_local.number = false - vim.opt_local.relativenumber = false - vim.opt_local.signcolumn = "no" - end, + group = augroup, + callback = function() + vim.opt_local.number = false + vim.opt_local.relativenumber = false + vim.opt_local.signcolumn = "no" + end, }) -- Auto-resize splits when window is resized vim.api.nvim_create_autocmd("VimResized", { - group = augroup, - callback = function() vim.cmd("tabdo wincmd =") end, + group = augroup, + callback = function() vim.cmd("tabdo wincmd =") end, }) local og_virt_text local og_virt_line vim.api.nvim_create_autocmd({ "CursorMoved", "DiagnosticChanged" }, { - group = vim.api.nvim_create_augroup("diagnostic_only_virtlines", { clear = true }), - callback = function() - if og_virt_line == nil then og_virt_line = vim.diagnostic.config().virtual_lines end - - -- ignore if virtual_lines.current_line is disabled - if not (og_virt_line and og_virt_line.current_line) then - if og_virt_text then - vim.diagnostic.config({ virtual_text = og_virt_text }) - og_virt_text = nil - end - return - end - - if og_virt_text == nil then og_virt_text = vim.diagnostic.config().virtual_text end - - local lnum = vim.api.nvim_win_get_cursor(0)[1] - 1 - - if vim.tbl_isempty(vim.diagnostic.get(0, { lnum = lnum })) then - vim.diagnostic.config({ virtual_text = og_virt_text }) - else - vim.diagnostic.config({ virtual_text = false }) - end - end, + group = vim.api.nvim_create_augroup("diagnostic_only_virtlines", { clear = true }), + callback = function() + if og_virt_line == nil then og_virt_line = vim.diagnostic.config().virtual_lines end + + -- ignore if virtual_lines.current_line is disabled + if not (og_virt_line and og_virt_line.current_line) then + if og_virt_text then + vim.diagnostic.config({ virtual_text = og_virt_text }) + og_virt_text = nil + end + return + end + + if og_virt_text == nil then og_virt_text = vim.diagnostic.config().virtual_text end + + local lnum = vim.api.nvim_win_get_cursor(0)[1] - 1 + + if vim.tbl_isempty(vim.diagnostic.get(0, { lnum = lnum })) then + vim.diagnostic.config({ virtual_text = og_virt_text }) + else + vim.diagnostic.config({ virtual_text = false }) + end + end, }) vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("lsp-attach", { clear = true }), - callback = function(event) - local map = function(keys, func, desc) - vim.keymap.set("n", keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) - end - - local client = vim.lsp.get_client_by_id(event.data.client_id) - - if client and client:supports_method("textDocument/implementation") then - -- defaults: - -- https://neovim.io/doc/user/news-0.11.html#_defaults - map("gl", vim.diagnostic.open_float, "Open Diagnostic Float") - map("K", vim.lsp.buf.hover, "Hover Documentation") - map("gs", vim.lsp.buf.signature_help, "Signature Documentation") - map("gD", vim.lsp.buf.declaration, "Goto Declaration") - map("<leader>la", vim.lsp.buf.code_action, "Code Action") - map("<leader>lr", vim.lsp.buf.rename, "Rename all references") - map("<leader>lf", vim.lsp.buf.format, "Format") - map( - "<leader>v", - "<cmd>vsplit | lua vim.lsp.buf.definition()<cr>", - "Goto Definition in Vertical Split" - ) - map("gd", vim.lsp.buf.definition, "Goto Definition") - map("gr", vim.lsp.buf.references, "Goto References") - map("gI", vim.lsp.buf.implementation, "Goto Implementation") - end - - if client and client:supports_method("textDocument/completion") then - vim.lsp.completion.enable(true, client.id, event.buf, { - autotrigger = true, - convert = function(item) return { abbr = item.label:gsub("%b()", "") } end, - }) - vim.keymap.set("i", "<c-space>", function() vim.lsp.completion.get() end) - client.server_capabilities.completionProvider = client.server_capabilities.completionProvider or {} - local trigger_chars = {} - for i = 32, 126 do - table.insert(trigger_chars, string.char(i)) - end - client.server_capabilities.completionProvider.triggerCharacters = vim.list_extend( - client.server_capabilities.completionProvider.triggerCharacters or {}, - trigger_chars - ) - end - - if client and client:supports_method("textDocument/formatting") then - vim.api.nvim_create_autocmd("BufWritePre", { - group = vim.api.nvim_create_augroup("my.lsp", { clear = false }), - buffer = event.buf, - callback = function() - vim.lsp.buf.format({ bufnr = event.buf, id = client.id, timeout_ms = 1000 }) - end, - }) - end - - if client and client:supports_method("textDocument/inlayHint") then - vim.lsp.inlay_hint.enable(true, { bufnr = event.buf }) - end - - if client and client:supports_method("textDocument/documentHighlight") then - local highlight_augroup = - vim.api.nvim_create_augroup("lsp-highlight", { clear = false }) - - -- When cursor stops moving: Highlights all instances of the symbol under the cursor - -- When cursor moves: Clears the highlighting - vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { - buffer = event.buf, - group = highlight_augroup, - callback = vim.lsp.buf.document_highlight, - }) - vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { - buffer = event.buf, - group = highlight_augroup, - callback = vim.lsp.buf.clear_references, - }) - - -- When LSP detaches: Clears the highlighting - vim.api.nvim_create_autocmd("LspDetach", { - group = vim.api.nvim_create_augroup("lsp-detach", { clear = true }), - callback = function(event2) - vim.lsp.buf.clear_references() - vim.api.nvim_clear_autocmds({ group = "lsp-highlight", buffer = event2.buf }) - end, - }) - end - end, + group = vim.api.nvim_create_augroup("lsp-attach", { clear = true }), + callback = function(event) + local map = function(keys, func, desc) + vim.keymap.set("n", keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) + end + + local client = vim.lsp.get_client_by_id(event.data.client_id) + + if client and client:supports_method("textDocument/implementation") then + -- defaults: + -- https://neovim.io/doc/user/news-0.11.html#_defaults + map("gl", vim.diagnostic.open_float, "Open Diagnostic Float") + map("K", vim.lsp.buf.hover, "Hover Documentation") + map("gs", vim.lsp.buf.signature_help, "Signature Documentation") + map("gD", vim.lsp.buf.declaration, "Goto Declaration") + map("<leader>la", vim.lsp.buf.code_action, "Code Action") + map("<leader>lr", vim.lsp.buf.rename, "Rename all references") + map("<leader>lf", vim.lsp.buf.format, "Format") + map( + "<leader>v", + "<cmd>vsplit | lua vim.lsp.buf.definition()<cr>", + "Goto Definition in Vertical Split" + ) + map("gd", vim.lsp.buf.definition, "Goto Definition") + map("gr", vim.lsp.buf.references, "Goto References") + map("gI", vim.lsp.buf.implementation, "Goto Implementation") + end + + if client and client:supports_method("textDocument/completion") then + vim.lsp.completion.enable(true, client.id, event.buf, { + autotrigger = true, + convert = function(item) return { abbr = item.label:gsub("%b()", "") } end, + }) + vim.keymap.set("i", "<c-space>", function() vim.lsp.completion.get() end) + client.server_capabilities.completionProvider = client.server_capabilities.completionProvider or {} + local trigger_chars = {} + for i = 32, 126 do + table.insert(trigger_chars, string.char(i)) + end + client.server_capabilities.completionProvider.triggerCharacters = vim.list_extend( + client.server_capabilities.completionProvider.triggerCharacters or {}, + trigger_chars + ) + end + + if client and client:supports_method("textDocument/formatting") then + vim.api.nvim_create_autocmd("BufWritePre", { + group = vim.api.nvim_create_augroup("my.lsp", { clear = false }), + buffer = event.buf, + callback = function() + vim.lsp.buf.format({ bufnr = event.buf, id = client.id, timeout_ms = 1000 }) + end, + }) + end + + if client and client:supports_method("textDocument/inlayHint") then + vim.lsp.inlay_hint.enable(true, { bufnr = event.buf }) + end + + if client and client:supports_method("textDocument/documentHighlight") then + local highlight_augroup = + vim.api.nvim_create_augroup("lsp-highlight", { clear = false }) + + -- When cursor stops moving: Highlights all instances of the symbol under the cursor + -- When cursor moves: Clears the highlighting + vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.document_highlight, + }) + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.clear_references, + }) + + -- When LSP detaches: Clears the highlighting + vim.api.nvim_create_autocmd("LspDetach", { + group = vim.api.nvim_create_augroup("lsp-detach", { clear = true }), + callback = function(event2) + vim.lsp.buf.clear_references() + vim.api.nvim_clear_autocmds({ group = "lsp-highlight", buffer = event2.buf }) + end, + }) + end + end, }) vim.api.nvim_create_autocmd("ModeChanged", { - group = vim.api.nvim_create_augroup("diagnostic_redraw", {}), - callback = function() pcall(vim.diagnostic.show) end, + group = vim.api.nvim_create_augroup("diagnostic_redraw", {}), + callback = function() pcall(vim.diagnostic.show) end, }) -- terminal local terminal_state = { - buf = nil, - win = nil, - is_open = false, + buf = nil, + win = nil, + is_open = false, } local function FloatingTerminal() - -- If terminal is already open, close it (toggle behavior) - if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then - vim.api.nvim_win_close(terminal_state.win, false) - terminal_state.is_open = false - return - end - - -- Create buffer if it doesn't exist or is invalid - if not terminal_state.buf or not vim.api.nvim_buf_is_valid(terminal_state.buf) then - terminal_state.buf = vim.api.nvim_create_buf(false, true) - -- Set buffer options for better terminal experience - vim.api.nvim_buf_set_option(terminal_state.buf, "bufhidden", "hide") - end - - -- Calculate window dimensions - local width = math.floor(vim.o.columns * 0.8) - local height = math.floor(vim.o.lines * 0.8) - local row = math.floor((vim.o.lines - height) / 2) - local col = math.floor((vim.o.columns - width) / 2) - - -- Create the floating window - terminal_state.win = vim.api.nvim_open_win(terminal_state.buf, true, { - relative = "editor", - width = width, - height = height, - row = row, - col = col, - style = "minimal", - border = "rounded", - }) - - -- Set transparency for the floating window - vim.api.nvim_win_set_option(terminal_state.win, "winblend", 0) - - -- Set transparent background for the window - vim.api.nvim_win_set_option( - terminal_state.win, - "winhighlight", - "Normal:FloatingTermNormal,FloatBorder:FloatingTermBorder" - ) - - -- Define highlight groups for transparency - vim.api.nvim_set_hl(0, "FloatingTermNormal", { bg = "none" }) - vim.api.nvim_set_hl(0, "FloatingTermBorder", { bg = "none" }) - - -- Start terminal if not already running - local has_terminal = false - local lines = vim.api.nvim_buf_get_lines(terminal_state.buf, 0, -1, false) - for _, line in ipairs(lines) do - if line ~= "" then - has_terminal = true - break - end - end - - if not has_terminal then vim.fn.termopen(os.getenv("SHELL")) end - - terminal_state.is_open = true - vim.cmd("startinsert") - - -- Set up auto-close on buffer leave - vim.api.nvim_create_autocmd("BufLeave", { - buffer = terminal_state.buf, - callback = function() - if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then - vim.api.nvim_win_close(terminal_state.win, false) - terminal_state.is_open = false - end - end, - once = true, - }) + -- If terminal is already open, close it (toggle behavior) + if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + return + end + + -- Create buffer if it doesn't exist or is invalid + if not terminal_state.buf or not vim.api.nvim_buf_is_valid(terminal_state.buf) then + terminal_state.buf = vim.api.nvim_create_buf(false, true) + -- Set buffer options for better terminal experience + vim.api.nvim_buf_set_option(terminal_state.buf, "bufhidden", "hide") + end + + -- Calculate window dimensions + local width = math.floor(vim.o.columns * 0.8) + local height = math.floor(vim.o.lines * 0.8) + local row = math.floor((vim.o.lines - height) / 2) + local col = math.floor((vim.o.columns - width) / 2) + + -- Create the floating window + terminal_state.win = vim.api.nvim_open_win(terminal_state.buf, true, { + relative = "editor", + width = width, + height = height, + row = row, + col = col, + style = "minimal", + border = "rounded", + }) + + -- Set transparency for the floating window + vim.api.nvim_win_set_option(terminal_state.win, "winblend", 0) + + -- Set transparent background for the window + vim.api.nvim_win_set_option( + terminal_state.win, + "winhighlight", + "Normal:FloatingTermNormal,FloatBorder:FloatingTermBorder" + ) + + -- Define highlight groups for transparency + vim.api.nvim_set_hl(0, "FloatingTermNormal", { bg = "none" }) + vim.api.nvim_set_hl(0, "FloatingTermBorder", { bg = "none" }) + + -- Start terminal if not already running + local has_terminal = false + local lines = vim.api.nvim_buf_get_lines(terminal_state.buf, 0, -1, false) + for _, line in ipairs(lines) do + if line ~= "" then + has_terminal = true + break + end + end + + if not has_terminal then vim.fn.termopen(os.getenv("SHELL")) end + + terminal_state.is_open = true + vim.cmd("startinsert") + + -- Set up auto-close on buffer leave + vim.api.nvim_create_autocmd("BufLeave", { + buffer = terminal_state.buf, + callback = function() + if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + end + end, + once = true, + }) end -- Function to explicitly close the terminal local function CloseFloatingTerminal() - if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then - vim.api.nvim_win_close(terminal_state.win, false) - terminal_state.is_open = false - end + if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + end end -- Key mappings vim.keymap.set( - "n", - "<leader>t", - FloatingTerminal, - { noremap = true, silent = true, desc = "Toggle floating terminal" } + "n", + "<leader>t", + FloatingTerminal, + { noremap = true, silent = true, desc = "Toggle floating terminal" } ) vim.keymap.set("t", "<Esc>", function() - if terminal_state.is_open then - vim.api.nvim_win_close(terminal_state.win, false) - terminal_state.is_open = false - end + if terminal_state.is_open then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + end end, { noremap = true, silent = true, desc = "Close floating terminal from terminal mode" }) |
