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

17. ミニバッファ

ミニバッファ(minibuffer)はEmacsのコマンドが使う特殊なバッファで、 一つの数値前置引数よりも複雑な複数の引数を読み込むのに使います。 これら引数はファイル名、バッファ名、そして(M-xでの)コマンド名を含みます。 ミニバッファはエコー領域と同じ場所である、スクリーンの最下行に、 一つの引数を読み込むために使う間だけ表示されます。


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

17.1 ミニバッファの紹介

ほとんどの部分において、ミニバッファは普通のEmacsのバッファです。 バッファで使うほとんどの操作、編集コマンドなどは、 ミニバッファ内で普通に動作します。けれどもバッファ自体を扱う操作のほとんどは、 ミニバッファに対しては適用されません。ミニバッファの名前は常に `*Minibuf-number'の形式を持ち、変更はできません。 ミニバッファはミニバッファだけに使われる専用のウィンドウだけに表示されます。 これらウィンドウは常にフレームの下部に現れます(時にはフレームが ミニバッファ・ウィンドウを持たない場合や、 時には特別な種類のフレームがミニバッファ・ウィンドウだけしか 含んでないこともあります。 ミニバッファとフレーム参照)。

ミニバッファ・ウィンドウは通常1行です。 一時的にウィンドウ・サイズ変更コマンドで大きさを変えることができます。 この場合、ミニバッファを抜けると普通の大きさに戻ります。 ミニバッファがアクティブでないときは、 ウィンドウ・サイズ変更コマンドをフレームのほかのウィンドウに使うことで、 恒久的にその大きさを変えることもできます。 フレームがミニバッファだけを含む場合、 フレームの大きさを変更することでミニバッファの大きさを変更できます。

コマンドが、アクティブなミニバッファがあるのに別のミニバッファを使うと、 これを再帰的ミニバッファ(recursive minibuffer)と呼びます。 最初のミニバッファは` *Minibuf-0*'と名づけられます。 再帰的ミニバッファはこの名前の終りにある数を増やすことで名づけられます (名前が一つの空白ではじまることで、通常のバッファ・リストに現れないように なります)。複数の再帰的ミニバッファのうち、最も内側の(即ち最も最近に入った) ミニバッファがアクティブなミニバッファとなります。普通ミニバッファといえば、 これを指します。 再帰的ミニバッファは、変数enable-recursive-minibuffersを設定する、 あるいはコマンド・シンボルにこの名前の属性を置くことで、許可あるいは 禁止することができます(see section ミニバッファそのほか)。

ほかのバッファ同様、ミニバッファはいくつかあるローカル・キーマップの いずれかをたいていは使います(see section キーマップ)。これらはさまざまなミニバッファを 抜けるコマンドや、場合によっては補完コマンドを含みます(see section 補完)。


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

17.2 ミニバッファからテキスト文字列を読みとる

ほとんどの場合、ミニバッファはテキストを文字列として読むために使います。 Lispオブジェクトをテキスト形式で読み込むためにも使います。 ミニバッファ入力の最も基本的なプリミティブは、 read-from-minibufferです。これでそのいずれかを行なうことができます。

ほとんどの場合、Lisp関数の途中でミニバッファ入力関数を呼ぶべきでは ありません。代わりに、全てのミニバッファ入力をコマンド引数の読込みの一部とし、 interactive指定の中で済ませます。See section コマンドの定義

Function: read-from-minibuffer prompt-string &optional initial-contents keymap read hist

この関数は、ミニバッファから入力を取る、最も一般的な方法です。 デフォルトでは、任意のテキストを受けつけそれを文字列として返します。 しかしreadが非nilならば、readを使ってそのテキストを Lispオブジェクトに変換します(see section 入力関数)。

この関数が最初にやるのは、ミニバッファをアクティブにし、 prompt-stringをプロンプトとして表示することです。 この変数は、文字列でなければなりません。

次に、initial-contentsが文字列ならば、 read-from-minibufferがそれをミニバッファに入れ、 ポイントを末尾に置きます。ミニバッファはこのテキストをその内容として現れます。

initial-contentsの値は、(string . position)の形式の コンス・セルであっても構いません。これはstringをミニバッファに入れますが、 末尾ではなく、先頭からposition文字目にポイントを置きます。

keymapが非nilならば、そのキーマップはミニバッファで使う ローカル・キーマップです。keymapが省略されたあるいはnilならば、 minibuffer-local-mapの値をキーマップとして使います。 キーマップを指定することは、ミニバッファをさまざまな用途(たとえば補完)に カスタマイズするための最も重要な方法です。

引数histで、入力を保存するためとミニバッファで使う履歴コマンドのために、 どの履歴リスト変数を使うかを指定します。 デフォルトはminibuffer-historyです。See section ミニバッファ履歴

ユーザが、ミニバッファを抜けるためのコマンドをタイプすると、 read-from-minibufferはミニバッファ内のテキストからその戻り値を作ります。 普通はそのテキストを内容とする文字列を作るだけです。 しかし、readが非nilならば、read-from-minibufferは テキストを読み込み、結果のLispオブジェクトを評価せずに返します (読込みに関することがらは、See section 入力関数)。

Function: read-string prompt &optional initial

この関数は、ミニバッファから文字列を読んで、それを返します。 引数promptinitialは、read-from-minibufferと 同じように使います。使用するキーマップはminibuffer-local-mapです。

これはread-from-minibuffer関数への単純化したインタフェースです:

 
(read-string prompt initial)
≡
(read-from-minibuffer prompt initial nil nil nil)
Variable: minibuffer-local-map

