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

7. マークとリージョン

Emacsの数多くのコマンドは, カレントバッファの任意の連続領域を操作します. このようなコマンドに操作対象となるテキストを指定するには, その一方の端にマーク(mark)を置き, もう一方の端にポイントを移動します. ポイントとマークに挟まれたテキストをリージョン(region)と呼びます. 暫定マーク(transient-mark)モードをオンにすると, リージョンが存在すれば Emacsはつねにそのリージョンを強調表示します (see section 暫定マークモード(transient-markモード)).

リージョンの境界を調整するには, ポイントやマークを移動します. 時間的にどちらを先に設定したとか, テキスト内でどちらが先にあるかとかは関係ありません. いったんマークを設定すると, 他の箇所に再設定するまで, その位置情報はそのまま変わりません. 各Emacsバッファには個別にマークがありますから, 以前に選択したバッファへ戻ったときには, 以前と同じままのマークが残っています.

C-yyank)やM-x insert-bufferなどのテキストを 挿入するコマンドの多くは, 挿入したテキストの両端にポイントとマークを置いて, 挿入したテキストがリージョンに含まれるようにします.

リージョンの境界を定めること以外に, あとで戻る可能性のある箇所を覚えておくためにもマークを使えます. この機能をより使いやすくするために, 各バッファでは, それまでに設定した16個のマーク位置を マークリング(mark ring)に記録しています.


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

7.1 マークを設定する

マークを設定するコマンドはつぎのとおりです.

C-<SPC>

ポイント位置にマークを置く(set-mark-command).

C-@

上と同様.

C-x C-x

マークとポイントを入れ換える(exchange-point-and-mark).

Drag-Mouse-1

ドラッグしたテキストの周囲にポイントとマークを設定する.

Mouse-3

ポイント位置にマークを設定し, クリックした箇所にポイントを移動する (mouse-save-then-kill).

たとえば, コマンドC-x C-uupcase-region)を使って, バッファのある部分をすべて大文字に変換したいとしましょう. このコマンドは, リージョン中のテキストに作用します. まず, 大文字に変換したいテキストの先頭に移動し, C-<SPC>と打ってマークを設定します. 続いてテキストの終端に移動してC-x C-uと打ちます. あるいは, 先にテキストの終端にマークを設定して, テキストの始点に移動してからC-x C-uと打ちます.

マークを設定するもっとも一般的な方法は, C-<SPC>コマンド(set-mark-command)を使うことです. このコマンドは, ポイント位置にマークを設定します. そうすれば, マークを置いたままで, ポイントを移動できます.

マウスを使ったマークの設定方法は2つあります. テキストのある範囲でマウスボタン1をドラッグします. マウスボタンを離した位置にポイントが置かれ, ドラッグを開始した箇所にマークが設定されます. あるいは, マウスボタン3をクリックします. これは(C-<SPC>と同様に)ポイント位置にマークを設定してから, ポイントを(Mouse-1のように)移動します. 両者は, マークを設定するだけでなく, リージョンをキルリングにコピーします. これは, 他のウィンドウアプリケーションの動作と一貫性を持たせるためです. キルリングを変更したくなければ, キーボードコマンドを使ってマークを設定する必要があります. See section 編集用マウスコマンド.

普通の端末にはカーソルは1つしかありませんから, Emacsにはマークを置いた位置を表示する術はありません. ユーザーがその位置を覚えておく必要があります. この問題に対する通常の解決方法は, マークを設定したら, 忘れてしまうまえにただちにそれを利用することです. あるいは, C-x C-xexchange-point-and-mark)コマンドを使って, マーク位置を確認します. このコマンドは, ポイント位置にマークを置き, マークのあった位置にポイントを置きます. リージョンの範囲は変わらずに, カーソルとポイントは以前マークのあった箇所に移動します. 暫定マーク(transient-mark)モードでは, このコマンドはマークを再度活性にします.

ポイント位置を変えずに, リージョンのもう一方の端(マークの位置)を移動させたい場合にも, C-x C-xは便利な方法です. まず, C-x C-xでポイントをリージョンの一方の端に移して, その端を移動します. 必要ならば, もう1度C-x C-xを使って新しい位置にマークを置き, ポイントをもとの位置に戻します.

