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

13. 複数のバッファの使い方

Emacs内で編集しているテキストはバッファ(buffer)と 呼ばれるオブジェクトの中に存在します. ファイルを訪問するたびに, ファイルのテキストを保持するバッファを作ります. diredを起動するたびに, ディレクトリ一覧を保持するバッファを作ります. C-x mでメッセージを送信するときには, メッセージのテキストを保持するためにバッファ‘*mail*’が使われます. コマンドの説明文を求めると, ‘*Help*’と呼ばれるバッファに説明文が現れます.

どんなときでも, 1つのバッファだけが選択されています. このバッファをカレントバッファとも呼びます. バッファが1つしかないかのように, コマンドが『バッファ』に作用するといういい方をよくします. しかし, 実際には, コマンドが選択されたバッファに作用するということです (多くのコマンドはそうする).

複数のウィンドウがあるとき, 各ウィンドウはそこに表示しているバッファを選んでいますが, いつでもそれらのウィンドウのうち1つだけが選択されていて, そのウィンドウに表示されているバッファが選択されているバッファです. 各ウィンドウのモード行は, そのウィンドウに表示しているバッファの名前を表示します(see section 複数のウィンドウ).

各バッファにはどんな長さでもよい名前があり, バッファ名を指定してバッファを選択できます. 多くのバッファはファイルを訪問することで作成され, それらの名前はファイル名から導き出します. 好きな名前で空のバッファを作ることもできます. Emacsを新たに始めると, Emacs内でLisp式の評価に使える ‘*scratch*’という名前のバッファができます. バッファ名では大文字小文字を区別します.

各バッファは独立に, どのファイルを訪問しているか, 変更されているか, どのメジャーモードとマイナモードを使っているか を記録しています. (see section メジャーモード). どのEmacs変数も各バッファにローカルにすることができます. つまり, あるバッファでの変数の値を 他のバッファでのその変数の値とは違う値にできます. See section ローカル変数.


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

13.1 バッファの作成と選択

C-x b buffer <RET>

bufferという名前のバッファを選択または作成する (switch-to-buffer).

C-x 4 b buffer <RET>

同様だが, 別のウィンドウでbufferを選択する (switch-to-buffer-other-window).

C-x 5 b buffer <RET>

同様だが, 別のフレームでbufferバッファを選択する (switch-to-buffer-other-frame).

bufnameという名前のバッファを選択するには, C-x b bufname <RET>と打ちます. これは, 引数bufnameでコマンドswitch-to-bufferを実行します. バッファ名の略称形を補完することができます(see section 補完). C-x bに空の引数を指定すると, どのウィンドウにも表示されていない最近選択したバッファを意味します.

ほとんどのバッファは, ファイルを訪問することで作られるか, テキストを表示するようなEmacsコマンドによって作られますが, C-x b bufname <RET>と打って, 明示的にバッファを作ることもできます. こうすると, ファイルを訪問していない新しい空のバッファを作り, 編集できるようにそのバッファを選択します. このようなバッファは, 自分用のメモを作るのに使います. これらのバッファを保存しようとすると, 使用するファイル名を聞かれます. 新しいバッファのメジャーモードは, default-major-modeの値で決まります(see section メジャーモード).

C-x C-fやファイルを訪問する他のコマンドは, ファイルを訪問している既存のバッファへの切り替えにも使えることに 注意してください. See section ファイルを訪問する.

Emacsは, 内部目的用のバッファには, 空白で始まるバッファ名を使います. Emacsは, これらのバッファを少々特別に扱います. たとえば, デフォルトでは, アンドゥ情報を記録しません. このようなバッファ名は避けるのが最良です.


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

13.2 既存バッファの一覧

C-x C-b

既存バッファを一覧表示する(list-buffers).

既存のすべてのバッファを一覧表示するには, C-x C-bと打ちます. 各行は, バッファ名, メジャーモード, 訪問しているファイルを示します. バッファは選択された順に表示されます. もっとも最近に選択されたバッファが始めにきます.