これがミニバッファから読み込むときのデフォルト・ローカル・キーマップです。 デフォルトでは、次のバインドになります:

LFD

exit-minibuffer

RET

exit-minibuffer

C-g

abort-recursive-edit

M-n

next-history-element

M-p

previous-history-element

M-r

next-matching-history-element

M-s

previous-matching-history-element

Function: read-no-blanks-input prompt &optional initial

この関数は、ミニバッファから文字列を読みますが、空白文字が入力の一部にあっては いけません。その代わり、それら文字は入力を終らせます。引数promptinitialは、read-from-minibufferと同じように使います。

これは、read-from-minibuffer関数に対する単純化したインタフェースであり、 minibuffer-local-ns-mapキーマップの値を、 この関数のkeymap引数として渡します。 キーマップminibuffer-local-ns-mapC-qを再バインドしないので、 quoteすれば、スペースを文字列に置くことが可能です

 
(read-no-blanks-input prompt initial)
≡
(read-from-minibuffer prompt initial minibuffer-local-ns-map)
Variable: minibuffer-local-ns-map

本組込み変数は、関数read-no-blanks-inputが ミニバッファ・ローカル・キーマップとして使うキーマップです。 デフォルトでは、minibuffer-local-mapのデフォルトに加えて、 次のバインドになります:

SPC

exit-minibuffer

TAB

exit-minibuffer

?

self-insert-and-exit


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

17.3 ミニバッファからLispオブジェクトを読み込みます

本節ではミニバッファからLispオブジェクトを読み込む関数を説明します。

Function: read-minibuffer prompt &optional initial

この関数は、Lispオブジェクトをミニバッファで読み込み、それを評価せずに返します。 引数promptinitialは、 read-from-minibufferと同じように使います。

これはread-from-minibuffer関数への単純化したインタフェースです:

 
(read-minibuffer prompt initial)
≡
(read-from-minibuffer prompt initial nil t)

