Search notes:

VIM struct: buf_T

buf_T (struct file_buffer) stores information about one file.
typedef struct file_buffer      buf_T

struct file_buffer
{
    memline_T   b_ml;           // associated memline (also contains line
                                // count)

    buf_T       *b_next;        // links in list of buffers
    buf_T       *b_prev;

    int         b_nwindows;     // nr of windows open on this buffer

    int         b_flags;        // various BF_ flags
    int         b_locked;       // Buffer is being closed or referenced, don't
                                // let autocommands wipe it out.

    /*
     * b_ffname has the full path of the file (NULL for no name).
     * b_sfname is the name as the user typed it (or NULL).
     * b_fname is the same as b_sfname, unless ":cd" has been done,
     *          then it is the same as b_ffname (NULL for no name).
     */
    char_u      *b_ffname;      // full path file name, allocated
    char_u      *b_sfname;      // short file name, allocated, may be equal to
                                // b_ffname
    char_u      *b_fname;       // current file name, points to b_ffname or
                                // b_sfname

#ifdef UNIX
    int         b_dev_valid;    // TRUE when b_dev has a valid number
    dev_t       b_dev;          // device number
    ino_t       b_ino;          // inode number
#endif
#ifdef FEAT_CW_EDITOR
    FSSpec      b_FSSpec;       // MacOS File Identification
#endif
#ifdef VMS
    char         b_fab_rfm;     // Record format
    char         b_fab_rat;     // Record attribute
    unsigned int b_fab_mrs;     // Max record size
#endif
    int         b_fnum;         // buffer number for this file.
    char_u      b_key[VIM_SIZEOF_INT * 2 + 1];
                                // key used for buf_hashtab, holds b_fnum as
                                // hex string

    int         b_changed;      // 'modified': Set to TRUE if something in the
                                // file has been changed and not written out.
    dictitem16_T b_ct_di;       // holds the b:changedtick value in
                                // b_ct_di.di_tv.vval.v_number;
                                // incremented for each change, also for undo
#define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)

    varnumber_T b_last_changedtick; // b:changedtick when TextChanged or
                                    // TextChangedI was last triggered.
    varnumber_T b_last_changedtick_pum; // b:changedtick when TextChangedP was
                                        // last triggered.

    int         b_saving;       // Set to TRUE if we are in the middle of
                                // saving the buffer.

    /*
     * Changes to a buffer require updating of the display.  To minimize the
     * work, remember changes made and update everything at once.
     */
    int         b_mod_set;      // TRUE when there are changes since the last
                                // time the display was updated
    linenr_T    b_mod_top;      // topmost lnum that was changed
    linenr_T    b_mod_bot;      // lnum below last changed line, AFTER the
                                // change
    long        b_mod_xlines;   // number of extra buffer lines inserted;
                                // negative when lines were deleted

    wininfo_T   *b_wininfo;     // list of last used info for each window

    long        b_mtime;        // last change time of original file
    long        b_mtime_read;   // last change time when reading
    off_T       b_orig_size;    // size of original file in bytes
    int         b_orig_mode;    // mode of original file
#ifdef FEAT_VIMINFO
    time_T      b_last_used;    // time when the buffer was last used; used
                                // for viminfo
#endif

    pos_T       b_namedm[NMARKS]; // current named marks (mark.c)

    // These variables are set when VIsual_active becomes FALSE
    visualinfo_T b_visual;
#ifdef FEAT_EVAL
    int         b_visual_mode_eval;  // b_visual.vi_mode for visualmode()
#endif

    pos_T       b_last_cursor;  // cursor position when last unloading this
                                // buffer
    pos_T       b_last_insert;  // where Insert mode was left
    pos_T       b_last_change;  // position of last change: '. mark

#ifdef FEAT_JUMPLIST
    /*
     * the changelist contains old change positions
     */
    pos_T       b_changelist[JUMPLISTSIZE];
    int         b_changelistlen;        // number of active entries
    int         b_new_change;           // set by u_savecommon()
#endif

