E.9.1 缓冲区内部结构

在 C 语言中,有两个结构(参见 buffer.h)用于表示缓冲区。buffer_text 结构包含描述缓冲区文本的字段;buffer 结构保存其他字段。对于间接缓冲区,两个或多个 buffer 结构引用同一个 buffer_text 结构。

以下是 struct buffer_text 中的一些字段:

beg

缓冲区内容的地址。缓冲区内容是一个带有间隙(gap)的线性 C 字符 char 数组。

gpt
gpt_byte

缓冲区间隙的字符位置和字节位置。See 缓冲区间隙

z
z_byte

缓冲区文本末尾的字符位置和字节位置。

gap_size

缓冲区间隙的大小。See 缓冲区间隙

modiff
save_modiff
chars_modiff
overlay_modiff

这些字段对在此缓冲区中执行的缓冲区修改事件的次数进行计数。modiff 在每次缓冲区修改事件后递增,且在其他情况下不会更改;save_modiff 包含上次访问或保存缓冲区时 modiff 的值;chars_modiff 仅统计对缓冲区中字符的修改,忽略所有其他类型的更改(如文本属性);overlay_modiff 仅统计对缓冲区覆盖层(overlays)的修改。

beg_unchanged
end_unchanged

自上次完整重绘以来,已知未更改的文本开头和结尾的字符数。

unchanged_modified
overlay_unchanged_modified

上次完整重绘后,modiffoverlay_modiff 的值。如果它们的当前值与 modiffoverlay_modiff 匹配,则表明 beg_unchangedend_unchanged 不包含有效信息。

markers

引用此缓冲区的标记。这实际上是一个单一的标记,其标记 链(chain) 中的后续元素是引用此缓冲区文本的其他标记。

intervals

记录此缓冲区文本属性的间隔树。

struct buffer 的一些字段包括:

header

所有类向量对象共有的 union vectorlike_header 类型的头部。

own_text

通常用于保存缓冲区内容的 struct buffer_text 结构。在间接缓冲区中,不使用此字段。

text

指向此缓冲区的 buffer_text 结构的指针。在普通缓冲区中,这是上面的 own_text 字段。在间接缓冲区中,这是基础缓冲区的 own_text 字段。

next

所有缓冲区(包括已终止的缓冲区)链中的下一个缓冲区指针。此链仅用于分配和垃圾回收,以便正确收集已终止的缓冲区。

pt
pt_byte

缓冲区中点(point)的字符位置和字节位置。

begv
begv_byte

缓冲区可访问文本范围开头的字符位置和字节位置。

zv
zv_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-hookkill-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_list
backed_up
auto_save_file_name
auto_save_file_format
read_only
file_format
file_truename
invisibility_spec
display_count
display_time

这些字段存储自动缓冲区局部变量的值(see 缓冲区局部变量),其对应的变量名带有额外的前缀 buffer-,并将下划线替换为短横线。例如,undo_list 存储 buffer-undo-list 的值。

mark

缓冲区的标记(mark)。标记是一个标记对象,因此它也包含在 markers 列表中。See 标记点

local_var_alist

描述此缓冲区缓冲区局部变量绑定的关联列表,不包括在缓冲区对象中具有特殊槽位的内置缓冲区局部变量。(此表中省略了这些槽位。)See 缓冲区局部变量

major_mode

命名此缓冲区主模式的符号,例如 lisp-mode

mode_name

主模式的易读名称,例如 "Lisp"

keymap
abbrev_table
syntax_table
category_table
display_table

这些字段存储缓冲区的局部键映射(see 按键映射)、缩写表(see 缩写表)、语法表(see 语法表)、类别表(see 分类)和显示表(see 显示表)。

downcase_table
upcase_table
case_canon_table

这些字段存储用于将文本转换为小写、大写的转换表,以及用于规范大小写折叠搜索的文本的转换表。See 大小写转换表

minor_modes

此缓冲区的次要模式关联列表。

pt_marker
begv_marker
zv_marker

这些字段仅在间接缓冲区或作为间接缓冲区基础的缓冲区中使用。每个字段都持有一个标记,用于在缓冲区非当前时记录此缓冲区的 ptbegvzv

mode_line_format
header_line_format
tab_width
fill_column
left_margin
auto_fill_function
truncate_lines
word_wrap
ctl_arrow
bidi_display_reordering
bidi_paragraph_direction
selective_display
selective_display_ellipses
overwrite_mode
abbrev_mode
mark_active
enable_multibyte_characters
buffer_file_coding_system
cache_long_line_scans
point_before_scroll
left_fringe_width
right_fringe_width
fringes_outside_margins
scroll_bar_width
indicate_empty_lines
indicate_buffer_boundaries
fringe_indicator_alist
fringe_cursor_alist
scroll_up_aggressively
scroll_down_aggressively
cursor_type
cursor_in_non_selected_windows

这些字段存储自动成为缓冲区局部的 Lisp 变量的值 (see 缓冲区局部变量),其对应的变量名中的下划线已替换为连字符。例如,mode_line_format 存储 mode-line-format 的值。

overlays

包含此缓冲区覆盖层的区间树。

last_selected_window

此为最后一次选中且包含该缓冲区的窗口;若该窗口已不再显示此缓冲区,则为 nil