From 12329d4e909129380f5e21ebbb5586913cfd9ff8 Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Sat, 8 Nov 2025 21:03:54 +0545 Subject: [PATCH] feat(autocmd): enhance editor with improved cursor behavior and LSP integration --- lua/config/autocmd.lua | 93 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 7 deletions(-) diff --git a/lua/config/autocmd.lua b/lua/config/autocmd.lua index 37a4ec0..244c1dc 100644 --- a/lua/config/autocmd.lua +++ b/lua/config/autocmd.lua @@ -21,7 +21,7 @@ vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { vim.api.nvim_create_autocmd('TextYankPost', { group = augroup('highlight_yank'), callback = function() - vim.highlight.on_yank() + vim.highlight.on_yank({ timeout = 200, visual = true }) end, }) @@ -34,17 +34,96 @@ vim.api.nvim_create_autocmd({ 'VimResized' }, { }) -- go to last loc when opening a buffer +-- vim.api.nvim_create_autocmd('BufReadPost', { +-- group = augroup('last_loc'), +-- 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, +-- }) + +-- restore cursor to file position in previous editing session vim.api.nvim_create_autocmd('BufReadPost', { - group = augroup('last_loc'), - 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) + callback = function(args) + local mark = vim.api.nvim_buf_get_mark(args.buf, '"') + local line_count = vim.api.nvim_buf_line_count(args.buf) + if mark[1] > 0 and mark[1] <= line_count then + vim.api.nvim_win_set_cursor(0, mark) + -- defer centering slightly so it's applied after render + vim.schedule(function() + vim.cmd('normal! zz') + end) end end, }) +-- open help in vertical split +vim.api.nvim_create_autocmd('FileType', { + pattern = 'help', + command = 'wincmd L', +}) + +-- no auto continue comments on new line +vim.api.nvim_create_autocmd('FileType', { + group = vim.api.nvim_create_augroup('no_auto_comment', {}), + callback = function() + vim.opt_local.formatoptions:remove({ 'c', 'r', 'o' }) + end, +}) + +-- show cursorline only in active window enable +vim.api.nvim_create_autocmd({ 'WinEnter', 'BufEnter' }, { + group = vim.api.nvim_create_augroup('active_cursorline', { clear = true }), + callback = function() + vim.opt_local.cursorline = true + end, +}) + +-- show cursorline only in active window disable +vim.api.nvim_create_autocmd({ 'WinLeave', 'BufLeave' }, { + group = 'active_cursorline', + callback = function() + vim.opt_local.cursorline = false + end, +}) + +-- ide like highlight when stopping cursor +vim.api.nvim_create_autocmd('CursorMoved', { + group = vim.api.nvim_create_augroup('LspReferenceHighlight', { clear = true }), + desc = 'Highlight references under cursor', + callback = function() + -- Only run if the cursor is not in insert mode + if vim.fn.mode() ~= 'i' then + local clients = vim.lsp.get_clients({ bufnr = 0 }) + local supports_highlight = false + for _, client in ipairs(clients) do + if client.server_capabilities.documentHighlightProvider then + supports_highlight = true + break -- Found a supporting client, no need to check others + end + end + + -- 3. Proceed only if an LSP is active AND supports the feature + if supports_highlight then + vim.lsp.buf.clear_references() + vim.lsp.buf.document_highlight() + end + end + end, +}) + +-- ide like highlight when stopping cursor +vim.api.nvim_create_autocmd('CursorMovedI', { + group = 'LspReferenceHighlight', + desc = 'Clear highlights when entering insert mode', + callback = function() + vim.lsp.buf.clear_references() + end, +}) + -- close some filetypes with vim.api.nvim_create_autocmd('FileType', { group = augroup('close_with_q'),