blob: aa68b686b5bf99036595e49cac3b07c591287a94 [file] [log] [blame]
ichizok672776d2022-01-31 12:27:18 +00001/* vi:set ts=8 sts=4 sw=4 noet:
2 *
3 * VIM - Vi IMproved by Bram Moolenaar et al.
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
9/*
10 * This file defines the Normal mode commands.
11 */
12
13/*
14 * When adding a Normal/Visual mode command:
15 * 1. Add an entry in the table `nv_cmds[]` below.
16 * 2. Run "make nvcmdidxs" to re-generate nv_cmdidxs.h.
17 * 3. Add an entry in the index for Normal/Visual commands at
18 * ":help normal-index" and ":help visual-index" .
19 * 4. Add documentation in ../doc/xxx.txt. Add a tag for both the short and
20 * long name of the command.
21 */
22
23#ifdef DO_DECLARE_NVCMD
24
25/*
26 * Used when building Vim.
27 */
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000028# define NVCMD(a, b, c, d) \
29 {a, b, c, d}
ichizok672776d2022-01-31 12:27:18 +000030
31#ifdef FEAT_GUI
32#define NV_VER_SCROLLBAR nv_ver_scrollbar
33#define NV_HOR_SCROLLBAR nv_hor_scrollbar
34#else
35#define NV_VER_SCROLLBAR nv_error
36#define NV_HOR_SCROLLBAR nv_error
37#endif
38
39#ifdef FEAT_GUI_TABLINE
40#define NV_TABLINE nv_tabline
41#define NV_TABMENU nv_tabmenu
42#else
43#define NV_TABLINE nv_error
44#define NV_TABMENU nv_error
45#endif
46
47#ifdef FEAT_NETBEANS_INTG
48#define NV_NBCMD nv_nbcmd
49#else
50#define NV_NBCMD nv_error
51#endif
52
53#ifdef FEAT_DND
54#define NV_DROP nv_drop
55#else
56#define NV_DROP nv_error
57#endif
58
59/*
60 * Function to be called for a Normal or Visual mode command.
61 * The argument is a cmdarg_T.
62 */
63typedef void (*nv_func_T)(cmdarg_T *cap);
64
65// Values for cmd_flags.
66#define NV_NCH 0x01 // may need to get a second char
67#define NV_NCH_NOP (0x02|NV_NCH) // get second char when no operator pending
68#define NV_NCH_ALW (0x04|NV_NCH) // always get a second char
69#define NV_LANG 0x08 // second char needs language adjustment
70
71#define NV_SS 0x10 // may start selection
72#define NV_SSS 0x20 // may start selection with shift modifier
73#define NV_STS 0x40 // may stop selection without shift modif.
74#define NV_RL 0x80 // 'rightleft' modifies command
75#define NV_KEEPREG 0x100 // don't clear regname
76#define NV_NCW 0x200 // not allowed in command-line window
77
78/*
79 * Generally speaking, every Normal mode command should either clear any
80 * pending operator (with *clearop*()), or set the motion type variable
81 * oap->motion_type.
82 *
83 * When a cursor motion command is made, it is marked as being a character or
84 * line oriented motion. Then, if an operator is in effect, the operation
85 * becomes character or line oriented accordingly.
86 */
87
88/*
89 * This table contains one entry for every Normal or Visual mode command.
90 * The order doesn't matter, this will be sorted by the create_nvcmdidx.vim
91 * script to generate the nv_cmd_idx[] lookup table.
92 * It is faster when all keys from zero to '~' are present.
93 */
94static const struct nv_cmd
95{
96 int cmd_char; // (first) command character
97 nv_func_T cmd_func; // function for this command
98 short_u cmd_flags; // NV_ flags
99 short cmd_arg; // value for ca.arg
100} nv_cmds[] =
101
102#else // DO_DECLARE_NVCMD
103
104/*
105 * Used when creating nv_cmdidxs.h.
106 */
107# define NVCMD(a, b, c, d) a
108static const int nv_cmds[] =
109
110#endif // DO_DECLARE_NVCMD
111{
112 NVCMD(NUL, nv_error, 0, 0),
113 NVCMD(Ctrl_A, nv_addsub, 0, 0),
114 NVCMD(Ctrl_B, nv_page, NV_STS, BACKWARD),
115 NVCMD(Ctrl_C, nv_esc, 0, TRUE),
116 NVCMD(Ctrl_D, nv_halfpage, 0, 0),
117 NVCMD(Ctrl_E, nv_scroll_line, 0, TRUE),
118 NVCMD(Ctrl_F, nv_page, NV_STS, FORWARD),
119 NVCMD(Ctrl_G, nv_ctrlg, 0, 0),
120 NVCMD(Ctrl_H, nv_ctrlh, 0, 0),
121 NVCMD(Ctrl_I, nv_pcmark, 0, 0),
122 NVCMD(NL, nv_down, 0, FALSE),
123 NVCMD(Ctrl_K, nv_error, 0, 0),
124 NVCMD(Ctrl_L, nv_clear, 0, 0),
125 NVCMD(CAR, nv_down, 0, TRUE),
126 NVCMD(Ctrl_N, nv_down, NV_STS, FALSE),
127 NVCMD(Ctrl_O, nv_ctrlo, 0, 0),
128 NVCMD(Ctrl_P, nv_up, NV_STS, FALSE),
129 NVCMD(Ctrl_Q, nv_visual, 0, FALSE),
130 NVCMD(Ctrl_R, nv_redo_or_register, 0, 0),
131 NVCMD(Ctrl_S, nv_ignore, 0, 0),
132 NVCMD(Ctrl_T, nv_tagpop, NV_NCW, 0),
133 NVCMD(Ctrl_U, nv_halfpage, 0, 0),
134 NVCMD(Ctrl_V, nv_visual, 0, FALSE),
135 NVCMD(Ctrl_W, nv_window, 0, 0),
136 NVCMD(Ctrl_X, nv_addsub, 0, 0),
137 NVCMD(Ctrl_Y, nv_scroll_line, 0, FALSE),
138 NVCMD(Ctrl_Z, nv_suspend, 0, 0),
139 NVCMD(ESC, nv_esc, 0, FALSE),
140 NVCMD(Ctrl_BSL, nv_normal, NV_NCH_ALW, 0),
141 NVCMD(Ctrl_RSB, nv_ident, NV_NCW, 0),
142 NVCMD(Ctrl_HAT, nv_hat, NV_NCW, 0),
143 NVCMD(Ctrl__, nv_error, 0, 0),
144 NVCMD(' ', nv_right, 0, 0),
145 NVCMD('!', nv_operator, 0, 0),
146 NVCMD('"', nv_regname, NV_NCH_NOP|NV_KEEPREG, 0),
147 NVCMD('#', nv_ident, 0, 0),
148 NVCMD('$', nv_dollar, 0, 0),
149 NVCMD('%', nv_percent, 0, 0),
150 NVCMD('&', nv_optrans, 0, 0),
151 NVCMD('\'', nv_gomark, NV_NCH_ALW, TRUE),
152 NVCMD('(', nv_brace, 0, BACKWARD),
153 NVCMD(')', nv_brace, 0, FORWARD),
154 NVCMD('*', nv_ident, 0, 0),
155 NVCMD('+', nv_down, 0, TRUE),
156 NVCMD(',', nv_csearch, 0, TRUE),
157 NVCMD('-', nv_up, 0, TRUE),
158 NVCMD('.', nv_dot, NV_KEEPREG, 0),
159 NVCMD('/', nv_search, 0, FALSE),
160 NVCMD('0', nv_beginline, 0, 0),
161 NVCMD('1', nv_ignore, 0, 0),
162 NVCMD('2', nv_ignore, 0, 0),
163 NVCMD('3', nv_ignore, 0, 0),
164 NVCMD('4', nv_ignore, 0, 0),
165 NVCMD('5', nv_ignore, 0, 0),
166 NVCMD('6', nv_ignore, 0, 0),
167 NVCMD('7', nv_ignore, 0, 0),
168 NVCMD('8', nv_ignore, 0, 0),
169 NVCMD('9', nv_ignore, 0, 0),
170 NVCMD(':', nv_colon, 0, 0),
171 NVCMD(';', nv_csearch, 0, FALSE),
172 NVCMD('<', nv_operator, NV_RL, 0),
173 NVCMD('=', nv_operator, 0, 0),
174 NVCMD('>', nv_operator, NV_RL, 0),
175 NVCMD('?', nv_search, 0, FALSE),
176 NVCMD('@', nv_at, NV_NCH_NOP, FALSE),
177 NVCMD('A', nv_edit, 0, 0),
178 NVCMD('B', nv_bck_word, 0, 1),
179 NVCMD('C', nv_abbrev, NV_KEEPREG, 0),
180 NVCMD('D', nv_abbrev, NV_KEEPREG, 0),
181 NVCMD('E', nv_wordcmd, 0, TRUE),
182 NVCMD('F', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD),
183 NVCMD('G', nv_goto, 0, TRUE),
184 NVCMD('H', nv_scroll, 0, 0),
185 NVCMD('I', nv_edit, 0, 0),
186 NVCMD('J', nv_join, 0, 0),
187 NVCMD('K', nv_ident, 0, 0),
188 NVCMD('L', nv_scroll, 0, 0),
189 NVCMD('M', nv_scroll, 0, 0),
190 NVCMD('N', nv_next, 0, SEARCH_REV),
191 NVCMD('O', nv_open, 0, 0),
192 NVCMD('P', nv_put, 0, 0),
193 NVCMD('Q', nv_exmode, NV_NCW, 0),
194 NVCMD('R', nv_Replace, 0, FALSE),
195 NVCMD('S', nv_subst, NV_KEEPREG, 0),
196 NVCMD('T', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD),
197 NVCMD('U', nv_Undo, 0, 0),
198 NVCMD('V', nv_visual, 0, FALSE),
199 NVCMD('W', nv_wordcmd, 0, TRUE),
200 NVCMD('X', nv_abbrev, NV_KEEPREG, 0),
201 NVCMD('Y', nv_abbrev, NV_KEEPREG, 0),
202 NVCMD('Z', nv_Zet, NV_NCH_NOP|NV_NCW, 0),
203 NVCMD('[', nv_brackets, NV_NCH_ALW, BACKWARD),
204 NVCMD('\\', nv_error, 0, 0),
205 NVCMD(']', nv_brackets, NV_NCH_ALW, FORWARD),
206 NVCMD('^', nv_beginline, 0, BL_WHITE | BL_FIX),
207 NVCMD('_', nv_lineop, 0, 0),
208 NVCMD('`', nv_gomark, NV_NCH_ALW, FALSE),
209 NVCMD('a', nv_edit, NV_NCH, 0),
210 NVCMD('b', nv_bck_word, 0, 0),
211 NVCMD('c', nv_operator, 0, 0),
212 NVCMD('d', nv_operator, 0, 0),
213 NVCMD('e', nv_wordcmd, 0, FALSE),
214 NVCMD('f', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD),
215 NVCMD('g', nv_g_cmd, NV_NCH_ALW, FALSE),
216 NVCMD('h', nv_left, NV_RL, 0),
217 NVCMD('i', nv_edit, NV_NCH, 0),
218 NVCMD('j', nv_down, 0, FALSE),
219 NVCMD('k', nv_up, 0, FALSE),
220 NVCMD('l', nv_right, NV_RL, 0),
221 NVCMD('m', nv_mark, NV_NCH_NOP, 0),
222 NVCMD('n', nv_next, 0, 0),
223 NVCMD('o', nv_open, 0, 0),
224 NVCMD('p', nv_put, 0, 0),
225 NVCMD('q', nv_record, NV_NCH, 0),
226 NVCMD('r', nv_replace, NV_NCH_NOP|NV_LANG, 0),
227 NVCMD('s', nv_subst, NV_KEEPREG, 0),
228 NVCMD('t', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD),
229 NVCMD('u', nv_undo, 0, 0),
230 NVCMD('v', nv_visual, 0, FALSE),
231 NVCMD('w', nv_wordcmd, 0, FALSE),
232 NVCMD('x', nv_abbrev, NV_KEEPREG, 0),
233 NVCMD('y', nv_operator, 0, 0),
234 NVCMD('z', nv_zet, NV_NCH_ALW, 0),
235 NVCMD('{', nv_findpar, 0, BACKWARD),
236 NVCMD('|', nv_pipe, 0, 0),
237 NVCMD('}', nv_findpar, 0, FORWARD),
238 NVCMD('~', nv_tilde, 0, 0),
239
240 // pound sign
241 NVCMD(POUND, nv_ident, 0, 0),
242 NVCMD(K_MOUSEUP, nv_mousescroll, 0, MSCR_UP),
243 NVCMD(K_MOUSEDOWN, nv_mousescroll, 0, MSCR_DOWN),
244 NVCMD(K_MOUSELEFT, nv_mousescroll, 0, MSCR_LEFT),
245 NVCMD(K_MOUSERIGHT, nv_mousescroll, 0, MSCR_RIGHT),
246 NVCMD(K_LEFTMOUSE, nv_mouse, 0, 0),
247 NVCMD(K_LEFTMOUSE_NM, nv_mouse, 0, 0),
248 NVCMD(K_LEFTDRAG, nv_mouse, 0, 0),
249 NVCMD(K_LEFTRELEASE, nv_mouse, 0, 0),
250 NVCMD(K_LEFTRELEASE_NM, nv_mouse, 0, 0),
251 NVCMD(K_MOUSEMOVE, nv_mouse, 0, 0),
252 NVCMD(K_MIDDLEMOUSE, nv_mouse, 0, 0),
253 NVCMD(K_MIDDLEDRAG, nv_mouse, 0, 0),
254 NVCMD(K_MIDDLERELEASE, nv_mouse, 0, 0),
255 NVCMD(K_RIGHTMOUSE, nv_mouse, 0, 0),
256 NVCMD(K_RIGHTDRAG, nv_mouse, 0, 0),
257 NVCMD(K_RIGHTRELEASE, nv_mouse, 0, 0),
258 NVCMD(K_X1MOUSE, nv_mouse, 0, 0),
259 NVCMD(K_X1DRAG, nv_mouse, 0, 0),
260 NVCMD(K_X1RELEASE, nv_mouse, 0, 0),
261 NVCMD(K_X2MOUSE, nv_mouse, 0, 0),
262 NVCMD(K_X2DRAG, nv_mouse, 0, 0),
263 NVCMD(K_X2RELEASE, nv_mouse, 0, 0),
264 NVCMD(K_IGNORE, nv_ignore, NV_KEEPREG, 0),
265 NVCMD(K_NOP, nv_nop, 0, 0),
266 NVCMD(K_INS, nv_edit, 0, 0),
267 NVCMD(K_KINS, nv_edit, 0, 0),
268 NVCMD(K_BS, nv_ctrlh, 0, 0),
269 NVCMD(K_UP, nv_up, NV_SSS|NV_STS, FALSE),
270 NVCMD(K_S_UP, nv_page, NV_SS, BACKWARD),
271 NVCMD(K_DOWN, nv_down, NV_SSS|NV_STS, FALSE),
272 NVCMD(K_S_DOWN, nv_page, NV_SS, FORWARD),
273 NVCMD(K_LEFT, nv_left, NV_SSS|NV_STS|NV_RL, 0),
274 NVCMD(K_S_LEFT, nv_bck_word, NV_SS|NV_RL, 0),
275 NVCMD(K_C_LEFT, nv_bck_word, NV_SSS|NV_RL|NV_STS, 1),
276 NVCMD(K_RIGHT, nv_right, NV_SSS|NV_STS|NV_RL, 0),
277 NVCMD(K_S_RIGHT, nv_wordcmd, NV_SS|NV_RL, FALSE),
278 NVCMD(K_C_RIGHT, nv_wordcmd, NV_SSS|NV_RL|NV_STS, TRUE),
279 NVCMD(K_PAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD),
280 NVCMD(K_KPAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD),
281 NVCMD(K_PAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD),
282 NVCMD(K_KPAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD),
283 NVCMD(K_END, nv_end, NV_SSS|NV_STS, FALSE),
284 NVCMD(K_KEND, nv_end, NV_SSS|NV_STS, FALSE),
285 NVCMD(K_S_END, nv_end, NV_SS, FALSE),
286 NVCMD(K_C_END, nv_end, NV_SSS|NV_STS, TRUE),
287 NVCMD(K_HOME, nv_home, NV_SSS|NV_STS, 0),
288 NVCMD(K_KHOME, nv_home, NV_SSS|NV_STS, 0),
289 NVCMD(K_S_HOME, nv_home, NV_SS, 0),
290 NVCMD(K_C_HOME, nv_goto, NV_SSS|NV_STS, FALSE),
291 NVCMD(K_DEL, nv_abbrev, 0, 0),
292 NVCMD(K_KDEL, nv_abbrev, 0, 0),
293 NVCMD(K_UNDO, nv_kundo, 0, 0),
294 NVCMD(K_HELP, nv_help, NV_NCW, 0),
295 NVCMD(K_F1, nv_help, NV_NCW, 0),
296 NVCMD(K_XF1, nv_help, NV_NCW, 0),
297 NVCMD(K_SELECT, nv_select, 0, 0),
298 NVCMD(K_VER_SCROLLBAR, NV_VER_SCROLLBAR, 0, 0),
299 NVCMD(K_HOR_SCROLLBAR, NV_HOR_SCROLLBAR, 0, 0),
300 NVCMD(K_TABLINE, NV_TABLINE, 0, 0),
301 NVCMD(K_TABMENU, NV_TABMENU, 0, 0),
302 NVCMD(K_F21, NV_NBCMD, NV_NCH_ALW, 0),
303 NVCMD(K_DROP, NV_DROP, NV_STS, 0),
304 NVCMD(K_CURSORHOLD, nv_cursorhold, NV_KEEPREG, 0),
305 NVCMD(K_PS, nv_edit, 0, 0),
306 NVCMD(K_COMMAND, nv_colon, 0, 0),
307 NVCMD(K_SCRIPT_COMMAND, nv_colon, 0, 0),
308};
309
310// Number of commands in nv_cmds[].
311#define NV_CMDS_SIZE ARRAY_LENGTH(nv_cmds)