    /*
     * Character table, only used in charset.c for 'iskeyword'
     * 32 bytes of 8 bits: 1 bit per character 0-255.
     */
    char_u      b_chartab[32];

    // Table used for mappings local to a buffer.
    mapblock_T  *(b_maphash[256]);

    // First abbreviation local to a buffer.
    mapblock_T  *b_first_abbr;

    // User commands local to the buffer.
    garray_T    b_ucmds;
    // start and end of an operator, also used for '[ and ']
    pos_T       b_op_start;
    pos_T       b_op_start_orig;  // used for Insstart_orig
    pos_T       b_op_end;

#ifdef FEAT_VIMINFO
    int         b_marks_read;   // Have we read viminfo marks yet?
#endif

    /*
     * The following only used in undo.c.
     */
    u_header_T  *b_u_oldhead;   // pointer to oldest header
    u_header_T  *b_u_newhead;   // pointer to newest header; may not be valid
                                // if b_u_curhead is not NULL
    u_header_T  *b_u_curhead;   // pointer to current header
    int         b_u_numhead;    // current number of headers
    int         b_u_synced;     // entry lists are synced
    long        b_u_seq_last;   // last used undo sequence number
    long        b_u_save_nr_last; // counter for last file write
    long        b_u_seq_cur;    // hu_seq of header below which we are now
    time_T      b_u_time_cur;   // uh_time of header below which we are now
    long        b_u_save_nr_cur; // file write nr after which we are now

    /*
     * variables for "U" command in undo.c
     */
    undoline_T  b_u_line_ptr;   // saved line for "U" command
    linenr_T    b_u_line_lnum;  // line number of line in u_line
    colnr_T     b_u_line_colnr; // optional column number

    int         b_scanned;      // ^N/^P have scanned this buffer

    // flags for use of ":lmap" and IM control
    long        b_p_iminsert;   // input mode for insert
    long        b_p_imsearch;   // input mode for search
#define B_IMODE_USE_INSERT -1   //      Use b_p_iminsert value for search
#define B_IMODE_NONE 0          //      Input via none
#define B_IMODE_LMAP 1          //      Input via langmap
#define B_IMODE_IM 2            //      Input via input method
#define B_IMODE_LAST 2

#ifdef FEAT_KEYMAP
    short       b_kmap_state;   // using "lmap" mappings
# define KEYMAP_INIT    1       // 'keymap' was set, call keymap_init()
# define KEYMAP_LOADED  2       // 'keymap' mappings have been loaded
    garray_T    b_kmap_ga;      // the keymap table
#endif

    /*
     * Options local to a buffer.
     * They are here because their value depends on the type of file
     * or contents of the file being edited.
     */
    int         b_p_initialized;        // set when options initialized

#ifdef FEAT_EVAL
    sctx_T      b_p_script_ctx[BV_COUNT]; // SCTXs for buffer-local options
#endif

