[ << ] | [ >> ] | [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-pointer
10.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] | [ ? ] |