ASCIIには, C-<SPC>という文字は存在しません. <CTRL>を押し下げながら<SPC>を打つと, ほとんどの普通の端末では文字C-@になります. このキーは, 実際にset-mark-commandにバインドしてあります. ただし, 幸運にもC-<SPC>C-@を送出する端末を 使っているのであれば, C-@C-<SPC>とみなしてかまいません. Xウィンドウシステムでは, C-<SPC>は実際には 別の文字として認識されますが, そのバインドはやはりset-mark-commandです.


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

7.2 暫定マークモード(transient-markモード)

Xウィンドウシステムを使っているのであれば, Emacsはカレントリージョンを強調表示できます. ただし, 通常はリージョンを強調表示しません. なぜでしょうか?

実は, もともとのEmacsではリージョンの強調表示をうまくできないのです. いったんマークを設定してしまうと, そのバッファ内にはつねにリージョンが存在することになるからです. リージョンを強調表示し続けても迷惑なだけでしょう.

暫定マーク(transient-mark)モードをオンにすると, リージョンの強調表示機能をオンにできます. 暫定マーク(transient-mark)モードは, リージョンが一時的にしか『存続』しない, 通常よりきびしい操作モードです. ユーザーは, リージョンを使うコマンドごとにリージョンを設定する必要があります. 暫定マーク(transient-mark)モードでは, ほとんどの期間, リージョンは存在しません. それゆえ, リージョンが存在するときにリージョンを強調表示しても 邪魔になりません.

暫定マーク(transient-mark)モードをオンにするには, M-x transient-mark-modeと打ちます. このコマンドはモードのオン/オフを切り替えますから, モードをオフにしたいときにはコマンドをもう1度繰り返します.

暫定マーク(transient-mark)モードの詳細を以下に示します.

リージョンの強調表示には, regionフェイスを使います. このフェイスを変更すれば, リージョンの強調表示方法をカスタマイズできます.

複数のウィンドウで同じバッファを表示しているときには, それぞれのウィンドウで別の部分を表示できます. というのは, (マーク位置は共有されるが) 各ウィンドウごとに別々にポイントの値があるからです. 通常, 選択されたウィンドウでのみ, リージョンを強調表示します(see section 複数のウィンドウ). しかし, 変数highlight-nonselected-windowsnil以外を設定すると, (暫定マーク(transient-mark)モードがオンであり, かつ, ウィンドウのバッファのマークが活性である場合に限り) 各ウィンドウでそれぞれのリージョンを強調表示します.

暫定マーク(transient-mark)モードがオフであると, マークを設定するすべてのコマンドはマークを活性にし, マークを不活性にするものは何もありません.

暫定マーク(transient-mark)モードにおいて, 変数mark-even-if-inactivenil以外であると, マークが不活性であってもコマンドはマークやリージョンを利用できます. 通常の暫定マーク(transient-mark)モードと同様に, リージョンが強調表示されたりされなかったりしますが, 強調表示されていなくてもマークが本当になくなることはありません.

暫定マーク(transient-mark)モードは『zmacsモード』としても知られています. というのも, MITのLispマシン上で動作していたZmacsエディタが 同じようにマークを扱っていたからです.


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

7.3 リージョンに対する操作

いったんリージョンを設定しマークを活性にすれば, 以下のようにリージョンを操作できます.

リージョン内のテキストを操作するコマンドの多くは, その名前にregionという単語を含みます.


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

7.4 テキストオブジェクトをマークするコマンド

単語, リスト, 段落, ページといったテキストのまとまりに ポイントやマークを置くコマンドがあります.

M-@

つぎの語の末尾にマークを設定する(mark-word). このコマンドとつぎのコマンドはポイントを移動しない.

C-M-@

つぎのLisp式の末尾にマークを設定する(mark-sexp).

M-h

現在の段落を囲むリージョンを設定する(mark-paragraph).

C-M-h

現在のLisp関数定義(defun)を囲むリージョンを設定する(mark-defun).

C-x h

バッファ全体をリージョンとする(mark-whole-buffer).

C-x C-p

現在のページを囲むリージョンを設定する(mark-page).

M-@mark-word)がつぎの語の末尾にマークを設定するのに対し, C-M-@mark-sexp)はつぎのLisp式の末尾にマークを設定します. これらのコマンドは, M-fC-M-fと同様に引数を扱います.

