[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
GNU Emacsで「キル」コマンドでバッファからテキストを切り取ったときには、 「ヤンク」コマンドでそのテキストを取り出せる。 バッファから切り取ったテキストはキルリングに保存され、 ヤンクコマンドはキルリングの適当な内容をバッファに挿入する (同じバッファである必要はない)。
簡単なコマンドC-y(yank
)では、キルリングの先頭要素を カレントバッファに挿入する。 C-yの直後にM-yを続けると、先頭要素を2番目の要素で置き換える。 さらにM-yを続けると、2番目の要素を3番目の要素で、4番目の要素で、 5番目の要素で置き換えるというようになる。 キルリングの最後の要素に達した場合には、一巡して先頭要素で置き換える (これが、キルリングを「リスト」とは呼ばずに「リング」と呼ぶ理由である。 しかし、テキストを保持する実際のデータ構造はリストである。 リストをリングとして扱う方法の詳細は、See 節 B. キルリングの扱い方)。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
キルリングは、文字列のリストである。 これはつぎのようになっている。
("some text" "a different piece of text" "yet more text") |
これが筆者のキルリングの内容であったとすると、 C-yとタイプするとカレントバッファのカーソル位置に文字列`some text'が 挿入される。
コマンドyank
は、コピーしてテキストを複製するためにも使える。 コピーしたテキストはバッファからは切り取られずに、 そのコピーがキルリングに置かれ、ヤンクすると挿入できる。
キルリングからテキストを取り出すには3つの関数が使われる。 C-yにバインドされたyank
、 M-yにバインドされた yank-pop
、 これら2つの関数が使うrotate-yank-pointer
である。
これらの関数は、変数kill-ring-yank-pointer
を介してキルリングを参照する。 関数yank
とyank-pop
の挿入を行うコードはつぎのとおりである。
(insert (car kill-ring-yank-pointer)) |
yank
とyank-pop
がどのように動作するかを理解するには、 まず、変数kill-ring-yank-pointer
と関数rotate-yank-pointer
を 説明しておく必要がある。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
kill-ring-yank-pointer
kill-ring-yank-pointer
"へのコメント(無し)
kill-ring-yank-pointer
は、変数kill-ring
と同じように、変数である。 他のLisp変数のように、それが指す値に束縛することで何かを指している。
したがって、キルリングの値がつぎのとおりであり、
("some text" "a different piece of text" "yet more text") |
また、kill-ring-yank-pointer
が2番目の語句を指していれば、 kill-ring-yank-pointer
の値はつぎのようになる。
("a different piece of text" "yet more text") |
前章で説明したように(see 節 9. リストの実装方法)、 kill-ring
とkill-ring-yank-pointer
とが指すテキストのコピーは、 別々にコンピュータが保持するのではない。 「a different piece of text」や「yet more text」の語句は、複製されない。 かわりに、2つのLisp変数はテキストの同じ断片を指す。 図示するとつぎのようになる。
kill-ring kill-ring-yank-pointer | | | ___ ___ | ___ ___ ___ ___ ---> | | | --> | | | | | | |___|___|----> |___|___|--> |___|___|--> nil | | | | | | | | --> "yet more text" | | | --> "a different piece of text | --> "some text" |
変数kill-ring
と変数kill-ring-yank-pointer
の どちらもポインタである。 しかし、キルリング自体は、実際にその要素から構成されている。 kill-ring
は、リストを指すというよりは、リストそのもののようにいう。 逆に、kill-ring-yank-pointer
はリストを指すというようにいう。
同じものを2つの異なる方式で呼ぶのは、最初は、混乱のもとであるが、 熟考すると意味のあることがわかる。 キルリングは、Emacsバッファから切り取った情報を保持する完全なデータ構造を 一般的に意味する。 一方で、kill-ring-yank-pointer
は、挿入される先頭要素(CAR)となる キルリングの部分を指すのである。
関数rotate-yank-pointer
は、 kill-ring-yank-pointer
が指すキルリングの要素を変更する。 キルリングの最後の要素のつぎを指すようなときには、 自動的にキルリングの先頭要素を指すようにする。 このようにしてリストをリングに変換している。 関数rotate-yank-pointer
自体のコードは難しくはないが、 こまごましたことを含む。 この関数と、さらに簡単な関数yank
とyank-pop
は、付録で説明する。 See 節 B. キルリングの扱い方。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
yank
とnthcdr
の演習問題yank
とnthcdr
の演習問題"へのコメント(無し)
describe-variable
)を使って、読者のキルリングの内容を 調べてみよ。 キルリングにいくつか項目を追加してから、その値を再度調べてみよ。 M-y(yank-pop
)を使って、キルリング全体を調べてみよ。 読者のキルリングには項目はいくつあるか? kill-ring-max
の値を調べてみよ。 読者のキルリングは満杯になっているか、あるいは、 テキスト断片をさらに保存できるかどうかを調べてみよ。
nthcdr
とcar
を使って、リストの先頭要素、第2要素、第3要素、 第4要素を返す一連の式を作ってみよ。[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |