-- [[ 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 }) vim.api.nvim_create_autocmd('InsertLeave', { group = autosave_group, pattern = '*', command = 'silent! wa', -- Save all files when leaving insert mode }) 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')