Next: , Previous: , Up: killリング   [Contents][Index]


33.8.3 yank

yankとはkillリングからテキストを挿入しますが、それが単なる挿入ではないことを意味します。yankとそれに関連するコマンドは、テキスト挿入前に特別な処理を施すためにinsert-for-yankを使用します。

Function: insert-for-yank string

この関数はinsertと同様に機能するが、結果をカレントバッファーに挿入する前にテキストプロパティyank-handler、同様に変数yank-handled-propertiesyank-excluded-propertiesに応じてstring内のテキストを処理する点が異なる。

stringを挿入する前にyank-transform-functions (以下参照)が実行される。

Function: insert-buffer-substring-as-yank buf &optional start end

この関数はinsert-buffer-substringと似ているが、yank-handled-propertiesyank-excluded-propertiesに応じてテキストを処理する点が異なる(これはyank-handlerプロパティを処理しないが、いずれにせよバッファー内のテキストでは通常は発生しない)。

文字列の一部またはすべてにテキストプロパティyank-handlerをputすると、insert-for-yankが文字列を挿入する方法が変更されます。文字列の別の箇所が異なるyank-handlerの値をもつ場合(比較はeq)、部分文字列はそれぞれ個別に処理されます。プロパティ値は以下の形式からなる1から4要素のリストでなければなりません(2番目以降の要素は省略可):

(function param noexclude undo)

これらの要素が何を行うかを以下に示します:

function

functionが非nilなら、insertのかわりに文字列を挿入するために、挿入する文字列を単一の引数として、その関数が呼び出される。

param

nilparamが与えられた場合には、それはstring (または処理されるstringの部分文字列)を置き換えるオブジェクトとしてfunction (またはinsert)に渡される。たとえばfunctionyank-rectangleなら、paramは矩形(rectangle)として挿入されるべき文字列のリスト。

noexclude

nilnoexcludeが与えられたら、挿入される文字列にたいするyank-handled-propertiesyank-excluded-propertiesの通常の動作を無効にする。

undo

nilundoが与えられたら、それはカレントオブジェクトの挿入をundoするためにyank-popが呼び出す関数。この関数はカレントリージョンのstartとendという2つの引数で呼び出される。functionyank-undo-functionをセットすることによりundoの値をオーバーライドできる。

User Option: yank-handled-properties

この変数はyankされるテキストの状態を処理するスペシャルテキストプロパティを指定する。これは(通常の方法、またはyank-handlerを通じた)テキストの挿入後、yank-excluded-propertiesが効力をもつ前に効果を発揮する。

値は要素が(prop . fun)であるようなalistであること。alistの各要素は順番に処理される。挿入されるテキストはテキスト範囲にたいして、テキストプロパティがpropeqなものがスキャンされる。そのような範囲にたいしてプロパティの値、そのテキストの開始と終了の位置という3つの引数によりfunが呼び出される。

User Option: yank-excluded-properties

この変数の値は挿入されるテキストから削除するためのプロパティのリスト。デフォルト値にはマウスに応答したりキーバインディングの指定を引き起こすテキストのような、煩わしい結果をもたらすかもしれないプロパティが含まれる。これはyank-handled-propertiesの後に効果を発揮する。

Variable: yank-transform-functions

この変数は関数のリストである。関数はそれぞれyankする文字列を引数として(順番に)呼び出されて、(恐らくは変換後の)文字列をリターンすること。この変数をグローバルにセットすることもできるが、yankの変種として新たなコマンドの作成にも用いることができる。たとえばyankのように機能するが、挿入前に空白文字を整理するようなコマンドを作成するには以下のように記述すればよい:

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