その他のコマンドは, ポイントとマークの両方を設定して, バッファ内で対象物を区切ります. たとえば, M-hmark-paragraph)は, ポイントを囲むあるいはポイントに続く段落の先頭にポイントを移動し, その段落の末尾にマークを置きます(see section 段落). このようにリージョンを設定するので, 段落全体を字下げしたり, 大文字小文字を変換したり, キルしたりできます.

C-M-hmark-defun)も同様に, 現在の関数定義や後続の関数定義の先頭にポイントを置き, その末尾にマークを置きます(see section 関数定義(defun)). C-x C-pmark-page)は, 現在のページの先頭にポイントを置き, その末尾にマークを置きます(mark-page). マークはページ区切りの直後に設定され(リージョンに含まれる), 一方, ポイントはページ区切りの直後に置かれます(リージョンに含まれない). 数引数で, 現在のページのかわりに(正ならば)後続のページや, (負ならば)先行するページを指定できます.

最後に紹介するC-x hmark-whole-buffer)は, バッファ全体にリージョンを設定します. つまり, ポイントをバッファの先頭に置き, マークをバッファの末尾に置きます.

暫定マーク(transient-mark)モードでは, これらのコマンドはすべて, マークを活性にします.


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

7.5 マークリング

マークには, リージョンを区切る以外にも, あとで戻る可能性のある箇所を記録するという便利な使い方があります. この機能をより便利にするために, 各バッファでは以前の16箇所のマーク位置を マークリング(mark ring)に記録しています. マークを設定するコマンドは, 古いマークをこのマークリングに入れます. マークを設定していた箇所に戻るには, C-u C-<SPC>(またはC-u C-@)を使います. これは, set-mark-commandコマンドに数引数を指定したものです. このコマンドは, マークがあった箇所にポイントを移動し, それ以前のマークを収めたマークリングからマークを復元します. したがって, このコマンドを繰り返すと, マークリング上にある過去のマークのすべてを1つ1つ遡って移動できます. このように辿ったマーク位置は, マークリングのうしろに付け加えられるので, なくなってしまうことはありません.

各バッファには独自のマークリングがあります. すべての編集コマンドは, カレントバッファのマークリングを使います. 特に, C-u C-<SPC>は, つねに同じバッファに留まります.

M-<beginning-of-buffer)のような長距離を 移動するコマンドの多くは, まずマークを設定して, 古いマークをマークリングに保存してから動作を開始します. このようにして, あとで簡単に戻れるようにしておきます. 探索コマンドは, ポイントを移動するときにはマークを設定します. コマンドがマークを設定したかどうかは, エコー領域に‘Mark Set’と表示されるのでわかります.

何度も同じ場所に戻りたい場合には, マークリングでは不十分でしょう. このような場合には, あとで使うために位置情報をレジスタに記録できます (see section レジスタに位置を保存する).

変数mark-ring-maxは, マークリングに保存する最大項目数を指定します. すでに多くの項目が存在していて, さらにもう1つ押し込むときには, リスト内の最古の項目を捨てます. C-u C-<SPC>を繰り返し実行すると, いまマークリングに入っている位置を巡回することになります.

変数mark-ringは, 最新のマーカオブジェクトを先頭にして, マーカオブジェクトのリストとしてマークリングを保持します. この変数は各バッファにローカルです.


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

7.6 グローバルマークリング

個々のバッファごとの普通のマークリングに加えて, Emacsにはグローバルマークリング(global mark ring)が1つあります. グローバルマークリングは, 最近マークを設定したバッファの系列を記録しますから, それらのバッファに戻ることができます.

マークを設定すると, つねにカレントバッファのマークリングに項目を作ります. マークを設定した以降にバッファを切り替えていると, 新しくマークを設定するとグローバルマークリングにも項目を作成します. その結果, グローバルマークリングには訪れていたバッファの系列が記録され, 各バッファではマークを設定した箇所が記録されます.

コマンドC-x C-<SPC>pop-global-mark)は, グローバルマークリングの最新の項目が示すバッファの位置に移動します. グローバルマークリングも巡回されるので, C-x C-<SPC>を繰り返し使用すると, 1つずつまえのバッファに移動できます.


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

7.7 削除とキル

