yankとはkillリングからテキストを挿入しますが、それが単なる挿入ではないことを意味します。yank
とそれに関連するコマンドは、テキスト挿入前に特別な処理を施すためにinsert-for-yank
を使用します。
この関数はinsert
と同様に機能するが、結果をカレントバッファーに挿入する前にテキストプロパティyank-handler
、同様に変数yank-handled-properties
とyank-excluded-properties
に応じてstring内のテキストを処理する点が異なる。
stringを挿入する前にyank-transform-functions
(以下参照)が実行される。
この関数はinsert-buffer-substring
と似ているが、yank-handled-properties
とyank-excluded-properties
に応じてテキストを処理する点が異なる(これはyank-handler
プロパティを処理しないが、いずれにせよバッファー内のテキストでは通常は発生しない)。
文字列の一部またはすべてにテキストプロパティyank-handler
をputすると、insert-for-yank
が文字列を挿入する方法が変更されます。文字列の別の箇所が異なるyank-handler
の値をもつ場合(比較はeq
)、部分文字列はそれぞれ個別に処理されます。プロパティ値は以下の形式からなる1から4要素のリストでなければなりません(2番目以降の要素は省略可):
(function param noexclude undo)
これらの要素が何を行うかを以下に示します:
functionが非nil
なら、insert
のかわりに文字列を挿入するために、挿入する文字列を単一の引数として、その関数が呼び出される。
非nil
のparamが与えられた場合には、それはstring
(または処理されるstringの部分文字列)を置き換えるオブジェクトとしてfunction
(またはinsert
)に渡される。たとえばfunctionがyank-rectangle
なら、paramは矩形(rectangle)として挿入されるべき文字列のリスト。
非nil
のnoexcludeが与えられたら、挿入される文字列にたいするyank-handled-properties
とyank-excluded-properties
の通常の動作を無効にする。
非nil
のundoが与えられたら、それはカレントオブジェクトの挿入をundoするためにyank-pop
が呼び出す関数。この関数はカレントリージョンのstartとendという2つの引数で呼び出される。functionはyank-undo-function
をセットすることによりundoの値をオーバーライドできる。
この変数はyankされるテキストの状態を処理するスペシャルテキストプロパティを指定する。これは(通常の方法、またはyank-handler
を通じた)テキストの挿入後、yank-excluded-properties
が効力をもつ前に効果を発揮する。
値は要素が(prop
.
fun)
であるようなalistであること。alistの各要素は順番に処理される。挿入されるテキストはテキスト範囲にたいして、テキストプロパティがpropとeq
なものがスキャンされる。そのような範囲にたいしてプロパティの値、そのテキストの開始と終了の位置という3つの引数によりfunが呼び出される。
この変数の値は挿入されるテキストから削除するためのプロパティのリスト。デフォルト値にはマウスに応答したりキーバインディングの指定を引き起こすテキストのような、煩わしい結果をもたらすかもしれないプロパティが含まれる。これはyank-handled-properties
の後に効果を発揮する。
この変数は関数のリストである。関数はそれぞれyankする文字列を引数として(順番に)呼び出されて、(恐らくは変換後の)文字列をリターンすること。この変数をグローバルにセットすることもできるが、yank
の変種として新たなコマンドの作成にも用いることができる。たとえばyank
のように機能するが、挿入前に空白文字を整理するようなコマンドを作成するには以下のように記述すればよい:
(defun yank-with-clean-whitespace () (interactive) (let ((yank-transform-functions '(string-clean-whitespace))) (call-interactively #'yank)))