行頭の‘*’は, バッファが『修正され』ていることを示します. いくつかのバッファが修正されているなら, C-x sでいくつかのバッファを保存する時期かもしれません (see section ファイルを保存する). ‘%’は, 読み出し専用バッファを示します. ‘.’は選択されているバッファに付けられます. つぎは, バッファ一覧の例です.

 
 MR Buffer         Size  Mode           File
 -- ------         ----  ----           ----
.*  emacs.tex      383402 Texinfo       /u2/emacs/man/emacs.tex
    *Help*         1287  Fundamental	
    files.el       23076 Emacs-Lisp     /u2/emacs/lisp/files.el
  % RMAIL          64042 RMAIL          /u/rms/RMAIL
 *% man            747   Dired          /u2/emacs/man/		
    net.emacs      343885 Fundamental   /u/rms/net.emacs
    fileio.c       27691 C              /u2/emacs/src/fileio.c
    NEWS           67340 Text           /u2/emacs/etc/NEWS
    *scratch*	   0	 Lisp Interaction

バッファ‘*Help*’は, ヘルプ要求で作られたものです. このバッファはファイルを訪問していません. バッファmanは, ディレクトリ‘/u2/emacs/man/’に対してdiredが作ったものです.


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

13.3 その他のバッファ操作

C-x C-q

バッファの読み出し専用状態を切り替える (vc-toggle-read-only).

M-x rename-buffer <RET> name <RET>

カレントバッファの名前を変更する.

M-x rename-uniquely

名前の最後に‘<number>’を付加して カレントバッファ名を変更する.

M-x view-buffer <RET> buffer <RET>

バッファbufferをスクロールする.

バッファは, 読み出し専用にもなります. そうすると, その内容を変更するコマンドは許されません. モード行では, 左端付近に‘%%’や‘%*’を表示して, 読み出し専用バッファであることを示します. 通常, 読み出し専用バッファは, テキストを操作する特別なコマンドを持つ diredやrmailなどのサブシステムが作ります. 書き込みを禁止されたファイルを訪問しても 読み出し専用バッファが作られます.

読み出し専用バッファで変更したいときには, コマンドC-x C-qを使います(vc-toggle-read-only). これは, 読み出し専用バッファは書き込み可能にし, 書き込み可能バッファは読み出し専用にします. 多くの場合, これは変数buffer-read-onlyを設定することで動作します. この変数は各バッファでローカルな値を持ち, 値がnil以外だとバッファは読み出し専用になります. ファイルが版管理の下に置かれている場合には, C-x C-qは版管理システムを介して バッファだけでなくファイルの読み出し専用の状態も変更します. See section VC(版管理, バージョンコントロール).

M-x rename-bufferは, カレントバッファの名前を変更します. ミニバッファ引数として新しい名前を指定します. デフォルトはありません. すでに他のバッファに使っている名前を指定すると, エラーになり, 名前は変更されません.

M-x rename-uniquelyは, 他のどれとも違う唯一の名前にするために, カレントバッファ名に数字の接尾辞を付け加えて似た名前に変更します. このコマンドは引数を必要としません. このコマンドは複数のシェルバッファを作るのに便利です. バッファ‘*Shell*’を改名すれば, M-x shellをふたたび実行して バッファ名‘*Shell*’の新しいシェルバッファを作れます. 一方, 古いシェルバッファは, 新しい名前で存在し続けます. この方法は, メイルバッファ, コンパイルバッファ, 特定の名前のバッファを作るEmacsの多くの機能にも有効です.

M-x view-bufferは, 既存のEmacsバッファを調べることを除けば, M-x view-file(see section その他のファイル操作)によく似ています. 閲覧(view)モードには, バッファを簡単にスクロールするための コマンドがありますが, 変更するコマンドはありません. qで閲覧(view)モードから抜けると, ウィンドウにまえに表示していたバッファ(とその中での箇所)に切り替わります. あるいは, eで閲覧(view)モードから抜けると, 閲覧していたバッファとそのポイント位置はそのまま残ります.

コマンド, M-x append-to-bufferM-x insert-bufferは, 1つのバッファから別のバッファへテキストをコピーするのに使います. See section テキストの蓄積.


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

13.4 バッファの消去

