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

4. ミニバッファ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Minibuffer"
"emacs/ミニバッファ"へのコメント(無し)

ミニバッファは、単純な数よりも複雑な引数をEmacsコマンドが 読み取るために用いる機構です。 ミニバッファ引数は、ファイル名、バッファ名、Lisp関数名、Emacsコマンド名、 Lisp式など、引数を読み取るコマンドに応じて多種多様です。 ミニバッファでは、通常のバッファと同様の編集機能を用いて 引数のテキストを編集できます。

ミニバッファが使われているときには、ミニバッファはエコー領域に表示されて、 端末のカーソルもエコー領域に移動します。 ミニバッファの行の先頭にはプロンプト(prompt)が表示されます。 プロンプトにより、何を入力しそれがどのように使われるかを 知ることができます。 プロンプトは、引数を要求しているコマンドの名前から導かれることが多いです。 プロンプトは通常コロンで終ります。

コロンのあとの括弧の中にデフォルト引数(default argument)が 表示されることもあります。 これもプロンプトの一部です。 (たとえば、RETだけを打って)空の引数を入力したときには、 デフォルトが引数として使われます。 たとえば、バッファ名を読み取るコマンドは、つねに、デフォルトを表示しますが、 それはRETだけを打ったときに使われるバッファ名です。

ミニバッファ引数を入力するもっとも簡単な方法は、 目的のテキストを入力してから、 ミニバッファから抜けるRETで終えることです。 C-gを打てば、引数を必要とするコマンドを取り消して、 ミニバッファを抜けることができます。

ミニバッファは画面のエコー領域を使うため、 習慣的にエコー領域を使用するEmacsの機能と衝突する可能性があります。 Emacsは、そのような衝突を以下のように扱います。



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

4.1 ファイル名入力用のミニバッファ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Minibuffer%20File"
"emacs/ファイル名入力用のミニバッファ"へのコメント(無し)

最初からテキストを伴って始まるミニバッファもあります。 たとえば、ファイル名を指定しなければならない場合、 ミニバッファはスラッシュで終るデフォルトディレクトリ (default directory)を含んでいます。 これにより、ディレクトリを指定しなくても、 どのディレクトリからファイルを探すかわかります。

たとえば、ミニバッファがつぎのような内容で始まったとしましょう。

 
Find File: /u2/emacs/src/

ここで、`Find File: 'がプロンプトです。 buffer.cと打てば、 ファイル`/u2/emacs/src/buffer.c'を指定したことになります。 付近のディレクトリのファイルを指定するには、..を使います。 したがって、../lisp/simple.elと打てば、 `/u2/emacs/lisp/simple.el'という名前のファイルになります。 あるいは、不要なディレクトリ名であれば、 M-DELでキルできます(see 節 19.1 単語)。

デフォルトディレクトリをまったく使いたくない場合は、 C-a C-kと打ってキルできます。 しかし、デフォルトをキルする必要はありません。 単に無視すればよいのです。 スラッシュやティルダで始まる絶対ファイル名を挿入します。 たとえば、ファイル`/etc/termcap'を指定するには、 そのファイル名を挿入して、ミニバッファがつぎの内容になるようにします。

 
Find File: /u2/emacs/src//etc/termcap

GNU Emacsでは、(普通は意味のある書き方ではない) 連続した2個のスラッシュに特別な意味を与えています。 『2番目のスラッシュよりまえの文字はすべて無視する』という意味になります。 したがって、先の例では、`/u2/emacs/src/'は無視され、 `/etc/termcap'というファイル名になります。

insert-default-directorynilを設定すると、 ミニバッファにはデフォルトディレクトリを挿入しません。 つまり、ミニバッファは空で始まります。 しかし、入力したファイル名が相対的なものであれば、 同じデフォルトディレクトリ相対に解釈されます。



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

4.2 ミニバッファでの編集

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Minibuffer%20Edit"
"emacs/ミニバッファでの編集"へのコメント(無し)

ミニバッファは(少々特殊だが)普通のEmacsバッファなので、 通常のEmacsコマンドを使って、入力中の引数のテキストを編集できます。

