Внутреннее представление буфера
Для представления буферов на 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-
В косвенном буфере указывает на базовый буфер. В обычном буфере равно нулю.
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(см. Текущий буфер). overlay_center-
Это поле содержит текущую позицию центра наложения. См. Управление наложениями.
overlays_beforeoverlays_after-
Эти поля содержат соответственно список наложений, которые заканчиваются или до текущего центра наложения, и список наложений, которые заканчиваются после текущего центра наложения. См. Управление наложениями.
overlays_beforeотсортирован в порядке убывания конечной позиции, аoverlays_after— в порядке возрастания начальной позиции. 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_formatcase_fold_searchtab_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. last_selected_windowЭто последнее окно, которое было выбрано с этим буфером в нём, или
nil, если это окно больше не отображает этот буфер.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-Internals.html