    int         b_p_ai;         // 'autoindent'
    int         b_p_ai_nopaste; // b_p_ai saved for paste mode
    char_u      *b_p_bkc;       // 'backupcopy'
    unsigned    b_bkc_flags;    // flags for 'backupcopy'
    int         b_p_ci;         // 'copyindent'
    int         b_p_bin;        // 'binary'
    int         b_p_bomb;       // 'bomb'
    char_u      *b_p_bh;        // 'bufhidden'
    char_u      *b_p_bt;        // 'buftype'
#ifdef FEAT_QUICKFIX
#define BUF_HAS_QF_ENTRY 1
#define BUF_HAS_LL_ENTRY 2
    int         b_has_qf_entry;
#endif
    int         b_p_bl;         // 'buflisted'
#ifdef FEAT_CINDENT
    int         b_p_cin;        // 'cindent'
    char_u      *b_p_cino;      // 'cinoptions'
    char_u      *b_p_cink;      // 'cinkeys'
#endif
#if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT)
    char_u      *b_p_cinw;      // 'cinwords'
#endif
    char_u      *b_p_com;       // 'comments'
#ifdef FEAT_FOLDING
    char_u      *b_p_cms;       // 'commentstring'
#endif
    char_u      *b_p_cpt;       // 'complete'
#ifdef BACKSLASH_IN_FILENAME
    char_u      *b_p_csl;       // 'completeslash'
#endif
#ifdef FEAT_COMPL_FUNC
    char_u      *b_p_cfu;       // 'completefunc'
    char_u      *b_p_ofu;       // 'omnifunc'
#endif
#ifdef FEAT_EVAL
    char_u      *b_p_tfu;       // 'tagfunc'
#endif
    int         b_p_eol;        // 'endofline'
    int         b_p_fixeol;     // 'fixendofline'
    int         b_p_et;         // 'expandtab'
    int         b_p_et_nobin;   // b_p_et saved for binary mode
    int         b_p_et_nopaste; // b_p_et saved for paste mode
    char_u      *b_p_fenc;      // 'fileencoding'
    char_u      *b_p_ff;        // 'fileformat'
    char_u      *b_p_ft;        // 'filetype'
    char_u      *b_p_fo;        // 'formatoptions'
    char_u      *b_p_flp;       // 'formatlistpat'
    int         b_p_inf;        // 'infercase'
    char_u      *b_p_isk;       // 'iskeyword'
#ifdef FEAT_FIND_ID
    char_u      *b_p_def;       // 'define' local value
    char_u      *b_p_inc;       // 'include'
# ifdef FEAT_EVAL
    char_u      *b_p_inex;      // 'includeexpr'
    long_u      b_p_inex_flags; // flags for 'includeexpr'
# endif
#endif
#if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
    char_u      *b_p_inde;      // 'indentexpr'
    long_u      b_p_inde_flags; // flags for 'indentexpr'
    char_u      *b_p_indk;      // 'indentkeys'
#endif
    char_u      *b_p_fp;        // 'formatprg'
#if defined(FEAT_EVAL)
    char_u      *b_p_fex;       // 'formatexpr'
    long_u      b_p_fex_flags;  // flags for 'formatexpr'
#endif
#ifdef FEAT_CRYPT
    char_u      *b_p_key;       // 'key'
#endif
    char_u      *b_p_kp;        // 'keywordprg'
#ifdef FEAT_LISP
    int         b_p_lisp;       // 'lisp'
#endif
    char_u      *b_p_menc;      // 'makeencoding'
    char_u      *b_p_mps;       // 'matchpairs'
    int         b_p_ml;         // 'modeline'
    int         b_p_ml_nobin;   // b_p_ml saved for binary mode
    int         b_p_ma;         // 'modifiable'
    char_u      *b_p_nf;        // 'nrformats'
    int         b_p_pi;         // 'preserveindent'
#ifdef FEAT_TEXTOBJ
    char_u      *b_p_qe;        // 'quoteescape'
#endif
    int         b_p_ro;         // 'readonly'
    long        b_p_sw;         // 'shiftwidth'
    int         b_p_sn;         // 'shortname'
#ifdef FEAT_SMARTINDENT
    int         b_p_si;         // 'smartindent'
#endif
    long        b_p_sts;        // 'softtabstop'
    long        b_p_sts_nopaste; // b_p_sts saved for paste mode
#ifdef FEAT_SEARCHPATH
    char_u      *b_p_sua;       // 'suffixesadd'
#endif
    int         b_p_swf;        // 'swapfile'
#ifdef FEAT_SYN_HL
    long        b_p_smc;        // 'synmaxcol'
    char_u      *b_p_syn;       // 'syntax'
#endif
    long        b_p_ts;         // 'tabstop'
    int         b_p_tx;         // 'textmode'
    long        b_p_tw;         // 'textwidth'
    long        b_p_tw_nobin;   // b_p_tw saved for binary mode
    long        b_p_tw_nopaste; // b_p_tw saved for paste mode
    long        b_p_wm;         // 'wrapmargin'
    long        b_p_wm_nobin;   // b_p_wm saved for binary mode
    long        b_p_wm_nopaste; // b_p_wm saved for paste mode
#ifdef FEAT_VARTABS
    char_u      *b_p_vsts;      // 'varsofttabstop'
    int         *b_p_vsts_array;   // 'varsofttabstop' in internal format
    char_u      *b_p_vsts_nopaste; // b_p_vsts saved for paste mode
    char_u      *b_p_vts;       // 'vartabstop'
    int         *b_p_vts_array; // 'vartabstop' in internal format
#endif
#ifdef FEAT_KEYMAP
    char_u      *b_p_keymap;    // 'keymap'
#endif