Emacsのセッションをしばらく続けると, たくさんの数のバッファが溜っているでしょう. もう必要としないバッファを消去したほうがよいと思うかもしれません. 多くのオペレーティングシステムでは, バッファを消去するとそのメモリ領域を解放して オペレーティングシステムに返すので, 他のプログラムが使えるようになります. バッファを消去するコマンドをいくつかあげます.

C-x k bufname <RET>

バッファbufnameを消去する(kill-buffer).

M-x kill-some-buffers

1つ1つ各バッファを消去するかどうか聞いてくる.

C-x kkill-buffer)は, ミニバッファで指定した名前のバッファを消去します. ミニバッファで<RET>だけ打ったときに使われるデフォルトは, カレントバッファを消去することです. カレントバッファを消去すると, 別のバッファが選択されます. どのウィンドウにも表示されていない, もっとも最近に選択されたバッファです. ファイルを訪問して修正してある(編集後に保存していない)バッファを 消去しようとすると, バッファを消去するまえにyesでの確認を求めます.

コマンドM-x kill-some-buffersは, 1つ1つ各バッファについて消去するか聞いてきます. yと答えると, そのバッファを消去します. カレントバッファや未保存の変更を含むバッファを消去しようとすると, 新しいバッファを選択するかkill-bufferのように確認を求めてきます.

バッファメニュー機能(see section 複数バッファの操作)も, さまざまなバッファを削除するのに便利です.

バッファを削除するときに, 毎回何か特別なことをしたいならば, フックkill-buffer-hookにフック関数を追加します(see section フック).

多くの人々がやるように, 何日にもわたってたった1つのEmacsセッションを 実行する場合, 数日前に使ったバッファで一杯になることがあります. コマンドM-x clean-buffer-listは, それらのバッファを消去する便利な方法です. 長い期間にわたって使っていない未修正のバッファすべてを消去します. 3日間表示していない普通のバッファは消去されます. しかし, 特定のバッファを自動的には消去しないようにしたり, ほんの数時間使用しないだけで消去するようにも指定できます.

真夜中(midnight)モードをオンにすれば, このようなバッファの消去を毎日真夜中に行わせることもできます. 真夜中(midnight)モードは, 毎日真夜中に動作します. 真夜中に, clean-buffer-list, あるいは, ノーマルフックmidnight-hookに指定した関数を実行します.

真夜中(midnight)モードをオンにするには, カスタマイズ(customization)バッファを使って, 変数midnight-modetを設定します. See section 簡便なカスタマイズ方法.


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

13.5 複数バッファの操作

バッファメニュー(buffer-menu)機能は 『バッファに対するdired』に似ています. このコマンドは, バッファ一覧を収めたEmacsバッファを編集することで, さまざまなEmacsバッファを操作できます. バッファの保存, 消去(ここではdiredとの一貫性のために削除と呼ぶ), 表示を行うことができます.

M-x buffer-menu

すべてのEmacsバッファの一覧を収めたバッファを編集し始める.

コマンドbuffer-menuは, すべてのEmacsバッファの一覧をバッファ‘*Buffer List*’に書き, そのバッファをバッファメニュー(buffer-menu)モードにして 選択します. そのバッファは読み出し専用で, 本節で述べる特別なコマンドでのみ変更できます. 普通のEmacsカーソル移動コマンドは, ‘*Buffer List*’バッファでも使えます. つぎにあげるコマンドは, 現在行に書かれているバッファに作用します.

d

バッファを削除(消去)するように指示し, 1行下へ移動する. この指示は, その行のバッファ名のまえに‘D’を表示する. 指示した削除は, xコマンドを打ったときに実行される.

C-d

dに似ているが, 1行下へ移動するかわりに上へ移動する.

s

バッファを保存するように指示する. この指示により, 行には‘S’が表示される. 指示した保存は, xコマンドを打ったときに実行される. 同じバッファに対して, 保存と削除の両方を指示できる.

x

まえに指示した削除と保存を実行する.

u

現在行に対する指示を消し, 1行下へ移動する.

<DEL>

1つまえの行に移動し, その行に対するどんな指示も消す.

d, C-d, s, uコマンドは, フラグを追加または削除して, 1行下へ(あるいは上へ)移動します. これらのコマンドは, 反復回数として数引数を取ります.