ミニバッファでは、RETはミニバッファから抜けるように定義されているので、 ミニバッファで改行を挿入するためにRETを使うことはできません。 改行を挿入するには、C-oC-q C-jとします。 (改行とは実は文字「コントロールJ」。)

ミニバッファには独自のウィンドウがあり、 そのウィンドウは画面上の場所を占有しています。 しかし、ミニバッファが使われていないときには、 あたかも何もないかのようにふるまいます。 ミニバッファが使われているときは、 そのウィンドウは他のウィンドウと同様になります。 ミニバッファで引数を入力し終えるまでは、 C-x oで他のウィンドウに切り替えて、 そこでテキストを編集したり他のファイルを訪問したりもできます。 他のウィンドウでテキストをキルしてから、 ミニバッファウィンドウに戻ってそのテキストを ヤンクして引数として使うこともできます。 See 節 14. 複数のウィンドウ

しかし、ミニバッファウィンドウの使用にはいくつかの制限があります。 ミニバッファウィンドウではバッファを切り替えられません。 ミニバッファとそのウィンドウは恒久的に結び付いています。 また、ミニバッファウィンドウを分割したり消去したりすることもできません。 しかし、C-x ^を使う通常の方法で、 ウィンドウの高さを大きくすることは可能です。 ミニバッファリサイズ(resize-minibuffer)モードをオンにしておくと、 ミニバッファに入力したテキストを表示するのに必要なだけ、 ミニバッファウィンドウは縦に広がります。 M-x resize-minibuffer-modeを使って、 このマイナモードをオン/オフします(see 節 28.1 マイナモード(minor mode))。

ミニバッファウィンドウではスクロールは特殊な動きをします。 ミニバッファがちょうど1行分の高さで、 画面に収まらないほど長い1行のテキストが入っているときには、 スクロールするときに継続行のあいだでは何文字かを自動的に重複して表示します。 変数minibuffer-scroll-overlapで、重複させる文字数を指定します。 デフォルトは20です。

ミニバッファの中で別のウィンドウにある種のヘルプテキストを 表示するようなコマンドを実行したときには、 C-M-vを使って ミニバッファの中からヘルプテキストをスクロールできます。 これは、ミニバッファを抜けるまで有効です。 この機能は、補完をしているミニバッファが、 補完候補を別のウィンドウに表示するような場合に特に便利です。 See 節 14.3 別のウィンドウの使い方

Emacsでは、通常、ミニバッファを使っている最中には、 ミニバッファを用いるコマンドの多くを実行できないようにしています。 これは、再帰的なミニバッファの使用で初心者が混乱するのを避けるためです。 このようなコマンドをミニバッファから利用できるようにするには、 変数enable-recursive-minibuffersnil以外を設定します。



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

4.3 補完

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Completion"
"emacs/補完"へのコメント(無し)

ある種の引数では、引数の値の入力に補完(completion)を利用できます。 補完とは、引数の一部分を打つと、Emacsがその残りの部分をすべて、 あるいは既存の入力部分から決定可能な限り残りの部分を補う機能です。

補完を使えるときには、TABRETSPCの各キーは、 ミニバッファ内の既存のテキストをそれを含むより長い文字列に 補完するように再定義してあります。 補完は、引数を読み取るコマンドが用意した 補完候補群(completion alternatives)に対して 入力されたテキストとの一致をとることで行われます。 ?キーは、入力から補完可能な候補一覧を表示するように定義してあります。

たとえば、M-xがコマンド名を読み取るためにミニバッファを使っている場合、 M-xは、補完に備えて、 使用可能なすべてのEmacsコマンド名の一覧を用意します。 補完キーは、ミニバッファ内のテキストをすべてのコマンド名に照らし合わせて、 ミニバッファの既存の名前から導かれる名前の追加文字列を探し出して、 その文字列をそれまでに入力してあるテキストに付け加えます。 これにより、M-x insert-buffer RETと打つかわりに、 M-x ins SPC b RETと打つことが可能になるのです。

補完では、大文字小文字を区別します。 というのは、補完対象となる名前(バッファ名、ファイル名、コマンド名)の ほとんどでは、大文字小文字を区別しているからです。 したがって、`fo'を、`Foo'とは補完しません。 大文字小文字を区別しない引数に対しては、補完も両者を区別しません。

4.3.1 補完の例   
4.3.2 補完コマンド   
4.3.3 強い補完   
4.3.4 補完のオプション   



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

4.3.1 補完の例

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Completion%20Example"
"emacs/補完の例"へのコメント(無し)

具体的な例で考えてみましょう。 M-x au TABと打つと、 TABは`au'で始まる候補(この場合はコマンド名)を探します。 `au'で始まるものには、auto-fill-modeauto-save-modeを 含めていくつかありますが、どれも少なくともauto-までは同じです。 そこで、ミニバッファ内の`au'は`auto-'に変わります。

ここでただちにTABをもう一度打っても、 つぎにくる文字の候補が複数、つまり、`cfilrs'のどれかなので、 さらに文字が追加されることはありません。 そのかわり、TABは補完候補の一覧を別のウィンドウに表示します。

続けてf TABと打つと、 今度のTABは文字列`auto-f'を探します。 `auto-f'から始まるコマンド名はauto-fill-modeだけなので、 補完は残りの部分を補います。 これで、au TAB f TABと打つだけで、 ミニバッファには`auto-fill-mode'が入ります。 TABキーがこのような効果を持つのは、 このキーがミニバッファ内ではコマンドminibuffer-completeに バインドしてあるからだということに注意してください。



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

4.3.2 補完コマンド

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Completion%20Commands"
"emacs/補完コマンド"へのコメント(無し)

補完を使えるミニバッファでは、 つぎのような補完コマンドを定義してあります。

TAB
ミニバッファのテキストを可能な限り補完する(minibuffer-complete)。
SPC
ミニバッファのテキストを1語だけ補完する(minibuffer-complete-word)。
RET
可能な限り補完したあと、ミニバッファのテキストを引数として渡す (minibuffer-complete-and-exit)。
?
ミニバッファのテキストから補完可能な候補の一覧を表示する (minibuffer-list-completions)。

SPCTABとほぼ同じように補完しますが、 つぎのハイフンや空白を超えて補完することはありません。 ミニバッファの文字が`auto-f'であるとしましょう。 ここでSPCを打つと、SPCは`auto-fill-mode'に補完できることを 探しだしますが、`fill-'までで補完を止めます。 その結果、`auto-fill-'となります。 ここでもう一度SPCを打つと、 今度は`auto-fill-mode'まで完全に補完します。 補完を行えるミニバッファ内では、SPCは コマンドminibuffer-complete-wordを実行します。

補完候補一覧を表示しているウィンドウから補完を選ぶには、 つぎのコマンドを使えます。

Mouse-2
補完候補一覧の候補上でマウスボタン2をクリックすると、 その補完を選択する(mouse-choose-completion)。 通常は、ポイントがミニバッファ内にあるときにこのコマンドを使うだろうが、 ミニバッファではなく候補一覧でクリックする必要がある。

PRIOR
M-v
ミニバッファで、PRIORPAGE-UPM-vのいずれかを打つと、 補完候補一覧のバッファを表示しているウィンドウを選択できる (switch-to-completions)。 この機能は、以下のコマンドの利用を簡単にする。 (通常の方法でもそのウィンドウを選択できるが、この方法のほうが便利であろう。)

RET
補完候補一覧のバッファでRETを打つと、 ポイント位置にある補完かポイントに続く補完を選択する (choose-completion)。 このコマンドを使う場合、 補完候補一覧を表示しているウィンドウにまず移動する必要がある。

RIGHT
補完候補一覧のバッファで右向き矢印キーRIGHTを打つと、 ポイントはつぎの補完候補に移動する(next-completion)。

LEFT
補完候補一覧のバッファで左向き矢印キーLEFTを打つと、 ポイントはまえの補完候補に移動する(previous-completion)。



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

4.3.3 強い補完

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Strict%20Completion"
"emacs/強い補完"へのコメント(無し)

