[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

10. テキストの取り出し方

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Yanking"
"intro/テキストの取り出し方"へのコメント(無し)

GNU Emacsで「キル」コマンドでバッファからテキストを切り取ったときには、 「ヤンク」コマンドでそのテキストを取り出せる。 バッファから切り取ったテキストはキルリングに保存され、 ヤンクコマンドはキルリングの適当な内容をバッファに挿入する (同じバッファである必要はない)。

簡単なコマンドC-yyank)では、キルリングの先頭要素を カレントバッファに挿入する。 C-yの直後にM-yを続けると、先頭要素を2番目の要素で置き換える。 さらにM-yを続けると、2番目の要素を3番目の要素で、4番目の要素で、 5番目の要素で置き換えるというようになる。 キルリングの最後の要素に達した場合には、一巡して先頭要素で置き換える (これが、キルリングを「リスト」とは呼ばずに「リング」と呼ぶ理由である。 しかし、テキストを保持する実際のデータ構造はリストである。 リストをリングとして扱う方法の詳細は、See 節 B. キルリングの扱い方)。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

10.1 キルリングの概要

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=Kill%20Ring%20Overview"
"intro/キルリングの概要"へのコメント(無し)

キルリングは、文字列のリストである。 これはつぎのようになっている。

 
("some text" "a different piece of text" "yet more text")

これが筆者のキルリングの内容であったとすると、 C-yとタイプするとカレントバッファのカーソル位置に文字列`some text'が 挿入される。

コマンドyankは、コピーしてテキストを複製するためにも使える。 コピーしたテキストはバッファからは切り取られずに、 そのコピーがキルリングに置かれ、ヤンクすると挿入できる。

キルリングからテキストを取り出すには3つの関数が使われる。 C-yにバインドされたyankM-yにバインドされた yank-pop、 これら2つの関数が使うrotate-yank-pointerである。

これらの関数は、変数kill-ring-yank-pointerを介してキルリングを参照する。 関数yankyank-popの挿入を行うコードはつぎのとおりである。

 
(insert (car kill-ring-yank-pointer))

yankyank-popがどのように動作するかを理解するには、 まず、変数kill-ring-yank-pointerと関数rotate-yank-pointerを 説明しておく必要がある。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

10.2 変数kill-ring-yank-pointer

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=kill-ring-yank-pointer"
"intro/変数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-ringkill-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自体のコードは難しくはないが、 こまごましたことを含む。 この関数と、さらに簡単な関数yankyank-popは、付録で説明する。 See 節 B. キルリングの扱い方



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

10.3 yanknthcdrの演習問題

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=eintro&node=yank%20nthcdr%20Exercises"
"intro/yanknthcdrの演習問題"へのコメント(無し)


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]