バッファからテキストを消しさるコマンドのほとんどは, そのテキストをキルリングにコピーしておくので, バッファの他の部分にそのテキストを移動したりコピーしたりできます. これらのコマンドを, キル(kill)コマンドと呼びます. それ以外の『テキストを消すコマンド』は, テキストをキルリングに保存しません. これらを削除(delete)コマンドと呼びます. (両者を区別するのは, バッファ内のテキストを消す場合だけ. ) キルコマンドや削除コマンドを誤って実行してしまった場合には, C-x uundo)コマンドを使って, もとに戻すことができます.

削除コマンドには, 一度に1つの文字だけを削除する C-ddelete-char)や<DEL>(delete-backward-char), 空白や改行だけを削除するコマンドがあります. 単純ではないデータをかなりの分量で破壊する可能性のあるコマンドは, 一般にキルを行います. コマンド名や個々の説明では, そのコマンドがどちらの働きをするかによって, ‘キル’(kill)と‘削除’(delete)を使い分けています.


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

7.7.1 削除

C-d

つぎの文字を削除する(delete-char).

<DEL>

まえの文字を削除する(delete-backward-char).

M-\

ポイントの周りの空白とタブを削除する(delete-horizontal-space).

M-<SPC>

ポイントの周りの空白とタブを削除し, 空白を1個だけ残す (just-one-space).

C-x C-o

現在行の周りの空行を削除する(delete-blank-lines).

M-^

行間の改行とそれに続く字下げを削除して2行を繋げる (delete-indentation).

もっとも基本的な削除コマンドは, C-ddelete-char)と <DEL>(delete-backward-char)です. C-dはポイントの直後の文字, つまり, カーソルが重なっている文字を削除します. このコマンドでは, ポイントは動きません. <DEL>はカーソルの直前の文字を削除して, ポイントを1つまえに移動します. バッファ内の他の文字と同様に, 改行も削除できます. 改行を削除すると, 2つの行が繋がります. 実際には, C-dと<DEL>がつねに削除コマンドであるわけではありません. 引数を指定するとキルコマンドとなり, 同じ方法で2文字以上を消すことができます.

他の削除コマンドは, 空白, タブ, 改行といった白文字だけを削除します. M-\delete-horizontal-space)は, ポイントの前後にあるすべての空白とタブ文字を削除します. M-<SPC>just-one-space)も同様に削除しますが, 今ある空白の個数に関係なく(たとえ0個でも), ポイントの直後に空白を1個だけ残します.

C-x C-odelete-blank-lines)は, 現在行に続くすべての空行を削除します. 現在行が空行である場合には, (空行である現在行だけを残して) 先行する空行も同様にすべて削除します.

M-^delete-indentation)は, 改行とその周りの空白を削除して, 通常は空白を1個残して現在行と先行する行を繋げます. See section M-^.


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

7.7.2 行単位のキル

C-k

行の残りの部分, あるいは, 行全体を1行以上キルする(kill-line).

もっとも単純なキルコマンドはC-kです. 行の先頭で使うと, その行のすべてのテキストをキルして, 空行にします. 空行で使うと, 改行を含めてその行を完全にキルします. 空行でない行を完全にキルするには, 行頭でC-kを2回打ちます.

一般に, C-kは, 行末でなければ, ポイントからその行の末尾までをキルします. 行末では, ポイントのうしろの改行をキルするので, 現在行と後続の行が繋がります. どちらの動作をするか決めるときには, 行末にあって見にくい空白やタブを無視しますから, ポイントが行末にあるように見えていれば, C-kで改行がキルされると考えてください.

C-kに正の引数を指定すると, その個数の行とそれらに続く改行をキルします (ただし, 現在行のポイントよりまえのテキストは残す). 負の引数-nを指定すると, C-kは現在行に先行するn行 (と現在行のポイント位置よりまえのテキストを含めて)を削除します. つまり, ポイントが行頭にある状態でC-u - 2 C-kとすれば, 先行する2行をキルします.

C-kに引数0を指定すると, 現在行のポイントよりまえのテキストをキルします.

変数kill-whole-linenil以外の場合, 行頭でC-kを使うと, 行末の改行も含めて行全体をキルします. この変数は, 通常, nilです.


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

7.7.3 他のキルコマンド

C-w

リージョン(ポイントからマークまで)をキルする(kill-region).

M-d

単語をキルする(kill-word). see section 単語.

M-<DEL>

単語を後向きにキルする(backward-kill-word).