    /*
     * local values for options which are normally global
     */
#ifdef FEAT_QUICKFIX
    char_u      *b_p_gp;        // 'grepprg' local value
    char_u      *b_p_mp;        // 'makeprg' local value
    char_u      *b_p_efm;       // 'errorformat' local value
#endif
    char_u      *b_p_ep;        // 'equalprg' local value
    char_u      *b_p_path;      // 'path' local value
    int         b_p_ar;         // 'autoindent' local value
    char_u      *b_p_tags;      // 'tags' local value
    char_u      *b_p_tc;        // 'tagcase' local value
    unsigned    b_tc_flags;     // flags for 'tagcase'
    char_u      *b_p_dict;      // 'dictionary' local value
    char_u      *b_p_tsr;       // 'thesaurus' local value
    long        b_p_ul;         // 'undolevels' local value
#ifdef FEAT_PERSISTENT_UNDO
    int         b_p_udf;        // 'undofile'
#endif
#ifdef FEAT_LISP
    char_u      *b_p_lw;        // 'lispwords' local value
#endif
#ifdef FEAT_TERMINAL
    long        b_p_twsl;       // 'termwinscroll'
#endif

    /*
     * end of buffer options
     */

#ifdef FEAT_CINDENT
    // values set from b_p_cino
    int         b_ind_level;
    int         b_ind_open_imag;
    int         b_ind_no_brace;
    int         b_ind_first_open;
    int         b_ind_open_extra;
    int         b_ind_close_extra;
    int         b_ind_open_left_imag;
    int         b_ind_jump_label;
    int         b_ind_case;
    int         b_ind_case_code;
    int         b_ind_case_break;
    int         b_ind_param;
    int         b_ind_func_type;
    int         b_ind_comment;
    int         b_ind_in_comment;
    int         b_ind_in_comment2;
    int         b_ind_cpp_baseclass;
    int         b_ind_continuation;
    int         b_ind_unclosed;
    int         b_ind_unclosed2;
    int         b_ind_unclosed_noignore;
    int         b_ind_unclosed_wrapped;
    int         b_ind_unclosed_whiteok;
    int         b_ind_matching_paren;
    int         b_ind_paren_prev;
    int         b_ind_maxparen;
    int         b_ind_maxcomment;
    int         b_ind_scopedecl;
    int         b_ind_scopedecl_code;
    int         b_ind_java;
    int         b_ind_js;
    int         b_ind_keep_case_label;
    int         b_ind_hash_comment;
    int         b_ind_cpp_namespace;
    int         b_ind_if_for_while;
    int         b_ind_cpp_extern_c;
#endif

    linenr_T    b_no_eol_lnum;  // non-zero lnum when last line of next binary
                                // write should not have an end-of-line

    int         b_start_eol;    // last line had eol when it was read
    int         b_start_ffc;    // first char of 'ff' when edit started
    char_u      *b_start_fenc;  // 'fileencoding' when edit started or NULL
    int         b_bad_char;     // "++bad=" argument when edit started or 0
    int         b_start_bomb;   // 'bomb' when it was read

#ifdef FEAT_EVAL
    dictitem_T  b_bufvar;       // variable for "b:" Dictionary
    dict_T      *b_vars;        // internal variables, local to buffer

