Поле — это диапазон последовательных символов в буфере, которые идентифицируются
по одинаковому значению (при сравнении через eq) свойства
field (либо текстового свойства, либо свойства наложения).
Этот раздел описывает специальные функции, доступные для работы с полями.
Вы задаёте поле позицией в буфере pos. Мы считаем, что каждое поле содержит диапазон позиций буфера, поэтому указанная позиция обозначает поле, содержащее эту позицию.
Когда символы до и после pos принадлежат одному и тому же полю,
не возникает сомнений, какому полю принадлежит pos: тому, которому
принадлежат оба этих символа. Когда pos находится на границе между
полями, то, какому полю она принадлежит, зависит от липкости свойств
field двух окружающих символов (см. Липкость текстовых свойств).
Поле, свойство которого унаследовал бы текст, вставленный в pos,
является полем, содержащим pos.
Существует аномальный случай, когда вновь вставленный текст в pos
не унаследовал бы свойство field ни с одной из сторон. Это происходит,
если свойство field предыдущего символа не является задне-липким,
а свойство field следующего символа не является передне-липким.
В этом случае pos не принадлежит ни предыдущему полю, ни следующему;
функции полей обрабатывают его как принадлежащий пустому полю, начало и конец
которого находятся в pos.
Во всех этих функциях, если pos опущен или равен nil,
по умолчанию используется значение точки. Если действует сужение,
то pos должно находиться в доступной части. См. Сужение.
Эта функция возвращает начало поля, заданного pos.
Если pos находится в начале своего поля и
escape-from-edge не равен nil, то возвращаемое значение
всегда является началом предыдущего поля, которое заканчивается
в pos, независимо от липкости свойств field вокруг pos.
Если limit не равен nil, это позиция в буфере; если начало
поля находится перед limit, то вместо него возвращается limit.
Эта функция возвращает конец поля, заданного pos.
Если pos находится в конце своего поля и escape-from-edge
не равен nil, то возвращаемое значение всегда является концом
следующего поля, которое начинается в pos, независимо от
липкости свойств field вокруг pos.
Если limit не равен nil, это позиция в буфере; если конец
поля находится после limit, то вместо него возвращается limit.
Эта функция возвращает содержимое поля, заданного pos, в виде строки.
Эта функция возвращает содержимое поля, заданного pos, в виде строки, отбрасывая текстовые свойства.
Эта функция удаляет текст поля, заданного pos.
Эта функция ограничивает 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 к ненулевому значению.