GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/Body-of-current_002dkill.html ・ emacs-doc.conao3.com

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 であってもリストの最初の要素が返されます。