C-x <DEL>

文の先頭までを後向きにキルする(backward-kill-sentence). see section .

M-k

文の末尾までをキルする(kill-sentence).

C-M-k

S式をキルする(kill-sexp). see section リストとS式.

M-z char

つぎにcharが現れる箇所までをキルする(zap-to-char).

汎用的なキルコマンドといえばC-wkill-region)です. このコマンドは, あらかじめ連続領域をポイントとマークで囲んでおけば, どんな連続領域でもキルできます.

探索と組み合わせた便利なキルの仕方もあります. M-zzap-to-char)は1文字を読み取り, ポイントからバッファ内でその文字がつぎに現れる箇所までを (その文字も含めて)キルします. 数引数を指定した場合は, 反復回数を意味します. 負の引数の場合は, ポイント位置から逆方向に探索し, ポイントの直前までをキルします.

他の構文単位でもキルできます. M-<DEL>M-d(see section 単語)で単語を, C-M-k(see section リストとS式)でS式を, C-x <DEL>M-k(see section )で文をキルできます.

読み出し専用のバッファでもキルできます. 実際にはバッファに変更を加えることはありませんし, ベルを鳴らしてその旨警告を発しますが, キルしようとしたテキストはキルリングにコピーされます. ですから, 別のバッファにそのテキストをヤンクできます. ほとんどのキルコマンドは, このようにコピーするテキストを越えてポイントを進めますから, 連続してキルコマンドを実行しても キルリングに入る項目は通常どおり1個だけです.


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

7.8 ヤンク

ヤンク(yank)とは, 以前にキルしたテキストをバッファにふたたび挿入することです. 他のシステムでは『ペースト』と呼ぶこともあります. テキストを移動したりコピーしたりする普通の方法は, そのテキストをいったんキルしてから, 別の場所に(1回以上)ヤンクすることです.

C-y

最後にキルしたテキストをヤンクする(yank).

M-y

たった今ヤンクしたテキストをそれより以前にキルした一塊のテキストで置き換える (yank-pop).

M-w

リージョンを実際にはキルせずに, 最後にキルしたテキストとして保存する (kill-ring-save).

C-M-w

つぎのキルを, 最後にキルした一塊のテキストに付け加える (append-next-kill).


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

7.8.1 キルリング

すべてのキルされたテキストは, キルされたテキストの塊をリストとする キルリング(kill ring)に記録されています. キルリングはたった1つしかなくて, すべてのバッファで共有しています. ですから, あるバッファでキルしたテキストは, 別のバッファでヤンクできます. 普通, このようにして, あるファイルから別のファイルへテキストを移動します. (別の方法については, see section テキストの蓄積. )

コマンドC-yyank)は, 最後にキルしたテキストをふたたび挿入します. カーソルは挿入したテキストの末尾に置かれます. マークは挿入したテキストの先頭に置かれます. See section マークとリージョン.

C-u C-yは, テキストのまえにカーソルを置き, うしろにマークを置きます. 引数としてC-uだけを指定した場合に限り, こうなります. C-uと数字を含めた他の引数を指定すると, いくつまえのキル内容をヤンクするかを意味します(see section 以前にキルしたテキストのヤンク).

一塊のテキストをコピーする場合は, M-wkill-ring-save)を使うとよいでしょう. このコマンドは, バッファからリージョンをキルせずに, リージョンをキルリングにコピーします. このコマンドは, C-wに続けてC-x uを実行するのとほぼ同等ですが, M-wはアンドゥ履歴を変更しませんし, 一時的にせよ画面表示も変わりません.


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

7.8.2 キルしたテキストの追加

通常, 各キルコマンドは, キルリングに新たな項目を押し込みます. しかし, 連続したキルコマンドでは, それぞれでキルしたテキストを1つの項目にまとめます. そのため, 1回のC-yで, キルするまえの状態に, それらのテキストをひとまとめにヤンクできます.

したがって, テキストを一塊でヤンクしたい場合でも, 1つのコマンドでそれらをキルする必要はありません. すべてをキルするまで, 1行ずつ, あるいは, 1単語ずつキルしていっても, 一括してもとに戻すことができます.

