-- [[ Basic Autocommands ]] -- See `:help lua-guide-autocommands` -- Highlight when yanking (copying) text -- Try it with `yap` in normal mode -- See `:help vim.highlight.on_yank()` 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, }) local autosave_group = vim.api.nvim_create_augroup('autosaving', { clear = true }) vim.api.nvim_create_autocmd('FocusLost', { group = autosave_group, pattern = '*', command = 'silent! wa', -- Save all files when moving away from the window nested = true, -- Allow other autocommands to run after this one }) vim.api.nvim_create_autocmd('InsertLeave', { group = autosave_group, pattern = '*', command = 'silent! wa', -- Save all files when leaving insert mode nested = true, -- Allow other autocommands to run after this one }) vim.api.nvim_create_autocmd('SwapExists', { desc = 'Always choose to delete the swap file, files are saved automatically', group = vim.api.nvim_create_augroup('NoSwaps', { clear = true }), callback = function(args) vim.cmd "let v:swapchoice = 'd'" end, }) -- vim.api.nvim_create_autocmd('TextChanged', { -- group = autosave_group, -- pattern = '*', -- command = 'silent! wa', -- Save all files when text is changed -- }) vim.api.nvim_create_autocmd('User', { pattern = 'OilActionsPost', callback = function(event) if event.data.actions.type == 'move' then Snacks.rename.on_rename_file(event.data.actions.src_url, event.data.actions.dest_url) end end, }) local fidget_group = vim.api.nvim_create_augroup('CodeCompanionFidgetHooks', { clear = true }) vim.api.nvim_create_autocmd({ 'User' }, { pattern = 'CodeCompanionRequestStarted', group = fidget_group, callback = function(event) local FidgetHelper = require 'utils.fidget_helper' -- Pass event instead of request if the callback receives the full event object local handle = FidgetHelper:create_progress_handle(event) FidgetHelper:store_progress_handle(event.data.id, handle) end, }) vim.api.nvim_create_autocmd({ 'User' }, { pattern = 'CodeCompanionRequestFinished', group = fidget_group, callback = function(event) local FidgetHelper = require 'utils.fidget_helper' local handle = FidgetHelper:pop_progress_handle(event.data.id) if handle then FidgetHelper:report_exit_status(handle, event) handle:finish() end end, }) -- vim.api.nvim_create_autocmd('BufEnter', { -- callback = function(event) -- local windows = vim.api.nvim_list_wins() -- -- for _, window in ipairs(windows) do -- local bufnr = vim.api.nvim_win_get_buf(window) -- local ft = vim.api.nvim_get_option_value('filetype', { buf = bufnr }) -- if vim.api.nvim_get_option_value('buflisted', { buf = bufnr }) -- or ft == 'oil' -- or ft == 'snacks_dashboard' then -- return -- end -- end -- vim.cmd 'qa' -- end, -- }) local modes_group = vim.api.nvim_create_augroup('modes', { clear = true }) vim.api.nvim_create_autocmd('FocusLost', { group = modes_group, pattern = '*', command = 'call feedkeys("\\")', }) vim.api.nvim_create_autocmd('BufNewFile', { group = modes_group, pattern = '*', command = 'call feedkeys("i")', }) -- Reload LuaSnip snippets when saving files in the snippets directory local snippets_dir = vim.fn.stdpath 'config' .. '/lua/snippets' vim.api.nvim_create_autocmd('BufWritePost', { pattern = snippets_dir .. '/*.json', -- Adjust the path to match your snippets directory desc = 'Reload LuaSnip snippets on save', callback = function() require('luasnip.loaders.from_vscode').lazy_load { paths = { snippets_dir } } vim.notify('Snippets reloaded!', vim.log.levels.INFO) end, }) local configs = { { path = os.getenv 'HOME' .. '/.config/nixos', worktree = nil, git_dir = nil, track_untracked = false, force_add = false, }, { path = os.getenv 'HOME' .. '/.config/nvim', worktree = nil, git_dir = nil, track_untracked = false, force_add = false, }, { path = os.getenv 'HOME', worktree = os.getenv 'HOME', git_dir = os.getenv 'HOME' .. '/.config/dotfiles/.git', track_untracked = true, force_add = true, -- Handles ignored files in dotfiles include_dirs = { '.config', '.local/bin', '.local/share' }, }, } local function get_git_status(config) local base = 'git' if config.git_dir and config.worktree then base = string.format('git --git-dir=%s --worktree=%s', config.git_dir, config.worktree) end -- Check modified and untracked (including ignored if force_add is true) local cmd = base .. ' status --porcelain' if config.force_add then cmd = cmd .. ' --ignored' end local handle = io.popen(cmd) local result = handle:read '*a' handle:close() local has_changes = false for line in result:gmatch '[^\r\n]+' do local status = line:sub(1, 2) local file = line:sub(4) if status:match '[MAR]' then has_changes = true elseif (status == '??' or status == '!!') and config.track_untracked then if config.include_dirs then for _, dir in ipairs(config.include_dirs) do if file:sub(1, #dir) == dir then has_changes = true break end end else has_changes = true end end end return has_changes, base end vim.api.nvim_create_autocmd('VimLeavePre', { callback = function() local cwd = vim.fn.getcwd() for _, config in ipairs(configs) do if cwd:sub(1, #config.path) == config.path then local has_changes, git_base = get_git_status(config) if has_changes then local confirm = vim.fn.confirm('Uncommitted changes in managed path. Commit?', '&Yes\n&No', 2) if confirm == 1 then local msg = vim.fn.input('Commit message: ', 'chore: update files') if msg ~= '' then msg = 'Update files' end local add_cmd = ' add -A' os.execute(git_base .. add_cmd) os.execute(git_base .. ' commit -m ' .. vim.fn.shellescape(msg)) os.execute(git_base .. ' push') print '\nChanges committed.' end end break end end end, }) require('helpers').edit_cf('a', '/lua/autocmd.lua')