nvim_api/types/
mode.rs

1use nvim_types as nvim;
2use serde::Deserialize;
3
4#[non_exhaustive]
5#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Deserialize)]
6pub enum Mode {
7    #[serde(rename = "c")]
8    CmdLine,
9
10    #[serde(rename = "i")]
11    Insert,
12
13    #[serde(rename = "!")]
14    InsertCmdLine,
15
16    #[serde(rename = "l")]
17    Langmap,
18
19    #[serde(rename(deserialize = " "))]
20    NormalVisualOperator,
21
22    #[serde(rename = "n")]
23    Normal,
24
25    #[serde(rename = "o")]
26    OperatorPending,
27
28    #[serde(rename = "s")]
29    Select,
30
31    #[serde(rename = "t")]
32    Terminal,
33
34    #[serde(rename = "x")]
35    Visual,
36
37    #[serde(rename = "v")]
38    VisualSelect,
39}
40
41macro_rules! is_mode {
42    ($fn_name:ident, $variant:ident) => {
43        #[inline(always)]
44        pub const fn $fn_name(&self) -> bool {
45            matches!(self, Mode::$variant)
46        }
47    };
48}
49
50impl Mode {
51    is_mode!(is_cmd_line, CmdLine);
52    is_mode!(is_insert, Insert);
53    is_mode!(is_langmap, Langmap);
54    is_mode!(is_nvo, NormalVisualOperator);
55    is_mode!(is_normal, Normal);
56    is_mode!(is_op_pending, OperatorPending);
57    is_mode!(is_select, Select);
58    is_mode!(is_terminal, Terminal);
59    is_mode!(is_visual, Visual);
60    is_mode!(is_visual_select, VisualSelect);
61}
62
63impl From<Mode> for nvim::String {
64    fn from(mode: Mode) -> Self {
65        use Mode::*;
66        match mode {
67            CmdLine => "c",
68            Insert => "i",
69            InsertCmdLine => "!",
70            Langmap => "l",
71            NormalVisualOperator => "",
72            Normal => "n",
73            OperatorPending => "o",
74            Select => "s",
75            Terminal => "t",
76            Visual => "x",
77            VisualSelect => "v",
78        }
79        .into()
80    }
81}