| [ < ] | [ > ] | [ << ] | [ 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要素を返す一連の式を作ってみよ。| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |