Для представления буферов в C используются две структуры (см. buffer.h). Структура buffer_text содержит поля, описывающие текст буфера; структура buffer хранит другие поля. В случае непрямых буферов две или более структур buffer ссылаются на одну и ту же структуру buffer_text.
Вот некоторые из полей в struct buffer_text:
begАдрес содержимого буфера. Содержимое буфера — это линейный массив char в C, с пробелом где-то посередине.
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Маркеры, ссылающиеся на этот буфер. По сути, это один маркер, и последовательные элементы в его цепочке маркеров chain (связный список) — это другие маркеры, ссылающиеся на этот текст буфера.
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Длина файла, который посещает этот буфер, когда он был в последний раз прочитан или сохранен. Он может иметь 2 специальных значения: -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, если это окно больше не отображает этот буфер.