文字列"(testing)"を初期入力として与える例:

 
(read-minibuffer
 "Enter an expression: " (format "%s" '(testing)))

;; ミニバッファはこのように表示される:

---------- Buffer: Minibuffer ----------
Enter an expression: (testing)∗
---------- Buffer: Minibuffer ----------

ユーザはRETをタイプして、直ちに初期入力をデフォルトとして 使ってもいいです。あるいは、その入力を編集してもいいです。

Function: eval-minibuffer prompt &optional initial

この関数は、ミニバッファからLisp式を読み込み、評価して、結果を返します。 引数promptinitialは、 read-from-minibufferと同じように使います。

この関数は、read-minibuffer呼出しの結果を単純に評価します:

 
(eval-minibuffer prompt initial)
≡
(eval (read-minibuffer prompt initial))
Function: edit-and-eval-command prompt form

この関数は、Lisp式をミニバッファから読み込み、評価します。 このコマンドとeval-minibufferとの違いは、ここでの初期formが 必須となり、テキスト文字列としてではなく、印字表現に変換される Lispオブジェクトとして扱われることです。これはprin1で 印字されるので、文字列ならば、ダブル・クォート文字(`"')が 初期テキスト中に現れます。See section 出力関数

edit-and-eval-commandが最初にやることは、promptをプロンプトとする ミニバッファをアクティブにすることです。次にformの印字表現を ミニバッファに挿入し、ユーザに編集させます。ユーザがミニバッファを抜けると、 編集されたテキストをreadで読み込み、評価します。結果の値が edit-and-eval-commandの値となります。

次の例では、すでに形式として有効である式を初期テキストとしてユーザに 提供しています:

 
(edit-and-eval-command "Please edit: " '(forward-word 1))

;; この式を評価すると、 
;;   次のようにミニバッファに現れる:

---------- Buffer: Minibuffer ----------
Please edit: (forward-word 1)∗
---------- Buffer: Minibuffer ----------

直ちにRETをタイプすると、ミニバッファを抜け式を評価するので、 ポイントが1語前に進みます。本例では、edit-and-eval-commandnilを返します。


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

17.4 ミニバッファ履歴

ミニバッファ履歴リスト(minibuffer history list)は以前の ミニバッファ入力を記録し、ユーザがそれを便利に再利用できるようにします。 履歴リストは実はシンボルであり、リストではありません。これは、その値が 新しいものほど先に来る文字列(以前の入力)のリストになっている変数です。

異なる種類の入力に使う、別個の履歴リストが多数あります。 ミニバッファを使う度に正しい履歴リストを指定するのは、 Lispプログラマの仕事です。

ミニバッファ入力の基本関数read-from-minibuffercompleting-readも 双方共オプション引数histを受けつけ、これによって履歴リストを指定します。 以下は、指定可能な値です:

variable

variable(シンボルである)を履歴リストとして使います。

(variable . startpos)

variable(シンボルである)を履歴リストとして使い、 初期履歴位置をstartpos(履歴の最新の要素を0として数えた整数)であると 仮定します。

startposを指定したならば、一貫性のために、それが指す履歴要素を 初期ミニバッファ内容として指定することも必要になります。

histを指定しなかったならば、 デフォルト履歴リストminibuffer-historyが使用されます。 そのほかの標準履歴リストについては以下を参照。自分個人の履歴リスト変数を 作ることもできます。最初に使う前にnilに初期化するだけでいいです。

read-from-minibuffercompleting-readは、 新しい要素を履歴リストに自動的に追加し、ユーザがリスト上の項目を 再使用するためのコマンドを提供しています。自作のプログラムが 履歴リストを使うには、使いたいときにそれを初期化し、 その名前を入力関数に渡すだけです。ただし、ミニバッファ入力関数が 使ってないときには、そのリストを手で修正しても平気です。

Variable: minibuffer-history

ミニバッファ履歴入力のための、デフォルトの履歴リスト。

Variable: query-replace-history

query-replaceの引数(と、ほかのコマンドの似た引数)のための履歴リスト。

Variable: file-name-history

ファイル名引数のための、履歴リスト。

Variable: regexp-history

正規表現引数のための、履歴リスト。

Variable: extended-command-history

拡張コマンドの名前(これ自体が引数)のための、履歴リスト。

Variable: shell-command-history

シェル・コマンド(これ自体が引数)のための、履歴リスト。

Variable: read-expression-history

評価すべきLisp式(これ自体が引数)のための、履歴リスト。


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

17.5 補完

補完(completion)は、省略形からはじめて名前の残りを埋める機能です。 補完は、ユーザの入力を有効な名前のリストと比較し、名前のどこまでが 一意に決められるかをユーザがタイプしたもので判別することによって、働きます。 たとえば、C-x b(switch-to-buffer)とタイプし、続いて切替えたい バッファ名の最初の何文字かをタイプし、 続いてTAB(minibuffer-complete)をタイプすると、 Emacsはその名前を可能なかぎり長いところまで展開します。

標準的Emacsコマンドはシンボル名、ファイル名、バッファ名、プロセス名の 補完を提供しています。本章の関数を使えば、ほかの種類の名前の補完を 実装することができます。

try-completion関数は補完の基本的なプリミティブです。 これは、与えられた文字列の集合に対して一致する、 与えられた初期文字列の最長の補完を判別して返します。

関数completing-readは補完のための、より高い水準のインタフェースを 提供します。completing-readの呼出しで、有効な名前のリストの 判別法を指定します。この関数は次に、補完に便利なコマンドを いくつかのキーにバインドしたローカル・キーマップをもつミニバッファを アクティブにします。 ほかの関数は、ある種の名前を補完で読み込む便利で単純なインタフェースを 提供します。


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

17.5.1 基本的補完関数

二つの関数try-completionall-completionは、 それら自身はミニバッファとは何の関係ありません。これらを本章で説明したのは、 これらをミニバッファを使う高水準補完機能の近くに置いておきたかったからです。

Function: try-completion string collection &optional predicate

この関数は、collection中から、stringの可能な補完全ての 最長共通部分文字列を返します。collectionの値は、alist、obarray、 文字列の仮想集合を実現する関数(以下参照)のいずれかを取る必要です。

補完では、stringcollectionで指定された任意補完のそれぞれに対して 比較します。任意補完の冒頭部分がstringに等しければ、一致です。 任意補完に一致するものがなければ、try-completionnilを返します。 ただ一つの任意補完が一致した場合で、それが完全一致ならば、 try-completiontを返します。さもなくば、その値は 一致した全ての任意補完に共通な最長の始めの部分 (12)になります。

collectionがalist(see section 連想リスト)ならば、 alist要素のCARが任意補完集合を成します。

collectionがobarray(see section シンボルの作成と intern)ならば、 obarray中の全てのシンボルの名前が任意補完集合を成します。 グローバル変数obarrayは全てのinternされたLispシンボルの名前を 含むobarrayを保持しています。

新たなobarrayを作る唯一の有効な方法は方法は、それを空にしてから シンボルを一つずつinternによって追加してゆくことであることに 注意してください。 与えられたシンボルを複数のobarrayにinternすることもできません。

引数predicateが非nilならば、それは引数一つの関数で なければなりません。これは各一致候補を検査するために使われ、 predicateが非nilを返したときにかぎりその候補が受け入れられます。 predicateに与えられる引数は、alistからのコンス・セル(そのCARは 文字列)であるか、そうでなければ、obarrayからのシンボル(シンボル名 ではない)です。

collectionとして、関数であるシンボルを使うこともできます。 この場合関数は補完の実行に対して一切の責任を持ちます。 ここでtry-completionは、この関数が何を返そうともそれを返します。 この関数は、三つの引数を持って呼ばれます。それらはstringpredicatenilです(3番目の引数の理由は、同じ関数がall-completionsで 使えるようにし、なおかつ、どちらの場合でも適切に働くようにするためです)。 See section プログラム補完

以下の例の1番目では、文字列`foo'がalistのCARの三つに一致しています。 全ての一致は文字列`fooba'ではじまっているので、それが結果となります。 2番目の例では、一致候補はただ一つで、それが完全なので、値がt となります。

 
(try-completion 
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
     ⇒ "fooba"

(try-completion "foo" '(("barfoo" 2) ("foo" 3)))
     ⇒ t

以下の例では、おびただしいシンボルが文字列`forw'で始まり、それらの全てが 単語`forward'で始まっています。シンボルのほとんどにおいて、 これに`-'が続いていますが、全てではないので、`forward'以上 補完することはできません。

 
(try-completion "forw" obarray)
     ⇒ "forward"

最後に以下の例では、三つの一致候補のうち、二つだけが述語testを パスしました(文字列`foobaz'は短か過ぎました)。これらのいずれも 文字列`foobar'で始まります。

 
(defun test (s) 
  (> (length (car s)) 6))
     ⇒ test
(try-completion 
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) 
 'test)
     ⇒ "foobar"
Function: all-completions string collection &optional predicate nospace

この関数は、stringの可能な補完の全てをリストで返します。 この関数へのパラメータはtry-completionに対するものと同じです。

collectionが関数ならば、それが三つの引数をもって呼び出されます。 それらはstringpredicatetです。そして all-completionsは、この関数が何を返そうともそれを返します。 See section プログラム補完

変数nospaceが非nilならば、スペースで始まる補完は、 stringも同様にスペースで始まっているのでないかぎり、無視されます。

try-completionの例で示した関数testを使った例を挙げます:

 
(defun test (s) 
  (> (length (car s)) 6))
     ⇒ test

(all-completions  
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 'test)
     ⇒ ("foobar1" "foobar2")
Variable: completion-ignore-case

この変数の値が非nilならば、Emacsは補完において大文字/小文字の 区別をしません。


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

17.5.2 補完とミニバッファ

本節では補完を使ってミニバッファから読み込む基本的なインタフェースを 説明します。

Function: completing-read prompt collection &optional predicate require-match initial hist

この関数は、ユーザを補完で助けながら、ミニバッファで文字列を読み取ります。 この関数は、プロンプトpromptでミニバッファをアクティブにします。 promptは文字列でなければならない。initialが非nilならば、 completing-readはそれを入力の一部として、ミニバッファに挿入します。 続いて、いくつかの補完を試みるコマンドを用意して、 ユーザが入力を編集できるようにします。

実際の補完はcollectionpredicateを関数try-completionに 渡すことで行なわれます。これはローカル・キーマップにバインドされた 補完のためのある種のコマンドにおいて実行されます。

require-matchtならば、通常のミニバッファを抜けるコマンドでは、 入力がcollectionの要素に補完されないかぎり抜けることはありません。 require-matchnilでもtでもないならば、 タイプされた入力がcollectionの要素自身とならないかぎり、 ミニバッファを抜けるコマンドで抜けることができません。 require-matchnilならば、ミニバッファの入力に関わらず、 ミニバッファを抜けるコマンドは使えます。

ユーザはミニバッファが空のままRETをタイプして、何も入力しないで 抜けることができます。この場合、completing-readnilを返します。 これによってユーザは、コマンドが今読み込んでいる値に対するデフォルトが どんなものであっても、それを指定することができます。ユーザは、 require-matchの値に関わらず、 このようにRETを使って戻ることができます。

関数completing-readread-minibufferを呼び出すことで働きます。 require-matchnilならばminibuffer-local-completion-map をキーマップとして使いますし、require-matchが非nilならば minibuffer-local-must-match-mapを使います。See section 補完を行なうミニバッファ・コマンド

引数histで、入力の保存とミニバッファ履歴コマンドに どの履歴リスト変数を使うのかを指定します。デフォルトはminibuffer-history です。See section ミニバッファ履歴

補完は、組込み変数completion-ignore-caseが非nilならば、 一致候補に対して入力を比較するときに、大文字/小文字を無視します。 See section 基本的補完関数

 
(completing-read
 "Complete a foo: "
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 nil t "fo")

;; この式を評価すると、
;;   次のようにミニバッファに現れる:

---------- Buffer: Minibuffer ----------
Complete a foo: fo∗
---------- Buffer: Minibuffer ----------

続いてユーザがDEL DEL b RETとタイプすると、 completing-readbarfooを返します。

completion-read関数は、実際に補完を行なうコマンドに情報を渡すために、 三つの変数を束縛します。これら変数は、minibuffer-completion-tableminibuffer-completion-predicateminibuffer-completion-confirm です。これらについて詳しいことは、補完を行なうミニバッファ・コマンドを見てください。


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

17.5.3 補完を行なうミニバッファ・コマンド

本節では、ミニバッファで補完を行なうために使うキーマップ、コマンド、ユ ーザ・オプションを説明します。

Variable: minibuffer-local-completion-map

completing-readは補完の各候補との完全一致が要求されてないときには、 この値をローカル・キーマップとして使います。デフォルトでは、 このキーマップは次のバインドを成します:

?

minibuffer-completion-help

SPC

minibuffer-complete-word

TAB

minibuffer-complete

ほかの文字については、minibuffer-local-map同様にバインドされます。

Variable: minibuffer-local-must-match-map

completing-readは補完の各候補との完全一致が要求されたときには、 この値をローカル・キーマップとして使います。それゆえ、無条件にミニバッファを 抜けるコマンドexit-minibufferはどのキーにもバインドされていません。 デフォルトではこのキーマップは次のバインドを成します:

?

minibuffer-completion-help

SPC

minibuffer-complete-word

TAB

minibuffer-complete

LFD

minibuffer-complete-and-exit

RET

minibuffer-complete-and-exit

ほかの文字については、minibuffer-local-map同様にバインドされます。

Variable: minibuffer-completion-table

この変数の値は、ミニバッファでの補完に使われるalistあるいはobarrayです。 これはグローバル変数で、completing-readtry-completionに 渡すものを内容としています。minibuffer-complete-wordのような ミニバッファ補完コマンドで使われます。

Variable: minibuffer-completion-predicate

この変数の値はcompleting-readtry-completionに渡す述語です。 この変数は、ほかのミニバッファ補完関数でも使われます。

Command: minibuffer-complete-word

この関数は、ミニバッファの内容を高々1単語まで、補完します。ミニバッファの内容が 一つの補完しか持たなかったとしても、minibuffer-complete-wordは 語構成可能ではない最初の文字を超えて文字を追加することはありません。 See section 構文テーブル

Command: minibuffer-complete

この関数は、ミニバッファの内容を可能なかぎり最大に補完します。

Command: minibuffer-complete-and-exit

この関数は、ミニバッファの内容を補完し、確認が要求されてなければ抜けます。 即ち、minibuffer-completion-confirmnilならば、そうします。 確認が要求されているならば、2度続けて実行すると、-- 本コマンドを 直ちに繰り返すことで、そうなりますが -- このコマンドは確認抜きで 働くよう作られています。

Variable: minibuffer-completion-confirm

この変数の値が非nilの場合、Emacsはミニバッファを抜ける前に補完の確認を 促します。関数minibuffer-complete-and-exitはこの変数の値を抜ける前に チェックします。

Command: minibuffer-completion-help

この関数は、現在のミニバッファの内容の可能な補完のリストを作ります。これは、 変数minibuffer-completion-tableの値をcollection引数とし、 minibuffer-completion-predicateの値をpredicate引数として、 all-completionsを呼び出すことで行ないます。補完のリストは、 `*Completions*'という名前のバッファにテキストで表示されます。

Function: display-completion-list completions

この関数は、completionsstandard-outputのストリーム、通常はバッファ、 に表示します(ストリームについてのこれ以上のことがらは、See section Lispオブジェクトの読込みと印字)。 引数completionsは通常はall-completionsが返した補完のリスト そのままですが、そうである必要ありません。 シンボルあるいは文字列であるような各要素はいずれも単に表示しますが、 二つの文字列からなるリストはその文字列を結合したかのように表示します。

この関数は、minibuffer-completion-helpから呼び出されます。 最もよく使う方法は、with-output-to-temp-bufferとともに使うやり方で、 このようにします:

 
(with-output-to-temp-buffer "*Completions*"
  (display-completion-list
    (all-completions (buffer-string) my-alist)))
User Option: completion-auto-help

この変数が非nilならば、補完コマンドが、次の文字が一意に決められない という理由で補完できるものがないという場合はいつでも、可能な補完のリストを 自動的に表示します。


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

17.5.4 高水準補完関数

本節ではある種の名前を補完で読み込むための、高水準の便利な関数を 説明します。

ほとんどの場合、Lisp関数の途中でこれら関数を呼ぶべきではありません。 可能なときは、全てのミニバッファ入力をコマンド引数の読込みの一部とし、 interactive指定の中で済ませます。See section コマンドの定義

Function: read-buffer prompt &optional default existing

この関数は、バッファ名を読み込み、それを文字列として返します。 引数defaultはデフォルト名として使い、ユーザがミニバッファに 何も入れずに抜けたときにはその値が返ります。非nilならば、 文字列あるいはバッファでなければなりません。これはプロンプトには表示されるが、 初期入力としてミニバッファに挿入されることはありません。

existingが非nilならば、指定された名前は存在するバッファのもの でなければなりません。ミニバッファを抜ける普通のコマンドでは、テキストが 有効でないかぎり、抜けることはできません。さらにRETは有効な名前を 見つけるように補完を行ないます(けれども、defaultの有効性は チェックしません。ユーザがミニバッファに何も入れずに抜けたときは、 値が何であっても、これを返します)。

次の例では、ユーザが`minibuffer.t'を入力し、続いてRETをタイプする。 引数existingtで、与えられた入力で始まるバッファ名は `minibuffer.texi'だけなので、その名前が値となります。

 
(read-buffer "Buffer name? " "foo" t)
;; この式を評価すると、 
;;   次のプロンプトが
;;   空のミニバッファとともに現れる:

---------- Buffer: Minibuffer ----------
Buffer name? (default foo) ∗
---------- Buffer: Minibuffer ----------

;; ユーザがminibuffer.t RETとタイプする。
     ⇒ "minibuffer.texi"
Function: read-command prompt

この関数は、コマンド名を読み込み、それをLispシンボルとして返します。 引数promptread-from-minibufferと同様に使われます。 コマンドはcommandptを返すものならば何でもコマンドですが、 コマンド名はcommandptを返すシンボルであることを 思い出してください。 See section 対話的呼出し

 
(read-command "Command name? ")

;; この式を評価すると、 
;;   次のプロンプトが空のミニバッファとともに現れる:

---------- Buffer: Minibuffer ---------- 
Command name?  
---------- Buffer: Minibuffer ----------

ユーザがforward-c RETとタイプすると、 この関数は、forward-charを返します。

read-command関数は、関数completing-readへの単純化した インタフェースです。この関数は、現存するLispシンボルの集合から補完するために 変数obarrayを使い、コマンド名だけを受けつけるためにcommandp 述語を使います:

 
(read-command prompt)
≡
(intern (completing-read prompt obarray 
                         'commandp t nil))
Function: read-variable prompt

この関数は、ユーザ変数の名前を読み込み、それをシンボルとして返します。

 
(read-variable "Variable name? ")

;; この式を評価すると、 
;;   次のプロンプトが 
;;   空のミニバッファとともに現れる:

---------- Buffer: Minibuffer ----------
Variable name? ∗
---------- Buffer: Minibuffer ----------

ユーザが続いてfill-p RETとタイプすると、read-variablefill-prefixを返す。

この関数は、read-commandに似ていますが、commandpの代わりに 述語user-variable-pを使います:

 
(read-variable prompt)
≡
(intern
 (completing-read prompt obarray
                  'user-variable-p t nil))

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

17.5.5 ファイル名の読み取り

ここでファイル名を読み取るために設計された、もう一つの高水準補完関数を 挙げます。これにはデフォルト・ディレクトリの自動挿入という 特殊機能も用意されています。

Function: read-file-name prompt &optional directory default existing initial

この関数は、ミニバッファからファイル名を読み取ります。promptをプロンプトし、 補完を用意しています。defaultが非nilならば、 ユーザがRETだけをタイプしたときにはdefaultを返します。 defaultの有効性のチェックは行ないません。ユーザがミニバッファに何も入れずに 抜けたときは、値が何であっても、これを返します。

existingが非nilならば、ユーザは存在するファイルの名前を 指定しなければなりません。RETは可能なら有効な名前になるように 補完を行ない、それが有効でないかぎりミニバッファを抜けません。 existingの値がnilでもtでもない場合、RETは 補完の後に確認も要求します。existingnilならば、 存在しないファイルの名前も受けつけます。

引数directoryは相対ファイル名の補完に使うディレクトリを指定します。 insert-default-directoryが非nilならば、directoryは ミニバッファにも初期入力として挿入します。デフォルトはカレント・バッファの default-directoryの値です。

initialを指定すると、それが初期ファイル名としてミニバッファに (directoryが挿入されるなら、その後ろに)挿入されます。 この場合、ポイントはinitialの先頭に行きます。initialのデフォルトは nilです -- ファイル名は一切挿入しません。initialが何をするのか 見たい場合は、コマンドC-x C-vを試してください。

 
(read-file-name "The file is ")

;; この式を評価すると、 
;;   次のようにミニバッファに現れる:

---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/∗
---------- Buffer: Minibuffer ----------

manual TABをタイプすると、次の結果になります:

 
---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/manual.texi∗
---------- Buffer: Minibuffer ----------

ユーザがRETをタイプすると、read-file-nameはファイル名を

User Option: insert-default-directory

この変数は、read-file-nameで使われます。その値は、 read-file-nameが(もしあれば初期ファイル名を加えた) デフォルト・ディレクトリ名を、ミニバッファに置いて処理を開始するか 否かを制御します。この変数の値がnilならば、read-file-nameは ミニバッファに何の初期入力も置きません (初期入力をinitial引数で指定した場合を除く)。この場合、 デフォルト・ディレクトリは相対ファイル名の補完に相変わらず使われるが、 表示はされません。

 
;; この場合はミニバッファはデフォルト・ディレクトリから開始する。
(let ((insert-default-directory t))
  (read-file-name "The file is "))

---------- Buffer: Minibuffer ----------
The file is ~lewis/manual/∗
---------- Buffer: Minibuffer ----------

;; この場合はミニバッファは空で
;;   プロンプトのみがその行に現れる。
(let ((insert-default-directory nil))
  (read-file-name "The file is "))

---------- Buffer: Minibuffer ----------
The file is ∗
---------- Buffer: Minibuffer ----------

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

17.5.6 プログラム補完

時には意図する可能な補完の全てを含むalistやobarrayを作ることが できない場合もあります。このような場合、与えられた文字列の補完を計算するような 自分のための関数を用意することができます。これを プログラム補完(programmed completion)と呼びます。

本機能を使うには、completing-readcollection引数として、 関数定義をもつシンボルを渡せばいいです。関数completing-readは 自作の補完関数をtry-completionall-completionsに知らせて、 自作の関数が作業の全てを行なえるように調整します。

自作の補完関数は、三つの引数を受けつけなければなりません:

フラグの値としては三つあり、三つの操作に対応します:

補完関数群のcollectionに、lamda式(関数であるリスト)を 関数シンボル同様に使えるようにすれば、一貫性もありきれいにもなるでしょう。 しかし、これは不可能です。補完テーブルとしてのリストがすでに違う意味、 alistとして、割り当てられています。失敗しないようにalistを正常に 操作しようとすることは信頼できないと思われます。なぜならそれが 関数の可能性があるからです。そこで、補完に使いたい自作関数は 全てシンボルにカプセル化するように調整しなければなりません。

Emacsはプログラム補完をファイル名補完に使っています。 See section ファイル名補完


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

17.6 YesかNoかの質問

本節ではユーザにyesかnoかの質問を訊くために使う関数を説明します。 関数y-or-n-pは1文字で答えることができます。これは不注意で誤って答えても 重大な結果を起こさないような質問のときに便利です。yes-or-no-pは もっと重大な質問に適当です。なぜなら、3文字ないし4文字の答えを要求するからです。

これら関数いずれも、マウスを使って起動したコマンドから呼ばれた場合は、 -- より精確には、last-nonmenu-event(see section コマンド・ループからの情報)が nilあるいはリストならば -- ダイアログ・ボックスあるいは ポップアップ・メニューを使って質問をします。それ以外の場合は、 キーボード入力を使います。呼出し周辺でlast-nonmenu-eventを 適当な値に束縛することで、マウスあるいはキーボード入力を使用することを 強制できます。

厳密にいえば、yes-or-no-pはミニバッファを使いますが、 y-or-n-pは使いません。しかし、どちらもここで説明するのが一番でしょう。

Function: y-or-n-p prompt

この関数は、ユーザに質問をしてエコー領域からの入力を待ちます。 ユーザがyをタイプすればtを返し、nをタイプすれば nilを返します。この関数は、yesの意味のSPCとnoの意味のDELも 受けつけます。C-gのような「とりやめ」の意味のC-]も受けつけます。 というのも、質問がミニバッファのように見えるかもしれないので、 ユーザがC-]を使って抜けようとするだろうという理由によります。 答えは1文字で、RETで終了する必要はありません。 大文字も小文字も区別しません。

「質問をする」というのは、promptに文字列`y or n'を続けて エコー領域に表示することを意味します。入力が期待している答えの一つ (ynSPCDEL、あるいは何か とりやめるもの)ではない場合、関数は`Please answer y or n.'で応じて、 要求を繰り返します。

この関数は、実際にはミニバッファを使いません。なぜなら答えの編集を許さない からです。実際エコー領域は使いますし(see section エコー領域)、 それはミニバッファと同じ画面領域を使っています。質問がなされている間、 カーソルはエコー領域に行っています。

答えとその意味は、`y'`n'であっても、変えられないものではありません。 キーマップquery-replace-mapがそれらを指定します。 See section 検索と置換

以下の例では、ユーザははじめに無効であるqをタイプします。 次のプロンプトで、ユーザはyをタイプします。

 
(y-or-n-p "Do you need a lift? ")

;; この式を評価すると、 
;;   次のプロンプトがエコー領域に現れる:

---------- Echo area ----------
Do you need a lift? (y or n) 
---------- Echo area ----------

;; ユーザがqをタイプすると、次のように現れる:

---------- Echo area ----------
Please answer y or n.  Do you need a lift? (y or n) 
---------- Echo area ----------

;; ユーザが有効な答えをタイプすると、
;;   それは質問の後ろに表示される:

---------- Echo area ----------
Do you need a lift? (y or n) y
---------- Echo area ----------

連続していくつかのエコー領域のメッセージを示しましたが、画面に実際に 表示されるのは1度に一つだけです。

Function: yes-or-no-p prompt

この関数は、ユーザに質問をしてミニバッファからの入力を待ちます。 ユーザが`yes'を入力すればtを返し、`no'を入力すれば nilを返します。ユーザは応答を終了するために、RETをタイプする 必要があります。大文字も小文字も区別しません。

yes-or-no-pは、promptに文字列`yes or no'を続けて エコー領域に表示することからはじめます。ユーザは期待されている応答の一つを タイプする必要があります。さもなくば、関数は`Please answer yes or no.'で 応答し、2秒ほど待ってから、要求を繰り返します。

yes-or-no-pはユーザにy-or-n-pよりも多くの作業を要求するので、 より重大な決定に適切です。

例を挙げます:

 
(yes-or-no-p "Do you really want to remove everything? ")

;; この式を評価すると、 
;;   次のプロンプトが 
;;   空のミニバッファとともに現れる:

---------- Buffer: minibuffer ----------
Do you really want to remove everything? (yes or no) 
---------- Buffer: minibuffer ----------

ユーザがはじめにy RETをタイプした場合、 -- この関数は、`yes'という単語全体を要求しているので無効です -- 関数はこれらプロンプトをちょっと間をおいて表示することで応じます:

 
---------- Buffer: minibuffer ----------
Please answer yes or no.
Do you really want to remove everything? (yes or no)
---------- Buffer: minibuffer ----------

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

17.7 複数のYかNかの質問をする

一連の似通った質問、たとえば「このバッファを保存しますか」と 各バッファについて順番に訊く場合、各質問をバラバラに行なう代わりに、 まとまった質問を尋ねるためのmap-y-or-n-pを使うべきです。 これによって、ユーザはある種の便利な機能、たとえば一連の問い全てに 1度に答えるという機能を使うことができます。

Function: map-y-or-n-p prompter actor list &optional help action-alist

この関数は、Emacs 19の新機能で、ユーザに一連の質問をし、各質問に対して 1文字の答えをエコー領域から読み取ります。

listの値で指定するオブジェクト群についての質問が行なわれます。 この値はオブジェクトのリストあるいは生成関数のいずれかでなければなりません。 関数ならば、引数を期待してはなりません。そして、質問される次のオブジェクトか、 質問の終りを意味するnilのいずれかを返さなければなりません。

引数prompterはどのように各質問を訊くかを指定します。 prompterが文字列ならば、質問テキストはこのように計算されます:

 
(format prompter object)

objectは、次に質問される(listから得た)オブジェクトです。

文字列ではないならば、prompterは引数一つ(質問される次のオブジェクト)の 関数でなければならず、質問テキストを返さなければなりません。 値が文字列ならば、それがユーザに訊く質問です。 この関数は、このオブジェクトに作用する(そしてユーザに訊かない)ことを意味します t、あるいはこのオブジェクトは無視する(そしてユーザに訊かない)ことを意味する nilを返すこともできます。

引数actorはユーザの答えに対してどのように作用するかを指定します。 これは引数一つの関数でなければならず、ユーザがyesと答えた 各オブジェクトについて呼び出されます。この引数は必ずlistから 得たものになっています。

引数helpを与えるなら、それはこの形式のリストでなければなりません:

 
(singular plural action)

ここでsingularは概念的に作用を受けるオブジェクトの名詞単数形で、 pluralはそれに対応する名詞複数形です。 actionactorがどんな作用をするのかを説明する他動詞です。

helpを指定しなかった場合、デフォルトは"object" "objects" "act on"です。

質問がなされる度に、ユーザがy, Y, SPCのいずれかを 入力したならば、そのオブジェクトに対して作用します。n, N, DELならば、そのオブジェクトは飛ばします。!は以降全ての オブジェクトに対して作用します。ESCあるいはqは ミニバッファを抜けます(以降全てを飛ばす)。.(ピリオド)は 現オブジェクトに作用して、その後抜けます。C-hはヘルプを出します。 これらは、query-replaceが受けつけるのと同じ答えです。 キーマップquery-replace-mapがこれらの意味をquery-replaceに 対するのと同様にmap-y-or-n-pに対しても定義しています。 検索と置換を参照してください。

action-alistを使って、可能な答えとそれらが何を意味するかを追加指定する ことができます。これは(char function help)という形式が 要素であるalistで、各要素が追加の答えを一つ定義します。 この要素においては、charが文字(追加の答え)で、functionが 引数(listからのオブジェクト)一つの関数、helpが文字列です。

ユーザがcharで応じると、map-y-or-n-pfunctionを 呼び出します。 それが非nilを返したならば、オブジェクトは「作用された」と判断します。 そして、map-y-or-n-plistの次のオブジェクトに進みます。 nilを返したならば、同一のオブジェクトに対してプロンプトが 繰り返されます。

map-y-or-n-pが、マウスを使って起動したコマンドから呼ばれた場合は、 -- より精確には、last-nonmenu-event(see section コマンド・ループからの情報)が nilあるいはリストならば -- ダイアログ・ボックスあるいは ポップアップ・メニューを使って質問をします。この場合、キーボード入力や エコー領域は使いません。呼出し周辺でlast-nonmenu-eventを 適当な値に束縛することで、マウスあるいはキーボード入力を使用することを 強制できます。

map-y-or-n-pの戻り値は、作用を受けたオブジェクトの個数です。


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

17.8 ミニバッファそのほか

本節では、ミニバッファに関連する基本的な関数と変数とを説明します。

Command: exit-minibuffer

本コマンドは、アクティブなミニバッファを抜けます。普通は ミニバッファ・ローカル・キーマップのキーにバインドされています。

Command: self-insert-and-exit

本コマンドは、キーボードでタイプされた最後の文字 (last-command-charで見つかります。see section コマンド・ループからの情報)を 挿入した後に、アクティブなミニバッファを抜けます。

Command: previous-history-element n

本コマンドは、ミニバッファの中身をn番目の以前の(より古い)履歴要素で 置き換えます。

Command: next-history-element n

本コマンドは、ミニバッファの中身をn番目の以後の(より新しい)履歴要素で 置き換えます。

Command: previous-matching-history-element pattern

本コマンドは、ミニバッファの中身を以前の(より古い)履歴要素のうち、 pattern(正規表現)に一致するもので置き換えます。

Command: next-matching-history-element pattern

本コマンドは、ミニバッファの中身を以後の(より新しい)履歴要素のうち、 pattern(正規表現)に一致するもので置き換えます。

Function: minibuffer-prompt

この関数は、現在アクティブなミニバッファのプロンプト文字列を返します。 アクティブなミニバッファがない場合、nilを返します。

Function: minibuffer-prompt-width

この関数は、現在アクティブなミニバッファのプロンプト文字列の表示幅を返します。 アクティブなミニバッファがない場合、0を返します。

Variable: minibuffer-setup-hook

これは正規フックで、ミニバッファに入るときはいつでも実行されます。 See section フック

Variable: minibuffer-exit-hook

これは正規フックで、ミニバッファから抜けるときはいつでも実行されます。 See section フック

Variable: minibuffer-help-form

この変数の現在の値は、help-formをミニバッファ内ローカルに 再束縛するために使います(see section ヘルプ関数)。

Function: active-minibuffer-window

この関数は、現在アクティブなミニバッファ・ウィンドウあるいは、 現在アクティブなものがなければnilを返します。

Function: minibuffer-window &optional frame

この関数は、フレームframeが使うミニバッファ・ウィンドウを返します。 framenilならば、現フレームを意味します。 フレームが使うミニバッファ・ウィンドウは、 そのフレームの一部である必要がないことに注意してください -- 自身の ミニバッファを持っていないフレームは、必然的にほかのフレームの ミニバッファ・ウィンドウを使うことになります。

Function: window-minibuffer-p window

この関数は、windowがミニバッファ・ウィンドウならば非nilを返します。

与えられたウィンドウがミニバッファか否かを判別するために、 それを(minibuffer-window)の結果との比較によるのは、正しくありません。 なぜなら、フレームが沢山あれば、ミニバッファ・ウィンドウも 複数存在できるからです。

Function: minibuffer-window-active-p window

この関数は、window(ミニバッファ・ウィンドウと仮定)が現在アクティブならば、 非nilを返します。

Variable: minibuffer-scroll-window

この変数の値が非nilならば、ウィンドウ・オブジェクトでなければなりません。 関数scroll-other-windowがミニバッファから呼ばれると、 このウィンドウをスクロールします。

最後に、再帰的ミニバッファを扱ういくつかの関数と変数を挙げます (see section 再帰編集):

Function: minibuffer-depth

この関数は、現在のアクティブなミニバッファの深さを返します(非負整数)。 アクティブなミニバッファがない場合、0を返します。

User Option: enable-recursive-minibuffers

この変数が非nilならば、ミニバッファ・ウィンドウにいるときであっても ミニバッファを使うようなコマンド(たとえばfind-file)を起動できます。 こういった起動が、新しいミニバッファに対する再帰編集レベルを引き起こします。 外側レベルのミニバッファは内側を編集している間不可視となります。

この変数は、ミニバッファ・ウィンドウを選択した状態でミニバッファを起動するときだけ 影響します。ミニバッファにいるときにウィンドウを切替えたならば、 そのほかのウィンドウを選択している間はいつでもミニバッファ・コマンドを 起動できます。

コマンド名が非nilの属性enable-recursive-minibuffersをもつならば、 そのコマンドがミニバッファから起動された場合であっても、 それはミニバッファを使って引数を読むことができます。 ミニバッファ・コマンドnext-matching-history-element (通常ミニバッファではM-s)はこの機能を使っています。


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

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.