nvrim/cmds/
auto_cmds.rs

1//! Autocommand group and definition helpers.
2//!
3//! Creates yank highlight, autosave, and quickfix configuration autocmds with resilient error
4//! reporting (failures logged, rest continue). Provides granular `create_autocmd` utility.
5
6use core::fmt::Debug;
7use core::marker::Copy;
8
9use nvim_oxi::api::opts::CreateAugroupOptsBuilder;
10use nvim_oxi::api::opts::CreateAutocmdOptsBuilder;
11use nvim_oxi::api::opts::SetKeymapOptsBuilder;
12use nvim_oxi::api::types::Mode;
13
14/// Creates Nvim autocommands and their augroups.
15///
16/// Includes yank highlight, autosave on focus loss / buffer leave, and quickfix
17/// specific key mappings & configuration.
18pub fn create() {
19    create_autocmd(
20        ["TextYankPost"],
21        "YankHighlight",
22        CreateAutocmdOptsBuilder::default().command(":lua vim.highlight.on_yank()"),
23    );
24
25    create_autocmd(
26        ["BufLeave", "FocusLost"],
27        "AutosaveBuffers",
28        CreateAutocmdOptsBuilder::default().command(":silent! wa!"),
29    );
30
31    create_autocmd(
32        ["FileType"],
33        "QuickfixConfig",
34        CreateAutocmdOptsBuilder::default().patterns(["qf"]).callback(|_| {
35            let opts = SetKeymapOptsBuilder::default().noremap(true).build();
36
37            crate::keymaps::set(&[Mode::Normal], "<c-n>", ":cn<cr>", &opts);
38            crate::keymaps::set(&[Mode::Normal], "<c-p>", ":cp<cr>", &opts);
39            crate::keymaps::set(&[Mode::Normal], "<c-x>", ":ccl<cr>", &opts);
40            let _ = ytil_noxi::common::exec_vim_cmd("resize", Some(&["7"]));
41
42            true
43        }),
44    );
45
46    crate::plugins::scrolloff::create_autocmd();
47    crate::layout::create_autocmd();
48}
49
50/// Creates an autocommand group and associated autocommands for `events`.
51///
52/// Errors are reported to Nvim (and swallowed) so that one failing definition
53/// does not abort the rest of the setup.
54pub fn create_autocmd<'a, I>(events: I, augroup_name: &str, opts_builder: &mut CreateAutocmdOptsBuilder)
55where
56    I: IntoIterator<Item = &'a str> + Debug + Copy,
57{
58    if let Err(err) =
59        nvim_oxi::api::create_augroup(augroup_name, &CreateAugroupOptsBuilder::default().clear(true).build())
60            .inspect_err(|err| {
61                ytil_noxi::notify::error(format!("error creating augroup | name={augroup_name:?} error={err:#?}"));
62            })
63            .and_then(|group| nvim_oxi::api::create_autocmd(events, &opts_builder.group(group).build()))
64    {
65        ytil_noxi::notify::error(format!(
66            "error creating auto command | augroup={augroup_name:?} events={events:#?} error={err:#?}"
67        ));
68    }
69}