在 C 语言中,有两个结构(参见 buffer.h)用于表示缓冲区。buffer_text 结构包含描述缓冲区文本的字段;buffer 结构保存其他字段。对于间接缓冲区,两个或多个 buffer 结构引用同一个 buffer_text 结构。
以下是 struct buffer_text 中的一些字段:
beg缓冲区内容的地址。缓冲区内容是一个带有间隙(gap)的线性 C 字符 char 数组。
gptgpt_byte缓冲区间隙的字符位置和字节位置。See 缓冲区间隙。
zz_byte缓冲区文本末尾的字符位置和字节位置。
gap_size缓冲区间隙的大小。See 缓冲区间隙。
modiffsave_modiffchars_modiffoverlay_modiff这些字段对在此缓冲区中执行的缓冲区修改事件的次数进行计数。modiff 在每次缓冲区修改事件后递增,且在其他情况下不会更改;save_modiff 包含上次访问或保存缓冲区时 modiff 的值;chars_modiff 仅统计对缓冲区中字符的修改,忽略所有其他类型的更改(如文本属性);overlay_modiff 仅统计对缓冲区覆盖层(overlays)的修改。
beg_unchangedend_unchanged自上次完整重绘以来,已知未更改的文本开头和结尾的字符数。
unchanged_modifiedoverlay_unchanged_modified上次完整重绘后,modiff 和 overlay_modiff 的值。如果它们的当前值与 modiff 或 overlay_modiff 匹配,则表明 beg_unchanged 和 end_unchanged 不包含有效信息。
markers引用此缓冲区的标记。这实际上是一个单一的标记,其标记 链(chain) 中的后续元素是引用此缓冲区文本的其他标记。
intervals记录此缓冲区文本属性的间隔树。
struct buffer 的一些字段包括:
header所有类向量对象共有的 union vectorlike_header 类型的头部。
own_text通常用于保存缓冲区内容的 struct buffer_text 结构。在间接缓冲区中,不使用此字段。
text指向此缓冲区的 buffer_text 结构的指针。在普通缓冲区中,这是上面的 own_text 字段。在间接缓冲区中,这是基础缓冲区的 own_text 字段。
next所有缓冲区(包括已终止的缓冲区)链中的下一个缓冲区指针。此链仅用于分配和垃圾回收,以便正确收集已终止的缓冲区。
ptpt_byte缓冲区中点(point)的字符位置和字节位置。
begvbegv_byte缓冲区可访问文本范围开头的字符位置和字节位置。
zvzv_byte缓冲区可访问文本范围结尾的字符位置和字节位置。
base_buffer在间接缓冲区中,指向基础缓冲区的指针。在普通缓冲区中,它为空。
local_flags此字段包含指示某些变量在此缓冲区中为局部变量的标志。此类变量使用 DEFVAR_PER_BUFFER 在 C 代码中声明,其缓冲区局部绑定存储在缓冲区结构本身的字段中。(此表中描述了其中一些字段。)
modtime被访问文件的修改时间。在写入或读取文件时设置此时间。在将缓冲区写入文件之前,会将此字段与文件的修改时间进行比较,以查看文件是否在磁盘上发生了更改。See 缓冲区修改。
auto_save_modified缓冲区上次自动保存的时间。
last_window_start上次在窗口中显示缓冲区时,缓冲区中的 window-start 位置。
clip_changed此标志指示缓冲区中的缩窄(narrowing)已发生更改。See 范围限制。
prevent_redisplay_optimizations_p此标志指示不应使用重绘优化来显示此缓冲区。
inhibit_buffer_hooks此标志指示缓冲区不应运行钩子 kill-buffer-hook、kill-buffer-query-functions(see 杀死缓冲区)和 buffer-list-update-hook(see 缓冲区列表)。它在缓冲区创建时设置(see 创建缓冲区),可避免内部或临时缓冲区(如由 with-temp-buffer 创建的缓冲区)变慢(see Current Buffer)。
name命名缓冲区的 Lisp 字符串。保证其唯一性。See 缓冲区名称。此字段及以下字段在 C 结构定义中的名称以 _ 结尾,表明不应直接访问,而应通过 BVAR 宏访问,例如:
Lisp_Object buf_name = BVAR (buffer, name);
save_length上次读取或保存时,此缓冲区正在访问的文件的长度。它有两个特殊值:−1 表示此缓冲区已关闭自动保存,−2 表示如果缓冲区文本大幅缩小,请勿关闭自动保存。此及其他与保存相关的字段不保留在 buffer_text 结构中,因为间接缓冲区永远不会被保存。
directory用于扩展相对文件名的目录。这是缓冲区局部变量 default-directory 的值(see 文件名展开相关函数)。
filename此缓冲区中正在访问的文件的名称,或 nil。这是缓冲区局部变量 buffer-file-name 的值(see 缓冲区文件名)。
undo_listbacked_upauto_save_file_nameauto_save_file_formatread_onlyfile_formatfile_truenameinvisibility_specdisplay_countdisplay_time这些字段存储自动缓冲区局部变量的值(see 缓冲区局部变量),其对应的变量名带有额外的前缀 buffer-,并将下划线替换为短横线。例如,undo_list 存储 buffer-undo-list 的值。
mark缓冲区的标记(mark)。标记是一个标记对象,因此它也包含在 markers 列表中。See 标记点。
local_var_alist描述此缓冲区缓冲区局部变量绑定的关联列表,不包括在缓冲区对象中具有特殊槽位的内置缓冲区局部变量。(此表中省略了这些槽位。)See 缓冲区局部变量。
major_mode命名此缓冲区主模式的符号,例如 lisp-mode。
mode_name主模式的易读名称,例如 "Lisp"。
keymapabbrev_tablesyntax_tablecategory_tabledisplay_table这些字段存储缓冲区的局部键映射(see 按键映射)、缩写表(see 缩写表)、语法表(see 语法表)、类别表(see 分类)和显示表(see 显示表)。
downcase_tableupcase_tablecase_canon_table这些字段存储用于将文本转换为小写、大写的转换表,以及用于规范大小写折叠搜索的文本的转换表。See 大小写转换表。
minor_modes此缓冲区的次要模式关联列表。
pt_markerbegv_markerzv_marker这些字段仅在间接缓冲区或作为间接缓冲区基础的缓冲区中使用。每个字段都持有一个标记,用于在缓冲区非当前时记录此缓冲区的 pt、begv 和 zv。
mode_line_formatheader_line_formattab_widthfill_columnleft_marginauto_fill_functiontruncate_linesword_wrapctl_arrowbidi_display_reorderingbidi_paragraph_directionselective_displayselective_display_ellipsesoverwrite_modeabbrev_modemark_activeenable_multibyte_charactersbuffer_file_coding_systemcache_long_line_scanspoint_before_scrollleft_fringe_widthright_fringe_widthfringes_outside_marginsscroll_bar_widthindicate_empty_linesindicate_buffer_boundariesfringe_indicator_alistfringe_cursor_alistscroll_up_aggressivelyscroll_down_aggressivelycursor_typecursor_in_non_selected_windows这些字段存储自动成为缓冲区局部的 Lisp 变量的值 (see 缓冲区局部变量),其对应的变量名中的下划线已替换为连字符。例如,mode_line_format 存储 mode-line-format 的值。
overlays包含此缓冲区覆盖层的区间树。
last_selected_window此为最后一次选中且包含该缓冲区的窗口;若该窗口已不再显示此缓冲区,则为 nil。