Commit | Line | Data |
---|---|---|
f5bcab4b WJ |
1 | /* vi.h */ |
2 | ||
3 | /* Author: | |
4 | * Steve Kirkendall | |
5 | * 14407 SW Teal Blvd. #C | |
6 | * Beaverton, OR 97005 | |
7 | * kirkenda@cs.pdx.edu | |
8 | */ | |
9 | ||
10 | #define VERSION "ELVIS 1.5, by Steve Kirkendall (23 March 1992)" | |
11 | #define COPYING "This version of ELVIS is freely redistributable." | |
12 | ||
13 | #include <errno.h> | |
14 | extern int errno; | |
15 | #if TOS && !defined(__GNUC__) | |
16 | #define ENOENT (-AEFILNF) | |
17 | #endif | |
18 | ||
19 | #if TOS || VMS | |
20 | # include <types.h> | |
21 | # define O_RDONLY 0 | |
22 | # define O_WRONLY 1 | |
23 | # define O_RDWR 2 | |
24 | # ifdef __GNUC__ | |
25 | # define S_IJDIR S_IFDIR | |
26 | # endif | |
27 | #else | |
28 | # if OSK | |
29 | # include <modes.h> | |
30 | # define O_RDONLY S_IREAD | |
31 | # define O_WRONLY S_IWRITE | |
32 | # define O_RDWR (S_IREAD | S_IWRITE) | |
33 | # define ENOENT E_PNNF | |
34 | # define sprintf Sprintf | |
35 | # else | |
36 | # include <sys/types.h> | |
37 | # if COHERENT | |
38 | # include <sys/fcntl.h> | |
39 | # else | |
40 | # include <fcntl.h> | |
41 | # endif | |
42 | # endif | |
43 | #endif | |
44 | ||
45 | #ifndef O_BINARY | |
46 | # define O_BINARY 0 | |
47 | #endif | |
48 | ||
49 | #include "curses.h" | |
50 | ||
51 | #include <signal.h> | |
52 | ||
53 | /*------------------------------------------------------------------------*/ | |
54 | /* Miscellaneous constants. */ | |
55 | ||
56 | #define INFINITY 2000000001L /* a very large integer */ | |
57 | #define LONGKEY 10 /* longest possible raw :map key */ | |
58 | #ifndef MAXRCLEN | |
59 | # define MAXRCLEN 1000 /* longest possible :@ command */ | |
60 | #endif | |
61 | ||
62 | /*------------------------------------------------------------------------*/ | |
63 | /* These describe how temporary files are divided into blocks */ | |
64 | ||
65 | #define MAXBLKS (BLKSIZE / sizeof(unsigned short)) | |
66 | typedef union | |
67 | { | |
68 | char c[BLKSIZE]; /* for text blocks */ | |
69 | unsigned short n[MAXBLKS]; /* for the header block */ | |
70 | } | |
71 | BLK; | |
72 | ||
73 | /*------------------------------------------------------------------------*/ | |
74 | /* These are used manipulate BLK buffers. */ | |
75 | ||
76 | extern BLK hdr; /* buffer for the header block */ | |
77 | extern BLK *blkget(); /* given index into hdr.c[], reads block */ | |
78 | extern BLK *blkadd(); /* inserts a new block into hdr.c[] */ | |
79 | ||
80 | /*------------------------------------------------------------------------*/ | |
81 | /* These are used to keep track of various flags */ | |
82 | extern struct _viflags | |
83 | { | |
84 | short file; /* file flags */ | |
85 | } | |
86 | viflags; | |
87 | ||
88 | /* file flags */ | |
89 | #define NEWFILE 0x0001 /* the file was just created */ | |
90 | #define READONLY 0x0002 /* the file is read-only */ | |
91 | #define HADNUL 0x0004 /* the file contained NUL characters */ | |
92 | #define MODIFIED 0x0008 /* the file has been modified, but not saved */ | |
93 | #define NOFILE 0x0010 /* no name is known for the current text */ | |
94 | #define ADDEDNL 0x0020 /* newlines were added to the file */ | |
95 | #define HADBS 0x0040 /* backspace chars were lost from the file */ | |
96 | #define UNDOABLE 0x0080 /* file has been modified */ | |
97 | #define NOTEDITED 0x0100 /* the :file command has been used */ | |
98 | ||
99 | /* macros used to set/clear/test flags */ | |
100 | #define setflag(x,y) viflags.x |= y | |
101 | #define clrflag(x,y) viflags.x &= ~y | |
102 | #define tstflag(x,y) (viflags.x & y) | |
103 | #define initflags() viflags.file = 0; | |
104 | ||
105 | /* The options */ | |
106 | extern char o_autoindent[1]; | |
107 | extern char o_autoprint[1]; | |
108 | extern char o_autotab[1]; | |
109 | extern char o_autowrite[1]; | |
110 | extern char o_columns[3]; | |
111 | extern char o_directory[30]; | |
112 | extern char o_edcompatible[1]; | |
113 | extern char o_equalprg[80]; | |
114 | extern char o_errorbells[1]; | |
115 | extern char o_exrefresh[1]; | |
116 | extern char o_ignorecase[1]; | |
117 | extern char o_keytime[3]; | |
118 | extern char o_keywordprg[80]; | |
119 | extern char o_lines[3]; | |
120 | extern char o_list[1]; | |
121 | extern char o_number[1]; | |
122 | extern char o_readonly[1]; | |
123 | extern char o_remap[1]; | |
124 | extern char o_report[3]; | |
125 | extern char o_scroll[3]; | |
126 | extern char o_shell[60]; | |
127 | extern char o_shiftwidth[3]; | |
128 | extern char o_sidescroll[3]; | |
129 | extern char o_sync[1]; | |
130 | extern char o_tabstop[3]; | |
131 | extern char o_term[30]; | |
132 | extern char o_flash[1]; | |
133 | extern char o_warn[1]; | |
134 | extern char o_wrapscan[1]; | |
135 | ||
136 | #ifndef CRUNCH | |
137 | extern char o_beautify[1]; | |
138 | extern char o_exrc[1]; | |
139 | extern char o_mesg[1]; | |
140 | extern char o_more[1]; | |
141 | extern char o_novice[1]; | |
142 | extern char o_prompt[1]; | |
143 | extern char o_taglength[3]; | |
144 | extern char o_terse[1]; | |
145 | extern char o_window[3]; | |
146 | extern char o_wrapmargin[3]; | |
147 | extern char o_writeany[1]; | |
148 | #endif | |
149 | ||
150 | #ifndef NO_ERRLIST | |
151 | extern char o_cc[30]; | |
152 | extern char o_make[30]; | |
153 | #endif | |
154 | ||
155 | #ifndef NO_CHARATTR | |
156 | extern char o_charattr[1]; | |
157 | #endif | |
158 | ||
159 | #ifndef NO_DIGRAPH | |
160 | extern char o_digraph[1]; | |
161 | extern char o_flipcase[80]; | |
162 | #endif | |
163 | ||
164 | #ifndef NO_SENTENCE | |
165 | extern char o_hideformat[1]; | |
166 | #endif | |
167 | ||
168 | #ifndef NO_EXTENSIONS | |
169 | extern char o_inputmode[1]; | |
170 | extern char o_ruler[1]; | |
171 | #endif | |
172 | ||
173 | #ifndef NO_MAGIC | |
174 | extern char o_magic[1]; | |
175 | #endif | |
176 | ||
177 | #ifndef NO_MODELINES | |
178 | extern char o_modelines[1]; | |
179 | #endif | |
180 | ||
181 | #ifndef NO_SENTENCE | |
182 | extern char o_paragraphs[30]; | |
183 | extern char o_sections[30]; | |
184 | #endif | |
185 | ||
186 | #if MSDOS | |
187 | extern char o_pcbios[1]; | |
188 | #endif | |
189 | ||
190 | #ifndef NO_SHOWMATCH | |
191 | extern char o_showmatch[1]; | |
192 | #endif | |
193 | ||
194 | #ifndef NO_SHOWMODE | |
195 | extern char o_smd[1]; | |
196 | #endif | |
197 | ||
198 | /*------------------------------------------------------------------------*/ | |
199 | /* These help support the single-line multi-change "undo" -- shift-U */ | |
200 | ||
201 | extern char U_text[BLKSIZE]; | |
202 | extern long U_line; | |
203 | ||
204 | /*------------------------------------------------------------------------*/ | |
205 | /* These are used to refer to places in the text */ | |
206 | ||
207 | typedef long MARK; | |
208 | #define markline(x) (long)((x) / BLKSIZE) | |
209 | #define markidx(x) (int)((x) & (BLKSIZE - 1)) | |
210 | #define MARK_UNSET ((MARK)0) | |
211 | #define MARK_FIRST ((MARK)BLKSIZE) | |
212 | #define MARK_LAST ((MARK)(nlines * BLKSIZE)) | |
213 | #define MARK_AT_LINE(x) ((MARK)(x) * BLKSIZE) | |
214 | ||
215 | #define NMARKS 29 | |
216 | extern MARK mark[NMARKS]; /* marks a-z, plus mark ' and two temps */ | |
217 | extern MARK cursor; /* mark where line is */ | |
218 | ||
219 | /*------------------------------------------------------------------------*/ | |
220 | /* These are used to keep track of the current & previous files. */ | |
221 | ||
222 | extern long origtime; /* modification date&time of the current file */ | |
223 | extern char origname[256]; /* name of the current file */ | |
224 | extern char prevorig[256]; /* name of the preceding file */ | |
225 | extern long prevline; /* line number from preceding file */ | |
226 | ||
227 | /*------------------------------------------------------------------------*/ | |
228 | /* misc housekeeping variables & functions */ | |
229 | ||
230 | extern int tmpfd; /* fd used to access the tmp file */ | |
231 | extern int tmpnum; /* counter used to generate unique filenames */ | |
232 | extern long lnum[MAXBLKS]; /* last line# of each block */ | |
233 | extern long nlines; /* number of lines in the file */ | |
234 | extern char args[BLKSIZE]; /* file names given on the command line */ | |
235 | extern int argno; /* the current element of args[] */ | |
236 | extern int nargs; /* number of filenames in args */ | |
237 | extern long changes; /* counts changes, to prohibit short-cuts */ | |
238 | extern int significant; /* boolean: was a *REAL* change made? */ | |
239 | extern BLK tmpblk; /* a block used to accumulate changes */ | |
240 | extern long topline; /* file line number of top line */ | |
241 | extern int leftcol; /* column number of left col */ | |
242 | #define botline (topline + LINES - 2) | |
243 | #define rightcol (leftcol + COLS - (*o_number ? 9 : 1)) | |
244 | extern int physcol; /* physical column number that cursor is on */ | |
245 | extern int physrow; /* physical row number that cursor is on */ | |
246 | extern int exwrote; /* used to detect verbose ex commands */ | |
247 | extern int doingdot; /* boolean: are we doing the "." command? */ | |
248 | extern int doingglobal; /* boolean: are doing a ":g" command? */ | |
249 | extern long rptlines; /* number of lines affected by a command */ | |
250 | extern char *rptlabel; /* description of how lines were affected */ | |
251 | extern char *fetchline(); /* read a given line from tmp file */ | |
252 | extern char *parseptrn(); /* isolate a regexp in a line */ | |
253 | extern MARK paste(); /* paste from cut buffer to a given point */ | |
254 | extern char *wildcard(); /* expand wildcards in filenames */ | |
255 | extern MARK input(); /* inserts characters from keyboard */ | |
256 | extern char *linespec(); /* finds the end of a /regexp/ string */ | |
257 | #define ctrl(ch) ((ch)&037) | |
258 | #ifndef NO_RECYCLE | |
259 | extern long allocate(); /* allocate a free block of the tmp file */ | |
260 | #endif | |
261 | extern int trapint(); /* trap handler for SIGINT */ | |
262 | extern int deathtrap(); /* trap handler for deadly signals */ | |
263 | extern void blkdirty(); /* marks a block as being "dirty" */ | |
264 | extern void blkflush(); /* writes a single dirty block to the disk */ | |
265 | extern void blksync(); /* forces all "dirty" blocks to disk */ | |
266 | extern void blkinit(); /* resets the block cache to "empty" state */ | |
267 | extern void beep(); /* rings the terminal's bell */ | |
268 | extern void exrefresh(); /* writes text to the screen */ | |
269 | extern void msg(); /* writes a printf-style message to the screen */ | |
270 | extern void endmsgs(); /* if "manymsgs" is set, then scroll up 1 line */ | |
271 | extern void garbage(); /* reclaims any garbage blocks */ | |
272 | extern void redraw(); /* updates the screen after a change */ | |
273 | extern void resume_curses();/* puts the terminal in "cbreak" mode */ | |
274 | extern void beforedo(); /* saves current revision before a new change */ | |
275 | extern void afterdo(); /* marks end of a beforedo() change */ | |
276 | extern void abortdo(); /* like "afterdo()" followed by "undo()" */ | |
277 | extern int undo(); /* restores file to previous undo() */ | |
278 | extern void dumpkey(); /* lists key mappings to the screen */ | |
279 | extern void mapkey(); /* defines a new key mapping */ | |
280 | extern void savekeys(); /* lists key mappings to a file */ | |
281 | extern void redrawrange(); /* records clues from modify.c */ | |
282 | extern void cut(); /* saves text in a cut buffer */ | |
283 | extern void delete(); /* deletes text */ | |
284 | extern void add(); /* adds text */ | |
285 | extern void change(); /* deletes text, and then adds other text */ | |
286 | extern void cutswitch(); /* updates cut buffers when we switch files */ | |
287 | extern void do_abbr(); /* defines or lists abbreviations */ | |
288 | extern void do_digraph(); /* defines or lists digraphs */ | |
289 | extern void exstring(); /* execute a string as EX commands */ | |
290 | extern void dumpopts(); | |
291 | extern void setopts(); | |
292 | extern void saveopts(); | |
293 | extern void savedigs(); | |
294 | extern void saveabbr(); | |
295 | extern void savecolor(); | |
296 | extern void cutname(); | |
297 | extern void cutname(); | |
298 | extern void initopts(); | |
299 | extern void cutend(); | |
300 | #ifndef CRUNCH | |
301 | extern int wset; /* boolean: has the "window" size been set? */ | |
302 | #endif | |
303 | ||
304 | /*------------------------------------------------------------------------*/ | |
305 | /* macros that are used as control structures */ | |
306 | ||
307 | #define BeforeAfter(before, after) for((before),bavar=1;bavar;(after),bavar=0) | |
308 | #define ChangeText BeforeAfter(beforedo(FALSE),afterdo()) | |
309 | ||
310 | extern int bavar; /* used only in BeforeAfter macros */ | |
311 | ||
312 | /*------------------------------------------------------------------------*/ | |
313 | /* These are the movement commands. Each accepts a mark for the starting */ | |
314 | /* location & number and returns a mark for the destination. */ | |
315 | ||
316 | extern MARK m_updnto(); /* k j G */ | |
317 | extern MARK m_right(); /* h */ | |
318 | extern MARK m_left(); /* l */ | |
319 | extern MARK m_tocol(); /* | */ | |
320 | extern MARK m_front(); /* ^ */ | |
321 | extern MARK m_rear(); /* $ */ | |
322 | extern MARK m_fword(); /* w */ | |
323 | extern MARK m_bword(); /* b */ | |
324 | extern MARK m_eword(); /* e */ | |
325 | extern MARK m_paragraph(); /* { } [[ ]] */ | |
326 | extern MARK m_match(); /* % */ | |
327 | #ifndef NO_SENTENCE | |
328 | extern MARK m_sentence(); /* ( ) */ | |
329 | #endif | |
330 | extern MARK m_tomark(); /* 'm */ | |
331 | #ifndef NO_EXTENSIONS | |
332 | extern MARK m_wsrch(); /* ^A */ | |
333 | #endif | |
334 | extern MARK m_nsrch(); /* n */ | |
335 | extern MARK m_Nsrch(); /* N */ | |
336 | extern MARK m_fsrch(); /* /regexp */ | |
337 | extern MARK m_bsrch(); /* ?regexp */ | |
338 | #ifndef NO_CHARSEARCH | |
339 | extern MARK m__ch(); /* ; , */ | |
340 | extern MARK m_fch(); /* f */ | |
341 | extern MARK m_tch(); /* t */ | |
342 | extern MARK m_Fch(); /* F */ | |
343 | extern MARK m_Tch(); /* T */ | |
344 | #endif | |
345 | extern MARK m_row(); /* H L M */ | |
346 | extern MARK m_z(); /* z */ | |
347 | extern MARK m_scroll(); /* ^B ^F ^E ^Y ^U ^D */ | |
348 | ||
349 | /* Some stuff that is used by movement functions... */ | |
350 | ||
351 | extern MARK adjmove(); /* a helper fn, used by move fns */ | |
352 | ||
353 | /* This macro is used to set the default value of cnt */ | |
354 | #define DEFAULT(val) if (cnt < 1) cnt = (val) | |
355 | ||
356 | /* These are used to minimize calls to fetchline() */ | |
357 | extern int plen; /* length of the line */ | |
358 | extern long pline; /* line number that len refers to */ | |
359 | extern long pchgs; /* "changes" level that len refers to */ | |
360 | extern char *ptext; /* text of previous line, if valid */ | |
361 | extern void pfetch(); | |
362 | extern char digraph(); | |
363 | ||
364 | /* This is used to build a MARK that corresponds to a specific point in the | |
365 | * line that was most recently pfetch'ed. | |
366 | */ | |
367 | #define buildmark(text) (MARK)(BLKSIZE * pline + (int)((text) - ptext)) | |
368 | ||
369 | ||
370 | /*------------------------------------------------------------------------*/ | |
371 | /* These are used to handle EX commands. */ | |
372 | ||
373 | #define CMD_NULL 0 /* NOT A VALID COMMAND */ | |
374 | #define CMD_ABBR 1 /* "define an abbreviation" */ | |
375 | #define CMD_ARGS 2 /* "show me the args" */ | |
376 | #define CMD_APPEND 3 /* "insert lines after this line" */ | |
377 | #define CMD_AT 4 /* "execute a cut buffer's contents via EX" */ | |
378 | #define CMD_BANG 5 /* "run a single shell command" */ | |
379 | #define CMD_CC 6 /* "run `cc` and then do CMD_ERRLIST" */ | |
380 | #define CMD_CD 7 /* "change directories" */ | |
381 | #define CMD_CHANGE 8 /* "change some lines" */ | |
382 | #define CMD_COLOR 9 /* "change the default colors" */ | |
383 | #define CMD_COPY 10 /* "copy the selected text to a given place" */ | |
384 | #define CMD_DELETE 11 /* "delete the selected text" */ | |
385 | #define CMD_DIGRAPH 12 /* "add a digraph, or display them all" */ | |
386 | #define CMD_EDIT 13 /* "switch to a different file" */ | |
387 | #define CMD_EQUAL 14 /* "display a line number" */ | |
388 | #define CMD_ERRLIST 15 /* "locate the next error in a list" */ | |
389 | #define CMD_FILE 16 /* "show the file's status" */ | |
390 | #define CMD_GLOBAL 17 /* "globally search & do a command" */ | |
391 | #define CMD_INSERT 18 /* "insert lines before the current line" */ | |
392 | #define CMD_JOIN 19 /* "join the selected line & the one after" */ | |
393 | #define CMD_LIST 20 /* "print lines, making control chars visible" */ | |
394 | #define CMD_MAKE 21 /* "run `make` and then do CMD_ERRLIST" */ | |
395 | #define CMD_MAP 22 /* "adjust the keyboard map" */ | |
396 | #define CMD_MARK 23 /* "mark this line" */ | |
397 | #define CMD_MKEXRC 24 /* "make a .exrc file" */ | |
398 | #define CMD_MOVE 25 /* "move the selected text to a given place" */ | |
399 | #define CMD_NEXT 26 /* "switch to next file in args" */ | |
400 | #define CMD_NUMBER 27 /* "print lines from the file w/ line numbers" */ | |
401 | #define CMD_PRESERVE 28 /* "act as though vi crashed" */ | |
402 | #define CMD_PREVIOUS 29 /* "switch to the previous file in args" */ | |
403 | #define CMD_PRINT 30 /* "print the selected text" */ | |
404 | #define CMD_PUT 31 /* "insert any cut lines before this line" */ | |
405 | #define CMD_QUIT 32 /* "quit without writing the file" */ | |
406 | #define CMD_READ 33 /* "append the given file after this line */ | |
407 | #define CMD_RECOVER 34 /* "recover file after vi crashes" - USE -r FLAG */ | |
408 | #define CMD_REWIND 35 /* "rewind to first file" */ | |
409 | #define CMD_SET 36 /* "set a variable's value" */ | |
410 | #define CMD_SHELL 37 /* "run some lines through a command" */ | |
411 | #define CMD_SHIFTL 38 /* "shift lines left" */ | |
412 | #define CMD_SHIFTR 39 /* "shift lines right" */ | |
413 | #define CMD_SOURCE 40 /* "interpret a file's contents as ex commands" */ | |
414 | #define CMD_STOP 41 /* same as CMD_SUSPEND */ | |
415 | #define CMD_SUBAGAIN 42 /* "repeat the previous substitution" */ | |
416 | #define CMD_SUBSTITUTE 43 /* "substitute text in this line" */ | |
417 | #define CMD_SUSPEND 44 /* "suspend the vi session" */ | |
418 | #define CMD_TR 45 /* "transliterate chars in the selected lines" */ | |
419 | #define CMD_TAG 46 /* "go to a particular tag" */ | |
420 | #define CMD_UNABBR 47 /* "remove an abbreviation definition" */ | |
421 | #define CMD_UNDO 48 /* "undo the previous command" */ | |
422 | #define CMD_UNMAP 49 /* "remove a key sequence map */ | |
423 | #define CMD_VERSION 50 /* "describe which version this is" */ | |
424 | #define CMD_VGLOBAL 51 /* "apply a cmd to lines NOT containing an RE" */ | |
425 | #define CMD_VISUAL 52 /* "go into visual mode" */ | |
426 | #define CMD_WQUIT 53 /* "write this file out (any case) & quit" */ | |
427 | #define CMD_WRITE 54 /* "write the selected(?) text to a given file" */ | |
428 | #define CMD_XIT 55 /* "write this file out (if modified) & quit" */ | |
429 | #define CMD_YANK 56 /* "copy the selected text into the cut buffer" */ | |
430 | #ifdef DEBUG | |
431 | # define CMD_DEBUG 57 /* access to internal data structures */ | |
432 | # define CMD_VALIDATE 58 /* check for internal consistency */ | |
433 | #endif | |
434 | typedef int CMD; | |
435 | ||
436 | extern void ex(); | |
437 | extern void vi(); | |
438 | extern void doexcmd(); | |
439 | ||
440 | extern void cmd_append(); | |
441 | extern void cmd_args(); | |
442 | #ifndef NO_AT | |
443 | extern void cmd_at(); | |
444 | #endif | |
445 | extern void cmd_cd(); | |
446 | #ifndef NO_COLOR | |
447 | extern void cmd_color(); | |
448 | #endif | |
449 | extern void cmd_delete(); | |
450 | #ifndef NO_DIGRAPH | |
451 | extern void cmd_digraph(); | |
452 | #endif | |
453 | extern void cmd_edit(); | |
454 | #ifndef NO_ERRLIST | |
455 | extern void cmd_errlist(); | |
456 | #endif | |
457 | extern void cmd_file(); | |
458 | extern void cmd_global(); | |
459 | extern void cmd_join(); | |
460 | extern void cmd_mark(); | |
461 | #ifndef NO_ERRLIST | |
462 | extern void cmd_make(); | |
463 | #endif | |
464 | extern void cmd_map(); | |
465 | #ifndef NO_MKEXRC | |
466 | extern void cmd_mkexrc(); | |
467 | #endif | |
468 | extern void cmd_next(); | |
469 | extern void cmd_print(); | |
470 | extern void cmd_put(); | |
471 | extern void cmd_read(); | |
472 | extern void cmd_set(); | |
473 | extern void cmd_shell(); | |
474 | extern void cmd_shift(); | |
475 | extern void cmd_source(); | |
476 | extern void cmd_substitute(); | |
477 | extern void cmd_tag(); | |
478 | extern void cmd_undo(); | |
479 | extern void cmd_version(); | |
480 | extern void cmd_write(); | |
481 | extern void cmd_xit(); | |
482 | extern void cmd_move(); | |
483 | #ifdef DEBUG | |
484 | extern void cmd_debug(); | |
485 | extern void cmd_validate(); | |
486 | #endif | |
487 | #ifdef SIGTSTP | |
488 | extern void cmd_suspend(); | |
489 | #endif | |
490 | ||
491 | /*----------------------------------------------------------------------*/ | |
492 | /* These are used to handle VI commands */ | |
493 | ||
494 | extern MARK v_1ex(); /* : */ | |
495 | extern MARK v_mark(); /* m */ | |
496 | extern MARK v_quit(); /* Q */ | |
497 | extern MARK v_redraw(); /* ^L ^R */ | |
498 | extern MARK v_ulcase(); /* ~ */ | |
499 | extern MARK v_undo(); /* u */ | |
500 | extern MARK v_xchar(); /* x X */ | |
501 | extern MARK v_replace(); /* r */ | |
502 | extern MARK v_overtype(); /* R */ | |
503 | extern MARK v_selcut(); /* " */ | |
504 | extern MARK v_paste(); /* p P */ | |
505 | extern MARK v_yank(); /* y Y */ | |
506 | extern MARK v_delete(); /* d D */ | |
507 | extern MARK v_join(); /* J */ | |
508 | extern MARK v_insert(); /* a A i I o O */ | |
509 | extern MARK v_change(); /* c C */ | |
510 | extern MARK v_subst(); /* s */ | |
511 | extern MARK v_lshift(); /* < */ | |
512 | extern MARK v_rshift(); /* > */ | |
513 | extern MARK v_reformat(); /* = */ | |
514 | extern MARK v_filter(); /* ! */ | |
515 | extern MARK v_status(); /* ^G */ | |
516 | extern MARK v_switch(); /* ^^ */ | |
517 | extern MARK v_tag(); /* ^] */ | |
518 | extern MARK v_xit(); /* ZZ */ | |
519 | extern MARK v_undoline(); /* U */ | |
520 | extern MARK v_again(); /* & */ | |
521 | #ifndef NO_EXTENSIONS | |
522 | extern MARK v_keyword(); /* K */ | |
523 | extern MARK v_increment(); /* * */ | |
524 | #endif | |
525 | #ifndef NO_ERRLIST | |
526 | extern MARK v_errlist(); /* * */ | |
527 | #endif | |
528 | #ifndef NO_AT | |
529 | extern MARK v_at(); /* @ */ | |
530 | #endif | |
531 | #ifdef SIGTSTP | |
532 | extern MARK v_suspend(); /* ^Z */ | |
533 | #endif | |
534 | #ifndef NO_POPUP | |
535 | extern MARK v_popup(); /* \ */ | |
536 | #endif | |
537 | ||
538 | /*----------------------------------------------------------------------*/ | |
539 | /* These flags describe the quirks of the individual visual commands */ | |
540 | #define NO_FLAGS 0x00 | |
541 | #define MVMT 0x01 /* this is a movement command */ | |
542 | #define PTMV 0x02 /* this can be *part* of a movement command */ | |
543 | #define FRNT 0x04 /* after move, go to front of line */ | |
544 | #define INCL 0x08 /* include last char when used with c/d/y */ | |
545 | #define LNMD 0x10 /* use line mode of c/d/y */ | |
546 | #define NCOL 0x20 /* this command can't change the column# */ | |
547 | #define NREL 0x40 /* this is "non-relative" -- set the '' mark */ | |
548 | #define SDOT 0x80 /* set the "dot" variables, for the "." cmd */ | |
549 | #ifndef NO_VISIBLE | |
550 | # define VIZ 0x100 /* commands which can be used with 'v' */ | |
551 | #else | |
552 | # define VIZ 0 | |
553 | #endif | |
554 | ||
555 | /* This variable is zeroed before a command executes, and later ORed with the | |
556 | * command's flags after the command has been executed. It is used to force | |
557 | * certain flags to be TRUE for *some* invocations of a particular command. | |
558 | * For example, "/regexp/+offset" forces the LNMD flag, and sometimes a "p" | |
559 | * or "P" command will force FRNT. | |
560 | */ | |
561 | extern int force_flags; | |
562 | ||
563 | /*----------------------------------------------------------------------*/ | |
564 | /* These describe what mode we're in */ | |
565 | ||
566 | #define MODE_EX 1 /* executing ex commands */ | |
567 | #define MODE_VI 2 /* executing vi commands */ | |
568 | #define MODE_COLON 3 /* executing an ex command from vi mode */ | |
569 | #define MODE_QUIT 4 | |
570 | extern int mode; | |
571 | ||
572 | #define WHEN_VICMD 1 /* getkey: we're reading a VI command */ | |
573 | #define WHEN_VIINP 2 /* getkey: we're in VI's INPUT mode */ | |
574 | #define WHEN_VIREP 4 /* getkey: we're in VI's REPLACE mode */ | |
575 | #define WHEN_EX 8 /* getkey: we're in EX mode */ | |
576 | #define WHEN_MSG 16 /* getkey: we're at a "more" prompt */ | |
577 | #define WHEN_POPUP 32 /* getkey: we're in the pop-up menu */ | |
578 | #define WHEN_REP1 64 /* getkey: we're getting a single char for 'r' */ | |
579 | #define WHEN_CUT 128 /* getkey: we're getting a cut buffer name */ | |
580 | #define WHEN_MARK 256 /* getkey: we're getting a mark name */ | |
581 | #define WHEN_CHAR 512 /* getkey: we're getting a destination for f/F/t/T */ | |
582 | #define WHEN_INMV 4096 /* in input mode, interpret the key in VICMD mode */ | |
583 | #define WHEN_FREE 8192 /* free the keymap after doing it once */ | |
584 | #define WHENMASK (WHEN_VICMD|WHEN_VIINP|WHEN_VIREP|WHEN_REP1|WHEN_CUT|WHEN_MARK|WHEN_CHAR) | |
585 | ||
586 | #ifndef NO_VISIBLE | |
587 | extern MARK V_from; | |
588 | extern int V_linemd; | |
589 | extern MARK v_start(); | |
590 | #endif | |
591 | ||
592 | #ifdef DEBUG | |
593 | # define malloc(size) dbmalloc(size, __FILE__, __LINE__) | |
594 | # define free(ptr) dbfree(ptr, __FILE__, __LINE__) | |
595 | extern char *dbmalloc(); | |
596 | #endif |