| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs で `kill' コマンドでバッファからテキストを切り取った場合、その テキストは常に、ヤンク (yank) コマンドで取り戻すことが出来る。バッファか ら切り取られたテキストは kill リングに置かれており、ヤンクコマンドは、こ の kill リングの中から該当する内容を取り出してバッファに挿入する (これは、 元のバッファとは限らない)。
単なる C-y (yank) コマンドは、kill リングの最初の要素をカレ
ントバッファに挿入する。もし、C-y コマンドのすぐ後に続けて
M-y とタイプすると、その最初の要素が二番目の要素と取り換えられる。
続けて何回も M-y をタイプすると、その回数だけ最初の要素を入れ替え
ていき、一回りするとまた最初に戻ってそれを繰り返す。(そういうわけで kill
リングは「リスト」ではなく「リング」と呼ばれるのである。しかし、実際にテ
キストを保存しているデータの型はリストに他ならない。リストをリングとして
扱う方法についてのより詳しい話は kill リングの扱い,
を参照。)
10.1 Kill リングについての概観 kill リングはリストである 10.2 変数 kill-ring-yank-pointer10.3 yankとnthcdrについての練習問題ヤンクと nthcdr についての練習問題
kill リングはテキスト形式の文字列のリストである。例えば次のような形を している。
("some text" "a different piece of text" "yet more text")
|
もし私の kill リングが上のものだったとして、ここで私が C-y と押す と、`some text' という文字列が私が現在いるバッファのカーソルの位置 に挿入される。
yank コマンドはまた、テキストを複写するのにも使われる。コピーされ
るテキストはバッファから切り取られるのではなく、一旦 kill リングに置かれ、
その後ヤンクされることで挿入されることになる。
kill リングのテキストを取り出すには三つの関数が使われる。通常 C-y
にバインドされている yank, 同じく通常 M-y にバインドされて
いる yank-pop、そして、この二つの関数によって使われる
rotate-yank-pointer である。
(insert (car kill-ring-yank-pointer)) |
yank や yank-pop の働きを理解するには、まず
変数 kill-ring-yank-pointer と、関数 rotate-yank-pointer
を理解する必要がある。
kill-ring-yank-pointer
kill-ring-yank-pointer は、kill-ring と同じく変数である。
一般に変数は、あるものの値にバインドされることで、それを指し示す働きをす
る。
従って、もし kill リングの値が
("some text" "a different piece of text" "yet more text")
|
であり、また kill-ring-yank-pointer が二番目の位置を指していたとす
ると、kill-ring-yank-pointer の値は
("a different piece of text" "yet more text")
|
である。前章で説明したように
(リストはどのように実装されているか,)、
計算機は kill-ring と kill-ring-yank-pointer とに指された
テキストを各々別々に保持しているわけではない。"a different piece of
text" と "yet more text" の二つの言葉は、二重に複製されているのではな
いのである。その代わり二つの 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 リングそのものは、実際に要素を組み合わせたもの
として説明されることが多い。つまり、kill-ring はリストの計算機内
での位置を指しているというよりは、リストそのものの意味で使われる。それに対
し、kill-ring-yank-pointer の方は、リストへのポインタという意味で
使われることが多い。
全く同じことについて、こういうふうに二つの言い方を使うと最初は混乱するよ
うに思えるかもしれない。しかしよく考えてみれば合理的である。kill リング
は一般に、Emacs のバッファから最近切り取られたテキストのデータからなって
いると捉えられている。一方 kill-ring-yank-pointer の方は、kill リ
ングの中でその最初の要素 (つまり CAR) がこれから挿入するデータであ
るような部分、を指し示すために使われる。
rotate-yank-pointer 関数は、kill-ring-yank-pointer が指し
示す要素を交換するものである。より詳しく言うと、ポインタが kill リングの
最後の要素を越えて更に次の要素に移ろうとする際に、自動的にポインタを
kill リングの最初の要素に移動してくれるのだ。このようにしてリストがあた
かもリングであるように扱えるのである。rotate-yank-pointer 関数そ
れ自身は単純であるが、その中身には多くの細かい説明が必要である。この関数
及び、これよりずっと単純な yank, yank-pop 関数については次
の所で説明する。kill リングの扱い.
yank と nthcdr についての練習問題
describe-variable) を使って、あなたの kill リングの値
を見なさい。幾つか kill リングの要素を増やしてから、もう一度 kill リング
の中身を見なさい。M-y (yank-pop) を使って kill リングの中を
動き回りなさい。あなたの kill リングの中にはどのくらい多くの要素がありま
すか? kill-ring-max の値を見なさい。kill リングはもう一杯ですか?
それともまだテキストのブロックを追加出来ますか?
nthcdr と car を使って、各々リストの一番目、二番目、三番目、
及び四番目の要素を返すような四つのS式を作りなさい。
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |