Document the recently added WITHOUT_SRCS variable.
[dragonfly.git] / contrib / nvi / vi / v_cmd.c
1 /*-
2  * Copyright (c) 1992, 1993, 1994
3  *      The Regents of the University of California.  All rights reserved.
4  * Copyright (c) 1992, 1993, 1994, 1995, 1996
5  *      Keith Bostic.  All rights reserved.
6  *
7  * See the LICENSE file for redistribution information.
8  */
9
10 #include "config.h"
11
12 #ifndef lint
13 static const char sccsid[] = "@(#)v_cmd.c       10.9 (Berkeley) 3/28/96";
14 #endif /* not lint */
15
16 #include <sys/types.h>
17 #include <sys/queue.h>
18 #include <sys/time.h>
19
20 #include <bitstring.h>
21 #include <limits.h>
22 #include <stdio.h>
23
24 #include "../common/common.h"
25 #include "vi.h"
26
27 /*
28  * This array maps keystrokes to vi command functions.  It is known
29  * in ex/ex_usage.c that it takes four columns to name a vi character.
30  */
31 VIKEYS const vikeys [MAXVIKEY + 1] = {
32 /* 000 NUL -- The code in vi.c expects key 0 to be undefined. */
33         {NULL},
34 /* 001  ^A */
35         {v_searchw,     V_ABS|V_CNT|V_MOVE|V_KEYW|VM_CUTREQ|VM_RCM_SET,
36             "[count]^A",
37             "^A search forward for cursor word"},
38 /* 002  ^B */
39         {v_pageup,      V_CNT|VM_RCM_SET,
40             "[count]^B",
41             "^B scroll up by screens"},
42 /* 003  ^C */
43         {NULL,          0,
44             "^C",
45             "^C interrupt an operation (e.g. read, write, search)"},
46 /* 004  ^D */
47         {v_hpagedown,   V_CNT|VM_RCM_SET,
48             "[count]^D",
49             "^D scroll down by half screens (setting count)"},
50 /* 005  ^E */
51         {v_linedown,    V_CNT,
52             "[count]^E",
53             "^E scroll down by lines"},
54 /* 006  ^F */
55         {v_pagedown,    V_CNT|VM_RCM_SET,
56             "[count]^F",
57             "^F scroll down by screens"},
58 /* 007  ^G */
59         {v_status,      0,
60             "^G",
61             "^G file status"},
62 /* 010  ^H */
63         {v_left,        V_CNT|V_MOVE|VM_RCM_SET,
64             "[count]^H",
65             "^H move left by characters"},
66 /* 011  ^I */
67         {NULL},
68 /* 012  ^J */
69         {v_down,        V_CNT|V_MOVE|VM_LMODE|VM_RCM,
70             "[count]^J",
71             "^J move down by lines"},
72 /* 013  ^K */
73         {NULL},
74 /* 014  ^L */
75         {v_redraw,      0,
76             "^L",
77             "^L redraw screen"},
78 /* 015  ^M */
79         {v_cr,          V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
80             "[count]^M",
81             "^M move down by lines (to first non-blank)"},
82 /* 016  ^N */
83         {v_down,        V_CNT|V_MOVE|VM_LMODE|VM_RCM,
84             "[count]^N",
85             "^N move down by lines"},
86 /* 017  ^O */
87         {NULL},
88 /* 020  ^P */
89         {v_up,          V_CNT|V_MOVE|VM_LMODE|VM_RCM,
90             "[count]^P",
91             "^P move up by lines"},
92 /* 021  ^Q -- same as ^V if not used for hardware flow control. */
93         {NULL},
94 /* 022  ^R */
95         {v_redraw,      0,
96             "^R",
97             "^R redraw screen"},
98 /* 023  ^S -- not available, used for hardware flow control. */
99         {NULL},
100 /* 024  ^T */
101         {v_tagpop,      V_ABS|VM_RCM_SET,
102             "^T",
103             "^T tag pop"},
104 /* 025  ^U */
105         {v_hpageup,     V_CNT|VM_RCM_SET,
106             "[count]^U",
107             "^U half page up (set count)"},
108 /* 026  ^V */
109         {NULL,          0,
110             "^V",
111             "^V input a literal character"},
112 /* 027  ^W */
113         {v_screen,      0,
114             "^W",
115             "^W move to next screen"},
116 /* 030  ^X */
117         {NULL},
118 /* 031  ^Y */
119         {v_lineup,      V_CNT,
120             "[count]^Y",
121             "^Y page up by lines"},
122 /* 032  ^Z */
123         {v_suspend,     V_SECURE,
124             "^Z",
125             "^Z suspend editor"},
126 /* 033  ^[ */
127         {NULL,          0,
128             "^[ <escape>",
129             "^[ <escape> exit input mode, cancel partial commands"},
130 /* 034  ^\ */
131         {v_exmode,      0,
132             "^\\",
133             " ^\\ switch to ex mode"},
134 /* 035  ^] */
135         {v_tagpush,     V_ABS|V_KEYW|VM_RCM_SET,
136             "^]",
137             "^] tag push cursor word"},
138 /* 036  ^^ */
139         {v_switch,      0,
140             "^^",
141             "^^ switch to previous file"},
142 /* 037  ^_ */
143         {NULL},
144 /* 040 ' ' */
145         {v_right,       V_CNT|V_MOVE|VM_RCM_SET,
146             "[count]' '",
147             "   <space> move right by columns"},
148 /* 041   ! */
149         {v_filter,      V_CNT|V_DOT|V_MOTION|V_SECURE|VM_RCM_SET,
150             "[count]![count]motion command(s)",
151             " ! filter through command(s) to motion"},
152 /* 042   " */
153         {NULL},
154 /* 043   # */
155         {v_increment,   V_CHAR|V_CNT|V_DOT|VM_RCM_SET,
156             "[count]# +|-|#",
157             " # number increment/decrement"},
158 /* 044   $ */
159         {v_dollar,      V_CNT|V_MOVE|VM_RCM_SETLAST,
160             " [count]$",
161             " $ move to last column"},
162 /* 045   % */
163         {v_match,       V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
164             "%",
165             " % move to match"},
166 /* 046   & */
167         {v_again,       0,
168             "&",
169             " & repeat substitution"},
170 /* 047   ' */
171         {v_fmark,       V_ABS_L|V_CHAR|V_MOVE|VM_LMODE|VM_RCM_SET,
172             "'['a-z]",
173             " ' move to mark (to first non-blank)"},
174 /* 050   ( */
175         {v_sentenceb,   V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
176             "[count](",
177             " ( move back sentence"},
178 /* 051   ) */
179         {v_sentencef,   V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
180             "[count])",
181             " ) move forward sentence"},
182 /* 052   * */
183         {NULL},
184 /* 053   + */
185         {v_down,        V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
186             "[count]+",
187             " + move down by lines (to first non-blank)"},
188 /* 054   , */
189         {v_chrrepeat,   V_CNT|V_MOVE|VM_RCM_SET,
190             "[count],",
191             " , reverse last F, f, T or t search"},
192 /* 055   - */
193         {v_up,          V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
194             "[count]-",
195             " - move up by lines (to first non-blank)"},
196 /* 056   . */
197         {NULL,          0,
198             ".",
199             " . repeat the last command"},
200 /* 057   / */
201         {v_searchf,     V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
202             "/RE[/ offset]",
203             " / search forward"},
204 /* 060   0 */
205         {v_zero,        V_MOVE|VM_RCM_SET,
206             "0",
207             " 0 move to first character"},
208 /* 061   1 */
209         {NULL},
210 /* 062   2 */
211         {NULL},
212 /* 063   3 */
213         {NULL},
214 /* 064   4 */
215         {NULL},
216 /* 065   5 */
217         {NULL},
218 /* 066   6 */
219         {NULL},
220 /* 067   7 */
221         {NULL},
222 /* 070   8 */
223         {NULL},
224 /* 071   9 */
225         {NULL},
226 /* 072   : */
227         {v_ex,          0,
228             ":command [| command] ...",
229             " : ex command"},
230 /* 073   ; */
231         {v_chrepeat,    V_CNT|V_MOVE|VM_RCM_SET,
232             "[count];",
233             " ; repeat last F, f, T or t search"},
234 /* 074   < */
235         {v_shiftl,      V_CNT|V_DOT|V_MOTION|VM_RCM_SET,
236             "[count]<[count]motion",
237             " < shift lines left to motion"},
238 /* 075   = */
239         {NULL},
240 /* 076   > */
241         {v_shiftr,      V_CNT|V_DOT|V_MOTION|VM_RCM_SET,
242             "[count]>[count]motion",
243             " > shift lines right to motion"},
244 /* 077   ? */
245         {v_searchb,     V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
246             "?RE[? offset]",
247             " ? search backward"},
248 /* 100   @ */
249         {v_at,          V_CNT|V_RBUF|VM_RCM_SET,
250             "@buffer",
251             " @ execute buffer"},
252 /* 101   A */
253         {v_iA,          V_CNT|V_DOT|VM_RCM_SET,
254             "[count]A",
255             " A append to the line"},
256 /* 102   B */
257         {v_wordB,       V_CNT|V_MOVE|VM_RCM_SET,
258             "[count]B",
259             " B move back bigword"},
260 /* 103   C */
261         {NULL,          0,
262             "[buffer][count]C",
263             " C change to end-of-line"},
264 /* 104   D */
265         {NULL,          0,
266             "[buffer]D",
267             " D delete to end-of-line"},
268 /* 105   E */
269         {v_wordE,       V_CNT|V_MOVE|VM_RCM_SET,
270             "[count]E",
271             " E move to end of bigword"},
272 /* 106   F */
273         {v_chF,         V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
274             "[count]F character",
275             " F character in line backward search"},
276 /* 107   G */
277         {v_lgoto,       V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
278             "[count]G",
279             " G move to line"},
280 /* 110   H */
281         {v_home,        V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETNNB,
282             "[count]H",
283             " H move to count lines from screen top"},
284 /* 111   I */
285         {v_iI,          V_CNT|V_DOT|VM_RCM_SET,
286             "[count]I",
287             " I insert before first nonblank"},
288 /* 112   J */
289         {v_join,        V_CNT|V_DOT|VM_RCM_SET,
290             "[count]J",
291             " J join lines"},
292 /* 113   K */
293         {NULL},
294 /* 114   L */
295         {v_bottom,      V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETNNB,
296             "[count]L",
297             " L move to screen bottom"},
298 /* 115   M */
299         {v_middle,      V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETNNB,
300             "M",
301             " M move to screen middle"},
302 /* 116   N */
303         {v_searchN,     V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
304             "n",
305             " N reverse last search"},
306 /* 117   O */
307         {v_iO,          V_CNT|V_DOT|VM_RCM_SET,
308             "[count]O",
309             " O insert above line"},
310 /* 120   P */
311         {v_Put,         V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
312             "[buffer]P",
313             " P insert before cursor from buffer"},
314 /* 121   Q */
315         {v_exmode,      0,
316             "Q",
317             " Q switch to ex mode"},
318 /* 122   R */
319         {v_Replace,     V_CNT|V_DOT|VM_RCM_SET,
320             "[count]R",
321             " R replace characters"},
322 /* 123   S */
323         {NULL,          0,
324             "[buffer][count]S",
325             " S substitute for the line(s)"},
326 /* 124   T */
327         {v_chT,         V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
328             "[count]T character",
329             " T before character in line backward search"},
330 /* 125   U */
331         {v_Undo,        VM_RCM_SET,
332             "U",
333             " U Restore the current line"},
334 /* 126   V */
335         {NULL},
336 /* 127   W */
337         {v_wordW,       V_CNT|V_MOVE|VM_RCM_SET,
338             "[count]W",
339             " W move to next bigword"},
340 /* 130   X */
341         {v_Xchar,       V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
342             "[buffer][count]X",
343             " X delete character before cursor"},
344 /* 131   Y */
345         {NULL,          0,
346             "[buffer][count]Y",
347             " Y copy line"},
348 /* 132   Z */
349         {v_zexit,       0,
350             "ZZ",
351             "ZZ save file and exit"},
352 /* 133   [ */
353         {v_sectionb,    V_ABS|V_CNT|V_MOVE|VM_RCM_SET,
354             "[[",
355             "[[ move back section"},
356 /* 134   \ */
357         {NULL},
358 /* 135   ] */
359         {v_sectionf,    V_ABS|V_CNT|V_MOVE|VM_RCM_SET,
360             "]]",
361             "]] move forward section"},
362 /* 136   ^ */
363         /*
364          * DON'T set the VM_RCM_SETFNB flag, the function has to do the work
365          * anyway, in case it's a motion component.  DO set VM_RCM_SET, so
366          * that any motion that's part of a command is preserved.
367          */
368         {v_first,       V_CNT|V_MOVE|VM_RCM_SET,
369             "^",
370             " ^ move to first non-blank"},
371 /* 137   _ */
372         /*
373          * Needs both to set the VM_RCM_SETFNB flag, and to do the work
374          * in the function, in case it's a delete.
375          */
376         {v_cfirst,      V_CNT|V_MOVE|VM_RCM_SETFNB,
377             "_",
378             " _ move to first non-blank"},
379 /* 140   ` */
380         {v_bmark,       V_ABS_C|V_CHAR|V_MOVE|VM_CUTREQ|VM_RCM_SET,
381             "`[`a-z]",
382             " ` move to mark"},
383 /* 141   a */
384         {v_ia,          V_CNT|V_DOT|VM_RCM_SET,
385             "[count]a",
386             " a append after cursor"},
387 /* 142   b */
388         {v_wordb,       V_CNT|V_MOVE|VM_RCM_SET,
389             "[count]b",
390             " b move back word"},
391 /* 143   c */
392         {v_change,      V_CNT|V_DOT|V_MOTION|V_OBUF|VM_RCM_SET,
393             "[buffer][count]c[count]motion",
394             " c change to motion"},
395 /* 144   d */
396         {v_delete,      V_CNT|V_DOT|V_MOTION|V_OBUF|VM_RCM_SET,
397             "[buffer][count]d[count]motion",
398             " d delete to motion"},
399 /* 145   e */
400         {v_worde,       V_CNT|V_MOVE|VM_RCM_SET,
401             "[count]e",
402             " e move to end of word"},
403 /* 146   f */
404         {v_chf,         V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
405             "[count]f character",
406             " f character in line forward search"},
407 /* 147   g */
408         {NULL},
409 /* 150   h */
410         {v_left,        V_CNT|V_MOVE|VM_RCM_SET,
411             "[count]h",
412             " h move left by columns"},
413 /* 151   i */
414         {v_ii,          V_CNT|V_DOT|VM_RCM_SET,
415             "[count]i",
416             " i insert before cursor"},
417 /* 152   j */
418         {v_down,        V_CNT|V_MOVE|VM_LMODE|VM_RCM,
419             "[count]j",
420             " j move down by lines"},
421 /* 153   k */
422         {v_up,          V_CNT|V_MOVE|VM_LMODE|VM_RCM,
423             "[count]k",
424             " k move up by lines"},
425 /* 154   l */
426         {v_right,       V_CNT|V_MOVE|VM_RCM_SET,
427             "[count]l",
428             " l move right by columns"},
429 /* 155   m */
430         {v_mark,        V_CHAR,
431             "m[a-z]",
432             " m set mark"},
433 /* 156   n */
434         {v_searchn,     V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
435             "n",
436             " n repeat last search"},
437 /* 157   o */
438         {v_io,          V_CNT|V_DOT|VM_RCM_SET,
439             "[count]o",
440             " o append after line"},
441 /* 160   p */
442         {v_put,         V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
443             "[buffer]p",
444             " p insert after cursor from buffer"},
445 /* 161   q */
446         {NULL},
447 /* 162   r */
448         {v_replace,     V_CNT|V_DOT|VM_RCM_SET,
449             "[count]r character",
450             " r replace character"},
451 /* 163   s */
452         {v_subst,       V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
453             "[buffer][count]s",
454             " s substitute character"},
455 /* 164   t */
456         {v_cht,         V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
457             "[count]t character",
458             " t before character in line forward search"},
459 /* 165   u */
460         /*
461          * DON'T set the V_DOT flag, it' more complicated than that.
462          * See vi/vi.c for details.
463          */
464         {v_undo,        VM_RCM_SET,
465             "u",
466             " u undo last change"},
467 /* 166   v */
468         {NULL},
469 /* 167   w */
470         {v_wordw,       V_CNT|V_MOVE|VM_RCM_SET,
471             "[count]w",
472             " w move to next word"},
473 /* 170   x */
474         {v_xchar,       V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
475             "[buffer][count]x",
476             " x delete character"},
477 /* 171   y */
478         {v_yank,        V_CNT|V_DOT|V_MOTION|V_OBUF|VM_RCM_SET,
479             "[buffer][count]y[count]motion",
480             " y copy text to motion into a cut buffer"},
481 /* 172   z */
482         /*
483          * DON'T set the V_CHAR flag, the char isn't required,
484          * so it's handled specially in getcmd().
485          */
486         {v_z,           V_ABS_L|V_CNT|VM_RCM_SETFNB,
487             "[line]z[window_size][-|.|+|^|<CR>]",
488             " z reposition the screen"},
489 /* 173   { */
490         {v_paragraphb,  V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
491             "[count]{",
492             " { move back paragraph"},
493 /* 174   | */
494         {v_ncol,        V_CNT|V_MOVE|VM_RCM_SET,
495             "[count]|",
496             " | move to column"},
497 /* 175   } */
498         {v_paragraphf,  V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
499             "[count]}",
500             " } move forward paragraph"},
501 /* 176   ~ */
502         {v_ulcase,      V_CNT|V_DOT|VM_RCM_SET,
503             "[count]~",
504             " ~ reverse case"},
505 };