Yankingとは、キルリングからテキストを挿入することを指しますが、単にテキストを挿入するわけではありません。yankコマンドおよび関連コマンドでは、insert-for-yankを用いて、挿入前にテキストに対して特殊な処理を行います。
この関数は insert と同様に動作しますが、結果を現在のバッファに挿入する前に、string 内のテキストを yank-handler
テキストプロパティおよび変数 yank-handled-properties と yank-excluded-properties(後述)に従って処理します。
string は、挿入前に yank-transform-functions (後述)を通過します。
この関数は insert-buffer-substring に似ていますが、テキストを yank-handled-properties および yank-excluded-properties に従って処理する点が異なります。(yank-handler プロパティは扱いませんが、そもそもバッファテキストに通常現れることはありません。)
文字列の全部または一部に yank-handler テキストプロパティを指定すると、insert-for-yank による文字列の挿入方法が変更されます。文字列の異なる箇所で異なる yank-handler 値が指定されている場合(比較は eq
を用いて行われます)、各部分文字列は個別に処理されます。プロパティの値は、以下の形式による1〜4個の要素からなるリストである必要があります(最初の要素以降の要素は省略可能です):
(function param noexclude undo)
各要素の動作は以下の通りです。
function が nil
ではない場合、文字列を挿入するために insert
の代わりに呼び出され、挿入する文字列という1つの引数が渡されます。
param が存在し、かつ nil でない場合、それは
function(または insert)に渡されるオブジェクトとして、string(または処理中の string
の部分文字列)を置き換えます。例えば、function が yank-rectangle である場合、param
は矩形として挿入する文字列のリストである必要があります。
noexclude が存在し、かつ nil
でない場合、挿入された文字列に対する yank-handled-properties および
yank-excluded-properties の通常の動作が無効になります。
undo が存在し、かつ nil ではない場合、それは
yank-pop
によって呼び出され、現在のオブジェクトの挿入を取り消す関数となります。この関数には、現在の領域の開始位置と終了位置という2つの引数が渡されます。function は、undo の値を上書きするように yank-undo-function を設定できます。
この変数は、ヤンクされたテキストに対する特殊なテキストプロパティ処理条件を指定します。テキストが挿入された後(通常の挿入、またはyank-handlerプロパティ経由)、かつyank-excluded-propertiesが効力を発揮する前に適用されます。
値は要素 (prop . fun)
のアリストである必要があります。各アリスト要素は順に処理されます。挿入されたテキストから、テキストプロパティ eq から prop
を持つテキストの連続箇所がスキャンされ、そのような連続箇所ごとに、プロパティの値、およびテキストの開始位置と終了位置の3つの引数を用いて fun が呼び出されます。
この変数の値は、挿入テキストから削除するプロパティのリストです。デフォルト値には、テキストをマウスに反応させたりキーバインドを指定したりするなど、不都合な結果を招く可能性のあるプロパティが含まれています。yank-handled-properties の後に適用されます。
この変数は関数のリストです。各関数は、ヤンク対象の文字列を引数として(順に)呼び出され、(場合によっては変換された)文字列を返す必要があります。この変数はグローバルに設定できるほか、yank のバリエーションとなる新しいコマンドを作成する際にも利用できます。例えば、yank と同様に動作しつつ、挿入前に空白文字を除去するコマンドを作成するには、次のように記述できます。
(defun yank-with-clean-whitespace ()
(interactive)
(let ((yank-transform-functions
'(string-clean-whitespace)))
(call-interactively #'yank)))