33.8.3 Вставка

Вставка означает вставку текста из кольца удаления, но она не вставляет текст слепо. Команда yank и связанные с ней команды используют insert-for-yank для выполнения специальной обработки текста перед его вставкой.

Функция: insert-for-yank string

Эта функция работает как insert, за исключением того, что она обрабатывает текст в string в соответствии с свойством текста yank-handler, а также переменными yank-handled-properties и yank-excluded-properties (см. ниже), прежде чем вставить результат в текущий буфер.

string будет обработана через yank-transform-functions (см. ниже) перед вставкой.

Функция: insert-buffer-substring-as-yank buf &optional start end

Эта функция похожа на insert-buffer-substring, за исключением того, что она обрабатывает текст в соответствии с yank-handled-properties и yank-excluded-properties. (Она не обрабатывает свойство yank-handler, которое обычно не встречается в тексте буфера.)

Если вы присваиваете свойство текста yank-handler всему или части строки, это изменяет то, как insert-for-yank вставляет строку. Если разные части строки имеют разные значения yank-handler (сравнение выполняется с помощью eq), каждая подстрока обрабатывается отдельно. Значение свойства должно быть списком из одной-четырех элементов, с следующим форматом (элементы после первого могут быть опущены):

(function param noexclude undo)

Вот что делают элементы:

function

Когда function не равна nil, она вызывается вместо insert для вставки строки, с одним аргументом — строкой для вставки.

param

Если param присутствует и не равен nil, он заменяет string (или подстроку string, обрабатываемую) в качестве объекта, передаваемого в function (или insert). Например, если function — это yank-rectangle, param должен быть списком строк для вставки в виде прямоугольника.

noexclude

Если noexclude присутствует и не равен nil, это отключает нормальное действие yank-handled-properties и yank-excluded-properties в вставляемой строке.

undo

Если undo присутствует и не равен nil, это функция, которая будет вызвана yank-pop для отмены вставки текущего объекта. Она вызывается с двумя аргументами — началом и концом текущего региона. function может установить yank-undo-function, чтобы переопределить значение undo.

Пользовательский вариант: yank-handled-properties

Эта переменная определяет специальные условия обработки свойств текста для вставленного текста. Она вступает в силу после того, как текст был вставлен (нормально или через свойство yank-handler), и до того, как вступят в силу yank-excluded-properties.

Значение должно быть alist элементов (prop . fun). Каждый элемент alist обрабатывается по порядку. Вставленный текст сканируется на предмет участков текста, имеющих свойства текста, равные prop; для каждого такого участка вызывается fun с тремя аргументами: значение свойства, а также начальная и конечная позиции текста.

Пользовательский вариант: yank-excluded-properties

Значение этой переменной — это список свойств, которые удаляются из вставленного текста. Ее значение по умолчанию содержит свойства, которые могут привести к раздражающим результатам, например, заставлять текст реагировать на мышь или указывать привязки клавиш. Она вступает в силу после yank-handled-properties.

Переменная: yank-transform-functions

Эта переменная является списком функций. Каждая функция вызывается (по порядку) со строкой, которую нужно вставить, в качестве аргумента, и должна вернуть (возможно, преобразованную) строку. Эту переменную можно установить глобально, но ее также можно использовать для создания новых команд, которые являются вариациями yank. Например, чтобы создать команду, которая работает как yank, но очищает пробелы перед вставкой, можно написать что-то вроде:

(defun yank-with-clean-whitespace ()
  (interactive)
  (let ((yank-transform-functions
	 '(string-clean-whitespace)))
    (call-interactively #'yank)))