ポイント位置から前向きにキルするコマンドでは, 直前にキルしたテキストの末尾に付け加えます. ポイント位置から後向きにキルするコマンドでは, テキストの先頭に付け加えます. このように, 前向き/後向きの両方のキルコマンドをどのように混ぜて実行しても, キルしたテキストの順番を崩すことなく 1つの項目としてキルリングに記録されます. 数引数を指定しても, このような追加系列が途切れることはありません. たとえば, バッファにつぎのテキストが入っていて, ∗の位置にポイントがあるとしましょう.

 
This is a line ∗of sample text.

M-d M-<DEL> M-d M-<DEL>と打って, 前向き/後向きと交互にキルしても, キルリングには1つの項目として‘a line of sample’が入り, バッファには‘This is  text.’が残ります. (空白が2個残っていることに注意. これらはM-<SPC>M-qで一掃できる. )

同じようにテキストをキルするもう1つの方法は, M-b M-bで後向きに2語移動してから, C-u M-dで前向きに4語キルします. こうしても, バッファとキルリングの中身は, 先の例とまったく同じ結果になります. M-f M-f C-u M-<DEL>としても, 後向きに同じテキストをキルします. これでもやはり同じ結果が得られます. キルリングの項目内のテキストの順序は, キルするまえのバッファ内での順序と同じです.

キルコマンドと最後のキルコマンドのあいだに (単なる数引数ではない)他のコマンドが入ると, キルリングには新たな項目が作られます. しかし, キルコマンドを打つ直前に コマンドC-M-wappend-next-kill)を打っておけば, 既存の項目へ追加するように強制できます. C-M-wは, つぎがキルコマンドであれば, 新たな項目を作成するかわりにキルしたテキストを 以前にキルしたテキストに付け加えるよう指示します. C-M-wを使うことで, まとめて1か所にヤンクできるように, 離れた場所にあるいくつかのテキスト断片をキルして集めておけます.

M-wに続くキルコマンドでは, M-wがキルリングにコピーしたテキストには付け加えません.


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

7.8.3 以前にキルしたテキストのヤンク

直前にキルしたものではないテキストを取り出すには, M-yコマンド(yank-pop)を使います. M-yは, 直前にヤンクしたテキストを それ以前にキルしたテキストで置き換えます. たとえば, 最後から2つめのキルテキストを取り出すには, まずC-yで最後にキルしたテキストをヤンクしてから, M-yで1つまえのものに置き換えます. M-yC-yや他のM-yの直後でしか使えません.

キルリング内の項目を指す『最終ヤンク』ポインタを考えると, M-yの動作を理解しやすいでしょう. キルするたびに, 『最終ヤンク』ポインタは, リングの先頭に新たに作られた項目を指します. C-yは, 『最終ヤンク』ポインタが指す項目をヤンクします. M-yは, 『最終ヤンク』ポインタを別の項目へ移動し, それに合わせてバッファのテキストを変更します. M-yコマンドを繰り返せばリング内のどの項目へもポインタを移動できるので, どの項目でもバッファに取り込めます. ポインタがリングの最後に達すると, つぎのM-yはポインタをふたたびリングの先頭の項目に移動します.

M-yは, リング内で『最終ヤンク』ポインタを移動しますが, リング内の項目の順番を変えることはありません. つねに, 最後にキルしたものが先頭にあり, 記録に残っている最古のものが最後尾にあります.

M-yには数引数を指定できて, 『最終ヤンク』ポインタをいくつ進めるかを指定します. 負の引数では, ポインタをリングの先頭に向けて移動します. リングの先頭からは最後の項目へ移動し, そこから先頭に向けて移動します.

目的のテキストがバッファに入ったならば, M-yコマンドの繰り返しを止めれば, みつけたテキストが残ります. そのテキストはキルリングの項目のコピーなので, バッファ内で編集してもリング内の項目は変わりません. 新たにキルしない限り, 『最終ヤンク』ポインタは キルリング内の同じ場所を指していますから, C-yを繰り返すと, 直前に取り込んだものと同じキル内容のコピーをヤンクできます.

目的のテキストを引き出すのに M-yコマンドを何回使えばよいのかわかっている場合には, 数引数を指定してC-yを使えば, 一発で目的のテキストをヤンクできます. C-yに数引数を指定すると, キルリング内でその個数分だけ遡った項目のテキストを取り込みます. たとえば, C-u 2 C-yは最後から2番目にキルしたテキストを取り込みます. つまり, C-y M-yとするのと等価です. 数引数を指定したC-yは, 『最終ヤンク』ポインタの場所から 数え始め, ヤンクする項目にポイントを移動します.