つぎにあげるコマンドは, 現在行に書かれているバッファにただちに作用します.

~

バッファに『変更なし』と印を付ける. コマンド~を打つと, ただちに実行する.

%

バッファの読み出し専用フラグをトグルする. コマンド%を打つと, ただちに実行する.

t

タグテーブルとしてバッファを訪問する. see section タグテーブルの選択.

他のバッファや複数のバッファを選択するコマンドもあります.

q

バッファメニューをやめる. このウィンドウには, ここに表示していたもっとも最近のバッファを表示する.

<RET>
f

*Buffer List*’のかわりに, この行のバッファをただちに選択する.

o

C-x 4 bのように, 別のウィンドウでこの行のバッファをただちに選択する. ‘*Buffer List*’はそのまま.

C-o

別のウィンドウにこの行のバッファをただちに表示するが, そのウィンドウを選択しない.

1

この行のバッファを画面一杯のウィンドウにただちに選択する.

2

ただちに2つのウィンドウにして, この行のバッファをその1つに, (‘*Buffer List*’バッファを除いて)まえに選択していたバッファを もう1つに表示する.

b

この行のバッファを一覧の最後に移す.

m

vコマンドでバッファメニューをやめたときに, この行のバッファを別のウィンドウに表示するように印を付ける. この指示は, 行頭に‘>’ を表示する. (1つのバッファに, 削除指示と表示指示の両方を付けることはできない. )

v

ただちにこの行のバッファを選択し, 別のウィンドウ群にはmコマンドで印を付けたバッファ群を表示する. 印を付けたバッファがなければ, このコマンドは1コマンドと同じ.

buffer-menuが直接行うことは, 適切なバッファを作成してそれに切り替えてから, バッファメニュー(buffer-menu)モードにすることです. それ以外の上に述べたことはすべて, バッファメニュー(buffer-menu)モードが用意した特別なコマンドで 実装されています. その結果, ‘*Buffer List*’バッファから別のEmacsバッファへ切り替えて, そこで編集できます. あとで‘*Buffer List*’バッファをふたたび選択してすでに指示した操作を実行したり, このバッファを削除したり, 無視したりもできます.

buffer-menulist-buffersの唯一の違いは, buffer-menuは選択されたウィンドウで ‘*Buffer List*’バッファに切り替えることです. list-buffersは別のウィンドウにこのバッファを表示するだけです. list-buffersを実行し(つまり, C-x C-bと打つ), ‘*Buffer List*’バッファを手動で選択すると, ここに述べたすべてのコマンドを使えます.

バッファを作成したり削除したりしても, バッファ‘*Buffer List*’は自動的に更新されません. その内容はただのテキストにすぎません. バッファを作成/削除/改名したら, 現在のバッファの状態を見るために‘*Buffer List*’を更新する方法は, grevert-buffer)を打つか, buffer-menuコマンドを再度実行することです.


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

13.6 間接バッファ

間接バッファは, 他のバッファとテキストを共有します. そのような他のバッファを間接バッファの基底バッファと呼びます. ある意味で, ファイルのあいだのシンボリックリンクに似ています.

M-x make-indirect-buffer base-buffer <RET> indirect-name <RET>

base-bufferを基底バッファとする間接バッファindirect-nameを作る.

間接バッファのテキストはつねに基底バッファのテキストと同じです. どちらか片方を編集して変更すると, 他方のバッファでもすぐにそれが見えます. しかし, それ以外のすべての点では, 間接バッファとその基底バッファは完全に別のものです. これらは, 異なる名前, 異なるポイントの値, 異なるナロイング, 異なるマーカ, 異なるメジャーモード, 異なるローカル変数を持ちます.

間接バッファではファイルを訪問できませんが, 基底バッファではできます. 間接バッファを保存しようとすると, 実際には基底バッファを保存します. 基底バッファを消去すると間接バッファも消去されますが, 間接バッファを消去しても基底バッファには影響しません.

間接バッファの使い方の1つは, アウトラインを複数の視点で表示することです. See section 複数の視点からアウトラインを眺める.


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

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