33.2 Изучение содержимого буфера

Этот раздел описывает функции, которые позволяют программе на Lisp преобразовывать любую часть текста в буфере в строку.

Функция: buffer-substring начало конец

Эта функция возвращает строку, содержащую копию текста области, определённой позициями начало и конец в текущем буфере. Если аргументы не являются позициями в доступной части буфера, buffer-substring сигнализирует об ошибке args-out-of-range.

Вот пример, в котором предполагается, что режим Font-Lock не включён:

---------- Буфер: foo ----------
Это содержимое буфера foo

---------- Буфер: foo ----------

(buffer-substring 1 10)
     ⇒ "Это соде"
(buffer-substring (point-max) 10)
     ⇒ "держимое буфера foo\n"

Если копируемый текст имеет какие-либо текстовые свойства, они копируются в строку вместе с символами, которым принадлежат. См. Текстовые свойства. Однако наложения (см. Наложения) в буфере и их свойства игнорируются и не копируются.

Например, если включён режим Font-Lock, вы можете получить результаты, подобные этим:

(buffer-substring 1 10)
     ⇒ #("Это соде" 0 1 (fontified t) 1 9 (fontified t))
Функция: buffer-substring-no-properties начало конец

Эта функция аналогична buffer-substring, за исключением того, что она не копирует текстовые свойства, а только сами символы. См. Текстовые свойства.

Функция: buffer-string

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

Если вам нужно гарантировать, что результирующая строка при копировании в другое место не изменит своего визуального отображения из-за переупорядочивания двунаправленного текста, используйте функцию buffer-substring-with-bidi-context (см. buffer-substring-with-bidi-context).

Функция: filter-buffer-substring начало конец &optional удалять

Эта функция фильтрует текст буфера между началом и концом с использованием функции, заданной переменной filter-buffer-substring-function, и возвращает результат.

Функция фильтра по умолчанию обращается к устаревшему обёрточному хуку filter-buffer-substring-functions (подробности об этом устаревшем средстве см. в строке документации макроса with-wrapper-hook). Если он равен nil, возвращается неизменённый текст из буфера, т.е. то, что вернул бы buffer-substring.

Если удалять не равен nil, функция удаляет текст между началом и концом после его копирования, как delete-and-extract-region.

Код на Lisp должен использовать эту функцию вместо buffer-substring, buffer-substring-no-properties или delete-and-extract-region при копировании в доступные пользователю структуры данных, такие как кольцо убиваний, буфер обмена X и регистры. Основные и второстепенные режимы могут изменять filter-buffer-substring-function, чтобы изменять такой текст при его копировании из буфера.

Переменная: filter-buffer-substring-function

Значение этой переменной — функция, которую filter-buffer-substring будет вызывать для выполнения фактической работы. Функция получает три аргумента, те же, что и у filter-buffer-substring, которые она должна обрабатывать в соответствии с документацией этой функции. Она должна возвращать отфильтрованный текст (и, опционально, удалять исходный текст).

Следующие две переменные устарели в пользу filter-buffer-substring-function, но всё ещё поддерживаются для обратной совместимости.

Переменная: filter-buffer-substring-functions

Эта устаревшая переменная является обёрточным хуком, члены которого должны быть функциями, принимающими четыре аргумента: fun, начало, конец и удалять. fun — это функция, принимающая три аргумента (начало, конец и удалять) и возвращающая строку. В обоих случаях аргументы начало, конец и удалять те же, что и у filter-buffer-substring.

Первая функция хука получает fun, эквивалентную операции по умолчанию для filter-buffer-substring, т.е. она возвращает подстроку буфера между началом и концом и, опционально, удаляет исходный текст из буфера. В большинстве случаев функция хука вызовет fun один раз, а затем выполнит собственную обработку результата. Следующая функция хука получает fun, эквивалентную этой, и так далее. Фактическое возвращаемое значение — это результат последовательного применения всех функций хука.

Функция: current-word &optional strict really-word

Эта функция возвращает символ (или слово) в точке или около неё в виде строки. Возвращаемое значение не содержит текстовых свойств.

Если необязательный аргумент really-word не равен nil, она находит слово; в противном случае она находит символ (который включает как символы слова, так и символы-составляющие символа).

Если необязательный аргумент strict не равен nil, то точка должна находиться в символе или слове или рядом с ним; если там нет символа или слова, функция возвращает nil. В противном случае допустим ближайший символ или слово на той же строке.

Функция: thing-at-point thing &optional no-properties

Возвращает thing (сущность) вокруг точки или рядом с ней в виде строки.

Аргумент thing — это символ, указывающий вид синтаксической сущности. Возможные значения включают symbol (символ), list (список), sexp (S-выражение), defun (определение функции), filename (имя файла), existing-filename (существующее имя файла), url (URL), word (слово), sentence (предложение), whitespace (пробельный символ), line (строка), page (страница), string (строка) и другие.

Когда необязательный аргумент no-properties не равен nil, эта функция удаляет текстовые свойства из возвращаемого значения.

---------- Буфер: foo ----------
Джентльмены могут кричать «Ми∗р! Мир!»,
но мира нет.
---------- Буфер: foo ----------

(thing-at-point 'word)
     ⇒ "Мир"
(thing-at-point 'line)
     ⇒ "Джентльмены могут кричать «Мир! Мир!»,\n"
(thing-at-point 'whitespace)
     ⇒ nil
Переменная: thing-at-point-provider-alist

Эта переменная позволяет пользователям и режимам настраивать работу thing-at-point. Это ассоциативный список из thing (сущностей) и функций (вызываемых без аргументов), возвращающих эту сущность. Записи для thing будут вычисляться по очереди, пока не будет возвращён результат, отличный от nil.

Например, основной режим мог бы сказать:

(setq-local thing-at-point-provider-alist
            (append thing-at-point-provider-alist
                    '((url . my-mode--url-at-point))))

Если ни один из поставщиков не вернул значение, отличное от nil, то thing будет вычислен стандартным способом.