1 /* vi:set ts=8 sts=4 sw=4 noet: 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 /* 10 * This file contains various definitions of structures that are used by Vim 11 */ 12 13 /* 14 * There is something wrong in the SAS compiler that makes typedefs not 15 * valid in include files. Has been fixed in version 6.58. 16 */ 17 #if defined(SASC) && SASC < 658 18 typedef long linenr_T; 19 typedef int colnr_T; 20 typedef unsigned short short_u; 21 #endif 22 23 /* 24 * Position in file or buffer. 25 */ 26 typedef struct 27 { 28 linenr_T lnum; // line number 29 colnr_T col; // column number 30 colnr_T coladd; // extra virtual column 31 } pos_T; 32 33 34 /* 35 * Same, but without coladd. 36 */ 37 typedef struct 38 { 39 linenr_T lnum; // line number 40 colnr_T col; // column number 41 } lpos_T; 42 43 /* 44 * Structure used for growing arrays. 45 * This is used to store information that only grows, is deleted all at 46 * once, and needs to be accessed by index. See ga_clear() and ga_grow(). 47 */ 48 typedef struct growarray 49 { 50 int ga_len; /* current number of items used */ 51 int ga_maxlen; /* maximum number of items possible */ 52 int ga_itemsize; /* sizeof(item) */ 53 int ga_growsize; /* number of items to grow each time */ 54 void *ga_data; /* pointer to the first item */ 55 } garray_T; 56 57 #define GA_EMPTY {0, 0, 0, 0, NULL} 58 59 typedef struct window_S win_T; 60 typedef struct wininfo_S wininfo_T; 61 typedef struct frame_S frame_T; 62 typedef int scid_T; /* script ID */ 63 typedef struct file_buffer buf_T; /* forward declaration */ 64 typedef struct terminal_S term_T; 65 66 #ifdef FEAT_MENU 67 typedef struct VimMenu vimmenu_T; 68 #endif 69 70 /* 71 * SCript ConteXt (SCTX): identifies a script script line. 72 * When sourcing a script "sc_lnum" is zero, "sourcing_lnum" is the current 73 * line number. When executing a user function "sc_lnum" is the line where the 74 * function was defined, "sourcing_lnum" is the line number inside the 75 * function. When stored with a function, mapping, option, etc. "sc_lnum" is 76 * the line number in the script "sc_sid". 77 */ 78 typedef struct { 79 scid_T sc_sid; // script ID 80 int sc_seq; // sourcing sequence number 81 linenr_T sc_lnum; // line number 82 int sc_version; // :scriptversion 83 } sctx_T; 84 85 /* 86 * Reference to a buffer that stores the value of buf_free_count. 87 * bufref_valid() only needs to check "buf" when the count differs. 88 */ 89 typedef struct { 90 buf_T *br_buf; 91 int br_fnum; 92 int br_buf_free_count; 93 } bufref_T; 94 95 /* 96 * This is here because regexp.h needs pos_T and below regprog_T is used. 97 */ 98 #include "regexp.h" 99 100 /* 101 * This is here because gui.h needs the pos_T and win_T, and win_T needs gui.h 102 * for scrollbar_T. 103 */ 104 #ifdef FEAT_GUI 105 # include "gui.h" 106 #else 107 # ifdef FEAT_XCLIPBOARD 108 # include <X11/Intrinsic.h> 109 # endif 110 # define guicolor_T long 111 # define INVALCOLOR ((guicolor_T)0x1ffffff) 112 /* only used for cterm.bg_rgb and cterm.fg_rgb: use cterm color */ 113 # define CTERMCOLOR ((guicolor_T)0x1fffffe) 114 #endif 115 #define COLOR_INVALID(x) ((x) == INVALCOLOR || (x) == CTERMCOLOR) 116 117 /* 118 * marks: positions in a file 119 * (a normal mark is a lnum/col pair, the same as a file position) 120 */ 121 122 /* (Note: for EBCDIC there are more than 26, because there are gaps in the 123 * alphabet coding. To minimize changes to the code, I decided to just 124 * increase the number of possible marks. */ 125 #define NMARKS ('z' - 'a' + 1) /* max. # of named marks */ 126 #define JUMPLISTSIZE 100 /* max. # of marks in jump list */ 127 #define TAGSTACKSIZE 20 /* max. # of tags in tag stack */ 128 129 typedef struct filemark 130 { 131 pos_T mark; /* cursor position */ 132 int fnum; /* file number */ 133 } fmark_T; 134 135 /* Xtended file mark: also has a file name */ 136 typedef struct xfilemark 137 { 138 fmark_T fmark; 139 char_u *fname; /* file name, used when fnum == 0 */ 140 #ifdef FEAT_VIMINFO 141 time_T time_set; 142 #endif 143 } xfmark_T; 144 145 /* 146 * The taggy struct is used to store the information about a :tag command. 147 */ 148 typedef struct taggy 149 { 150 char_u *tagname; // tag name 151 fmark_T fmark; // cursor position BEFORE ":tag" 152 int cur_match; // match number 153 int cur_fnum; // buffer number used for cur_match 154 char_u *user_data; // used with tagfunc 155 } taggy_T; 156 157 /* 158 * Structure that contains all options that are local to a window. 159 * Used twice in a window: for the current buffer and for all buffers. 160 * Also used in wininfo_T. 161 */ 162 typedef struct 163 { 164 #ifdef FEAT_ARABIC 165 int wo_arab; 166 # define w_p_arab w_onebuf_opt.wo_arab // 'arabic' 167 #endif 168 #ifdef FEAT_LINEBREAK 169 int wo_bri; 170 # define w_p_bri w_onebuf_opt.wo_bri // 'breakindent' 171 char_u *wo_briopt; 172 # define w_p_briopt w_onebuf_opt.wo_briopt // 'breakindentopt' 173 #endif 174 char_u *wo_wcr; 175 # define w_p_wcr w_onebuf_opt.wo_wcr // 'wincolor' 176 #ifdef FEAT_DIFF 177 int wo_diff; 178 # define w_p_diff w_onebuf_opt.wo_diff // 'diff' 179 #endif 180 #ifdef FEAT_FOLDING 181 long wo_fdc; 182 # define w_p_fdc w_onebuf_opt.wo_fdc /* 'foldcolumn' */ 183 int wo_fdc_save; 184 # define w_p_fdc_save w_onebuf_opt.wo_fdc_save /* 'foldenable' saved for diff mode */ 185 int wo_fen; 186 # define w_p_fen w_onebuf_opt.wo_fen /* 'foldenable' */ 187 int wo_fen_save; 188 # define w_p_fen_save w_onebuf_opt.wo_fen_save /* 'foldenable' saved for diff mode */ 189 char_u *wo_fdi; 190 # define w_p_fdi w_onebuf_opt.wo_fdi /* 'foldignore' */ 191 long wo_fdl; 192 # define w_p_fdl w_onebuf_opt.wo_fdl /* 'foldlevel' */ 193 int wo_fdl_save; 194 # define w_p_fdl_save w_onebuf_opt.wo_fdl_save /* 'foldlevel' state saved for diff mode */ 195 char_u *wo_fdm; 196 # define w_p_fdm w_onebuf_opt.wo_fdm /* 'foldmethod' */ 197 char_u *wo_fdm_save; 198 # define w_p_fdm_save w_onebuf_opt.wo_fdm_save /* 'fdm' saved for diff mode */ 199 long wo_fml; 200 # define w_p_fml w_onebuf_opt.wo_fml /* 'foldminlines' */ 201 long wo_fdn; 202 # define w_p_fdn w_onebuf_opt.wo_fdn /* 'foldnestmax' */ 203 # ifdef FEAT_EVAL 204 char_u *wo_fde; 205 # define w_p_fde w_onebuf_opt.wo_fde /* 'foldexpr' */ 206 char_u *wo_fdt; 207 # define w_p_fdt w_onebuf_opt.wo_fdt /* 'foldtext' */ 208 # endif 209 char_u *wo_fmr; 210 # define w_p_fmr w_onebuf_opt.wo_fmr /* 'foldmarker' */ 211 #endif 212 #ifdef FEAT_LINEBREAK 213 int wo_lbr; 214 # define w_p_lbr w_onebuf_opt.wo_lbr /* 'linebreak' */ 215 #endif 216 int wo_list; 217 #define w_p_list w_onebuf_opt.wo_list /* 'list' */ 218 int wo_nu; 219 #define w_p_nu w_onebuf_opt.wo_nu /* 'number' */ 220 int wo_rnu; 221 #define w_p_rnu w_onebuf_opt.wo_rnu /* 'relativenumber' */ 222 #ifdef FEAT_LINEBREAK 223 long wo_nuw; 224 # define w_p_nuw w_onebuf_opt.wo_nuw /* 'numberwidth' */ 225 #endif 226 int wo_wfh; 227 # define w_p_wfh w_onebuf_opt.wo_wfh /* 'winfixheight' */ 228 int wo_wfw; 229 # define w_p_wfw w_onebuf_opt.wo_wfw /* 'winfixwidth' */ 230 #if defined(FEAT_QUICKFIX) 231 int wo_pvw; 232 # define w_p_pvw w_onebuf_opt.wo_pvw /* 'previewwindow' */ 233 #endif 234 #ifdef FEAT_RIGHTLEFT 235 int wo_rl; 236 # define w_p_rl w_onebuf_opt.wo_rl /* 'rightleft' */ 237 char_u *wo_rlc; 238 # define w_p_rlc w_onebuf_opt.wo_rlc /* 'rightleftcmd' */ 239 #endif 240 long wo_scr; 241 #define w_p_scr w_onebuf_opt.wo_scr /* 'scroll' */ 242 #ifdef FEAT_SPELL 243 int wo_spell; 244 # define w_p_spell w_onebuf_opt.wo_spell /* 'spell' */ 245 #endif 246 #ifdef FEAT_SYN_HL 247 int wo_cuc; 248 # define w_p_cuc w_onebuf_opt.wo_cuc /* 'cursorcolumn' */ 249 int wo_cul; 250 # define w_p_cul w_onebuf_opt.wo_cul /* 'cursorline' */ 251 char_u *wo_cc; 252 # define w_p_cc w_onebuf_opt.wo_cc /* 'colorcolumn' */ 253 #endif 254 #ifdef FEAT_STL_OPT 255 char_u *wo_stl; 256 #define w_p_stl w_onebuf_opt.wo_stl /* 'statusline' */ 257 #endif 258 int wo_scb; 259 #define w_p_scb w_onebuf_opt.wo_scb /* 'scrollbind' */ 260 int wo_diff_saved; /* options were saved for starting diff mode */ 261 #define w_p_diff_saved w_onebuf_opt.wo_diff_saved 262 int wo_scb_save; /* 'scrollbind' saved for diff mode*/ 263 #define w_p_scb_save w_onebuf_opt.wo_scb_save 264 int wo_wrap; 265 #define w_p_wrap w_onebuf_opt.wo_wrap /* 'wrap' */ 266 #ifdef FEAT_DIFF 267 int wo_wrap_save; /* 'wrap' state saved for diff mode*/ 268 # define w_p_wrap_save w_onebuf_opt.wo_wrap_save 269 #endif 270 #ifdef FEAT_CONCEAL 271 char_u *wo_cocu; /* 'concealcursor' */ 272 # define w_p_cocu w_onebuf_opt.wo_cocu 273 long wo_cole; /* 'conceallevel' */ 274 # define w_p_cole w_onebuf_opt.wo_cole 275 #endif 276 int wo_crb; 277 #define w_p_crb w_onebuf_opt.wo_crb /* 'cursorbind' */ 278 int wo_crb_save; /* 'cursorbind' state saved for diff mode*/ 279 #define w_p_crb_save w_onebuf_opt.wo_crb_save 280 #ifdef FEAT_SIGNS 281 char_u *wo_scl; 282 # define w_p_scl w_onebuf_opt.wo_scl /* 'signcolumn' */ 283 #endif 284 #ifdef FEAT_TERMINAL 285 char_u *wo_twk; 286 # define w_p_twk w_onebuf_opt.wo_twk /* 'termwinkey' */ 287 char_u *wo_tws; 288 # define w_p_tws w_onebuf_opt.wo_tws /* 'termwinsize' */ 289 #endif 290 291 #ifdef FEAT_EVAL 292 sctx_T wo_script_ctx[WV_COUNT]; /* SCTXs for window-local options */ 293 # define w_p_script_ctx w_onebuf_opt.wo_script_ctx 294 #endif 295 } winopt_T; 296 297 /* 298 * Window info stored with a buffer. 299 * 300 * Two types of info are kept for a buffer which are associated with a 301 * specific window: 302 * 1. Each window can have a different line number associated with a buffer. 303 * 2. The window-local options for a buffer work in a similar way. 304 * The window-info is kept in a list at b_wininfo. It is kept in 305 * most-recently-used order. 306 */ 307 struct wininfo_S 308 { 309 wininfo_T *wi_next; /* next entry or NULL for last entry */ 310 wininfo_T *wi_prev; /* previous entry or NULL for first entry */ 311 win_T *wi_win; /* pointer to window that did set wi_fpos */ 312 pos_T wi_fpos; /* last cursor position in the file */ 313 int wi_optset; /* TRUE when wi_opt has useful values */ 314 winopt_T wi_opt; /* local window options */ 315 #ifdef FEAT_FOLDING 316 int wi_fold_manual; /* copy of w_fold_manual */ 317 garray_T wi_folds; /* clone of w_folds */ 318 #endif 319 }; 320 321 /* 322 * Info used to pass info about a fold from the fold-detection code to the 323 * code that displays the foldcolumn. 324 */ 325 typedef struct foldinfo 326 { 327 int fi_level; /* level of the fold; when this is zero the 328 other fields are invalid */ 329 int fi_lnum; /* line number where fold starts */ 330 int fi_low_level; /* lowest fold level that starts in the same 331 line */ 332 } foldinfo_T; 333 334 /* Structure to store info about the Visual area. */ 335 typedef struct 336 { 337 pos_T vi_start; /* start pos of last VIsual */ 338 pos_T vi_end; /* end position of last VIsual */ 339 int vi_mode; /* VIsual_mode of last VIsual */ 340 colnr_T vi_curswant; /* MAXCOL from w_curswant */ 341 } visualinfo_T; 342 343 /* 344 * structures used for undo 345 */ 346 347 // One line saved for undo. After the NUL terminated text there might be text 348 // properties, thus ul_len can be larger than STRLEN(ul_line) + 1. 349 typedef struct { 350 char_u *ul_line; // text of the line 351 long ul_len; // length of the line including NUL, plus text 352 // properties 353 } undoline_T; 354 355 typedef struct u_entry u_entry_T; 356 typedef struct u_header u_header_T; 357 struct u_entry 358 { 359 u_entry_T *ue_next; /* pointer to next entry in list */ 360 linenr_T ue_top; /* number of line above undo block */ 361 linenr_T ue_bot; /* number of line below undo block */ 362 linenr_T ue_lcount; /* linecount when u_save called */ 363 undoline_T *ue_array; /* array of lines in undo block */ 364 long ue_size; /* number of lines in ue_array */ 365 #ifdef U_DEBUG 366 int ue_magic; /* magic number to check allocation */ 367 #endif 368 }; 369 370 struct u_header 371 { 372 /* The following have a pointer and a number. The number is used when 373 * reading the undo file in u_read_undo() */ 374 union { 375 u_header_T *ptr; /* pointer to next undo header in list */ 376 long seq; 377 } uh_next; 378 union { 379 u_header_T *ptr; /* pointer to previous header in list */ 380 long seq; 381 } uh_prev; 382 union { 383 u_header_T *ptr; /* pointer to next header for alt. redo */ 384 long seq; 385 } uh_alt_next; 386 union { 387 u_header_T *ptr; /* pointer to previous header for alt. redo */ 388 long seq; 389 } uh_alt_prev; 390 long uh_seq; /* sequence number, higher == newer undo */ 391 int uh_walk; /* used by undo_time() */ 392 u_entry_T *uh_entry; /* pointer to first entry */ 393 u_entry_T *uh_getbot_entry; /* pointer to where ue_bot must be set */ 394 pos_T uh_cursor; /* cursor position before saving */ 395 long uh_cursor_vcol; 396 int uh_flags; /* see below */ 397 pos_T uh_namedm[NMARKS]; /* marks before undo/after redo */ 398 visualinfo_T uh_visual; /* Visual areas before undo/after redo */ 399 time_T uh_time; /* timestamp when the change was made */ 400 long uh_save_nr; /* set when the file was saved after the 401 changes in this block */ 402 #ifdef U_DEBUG 403 int uh_magic; /* magic number to check allocation */ 404 #endif 405 }; 406 407 /* values for uh_flags */ 408 #define UH_CHANGED 0x01 /* b_changed flag before undo/after redo */ 409 #define UH_EMPTYBUF 0x02 /* buffer was empty */ 410 411 /* 412 * structures used in undo.c 413 */ 414 #define ALIGN_LONG /* longword alignment and use filler byte */ 415 #define ALIGN_SIZE (sizeof(long)) 416 417 #define ALIGN_MASK (ALIGN_SIZE - 1) 418 419 typedef struct m_info minfo_T; 420 421 /* 422 * structure used to link chunks in one of the free chunk lists. 423 */ 424 struct m_info 425 { 426 #ifdef ALIGN_LONG 427 long_u m_size; /* size of the chunk (including m_info) */ 428 #else 429 short_u m_size; /* size of the chunk (including m_info) */ 430 #endif 431 minfo_T *m_next; /* pointer to next free chunk in the list */ 432 }; 433 434 /* 435 * things used in memfile.c 436 */ 437 438 typedef struct block_hdr bhdr_T; 439 typedef struct memfile memfile_T; 440 typedef long blocknr_T; 441 442 /* 443 * mf_hashtab_T is a chained hashtable with blocknr_T key and arbitrary 444 * structures as items. This is an intrusive data structure: we require 445 * that items begin with mf_hashitem_T which contains the key and linked 446 * list pointers. List of items in each bucket is doubly-linked. 447 */ 448 449 typedef struct mf_hashitem_S mf_hashitem_T; 450 451 struct mf_hashitem_S 452 { 453 mf_hashitem_T *mhi_next; 454 mf_hashitem_T *mhi_prev; 455 blocknr_T mhi_key; 456 }; 457 458 #define MHT_INIT_SIZE 64 459 460 typedef struct mf_hashtab_S 461 { 462 long_u mht_mask; /* mask used for hash value (nr of items 463 * in array is "mht_mask" + 1) */ 464 long_u mht_count; /* nr of items inserted into hashtable */ 465 mf_hashitem_T **mht_buckets; /* points to mht_small_buckets or 466 *dynamically allocated array */ 467 mf_hashitem_T *mht_small_buckets[MHT_INIT_SIZE]; /* initial buckets */ 468 char mht_fixed; /* non-zero value forbids growth */ 469 } mf_hashtab_T; 470 471 /* 472 * for each (previously) used block in the memfile there is one block header. 473 * 474 * The block may be linked in the used list OR in the free list. 475 * The used blocks are also kept in hash lists. 476 * 477 * The used list is a doubly linked list, most recently used block first. 478 * The blocks in the used list have a block of memory allocated. 479 * mf_used_count is the number of pages in the used list. 480 * The hash lists are used to quickly find a block in the used list. 481 * The free list is a single linked list, not sorted. 482 * The blocks in the free list have no block of memory allocated and 483 * the contents of the block in the file (if any) is irrelevant. 484 */ 485 486 struct block_hdr 487 { 488 mf_hashitem_T bh_hashitem; /* header for hash table and key */ 489 #define bh_bnum bh_hashitem.mhi_key /* block number, part of bh_hashitem */ 490 491 bhdr_T *bh_next; /* next block_hdr in free or used list */ 492 bhdr_T *bh_prev; /* previous block_hdr in used list */ 493 char_u *bh_data; /* pointer to memory (for used block) */ 494 int bh_page_count; /* number of pages in this block */ 495 496 #define BH_DIRTY 1 497 #define BH_LOCKED 2 498 char bh_flags; /* BH_DIRTY or BH_LOCKED */ 499 }; 500 501 /* 502 * when a block with a negative number is flushed to the file, it gets 503 * a positive number. Because the reference to the block is still the negative 504 * number, we remember the translation to the new positive number in the 505 * double linked trans lists. The structure is the same as the hash lists. 506 */ 507 typedef struct nr_trans NR_TRANS; 508 509 struct nr_trans 510 { 511 mf_hashitem_T nt_hashitem; /* header for hash table and key */ 512 #define nt_old_bnum nt_hashitem.mhi_key /* old, negative, number */ 513 514 blocknr_T nt_new_bnum; /* new, positive, number */ 515 }; 516 517 518 typedef struct buffblock buffblock_T; 519 typedef struct buffheader buffheader_T; 520 521 /* 522 * structure used to store one block of the stuff/redo/recording buffers 523 */ 524 struct buffblock 525 { 526 buffblock_T *b_next; /* pointer to next buffblock */ 527 char_u b_str[1]; /* contents (actually longer) */ 528 }; 529 530 /* 531 * header used for the stuff buffer and the redo buffer 532 */ 533 struct buffheader 534 { 535 buffblock_T bh_first; /* first (dummy) block of list */ 536 buffblock_T *bh_curr; /* buffblock for appending */ 537 int bh_index; /* index for reading */ 538 int bh_space; /* space in bh_curr for appending */ 539 }; 540 541 typedef struct 542 { 543 buffheader_T sr_redobuff; 544 buffheader_T sr_old_redobuff; 545 } save_redo_T; 546 547 /* 548 * used for completion on the command line 549 */ 550 typedef struct expand 551 { 552 int xp_context; /* type of expansion */ 553 char_u *xp_pattern; /* start of item to expand */ 554 int xp_pattern_len; /* bytes in xp_pattern before cursor */ 555 #if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) 556 char_u *xp_arg; /* completion function */ 557 sctx_T xp_script_ctx; /* SCTX for completion function */ 558 #endif 559 int xp_backslash; /* one of the XP_BS_ values */ 560 #ifndef BACKSLASH_IN_FILENAME 561 int xp_shell; /* TRUE for a shell command, more 562 characters need to be escaped */ 563 #endif 564 int xp_numfiles; /* number of files found by 565 file name completion */ 566 char_u **xp_files; /* list of files */ 567 char_u *xp_line; /* text being completed */ 568 int xp_col; /* cursor position in line */ 569 } expand_T; 570 571 /* values for xp_backslash */ 572 #define XP_BS_NONE 0 /* nothing special for backslashes */ 573 #define XP_BS_ONE 1 /* uses one backslash before a space */ 574 #define XP_BS_THREE 2 /* uses three backslashes before a space */ 575 576 /* 577 * Command modifiers ":vertical", ":browse", ":confirm" and ":hide" set a flag. 578 * This needs to be saved for recursive commands, put them in a structure for 579 * easy manipulation. 580 */ 581 typedef struct 582 { 583 int hide; /* TRUE when ":hide" was used */ 584 # ifdef FEAT_BROWSE_CMD 585 int browse; /* TRUE to invoke file dialog */ 586 # endif 587 int split; /* flags for win_split() */ 588 int tab; /* > 0 when ":tab" was used */ 589 # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) 590 int confirm; /* TRUE to invoke yes/no dialog */ 591 # endif 592 int keepalt; /* TRUE when ":keepalt" was used */ 593 int keepmarks; /* TRUE when ":keepmarks" was used */ 594 int keepjumps; /* TRUE when ":keepjumps" was used */ 595 int lockmarks; /* TRUE when ":lockmarks" was used */ 596 int keeppatterns; /* TRUE when ":keeppatterns" was used */ 597 int noswapfile; /* TRUE when ":noswapfile" was used */ 598 char_u *save_ei; /* saved value of 'eventignore' */ 599 regmatch_T filter_regmatch; /* set by :filter /pat/ */ 600 int filter_force; /* set for :filter! */ 601 } cmdmod_T; 602 603 #define MF_SEED_LEN 8 604 605 struct memfile 606 { 607 char_u *mf_fname; // name of the file 608 char_u *mf_ffname; // idem, full path 609 int mf_fd; // file descriptor 610 int mf_flags; // flags used when opening this memfile 611 int mf_reopen; // mf_fd was closed, retry opening 612 bhdr_T *mf_free_first; // first block_hdr in free list 613 bhdr_T *mf_used_first; // mru block_hdr in used list 614 bhdr_T *mf_used_last; // lru block_hdr in used list 615 unsigned mf_used_count; // number of pages in used list 616 unsigned mf_used_count_max; // maximum number of pages in memory 617 mf_hashtab_T mf_hash; // hash lists 618 mf_hashtab_T mf_trans; // trans lists 619 blocknr_T mf_blocknr_max; // highest positive block number + 1 620 blocknr_T mf_blocknr_min; // lowest negative block number - 1 621 blocknr_T mf_neg_count; // number of negative blocks numbers 622 blocknr_T mf_infile_count; // number of pages in the file 623 unsigned mf_page_size; // number of bytes in a page 624 int mf_dirty; // TRUE if there are dirty blocks 625 #ifdef FEAT_CRYPT 626 buf_T *mf_buffer; // buffer this memfile is for 627 char_u mf_seed[MF_SEED_LEN]; // seed for encryption 628 629 // Values for key, method and seed used for reading data blocks when 630 // updating for a newly set key or method. Only when mf_old_key != NULL. 631 char_u *mf_old_key; 632 int mf_old_cm; 633 char_u mf_old_seed[MF_SEED_LEN]; 634 #endif 635 }; 636 637 /* 638 * things used in memline.c 639 */ 640 /* 641 * When searching for a specific line, we remember what blocks in the tree 642 * are the branches leading to that block. This is stored in ml_stack. Each 643 * entry is a pointer to info in a block (may be data block or pointer block) 644 */ 645 typedef struct info_pointer 646 { 647 blocknr_T ip_bnum; /* block number */ 648 linenr_T ip_low; /* lowest lnum in this block */ 649 linenr_T ip_high; /* highest lnum in this block */ 650 int ip_index; /* index for block with current lnum */ 651 } infoptr_T; /* block/index pair */ 652 653 #ifdef FEAT_BYTEOFF 654 typedef struct ml_chunksize 655 { 656 int mlcs_numlines; 657 long mlcs_totalsize; 658 } chunksize_T; 659 660 /* Flags when calling ml_updatechunk() */ 661 662 #define ML_CHNK_ADDLINE 1 663 #define ML_CHNK_DELLINE 2 664 #define ML_CHNK_UPDLINE 3 665 #endif 666 667 /* 668 * the memline structure holds all the information about a memline 669 */ 670 typedef struct memline 671 { 672 linenr_T ml_line_count; /* number of lines in the buffer */ 673 674 memfile_T *ml_mfp; /* pointer to associated memfile */ 675 676 #define ML_EMPTY 1 /* empty buffer */ 677 #define ML_LINE_DIRTY 2 /* cached line was changed and allocated */ 678 #define ML_LOCKED_DIRTY 4 /* ml_locked was changed */ 679 #define ML_LOCKED_POS 8 /* ml_locked needs positive block number */ 680 int ml_flags; 681 682 infoptr_T *ml_stack; /* stack of pointer blocks (array of IPTRs) */ 683 int ml_stack_top; /* current top of ml_stack */ 684 int ml_stack_size; /* total number of entries in ml_stack */ 685 686 linenr_T ml_line_lnum; /* line number of cached line, 0 if not valid */ 687 char_u *ml_line_ptr; /* pointer to cached line */ 688 colnr_T ml_line_len; /* length of the cached line, including NUL */ 689 690 bhdr_T *ml_locked; /* block used by last ml_get */ 691 linenr_T ml_locked_low; /* first line in ml_locked */ 692 linenr_T ml_locked_high; /* last line in ml_locked */ 693 int ml_locked_lineadd; /* number of lines inserted in ml_locked */ 694 #ifdef FEAT_BYTEOFF 695 chunksize_T *ml_chunksize; 696 int ml_numchunks; 697 int ml_usedchunks; 698 #endif 699 } memline_T; 700 701 702 /* 703 * Structure defining text properties. These stick with the text. 704 * When stored in memline they are after the text, ml_line_len is larger than 705 * STRLEN(ml_line_ptr) + 1. 706 */ 707 typedef struct textprop_S 708 { 709 colnr_T tp_col; // start column (one based, in bytes) 710 colnr_T tp_len; // length in bytes 711 int tp_id; // identifier 712 int tp_type; // property type 713 int tp_flags; // TP_FLAG_ values 714 } textprop_T; 715 716 #define TP_FLAG_CONT_NEXT 1 // property continues in next line 717 #define TP_FLAG_CONT_PREV 2 // property was continued from prev line 718 719 /* 720 * Structure defining a property type. 721 */ 722 typedef struct proptype_S 723 { 724 int pt_id; // value used for tp_id 725 int pt_type; // number used for tp_type 726 int pt_hl_id; // highlighting 727 int pt_priority; // priority 728 int pt_flags; // PT_FLAG_ values 729 char_u pt_name[1]; // property type name, actually longer 730 } proptype_T; 731 732 #define PT_FLAG_INS_START_INCL 1 // insert at start included in property 733 #define PT_FLAG_INS_END_INCL 2 // insert at end included in property 734 #define PT_FLAG_COMBINE 4 // combine with syntax highlight 735 736 // Sign group 737 typedef struct signgroup_S 738 { 739 short_u refcount; // number of signs in this group 740 int next_sign_id; // next sign id for this group 741 char_u sg_name[1]; // sign group name 742 } signgroup_T; 743 744 typedef struct signlist signlist_T; 745 746 struct signlist 747 { 748 int id; /* unique identifier for each placed sign */ 749 linenr_T lnum; /* line number which has this sign */ 750 int typenr; /* typenr of sign */ 751 signgroup_T *group; /* sign group */ 752 int priority; /* priority for highlighting */ 753 signlist_T *next; /* next signlist entry */ 754 signlist_T *prev; /* previous entry -- for easy reordering */ 755 }; 756 757 #if defined(FEAT_SIGNS) || defined(PROTO) 758 // Macros to get the sign group structure from the group name 759 #define SGN_KEY_OFF offsetof(signgroup_T, sg_name) 760 #define HI2SG(hi) ((signgroup_T *)((hi)->hi_key - SGN_KEY_OFF)) 761 762 // Default sign priority for highlighting 763 #define SIGN_DEF_PRIO 10 764 765 /* type argument for buf_getsigntype() */ 766 #define SIGN_ANY 0 767 #define SIGN_LINEHL 1 768 #define SIGN_ICON 2 769 #define SIGN_TEXT 3 770 #endif 771 772 /* 773 * Argument list: Array of file names. 774 * Used for the global argument list and the argument lists local to a window. 775 */ 776 typedef struct arglist 777 { 778 garray_T al_ga; /* growarray with the array of file names */ 779 int al_refcount; /* number of windows using this arglist */ 780 int id; /* id of this arglist */ 781 } alist_T; 782 783 /* 784 * For each argument remember the file name as it was given, and the buffer 785 * number that contains the expanded file name (required for when ":cd" is 786 * used. 787 */ 788 typedef struct argentry 789 { 790 char_u *ae_fname; /* file name as specified */ 791 int ae_fnum; /* buffer number with expanded file name */ 792 } aentry_T; 793 794 #define ALIST(win) (win)->w_alist 795 #define GARGLIST ((aentry_T *)global_alist.al_ga.ga_data) 796 #define ARGLIST ((aentry_T *)ALIST(curwin)->al_ga.ga_data) 797 #define WARGLIST(wp) ((aentry_T *)ALIST(wp)->al_ga.ga_data) 798 #define AARGLIST(al) ((aentry_T *)((al)->al_ga.ga_data)) 799 #define GARGCOUNT (global_alist.al_ga.ga_len) 800 #define ARGCOUNT (ALIST(curwin)->al_ga.ga_len) 801 #define WARGCOUNT(wp) (ALIST(wp)->al_ga.ga_len) 802 803 /* 804 * A list used for saving values of "emsg_silent". Used by ex_try() to save the 805 * value of "emsg_silent" if it was non-zero. When this is done, the CSF_SILENT 806 * flag below is set. 807 */ 808 809 typedef struct eslist_elem eslist_T; 810 struct eslist_elem 811 { 812 int saved_emsg_silent; /* saved value of "emsg_silent" */ 813 eslist_T *next; /* next element on the list */ 814 }; 815 816 /* 817 * For conditional commands a stack is kept of nested conditionals. 818 * When cs_idx < 0, there is no conditional command. 819 */ 820 #define CSTACK_LEN 50 821 822 struct condstack 823 { 824 short cs_flags[CSTACK_LEN]; /* CSF_ flags */ 825 char cs_pending[CSTACK_LEN]; /* CSTP_: what's pending in ":finally"*/ 826 union { 827 void *csp_rv[CSTACK_LEN]; /* return typeval for pending return */ 828 void *csp_ex[CSTACK_LEN]; /* exception for pending throw */ 829 } cs_pend; 830 void *cs_forinfo[CSTACK_LEN]; /* info used by ":for" */ 831 int cs_line[CSTACK_LEN]; /* line nr of ":while"/":for" line */ 832 int cs_idx; /* current entry, or -1 if none */ 833 int cs_looplevel; /* nr of nested ":while"s and ":for"s */ 834 int cs_trylevel; /* nr of nested ":try"s */ 835 eslist_T *cs_emsg_silent_list; /* saved values of "emsg_silent" */ 836 char cs_lflags; /* loop flags: CSL_ flags */ 837 }; 838 # define cs_rettv cs_pend.csp_rv 839 # define cs_exception cs_pend.csp_ex 840 841 /* There is no CSF_IF, the lack of CSF_WHILE, CSF_FOR and CSF_TRY means ":if" 842 * was used. */ 843 # define CSF_TRUE 0x0001 /* condition was TRUE */ 844 # define CSF_ACTIVE 0x0002 /* current state is active */ 845 # define CSF_ELSE 0x0004 /* ":else" has been passed */ 846 # define CSF_WHILE 0x0008 /* is a ":while" */ 847 # define CSF_FOR 0x0010 /* is a ":for" */ 848 849 # define CSF_TRY 0x0100 /* is a ":try" */ 850 # define CSF_FINALLY 0x0200 /* ":finally" has been passed */ 851 # define CSF_THROWN 0x0400 /* exception thrown to this try conditional */ 852 # define CSF_CAUGHT 0x0800 /* exception caught by this try conditional */ 853 # define CSF_SILENT 0x1000 /* "emsg_silent" reset by ":try" */ 854 /* Note that CSF_ELSE is only used when CSF_TRY and CSF_WHILE are unset 855 * (an ":if"), and CSF_SILENT is only used when CSF_TRY is set. */ 856 857 /* 858 * What's pending for being reactivated at the ":endtry" of this try 859 * conditional: 860 */ 861 # define CSTP_NONE 0 /* nothing pending in ":finally" clause */ 862 # define CSTP_ERROR 1 /* an error is pending */ 863 # define CSTP_INTERRUPT 2 /* an interrupt is pending */ 864 # define CSTP_THROW 4 /* a throw is pending */ 865 # define CSTP_BREAK 8 /* ":break" is pending */ 866 # define CSTP_CONTINUE 16 /* ":continue" is pending */ 867 # define CSTP_RETURN 24 /* ":return" is pending */ 868 # define CSTP_FINISH 32 /* ":finish" is pending */ 869 870 /* 871 * Flags for the cs_lflags item in struct condstack. 872 */ 873 # define CSL_HAD_LOOP 1 /* just found ":while" or ":for" */ 874 # define CSL_HAD_ENDLOOP 2 /* just found ":endwhile" or ":endfor" */ 875 # define CSL_HAD_CONT 4 /* just found ":continue" */ 876 # define CSL_HAD_FINA 8 /* just found ":finally" */ 877 878 /* 879 * A list of error messages that can be converted to an exception. "throw_msg" 880 * is only set in the first element of the list. Usually, it points to the 881 * original message stored in that element, but sometimes it points to a later 882 * message in the list. See cause_errthrow() below. 883 */ 884 struct msglist 885 { 886 char *msg; /* original message */ 887 char *throw_msg; /* msg to throw: usually original one */ 888 struct msglist *next; /* next of several messages in a row */ 889 }; 890 891 /* 892 * The exception types. 893 */ 894 typedef enum 895 { 896 ET_USER, // exception caused by ":throw" command 897 ET_ERROR, // error exception 898 ET_INTERRUPT, // interrupt exception triggered by Ctrl-C 899 } except_type_T; 900 901 /* 902 * Structure describing an exception. 903 * (don't use "struct exception", it's used by the math library). 904 */ 905 typedef struct vim_exception except_T; 906 struct vim_exception 907 { 908 except_type_T type; /* exception type */ 909 char *value; /* exception value */ 910 struct msglist *messages; /* message(s) causing error exception */ 911 char_u *throw_name; /* name of the throw point */ 912 linenr_T throw_lnum; /* line number of the throw point */ 913 except_T *caught; /* next exception on the caught stack */ 914 }; 915 916 /* 917 * Structure to save the error/interrupt/exception state between calls to 918 * enter_cleanup() and leave_cleanup(). Must be allocated as an automatic 919 * variable by the (common) caller of these functions. 920 */ 921 typedef struct cleanup_stuff cleanup_T; 922 struct cleanup_stuff 923 { 924 int pending; /* error/interrupt/exception state */ 925 except_T *exception; /* exception value */ 926 }; 927 928 #ifdef FEAT_SYN_HL 929 /* struct passed to in_id_list() */ 930 struct sp_syn 931 { 932 int inc_tag; /* ":syn include" unique tag */ 933 short id; /* highlight group ID of item */ 934 short *cont_in_list; /* cont.in group IDs, if non-zero */ 935 }; 936 937 /* 938 * Each keyword has one keyentry, which is linked in a hash list. 939 */ 940 typedef struct keyentry keyentry_T; 941 942 struct keyentry 943 { 944 keyentry_T *ke_next; /* next entry with identical "keyword[]" */ 945 struct sp_syn k_syn; /* struct passed to in_id_list() */ 946 short *next_list; /* ID list for next match (if non-zero) */ 947 int flags; 948 int k_char; /* conceal substitute character */ 949 char_u keyword[1]; /* actually longer */ 950 }; 951 952 /* 953 * Struct used to store one state of the state stack. 954 */ 955 typedef struct buf_state 956 { 957 int bs_idx; /* index of pattern */ 958 int bs_flags; /* flags for pattern */ 959 #ifdef FEAT_CONCEAL 960 int bs_seqnr; /* stores si_seqnr */ 961 int bs_cchar; /* stores si_cchar */ 962 #endif 963 reg_extmatch_T *bs_extmatch; /* external matches from start pattern */ 964 } bufstate_T; 965 966 /* 967 * syn_state contains the syntax state stack for the start of one line. 968 * Used by b_sst_array[]. 969 */ 970 typedef struct syn_state synstate_T; 971 972 struct syn_state 973 { 974 synstate_T *sst_next; /* next entry in used or free list */ 975 linenr_T sst_lnum; /* line number for this state */ 976 union 977 { 978 bufstate_T sst_stack[SST_FIX_STATES]; /* short state stack */ 979 garray_T sst_ga; /* growarray for long state stack */ 980 } sst_union; 981 int sst_next_flags; /* flags for sst_next_list */ 982 int sst_stacksize; /* number of states on the stack */ 983 short *sst_next_list; /* "nextgroup" list in this state 984 * (this is a copy, don't free it! */ 985 disptick_T sst_tick; /* tick when last displayed */ 986 linenr_T sst_change_lnum;/* when non-zero, change in this line 987 * may have made the state invalid */ 988 }; 989 #endif /* FEAT_SYN_HL */ 990 991 /* 992 * Structure shared between syntax.c, screen.c and gui_x11.c. 993 */ 994 typedef struct attr_entry 995 { 996 short ae_attr; /* HL_BOLD, etc. */ 997 union 998 { 999 struct 1000 { 1001 char_u *start; /* start escape sequence */ 1002 char_u *stop; /* stop escape sequence */ 1003 } term; 1004 struct 1005 { 1006 /* These colors need to be > 8 bits to hold 256. */ 1007 short_u fg_color; /* foreground color number */ 1008 short_u bg_color; /* background color number */ 1009 # ifdef FEAT_TERMGUICOLORS 1010 guicolor_T fg_rgb; /* foreground color RGB */ 1011 guicolor_T bg_rgb; /* background color RGB */ 1012 # endif 1013 } cterm; 1014 # ifdef FEAT_GUI 1015 struct 1016 { 1017 guicolor_T fg_color; /* foreground color handle */ 1018 guicolor_T bg_color; /* background color handle */ 1019 guicolor_T sp_color; /* special color handle */ 1020 GuiFont font; /* font handle */ 1021 # ifdef FEAT_XFONTSET 1022 GuiFontset fontset; /* fontset handle */ 1023 # endif 1024 } gui; 1025 # endif 1026 } ae_u; 1027 } attrentry_T; 1028 1029 #ifdef USE_ICONV 1030 # ifdef HAVE_ICONV_H 1031 # include <iconv.h> 1032 # else 1033 # if defined(MACOS_X) 1034 # include <sys/errno.h> 1035 # ifndef EILSEQ 1036 # define EILSEQ ENOENT /* Early MacOS X does not have EILSEQ */ 1037 # endif 1038 typedef struct _iconv_t *iconv_t; 1039 # else 1040 # include <errno.h> 1041 # endif 1042 typedef void *iconv_t; 1043 # endif 1044 #endif 1045 1046 /* 1047 * Used for the typeahead buffer: typebuf. 1048 */ 1049 typedef struct 1050 { 1051 char_u *tb_buf; /* buffer for typed characters */ 1052 char_u *tb_noremap; /* mapping flags for characters in tb_buf[] */ 1053 int tb_buflen; /* size of tb_buf[] */ 1054 int tb_off; /* current position in tb_buf[] */ 1055 int tb_len; /* number of valid bytes in tb_buf[] */ 1056 int tb_maplen; /* nr of mapped bytes in tb_buf[] */ 1057 int tb_silent; /* nr of silently mapped bytes in tb_buf[] */ 1058 int tb_no_abbr_cnt; /* nr of bytes without abbrev. in tb_buf[] */ 1059 int tb_change_cnt; /* nr of time tb_buf was changed; never zero */ 1060 } typebuf_T; 1061 1062 /* Struct to hold the saved typeahead for save_typeahead(). */ 1063 typedef struct 1064 { 1065 typebuf_T save_typebuf; 1066 int typebuf_valid; /* TRUE when save_typebuf valid */ 1067 int old_char; 1068 int old_mod_mask; 1069 buffheader_T save_readbuf1; 1070 buffheader_T save_readbuf2; 1071 #ifdef USE_INPUT_BUF 1072 char_u *save_inputbuf; 1073 #endif 1074 } tasave_T; 1075 1076 /* 1077 * Used for conversion of terminal I/O and script files. 1078 */ 1079 typedef struct 1080 { 1081 int vc_type; /* zero or one of the CONV_ values */ 1082 int vc_factor; /* max. expansion factor */ 1083 # ifdef MSWIN 1084 int vc_cpfrom; /* codepage to convert from (CONV_CODEPAGE) */ 1085 int vc_cpto; /* codepage to convert to (CONV_CODEPAGE) */ 1086 # endif 1087 # ifdef USE_ICONV 1088 iconv_t vc_fd; /* for CONV_ICONV */ 1089 # endif 1090 int vc_fail; /* fail for invalid char, don't use '?' */ 1091 } vimconv_T; 1092 1093 /* 1094 * Structure used for reading from the viminfo file. 1095 */ 1096 typedef struct 1097 { 1098 char_u *vir_line; /* text of the current line */ 1099 FILE *vir_fd; /* file descriptor */ 1100 vimconv_T vir_conv; /* encoding conversion */ 1101 int vir_version; /* viminfo version detected or -1 */ 1102 garray_T vir_barlines; /* lines starting with | */ 1103 } vir_T; 1104 1105 #define CONV_NONE 0 1106 #define CONV_TO_UTF8 1 1107 #define CONV_9_TO_UTF8 2 1108 #define CONV_TO_LATIN1 3 1109 #define CONV_TO_LATIN9 4 1110 #define CONV_ICONV 5 1111 #ifdef MSWIN 1112 # define CONV_CODEPAGE 10 /* codepage -> codepage */ 1113 #endif 1114 #ifdef MACOS_X 1115 # define CONV_MAC_LATIN1 20 1116 # define CONV_LATIN1_MAC 21 1117 # define CONV_MAC_UTF8 22 1118 # define CONV_UTF8_MAC 23 1119 #endif 1120 1121 /* 1122 * Structure used for mappings and abbreviations. 1123 */ 1124 typedef struct mapblock mapblock_T; 1125 struct mapblock 1126 { 1127 mapblock_T *m_next; /* next mapblock in list */ 1128 char_u *m_keys; /* mapped from, lhs */ 1129 char_u *m_str; /* mapped to, rhs */ 1130 char_u *m_orig_str; /* rhs as entered by the user */ 1131 int m_keylen; /* strlen(m_keys) */ 1132 int m_mode; /* valid mode */ 1133 int m_noremap; /* if non-zero no re-mapping for m_str */ 1134 char m_silent; /* <silent> used, don't echo commands */ 1135 char m_nowait; /* <nowait> used */ 1136 #ifdef FEAT_EVAL 1137 char m_expr; /* <expr> used, m_str is an expression */ 1138 sctx_T m_script_ctx; /* SCTX where map was defined */ 1139 #endif 1140 }; 1141 1142 /* 1143 * Used for highlighting in the status line. 1144 */ 1145 struct stl_hlrec 1146 { 1147 char_u *start; 1148 int userhl; /* 0: no HL, 1-9: User HL, < 0 for syn ID */ 1149 }; 1150 1151 1152 /* 1153 * Syntax items - usually buffer-specific. 1154 */ 1155 1156 /* Item for a hashtable. "hi_key" can be one of three values: 1157 * NULL: Never been used 1158 * HI_KEY_REMOVED: Entry was removed 1159 * Otherwise: Used item, pointer to the actual key; this usually is 1160 * inside the item, subtract an offset to locate the item. 1161 * This reduces the size of hashitem by 1/3. 1162 */ 1163 typedef struct hashitem_S 1164 { 1165 long_u hi_hash; /* cached hash number of hi_key */ 1166 char_u *hi_key; 1167 } hashitem_T; 1168 1169 /* The address of "hash_removed" is used as a magic number for hi_key to 1170 * indicate a removed item. */ 1171 #define HI_KEY_REMOVED &hash_removed 1172 #define HASHITEM_EMPTY(hi) ((hi)->hi_key == NULL || (hi)->hi_key == &hash_removed) 1173 1174 /* Initial size for a hashtable. Our items are relatively small and growing 1175 * is expensive, thus use 16 as a start. Must be a power of 2. */ 1176 #define HT_INIT_SIZE 16 1177 1178 typedef struct hashtable_S 1179 { 1180 long_u ht_mask; /* mask used for hash value (nr of items in 1181 * array is "ht_mask" + 1) */ 1182 long_u ht_used; /* number of items used */ 1183 long_u ht_filled; /* number of items used + removed */ 1184 int ht_locked; /* counter for hash_lock() */ 1185 int ht_error; /* when set growing failed, can't add more 1186 items before growing works */ 1187 hashitem_T *ht_array; /* points to the array, allocated when it's 1188 not "ht_smallarray" */ 1189 hashitem_T ht_smallarray[HT_INIT_SIZE]; /* initial array */ 1190 } hashtab_T; 1191 1192 typedef long_u hash_T; /* Type for hi_hash */ 1193 1194 1195 #ifdef FEAT_NUM64 1196 /* Use 64-bit Number. */ 1197 # ifdef MSWIN 1198 # ifdef PROTO 1199 typedef long varnumber_T; 1200 typedef unsigned long uvarnumber_T; 1201 # define VARNUM_MIN LONG_MIN 1202 # define VARNUM_MAX LONG_MAX 1203 # define UVARNUM_MAX ULONG_MAX 1204 # else 1205 typedef __int64 varnumber_T; 1206 typedef unsigned __int64 uvarnumber_T; 1207 # define VARNUM_MIN _I64_MIN 1208 # define VARNUM_MAX _I64_MAX 1209 # define UVARNUM_MAX _UI64_MAX 1210 # endif 1211 # elif defined(HAVE_STDINT_H) 1212 typedef int64_t varnumber_T; 1213 typedef uint64_t uvarnumber_T; 1214 # define VARNUM_MIN INT64_MIN 1215 # define VARNUM_MAX INT64_MAX 1216 # define UVARNUM_MAX UINT64_MAX 1217 # else 1218 typedef long varnumber_T; 1219 typedef unsigned long uvarnumber_T; 1220 # define VARNUM_MIN LONG_MIN 1221 # define VARNUM_MAX LONG_MAX 1222 # define UVARNUM_MAX ULONG_MAX 1223 # endif 1224 #else 1225 /* Use 32-bit Number. */ 1226 typedef int varnumber_T; 1227 typedef unsigned int uvarnumber_T; 1228 # define VARNUM_MIN INT_MIN 1229 # define VARNUM_MAX INT_MAX 1230 # define UVARNUM_MAX UINT_MAX 1231 #endif 1232 1233 typedef double float_T; 1234 1235 typedef struct listvar_S list_T; 1236 typedef struct dictvar_S dict_T; 1237 typedef struct partial_S partial_T; 1238 typedef struct blobvar_S blob_T; 1239 1240 // Struct that holds both a normal function name and a partial_T, as used for a 1241 // callback argument. 1242 // When used temporarily "cb_name" is not allocated. The refcounts to either 1243 // the function or the partial are incremented and need to be decremented 1244 // later with free_callback(). 1245 typedef struct { 1246 char_u *cb_name; 1247 partial_T *cb_partial; 1248 int cb_free_name; // cb_name was allocated 1249 } callback_T; 1250 1251 typedef struct jobvar_S job_T; 1252 typedef struct readq_S readq_T; 1253 typedef struct writeq_S writeq_T; 1254 typedef struct jsonq_S jsonq_T; 1255 typedef struct cbq_S cbq_T; 1256 typedef struct channel_S channel_T; 1257 1258 typedef enum 1259 { 1260 VAR_UNKNOWN = 0, 1261 VAR_NUMBER, // "v_number" is used 1262 VAR_STRING, // "v_string" is used 1263 VAR_FUNC, // "v_string" is function name 1264 VAR_PARTIAL, // "v_partial" is used 1265 VAR_LIST, // "v_list" is used 1266 VAR_DICT, // "v_dict" is used 1267 VAR_FLOAT, // "v_float" is used 1268 VAR_SPECIAL, // "v_number" is used 1269 VAR_JOB, // "v_job" is used 1270 VAR_CHANNEL, // "v_channel" is used 1271 VAR_BLOB, // "v_blob" is used 1272 } vartype_T; 1273 1274 /* 1275 * Structure to hold an internal variable without a name. 1276 */ 1277 typedef struct 1278 { 1279 vartype_T v_type; 1280 char v_lock; /* see below: VAR_LOCKED, VAR_FIXED */ 1281 union 1282 { 1283 varnumber_T v_number; /* number value */ 1284 #ifdef FEAT_FLOAT 1285 float_T v_float; /* floating number value */ 1286 #endif 1287 char_u *v_string; /* string value (can be NULL!) */ 1288 list_T *v_list; /* list value (can be NULL!) */ 1289 dict_T *v_dict; /* dict value (can be NULL!) */ 1290 partial_T *v_partial; /* closure: function with args */ 1291 #ifdef FEAT_JOB_CHANNEL 1292 job_T *v_job; /* job value (can be NULL!) */ 1293 channel_T *v_channel; /* channel value (can be NULL!) */ 1294 #endif 1295 blob_T *v_blob; /* blob value (can be NULL!) */ 1296 } vval; 1297 } typval_T; 1298 1299 /* Values for "dv_scope". */ 1300 #define VAR_SCOPE 1 /* a:, v:, s:, etc. scope dictionaries */ 1301 #define VAR_DEF_SCOPE 2 /* l:, g: scope dictionaries: here funcrefs are not 1302 allowed to mask existing functions */ 1303 1304 /* Values for "v_lock". */ 1305 #define VAR_LOCKED 1 /* locked with lock(), can use unlock() */ 1306 #define VAR_FIXED 2 /* locked forever */ 1307 1308 /* 1309 * Structure to hold an item of a list: an internal variable without a name. 1310 */ 1311 typedef struct listitem_S listitem_T; 1312 1313 struct listitem_S 1314 { 1315 listitem_T *li_next; /* next item in list */ 1316 listitem_T *li_prev; /* previous item in list */ 1317 typval_T li_tv; /* type and value of the variable */ 1318 }; 1319 1320 /* 1321 * Struct used by those that are using an item in a list. 1322 */ 1323 typedef struct listwatch_S listwatch_T; 1324 1325 struct listwatch_S 1326 { 1327 listitem_T *lw_item; /* item being watched */ 1328 listwatch_T *lw_next; /* next watcher */ 1329 }; 1330 1331 /* 1332 * Structure to hold info about a list. 1333 * Order of members is optimized to reduce padding. 1334 */ 1335 struct listvar_S 1336 { 1337 listitem_T *lv_first; /* first item, NULL if none */ 1338 listitem_T *lv_last; /* last item, NULL if none */ 1339 listwatch_T *lv_watch; /* first watcher, NULL if none */ 1340 listitem_T *lv_idx_item; /* when not NULL item at index "lv_idx" */ 1341 list_T *lv_copylist; /* copied list used by deepcopy() */ 1342 list_T *lv_used_next; /* next list in used lists list */ 1343 list_T *lv_used_prev; /* previous list in used lists list */ 1344 int lv_refcount; /* reference count */ 1345 int lv_len; /* number of items */ 1346 int lv_idx; /* cached index of an item */ 1347 int lv_copyID; /* ID used by deepcopy() */ 1348 char lv_lock; /* zero, VAR_LOCKED, VAR_FIXED */ 1349 }; 1350 1351 /* 1352 * Static list with 10 items. Use init_static_list() to initialize. 1353 */ 1354 typedef struct { 1355 list_T sl_list; /* must be first */ 1356 listitem_T sl_items[10]; 1357 } staticList10_T; 1358 1359 /* 1360 * Structure to hold an item of a Dictionary. 1361 * Also used for a variable. 1362 * The key is copied into "di_key" to avoid an extra alloc/free for it. 1363 */ 1364 struct dictitem_S 1365 { 1366 typval_T di_tv; /* type and value of the variable */ 1367 char_u di_flags; /* flags (only used for variable) */ 1368 char_u di_key[1]; /* key (actually longer!) */ 1369 }; 1370 typedef struct dictitem_S dictitem_T; 1371 1372 /* A dictitem with a 16 character key (plus NUL). */ 1373 struct dictitem16_S 1374 { 1375 typval_T di_tv; /* type and value of the variable */ 1376 char_u di_flags; /* flags (only used for variable) */ 1377 char_u di_key[17]; /* key */ 1378 }; 1379 typedef struct dictitem16_S dictitem16_T; 1380 1381 #define DI_FLAGS_RO 1 /* "di_flags" value: read-only variable */ 1382 #define DI_FLAGS_RO_SBX 2 /* "di_flags" value: read-only in the sandbox */ 1383 #define DI_FLAGS_FIX 4 /* "di_flags" value: fixed: no :unlet or remove() */ 1384 #define DI_FLAGS_LOCK 8 /* "di_flags" value: locked variable */ 1385 #define DI_FLAGS_ALLOC 16 /* "di_flags" value: separately allocated */ 1386 1387 /* 1388 * Structure to hold info about a Dictionary. 1389 */ 1390 struct dictvar_S 1391 { 1392 char dv_lock; /* zero, VAR_LOCKED, VAR_FIXED */ 1393 char dv_scope; /* zero, VAR_SCOPE, VAR_DEF_SCOPE */ 1394 int dv_refcount; /* reference count */ 1395 int dv_copyID; /* ID used by deepcopy() */ 1396 hashtab_T dv_hashtab; /* hashtab that refers to the items */ 1397 dict_T *dv_copydict; /* copied dict used by deepcopy() */ 1398 dict_T *dv_used_next; /* next dict in used dicts list */ 1399 dict_T *dv_used_prev; /* previous dict in used dicts list */ 1400 }; 1401 1402 /* 1403 * Structure to hold info about a blob. 1404 */ 1405 struct blobvar_S 1406 { 1407 garray_T bv_ga; // growarray with the data 1408 int bv_refcount; // reference count 1409 char bv_lock; // zero, VAR_LOCKED, VAR_FIXED 1410 }; 1411 1412 #if defined(FEAT_EVAL) || defined(PROTO) 1413 typedef struct funccall_S funccall_T; 1414 1415 /* 1416 * Structure to hold info for a user function. 1417 */ 1418 typedef struct 1419 { 1420 int uf_varargs; // variable nr of arguments 1421 int uf_flags; 1422 int uf_calls; // nr of active calls 1423 int uf_cleared; // func_clear() was already called 1424 garray_T uf_args; // arguments 1425 garray_T uf_def_args; // default argument expressions 1426 garray_T uf_lines; // function lines 1427 # ifdef FEAT_PROFILE 1428 int uf_profiling; // TRUE when func is being profiled 1429 int uf_prof_initialized; 1430 // profiling the function as a whole 1431 int uf_tm_count; // nr of calls 1432 proftime_T uf_tm_total; // time spent in function + children 1433 proftime_T uf_tm_self; // time spent in function itself 1434 proftime_T uf_tm_children; // time spent in children this call 1435 // profiling the function per line 1436 int *uf_tml_count; // nr of times line was executed 1437 proftime_T *uf_tml_total; // time spent in a line + children 1438 proftime_T *uf_tml_self; // time spent in a line itself 1439 proftime_T uf_tml_start; // start time for current line 1440 proftime_T uf_tml_children; // time spent in children for this line 1441 proftime_T uf_tml_wait; // start wait time for current line 1442 int uf_tml_idx; // index of line being timed; -1 if none 1443 int uf_tml_execed; // line being timed was executed 1444 # endif 1445 sctx_T uf_script_ctx; // SCTX where function was defined, 1446 // used for s: variables 1447 int uf_refcount; // reference count, see func_name_refcount() 1448 funccall_T *uf_scoped; // l: local variables for closure 1449 char_u uf_name[1]; // name of function (actually longer); can 1450 // start with <SNR>123_ (<SNR> is K_SPECIAL 1451 // KS_EXTRA KE_SNR) 1452 } ufunc_T; 1453 1454 #define MAX_FUNC_ARGS 20 // maximum number of function arguments 1455 #define VAR_SHORT_LEN 20 // short variable name length 1456 #define FIXVAR_CNT 12 // number of fixed variables 1457 1458 /* structure to hold info for a function that is currently being executed. */ 1459 struct funccall_S 1460 { 1461 ufunc_T *func; /* function being called */ 1462 int linenr; /* next line to be executed */ 1463 int returned; /* ":return" used */ 1464 struct /* fixed variables for arguments */ 1465 { 1466 dictitem_T var; /* variable (without room for name) */ 1467 char_u room[VAR_SHORT_LEN]; /* room for the name */ 1468 } fixvar[FIXVAR_CNT]; 1469 dict_T l_vars; /* l: local function variables */ 1470 dictitem_T l_vars_var; /* variable for l: scope */ 1471 dict_T l_avars; /* a: argument variables */ 1472 dictitem_T l_avars_var; /* variable for a: scope */ 1473 list_T l_varlist; /* list for a:000 */ 1474 listitem_T l_listitems[MAX_FUNC_ARGS]; /* listitems for a:000 */ 1475 typval_T *rettv; /* return value */ 1476 linenr_T breakpoint; /* next line with breakpoint or zero */ 1477 int dbg_tick; /* debug_tick when breakpoint was set */ 1478 int level; /* top nesting level of executed function */ 1479 #ifdef FEAT_PROFILE 1480 proftime_T prof_child; /* time spent in a child */ 1481 #endif 1482 funccall_T *caller; /* calling function or NULL */ 1483 1484 /* for closure */ 1485 int fc_refcount; /* number of user functions that reference this 1486 * funccal */ 1487 int fc_copyID; /* for garbage collection */ 1488 garray_T fc_funcs; /* list of ufunc_T* which keep a reference to 1489 * "func" */ 1490 }; 1491 1492 /* 1493 * Struct used by trans_function_name() 1494 */ 1495 typedef struct 1496 { 1497 dict_T *fd_dict; /* Dictionary used */ 1498 char_u *fd_newkey; /* new key in "dict" in allocated memory */ 1499 dictitem_T *fd_di; /* Dictionary item used */ 1500 } funcdict_T; 1501 1502 typedef struct funccal_entry funccal_entry_T; 1503 struct funccal_entry { 1504 void *top_funccal; 1505 funccal_entry_T *next; 1506 }; 1507 1508 #else 1509 /* dummy typedefs for function prototypes */ 1510 typedef struct 1511 { 1512 int dummy; 1513 } ufunc_T; 1514 typedef struct 1515 { 1516 int dummy; 1517 } funcdict_T; 1518 typedef struct 1519 { 1520 int dummy; 1521 } funccal_entry_T; 1522 #endif 1523 1524 struct partial_S 1525 { 1526 int pt_refcount; /* reference count */ 1527 char_u *pt_name; /* function name; when NULL use 1528 * pt_func->uf_name */ 1529 ufunc_T *pt_func; /* function pointer; when NULL lookup function 1530 * with pt_name */ 1531 int pt_auto; /* when TRUE the partial was created for using 1532 dict.member in handle_subscript() */ 1533 int pt_argc; /* number of arguments */ 1534 typval_T *pt_argv; /* arguments in allocated array */ 1535 dict_T *pt_dict; /* dict for "self" */ 1536 }; 1537 1538 /* Information returned by get_tty_info(). */ 1539 typedef struct { 1540 int backspace; /* what the Backspace key produces */ 1541 int enter; /* what the Enter key produces */ 1542 int interrupt; /* interrupt character */ 1543 int nl_does_cr; /* TRUE when a NL is expanded to CR-NL on output */ 1544 } ttyinfo_T; 1545 1546 /* Status of a job. Order matters! */ 1547 typedef enum 1548 { 1549 JOB_FAILED, 1550 JOB_STARTED, 1551 JOB_ENDED, // detected job done 1552 JOB_FINISHED, // job done and cleanup done 1553 } jobstatus_T; 1554 1555 /* 1556 * Structure to hold info about a Job. 1557 */ 1558 struct jobvar_S 1559 { 1560 job_T *jv_next; 1561 job_T *jv_prev; 1562 #ifdef UNIX 1563 pid_t jv_pid; 1564 #endif 1565 #ifdef MSWIN 1566 PROCESS_INFORMATION jv_proc_info; 1567 HANDLE jv_job_object; 1568 #endif 1569 char_u *jv_tty_in; /* controlling tty input, allocated */ 1570 char_u *jv_tty_out; /* controlling tty output, allocated */ 1571 jobstatus_T jv_status; 1572 char_u *jv_stoponexit; /* allocated */ 1573 #ifdef UNIX 1574 char_u *jv_termsig; /* allocated */ 1575 #endif 1576 #ifdef MSWIN 1577 char_u *jv_tty_type; // allocated 1578 #endif 1579 int jv_exitval; 1580 callback_T jv_exit_cb; 1581 1582 buf_T *jv_in_buf; /* buffer from "in-name" */ 1583 1584 int jv_refcount; /* reference count */ 1585 int jv_copyID; 1586 1587 channel_T *jv_channel; /* channel for I/O, reference counted */ 1588 char **jv_argv; /* command line used to start the job */ 1589 }; 1590 1591 /* 1592 * Structures to hold info about a Channel. 1593 */ 1594 struct readq_S 1595 { 1596 char_u *rq_buffer; 1597 long_u rq_buflen; 1598 readq_T *rq_next; 1599 readq_T *rq_prev; 1600 }; 1601 1602 struct writeq_S 1603 { 1604 garray_T wq_ga; 1605 writeq_T *wq_next; 1606 writeq_T *wq_prev; 1607 }; 1608 1609 struct jsonq_S 1610 { 1611 typval_T *jq_value; 1612 jsonq_T *jq_next; 1613 jsonq_T *jq_prev; 1614 int jq_no_callback; /* TRUE when no callback was found */ 1615 }; 1616 1617 struct cbq_S 1618 { 1619 callback_T cq_callback; 1620 int cq_seq_nr; 1621 cbq_T *cq_next; 1622 cbq_T *cq_prev; 1623 }; 1624 1625 /* mode for a channel */ 1626 typedef enum 1627 { 1628 MODE_NL = 0, 1629 MODE_RAW, 1630 MODE_JSON, 1631 MODE_JS, 1632 } ch_mode_T; 1633 1634 typedef enum { 1635 JIO_PIPE, // default 1636 JIO_NULL, 1637 JIO_FILE, 1638 JIO_BUFFER, 1639 JIO_OUT 1640 } job_io_T; 1641 1642 #define CH_PART_FD(part) ch_part[part].ch_fd 1643 1644 /* Ordering matters, it is used in for loops: IN is last, only SOCK/OUT/ERR 1645 * are polled. */ 1646 typedef enum { 1647 PART_SOCK = 0, 1648 #define CH_SOCK_FD CH_PART_FD(PART_SOCK) 1649 #ifdef FEAT_JOB_CHANNEL 1650 PART_OUT, 1651 # define CH_OUT_FD CH_PART_FD(PART_OUT) 1652 PART_ERR, 1653 # define CH_ERR_FD CH_PART_FD(PART_ERR) 1654 PART_IN, 1655 # define CH_IN_FD CH_PART_FD(PART_IN) 1656 #endif 1657 PART_COUNT, 1658 } ch_part_T; 1659 1660 #define INVALID_FD (-1) 1661 1662 /* The per-fd info for a channel. */ 1663 typedef struct { 1664 sock_T ch_fd; /* socket/stdin/stdout/stderr, -1 if not used */ 1665 1666 # if defined(UNIX) && !defined(HAVE_SELECT) 1667 int ch_poll_idx; /* used by channel_poll_setup() */ 1668 # endif 1669 1670 #ifdef FEAT_GUI_X11 1671 XtInputId ch_inputHandler; /* Cookie for input */ 1672 #endif 1673 #ifdef FEAT_GUI_GTK 1674 gint ch_inputHandler; /* Cookie for input */ 1675 #endif 1676 1677 ch_mode_T ch_mode; 1678 job_io_T ch_io; 1679 int ch_timeout; /* request timeout in msec */ 1680 1681 readq_T ch_head; /* header for circular raw read queue */ 1682 jsonq_T ch_json_head; /* header for circular json read queue */ 1683 garray_T ch_block_ids; /* list of IDs that channel_read_json_block() 1684 is waiting for */ 1685 /* When ch_wait_len is non-zero use ch_deadline to wait for incomplete 1686 * message to be complete. The value is the length of the incomplete 1687 * message when the deadline was set. If it gets longer (something was 1688 * received) the deadline is reset. */ 1689 size_t ch_wait_len; 1690 #ifdef MSWIN 1691 DWORD ch_deadline; 1692 #else 1693 struct timeval ch_deadline; 1694 #endif 1695 int ch_block_write; /* for testing: 0 when not used, -1 when write 1696 * does not block, 1 simulate blocking */ 1697 int ch_nonblocking; /* write() is non-blocking */ 1698 writeq_T ch_writeque; /* header for write queue */ 1699 1700 cbq_T ch_cb_head; /* dummy node for per-request callbacks */ 1701 callback_T ch_callback; /* call when a msg is not handled */ 1702 1703 bufref_T ch_bufref; /* buffer to read from or write to */ 1704 int ch_nomodifiable; /* TRUE when buffer can be 'nomodifiable' */ 1705 int ch_nomod_error; /* TRUE when e_modifiable was given */ 1706 int ch_buf_append; /* write appended lines instead top-bot */ 1707 linenr_T ch_buf_top; /* next line to send */ 1708 linenr_T ch_buf_bot; /* last line to send */ 1709 } chanpart_T; 1710 1711 struct channel_S { 1712 channel_T *ch_next; 1713 channel_T *ch_prev; 1714 1715 int ch_id; /* ID of the channel */ 1716 int ch_last_msg_id; /* ID of the last message */ 1717 1718 chanpart_T ch_part[PART_COUNT]; /* info for socket, out, err and in */ 1719 int ch_write_text_mode; /* write buffer lines with CR, not NL */ 1720 1721 char *ch_hostname; /* only for socket, allocated */ 1722 int ch_port; /* only for socket */ 1723 1724 int ch_to_be_closed; /* bitset of readable fds to be closed. 1725 * When all readable fds have been closed, 1726 * set to (1 << PART_COUNT). */ 1727 int ch_to_be_freed; /* When TRUE channel must be freed when it's 1728 * safe to invoke callbacks. */ 1729 int ch_error; /* When TRUE an error was reported. Avoids 1730 * giving pages full of error messages when 1731 * the other side has exited, only mention the 1732 * first error until the connection works 1733 * again. */ 1734 1735 void (*ch_nb_close_cb)(void); 1736 /* callback for Netbeans when channel is 1737 * closed */ 1738 1739 #ifdef MSWIN 1740 int ch_named_pipe; /* using named pipe instead of pty */ 1741 #endif 1742 callback_T ch_callback; /* call when any msg is not handled */ 1743 callback_T ch_close_cb; /* call when channel is closed */ 1744 int ch_drop_never; 1745 int ch_keep_open; /* do not close on read error */ 1746 int ch_nonblock; 1747 1748 job_T *ch_job; // Job that uses this channel; this does not 1749 // count as a reference to avoid a circular 1750 // reference, the job refers to the channel. 1751 int ch_job_killed; // TRUE when there was a job and it was killed 1752 // or we know it died. 1753 int ch_anonymous_pipe; // ConPTY 1754 int ch_killing; // TerminateJobObject() was called 1755 1756 int ch_refcount; // reference count 1757 int ch_copyID; 1758 }; 1759 1760 #define JO_MODE 0x0001 /* channel mode */ 1761 #define JO_IN_MODE 0x0002 /* stdin mode */ 1762 #define JO_OUT_MODE 0x0004 /* stdout mode */ 1763 #define JO_ERR_MODE 0x0008 /* stderr mode */ 1764 #define JO_CALLBACK 0x0010 /* channel callback */ 1765 #define JO_OUT_CALLBACK 0x0020 /* stdout callback */ 1766 #define JO_ERR_CALLBACK 0x0040 /* stderr callback */ 1767 #define JO_CLOSE_CALLBACK 0x0080 /* "close_cb" */ 1768 #define JO_WAITTIME 0x0100 /* only for ch_open() */ 1769 #define JO_TIMEOUT 0x0200 /* all timeouts */ 1770 #define JO_OUT_TIMEOUT 0x0400 /* stdout timeouts */ 1771 #define JO_ERR_TIMEOUT 0x0800 /* stderr timeouts */ 1772 #define JO_PART 0x1000 /* "part" */ 1773 #define JO_ID 0x2000 /* "id" */ 1774 #define JO_STOPONEXIT 0x4000 /* "stoponexit" */ 1775 #define JO_EXIT_CB 0x8000 /* "exit_cb" */ 1776 #define JO_OUT_IO 0x10000 /* "out_io" */ 1777 #define JO_ERR_IO 0x20000 /* "err_io" (JO_OUT_IO << 1) */ 1778 #define JO_IN_IO 0x40000 /* "in_io" (JO_OUT_IO << 2) */ 1779 #define JO_OUT_NAME 0x80000 /* "out_name" */ 1780 #define JO_ERR_NAME 0x100000 /* "err_name" (JO_OUT_NAME << 1) */ 1781 #define JO_IN_NAME 0x200000 /* "in_name" (JO_OUT_NAME << 2) */ 1782 #define JO_IN_TOP 0x400000 /* "in_top" */ 1783 #define JO_IN_BOT 0x800000 /* "in_bot" */ 1784 #define JO_OUT_BUF 0x1000000 /* "out_buf" */ 1785 #define JO_ERR_BUF 0x2000000 /* "err_buf" (JO_OUT_BUF << 1) */ 1786 #define JO_IN_BUF 0x4000000 /* "in_buf" (JO_OUT_BUF << 2) */ 1787 #define JO_CHANNEL 0x8000000 /* "channel" */ 1788 #define JO_BLOCK_WRITE 0x10000000 /* "block_write" */ 1789 #define JO_OUT_MODIFIABLE 0x20000000 /* "out_modifiable" */ 1790 #define JO_ERR_MODIFIABLE 0x40000000 /* "err_modifiable" (JO_OUT_ << 1) */ 1791 #define JO_ALL 0x7fffffff 1792 1793 #define JO2_OUT_MSG 0x0001 /* "out_msg" */ 1794 #define JO2_ERR_MSG 0x0002 /* "err_msg" (JO_OUT_ << 1) */ 1795 #define JO2_TERM_NAME 0x0004 /* "term_name" */ 1796 #define JO2_TERM_FINISH 0x0008 /* "term_finish" */ 1797 #define JO2_ENV 0x0010 /* "env" */ 1798 #define JO2_CWD 0x0020 /* "cwd" */ 1799 #define JO2_TERM_ROWS 0x0040 /* "term_rows" */ 1800 #define JO2_TERM_COLS 0x0080 /* "term_cols" */ 1801 #define JO2_VERTICAL 0x0100 /* "vertical" */ 1802 #define JO2_CURWIN 0x0200 /* "curwin" */ 1803 #define JO2_HIDDEN 0x0400 /* "hidden" */ 1804 #define JO2_TERM_OPENCMD 0x0800 /* "term_opencmd" */ 1805 #define JO2_EOF_CHARS 0x1000 /* "eof_chars" */ 1806 #define JO2_NORESTORE 0x2000 /* "norestore" */ 1807 #define JO2_TERM_KILL 0x4000 /* "term_kill" */ 1808 #define JO2_ANSI_COLORS 0x8000 /* "ansi_colors" */ 1809 #define JO2_TTY_TYPE 0x10000 /* "tty_type" */ 1810 #define JO2_BUFNR 0x20000 /* "bufnr" */ 1811 1812 #define JO_MODE_ALL (JO_MODE + JO_IN_MODE + JO_OUT_MODE + JO_ERR_MODE) 1813 #define JO_CB_ALL \ 1814 (JO_CALLBACK + JO_OUT_CALLBACK + JO_ERR_CALLBACK + JO_CLOSE_CALLBACK) 1815 #define JO_TIMEOUT_ALL (JO_TIMEOUT + JO_OUT_TIMEOUT + JO_ERR_TIMEOUT) 1816 1817 /* 1818 * Options for job and channel commands. 1819 */ 1820 typedef struct 1821 { 1822 int jo_set; /* JO_ bits for values that were set */ 1823 int jo_set2; /* JO2_ bits for values that were set */ 1824 1825 ch_mode_T jo_mode; 1826 ch_mode_T jo_in_mode; 1827 ch_mode_T jo_out_mode; 1828 ch_mode_T jo_err_mode; 1829 int jo_noblock; 1830 1831 job_io_T jo_io[4]; /* PART_OUT, PART_ERR, PART_IN */ 1832 char_u jo_io_name_buf[4][NUMBUFLEN]; 1833 char_u *jo_io_name[4]; /* not allocated! */ 1834 int jo_io_buf[4]; 1835 int jo_pty; 1836 int jo_modifiable[4]; 1837 int jo_message[4]; 1838 channel_T *jo_channel; 1839 1840 linenr_T jo_in_top; 1841 linenr_T jo_in_bot; 1842 1843 callback_T jo_callback; 1844 callback_T jo_out_cb; 1845 callback_T jo_err_cb; 1846 callback_T jo_close_cb; 1847 callback_T jo_exit_cb; 1848 int jo_drop_never; 1849 int jo_waittime; 1850 int jo_timeout; 1851 int jo_out_timeout; 1852 int jo_err_timeout; 1853 int jo_block_write; /* for testing only */ 1854 int jo_part; 1855 int jo_id; 1856 char_u jo_soe_buf[NUMBUFLEN]; 1857 char_u *jo_stoponexit; 1858 dict_T *jo_env; /* environment variables */ 1859 char_u jo_cwd_buf[NUMBUFLEN]; 1860 char_u *jo_cwd; 1861 1862 #ifdef FEAT_TERMINAL 1863 /* when non-zero run the job in a terminal window of this size */ 1864 int jo_term_rows; 1865 int jo_term_cols; 1866 int jo_vertical; 1867 int jo_curwin; 1868 buf_T *jo_bufnr_buf; 1869 int jo_hidden; 1870 int jo_term_norestore; 1871 char_u *jo_term_name; 1872 char_u *jo_term_opencmd; 1873 int jo_term_finish; 1874 char_u *jo_eof_chars; 1875 char_u *jo_term_kill; 1876 # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1877 long_u jo_ansi_colors[16]; 1878 # endif 1879 int jo_tty_type; // first character of "tty_type" 1880 #endif 1881 } jobopt_T; 1882 1883 #ifdef FEAT_EVAL 1884 /* 1885 * Structure used for listeners added with listener_add(). 1886 */ 1887 typedef struct listener_S listener_T; 1888 struct listener_S 1889 { 1890 listener_T *lr_next; 1891 int lr_id; 1892 callback_T lr_callback; 1893 }; 1894 #endif 1895 1896 /* structure used for explicit stack while garbage collecting hash tables */ 1897 typedef struct ht_stack_S 1898 { 1899 hashtab_T *ht; 1900 struct ht_stack_S *prev; 1901 } ht_stack_T; 1902 1903 /* structure used for explicit stack while garbage collecting lists */ 1904 typedef struct list_stack_S 1905 { 1906 list_T *list; 1907 struct list_stack_S *prev; 1908 } list_stack_T; 1909 1910 /* 1911 * Structure used for iterating over dictionary items. 1912 * Initialize with dict_iterate_start(). 1913 */ 1914 typedef struct 1915 { 1916 long_u dit_todo; 1917 hashitem_T *dit_hi; 1918 } dict_iterator_T; 1919 1920 /* values for b_syn_spell: what to do with toplevel text */ 1921 #define SYNSPL_DEFAULT 0 /* spell check if @Spell not defined */ 1922 #define SYNSPL_TOP 1 /* spell check toplevel text */ 1923 #define SYNSPL_NOTOP 2 /* don't spell check toplevel text */ 1924 1925 /* avoid #ifdefs for when b_spell is not available */ 1926 #ifdef FEAT_SPELL 1927 # define B_SPELL(buf) ((buf)->b_spell) 1928 #else 1929 # define B_SPELL(buf) (0) 1930 #endif 1931 1932 #ifdef FEAT_QUICKFIX 1933 typedef struct qf_info_S qf_info_T; 1934 #endif 1935 1936 #ifdef FEAT_PROFILE 1937 /* 1938 * Used for :syntime: timing of executing a syntax pattern. 1939 */ 1940 typedef struct { 1941 proftime_T total; /* total time used */ 1942 proftime_T slowest; /* time of slowest call */ 1943 long count; /* nr of times used */ 1944 long match; /* nr of times matched */ 1945 } syn_time_T; 1946 #endif 1947 1948 typedef struct timer_S timer_T; 1949 struct timer_S 1950 { 1951 long tr_id; 1952 #ifdef FEAT_TIMERS 1953 timer_T *tr_next; 1954 timer_T *tr_prev; 1955 proftime_T tr_due; // when the callback is to be invoked 1956 char tr_firing; // when TRUE callback is being called 1957 char tr_paused; // when TRUE callback is not invoked 1958 int tr_repeat; // number of times to repeat, -1 forever 1959 long tr_interval; // msec 1960 callback_T tr_callback; 1961 int tr_emsg_count; 1962 #endif 1963 }; 1964 1965 #ifdef FEAT_CRYPT 1966 /* 1967 * Structure to hold the type of encryption and the state of encryption or 1968 * decryption. 1969 */ 1970 typedef struct { 1971 int method_nr; 1972 void *method_state; /* method-specific state information */ 1973 } cryptstate_T; 1974 1975 /* values for method_nr */ 1976 # define CRYPT_M_ZIP 0 1977 # define CRYPT_M_BF 1 1978 # define CRYPT_M_BF2 2 1979 # define CRYPT_M_COUNT 3 /* number of crypt methods */ 1980 1981 // Currently all crypt methods work inplace. If one is added that isn't then 1982 // define this. 1983 // # define CRYPT_NOT_INPLACE 1 1984 #endif 1985 1986 #ifdef FEAT_TEXT_PROP 1987 typedef enum { 1988 POPPOS_BOTLEFT, 1989 POPPOS_TOPLEFT, 1990 POPPOS_BOTRIGHT, 1991 POPPOS_TOPRIGHT, 1992 POPPOS_CENTER 1993 } poppos_T; 1994 1995 # define POPUPWIN_DEFAULT_ZINDEX 50 1996 # define POPUPMENU_ZINDEX 100 1997 #endif 1998 1999 /* 2000 * These are items normally related to a buffer. But when using ":ownsyntax" 2001 * a window may have its own instance. 2002 */ 2003 typedef struct { 2004 #ifdef FEAT_SYN_HL 2005 hashtab_T b_keywtab; /* syntax keywords hash table */ 2006 hashtab_T b_keywtab_ic; /* idem, ignore case */ 2007 int b_syn_error; /* TRUE when error occurred in HL */ 2008 # ifdef FEAT_RELTIME 2009 int b_syn_slow; /* TRUE when 'redrawtime' reached */ 2010 # endif 2011 int b_syn_ic; /* ignore case for :syn cmds */ 2012 int b_syn_spell; /* SYNSPL_ values */ 2013 garray_T b_syn_patterns; /* table for syntax patterns */ 2014 garray_T b_syn_clusters; /* table for syntax clusters */ 2015 int b_spell_cluster_id; /* @Spell cluster ID or 0 */ 2016 int b_nospell_cluster_id; /* @NoSpell cluster ID or 0 */ 2017 int b_syn_containedin; /* TRUE when there is an item with a 2018 "containedin" argument */ 2019 int b_syn_sync_flags; /* flags about how to sync */ 2020 short b_syn_sync_id; /* group to sync on */ 2021 long b_syn_sync_minlines; /* minimal sync lines offset */ 2022 long b_syn_sync_maxlines; /* maximal sync lines offset */ 2023 long b_syn_sync_linebreaks; /* offset for multi-line pattern */ 2024 char_u *b_syn_linecont_pat; /* line continuation pattern */ 2025 regprog_T *b_syn_linecont_prog; /* line continuation program */ 2026 #ifdef FEAT_PROFILE 2027 syn_time_T b_syn_linecont_time; 2028 #endif 2029 int b_syn_linecont_ic; /* ignore-case flag for above */ 2030 int b_syn_topgrp; /* for ":syntax include" */ 2031 # ifdef FEAT_CONCEAL 2032 int b_syn_conceal; /* auto-conceal for :syn cmds */ 2033 # endif 2034 # ifdef FEAT_FOLDING 2035 int b_syn_folditems; /* number of patterns with the HL_FOLD 2036 flag set */ 2037 # endif 2038 /* 2039 * b_sst_array[] contains the state stack for a number of lines, for the 2040 * start of that line (col == 0). This avoids having to recompute the 2041 * syntax state too often. 2042 * b_sst_array[] is allocated to hold the state for all displayed lines, 2043 * and states for 1 out of about 20 other lines. 2044 * b_sst_array pointer to an array of synstate_T 2045 * b_sst_len number of entries in b_sst_array[] 2046 * b_sst_first pointer to first used entry in b_sst_array[] or NULL 2047 * b_sst_firstfree pointer to first free entry in b_sst_array[] or NULL 2048 * b_sst_freecount number of free entries in b_sst_array[] 2049 * b_sst_check_lnum entries after this lnum need to be checked for 2050 * validity (MAXLNUM means no check needed) 2051 */ 2052 synstate_T *b_sst_array; 2053 int b_sst_len; 2054 synstate_T *b_sst_first; 2055 synstate_T *b_sst_firstfree; 2056 int b_sst_freecount; 2057 linenr_T b_sst_check_lnum; 2058 short_u b_sst_lasttick; /* last display tick */ 2059 #endif /* FEAT_SYN_HL */ 2060 2061 #ifdef FEAT_SPELL 2062 /* for spell checking */ 2063 garray_T b_langp; /* list of pointers to slang_T, see spell.c */ 2064 char_u b_spell_ismw[256];/* flags: is midword char */ 2065 char_u *b_spell_ismw_mb; /* multi-byte midword chars */ 2066 char_u *b_p_spc; /* 'spellcapcheck' */ 2067 regprog_T *b_cap_prog; /* program for 'spellcapcheck' */ 2068 char_u *b_p_spf; /* 'spellfile' */ 2069 char_u *b_p_spl; /* 'spelllang' */ 2070 int b_cjk; /* all CJK letters as OK */ 2071 #endif 2072 #if !defined(FEAT_SYN_HL) && !defined(FEAT_SPELL) 2073 int dummy; 2074 #endif 2075 char_u b_syn_chartab[32]; /* syntax iskeyword option */ 2076 char_u *b_syn_isk; /* iskeyword option */ 2077 } synblock_T; 2078 2079 2080 /* 2081 * buffer: structure that holds information about one file 2082 * 2083 * Several windows can share a single Buffer 2084 * A buffer is unallocated if there is no memfile for it. 2085 * A buffer is new if the associated file has never been loaded yet. 2086 */ 2087 2088 struct file_buffer 2089 { 2090 memline_T b_ml; /* associated memline (also contains line 2091 count) */ 2092 2093 buf_T *b_next; /* links in list of buffers */ 2094 buf_T *b_prev; 2095 2096 int b_nwindows; /* nr of windows open on this buffer */ 2097 2098 int b_flags; /* various BF_ flags */ 2099 int b_locked; /* Buffer is being closed or referenced, don't 2100 let autocommands wipe it out. */ 2101 2102 /* 2103 * b_ffname has the full path of the file (NULL for no name). 2104 * b_sfname is the name as the user typed it (or NULL). 2105 * b_fname is the same as b_sfname, unless ":cd" has been done, 2106 * then it is the same as b_ffname (NULL for no name). 2107 */ 2108 char_u *b_ffname; // full path file name, allocated 2109 char_u *b_sfname; // short file name, allocated, may be equal to 2110 // b_ffname 2111 char_u *b_fname; // current file name, points to b_ffname or 2112 // b_sfname 2113 2114 #ifdef UNIX 2115 int b_dev_valid; /* TRUE when b_dev has a valid number */ 2116 dev_t b_dev; /* device number */ 2117 ino_t b_ino; /* inode number */ 2118 #endif 2119 #ifdef FEAT_CW_EDITOR 2120 FSSpec b_FSSpec; /* MacOS File Identification */ 2121 #endif 2122 #ifdef VMS 2123 char b_fab_rfm; /* Record format */ 2124 char b_fab_rat; /* Record attribute */ 2125 unsigned int b_fab_mrs; /* Max record size */ 2126 #endif 2127 int b_fnum; /* buffer number for this file. */ 2128 char_u b_key[VIM_SIZEOF_INT * 2 + 1]; 2129 /* key used for buf_hashtab, holds b_fnum as 2130 hex string */ 2131 2132 int b_changed; /* 'modified': Set to TRUE if something in the 2133 file has been changed and not written out. */ 2134 dictitem16_T b_ct_di; /* holds the b:changedtick value in 2135 b_ct_di.di_tv.vval.v_number; 2136 incremented for each change, also for undo */ 2137 #define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number) 2138 2139 varnumber_T b_last_changedtick; /* b:changedtick when TextChanged or 2140 TextChangedI was last triggered. */ 2141 #ifdef FEAT_INS_EXPAND 2142 varnumber_T b_last_changedtick_pum; /* b:changedtick when TextChangedP was 2143 last triggered. */ 2144 #endif 2145 2146 int b_saving; /* Set to TRUE if we are in the middle of 2147 saving the buffer. */ 2148 2149 /* 2150 * Changes to a buffer require updating of the display. To minimize the 2151 * work, remember changes made and update everything at once. 2152 */ 2153 int b_mod_set; /* TRUE when there are changes since the last 2154 time the display was updated */ 2155 linenr_T b_mod_top; /* topmost lnum that was changed */ 2156 linenr_T b_mod_bot; /* lnum below last changed line, AFTER the 2157 change */ 2158 long b_mod_xlines; /* number of extra buffer lines inserted; 2159 negative when lines were deleted */ 2160 2161 wininfo_T *b_wininfo; /* list of last used info for each window */ 2162 2163 long b_mtime; /* last change time of original file */ 2164 long b_mtime_read; /* last change time when reading */ 2165 off_T b_orig_size; /* size of original file in bytes */ 2166 int b_orig_mode; /* mode of original file */ 2167 #ifdef FEAT_VIMINFO 2168 time_T b_last_used; /* time when the buffer was last used; used 2169 * for viminfo */ 2170 #endif 2171 2172 pos_T b_namedm[NMARKS]; /* current named marks (mark.c) */ 2173 2174 /* These variables are set when VIsual_active becomes FALSE */ 2175 visualinfo_T b_visual; 2176 #ifdef FEAT_EVAL 2177 int b_visual_mode_eval; /* b_visual.vi_mode for visualmode() */ 2178 #endif 2179 2180 pos_T b_last_cursor; /* cursor position when last unloading this 2181 buffer */ 2182 pos_T b_last_insert; /* where Insert mode was left */ 2183 pos_T b_last_change; /* position of last change: '. mark */ 2184 2185 #ifdef FEAT_JUMPLIST 2186 /* 2187 * the changelist contains old change positions 2188 */ 2189 pos_T b_changelist[JUMPLISTSIZE]; 2190 int b_changelistlen; /* number of active entries */ 2191 int b_new_change; /* set by u_savecommon() */ 2192 #endif 2193 2194 /* 2195 * Character table, only used in charset.c for 'iskeyword' 2196 * 32 bytes of 8 bits: 1 bit per character 0-255. 2197 */ 2198 char_u b_chartab[32]; 2199 2200 #ifdef FEAT_LOCALMAP 2201 /* Table used for mappings local to a buffer. */ 2202 mapblock_T *(b_maphash[256]); 2203 2204 /* First abbreviation local to a buffer. */ 2205 mapblock_T *b_first_abbr; 2206 #endif 2207 // User commands local to the buffer. 2208 garray_T b_ucmds; 2209 /* 2210 * start and end of an operator, also used for '[ and '] 2211 */ 2212 pos_T b_op_start; 2213 pos_T b_op_start_orig; /* used for Insstart_orig */ 2214 pos_T b_op_end; 2215 2216 #ifdef FEAT_VIMINFO 2217 int b_marks_read; /* Have we read viminfo marks yet? */ 2218 #endif 2219 2220 /* 2221 * The following only used in undo.c. 2222 */ 2223 u_header_T *b_u_oldhead; /* pointer to oldest header */ 2224 u_header_T *b_u_newhead; /* pointer to newest header; may not be valid 2225 if b_u_curhead is not NULL */ 2226 u_header_T *b_u_curhead; /* pointer to current header */ 2227 int b_u_numhead; /* current number of headers */ 2228 int b_u_synced; /* entry lists are synced */ 2229 long b_u_seq_last; /* last used undo sequence number */ 2230 long b_u_save_nr_last; /* counter for last file write */ 2231 long b_u_seq_cur; /* hu_seq of header below which we are now */ 2232 time_T b_u_time_cur; /* uh_time of header below which we are now */ 2233 long b_u_save_nr_cur; /* file write nr after which we are now */ 2234 2235 /* 2236 * variables for "U" command in undo.c 2237 */ 2238 undoline_T b_u_line_ptr; /* saved line for "U" command */ 2239 linenr_T b_u_line_lnum; /* line number of line in u_line */ 2240 colnr_T b_u_line_colnr; /* optional column number */ 2241 2242 #ifdef FEAT_INS_EXPAND 2243 int b_scanned; /* ^N/^P have scanned this buffer */ 2244 #endif 2245 2246 /* flags for use of ":lmap" and IM control */ 2247 long b_p_iminsert; /* input mode for insert */ 2248 long b_p_imsearch; /* input mode for search */ 2249 #define B_IMODE_USE_INSERT -1 /* Use b_p_iminsert value for search */ 2250 #define B_IMODE_NONE 0 /* Input via none */ 2251 #define B_IMODE_LMAP 1 /* Input via langmap */ 2252 #define B_IMODE_IM 2 /* Input via input method */ 2253 #define B_IMODE_LAST 2 2254 2255 #ifdef FEAT_KEYMAP 2256 short b_kmap_state; /* using "lmap" mappings */ 2257 # define KEYMAP_INIT 1 /* 'keymap' was set, call keymap_init() */ 2258 # define KEYMAP_LOADED 2 /* 'keymap' mappings have been loaded */ 2259 garray_T b_kmap_ga; /* the keymap table */ 2260 #endif 2261 2262 /* 2263 * Options local to a buffer. 2264 * They are here because their value depends on the type of file 2265 * or contents of the file being edited. 2266 */ 2267 int b_p_initialized; /* set when options initialized */ 2268 2269 #ifdef FEAT_EVAL 2270 sctx_T b_p_script_ctx[BV_COUNT]; /* SCTXs for buffer-local options */ 2271 #endif 2272 2273 int b_p_ai; /* 'autoindent' */ 2274 int b_p_ai_nopaste; /* b_p_ai saved for paste mode */ 2275 char_u *b_p_bkc; /* 'backupcopy' */ 2276 unsigned b_bkc_flags; /* flags for 'backupcopy' */ 2277 int b_p_ci; /* 'copyindent' */ 2278 int b_p_bin; /* 'binary' */ 2279 int b_p_bomb; /* 'bomb' */ 2280 char_u *b_p_bh; /* 'bufhidden' */ 2281 char_u *b_p_bt; /* 'buftype' */ 2282 #ifdef FEAT_QUICKFIX 2283 #define BUF_HAS_QF_ENTRY 1 2284 #define BUF_HAS_LL_ENTRY 2 2285 int b_has_qf_entry; 2286 #endif 2287 int b_p_bl; /* 'buflisted' */ 2288 #ifdef FEAT_CINDENT 2289 int b_p_cin; /* 'cindent' */ 2290 char_u *b_p_cino; /* 'cinoptions' */ 2291 char_u *b_p_cink; /* 'cinkeys' */ 2292 #endif 2293 #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT) 2294 char_u *b_p_cinw; /* 'cinwords' */ 2295 #endif 2296 #ifdef FEAT_COMMENTS 2297 char_u *b_p_com; /* 'comments' */ 2298 #endif 2299 #ifdef FEAT_FOLDING 2300 char_u *b_p_cms; /* 'commentstring' */ 2301 #endif 2302 #ifdef FEAT_INS_EXPAND 2303 char_u *b_p_cpt; /* 'complete' */ 2304 #endif 2305 #ifdef FEAT_COMPL_FUNC 2306 char_u *b_p_cfu; /* 'completefunc' */ 2307 char_u *b_p_ofu; /* 'omnifunc' */ 2308 #endif 2309 #ifdef FEAT_EVAL 2310 char_u *b_p_tfu; /* 'tagfunc' */ 2311 #endif 2312 int b_p_eol; /* 'endofline' */ 2313 int b_p_fixeol; /* 'fixendofline' */ 2314 int b_p_et; /* 'expandtab' */ 2315 int b_p_et_nobin; /* b_p_et saved for binary mode */ 2316 int b_p_et_nopaste; /* b_p_et saved for paste mode */ 2317 char_u *b_p_fenc; /* 'fileencoding' */ 2318 char_u *b_p_ff; /* 'fileformat' */ 2319 char_u *b_p_ft; /* 'filetype' */ 2320 char_u *b_p_fo; /* 'formatoptions' */ 2321 char_u *b_p_flp; /* 'formatlistpat' */ 2322 int b_p_inf; /* 'infercase' */ 2323 char_u *b_p_isk; /* 'iskeyword' */ 2324 #ifdef FEAT_FIND_ID 2325 char_u *b_p_def; /* 'define' local value */ 2326 char_u *b_p_inc; /* 'include' */ 2327 # ifdef FEAT_EVAL 2328 char_u *b_p_inex; /* 'includeexpr' */ 2329 long_u b_p_inex_flags; /* flags for 'includeexpr' */ 2330 # endif 2331 #endif 2332 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) 2333 char_u *b_p_inde; /* 'indentexpr' */ 2334 long_u b_p_inde_flags; /* flags for 'indentexpr' */ 2335 char_u *b_p_indk; /* 'indentkeys' */ 2336 #endif 2337 char_u *b_p_fp; /* 'formatprg' */ 2338 #if defined(FEAT_EVAL) 2339 char_u *b_p_fex; /* 'formatexpr' */ 2340 long_u b_p_fex_flags; /* flags for 'formatexpr' */ 2341 #endif 2342 #ifdef FEAT_CRYPT 2343 char_u *b_p_key; /* 'key' */ 2344 #endif 2345 char_u *b_p_kp; /* 'keywordprg' */ 2346 #ifdef FEAT_LISP 2347 int b_p_lisp; /* 'lisp' */ 2348 #endif 2349 char_u *b_p_menc; /* 'makeencoding' */ 2350 char_u *b_p_mps; /* 'matchpairs' */ 2351 int b_p_ml; /* 'modeline' */ 2352 int b_p_ml_nobin; /* b_p_ml saved for binary mode */ 2353 int b_p_ma; /* 'modifiable' */ 2354 char_u *b_p_nf; /* 'nrformats' */ 2355 int b_p_pi; /* 'preserveindent' */ 2356 #ifdef FEAT_TEXTOBJ 2357 char_u *b_p_qe; /* 'quoteescape' */ 2358 #endif 2359 int b_p_ro; /* 'readonly' */ 2360 long b_p_sw; /* 'shiftwidth' */ 2361 int b_p_sn; /* 'shortname' */ 2362 #ifdef FEAT_SMARTINDENT 2363 int b_p_si; /* 'smartindent' */ 2364 #endif 2365 long b_p_sts; /* 'softtabstop' */ 2366 long b_p_sts_nopaste; /* b_p_sts saved for paste mode */ 2367 #ifdef FEAT_SEARCHPATH 2368 char_u *b_p_sua; /* 'suffixesadd' */ 2369 #endif 2370 int b_p_swf; /* 'swapfile' */ 2371 #ifdef FEAT_SYN_HL 2372 long b_p_smc; /* 'synmaxcol' */ 2373 char_u *b_p_syn; /* 'syntax' */ 2374 #endif 2375 long b_p_ts; /* 'tabstop' */ 2376 int b_p_tx; /* 'textmode' */ 2377 long b_p_tw; /* 'textwidth' */ 2378 long b_p_tw_nobin; /* b_p_tw saved for binary mode */ 2379 long b_p_tw_nopaste; /* b_p_tw saved for paste mode */ 2380 long b_p_wm; /* 'wrapmargin' */ 2381 long b_p_wm_nobin; /* b_p_wm saved for binary mode */ 2382 long b_p_wm_nopaste; /* b_p_wm saved for paste mode */ 2383 #ifdef FEAT_VARTABS 2384 char_u *b_p_vsts; /* 'varsofttabstop' */ 2385 int *b_p_vsts_array; /* 'varsofttabstop' in internal format */ 2386 char_u *b_p_vsts_nopaste; /* b_p_vsts saved for paste mode */ 2387 char_u *b_p_vts; /* 'vartabstop' */ 2388 int *b_p_vts_array; /* 'vartabstop' in internal format */ 2389 #endif 2390 #ifdef FEAT_KEYMAP 2391 char_u *b_p_keymap; /* 'keymap' */ 2392 #endif 2393 2394 /* local values for options which are normally global */ 2395 #ifdef FEAT_QUICKFIX 2396 char_u *b_p_gp; /* 'grepprg' local value */ 2397 char_u *b_p_mp; /* 'makeprg' local value */ 2398 char_u *b_p_efm; /* 'errorformat' local value */ 2399 #endif 2400 char_u *b_p_ep; /* 'equalprg' local value */ 2401 char_u *b_p_path; /* 'path' local value */ 2402 int b_p_ar; /* 'autoread' local value */ 2403 char_u *b_p_tags; /* 'tags' local value */ 2404 char_u *b_p_tc; /* 'tagcase' local value */ 2405 unsigned b_tc_flags; /* flags for 'tagcase' */ 2406 #ifdef FEAT_INS_EXPAND 2407 char_u *b_p_dict; /* 'dictionary' local value */ 2408 char_u *b_p_tsr; /* 'thesaurus' local value */ 2409 #endif 2410 long b_p_ul; /* 'undolevels' local value */ 2411 #ifdef FEAT_PERSISTENT_UNDO 2412 int b_p_udf; /* 'undofile' */ 2413 #endif 2414 #ifdef FEAT_LISP 2415 char_u *b_p_lw; /* 'lispwords' local value */ 2416 #endif 2417 #ifdef FEAT_TERMINAL 2418 long b_p_twsl; /* 'termwinscroll' */ 2419 #endif 2420 2421 /* end of buffer options */ 2422 2423 #ifdef FEAT_CINDENT 2424 /* values set from b_p_cino */ 2425 int b_ind_level; 2426 int b_ind_open_imag; 2427 int b_ind_no_brace; 2428 int b_ind_first_open; 2429 int b_ind_open_extra; 2430 int b_ind_close_extra; 2431 int b_ind_open_left_imag; 2432 int b_ind_jump_label; 2433 int b_ind_case; 2434 int b_ind_case_code; 2435 int b_ind_case_break; 2436 int b_ind_param; 2437 int b_ind_func_type; 2438 int b_ind_comment; 2439 int b_ind_in_comment; 2440 int b_ind_in_comment2; 2441 int b_ind_cpp_baseclass; 2442 int b_ind_continuation; 2443 int b_ind_unclosed; 2444 int b_ind_unclosed2; 2445 int b_ind_unclosed_noignore; 2446 int b_ind_unclosed_wrapped; 2447 int b_ind_unclosed_whiteok; 2448 int b_ind_matching_paren; 2449 int b_ind_paren_prev; 2450 int b_ind_maxparen; 2451 int b_ind_maxcomment; 2452 int b_ind_scopedecl; 2453 int b_ind_scopedecl_code; 2454 int b_ind_java; 2455 int b_ind_js; 2456 int b_ind_keep_case_label; 2457 int b_ind_hash_comment; 2458 int b_ind_cpp_namespace; 2459 int b_ind_if_for_while; 2460 int b_ind_cpp_extern_c; 2461 #endif 2462 2463 linenr_T b_no_eol_lnum; /* non-zero lnum when last line of next binary 2464 * write should not have an end-of-line */ 2465 2466 int b_start_eol; /* last line had eol when it was read */ 2467 int b_start_ffc; /* first char of 'ff' when edit started */ 2468 char_u *b_start_fenc; /* 'fileencoding' when edit started or NULL */ 2469 int b_bad_char; /* "++bad=" argument when edit started or 0 */ 2470 int b_start_bomb; /* 'bomb' when it was read */ 2471 2472 #ifdef FEAT_EVAL 2473 dictitem_T b_bufvar; /* variable for "b:" Dictionary */ 2474 dict_T *b_vars; /* internal variables, local to buffer */ 2475 2476 listener_T *b_listener; 2477 list_T *b_recorded_changes; 2478 #endif 2479 #ifdef FEAT_TEXT_PROP 2480 int b_has_textprop; // TRUE when text props were added 2481 hashtab_T *b_proptypes; // text property types local to buffer 2482 #endif 2483 2484 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) 2485 char_u *b_p_bexpr; /* 'balloonexpr' local value */ 2486 long_u b_p_bexpr_flags;/* flags for 'balloonexpr' */ 2487 #endif 2488 #ifdef FEAT_CRYPT 2489 char_u *b_p_cm; /* 'cryptmethod' */ 2490 #endif 2491 2492 /* When a buffer is created, it starts without a swap file. b_may_swap is 2493 * then set to indicate that a swap file may be opened later. It is reset 2494 * if a swap file could not be opened. 2495 */ 2496 int b_may_swap; 2497 int b_did_warn; /* Set to 1 if user has been warned on first 2498 change of a read-only file */ 2499 2500 /* Two special kinds of buffers: 2501 * help buffer - used for help files, won't use a swap file. 2502 * spell buffer - used for spell info, never displayed and doesn't have a 2503 * file name. 2504 */ 2505 int b_help; /* TRUE for help file buffer (when set b_p_bt 2506 is "help") */ 2507 #ifdef FEAT_SPELL 2508 int b_spell; /* TRUE for a spell file buffer, most fields 2509 are not used! Use the B_SPELL macro to 2510 access b_spell without #ifdef. */ 2511 #endif 2512 2513 int b_shortname; /* this file has an 8.3 file name */ 2514 2515 #ifdef FEAT_JOB_CHANNEL 2516 char_u *b_prompt_text; // set by prompt_setprompt() 2517 callback_T b_prompt_callback; // set by prompt_setcallback() 2518 callback_T b_prompt_interrupt; // set by prompt_setinterrupt() 2519 int b_prompt_insert; // value for restart_edit when entering 2520 // a prompt buffer window. 2521 #endif 2522 #ifdef FEAT_MZSCHEME 2523 void *b_mzscheme_ref; /* The MzScheme reference to this buffer */ 2524 #endif 2525 2526 #ifdef FEAT_PERL 2527 void *b_perl_private; 2528 #endif 2529 2530 #ifdef FEAT_PYTHON 2531 void *b_python_ref; /* The Python reference to this buffer */ 2532 #endif 2533 2534 #ifdef FEAT_PYTHON3 2535 void *b_python3_ref; /* The Python3 reference to this buffer */ 2536 #endif 2537 2538 #ifdef FEAT_TCL 2539 void *b_tcl_ref; 2540 #endif 2541 2542 #ifdef FEAT_RUBY 2543 void *b_ruby_ref; 2544 #endif 2545 2546 #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) 2547 synblock_T b_s; /* Info related to syntax highlighting. w_s 2548 * normally points to this, but some windows 2549 * may use a different synblock_T. */ 2550 #endif 2551 2552 #ifdef FEAT_SIGNS 2553 signlist_T *b_signlist; /* list of signs to draw */ 2554 # ifdef FEAT_NETBEANS_INTG 2555 int b_has_sign_column; /* Flag that is set when a first sign is 2556 * added and remains set until the end of 2557 * the netbeans session. */ 2558 # endif 2559 #endif 2560 2561 #ifdef FEAT_NETBEANS_INTG 2562 int b_netbeans_file; /* TRUE when buffer is owned by NetBeans */ 2563 int b_was_netbeans_file;/* TRUE if b_netbeans_file was once set */ 2564 #endif 2565 #ifdef FEAT_JOB_CHANNEL 2566 int b_write_to_channel; /* TRUE when appended lines are written to 2567 * a channel. */ 2568 #endif 2569 2570 #ifdef FEAT_CRYPT 2571 cryptstate_T *b_cryptstate; /* Encryption state while reading or writing 2572 * the file. NULL when not using encryption. */ 2573 #endif 2574 int b_mapped_ctrl_c; /* modes where CTRL-C is mapped */ 2575 2576 #ifdef FEAT_TERMINAL 2577 term_T *b_term; /* When not NULL this buffer is for a terminal 2578 * window. */ 2579 #endif 2580 #ifdef FEAT_DIFF 2581 int b_diff_failed; // internal diff failed for this buffer 2582 #endif 2583 }; /* file_buffer */ 2584 2585 2586 #ifdef FEAT_DIFF 2587 /* 2588 * Stuff for diff mode. 2589 */ 2590 # define DB_COUNT 8 /* up to eight buffers can be diff'ed */ 2591 2592 /* 2593 * Each diffblock defines where a block of lines starts in each of the buffers 2594 * and how many lines it occupies in that buffer. When the lines are missing 2595 * in the buffer the df_count[] is zero. This is all counted in 2596 * buffer lines. 2597 * There is always at least one unchanged line in between the diffs. 2598 * Otherwise it would have been included in the diff above or below it. 2599 * df_lnum[] + df_count[] is the lnum below the change. When in one buffer 2600 * lines have been inserted, in the other buffer df_lnum[] is the line below 2601 * the insertion and df_count[] is zero. When appending lines at the end of 2602 * the buffer, df_lnum[] is one beyond the end! 2603 * This is using a linked list, because the number of differences is expected 2604 * to be reasonable small. The list is sorted on lnum. 2605 */ 2606 typedef struct diffblock_S diff_T; 2607 struct diffblock_S 2608 { 2609 diff_T *df_next; 2610 linenr_T df_lnum[DB_COUNT]; /* line number in buffer */ 2611 linenr_T df_count[DB_COUNT]; /* nr of inserted/changed lines */ 2612 }; 2613 #endif 2614 2615 #define SNAP_HELP_IDX 0 2616 #define SNAP_AUCMD_IDX 1 2617 #define SNAP_COUNT 2 2618 2619 /* 2620 * Tab pages point to the top frame of each tab page. 2621 * Note: Most values are NOT valid for the current tab page! Use "curwin", 2622 * "firstwin", etc. for that. "tp_topframe" is always valid and can be 2623 * compared against "topframe" to find the current tab page. 2624 */ 2625 typedef struct tabpage_S tabpage_T; 2626 struct tabpage_S 2627 { 2628 tabpage_T *tp_next; // next tabpage or NULL 2629 frame_T *tp_topframe; // topframe for the windows 2630 win_T *tp_curwin; // current window in this Tab page 2631 win_T *tp_prevwin; // previous window in this Tab page 2632 win_T *tp_firstwin; // first window in this Tab page 2633 win_T *tp_lastwin; // last window in this Tab page 2634 #ifdef FEAT_TEXT_PROP 2635 win_T *tp_first_popupwin; // first popup window in this Tab page 2636 #endif 2637 long tp_old_Rows; // Rows when Tab page was left 2638 long tp_old_Columns; // Columns when Tab page was left 2639 long tp_ch_used; // value of 'cmdheight' when frame size 2640 // was set 2641 #ifdef FEAT_GUI 2642 int tp_prev_which_scrollbars[3]; 2643 // previous value of which_scrollbars 2644 #endif 2645 2646 char_u *tp_localdir; // absolute path of local directory or 2647 // NULL 2648 #ifdef FEAT_DIFF 2649 diff_T *tp_first_diff; 2650 buf_T *(tp_diffbuf[DB_COUNT]); 2651 int tp_diff_invalid; // list of diffs is outdated 2652 int tp_diff_update; // update diffs before redrawing 2653 #endif 2654 frame_T *(tp_snapshot[SNAP_COUNT]); // window layout snapshots 2655 #ifdef FEAT_EVAL 2656 dictitem_T tp_winvar; // variable for "t:" Dictionary 2657 dict_T *tp_vars; // internal variables, local to tab page 2658 #endif 2659 2660 #ifdef FEAT_PYTHON 2661 void *tp_python_ref; // The Python value for this tab page 2662 #endif 2663 2664 #ifdef FEAT_PYTHON3 2665 void *tp_python3_ref; // The Python value for this tab page 2666 #endif 2667 }; 2668 2669 /* 2670 * Structure to cache info for displayed lines in w_lines[]. 2671 * Each logical line has one entry. 2672 * The entry tells how the logical line is currently displayed in the window. 2673 * This is updated when displaying the window. 2674 * When the display is changed (e.g., when clearing the screen) w_lines_valid 2675 * is changed to exclude invalid entries. 2676 * When making changes to the buffer, wl_valid is reset to indicate wl_size 2677 * may not reflect what is actually in the buffer. When wl_valid is FALSE, 2678 * the entries can only be used to count the number of displayed lines used. 2679 * wl_lnum and wl_lastlnum are invalid too. 2680 */ 2681 typedef struct w_line 2682 { 2683 linenr_T wl_lnum; /* buffer line number for logical line */ 2684 short_u wl_size; /* height in screen lines */ 2685 char wl_valid; /* TRUE values are valid for text in buffer */ 2686 #ifdef FEAT_FOLDING 2687 char wl_folded; /* TRUE when this is a range of folded lines */ 2688 linenr_T wl_lastlnum; /* last buffer line number for logical line */ 2689 #endif 2690 } wline_T; 2691 2692 /* 2693 * Windows are kept in a tree of frames. Each frame has a column (FR_COL) 2694 * or row (FR_ROW) layout or is a leaf, which has a window. 2695 */ 2696 struct frame_S 2697 { 2698 char fr_layout; // FR_LEAF, FR_COL or FR_ROW 2699 int fr_width; 2700 int fr_newwidth; // new width used in win_equal_rec() 2701 int fr_height; 2702 int fr_newheight; // new height used in win_equal_rec() 2703 frame_T *fr_parent; // containing frame or NULL 2704 frame_T *fr_next; // frame right or below in same parent, NULL 2705 // for last 2706 frame_T *fr_prev; // frame left or above in same parent, NULL 2707 // for first 2708 // fr_child and fr_win are mutually exclusive 2709 frame_T *fr_child; // first contained frame 2710 win_T *fr_win; // window that fills this frame 2711 }; 2712 2713 #define FR_LEAF 0 /* frame is a leaf */ 2714 #define FR_ROW 1 /* frame with a row of windows */ 2715 #define FR_COL 2 /* frame with a column of windows */ 2716 2717 /* 2718 * Struct used for highlighting 'hlsearch' matches, matches defined by 2719 * ":match" and matches defined by match functions. 2720 * For 'hlsearch' there is one pattern for all windows. For ":match" and the 2721 * match functions there is a different pattern for each window. 2722 */ 2723 typedef struct 2724 { 2725 regmmatch_T rm; /* points to the regexp program; contains last found 2726 match (may continue in next line) */ 2727 buf_T *buf; /* the buffer to search for a match */ 2728 linenr_T lnum; /* the line to search for a match */ 2729 int attr; /* attributes to be used for a match */ 2730 int attr_cur; /* attributes currently active in win_line() */ 2731 linenr_T first_lnum; /* first lnum to search for multi-line pat */ 2732 colnr_T startcol; /* in win_line() points to char where HL starts */ 2733 colnr_T endcol; /* in win_line() points to char where HL ends */ 2734 int is_addpos; /* position specified directly by 2735 matchaddpos(). TRUE/FALSE */ 2736 #ifdef FEAT_RELTIME 2737 proftime_T tm; /* for a time limit */ 2738 #endif 2739 } match_T; 2740 2741 /* number of positions supported by matchaddpos() */ 2742 #define MAXPOSMATCH 8 2743 2744 /* 2745 * Same as lpos_T, but with additional field len. 2746 */ 2747 typedef struct 2748 { 2749 linenr_T lnum; /* line number */ 2750 colnr_T col; /* column number */ 2751 int len; /* length: 0 - to the end of line */ 2752 } llpos_T; 2753 2754 /* 2755 * posmatch_T provides an array for storing match items for matchaddpos() 2756 * function. 2757 */ 2758 typedef struct posmatch posmatch_T; 2759 struct posmatch 2760 { 2761 llpos_T pos[MAXPOSMATCH]; /* array of positions */ 2762 int cur; /* internal position counter */ 2763 linenr_T toplnum; /* top buffer line */ 2764 linenr_T botlnum; /* bottom buffer line */ 2765 }; 2766 2767 /* 2768 * matchitem_T provides a linked list for storing match items for ":match" and 2769 * the match functions. 2770 */ 2771 typedef struct matchitem matchitem_T; 2772 struct matchitem 2773 { 2774 matchitem_T *next; 2775 int id; /* match ID */ 2776 int priority; /* match priority */ 2777 char_u *pattern; /* pattern to highlight */ 2778 int hlg_id; /* highlight group ID */ 2779 regmmatch_T match; /* regexp program for pattern */ 2780 posmatch_T pos; /* position matches */ 2781 match_T hl; /* struct for doing the actual highlighting */ 2782 #ifdef FEAT_CONCEAL 2783 int conceal_char; /* cchar for Conceal highlighting */ 2784 #endif 2785 }; 2786 2787 // Structure to store last cursor position and topline. Used by check_lnums() 2788 // and reset_lnums(). 2789 typedef struct 2790 { 2791 int w_topline_save; // original topline value 2792 int w_topline_corr; // corrected topline value 2793 pos_T w_cursor_save; // original cursor position 2794 pos_T w_cursor_corr; // corrected cursor position 2795 } pos_save_T; 2796 2797 #ifdef FEAT_MENU 2798 typedef struct { 2799 int wb_startcol; 2800 int wb_endcol; 2801 vimmenu_T *wb_menu; 2802 } winbar_item_T; 2803 #endif 2804 2805 /* 2806 * Structure which contains all information that belongs to a window 2807 * 2808 * All row numbers are relative to the start of the window, except w_winrow. 2809 */ 2810 struct window_S 2811 { 2812 int w_id; /* unique window ID */ 2813 2814 buf_T *w_buffer; /* buffer we are a window into */ 2815 2816 win_T *w_prev; /* link to previous window */ 2817 win_T *w_next; /* link to next window */ 2818 2819 #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) 2820 synblock_T *w_s; /* for :ownsyntax */ 2821 #endif 2822 2823 int w_closing; /* window is being closed, don't let 2824 autocommands close it too. */ 2825 2826 frame_T *w_frame; /* frame containing this window */ 2827 2828 pos_T w_cursor; /* cursor position in buffer */ 2829 2830 colnr_T w_curswant; /* The column we'd like to be at. This is 2831 used to try to stay in the same column 2832 for up/down cursor motions. */ 2833 2834 int w_set_curswant; /* If set, then update w_curswant the next 2835 time through cursupdate() to the 2836 current virtual column */ 2837 2838 #ifdef FEAT_SYN_HL 2839 linenr_T w_last_cursorline; // where last time 'cursorline' was drawn 2840 #endif 2841 2842 /* 2843 * the next seven are used to update the visual part 2844 */ 2845 char w_old_visual_mode; /* last known VIsual_mode */ 2846 linenr_T w_old_cursor_lnum; /* last known end of visual part */ 2847 colnr_T w_old_cursor_fcol; /* first column for block visual part */ 2848 colnr_T w_old_cursor_lcol; /* last column for block visual part */ 2849 linenr_T w_old_visual_lnum; /* last known start of visual part */ 2850 colnr_T w_old_visual_col; /* last known start of visual part */ 2851 colnr_T w_old_curswant; /* last known value of Curswant */ 2852 2853 /* 2854 * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for 2855 * displaying the buffer. 2856 */ 2857 linenr_T w_topline; /* buffer line number of the line at the 2858 top of the window */ 2859 char w_topline_was_set; /* flag set to TRUE when topline is set, 2860 e.g. by winrestview() */ 2861 #ifdef FEAT_DIFF 2862 int w_topfill; /* number of filler lines above w_topline */ 2863 int w_old_topfill; /* w_topfill at last redraw */ 2864 int w_botfill; /* TRUE when filler lines are actually 2865 below w_topline (at end of file) */ 2866 int w_old_botfill; /* w_botfill at last redraw */ 2867 #endif 2868 colnr_T w_leftcol; /* window column number of the left most 2869 character in the window; used when 2870 'wrap' is off */ 2871 colnr_T w_skipcol; /* starting column when a single line 2872 doesn't fit in the window */ 2873 2874 /* 2875 * Layout of the window in the screen. 2876 * May need to add "msg_scrolled" to "w_winrow" in rare situations. 2877 */ 2878 int w_winrow; /* first row of window in screen */ 2879 int w_height; /* number of rows in window, excluding 2880 status/command/winbar line(s) */ 2881 int w_status_height; /* number of status lines (0 or 1) */ 2882 int w_wincol; /* Leftmost column of window in screen. */ 2883 int w_width; /* Width of window, excluding separation. */ 2884 int w_vsep_width; /* Number of separator columns (0 or 1). */ 2885 pos_save_T w_save_cursor; /* backup of cursor pos and topline */ 2886 #ifdef FEAT_TEXT_PROP 2887 int w_popup_flags; // POPF_ values 2888 poppos_T w_popup_pos; 2889 int w_popup_fixed; // do not shift popup to fit on screen 2890 int w_zindex; 2891 int w_minheight; // "minheight" for popup window 2892 int w_minwidth; // "minwidth" for popup window 2893 int w_maxheight; // "maxheight" for popup window 2894 int w_maxwidth; // "maxwidth" for popup window 2895 int w_wantline; // "line" for popup window 2896 int w_wantcol; // "col" for popup window 2897 int w_popup_padding[4]; // popup padding top/right/bot/left 2898 int w_popup_border[4]; // popup border top/right/bot/left 2899 char_u *w_border_highlight[4]; // popup border highlight 2900 int w_border_char[8]; // popup border characters 2901 varnumber_T w_popup_last_changedtick; // b:changedtick when position was 2902 // computed 2903 callback_T w_close_cb; // popup close callback 2904 callback_T w_filter_cb; // popup filter callback 2905 2906 win_T *w_popup_curwin; // close popup if curwin differs 2907 linenr_T w_popup_lnum; // close popup if cursor not on this line 2908 colnr_T w_popup_mincol; // close popup if cursor before this col 2909 colnr_T w_popup_maxcol; // close popup if cursor after this col 2910 2911 # if defined(FEAT_TIMERS) 2912 timer_T *w_popup_timer; // timer for closing popup window 2913 # endif 2914 #endif 2915 2916 2917 /* 2918 * === start of cached values ==== 2919 */ 2920 /* 2921 * Recomputing is minimized by storing the result of computations. 2922 * Use functions in screen.c to check if they are valid and to update. 2923 * w_valid is a bitfield of flags, which indicate if specific values are 2924 * valid or need to be recomputed. See screen.c for values. 2925 */ 2926 int w_valid; 2927 pos_T w_valid_cursor; /* last known position of w_cursor, used 2928 to adjust w_valid */ 2929 colnr_T w_valid_leftcol; /* last known w_leftcol */ 2930 2931 /* 2932 * w_cline_height is the number of physical lines taken by the buffer line 2933 * that the cursor is on. We use this to avoid extra calls to plines(). 2934 */ 2935 int w_cline_height; /* current size of cursor line */ 2936 #ifdef FEAT_FOLDING 2937 int w_cline_folded; /* cursor line is folded */ 2938 #endif 2939 2940 int w_cline_row; /* starting row of the cursor line */ 2941 2942 colnr_T w_virtcol; /* column number of the cursor in the 2943 buffer line, as opposed to the column 2944 number we're at on the screen. This 2945 makes a difference on lines which span 2946 more than one screen line or when 2947 w_leftcol is non-zero */ 2948 2949 /* 2950 * w_wrow and w_wcol specify the cursor position in the window. 2951 * This is related to positions in the window, not in the display or 2952 * buffer, thus w_wrow is relative to w_winrow. 2953 */ 2954 int w_wrow, w_wcol; /* cursor position in window */ 2955 2956 linenr_T w_botline; /* number of the line below the bottom of 2957 the window */ 2958 int w_empty_rows; /* number of ~ rows in window */ 2959 #ifdef FEAT_DIFF 2960 int w_filler_rows; /* number of filler rows at the end of the 2961 window */ 2962 #endif 2963 2964 /* 2965 * Info about the lines currently in the window is remembered to avoid 2966 * recomputing it every time. The allocated size of w_lines[] is Rows. 2967 * Only the w_lines_valid entries are actually valid. 2968 * When the display is up-to-date w_lines[0].wl_lnum is equal to w_topline 2969 * and w_lines[w_lines_valid - 1].wl_lnum is equal to w_botline. 2970 * Between changing text and updating the display w_lines[] represents 2971 * what is currently displayed. wl_valid is reset to indicated this. 2972 * This is used for efficient redrawing. 2973 */ 2974 int w_lines_valid; /* number of valid entries */ 2975 wline_T *w_lines; 2976 2977 #ifdef FEAT_FOLDING 2978 garray_T w_folds; /* array of nested folds */ 2979 char w_fold_manual; /* when TRUE: some folds are opened/closed 2980 manually */ 2981 char w_foldinvalid; /* when TRUE: folding needs to be 2982 recomputed */ 2983 #endif 2984 #ifdef FEAT_LINEBREAK 2985 int w_nrwidth; /* width of 'number' and 'relativenumber' 2986 column being used */ 2987 #endif 2988 2989 /* 2990 * === end of cached values === 2991 */ 2992 2993 int w_redr_type; /* type of redraw to be performed on win */ 2994 int w_upd_rows; /* number of window lines to update when 2995 w_redr_type is REDRAW_TOP */ 2996 linenr_T w_redraw_top; /* when != 0: first line needing redraw */ 2997 linenr_T w_redraw_bot; /* when != 0: last line needing redraw */ 2998 int w_redr_status; /* if TRUE status line must be redrawn */ 2999 3000 #ifdef FEAT_CMDL_INFO 3001 /* remember what is shown in the ruler for this window (if 'ruler' set) */ 3002 pos_T w_ru_cursor; /* cursor position shown in ruler */ 3003 colnr_T w_ru_virtcol; /* virtcol shown in ruler */ 3004 linenr_T w_ru_topline; /* topline shown in ruler */ 3005 linenr_T w_ru_line_count; /* line count used for ruler */ 3006 # ifdef FEAT_DIFF 3007 int w_ru_topfill; /* topfill shown in ruler */ 3008 # endif 3009 char w_ru_empty; /* TRUE if ruler shows 0-1 (empty line) */ 3010 #endif 3011 3012 int w_alt_fnum; /* alternate file (for # and CTRL-^) */ 3013 3014 alist_T *w_alist; /* pointer to arglist for this window */ 3015 int w_arg_idx; /* current index in argument list (can be 3016 out of range!) */ 3017 int w_arg_idx_invalid; /* editing another file than w_arg_idx */ 3018 3019 char_u *w_localdir; /* absolute path of local directory or 3020 NULL */ 3021 #ifdef FEAT_MENU 3022 vimmenu_T *w_winbar; /* The root of the WinBar menu hierarchy. */ 3023 winbar_item_T *w_winbar_items; /* list of items in the WinBar */ 3024 int w_winbar_height; /* 1 if there is a window toolbar */ 3025 #endif 3026 3027 /* 3028 * Options local to a window. 3029 * They are local because they influence the layout of the window or 3030 * depend on the window layout. 3031 * There are two values: w_onebuf_opt is local to the buffer currently in 3032 * this window, w_allbuf_opt is for all buffers in this window. 3033 */ 3034 winopt_T w_onebuf_opt; 3035 winopt_T w_allbuf_opt; 3036 3037 /* A few options have local flags for P_INSECURE. */ 3038 #ifdef FEAT_STL_OPT 3039 long_u w_p_stl_flags; /* flags for 'statusline' */ 3040 #endif 3041 #ifdef FEAT_EVAL 3042 long_u w_p_fde_flags; /* flags for 'foldexpr' */ 3043 long_u w_p_fdt_flags; /* flags for 'foldtext' */ 3044 #endif 3045 #ifdef FEAT_SYN_HL 3046 int *w_p_cc_cols; /* array of columns to highlight or NULL */ 3047 #endif 3048 #ifdef FEAT_LINEBREAK 3049 int w_p_brimin; /* minimum width for breakindent */ 3050 int w_p_brishift; /* additional shift for breakindent */ 3051 int w_p_brisbr; /* sbr in 'briopt' */ 3052 #endif 3053 long w_p_siso; /* 'sidescrolloff' local value */ 3054 long w_p_so; /* 'scrolloff' local value */ 3055 3056 /* transform a pointer to a "onebuf" option into a "allbuf" option */ 3057 #define GLOBAL_WO(p) ((char *)p + sizeof(winopt_T)) 3058 3059 long w_scbind_pos; 3060 3061 #ifdef FEAT_EVAL 3062 dictitem_T w_winvar; /* variable for "w:" Dictionary */ 3063 dict_T *w_vars; /* internal variables, local to window */ 3064 #endif 3065 3066 /* 3067 * The w_prev_pcmark field is used to check whether we really did jump to 3068 * a new line after setting the w_pcmark. If not, then we revert to 3069 * using the previous w_pcmark. 3070 */ 3071 pos_T w_pcmark; /* previous context mark */ 3072 pos_T w_prev_pcmark; /* previous w_pcmark */ 3073 3074 #ifdef FEAT_JUMPLIST 3075 /* 3076 * the jumplist contains old cursor positions 3077 */ 3078 xfmark_T w_jumplist[JUMPLISTSIZE]; 3079 int w_jumplistlen; /* number of active entries */ 3080 int w_jumplistidx; /* current position */ 3081 3082 int w_changelistidx; /* current position in b_changelist */ 3083 #endif 3084 3085 #ifdef FEAT_SEARCH_EXTRA 3086 matchitem_T *w_match_head; /* head of match list */ 3087 int w_next_match_id; /* next match ID */ 3088 #endif 3089 3090 /* 3091 * the tagstack grows from 0 upwards: 3092 * entry 0: older 3093 * entry 1: newer 3094 * entry 2: newest 3095 */ 3096 taggy_T w_tagstack[TAGSTACKSIZE]; /* the tag stack */ 3097 int w_tagstackidx; /* idx just below active entry */ 3098 int w_tagstacklen; /* number of tags on stack */ 3099 3100 /* 3101 * w_fraction is the fractional row of the cursor within the window, from 3102 * 0 at the top row to FRACTION_MULT at the last row. 3103 * w_prev_fraction_row was the actual cursor row when w_fraction was last 3104 * calculated. 3105 */ 3106 int w_fraction; 3107 int w_prev_fraction_row; 3108 3109 #ifdef FEAT_GUI 3110 scrollbar_T w_scrollbars[2]; /* vert. Scrollbars for this window */ 3111 #endif 3112 #ifdef FEAT_LINEBREAK 3113 linenr_T w_nrwidth_line_count; /* line count when ml_nrwidth_width 3114 * was computed. */ 3115 long w_nuw_cached; /* 'numberwidth' option cached */ 3116 int w_nrwidth_width; /* nr of chars to print line count. */ 3117 #endif 3118 3119 #ifdef FEAT_QUICKFIX 3120 qf_info_T *w_llist; /* Location list for this window */ 3121 /* 3122 * Location list reference used in the location list window. 3123 * In a non-location list window, w_llist_ref is NULL. 3124 */ 3125 qf_info_T *w_llist_ref; 3126 #endif 3127 3128 3129 #ifdef FEAT_MZSCHEME 3130 void *w_mzscheme_ref; /* The MzScheme value for this window */ 3131 #endif 3132 3133 #ifdef FEAT_PERL 3134 void *w_perl_private; 3135 #endif 3136 3137 #ifdef FEAT_PYTHON 3138 void *w_python_ref; /* The Python value for this window */ 3139 #endif 3140 3141 #ifdef FEAT_PYTHON3 3142 void *w_python3_ref; /* The Python value for this window */ 3143 #endif 3144 3145 #ifdef FEAT_TCL 3146 void *w_tcl_ref; 3147 #endif 3148 3149 #ifdef FEAT_RUBY 3150 void *w_ruby_ref; 3151 #endif 3152 }; 3153 3154 /* 3155 * Arguments for operators. 3156 */ 3157 typedef struct oparg_S 3158 { 3159 int op_type; /* current pending operator type */ 3160 int regname; /* register to use for the operator */ 3161 int motion_type; /* type of the current cursor motion */ 3162 int motion_force; /* force motion type: 'v', 'V' or CTRL-V */ 3163 int use_reg_one; /* TRUE if delete uses reg 1 even when not 3164 linewise */ 3165 int inclusive; /* TRUE if char motion is inclusive (only 3166 valid when motion_type is MCHAR */ 3167 int end_adjusted; /* backuped b_op_end one char (only used by 3168 do_format()) */ 3169 pos_T start; /* start of the operator */ 3170 pos_T end; /* end of the operator */ 3171 pos_T cursor_start; /* cursor position before motion for "gw" */ 3172 3173 long line_count; /* number of lines from op_start to op_end 3174 (inclusive) */ 3175 int empty; /* op_start and op_end the same (only used by 3176 do_change()) */ 3177 int is_VIsual; /* operator on Visual area */ 3178 int block_mode; /* current operator is Visual block mode */ 3179 colnr_T start_vcol; /* start col for block mode operator */ 3180 colnr_T end_vcol; /* end col for block mode operator */ 3181 long prev_opcount; /* ca.opcount saved for K_CURSORHOLD */ 3182 long prev_count0; /* ca.count0 saved for K_CURSORHOLD */ 3183 } oparg_T; 3184 3185 /* 3186 * Arguments for Normal mode commands. 3187 */ 3188 typedef struct cmdarg_S 3189 { 3190 oparg_T *oap; /* Operator arguments */ 3191 int prechar; /* prefix character (optional, always 'g') */ 3192 int cmdchar; /* command character */ 3193 int nchar; /* next command character (optional) */ 3194 int ncharC1; /* first composing character (optional) */ 3195 int ncharC2; /* second composing character (optional) */ 3196 int extra_char; /* yet another character (optional) */ 3197 long opcount; /* count before an operator */ 3198 long count0; /* count before command, default 0 */ 3199 long count1; /* count before command, default 1 */ 3200 int arg; /* extra argument from nv_cmds[] */ 3201 int retval; /* return: CA_* values */ 3202 char_u *searchbuf; /* return: pointer to search pattern or NULL */ 3203 } cmdarg_T; 3204 3205 /* values for retval: */ 3206 #define CA_COMMAND_BUSY 1 /* skip restarting edit() once */ 3207 #define CA_NO_ADJ_OP_END 2 /* don't adjust operator end */ 3208 3209 #ifdef CURSOR_SHAPE 3210 /* 3211 * struct to store values from 'guicursor' and 'mouseshape' 3212 */ 3213 /* Indexes in shape_table[] */ 3214 #define SHAPE_IDX_N 0 /* Normal mode */ 3215 #define SHAPE_IDX_V 1 /* Visual mode */ 3216 #define SHAPE_IDX_I 2 /* Insert mode */ 3217 #define SHAPE_IDX_R 3 /* Replace mode */ 3218 #define SHAPE_IDX_C 4 /* Command line Normal mode */ 3219 #define SHAPE_IDX_CI 5 /* Command line Insert mode */ 3220 #define SHAPE_IDX_CR 6 /* Command line Replace mode */ 3221 #define SHAPE_IDX_O 7 /* Operator-pending mode */ 3222 #define SHAPE_IDX_VE 8 /* Visual mode with 'selection' exclusive */ 3223 #define SHAPE_IDX_CLINE 9 /* On command line */ 3224 #define SHAPE_IDX_STATUS 10 /* A status line */ 3225 #define SHAPE_IDX_SDRAG 11 /* dragging a status line */ 3226 #define SHAPE_IDX_VSEP 12 /* A vertical separator line */ 3227 #define SHAPE_IDX_VDRAG 13 /* dragging a vertical separator line */ 3228 #define SHAPE_IDX_MORE 14 /* Hit-return or More */ 3229 #define SHAPE_IDX_MOREL 15 /* Hit-return or More in last line */ 3230 #define SHAPE_IDX_SM 16 /* showing matching paren */ 3231 #define SHAPE_IDX_COUNT 17 3232 3233 #define SHAPE_BLOCK 0 /* block cursor */ 3234 #define SHAPE_HOR 1 /* horizontal bar cursor */ 3235 #define SHAPE_VER 2 /* vertical bar cursor */ 3236 3237 #define MSHAPE_NUMBERED 1000 /* offset for shapes identified by number */ 3238 #define MSHAPE_HIDE 1 /* hide mouse pointer */ 3239 3240 #define SHAPE_MOUSE 1 /* used for mouse pointer shape */ 3241 #define SHAPE_CURSOR 2 /* used for text cursor shape */ 3242 3243 typedef struct cursor_entry 3244 { 3245 int shape; /* one of the SHAPE_ defines */ 3246 int mshape; /* one of the MSHAPE defines */ 3247 int percentage; /* percentage of cell for bar */ 3248 long blinkwait; /* blinking, wait time before blinking starts */ 3249 long blinkon; /* blinking, on time */ 3250 long blinkoff; /* blinking, off time */ 3251 int id; /* highlight group ID */ 3252 int id_lm; /* highlight group ID for :lmap mode */ 3253 char *name; /* mode name (fixed) */ 3254 char used_for; /* SHAPE_MOUSE and/or SHAPE_CURSOR */ 3255 } cursorentry_T; 3256 #endif /* CURSOR_SHAPE */ 3257 3258 #ifdef FEAT_MENU 3259 3260 /* Indices into vimmenu_T->strings[] and vimmenu_T->noremap[] for each mode */ 3261 #define MENU_INDEX_INVALID -1 3262 #define MENU_INDEX_NORMAL 0 3263 #define MENU_INDEX_VISUAL 1 3264 #define MENU_INDEX_SELECT 2 3265 #define MENU_INDEX_OP_PENDING 3 3266 #define MENU_INDEX_INSERT 4 3267 #define MENU_INDEX_CMDLINE 5 3268 #define MENU_INDEX_TERMINAL 6 3269 #define MENU_INDEX_TIP 7 3270 #define MENU_MODES 8 3271 3272 /* Menu modes */ 3273 #define MENU_NORMAL_MODE (1 << MENU_INDEX_NORMAL) 3274 #define MENU_VISUAL_MODE (1 << MENU_INDEX_VISUAL) 3275 #define MENU_SELECT_MODE (1 << MENU_INDEX_SELECT) 3276 #define MENU_OP_PENDING_MODE (1 << MENU_INDEX_OP_PENDING) 3277 #define MENU_INSERT_MODE (1 << MENU_INDEX_INSERT) 3278 #define MENU_CMDLINE_MODE (1 << MENU_INDEX_CMDLINE) 3279 #define MENU_TERMINAL_MODE (1 << MENU_INDEX_TERMINAL) 3280 #define MENU_TIP_MODE (1 << MENU_INDEX_TIP) 3281 #define MENU_ALL_MODES ((1 << MENU_INDEX_TIP) - 1) 3282 /*note MENU_INDEX_TIP is not a 'real' mode*/ 3283 3284 /* Start a menu name with this to not include it on the main menu bar */ 3285 #define MNU_HIDDEN_CHAR ']' 3286 3287 struct VimMenu 3288 { 3289 int modes; /* Which modes is this menu visible for? */ 3290 int enabled; /* for which modes the menu is enabled */ 3291 char_u *name; /* Name of menu, possibly translated */ 3292 char_u *dname; /* Displayed Name ("name" without '&') */ 3293 #ifdef FEAT_MULTI_LANG 3294 char_u *en_name; /* "name" untranslated, NULL when "name" 3295 * was not translated */ 3296 char_u *en_dname; /* "dname" untranslated, NULL when "dname" 3297 * was not translated */ 3298 #endif 3299 int mnemonic; /* mnemonic key (after '&') */ 3300 char_u *actext; /* accelerator text (after TAB) */ 3301 int priority; /* Menu order priority */ 3302 #ifdef FEAT_GUI 3303 void (*cb)(vimmenu_T *); /* Call-back routine */ 3304 #endif 3305 #ifdef FEAT_TOOLBAR 3306 char_u *iconfile; /* name of file for icon or NULL */ 3307 int iconidx; /* icon index (-1 if not set) */ 3308 int icon_builtin; /* icon names is BuiltIn{nr} */ 3309 #endif 3310 char_u *strings[MENU_MODES]; /* Mapped string for each mode */ 3311 int noremap[MENU_MODES]; /* A REMAP_ flag for each mode */ 3312 char silent[MENU_MODES]; /* A silent flag for each mode */ 3313 vimmenu_T *children; /* Children of sub-menu */ 3314 vimmenu_T *parent; /* Parent of menu */ 3315 vimmenu_T *next; /* Next item in menu */ 3316 #ifdef FEAT_GUI_X11 3317 Widget id; /* Manage this to enable item */ 3318 Widget submenu_id; /* If this is submenu, add children here */ 3319 #endif 3320 #ifdef FEAT_GUI_GTK 3321 GtkWidget *id; /* Manage this to enable item */ 3322 GtkWidget *submenu_id; /* If this is submenu, add children here */ 3323 # if defined(GTK_CHECK_VERSION) && !GTK_CHECK_VERSION(3,4,0) 3324 GtkWidget *tearoff_handle; 3325 # endif 3326 GtkWidget *label; /* Used by "set wak=" code. */ 3327 #endif 3328 #ifdef FEAT_GUI_MOTIF 3329 int sensitive; /* turn button on/off */ 3330 char **xpm; /* pixmap data */ 3331 char *xpm_fname; /* file with pixmap data */ 3332 #endif 3333 #ifdef FEAT_GUI_ATHENA 3334 Pixmap image; /* Toolbar image */ 3335 #endif 3336 #ifdef FEAT_BEVAL_TIP 3337 BalloonEval *tip; /* tooltip for this menu item */ 3338 #endif 3339 #ifdef FEAT_GUI_MSWIN 3340 UINT id; /* Id of menu item */ 3341 HMENU submenu_id; /* If this is submenu, add children here */ 3342 HWND tearoff_handle; /* hWnd of tearoff if created */ 3343 #endif 3344 #ifdef FEAT_GUI_MAC 3345 /* MenuHandle id; */ 3346 /* short index; */ /* the item index within the father menu */ 3347 short menu_id; /* the menu id to which this item belong */ 3348 short submenu_id; /* the menu id of the children (could be 3349 get through some tricks) */ 3350 MenuHandle menu_handle; 3351 MenuHandle submenu_handle; 3352 #endif 3353 #ifdef FEAT_GUI_PHOTON 3354 PtWidget_t *id; 3355 PtWidget_t *submenu_id; 3356 #endif 3357 }; 3358 #else 3359 /* For generating prototypes when FEAT_MENU isn't defined. */ 3360 typedef int vimmenu_T; 3361 3362 #endif /* FEAT_MENU */ 3363 3364 /* 3365 * Struct to save values in before executing autocommands for a buffer that is 3366 * not the current buffer. 3367 */ 3368 typedef struct 3369 { 3370 buf_T *save_curbuf; /* saved curbuf */ 3371 int use_aucmd_win; /* using aucmd_win */ 3372 win_T *save_curwin; /* saved curwin */ 3373 win_T *new_curwin; /* new curwin */ 3374 win_T *save_prevwin; /* saved prevwin */ 3375 bufref_T new_curbuf; /* new curbuf */ 3376 char_u *globaldir; /* saved value of globaldir */ 3377 } aco_save_T; 3378 3379 /* 3380 * Generic option table item, only used for printer at the moment. 3381 */ 3382 typedef struct 3383 { 3384 const char *name; 3385 int hasnum; 3386 long number; 3387 char_u *string; /* points into option string */ 3388 int strlen; 3389 int present; 3390 } option_table_T; 3391 3392 /* 3393 * Structure to hold printing color and font attributes. 3394 */ 3395 typedef struct 3396 { 3397 long_u fg_color; 3398 long_u bg_color; 3399 int bold; 3400 int italic; 3401 int underline; 3402 int undercurl; 3403 } prt_text_attr_T; 3404 3405 /* 3406 * Structure passed back to the generic printer code. 3407 */ 3408 typedef struct 3409 { 3410 int n_collated_copies; 3411 int n_uncollated_copies; 3412 int duplex; 3413 int chars_per_line; 3414 int lines_per_page; 3415 int has_color; 3416 prt_text_attr_T number; 3417 #ifdef FEAT_SYN_HL 3418 int modec; 3419 int do_syntax; 3420 #endif 3421 int user_abort; 3422 char_u *jobname; 3423 #ifdef FEAT_POSTSCRIPT 3424 char_u *outfile; 3425 char_u *arguments; 3426 #endif 3427 } prt_settings_T; 3428 3429 #define PRINT_NUMBER_WIDTH 8 3430 3431 /* 3432 * Used for popup menu items. 3433 */ 3434 typedef struct 3435 { 3436 char_u *pum_text; /* main menu text */ 3437 char_u *pum_kind; /* extra kind text (may be truncated) */ 3438 char_u *pum_extra; /* extra menu text (may be truncated) */ 3439 char_u *pum_info; /* extra info */ 3440 } pumitem_T; 3441 3442 /* 3443 * Structure used for get_tagfname(). 3444 */ 3445 typedef struct 3446 { 3447 char_u *tn_tags; /* value of 'tags' when starting */ 3448 char_u *tn_np; /* current position in tn_tags */ 3449 int tn_did_filefind_init; 3450 int tn_hf_idx; 3451 void *tn_search_ctx; 3452 } tagname_T; 3453 3454 typedef struct { 3455 UINT32_T total[2]; 3456 UINT32_T state[8]; 3457 char_u buffer[64]; 3458 } context_sha256_T; 3459 3460 /* 3461 * types for expressions. 3462 */ 3463 typedef enum 3464 { 3465 TYPE_UNKNOWN = 0, 3466 TYPE_EQUAL, // == 3467 TYPE_NEQUAL, // != 3468 TYPE_GREATER, // > 3469 TYPE_GEQUAL, // >= 3470 TYPE_SMALLER, // < 3471 TYPE_SEQUAL, // <= 3472 TYPE_MATCH, // =~ 3473 TYPE_NOMATCH, // !~ 3474 } exptype_T; 3475 3476 /* 3477 * Structure used for reading in json_decode(). 3478 */ 3479 struct js_reader 3480 { 3481 char_u *js_buf; /* text to be decoded */ 3482 char_u *js_end; /* NUL in js_buf */ 3483 int js_used; /* bytes used from js_buf */ 3484 int (*js_fill)(struct js_reader *); 3485 /* function to fill the buffer or NULL; 3486 * return TRUE when the buffer was filled */ 3487 void *js_cookie; /* can be used by js_fill */ 3488 int js_cookie_arg; /* can be used by js_fill */ 3489 }; 3490 typedef struct js_reader js_read_T; 3491 3492 /* Maximum number of commands from + or -c arguments. */ 3493 #define MAX_ARG_CMDS 10 3494 3495 /* values for "window_layout" */ 3496 #define WIN_HOR 1 /* "-o" horizontally split windows */ 3497 #define WIN_VER 2 /* "-O" vertically split windows */ 3498 #define WIN_TABS 3 /* "-p" windows on tab pages */ 3499 3500 /* Struct for various parameters passed between main() and other functions. */ 3501 typedef struct 3502 { 3503 int argc; 3504 char **argv; 3505 3506 char_u *fname; /* first file to edit */ 3507 3508 int evim_mode; /* started as "evim" */ 3509 char_u *use_vimrc; /* vimrc from -u argument */ 3510 int clean; /* --clean argument */ 3511 3512 int n_commands; /* no. of commands from + or -c */ 3513 char_u *commands[MAX_ARG_CMDS]; /* commands from + or -c arg. */ 3514 char_u cmds_tofree[MAX_ARG_CMDS]; /* commands that need free() */ 3515 int n_pre_commands; /* no. of commands from --cmd */ 3516 char_u *pre_commands[MAX_ARG_CMDS]; /* commands from --cmd argument */ 3517 3518 int edit_type; /* type of editing to do */ 3519 char_u *tagname; /* tag from -t argument */ 3520 #ifdef FEAT_QUICKFIX 3521 char_u *use_ef; /* 'errorfile' from -q argument */ 3522 #endif 3523 3524 int want_full_screen; 3525 int not_a_term; /* no warning for missing term? */ 3526 int tty_fail; /* exit if not a tty */ 3527 char_u *term; /* specified terminal name */ 3528 #ifdef FEAT_CRYPT 3529 int ask_for_key; /* -x argument */ 3530 #endif 3531 int no_swap_file; /* "-n" argument used */ 3532 #ifdef FEAT_EVAL 3533 int use_debug_break_level; 3534 #endif 3535 int window_count; /* number of windows to use */ 3536 int window_layout; /* 0, WIN_HOR, WIN_VER or WIN_TABS */ 3537 3538 #ifdef FEAT_CLIENTSERVER 3539 int serverArg; /* TRUE when argument for a server */ 3540 char_u *serverName_arg; /* cmdline arg for server name */ 3541 char_u *serverStr; /* remote server command */ 3542 char_u *serverStrEnc; /* encoding of serverStr */ 3543 char_u *servername; /* allocated name for our server */ 3544 #endif 3545 #if !defined(UNIX) 3546 # define EXPAND_FILENAMES 3547 int literal; /* don't expand file names */ 3548 #endif 3549 #ifdef MSWIN 3550 int full_path; /* file name argument was full path */ 3551 #endif 3552 #ifdef FEAT_DIFF 3553 int diff_mode; /* start with 'diff' set */ 3554 #endif 3555 } mparm_T; 3556 3557 /* 3558 * Structure returned by get_lval() and used by set_var_lval(). 3559 * For a plain name: 3560 * "name" points to the variable name. 3561 * "exp_name" is NULL. 3562 * "tv" is NULL 3563 * For a magic braces name: 3564 * "name" points to the expanded variable name. 3565 * "exp_name" is non-NULL, to be freed later. 3566 * "tv" is NULL 3567 * For an index in a list: 3568 * "name" points to the (expanded) variable name. 3569 * "exp_name" NULL or non-NULL, to be freed later. 3570 * "tv" points to the (first) list item value 3571 * "li" points to the (first) list item 3572 * "range", "n1", "n2" and "empty2" indicate what items are used. 3573 * For an existing Dict item: 3574 * "name" points to the (expanded) variable name. 3575 * "exp_name" NULL or non-NULL, to be freed later. 3576 * "tv" points to the dict item value 3577 * "newkey" is NULL 3578 * For a non-existing Dict item: 3579 * "name" points to the (expanded) variable name. 3580 * "exp_name" NULL or non-NULL, to be freed later. 3581 * "tv" points to the Dictionary typval_T 3582 * "newkey" is the key for the new item. 3583 */ 3584 typedef struct lval_S 3585 { 3586 char_u *ll_name; /* start of variable name (can be NULL) */ 3587 char_u *ll_exp_name; /* NULL or expanded name in allocated memory. */ 3588 typval_T *ll_tv; /* Typeval of item being used. If "newkey" 3589 isn't NULL it's the Dict to which to add 3590 the item. */ 3591 listitem_T *ll_li; /* The list item or NULL. */ 3592 list_T *ll_list; /* The list or NULL. */ 3593 int ll_range; /* TRUE when a [i:j] range was used */ 3594 long ll_n1; /* First index for list */ 3595 long ll_n2; /* Second index for list range */ 3596 int ll_empty2; /* Second index is empty: [i:] */ 3597 dict_T *ll_dict; /* The Dictionary or NULL */ 3598 dictitem_T *ll_di; /* The dictitem or NULL */ 3599 char_u *ll_newkey; /* New key for Dict in alloc. mem or NULL. */ 3600 blob_T *ll_blob; /* The Blob or NULL */ 3601 } lval_T; 3602 3603 /* Structure used to save the current state. Used when executing Normal mode 3604 * commands while in any other mode. */ 3605 typedef struct { 3606 int save_msg_scroll; 3607 int save_restart_edit; 3608 int save_msg_didout; 3609 int save_State; 3610 int save_insertmode; 3611 int save_finish_op; 3612 int save_opcount; 3613 int save_reg_executing; 3614 tasave_T tabuf; 3615 } save_state_T; 3616 3617 typedef struct { 3618 varnumber_T vv_prevcount; 3619 varnumber_T vv_count; 3620 varnumber_T vv_count1; 3621 } vimvars_save_T; 3622 3623 // Scope for changing directory 3624 typedef enum { 3625 CDSCOPE_GLOBAL, // :cd 3626 CDSCOPE_TABPAGE, // :tcd 3627 CDSCOPE_WINDOW // :lcd 3628 } cdscope_T; 3629