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