Внутреннее устройство буфера
Для представления буферов в C используются две структуры (см. buffer.h). Структура buffer_text содержит поля с описанием текста буфера; структура buffer содержит другие поля. В случае косвенных буферов две или более структур buffer ссылаются на одну и ту же структуру buffer_text.
Ниже перечислены некоторые поля структуры struct buffer_text:
beg-
Адрес содержимого буфера. Содержимое буфера представляет собой линейный массив C из элементов
char, где-то посередине которого находится промежуток. gptgpt_byte-
Позиции промежутка буфера в символах и байтах. См. Промежуток буфера.
zz_byte-
Позиции конца текста буфера в символах и байтах.
gap_size-
Размер промежутка буфера. См. Промежуток буфера.
modiffsave_modiffchars_modiffoverlay_modiff-
Эти поля подсчитывают количество событий изменения буфера, произошедших в этом буфере. Значение
modiffувеличивается после каждого события изменения буфера и больше никогда не меняется;save_modiffсодержит значениеmodiffна момент последнего обращения к буферу или его сохранения;chars_modiffучитывает только изменения символов в буфере, игнорируя все остальные виды изменений (например, свойств текста); аoverlay_modiffучитывает только изменения наложений буфера. beg_unchangedend_unchanged-
Количество символов в начале и конце текста, которые, как известно, не изменялись с момента последней полной перерисовки.
unchanged_modifiedoverlay_unchanged_modified-
Значения
modiffиoverlay_modiffсоответственно после последней полной перерисовки. Если их текущие значения совпадают сmodiffилиoverlay_modiff, это означает, чтоbeg_unchangedиend_unchangedне содержат полезной информации. markers-
Маркеры, ссылающиеся на этот буфер. Фактически это один маркер, а следующие элементы его маркерной цепочки (связного списка) — другие маркеры, ссылающиеся на текст этого буфера.
intervalsИнтервальное дерево, в котором записаны свойства текста этого буфера.
Некоторые поля структуры struct buffer:
header-
Заголовок типа
union vectorlike_headerявляется общим для всех вектороподобных объектов. own_text-
Структура
struct buffer_text, в которой обычно хранится содержимое буфера. В косвенных буферах это поле не используется. text-
Указатель на структуру
buffer_textэтого буфера. В обычном буфере это полеown_text, указанное выше. В косвенном буфере это полеown_textбазового буфера. next-
Указатель на следующий буфер в цепочке всех буферов, включая уничтоженные. Эта цепочка используется только для выделения памяти и сборки мусора, чтобы корректно собирать уничтоженные буферы.
ptpt_byte-
Позиции точки в буфере в символах и байтах.
begvbegv_byte-
Позиции начала доступного диапазона текста в буфере в символах и байтах.
zvzv_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-
Размер файла, который посещает этот буфер, при последнем чтении или сохранении. Возможны два особых значения: −1 означает, что в этом буфере отключено автосохранение, а −2 — что автосохранение не следует отключать, если текст буфера значительно уменьшится. Это и другие поля, относящиеся к сохранению, не хранятся в структуре
buffer_text, поскольку косвенные буферы никогда не сохраняются. directory-
Каталог, используемый для раскрытия относительных имен файлов. Это значение локальной для буфера переменной
default-directory(см. Функции раскрытия имен файлов). filename-
Имя файла, посещаемого этим буфером, или
nil. Это значение локальной для буфера переменнойbuffer-file-name(см. Имя файла буфера). undo_listbacked_upauto_save_file_nameauto_save_file_formatread_onlyfile_formatfile_truenameinvisibility_specdisplay_countdisplay_time-
В этих полях хранятся значения переменных Lisp, которые автоматически становятся локальными для буфера (см. Переменные, локальные для буфера); соответствующие имена переменных имеют дополнительный префикс
buffer-, а символы подчёркивания заменены дефисами. Например, вundo_listхранится значениеbuffer-undo-list. mark-
Пометка буфера. Пометка является маркером, поэтому она также включена в список
markers. См. Пометка. local_var_alist-
Ассоциативный список, описывающий привязки локальных для буфера переменных этого буфера, за исключением встроенных привязок, для которых в объекте буфера предусмотрены специальные слоты. (Эти слоты в таблице не указаны.) См. Переменные, локальные для буфера.
major_mode-
Символ с именем основного режима этого буфера, например
lisp-mode. mode_name-
Понятное имя основного режима, например
"Lisp". keymapabbrev_tablesyntax_tablecategory_tabledisplay_table-
В этих полях хранятся локальная карта клавиш буфера (см. Карты клавиш), таблица сокращений (см. Таблицы сокращений), таблица синтаксиса (см. Таблицы синтаксиса), таблица категорий (см. Категории) и таблица отображения (см. Таблицы отображения) буфера.
downcase_tableupcase_tablecase_canon_table-
В этих полях хранятся таблицы преобразования текста в нижний и верхний регистр, а также канонизации текста для поиска без учёта регистра. См. Таблица регистра.
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, которые автоматически становятся локальными для буфера (см. Переменные, локальные для буфера); в соответствующих именах переменных символы подчёркивания заменены дефисами. Например, в
mode_line_formatхранится значениеmode-line-format. overlays-
Интервальное дерево, содержащее наложения этого буфера.
last_selected_windowПоследнее окно, выбранное с этим буфером, или
nil, если это окно больше не отображает данный буфер.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-Internals.html