ミニバッファでの補完において、 RETは引数の使われ方に依存して3種類の異なる動作を示します。

補完コマンドは、つぎにくる文字として複数の可能性がある場合、 補完可能な全候補一覧をウィンドウに表示します。 また、?と打てば、このような一覧を表示できます。 補完候補一覧が長いときには、 C-M-vでスクロールできます(see 節 14.3 別のウィンドウの使い方)。



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

4.3.4 補完のオプション

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Completion%20Options"
"emacs/補完のオプション"へのコメント(無し)

ファイル名の補完を行う場面では、ある種のファイル名を通常無視します。 変数completion-ignored-extensionsは、文字列のリストを保持します。 これらの文字列の1つで終る名前のファイルは、補完候補としては無視します。 この変数の標準値には、".o"".elc"".dvi""~"が含まれます。 この効果は、たとえば、`foo'は、`foo.o'が存在したとしても、 `foo.c'に補完されます。 ただし、補完候補のすべてが無視すべき文字列で終るものである場合には、 これらの候補を無視しません。 無視した拡張子を持つものが補完候補一覧に入ることはありません。 一覧にはつねに補完可能な候補のすべてを表示します。

通常、補完コマンドは、つぎにくる文字を自動的に決定できない場合には、 すべての補完候補一覧を表示します。 変数completion-auto-helpnilが設定されていると、 一覧を表示しません。 補完候補を表示するには、?を打つ必要があります。

