E.9.1 Внутреннее устройство буфера

Для представления буферов в C используются две структуры (см. buffer.h). Структура buffer_text содержит поля, описывающие текст буфера; структура buffer хранит другие поля. В случае непрямых буферов две или более структур buffer ссылаются на одну и ту же структуру buffer_text.

Вот некоторые из полей в struct buffer_text:

beg

Адрес содержимого буфера. Содержимое буфера — это линейный массив char в C, с пробелом где-то посередине.

gpt
gpt_byte

Позиции символа и байта пробела в буфере. См. Пробел буфера.

z
z_byte

Позиции символа и байта конца текста буфера.

gap_size

Размер пробела буфера. См. Пробел буфера.

modiff
save_modiff
chars_modiff
overlay_modiff

Эти поля подсчитывают количество событий модификации буфера, выполненных в этом буфере. modiff увеличивается после каждого события модификации буфера и никогда не изменяется иначе; save_modiff содержит значение modiff в последний раз, когда буфер был посещен или сохранен; chars_modiff подсчитывает только модификации символов в буфере, игнорируя все другие виды изменений (например, свойства текста); а overlay_modiff подсчитывает только модификации оверлеев буфера.

beg_unchanged
end_unchanged

Количество символов в начале и конце текста, которые известны как неизмененные с момента последнего полного повторного отображения.

unchanged_modified
overlay_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

Указатель на следующий буфер в цепочке всех буферов, включая убитые буферы. Эта цепочка используется только для выделения памяти и сборки мусора, чтобы правильно собирать убитые буферы.

pt
pt_byte

Позиции символа и байта точки в буфере.

begv
begv_byte

Позиции символа и байта начала доступного диапазона текста в буфере.

zv
zv_byte

Позиции символа и байта конца доступного диапазона текста в буфере.

base_buffer

В непрямом буфере это указывает на базовый буфер. В обычном буфере это null.

local_flags

Это поле содержит флаги, указывающие, что определенные переменные являются локальными в этом буфере. Такие переменные объявляются в коде C с помощью DEFVAR_PER_BUFFER, и их локальные для буфера привязки хранятся в полях самой структуры буфера. (Некоторые из этих полей описаны в этой таблице.)

modtime

Время модификации посещаемого файла. Оно устанавливается при записи или чтении файла. Перед записью буфера в файл это поле сравнивается со временем модификации файла, чтобы проверить, не изменился ли файл на диске. См. Модификация буфера.

auto_save_modified

Время, когда буфер был в последний раз автоматически сохранен.

last_window_start

Позиция window-start в буфере на момент последнего отображения буфера в окне.

clip_changed

Этот флаг указывает, что сужение изменилось в буфере. См. Сужение.

prevent_redisplay_optimizations_p

Этот флаг указывает, что оптимизации повторного отображения не должны использоваться для отображения этого буфера.

inhibit_buffer_hooks

Этот флаг указывает, что буфер не должен выполнять хуки kill-buffer-hook, kill-buffer-query-functions (см. Убийство буферов) и buffer-list-update-hook (см. Список буферов). Он устанавливается при создании буфера (см. Создание буферов) и предотвращает замедление внутренних или временных буферов, таких как те, что создаются с помощью with-temp-buffer (см. Текущий буфер).

name

Строка Lisp, называющая буфер. Она гарантированно уникальна. См. Имена буферов. Это и следующие поля имеют свои имена в определении структуры C, оканчивающиеся на _, чтобы указать, что к ним нельзя обращаться напрямую, а только через макрос BVAR, как здесь:

  Lisp_Object buf_name = BVAR (buffer, name);
save_length

Длина файла, который посещает этот буфер, когда он был в последний раз прочитан или сохранен. Он может иметь 2 специальных значения: -1 означает, что автоматическое сохранение было отключено в этом буфере, а -2 означает, что не следует отключать автоматическое сохранение, если текст буфера сильно уменьшился. Это и другие поля, связанные с сохранением, не хранятся в структуре buffer_text, потому что непрямые буферы никогда не сохраняются.

directory

Директория для расширения относительных имен файлов. Это значение буферной локальной переменной default-directory (см. Функции расширения имен файлов).

filename

Имя файла, посещаемого в этом буфере, или nil. Это значение буферной локальной переменной buffer-file-name (см. Имя файла буфера).

undo_list
backed_up
auto_save_file_name
auto_save_file_format
read_only
file_format
file_truename
invisibility_spec
display_count
display_time

Эти поля хранят значения переменных Lisp, которые автоматически являются локальными для буфера (см. Локальные переменные буфера), чьи соответствующие имена переменных имеют дополнительный префикс buffer- и где подчеркивания заменены дефисами. Например, undo_list хранит значение buffer-undo-list.

mark

Маркер для буфера. Маркер — это маркер, поэтому он также включен в список markers. См. Маркер.

local_var_alist

Список ассоциаций, описывающий привязки локальных для буфера переменных этого буфера, не включая встроенные локальные для буфера привязки, имеющие специальные слоты в объекте буфера. (Эти слоты опущены из этой таблицы.) См. Локальные переменные буфера.

major_mode

Символ, называющий основной режим этого буфера, например, lisp-mode.

mode_name

Красивое имя основного режима, например, "Lisp".

keymap
abbrev_table
syntax_table
category_table
display_table

Эти поля хранят локальный для буфера ключ-мап (см. Ключ-мапы), таблицу сокращений (см. Таблицы сокращений), таблицу синтаксиса (см. Таблицы синтаксиса), таблицу категорий (см. Категории) и таблицу отображения (см. Таблицы отображения).

downcase_table
upcase_table
case_canon_table

Эти поля хранят таблицы преобразования для преобразования текста в нижний и верхний регистр, а также для канонизации текста для поиска по регистру. См. Таблица регистров.

minor_modes

Список мелких режимов этого буфера.

pt_marker
begv_marker
zv_marker

Эти поля используются только в непрямом буфере или в буфере, который является базой непрямого буфера. Каждое из них содержит маркер, который регистрирует pt, begv и zv соответственно, для этого буфера, когда буфер не является текущим.

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, которые автоматически являются локальными для буфера (см. Локальные переменные буфера), чьи соответствующие имена переменных имеют подчеркивания, замененные дефисами. Например, mode_line_format хранит значение mode-line-format.

overlays

Дерево интервалов, содержащее оверлеи этого буфера.

last_selected_window

Это последнее окно, в котором был выбран этот буфер, или nil, если это окно больше не отображает этот буфер.