{ lib, helpers, ... }: let inherit (lib.marleyvim) mapListToAttrs autocmds; inherit (helpers) mkRaw; in { autoGroups = mapListToAttrs (i: { name = "marleyos_${i}"; value = {clear = true;}; }) [ "checktime" "highlight_yank" "resize_splits" "last_loc" "close_with_q" "man_unlisted" "wrap_spell" "json_conceal" "auto_create_dir" ]; autoCmd = [ (autocmds.mk' ["FocusGained" "TermClose" "TermLeave"] "checktime" (mkRaw # lua '' function() if vim.o.buftype ~= "nofile" then vim.cmd("checktime") end end '') "Check if file needs to be reloaded when changed") (autocmds.mk' ["TextYankPost"] "highlight_yank" (mkRaw # lua '' function() (vim.hl or vim.highlight).on_yank() end '') "Highlight on yank") (autocmds.mk' ["VimResized"] "resize_splits" (mkRaw # lua '' function() local current_tab = vim.fn.tabpagenr() vim.cmd("tabdo wincmd =") vim.cmd("tabnext " .. current_tab) end '') "Resize splits on window resize") (autocmds.mk' ["BufReadPost"] "last_loc" (mkRaw # lua '' function(event) local exclude = { "gitcommit" } local buf = event.buf if vim.tbl_contains(exclude, vim.bo[buf].filetype) or vim.b[buf].marleyvim_last_loc then return end vim.b[buf].marleyvim_last_loc = true local mark = vim.api.nvim_buf_get_mark(buf, '"') local lcount = vim.api.nvim_buf_line_count(buf) if mark[1] > 0 and mark[1] <= lcount then pcall(vim.api.nvim_win_set_cursor, 0, mark) end end '') "Go to last location when opening a buffer") (autocmds.mk ["FileType"] "close_with_q" [ "PlenaryTestPopup" "checkhealth" "dbout" "gitsigns-blame" "grug-far" "help" "lspinfo" "neotest-output" "neotest-output-panel" "neotest-summary" "notify" "qf" "snacks_win" "spectre_panel" "startuptime" "tsplayground" ] (mkRaw # lua '' function(event) vim.bo[event.buf].buflisted = false vim.schedule(function() vim.keymap.set("n", "q", function() vim.cmd("close") pcall(vim.api.nvim_buf_delete, event.buf, { force = true }) end, { buffer = event.buf, silent = true, desc = "Quit buffer", }) end) end '') "Close some filetypes with ") (autocmds.mk ["FileType"] "man_unlisted" ["man"] (mkRaw # lua '' function(event) vim.bo[event.buf].buflisted = false end '') "Easy-close man files") (autocmds.mk ["FileType"] "wrap_spell" [ "text" "plaintex" "typst" "gitcommit" "markdown" ] (mkRaw # lua '' function() vim.opt_local.wrap = true vim.opt_local.spell = true end '') "Wrap & check spelling in text files") (autocmds.mk ["FileType"] "json_conceal" ["json" "jsonc" "json5"] (mkRaw # lua '' function() vim.opt_local.conceallevel = 0 end '') "Fix conceallevel for json files") (autocmds.mk' ["BufWritePre"] "auto_create_dir" (mkRaw # lua '' function(event) if event.match:match("^%w%w+:[\\/][\\/]") then return end local file = vim.uv.fs_realpath(event.match) or event.match vim.fn.mkdir(vim.fn.fnamemodify(file, ":p:h"), "p") end '') "Auto create missing parent dirs when saving") ]; }