[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

10. テキストのヤンク

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 yanknthcdr についての練習問題  ヤンクと nthcdr についての練習問題


10.1 Kill リングについての概観

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))

yankyank-pop の働きを理解するには、まず 変数 kill-ring-yank-pointer と、関数 rotate-yank-pointer を理解する必要がある。


10.2 変数 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-ringkill-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 リングの扱い.


10.3 yanknthcdr についての練習問題


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Matsuda Shigeki on April, 10 2002 using texi2html