キルリングの長さは, 変数kill-ring-maxで制御します. この個数以上のキルテキストは保存しません.

キルリングの実際の内容は, kill-ringという名前の変数に入っています. キルリングの全内容は, コマンドC-h v kill-ringで見ることができます.


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

7.9 テキストの蓄積

通常, テキストをコピーしたり移動したりするにはキルとヤンクで行います. しかし, 一塊のテキストを何か所にもコピーしたり, 多くの箇所に分散したテキストを1か所にコピーしたりするのに 便利な方法が他にもあります. 一塊のテキストを何か所にもコピーするには, そのテキストをレジスタに保存します(see section レジスタ). ここでは, 何か所かに分散したテキストをバッファやファイルに 蓄積するためのコマンドを説明します.

M-x append-to-buffer

リージョンを指定したバッファの内容の末尾に付加する.

M-x prepend-to-buffer

リージョンを指定したバッファの内容の先頭に付加する.

M-x copy-to-buffer

リージョンを指定したバッファにコピーするが, そのバッファの古い内容は削除する.

M-x insert-buffer

指定したバッファの内容をカレントバッファのポイント位置に挿入する.

M-x append-to-file

リージョンを指定したファイルの内容の末尾に付加する.

テキストをバッファに蓄積するには, M-x append-to-bufferを使います. これは, バッファ名を読み取り, リージョンのコピーを指定したバッファに挿入します. 存在しないバッファを指定した場合, append-to-bufferはバッファを作成します. テキストは, そのバッファ内のポイント位置に挿入されます. バッファを編集用に使っている場合には, そのバッファ内のテキストのあいだ, その時点のポイント位置にコピーしたテキストを挿入します.

コピー先のバッファ内では, ポイントはコピーされたテキストの末尾に置かれます. したがって, 連続してappend-to-bufferを使うと, コピーした順序でバッファにテキストが蓄積されます. 厳密には, append-to-bufferは, バッファ内の既存のテキストに追加するとは限りません. そのバッファの末尾にポイントがある場合に限り, 追加します. しかし, バッファを変更するコマンドがappend-to-bufferだけならば, ポイントはつねに末尾に置かれています.

M-x prepend-to-bufferappend-to-bufferにとてもよく似ていますが, コピー先のバッファ内のポイントは, コピーしたテキストの直前に置かれる点が異なります. つまり, 続けてこのコマンドを使うと, テキストは逆順に追加されていきます. M-x copy-to-bufferも同様ですが, 指定したバッファ内の既存のテキストを削除します. したがって, バッファには新たにコピーしたテキストだけが残ります.

別のバッファに蓄積したテキストを取り出すには, コマンドM-x insert-bufferを使います. このコマンドも引数としてbuffernameを必要とします. バッファbuffername内のテキストのコピーを 選択しているバッファに挿入します. あるいは, そのバッファを選択して編集し, 場合によってはキルしてそのバッファからテキストを移動することもできます. バッファに関する背景情報は, See section 複数のバッファの使い方.

テキストをEmacsのバッファに蓄積するかわりに, M-x append-to-fileを使って, テキストを直接ファイルに追加できます. このコマンドは引数としてfilenameを必要とします. リージョンのテキストを指定したファイルの末尾に追加します. ファイルはディスク上でただちに更新されます.

このコマンドに指定するファイルは, Emacsで訪問していないファイルだけに限るべきです. Emacsで編集中のファイルを指定すると, Emacsに隠れてファイルを変更することになり, 編集内容の一部を失うことにもなりかねません.


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

7.10 矩形領域

矩形領域コマンドはテキストの矩形領域を操作します. 矩形領域のテキストとは, 2つの行の範囲内にある2つの桁位置のあいだにある文字すべてを指します. 矩形領域をキルする, キルした矩形領域をヤンクする, 矩形領域をクリアする, 矩形領域を空白やテキストで充填する, 矩形領域を削除する, といったコマンドがあります. 矩形領域コマンドは, 複数段に組んだテキストを操作したり, テキストをそのように組んだり戻したりする場合に便利です.