    listener_T  *b_listener;
    list_T      *b_recorded_changes;
#endif
#ifdef FEAT_PROP_POPUP
    int         b_has_textprop; // TRUE when text props were added
    hashtab_T   *b_proptypes;   // text property types local to buffer
#endif

#if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
    char_u      *b_p_bexpr;     // 'balloonexpr' local value
    long_u      b_p_bexpr_flags;// flags for 'balloonexpr'
#endif
#ifdef FEAT_CRYPT
    char_u      *b_p_cm;        // 'cryptmethod'
#endif

    // When a buffer is created, it starts without a swap file.  b_may_swap is
    // then set to indicate that a swap file may be opened later.  It is reset
    // if a swap file could not be opened.
    int         b_may_swap;
    int         b_did_warn;     // Set to 1 if user has been warned on first
                                // change of a read-only file

    // Two special kinds of buffers:
    // help buffer  - used for help files, won't use a swap file.
    // spell buffer - used for spell info, never displayed and doesn't have a
    //                file name.
    int         b_help;         // TRUE for help file buffer (when set b_p_bt
                                // is "help")
#ifdef FEAT_SPELL
    int         b_spell;        // TRUE for a spell file buffer, most fields
                                // are not used!  Use the B_SPELL macro to
                                // access b_spell without #ifdef.
#endif

    int         b_shortname;    // this file has an 8.3 file name

#ifdef FEAT_JOB_CHANNEL
    char_u      *b_prompt_text;         // set by prompt_setprompt()
    callback_T  b_prompt_callback;      // set by prompt_setcallback()
    callback_T  b_prompt_interrupt;     // set by prompt_setinterrupt()
    int         b_prompt_insert;        // value for restart_edit when entering
                                        // a prompt buffer window.
#endif
#ifdef FEAT_MZSCHEME
    void        *b_mzscheme_ref; // The MzScheme reference to this buffer
#endif

#ifdef FEAT_PERL
    void        *b_perl_private;
#endif

#ifdef FEAT_PYTHON
    void        *b_python_ref;  // The Python reference to this buffer
#endif

#ifdef FEAT_PYTHON3
    void        *b_python3_ref; // The Python3 reference to this buffer
#endif

#ifdef FEAT_TCL
    void        *b_tcl_ref;
#endif

#ifdef FEAT_RUBY
    void        *b_ruby_ref;
#endif

#if defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
    synblock_T  b_s;            // Info related to syntax highlighting.  w_s
                                // normally points to this, but some windows
                                // may use a different synblock_T.
#endif

#ifdef FEAT_SIGNS
    sign_entry_T *b_signlist;      // list of placed signs
# ifdef FEAT_NETBEANS_INTG
    int         b_has_sign_column; // Flag that is set when a first sign is
                                   // added and remains set until the end of
                                   // the netbeans session.
# endif
#endif

#ifdef FEAT_NETBEANS_INTG
    int         b_netbeans_file;    // TRUE when buffer is owned by NetBeans
    int         b_was_netbeans_file;// TRUE if b_netbeans_file was once set
#endif
#ifdef FEAT_JOB_CHANNEL
    int         b_write_to_channel; // TRUE when appended lines are written to
                                    // a channel.
#endif

#ifdef FEAT_CRYPT
    cryptstate_T *b_cryptstate; // Encryption state while reading or writing
                                // the file. NULL when not using encryption.
#endif
    int         b_mapped_ctrl_c; // modes where CTRL-C is mapped

#ifdef FEAT_TERMINAL
    term_T      *b_term;        // When not NULL this buffer is for a terminal
                                // window.
#endif
#ifdef FEAT_DIFF
    int         b_diff_failed;  // internal diff failed for this buffer
#endif
}; // file_buffer

Index