home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / editors / elvis1_5.arj / VI.H < prev    next >
C/C++ Source or Header  |  1992-04-09  |  21KB  |  597 lines

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