Spec-Zone.ru › Elisp

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

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

Ниже перечислены некоторые поля структуры struct buffer_text:

beg

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

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

Маркеры, ссылающиеся на этот буфер. Фактически это один маркер, а следующие элементы его маркерной цепочки (связного списка) — другие маркеры, ссылающиеся на текст этого буфера.

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

Размер файла, который посещает этот буфер, при последнем чтении или сохранении. Возможны два особых значения: −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, если это окно больше не отображает данный буфер.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API