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
|
---|