structs.h
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:27k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved by Bram Moolenaar
  4.  *
  5.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  6.  * Do ":help credits" in Vim to see a list of people who contributed.
  7.  */
  8. /*
  9.  * This file contains various definitions of structures that are used by Vim
  10.  */
  11. /*
  12.  * There is something wrong in the SAS compiler that makes typedefs not
  13.  * valid in include files.  Has been fixed in version 6.58.
  14.  */
  15. #if defined(SASC) && SASC < 658
  16. typedef long linenr_t;
  17. typedef unsigned colnr_t;
  18. typedef unsigned short short_u;
  19. #endif
  20. /*
  21.  * file position
  22.  */
  23. typedef struct fpos FPOS;
  24. struct fpos
  25. {
  26.     linenr_t     lnum;     /* line number */
  27.     colnr_t     col;     /* column number */
  28. };
  29. /*
  30.  * Sorry to put this here, but gui.h needs the FPOS type, and WIN needs gui.h
  31.  * for GuiScrollbar.  There is probably somewhere better it could go -- webb
  32.  */
  33. #ifdef USE_GUI
  34. # include "gui.h"
  35. #else
  36. # define GuiColor int     /* avoid error message for undefined struct */
  37. #endif
  38. /*
  39.  * marks: positions in a file
  40.  * (a normal mark is a lnum/col pair, the same as a file position)
  41.  */
  42. #define NMARKS 26     /* max. # of named marks */
  43. #define JUMPLISTSIZE 50     /* max. # of marks in jump list */
  44. #define TAGSTACKSIZE 20     /* max. # of tags in tag stack */
  45. struct filemark
  46. {
  47.     FPOS     mark;     /* cursor position */
  48.     int     fnum;     /* file number */
  49. };
  50. /*
  51.  * The taggy struct is used to store the information about a :tag command.
  52.  */
  53. struct taggy
  54. {
  55.     char_u     *tagname; /* tag name */
  56.     struct filemark fmark; /* cursor position BEFORE ":tag" */
  57.     int     cur_match; /* match number */
  58. };
  59. /*
  60.  * line number list
  61.  */
  62. /*
  63.  * Each window can have a different line number associated with a buffer.
  64.  * The window-pointer/line-number pairs are kept in the line number list.
  65.  * The list of line numbers is kept in most-recently-used order.
  66.  */
  67. typedef struct window     WIN;
  68. typedef struct winfpos     WINFPOS;
  69. struct winfpos
  70. {
  71.     WINFPOS *wl_next;     /* next entry or NULL for last entry */
  72.     WINFPOS *wl_prev;     /* previous entry or NULL for first entry */
  73.     WIN *wl_win;     /* pointer to window that did set wl_lnum */
  74.     FPOS wl_fpos;     /* last cursor position in the file */
  75. };
  76. /*
  77.  * stuctures used for undo
  78.  */
  79. struct u_entry
  80. {
  81.     struct u_entry  *ue_next; /* pointer to next entry in list */
  82.     linenr_t     ue_top; /* number of line above undo block */
  83.     linenr_t     ue_bot; /* number of line below undo block */
  84.     linenr_t     ue_lcount; /* linecount when u_save called */
  85.     char_u     **ue_array; /* array of lines in undo block */
  86.     long     ue_size; /* number of lines in ue_array */
  87. };
  88. struct u_header
  89. {
  90.     struct u_header *uh_next; /* pointer to next header in list */
  91.     struct u_header *uh_prev; /* pointer to previous header in list */
  92.     struct u_entry  *uh_entry; /* pointer to first entry */
  93.     FPOS      uh_cursor; /* cursor position before saving */
  94.     int      uh_flags; /* see below */
  95.     FPOS      uh_namedm[NMARKS]; /* marks before undo/after redo */
  96. };
  97. /* values for uh_flags */
  98. #define UH_CHANGED  0x01 /* b_changed flag before undo/after redo */
  99. #define UH_EMPTYBUF 0x02 /* buffer was empty */
  100. /*
  101.  * stuctures used in undo.c
  102.  */
  103. #if SIZEOF_INT > 2
  104. # define ALIGN_LONG /* longword alignment and use filler byte */
  105. # define ALIGN_SIZE (sizeof(long))
  106. #else
  107. # define ALIGN_SIZE (sizeof(short))
  108. #endif
  109. #define ALIGN_MASK (ALIGN_SIZE - 1)
  110. typedef struct m_info info_t;
  111. /*
  112.  * stucture used to link chunks in one of the free chunk lists.
  113.  */
  114. struct m_info
  115. {
  116. #ifdef ALIGN_LONG
  117.     long_u   m_size; /* size of the chunk (including m_info) */
  118. #else
  119.     short_u  m_size; /* size of the chunk (including m_info) */
  120. #endif
  121.     info_t  *m_next; /* pointer to next free chunk in the list */
  122. };
  123. /*
  124.  * structure used to link blocks in the list of allocated blocks.
  125.  */
  126. struct m_block
  127. {
  128.     struct m_block  *mb_next; /* pointer to next allocated block */
  129.     info_t     mb_info; /* head of free chuck list for this block */
  130. };
  131. /*
  132.  * Structure used for growing arrays.
  133.  * This is used to store information that only grows, is deleted all at
  134.  * once, and needs to be accessed by index.  See ga_clear() and ga_grow().
  135.  */
  136. struct growarray
  137. {
  138.     int     ga_len;     /* current number of items used */
  139.     int     ga_room;     /* number of unused items at the end */
  140.     int     ga_itemsize;     /* sizeof one item */
  141.     int     ga_growsize;     /* number of items to grow each time */
  142.     void    *ga_data;     /* pointer to the first item */
  143. };
  144. /*
  145.  * things used in memfile.c
  146.  */
  147. typedef struct block_hdr    BHDR;
  148. typedef struct memfile     MEMFILE;
  149. typedef long     blocknr_t;
  150. /*
  151.  * for each (previously) used block in the memfile there is one block header.
  152.  *
  153.  * The block may be linked in the used list OR in the free list.
  154.  * The used blocks are also kept in hash lists.
  155.  *
  156.  * The used list is a doubly linked list, most recently used block first.
  157.  * The blocks in the used list have a block of memory allocated.
  158.  * mf_used_count is the number of pages in the used list.
  159.  * The hash lists are used to quickly find a block in the used list.
  160.  * The free list is a single linked list, not sorted.
  161.  * The blocks in the free list have no block of memory allocated and
  162.  * the contents of the block in the file (if any) is irrelevant.
  163.  */
  164. struct block_hdr
  165. {
  166.     BHDR *bh_next;     /* next block_hdr in free or used list */
  167.     BHDR *bh_prev;     /* previous block_hdr in used list */
  168.     BHDR *bh_hash_next;     /* next block_hdr in hash list */
  169.     BHDR *bh_hash_prev;     /* previous block_hdr in hash list */
  170.     blocknr_t bh_bnum; /* block number */
  171.     char_u *bh_data;     /* pointer to memory (for used block) */
  172.     int bh_page_count;     /* number of pages in this block */
  173. #define BH_DIRTY    1
  174. #define BH_LOCKED   2
  175.     char bh_flags;     /* BH_DIRTY or BH_LOCKED */
  176. };
  177. /*
  178.  * when a block with a negative number is flushed to the file, it gets
  179.  * a positive number. Because the reference to the block is still the negative
  180.  * number, we remember the translation to the new positive number in the
  181.  * double linked trans lists. The structure is the same as the hash lists.
  182.  */
  183. typedef struct nr_trans NR_TRANS;
  184. struct nr_trans
  185. {
  186.     NR_TRANS *nt_next;     /* next nr_trans in hash list */
  187.     NR_TRANS *nt_prev;     /* previous nr_trans in hash list */
  188.     blocknr_t nt_old_bnum; /* old, negative, number */
  189.     blocknr_t nt_new_bnum; /* new, positive, number */
  190. };
  191. /*
  192.  * Simplistic hashing scheme to quickly locate the blocks in the used list.
  193.  * 64 blocks are found directly (64 * 4K = 256K, most files are smaller).
  194.  */
  195. #define MEMHASHSIZE 64
  196. #define MEMHASH(nr) ((nr) & (MEMHASHSIZE - 1))
  197. struct memfile
  198. {
  199.     char_u *mf_fname;     /* name of the file */
  200.     char_u *mf_ffname;     /* idem, full path */
  201.     int mf_fd;     /* file descriptor */
  202.     BHDR *mf_free_first;     /* first block_hdr in free list */
  203.     BHDR *mf_used_first;     /* mru block_hdr in used list */
  204.     BHDR *mf_used_last;     /* lru block_hdr in used list */
  205.     unsigned mf_used_count;     /* number of pages in used list */
  206.     unsigned mf_used_count_max;  /* maximum number of pages in memory */
  207.     BHDR *mf_hash[MEMHASHSIZE]; /* array of hash lists */
  208.     NR_TRANS *mf_trans[MEMHASHSIZE]; /* array of trans lists */
  209.     blocknr_t mf_blocknr_max;     /* highest positive block number + 1*/
  210.     blocknr_t mf_blocknr_min;     /* lowest negative block number - 1 */
  211.     blocknr_t mf_neg_count;     /* number of negative blocks numbers */
  212.     blocknr_t mf_infile_count;    /* number of pages in the file */
  213.     unsigned mf_page_size;     /* number of bytes in a page */
  214.     int mf_dirty;     /* Set to TRUE if there are dirty blocks */
  215. };
  216. /*
  217.  * things used in memline.c
  218.  */
  219. typedef struct info_pointer IPTR;     /* block/index pair */
  220. /*
  221.  * When searching for a specific line, we remember what blocks in the tree
  222.  * are the branches leading to that block. This is stored in ml_stack.
  223.  * Each entry is a pointer to info in a block (may be data block or pointer block)
  224.  */
  225. struct info_pointer
  226. {
  227.     blocknr_t ip_bnum; /* block number */
  228.     linenr_t ip_low; /* lowest lnum in this block */
  229.     linenr_t ip_high; /* highest lnum in this block */
  230.     int ip_index; /* index for block with current lnum */
  231. };
  232. typedef struct memline MEMLINE;
  233. /*
  234.  * the memline structure holds all the information about a memline
  235.  */
  236. struct memline
  237. {
  238.     linenr_t ml_line_count; /* number of lines in the buffer */
  239.     MEMFILE *ml_mfp; /* pointer to associated memfile */
  240. #define ML_EMPTY 1 /* empty buffer */
  241. #define ML_LINE_DIRTY 2 /* cached line was changed and allocated */
  242. #define ML_LOCKED_DIRTY 4 /* ml_locked was changed */
  243. #define ML_LOCKED_POS 8 /* ml_locked needs positive block number */
  244.     int ml_flags;
  245.     IPTR *ml_stack; /* stack of pointer blocks (array of IPTRs) */
  246.     int ml_stack_top; /* current top if ml_stack */
  247.     int ml_stack_size; /* total number of entries in ml_stack */
  248.     linenr_t ml_line_lnum; /* line number of cached line, 0 if not valid */
  249.     char_u *ml_line_ptr; /* pointer to cached line */
  250.     BHDR *ml_locked; /* block used by last ml_get */
  251.     linenr_t ml_locked_low; /* first line in ml_locked */
  252.     linenr_t ml_locked_high; /* last line in ml_locked */
  253.     int ml_locked_lineadd;  /* number of lines inserted in ml_locked */
  254. };
  255. #ifdef SYNTAX_HL
  256. /*
  257.  * Each keyword has one keyentry, which is linked in a hash list.
  258.  */
  259. struct keyentry
  260. {
  261.     struct keyentry *next; /* next keyword in the hash list */
  262.     int     syn_inc_lvl;    /* ":syn include" level for this match */
  263.     short     syn_id; /* syntax ID for this match (if non-zero) */
  264.     short     *next_list; /* ID list for next match (if non-zero) */
  265.     short     flags; /* see syntax.c */
  266.     char_u     keyword[1]; /* actually longer */
  267. };
  268. /*
  269.  * syn_state contains syntax state at the start of a line.
  270.  */
  271. struct syn_state
  272. {
  273.     struct growarray sst_ga; /* growarray to store syntax state */
  274.     short *sst_next_list; /* "nextgroup" list in this state
  275.    (this is a copy, don't free it! */
  276.     int sst_next_flags; /* flags for sst_next_list */
  277. };
  278. #endif /* SYNTAX_HL */
  279. /*
  280.  * Structure shared between syntax.c, screen.c and gui_x11.c.
  281.  */
  282. struct attr_entry
  283. {
  284.     short     ae_attr; /* HL_BOLD, etc. */
  285.     union
  286.     {
  287. struct
  288. {
  289.     char_u     *start; /* start escape sequence */
  290.     char_u     *stop; /* stop escape sequence */
  291. } term;
  292. struct
  293. {
  294.     char_u     fg_color; /* foreground color number */
  295.     char_u     bg_color; /* background color number */
  296. } cterm;
  297. # ifdef USE_GUI
  298. struct
  299. {
  300.     GuiColor     fg_color; /* foreground color handle */
  301.     GuiColor     bg_color; /* background color handle */
  302.     GuiFont     font; /* font handle */
  303. } gui;
  304. # endif
  305.     } ae_u;
  306. };
  307. /*
  308.  * buffer: structure that holds information about one file
  309.  *
  310.  * Several windows can share a single Buffer
  311.  * A buffer is unallocated if there is no memfile for it.
  312.  * A buffer is new if the associated file has never been loaded yet.
  313.  */
  314. typedef struct buffer BUF;
  315. struct buffer
  316. {
  317.     MEMLINE      b_ml; /* associated memline (also contains
  318.  * line count) */
  319.     BUF     *b_next; /* links in list of buffers */
  320.     BUF     *b_prev;
  321.     int      b_changed; /* 'modified': Set to TRUE if
  322.  * something in the file has
  323.  * been changed and not written out.
  324.  */
  325.     int      b_notedited; /* Set to TRUE when file name is
  326.  * changed after starting to edit,
  327.  * reset when file is written out. */
  328.     int      b_nwindows; /* nr of windows open on this buffer */
  329.     int      b_flags; /* various BF_ flags */
  330.     /*
  331.      * b_ffname has the full path of the file.
  332.      * b_sfname is the name as the user typed it.
  333.      * b_fname is the same as b_sfname, unless ":cd" has been done,
  334.      * then it is the same as b_ffname.
  335.      */
  336.     char_u     *b_ffname; /* full path file name */
  337.     char_u     *b_sfname; /* short file name */
  338.     char_u     *b_fname; /* current file name */
  339. #ifdef USE_SNIFF
  340.     int      b_sniff; /* file was loaded through Sniff */
  341. #endif
  342.     int      b_fnum; /* file number for this file. */
  343.     WINFPOS     *b_winfpos; /* list of last used lnum for
  344.  * each window */
  345.     long      b_mtime; /* last change time of original file */
  346.     long      b_mtime_read; /* last change time when reading */
  347.     FPOS      b_namedm[NMARKS]; /* current named marks (mark.c) */
  348.     /* These variables are set when VIsual_active becomes FALSE */
  349.     FPOS      b_visual_start; /* start pos of last VIsual */
  350.     FPOS      b_visual_end; /* end position of last VIsual */
  351.     int      b_visual_mode; /* VIsual_mode of last VIsual */
  352.     FPOS      b_last_cursor; /* cursor position when last unloading
  353.    this buffer */
  354.     /*
  355.      * Character table, only used in charset.c for 'iskeyword'
  356.      */
  357.     char      b_chartab[256];
  358.     /*
  359.      * start and end of an operator, also used for '[ and ']
  360.      */
  361.     FPOS      b_op_start;
  362.     FPOS      b_op_end;
  363. #ifdef VIMINFO
  364.     int      b_marks_read; /* Have we read viminfo marks yet? */
  365. #endif /* VIMINFO */
  366.     /*
  367.      * The following only used in undo.c.
  368.      */
  369.     struct u_header *b_u_oldhead; /* pointer to oldest header */
  370.     struct u_header *b_u_newhead; /* pointer to newest header */
  371.     struct u_header *b_u_curhead; /* pointer to current header */
  372.     int      b_u_numhead; /* current number of headers */
  373.     int      b_u_synced; /* entry lists are synced */
  374.     /*
  375.      * variables for "U" command in undo.c
  376.      */
  377.     char_u     *b_u_line_ptr; /* saved line for "U" command */
  378.     linenr_t      b_u_line_lnum; /* line number of line in u_line */
  379.     colnr_t      b_u_line_colnr; /* optional column number */
  380.     /*
  381.      * The following only used in undo.c
  382.      */
  383.     struct m_block   b_block_head; /* head of allocated memory block list */
  384.     info_t     *b_m_search; /* pointer to chunk before previously
  385.  * allocated/freed chunk */
  386.     struct m_block  *b_mb_current; /* block where m_search points in */
  387. #ifdef INSERT_EXPAND
  388.     int      b_scanned; /* ^N/^P have scanned this buffer */
  389. #endif
  390.     /*
  391.      * Options "local" to a buffer.
  392.      * They are here because their value depends on the type of file
  393.      * or contents of the file being edited.
  394.      * The "save" options are for when the paste option is set.
  395.      */
  396.     int      b_p_initialized; /* set when options initialized */
  397.     int      b_p_ai, b_p_ro, b_p_lisp;
  398.     int      b_p_inf; /* infer case of ^N/^P completions */
  399. #ifdef INSERT_EXPAND
  400.     char_u     *b_p_cpt; /* 'complete', types of expansions */
  401. #endif
  402.     int      b_p_bin, b_p_eol, b_p_et, b_p_ml, b_p_tx, b_p_swf;
  403. #ifndef SHORT_FNAME
  404.     int      b_p_sn;
  405. #endif
  406.     long      b_p_sw, b_p_sts, b_p_ts, b_p_tw, b_p_wm;
  407.     char_u     *b_p_ff, *b_p_fo, *b_p_com, *b_p_isk;
  408. #ifdef MULTI_BYTE
  409.     char_u     *b_p_fe;
  410. #endif
  411.     char_u     *b_p_nf;     /* Number formats */
  412.     char_u     *b_p_mps;
  413.     /* saved values for when 'bin' is set */
  414.     long      b_p_wm_nobin, b_p_tw_nobin;
  415.     int      b_p_ml_nobin, b_p_et_nobin;
  416.     /* saved values for when 'paste' is set */
  417.     int      b_p_ai_save, b_p_lisp_save;
  418.     long      b_p_tw_save, b_p_wm_save, b_p_sts_save;
  419. #ifdef SMARTINDENT
  420.     int      b_p_si, b_p_si_save;
  421. #endif
  422. #ifdef CINDENT
  423.     int      b_p_cin;     /* use C progam indent mode */
  424.     int      b_p_cin_save;  /* b_p_cin saved for paste mode */
  425.     char_u     *b_p_cino;     /* C progam indent mode options */
  426.     char_u     *b_p_cink;     /* C progam indent mode keys */
  427. #endif
  428. #if defined(CINDENT) || defined(SMARTINDENT)
  429.     char_u     *b_p_cinw;     /* words extra indent for 'si' and 'cin' */
  430. #endif
  431. #ifdef SYNTAX_HL
  432.     char_u     *b_p_syn;     /* 'syntax' */
  433. #endif
  434. #ifdef WANT_FILETYPE
  435.     char_u     *b_p_ft;     /* Value of 'filetype' option */
  436. #endif
  437.     /* end of buffer options */
  438.     int      b_start_ffc;   /* first char of 'ff' when edit started */
  439. #ifdef WANT_EVAL
  440.     struct growarray b_vars;     /* internal variables, local to buffer */
  441. #endif
  442.     /* When a buffer is created, it starts without a swap file.  b_may_swap is
  443.      * then set to indicate that a swap file may be opened later.  It is reset
  444.      * if a swap file could not be opened.
  445.      */
  446.     int      b_may_swap;
  447.     int      b_did_warn;    /* Set to 1 if user has been warned on
  448.      * first change of a read-only file */
  449.     int      b_help;     /* buffer for help file */
  450. #ifndef SHORT_FNAME
  451.     int      b_shortname;   /* this file has an 8.3 file name */
  452. #endif
  453. #ifdef HAVE_PERL_INTERP
  454.     void     *perl_private;
  455. #endif
  456. #ifdef HAVE_PYTHON
  457.     void     *python_ref;    /* The Python value referring to
  458.      * this buffer */
  459. #endif
  460. #ifdef HAVE_TCL
  461.     void     *tcl_ref;
  462. #endif
  463. #ifdef SYNTAX_HL
  464.     struct keyentry **b_keywtab;       /* syntax keywords hash table */
  465.     struct keyentry **b_keywtab_ic;       /* idem, ignore case */
  466.     int b_syn_ic;       /* ignore case for :syn cmds */
  467.     struct growarray b_syn_patterns;       /* table for syntax patterns */
  468.     struct growarray b_syn_clusters;       /* table for syntax clusters */
  469.     int b_syn_sync_flags;     /* flags about how to sync */
  470.     short b_syn_sync_id;       /* group to sync on */
  471.     long b_syn_sync_minlines;  /* minimal sync lines offset */
  472.     long b_syn_sync_maxlines;  /* maximal sync lines offset */
  473.     char_u *b_syn_linecont_pat;  /* line continuation pattern */
  474.     vim_regexp *b_syn_linecont_prog; /* line continuation program */
  475.     int b_syn_linecont_ic;    /* ignore-case flag for above */
  476.     int b_syn_topgrp;       /* for ":syntax include" */
  477. /*
  478.  * b_syn_states[] contains the state stack for a number of consecutive lines,
  479.  * for the start of that line (col == 0).
  480.  * Each position in the stack is an index in b_syn_patterns[].
  481.  * Normally these are the lines currently being displayed.
  482.  * b_syn_states      is a pointer to an array of struct syn_state.
  483.  * b_syn_states_len  is the number of entries in b_syn_states[].
  484.  * b_syn_states_lnum is the first line that is in b_syn_states[].
  485.  * b_syn_change_lnum is the lowest line number with changes since the last
  486.  *      update of b_syn_states[] (0 means no changes)
  487.  */
  488.     struct syn_state *b_syn_states;
  489.     int b_syn_states_len;
  490.     linenr_t b_syn_states_lnum;
  491.     linenr_t b_syn_change_lnum;
  492. #endif /* SYNTAX_HL */
  493. };
  494. /*
  495.  * Structure which contains all information that belongs to a window
  496.  *
  497.  * All row numbers are relative to the start of the window, except w_winpos.
  498.  */
  499. struct window
  500. {
  501.     BUF *w_buffer;     /* buffer we are a window into */
  502.     WIN *w_prev;     /* link to previous window (above) */
  503.     WIN *w_next;     /* link to next window (below) */
  504.     FPOS w_cursor;     /* cursor's position in buffer */
  505.     /*
  506.      * w_valid is a bitfield of flags, which indicate if specific values are
  507.      * valid or need to be recomputed. See screen.c for values.
  508.      */
  509.     int w_valid;
  510.     FPOS w_valid_cursor;     /* last known position of w_cursor, used
  511.        to adjust w_valid */
  512.     colnr_t w_valid_leftcol;    /* last known w_leftcol */
  513.     /*
  514.      * w_wrow and w_wcol are the cursor's position in the window.
  515.      * This is related to character positions in the window, not in the file.
  516.      * w_wrow is relative to w_winpos.
  517.      */
  518.     int w_wrow, w_wcol;     /* cursor's position in window */
  519.     /*
  520.      * w_cline_height is the number of physical lines taken by the buffer line
  521.      * that the cursor is on.  We use this to avoid extra calls to plines().
  522.      */
  523.     int w_cline_height;     /* current size of cursor line */
  524.     int w_cline_row;     /* starting row of the cursor line */
  525.     colnr_t w_virtcol;     /* column number of the file's actual */
  526.     /* line, as opposed to the column */
  527.     /* number we're at on the screen. */
  528.     /* This makes a difference on lines */
  529.     /* which span more than one screen */
  530.     /* line or when w_leftcol is non-zero */
  531.     colnr_t w_curswant;     /* The column we'd like to be at. */
  532.     /* This is used to try to stay in */
  533.     /* the same column through up/down */
  534.     /* cursor motions. */
  535.     int w_set_curswant;     /* If set, then update w_curswant */
  536.     /* the next time through cursupdate() */
  537.     /* to the current virtual column */
  538.     /*
  539.      * the next three are used to update the visual part
  540.      */
  541.     linenr_t w_old_cursor_lnum;  /* last known end of visual part */
  542.     colnr_t w_old_cursor_fcol;  /* first column for block visual part */
  543.     colnr_t w_old_cursor_lcol;  /* last column for block visual part */
  544.     linenr_t w_old_visual_lnum;  /* last known start of visual part */
  545.     colnr_t w_old_curswant;     /* last known value of Curswant */
  546.     linenr_t w_topline;     /* number of the line at the top of
  547.      * the screen */
  548.     linenr_t w_botline;     /* number of the line below the bottom
  549.      * of the screen */
  550.     int w_empty_rows;     /* number of ~ rows in window */
  551.     int w_winpos;     /* row of topline of window in screen */
  552.     int w_height;     /* number of rows in window, excluding
  553. status/command line */
  554.     int w_status_height;    /* number of status lines (0 or 1) */
  555.     int w_redr_status;     /* if TRUE status line must be redrawn */
  556.     int w_redr_type;     /* type of redraw to be performed on win */
  557.     /* remember what is shown in the ruler for this window (if 'ruler' set) */
  558.     FPOS w_ru_cursor;     /* cursor position shown in ruler */
  559.     colnr_t w_ru_virtcol;     /* virtcol shown in ruler */
  560.     char w_ru_empty;     /* TRUE if ruler shows 0-1 (empty line) */
  561.     colnr_t w_leftcol;     /* starting column of the screen when
  562.      * 'wrap' is off */
  563.     colnr_t w_skipcol;     /* starting column when a single line
  564.        doesn't fit in the window */
  565. /*
  566.  * The height of the lines currently in the window is remembered
  567.  * to avoid recomputing it every time. The number of entries is Rows.
  568.  */
  569.     int w_lsize_valid;     /* nr. of valid LineSizes */
  570.     linenr_t *w_lsize_lnum;     /* array of line numbers for w_lsize */
  571.     char_u *w_lsize;     /* array of line heights */
  572.     int w_alt_fnum;     /* alternate file (for # and CTRL-^) */
  573.     int w_arg_idx;     /* current index in argument list (can be
  574.      * out of range!) */
  575.     int w_arg_idx_invalid;  /* editing another file then w_arg_idx */
  576.     /*
  577.      * Variables "local" to a window.
  578.      * They are here because they influence the layout of the window or
  579.      * depend on the window layout.
  580.      */
  581.     int w_p_list,
  582. w_p_nu,
  583. #ifdef RIGHTLEFT
  584. w_p_rl,
  585. #ifdef FKMAP
  586. w_p_pers, /* for the window dependent Farsi functions */
  587. #endif
  588. #endif
  589. w_p_wrap,
  590. w_p_lbr;
  591.     long w_p_scroll;
  592. #ifdef WANT_EVAL
  593.     struct growarray w_vars;     /* internal variables, local to window */
  594. #endif
  595.     /*
  596.      * The w_prev_pcmark field is used to check whether we really did jump to
  597.      * a new line after setting the w_pcmark.  If not, then we revert to
  598.      * using the previous w_pcmark.
  599.      */
  600.     FPOS w_pcmark;     /* previous context mark */
  601.     FPOS w_prev_pcmark;     /* previous w_pcmark */
  602.     /*
  603.      * the jumplist contains old cursor positions
  604.      */
  605.     struct filemark w_jumplist[JUMPLISTSIZE];
  606.     int     w_jumplistlen; /* number of active entries */
  607.     int     w_jumplistidx; /* current position */
  608.     /*
  609.      * the tagstack grows from 0 upwards:
  610.      * entry 0: older
  611.      * entry 1: newer
  612.      * entry 2: newest
  613.      */
  614.     struct taggy    w_tagstack[TAGSTACKSIZE]; /* the tag stack */
  615.     int     w_tagstackidx; /* idx just below activ entry */
  616.     int     w_tagstacklen; /* number of tags on stack */
  617.     /*
  618.      * w_fraction is the fractional row of the cursor within the window, from
  619.      * 0 at the top row to FRACTION_MULT at the last row.
  620.      * w_prev_fraction_row was the actual cursor row when w_fraction was last
  621.      * calculated.
  622.      */
  623.     int     w_fraction;
  624.     int     w_prev_fraction_row;
  625. #ifdef USE_GUI
  626.     GuiScrollbar    w_scrollbars[2]; /* Scrollbars for this window */
  627. #endif /* USE_GUI */
  628. #ifdef HAVE_PERL_INTERP
  629.     void     *perl_private;
  630. #endif
  631. #ifdef HAVE_PYTHON
  632.     void     *python_ref;    /* The Python value referring to
  633.      * this window */
  634. #endif
  635. #ifdef HAVE_TCL
  636.     void     *tcl_ref;
  637. #endif
  638. };
  639. /*
  640.  * Arguments for operators.
  641.  */
  642. typedef struct oparg
  643. {
  644.     int     op_type; /* current pending operator type */
  645.     int     op_prechar; /* optional character before operator command */
  646.     int     regname; /* register to use for the operator */
  647.     int     motion_type; /* type of the current cursor motion */
  648.     int     inclusive; /* TRUE if char motion is inclusive (only
  649.    valid when motion_type is MCHAR */
  650.     int     end_adjusted; /* backuped b_op_end one char (only used by
  651.    do_format()) */
  652.     FPOS    start; /* start of the operator */
  653.     FPOS    end; /* end of the operator */
  654.     long    line_count; /* number of lines from op_start to op_end
  655.    (inclusive) */
  656.     int     empty; /* op_start and op_end the same (only used by
  657.    do_change()) */
  658.     int     is_VIsual; /* operator on Visual area */
  659.     int     block_mode; /* current operator is Visual block mode */
  660.     colnr_t start_vcol; /* start col for block mode operator */
  661.     colnr_t end_vcol; /* end col for block mode operator */
  662. } OPARG;
  663. /*
  664.  * Arguments for Normal mode commands.
  665.  */
  666. typedef struct cmdarg
  667. {
  668.     OPARG   *oap;     /* Operator arguments */
  669.     int     prechar;     /* prefix character (optional, always 'g') */
  670.     int     cmdchar;     /* command character */
  671.     int     nchar;     /* next character (optional) */
  672.     long    count0;     /* count, default 0 */
  673.     long    count1;     /* count, default 1 */
  674. } CMDARG;
  675. #ifdef CURSOR_SHAPE
  676. /*
  677.  * struct to store values from 'guicursor'
  678.  */
  679. #define SHAPE_N 0   /* Normal mode */
  680. #define SHAPE_V 1   /* Visual mode */
  681. #define SHAPE_I 2   /* Insert mode */
  682. #define SHAPE_R 3   /* Replace mode */
  683. #define SHAPE_C 4   /* Command line Normal mode */
  684. #define SHAPE_CI 5   /* Command line Insert mode */
  685. #define SHAPE_CR 6   /* Command line Replace mode */
  686. #define SHAPE_SM 7   /* showing matching paren */
  687. #define SHAPE_O 8   /* Operator-pending mode */
  688. #define SHAPE_VE 9   /* Visual mode with 'seleciton' exclusive */
  689. #define SHAPE_COUNT 10
  690. #define SHAPE_BLOCK 0   /* block cursor */
  691. #define SHAPE_HOR 1   /* horizontal bar cursor */
  692. #define SHAPE_VER 2   /* vertical bar cursor */
  693. struct cursor_entry
  694. {
  695.     int     shape;     /* one of the SHAPE_ defines */
  696.     int     percentage;     /* percentage of cell for bar */
  697.     long    blinkwait;     /* blinking, wait time before blinking starts */
  698.     long    blinkon;     /* blinking, on time */
  699.     long    blinkoff;     /* blinking, off time */
  700.     int     id;     /* highlight group ID */
  701.     char    *name;     /* mode name (fixed) */
  702. };
  703. #endif