コマンドで操作する矩形領域を指定するには, 一方の隅にマークを設定し, その対角にポイントを置きます. このように設定した矩形領域を矩形リージョン (region-rectangle)と呼びます. というのも, リージョンの制御と似た方法で矩形領域を制御できるからです. しかし, ポイントとマークの組は, それを使うコマンドに依存して, リージョンとして解釈される, あるいは, 矩形領域として解釈されることに注意してください.

ポイントとマークが同じ桁位置にある場合, それらが切り分ける矩形領域は空です. 同じ行上にある場合は, 矩形領域の高さは1行です. 桁と行の扱い方が非対称であるのは, ポイント(同様にマーク)は2つの桁のあいだにあるのに対し, 行ではその中にあるからです.

C-x r k

矩形リージョンのテキストをキルし, その内容を『最後にキルした矩形領域』として保存する(kill-rectangle).

C-x r d

矩形リージョンのテキストを削除する(delete-rectangle).

C-x r y

最後にキルした矩形領域をポイント位置を左上隅としてヤンクする (yank-rectangle).

C-x r o

空白で埋めた矩形リージョンを挿入する(open-rectangle). 矩形リージョンの直前の内容は右に押しやられる.

M-x clear-rectangle

矩形リージョンのすべてのテキストを空白で置き換えて, 内容をクリアする.

M-x delete-whitespace-rectangle

指定した矩形領域の各行において, 矩形領域の左端から白文字を削除する.

C-x r t string <RET>

指定した矩形領域の各行にstringを挿入する (string-rectangle).

矩形操作は2種類に分類できます. 矩形領域を削除したり挿入したりするコマンドと, 空白の矩形領域を扱うコマンドです.

矩形領域内のテキストを消すには, 2つの方法があります. テキストを捨てる(削除する)か, 『最後にキルした』矩形領域として保存するかです. これらの機能を実現するコマンドは, C-x r ddelete-rectangle)と C-x r kkill-rectangle)です. どちらも, 矩形領域の内側にある各行の部分を削除し, それより右側にテキストがあれば, 隙間を埋めるようにそれらを左へ移動します.

矩形領域の『キル』は普通の意味でのキルではない, ということに注意してください. 矩形領域はキルリングには保存されませんが, 最後にキルした矩形領域を1つだけ記録できる特別な場所に保存されます. というのは, 矩形領域をヤンクすることは, 線形のテキストのヤンクとは大きく異なり, 特別なヤンクコマンドが必要だったり, ヤンクしたテキストの入れ換え操作が意味をなさなかったりするからです.

最後にキルした矩形領域をヤンクするには, C-x r yyank-rectangle)と打ちます. 矩形領域のヤンクは矩形領域のキルの逆です. ポイントは矩形領域の左上隅の位置を指定します. その場所には矩形領域の1行目が挿入され, 矩形領域の2行目はそのつぎの行にというように挿入されます. 影響される行数は, 保存されている矩形領域の高さで決まります.

矩形領域のキルとヤンクを使うと, 1段組みの一覧表を2段組の一覧表に変換できます. 一覧表の後半を矩形領域としてキルして, 一覧表の第1行の隣にヤンクすればよいのです.

また, C-x r r rC-x r i rを使えば, 矩形領域をレジスタにコピーしたり, レジスタから矩形領域をコピーしたりできます. See section Rectangle Registers.

空白の矩形領域を作るコマンドは2つあります. M-x clear-rectangleは既存のテキストを空白で置き換え, C-x r oopen-rectangle)は空白の矩形領域を挿入します. 矩形領域をクリアすることは, 矩形領域を削除してから同じ大きさの空白の矩形領域を挿入するのと同じことです.

コマンドM-x delete-whitespace-rectangleは, 特定の桁位置から始まる横に並んだ白文字を削除します. 矩形領域内の各行に作用し, 桁位置は矩形領域の左端です. 矩形領域の右端はこのコマンドには関係ありません.

コマンドC-x r tM-x string-rectangle)は, 矩形領域を指定した文字列で置き換えます. 文字列の幅は, 矩形領域の幅と同じである必要はありません. 文字列の幅が足りなければ, 矩形領域の右側にあるテキストは左へ移動します. 文字列の幅が広ければ, 矩形領域の右側にあるテキストは右へ移動します.


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

This document was generated by 新堂 安孝 on September 22, 2009 using texi2html 1.82.