Skip to main content

nvrim/cmds/
auto_cmds.rs

1use nvim_oxi::api;
2use nvim_oxi::api::opts::CreateAugroupOpts;
3use nvim_oxi::api::opts::CreateAutocmdOpts;
4
5/// Creates Nvim autocommands and their augroups.
6///
7/// Includes yank highlight, autosave on focus loss / buffer leave, and quickfix
8/// specific key mappings & configuration.
9pub fn create() {
10    // `hl_op` is the supported replacement for the deprecated yank helper.
11    create_lua_autocmd(&["TextYankPost"], "YankHighlight", None, "vim.hl.hl_op()");
12
13    create_lua_autocmd(
14        &["BufLeave", "FocusLost"],
15        "AutosaveBuffers",
16        None,
17        "pcall(vim.cmd, 'silent! wa!')",
18    );
19
20    create_lua_autocmd(
21        &["FocusGained", "BufEnter", "CursorHold"],
22        "AutoreadBuffers",
23        None,
24        "pcall(vim.cmd, 'silent! checktime')",
25    );
26
27    create_lua_autocmd(
28        &["FileType"],
29        "QuickfixConfig",
30        Some(&["qf"]),
31        r"
32local opts = { buffer = true, noremap = true }
33vim.keymap.set('n', '<C-n>', '<cmd>cn<cr>', opts)
34vim.keymap.set('n', '<C-p>', '<cmd>cp<cr>', opts)
35vim.keymap.set('n', '<C-x>', '<cmd>ccl<cr>', opts)
36vim.cmd('resize 7')
37",
38    );
39
40    // To avoid the ugly full gray and underlined code for things like cfg(test).
41    create_lua_autocmd(
42        &["LspAttach"],
43        "LspInactiveCodeHighlight",
44        None,
45        "vim.api.nvim_set_hl(0, '@lsp.mod.inactive', { underline = false, undercurl = false, sp = 'none' })",
46    );
47
48    crate::plugins::scrolloff::create_autocmd();
49    crate::layout::create_autocmd();
50}
51
52/// Creates an autocommand whose command executes the provided Lua snippet.
53pub fn create_lua_autocmd(events: &[&str], augroup_name: &str, patterns: Option<&[&str]>, callback_body: &str) {
54    let augroup_opts = CreateAugroupOpts::builder().clear(true).build();
55    let group = match api::create_augroup(augroup_name, &augroup_opts) {
56        Ok(group) => group,
57        Err(err) => {
58            ytil_noxi::notify::error(format!(
59                "error creating augroup | augroup={augroup_name:?} error={err:#?}"
60            ));
61            return;
62        }
63    };
64
65    let mut autocmd_opts = CreateAutocmdOpts::builder();
66    let _ = autocmd_opts
67        .group(group)
68        .command(format!("lua << EOF\n{callback_body}\nEOF"));
69
70    if let Some(patterns) = patterns {
71        let _ = autocmd_opts.patterns(patterns.iter().copied());
72    }
73
74    let autocmd_opts = autocmd_opts.build();
75    if let Err(err) = api::create_autocmd(events.iter().copied(), &autocmd_opts) {
76        ytil_noxi::notify::error(format!(
77            "error creating auto command | augroup={augroup_name:?} events={events:#?} error={err:#?}"
78        ));
79    }
80}