E.9.2 窗口内部结构

窗口的字段(完整列表参见 window.hstruct window 的定义)包括:

frame

此窗口所在的框架,以 Lisp 对象形式表示。

mini

若此窗口为微型缓冲区窗口、显示微型缓冲区或回显区的窗口,则值非零。

pseudo_window_p

若此窗口为 伪窗口(pseudo window),则值非零。伪窗口是指用于显示菜单栏或工具栏的窗口(当 Emacs 使用不自带菜单栏与工具栏的工具包时)、标签栏窗口,或是在提示框框架上显示提示信息的窗口。伪窗口通常无法从 Lisp 代码中访问。

parent

在内部,Emacs 以树形结构组织窗口;每一组同级窗口都有一个父窗口,其区域包含所有同级窗口。此字段以 Lisp 对象形式指向该树中此窗口的父节点。对于树的根窗口与微型缓冲区窗口,该值始终为 nil

父窗口不显示缓冲区,除了调整子窗口形状外,在显示中作用很小。Emacs Lisp 程序无法直接操作父窗口;它们只对树的叶节点窗口进行操作,这些窗口才实际显示缓冲区。

contents

对于叶窗口与显示提示信息的窗口,此为该窗口所显示的缓冲区(Lisp 对象)。对于内部(“父(parent)”)窗口,此为其第一个子窗口。对于显示菜单或工具栏的伪窗口,此值为 nil。已被删除的窗口该值也为 nil

next
prev

此窗口的下一个与上一个同级窗口,以 Lisp 对象表示。若该窗口为组内最右侧或最下方窗口,则 nextnil;若为最左侧或最上方窗口,则 prevnil。同级窗口是左右排列还是上下排列,由其父窗口的 horizontal 字段决定:若该字段非零,则同级窗口水平排列。

一个特殊情况是:框架根窗口的 next 指向该框架的微型缓冲区窗口,前提是该框架并非仅微型缓冲区或无微型缓冲区框架。在这类框架上,微型缓冲区窗口的 prev 指向该框架的根窗口。其他情况下,根窗口的 next 与微型缓冲区窗口(若存在)的 prev 字段均为 nil

left_col

窗口左边缘所在列数,相对于该窗口所属原生框架的最左列(第 0 列)。

top_line

窗口上边缘所在行数,相对于该窗口所属原生框架的最顶行(第 0 行)。

pixel_left
pixel_top

此窗口左边缘与上边缘的像素坐标,相对于窗口所属原生框架的左上角 (0, 0)。

total_cols
total_lines

窗口的总宽度与总高度,分别以列数与行数计量。该值包含滚动条、边缘区、分隔线及窗口右侧分隔栏(若有)。

pixel_width;
pixel_height;

窗口总宽度与总高度,以像素计量。

start

一个标记,指向缓冲区中窗口显示的第一个字符所在位置(逻辑顺序,see 双向显示)。

pointm

当此窗口被选中时,为当前缓冲区中点的位置;未被选中时,保留之前的值。

old_pointm

上一次重绘时 pointm 的值。

force_start

若此标记非 nil,表示窗口已被 Lisp 程序显式滚动,且窗口 start 的值已为重绘设置生效。这会影响下次重绘时点超出屏幕时的行为:不再滚动窗口以显示点周围文本,而是将点移动到屏幕可见位置。

optional_new_start

force_start 类似,但下次重绘仅在点保持可见时才遵循该值。

start_at_line_beg

nil 表示当前 start 值被选定于某一行的行首。

use_time

此窗口最后一次被选中的时间。函数 get-lru-window 使用此字段。

sequence_number

窗口创建时分配的唯一编号。

last_modified

截至此窗口上一次完成重绘时,窗口所属缓冲区的 modiff 字段值。

last_overlay_modified

截至此窗口上一次完成重绘时,窗口所属缓冲区的 overlay_modiff 字段值。

last_point

截至此窗口上一次完成重绘时,缓冲区中点的位置。

last_had_star

非零值表示窗口上次更新时,其所属缓冲区已被修改。

vertical_scroll_bar_type
horizontal_scroll_bar_type

此窗口垂直与水平滚动条的类型。

scroll_bar_width
scroll_bar_height

此窗口垂直滚动条宽度与水平滚动条高度,以像素计量。

left_margin_cols
right_margin_cols

此窗口左右边距的宽度。值为 0 表示无边距。

left_fringe_width
right_fringe_width

此窗口左右边缘区的像素宽度。值为 −1 表示使用框架的对应值。

fringes_outside_margins

非零值表示边缘区位于显示边距外侧;否则位于边距与文本之间。

window_end_pos

计算方式为 z 减去窗口当前字形矩阵中最后一个字形对应的缓冲区位置。仅当 window_end_valid 非零时,该值有效。

window_end_bytepos

window_end_pos 对应的字节位置。

window_end_vpos

包含 window_end_pos 的行在窗口中的相对垂直位置。

window_end_valid

window_end_poswindow_end_vpos 确实有效,则此字段设为非零值。若复杂重绘被抢占,则该值为 0,因为此时为计算 window_end_pos 所做的显示并未实际出现在屏幕上。

cursor

描述此窗口内光标位置的结构体。

last_cursor_vpos

上一次完成重绘时,显示光标的行在窗口中的相对垂直位置。

phys_cursor

描述此窗口物理光标位置的结构体。

phys_cursor_type
phys_cursor_height
phys_cursor_width

此窗口上一次显示的光标的类型、高度与宽度。

phys_cursor_on_p

若物理光标处于点亮状态,则此字段非零。

cursor_off_p

非零表示此窗口中的光标逻辑上处于关闭状态。用于光标闪烁。

last_cursor_off_p

此字段保存上一次重绘时 cursor_off_p 的值。

must_be_updated_p

重绘期间若此窗口必须更新,则设为 1。

hscroll

窗口显示内容向左水平滚动的列数。通常为 0。当仅当前行水平滚动时,该值描述当前行的滚动量。

min_hscroll

hscroll 的最小值,由用户通过 set-window-hscroll 设置 (see 水平滚动)。当仅当前行水平滚动时,该值描述除当前行外其他行的水平滚动量。

vscroll

垂直滚动量,以像素计量。通常为 0。

dedicated

若此窗口专用于其所属缓冲区,则非 nil

combination_limit

此窗口的合并限制,仅对父窗口有意义。若为 t,则不允许删除此窗口并将其子窗口与此窗口的其他同级窗口重新合并。

window_parameters

此窗口参数的关联列表。

display_table

此窗口的显示表;若未指定,则为 nil

update_mode_line

非零表示此窗口的模式行需要更新。

mode_line_height
header_line_height

模式行与标题行的像素高度;若未知则为 −1。

base_line_number

缓冲区中某一位置的行号,或 0。用于在模式行中显示点的行号。

base_line_pos

缓冲区中已知行号的位置;0 表示未知。若为 −1,则只要窗口显示该缓冲区就不显示行号。

column_number_displayed

此窗口模式行中当前显示的列号;若不显示列号则为 −1。

current_matrix
desired_matrix

描述此窗口当前与目标显示状态的字形矩阵。