Files
rootiest 4545e18a68 feat(config): various config updates
Packaged updates to configuration.
2025-08-23 11:52:26 -04:00

172 lines
5.6 KiB
Lua

--- @module "config.autocmds"
--- This module defines the autocommands for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Autocommands │
-- ╰─────────────────────────────────────────────────────────╯
local autogrp = vim.api.nvim_create_augroup
local autocmd = vim.api.nvim_create_autocmd
-- LazyGit root detection
-- if pcall(require, 'lazygit.utils') then
-- autocmd('BufEnter', {
-- pattern = '*',
-- callback = function()
-- require('lazygit.utils').project_root_dir()
-- end,
-- })
-- end
-- ━━━━━━━━━━━━━━━━━━━━━━━ Set up Qalc keymappings ━━━━━━━━━━━━━━━━━━━━━━━
-- Create a group for filetype-specific mappings
autogrp('QalcFileTypeMappings', { clear = true })
-- Create an autocommand for the qalc filetype
autocmd('FileType', {
pattern = 'qalc',
group = 'QalcFileTypeMappings',
callback = function()
-- Set the key mapping: 'y' to run the :QalcYank command in normal mode
vim.keymap.set( -- Yank Result
'n',
'y',
':QalcYank +<CR>',
{ noremap = true, silent = true }
)
-- Set the key mapping: 'q' to run the :QalcClose command in normal mode
vim.keymap.set( -- Close Qalc
'n',
'q',
':QalcClose<CR>',
{ noremap = true, silent = true }
)
end,
})
-- Define a custom command to close the Qalc buffer
vim.api.nvim_create_user_command('QalcClose', function()
local buf_name = vim.api.nvim_buf_get_name(0)
if buf_name ~= '' then
vim.cmd('bd!')
else
-- If the buffer has no name, just remove it without invoking :bd!
vim.api.nvim_buf_delete(0, { force = true })
end
end, { bang = true })
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Set up highlights ━━━━━━━━━━━━━━━━━━━━━━━━━━
local load_highlight = require('utils.highlight')
load_highlight.setup_autocommands()
load_highlight.setup_dashboard_highlight()
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Set up cpp picker ━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Adds a keymap for quicker picking when in cpp files
require('data.autocmd').cpp_picker()
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Set up nvim_exec ━━━━━━━━━━━━━━━━━━━━━━━
-- Function to check and execute the NVIM_EXEC environment variable
local function execute_nvim_exec()
local exec_command = os.getenv('NVIM_EXEC')
-- If NVIM_EXEC is set, execute the command
if exec_command then
vim.cmd(exec_command)
end
end
-- Define an autogroup for the NvimExec autocmd
autogrp('NvimExec', { clear = true })
-- Define an autocmd to run the function at startup
autocmd('VimEnter', {
group = 'NvimExec',
callback = execute_nvim_exec,
})
-- Create an autogroup for managing command-line abbreviations
local abbrev_group = autogrp('LazyAbbreviationGroup', { clear = true })
-- Create an autocmd for unwrapping the 'lazy' abbreviation
autocmd('CmdlineEnter', {
group = abbrev_group,
callback = function()
vim.cmd([[
cnoreabbrev <expr> lazy ((getcmdtype() == ':' && getcmdline() == 'lazy') ? 'Lazy' : 'lazy')
]])
end,
})
-- change line number based on mode:
-- for command mode: make it absolute for ranges etc
-- for normal mode: relative movements <3
local cmdline_group = vim.api.nvim_create_augroup('CmdlineLinenr', {})
-- debounce cmdline enter events to make sure we dont have flickering for non user cmdline use
-- e.g. mappings using : instead of <cmd>
local cmdline_debounce_timer
autocmd('CmdlineEnter', {
group = cmdline_group,
callback = function()
cmdline_debounce_timer = vim.uv.new_timer()
cmdline_debounce_timer:start(
100,
0,
vim.schedule_wrap(function()
if vim.o.number then
vim.o.relativenumber = false
vim.api.nvim__redraw({ statuscolumn = true })
end
end)
)
end,
})
autocmd('CmdlineLeave', {
group = cmdline_group,
callback = function()
if cmdline_debounce_timer then
cmdline_debounce_timer:stop()
cmdline_debounce_timer = nil
end
if vim.o.number then
vim.o.relativenumber = true
end
end,
})
autogrp('RootyCustomEvent', { clear = true })
autocmd({ 'BufReadPost', 'BufNewFile' }, {
group = 'RootyCustomEvent',
callback = function(args)
local ignored_filetypes = require('data.types').general.ft
local ft = vim.bo[args.buf].filetype
if not vim.tbl_contains(ignored_filetypes, ft) then
vim.api.nvim_exec_autocmds('User', { pattern = 'LazyFileOpen' })
end
end,
})
-- Don't comment next line when using `o`
vim.api.nvim_create_autocmd('FileType', {
pattern = '*',
callback = function()
vim.opt_local.formatoptions:remove({ 'o' })
end,
})
-- Run async commands with output to split
vim.api.nvim_create_user_command('RunAsync', function(async_opts)
-- Save current buffer first
vim.cmd('w')
-- Construct the full command
local cmd = table.concat(async_opts.fargs, ' ')
-- Open a horizontal split with the terminal running the command
vim.cmd('belowright split | terminal ' .. cmd)
-- Optional: return focus to original window
vim.cmd('wincmd p')
end, {
nargs = '+', -- Require at least one argument
})