aboutsummaryrefslogtreecommitdiffstats
path: root/home/nvim/autocommands.lua
diff options
context:
space:
mode:
authorPetri Hienonen <petri.hienonen@gmail.com>2024-05-23 13:56:00 +0300
committerPetri Hienonen <petri.hienonen@gmail.com>2025-11-30 12:29:57 +0200
commit08297376a85a1719518507e54fca9de954d2376a (patch)
tree3b9c58304b40248533bbb2bb5b7bad2da9da1ff0 /home/nvim/autocommands.lua
parent75c2af4aedd2ac5c2cfc74b346625fa4b265541d (diff)
downloadnixos-08297376a85a1719518507e54fca9de954d2376a.tar.zst
Agenix configuration
Diffstat (limited to 'home/nvim/autocommands.lua')
-rw-r--r--home/nvim/autocommands.lua272
1 files changed, 272 insertions, 0 deletions
diff --git a/home/nvim/autocommands.lua b/home/nvim/autocommands.lua
new file mode 100644
index 0000000..b8bf173
--- /dev/null
+++ b/home/nvim/autocommands.lua
@@ -0,0 +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,
+})
+
+vim.api.nvim_create_autocmd({ "BufWritePre" }, {
+ 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,
+})
+
+-- 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,
+})
+
+-- 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,
+})
+
+-- Auto-resize splits when window is resized
+vim.api.nvim_create_autocmd("VimResized", {
+ 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,
+})
+
+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,
+})
+
+vim.api.nvim_create_autocmd("ModeChanged", {
+ 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,
+}
+
+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,
+ })
+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
+end
+
+-- Key mappings
+vim.keymap.set(
+ "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
+end, { noremap = true, silent = true, desc = "Close floating terminal from terminal mode" })