last-command と this-command ¶通常、関数が実行されるたびに、Emacsはthis-commandの値を実行中の関数(この場合はcopy-region-as-kill)に設定します。同時に、Emacsはlast-commandの値をthis-commandの直前の値に設定します。
copy-region-as-kill 関数の本体の前半部分では、if 式によって last-command の値が
kill-region であるかどうかが判定されます。そうであれば、if 式の then 部分が評価されます。この部分では kill-append
関数を用いて、今回の関数呼び出し時にコピーされたテキストと、キルリングの最初の要素(CAR)に既に含まれているテキストを連結します。一方、last-command の値が kill-region
でない場合は、copy-region-as-kill 関数が kill-new 関数を用いてキルリングに新しい要素を追加します。
if 式は次のように記述され、eq
を使用します:
(if (eq last-command 'kill-region)
;; then-part
(kill-append (filter-buffer-substring beg end) (< end beg))
;; else-part
(kill-new (filter-buffer-substring beg end)))
(filter-buffer-substring
関数は、バッファのフィルタリング済み部分文字列が存在する場合にそれを返します。オプションとして—ここでは引数が記載されていないため、いずれも実行されません—この関数は、先頭のテキストを削除したり、プロパティを除いたテキストを返したりすることもできます。この関数は、テキストプロパティが実装される前に提供されていた旧来の
buffer-substring 関数の後継です。)
eq 関数は、第1引数が第2引数と同じ Lisp オブジェクトであるかどうかを判定します。eq 関数は、等価性を判定するという点で equal
関数と似ていますが、コンピュータ内部では2つの表現が実際には同一のオブジェクトであり、単に名前が異なるだけであるかどうかを判定する点が異なります。equal は、2つの式の構造と内容が同一であるかどうかを判定します。
直前のコマンドが kill-region だった場合、Emacs Lisp インタプリタは
kill-append 関数を呼び出します。