current-kill ¶ の本文関数定義の本体はlet式であり、この式自体も本体とvarlistを持っています。
let という式は、この関数の範囲内でのみ使用可能な変数を宣言します。この変数は interprogram-paste と呼ばれ、別のプログラムへコピーするためのものです。この GNU
Emacs
のインスタンス内でコピーするためのものではありません。ほとんどのウィンドウシステムには、プログラム間での貼り付け機能が備わっています。残念ながら、その機能は通常、最後の要素に対してのみ提供されています。Emacs
が数十年にわたって提供してきたにもかかわらず、ほとんどのウィンドウシステムは、多様な選択肢を備えたリング方式を採用していません。
if 式は、interprogram-paste
が存在する場合と存在しない場合の2つの部分から構成されています。
current-kill 関数の else 部分について考えてみましょう。(then
部分では、すでに説明した kill-new 関数を使用しています。kill-new
関数を参照してください。)
(or kill-ring (error "Kill ring is empty"))
(let ((ARGth-kill-element
(nthcdr (mod (- n (length kill-ring-yank-pointer))
(length kill-ring))
kill-ring)))
(or do-not-move
(setq kill-ring-yank-pointer ARGth-kill-element))
(car ARGth-kill-element))
コードはまず、キルリングに内容があるかを確認し、ない場合はエラーを通知します。
なお、or 式は、if
で長さを判定する場合と非常によく似ています。
(if (zerop (length kill-ring)) ; if-part (error "Kill ring is empty")) ; then-part ;; No else-part
キルリングに何も入っていない場合、その長さは0でなければならず、ユーザーにエラーメッセージ ‘Kill
ring is empty’ が送信されます。current-kill
関数では、よりシンプルな or 式が使用されています。しかし、if 式を見れば、どのような処理が行われているかが分かります。
この if 式は、判定対象の値が 0 の場合に true を返す関数 zerop を使用しています。zerop が true
と判定されると、if の then 部分が評価されます。then 部分は関数 error から始まるリストであり、この関数はエコー領域に1行のメッセージを出力するという点で message 関数(message 関数 を参照)に似ています。ただし、error
はメッセージを出力するだけでなく、自身が埋め込まれている関数の評価も停止させます。つまり、キルリングの長さが 0
の場合、その関数の残りの部分は評価されません。
次に、current-kill関数が返す要素を選択します。選択は、current-killが回転する箇所の数と、kill-ring-yank-pointerが指す位置によって決まります。
次に、オプションの do-not-move 引数が true であるか、あるいは kill-ring-yank-pointer
の現在の値がリストを指すように設定されています。最後に、別の式によって、do-not-move
引数が true であってもリストの最初の要素が返されます。