-- [[ 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("BufLeave", { group = autosave_group, pattern = "*", command = "silent! wa", -- Save all files when switching buffers 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, -- }) vim.api.nvim_create_autocmd({ "BufWritePre" }, { pattern = { "*.lua" }, callback = function(args) require("helpers").format_buffer("stylua", args.buf) 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, }) -- Run shortcuts script when saving shortcut files vim.api.nvim_create_autocmd("BufWritePost", { pattern = { os.getenv("XDG_CONFIG_HOME") .. "/shell/bm-files", os.getenv("XDG_CONFIG_HOME") .. "/shell/bm-dirs", }, desc = "Run shortcuts script", callback = function() os.execute("station-shortcuts") vim.notify("Shortcuts updated!", 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")