completeライブラリは、 一度に複数の単語を補完できる、より強力な補完機能を提供します。 たとえば、p-bと省略されたコマンド名を print-bufferと補完できます。 というのは、頭文字が`p'と`b'である2つの単語で 始まるコマンドが他にはないからです。 このライブラリを使うには、個人の`~/.emacs'ファイルに (load "complete")を入れておきます(see 節 28.7 初期化ファイル`~/.emacs')。

補完示唆(icomplete)モードでは、 それまでに入力したテキストから補完できるものを常時更新して表示します。 このマイナモードをオン/オフするコマンドはM-x icomplete-modeです。



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

4.4 ミニバッファ履歴

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Minibuffer%20History"
"emacs/ミニバッファ履歴"へのコメント(無し)

ミニバッファで入力した引数はすべてミニバッファ履歴リスト (minibuffer history list)に保存され、 あとで別の引数中で使うことができます。 特別のコマンドで、以前に使った引数のテキストをミニバッファに入れます。 これらは、ミニバッファの古い内容を破棄するので、 過去の引数の履歴の中を動き廻っていると考えることができます。

UP
M-p
ミニバッファ履歴中の1つまえ(古い)の引数文字列に移動する (previous-history-element)。
DOWN
M-n
ミニバッファ履歴中の1つつぎ(新しい)の引数文字列に移動する (next-history-element)。
M-r regexp RET
ミニバッファ履歴中の引数文字列を古いほうへ遡って regexpに一致するものに移動する (previous-matching-history-element)。
M-s regexp RET
ミニバッファ履歴中の引数文字列を新しいほうへ辿って regexpに一致するものに移動する (next-matching-history-element)。

履歴リストに保存されている引数を再利用するもっとも簡単な方法は、 履歴リストの中を1つ1つ移動していくことです。 ミニバッファの中では、1つまえ(古い)のミニバッファの入力内容に 『移動する』にはM-pprevious-history-element)を、 1つあと(新しい)の入力内容に移動するには M-nnext-history-element)を打ちます。

ミニバッファの内容は、履歴から持ってきた以前の入力内容で完全に 置き換えられます。 この内容を引数として使うには、 通常と同じようにRETでミニバッファを抜けます。 引数として再使用するまえに、テキストを編集してもかまいません。 編集してもミニバッファに『持ってきた』履歴のもともとの要素は変更されません。 ただし、当然、新しい引数は履歴リストの最後に追加されます。

多くのミニバッファ引数には、デフォルト値があります。 ミニバッファ履歴操作コマンドが、 これらのデフォルト値を知っている場合もあります。 その場合、M-nで履歴中の『未来』へ移動する (12) ことで、このデフォルト値をテキストとしてミニバッファに挿入できます。 将来的には、ミニバッファにデフォルト値がある場合には、 つねにこの機能を利用できるようにしたいと考えています。

履歴の中を前向きや後向きに探索するコマンドもあります。 これらのコマンドは、ミニバッファで指定した正規表現に 一致する履歴要素を探索します。 M-rprevious-matching-history-element)は、 履歴のより古い要素を探します。 一方、M-snext-matching-history-element)は、 より新しい要素を探します。 特例なのですが、 これらのコマンドは、コマンドを呼び出す時点で すでにミニバッファに入っているにも関わらず、 ミニバッファから引数を読み取ります。 インクリメンタルサーチの場合と同様に、 正規表現に大文字を使うと、大文字小文字を区別して探索します (see 節 10.6 探索と大文字小文字の区別)。

ミニバッファを使えば入力は必ず履歴リストに記録されますが、 引数の種類ごとに別々の履歴リストがあります。 たとえば、ファイル名に関する履歴リストは、 ファイル名を読み取るすべてのコマンドで使われます。 (特別な機能として、この履歴リストには、 絶対ファイル名を入力しなくても絶対ファイル名が記録される。)

特定目的用の履歴リストがいくつかあります。 M-xが読むコマンド名用、バッファ名用、 query-replaceのようなコマンドの引数用、 compileが読むコンパイルコマンド用などです。 さらに、ほとんどのミニバッファ引数が利用する 『その他』の履歴リストも1つあります。

変数history-lengthは、ミニバッファ履歴リストの最大長を指定します。 履歴リストが設定された長さに達すると、 そのあとは、新しい要素を追加するたびに最古の要素を削除します。 ただし、変数history-lengthの値がtであると、 長さの制限はなくなり要素を削除しません。



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

4.5 ミニバッファコマンドの繰り返し

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Repetition"
"emacs/ミニバッファコマンドの繰り返し"へのコメント(無し)

ミニバッファを少なくとも1回使ったコマンドは、 その引数の値とともにすべて特別な履歴リストに記録されますから、 コマンド全体を繰り返すことができます。 特に、M-xはコマンド名を読み取るためにミニバッファを使うので、 必ず履歴に記録されます。

C-x ESC ESC
最近のミニバッファコマンドを再実行する(repeat-complex-command)。
M-x list-command-history
C-x ESC ESCで繰り返せるすべてのコマンドを 新しいものから順に並べたコマンド履歴全体を表示する。

C-x ESC ESCは、 ミニバッファを利用した最近のコマンドを再度実行します。 引数を指定しなければ、そのような最後のコマンドを繰り返します。 数引数は、どのコマンドを繰り返すかを指定します。 1は最後のコマンドを指し、大きい数ほどより以前のコマンドを指します。

C-x ESC ESCは、過去のコマンドをLisp式に変換し、 その式のテキストで初期化したミニバッファに入ります。 RETだけを打てば、コマンドは以前とまったく同様に繰り返されます。 Lisp式を編集してコマンドを変更してもかまいません。 最終的な式が何であれ、その式を実行します。 繰り返したコマンドは、 履歴リスト内に既存の最後に実行したコマンドと同一でない限り、 コマンド履歴の先頭に追加されます。

Lisp構文が理解できないとしても、 繰り返しのためにどのコマンドが表示されたか、たぶんわかるでしょう。 テキストを変更しなければ、以前とまったく同じに繰り返されます。

C-x ESC ESCでいったんミニバッファに入ってしまえば、 ミニバッファ履歴リストコマンド (M-pM-nM-rM-s、see 節 4.4 ミニバッファ履歴) を使って、保存されたすべてのコマンドの履歴リストの中を動き廻れます。 目的のコマンドを捜しあてたら、通常の方法でその式を編集できますし、 これも通常と同じようにRETを打てば実行できます。

ミニバッファを使った過去のコマンド一覧は、 Lispのリストとして変数command-historyに格納されます。 各要素はそれぞれ1つのコマンドとその引数を表すLisp式です。 Lispプログラムからは、 command-historyの要素を引数として evalを呼べばコマンドを再実行できます。


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