33.19.9 Определение и использование полей

Поле — это диапазон последовательных символов в буфере, которые идентифицируются по одинаковому значению (при сравнении через eq) свойства field (либо текстового свойства, либо свойства наложения). Этот раздел описывает специальные функции, доступные для работы с полями.

Вы задаёте поле позицией в буфере pos. Мы считаем, что каждое поле содержит диапазон позиций буфера, поэтому указанная позиция обозначает поле, содержащее эту позицию.

Когда символы до и после pos принадлежат одному и тому же полю, не возникает сомнений, какому полю принадлежит pos: тому, которому принадлежат оба этих символа. Когда pos находится на границе между полями, то, какому полю она принадлежит, зависит от липкости свойств field двух окружающих символов (см. Липкость текстовых свойств). Поле, свойство которого унаследовал бы текст, вставленный в pos, является полем, содержащим pos.

Существует аномальный случай, когда вновь вставленный текст в pos не унаследовал бы свойство field ни с одной из сторон. Это происходит, если свойство field предыдущего символа не является задне-липким, а свойство field следующего символа не является передне-липким. В этом случае pos не принадлежит ни предыдущему полю, ни следующему; функции полей обрабатывают его как принадлежащий пустому полю, начало и конец которого находятся в pos.

Во всех этих функциях, если pos опущен или равен nil, по умолчанию используется значение точки. Если действует сужение, то pos должно находиться в доступной части. См. Сужение.

Функция: field-beginning &optional pos escape-from-edge limit

Эта функция возвращает начало поля, заданного pos.

Если pos находится в начале своего поля и escape-from-edge не равен nil, то возвращаемое значение всегда является началом предыдущего поля, которое заканчивается в pos, независимо от липкости свойств field вокруг pos.

Если limit не равен nil, это позиция в буфере; если начало поля находится перед limit, то вместо него возвращается limit.

Функция: field-end &optional pos escape-from-edge limit

Эта функция возвращает конец поля, заданного pos.

Если pos находится в конце своего поля и escape-from-edge не равен nil, то возвращаемое значение всегда является концом следующего поля, которое начинается в pos, независимо от липкости свойств field вокруг pos.

Если limit не равен nil, это позиция в буфере; если конец поля находится после limit, то вместо него возвращается limit.

Функция: field-string &optional pos

Эта функция возвращает содержимое поля, заданного pos, в виде строки.

Функция: field-string-no-properties &optional pos

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

Функция: delete-field &optional pos

Эта функция удаляет текст поля, заданного pos.

Функция: constrain-to-field new-pos old-pos &optional escape-from-edge only-in-line inhibit-capture-property

Эта функция ограничивает new-pos полем, которому принадлежит old-pos — иными словами, она возвращает позицию, ближайшую к new-pos, которая находится в том же поле, что и old-pos.

Если new-pos равен nil, то constrain-to-field использует вместо него значение точки и перемещает точку в результирующую позицию в дополнение к возврату этой позиции.

Если old-pos находится на границе двух полей, то допустимые конечные позиции зависят от аргумента escape-from-edge. Если escape-from-edge равен nil, то new-pos должен находиться в поле, чьё свойство field равно тому, которое унаследовали бы новые символы, вставленные в old-pos. (Это зависит от липкости свойства field для символов до и после old-pos.) Если escape-from-edge не равен nil, new-pos может находиться в любом месте двух соседних полей. Кроме того, если два поля разделены другим полем со специальным значением boundary, то любая точка внутри этого специального поля также считается находящейся на границе.

Команды, подобные C-a без аргумента, которые обычно перемещаются назад к определённому виду позиции и остаются там, оказавшись там, вероятно, должны указывать nil для escape-from-edge. Другие команды перемещения, которые проверяют поля, вероятно, должны передавать t.

Если необязательный аргумент only-in-line не равен nil, и ограничение new-pos обычным способом переместило бы его на другую строку, то new-pos возвращается без ограничений. Это используется в командах, которые перемещаются по строкам, таких как next-line и beginning-of-line, чтобы они учитывали границы полей только в том случае, когда они всё ещё могут переместиться на нужную строку.

Если необязательный аргумент inhibit-capture-property не равен nil, и old-pos имеет ненулевое свойство с таким именем, то любые границы полей игнорируются.

Вы можете заставить constrain-to-field игнорировать все границы полей (и, следовательно, никогда ничего не ограничивать), привязав переменную inhibit-field-text-motion к ненулевому значению.