1edf3f97aSBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet: 2071d4279SBram Moolenaar * 3071d4279SBram Moolenaar * VIM - Vi IMproved by Bram Moolenaar 4071d4279SBram Moolenaar * 5071d4279SBram Moolenaar * Do ":help uganda" in Vim to read copying and usage conditions. 6071d4279SBram Moolenaar * Do ":help credits" in Vim to see a list of people who contributed. 7071d4279SBram Moolenaar */ 8071d4279SBram Moolenaar 9071d4279SBram Moolenaar /* 10071d4279SBram Moolenaar * This file contains various definitions of structures that are used by Vim 11071d4279SBram Moolenaar */ 12071d4279SBram Moolenaar 13071d4279SBram Moolenaar /* 14071d4279SBram Moolenaar * There is something wrong in the SAS compiler that makes typedefs not 15071d4279SBram Moolenaar * valid in include files. Has been fixed in version 6.58. 16071d4279SBram Moolenaar */ 17071d4279SBram Moolenaar #if defined(SASC) && SASC < 658 18071d4279SBram Moolenaar typedef long linenr_T; 195fd0ca70SBram Moolenaar typedef int colnr_T; 20071d4279SBram Moolenaar typedef unsigned short short_u; 21071d4279SBram Moolenaar #endif 22071d4279SBram Moolenaar 23071d4279SBram Moolenaar /* 2429ddebefSBram Moolenaar * Position in file or buffer. 25071d4279SBram Moolenaar */ 26071d4279SBram Moolenaar typedef struct 27071d4279SBram Moolenaar { 2829ddebefSBram Moolenaar linenr_T lnum; // line number 2929ddebefSBram Moolenaar colnr_T col; // column number 3029ddebefSBram Moolenaar colnr_T coladd; // extra virtual column 31071d4279SBram Moolenaar } pos_T; 32071d4279SBram Moolenaar 33071d4279SBram Moolenaar 34071d4279SBram Moolenaar /* 35071d4279SBram Moolenaar * Same, but without coladd. 36071d4279SBram Moolenaar */ 37071d4279SBram Moolenaar typedef struct 38071d4279SBram Moolenaar { 3929ddebefSBram Moolenaar linenr_T lnum; // line number 4029ddebefSBram Moolenaar colnr_T col; // column number 41071d4279SBram Moolenaar } lpos_T; 42071d4279SBram Moolenaar 43071d4279SBram Moolenaar /* 44071d4279SBram Moolenaar * Structure used for growing arrays. 45071d4279SBram Moolenaar * This is used to store information that only grows, is deleted all at 46071d4279SBram Moolenaar * once, and needs to be accessed by index. See ga_clear() and ga_grow(). 47071d4279SBram Moolenaar */ 48071d4279SBram Moolenaar typedef struct growarray 49071d4279SBram Moolenaar { 506cb39f92SBram Moolenaar int ga_len; // current number of items used 516cb39f92SBram Moolenaar int ga_maxlen; // maximum number of items possible 526cb39f92SBram Moolenaar int ga_itemsize; // sizeof(item) 536cb39f92SBram Moolenaar int ga_growsize; // number of items to grow each time 546cb39f92SBram Moolenaar void *ga_data; // pointer to the first item 55071d4279SBram Moolenaar } garray_T; 56071d4279SBram Moolenaar 57071d4279SBram Moolenaar #define GA_EMPTY {0, 0, 0, 0, NULL} 58071d4279SBram Moolenaar 591d2ba7faSBram Moolenaar typedef struct window_S win_T; 601d2ba7faSBram Moolenaar typedef struct wininfo_S wininfo_T; 611d2ba7faSBram Moolenaar typedef struct frame_S frame_T; 626cb39f92SBram Moolenaar typedef int scid_T; // script ID 636cb39f92SBram Moolenaar typedef struct file_buffer buf_T; // forward declaration 64e4f25e4aSBram Moolenaar typedef struct terminal_S term_T; 65fbc0d2eaSBram Moolenaar 661b9645deSBram Moolenaar #ifdef FEAT_MENU 671b9645deSBram Moolenaar typedef struct VimMenu vimmenu_T; 681b9645deSBram Moolenaar #endif 691b9645deSBram Moolenaar 706797966dSBram Moolenaar // maximum value for sc_version 716797966dSBram Moolenaar #define SCRIPT_VERSION_MAX 4 728a7d6542SBram Moolenaar // value for sc_version in a Vim9 script file 738a7d6542SBram Moolenaar #define SCRIPT_VERSION_VIM9 999999 748a7d6542SBram Moolenaar 7545e5fd13SBram Moolenaar /* 76fe72d084SBram Moolenaar * SCript ConteXt (SCTX): identifies a script line. 77f29c1c6aSBram Moolenaar * When sourcing a script "sc_lnum" is zero, "sourcing_lnum" is the current 78f29c1c6aSBram Moolenaar * line number. When executing a user function "sc_lnum" is the line where the 79f29c1c6aSBram Moolenaar * function was defined, "sourcing_lnum" is the line number inside the 80f29c1c6aSBram Moolenaar * function. When stored with a function, mapping, option, etc. "sc_lnum" is 81f29c1c6aSBram Moolenaar * the line number in the script "sc_sid". 827ebcba61SBram Moolenaar * 837ebcba61SBram Moolenaar * sc_version is also here, for convenience. 84f29c1c6aSBram Moolenaar */ 85f29c1c6aSBram Moolenaar typedef struct { 869b8d6226SBram Moolenaar #ifdef FEAT_EVAL 87f29c1c6aSBram Moolenaar scid_T sc_sid; // script ID 88ded5f1beSBram Moolenaar int sc_seq; // sourcing sequence number 89f29c1c6aSBram Moolenaar linenr_T sc_lnum; // line number 909b8d6226SBram Moolenaar #endif 91558ca4aeSBram Moolenaar int sc_version; // :scriptversion 92f29c1c6aSBram Moolenaar } sctx_T; 93f29c1c6aSBram Moolenaar 94f29c1c6aSBram Moolenaar /* 9545e5fd13SBram Moolenaar * Reference to a buffer that stores the value of buf_free_count. 96b25f9a97SBram Moolenaar * bufref_valid() only needs to check "buf" when the count differs. 97b25f9a97SBram Moolenaar */ 98b25f9a97SBram Moolenaar typedef struct { 99b25f9a97SBram Moolenaar buf_T *br_buf; 10045e5fd13SBram Moolenaar int br_fnum; 101b25f9a97SBram Moolenaar int br_buf_free_count; 102b25f9a97SBram Moolenaar } bufref_T; 103b25f9a97SBram Moolenaar 104fbc0d2eaSBram Moolenaar /* 105fbc0d2eaSBram Moolenaar * This is here because regexp.h needs pos_T and below regprog_T is used. 106fbc0d2eaSBram Moolenaar */ 107fbc0d2eaSBram Moolenaar #include "regexp.h" 108071d4279SBram Moolenaar 109071d4279SBram Moolenaar /* 110071d4279SBram Moolenaar * This is here because gui.h needs the pos_T and win_T, and win_T needs gui.h 111071d4279SBram Moolenaar * for scrollbar_T. 112071d4279SBram Moolenaar */ 113071d4279SBram Moolenaar #ifdef FEAT_GUI 114071d4279SBram Moolenaar # include "gui.h" 115071d4279SBram Moolenaar #else 116071d4279SBram Moolenaar # ifdef FEAT_XCLIPBOARD 117071d4279SBram Moolenaar # include <X11/Intrinsic.h> 118071d4279SBram Moolenaar # endif 1191b58cdd1SBram Moolenaar # define guicolor_T long 1208a633e34SBram Moolenaar # define INVALCOLOR ((guicolor_T)0x1ffffff) 1216cb39f92SBram Moolenaar // only used for cterm.bg_rgb and cterm.fg_rgb: use cterm color 122d4fc577eSBram Moolenaar # define CTERMCOLOR ((guicolor_T)0x1fffffe) 123071d4279SBram Moolenaar #endif 124d4fc577eSBram Moolenaar #define COLOR_INVALID(x) ((x) == INVALCOLOR || (x) == CTERMCOLOR) 125071d4279SBram Moolenaar 126*87fd0924SBram Moolenaar #ifdef FEAT_TERMINAL 127*87fd0924SBram Moolenaar # include "libvterm/include/vterm.h" 128*87fd0924SBram Moolenaar typedef struct { 129*87fd0924SBram Moolenaar VTermColor fg; 130*87fd0924SBram Moolenaar VTermColor bg; 131*87fd0924SBram Moolenaar } termcellcolor_T; 132*87fd0924SBram Moolenaar #endif 133*87fd0924SBram Moolenaar 134071d4279SBram Moolenaar /* 135071d4279SBram Moolenaar * marks: positions in a file 136071d4279SBram Moolenaar * (a normal mark is a lnum/col pair, the same as a file position) 137071d4279SBram Moolenaar */ 138071d4279SBram Moolenaar 1396cb39f92SBram Moolenaar // (Note: for EBCDIC there are more than 26, because there are gaps in the 1406cb39f92SBram Moolenaar // alphabet coding. To minimize changes to the code, I decided to just 1416cb39f92SBram Moolenaar // increase the number of possible marks. 1426cb39f92SBram Moolenaar #define NMARKS ('z' - 'a' + 1) // max. # of named marks 1431e78e696SBram Moolenaar #define EXTRA_MARKS 10 // marks 0-9 1446cb39f92SBram Moolenaar #define JUMPLISTSIZE 100 // max. # of marks in jump list 1456cb39f92SBram Moolenaar #define TAGSTACKSIZE 20 // max. # of tags in tag stack 146071d4279SBram Moolenaar 147071d4279SBram Moolenaar typedef struct filemark 148071d4279SBram Moolenaar { 1496cb39f92SBram Moolenaar pos_T mark; // cursor position 1506cb39f92SBram Moolenaar int fnum; // file number 151071d4279SBram Moolenaar } fmark_T; 152071d4279SBram Moolenaar 1536cb39f92SBram Moolenaar // Xtended file mark: also has a file name 154071d4279SBram Moolenaar typedef struct xfilemark 155071d4279SBram Moolenaar { 156071d4279SBram Moolenaar fmark_T fmark; 1576cb39f92SBram Moolenaar char_u *fname; // file name, used when fnum == 0 1582d358997SBram Moolenaar #ifdef FEAT_VIMINFO 159f4fba6dcSBram Moolenaar time_T time_set; 1602d358997SBram Moolenaar #endif 161071d4279SBram Moolenaar } xfmark_T; 162071d4279SBram Moolenaar 163071d4279SBram Moolenaar /* 164071d4279SBram Moolenaar * The taggy struct is used to store the information about a :tag command. 165071d4279SBram Moolenaar */ 166071d4279SBram Moolenaar typedef struct taggy 167071d4279SBram Moolenaar { 16845e18cbdSBram Moolenaar char_u *tagname; // tag name 16945e18cbdSBram Moolenaar fmark_T fmark; // cursor position BEFORE ":tag" 17045e18cbdSBram Moolenaar int cur_match; // match number 17145e18cbdSBram Moolenaar int cur_fnum; // buffer number used for cur_match 17245e18cbdSBram Moolenaar char_u *user_data; // used with tagfunc 173071d4279SBram Moolenaar } taggy_T; 174071d4279SBram Moolenaar 175071d4279SBram Moolenaar /* 176071d4279SBram Moolenaar * Structure that contains all options that are local to a window. 177071d4279SBram Moolenaar * Used twice in a window: for the current buffer and for all buffers. 178071d4279SBram Moolenaar * Also used in wininfo_T. 179071d4279SBram Moolenaar */ 180071d4279SBram Moolenaar typedef struct 181071d4279SBram Moolenaar { 182071d4279SBram Moolenaar #ifdef FEAT_ARABIC 183071d4279SBram Moolenaar int wo_arab; 1844d784b21SBram Moolenaar # define w_p_arab w_onebuf_opt.wo_arab // 'arabic' 185071d4279SBram Moolenaar #endif 186597a4224SBram Moolenaar #ifdef FEAT_LINEBREAK 187597a4224SBram Moolenaar int wo_bri; 1884d784b21SBram Moolenaar # define w_p_bri w_onebuf_opt.wo_bri // 'breakindent' 189597a4224SBram Moolenaar char_u *wo_briopt; 1904d784b21SBram Moolenaar # define w_p_briopt w_onebuf_opt.wo_briopt // 'breakindentopt' 191597a4224SBram Moolenaar #endif 1924d784b21SBram Moolenaar char_u *wo_wcr; 1934d784b21SBram Moolenaar # define w_p_wcr w_onebuf_opt.wo_wcr // 'wincolor' 194071d4279SBram Moolenaar #ifdef FEAT_DIFF 195071d4279SBram Moolenaar int wo_diff; 1964d784b21SBram Moolenaar # define w_p_diff w_onebuf_opt.wo_diff // 'diff' 197071d4279SBram Moolenaar #endif 198071d4279SBram Moolenaar #ifdef FEAT_FOLDING 199071d4279SBram Moolenaar long wo_fdc; 2006cb39f92SBram Moolenaar # define w_p_fdc w_onebuf_opt.wo_fdc // 'foldcolumn' 201a87aa806SBram Moolenaar int wo_fdc_save; 2026cb39f92SBram Moolenaar # define w_p_fdc_save w_onebuf_opt.wo_fdc_save // 'foldenable' saved for diff mode 203071d4279SBram Moolenaar int wo_fen; 2046cb39f92SBram Moolenaar # define w_p_fen w_onebuf_opt.wo_fen // 'foldenable' 205a87aa806SBram Moolenaar int wo_fen_save; 2066cb39f92SBram Moolenaar # define w_p_fen_save w_onebuf_opt.wo_fen_save // 'foldenable' saved for diff mode 207071d4279SBram Moolenaar char_u *wo_fdi; 2086cb39f92SBram Moolenaar # define w_p_fdi w_onebuf_opt.wo_fdi // 'foldignore' 209071d4279SBram Moolenaar long wo_fdl; 2106cb39f92SBram Moolenaar # define w_p_fdl w_onebuf_opt.wo_fdl // 'foldlevel' 211a87aa806SBram Moolenaar int wo_fdl_save; 2126cb39f92SBram Moolenaar # define w_p_fdl_save w_onebuf_opt.wo_fdl_save // 'foldlevel' state saved for diff mode 213071d4279SBram Moolenaar char_u *wo_fdm; 2146cb39f92SBram Moolenaar # define w_p_fdm w_onebuf_opt.wo_fdm // 'foldmethod' 215a87aa806SBram Moolenaar char_u *wo_fdm_save; 2166cb39f92SBram Moolenaar # define w_p_fdm_save w_onebuf_opt.wo_fdm_save // 'fdm' saved for diff mode 217071d4279SBram Moolenaar long wo_fml; 2186cb39f92SBram Moolenaar # define w_p_fml w_onebuf_opt.wo_fml // 'foldminlines' 219071d4279SBram Moolenaar long wo_fdn; 2206cb39f92SBram Moolenaar # define w_p_fdn w_onebuf_opt.wo_fdn // 'foldnestmax' 221071d4279SBram Moolenaar # ifdef FEAT_EVAL 222071d4279SBram Moolenaar char_u *wo_fde; 2236cb39f92SBram Moolenaar # define w_p_fde w_onebuf_opt.wo_fde // 'foldexpr' 224071d4279SBram Moolenaar char_u *wo_fdt; 2256cb39f92SBram Moolenaar # define w_p_fdt w_onebuf_opt.wo_fdt // 'foldtext' 226071d4279SBram Moolenaar # endif 227071d4279SBram Moolenaar char_u *wo_fmr; 2286cb39f92SBram Moolenaar # define w_p_fmr w_onebuf_opt.wo_fmr // 'foldmarker' 229071d4279SBram Moolenaar #endif 230071d4279SBram Moolenaar #ifdef FEAT_LINEBREAK 231071d4279SBram Moolenaar int wo_lbr; 2326cb39f92SBram Moolenaar # define w_p_lbr w_onebuf_opt.wo_lbr // 'linebreak' 233071d4279SBram Moolenaar #endif 234071d4279SBram Moolenaar int wo_list; 2356cb39f92SBram Moolenaar #define w_p_list w_onebuf_opt.wo_list // 'list' 236eed9d462SBram Moolenaar char_u *wo_lcs; 237eed9d462SBram Moolenaar #define w_p_lcs w_onebuf_opt.wo_lcs // 'listchars' 238071d4279SBram Moolenaar int wo_nu; 2396cb39f92SBram Moolenaar #define w_p_nu w_onebuf_opt.wo_nu // 'number' 24064486671SBram Moolenaar int wo_rnu; 2416cb39f92SBram Moolenaar #define w_p_rnu w_onebuf_opt.wo_rnu // 'relativenumber' 24251ad850fSGary Johnson char_u *wo_ve; 24351ad850fSGary Johnson #define w_p_ve w_onebuf_opt.wo_ve // 'virtualedit' 24451ad850fSGary Johnson unsigned wo_ve_flags; 24551ad850fSGary Johnson #define w_ve_flags w_onebuf_opt.wo_ve_flags // flags for 'virtualedit' 246592e0a2aSBram Moolenaar #ifdef FEAT_LINEBREAK 247592e0a2aSBram Moolenaar long wo_nuw; 2486cb39f92SBram Moolenaar # define w_p_nuw w_onebuf_opt.wo_nuw // 'numberwidth' 249592e0a2aSBram Moolenaar #endif 250071d4279SBram Moolenaar int wo_wfh; 2516cb39f92SBram Moolenaar # define w_p_wfh w_onebuf_opt.wo_wfh // 'winfixheight' 25297b2ad35SBram Moolenaar int wo_wfw; 2536cb39f92SBram Moolenaar # define w_p_wfw w_onebuf_opt.wo_wfw // 'winfixwidth' 2544033c55eSBram Moolenaar #if defined(FEAT_QUICKFIX) 255071d4279SBram Moolenaar int wo_pvw; 2566cb39f92SBram Moolenaar # define w_p_pvw w_onebuf_opt.wo_pvw // 'previewwindow' 257071d4279SBram Moolenaar #endif 258071d4279SBram Moolenaar #ifdef FEAT_RIGHTLEFT 259071d4279SBram Moolenaar int wo_rl; 2606cb39f92SBram Moolenaar # define w_p_rl w_onebuf_opt.wo_rl // 'rightleft' 261071d4279SBram Moolenaar char_u *wo_rlc; 2626cb39f92SBram Moolenaar # define w_p_rlc w_onebuf_opt.wo_rlc // 'rightleftcmd' 263071d4279SBram Moolenaar #endif 264071d4279SBram Moolenaar long wo_scr; 2656cb39f92SBram Moolenaar #define w_p_scr w_onebuf_opt.wo_scr // 'scroll' 266b9a02fc5SBram Moolenaar #ifdef FEAT_SPELL 267217ad920SBram Moolenaar int wo_spell; 2686cb39f92SBram Moolenaar # define w_p_spell w_onebuf_opt.wo_spell // 'spell' 269217ad920SBram Moolenaar #endif 270b9a02fc5SBram Moolenaar #ifdef FEAT_SYN_HL 271b9a02fc5SBram Moolenaar int wo_cuc; 2726cb39f92SBram Moolenaar # define w_p_cuc w_onebuf_opt.wo_cuc // 'cursorcolumn' 273b9a02fc5SBram Moolenaar int wo_cul; 2746cb39f92SBram Moolenaar # define w_p_cul w_onebuf_opt.wo_cul // 'cursorline' 275410e98a7SBram Moolenaar char_u *wo_culopt; 276410e98a7SBram Moolenaar # define w_p_culopt w_onebuf_opt.wo_culopt // 'cursorlineopt' 2771a38442dSBram Moolenaar char_u *wo_cc; 2786cb39f92SBram Moolenaar # define w_p_cc w_onebuf_opt.wo_cc // 'colorcolumn' 279b9a02fc5SBram Moolenaar #endif 280ee85702cSBram Moolenaar #ifdef FEAT_LINEBREAK 281ee85702cSBram Moolenaar char_u *wo_sbr; 282ee85702cSBram Moolenaar #define w_p_sbr w_onebuf_opt.wo_sbr // 'showbreak' 283ee85702cSBram Moolenaar #endif 284b5bf5b8fSBram Moolenaar #ifdef FEAT_STL_OPT 285b5bf5b8fSBram Moolenaar char_u *wo_stl; 2866cb39f92SBram Moolenaar #define w_p_stl w_onebuf_opt.wo_stl // 'statusline' 287b5bf5b8fSBram Moolenaar #endif 288071d4279SBram Moolenaar int wo_scb; 2896cb39f92SBram Moolenaar #define w_p_scb w_onebuf_opt.wo_scb // 'scrollbind' 2906cb39f92SBram Moolenaar int wo_diff_saved; // options were saved for starting diff mode 291a87aa806SBram Moolenaar #define w_p_diff_saved w_onebuf_opt.wo_diff_saved 2926cb39f92SBram Moolenaar int wo_scb_save; // 'scrollbind' saved for diff mode 293a87aa806SBram Moolenaar #define w_p_scb_save w_onebuf_opt.wo_scb_save 294071d4279SBram Moolenaar int wo_wrap; 2956cb39f92SBram Moolenaar #define w_p_wrap w_onebuf_opt.wo_wrap // 'wrap' 296a87aa806SBram Moolenaar #ifdef FEAT_DIFF 2976cb39f92SBram Moolenaar int wo_wrap_save; // 'wrap' state saved for diff mode 298a87aa806SBram Moolenaar # define w_p_wrap_save w_onebuf_opt.wo_wrap_save 299a87aa806SBram Moolenaar #endif 300860cae1cSBram Moolenaar #ifdef FEAT_CONCEAL 3016cb39f92SBram Moolenaar char_u *wo_cocu; // 'concealcursor' 302f5963f71SBram Moolenaar # define w_p_cocu w_onebuf_opt.wo_cocu 3036cb39f92SBram Moolenaar long wo_cole; // 'conceallevel' 304f5963f71SBram Moolenaar # define w_p_cole w_onebuf_opt.wo_cole 305860cae1cSBram Moolenaar #endif 306860cae1cSBram Moolenaar int wo_crb; 3076cb39f92SBram Moolenaar #define w_p_crb w_onebuf_opt.wo_crb // 'cursorbind' 3086cb39f92SBram Moolenaar int wo_crb_save; // 'cursorbind' state saved for diff mode 309a87aa806SBram Moolenaar #define w_p_crb_save w_onebuf_opt.wo_crb_save 31095ec9d6aSBram Moolenaar #ifdef FEAT_SIGNS 31195ec9d6aSBram Moolenaar char_u *wo_scl; 3126cb39f92SBram Moolenaar # define w_p_scl w_onebuf_opt.wo_scl // 'signcolumn' 31395ec9d6aSBram Moolenaar #endif 314e4f25e4aSBram Moolenaar #ifdef FEAT_TERMINAL 315e1fc5155SBram Moolenaar char_u *wo_twk; 3166cb39f92SBram Moolenaar # define w_p_twk w_onebuf_opt.wo_twk // 'termwinkey' 317e1fc5155SBram Moolenaar char_u *wo_tws; 3186cb39f92SBram Moolenaar # define w_p_tws w_onebuf_opt.wo_tws // 'termwinsize' 319e4f25e4aSBram Moolenaar #endif 3205e3cb7e8SBram Moolenaar 3215e3cb7e8SBram Moolenaar #ifdef FEAT_EVAL 3226cb39f92SBram Moolenaar sctx_T wo_script_ctx[WV_COUNT]; // SCTXs for window-local options 323f29c1c6aSBram Moolenaar # define w_p_script_ctx w_onebuf_opt.wo_script_ctx 3245e3cb7e8SBram Moolenaar #endif 325071d4279SBram Moolenaar } winopt_T; 326071d4279SBram Moolenaar 327071d4279SBram Moolenaar /* 328071d4279SBram Moolenaar * Window info stored with a buffer. 329071d4279SBram Moolenaar * 330071d4279SBram Moolenaar * Two types of info are kept for a buffer which are associated with a 331071d4279SBram Moolenaar * specific window: 332071d4279SBram Moolenaar * 1. Each window can have a different line number associated with a buffer. 333071d4279SBram Moolenaar * 2. The window-local options for a buffer work in a similar way. 334071d4279SBram Moolenaar * The window-info is kept in a list at b_wininfo. It is kept in 335071d4279SBram Moolenaar * most-recently-used order. 336071d4279SBram Moolenaar */ 3371d2ba7faSBram Moolenaar struct wininfo_S 338071d4279SBram Moolenaar { 3396cb39f92SBram Moolenaar wininfo_T *wi_next; // next entry or NULL for last entry 3406cb39f92SBram Moolenaar wininfo_T *wi_prev; // previous entry or NULL for first entry 3416cb39f92SBram Moolenaar win_T *wi_win; // pointer to window that did set wi_fpos 3426cb39f92SBram Moolenaar pos_T wi_fpos; // last cursor position in the file 3436cb39f92SBram Moolenaar winopt_T wi_opt; // local window options 3443276f584SDominique Pelle int wi_optset; // TRUE when wi_opt has useful values 345071d4279SBram Moolenaar #ifdef FEAT_FOLDING 3466cb39f92SBram Moolenaar int wi_fold_manual; // copy of w_fold_manual 3476cb39f92SBram Moolenaar garray_T wi_folds; // clone of w_folds 348071d4279SBram Moolenaar #endif 349071d4279SBram Moolenaar }; 350071d4279SBram Moolenaar 351071d4279SBram Moolenaar /* 352071d4279SBram Moolenaar * Info used to pass info about a fold from the fold-detection code to the 353071d4279SBram Moolenaar * code that displays the foldcolumn. 354071d4279SBram Moolenaar */ 355071d4279SBram Moolenaar typedef struct foldinfo 356071d4279SBram Moolenaar { 3576cb39f92SBram Moolenaar int fi_level; // level of the fold; when this is zero the 3586cb39f92SBram Moolenaar // other fields are invalid 3596cb39f92SBram Moolenaar int fi_lnum; // line number where fold starts 3606cb39f92SBram Moolenaar int fi_low_level; // lowest fold level that starts in the same 3616cb39f92SBram Moolenaar // line 362071d4279SBram Moolenaar } foldinfo_T; 363071d4279SBram Moolenaar 3646cb39f92SBram Moolenaar /* 3656cb39f92SBram Moolenaar * Structure to store info about the Visual area. 3666cb39f92SBram Moolenaar */ 367a23ccb8aSBram Moolenaar typedef struct 368a23ccb8aSBram Moolenaar { 3696cb39f92SBram Moolenaar pos_T vi_start; // start pos of last VIsual 3706cb39f92SBram Moolenaar pos_T vi_end; // end position of last VIsual 3716cb39f92SBram Moolenaar int vi_mode; // VIsual_mode of last VIsual 3726cb39f92SBram Moolenaar colnr_T vi_curswant; // MAXCOL from w_curswant 373a23ccb8aSBram Moolenaar } visualinfo_T; 374a23ccb8aSBram Moolenaar 375071d4279SBram Moolenaar /* 376335437bbSBram Moolenaar * structures used for undo 377071d4279SBram Moolenaar */ 378071d4279SBram Moolenaar 379ccae4672SBram Moolenaar // One line saved for undo. After the NUL terminated text there might be text 380ccae4672SBram Moolenaar // properties, thus ul_len can be larger than STRLEN(ul_line) + 1. 381ccae4672SBram Moolenaar typedef struct { 382ccae4672SBram Moolenaar char_u *ul_line; // text of the line 383ccae4672SBram Moolenaar long ul_len; // length of the line including NUL, plus text 384ccae4672SBram Moolenaar // properties 385ccae4672SBram Moolenaar } undoline_T; 386ccae4672SBram Moolenaar 387071d4279SBram Moolenaar typedef struct u_entry u_entry_T; 388071d4279SBram Moolenaar typedef struct u_header u_header_T; 389071d4279SBram Moolenaar struct u_entry 390071d4279SBram Moolenaar { 3916cb39f92SBram Moolenaar u_entry_T *ue_next; // pointer to next entry in list 3926cb39f92SBram Moolenaar linenr_T ue_top; // number of line above undo block 3936cb39f92SBram Moolenaar linenr_T ue_bot; // number of line below undo block 3946cb39f92SBram Moolenaar linenr_T ue_lcount; // linecount when u_save called 3956cb39f92SBram Moolenaar undoline_T *ue_array; // array of lines in undo block 3966cb39f92SBram Moolenaar long ue_size; // number of lines in ue_array 397fecb6605SBram Moolenaar #ifdef U_DEBUG 3986cb39f92SBram Moolenaar int ue_magic; // magic number to check allocation 399fecb6605SBram Moolenaar #endif 400071d4279SBram Moolenaar }; 401071d4279SBram Moolenaar 402071d4279SBram Moolenaar struct u_header 403071d4279SBram Moolenaar { 4046cb39f92SBram Moolenaar // The following have a pointer and a number. The number is used when 4056cb39f92SBram Moolenaar // reading the undo file in u_read_undo() 40683d09bb8SBram Moolenaar union { 4076cb39f92SBram Moolenaar u_header_T *ptr; // pointer to next undo header in list 40883d09bb8SBram Moolenaar long seq; 40983d09bb8SBram Moolenaar } uh_next; 41083d09bb8SBram Moolenaar union { 4116cb39f92SBram Moolenaar u_header_T *ptr; // pointer to previous header in list 41283d09bb8SBram Moolenaar long seq; 41383d09bb8SBram Moolenaar } uh_prev; 41483d09bb8SBram Moolenaar union { 4156cb39f92SBram Moolenaar u_header_T *ptr; // pointer to next header for alt. redo 41683d09bb8SBram Moolenaar long seq; 41783d09bb8SBram Moolenaar } uh_alt_next; 41883d09bb8SBram Moolenaar union { 4196cb39f92SBram Moolenaar u_header_T *ptr; // pointer to previous header for alt. redo 42083d09bb8SBram Moolenaar long seq; 42183d09bb8SBram Moolenaar } uh_alt_prev; 4226cb39f92SBram Moolenaar long uh_seq; // sequence number, higher == newer undo 4236cb39f92SBram Moolenaar int uh_walk; // used by undo_time() 4246cb39f92SBram Moolenaar u_entry_T *uh_entry; // pointer to first entry 4256cb39f92SBram Moolenaar u_entry_T *uh_getbot_entry; // pointer to where ue_bot must be set 4266cb39f92SBram Moolenaar pos_T uh_cursor; // cursor position before saving 427071d4279SBram Moolenaar long uh_cursor_vcol; 4286cb39f92SBram Moolenaar int uh_flags; // see below 4296cb39f92SBram Moolenaar pos_T uh_namedm[NMARKS]; // marks before undo/after redo 4306cb39f92SBram Moolenaar visualinfo_T uh_visual; // Visual areas before undo/after redo 4316cb39f92SBram Moolenaar time_T uh_time; // timestamp when the change was made 4326cb39f92SBram Moolenaar long uh_save_nr; // set when the file was saved after the 4336cb39f92SBram Moolenaar // changes in this block 434fecb6605SBram Moolenaar #ifdef U_DEBUG 4356cb39f92SBram Moolenaar int uh_magic; // magic number to check allocation 436fecb6605SBram Moolenaar #endif 437071d4279SBram Moolenaar }; 438071d4279SBram Moolenaar 4396cb39f92SBram Moolenaar // values for uh_flags 4406cb39f92SBram Moolenaar #define UH_CHANGED 0x01 // b_changed flag before undo/after redo 4416cb39f92SBram Moolenaar #define UH_EMPTYBUF 0x02 // buffer was empty 442071d4279SBram Moolenaar 443071d4279SBram Moolenaar /* 444335437bbSBram Moolenaar * structures used in undo.c 445071d4279SBram Moolenaar */ 4466cb39f92SBram Moolenaar #define ALIGN_LONG // longword alignment and use filler byte 447071d4279SBram Moolenaar #define ALIGN_SIZE (sizeof(long)) 448071d4279SBram Moolenaar 449071d4279SBram Moolenaar #define ALIGN_MASK (ALIGN_SIZE - 1) 450071d4279SBram Moolenaar 451071d4279SBram Moolenaar typedef struct m_info minfo_T; 452071d4279SBram Moolenaar 453071d4279SBram Moolenaar /* 4542767c600SBram Moolenaar * structure used to link chunks in one of the free chunk lists. 455071d4279SBram Moolenaar */ 456071d4279SBram Moolenaar struct m_info 457071d4279SBram Moolenaar { 458071d4279SBram Moolenaar #ifdef ALIGN_LONG 4596cb39f92SBram Moolenaar long_u m_size; // size of the chunk (including m_info) 460071d4279SBram Moolenaar #else 4616cb39f92SBram Moolenaar short_u m_size; // size of the chunk (including m_info) 462071d4279SBram Moolenaar #endif 4636cb39f92SBram Moolenaar minfo_T *m_next; // pointer to next free chunk in the list 464071d4279SBram Moolenaar }; 465071d4279SBram Moolenaar 466071d4279SBram Moolenaar /* 467071d4279SBram Moolenaar * things used in memfile.c 468071d4279SBram Moolenaar */ 469071d4279SBram Moolenaar 470071d4279SBram Moolenaar typedef struct block_hdr bhdr_T; 471071d4279SBram Moolenaar typedef struct memfile memfile_T; 472071d4279SBram Moolenaar typedef long blocknr_T; 473071d4279SBram Moolenaar 474071d4279SBram Moolenaar /* 475b05b10a3SBram Moolenaar * mf_hashtab_T is a chained hashtable with blocknr_T key and arbitrary 476b05b10a3SBram Moolenaar * structures as items. This is an intrusive data structure: we require 477b05b10a3SBram Moolenaar * that items begin with mf_hashitem_T which contains the key and linked 478b05b10a3SBram Moolenaar * list pointers. List of items in each bucket is doubly-linked. 479b05b10a3SBram Moolenaar */ 480b05b10a3SBram Moolenaar 481b05b10a3SBram Moolenaar typedef struct mf_hashitem_S mf_hashitem_T; 482b05b10a3SBram Moolenaar 483b05b10a3SBram Moolenaar struct mf_hashitem_S 484b05b10a3SBram Moolenaar { 485b05b10a3SBram Moolenaar mf_hashitem_T *mhi_next; 486b05b10a3SBram Moolenaar mf_hashitem_T *mhi_prev; 487b05b10a3SBram Moolenaar blocknr_T mhi_key; 488b05b10a3SBram Moolenaar }; 489b05b10a3SBram Moolenaar 490b05b10a3SBram Moolenaar #define MHT_INIT_SIZE 64 491b05b10a3SBram Moolenaar 492b05b10a3SBram Moolenaar typedef struct mf_hashtab_S 493b05b10a3SBram Moolenaar { 4946cb39f92SBram Moolenaar long_u mht_mask; // mask used for hash value (nr of items 4956cb39f92SBram Moolenaar // in array is "mht_mask" + 1) 4966cb39f92SBram Moolenaar long_u mht_count; // nr of items inserted into hashtable 4976cb39f92SBram Moolenaar mf_hashitem_T **mht_buckets; // points to mht_small_buckets or 4986cb39f92SBram Moolenaar //dynamically allocated array 4996cb39f92SBram Moolenaar mf_hashitem_T *mht_small_buckets[MHT_INIT_SIZE]; // initial buckets 5006cb39f92SBram Moolenaar char mht_fixed; // non-zero value forbids growth 501b05b10a3SBram Moolenaar } mf_hashtab_T; 502b05b10a3SBram Moolenaar 503b05b10a3SBram Moolenaar /* 504071d4279SBram Moolenaar * for each (previously) used block in the memfile there is one block header. 505071d4279SBram Moolenaar * 506071d4279SBram Moolenaar * The block may be linked in the used list OR in the free list. 507071d4279SBram Moolenaar * The used blocks are also kept in hash lists. 508071d4279SBram Moolenaar * 509071d4279SBram Moolenaar * The used list is a doubly linked list, most recently used block first. 510071d4279SBram Moolenaar * The blocks in the used list have a block of memory allocated. 511071d4279SBram Moolenaar * mf_used_count is the number of pages in the used list. 512071d4279SBram Moolenaar * The hash lists are used to quickly find a block in the used list. 513071d4279SBram Moolenaar * The free list is a single linked list, not sorted. 514071d4279SBram Moolenaar * The blocks in the free list have no block of memory allocated and 515071d4279SBram Moolenaar * the contents of the block in the file (if any) is irrelevant. 516071d4279SBram Moolenaar */ 517071d4279SBram Moolenaar 518071d4279SBram Moolenaar struct block_hdr 519071d4279SBram Moolenaar { 5206cb39f92SBram Moolenaar mf_hashitem_T bh_hashitem; // header for hash table and key 5216cb39f92SBram Moolenaar #define bh_bnum bh_hashitem.mhi_key // block number, part of bh_hashitem 522b05b10a3SBram Moolenaar 5236cb39f92SBram Moolenaar bhdr_T *bh_next; // next block_hdr in free or used list 5246cb39f92SBram Moolenaar bhdr_T *bh_prev; // previous block_hdr in used list 5256cb39f92SBram Moolenaar char_u *bh_data; // pointer to memory (for used block) 5266cb39f92SBram Moolenaar int bh_page_count; // number of pages in this block 527071d4279SBram Moolenaar 528071d4279SBram Moolenaar #define BH_DIRTY 1 529071d4279SBram Moolenaar #define BH_LOCKED 2 5306cb39f92SBram Moolenaar char bh_flags; // BH_DIRTY or BH_LOCKED 531071d4279SBram Moolenaar }; 532071d4279SBram Moolenaar 533071d4279SBram Moolenaar /* 534071d4279SBram Moolenaar * when a block with a negative number is flushed to the file, it gets 535071d4279SBram Moolenaar * a positive number. Because the reference to the block is still the negative 536071d4279SBram Moolenaar * number, we remember the translation to the new positive number in the 537071d4279SBram Moolenaar * double linked trans lists. The structure is the same as the hash lists. 538071d4279SBram Moolenaar */ 539071d4279SBram Moolenaar typedef struct nr_trans NR_TRANS; 540071d4279SBram Moolenaar 541071d4279SBram Moolenaar struct nr_trans 542071d4279SBram Moolenaar { 5436cb39f92SBram Moolenaar mf_hashitem_T nt_hashitem; // header for hash table and key 5446cb39f92SBram Moolenaar #define nt_old_bnum nt_hashitem.mhi_key // old, negative, number 545b05b10a3SBram Moolenaar 5466cb39f92SBram Moolenaar blocknr_T nt_new_bnum; // new, positive, number 547071d4279SBram Moolenaar }; 548071d4279SBram Moolenaar 5490a36feceSBram Moolenaar 5500a36feceSBram Moolenaar typedef struct buffblock buffblock_T; 5510a36feceSBram Moolenaar typedef struct buffheader buffheader_T; 5520a36feceSBram Moolenaar 553071d4279SBram Moolenaar /* 554071d4279SBram Moolenaar * structure used to store one block of the stuff/redo/recording buffers 555071d4279SBram Moolenaar */ 556071d4279SBram Moolenaar struct buffblock 557071d4279SBram Moolenaar { 5586cb39f92SBram Moolenaar buffblock_T *b_next; // pointer to next buffblock 5596cb39f92SBram Moolenaar char_u b_str[1]; // contents (actually longer) 560071d4279SBram Moolenaar }; 561071d4279SBram Moolenaar 562071d4279SBram Moolenaar /* 563071d4279SBram Moolenaar * header used for the stuff buffer and the redo buffer 564071d4279SBram Moolenaar */ 565071d4279SBram Moolenaar struct buffheader 566071d4279SBram Moolenaar { 5676cb39f92SBram Moolenaar buffblock_T bh_first; // first (dummy) block of list 5686cb39f92SBram Moolenaar buffblock_T *bh_curr; // buffblock for appending 5696cb39f92SBram Moolenaar int bh_index; // index for reading 5706cb39f92SBram Moolenaar int bh_space; // space in bh_curr for appending 571071d4279SBram Moolenaar }; 572071d4279SBram Moolenaar 573d4863aa9SBram Moolenaar typedef struct 574d4863aa9SBram Moolenaar { 575d4863aa9SBram Moolenaar buffheader_T sr_redobuff; 576d4863aa9SBram Moolenaar buffheader_T sr_old_redobuff; 577d4863aa9SBram Moolenaar } save_redo_T; 578d4863aa9SBram Moolenaar 579071d4279SBram Moolenaar /* 580071d4279SBram Moolenaar * used for completion on the command line 581071d4279SBram Moolenaar */ 582071d4279SBram Moolenaar typedef struct expand 583071d4279SBram Moolenaar { 5846cb39f92SBram Moolenaar char_u *xp_pattern; // start of item to expand 585d6beab02SBram Moolenaar int xp_context; // type of expansion 5866cb39f92SBram Moolenaar int xp_pattern_len; // bytes in xp_pattern before cursor 5870a52df50SBram Moolenaar #if defined(FEAT_EVAL) 5886cb39f92SBram Moolenaar char_u *xp_arg; // completion function 5896cb39f92SBram Moolenaar sctx_T xp_script_ctx; // SCTX for completion function 590071d4279SBram Moolenaar #endif 5916cb39f92SBram Moolenaar int xp_backslash; // one of the XP_BS_ values 5928ada17c4SBram Moolenaar #ifndef BACKSLASH_IN_FILENAME 5936cb39f92SBram Moolenaar int xp_shell; // TRUE for a shell command, more 5946cb39f92SBram Moolenaar // characters need to be escaped 5958ada17c4SBram Moolenaar #endif 5966cb39f92SBram Moolenaar int xp_numfiles; // number of files found by 5976cb39f92SBram Moolenaar // file name completion 598d6beab02SBram Moolenaar int xp_col; // cursor position in line 5996cb39f92SBram Moolenaar char_u **xp_files; // list of files 6006cb39f92SBram Moolenaar char_u *xp_line; // text being completed 601071d4279SBram Moolenaar } expand_T; 602071d4279SBram Moolenaar 6036cb39f92SBram Moolenaar /* 6046cb39f92SBram Moolenaar * values for xp_backslash 6056cb39f92SBram Moolenaar */ 6066cb39f92SBram Moolenaar #define XP_BS_NONE 0 // nothing special for backslashes 6076cb39f92SBram Moolenaar #define XP_BS_ONE 1 // uses one backslash before a space 6086cb39f92SBram Moolenaar #define XP_BS_THREE 2 // uses three backslashes before a space 609071d4279SBram Moolenaar 610071d4279SBram Moolenaar /* 61166b51420SBram Moolenaar * Variables shared between getcmdline(), redrawcmdline() and others. 61266b51420SBram Moolenaar * These need to be saved when using CTRL-R |, that's why they are in a 61366b51420SBram Moolenaar * structure. 61466b51420SBram Moolenaar */ 61566b51420SBram Moolenaar typedef struct 61666b51420SBram Moolenaar { 6174aea03ebSBram Moolenaar char_u *cmdbuff; // pointer to command line buffer 6184aea03ebSBram Moolenaar int cmdbufflen; // length of cmdbuff 6194aea03ebSBram Moolenaar int cmdlen; // number of chars in command line 6204aea03ebSBram Moolenaar int cmdpos; // current cursor position 6214aea03ebSBram Moolenaar int cmdspos; // cursor column on screen 6224aea03ebSBram Moolenaar int cmdfirstc; // ':', '/', '?', '=', '>' or NUL 6234aea03ebSBram Moolenaar int cmdindent; // number of spaces before cmdline 6244aea03ebSBram Moolenaar char_u *cmdprompt; // message in front of cmdline 6254aea03ebSBram Moolenaar int cmdattr; // attributes for prompt 6264aea03ebSBram Moolenaar int overstrike; // Typing mode on the command line. Shared by 6274aea03ebSBram Moolenaar // getcmdline() and put_on_cmdline(). 6284aea03ebSBram Moolenaar expand_T *xpc; // struct being used for expansion, xp_pattern 6294aea03ebSBram Moolenaar // may point into cmdbuff 6304aea03ebSBram Moolenaar int xp_context; // type of expansion 63166b51420SBram Moolenaar # ifdef FEAT_EVAL 6324aea03ebSBram Moolenaar char_u *xp_arg; // user-defined expansion arg 6334aea03ebSBram Moolenaar int input_fn; // when TRUE Invoked for input() function 63466b51420SBram Moolenaar # endif 63566b51420SBram Moolenaar } cmdline_info_T; 63666b51420SBram Moolenaar 63766b51420SBram Moolenaar /* 638071d4279SBram Moolenaar * Command modifiers ":vertical", ":browse", ":confirm" and ":hide" set a flag. 639071d4279SBram Moolenaar * This needs to be saved for recursive commands, put them in a structure for 640071d4279SBram Moolenaar * easy manipulation. 641071d4279SBram Moolenaar */ 642071d4279SBram Moolenaar typedef struct 643071d4279SBram Moolenaar { 644e1004401SBram Moolenaar int cmod_flags; // CMOD_ flags 645e1004401SBram Moolenaar #define CMOD_SANDBOX 0x0001 // ":sandbox" 646e1004401SBram Moolenaar #define CMOD_SILENT 0x0002 // ":silent" 647e1004401SBram Moolenaar #define CMOD_ERRSILENT 0x0004 // ":silent!" 648e1004401SBram Moolenaar #define CMOD_UNSILENT 0x0008 // ":unsilent" 649e1004401SBram Moolenaar #define CMOD_NOAUTOCMD 0x0010 // ":noautocmd" 650e1004401SBram Moolenaar #define CMOD_HIDE 0x0020 // ":hide" 651e1004401SBram Moolenaar #define CMOD_BROWSE 0x0040 // ":browse" - invoke file dialog 652e1004401SBram Moolenaar #define CMOD_CONFIRM 0x0080 // ":confirm" - invoke yes/no dialog 653e1004401SBram Moolenaar #define CMOD_KEEPALT 0x0100 // ":keepalt" 654e1004401SBram Moolenaar #define CMOD_KEEPMARKS 0x0200 // ":keepmarks" 655e1004401SBram Moolenaar #define CMOD_KEEPJUMPS 0x0400 // ":keepjumps" 656e1004401SBram Moolenaar #define CMOD_LOCKMARKS 0x0800 // ":lockmarks" 657e1004401SBram Moolenaar #define CMOD_KEEPPATTERNS 0x1000 // ":keeppatterns" 658e1004401SBram Moolenaar #define CMOD_NOSWAPFILE 0x2000 // ":noswapfile" 65939f3b141SBram Moolenaar #define CMOD_VIM9CMD 0x4000 // ":vim9cmd" 66096cf4ba8SBram Moolenaar #define CMOD_LEGACY 0x8000 // ":legacy" 661e1004401SBram Moolenaar 662e1004401SBram Moolenaar int cmod_split; // flags for win_split() 663e1004401SBram Moolenaar int cmod_tab; // > 0 when ":tab" was used 664e1004401SBram Moolenaar regmatch_T cmod_filter_regmatch; // set by :filter /pat/ 665e1004401SBram Moolenaar int cmod_filter_force; // set for :filter! 6665661ed6cSBram Moolenaar 6675661ed6cSBram Moolenaar int cmod_verbose; // non-zero to set 'verbose' 6685661ed6cSBram Moolenaar 6695661ed6cSBram Moolenaar // values for undo_cmdmod() 6705661ed6cSBram Moolenaar char_u *cmod_save_ei; // saved value of 'eventignore' 6715661ed6cSBram Moolenaar #ifdef HAVE_SANDBOX 6725661ed6cSBram Moolenaar int cmod_did_sandbox; // set when "sandbox" was incremented 6735661ed6cSBram Moolenaar #endif 6745661ed6cSBram Moolenaar long cmod_verbose_save; // if 'verbose' was set: value of 6755661ed6cSBram Moolenaar // p_verbose plus one 6765661ed6cSBram Moolenaar int cmod_save_msg_silent; // if non-zero: saved value of 6775661ed6cSBram Moolenaar // msg_silent + 1 678e1004401SBram Moolenaar int cmod_save_msg_scroll; // for restoring msg_scroll 6795661ed6cSBram Moolenaar int cmod_did_esilent; // incremented when emsg_silent is 680071d4279SBram Moolenaar } cmdmod_T; 681071d4279SBram Moolenaar 682a8ffcbbfSBram Moolenaar #define MF_SEED_LEN 8 683071d4279SBram Moolenaar 684071d4279SBram Moolenaar struct memfile 685071d4279SBram Moolenaar { 686b58a4b93SBram Moolenaar char_u *mf_fname; // name of the file 687b58a4b93SBram Moolenaar char_u *mf_ffname; // idem, full path 688b58a4b93SBram Moolenaar int mf_fd; // file descriptor 689b58a4b93SBram Moolenaar int mf_flags; // flags used when opening this memfile 690b58a4b93SBram Moolenaar int mf_reopen; // mf_fd was closed, retry opening 691b58a4b93SBram Moolenaar bhdr_T *mf_free_first; // first block_hdr in free list 692b58a4b93SBram Moolenaar bhdr_T *mf_used_first; // mru block_hdr in used list 693b58a4b93SBram Moolenaar bhdr_T *mf_used_last; // lru block_hdr in used list 694b58a4b93SBram Moolenaar unsigned mf_used_count; // number of pages in used list 695b58a4b93SBram Moolenaar unsigned mf_used_count_max; // maximum number of pages in memory 696b58a4b93SBram Moolenaar mf_hashtab_T mf_hash; // hash lists 697b58a4b93SBram Moolenaar mf_hashtab_T mf_trans; // trans lists 698b58a4b93SBram Moolenaar blocknr_T mf_blocknr_max; // highest positive block number + 1 699b58a4b93SBram Moolenaar blocknr_T mf_blocknr_min; // lowest negative block number - 1 700b58a4b93SBram Moolenaar blocknr_T mf_neg_count; // number of negative blocks numbers 701b58a4b93SBram Moolenaar blocknr_T mf_infile_count; // number of pages in the file 702b58a4b93SBram Moolenaar unsigned mf_page_size; // number of bytes in a page 703b58a4b93SBram Moolenaar int mf_dirty; // TRUE if there are dirty blocks 704a8ffcbbfSBram Moolenaar #ifdef FEAT_CRYPT 705b58a4b93SBram Moolenaar buf_T *mf_buffer; // buffer this memfile is for 706b58a4b93SBram Moolenaar char_u mf_seed[MF_SEED_LEN]; // seed for encryption 707a8ffcbbfSBram Moolenaar 708b58a4b93SBram Moolenaar // Values for key, method and seed used for reading data blocks when 709b58a4b93SBram Moolenaar // updating for a newly set key or method. Only when mf_old_key != NULL. 710a8ffcbbfSBram Moolenaar char_u *mf_old_key; 711a8ffcbbfSBram Moolenaar int mf_old_cm; 712a8ffcbbfSBram Moolenaar char_u mf_old_seed[MF_SEED_LEN]; 713a8ffcbbfSBram Moolenaar #endif 714071d4279SBram Moolenaar }; 715071d4279SBram Moolenaar 716071d4279SBram Moolenaar /* 717071d4279SBram Moolenaar * things used in memline.c 718071d4279SBram Moolenaar */ 719071d4279SBram Moolenaar /* 720071d4279SBram Moolenaar * When searching for a specific line, we remember what blocks in the tree 721071d4279SBram Moolenaar * are the branches leading to that block. This is stored in ml_stack. Each 722071d4279SBram Moolenaar * entry is a pointer to info in a block (may be data block or pointer block) 723071d4279SBram Moolenaar */ 724071d4279SBram Moolenaar typedef struct info_pointer 725071d4279SBram Moolenaar { 7266cb39f92SBram Moolenaar blocknr_T ip_bnum; // block number 7276cb39f92SBram Moolenaar linenr_T ip_low; // lowest lnum in this block 7286cb39f92SBram Moolenaar linenr_T ip_high; // highest lnum in this block 7296cb39f92SBram Moolenaar int ip_index; // index for block with current lnum 7306cb39f92SBram Moolenaar } infoptr_T; // block/index pair 731071d4279SBram Moolenaar 732071d4279SBram Moolenaar #ifdef FEAT_BYTEOFF 733071d4279SBram Moolenaar typedef struct ml_chunksize 734071d4279SBram Moolenaar { 735071d4279SBram Moolenaar int mlcs_numlines; 736071d4279SBram Moolenaar long mlcs_totalsize; 737071d4279SBram Moolenaar } chunksize_T; 738071d4279SBram Moolenaar 7396cb39f92SBram Moolenaar /* 7406cb39f92SBram Moolenaar * Flags when calling ml_updatechunk() 7416cb39f92SBram Moolenaar */ 742071d4279SBram Moolenaar # define ML_CHNK_ADDLINE 1 743071d4279SBram Moolenaar # define ML_CHNK_DELLINE 2 744071d4279SBram Moolenaar # define ML_CHNK_UPDLINE 3 745071d4279SBram Moolenaar #endif 746071d4279SBram Moolenaar 747071d4279SBram Moolenaar /* 748071d4279SBram Moolenaar * the memline structure holds all the information about a memline 749071d4279SBram Moolenaar */ 750071d4279SBram Moolenaar typedef struct memline 751071d4279SBram Moolenaar { 7526cb39f92SBram Moolenaar linenr_T ml_line_count; // number of lines in the buffer 753071d4279SBram Moolenaar 7546cb39f92SBram Moolenaar memfile_T *ml_mfp; // pointer to associated memfile 755071d4279SBram Moolenaar 756d6beab02SBram Moolenaar infoptr_T *ml_stack; // stack of pointer blocks (array of IPTRs) 757d6beab02SBram Moolenaar int ml_stack_top; // current top of ml_stack 758d6beab02SBram Moolenaar int ml_stack_size; // total number of entries in ml_stack 759d6beab02SBram Moolenaar 7606cb39f92SBram Moolenaar #define ML_EMPTY 1 // empty buffer 7616cb39f92SBram Moolenaar #define ML_LINE_DIRTY 2 // cached line was changed and allocated 7626cb39f92SBram Moolenaar #define ML_LOCKED_DIRTY 4 // ml_locked was changed 7636cb39f92SBram Moolenaar #define ML_LOCKED_POS 8 // ml_locked needs positive block number 764071d4279SBram Moolenaar int ml_flags; 765071d4279SBram Moolenaar 766d6beab02SBram Moolenaar colnr_T ml_line_len; // length of the cached line, including NUL 7676cb39f92SBram Moolenaar linenr_T ml_line_lnum; // line number of cached line, 0 if not valid 7686cb39f92SBram Moolenaar char_u *ml_line_ptr; // pointer to cached line 769071d4279SBram Moolenaar 7706cb39f92SBram Moolenaar bhdr_T *ml_locked; // block used by last ml_get 7716cb39f92SBram Moolenaar linenr_T ml_locked_low; // first line in ml_locked 7726cb39f92SBram Moolenaar linenr_T ml_locked_high; // last line in ml_locked 7736cb39f92SBram Moolenaar int ml_locked_lineadd; // number of lines inserted in ml_locked 774071d4279SBram Moolenaar #ifdef FEAT_BYTEOFF 775071d4279SBram Moolenaar chunksize_T *ml_chunksize; 776071d4279SBram Moolenaar int ml_numchunks; 777071d4279SBram Moolenaar int ml_usedchunks; 778071d4279SBram Moolenaar #endif 779071d4279SBram Moolenaar } memline_T; 780071d4279SBram Moolenaar 781a9d4b84dSBram Moolenaar // Values for the flags argument of ml_delete_flags(). 782a9d4b84dSBram Moolenaar #define ML_DEL_MESSAGE 1 // may give a "No lines in buffer" message 783a9d4b84dSBram Moolenaar #define ML_DEL_UNDO 2 // called from undo, do not update textprops 7844cd5c52dSBram Moolenaar #define ML_DEL_NOPROP 4 // splitting data block, do not update textprops 785a9d4b84dSBram Moolenaar 786a9d4b84dSBram Moolenaar // Values for the flags argument of ml_append_int(). 787a9d4b84dSBram Moolenaar #define ML_APPEND_NEW 1 // starting to edit a new file 788a9d4b84dSBram Moolenaar #define ML_APPEND_MARK 2 // mark the new line 789a9d4b84dSBram Moolenaar #define ML_APPEND_UNDO 4 // called from undo 790840f91f1SBram Moolenaar #define ML_APPEND_NOPROP 8 // do not continue textprop from previous line 791a9d4b84dSBram Moolenaar 79298aefe7cSBram Moolenaar 79398aefe7cSBram Moolenaar /* 79498aefe7cSBram Moolenaar * Structure defining text properties. These stick with the text. 79598aefe7cSBram Moolenaar * When stored in memline they are after the text, ml_line_len is larger than 79698aefe7cSBram Moolenaar * STRLEN(ml_line_ptr) + 1. 79798aefe7cSBram Moolenaar */ 79898aefe7cSBram Moolenaar typedef struct textprop_S 79998aefe7cSBram Moolenaar { 800b9c67a51SBram Moolenaar colnr_T tp_col; // start column (one based, in bytes) 80198aefe7cSBram Moolenaar colnr_T tp_len; // length in bytes 80298aefe7cSBram Moolenaar int tp_id; // identifier 80398aefe7cSBram Moolenaar int tp_type; // property type 80498aefe7cSBram Moolenaar int tp_flags; // TP_FLAG_ values 80598aefe7cSBram Moolenaar } textprop_T; 80698aefe7cSBram Moolenaar 80798aefe7cSBram Moolenaar #define TP_FLAG_CONT_NEXT 1 // property continues in next line 80898aefe7cSBram Moolenaar #define TP_FLAG_CONT_PREV 2 // property was continued from prev line 80998aefe7cSBram Moolenaar 81098aefe7cSBram Moolenaar /* 81198aefe7cSBram Moolenaar * Structure defining a property type. 81298aefe7cSBram Moolenaar */ 81398aefe7cSBram Moolenaar typedef struct proptype_S 81498aefe7cSBram Moolenaar { 81598aefe7cSBram Moolenaar int pt_id; // value used for tp_id 81698aefe7cSBram Moolenaar int pt_type; // number used for tp_type 81798aefe7cSBram Moolenaar int pt_hl_id; // highlighting 81898aefe7cSBram Moolenaar int pt_priority; // priority 81998aefe7cSBram Moolenaar int pt_flags; // PT_FLAG_ values 82098aefe7cSBram Moolenaar char_u pt_name[1]; // property type name, actually longer 82198aefe7cSBram Moolenaar } proptype_T; 82298aefe7cSBram Moolenaar 82398aefe7cSBram Moolenaar #define PT_FLAG_INS_START_INCL 1 // insert at start included in property 82498aefe7cSBram Moolenaar #define PT_FLAG_INS_END_INCL 2 // insert at end included in property 825de24a870SBram Moolenaar #define PT_FLAG_COMBINE 4 // combine with syntax highlight 82698aefe7cSBram Moolenaar 8277a2d9892SBram Moolenaar // Sign group 8287a2d9892SBram Moolenaar typedef struct signgroup_S 8297a2d9892SBram Moolenaar { 8306656c2ecSBram Moolenaar int sg_next_sign_id; // next sign id for this group 8316656c2ecSBram Moolenaar short_u sg_refcount; // number of signs in this group 83247ed553fSBram Moolenaar char_u sg_name[1]; // sign group name, actually longer 8337a2d9892SBram Moolenaar } signgroup_T; 8347a2d9892SBram Moolenaar 8356656c2ecSBram Moolenaar typedef struct sign_entry sign_entry_T; 8366656c2ecSBram Moolenaar struct sign_entry 837071d4279SBram Moolenaar { 8386656c2ecSBram Moolenaar int se_id; // unique identifier for each placed sign 8396656c2ecSBram Moolenaar int se_typenr; // typenr of sign 8406656c2ecSBram Moolenaar int se_priority; // priority for highlighting 841d6beab02SBram Moolenaar linenr_T se_lnum; // line number which has this sign 842d6beab02SBram Moolenaar signgroup_T *se_group; // sign group 8436656c2ecSBram Moolenaar sign_entry_T *se_next; // next entry in a list of signs 8446656c2ecSBram Moolenaar sign_entry_T *se_prev; // previous entry -- for easy reordering 845071d4279SBram Moolenaar }; 846071d4279SBram Moolenaar 8474e038571SBram Moolenaar /* 8484e038571SBram Moolenaar * Sign attributes. Used by the screen refresh routines. 8494e038571SBram Moolenaar */ 8504e038571SBram Moolenaar typedef struct sign_attrs_S { 8516656c2ecSBram Moolenaar int sat_typenr; 8526656c2ecSBram Moolenaar void *sat_icon; 8536656c2ecSBram Moolenaar char_u *sat_text; 8546656c2ecSBram Moolenaar int sat_texthl; 8556656c2ecSBram Moolenaar int sat_linehl; 85639f7aa3cSBram Moolenaar int sat_priority; 8574e038571SBram Moolenaar } sign_attrs_T; 8584e038571SBram Moolenaar 859ced198d4SBram Moolenaar #if defined(FEAT_SIGNS) || defined(PROTO) 860ced198d4SBram Moolenaar // Macros to get the sign group structure from the group name 861ced198d4SBram Moolenaar #define SGN_KEY_OFF offsetof(signgroup_T, sg_name) 862ced198d4SBram Moolenaar #define HI2SG(hi) ((signgroup_T *)((hi)->hi_key - SGN_KEY_OFF)) 863ced198d4SBram Moolenaar 864162b7147SBram Moolenaar // Default sign priority for highlighting 865162b7147SBram Moolenaar #define SIGN_DEF_PRIO 10 866162b7147SBram Moolenaar 867071d4279SBram Moolenaar #endif 868071d4279SBram Moolenaar 869071d4279SBram Moolenaar /* 870071d4279SBram Moolenaar * Argument list: Array of file names. 871071d4279SBram Moolenaar * Used for the global argument list and the argument lists local to a window. 872071d4279SBram Moolenaar */ 873071d4279SBram Moolenaar typedef struct arglist 874071d4279SBram Moolenaar { 8756cb39f92SBram Moolenaar garray_T al_ga; // growarray with the array of file names 8766cb39f92SBram Moolenaar int al_refcount; // number of windows using this arglist 8776cb39f92SBram Moolenaar int id; // id of this arglist 878071d4279SBram Moolenaar } alist_T; 879071d4279SBram Moolenaar 880071d4279SBram Moolenaar /* 881071d4279SBram Moolenaar * For each argument remember the file name as it was given, and the buffer 882071d4279SBram Moolenaar * number that contains the expanded file name (required for when ":cd" is 883d6beab02SBram Moolenaar * used). 884071d4279SBram Moolenaar */ 885071d4279SBram Moolenaar typedef struct argentry 886071d4279SBram Moolenaar { 8876cb39f92SBram Moolenaar char_u *ae_fname; // file name as specified 8886cb39f92SBram Moolenaar int ae_fnum; // buffer number with expanded file name 889071d4279SBram Moolenaar } aentry_T; 890071d4279SBram Moolenaar 891071d4279SBram Moolenaar #define ALIST(win) (win)->w_alist 892071d4279SBram Moolenaar #define GARGLIST ((aentry_T *)global_alist.al_ga.ga_data) 893071d4279SBram Moolenaar #define ARGLIST ((aentry_T *)ALIST(curwin)->al_ga.ga_data) 894071d4279SBram Moolenaar #define WARGLIST(wp) ((aentry_T *)ALIST(wp)->al_ga.ga_data) 895071d4279SBram Moolenaar #define AARGLIST(al) ((aentry_T *)((al)->al_ga.ga_data)) 896071d4279SBram Moolenaar #define GARGCOUNT (global_alist.al_ga.ga_len) 897071d4279SBram Moolenaar #define ARGCOUNT (ALIST(curwin)->al_ga.ga_len) 898071d4279SBram Moolenaar #define WARGCOUNT(wp) (ALIST(wp)->al_ga.ga_len) 899071d4279SBram Moolenaar 900071d4279SBram Moolenaar /* 901071d4279SBram Moolenaar * A list used for saving values of "emsg_silent". Used by ex_try() to save the 902071d4279SBram Moolenaar * value of "emsg_silent" if it was non-zero. When this is done, the CSF_SILENT 903071d4279SBram Moolenaar * flag below is set. 904071d4279SBram Moolenaar */ 905071d4279SBram Moolenaar 906071d4279SBram Moolenaar typedef struct eslist_elem eslist_T; 907071d4279SBram Moolenaar struct eslist_elem 908071d4279SBram Moolenaar { 9096cb39f92SBram Moolenaar int saved_emsg_silent; // saved value of "emsg_silent" 9106cb39f92SBram Moolenaar eslist_T *next; // next element on the list 911071d4279SBram Moolenaar }; 912071d4279SBram Moolenaar 913071d4279SBram Moolenaar /* 914071d4279SBram Moolenaar * For conditional commands a stack is kept of nested conditionals. 915071d4279SBram Moolenaar * When cs_idx < 0, there is no conditional command. 916071d4279SBram Moolenaar */ 917071d4279SBram Moolenaar #define CSTACK_LEN 50 918071d4279SBram Moolenaar 919ddef1291SBram Moolenaar typedef struct { 9206cb39f92SBram Moolenaar short cs_flags[CSTACK_LEN]; // CSF_ flags 9216cb39f92SBram Moolenaar char cs_pending[CSTACK_LEN]; // CSTP_: what's pending in ":finally" 922071d4279SBram Moolenaar union { 9236cb39f92SBram Moolenaar void *csp_rv[CSTACK_LEN]; // return typeval for pending return 9246cb39f92SBram Moolenaar void *csp_ex[CSTACK_LEN]; // exception for pending throw 925071d4279SBram Moolenaar } cs_pend; 9266cb39f92SBram Moolenaar void *cs_forinfo[CSTACK_LEN]; // info used by ":for" 9276cb39f92SBram Moolenaar int cs_line[CSTACK_LEN]; // line nr of ":while"/":for" line 9288d739de4SBram Moolenaar int cs_block_id[CSTACK_LEN]; // block ID stack 929fcdc5d83SBram Moolenaar int cs_script_var_len[CSTACK_LEN]; // value of sn_var_vals.ga_len 930fcdc5d83SBram Moolenaar // when entering the block 9316cb39f92SBram Moolenaar int cs_idx; // current entry, or -1 if none 9326cb39f92SBram Moolenaar int cs_looplevel; // nr of nested ":while"s and ":for"s 9336cb39f92SBram Moolenaar int cs_trylevel; // nr of nested ":try"s 9346cb39f92SBram Moolenaar eslist_T *cs_emsg_silent_list; // saved values of "emsg_silent" 9356cb39f92SBram Moolenaar char cs_lflags; // loop flags: CSL_ flags 936ddef1291SBram Moolenaar } cstack_T; 9371280586eSBram Moolenaar # define cs_rettv cs_pend.csp_rv 9381280586eSBram Moolenaar # define cs_exception cs_pend.csp_ex 939071d4279SBram Moolenaar 9406cb39f92SBram Moolenaar // There is no CSF_IF, the lack of CSF_WHILE, CSF_FOR and CSF_TRY means ":if" 9416cb39f92SBram Moolenaar // was used. 9426cb39f92SBram Moolenaar # define CSF_TRUE 0x0001 // condition was TRUE 9436cb39f92SBram Moolenaar # define CSF_ACTIVE 0x0002 // current state is active 9446cb39f92SBram Moolenaar # define CSF_ELSE 0x0004 // ":else" has been passed 9456cb39f92SBram Moolenaar # define CSF_WHILE 0x0008 // is a ":while" 9466cb39f92SBram Moolenaar # define CSF_FOR 0x0010 // is a ":for" 9479becdf2bSBram Moolenaar # define CSF_BLOCK 0x0020 // is a "{" block 9481280586eSBram Moolenaar 9496cb39f92SBram Moolenaar # define CSF_TRY 0x0100 // is a ":try" 9506cb39f92SBram Moolenaar # define CSF_FINALLY 0x0200 // ":finally" has been passed 9514197828dSBram Moolenaar # define CSF_CATCH 0x0400 // ":catch" has been seen 9524197828dSBram Moolenaar # define CSF_THROWN 0x0800 // exception thrown to this try conditional 9534197828dSBram Moolenaar # define CSF_CAUGHT 0x1000 // exception caught by this try conditional 954f67d3fb7SBram Moolenaar # define CSF_FINISHED 0x2000 // CSF_CAUGHT was handled by finish_exception() 955f67d3fb7SBram Moolenaar # define CSF_SILENT 0x4000 // "emsg_silent" reset by ":try" 9566cb39f92SBram Moolenaar // Note that CSF_ELSE is only used when CSF_TRY and CSF_WHILE are unset 9576cb39f92SBram Moolenaar // (an ":if"), and CSF_SILENT is only used when CSF_TRY is set. 958f67d3fb7SBram Moolenaar 959f67d3fb7SBram Moolenaar # define CSF_FUNC_DEF 0x8000 // a function was defined in this block 960071d4279SBram Moolenaar 961071d4279SBram Moolenaar /* 962071d4279SBram Moolenaar * What's pending for being reactivated at the ":endtry" of this try 963071d4279SBram Moolenaar * conditional: 964071d4279SBram Moolenaar */ 9656cb39f92SBram Moolenaar # define CSTP_NONE 0 // nothing pending in ":finally" clause 9666cb39f92SBram Moolenaar # define CSTP_ERROR 1 // an error is pending 9676cb39f92SBram Moolenaar # define CSTP_INTERRUPT 2 // an interrupt is pending 9686cb39f92SBram Moolenaar # define CSTP_THROW 4 // a throw is pending 9696cb39f92SBram Moolenaar # define CSTP_BREAK 8 // ":break" is pending 9706cb39f92SBram Moolenaar # define CSTP_CONTINUE 16 // ":continue" is pending 9716cb39f92SBram Moolenaar # define CSTP_RETURN 24 // ":return" is pending 9726cb39f92SBram Moolenaar # define CSTP_FINISH 32 // ":finish" is pending 973071d4279SBram Moolenaar 974071d4279SBram Moolenaar /* 975ddef1291SBram Moolenaar * Flags for the cs_lflags item in cstack_T. 9761280586eSBram Moolenaar */ 9776cb39f92SBram Moolenaar # define CSL_HAD_LOOP 1 // just found ":while" or ":for" 9786cb39f92SBram Moolenaar # define CSL_HAD_ENDLOOP 2 // just found ":endwhile" or ":endfor" 9796cb39f92SBram Moolenaar # define CSL_HAD_CONT 4 // just found ":continue" 9806cb39f92SBram Moolenaar # define CSL_HAD_FINA 8 // just found ":finally" 9811280586eSBram Moolenaar 9821280586eSBram Moolenaar /* 983071d4279SBram Moolenaar * A list of error messages that can be converted to an exception. "throw_msg" 984071d4279SBram Moolenaar * is only set in the first element of the list. Usually, it points to the 985071d4279SBram Moolenaar * original message stored in that element, but sometimes it points to a later 98625e0f586SBram Moolenaar * message in the list. See cause_errthrow(). 987071d4279SBram Moolenaar */ 98825e0f586SBram Moolenaar typedef struct msglist msglist_T; 989071d4279SBram Moolenaar struct msglist 990071d4279SBram Moolenaar { 991e8c4660aSBram Moolenaar msglist_T *next; // next of several messages in a row 99225e0f586SBram Moolenaar char *msg; // original message, allocated 9936cb39f92SBram Moolenaar char *throw_msg; // msg to throw: usually original one 99425e0f586SBram Moolenaar char_u *sfile; // value from estack_sfile(), allocated 99525e0f586SBram Moolenaar long slnum; // line number for "sfile" 996e8c4660aSBram Moolenaar int msg_compiling; // saved value of estack_compiling 997071d4279SBram Moolenaar }; 998071d4279SBram Moolenaar 999071d4279SBram Moolenaar /* 10008a5883b7SBram Moolenaar * The exception types. 10018a5883b7SBram Moolenaar */ 10028a5883b7SBram Moolenaar typedef enum 10038a5883b7SBram Moolenaar { 1004ea3ece40SBram Moolenaar ET_USER, // exception caused by ":throw" command 1005ea3ece40SBram Moolenaar ET_ERROR, // error exception 1006ea3ece40SBram Moolenaar ET_INTERRUPT, // interrupt exception triggered by Ctrl-C 10078a5883b7SBram Moolenaar } except_type_T; 10088a5883b7SBram Moolenaar 10098a5883b7SBram Moolenaar /* 1010071d4279SBram Moolenaar * Structure describing an exception. 1011071d4279SBram Moolenaar * (don't use "struct exception", it's used by the math library). 1012071d4279SBram Moolenaar */ 1013071d4279SBram Moolenaar typedef struct vim_exception except_T; 1014071d4279SBram Moolenaar struct vim_exception 1015071d4279SBram Moolenaar { 10166cb39f92SBram Moolenaar except_type_T type; // exception type 10176cb39f92SBram Moolenaar char *value; // exception value 10186cb39f92SBram Moolenaar struct msglist *messages; // message(s) causing error exception 10196cb39f92SBram Moolenaar char_u *throw_name; // name of the throw point 10206cb39f92SBram Moolenaar linenr_T throw_lnum; // line number of the throw point 10216cb39f92SBram Moolenaar except_T *caught; // next exception on the caught stack 1022071d4279SBram Moolenaar }; 1023071d4279SBram Moolenaar 1024071d4279SBram Moolenaar /* 1025c0197e28SBram Moolenaar * Structure to save the error/interrupt/exception state between calls to 1026c0197e28SBram Moolenaar * enter_cleanup() and leave_cleanup(). Must be allocated as an automatic 1027c0197e28SBram Moolenaar * variable by the (common) caller of these functions. 1028c0197e28SBram Moolenaar */ 1029c0197e28SBram Moolenaar typedef struct cleanup_stuff cleanup_T; 1030c0197e28SBram Moolenaar struct cleanup_stuff 1031c0197e28SBram Moolenaar { 10326cb39f92SBram Moolenaar int pending; // error/interrupt/exception state 10336cb39f92SBram Moolenaar except_T *exception; // exception value 1034c0197e28SBram Moolenaar }; 1035071d4279SBram Moolenaar 1036071d4279SBram Moolenaar #ifdef FEAT_SYN_HL 10376cb39f92SBram Moolenaar // struct passed to in_id_list() 1038071d4279SBram Moolenaar struct sp_syn 1039071d4279SBram Moolenaar { 10406cb39f92SBram Moolenaar int inc_tag; // ":syn include" unique tag 10416cb39f92SBram Moolenaar short id; // highlight group ID of item 10426cb39f92SBram Moolenaar short *cont_in_list; // cont.in group IDs, if non-zero 1043071d4279SBram Moolenaar }; 1044071d4279SBram Moolenaar 1045071d4279SBram Moolenaar /* 1046071d4279SBram Moolenaar * Each keyword has one keyentry, which is linked in a hash list. 1047071d4279SBram Moolenaar */ 1048071d4279SBram Moolenaar typedef struct keyentry keyentry_T; 1049071d4279SBram Moolenaar 1050071d4279SBram Moolenaar struct keyentry 1051071d4279SBram Moolenaar { 10526cb39f92SBram Moolenaar keyentry_T *ke_next; // next entry with identical "keyword[]" 10536cb39f92SBram Moolenaar struct sp_syn k_syn; // struct passed to in_id_list() 10546cb39f92SBram Moolenaar short *next_list; // ID list for next match (if non-zero) 1055860cae1cSBram Moolenaar int flags; 10566cb39f92SBram Moolenaar int k_char; // conceal substitute character 10576cb39f92SBram Moolenaar char_u keyword[1]; // actually longer 1058071d4279SBram Moolenaar }; 1059071d4279SBram Moolenaar 1060071d4279SBram Moolenaar /* 1061071d4279SBram Moolenaar * Struct used to store one state of the state stack. 1062071d4279SBram Moolenaar */ 1063071d4279SBram Moolenaar typedef struct buf_state 1064071d4279SBram Moolenaar { 10656cb39f92SBram Moolenaar int bs_idx; // index of pattern 10666cb39f92SBram Moolenaar int bs_flags; // flags for pattern 10676e202e52SBram Moolenaar #ifdef FEAT_CONCEAL 10686cb39f92SBram Moolenaar int bs_seqnr; // stores si_seqnr 10696cb39f92SBram Moolenaar int bs_cchar; // stores si_cchar 10706e202e52SBram Moolenaar #endif 10716cb39f92SBram Moolenaar reg_extmatch_T *bs_extmatch; // external matches from start pattern 1072071d4279SBram Moolenaar } bufstate_T; 1073071d4279SBram Moolenaar 1074071d4279SBram Moolenaar /* 1075071d4279SBram Moolenaar * syn_state contains the syntax state stack for the start of one line. 1076071d4279SBram Moolenaar * Used by b_sst_array[]. 1077071d4279SBram Moolenaar */ 1078071d4279SBram Moolenaar typedef struct syn_state synstate_T; 1079071d4279SBram Moolenaar 1080071d4279SBram Moolenaar struct syn_state 1081071d4279SBram Moolenaar { 10826cb39f92SBram Moolenaar synstate_T *sst_next; // next entry in used or free list 10836cb39f92SBram Moolenaar linenr_T sst_lnum; // line number for this state 1084071d4279SBram Moolenaar union 1085071d4279SBram Moolenaar { 10866cb39f92SBram Moolenaar bufstate_T sst_stack[SST_FIX_STATES]; // short state stack 10876cb39f92SBram Moolenaar garray_T sst_ga; // growarray for long state stack 1088071d4279SBram Moolenaar } sst_union; 10896cb39f92SBram Moolenaar int sst_next_flags; // flags for sst_next_list 10906cb39f92SBram Moolenaar int sst_stacksize; // number of states on the stack 10916cb39f92SBram Moolenaar short *sst_next_list; // "nextgroup" list in this state 10926cb39f92SBram Moolenaar // (this is a copy, don't free it! 10936cb39f92SBram Moolenaar disptick_T sst_tick; // tick when last displayed 10946cb39f92SBram Moolenaar linenr_T sst_change_lnum;// when non-zero, change in this line 10956cb39f92SBram Moolenaar // may have made the state invalid 1096071d4279SBram Moolenaar }; 10976cb39f92SBram Moolenaar #endif // FEAT_SYN_HL 1098071d4279SBram Moolenaar 1099f9cc9f20SBram Moolenaar #define MAX_HL_ID 20000 // maximum value for a highlight ID. 1100f9cc9f20SBram Moolenaar 1101f9cc9f20SBram Moolenaar /* 1102071d4279SBram Moolenaar * Structure shared between syntax.c, screen.c and gui_x11.c. 1103071d4279SBram Moolenaar */ 1104071d4279SBram Moolenaar typedef struct attr_entry 1105071d4279SBram Moolenaar { 11066cb39f92SBram Moolenaar short ae_attr; // HL_BOLD, etc. 1107071d4279SBram Moolenaar union 1108071d4279SBram Moolenaar { 1109071d4279SBram Moolenaar struct 1110071d4279SBram Moolenaar { 11116cb39f92SBram Moolenaar char_u *start; // start escape sequence 11126cb39f92SBram Moolenaar char_u *stop; // stop escape sequence 1113071d4279SBram Moolenaar } term; 1114071d4279SBram Moolenaar struct 1115071d4279SBram Moolenaar { 11166cb39f92SBram Moolenaar // These colors need to be > 8 bits to hold 256. 11176cb39f92SBram Moolenaar short_u fg_color; // foreground color number 11186cb39f92SBram Moolenaar short_u bg_color; // background color number 1119e023e88bSBram Moolenaar short_u ul_color; // underline color number 112061be73bbSBram Moolenaar # ifdef FEAT_TERMGUICOLORS 11216cb39f92SBram Moolenaar guicolor_T fg_rgb; // foreground color RGB 11226cb39f92SBram Moolenaar guicolor_T bg_rgb; // background color RGB 1123e023e88bSBram Moolenaar guicolor_T ul_rgb; // underline color RGB 11248a633e34SBram Moolenaar # endif 1125071d4279SBram Moolenaar } cterm; 1126071d4279SBram Moolenaar # ifdef FEAT_GUI 1127071d4279SBram Moolenaar struct 1128071d4279SBram Moolenaar { 11296cb39f92SBram Moolenaar guicolor_T fg_color; // foreground color handle 11306cb39f92SBram Moolenaar guicolor_T bg_color; // background color handle 11316cb39f92SBram Moolenaar guicolor_T sp_color; // special color handle 11326cb39f92SBram Moolenaar GuiFont font; // font handle 1133071d4279SBram Moolenaar # ifdef FEAT_XFONTSET 11346cb39f92SBram Moolenaar GuiFontset fontset; // fontset handle 1135071d4279SBram Moolenaar # endif 1136071d4279SBram Moolenaar } gui; 1137071d4279SBram Moolenaar # endif 1138071d4279SBram Moolenaar } ae_u; 1139071d4279SBram Moolenaar } attrentry_T; 1140071d4279SBram Moolenaar 1141071d4279SBram Moolenaar #ifdef USE_ICONV 1142071d4279SBram Moolenaar # ifdef HAVE_ICONV_H 1143071d4279SBram Moolenaar # include <iconv.h> 1144071d4279SBram Moolenaar # else 1145071d4279SBram Moolenaar # if defined(MACOS_X) 1146071d4279SBram Moolenaar # include <sys/errno.h> 1147d057301bSBram Moolenaar # ifndef EILSEQ 11486cb39f92SBram Moolenaar # define EILSEQ ENOENT // Early MacOS X does not have EILSEQ 1149d057301bSBram Moolenaar # endif 1150071d4279SBram Moolenaar typedef struct _iconv_t *iconv_t; 1151071d4279SBram Moolenaar # else 1152071d4279SBram Moolenaar # include <errno.h> 1153071d4279SBram Moolenaar # endif 1154071d4279SBram Moolenaar typedef void *iconv_t; 1155071d4279SBram Moolenaar # endif 1156071d4279SBram Moolenaar #endif 1157071d4279SBram Moolenaar 1158071d4279SBram Moolenaar /* 1159071d4279SBram Moolenaar * Used for the typeahead buffer: typebuf. 1160071d4279SBram Moolenaar */ 1161071d4279SBram Moolenaar typedef struct 1162071d4279SBram Moolenaar { 11636cb39f92SBram Moolenaar char_u *tb_buf; // buffer for typed characters 11646cb39f92SBram Moolenaar char_u *tb_noremap; // mapping flags for characters in tb_buf[] 11656cb39f92SBram Moolenaar int tb_buflen; // size of tb_buf[] 11666cb39f92SBram Moolenaar int tb_off; // current position in tb_buf[] 11676cb39f92SBram Moolenaar int tb_len; // number of valid bytes in tb_buf[] 11686cb39f92SBram Moolenaar int tb_maplen; // nr of mapped bytes in tb_buf[] 11696cb39f92SBram Moolenaar int tb_silent; // nr of silently mapped bytes in tb_buf[] 11706cb39f92SBram Moolenaar int tb_no_abbr_cnt; // nr of bytes without abbrev. in tb_buf[] 11716cb39f92SBram Moolenaar int tb_change_cnt; // nr of time tb_buf was changed; never zero 1172071d4279SBram Moolenaar } typebuf_T; 1173071d4279SBram Moolenaar 11749bf703d4SBram Moolenaar // Struct to hold the saved typeahead for save_typeahead(). 1175071d4279SBram Moolenaar typedef struct 1176071d4279SBram Moolenaar { 1177071d4279SBram Moolenaar typebuf_T save_typebuf; 11786cb39f92SBram Moolenaar int typebuf_valid; // TRUE when save_typebuf valid 117913df0feaSBram Moolenaar int old_char; 118013df0feaSBram Moolenaar int old_mod_mask; 11810a36feceSBram Moolenaar buffheader_T save_readbuf1; 11820a36feceSBram Moolenaar buffheader_T save_readbuf2; 1183071d4279SBram Moolenaar #ifdef USE_INPUT_BUF 1184071d4279SBram Moolenaar char_u *save_inputbuf; 1185071d4279SBram Moolenaar #endif 1186071d4279SBram Moolenaar } tasave_T; 1187071d4279SBram Moolenaar 1188071d4279SBram Moolenaar /* 1189071d4279SBram Moolenaar * Used for conversion of terminal I/O and script files. 1190071d4279SBram Moolenaar */ 1191071d4279SBram Moolenaar typedef struct 1192071d4279SBram Moolenaar { 11936cb39f92SBram Moolenaar int vc_type; // zero or one of the CONV_ values 11946cb39f92SBram Moolenaar int vc_factor; // max. expansion factor 11954f97475dSBram Moolenaar # ifdef MSWIN 11966cb39f92SBram Moolenaar int vc_cpfrom; // codepage to convert from (CONV_CODEPAGE) 11976cb39f92SBram Moolenaar int vc_cpto; // codepage to convert to (CONV_CODEPAGE) 1198071d4279SBram Moolenaar # endif 1199071d4279SBram Moolenaar # ifdef USE_ICONV 12006cb39f92SBram Moolenaar iconv_t vc_fd; // for CONV_ICONV 1201071d4279SBram Moolenaar # endif 12026cb39f92SBram Moolenaar int vc_fail; // fail for invalid char, don't use '?' 1203071d4279SBram Moolenaar } vimconv_T; 1204071d4279SBram Moolenaar 1205071d4279SBram Moolenaar /* 12065f32ece4SBram Moolenaar * Structure used for the command line history. 12075f32ece4SBram Moolenaar */ 12085f32ece4SBram Moolenaar typedef struct hist_entry 12095f32ece4SBram Moolenaar { 12104aea03ebSBram Moolenaar int hisnum; // identifying number 12114aea03ebSBram Moolenaar int viminfo; // when TRUE hisstr comes from viminfo 12124aea03ebSBram Moolenaar char_u *hisstr; // actual entry, separator char after the NUL 12134aea03ebSBram Moolenaar time_t time_set; // when it was typed, zero if unknown 12145f32ece4SBram Moolenaar } histentry_T; 12155f32ece4SBram Moolenaar 1216071d4279SBram Moolenaar #define CONV_NONE 0 1217071d4279SBram Moolenaar #define CONV_TO_UTF8 1 12183fdfa4a9SBram Moolenaar #define CONV_9_TO_UTF8 2 12193fdfa4a9SBram Moolenaar #define CONV_TO_LATIN1 3 12203fdfa4a9SBram Moolenaar #define CONV_TO_LATIN9 4 12213fdfa4a9SBram Moolenaar #define CONV_ICONV 5 12224f97475dSBram Moolenaar #ifdef MSWIN 12236cb39f92SBram Moolenaar # define CONV_CODEPAGE 10 // codepage -> codepage 1224071d4279SBram Moolenaar #endif 1225071d4279SBram Moolenaar #ifdef MACOS_X 12263fdfa4a9SBram Moolenaar # define CONV_MAC_LATIN1 20 12273fdfa4a9SBram Moolenaar # define CONV_LATIN1_MAC 21 12283fdfa4a9SBram Moolenaar # define CONV_MAC_UTF8 22 12293fdfa4a9SBram Moolenaar # define CONV_UTF8_MAC 23 1230071d4279SBram Moolenaar #endif 1231071d4279SBram Moolenaar 1232071d4279SBram Moolenaar /* 1233071d4279SBram Moolenaar * Structure used for mappings and abbreviations. 1234071d4279SBram Moolenaar */ 1235071d4279SBram Moolenaar typedef struct mapblock mapblock_T; 1236071d4279SBram Moolenaar struct mapblock 1237071d4279SBram Moolenaar { 12386cb39f92SBram Moolenaar mapblock_T *m_next; // next mapblock in list 12396cb39f92SBram Moolenaar char_u *m_keys; // mapped from, lhs 12406cb39f92SBram Moolenaar char_u *m_str; // mapped to, rhs 12416cb39f92SBram Moolenaar char_u *m_orig_str; // rhs as entered by the user 12426cb39f92SBram Moolenaar int m_keylen; // strlen(m_keys) 12436cb39f92SBram Moolenaar int m_mode; // valid mode 1244459fd785SBram Moolenaar int m_simplified; // m_keys was simplified, do not use this map 1245459fd785SBram Moolenaar // if seenModifyOtherKeys is TRUE 12466cb39f92SBram Moolenaar int m_noremap; // if non-zero no re-mapping for m_str 12476cb39f92SBram Moolenaar char m_silent; // <silent> used, don't echo commands 12486cb39f92SBram Moolenaar char m_nowait; // <nowait> used 1249ae5bce1cSBram Moolenaar #ifdef FEAT_EVAL 12509b8d6226SBram Moolenaar char m_expr; // <expr> used, m_str is an expression 12513276f584SDominique Pelle sctx_T m_script_ctx; // SCTX where map was defined 1252071d4279SBram Moolenaar #endif 1253071d4279SBram Moolenaar }; 1254071d4279SBram Moolenaar 12558133cc6bSBram Moolenaar 1256071d4279SBram Moolenaar /* 1257071d4279SBram Moolenaar * Used for highlighting in the status line. 1258071d4279SBram Moolenaar */ 12598133cc6bSBram Moolenaar typedef struct 1260071d4279SBram Moolenaar { 1261071d4279SBram Moolenaar char_u *start; 12626cb39f92SBram Moolenaar int userhl; // 0: no HL, 1-9: User HL, < 0 for syn ID 12638133cc6bSBram Moolenaar } stl_hlrec_T; 1264071d4279SBram Moolenaar 1265860cae1cSBram Moolenaar 1266860cae1cSBram Moolenaar /* 1267860cae1cSBram Moolenaar * Syntax items - usually buffer-specific. 1268860cae1cSBram Moolenaar */ 1269860cae1cSBram Moolenaar 12709bf703d4SBram Moolenaar /* 12719bf703d4SBram Moolenaar * Item for a hashtable. "hi_key" can be one of three values: 1272dcaf10e1SBram Moolenaar * NULL: Never been used 1273dcaf10e1SBram Moolenaar * HI_KEY_REMOVED: Entry was removed 1274dcaf10e1SBram Moolenaar * Otherwise: Used item, pointer to the actual key; this usually is 1275dcaf10e1SBram Moolenaar * inside the item, subtract an offset to locate the item. 1276dcaf10e1SBram Moolenaar * This reduces the size of hashitem by 1/3. 1277dcaf10e1SBram Moolenaar */ 1278dcaf10e1SBram Moolenaar typedef struct hashitem_S 1279dcaf10e1SBram Moolenaar { 12806cb39f92SBram Moolenaar long_u hi_hash; // cached hash number of hi_key 1281dcaf10e1SBram Moolenaar char_u *hi_key; 12828f999f19SBram Moolenaar } hashitem_T; 1283dcaf10e1SBram Moolenaar 12846cb39f92SBram Moolenaar // The address of "hash_removed" is used as a magic number for hi_key to 12856cb39f92SBram Moolenaar // indicate a removed item. 1286dcaf10e1SBram Moolenaar #define HI_KEY_REMOVED &hash_removed 1287dcaf10e1SBram Moolenaar #define HASHITEM_EMPTY(hi) ((hi)->hi_key == NULL || (hi)->hi_key == &hash_removed) 1288dcaf10e1SBram Moolenaar 12896cb39f92SBram Moolenaar // Initial size for a hashtable. Our items are relatively small and growing 12906cb39f92SBram Moolenaar // is expensive, thus use 16 as a start. Must be a power of 2. 1291ac3150d3SBram Moolenaar // This allows for storing 10 items (2/3 of 16) before a resize is needed. 1292dcaf10e1SBram Moolenaar #define HT_INIT_SIZE 16 1293dcaf10e1SBram Moolenaar 1294dcaf10e1SBram Moolenaar typedef struct hashtable_S 1295dcaf10e1SBram Moolenaar { 12966cb39f92SBram Moolenaar long_u ht_mask; // mask used for hash value (nr of items in 12976cb39f92SBram Moolenaar // array is "ht_mask" + 1) 12986cb39f92SBram Moolenaar long_u ht_used; // number of items used 12996cb39f92SBram Moolenaar long_u ht_filled; // number of items used + removed 130049fe0d6bSBram Moolenaar int ht_changed; // incremented when adding or removing an item 13016cb39f92SBram Moolenaar int ht_locked; // counter for hash_lock() 13026cb39f92SBram Moolenaar int ht_error; // when set growing failed, can't add more 13036cb39f92SBram Moolenaar // items before growing works 13046cb39f92SBram Moolenaar hashitem_T *ht_array; // points to the array, allocated when it's 13056cb39f92SBram Moolenaar // not "ht_smallarray" 13066cb39f92SBram Moolenaar hashitem_T ht_smallarray[HT_INIT_SIZE]; // initial array 13078f999f19SBram Moolenaar } hashtab_T; 13088f999f19SBram Moolenaar 13096cb39f92SBram Moolenaar typedef long_u hash_T; // Type for hi_hash 13108f999f19SBram Moolenaar 13118f999f19SBram Moolenaar 13126cb39f92SBram Moolenaar // Use 64-bit Number. 13134f97475dSBram Moolenaar #ifdef MSWIN 1314d90b6c02SBram Moolenaar # ifdef PROTO 1315f9706e9dSBram Moolenaar // workaround for cproto that doesn't recognize __int64 1316d90b6c02SBram Moolenaar typedef long varnumber_T; 1317d90b6c02SBram Moolenaar typedef unsigned long uvarnumber_T; 13187a40ea21SBram Moolenaar # define VARNUM_MIN LONG_MIN 13197a40ea21SBram Moolenaar # define VARNUM_MAX LONG_MAX 13207a40ea21SBram Moolenaar # define UVARNUM_MAX ULONG_MAX 1321d90b6c02SBram Moolenaar # else 132222fcfad2SBram Moolenaar typedef __int64 varnumber_T; 132322fcfad2SBram Moolenaar typedef unsigned __int64 uvarnumber_T; 13247a40ea21SBram Moolenaar # define VARNUM_MIN _I64_MIN 13257a40ea21SBram Moolenaar # define VARNUM_MAX _I64_MAX 13267a40ea21SBram Moolenaar # define UVARNUM_MAX _UI64_MAX 1327d90b6c02SBram Moolenaar # endif 1328f9706e9dSBram Moolenaar #elif defined(HAVE_NO_LONG_LONG) 1329f9706e9dSBram Moolenaar # if defined(HAVE_STDINT_H) 133022fcfad2SBram Moolenaar typedef int64_t varnumber_T; 133122fcfad2SBram Moolenaar typedef uint64_t uvarnumber_T; 13327a40ea21SBram Moolenaar # define VARNUM_MIN INT64_MIN 13337a40ea21SBram Moolenaar # define VARNUM_MAX INT64_MAX 13347a40ea21SBram Moolenaar # define UVARNUM_MAX UINT64_MAX 133522fcfad2SBram Moolenaar # else 1336f9706e9dSBram Moolenaar // this may cause trouble for code that depends on 64 bit ints 133722fcfad2SBram Moolenaar typedef long varnumber_T; 133822fcfad2SBram Moolenaar typedef unsigned long uvarnumber_T; 13397a40ea21SBram Moolenaar # define VARNUM_MIN LONG_MIN 13407a40ea21SBram Moolenaar # define VARNUM_MAX LONG_MAX 13417a40ea21SBram Moolenaar # define UVARNUM_MAX ULONG_MAX 134222fcfad2SBram Moolenaar # endif 1343f9706e9dSBram Moolenaar #else 1344f9706e9dSBram Moolenaar typedef long long varnumber_T; 1345f9706e9dSBram Moolenaar typedef unsigned long long uvarnumber_T; 1346c593bec4SBram Moolenaar # ifdef LLONG_MIN 1347f9706e9dSBram Moolenaar # define VARNUM_MIN LLONG_MIN 1348f9706e9dSBram Moolenaar # define VARNUM_MAX LLONG_MAX 1349f9706e9dSBram Moolenaar # define UVARNUM_MAX ULLONG_MAX 1350c593bec4SBram Moolenaar # else 1351c593bec4SBram Moolenaar # define VARNUM_MIN LONG_LONG_MIN 1352c593bec4SBram Moolenaar # define VARNUM_MAX LONG_LONG_MAX 1353c593bec4SBram Moolenaar # define UVARNUM_MAX ULONG_LONG_MAX 1354c593bec4SBram Moolenaar # endif 1355f9706e9dSBram Moolenaar #endif 135622fcfad2SBram Moolenaar 1357a65c2881SBram Moolenaar // On rare systems "char" is unsigned, sometimes we really want a signed 8-bit 1358a65c2881SBram Moolenaar // value. 1359a65c2881SBram Moolenaar typedef signed char int8_T; 1360a65c2881SBram Moolenaar 1361c1a11ed5SBram Moolenaar typedef double float_T; 13628f999f19SBram Moolenaar 13638f999f19SBram Moolenaar typedef struct listvar_S list_T; 13648f999f19SBram Moolenaar typedef struct dictvar_S dict_T; 13651735bc98SBram Moolenaar typedef struct partial_S partial_T; 13666e5ea8d2SBram Moolenaar typedef struct blobvar_S blob_T; 13676463ca22SBram Moolenaar 13683a97bb3fSBram Moolenaar // Struct that holds both a normal function name and a partial_T, as used for a 13693a97bb3fSBram Moolenaar // callback argument. 13703a97bb3fSBram Moolenaar // When used temporarily "cb_name" is not allocated. The refcounts to either 13713a97bb3fSBram Moolenaar // the function or the partial are incremented and need to be decremented 13723a97bb3fSBram Moolenaar // later with free_callback(). 13733a97bb3fSBram Moolenaar typedef struct { 13743a97bb3fSBram Moolenaar char_u *cb_name; 13753a97bb3fSBram Moolenaar partial_T *cb_partial; 13763a97bb3fSBram Moolenaar int cb_free_name; // cb_name was allocated 13773a97bb3fSBram Moolenaar } callback_T; 13783a97bb3fSBram Moolenaar 137920431c9dSBram Moolenaar typedef struct isn_S isn_T; // instruction 13808a7d6542SBram Moolenaar typedef struct dfunc_S dfunc_T; // :def function 13818a7d6542SBram Moolenaar 1382835dc636SBram Moolenaar typedef struct jobvar_S job_T; 13836463ca22SBram Moolenaar typedef struct readq_S readq_T; 138497bd5e65SBram Moolenaar typedef struct writeq_S writeq_T; 13856463ca22SBram Moolenaar typedef struct jsonq_S jsonq_T; 13866463ca22SBram Moolenaar typedef struct cbq_S cbq_T; 13876463ca22SBram Moolenaar typedef struct channel_S channel_T; 13888a7d6542SBram Moolenaar typedef struct cctx_S cctx_T; 1389cd45ed03SBram Moolenaar typedef struct ectx_S ectx_T; 1390f18332fbSBram Moolenaar typedef struct instr_S instr_T; 13918f999f19SBram Moolenaar 1392a03f2335SBram Moolenaar typedef enum 1393a03f2335SBram Moolenaar { 13944c683750SBram Moolenaar VAR_UNKNOWN = 0, // not set, any type or "void" allowed 13954c683750SBram Moolenaar VAR_ANY, // used for "any" type 13964c683750SBram Moolenaar VAR_VOID, // no value (function not returning anything) 13978a7d6542SBram Moolenaar VAR_BOOL, // "v_number" is used: VVAL_TRUE or VVAL_FALSE 13988a7d6542SBram Moolenaar VAR_SPECIAL, // "v_number" is used: VVAL_NULL or VVAL_NONE 1399ea3ece40SBram Moolenaar VAR_NUMBER, // "v_number" is used 14008a7d6542SBram Moolenaar VAR_FLOAT, // "v_float" is used 1401ea3ece40SBram Moolenaar VAR_STRING, // "v_string" is used 14028a7d6542SBram Moolenaar VAR_BLOB, // "v_blob" is used 1403ea3ece40SBram Moolenaar VAR_FUNC, // "v_string" is function name 1404ea3ece40SBram Moolenaar VAR_PARTIAL, // "v_partial" is used 1405ea3ece40SBram Moolenaar VAR_LIST, // "v_list" is used 1406ea3ece40SBram Moolenaar VAR_DICT, // "v_dict" is used 1407ea3ece40SBram Moolenaar VAR_JOB, // "v_job" is used 1408ea3ece40SBram Moolenaar VAR_CHANNEL, // "v_channel" is used 1409f18332fbSBram Moolenaar VAR_INSTR, // "v_instr" is used 1410a03f2335SBram Moolenaar } vartype_T; 1411a03f2335SBram Moolenaar 14128a7d6542SBram Moolenaar // A type specification. 14138a7d6542SBram Moolenaar typedef struct type_S type_T; 14148a7d6542SBram Moolenaar struct type_S { 14158a7d6542SBram Moolenaar vartype_T tt_type; 14161378fbc4SBram Moolenaar int8_T tt_argcount; // for func, incl. vararg, -1 for unknown 14172e258bd7SJames McCoy int8_T tt_min_argcount; // number of non-optional arguments 14182e258bd7SJames McCoy char_u tt_flags; // TTFLAG_ values 14198a7d6542SBram Moolenaar type_T *tt_member; // for list, dict, func return type 14205deeb3f1SBram Moolenaar type_T **tt_args; // func argument types, allocated 14218a7d6542SBram Moolenaar }; 14228a7d6542SBram Moolenaar 1423d77a8525SBram Moolenaar #define TTFLAG_VARARGS 1 // func args ends with "..." 1424d77a8525SBram Moolenaar #define TTFLAG_OPTARG 2 // func arg type with "?" 142529a86ffeSBram Moolenaar #define TTFLAG_BOOL_OK 4 // can be converted to bool 1426fb489af2SBram Moolenaar #define TTFLAG_STATIC 8 // one of the static types, e.g. t_any 1427d77a8525SBram Moolenaar 14288f999f19SBram Moolenaar /* 14298f999f19SBram Moolenaar * Structure to hold an internal variable without a name. 14308f999f19SBram Moolenaar */ 14318f999f19SBram Moolenaar typedef struct 14328f999f19SBram Moolenaar { 1433a03f2335SBram Moolenaar vartype_T v_type; 14342bb2658bSBram Moolenaar char v_lock; // see below: VAR_LOCKED, VAR_FIXED 14358f999f19SBram Moolenaar union 14368f999f19SBram Moolenaar { 14376cb39f92SBram Moolenaar varnumber_T v_number; // number value 1438c1a11ed5SBram Moolenaar #ifdef FEAT_FLOAT 14396cb39f92SBram Moolenaar float_T v_float; // floating number value 1440c1a11ed5SBram Moolenaar #endif 14416cb39f92SBram Moolenaar char_u *v_string; // string value (can be NULL!) 14426cb39f92SBram Moolenaar list_T *v_list; // list value (can be NULL!) 14436cb39f92SBram Moolenaar dict_T *v_dict; // dict value (can be NULL!) 14446cb39f92SBram Moolenaar partial_T *v_partial; // closure: function with args 1445509ce2a5SBram Moolenaar #ifdef FEAT_JOB_CHANNEL 14466cb39f92SBram Moolenaar job_T *v_job; // job value (can be NULL!) 14476cb39f92SBram Moolenaar channel_T *v_channel; // channel value (can be NULL!) 14487707344dSBram Moolenaar #endif 14496cb39f92SBram Moolenaar blob_T *v_blob; // blob value (can be NULL!) 1450f18332fbSBram Moolenaar instr_T *v_instr; // instructions to execute 14518f999f19SBram Moolenaar } vval; 14528f999f19SBram Moolenaar } typval_T; 14538f999f19SBram Moolenaar 14546cb39f92SBram Moolenaar // Values for "dv_scope". 14556cb39f92SBram Moolenaar #define VAR_SCOPE 1 // a:, v:, s:, etc. scope dictionaries 14566cb39f92SBram Moolenaar #define VAR_DEF_SCOPE 2 // l:, g: scope dictionaries: here funcrefs are not 14576cb39f92SBram Moolenaar // allowed to mask existing functions 1458bdb62056SBram Moolenaar 14596cb39f92SBram Moolenaar // Values for "v_lock". 14606cb39f92SBram Moolenaar #define VAR_LOCKED 1 // locked with lock(), can use unlock() 14616cb39f92SBram Moolenaar #define VAR_FIXED 2 // locked forever 14622ce06f6eSBram Moolenaar 14638f999f19SBram Moolenaar /* 14648f999f19SBram Moolenaar * Structure to hold an item of a list: an internal variable without a name. 14658f999f19SBram Moolenaar */ 14668f999f19SBram Moolenaar typedef struct listitem_S listitem_T; 14678f999f19SBram Moolenaar 14688f999f19SBram Moolenaar struct listitem_S 14698f999f19SBram Moolenaar { 14706cb39f92SBram Moolenaar listitem_T *li_next; // next item in list 14716cb39f92SBram Moolenaar listitem_T *li_prev; // previous item in list 14726cb39f92SBram Moolenaar typval_T li_tv; // type and value of the variable 14738f999f19SBram Moolenaar }; 14748f999f19SBram Moolenaar 14756cb39f92SBram Moolenaar // Struct used by those that are using an item in a list. 14768f999f19SBram Moolenaar typedef struct listwatch_S listwatch_T; 14778f999f19SBram Moolenaar 14788f999f19SBram Moolenaar struct listwatch_S 14798f999f19SBram Moolenaar { 14806cb39f92SBram Moolenaar listitem_T *lw_item; // item being watched 14816cb39f92SBram Moolenaar listwatch_T *lw_next; // next watcher 14828f999f19SBram Moolenaar }; 14838f999f19SBram Moolenaar 14848f999f19SBram Moolenaar /* 14858f999f19SBram Moolenaar * Structure to hold info about a list. 14861a840240SBram Moolenaar * Order of members is optimized to reduce padding. 14878a7d6542SBram Moolenaar * When created by range() it will at first have special value: 14888a7d6542SBram Moolenaar * lv_first == &range_list_item; 14898a7d6542SBram Moolenaar * and use lv_start, lv_end, lv_stride. 14908f999f19SBram Moolenaar */ 14918f999f19SBram Moolenaar struct listvar_S 14928f999f19SBram Moolenaar { 14936cb39f92SBram Moolenaar listitem_T *lv_first; // first item, NULL if none 14946cb39f92SBram Moolenaar listwatch_T *lv_watch; // first watcher, NULL if none 14958a7d6542SBram Moolenaar union { 14968a7d6542SBram Moolenaar struct { // used for non-materialized range list: 14978a7d6542SBram Moolenaar // "lv_first" is &range_list_item 14988a7d6542SBram Moolenaar varnumber_T lv_start; 14998a7d6542SBram Moolenaar varnumber_T lv_end; 15008a7d6542SBram Moolenaar int lv_stride; 15010ff6aad3SBram Moolenaar } nonmat; 15028a7d6542SBram Moolenaar struct { // used for materialized list 15038a7d6542SBram Moolenaar listitem_T *lv_last; // last item, NULL if none 15046cb39f92SBram Moolenaar listitem_T *lv_idx_item; // when not NULL item at index "lv_idx" 15058a7d6542SBram Moolenaar int lv_idx; // cached index of an item 15060ff6aad3SBram Moolenaar } mat; 15070ff6aad3SBram Moolenaar } lv_u; 1508aa210a3aSBram Moolenaar type_T *lv_type; // allocated by alloc_type() 15096cb39f92SBram Moolenaar list_T *lv_copylist; // copied list used by deepcopy() 15106cb39f92SBram Moolenaar list_T *lv_used_next; // next list in used lists list 15116cb39f92SBram Moolenaar list_T *lv_used_prev; // previous list in used lists list 15126cb39f92SBram Moolenaar int lv_refcount; // reference count 15136cb39f92SBram Moolenaar int lv_len; // number of items 15148a7d6542SBram Moolenaar int lv_with_items; // number of items following this struct that 15158a7d6542SBram Moolenaar // should not be freed 15166cb39f92SBram Moolenaar int lv_copyID; // ID used by deepcopy() 15176cb39f92SBram Moolenaar char lv_lock; // zero, VAR_LOCKED, VAR_FIXED 15188f999f19SBram Moolenaar }; 15198f999f19SBram Moolenaar 15208f999f19SBram Moolenaar /* 1521df48fb45SBram Moolenaar * Static list with 10 items. Use init_static_list() to initialize. 1522df48fb45SBram Moolenaar */ 1523df48fb45SBram Moolenaar typedef struct { 15246cb39f92SBram Moolenaar list_T sl_list; // must be first 1525df48fb45SBram Moolenaar listitem_T sl_items[10]; 1526df48fb45SBram Moolenaar } staticList10_T; 1527df48fb45SBram Moolenaar 1528df48fb45SBram Moolenaar /* 15298f999f19SBram Moolenaar * Structure to hold an item of a Dictionary. 15308f999f19SBram Moolenaar * Also used for a variable. 15318f999f19SBram Moolenaar * The key is copied into "di_key" to avoid an extra alloc/free for it. 15328f999f19SBram Moolenaar */ 15338f999f19SBram Moolenaar struct dictitem_S 15348f999f19SBram Moolenaar { 15356cb39f92SBram Moolenaar typval_T di_tv; // type and value of the variable 15368a7d6542SBram Moolenaar char_u di_flags; // DI_FLAGS_ flags (only used for variable) 15376cb39f92SBram Moolenaar char_u di_key[1]; // key (actually longer!) 15388f999f19SBram Moolenaar }; 15398f999f19SBram Moolenaar typedef struct dictitem_S dictitem_T; 15408f999f19SBram Moolenaar 1541d7c96879SBram Moolenaar /* 1542d7c96879SBram Moolenaar * A dictitem with a 16 character key (plus NUL). This is an efficient way to 1543d7c96879SBram Moolenaar * have a fixed-size dictitem. 1544d7c96879SBram Moolenaar */ 1545d7c96879SBram Moolenaar #define DICTITEM16_KEY_LEN 16 1546bee6c0cfSBram Moolenaar struct dictitem16_S 1547bee6c0cfSBram Moolenaar { 15486cb39f92SBram Moolenaar typval_T di_tv; // type and value of the variable 15498a7d6542SBram Moolenaar char_u di_flags; // DI_FLAGS_ flags (only used for variable) 15506cb39f92SBram Moolenaar char_u di_key[DICTITEM16_KEY_LEN + 1]; // key 1551bee6c0cfSBram Moolenaar }; 1552bee6c0cfSBram Moolenaar typedef struct dictitem16_S dictitem16_T; 1553bee6c0cfSBram Moolenaar 15548a7d6542SBram Moolenaar // Flags for "di_flags" 15558a7d6542SBram Moolenaar #define DI_FLAGS_RO 0x01 // read-only variable 15568a7d6542SBram Moolenaar #define DI_FLAGS_RO_SBX 0x02 // read-only in the sandbox 15578a7d6542SBram Moolenaar #define DI_FLAGS_FIX 0x04 // fixed: no :unlet or remove() 15588a7d6542SBram Moolenaar #define DI_FLAGS_LOCK 0x08 // locked variable 15598a7d6542SBram Moolenaar #define DI_FLAGS_ALLOC 0x10 // separately allocated 15608a7d6542SBram Moolenaar #define DI_FLAGS_RELOAD 0x20 // set when script sourced again 15618f999f19SBram Moolenaar 15628f999f19SBram Moolenaar /* 15638f999f19SBram Moolenaar * Structure to hold info about a Dictionary. 15648f999f19SBram Moolenaar */ 15658f999f19SBram Moolenaar struct dictvar_S 15668f999f19SBram Moolenaar { 15676cb39f92SBram Moolenaar char dv_lock; // zero, VAR_LOCKED, VAR_FIXED 15686cb39f92SBram Moolenaar char dv_scope; // zero, VAR_SCOPE, VAR_DEF_SCOPE 15696cb39f92SBram Moolenaar int dv_refcount; // reference count 15706cb39f92SBram Moolenaar int dv_copyID; // ID used by deepcopy() 15716cb39f92SBram Moolenaar hashtab_T dv_hashtab; // hashtab that refers to the items 1572aa210a3aSBram Moolenaar type_T *dv_type; // allocated by alloc_type() 15736cb39f92SBram Moolenaar dict_T *dv_copydict; // copied dict used by deepcopy() 15746cb39f92SBram Moolenaar dict_T *dv_used_next; // next dict in used dicts list 15756cb39f92SBram Moolenaar dict_T *dv_used_prev; // previous dict in used dicts list 15768f999f19SBram Moolenaar }; 15778f999f19SBram Moolenaar 15786e5ea8d2SBram Moolenaar /* 15796e5ea8d2SBram Moolenaar * Structure to hold info about a blob. 15806e5ea8d2SBram Moolenaar */ 15816e5ea8d2SBram Moolenaar struct blobvar_S 15826e5ea8d2SBram Moolenaar { 15836e5ea8d2SBram Moolenaar garray_T bv_ga; // growarray with the data 15846e5ea8d2SBram Moolenaar int bv_refcount; // reference count 15856e5ea8d2SBram Moolenaar char bv_lock; // zero, VAR_LOCKED, VAR_FIXED 15866e5ea8d2SBram Moolenaar }; 15876e5ea8d2SBram Moolenaar 1588801ab069SBram Moolenaar typedef int (*cfunc_T)(int argcount, typval_T *argvars, typval_T *rettv, void *state); 1589801ab069SBram Moolenaar typedef void (*cfunc_free_T)(void *state); 1590801ab069SBram Moolenaar 159120b23c63SBram Moolenaar // type of getline() last argument 159220b23c63SBram Moolenaar typedef enum { 159320b23c63SBram Moolenaar GETLINE_NONE, // do not concatenate any lines 15948242ebbdSBram Moolenaar GETLINE_CONCAT_CONT, // concatenate continuation lines with backslash 15958242ebbdSBram Moolenaar GETLINE_CONCAT_CONTBAR, // concatenate continuation lines with \ and | 159620b23c63SBram Moolenaar GETLINE_CONCAT_ALL // concatenate continuation and Vim9 # comment lines 159720b23c63SBram Moolenaar } getline_opt_T; 159820b23c63SBram Moolenaar 15999b8d6226SBram Moolenaar typedef struct svar_S svar_T; 16009b8d6226SBram Moolenaar 1601437bafe4SBram Moolenaar #if defined(FEAT_EVAL) || defined(PROTO) 1602437bafe4SBram Moolenaar typedef struct funccall_S funccall_T; 1603437bafe4SBram Moolenaar 1604b2049903SBram Moolenaar // values used for "uf_def_status" 16050cb5bcf5SBram Moolenaar typedef enum { 1606701cc6caSBram Moolenaar UF_NOT_COMPILED, // executed with interpreter 1607701cc6caSBram Moolenaar UF_TO_BE_COMPILED, // to be compiled before execution 1608701cc6caSBram Moolenaar UF_COMPILING, // in compile_def_function() 1609701cc6caSBram Moolenaar UF_COMPILED, // successfully compiled 1610701cc6caSBram Moolenaar UF_COMPILE_ERROR // compilation error, cannot execute 16110cb5bcf5SBram Moolenaar } def_status_T; 1612822ba247SBram Moolenaar 1613437bafe4SBram Moolenaar /* 1614437bafe4SBram Moolenaar * Structure to hold info for a user function. 161538ddf333SBram Moolenaar * When adding a field check copy_func(). 1616437bafe4SBram Moolenaar */ 1617437bafe4SBram Moolenaar typedef struct 1618437bafe4SBram Moolenaar { 16198a7d6542SBram Moolenaar int uf_varargs; // variable nr of arguments (old style) 16208a7d6542SBram Moolenaar int uf_flags; // FC_ flags 162142ae78cfSBram Moolenaar int uf_calls; // nr of active calls 162242ae78cfSBram Moolenaar int uf_cleared; // func_clear() was already called 16230cb5bcf5SBram Moolenaar def_status_T uf_def_status; // UF_NOT_COMPILED, UF_TO_BE_COMPILED, etc. 16240cb5bcf5SBram Moolenaar int uf_dfunc_idx; // only valid if uf_def_status is UF_COMPILED 16255deeb3f1SBram Moolenaar garray_T uf_args; // arguments, including optional arguments 162642ae78cfSBram Moolenaar garray_T uf_def_args; // default argument expressions 1627e28d9b3bSBram Moolenaar int uf_args_visible; // normally uf_args.ga_len, less when 1628e28d9b3bSBram Moolenaar // compiling default argument expression. 16298a7d6542SBram Moolenaar 16308a7d6542SBram Moolenaar // for :def (for :function uf_ret_type is NULL) 16318a7d6542SBram Moolenaar type_T **uf_arg_types; // argument types (count == uf_args.ga_len) 16328a7d6542SBram Moolenaar type_T *uf_ret_type; // return type 16338a7d6542SBram Moolenaar garray_T uf_type_list; // types used in arg and return types 1634f112f30aSBram Moolenaar partial_T *uf_partial; // for closure created inside :def function: 1635f112f30aSBram Moolenaar // information about the context 1636f112f30aSBram Moolenaar 16378a7d6542SBram Moolenaar char_u *uf_va_name; // name from "...name" or NULL 16388a7d6542SBram Moolenaar type_T *uf_va_type; // type from "...name: type" or NULL 16395deeb3f1SBram Moolenaar type_T *uf_func_type; // type of the function, &t_func_any if unknown 1640fbbcd003SBram Moolenaar int uf_block_depth; // nr of entries in uf_block_ids 1641fbbcd003SBram Moolenaar int *uf_block_ids; // blocks a :def function is defined inside 1642801ab069SBram Moolenaar # if defined(FEAT_LUA) 1643801ab069SBram Moolenaar cfunc_T uf_cb; // callback function for cfunc 1644801ab069SBram Moolenaar cfunc_free_T uf_cb_free; // callback function to free cfunc 1645801ab069SBram Moolenaar void *uf_cb_state; // state of uf_cb 1646801ab069SBram Moolenaar # endif 16478a7d6542SBram Moolenaar 164842ae78cfSBram Moolenaar garray_T uf_lines; // function lines 16494f8f5428SBram Moolenaar 16504f8f5428SBram Moolenaar int uf_debug_tick; // when last checked for a breakpoint in this 16514f8f5428SBram Moolenaar // function. 16524f8f5428SBram Moolenaar int uf_has_breakpoint; // TRUE when a breakpoint has been set in 16534f8f5428SBram Moolenaar // this function. 1654437bafe4SBram Moolenaar # ifdef FEAT_PROFILE 165542ae78cfSBram Moolenaar int uf_profiling; // TRUE when func is being profiled 1656ad648096SBram Moolenaar int uf_prof_initialized; 165742ae78cfSBram Moolenaar // profiling the function as a whole 165842ae78cfSBram Moolenaar int uf_tm_count; // nr of calls 165942ae78cfSBram Moolenaar proftime_T uf_tm_total; // time spent in function + children 166042ae78cfSBram Moolenaar proftime_T uf_tm_self; // time spent in function itself 166142ae78cfSBram Moolenaar proftime_T uf_tm_children; // time spent in children this call 166242ae78cfSBram Moolenaar // profiling the function per line 166342ae78cfSBram Moolenaar int *uf_tml_count; // nr of times line was executed 166442ae78cfSBram Moolenaar proftime_T *uf_tml_total; // time spent in a line + children 166542ae78cfSBram Moolenaar proftime_T *uf_tml_self; // time spent in a line itself 166642ae78cfSBram Moolenaar proftime_T uf_tml_start; // start time for current line 166742ae78cfSBram Moolenaar proftime_T uf_tml_children; // time spent in children for this line 166842ae78cfSBram Moolenaar proftime_T uf_tml_wait; // start wait time for current line 166942ae78cfSBram Moolenaar int uf_tml_idx; // index of line being timed; -1 if none 167042ae78cfSBram Moolenaar int uf_tml_execed; // line being timed was executed 1671437bafe4SBram Moolenaar # endif 167242ae78cfSBram Moolenaar sctx_T uf_script_ctx; // SCTX where function was defined, 1673f9b2b496SBram Moolenaar // used for s: variables; sc_version changed 1674f9b2b496SBram Moolenaar // for :function 1675f9b2b496SBram Moolenaar int uf_script_ctx_version; // original sc_version of SCTX 167642ae78cfSBram Moolenaar int uf_refcount; // reference count, see func_name_refcount() 1677c8cd2b34SBram Moolenaar 167842ae78cfSBram Moolenaar funccall_T *uf_scoped; // l: local variables for closure 1679c8cd2b34SBram Moolenaar 16801a47ae32SBram Moolenaar char_u *uf_name_exp; // if "uf_name[]" starts with SNR the name with 16811a47ae32SBram Moolenaar // "<SNR>" as a string, otherwise NULL 16826a12e334SBram Moolenaar char_u uf_name[4]; // name of function (actual size equals name); 16836a12e334SBram Moolenaar // can start with <SNR>123_ (<SNR> is K_SPECIAL 168442ae78cfSBram Moolenaar // KS_EXTRA KE_SNR) 1685437bafe4SBram Moolenaar } ufunc_T; 1686437bafe4SBram Moolenaar 1687c8cd2b34SBram Moolenaar // flags used in uf_flags 1688c8cd2b34SBram Moolenaar #define FC_ABORT 0x01 // abort function on error 1689c8cd2b34SBram Moolenaar #define FC_RANGE 0x02 // function accepts range 1690c8cd2b34SBram Moolenaar #define FC_DICT 0x04 // Dict function, uses "self" 1691c8cd2b34SBram Moolenaar #define FC_CLOSURE 0x08 // closure, uses outer scope variables 1692c8cd2b34SBram Moolenaar #define FC_DELETED 0x10 // :delfunction used while uf_refcount > 0 1693c8cd2b34SBram Moolenaar #define FC_REMOVED 0x20 // function redefined while uf_refcount > 0 1694c8cd2b34SBram Moolenaar #define FC_SANDBOX 0x40 // function defined in the sandbox 1695c8cd2b34SBram Moolenaar #define FC_DEAD 0x80 // function kept only for reference to dfunc 1696c8cd2b34SBram Moolenaar #define FC_EXPORT 0x100 // "export def Func()" 1697c8cd2b34SBram Moolenaar #define FC_NOARGS 0x200 // no a: variables in lambda 1698c8cd2b34SBram Moolenaar #define FC_VIM9 0x400 // defined in vim9 script file 1699801ab069SBram Moolenaar #define FC_CFUNC 0x800 // defined as Lua C func 170038ddf333SBram Moolenaar #define FC_COPY 0x1000 // copy of another function by copy_func() 1701c8cd2b34SBram Moolenaar 170242ae78cfSBram Moolenaar #define MAX_FUNC_ARGS 20 // maximum number of function arguments 170342ae78cfSBram Moolenaar #define VAR_SHORT_LEN 20 // short variable name length 170442ae78cfSBram Moolenaar #define FIXVAR_CNT 12 // number of fixed variables 1705437bafe4SBram Moolenaar 17069bf703d4SBram Moolenaar /* 1707bf67ea1aSBram Moolenaar * Structure to hold info for a function that is currently being executed. 17089bf703d4SBram Moolenaar */ 1709437bafe4SBram Moolenaar struct funccall_S 1710437bafe4SBram Moolenaar { 17116cb39f92SBram Moolenaar ufunc_T *func; // function being called 17126cb39f92SBram Moolenaar int linenr; // next line to be executed 17136cb39f92SBram Moolenaar int returned; // ":return" used 17146cb39f92SBram Moolenaar struct // fixed variables for arguments 1715437bafe4SBram Moolenaar { 17166cb39f92SBram Moolenaar dictitem_T var; // variable (without room for name) 17176cb39f92SBram Moolenaar char_u room[VAR_SHORT_LEN]; // room for the name 1718437bafe4SBram Moolenaar } fixvar[FIXVAR_CNT]; 17196cb39f92SBram Moolenaar dict_T l_vars; // l: local function variables 17206cb39f92SBram Moolenaar dictitem_T l_vars_var; // variable for l: scope 17216cb39f92SBram Moolenaar dict_T l_avars; // a: argument variables 17226cb39f92SBram Moolenaar dictitem_T l_avars_var; // variable for a: scope 17236cb39f92SBram Moolenaar list_T l_varlist; // list for a:000 17246cb39f92SBram Moolenaar listitem_T l_listitems[MAX_FUNC_ARGS]; // listitems for a:000 17256cb39f92SBram Moolenaar typval_T *rettv; // return value 17266cb39f92SBram Moolenaar linenr_T breakpoint; // next line with breakpoint or zero 17276cb39f92SBram Moolenaar int dbg_tick; // debug_tick when breakpoint was set 17286cb39f92SBram Moolenaar int level; // top nesting level of executed function 1729437bafe4SBram Moolenaar #ifdef FEAT_PROFILE 17306cb39f92SBram Moolenaar proftime_T prof_child; // time spent in a child 1731437bafe4SBram Moolenaar #endif 173222286895SBram Moolenaar funccall_T *caller; // calling function or NULL; or next funccal in 173322286895SBram Moolenaar // list pointed to by previous_funccal. 1734437bafe4SBram Moolenaar 17356cb39f92SBram Moolenaar // for closure 17366cb39f92SBram Moolenaar int fc_refcount; // number of user functions that reference this 17376cb39f92SBram Moolenaar // funccal 17386cb39f92SBram Moolenaar int fc_copyID; // for garbage collection 17396cb39f92SBram Moolenaar garray_T fc_funcs; // list of ufunc_T* which keep a reference to 17406cb39f92SBram Moolenaar // "func" 1741437bafe4SBram Moolenaar }; 1742437bafe4SBram Moolenaar 1743437bafe4SBram Moolenaar /* 1744437bafe4SBram Moolenaar * Struct used by trans_function_name() 1745437bafe4SBram Moolenaar */ 1746437bafe4SBram Moolenaar typedef struct 1747437bafe4SBram Moolenaar { 17486cb39f92SBram Moolenaar dict_T *fd_dict; // Dictionary used 17496cb39f92SBram Moolenaar char_u *fd_newkey; // new key in "dict" in allocated memory 17506cb39f92SBram Moolenaar dictitem_T *fd_di; // Dictionary item used 1751437bafe4SBram Moolenaar } funcdict_T; 175227e80c88SBram Moolenaar 175327e80c88SBram Moolenaar typedef struct funccal_entry funccal_entry_T; 175427e80c88SBram Moolenaar struct funccal_entry { 175527e80c88SBram Moolenaar void *top_funccal; 175627e80c88SBram Moolenaar funccal_entry_T *next; 175727e80c88SBram Moolenaar }; 1758437bafe4SBram Moolenaar 17599bf703d4SBram Moolenaar // From user function to hashitem and back. 1760660a10adSBram Moolenaar #define UF2HIKEY(fp) ((fp)->uf_name) 1761660a10adSBram Moolenaar #define HIKEY2UF(p) ((ufunc_T *)((p) - offsetof(ufunc_T, uf_name))) 1762660a10adSBram Moolenaar #define HI2UF(hi) HIKEY2UF((hi)->hi_key) 1763660a10adSBram Moolenaar 17649bf703d4SBram Moolenaar /* 17657ebcba61SBram Moolenaar * Holds the hashtab with variables local to each sourced script. 17667ebcba61SBram Moolenaar * Each item holds a variable (nameless) that points to the dict_T. 17677ebcba61SBram Moolenaar */ 17688d739de4SBram Moolenaar typedef struct { 17697ebcba61SBram Moolenaar dictitem_T sv_var; 17707ebcba61SBram Moolenaar dict_T sv_dict; 17717ebcba61SBram Moolenaar } scriptvar_T; 17727ebcba61SBram Moolenaar 17737ebcba61SBram Moolenaar /* 17748d739de4SBram Moolenaar * Entry for "sn_all_vars". Contains the s: variables from sn_vars plus the 17758d739de4SBram Moolenaar * block-local ones. 17768d739de4SBram Moolenaar */ 17778d739de4SBram Moolenaar typedef struct sallvar_S sallvar_T; 17788d739de4SBram Moolenaar struct sallvar_S { 17798d739de4SBram Moolenaar sallvar_T *sav_next; // var with same name but different block 17808d739de4SBram Moolenaar int sav_block_id; // block ID where declared 17818d739de4SBram Moolenaar int sav_var_vals_idx; // index in sn_var_vals 17828d739de4SBram Moolenaar 17838d739de4SBram Moolenaar // So long as the variable is valid (block it was defined in is still 17848d739de4SBram Moolenaar // active) "sav_di" is used. It is set to NULL when leaving the block, 17858d739de4SBram Moolenaar // then sav_tv and sav_flags are used. 17868d739de4SBram Moolenaar dictitem_T *sav_di; // dictitem with di_key and di_tv 17878d739de4SBram Moolenaar typval_T sav_tv; // type and value of the variable 17888d739de4SBram Moolenaar char_u sav_flags; // DI_FLAGS_ flags (only used for variable) 17898d739de4SBram Moolenaar char_u sav_key[1]; // key (actually longer!) 17908d739de4SBram Moolenaar }; 17918d739de4SBram Moolenaar 17928d739de4SBram Moolenaar /* 17938d739de4SBram Moolenaar * In the sn_all_vars hashtab item "hi_key" points to "sav_key" in a sallvar_T. 17948d739de4SBram Moolenaar * This makes it possible to store and find the sallvar_T. 17958d739de4SBram Moolenaar * SAV2HIKEY() converts a sallvar_T pointer to a hashitem key pointer. 17968d739de4SBram Moolenaar * HIKEY2SAV() converts a hashitem key pointer to a sallvar_T pointer. 17978d739de4SBram Moolenaar * HI2SAV() converts a hashitem pointer to a sallvar_T pointer. 17988d739de4SBram Moolenaar */ 17998d739de4SBram Moolenaar #define SAV2HIKEY(sav) ((sav)->sav_key) 18008d739de4SBram Moolenaar #define HIKEY2SAV(p) ((sallvar_T *)(p - offsetof(sallvar_T, sav_key))) 18018d739de4SBram Moolenaar #define HI2SAV(hi) HIKEY2SAV((hi)->hi_key) 18028d739de4SBram Moolenaar 18038d739de4SBram Moolenaar /* 18048a7d6542SBram Moolenaar * Entry for "sn_var_vals". Used for script-local variables. 18058a7d6542SBram Moolenaar */ 18069b8d6226SBram Moolenaar struct svar_S { 18078d739de4SBram Moolenaar char_u *sv_name; // points into "sn_all_vars" di_key 18088d739de4SBram Moolenaar typval_T *sv_tv; // points into "sn_vars" or "sn_all_vars" di_tv 18098a7d6542SBram Moolenaar type_T *sv_type; 181008251757SBram Moolenaar int sv_const; // 0, ASSIGN_CONST or ASSIGN_FINAL 18118a7d6542SBram Moolenaar int sv_export; // "export let var = val" 18129b8d6226SBram Moolenaar }; 18138a7d6542SBram Moolenaar 18148a7d6542SBram Moolenaar typedef struct { 18158a7d6542SBram Moolenaar char_u *imp_name; // name imported as (allocated) 18168a7d6542SBram Moolenaar int imp_sid; // script ID of "from" 18178a7d6542SBram Moolenaar 1818a6294955SBram Moolenaar int imp_flags; // IMP_FLAGS_ values 18198a7d6542SBram Moolenaar 1820a6294955SBram Moolenaar // for a variable 18218a7d6542SBram Moolenaar type_T *imp_type; 18228a7d6542SBram Moolenaar int imp_var_vals_idx; // index in sn_var_vals of "from" 18238a7d6542SBram Moolenaar 1824a6294955SBram Moolenaar // for a function 18258a7d6542SBram Moolenaar char_u *imp_funcname; // user func name (NOT allocated) 18268a7d6542SBram Moolenaar } imported_T; 18278a7d6542SBram Moolenaar 1828a6294955SBram Moolenaar #define IMP_FLAGS_STAR 1 // using "import * as Name" 1829a6294955SBram Moolenaar #define IMP_FLAGS_RELOAD 2 // script reloaded, OK to redefine 1830a6294955SBram Moolenaar 18318a7d6542SBram Moolenaar /* 18324aab88d9SBram Moolenaar * Info about an already sourced scripts. 18339bf703d4SBram Moolenaar */ 18347ebcba61SBram Moolenaar typedef struct 1835fa55cfc6SBram Moolenaar { 1836fa55cfc6SBram Moolenaar char_u *sn_name; 18374aab88d9SBram Moolenaar int sn_script_seq; // latest sctx_T sc_seq value 18387ebcba61SBram Moolenaar 18398d739de4SBram Moolenaar // "sn_vars" stores the s: variables currently valid. When leaving a block 18408d739de4SBram Moolenaar // variables local to that block are removed. 18418d739de4SBram Moolenaar scriptvar_T *sn_vars; 18428d739de4SBram Moolenaar 18438d739de4SBram Moolenaar // Specific for a Vim9 script. 18448d739de4SBram Moolenaar // "sn_all_vars" stores all script variables ever declared. So long as the 18458d739de4SBram Moolenaar // variable is still valid the value is in "sn_vars->sv_dict...di_tv". 18468d739de4SBram Moolenaar // When the block of a declaration is left the value is moved to 18478d739de4SBram Moolenaar // "sn_all_vars..sav_tv". 18488d739de4SBram Moolenaar // Variables with duplicate names are possible, the sav_block_id must be 18498d739de4SBram Moolenaar // used to check that which variable is valid. 18508d739de4SBram Moolenaar dict_T sn_all_vars; // all script variables, dict of sallvar_T 18518d739de4SBram Moolenaar 18528d739de4SBram Moolenaar // Stores the same variables as in "sn_all_vars" as a list of svar_T, so 18538d739de4SBram Moolenaar // that they can be quickly found by index instead of a hash table lookup. 18548d739de4SBram Moolenaar // Also stores the type. 18558d739de4SBram Moolenaar garray_T sn_var_vals; 18568a7d6542SBram Moolenaar 18578a7d6542SBram Moolenaar garray_T sn_imports; // imported items, imported_T 18588a7d6542SBram Moolenaar garray_T sn_type_list; // keeps types used by variables 1859fbbcd003SBram Moolenaar int sn_current_block_id; // ID for current block, 0 for outer 1860fbbcd003SBram Moolenaar int sn_last_block_id; // Unique ID for each script block 18618a7d6542SBram Moolenaar 18627ebcba61SBram Moolenaar int sn_version; // :scriptversion 18632b32700dSBram Moolenaar int sn_state; // SN_STATE_ values 18648a7d6542SBram Moolenaar char_u *sn_save_cpo; // 'cpo' value when :vim9script found 18657ebcba61SBram Moolenaar 1866fa55cfc6SBram Moolenaar # ifdef FEAT_PROFILE 18674aea03ebSBram Moolenaar int sn_prof_on; // TRUE when script is/was profiled 18684aea03ebSBram Moolenaar int sn_pr_force; // forceit: profile functions in this script 18694aea03ebSBram Moolenaar proftime_T sn_pr_child; // time set when going into first child 18704aea03ebSBram Moolenaar int sn_pr_nest; // nesting for sn_pr_child 18714aea03ebSBram Moolenaar // profiling the script as a whole 18724aea03ebSBram Moolenaar int sn_pr_count; // nr of times sourced 18734aea03ebSBram Moolenaar proftime_T sn_pr_total; // time spent in script + children 18744aea03ebSBram Moolenaar proftime_T sn_pr_self; // time spent in script itself 18754aea03ebSBram Moolenaar proftime_T sn_pr_start; // time at script start 18764aea03ebSBram Moolenaar proftime_T sn_pr_children; // time in children after script start 18774aea03ebSBram Moolenaar // profiling the script per line 18784aea03ebSBram Moolenaar garray_T sn_prl_ga; // things stored for every line 18794aea03ebSBram Moolenaar proftime_T sn_prl_start; // start time for current line 18804aea03ebSBram Moolenaar proftime_T sn_prl_children; // time spent in children for this line 18814aea03ebSBram Moolenaar proftime_T sn_prl_wait; // wait start time for current line 18824aea03ebSBram Moolenaar int sn_prl_idx; // index of line being timed; -1 if none 18834aea03ebSBram Moolenaar int sn_prl_execed; // line being timed was executed 1884fa55cfc6SBram Moolenaar # endif 1885fa55cfc6SBram Moolenaar } scriptitem_T; 1886fa55cfc6SBram Moolenaar 18872b32700dSBram Moolenaar #define SN_STATE_NEW 0 // newly loaded script, nothing done 18882b32700dSBram Moolenaar #define SN_STATE_RELOAD 1 // script loaded before, nothing done 18892b32700dSBram Moolenaar #define SN_STATE_HAD_COMMAND 9 // a command was executed 18902b32700dSBram Moolenaar 18915409f5d8SBram Moolenaar // Struct passed through eval() functions. 18925409f5d8SBram Moolenaar // See EVALARG_EVALUATE for a fixed value with eval_flags set to EVAL_EVALUATE. 18935409f5d8SBram Moolenaar typedef struct { 18945409f5d8SBram Moolenaar int eval_flags; // EVAL_ flag values below 1895b7a78f7aSBram Moolenaar int eval_break_count; // nr of line breaks consumed 18965409f5d8SBram Moolenaar 18975409f5d8SBram Moolenaar // copied from exarg_T when "getline" is "getsourceline". Can be NULL. 189866250c93SBram Moolenaar char_u *(*eval_getline)(int, void *, int, getline_opt_T); 1899d5053d01SBram Moolenaar void *eval_cookie; // argument for eval_getline() 1900b171fb17SBram Moolenaar 19017a4b8980SBram Moolenaar // used when compiling a :def function, NULL otherwise 19027a4b8980SBram Moolenaar cctx_T *eval_cctx; 19037a4b8980SBram Moolenaar 19042eb6fc3bSBram Moolenaar // used when executing commands from a script, NULL otherwise 19052eb6fc3bSBram Moolenaar cstack_T *eval_cstack; 19062eb6fc3bSBram Moolenaar 1907e40fbc2cSBram Moolenaar // Used to collect lines while parsing them, so that they can be 1908e40fbc2cSBram Moolenaar // concatenated later. Used when "eval_ga.ga_itemsize" is not zero. 1909e40fbc2cSBram Moolenaar // "eval_ga.ga_data" is a list of pointers to lines. 1910ecb66450SBram Moolenaar // "eval_freega" list pointers that need to be freed after concatenating. 1911e40fbc2cSBram Moolenaar garray_T eval_ga; 1912ecb66450SBram Moolenaar garray_T eval_freega; 1913e40fbc2cSBram Moolenaar 19148e2730a3SBram Moolenaar // pointer to the last line obtained with getsourceline() 1915b171fb17SBram Moolenaar char_u *eval_tofree; 19168e2730a3SBram Moolenaar 1917844fb64aSBram Moolenaar // array with lines of an inline function 1918844fb64aSBram Moolenaar garray_T eval_tofree_ga; 1919844fb64aSBram Moolenaar 1920844fb64aSBram Moolenaar // set when "arg" points into the last entry of "eval_tofree_ga" 1921844fb64aSBram Moolenaar int eval_using_cmdline; 192267da21a1SBram Moolenaar 19238e2730a3SBram Moolenaar // pointer to the lines concatenated for a lambda. 19248e2730a3SBram Moolenaar char_u *eval_tofree_lambda; 19255409f5d8SBram Moolenaar } evalarg_T; 19265409f5d8SBram Moolenaar 19275409f5d8SBram Moolenaar // Flags for expression evaluation. 19285409f5d8SBram Moolenaar #define EVAL_EVALUATE 1 // when missing don't actually evaluate 19295409f5d8SBram Moolenaar #define EVAL_CONSTANT 2 // when not a constant return FAIL 19305409f5d8SBram Moolenaar 1931fa55cfc6SBram Moolenaar # ifdef FEAT_PROFILE 19329bf703d4SBram Moolenaar /* 19339bf703d4SBram Moolenaar * Struct used in sn_prl_ga for every line of a script. 19349bf703d4SBram Moolenaar */ 1935fa55cfc6SBram Moolenaar typedef struct sn_prl_S 1936fa55cfc6SBram Moolenaar { 19374aea03ebSBram Moolenaar int snp_count; // nr of times line was executed 19384aea03ebSBram Moolenaar proftime_T sn_prl_total; // time spent in a line + children 19394aea03ebSBram Moolenaar proftime_T sn_prl_self; // time spent in a line itself 1940fa55cfc6SBram Moolenaar } sn_prl_T; 1941fa55cfc6SBram Moolenaar 1942fa55cfc6SBram Moolenaar # define PRL_ITEM(si, idx) (((sn_prl_T *)(si)->sn_prl_ga.ga_data)[(idx)]) 1943b2049903SBram Moolenaar 1944b2049903SBram Moolenaar typedef struct { 1945b2049903SBram Moolenaar int pi_started_profiling; 1946b2049903SBram Moolenaar proftime_T pi_wait_start; 1947b2049903SBram Moolenaar proftime_T pi_call_start; 1948b2049903SBram Moolenaar } profinfo_T; 1949b2049903SBram Moolenaar 1950f002a41dSBram Moolenaar # else 1951f002a41dSBram Moolenaar typedef struct 1952f002a41dSBram Moolenaar { 1953f002a41dSBram Moolenaar int dummy; 1954f002a41dSBram Moolenaar } profinfo_T; 1955fa55cfc6SBram Moolenaar # endif 1956acadbeabSBram Moolenaar #else 19576cb39f92SBram Moolenaar // dummy typedefs for use in function prototypes 1958acadbeabSBram Moolenaar typedef struct 1959acadbeabSBram Moolenaar { 1960acadbeabSBram Moolenaar int dummy; 1961acadbeabSBram Moolenaar } ufunc_T; 1962acadbeabSBram Moolenaar typedef struct 1963acadbeabSBram Moolenaar { 1964acadbeabSBram Moolenaar int dummy; 1965fa55cfc6SBram Moolenaar } funccall_T; 1966fa55cfc6SBram Moolenaar typedef struct 1967fa55cfc6SBram Moolenaar { 1968fa55cfc6SBram Moolenaar int dummy; 1969acadbeabSBram Moolenaar } funcdict_T; 1970d95c3c25SBram Moolenaar typedef struct 1971d95c3c25SBram Moolenaar { 1972d95c3c25SBram Moolenaar int dummy; 1973d95c3c25SBram Moolenaar } funccal_entry_T; 1974fa55cfc6SBram Moolenaar typedef struct 1975fa55cfc6SBram Moolenaar { 1976fa55cfc6SBram Moolenaar int dummy; 1977fa55cfc6SBram Moolenaar } scriptitem_T; 19789d40c63cSBram Moolenaar typedef struct 19799d40c63cSBram Moolenaar { 19809d40c63cSBram Moolenaar int dummy; 19819d40c63cSBram Moolenaar } evalarg_T; 1982437bafe4SBram Moolenaar #endif 1983437bafe4SBram Moolenaar 1984505e43a2SBram Moolenaar // Struct passed between functions dealing with function call execution. 1985505e43a2SBram Moolenaar // 1986505e43a2SBram Moolenaar // "argv_func", when not NULL, can be used to fill in arguments only when the 1987505e43a2SBram Moolenaar // invoked function uses them. It is called like this: 1988b0745b22SBram Moolenaar // new_argcount = argv_func(current_argcount, argv, partial_argcount, 1989b0745b22SBram Moolenaar // called_func_argcount) 1990505e43a2SBram Moolenaar // 1991505e43a2SBram Moolenaar typedef struct { 1992b0745b22SBram Moolenaar int (* argv_func)(int, typval_T *, int, int); 1993505e43a2SBram Moolenaar linenr_T firstline; // first line of range 1994505e43a2SBram Moolenaar linenr_T lastline; // last line of range 1995505e43a2SBram Moolenaar int *doesrange; // if not NULL: return: function handled range 1996505e43a2SBram Moolenaar int evaluate; // actually evaluate expressions 1997505e43a2SBram Moolenaar partial_T *partial; // for extra arguments 1998505e43a2SBram Moolenaar dict_T *selfdict; // Dictionary for "self" 1999ac92e25aSBram Moolenaar typval_T *basetv; // base for base->method() 200032b3f820SBram Moolenaar type_T *check_type; // type from funcref or NULL 2001505e43a2SBram Moolenaar } funcexe_T; 2002505e43a2SBram Moolenaar 2003f7779c63SBram Moolenaar /* 2004f7779c63SBram Moolenaar * Structure to hold the context of a compiled function, used by closures 2005f7779c63SBram Moolenaar * defined in that function. 2006f7779c63SBram Moolenaar */ 2007f7779c63SBram Moolenaar typedef struct funcstack_S 2008f7779c63SBram Moolenaar { 2009f7779c63SBram Moolenaar garray_T fs_ga; // contains the stack, with: 2010f7779c63SBram Moolenaar // - arguments 2011f7779c63SBram Moolenaar // - frame 2012f7779c63SBram Moolenaar // - local variables 201385d5e2b7SBram Moolenaar int fs_var_offset; // count of arguments + frame size == offset to 201485d5e2b7SBram Moolenaar // local variables 2015f7779c63SBram Moolenaar 2016f7779c63SBram Moolenaar int fs_refcount; // nr of closures referencing this funcstack 201785d5e2b7SBram Moolenaar int fs_min_refcount; // nr of closures on this funcstack 2018f7779c63SBram Moolenaar int fs_copyID; // for garray_T collection 2019f7779c63SBram Moolenaar } funcstack_T; 2020f7779c63SBram Moolenaar 20210186e586SBram Moolenaar typedef struct outer_S outer_T; 20220186e586SBram Moolenaar struct outer_S { 20230186e586SBram Moolenaar garray_T *out_stack; // stack from outer scope 20240186e586SBram Moolenaar int out_frame_idx; // index of stack frame in out_stack 20250186e586SBram Moolenaar outer_T *out_up; // outer scope of outer scope or NULL 2026c04f2a4cSBram Moolenaar partial_T *out_up_partial; // partial owning out_up or NULL 20270186e586SBram Moolenaar }; 20280186e586SBram Moolenaar 20291735bc98SBram Moolenaar struct partial_S 20301735bc98SBram Moolenaar { 20316cb39f92SBram Moolenaar int pt_refcount; // reference count 20323276f584SDominique Pelle int pt_auto; // when TRUE the partial was created for using 20333276f584SDominique Pelle // dict.member in handle_subscript() 20346cb39f92SBram Moolenaar char_u *pt_name; // function name; when NULL use 20356cb39f92SBram Moolenaar // pt_func->uf_name 20366cb39f92SBram Moolenaar ufunc_T *pt_func; // function pointer; when NULL lookup function 20376cb39f92SBram Moolenaar // with pt_name 2038f7779c63SBram Moolenaar 20390186e586SBram Moolenaar // For a compiled closure: the arguments and local variables scope 20400186e586SBram Moolenaar outer_T pt_outer; 20410186e586SBram Moolenaar 2042f7779c63SBram Moolenaar funcstack_T *pt_funcstack; // copy of stack, used after context 2043f7779c63SBram Moolenaar // function returns 2044f7779c63SBram Moolenaar 20456cb39f92SBram Moolenaar typval_T *pt_argv; // arguments in allocated array 20463276f584SDominique Pelle int pt_argc; // number of arguments 2047f7779c63SBram Moolenaar 2048b68b346eSBram Moolenaar int pt_copyID; // funcstack may contain pointer to partial 20493276f584SDominique Pelle dict_T *pt_dict; // dict for "self" 20501735bc98SBram Moolenaar }; 20511735bc98SBram Moolenaar 20521a47ae32SBram Moolenaar typedef struct AutoPatCmd_S AutoPatCmd; 20531a47ae32SBram Moolenaar 20541a47ae32SBram Moolenaar /* 20551a47ae32SBram Moolenaar * Entry in the execution stack "exestack". 20561a47ae32SBram Moolenaar */ 20571a47ae32SBram Moolenaar typedef enum { 20581a47ae32SBram Moolenaar ETYPE_TOP, // toplevel 20591a47ae32SBram Moolenaar ETYPE_SCRIPT, // sourcing script, use es_info.sctx 20601a47ae32SBram Moolenaar ETYPE_UFUNC, // user function, use es_info.ufunc 20611a47ae32SBram Moolenaar ETYPE_AUCMD, // autocomand, use es_info.aucmd 20621a47ae32SBram Moolenaar ETYPE_MODELINE, // modeline, use es_info.sctx 20631a47ae32SBram Moolenaar ETYPE_EXCEPT, // exception, use es_info.exception 20641a47ae32SBram Moolenaar ETYPE_ARGS, // command line argument 20651a47ae32SBram Moolenaar ETYPE_ENV, // environment variable 20661a47ae32SBram Moolenaar ETYPE_INTERNAL, // internal operation 20671a47ae32SBram Moolenaar ETYPE_SPELL, // loading spell file 20681a47ae32SBram Moolenaar } etype_T; 20691a47ae32SBram Moolenaar 20701a47ae32SBram Moolenaar typedef struct { 20711a47ae32SBram Moolenaar long es_lnum; // replaces "sourcing_lnum" 20721a47ae32SBram Moolenaar char_u *es_name; // replaces "sourcing_name" 20731a47ae32SBram Moolenaar etype_T es_type; 20741a47ae32SBram Moolenaar union { 20751a47ae32SBram Moolenaar sctx_T *sctx; // script and modeline info 20761a47ae32SBram Moolenaar #if defined(FEAT_EVAL) 20771a47ae32SBram Moolenaar ufunc_T *ufunc; // function info 20781a47ae32SBram Moolenaar #endif 20791a47ae32SBram Moolenaar AutoPatCmd *aucmd; // autocommand info 20801a47ae32SBram Moolenaar except_T *except; // exception info 20811a47ae32SBram Moolenaar } es_info; 2082c620c055SBram Moolenaar #if defined(FEAT_EVAL) 2083c70fe460SBram Moolenaar sctx_T es_save_sctx; // saved current_sctx when calling function 2084c620c055SBram Moolenaar #endif 20851a47ae32SBram Moolenaar } estack_T; 20861a47ae32SBram Moolenaar 20876cb39f92SBram Moolenaar // Information returned by get_tty_info(). 20886b93b0e8SBram Moolenaar typedef struct { 20896cb39f92SBram Moolenaar int backspace; // what the Backspace key produces 20906cb39f92SBram Moolenaar int enter; // what the Enter key produces 20916cb39f92SBram Moolenaar int interrupt; // interrupt character 20926cb39f92SBram Moolenaar int nl_does_cr; // TRUE when a NL is expanded to CR-NL on output 20936b93b0e8SBram Moolenaar } ttyinfo_T; 20946b93b0e8SBram Moolenaar 20956cb39f92SBram Moolenaar // Status of a job. Order matters! 2096835dc636SBram Moolenaar typedef enum 2097835dc636SBram Moolenaar { 2098835dc636SBram Moolenaar JOB_FAILED, 2099835dc636SBram Moolenaar JOB_STARTED, 2100ea3ece40SBram Moolenaar JOB_ENDED, // detected job done 2101ea3ece40SBram Moolenaar JOB_FINISHED, // job done and cleanup done 2102835dc636SBram Moolenaar } jobstatus_T; 2103835dc636SBram Moolenaar 2104835dc636SBram Moolenaar /* 2105835dc636SBram Moolenaar * Structure to hold info about a Job. 2106835dc636SBram Moolenaar */ 2107835dc636SBram Moolenaar struct jobvar_S 2108835dc636SBram Moolenaar { 210965edff8fSBram Moolenaar job_T *jv_next; 211065edff8fSBram Moolenaar job_T *jv_prev; 2111835dc636SBram Moolenaar #ifdef UNIX 2112835dc636SBram Moolenaar pid_t jv_pid; 2113835dc636SBram Moolenaar #endif 21144f97475dSBram Moolenaar #ifdef MSWIN 211576467dfcSBram Moolenaar PROCESS_INFORMATION jv_proc_info; 211614207f48SBram Moolenaar HANDLE jv_job_object; 2117835dc636SBram Moolenaar #endif 21183276f584SDominique Pelle jobstatus_T jv_status; 21196cb39f92SBram Moolenaar char_u *jv_tty_in; // controlling tty input, allocated 21206cb39f92SBram Moolenaar char_u *jv_tty_out; // controlling tty output, allocated 21216cb39f92SBram Moolenaar char_u *jv_stoponexit; // allocated 2122b3051ce8SBram Moolenaar #ifdef UNIX 21236cb39f92SBram Moolenaar char_u *jv_termsig; // allocated 2124b3051ce8SBram Moolenaar #endif 21254f97475dSBram Moolenaar #ifdef MSWIN 2126c6ddce3fSBram Moolenaar char_u *jv_tty_type; // allocated 2127c6ddce3fSBram Moolenaar #endif 2128eab089d2SBram Moolenaar int jv_exitval; 21293a97bb3fSBram Moolenaar callback_T jv_exit_cb; 2130835dc636SBram Moolenaar 21316cb39f92SBram Moolenaar buf_T *jv_in_buf; // buffer from "in-name" 2132014069a7SBram Moolenaar 21336cb39f92SBram Moolenaar int jv_refcount; // reference count 2134107e1eefSBram Moolenaar int jv_copyID; 2135107e1eefSBram Moolenaar 21366cb39f92SBram Moolenaar channel_T *jv_channel; // channel for I/O, reference counted 21376cb39f92SBram Moolenaar char **jv_argv; // command line used to start the job 2138835dc636SBram Moolenaar }; 2139835dc636SBram Moolenaar 21406463ca22SBram Moolenaar /* 21416463ca22SBram Moolenaar * Structures to hold info about a Channel. 21426463ca22SBram Moolenaar */ 21436463ca22SBram Moolenaar struct readq_S 21446463ca22SBram Moolenaar { 21457707344dSBram Moolenaar char_u *rq_buffer; 21469ed96efbSBram Moolenaar long_u rq_buflen; 21477707344dSBram Moolenaar readq_T *rq_next; 21487707344dSBram Moolenaar readq_T *rq_prev; 21496463ca22SBram Moolenaar }; 21506463ca22SBram Moolenaar 215197bd5e65SBram Moolenaar struct writeq_S 215297bd5e65SBram Moolenaar { 215397bd5e65SBram Moolenaar garray_T wq_ga; 215497bd5e65SBram Moolenaar writeq_T *wq_next; 215597bd5e65SBram Moolenaar writeq_T *wq_prev; 215697bd5e65SBram Moolenaar }; 215797bd5e65SBram Moolenaar 21586463ca22SBram Moolenaar struct jsonq_S 21596463ca22SBram Moolenaar { 21607707344dSBram Moolenaar typval_T *jq_value; 21617707344dSBram Moolenaar jsonq_T *jq_next; 21627707344dSBram Moolenaar jsonq_T *jq_prev; 21636cb39f92SBram Moolenaar int jq_no_callback; // TRUE when no callback was found 21646463ca22SBram Moolenaar }; 21656463ca22SBram Moolenaar 21666463ca22SBram Moolenaar struct cbq_S 21676463ca22SBram Moolenaar { 21683a97bb3fSBram Moolenaar callback_T cq_callback; 21697707344dSBram Moolenaar int cq_seq_nr; 21707707344dSBram Moolenaar cbq_T *cq_next; 21717707344dSBram Moolenaar cbq_T *cq_prev; 21726463ca22SBram Moolenaar }; 21736463ca22SBram Moolenaar 21746cb39f92SBram Moolenaar // mode for a channel 21756463ca22SBram Moolenaar typedef enum 21766463ca22SBram Moolenaar { 21777707344dSBram Moolenaar MODE_NL = 0, 21787707344dSBram Moolenaar MODE_RAW, 21796463ca22SBram Moolenaar MODE_JSON, 2180ea3ece40SBram Moolenaar MODE_JS, 21816463ca22SBram Moolenaar } ch_mode_T; 21826463ca22SBram Moolenaar 2183580984e0SBram Moolenaar typedef enum { 2184ea3ece40SBram Moolenaar JIO_PIPE, // default 2185580984e0SBram Moolenaar JIO_NULL, 2186580984e0SBram Moolenaar JIO_FILE, 2187580984e0SBram Moolenaar JIO_BUFFER, 2188580984e0SBram Moolenaar JIO_OUT 2189580984e0SBram Moolenaar } job_io_T; 2190580984e0SBram Moolenaar 21917c9aec4aSBram Moolenaar #define CH_PART_FD(part) ch_part[part].ch_fd 21927c9aec4aSBram Moolenaar 21936cb39f92SBram Moolenaar // Ordering matters, it is used in for loops: IN is last, only SOCK/OUT/ERR 21946cb39f92SBram Moolenaar // are polled. 2195dc0ccaeeSBram Moolenaar typedef enum { 2196dc0ccaeeSBram Moolenaar PART_SOCK = 0, 21977c9aec4aSBram Moolenaar #define CH_SOCK_FD CH_PART_FD(PART_SOCK) 2198509ce2a5SBram Moolenaar #ifdef FEAT_JOB_CHANNEL 2199dc0ccaeeSBram Moolenaar PART_OUT, 22007c9aec4aSBram Moolenaar # define CH_OUT_FD CH_PART_FD(PART_OUT) 2201dc0ccaeeSBram Moolenaar PART_ERR, 22027c9aec4aSBram Moolenaar # define CH_ERR_FD CH_PART_FD(PART_ERR) 2203dc0ccaeeSBram Moolenaar PART_IN, 22047c9aec4aSBram Moolenaar # define CH_IN_FD CH_PART_FD(PART_IN) 22057b3ca76aSBram Moolenaar #endif 2206ea3ece40SBram Moolenaar PART_COUNT, 2207dc0ccaeeSBram Moolenaar } ch_part_T; 2208dc0ccaeeSBram Moolenaar 2209dc0ccaeeSBram Moolenaar #define INVALID_FD (-1) 22107b3ca76aSBram Moolenaar 22116cb39f92SBram Moolenaar // The per-fd info for a channel. 22127b3ca76aSBram Moolenaar typedef struct { 22136cb39f92SBram Moolenaar sock_T ch_fd; // socket/stdin/stdout/stderr, -1 if not used 22147b3ca76aSBram Moolenaar 22157b3ca76aSBram Moolenaar # if defined(UNIX) && !defined(HAVE_SELECT) 22166cb39f92SBram Moolenaar int ch_poll_idx; // used by channel_poll_setup() 22177b3ca76aSBram Moolenaar # endif 22187b3ca76aSBram Moolenaar 22197b3ca76aSBram Moolenaar #ifdef FEAT_GUI_X11 22206cb39f92SBram Moolenaar XtInputId ch_inputHandler; // Cookie for input 22217b3ca76aSBram Moolenaar #endif 22227b3ca76aSBram Moolenaar #ifdef FEAT_GUI_GTK 22236cb39f92SBram Moolenaar gint ch_inputHandler; // Cookie for input 22247b3ca76aSBram Moolenaar #endif 222542d38a2dSBram Moolenaar 222642d38a2dSBram Moolenaar ch_mode_T ch_mode; 2227580984e0SBram Moolenaar job_io_T ch_io; 22286cb39f92SBram Moolenaar int ch_timeout; // request timeout in msec 222942d38a2dSBram Moolenaar 22306cb39f92SBram Moolenaar readq_T ch_head; // header for circular raw read queue 22316cb39f92SBram Moolenaar jsonq_T ch_json_head; // header for circular json read queue 22326cb39f92SBram Moolenaar garray_T ch_block_ids; // list of IDs that channel_read_json_block() 22336cb39f92SBram Moolenaar // is waiting for 22346cb39f92SBram Moolenaar // When ch_wait_len is non-zero use ch_deadline to wait for incomplete 22356cb39f92SBram Moolenaar // message to be complete. The value is the length of the incomplete 22366cb39f92SBram Moolenaar // message when the deadline was set. If it gets longer (something was 22376cb39f92SBram Moolenaar // received) the deadline is reset. 223888989cc3SBram Moolenaar size_t ch_wait_len; 22394f97475dSBram Moolenaar #ifdef MSWIN 2240ba61ac0dSBram Moolenaar DWORD ch_deadline; 2241ba61ac0dSBram Moolenaar #else 2242ba61ac0dSBram Moolenaar struct timeval ch_deadline; 2243ba61ac0dSBram Moolenaar #endif 22446cb39f92SBram Moolenaar int ch_block_write; // for testing: 0 when not used, -1 when write 22456cb39f92SBram Moolenaar // does not block, 1 simulate blocking 22466cb39f92SBram Moolenaar int ch_nonblocking; // write() is non-blocking 22476cb39f92SBram Moolenaar writeq_T ch_writeque; // header for write queue 224842d38a2dSBram Moolenaar 22496cb39f92SBram Moolenaar cbq_T ch_cb_head; // dummy node for per-request callbacks 22506cb39f92SBram Moolenaar callback_T ch_callback; // call when a msg is not handled 2251014069a7SBram Moolenaar 22526cb39f92SBram Moolenaar bufref_T ch_bufref; // buffer to read from or write to 22536cb39f92SBram Moolenaar int ch_nomodifiable; // TRUE when buffer can be 'nomodifiable' 22546cb39f92SBram Moolenaar int ch_nomod_error; // TRUE when e_modifiable was given 22556cb39f92SBram Moolenaar int ch_buf_append; // write appended lines instead top-bot 22566cb39f92SBram Moolenaar linenr_T ch_buf_top; // next line to send 22576cb39f92SBram Moolenaar linenr_T ch_buf_bot; // last line to send 225842d38a2dSBram Moolenaar } chanpart_T; 22597b3ca76aSBram Moolenaar 22606463ca22SBram Moolenaar struct channel_S { 22617707344dSBram Moolenaar channel_T *ch_next; 22627707344dSBram Moolenaar channel_T *ch_prev; 22637707344dSBram Moolenaar 22646cb39f92SBram Moolenaar int ch_id; // ID of the channel 22656cb39f92SBram Moolenaar int ch_last_msg_id; // ID of the last message 22667707344dSBram Moolenaar 22676cb39f92SBram Moolenaar chanpart_T ch_part[PART_COUNT]; // info for socket, out, err and in 22686cb39f92SBram Moolenaar int ch_write_text_mode; // write buffer lines with CR, not NL 22696463ca22SBram Moolenaar 22706cb39f92SBram Moolenaar char *ch_hostname; // only for socket, allocated 22716cb39f92SBram Moolenaar int ch_port; // only for socket 2272580984e0SBram Moolenaar 22736cb39f92SBram Moolenaar int ch_to_be_closed; // bitset of readable fds to be closed. 22746cb39f92SBram Moolenaar // When all readable fds have been closed, 22756cb39f92SBram Moolenaar // set to (1 << PART_COUNT). 22766cb39f92SBram Moolenaar int ch_to_be_freed; // When TRUE channel must be freed when it's 22776cb39f92SBram Moolenaar // safe to invoke callbacks. 22786cb39f92SBram Moolenaar int ch_error; // When TRUE an error was reported. Avoids 22796cb39f92SBram Moolenaar // giving pages full of error messages when 22806cb39f92SBram Moolenaar // the other side has exited, only mention the 22816cb39f92SBram Moolenaar // first error until the connection works 22826cb39f92SBram Moolenaar // again. 228316eb4f88SBram Moolenaar 22844e221c99SBram Moolenaar void (*ch_nb_close_cb)(void); 22856cb39f92SBram Moolenaar // callback for Netbeans when channel is 22866cb39f92SBram Moolenaar // closed 22876463ca22SBram Moolenaar 22884f97475dSBram Moolenaar #ifdef MSWIN 22896cb39f92SBram Moolenaar int ch_named_pipe; // using named pipe instead of pty 22902dc9d26cSBram Moolenaar #endif 22916cb39f92SBram Moolenaar callback_T ch_callback; // call when any msg is not handled 22926cb39f92SBram Moolenaar callback_T ch_close_cb; // call when channel is closed 2293958dc692SBram Moolenaar int ch_drop_never; 22946cb39f92SBram Moolenaar int ch_keep_open; // do not close on read error 22950b146888SBram Moolenaar int ch_nonblock; 22966463ca22SBram Moolenaar 2297aa5df7e3SBram Moolenaar job_T *ch_job; // Job that uses this channel; this does not 2298aa5df7e3SBram Moolenaar // count as a reference to avoid a circular 2299aa5df7e3SBram Moolenaar // reference, the job refers to the channel. 2300aa5df7e3SBram Moolenaar int ch_job_killed; // TRUE when there was a job and it was killed 2301aa5df7e3SBram Moolenaar // or we know it died. 2302aa5df7e3SBram Moolenaar int ch_anonymous_pipe; // ConPTY 2303aa5df7e3SBram Moolenaar int ch_killing; // TerminateJobObject() was called 23047707344dSBram Moolenaar 2305aa5df7e3SBram Moolenaar int ch_refcount; // reference count 2306107e1eefSBram Moolenaar int ch_copyID; 23076463ca22SBram Moolenaar }; 23086463ca22SBram Moolenaar 23096cb39f92SBram Moolenaar #define JO_MODE 0x0001 // channel mode 23106cb39f92SBram Moolenaar #define JO_IN_MODE 0x0002 // stdin mode 23116cb39f92SBram Moolenaar #define JO_OUT_MODE 0x0004 // stdout mode 23126cb39f92SBram Moolenaar #define JO_ERR_MODE 0x0008 // stderr mode 23136cb39f92SBram Moolenaar #define JO_CALLBACK 0x0010 // channel callback 23146cb39f92SBram Moolenaar #define JO_OUT_CALLBACK 0x0020 // stdout callback 23156cb39f92SBram Moolenaar #define JO_ERR_CALLBACK 0x0040 // stderr callback 23166cb39f92SBram Moolenaar #define JO_CLOSE_CALLBACK 0x0080 // "close_cb" 23176cb39f92SBram Moolenaar #define JO_WAITTIME 0x0100 // only for ch_open() 23186cb39f92SBram Moolenaar #define JO_TIMEOUT 0x0200 // all timeouts 23196cb39f92SBram Moolenaar #define JO_OUT_TIMEOUT 0x0400 // stdout timeouts 23206cb39f92SBram Moolenaar #define JO_ERR_TIMEOUT 0x0800 // stderr timeouts 23216cb39f92SBram Moolenaar #define JO_PART 0x1000 // "part" 23226cb39f92SBram Moolenaar #define JO_ID 0x2000 // "id" 23236cb39f92SBram Moolenaar #define JO_STOPONEXIT 0x4000 // "stoponexit" 23246cb39f92SBram Moolenaar #define JO_EXIT_CB 0x8000 // "exit_cb" 23256cb39f92SBram Moolenaar #define JO_OUT_IO 0x10000 // "out_io" 23266cb39f92SBram Moolenaar #define JO_ERR_IO 0x20000 // "err_io" (JO_OUT_IO << 1) 23276cb39f92SBram Moolenaar #define JO_IN_IO 0x40000 // "in_io" (JO_OUT_IO << 2) 23286cb39f92SBram Moolenaar #define JO_OUT_NAME 0x80000 // "out_name" 23296cb39f92SBram Moolenaar #define JO_ERR_NAME 0x100000 // "err_name" (JO_OUT_NAME << 1) 23306cb39f92SBram Moolenaar #define JO_IN_NAME 0x200000 // "in_name" (JO_OUT_NAME << 2) 23316cb39f92SBram Moolenaar #define JO_IN_TOP 0x400000 // "in_top" 23326cb39f92SBram Moolenaar #define JO_IN_BOT 0x800000 // "in_bot" 23336cb39f92SBram Moolenaar #define JO_OUT_BUF 0x1000000 // "out_buf" 23346cb39f92SBram Moolenaar #define JO_ERR_BUF 0x2000000 // "err_buf" (JO_OUT_BUF << 1) 23356cb39f92SBram Moolenaar #define JO_IN_BUF 0x4000000 // "in_buf" (JO_OUT_BUF << 2) 23366cb39f92SBram Moolenaar #define JO_CHANNEL 0x8000000 // "channel" 23376cb39f92SBram Moolenaar #define JO_BLOCK_WRITE 0x10000000 // "block_write" 23386cb39f92SBram Moolenaar #define JO_OUT_MODIFIABLE 0x20000000 // "out_modifiable" 23396cb39f92SBram Moolenaar #define JO_ERR_MODIFIABLE 0x40000000 // "err_modifiable" (JO_OUT_ << 1) 23408b877ac3SBram Moolenaar #define JO_ALL 0x7fffffff 234140ea1da1SBram Moolenaar 23426cb39f92SBram Moolenaar #define JO2_OUT_MSG 0x0001 // "out_msg" 23436cb39f92SBram Moolenaar #define JO2_ERR_MSG 0x0002 // "err_msg" (JO_OUT_ << 1) 23446cb39f92SBram Moolenaar #define JO2_TERM_NAME 0x0004 // "term_name" 23456cb39f92SBram Moolenaar #define JO2_TERM_FINISH 0x0008 // "term_finish" 23466cb39f92SBram Moolenaar #define JO2_ENV 0x0010 // "env" 23476cb39f92SBram Moolenaar #define JO2_CWD 0x0020 // "cwd" 23486cb39f92SBram Moolenaar #define JO2_TERM_ROWS 0x0040 // "term_rows" 23496cb39f92SBram Moolenaar #define JO2_TERM_COLS 0x0080 // "term_cols" 23506cb39f92SBram Moolenaar #define JO2_VERTICAL 0x0100 // "vertical" 23516cb39f92SBram Moolenaar #define JO2_CURWIN 0x0200 // "curwin" 23526cb39f92SBram Moolenaar #define JO2_HIDDEN 0x0400 // "hidden" 23536cb39f92SBram Moolenaar #define JO2_TERM_OPENCMD 0x0800 // "term_opencmd" 23546cb39f92SBram Moolenaar #define JO2_EOF_CHARS 0x1000 // "eof_chars" 23556cb39f92SBram Moolenaar #define JO2_NORESTORE 0x2000 // "norestore" 23566cb39f92SBram Moolenaar #define JO2_TERM_KILL 0x4000 // "term_kill" 23576cb39f92SBram Moolenaar #define JO2_ANSI_COLORS 0x8000 // "ansi_colors" 23586cb39f92SBram Moolenaar #define JO2_TTY_TYPE 0x10000 // "tty_type" 23596cb39f92SBram Moolenaar #define JO2_BUFNR 0x20000 // "bufnr" 2360d2842ea6SBram Moolenaar #define JO2_TERM_API 0x40000 // "term_api" 236183d4790aSBram Moolenaar #define JO2_TERM_HIGHLIGHT 0x80000 // "highlight" 2362169ebb08SBram Moolenaar 2363b6b5252bSBram Moolenaar #define JO_MODE_ALL (JO_MODE + JO_IN_MODE + JO_OUT_MODE + JO_ERR_MODE) 23644e221c99SBram Moolenaar #define JO_CB_ALL \ 23654e221c99SBram Moolenaar (JO_CALLBACK + JO_OUT_CALLBACK + JO_ERR_CALLBACK + JO_CLOSE_CALLBACK) 2366b6b5252bSBram Moolenaar #define JO_TIMEOUT_ALL (JO_TIMEOUT + JO_OUT_TIMEOUT + JO_ERR_TIMEOUT) 2367b6b5252bSBram Moolenaar 23689a6e33a1SBram Moolenaar /* 2369910b8aacSBram Moolenaar * Options for job and channel commands. 23709a6e33a1SBram Moolenaar */ 23719a6e33a1SBram Moolenaar typedef struct 23729a6e33a1SBram Moolenaar { 23736cb39f92SBram Moolenaar int jo_set; // JO_ bits for values that were set 23746cb39f92SBram Moolenaar int jo_set2; // JO2_ bits for values that were set 237540ea1da1SBram Moolenaar 237640ea1da1SBram Moolenaar ch_mode_T jo_mode; 2377b6b5252bSBram Moolenaar ch_mode_T jo_in_mode; 2378b6b5252bSBram Moolenaar ch_mode_T jo_out_mode; 2379b6b5252bSBram Moolenaar ch_mode_T jo_err_mode; 23800b146888SBram Moolenaar int jo_noblock; 2381187db50dSBram Moolenaar 23826cb39f92SBram Moolenaar job_io_T jo_io[4]; // PART_OUT, PART_ERR, PART_IN 2383187db50dSBram Moolenaar char_u jo_io_name_buf[4][NUMBUFLEN]; 23846cb39f92SBram Moolenaar char_u *jo_io_name[4]; // not allocated! 238529fd0387SBram Moolenaar int jo_io_buf[4]; 23865a1feb80SBram Moolenaar int jo_pty; 23879f5842e6SBram Moolenaar int jo_modifiable[4]; 2388169ebb08SBram Moolenaar int jo_message[4]; 2389de279891SBram Moolenaar channel_T *jo_channel; 2390187db50dSBram Moolenaar 2391014069a7SBram Moolenaar linenr_T jo_in_top; 2392014069a7SBram Moolenaar linenr_T jo_in_bot; 2393014069a7SBram Moolenaar 23943a97bb3fSBram Moolenaar callback_T jo_callback; 23953a97bb3fSBram Moolenaar callback_T jo_out_cb; 23963a97bb3fSBram Moolenaar callback_T jo_err_cb; 23973a97bb3fSBram Moolenaar callback_T jo_close_cb; 23983a97bb3fSBram Moolenaar callback_T jo_exit_cb; 2399958dc692SBram Moolenaar int jo_drop_never; 240040ea1da1SBram Moolenaar int jo_waittime; 240140ea1da1SBram Moolenaar int jo_timeout; 2402b6b5252bSBram Moolenaar int jo_out_timeout; 2403b6b5252bSBram Moolenaar int jo_err_timeout; 24046cb39f92SBram Moolenaar int jo_block_write; // for testing only 24056f3a5442SBram Moolenaar int jo_part; 24066f3a5442SBram Moolenaar int jo_id; 240721109272SBram Moolenaar char_u jo_stoponexit_buf[NUMBUFLEN]; 240865edff8fSBram Moolenaar char_u *jo_stoponexit; 24096cb39f92SBram Moolenaar dict_T *jo_env; // environment variables 241005aafed5SBram Moolenaar char_u jo_cwd_buf[NUMBUFLEN]; 241105aafed5SBram Moolenaar char_u *jo_cwd; 241258556cd0SBram Moolenaar 241358556cd0SBram Moolenaar #ifdef FEAT_TERMINAL 24146cb39f92SBram Moolenaar // when non-zero run the job in a terminal window of this size 241558556cd0SBram Moolenaar int jo_term_rows; 241658556cd0SBram Moolenaar int jo_term_cols; 241708d384ffSBram Moolenaar int jo_vertical; 2418da43b61dSBram Moolenaar int jo_curwin; 241987abab92SBram Moolenaar buf_T *jo_bufnr_buf; 24208cad930aSBram Moolenaar int jo_hidden; 24214d8bac8bSBram Moolenaar int jo_term_norestore; 242221109272SBram Moolenaar char_u jo_term_name_buf[NUMBUFLEN]; 242378712a77SBram Moolenaar char_u *jo_term_name; 242421109272SBram Moolenaar char_u jo_term_opencmd_buf[NUMBUFLEN]; 242537c45835SBram Moolenaar char_u *jo_term_opencmd; 2426dd693ce2SBram Moolenaar int jo_term_finish; 242721109272SBram Moolenaar char_u jo_eof_chars_buf[NUMBUFLEN]; 24283346cc4fSBram Moolenaar char_u *jo_eof_chars; 242921109272SBram Moolenaar char_u jo_term_kill_buf[NUMBUFLEN]; 243025cdd9c3SBram Moolenaar char_u *jo_term_kill; 2431f59c6e8cSBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 2432f59c6e8cSBram Moolenaar long_u jo_ansi_colors[16]; 2433f59c6e8cSBram Moolenaar # endif 243483d4790aSBram Moolenaar char_u jo_term_highlight_buf[NUMBUFLEN]; 243583d4790aSBram Moolenaar char_u *jo_term_highlight; 2436c6ddce3fSBram Moolenaar int jo_tty_type; // first character of "tty_type" 2437d2842ea6SBram Moolenaar char_u jo_term_api_buf[NUMBUFLEN]; 243821109272SBram Moolenaar char_u *jo_term_api; 24393346cc4fSBram Moolenaar #endif 24409a6e33a1SBram Moolenaar } jobopt_T; 24419a6e33a1SBram Moolenaar 24426d2399bdSBram Moolenaar #ifdef FEAT_EVAL 24436d2399bdSBram Moolenaar /* 24446d2399bdSBram Moolenaar * Structure used for listeners added with listener_add(). 24456d2399bdSBram Moolenaar */ 24466d2399bdSBram Moolenaar typedef struct listener_S listener_T; 24476d2399bdSBram Moolenaar struct listener_S 24486d2399bdSBram Moolenaar { 24496d2399bdSBram Moolenaar listener_T *lr_next; 24506d2399bdSBram Moolenaar int lr_id; 24513a97bb3fSBram Moolenaar callback_T lr_callback; 24526d2399bdSBram Moolenaar }; 24536d2399bdSBram Moolenaar #endif 24546463ca22SBram Moolenaar 24556cb39f92SBram Moolenaar /* 24566cb39f92SBram Moolenaar * structure used for explicit stack while garbage collecting hash tables 24576cb39f92SBram Moolenaar */ 24582459a5ecSBram Moolenaar typedef struct ht_stack_S 24592459a5ecSBram Moolenaar { 24602459a5ecSBram Moolenaar hashtab_T *ht; 24612459a5ecSBram Moolenaar struct ht_stack_S *prev; 24622459a5ecSBram Moolenaar } ht_stack_T; 24632459a5ecSBram Moolenaar 24646cb39f92SBram Moolenaar /* 24656cb39f92SBram Moolenaar * structure used for explicit stack while garbage collecting lists 24666cb39f92SBram Moolenaar */ 24672459a5ecSBram Moolenaar typedef struct list_stack_S 24682459a5ecSBram Moolenaar { 24692459a5ecSBram Moolenaar list_T *list; 24702459a5ecSBram Moolenaar struct list_stack_S *prev; 24712459a5ecSBram Moolenaar } list_stack_T; 24722459a5ecSBram Moolenaar 247345e18cbdSBram Moolenaar /* 247445e18cbdSBram Moolenaar * Structure used for iterating over dictionary items. 247545e18cbdSBram Moolenaar * Initialize with dict_iterate_start(). 247645e18cbdSBram Moolenaar */ 247745e18cbdSBram Moolenaar typedef struct 247845e18cbdSBram Moolenaar { 247945e18cbdSBram Moolenaar long_u dit_todo; 248045e18cbdSBram Moolenaar hashitem_T *dit_hi; 248145e18cbdSBram Moolenaar } dict_iterator_T; 248245e18cbdSBram Moolenaar 24836cb39f92SBram Moolenaar // values for b_syn_spell: what to do with toplevel text 24846cb39f92SBram Moolenaar #define SYNSPL_DEFAULT 0 // spell check if @Spell not defined 24856cb39f92SBram Moolenaar #define SYNSPL_TOP 1 // spell check toplevel text 24866cb39f92SBram Moolenaar #define SYNSPL_NOTOP 2 // don't spell check toplevel text 2487ce0842a6SBram Moolenaar 2488e35a52aeSBram Moolenaar // values for b_syn_foldlevel: how to compute foldlevel on a line 2489e35a52aeSBram Moolenaar #define SYNFLD_START 0 // use level of item at start of line 2490e35a52aeSBram Moolenaar #define SYNFLD_MINIMUM 1 // use lowest local minimum level on line 2491e35a52aeSBram Moolenaar 24926cb39f92SBram Moolenaar // avoid #ifdefs for when b_spell is not available 2493b9a02fc5SBram Moolenaar #ifdef FEAT_SPELL 24944770d09aSBram Moolenaar # define B_SPELL(buf) ((buf)->b_spell) 24954770d09aSBram Moolenaar #else 24964770d09aSBram Moolenaar # define B_SPELL(buf) (0) 24974770d09aSBram Moolenaar #endif 24984770d09aSBram Moolenaar 2499d12f5c17SBram Moolenaar typedef struct qf_info_S qf_info_T; 2500dcaf10e1SBram Moolenaar 2501f7512552SBram Moolenaar #ifdef FEAT_PROFILE 25028a7f5a2dSBram Moolenaar /* 25038a7f5a2dSBram Moolenaar * Used for :syntime: timing of executing a syntax pattern. 25048a7f5a2dSBram Moolenaar */ 25058a7f5a2dSBram Moolenaar typedef struct { 25066cb39f92SBram Moolenaar proftime_T total; // total time used 25076cb39f92SBram Moolenaar proftime_T slowest; // time of slowest call 25086cb39f92SBram Moolenaar long count; // nr of times used 25096cb39f92SBram Moolenaar long match; // nr of times matched 25108a7f5a2dSBram Moolenaar } syn_time_T; 25118a7f5a2dSBram Moolenaar #endif 25128a7f5a2dSBram Moolenaar 251351fe3b14SBram Moolenaar typedef struct timer_S timer_T; 251451fe3b14SBram Moolenaar struct timer_S 251551fe3b14SBram Moolenaar { 251651fe3b14SBram Moolenaar long tr_id; 251751fe3b14SBram Moolenaar #ifdef FEAT_TIMERS 251851fe3b14SBram Moolenaar timer_T *tr_next; 251951fe3b14SBram Moolenaar timer_T *tr_prev; 25203a97bb3fSBram Moolenaar proftime_T tr_due; // when the callback is to be invoked 25213a97bb3fSBram Moolenaar char tr_firing; // when TRUE callback is being called 25223a97bb3fSBram Moolenaar char tr_paused; // when TRUE callback is not invoked 25233a97bb3fSBram Moolenaar int tr_repeat; // number of times to repeat, -1 forever 25243a97bb3fSBram Moolenaar long tr_interval; // msec 25253a97bb3fSBram Moolenaar callback_T tr_callback; 252651fe3b14SBram Moolenaar int tr_emsg_count; 252751fe3b14SBram Moolenaar #endif 252851fe3b14SBram Moolenaar }; 252951fe3b14SBram Moolenaar 25308f4ac015SBram Moolenaar #ifdef FEAT_CRYPT 25318f4ac015SBram Moolenaar /* 25328f4ac015SBram Moolenaar * Structure to hold the type of encryption and the state of encryption or 25338f4ac015SBram Moolenaar * decryption. 25348f4ac015SBram Moolenaar */ 25358f4ac015SBram Moolenaar typedef struct { 25368f4ac015SBram Moolenaar int method_nr; 25376cb39f92SBram Moolenaar void *method_state; // method-specific state information 25388f4ac015SBram Moolenaar } cryptstate_T; 25398f4ac015SBram Moolenaar 25406cb39f92SBram Moolenaar // values for method_nr 25418f4ac015SBram Moolenaar # define CRYPT_M_ZIP 0 25428f4ac015SBram Moolenaar # define CRYPT_M_BF 1 25438f4ac015SBram Moolenaar # define CRYPT_M_BF2 2 2544f573c6e1SChristian Brabandt # define CRYPT_M_SOD 3 2545f573c6e1SChristian Brabandt # define CRYPT_M_COUNT 4 // number of crypt methods 2546987411dbSBram Moolenaar 2547987411dbSBram Moolenaar // Currently all crypt methods work inplace. If one is added that isn't then 2548987411dbSBram Moolenaar // define this. 2549f573c6e1SChristian Brabandt # define CRYPT_NOT_INPLACE 1 25508f4ac015SBram Moolenaar #endif 25518f4ac015SBram Moolenaar 255205ad5ff0SBram Moolenaar #ifdef FEAT_PROP_POPUP 2553ac1f1bc2SBram Moolenaar typedef enum { 2554ac1f1bc2SBram Moolenaar POPPOS_BOTLEFT, 2555ac1f1bc2SBram Moolenaar POPPOS_TOPLEFT, 2556ac1f1bc2SBram Moolenaar POPPOS_BOTRIGHT, 2557ac1f1bc2SBram Moolenaar POPPOS_TOPRIGHT, 25584dd8fe0bSBram Moolenaar POPPOS_CENTER, 25594dd8fe0bSBram Moolenaar POPPOS_NONE 2560ac1f1bc2SBram Moolenaar } poppos_T; 25616c009a39SBram Moolenaar 25622e62b568SBram Moolenaar typedef enum { 25632e62b568SBram Moolenaar POPCLOSE_NONE, 25642e62b568SBram Moolenaar POPCLOSE_BUTTON, 25652e62b568SBram Moolenaar POPCLOSE_CLICK 25662e62b568SBram Moolenaar } popclose_T; 25672e62b568SBram Moolenaar 25686c009a39SBram Moolenaar # define POPUPWIN_DEFAULT_ZINDEX 50 25696c009a39SBram Moolenaar # define POPUPMENU_ZINDEX 100 2570a42d945eSBram Moolenaar # define POPUPWIN_DIALOG_ZINDEX 200 2571a42d945eSBram Moolenaar # define POPUPWIN_NOTIFICATION_ZINDEX 300 2572ac1f1bc2SBram Moolenaar #endif 25738f4ac015SBram Moolenaar 2574362ce480SBram Moolenaar /* 2575362ce480SBram Moolenaar * These are items normally related to a buffer. But when using ":ownsyntax" 2576362ce480SBram Moolenaar * a window may have its own instance. 2577362ce480SBram Moolenaar */ 2578860cae1cSBram Moolenaar typedef struct { 2579860cae1cSBram Moolenaar #ifdef FEAT_SYN_HL 25806cb39f92SBram Moolenaar hashtab_T b_keywtab; // syntax keywords hash table 25816cb39f92SBram Moolenaar hashtab_T b_keywtab_ic; // idem, ignore case 25826cb39f92SBram Moolenaar int b_syn_error; // TRUE when error occurred in HL 258306f1ed2fSBram Moolenaar # ifdef FEAT_RELTIME 25846cb39f92SBram Moolenaar int b_syn_slow; // TRUE when 'redrawtime' reached 258506f1ed2fSBram Moolenaar # endif 25866cb39f92SBram Moolenaar int b_syn_ic; // ignore case for :syn cmds 2587e35a52aeSBram Moolenaar int b_syn_foldlevel; // how to compute foldlevel on a line 25886cb39f92SBram Moolenaar int b_syn_spell; // SYNSPL_ values 25896cb39f92SBram Moolenaar garray_T b_syn_patterns; // table for syntax patterns 25906cb39f92SBram Moolenaar garray_T b_syn_clusters; // table for syntax clusters 25916cb39f92SBram Moolenaar int b_spell_cluster_id; // @Spell cluster ID or 0 25926cb39f92SBram Moolenaar int b_nospell_cluster_id; // @NoSpell cluster ID or 0 25936cb39f92SBram Moolenaar int b_syn_containedin; // TRUE when there is an item with a 25946cb39f92SBram Moolenaar // "containedin" argument 25956cb39f92SBram Moolenaar int b_syn_sync_flags; // flags about how to sync 25966cb39f92SBram Moolenaar short b_syn_sync_id; // group to sync on 25976cb39f92SBram Moolenaar long b_syn_sync_minlines; // minimal sync lines offset 25986cb39f92SBram Moolenaar long b_syn_sync_maxlines; // maximal sync lines offset 25996cb39f92SBram Moolenaar long b_syn_sync_linebreaks; // offset for multi-line pattern 26006cb39f92SBram Moolenaar char_u *b_syn_linecont_pat; // line continuation pattern 26016cb39f92SBram Moolenaar regprog_T *b_syn_linecont_prog; // line continuation program 2602f7512552SBram Moolenaar #ifdef FEAT_PROFILE 26038a7f5a2dSBram Moolenaar syn_time_T b_syn_linecont_time; 26048a7f5a2dSBram Moolenaar #endif 26056cb39f92SBram Moolenaar int b_syn_linecont_ic; // ignore-case flag for above 26066cb39f92SBram Moolenaar int b_syn_topgrp; // for ":syntax include" 2607860cae1cSBram Moolenaar # ifdef FEAT_CONCEAL 26086cb39f92SBram Moolenaar int b_syn_conceal; // auto-conceal for :syn cmds 2609860cae1cSBram Moolenaar # endif 2610860cae1cSBram Moolenaar # ifdef FEAT_FOLDING 26116cb39f92SBram Moolenaar int b_syn_folditems; // number of patterns with the HL_FOLD 26126cb39f92SBram Moolenaar // flag set 2613860cae1cSBram Moolenaar # endif 2614860cae1cSBram Moolenaar /* 26158765a4acSBram Moolenaar * b_sst_array[] contains the state stack for a number of lines, for the 26168765a4acSBram Moolenaar * start of that line (col == 0). This avoids having to recompute the 26178765a4acSBram Moolenaar * syntax state too often. 26188765a4acSBram Moolenaar * b_sst_array[] is allocated to hold the state for all displayed lines, 26198765a4acSBram Moolenaar * and states for 1 out of about 20 other lines. 2620860cae1cSBram Moolenaar * b_sst_array pointer to an array of synstate_T 2621860cae1cSBram Moolenaar * b_sst_len number of entries in b_sst_array[] 2622860cae1cSBram Moolenaar * b_sst_first pointer to first used entry in b_sst_array[] or NULL 2623860cae1cSBram Moolenaar * b_sst_firstfree pointer to first free entry in b_sst_array[] or NULL 2624860cae1cSBram Moolenaar * b_sst_freecount number of free entries in b_sst_array[] 2625860cae1cSBram Moolenaar * b_sst_check_lnum entries after this lnum need to be checked for 2626860cae1cSBram Moolenaar * validity (MAXLNUM means no check needed) 2627860cae1cSBram Moolenaar */ 2628860cae1cSBram Moolenaar synstate_T *b_sst_array; 2629860cae1cSBram Moolenaar int b_sst_len; 2630860cae1cSBram Moolenaar synstate_T *b_sst_first; 2631860cae1cSBram Moolenaar synstate_T *b_sst_firstfree; 2632860cae1cSBram Moolenaar int b_sst_freecount; 2633860cae1cSBram Moolenaar linenr_T b_sst_check_lnum; 26346cb39f92SBram Moolenaar short_u b_sst_lasttick; // last display tick 26356cb39f92SBram Moolenaar #endif // FEAT_SYN_HL 2636860cae1cSBram Moolenaar 2637860cae1cSBram Moolenaar #ifdef FEAT_SPELL 26386cb39f92SBram Moolenaar // for spell checking 26396cb39f92SBram Moolenaar garray_T b_langp; // list of pointers to slang_T, see spell.c 26406cb39f92SBram Moolenaar char_u b_spell_ismw[256]; // flags: is midword char 26416cb39f92SBram Moolenaar char_u *b_spell_ismw_mb; // multi-byte midword chars 26426cb39f92SBram Moolenaar char_u *b_p_spc; // 'spellcapcheck' 26436cb39f92SBram Moolenaar regprog_T *b_cap_prog; // program for 'spellcapcheck' 26446cb39f92SBram Moolenaar char_u *b_p_spf; // 'spellfile' 26456cb39f92SBram Moolenaar char_u *b_p_spl; // 'spelllang' 2646215f49c4SBram Moolenaar char_u *b_p_spo; // 'spelloptions' 26476cb39f92SBram Moolenaar int b_cjk; // all CJK letters as OK 2648cc63c647SBram Moolenaar #endif 26498765a4acSBram Moolenaar #if !defined(FEAT_SYN_HL) && !defined(FEAT_SPELL) 26508765a4acSBram Moolenaar int dummy; 26518765a4acSBram Moolenaar #endif 26526cb39f92SBram Moolenaar char_u b_syn_chartab[32]; // syntax iskeyword option 26536cb39f92SBram Moolenaar char_u *b_syn_isk; // iskeyword option 2654860cae1cSBram Moolenaar } synblock_T; 2655860cae1cSBram Moolenaar 2656860cae1cSBram Moolenaar 2657071d4279SBram Moolenaar /* 2658071d4279SBram Moolenaar * buffer: structure that holds information about one file 2659071d4279SBram Moolenaar * 2660071d4279SBram Moolenaar * Several windows can share a single Buffer 2661071d4279SBram Moolenaar * A buffer is unallocated if there is no memfile for it. 2662071d4279SBram Moolenaar * A buffer is new if the associated file has never been loaded yet. 2663071d4279SBram Moolenaar */ 2664071d4279SBram Moolenaar 2665071d4279SBram Moolenaar struct file_buffer 2666071d4279SBram Moolenaar { 26676cb39f92SBram Moolenaar memline_T b_ml; // associated memline (also contains line 26686cb39f92SBram Moolenaar // count) 2669071d4279SBram Moolenaar 26706cb39f92SBram Moolenaar buf_T *b_next; // links in list of buffers 2671071d4279SBram Moolenaar buf_T *b_prev; 2672071d4279SBram Moolenaar 26736cb39f92SBram Moolenaar int b_nwindows; // nr of windows open on this buffer 2674071d4279SBram Moolenaar 26756cb39f92SBram Moolenaar int b_flags; // various BF_ flags 26766cb39f92SBram Moolenaar int b_locked; // Buffer is being closed or referenced, don't 26776cb39f92SBram Moolenaar // let autocommands wipe it out. 2678983d83ffSBram Moolenaar int b_locked_split; // Buffer is being closed, don't allow opening 2679983d83ffSBram Moolenaar // a new window with it. 2680071d4279SBram Moolenaar 2681071d4279SBram Moolenaar /* 2682071d4279SBram Moolenaar * b_ffname has the full path of the file (NULL for no name). 2683071d4279SBram Moolenaar * b_sfname is the name as the user typed it (or NULL). 2684071d4279SBram Moolenaar * b_fname is the same as b_sfname, unless ":cd" has been done, 2685071d4279SBram Moolenaar * then it is the same as b_ffname (NULL for no name). 2686071d4279SBram Moolenaar */ 26873d6014f0SBram Moolenaar char_u *b_ffname; // full path file name, allocated 26883d6014f0SBram Moolenaar char_u *b_sfname; // short file name, allocated, may be equal to 26893d6014f0SBram Moolenaar // b_ffname 26903d6014f0SBram Moolenaar char_u *b_fname; // current file name, points to b_ffname or 26913d6014f0SBram Moolenaar // b_sfname 2692071d4279SBram Moolenaar 2693071d4279SBram Moolenaar #ifdef UNIX 26946cb39f92SBram Moolenaar int b_dev_valid; // TRUE when b_dev has a valid number 26956cb39f92SBram Moolenaar dev_t b_dev; // device number 26966cb39f92SBram Moolenaar ino_t b_ino; // inode number 2697071d4279SBram Moolenaar #endif 2698071d4279SBram Moolenaar #ifdef VMS 26996cb39f92SBram Moolenaar char b_fab_rfm; // Record format 27006cb39f92SBram Moolenaar char b_fab_rat; // Record attribute 27016cb39f92SBram Moolenaar unsigned int b_fab_mrs; // Max record size 2702071d4279SBram Moolenaar #endif 27036cb39f92SBram Moolenaar int b_fnum; // buffer number for this file. 2704480778b8SBram Moolenaar char_u b_key[VIM_SIZEOF_INT * 2 + 1]; 27056cb39f92SBram Moolenaar // key used for buf_hashtab, holds b_fnum as 27066cb39f92SBram Moolenaar // hex string 2707071d4279SBram Moolenaar 27086cb39f92SBram Moolenaar int b_changed; // 'modified': Set to TRUE if something in the 27096cb39f92SBram Moolenaar // file has been changed and not written out. 27106cb39f92SBram Moolenaar dictitem16_T b_ct_di; // holds the b:changedtick value in 27116cb39f92SBram Moolenaar // b_ct_di.di_tv.vval.v_number; 27126cb39f92SBram Moolenaar // incremented for each change, also for undo 271395c526e1SBram Moolenaar #define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number) 2714071d4279SBram Moolenaar 2715db3b4464SChristian Brabandt varnumber_T b_last_changedtick; // b:changedtick when TextChanged was 27166cb39f92SBram Moolenaar // last triggered. 2717db3b4464SChristian Brabandt varnumber_T b_last_changedtick_pum; // b:changedtick for TextChangedP 2718db3b4464SChristian Brabandt varnumber_T b_last_changedtick_i; // b:changedtick for TextChangedI 27195a093437SBram Moolenaar 27206cb39f92SBram Moolenaar int b_saving; // Set to TRUE if we are in the middle of 27216cb39f92SBram Moolenaar // saving the buffer. 2722071d4279SBram Moolenaar 2723071d4279SBram Moolenaar /* 2724071d4279SBram Moolenaar * Changes to a buffer require updating of the display. To minimize the 2725071d4279SBram Moolenaar * work, remember changes made and update everything at once. 2726071d4279SBram Moolenaar */ 27276cb39f92SBram Moolenaar int b_mod_set; // TRUE when there are changes since the last 27286cb39f92SBram Moolenaar // time the display was updated 27296cb39f92SBram Moolenaar linenr_T b_mod_top; // topmost lnum that was changed 27306cb39f92SBram Moolenaar linenr_T b_mod_bot; // lnum below last changed line, AFTER the 27316cb39f92SBram Moolenaar // change 27326cb39f92SBram Moolenaar long b_mod_xlines; // number of extra buffer lines inserted; 27336cb39f92SBram Moolenaar // negative when lines were deleted 2734071d4279SBram Moolenaar 27356cb39f92SBram Moolenaar wininfo_T *b_wininfo; // list of last used info for each window 2736071d4279SBram Moolenaar 27376cb39f92SBram Moolenaar long b_mtime; // last change time of original file 27380a7984afSLeah Neukirchen long b_mtime_ns; // nanoseconds of last change time 27396cb39f92SBram Moolenaar long b_mtime_read; // last change time when reading 27400a7984afSLeah Neukirchen long b_mtime_read_ns; // nanoseconds of last read time 27416cb39f92SBram Moolenaar off_T b_orig_size; // size of original file in bytes 27426cb39f92SBram Moolenaar int b_orig_mode; // mode of original file 2743ab9c89b6SBram Moolenaar #ifdef FEAT_VIMINFO 27446cb39f92SBram Moolenaar time_T b_last_used; // time when the buffer was last used; used 27456cb39f92SBram Moolenaar // for viminfo 2746ab9c89b6SBram Moolenaar #endif 2747071d4279SBram Moolenaar 27486cb39f92SBram Moolenaar pos_T b_namedm[NMARKS]; // current named marks (mark.c) 2749071d4279SBram Moolenaar 27506cb39f92SBram Moolenaar // These variables are set when VIsual_active becomes FALSE 2751a23ccb8aSBram Moolenaar visualinfo_T b_visual; 2752071d4279SBram Moolenaar #ifdef FEAT_EVAL 27536cb39f92SBram Moolenaar int b_visual_mode_eval; // b_visual.vi_mode for visualmode() 2754071d4279SBram Moolenaar #endif 2755071d4279SBram Moolenaar 27566cb39f92SBram Moolenaar pos_T b_last_cursor; // cursor position when last unloading this 27576cb39f92SBram Moolenaar // buffer 27586cb39f92SBram Moolenaar pos_T b_last_insert; // where Insert mode was left 27596cb39f92SBram Moolenaar pos_T b_last_change; // position of last change: '. mark 2760071d4279SBram Moolenaar 2761071d4279SBram Moolenaar #ifdef FEAT_JUMPLIST 2762071d4279SBram Moolenaar /* 2763071d4279SBram Moolenaar * the changelist contains old change positions 2764071d4279SBram Moolenaar */ 2765071d4279SBram Moolenaar pos_T b_changelist[JUMPLISTSIZE]; 27666cb39f92SBram Moolenaar int b_changelistlen; // number of active entries 27676cb39f92SBram Moolenaar int b_new_change; // set by u_savecommon() 2768071d4279SBram Moolenaar #endif 2769071d4279SBram Moolenaar 2770071d4279SBram Moolenaar /* 2771071d4279SBram Moolenaar * Character table, only used in charset.c for 'iskeyword' 2772071d4279SBram Moolenaar * 32 bytes of 8 bits: 1 bit per character 0-255. 2773071d4279SBram Moolenaar */ 2774071d4279SBram Moolenaar char_u b_chartab[32]; 2775071d4279SBram Moolenaar 27766cb39f92SBram Moolenaar // Table used for mappings local to a buffer. 2777071d4279SBram Moolenaar mapblock_T *(b_maphash[256]); 2778071d4279SBram Moolenaar 27796cb39f92SBram Moolenaar // First abbreviation local to a buffer. 2780071d4279SBram Moolenaar mapblock_T *b_first_abbr; 2781b66bab38SBram Moolenaar 2782ac9fb180SBram Moolenaar // User commands local to the buffer. 2783071d4279SBram Moolenaar garray_T b_ucmds; 27846cb39f92SBram Moolenaar // start and end of an operator, also used for '[ and '] 2785071d4279SBram Moolenaar pos_T b_op_start; 27864aea03ebSBram Moolenaar pos_T b_op_start_orig; // used for Insstart_orig 2787071d4279SBram Moolenaar pos_T b_op_end; 2788071d4279SBram Moolenaar 2789071d4279SBram Moolenaar #ifdef FEAT_VIMINFO 27906cb39f92SBram Moolenaar int b_marks_read; // Have we read viminfo marks yet? 2791071d4279SBram Moolenaar #endif 2792071d4279SBram Moolenaar 2793071d4279SBram Moolenaar /* 2794071d4279SBram Moolenaar * The following only used in undo.c. 2795071d4279SBram Moolenaar */ 27966cb39f92SBram Moolenaar u_header_T *b_u_oldhead; // pointer to oldest header 27976cb39f92SBram Moolenaar u_header_T *b_u_newhead; // pointer to newest header; may not be valid 27986cb39f92SBram Moolenaar // if b_u_curhead is not NULL 27996cb39f92SBram Moolenaar u_header_T *b_u_curhead; // pointer to current header 28006cb39f92SBram Moolenaar int b_u_numhead; // current number of headers 28016cb39f92SBram Moolenaar int b_u_synced; // entry lists are synced 28026cb39f92SBram Moolenaar long b_u_seq_last; // last used undo sequence number 28036cb39f92SBram Moolenaar long b_u_save_nr_last; // counter for last file write 28046cb39f92SBram Moolenaar long b_u_seq_cur; // hu_seq of header below which we are now 28056cb39f92SBram Moolenaar time_T b_u_time_cur; // uh_time of header below which we are now 28066cb39f92SBram Moolenaar long b_u_save_nr_cur; // file write nr after which we are now 2807071d4279SBram Moolenaar 2808071d4279SBram Moolenaar /* 2809071d4279SBram Moolenaar * variables for "U" command in undo.c 2810071d4279SBram Moolenaar */ 28116cb39f92SBram Moolenaar undoline_T b_u_line_ptr; // saved line for "U" command 28126cb39f92SBram Moolenaar linenr_T b_u_line_lnum; // line number of line in u_line 28136cb39f92SBram Moolenaar colnr_T b_u_line_colnr; // optional column number 2814071d4279SBram Moolenaar 28156cb39f92SBram Moolenaar int b_scanned; // ^N/^P have scanned this buffer 2816071d4279SBram Moolenaar 28176cb39f92SBram Moolenaar // flags for use of ":lmap" and IM control 28186cb39f92SBram Moolenaar long b_p_iminsert; // input mode for insert 28196cb39f92SBram Moolenaar long b_p_imsearch; // input mode for search 28206cb39f92SBram Moolenaar #define B_IMODE_USE_INSERT -1 // Use b_p_iminsert value for search 28216cb39f92SBram Moolenaar #define B_IMODE_NONE 0 // Input via none 28226cb39f92SBram Moolenaar #define B_IMODE_LMAP 1 // Input via langmap 28236cb39f92SBram Moolenaar #define B_IMODE_IM 2 // Input via input method 2824071d4279SBram Moolenaar #define B_IMODE_LAST 2 2825071d4279SBram Moolenaar 2826071d4279SBram Moolenaar #ifdef FEAT_KEYMAP 28276cb39f92SBram Moolenaar short b_kmap_state; // using "lmap" mappings 28286cb39f92SBram Moolenaar # define KEYMAP_INIT 1 // 'keymap' was set, call keymap_init() 28296cb39f92SBram Moolenaar # define KEYMAP_LOADED 2 // 'keymap' mappings have been loaded 28306cb39f92SBram Moolenaar garray_T b_kmap_ga; // the keymap table 2831071d4279SBram Moolenaar #endif 2832071d4279SBram Moolenaar 2833071d4279SBram Moolenaar /* 2834071d4279SBram Moolenaar * Options local to a buffer. 2835071d4279SBram Moolenaar * They are here because their value depends on the type of file 2836071d4279SBram Moolenaar * or contents of the file being edited. 2837071d4279SBram Moolenaar */ 28386cb39f92SBram Moolenaar int b_p_initialized; // set when options initialized 2839071d4279SBram Moolenaar 28405e3cb7e8SBram Moolenaar #ifdef FEAT_EVAL 28416cb39f92SBram Moolenaar sctx_T b_p_script_ctx[BV_COUNT]; // SCTXs for buffer-local options 28425e3cb7e8SBram Moolenaar #endif 28435e3cb7e8SBram Moolenaar 28446cb39f92SBram Moolenaar int b_p_ai; // 'autoindent' 28456cb39f92SBram Moolenaar int b_p_ai_nopaste; // b_p_ai saved for paste mode 28466cb39f92SBram Moolenaar char_u *b_p_bkc; // 'backupcopy' 28476cb39f92SBram Moolenaar unsigned b_bkc_flags; // flags for 'backupcopy' 28486cb39f92SBram Moolenaar int b_p_ci; // 'copyindent' 28496cb39f92SBram Moolenaar int b_p_bin; // 'binary' 28506cb39f92SBram Moolenaar int b_p_bomb; // 'bomb' 28516cb39f92SBram Moolenaar char_u *b_p_bh; // 'bufhidden' 28526cb39f92SBram Moolenaar char_u *b_p_bt; // 'buftype' 28531f2903c4SBram Moolenaar #ifdef FEAT_QUICKFIX 2854c1542744SBram Moolenaar #define BUF_HAS_QF_ENTRY 1 2855c1542744SBram Moolenaar #define BUF_HAS_LL_ENTRY 2 28562f095a4bSBram Moolenaar int b_has_qf_entry; 2857071d4279SBram Moolenaar #endif 28586cb39f92SBram Moolenaar int b_p_bl; // 'buflisted' 2859071d4279SBram Moolenaar #ifdef FEAT_CINDENT 28606cb39f92SBram Moolenaar int b_p_cin; // 'cindent' 28616cb39f92SBram Moolenaar char_u *b_p_cino; // 'cinoptions' 28626cb39f92SBram Moolenaar char_u *b_p_cink; // 'cinkeys' 2863071d4279SBram Moolenaar #endif 2864071d4279SBram Moolenaar #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT) 28656cb39f92SBram Moolenaar char_u *b_p_cinw; // 'cinwords' 2866071d4279SBram Moolenaar #endif 28676cb39f92SBram Moolenaar char_u *b_p_com; // 'comments' 2868071d4279SBram Moolenaar #ifdef FEAT_FOLDING 28696cb39f92SBram Moolenaar char_u *b_p_cms; // 'commentstring' 2870071d4279SBram Moolenaar #endif 28716cb39f92SBram Moolenaar char_u *b_p_cpt; // 'complete' 2872ac3150d3SBram Moolenaar #ifdef BACKSLASH_IN_FILENAME 2873ac3150d3SBram Moolenaar char_u *b_p_csl; // 'completeslash' 2874ac3150d3SBram Moolenaar #endif 2875cfbc5ee4SBram Moolenaar #ifdef FEAT_COMPL_FUNC 28766cb39f92SBram Moolenaar char_u *b_p_cfu; // 'completefunc' 28776cb39f92SBram Moolenaar char_u *b_p_ofu; // 'omnifunc' 2878cfbc5ee4SBram Moolenaar #endif 287945e18cbdSBram Moolenaar #ifdef FEAT_EVAL 28806cb39f92SBram Moolenaar char_u *b_p_tfu; // 'tagfunc' 288145e18cbdSBram Moolenaar #endif 28826cb39f92SBram Moolenaar int b_p_eol; // 'endofline' 28836cb39f92SBram Moolenaar int b_p_fixeol; // 'fixendofline' 28846cb39f92SBram Moolenaar int b_p_et; // 'expandtab' 28856cb39f92SBram Moolenaar int b_p_et_nobin; // b_p_et saved for binary mode 28866cb39f92SBram Moolenaar int b_p_et_nopaste; // b_p_et saved for paste mode 28876cb39f92SBram Moolenaar char_u *b_p_fenc; // 'fileencoding' 28886cb39f92SBram Moolenaar char_u *b_p_ff; // 'fileformat' 28896cb39f92SBram Moolenaar char_u *b_p_ft; // 'filetype' 28906cb39f92SBram Moolenaar char_u *b_p_fo; // 'formatoptions' 28916cb39f92SBram Moolenaar char_u *b_p_flp; // 'formatlistpat' 28926cb39f92SBram Moolenaar int b_p_inf; // 'infercase' 28936cb39f92SBram Moolenaar char_u *b_p_isk; // 'iskeyword' 2894071d4279SBram Moolenaar #ifdef FEAT_FIND_ID 28956cb39f92SBram Moolenaar char_u *b_p_def; // 'define' local value 28966cb39f92SBram Moolenaar char_u *b_p_inc; // 'include' 2897071d4279SBram Moolenaar # ifdef FEAT_EVAL 28986cb39f92SBram Moolenaar char_u *b_p_inex; // 'includeexpr' 28996cb39f92SBram Moolenaar long_u b_p_inex_flags; // flags for 'includeexpr' 2900071d4279SBram Moolenaar # endif 2901071d4279SBram Moolenaar #endif 2902071d4279SBram Moolenaar #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) 29036cb39f92SBram Moolenaar char_u *b_p_inde; // 'indentexpr' 29046cb39f92SBram Moolenaar long_u b_p_inde_flags; // flags for 'indentexpr' 29056cb39f92SBram Moolenaar char_u *b_p_indk; // 'indentkeys' 2906071d4279SBram Moolenaar #endif 29076cb39f92SBram Moolenaar char_u *b_p_fp; // 'formatprg' 29081d2ba7faSBram Moolenaar #if defined(FEAT_EVAL) 29096cb39f92SBram Moolenaar char_u *b_p_fex; // 'formatexpr' 29106cb39f92SBram Moolenaar long_u b_p_fex_flags; // flags for 'formatexpr' 29111d2ba7faSBram Moolenaar #endif 2912071d4279SBram Moolenaar #ifdef FEAT_CRYPT 29136cb39f92SBram Moolenaar char_u *b_p_key; // 'key' 2914071d4279SBram Moolenaar #endif 29156cb39f92SBram Moolenaar char_u *b_p_kp; // 'keywordprg' 2916071d4279SBram Moolenaar #ifdef FEAT_LISP 29176cb39f92SBram Moolenaar int b_p_lisp; // 'lisp' 2918071d4279SBram Moolenaar #endif 29196cb39f92SBram Moolenaar char_u *b_p_menc; // 'makeencoding' 29206cb39f92SBram Moolenaar char_u *b_p_mps; // 'matchpairs' 29216cb39f92SBram Moolenaar int b_p_ml; // 'modeline' 29226cb39f92SBram Moolenaar int b_p_ml_nobin; // b_p_ml saved for binary mode 29236cb39f92SBram Moolenaar int b_p_ma; // 'modifiable' 29246cb39f92SBram Moolenaar char_u *b_p_nf; // 'nrformats' 29256cb39f92SBram Moolenaar int b_p_pi; // 'preserveindent' 2926cfbc5ee4SBram Moolenaar #ifdef FEAT_TEXTOBJ 29276cb39f92SBram Moolenaar char_u *b_p_qe; // 'quoteescape' 2928cfbc5ee4SBram Moolenaar #endif 29296cb39f92SBram Moolenaar int b_p_ro; // 'readonly' 29306cb39f92SBram Moolenaar long b_p_sw; // 'shiftwidth' 29316cb39f92SBram Moolenaar int b_p_sn; // 'shortname' 2932071d4279SBram Moolenaar #ifdef FEAT_SMARTINDENT 29336cb39f92SBram Moolenaar int b_p_si; // 'smartindent' 2934071d4279SBram Moolenaar #endif 29356cb39f92SBram Moolenaar long b_p_sts; // 'softtabstop' 29366cb39f92SBram Moolenaar long b_p_sts_nopaste; // b_p_sts saved for paste mode 2937071d4279SBram Moolenaar #ifdef FEAT_SEARCHPATH 29386cb39f92SBram Moolenaar char_u *b_p_sua; // 'suffixesadd' 2939071d4279SBram Moolenaar #endif 29406cb39f92SBram Moolenaar int b_p_swf; // 'swapfile' 2941071d4279SBram Moolenaar #ifdef FEAT_SYN_HL 29426cb39f92SBram Moolenaar long b_p_smc; // 'synmaxcol' 29436cb39f92SBram Moolenaar char_u *b_p_syn; // 'syntax' 2944b9a02fc5SBram Moolenaar #endif 29456cb39f92SBram Moolenaar long b_p_ts; // 'tabstop' 29466cb39f92SBram Moolenaar int b_p_tx; // 'textmode' 29476cb39f92SBram Moolenaar long b_p_tw; // 'textwidth' 29486cb39f92SBram Moolenaar long b_p_tw_nobin; // b_p_tw saved for binary mode 29496cb39f92SBram Moolenaar long b_p_tw_nopaste; // b_p_tw saved for paste mode 29506cb39f92SBram Moolenaar long b_p_wm; // 'wrapmargin' 29516cb39f92SBram Moolenaar long b_p_wm_nobin; // b_p_wm saved for binary mode 29526cb39f92SBram Moolenaar long b_p_wm_nopaste; // b_p_wm saved for paste mode 295304958cbaSBram Moolenaar #ifdef FEAT_VARTABS 29546cb39f92SBram Moolenaar char_u *b_p_vsts; // 'varsofttabstop' 29556cb39f92SBram Moolenaar int *b_p_vsts_array; // 'varsofttabstop' in internal format 29566cb39f92SBram Moolenaar char_u *b_p_vsts_nopaste; // b_p_vsts saved for paste mode 29576cb39f92SBram Moolenaar char_u *b_p_vts; // 'vartabstop' 29586cb39f92SBram Moolenaar int *b_p_vts_array; // 'vartabstop' in internal format 295904958cbaSBram Moolenaar #endif 2960071d4279SBram Moolenaar #ifdef FEAT_KEYMAP 29616cb39f92SBram Moolenaar char_u *b_p_keymap; // 'keymap' 2962071d4279SBram Moolenaar #endif 2963071d4279SBram Moolenaar 29646cb39f92SBram Moolenaar /* 29656cb39f92SBram Moolenaar * local values for options which are normally global 29666cb39f92SBram Moolenaar */ 2967071d4279SBram Moolenaar #ifdef FEAT_QUICKFIX 29686cb39f92SBram Moolenaar char_u *b_p_gp; // 'grepprg' local value 29696cb39f92SBram Moolenaar char_u *b_p_mp; // 'makeprg' local value 29706cb39f92SBram Moolenaar char_u *b_p_efm; // 'errorformat' local value 2971071d4279SBram Moolenaar #endif 29726cb39f92SBram Moolenaar char_u *b_p_ep; // 'equalprg' local value 29736cb39f92SBram Moolenaar char_u *b_p_path; // 'path' local value 29746cb39f92SBram Moolenaar int b_p_ar; // 'autoread' local value 29756cb39f92SBram Moolenaar char_u *b_p_tags; // 'tags' local value 29766cb39f92SBram Moolenaar char_u *b_p_tc; // 'tagcase' local value 29776cb39f92SBram Moolenaar unsigned b_tc_flags; // flags for 'tagcase' 29786cb39f92SBram Moolenaar char_u *b_p_dict; // 'dictionary' local value 29796cb39f92SBram Moolenaar char_u *b_p_tsr; // 'thesaurus' local value 2980f4d8b76dSBram Moolenaar #ifdef FEAT_COMPL_FUNC 2981f4d8b76dSBram Moolenaar char_u *b_p_tsrfu; // 'thesaurusfunc' local value 2982f4d8b76dSBram Moolenaar #endif 29836cb39f92SBram Moolenaar long b_p_ul; // 'undolevels' local value 298455debbe3SBram Moolenaar #ifdef FEAT_PERSISTENT_UNDO 29856cb39f92SBram Moolenaar int b_p_udf; // 'undofile' 298655debbe3SBram Moolenaar #endif 2987af6c131bSBram Moolenaar #ifdef FEAT_LISP 29886cb39f92SBram Moolenaar char_u *b_p_lw; // 'lispwords' local value 2989af6c131bSBram Moolenaar #endif 2990e1fc5155SBram Moolenaar #ifdef FEAT_TERMINAL 29916cb39f92SBram Moolenaar long b_p_twsl; // 'termwinscroll' 2992e1fc5155SBram Moolenaar #endif 2993071d4279SBram Moolenaar 29946cb39f92SBram Moolenaar /* 29956cb39f92SBram Moolenaar * end of buffer options 29966cb39f92SBram Moolenaar */ 2997071d4279SBram Moolenaar 29986bcbcc59SBram Moolenaar #ifdef FEAT_CINDENT 29996cb39f92SBram Moolenaar // values set from b_p_cino 30006bcbcc59SBram Moolenaar int b_ind_level; 30016bcbcc59SBram Moolenaar int b_ind_open_imag; 30026bcbcc59SBram Moolenaar int b_ind_no_brace; 30036bcbcc59SBram Moolenaar int b_ind_first_open; 30046bcbcc59SBram Moolenaar int b_ind_open_extra; 30056bcbcc59SBram Moolenaar int b_ind_close_extra; 30066bcbcc59SBram Moolenaar int b_ind_open_left_imag; 30076bcbcc59SBram Moolenaar int b_ind_jump_label; 30086bcbcc59SBram Moolenaar int b_ind_case; 30096bcbcc59SBram Moolenaar int b_ind_case_code; 30106bcbcc59SBram Moolenaar int b_ind_case_break; 30116bcbcc59SBram Moolenaar int b_ind_param; 30126bcbcc59SBram Moolenaar int b_ind_func_type; 30136bcbcc59SBram Moolenaar int b_ind_comment; 30146bcbcc59SBram Moolenaar int b_ind_in_comment; 30156bcbcc59SBram Moolenaar int b_ind_in_comment2; 30166bcbcc59SBram Moolenaar int b_ind_cpp_baseclass; 30176bcbcc59SBram Moolenaar int b_ind_continuation; 30186bcbcc59SBram Moolenaar int b_ind_unclosed; 30196bcbcc59SBram Moolenaar int b_ind_unclosed2; 30206bcbcc59SBram Moolenaar int b_ind_unclosed_noignore; 30216bcbcc59SBram Moolenaar int b_ind_unclosed_wrapped; 30226bcbcc59SBram Moolenaar int b_ind_unclosed_whiteok; 30236bcbcc59SBram Moolenaar int b_ind_matching_paren; 30246bcbcc59SBram Moolenaar int b_ind_paren_prev; 30256bcbcc59SBram Moolenaar int b_ind_maxparen; 30266bcbcc59SBram Moolenaar int b_ind_maxcomment; 30276bcbcc59SBram Moolenaar int b_ind_scopedecl; 30286bcbcc59SBram Moolenaar int b_ind_scopedecl_code; 30296bcbcc59SBram Moolenaar int b_ind_java; 30306bcbcc59SBram Moolenaar int b_ind_js; 30316bcbcc59SBram Moolenaar int b_ind_keep_case_label; 30326bcbcc59SBram Moolenaar int b_ind_hash_comment; 30336bcbcc59SBram Moolenaar int b_ind_cpp_namespace; 30346bcbcc59SBram Moolenaar int b_ind_if_for_while; 30357720ba85SBram Moolenaar int b_ind_cpp_extern_c; 3036d881b516SBram Moolenaar int b_ind_pragma; 30376bcbcc59SBram Moolenaar #endif 30386bcbcc59SBram Moolenaar 30396cb39f92SBram Moolenaar linenr_T b_no_eol_lnum; // non-zero lnum when last line of next binary 30406cb39f92SBram Moolenaar // write should not have an end-of-line 3041cab35ad2SBram Moolenaar 30426cb39f92SBram Moolenaar int b_start_eol; // last line had eol when it was read 30436cb39f92SBram Moolenaar int b_start_ffc; // first char of 'ff' when edit started 30446cb39f92SBram Moolenaar char_u *b_start_fenc; // 'fileencoding' when edit started or NULL 30456cb39f92SBram Moolenaar int b_bad_char; // "++bad=" argument when edit started or 0 30466cb39f92SBram Moolenaar int b_start_bomb; // 'bomb' when it was read 3047071d4279SBram Moolenaar 3048071d4279SBram Moolenaar #ifdef FEAT_EVAL 30496cb39f92SBram Moolenaar dictitem_T b_bufvar; // variable for "b:" Dictionary 30506cb39f92SBram Moolenaar dict_T *b_vars; // internal variables, local to buffer 30516d2399bdSBram Moolenaar 30526d2399bdSBram Moolenaar listener_T *b_listener; 3053dda4144dSBram Moolenaar list_T *b_recorded_changes; 3054071d4279SBram Moolenaar #endif 305505ad5ff0SBram Moolenaar #ifdef FEAT_PROP_POPUP 3056b413d2e6SBram Moolenaar int b_has_textprop; // TRUE when text props were added 3057b413d2e6SBram Moolenaar hashtab_T *b_proptypes; // text property types local to buffer 305898aefe7cSBram Moolenaar #endif 3059071d4279SBram Moolenaar 30609b2200acSBram Moolenaar #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) 30616cb39f92SBram Moolenaar char_u *b_p_bexpr; // 'balloonexpr' local value 30626cb39f92SBram Moolenaar long_u b_p_bexpr_flags;// flags for 'balloonexpr' 30639b2200acSBram Moolenaar #endif 306449771f4fSBram Moolenaar #ifdef FEAT_CRYPT 30656cb39f92SBram Moolenaar char_u *b_p_cm; // 'cryptmethod' 306649771f4fSBram Moolenaar #endif 30679b2200acSBram Moolenaar 30686cb39f92SBram Moolenaar // When a buffer is created, it starts without a swap file. b_may_swap is 30696cb39f92SBram Moolenaar // then set to indicate that a swap file may be opened later. It is reset 30706cb39f92SBram Moolenaar // if a swap file could not be opened. 3071071d4279SBram Moolenaar int b_may_swap; 30726cb39f92SBram Moolenaar int b_did_warn; // Set to 1 if user has been warned on first 30736cb39f92SBram Moolenaar // change of a read-only file 30744770d09aSBram Moolenaar 30756cb39f92SBram Moolenaar // Two special kinds of buffers: 30766cb39f92SBram Moolenaar // help buffer - used for help files, won't use a swap file. 30776cb39f92SBram Moolenaar // spell buffer - used for spell info, never displayed and doesn't have a 30786cb39f92SBram Moolenaar // file name. 30796cb39f92SBram Moolenaar int b_help; // TRUE for help file buffer (when set b_p_bt 30806cb39f92SBram Moolenaar // is "help") 3081b9a02fc5SBram Moolenaar #ifdef FEAT_SPELL 30826cb39f92SBram Moolenaar int b_spell; // TRUE for a spell file buffer, most fields 30836cb39f92SBram Moolenaar // are not used! Use the B_SPELL macro to 30846cb39f92SBram Moolenaar // access b_spell without #ifdef. 30854770d09aSBram Moolenaar #endif 3086071d4279SBram Moolenaar 30876cb39f92SBram Moolenaar int b_shortname; // this file has an 8.3 file name 3088071d4279SBram Moolenaar 3089f273245fSBram Moolenaar #ifdef FEAT_JOB_CHANNEL 3090f273245fSBram Moolenaar char_u *b_prompt_text; // set by prompt_setprompt() 30913a97bb3fSBram Moolenaar callback_T b_prompt_callback; // set by prompt_setcallback() 30923a97bb3fSBram Moolenaar callback_T b_prompt_interrupt; // set by prompt_setinterrupt() 30936d41c78eSBram Moolenaar int b_prompt_insert; // value for restart_edit when entering 30946d41c78eSBram Moolenaar // a prompt buffer window. 3095f273245fSBram Moolenaar #endif 3096325b7a2fSBram Moolenaar #ifdef FEAT_MZSCHEME 30976cb39f92SBram Moolenaar void *b_mzscheme_ref; // The MzScheme reference to this buffer 3098325b7a2fSBram Moolenaar #endif 3099325b7a2fSBram Moolenaar 3100071d4279SBram Moolenaar #ifdef FEAT_PERL 3101e344beadSBram Moolenaar void *b_perl_private; 3102071d4279SBram Moolenaar #endif 3103071d4279SBram Moolenaar 3104071d4279SBram Moolenaar #ifdef FEAT_PYTHON 31056cb39f92SBram Moolenaar void *b_python_ref; // The Python reference to this buffer 3106071d4279SBram Moolenaar #endif 3107071d4279SBram Moolenaar 3108bd5e15fdSBram Moolenaar #ifdef FEAT_PYTHON3 31096cb39f92SBram Moolenaar void *b_python3_ref; // The Python3 reference to this buffer 3110bd5e15fdSBram Moolenaar #endif 3111bd5e15fdSBram Moolenaar 3112071d4279SBram Moolenaar #ifdef FEAT_TCL 3113e344beadSBram Moolenaar void *b_tcl_ref; 3114071d4279SBram Moolenaar #endif 3115071d4279SBram Moolenaar 3116071d4279SBram Moolenaar #ifdef FEAT_RUBY 3117e344beadSBram Moolenaar void *b_ruby_ref; 3118071d4279SBram Moolenaar #endif 3119071d4279SBram Moolenaar 3120860cae1cSBram Moolenaar #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) 31216cb39f92SBram Moolenaar synblock_T b_s; // Info related to syntax highlighting. w_s 31226cb39f92SBram Moolenaar // normally points to this, but some windows 31236cb39f92SBram Moolenaar // may use a different synblock_T. 3124b9a02fc5SBram Moolenaar #endif 3125071d4279SBram Moolenaar 3126071d4279SBram Moolenaar #ifdef FEAT_SIGNS 31276656c2ecSBram Moolenaar sign_entry_T *b_signlist; // list of placed signs 31283b7b8364SBram Moolenaar # ifdef FEAT_NETBEANS_INTG 31296cb39f92SBram Moolenaar int b_has_sign_column; // Flag that is set when a first sign is 31306cb39f92SBram Moolenaar // added and remains set until the end of 31316cb39f92SBram Moolenaar // the netbeans session. 31323b7b8364SBram Moolenaar # endif 3133071d4279SBram Moolenaar #endif 3134071d4279SBram Moolenaar 3135071d4279SBram Moolenaar #ifdef FEAT_NETBEANS_INTG 31366cb39f92SBram Moolenaar int b_netbeans_file; // TRUE when buffer is owned by NetBeans 31376cb39f92SBram Moolenaar int b_was_netbeans_file;// TRUE if b_netbeans_file was once set 3138071d4279SBram Moolenaar #endif 3139509ce2a5SBram Moolenaar #ifdef FEAT_JOB_CHANNEL 31406cb39f92SBram Moolenaar int b_write_to_channel; // TRUE when appended lines are written to 31416cb39f92SBram Moolenaar // a channel. 314299ef0629SBram Moolenaar #endif 3143071d4279SBram Moolenaar 31448f4ac015SBram Moolenaar #ifdef FEAT_CRYPT 31456cb39f92SBram Moolenaar cryptstate_T *b_cryptstate; // Encryption state while reading or writing 31466cb39f92SBram Moolenaar // the file. NULL when not using encryption. 31478f4ac015SBram Moolenaar #endif 31486cb39f92SBram Moolenaar int b_mapped_ctrl_c; // modes where CTRL-C is mapped 31498f4ac015SBram Moolenaar 3150e4f25e4aSBram Moolenaar #ifdef FEAT_TERMINAL 31516cb39f92SBram Moolenaar term_T *b_term; // When not NULL this buffer is for a terminal 31526cb39f92SBram Moolenaar // window. 3153e4f25e4aSBram Moolenaar #endif 3154e828b762SBram Moolenaar #ifdef FEAT_DIFF 3155e828b762SBram Moolenaar int b_diff_failed; // internal diff failed for this buffer 3156e828b762SBram Moolenaar #endif 31576cb39f92SBram Moolenaar }; // file_buffer 3158071d4279SBram Moolenaar 3159997fb4baSBram Moolenaar 3160997fb4baSBram Moolenaar #ifdef FEAT_DIFF 3161997fb4baSBram Moolenaar /* 3162997fb4baSBram Moolenaar * Stuff for diff mode. 3163997fb4baSBram Moolenaar */ 31646cb39f92SBram Moolenaar # define DB_COUNT 8 // up to eight buffers can be diff'ed 3165997fb4baSBram Moolenaar 3166997fb4baSBram Moolenaar /* 3167997fb4baSBram Moolenaar * Each diffblock defines where a block of lines starts in each of the buffers 3168997fb4baSBram Moolenaar * and how many lines it occupies in that buffer. When the lines are missing 3169997fb4baSBram Moolenaar * in the buffer the df_count[] is zero. This is all counted in 3170997fb4baSBram Moolenaar * buffer lines. 3171997fb4baSBram Moolenaar * There is always at least one unchanged line in between the diffs. 3172997fb4baSBram Moolenaar * Otherwise it would have been included in the diff above or below it. 3173997fb4baSBram Moolenaar * df_lnum[] + df_count[] is the lnum below the change. When in one buffer 3174997fb4baSBram Moolenaar * lines have been inserted, in the other buffer df_lnum[] is the line below 3175997fb4baSBram Moolenaar * the insertion and df_count[] is zero. When appending lines at the end of 3176997fb4baSBram Moolenaar * the buffer, df_lnum[] is one beyond the end! 3177997fb4baSBram Moolenaar * This is using a linked list, because the number of differences is expected 3178997fb4baSBram Moolenaar * to be reasonable small. The list is sorted on lnum. 3179997fb4baSBram Moolenaar */ 3180997fb4baSBram Moolenaar typedef struct diffblock_S diff_T; 3181997fb4baSBram Moolenaar struct diffblock_S 3182997fb4baSBram Moolenaar { 3183997fb4baSBram Moolenaar diff_T *df_next; 31846cb39f92SBram Moolenaar linenr_T df_lnum[DB_COUNT]; // line number in buffer 31856cb39f92SBram Moolenaar linenr_T df_count[DB_COUNT]; // nr of inserted/changed lines 3186997fb4baSBram Moolenaar }; 3187997fb4baSBram Moolenaar #endif 3188997fb4baSBram Moolenaar 3189746ebd3bSBram Moolenaar #define SNAP_HELP_IDX 0 3190746ebd3bSBram Moolenaar #define SNAP_AUCMD_IDX 1 3191746ebd3bSBram Moolenaar #define SNAP_COUNT 2 3192746ebd3bSBram Moolenaar 3193997fb4baSBram Moolenaar /* 3194997fb4baSBram Moolenaar * Tab pages point to the top frame of each tab page. 3195997fb4baSBram Moolenaar * Note: Most values are NOT valid for the current tab page! Use "curwin", 3196997fb4baSBram Moolenaar * "firstwin", etc. for that. "tp_topframe" is always valid and can be 3197997fb4baSBram Moolenaar * compared against "topframe" to find the current tab page. 3198997fb4baSBram Moolenaar */ 3199997fb4baSBram Moolenaar typedef struct tabpage_S tabpage_T; 3200997fb4baSBram Moolenaar struct tabpage_S 3201997fb4baSBram Moolenaar { 32024d784b21SBram Moolenaar tabpage_T *tp_next; // next tabpage or NULL 32034d784b21SBram Moolenaar frame_T *tp_topframe; // topframe for the windows 32044d784b21SBram Moolenaar win_T *tp_curwin; // current window in this Tab page 32054d784b21SBram Moolenaar win_T *tp_prevwin; // previous window in this Tab page 32064d784b21SBram Moolenaar win_T *tp_firstwin; // first window in this Tab page 32074d784b21SBram Moolenaar win_T *tp_lastwin; // last window in this Tab page 320805ad5ff0SBram Moolenaar #ifdef FEAT_PROP_POPUP 32094d784b21SBram Moolenaar win_T *tp_first_popupwin; // first popup window in this Tab page 32104d784b21SBram Moolenaar #endif 32114d784b21SBram Moolenaar long tp_old_Rows; // Rows when Tab page was left 32124d784b21SBram Moolenaar long tp_old_Columns; // Columns when Tab page was left 32134d784b21SBram Moolenaar long tp_ch_used; // value of 'cmdheight' when frame size 32144d784b21SBram Moolenaar // was set 32159b2200acSBram Moolenaar #ifdef FEAT_GUI 32169b2200acSBram Moolenaar int tp_prev_which_scrollbars[3]; 32174d784b21SBram Moolenaar // previous value of which_scrollbars 32189b2200acSBram Moolenaar #endif 321900aa069dSBram Moolenaar 322000aa069dSBram Moolenaar char_u *tp_localdir; // absolute path of local directory or 322100aa069dSBram Moolenaar // NULL 3222002bc799SBram Moolenaar char_u *tp_prevdir; // previous directory 3223002bc799SBram Moolenaar 3224997fb4baSBram Moolenaar #ifdef FEAT_DIFF 3225997fb4baSBram Moolenaar diff_T *tp_first_diff; 3226997fb4baSBram Moolenaar buf_T *(tp_diffbuf[DB_COUNT]); 3227e3521d9cSBram Moolenaar int tp_diff_invalid; // list of diffs is outdated 3228e3521d9cSBram Moolenaar int tp_diff_update; // update diffs before redrawing 3229997fb4baSBram Moolenaar #endif 32304d784b21SBram Moolenaar frame_T *(tp_snapshot[SNAP_COUNT]); // window layout snapshots 3231910f66f9SBram Moolenaar #ifdef FEAT_EVAL 32324d784b21SBram Moolenaar dictitem_T tp_winvar; // variable for "t:" Dictionary 32334d784b21SBram Moolenaar dict_T *tp_vars; // internal variables, local to tab page 3234910f66f9SBram Moolenaar #endif 32355e538ecdSBram Moolenaar 32365e538ecdSBram Moolenaar #ifdef FEAT_PYTHON 32374d784b21SBram Moolenaar void *tp_python_ref; // The Python value for this tab page 32385e538ecdSBram Moolenaar #endif 32395e538ecdSBram Moolenaar 32405e538ecdSBram Moolenaar #ifdef FEAT_PYTHON3 32414d784b21SBram Moolenaar void *tp_python3_ref; // The Python value for this tab page 32425e538ecdSBram Moolenaar #endif 3243997fb4baSBram Moolenaar }; 3244997fb4baSBram Moolenaar 3245071d4279SBram Moolenaar /* 3246071d4279SBram Moolenaar * Structure to cache info for displayed lines in w_lines[]. 3247071d4279SBram Moolenaar * Each logical line has one entry. 3248071d4279SBram Moolenaar * The entry tells how the logical line is currently displayed in the window. 3249071d4279SBram Moolenaar * This is updated when displaying the window. 3250071d4279SBram Moolenaar * When the display is changed (e.g., when clearing the screen) w_lines_valid 3251071d4279SBram Moolenaar * is changed to exclude invalid entries. 3252071d4279SBram Moolenaar * When making changes to the buffer, wl_valid is reset to indicate wl_size 3253071d4279SBram Moolenaar * may not reflect what is actually in the buffer. When wl_valid is FALSE, 3254071d4279SBram Moolenaar * the entries can only be used to count the number of displayed lines used. 3255071d4279SBram Moolenaar * wl_lnum and wl_lastlnum are invalid too. 3256071d4279SBram Moolenaar */ 3257071d4279SBram Moolenaar typedef struct w_line 3258071d4279SBram Moolenaar { 32596cb39f92SBram Moolenaar linenr_T wl_lnum; // buffer line number for logical line 32606cb39f92SBram Moolenaar short_u wl_size; // height in screen lines 32616cb39f92SBram Moolenaar char wl_valid; // TRUE values are valid for text in buffer 3262071d4279SBram Moolenaar #ifdef FEAT_FOLDING 32636cb39f92SBram Moolenaar char wl_folded; // TRUE when this is a range of folded lines 32646cb39f92SBram Moolenaar linenr_T wl_lastlnum; // last buffer line number for logical line 3265071d4279SBram Moolenaar #endif 3266071d4279SBram Moolenaar } wline_T; 3267071d4279SBram Moolenaar 3268071d4279SBram Moolenaar /* 3269071d4279SBram Moolenaar * Windows are kept in a tree of frames. Each frame has a column (FR_COL) 3270071d4279SBram Moolenaar * or row (FR_ROW) layout or is a leaf, which has a window. 3271071d4279SBram Moolenaar */ 32721d2ba7faSBram Moolenaar struct frame_S 3273071d4279SBram Moolenaar { 3274cce713ddSBram Moolenaar char fr_layout; // FR_LEAF, FR_COL or FR_ROW 3275071d4279SBram Moolenaar int fr_width; 3276cce713ddSBram Moolenaar int fr_newwidth; // new width used in win_equal_rec() 3277071d4279SBram Moolenaar int fr_height; 3278cce713ddSBram Moolenaar int fr_newheight; // new height used in win_equal_rec() 3279cce713ddSBram Moolenaar frame_T *fr_parent; // containing frame or NULL 3280cce713ddSBram Moolenaar frame_T *fr_next; // frame right or below in same parent, NULL 3281cce713ddSBram Moolenaar // for last 3282cce713ddSBram Moolenaar frame_T *fr_prev; // frame left or above in same parent, NULL 3283cce713ddSBram Moolenaar // for first 3284cce713ddSBram Moolenaar // fr_child and fr_win are mutually exclusive 3285cce713ddSBram Moolenaar frame_T *fr_child; // first contained frame 3286cce713ddSBram Moolenaar win_T *fr_win; // window that fills this frame 3287071d4279SBram Moolenaar }; 3288071d4279SBram Moolenaar 32896cb39f92SBram Moolenaar #define FR_LEAF 0 // frame is a leaf 32906cb39f92SBram Moolenaar #define FR_ROW 1 // frame with a row of windows 32916cb39f92SBram Moolenaar #define FR_COL 2 // frame with a column of windows 3292071d4279SBram Moolenaar 3293071d4279SBram Moolenaar /* 32946ee10162SBram Moolenaar * Struct used for highlighting 'hlsearch' matches, matches defined by 32956ee10162SBram Moolenaar * ":match" and matches defined by match functions. 32966ee10162SBram Moolenaar * For 'hlsearch' there is one pattern for all windows. For ":match" and the 32976ee10162SBram Moolenaar * match functions there is a different pattern for each window. 32986ee10162SBram Moolenaar */ 32996ee10162SBram Moolenaar typedef struct 33006ee10162SBram Moolenaar { 33016cb39f92SBram Moolenaar regmmatch_T rm; // points to the regexp program; contains last 33026cb39f92SBram Moolenaar // found match (may continue in next line) 33036cb39f92SBram Moolenaar buf_T *buf; // the buffer to search for a match 33046cb39f92SBram Moolenaar linenr_T lnum; // the line to search for a match 33056cb39f92SBram Moolenaar int attr; // attributes to be used for a match 33066cb39f92SBram Moolenaar int attr_cur; // attributes currently active in win_line() 33076cb39f92SBram Moolenaar linenr_T first_lnum; // first lnum to search for multi-line pat 33086cb39f92SBram Moolenaar colnr_T startcol; // in win_line() points to char where HL starts 33096cb39f92SBram Moolenaar colnr_T endcol; // in win_line() points to char where HL ends 33106cb39f92SBram Moolenaar int is_addpos; // position specified directly by 33116cb39f92SBram Moolenaar // matchaddpos(). TRUE/FALSE 331291a4e822SBram Moolenaar #ifdef FEAT_RELTIME 33136cb39f92SBram Moolenaar proftime_T tm; // for a time limit 331491a4e822SBram Moolenaar #endif 33156ee10162SBram Moolenaar } match_T; 33166ee10162SBram Moolenaar 33176cb39f92SBram Moolenaar // number of positions supported by matchaddpos() 3318b3414595SBram Moolenaar #define MAXPOSMATCH 8 3319b3414595SBram Moolenaar 3320b3414595SBram Moolenaar /* 3321b3414595SBram Moolenaar * Same as lpos_T, but with additional field len. 3322b3414595SBram Moolenaar */ 3323b3414595SBram Moolenaar typedef struct 3324b3414595SBram Moolenaar { 33256cb39f92SBram Moolenaar linenr_T lnum; // line number 33266cb39f92SBram Moolenaar colnr_T col; // column number 33276cb39f92SBram Moolenaar int len; // length: 0 - to the end of line 3328b3414595SBram Moolenaar } llpos_T; 3329b3414595SBram Moolenaar 3330b3414595SBram Moolenaar /* 3331b3414595SBram Moolenaar * posmatch_T provides an array for storing match items for matchaddpos() 3332b3414595SBram Moolenaar * function. 3333b3414595SBram Moolenaar */ 3334b3414595SBram Moolenaar typedef struct posmatch posmatch_T; 3335b3414595SBram Moolenaar struct posmatch 3336b3414595SBram Moolenaar { 33376cb39f92SBram Moolenaar llpos_T pos[MAXPOSMATCH]; // array of positions 33386cb39f92SBram Moolenaar int cur; // internal position counter 33396cb39f92SBram Moolenaar linenr_T toplnum; // top buffer line 33406cb39f92SBram Moolenaar linenr_T botlnum; // bottom buffer line 3341b3414595SBram Moolenaar }; 3342b3414595SBram Moolenaar 33436ee10162SBram Moolenaar /* 33446ee10162SBram Moolenaar * matchitem_T provides a linked list for storing match items for ":match" and 33456ee10162SBram Moolenaar * the match functions. 33466ee10162SBram Moolenaar */ 33476ee10162SBram Moolenaar typedef struct matchitem matchitem_T; 33486ee10162SBram Moolenaar struct matchitem 33496ee10162SBram Moolenaar { 33506ee10162SBram Moolenaar matchitem_T *next; 33516cb39f92SBram Moolenaar int id; // match ID 33526cb39f92SBram Moolenaar int priority; // match priority 33536cb39f92SBram Moolenaar char_u *pattern; // pattern to highlight 33546cb39f92SBram Moolenaar regmmatch_T match; // regexp program for pattern 33556cb39f92SBram Moolenaar posmatch_T pos; // position matches 33566cb39f92SBram Moolenaar match_T hl; // struct for doing the actual highlighting 3357d6beab02SBram Moolenaar int hlg_id; // highlight group ID 33586561d52eSBram Moolenaar #ifdef FEAT_CONCEAL 33596cb39f92SBram Moolenaar int conceal_char; // cchar for Conceal highlighting 33606561d52eSBram Moolenaar #endif 33616ee10162SBram Moolenaar }; 33626ee10162SBram Moolenaar 3363a68e5959SBram Moolenaar // Structure to store last cursor position and topline. Used by check_lnums() 3364a68e5959SBram Moolenaar // and reset_lnums(). 3365a68e5959SBram Moolenaar typedef struct 3366a68e5959SBram Moolenaar { 3367a68e5959SBram Moolenaar int w_topline_save; // original topline value 3368a68e5959SBram Moolenaar int w_topline_corr; // corrected topline value 3369a68e5959SBram Moolenaar pos_T w_cursor_save; // original cursor position 3370a68e5959SBram Moolenaar pos_T w_cursor_corr; // corrected cursor position 3371a68e5959SBram Moolenaar } pos_save_T; 3372a68e5959SBram Moolenaar 33731b9645deSBram Moolenaar #ifdef FEAT_MENU 33741b9645deSBram Moolenaar typedef struct { 33751b9645deSBram Moolenaar int wb_startcol; 33761b9645deSBram Moolenaar int wb_endcol; 33771b9645deSBram Moolenaar vimmenu_T *wb_menu; 33781b9645deSBram Moolenaar } winbar_item_T; 33791b9645deSBram Moolenaar #endif 33801b9645deSBram Moolenaar 33816ee10162SBram Moolenaar /* 3382eed9d462SBram Moolenaar * Characters from the 'listchars' option 3383eed9d462SBram Moolenaar */ 3384eed9d462SBram Moolenaar typedef struct 3385eed9d462SBram Moolenaar { 3386eed9d462SBram Moolenaar int eol; 3387eed9d462SBram Moolenaar int ext; 3388eed9d462SBram Moolenaar int prec; 3389eed9d462SBram Moolenaar int nbsp; 3390eed9d462SBram Moolenaar int space; 3391eed9d462SBram Moolenaar int tab1; 3392eed9d462SBram Moolenaar int tab2; 3393eed9d462SBram Moolenaar int tab3; 3394eed9d462SBram Moolenaar int trail; 3395eed9d462SBram Moolenaar int lead; 3396f14b8ba1Szeertzjq int *multispace; 3397eed9d462SBram Moolenaar #ifdef FEAT_CONCEAL 3398eed9d462SBram Moolenaar int conceal; 3399eed9d462SBram Moolenaar #endif 3400eed9d462SBram Moolenaar } lcs_chars_T; 3401eed9d462SBram Moolenaar 3402eed9d462SBram Moolenaar /* 3403071d4279SBram Moolenaar * Structure which contains all information that belongs to a window 3404071d4279SBram Moolenaar * 3405071d4279SBram Moolenaar * All row numbers are relative to the start of the window, except w_winrow. 3406071d4279SBram Moolenaar */ 34071d2ba7faSBram Moolenaar struct window_S 3408071d4279SBram Moolenaar { 34096cb39f92SBram Moolenaar int w_id; // unique window ID 341086edef66SBram Moolenaar 34116cb39f92SBram Moolenaar buf_T *w_buffer; // buffer we are a window into 34124d784b21SBram Moolenaar 34136cb39f92SBram Moolenaar win_T *w_prev; // link to previous window 34146cb39f92SBram Moolenaar win_T *w_next; // link to next window 3415071d4279SBram Moolenaar 3416860cae1cSBram Moolenaar #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) 34176cb39f92SBram Moolenaar synblock_T *w_s; // for :ownsyntax 3418860cae1cSBram Moolenaar #endif 3419860cae1cSBram Moolenaar 34206cb39f92SBram Moolenaar int w_closing; // window is being closed, don't let 34216cb39f92SBram Moolenaar // autocommands close it too. 3422071d4279SBram Moolenaar 34236cb39f92SBram Moolenaar frame_T *w_frame; // frame containing this window 3424071d4279SBram Moolenaar 34256cb39f92SBram Moolenaar pos_T w_cursor; // cursor position in buffer 3426071d4279SBram Moolenaar 34276cb39f92SBram Moolenaar colnr_T w_curswant; // The column we'd like to be at. This is 34286cb39f92SBram Moolenaar // used to try to stay in the same column 34296cb39f92SBram Moolenaar // for up/down cursor motions. 3430071d4279SBram Moolenaar 34316cb39f92SBram Moolenaar int w_set_curswant; // If set, then update w_curswant the next 34326cb39f92SBram Moolenaar // time through cursupdate() to the 34336cb39f92SBram Moolenaar // current virtual column 3434071d4279SBram Moolenaar 34354a5abbd6SBram Moolenaar #ifdef FEAT_SYN_HL 34364a5abbd6SBram Moolenaar linenr_T w_last_cursorline; // where last time 'cursorline' was drawn 34374a5abbd6SBram Moolenaar #endif 34384a5abbd6SBram Moolenaar 3439071d4279SBram Moolenaar /* 34406cb39f92SBram Moolenaar * the next seven are used to update the Visual highlighting 3441071d4279SBram Moolenaar */ 34426cb39f92SBram Moolenaar char w_old_visual_mode; // last known VIsual_mode 34436cb39f92SBram Moolenaar linenr_T w_old_cursor_lnum; // last known end of visual part 34446cb39f92SBram Moolenaar colnr_T w_old_cursor_fcol; // first column for block visual part 34456cb39f92SBram Moolenaar colnr_T w_old_cursor_lcol; // last column for block visual part 34466cb39f92SBram Moolenaar linenr_T w_old_visual_lnum; // last known start of visual part 34476cb39f92SBram Moolenaar colnr_T w_old_visual_col; // last known start of visual part 34486cb39f92SBram Moolenaar colnr_T w_old_curswant; // last known value of Curswant 3449071d4279SBram Moolenaar 3450eed9d462SBram Moolenaar lcs_chars_T w_lcs_chars; // 'listchars' characters 3451eed9d462SBram Moolenaar 3452071d4279SBram Moolenaar /* 3453d4153d4aSBram Moolenaar * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for 3454d4153d4aSBram Moolenaar * displaying the buffer. 3455071d4279SBram Moolenaar */ 34566cb39f92SBram Moolenaar linenr_T w_topline; // buffer line number of the line at the 34576cb39f92SBram Moolenaar // top of the window 34586cb39f92SBram Moolenaar char w_topline_was_set; // flag set to TRUE when topline is set, 34596cb39f92SBram Moolenaar // e.g. by winrestview() 34606a07644dSBram Moolenaar 34616a07644dSBram Moolenaar linenr_T w_botline; // number of the line below the bottom of 34626a07644dSBram Moolenaar // the window 34636a07644dSBram Moolenaar 3464071d4279SBram Moolenaar #ifdef FEAT_DIFF 34656cb39f92SBram Moolenaar int w_topfill; // number of filler lines above w_topline 34666cb39f92SBram Moolenaar int w_old_topfill; // w_topfill at last redraw 34676cb39f92SBram Moolenaar int w_botfill; // TRUE when filler lines are actually 34686cb39f92SBram Moolenaar // below w_topline (at end of file) 34696cb39f92SBram Moolenaar int w_old_botfill; // w_botfill at last redraw 3470071d4279SBram Moolenaar #endif 34716cb39f92SBram Moolenaar colnr_T w_leftcol; // window column number of the left most 34726cb39f92SBram Moolenaar // character in the window; used when 34736cb39f92SBram Moolenaar // 'wrap' is off 34746cb39f92SBram Moolenaar colnr_T w_skipcol; // starting column when a single line 34756cb39f92SBram Moolenaar // doesn't fit in the window 3476071d4279SBram Moolenaar 34776a07644dSBram Moolenaar int w_empty_rows; // number of ~ rows in window 34786a07644dSBram Moolenaar #ifdef FEAT_DIFF 34796a07644dSBram Moolenaar int w_filler_rows; // number of filler rows at the end of the 34806a07644dSBram Moolenaar // window 34816a07644dSBram Moolenaar #endif 34826a07644dSBram Moolenaar 3483071d4279SBram Moolenaar /* 3484071d4279SBram Moolenaar * Layout of the window in the screen. 3485071d4279SBram Moolenaar * May need to add "msg_scrolled" to "w_winrow" in rare situations. 3486071d4279SBram Moolenaar */ 34876cb39f92SBram Moolenaar int w_winrow; // first row of window in screen 34886cb39f92SBram Moolenaar int w_height; // number of rows in window, excluding 34896cb39f92SBram Moolenaar // status/command/winbar line(s) 34906a07644dSBram Moolenaar 34916cb39f92SBram Moolenaar int w_status_height; // number of status lines (0 or 1) 34926cb39f92SBram Moolenaar int w_wincol; // Leftmost column of window in screen. 34936cb39f92SBram Moolenaar int w_width; // Width of window, excluding separation. 34946cb39f92SBram Moolenaar int w_vsep_width; // Number of separator columns (0 or 1). 34956a07644dSBram Moolenaar 34966cb39f92SBram Moolenaar pos_save_T w_save_cursor; // backup of cursor pos and topline 34976a07644dSBram Moolenaar 349805ad5ff0SBram Moolenaar #ifdef FEAT_PROP_POPUP 3499ac1f1bc2SBram Moolenaar int w_popup_flags; // POPF_ values 3500afe45b68SBram Moolenaar int w_popup_handled; // POPUP_HANDLE[0-9] flags 3501eb2310d4SBram Moolenaar char_u *w_popup_title; 3502ac1f1bc2SBram Moolenaar poppos_T w_popup_pos; 3503042fb4b4SBram Moolenaar int w_popup_fixed; // do not shift popup to fit on screen 350412034e22SBram Moolenaar int w_popup_prop_type; // when not zero: textprop type ID 350512034e22SBram Moolenaar win_T *w_popup_prop_win; // window to search for textprop 350612034e22SBram Moolenaar int w_popup_prop_id; // when not zero: textprop ID 35074d784b21SBram Moolenaar int w_zindex; 350860cdb300SBram Moolenaar int w_minheight; // "minheight" for popup window 350960cdb300SBram Moolenaar int w_minwidth; // "minwidth" for popup window 35104d784b21SBram Moolenaar int w_maxheight; // "maxheight" for popup window 35114d784b21SBram Moolenaar int w_maxwidth; // "maxwidth" for popup window 3512de2396fcSBram Moolenaar int w_maxwidth_opt; // maxwidth from option 351360cdb300SBram Moolenaar int w_wantline; // "line" for popup window 351460cdb300SBram Moolenaar int w_wantcol; // "col" for popup window 35158d241040SBram Moolenaar int w_firstline; // "firstline" for popup window 351675fb0854SBram Moolenaar int w_want_scrollbar; // when zero don't use a scrollbar 3517f9c85f58SBram Moolenaar int w_has_scrollbar; // 1 if scrollbar displayed, 0 otherwise 35184cd583c6SBram Moolenaar char_u *w_scrollbar_highlight; // "scrollbarhighlight" 35194cd583c6SBram Moolenaar char_u *w_thumb_highlight; // "thumbhighlight" 35202fd8e35eSBram Moolenaar int w_popup_padding[4]; // popup padding top/right/bot/left 35212fd8e35eSBram Moolenaar int w_popup_border[4]; // popup border top/right/bot/left 3522790498b5SBram Moolenaar char_u *w_border_highlight[4]; // popup border highlight 3523790498b5SBram Moolenaar int w_border_char[8]; // popup border characters 3524d529ba58SBram Moolenaar 3525d529ba58SBram Moolenaar int w_popup_leftoff; // columns left of the screen 3526d529ba58SBram Moolenaar int w_popup_rightoff; // columns right of the screen 352712034e22SBram Moolenaar varnumber_T w_popup_last_changedtick; // b:changedtick of popup buffer 352812034e22SBram Moolenaar // when position was computed 352912034e22SBram Moolenaar varnumber_T w_popup_prop_changedtick; // b:changedtick of buffer with 353012034e22SBram Moolenaar // w_popup_prop_type when position 353112034e22SBram Moolenaar // was computed 353212034e22SBram Moolenaar int w_popup_prop_topline; // w_topline of window with 353312034e22SBram Moolenaar // w_popup_prop_type when position was 353417146966SBram Moolenaar // computed 35353d2a3cbcSBram Moolenaar linenr_T w_popup_last_curline; // last known w_cursor.lnum of window 35363d2a3cbcSBram Moolenaar // with "cursorline" set 35379eaac896SBram Moolenaar callback_T w_close_cb; // popup close callback 3538bf0eff0bSBram Moolenaar callback_T w_filter_cb; // popup filter callback 35396defa7bfSBram Moolenaar int w_filter_errors; // popup filter error count 3540581ba39aSBram Moolenaar int w_filter_mode; // mode when filter callback is used 35413397f74aSBram Moolenaar 35423397f74aSBram Moolenaar win_T *w_popup_curwin; // close popup if curwin differs 35433397f74aSBram Moolenaar linenr_T w_popup_lnum; // close popup if cursor not on this line 35443397f74aSBram Moolenaar colnr_T w_popup_mincol; // close popup if cursor before this col 35453397f74aSBram Moolenaar colnr_T w_popup_maxcol; // close popup if cursor after this col 354656a63120SBram Moolenaar int w_popup_mouse_row; // close popup if mouse moves away 354756a63120SBram Moolenaar int w_popup_mouse_mincol; // close popup if mouse moves away 354856a63120SBram Moolenaar int w_popup_mouse_maxcol; // close popup if mouse moves away 35492e62b568SBram Moolenaar popclose_T w_popup_close; // allow closing the popup with the mouse 35503397f74aSBram Moolenaar 3551d529ba58SBram Moolenaar list_T *w_popup_mask; // list of lists for "mask" 35524f0d002cSBram Moolenaar char_u *w_popup_mask_cells; // cached mask cells 35534f0d002cSBram Moolenaar int w_popup_mask_height; // height of w_popup_mask_cells 35544f0d002cSBram Moolenaar int w_popup_mask_width; // width of w_popup_mask_cells 355535d5af6cSBram Moolenaar # if defined(FEAT_TIMERS) 355651fe3b14SBram Moolenaar timer_T *w_popup_timer; // timer for closing popup window 35574d784b21SBram Moolenaar # endif 3558a68e5959SBram Moolenaar 35596a07644dSBram Moolenaar int w_flags; // WFLAG_ flags 35606a07644dSBram Moolenaar 35616a07644dSBram Moolenaar # define WFLAG_WCOL_OFF_ADDED 1 // popup border and padding were added to 35626a07644dSBram Moolenaar // w_wcol 35636a07644dSBram Moolenaar # define WFLAG_WROW_OFF_ADDED 2 // popup border and padding were added to 35646a07644dSBram Moolenaar // w_wrow 35656a07644dSBram Moolenaar #endif 3566e0de17d8SBram Moolenaar 3567071d4279SBram Moolenaar /* 3568071d4279SBram Moolenaar * === start of cached values ==== 3569071d4279SBram Moolenaar */ 3570071d4279SBram Moolenaar /* 3571071d4279SBram Moolenaar * Recomputing is minimized by storing the result of computations. 3572071d4279SBram Moolenaar * Use functions in screen.c to check if they are valid and to update. 3573071d4279SBram Moolenaar * w_valid is a bitfield of flags, which indicate if specific values are 3574071d4279SBram Moolenaar * valid or need to be recomputed. See screen.c for values. 3575071d4279SBram Moolenaar */ 3576071d4279SBram Moolenaar int w_valid; 35776cb39f92SBram Moolenaar pos_T w_valid_cursor; // last known position of w_cursor, used 35786cb39f92SBram Moolenaar // to adjust w_valid 35796cb39f92SBram Moolenaar colnr_T w_valid_leftcol; // last known w_leftcol 3580071d4279SBram Moolenaar 3581071d4279SBram Moolenaar /* 3582071d4279SBram Moolenaar * w_cline_height is the number of physical lines taken by the buffer line 3583071d4279SBram Moolenaar * that the cursor is on. We use this to avoid extra calls to plines(). 3584071d4279SBram Moolenaar */ 35856cb39f92SBram Moolenaar int w_cline_height; // current size of cursor line 3586071d4279SBram Moolenaar #ifdef FEAT_FOLDING 35876cb39f92SBram Moolenaar int w_cline_folded; // cursor line is folded 3588071d4279SBram Moolenaar #endif 3589071d4279SBram Moolenaar 35906cb39f92SBram Moolenaar int w_cline_row; // starting row of the cursor line 3591071d4279SBram Moolenaar 35926cb39f92SBram Moolenaar colnr_T w_virtcol; // column number of the cursor in the 35936cb39f92SBram Moolenaar // buffer line, as opposed to the column 35946cb39f92SBram Moolenaar // number we're at on the screen. This 35956cb39f92SBram Moolenaar // makes a difference on lines which span 35966cb39f92SBram Moolenaar // more than one screen line or when 35976cb39f92SBram Moolenaar // w_leftcol is non-zero 3598071d4279SBram Moolenaar 3599071d4279SBram Moolenaar /* 3600071d4279SBram Moolenaar * w_wrow and w_wcol specify the cursor position in the window. 3601071d4279SBram Moolenaar * This is related to positions in the window, not in the display or 3602071d4279SBram Moolenaar * buffer, thus w_wrow is relative to w_winrow. 3603071d4279SBram Moolenaar */ 36046cb39f92SBram Moolenaar int w_wrow, w_wcol; // cursor position in window 3605071d4279SBram Moolenaar 3606071d4279SBram Moolenaar /* 3607071d4279SBram Moolenaar * Info about the lines currently in the window is remembered to avoid 3608071d4279SBram Moolenaar * recomputing it every time. The allocated size of w_lines[] is Rows. 3609071d4279SBram Moolenaar * Only the w_lines_valid entries are actually valid. 3610071d4279SBram Moolenaar * When the display is up-to-date w_lines[0].wl_lnum is equal to w_topline 3611071d4279SBram Moolenaar * and w_lines[w_lines_valid - 1].wl_lnum is equal to w_botline. 3612071d4279SBram Moolenaar * Between changing text and updating the display w_lines[] represents 3613071d4279SBram Moolenaar * what is currently displayed. wl_valid is reset to indicated this. 3614071d4279SBram Moolenaar * This is used for efficient redrawing. 3615071d4279SBram Moolenaar */ 36166cb39f92SBram Moolenaar int w_lines_valid; // number of valid entries 3617071d4279SBram Moolenaar wline_T *w_lines; 3618071d4279SBram Moolenaar 3619071d4279SBram Moolenaar #ifdef FEAT_FOLDING 36206cb39f92SBram Moolenaar garray_T w_folds; // array of nested folds 36216cb39f92SBram Moolenaar char w_fold_manual; // when TRUE: some folds are opened/closed 36226cb39f92SBram Moolenaar // manually 36236cb39f92SBram Moolenaar char w_foldinvalid; // when TRUE: folding needs to be 36246cb39f92SBram Moolenaar // recomputed 3625071d4279SBram Moolenaar #endif 3626592e0a2aSBram Moolenaar #ifdef FEAT_LINEBREAK 36276cb39f92SBram Moolenaar int w_nrwidth; // width of 'number' and 'relativenumber' 36286cb39f92SBram Moolenaar // column being used 3629592e0a2aSBram Moolenaar #endif 3630*87fd0924SBram Moolenaar #ifdef FEAT_TERMINAL 3631*87fd0924SBram Moolenaar termcellcolor_T w_term_wincolor; // cache for term color of 'wincolor' 3632*87fd0924SBram Moolenaar #endif 3633071d4279SBram Moolenaar 3634071d4279SBram Moolenaar /* 3635071d4279SBram Moolenaar * === end of cached values === 3636071d4279SBram Moolenaar */ 3637071d4279SBram Moolenaar 36386cb39f92SBram Moolenaar int w_redr_type; // type of redraw to be performed on win 36396cb39f92SBram Moolenaar int w_upd_rows; // number of window lines to update when 36406cb39f92SBram Moolenaar // w_redr_type is REDRAW_TOP 36416cb39f92SBram Moolenaar linenr_T w_redraw_top; // when != 0: first line needing redraw 36426cb39f92SBram Moolenaar linenr_T w_redraw_bot; // when != 0: last line needing redraw 36436cb39f92SBram Moolenaar int w_redr_status; // if TRUE status line must be redrawn 3644071d4279SBram Moolenaar 3645071d4279SBram Moolenaar #ifdef FEAT_CMDL_INFO 36466cb39f92SBram Moolenaar // remember what is shown in the ruler for this window (if 'ruler' set) 36476cb39f92SBram Moolenaar pos_T w_ru_cursor; // cursor position shown in ruler 36486cb39f92SBram Moolenaar colnr_T w_ru_virtcol; // virtcol shown in ruler 36496cb39f92SBram Moolenaar linenr_T w_ru_topline; // topline shown in ruler 36506cb39f92SBram Moolenaar linenr_T w_ru_line_count; // line count used for ruler 3651071d4279SBram Moolenaar # ifdef FEAT_DIFF 36526cb39f92SBram Moolenaar int w_ru_topfill; // topfill shown in ruler 3653071d4279SBram Moolenaar # endif 36546cb39f92SBram Moolenaar char w_ru_empty; // TRUE if ruler shows 0-1 (empty line) 3655071d4279SBram Moolenaar #endif 3656071d4279SBram Moolenaar 36576cb39f92SBram Moolenaar int w_alt_fnum; // alternate file (for # and CTRL-^) 3658071d4279SBram Moolenaar 36596cb39f92SBram Moolenaar alist_T *w_alist; // pointer to arglist for this window 36606cb39f92SBram Moolenaar int w_arg_idx; // current index in argument list (can be 36616cb39f92SBram Moolenaar // out of range!) 36626cb39f92SBram Moolenaar int w_arg_idx_invalid; // editing another file than w_arg_idx 3663071d4279SBram Moolenaar 36646cb39f92SBram Moolenaar char_u *w_localdir; // absolute path of local directory or 36656cb39f92SBram Moolenaar // NULL 3666002bc799SBram Moolenaar char_u *w_prevdir; // previous directory 36671b9645deSBram Moolenaar #ifdef FEAT_MENU 36686cb39f92SBram Moolenaar vimmenu_T *w_winbar; // The root of the WinBar menu hierarchy. 36696cb39f92SBram Moolenaar winbar_item_T *w_winbar_items; // list of items in the WinBar 36706cb39f92SBram Moolenaar int w_winbar_height; // 1 if there is a window toolbar 36711b9645deSBram Moolenaar #endif 36721b9645deSBram Moolenaar 3673071d4279SBram Moolenaar /* 3674071d4279SBram Moolenaar * Options local to a window. 3675071d4279SBram Moolenaar * They are local because they influence the layout of the window or 3676071d4279SBram Moolenaar * depend on the window layout. 3677071d4279SBram Moolenaar * There are two values: w_onebuf_opt is local to the buffer currently in 3678071d4279SBram Moolenaar * this window, w_allbuf_opt is for all buffers in this window. 3679071d4279SBram Moolenaar */ 3680071d4279SBram Moolenaar winopt_T w_onebuf_opt; 3681071d4279SBram Moolenaar winopt_T w_allbuf_opt; 3682071d4279SBram Moolenaar 36836cb39f92SBram Moolenaar // A few options have local flags for P_INSECURE. 3684d1f56e68SBram Moolenaar #ifdef FEAT_STL_OPT 36856cb39f92SBram Moolenaar long_u w_p_stl_flags; // flags for 'statusline' 3686d1f56e68SBram Moolenaar #endif 3687d1f56e68SBram Moolenaar #ifdef FEAT_EVAL 36886cb39f92SBram Moolenaar long_u w_p_fde_flags; // flags for 'foldexpr' 36896cb39f92SBram Moolenaar long_u w_p_fdt_flags; // flags for 'foldtext' 3690d1f56e68SBram Moolenaar #endif 36911a38442dSBram Moolenaar #ifdef FEAT_SYN_HL 36926cb39f92SBram Moolenaar int *w_p_cc_cols; // array of columns to highlight or NULL 3693017ba07fSBram Moolenaar char_u w_p_culopt_flags; // flags for cursorline highlighting 36941a38442dSBram Moolenaar #endif 36956cb39f92SBram Moolenaar long w_p_siso; // 'sidescrolloff' local value 36966cb39f92SBram Moolenaar long w_p_so; // 'scrolloff' local value 3697d1f56e68SBram Moolenaar 3698b81f56fbSBram Moolenaar #ifdef FEAT_LINEBREAK 3699b81f56fbSBram Moolenaar int w_briopt_min; // minimum width for breakindent 3700b81f56fbSBram Moolenaar int w_briopt_shift; // additional shift for breakindent 3701b81f56fbSBram Moolenaar int w_briopt_sbr; // sbr in 'briopt' 37024a0b85adSChristian Brabandt int w_briopt_list; // additional indent for lists 3703b81f56fbSBram Moolenaar #endif 3704b81f56fbSBram Moolenaar 37056cb39f92SBram Moolenaar // transform a pointer to a "onebuf" option into a "allbuf" option 3706071d4279SBram Moolenaar #define GLOBAL_WO(p) ((char *)p + sizeof(winopt_T)) 3707071d4279SBram Moolenaar 3708071d4279SBram Moolenaar long w_scbind_pos; 3709071d4279SBram Moolenaar 3710071d4279SBram Moolenaar #ifdef FEAT_EVAL 37114aea03ebSBram Moolenaar dictitem_T w_winvar; // variable for "w:" Dictionary 37124aea03ebSBram Moolenaar dict_T *w_vars; // internal variables, local to window 3713071d4279SBram Moolenaar #endif 3714071d4279SBram Moolenaar 3715071d4279SBram Moolenaar /* 3716071d4279SBram Moolenaar * The w_prev_pcmark field is used to check whether we really did jump to 3717071d4279SBram Moolenaar * a new line after setting the w_pcmark. If not, then we revert to 3718071d4279SBram Moolenaar * using the previous w_pcmark. 3719071d4279SBram Moolenaar */ 37206cb39f92SBram Moolenaar pos_T w_pcmark; // previous context mark 37216cb39f92SBram Moolenaar pos_T w_prev_pcmark; // previous w_pcmark 3722071d4279SBram Moolenaar 3723071d4279SBram Moolenaar #ifdef FEAT_JUMPLIST 3724071d4279SBram Moolenaar /* 3725071d4279SBram Moolenaar * the jumplist contains old cursor positions 3726071d4279SBram Moolenaar */ 3727071d4279SBram Moolenaar xfmark_T w_jumplist[JUMPLISTSIZE]; 37286cb39f92SBram Moolenaar int w_jumplistlen; // number of active entries 37296cb39f92SBram Moolenaar int w_jumplistidx; // current position 3730071d4279SBram Moolenaar 37316cb39f92SBram Moolenaar int w_changelistidx; // current position in b_changelist 3732071d4279SBram Moolenaar #endif 3733071d4279SBram Moolenaar 3734071d4279SBram Moolenaar #ifdef FEAT_SEARCH_EXTRA 37356cb39f92SBram Moolenaar matchitem_T *w_match_head; // head of match list 37366cb39f92SBram Moolenaar int w_next_match_id; // next match ID 3737071d4279SBram Moolenaar #endif 3738071d4279SBram Moolenaar 3739071d4279SBram Moolenaar /* 3740071d4279SBram Moolenaar * the tagstack grows from 0 upwards: 3741071d4279SBram Moolenaar * entry 0: older 3742071d4279SBram Moolenaar * entry 1: newer 3743071d4279SBram Moolenaar * entry 2: newest 3744071d4279SBram Moolenaar */ 37456cb39f92SBram Moolenaar taggy_T w_tagstack[TAGSTACKSIZE]; // the tag stack 37466cb39f92SBram Moolenaar int w_tagstackidx; // idx just below active entry 37476cb39f92SBram Moolenaar int w_tagstacklen; // number of tags on stack 3748071d4279SBram Moolenaar 3749071d4279SBram Moolenaar /* 3750071d4279SBram Moolenaar * w_fraction is the fractional row of the cursor within the window, from 3751071d4279SBram Moolenaar * 0 at the top row to FRACTION_MULT at the last row. 3752071d4279SBram Moolenaar * w_prev_fraction_row was the actual cursor row when w_fraction was last 3753071d4279SBram Moolenaar * calculated. 3754071d4279SBram Moolenaar */ 3755071d4279SBram Moolenaar int w_fraction; 3756071d4279SBram Moolenaar int w_prev_fraction_row; 3757071d4279SBram Moolenaar 3758071d4279SBram Moolenaar #ifdef FEAT_GUI 37596cb39f92SBram Moolenaar scrollbar_T w_scrollbars[2]; // vert. Scrollbars for this window 3760071d4279SBram Moolenaar #endif 3761592e0a2aSBram Moolenaar #ifdef FEAT_LINEBREAK 37626cb39f92SBram Moolenaar linenr_T w_nrwidth_line_count; // line count when ml_nrwidth_width 37636cb39f92SBram Moolenaar // was computed. 37646cb39f92SBram Moolenaar long w_nuw_cached; // 'numberwidth' option cached 37656cb39f92SBram Moolenaar int w_nrwidth_width; // nr of chars to print line count. 3766592e0a2aSBram Moolenaar #endif 3767071d4279SBram Moolenaar 3768d12f5c17SBram Moolenaar #ifdef FEAT_QUICKFIX 37696cb39f92SBram Moolenaar qf_info_T *w_llist; // Location list for this window 3770d12f5c17SBram Moolenaar /* 3771d12f5c17SBram Moolenaar * Location list reference used in the location list window. 3772d12f5c17SBram Moolenaar * In a non-location list window, w_llist_ref is NULL. 3773d12f5c17SBram Moolenaar */ 3774d12f5c17SBram Moolenaar qf_info_T *w_llist_ref; 3775d12f5c17SBram Moolenaar #endif 3776d12f5c17SBram Moolenaar 3777325b7a2fSBram Moolenaar #ifdef FEAT_MZSCHEME 37786cb39f92SBram Moolenaar void *w_mzscheme_ref; // The MzScheme value for this window 3779325b7a2fSBram Moolenaar #endif 3780325b7a2fSBram Moolenaar 3781071d4279SBram Moolenaar #ifdef FEAT_PERL 3782e344beadSBram Moolenaar void *w_perl_private; 3783071d4279SBram Moolenaar #endif 3784071d4279SBram Moolenaar 3785071d4279SBram Moolenaar #ifdef FEAT_PYTHON 37866cb39f92SBram Moolenaar void *w_python_ref; // The Python value for this window 3787071d4279SBram Moolenaar #endif 3788071d4279SBram Moolenaar 3789bd5e15fdSBram Moolenaar #ifdef FEAT_PYTHON3 37906cb39f92SBram Moolenaar void *w_python3_ref; // The Python value for this window 3791bd5e15fdSBram Moolenaar #endif 3792bd5e15fdSBram Moolenaar 3793071d4279SBram Moolenaar #ifdef FEAT_TCL 3794e344beadSBram Moolenaar void *w_tcl_ref; 3795071d4279SBram Moolenaar #endif 3796071d4279SBram Moolenaar 3797071d4279SBram Moolenaar #ifdef FEAT_RUBY 3798e344beadSBram Moolenaar void *w_ruby_ref; 3799071d4279SBram Moolenaar #endif 3800071d4279SBram Moolenaar }; 3801071d4279SBram Moolenaar 3802071d4279SBram Moolenaar /* 3803071d4279SBram Moolenaar * Arguments for operators. 3804071d4279SBram Moolenaar */ 3805e344beadSBram Moolenaar typedef struct oparg_S 3806071d4279SBram Moolenaar { 38076cb39f92SBram Moolenaar int op_type; // current pending operator type 38086cb39f92SBram Moolenaar int regname; // register to use for the operator 38096cb39f92SBram Moolenaar int motion_type; // type of the current cursor motion 38106cb39f92SBram Moolenaar int motion_force; // force motion type: 'v', 'V' or CTRL-V 38116cb39f92SBram Moolenaar int use_reg_one; // TRUE if delete uses reg 1 even when not 38126cb39f92SBram Moolenaar // linewise 38136cb39f92SBram Moolenaar int inclusive; // TRUE if char motion is inclusive (only 3814544a38e4SChristian Brabandt // valid when motion_type is MCHAR) 38156cb39f92SBram Moolenaar int end_adjusted; // backuped b_op_end one char (only used by 38166cb39f92SBram Moolenaar // do_format()) 38176cb39f92SBram Moolenaar pos_T start; // start of the operator 38186cb39f92SBram Moolenaar pos_T end; // end of the operator 38196cb39f92SBram Moolenaar pos_T cursor_start; // cursor position before motion for "gw" 3820071d4279SBram Moolenaar 38216cb39f92SBram Moolenaar long line_count; // number of lines from op_start to op_end 38226cb39f92SBram Moolenaar // (inclusive) 38236cb39f92SBram Moolenaar int empty; // op_start and op_end the same (only used by 38246cb39f92SBram Moolenaar // do_change()) 38256cb39f92SBram Moolenaar int is_VIsual; // operator on Visual area 38266cb39f92SBram Moolenaar int block_mode; // current operator is Visual block mode 38276cb39f92SBram Moolenaar colnr_T start_vcol; // start col for block mode operator 38286cb39f92SBram Moolenaar colnr_T end_vcol; // end col for block mode operator 38296cb39f92SBram Moolenaar long prev_opcount; // ca.opcount saved for K_CURSORHOLD 38306cb39f92SBram Moolenaar long prev_count0; // ca.count0 saved for K_CURSORHOLD 3831544a38e4SChristian Brabandt int excl_tr_ws; // exclude trailing whitespace for yank of a 3832544a38e4SChristian Brabandt // block 3833071d4279SBram Moolenaar } oparg_T; 3834071d4279SBram Moolenaar 3835071d4279SBram Moolenaar /* 3836071d4279SBram Moolenaar * Arguments for Normal mode commands. 3837071d4279SBram Moolenaar */ 3838e344beadSBram Moolenaar typedef struct cmdarg_S 3839071d4279SBram Moolenaar { 38406cb39f92SBram Moolenaar oparg_T *oap; // Operator arguments 38416cb39f92SBram Moolenaar int prechar; // prefix character (optional, always 'g') 38426cb39f92SBram Moolenaar int cmdchar; // command character 38436cb39f92SBram Moolenaar int nchar; // next command character (optional) 38446cb39f92SBram Moolenaar int ncharC1; // first composing character (optional) 38456cb39f92SBram Moolenaar int ncharC2; // second composing character (optional) 38466cb39f92SBram Moolenaar int extra_char; // yet another character (optional) 38476cb39f92SBram Moolenaar long opcount; // count before an operator 38486cb39f92SBram Moolenaar long count0; // count before command, default 0 38496cb39f92SBram Moolenaar long count1; // count before command, default 1 38506cb39f92SBram Moolenaar int arg; // extra argument from nv_cmds[] 38516cb39f92SBram Moolenaar int retval; // return: CA_* values 38526cb39f92SBram Moolenaar char_u *searchbuf; // return: pointer to search pattern or NULL 3853071d4279SBram Moolenaar } cmdarg_T; 3854071d4279SBram Moolenaar 38556cb39f92SBram Moolenaar // values for retval: 38566cb39f92SBram Moolenaar #define CA_COMMAND_BUSY 1 // skip restarting edit() once 38576cb39f92SBram Moolenaar #define CA_NO_ADJ_OP_END 2 // don't adjust operator end 3858071d4279SBram Moolenaar 3859071d4279SBram Moolenaar #ifdef CURSOR_SHAPE 3860071d4279SBram Moolenaar /* 3861071d4279SBram Moolenaar * struct to store values from 'guicursor' and 'mouseshape' 3862071d4279SBram Moolenaar */ 38639bf703d4SBram Moolenaar // Indexes in shape_table[] 38646cb39f92SBram Moolenaar #define SHAPE_IDX_N 0 // Normal mode 38656cb39f92SBram Moolenaar #define SHAPE_IDX_V 1 // Visual mode 38666cb39f92SBram Moolenaar #define SHAPE_IDX_I 2 // Insert mode 38676cb39f92SBram Moolenaar #define SHAPE_IDX_R 3 // Replace mode 38686cb39f92SBram Moolenaar #define SHAPE_IDX_C 4 // Command line Normal mode 38696cb39f92SBram Moolenaar #define SHAPE_IDX_CI 5 // Command line Insert mode 38706cb39f92SBram Moolenaar #define SHAPE_IDX_CR 6 // Command line Replace mode 38716cb39f92SBram Moolenaar #define SHAPE_IDX_O 7 // Operator-pending mode 38726cb39f92SBram Moolenaar #define SHAPE_IDX_VE 8 // Visual mode with 'selection' exclusive 38736cb39f92SBram Moolenaar #define SHAPE_IDX_CLINE 9 // On command line 38746cb39f92SBram Moolenaar #define SHAPE_IDX_STATUS 10 // A status line 38756cb39f92SBram Moolenaar #define SHAPE_IDX_SDRAG 11 // dragging a status line 38766cb39f92SBram Moolenaar #define SHAPE_IDX_VSEP 12 // A vertical separator line 38776cb39f92SBram Moolenaar #define SHAPE_IDX_VDRAG 13 // dragging a vertical separator line 38786cb39f92SBram Moolenaar #define SHAPE_IDX_MORE 14 // Hit-return or More 38796cb39f92SBram Moolenaar #define SHAPE_IDX_MOREL 15 // Hit-return or More in last line 38806cb39f92SBram Moolenaar #define SHAPE_IDX_SM 16 // showing matching paren 3881071d4279SBram Moolenaar #define SHAPE_IDX_COUNT 17 3882071d4279SBram Moolenaar 38836cb39f92SBram Moolenaar #define SHAPE_BLOCK 0 // block cursor 38846cb39f92SBram Moolenaar #define SHAPE_HOR 1 // horizontal bar cursor 38856cb39f92SBram Moolenaar #define SHAPE_VER 2 // vertical bar cursor 3886071d4279SBram Moolenaar 38876cb39f92SBram Moolenaar #define MSHAPE_NUMBERED 1000 // offset for shapes identified by number 38886cb39f92SBram Moolenaar #define MSHAPE_HIDE 1 // hide mouse pointer 3889071d4279SBram Moolenaar 38906cb39f92SBram Moolenaar #define SHAPE_MOUSE 1 // used for mouse pointer shape 38916cb39f92SBram Moolenaar #define SHAPE_CURSOR 2 // used for text cursor shape 3892071d4279SBram Moolenaar 3893071d4279SBram Moolenaar typedef struct cursor_entry 3894071d4279SBram Moolenaar { 38956cb39f92SBram Moolenaar int shape; // one of the SHAPE_ defines 38966cb39f92SBram Moolenaar int mshape; // one of the MSHAPE defines 38976cb39f92SBram Moolenaar int percentage; // percentage of cell for bar 38986cb39f92SBram Moolenaar long blinkwait; // blinking, wait time before blinking starts 38996cb39f92SBram Moolenaar long blinkon; // blinking, on time 39006cb39f92SBram Moolenaar long blinkoff; // blinking, off time 39016cb39f92SBram Moolenaar int id; // highlight group ID 39026cb39f92SBram Moolenaar int id_lm; // highlight group ID for :lmap mode 39036cb39f92SBram Moolenaar char *name; // mode name (fixed) 39046cb39f92SBram Moolenaar char used_for; // SHAPE_MOUSE and/or SHAPE_CURSOR 3905071d4279SBram Moolenaar } cursorentry_T; 39066cb39f92SBram Moolenaar #endif // CURSOR_SHAPE 3907071d4279SBram Moolenaar 3908071d4279SBram Moolenaar #ifdef FEAT_MENU 3909071d4279SBram Moolenaar 39106cb39f92SBram Moolenaar // Indices into vimmenu_T->strings[] and vimmenu_T->noremap[] for each mode 3911071d4279SBram Moolenaar #define MENU_INDEX_INVALID -1 3912071d4279SBram Moolenaar #define MENU_INDEX_NORMAL 0 3913071d4279SBram Moolenaar #define MENU_INDEX_VISUAL 1 39149b2200acSBram Moolenaar #define MENU_INDEX_SELECT 2 39159b2200acSBram Moolenaar #define MENU_INDEX_OP_PENDING 3 39169b2200acSBram Moolenaar #define MENU_INDEX_INSERT 4 39179b2200acSBram Moolenaar #define MENU_INDEX_CMDLINE 5 39184c5d8152SBram Moolenaar #define MENU_INDEX_TERMINAL 6 39194c5d8152SBram Moolenaar #define MENU_INDEX_TIP 7 39204c5d8152SBram Moolenaar #define MENU_MODES 8 3921071d4279SBram Moolenaar 39226cb39f92SBram Moolenaar // Menu modes 3923071d4279SBram Moolenaar #define MENU_NORMAL_MODE (1 << MENU_INDEX_NORMAL) 3924071d4279SBram Moolenaar #define MENU_VISUAL_MODE (1 << MENU_INDEX_VISUAL) 39259b2200acSBram Moolenaar #define MENU_SELECT_MODE (1 << MENU_INDEX_SELECT) 3926071d4279SBram Moolenaar #define MENU_OP_PENDING_MODE (1 << MENU_INDEX_OP_PENDING) 3927071d4279SBram Moolenaar #define MENU_INSERT_MODE (1 << MENU_INDEX_INSERT) 3928071d4279SBram Moolenaar #define MENU_CMDLINE_MODE (1 << MENU_INDEX_CMDLINE) 39294c5d8152SBram Moolenaar #define MENU_TERMINAL_MODE (1 << MENU_INDEX_TERMINAL) 3930071d4279SBram Moolenaar #define MENU_TIP_MODE (1 << MENU_INDEX_TIP) 3931071d4279SBram Moolenaar #define MENU_ALL_MODES ((1 << MENU_INDEX_TIP) - 1) 39326cb39f92SBram Moolenaar // note MENU_INDEX_TIP is not a 'real' mode 3933071d4279SBram Moolenaar 39346cb39f92SBram Moolenaar // Start a menu name with this to not include it on the main menu bar 3935071d4279SBram Moolenaar #define MNU_HIDDEN_CHAR ']' 3936071d4279SBram Moolenaar 3937071d4279SBram Moolenaar struct VimMenu 3938071d4279SBram Moolenaar { 39396cb39f92SBram Moolenaar int modes; // Which modes is this menu visible for? 39406cb39f92SBram Moolenaar int enabled; // for which modes the menu is enabled 39416cb39f92SBram Moolenaar char_u *name; // Name of menu, possibly translated 39426cb39f92SBram Moolenaar char_u *dname; // Displayed Name ("name" without '&') 394370b11cddSBram Moolenaar #ifdef FEAT_MULTI_LANG 39446cb39f92SBram Moolenaar char_u *en_name; // "name" untranslated, NULL when "name" 39456cb39f92SBram Moolenaar // was not translated 39466cb39f92SBram Moolenaar char_u *en_dname; // "dname" untranslated, NULL when "dname" 39476cb39f92SBram Moolenaar // was not translated 394870b11cddSBram Moolenaar #endif 39496cb39f92SBram Moolenaar char_u *actext; // accelerator text (after TAB) 39503276f584SDominique Pelle int mnemonic; // mnemonic key (after '&') 39516cb39f92SBram Moolenaar int priority; // Menu order priority 3952071d4279SBram Moolenaar #ifdef FEAT_GUI 39536cb39f92SBram Moolenaar void (*cb)(vimmenu_T *); // Call-back function 3954071d4279SBram Moolenaar #endif 3955071d4279SBram Moolenaar #ifdef FEAT_TOOLBAR 39566cb39f92SBram Moolenaar char_u *iconfile; // name of file for icon or NULL 39576cb39f92SBram Moolenaar int iconidx; // icon index (-1 if not set) 39586cb39f92SBram Moolenaar int icon_builtin; // icon names is BuiltIn{nr} 3959071d4279SBram Moolenaar #endif 39606cb39f92SBram Moolenaar char_u *strings[MENU_MODES]; // Mapped string for each mode 39616cb39f92SBram Moolenaar int noremap[MENU_MODES]; // A REMAP_ flag for each mode 39626cb39f92SBram Moolenaar char silent[MENU_MODES]; // A silent flag for each mode 39636cb39f92SBram Moolenaar vimmenu_T *children; // Children of sub-menu 39646cb39f92SBram Moolenaar vimmenu_T *parent; // Parent of menu 39656cb39f92SBram Moolenaar vimmenu_T *next; // Next item in menu 3966071d4279SBram Moolenaar #ifdef FEAT_GUI_X11 39676cb39f92SBram Moolenaar Widget id; // Manage this to enable item 39686cb39f92SBram Moolenaar Widget submenu_id; // If this is submenu, add children here 3969071d4279SBram Moolenaar #endif 3970071d4279SBram Moolenaar #ifdef FEAT_GUI_GTK 39716cb39f92SBram Moolenaar GtkWidget *id; // Manage this to enable item 39726cb39f92SBram Moolenaar GtkWidget *submenu_id; // If this is submenu, add children here 39739892189dSBram Moolenaar # if defined(GTK_CHECK_VERSION) && !GTK_CHECK_VERSION(3,4,0) 3974071d4279SBram Moolenaar GtkWidget *tearoff_handle; 39759892189dSBram Moolenaar # endif 39766cb39f92SBram Moolenaar GtkWidget *label; // Used by "set wak=" code. 3977071d4279SBram Moolenaar #endif 3978071d4279SBram Moolenaar #ifdef FEAT_GUI_MOTIF 39796cb39f92SBram Moolenaar int sensitive; // turn button on/off 39806cb39f92SBram Moolenaar char **xpm; // pixmap data 39816cb39f92SBram Moolenaar char *xpm_fname; // file with pixmap data 3982071d4279SBram Moolenaar #endif 3983ec2dad63SBram Moolenaar #ifdef FEAT_GUI_ATHENA 39846cb39f92SBram Moolenaar Pixmap image; // Toolbar image 3985071d4279SBram Moolenaar #endif 3986071d4279SBram Moolenaar #ifdef FEAT_BEVAL_TIP 39876cb39f92SBram Moolenaar BalloonEval *tip; // tooltip for this menu item 3988071d4279SBram Moolenaar #endif 39894f97475dSBram Moolenaar #ifdef FEAT_GUI_MSWIN 39906cb39f92SBram Moolenaar UINT id; // Id of menu item 39916cb39f92SBram Moolenaar HMENU submenu_id; // If this is submenu, add children here 39926cb39f92SBram Moolenaar HWND tearoff_handle; // hWnd of tearoff if created 3993071d4279SBram Moolenaar #endif 3994b3f74069SBram Moolenaar #if FEAT_GUI_HAIKU 3995b3f74069SBram Moolenaar BMenuItem *id; // Id of menu item 3996b3f74069SBram Moolenaar BMenu *submenu_id; // If this is submenu, add children here 3997b3f74069SBram Moolenaar # ifdef FEAT_TOOLBAR 3998b3f74069SBram Moolenaar BPictureButton *button; 3999b3f74069SBram Moolenaar # endif 4000b3f74069SBram Moolenaar #endif 4001071d4279SBram Moolenaar #ifdef FEAT_GUI_PHOTON 4002071d4279SBram Moolenaar PtWidget_t *id; 4003071d4279SBram Moolenaar PtWidget_t *submenu_id; 4004071d4279SBram Moolenaar #endif 4005071d4279SBram Moolenaar }; 4006071d4279SBram Moolenaar #else 40076cb39f92SBram Moolenaar // For generating prototypes when FEAT_MENU isn't defined. 4008071d4279SBram Moolenaar typedef int vimmenu_T; 4009071d4279SBram Moolenaar 40106cb39f92SBram Moolenaar #endif // FEAT_MENU 4011071d4279SBram Moolenaar 4012071d4279SBram Moolenaar /* 4013071d4279SBram Moolenaar * Struct to save values in before executing autocommands for a buffer that is 4014f2bd8ef2SBram Moolenaar * not the current buffer. 4015071d4279SBram Moolenaar */ 4016071d4279SBram Moolenaar typedef struct 4017071d4279SBram Moolenaar { 40186cb39f92SBram Moolenaar buf_T *save_curbuf; // saved curbuf 40196cb39f92SBram Moolenaar int use_aucmd_win; // using aucmd_win 4020cbcd9cbdSBram Moolenaar int save_curwin_id; // ID of saved curwin 4021cbcd9cbdSBram Moolenaar int new_curwin_id; // ID of new curwin 4022cbcd9cbdSBram Moolenaar int save_prevwin_id; // ID of saved prevwin 40236cb39f92SBram Moolenaar bufref_T new_curbuf; // new curbuf 40246cb39f92SBram Moolenaar char_u *globaldir; // saved value of globaldir 4025071d4279SBram Moolenaar } aco_save_T; 4026071d4279SBram Moolenaar 4027071d4279SBram Moolenaar /* 4028071d4279SBram Moolenaar * Generic option table item, only used for printer at the moment. 4029071d4279SBram Moolenaar */ 4030071d4279SBram Moolenaar typedef struct 4031071d4279SBram Moolenaar { 4032071d4279SBram Moolenaar const char *name; 4033071d4279SBram Moolenaar int hasnum; 4034071d4279SBram Moolenaar long number; 40356cb39f92SBram Moolenaar char_u *string; // points into option string 4036071d4279SBram Moolenaar int strlen; 4037071d4279SBram Moolenaar int present; 4038071d4279SBram Moolenaar } option_table_T; 4039071d4279SBram Moolenaar 4040071d4279SBram Moolenaar /* 4041071d4279SBram Moolenaar * Structure to hold printing color and font attributes. 4042071d4279SBram Moolenaar */ 4043071d4279SBram Moolenaar typedef struct 4044071d4279SBram Moolenaar { 4045071d4279SBram Moolenaar long_u fg_color; 4046071d4279SBram Moolenaar long_u bg_color; 4047071d4279SBram Moolenaar int bold; 4048071d4279SBram Moolenaar int italic; 4049071d4279SBram Moolenaar int underline; 4050e2cc9702SBram Moolenaar int undercurl; 4051071d4279SBram Moolenaar } prt_text_attr_T; 4052071d4279SBram Moolenaar 4053071d4279SBram Moolenaar /* 4054071d4279SBram Moolenaar * Structure passed back to the generic printer code. 4055071d4279SBram Moolenaar */ 4056071d4279SBram Moolenaar typedef struct 4057071d4279SBram Moolenaar { 4058071d4279SBram Moolenaar int n_collated_copies; 4059071d4279SBram Moolenaar int n_uncollated_copies; 4060071d4279SBram Moolenaar int duplex; 4061071d4279SBram Moolenaar int chars_per_line; 4062071d4279SBram Moolenaar int lines_per_page; 4063071d4279SBram Moolenaar int has_color; 4064071d4279SBram Moolenaar prt_text_attr_T number; 4065071d4279SBram Moolenaar #ifdef FEAT_SYN_HL 4066071d4279SBram Moolenaar int modec; 4067071d4279SBram Moolenaar int do_syntax; 4068071d4279SBram Moolenaar #endif 4069071d4279SBram Moolenaar int user_abort; 4070071d4279SBram Moolenaar char_u *jobname; 4071071d4279SBram Moolenaar #ifdef FEAT_POSTSCRIPT 4072071d4279SBram Moolenaar char_u *outfile; 4073071d4279SBram Moolenaar char_u *arguments; 4074071d4279SBram Moolenaar #endif 4075071d4279SBram Moolenaar } prt_settings_T; 4076071d4279SBram Moolenaar 4077071d4279SBram Moolenaar #define PRINT_NUMBER_WIDTH 8 40788b6144bdSBram Moolenaar 40798b6144bdSBram Moolenaar /* 40808b6144bdSBram Moolenaar * Used for popup menu items. 40818b6144bdSBram Moolenaar */ 40828b6144bdSBram Moolenaar typedef struct 40838b6144bdSBram Moolenaar { 40846cb39f92SBram Moolenaar char_u *pum_text; // main menu text 40856cb39f92SBram Moolenaar char_u *pum_kind; // extra kind text (may be truncated) 40866cb39f92SBram Moolenaar char_u *pum_extra; // extra menu text (may be truncated) 40876cb39f92SBram Moolenaar char_u *pum_info; // extra info 40888b6144bdSBram Moolenaar } pumitem_T; 4089a23ccb8aSBram Moolenaar 4090a23ccb8aSBram Moolenaar /* 4091a23ccb8aSBram Moolenaar * Structure used for get_tagfname(). 4092a23ccb8aSBram Moolenaar */ 4093a23ccb8aSBram Moolenaar typedef struct 4094a23ccb8aSBram Moolenaar { 40956cb39f92SBram Moolenaar char_u *tn_tags; // value of 'tags' when starting 40966cb39f92SBram Moolenaar char_u *tn_np; // current position in tn_tags 4097a23ccb8aSBram Moolenaar int tn_did_filefind_init; 4098a23ccb8aSBram Moolenaar int tn_hf_idx; 4099a23ccb8aSBram Moolenaar void *tn_search_ctx; 4100a23ccb8aSBram Moolenaar } tagname_T; 410155debbe3SBram Moolenaar 410255debbe3SBram Moolenaar typedef struct { 410355debbe3SBram Moolenaar UINT32_T total[2]; 410455debbe3SBram Moolenaar UINT32_T state[8]; 410555debbe3SBram Moolenaar char_u buffer[64]; 410655debbe3SBram Moolenaar } context_sha256_T; 4107520e1e41SBram Moolenaar 4108520e1e41SBram Moolenaar /* 4109c6f9f739SBram Moolenaar * types for expressions. 4110c6f9f739SBram Moolenaar */ 4111c6f9f739SBram Moolenaar typedef enum 4112c6f9f739SBram Moolenaar { 411387396072SBram Moolenaar EXPR_UNKNOWN = 0, 411487396072SBram Moolenaar EXPR_EQUAL, // == 411587396072SBram Moolenaar EXPR_NEQUAL, // != 411687396072SBram Moolenaar EXPR_GREATER, // > 411787396072SBram Moolenaar EXPR_GEQUAL, // >= 411887396072SBram Moolenaar EXPR_SMALLER, // < 411987396072SBram Moolenaar EXPR_SEQUAL, // <= 412087396072SBram Moolenaar EXPR_MATCH, // =~ 412187396072SBram Moolenaar EXPR_NOMATCH, // !~ 412287396072SBram Moolenaar EXPR_IS, // is 412387396072SBram Moolenaar EXPR_ISNOT, // isnot 41248a7d6542SBram Moolenaar // used with ISN_OPNR 41258a7d6542SBram Moolenaar EXPR_ADD, // + 41268a7d6542SBram Moolenaar EXPR_SUB, // - 41278a7d6542SBram Moolenaar EXPR_MULT, // * 41288a7d6542SBram Moolenaar EXPR_DIV, // / 41298a7d6542SBram Moolenaar EXPR_REM, // % 413007802044SBram Moolenaar // used with ISN_ADDLIST 413107802044SBram Moolenaar EXPR_COPY, // create new list 413207802044SBram Moolenaar EXPR_APPEND, // append to first list 4133657137caSBram Moolenaar } exprtype_T; 4134c6f9f739SBram Moolenaar 4135c6f9f739SBram Moolenaar /* 4136520e1e41SBram Moolenaar * Structure used for reading in json_decode(). 4137520e1e41SBram Moolenaar */ 413856ead341SBram Moolenaar struct js_reader 4139520e1e41SBram Moolenaar { 41406cb39f92SBram Moolenaar char_u *js_buf; // text to be decoded 41416cb39f92SBram Moolenaar char_u *js_end; // NUL in js_buf 41426cb39f92SBram Moolenaar int js_used; // bytes used from js_buf 414356ead341SBram Moolenaar int (*js_fill)(struct js_reader *); 41446cb39f92SBram Moolenaar // function to fill the buffer or NULL; 41456cb39f92SBram Moolenaar // return TRUE when the buffer was filled 41466cb39f92SBram Moolenaar void *js_cookie; // can be used by js_fill 41476cb39f92SBram Moolenaar int js_cookie_arg; // can be used by js_fill 414856ead341SBram Moolenaar }; 414956ead341SBram Moolenaar typedef struct js_reader js_read_T; 4150975b5271SBram Moolenaar 41516cb39f92SBram Moolenaar // Maximum number of commands from + or -c arguments. 4152502ae4baSBram Moolenaar #define MAX_ARG_CMDS 10 4153502ae4baSBram Moolenaar 41546cb39f92SBram Moolenaar // values for "window_layout" 41556cb39f92SBram Moolenaar #define WIN_HOR 1 // "-o" horizontally split windows 41566cb39f92SBram Moolenaar #define WIN_VER 2 // "-O" vertically split windows 41576cb39f92SBram Moolenaar #define WIN_TABS 3 // "-p" windows on tab pages 4158502ae4baSBram Moolenaar 41596cb39f92SBram Moolenaar // Struct for various parameters passed between main() and other functions. 4160502ae4baSBram Moolenaar typedef struct 4161502ae4baSBram Moolenaar { 4162502ae4baSBram Moolenaar int argc; 4163502ae4baSBram Moolenaar char **argv; 4164502ae4baSBram Moolenaar 41656cb39f92SBram Moolenaar char_u *fname; // first file to edit 4166a8e691d4SBram Moolenaar 41676cb39f92SBram Moolenaar int evim_mode; // started as "evim" 41686cb39f92SBram Moolenaar char_u *use_vimrc; // vimrc from -u argument 41696cb39f92SBram Moolenaar int clean; // --clean argument 4170502ae4baSBram Moolenaar 41716cb39f92SBram Moolenaar int n_commands; // no. of commands from + or -c 41726cb39f92SBram Moolenaar char_u *commands[MAX_ARG_CMDS]; // commands from + or -c arg. 41736cb39f92SBram Moolenaar char_u cmds_tofree[MAX_ARG_CMDS]; // commands that need free() 41746cb39f92SBram Moolenaar int n_pre_commands; // no. of commands from --cmd 41756cb39f92SBram Moolenaar char_u *pre_commands[MAX_ARG_CMDS]; // commands from --cmd argument 4176502ae4baSBram Moolenaar 41776cb39f92SBram Moolenaar int edit_type; // type of editing to do 41786cb39f92SBram Moolenaar char_u *tagname; // tag from -t argument 4179502ae4baSBram Moolenaar #ifdef FEAT_QUICKFIX 41806cb39f92SBram Moolenaar char_u *use_ef; // 'errorfile' from -q argument 4181502ae4baSBram Moolenaar #endif 4182502ae4baSBram Moolenaar 4183502ae4baSBram Moolenaar int want_full_screen; 41846cb39f92SBram Moolenaar int not_a_term; // no warning for missing term? 41856cb39f92SBram Moolenaar int tty_fail; // exit if not a tty 41866cb39f92SBram Moolenaar char_u *term; // specified terminal name 4187502ae4baSBram Moolenaar #ifdef FEAT_CRYPT 41886cb39f92SBram Moolenaar int ask_for_key; // -x argument 4189502ae4baSBram Moolenaar #endif 41906cb39f92SBram Moolenaar int no_swap_file; // "-n" argument used 4191502ae4baSBram Moolenaar #ifdef FEAT_EVAL 4192502ae4baSBram Moolenaar int use_debug_break_level; 4193502ae4baSBram Moolenaar #endif 41946cb39f92SBram Moolenaar int window_count; // number of windows to use 41956cb39f92SBram Moolenaar int window_layout; // 0, WIN_HOR, WIN_VER or WIN_TABS 4196502ae4baSBram Moolenaar 4197502ae4baSBram Moolenaar #ifdef FEAT_CLIENTSERVER 41986cb39f92SBram Moolenaar int serverArg; // TRUE when argument for a server 41996cb39f92SBram Moolenaar char_u *serverName_arg; // cmdline arg for server name 42006cb39f92SBram Moolenaar char_u *serverStr; // remote server command 42016cb39f92SBram Moolenaar char_u *serverStrEnc; // encoding of serverStr 42026cb39f92SBram Moolenaar char_u *servername; // allocated name for our server 4203502ae4baSBram Moolenaar #endif 4204502ae4baSBram Moolenaar #if !defined(UNIX) 4205502ae4baSBram Moolenaar # define EXPAND_FILENAMES 42066cb39f92SBram Moolenaar int literal; // don't expand file names 4207502ae4baSBram Moolenaar #endif 4208502ae4baSBram Moolenaar #ifdef MSWIN 42096cb39f92SBram Moolenaar int full_path; // file name argument was full path 4210502ae4baSBram Moolenaar #endif 4211502ae4baSBram Moolenaar #ifdef FEAT_DIFF 42126cb39f92SBram Moolenaar int diff_mode; // start with 'diff' set 4213502ae4baSBram Moolenaar #endif 4214502ae4baSBram Moolenaar } mparm_T; 4215a9b579f3SBram Moolenaar 4216a9b579f3SBram Moolenaar /* 4217a9b579f3SBram Moolenaar * Structure returned by get_lval() and used by set_var_lval(). 4218a9b579f3SBram Moolenaar * For a plain name: 4219a9b579f3SBram Moolenaar * "name" points to the variable name. 4220a9b579f3SBram Moolenaar * "exp_name" is NULL. 4221a9b579f3SBram Moolenaar * "tv" is NULL 4222a9b579f3SBram Moolenaar * For a magic braces name: 4223a9b579f3SBram Moolenaar * "name" points to the expanded variable name. 4224a9b579f3SBram Moolenaar * "exp_name" is non-NULL, to be freed later. 4225a9b579f3SBram Moolenaar * "tv" is NULL 4226a9b579f3SBram Moolenaar * For an index in a list: 4227a9b579f3SBram Moolenaar * "name" points to the (expanded) variable name. 4228a9b579f3SBram Moolenaar * "exp_name" NULL or non-NULL, to be freed later. 4229a9b579f3SBram Moolenaar * "tv" points to the (first) list item value 4230a9b579f3SBram Moolenaar * "li" points to the (first) list item 4231a9b579f3SBram Moolenaar * "range", "n1", "n2" and "empty2" indicate what items are used. 4232a9b579f3SBram Moolenaar * For an existing Dict item: 4233a9b579f3SBram Moolenaar * "name" points to the (expanded) variable name. 4234a9b579f3SBram Moolenaar * "exp_name" NULL or non-NULL, to be freed later. 4235a9b579f3SBram Moolenaar * "tv" points to the dict item value 4236a9b579f3SBram Moolenaar * "newkey" is NULL 4237a9b579f3SBram Moolenaar * For a non-existing Dict item: 4238a9b579f3SBram Moolenaar * "name" points to the (expanded) variable name. 4239a9b579f3SBram Moolenaar * "exp_name" NULL or non-NULL, to be freed later. 4240a9b579f3SBram Moolenaar * "tv" points to the Dictionary typval_T 4241a9b579f3SBram Moolenaar * "newkey" is the key for the new item. 4242a9b579f3SBram Moolenaar */ 4243a9b579f3SBram Moolenaar typedef struct lval_S 4244a9b579f3SBram Moolenaar { 42456cb39f92SBram Moolenaar char_u *ll_name; // start of variable name (can be NULL) 42468a7d6542SBram Moolenaar char_u *ll_name_end; // end of variable name (can be NULL) 42478a7d6542SBram Moolenaar type_T *ll_type; // type of variable (can be NULL) 42486cb39f92SBram Moolenaar char_u *ll_exp_name; // NULL or expanded name in allocated memory. 42496cb39f92SBram Moolenaar typval_T *ll_tv; // Typeval of item being used. If "newkey" 42506cb39f92SBram Moolenaar // isn't NULL it's the Dict to which to add 42516cb39f92SBram Moolenaar // the item. 42526cb39f92SBram Moolenaar listitem_T *ll_li; // The list item or NULL. 42536cb39f92SBram Moolenaar list_T *ll_list; // The list or NULL. 42546cb39f92SBram Moolenaar int ll_range; // TRUE when a [i:j] range was used 4255d6beab02SBram Moolenaar int ll_empty2; // Second index is empty: [i:] 42566cb39f92SBram Moolenaar long ll_n1; // First index for list 42576cb39f92SBram Moolenaar long ll_n2; // Second index for list range 42586cb39f92SBram Moolenaar dict_T *ll_dict; // The Dictionary or NULL 42596cb39f92SBram Moolenaar dictitem_T *ll_di; // The dictitem or NULL 42606cb39f92SBram Moolenaar char_u *ll_newkey; // New key for Dict in alloc. mem or NULL. 426110c65860SBram Moolenaar type_T *ll_valtype; // type expected for the value or NULL 42626cb39f92SBram Moolenaar blob_T *ll_blob; // The Blob or NULL 4263a9b579f3SBram Moolenaar } lval_T; 4264a21a6a9aSBram Moolenaar 42656cb39f92SBram Moolenaar // Structure used to save the current state. Used when executing Normal mode 42666cb39f92SBram Moolenaar // commands while in any other mode. 4267a21a6a9aSBram Moolenaar typedef struct { 4268a21a6a9aSBram Moolenaar int save_msg_scroll; 4269a21a6a9aSBram Moolenaar int save_restart_edit; 4270a21a6a9aSBram Moolenaar int save_msg_didout; 4271a21a6a9aSBram Moolenaar int save_State; 4272a21a6a9aSBram Moolenaar int save_insertmode; 4273a21a6a9aSBram Moolenaar int save_finish_op; 4274a21a6a9aSBram Moolenaar int save_opcount; 4275cce713ddSBram Moolenaar int save_reg_executing; 42764324d87aSBram Moolenaar int save_script_version; 4277a21a6a9aSBram Moolenaar tasave_T tabuf; 4278a21a6a9aSBram Moolenaar } save_state_T; 4279b0f42ba6SBram Moolenaar 4280b0f42ba6SBram Moolenaar typedef struct { 4281b0f42ba6SBram Moolenaar varnumber_T vv_prevcount; 4282b0f42ba6SBram Moolenaar varnumber_T vv_count; 4283b0f42ba6SBram Moolenaar varnumber_T vv_count1; 4284b0f42ba6SBram Moolenaar } vimvars_save_T; 42851063f3d2SBram Moolenaar 42861063f3d2SBram Moolenaar // Scope for changing directory 42871063f3d2SBram Moolenaar typedef enum { 42881063f3d2SBram Moolenaar CDSCOPE_GLOBAL, // :cd 42891063f3d2SBram Moolenaar CDSCOPE_TABPAGE, // :tcd 42901063f3d2SBram Moolenaar CDSCOPE_WINDOW // :lcd 42911063f3d2SBram Moolenaar } cdscope_T; 4292451d4b5bSBram Moolenaar 4293defa067cSBram Moolenaar // Variable flavor 4294defa067cSBram Moolenaar typedef enum 4295defa067cSBram Moolenaar { 42964aea03ebSBram Moolenaar VAR_FLAVOUR_DEFAULT, // doesn't start with uppercase 42974aea03ebSBram Moolenaar VAR_FLAVOUR_SESSION, // starts with uppercase, some lower 42984aea03ebSBram Moolenaar VAR_FLAVOUR_VIMINFO // all uppercase 4299defa067cSBram Moolenaar } var_flavour_T; 4300defa067cSBram Moolenaar 4301451d4b5bSBram Moolenaar // argument for mouse_find_win() 4302451d4b5bSBram Moolenaar typedef enum { 4303451d4b5bSBram Moolenaar IGNORE_POPUP, // only check non-popup windows 4304451d4b5bSBram Moolenaar FIND_POPUP, // also find popup windows 4305451d4b5bSBram Moolenaar FAIL_POPUP // return NULL if mouse on popup window 4306451d4b5bSBram Moolenaar } mouse_find_T; 4307c3328169SBram Moolenaar 4308c3328169SBram Moolenaar // Symbolic names for some registers. 4309c3328169SBram Moolenaar #define DELETION_REGISTER 36 4310c3328169SBram Moolenaar #ifdef FEAT_CLIPBOARD 4311c3328169SBram Moolenaar # define STAR_REGISTER 37 4312c3328169SBram Moolenaar # ifdef FEAT_X11 4313c3328169SBram Moolenaar # define PLUS_REGISTER 38 4314c3328169SBram Moolenaar # else 4315c3328169SBram Moolenaar # define PLUS_REGISTER STAR_REGISTER // there is only one 4316c3328169SBram Moolenaar # endif 4317c3328169SBram Moolenaar #endif 4318c3328169SBram Moolenaar #ifdef FEAT_DND 4319c3328169SBram Moolenaar # define TILDE_REGISTER (PLUS_REGISTER + 1) 4320c3328169SBram Moolenaar #endif 4321c3328169SBram Moolenaar 4322c3328169SBram Moolenaar #ifdef FEAT_CLIPBOARD 4323c3328169SBram Moolenaar # ifdef FEAT_DND 4324c3328169SBram Moolenaar # define NUM_REGISTERS (TILDE_REGISTER + 1) 4325c3328169SBram Moolenaar # else 4326c3328169SBram Moolenaar # define NUM_REGISTERS (PLUS_REGISTER + 1) 4327c3328169SBram Moolenaar # endif 4328c3328169SBram Moolenaar #else 4329c3328169SBram Moolenaar # define NUM_REGISTERS 37 4330c3328169SBram Moolenaar #endif 4331c3328169SBram Moolenaar 43324aea03ebSBram Moolenaar // structure used by block_prep, op_delete and op_yank for blockwise operators 43334aea03ebSBram Moolenaar // also op_change, op_shift, op_insert, op_replace - AKelly 43344aea03ebSBram Moolenaar struct block_def 43354aea03ebSBram Moolenaar { 43364aea03ebSBram Moolenaar int startspaces; // 'extra' cols before first char 43374aea03ebSBram Moolenaar int endspaces; // 'extra' cols after last char 43384aea03ebSBram Moolenaar int textlen; // chars in block 43394aea03ebSBram Moolenaar char_u *textstart; // pointer to 1st char (partially) in block 43404aea03ebSBram Moolenaar colnr_T textcol; // index of chars (partially) in block 43414aea03ebSBram Moolenaar colnr_T start_vcol; // start col of 1st char wholly inside block 43424aea03ebSBram Moolenaar colnr_T end_vcol; // start col of 1st char wholly after block 43434aea03ebSBram Moolenaar int is_short; // TRUE if line is too short to fit in block 43444aea03ebSBram Moolenaar int is_MAX; // TRUE if curswant==MAXCOL when starting 43454aea03ebSBram Moolenaar int is_oneChar; // TRUE if block within one character 43464aea03ebSBram Moolenaar int pre_whitesp; // screen cols of ws before block 43474aea03ebSBram Moolenaar int pre_whitesp_c; // chars of ws before block 43484aea03ebSBram Moolenaar colnr_T end_char_vcols; // number of vcols of post-block char 43494aea03ebSBram Moolenaar colnr_T start_char_vcols; // number of vcols of pre-block char 43504aea03ebSBram Moolenaar }; 43514aea03ebSBram Moolenaar 4352c3328169SBram Moolenaar // Each yank register has an array of pointers to lines. 4353c3328169SBram Moolenaar typedef struct 4354c3328169SBram Moolenaar { 4355c3328169SBram Moolenaar char_u **y_array; // pointer to array of line pointers 4356c3328169SBram Moolenaar linenr_T y_size; // number of lines in y_array 4357c3328169SBram Moolenaar char_u y_type; // MLINE, MCHAR or MBLOCK 4358c3328169SBram Moolenaar colnr_T y_width; // only set if y_type == MBLOCK 4359c3328169SBram Moolenaar #ifdef FEAT_VIMINFO 4360c3328169SBram Moolenaar time_t y_time_set; 4361c3328169SBram Moolenaar #endif 4362c3328169SBram Moolenaar } yankreg_T; 4363c3328169SBram Moolenaar 4364c3328169SBram Moolenaar // The offset for a search command is store in a soff struct 4365c3328169SBram Moolenaar // Note: only spats[0].off is really used 4366c3328169SBram Moolenaar typedef struct soffset 4367c3328169SBram Moolenaar { 4368c3328169SBram Moolenaar int dir; // search direction, '/' or '?' 4369c3328169SBram Moolenaar int line; // search has line offset 4370c3328169SBram Moolenaar int end; // search set cursor at end 4371c3328169SBram Moolenaar long off; // line or char offset 4372c3328169SBram Moolenaar } soffset_T; 4373c3328169SBram Moolenaar 4374c3328169SBram Moolenaar // A search pattern and its attributes are stored in a spat struct 4375c3328169SBram Moolenaar typedef struct spat 4376c3328169SBram Moolenaar { 4377c3328169SBram Moolenaar char_u *pat; // the pattern (in allocated memory) or NULL 4378c3328169SBram Moolenaar int magic; // magicness of the pattern 4379c3328169SBram Moolenaar int no_scs; // no smartcase for this pattern 4380c3328169SBram Moolenaar soffset_T off; 4381c3328169SBram Moolenaar } spat_T; 4382473952e8SBram Moolenaar 438392ea26b9SBram Moolenaar /* 438492ea26b9SBram Moolenaar * Optional extra arguments for searchit(). 438592ea26b9SBram Moolenaar */ 438692ea26b9SBram Moolenaar typedef struct 438792ea26b9SBram Moolenaar { 438892ea26b9SBram Moolenaar linenr_T sa_stop_lnum; // stop after this line number when != 0 438992ea26b9SBram Moolenaar #ifdef FEAT_RELTIME 439092ea26b9SBram Moolenaar proftime_T *sa_tm; // timeout limit or NULL 439192ea26b9SBram Moolenaar int sa_timed_out; // set when timed out 439292ea26b9SBram Moolenaar #endif 439392ea26b9SBram Moolenaar int sa_wrapped; // search wrapped around 439492ea26b9SBram Moolenaar } searchit_arg_T; 439592ea26b9SBram Moolenaar 43969567efa1SBram Moolenaar /* 43979567efa1SBram Moolenaar * Cookie used by getsourceline(). 43989567efa1SBram Moolenaar */ 43999567efa1SBram Moolenaar /* 44009567efa1SBram Moolenaar * Cookie used to store info for each sourced file. 44019567efa1SBram Moolenaar * It is shared between do_source() and getsourceline(). 44029567efa1SBram Moolenaar * This is passed to do_cmdline(). 44039567efa1SBram Moolenaar */ 44049567efa1SBram Moolenaar typedef struct { 44059567efa1SBram Moolenaar FILE *fp; // opened file for sourcing 44069567efa1SBram Moolenaar char_u *nextline; // if not NULL: line that was read ahead 44079567efa1SBram Moolenaar linenr_T sourcing_lnum; // line number of the source file 44089567efa1SBram Moolenaar int finished; // ":finish" used 44099567efa1SBram Moolenaar #ifdef USE_CRNL 44109567efa1SBram Moolenaar int fileformat; // EOL_UNKNOWN, EOL_UNIX or EOL_DOS 44119567efa1SBram Moolenaar int error; // TRUE if LF found after CR-LF 44129567efa1SBram Moolenaar #endif 44139567efa1SBram Moolenaar #ifdef FEAT_EVAL 44149567efa1SBram Moolenaar linenr_T breakpoint; // next line with breakpoint or zero 44159567efa1SBram Moolenaar char_u *fname; // name of sourced file 44169567efa1SBram Moolenaar int dbg_tick; // debug_tick when breakpoint was set 44179567efa1SBram Moolenaar int level; // top nesting level of sourced file 44189567efa1SBram Moolenaar #endif 44199567efa1SBram Moolenaar vimconv_T conv; // type of conversion 44209567efa1SBram Moolenaar } source_cookie_T; 44219567efa1SBram Moolenaar 4422adc17a5fSBram Moolenaar 4423473952e8SBram Moolenaar #define WRITEBUFSIZE 8192 // size of normal write buffer 4424473952e8SBram Moolenaar 4425473952e8SBram Moolenaar #define FIO_LATIN1 0x01 // convert Latin1 4426473952e8SBram Moolenaar #define FIO_UTF8 0x02 // convert UTF-8 4427473952e8SBram Moolenaar #define FIO_UCS2 0x04 // convert UCS-2 4428473952e8SBram Moolenaar #define FIO_UCS4 0x08 // convert UCS-4 4429473952e8SBram Moolenaar #define FIO_UTF16 0x10 // convert UTF-16 4430473952e8SBram Moolenaar #ifdef MSWIN 4431473952e8SBram Moolenaar # define FIO_CODEPAGE 0x20 // convert MS-Windows codepage 4432473952e8SBram Moolenaar # define FIO_PUT_CP(x) (((x) & 0xffff) << 16) // put codepage in top word 4433473952e8SBram Moolenaar # define FIO_GET_CP(x) (((x)>>16) & 0xffff) // get codepage from top word 4434473952e8SBram Moolenaar #endif 4435473952e8SBram Moolenaar #ifdef MACOS_CONVERT 4436473952e8SBram Moolenaar # define FIO_MACROMAN 0x20 // convert MacRoman 4437473952e8SBram Moolenaar #endif 4438473952e8SBram Moolenaar #define FIO_ENDIAN_L 0x80 // little endian 4439473952e8SBram Moolenaar #define FIO_ENCRYPTED 0x1000 // encrypt written bytes 4440473952e8SBram Moolenaar #define FIO_NOCONVERT 0x2000 // skip encoding conversion 4441473952e8SBram Moolenaar #define FIO_UCSBOM 0x4000 // check for BOM at start of file 4442473952e8SBram Moolenaar #define FIO_ALL -1 // allow all formats 4443473952e8SBram Moolenaar 4444473952e8SBram Moolenaar // When converting, a read() or write() may leave some bytes to be converted 4445473952e8SBram Moolenaar // for the next call. The value is guessed... 4446473952e8SBram Moolenaar #define CONV_RESTLEN 30 4447473952e8SBram Moolenaar 4448473952e8SBram Moolenaar // We have to guess how much a sequence of bytes may expand when converting 4449473952e8SBram Moolenaar // with iconv() to be able to allocate a buffer. 4450473952e8SBram Moolenaar #define ICONV_MULT 8 4451f4e2099eSBram Moolenaar 4452d93a7fc1SBram Moolenaar // Used for "magic_overruled". 4453f4e2099eSBram Moolenaar typedef enum { 4454d93a7fc1SBram Moolenaar OPTION_MAGIC_NOT_SET, // p_magic not overruled 4455d93a7fc1SBram Moolenaar OPTION_MAGIC_ON, // magic on inside regexp 4456d93a7fc1SBram Moolenaar OPTION_MAGIC_OFF // magic off inside regexp 4457d93a7fc1SBram Moolenaar } optmagic_T; 4458d93a7fc1SBram Moolenaar 4459d93a7fc1SBram Moolenaar // Magicness of a pattern, used by regexp code. 4460d93a7fc1SBram Moolenaar // The order and values matter: 4461d93a7fc1SBram Moolenaar // magic <= MAGIC_OFF includes MAGIC_NONE 4462d93a7fc1SBram Moolenaar // magic >= MAGIC_ON includes MAGIC_ALL 4463d93a7fc1SBram Moolenaar typedef enum { 4464d93a7fc1SBram Moolenaar MAGIC_NONE = 1, // "\V" very unmagic 4465d93a7fc1SBram Moolenaar MAGIC_OFF = 2, // "\M" or 'magic' off 4466d93a7fc1SBram Moolenaar MAGIC_ON = 3, // "\m" or 'magic' 4467d93a7fc1SBram Moolenaar MAGIC_ALL = 4 // "\v" very magic 4468f4e2099eSBram Moolenaar } magic_T; 4469f785aa13SBram Moolenaar 4470f785aa13SBram Moolenaar // Struct used to pass to error messages about where the error happened. 4471f785aa13SBram Moolenaar typedef struct { 44727a3fe3e1SBram Moolenaar char *wt_func_name; // function name or NULL 4473f785aa13SBram Moolenaar char wt_index; // argument or variable index, 0 means unknown 4474f785aa13SBram Moolenaar char wt_variable; // "variable" when TRUE, "argument" otherwise 4475f785aa13SBram Moolenaar } where_T; 4476f785aa13SBram Moolenaar 44777a3fe3e1SBram Moolenaar #define WHERE_INIT {NULL, 0, 0} 44787a3fe3e1SBram Moolenaar 44793075a455SBram Moolenaar // Struct passed to get_v_event() and restore_v_event(). 44803075a455SBram Moolenaar typedef struct { 44813075a455SBram Moolenaar int sve_did_save; 44823075a455SBram Moolenaar hashtab_T sve_hashtab; 44833075a455SBram Moolenaar } save_v_event_T; 4484