| [ << ] | [ >> ] | [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] | [ ? ] |