検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
ミニバッファ(minibuffer)はEmacsのコマンドが使う特殊なバッファで、 一つの数値前置引数よりも複雑な複数の引数を読み込むのに使います。 これら引数はファイル名、バッファ名、そして(M-xでの)コマンド名を含みます。 ミニバッファはエコー領域と同じ場所である、スクリーンの最下行に、 一つの引数を読み込むために使う間だけ表示されます。
ほとんどの部分において、ミニバッファは普通のEmacsのバッファです。 バッファ内で使うほとんどの操作、編集コマンドなどは、 ミニバッファ内で普通に動作します。けれどもバッファ自体を扱う操作のほとんどは、 ミニバッファに対しては適用されません。ミニバッファの名前は常に `*Minibuf-number'の形式を持ち、変更はできません。 ミニバッファはミニバッファだけに使われる専用のウィンドウだけに表示されます。 これらウィンドウは常にフレームの下部に現れます(時にはフレームが ミニバッファ・ウィンドウを持たない場合や、 時には特別な種類のフレームがミニバッファ・ウィンドウだけしか 含んでないこともあります。 section ミニバッファとフレーム参照)。
ミニバッファ・ウィンドウは通常1行です。 一時的にウィンドウ・サイズ変更コマンドで大きさを変えることができます。 この場合、ミニバッファを抜けると普通の大きさに戻ります。 ミニバッファがアクティブでないときは、 ウィンドウ・サイズ変更コマンドをフレームのほかのウィンドウに使うことで、 恒久的にその大きさを変えることもできます。 フレームがミニバッファだけを含む場合、 フレームの大きさを変更することでミニバッファの大きさを変更できます。
コマンドが、アクティブなミニバッファがあるのに別のミニバッファを使うと、
これを再帰的ミニバッファ(recursive minibuffer)と呼びます。
最初のミニバッファは` *Minibuf-0*'と名づけられます。
再帰的ミニバッファはこの名前の終りにある数を増やすことで名づけられます
(名前が一つの空白ではじまることで、通常のバッファ・リストに現れないように
なります)。複数の再帰的ミニバッファのうち、最も内側の(即ち最も最近に入った)
ミニバッファがアクティブなミニバッファとなります。普通ミニバッファといえば、
これを指します。
再帰的ミニバッファは、変数enable-recursive-minibuffers
を設定する、
あるいはコマンド・シンボルにこの名前の属性を置くことで、許可あるいは
禁止することができます(see section ミニバッファそのほか)。
ほかのバッファ同様、ミニバッファはいくつかあるローカル・キーマップの いずれかをたいていは使います(see section キーマップ)。これらはさまざまなミニバッファを 抜けるコマンドや、場合によっては補完コマンドを含みます(see section 補完)。
minibuffer-local-map
は、通常入力(補完なし)に使います。
minibuffer-local-ns-map
は同様ですが、SPCで丁度RETのように
抜けてしまう点が異なっています。主にMocklisp互換のために使われます。
minibuffer-local-completion-map
は、任意補完に使います。
minibuffer-local-must-match-map
は、厳密補完と注意補完に使います。
ほとんどの場合、ミニバッファはテキストを文字列として読むために使います。
Lispオブジェクトをテキスト形式で読み込むためにも使います。
ミニバッファ入力の最も基本的なプリミティブは、
read-from-minibuffer
です。これでそのいずれかを行なうことができます。
ほとんどの場合、Lisp関数の途中でミニバッファ入力関数を呼ぶべきでは
ありません。代わりに、全てのミニバッファ入力をコマンド引数の読込みの一部とし、
interactive
指定の中で済ませます。See section コマンドの定義。
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 入力関数)。
read-from-minibuffer
と
同じように使います。使用するキーマップはminibuffer-local-map
です。
これはread-from-minibuffer
関数への単純化したインタフェースです:
(read-string prompt initial) == (read-from-minibuffer prompt initial nil nil nil)
exit-minibuffer
exit-minibuffer
abort-recursive-edit
next-history-element
previous-history-element
next-matching-history-element
previous-matching-history-element
read-from-minibuffer
と同じように使います。
これは、read-from-minibuffer
関数に対する単純化したインタフェースであり、
minibuffer-local-ns-map
キーマップの値を、
この関数のkeymap引数として渡します。
キーマップminibuffer-local-ns-map
はC-qを再バインドしないので、
quoteすれば、スペースを文字列に置くことが可能です。
(read-no-blanks-input prompt initial) == (read-from-minibuffer prompt initial minibuffer-local-ns-map)
read-no-blanks-input
が
ミニバッファ・ローカル・キーマップとして使うキーマップです。
デフォルトでは、minibuffer-local-map
のデフォルトに加えて、
次のバインドになります:
exit-minibuffer
exit-minibuffer
self-insert-and-exit
本節ではミニバッファからLispオブジェクトを読み込む関数を説明します。
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をタイプして、直ちに初期入力をデフォルトとして 使ってもいいです。あるいは、その入力を編集してもいいです。
read-from-minibuffer
と同じように使います。
この関数は、read-minibuffer
呼出しの結果を単純に評価します:
(eval-minibuffer prompt initial) == (eval (read-minibuffer prompt initial))
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-command
は
nil
を返します。
ミニバッファ履歴リスト(minibuffer history list)は以前の ミニバッファ入力を記録し、ユーザがそれを便利に再利用できるようにします。 履歴リストは実はシンボルであり、リストではありません。これは、その値が 新しいものほど先に来る文字列(以前の入力)のリストになっている変数です。
異なる種類の入力に使う、別個の履歴リストが多数あります。 ミニバッファを使う度に正しい履歴リストを指定するのは、 Lispプログラマの仕事です。
ミニバッファ入力の基本関数read-from-minibuffer
もcompleting-read
も
双方共オプション引数histを受けつけ、これによって履歴リストを指定します。
以下は、指定可能な値です:
histを指定しなかったならば、
デフォルト履歴リストminibuffer-history
が使用されます。
そのほかの標準履歴リストについては以下を参照。自分個人の履歴リスト変数を
作ることもできます。最初に使う前にnil
に初期化するだけでいいです。
read-from-minibuffer
とcompleting-read
は、
新しい要素を履歴リストに自動的に追加し、ユーザがリスト上の項目を
再使用するためのコマンドを提供しています。自作のプログラムが
履歴リストを使うには、使いたいときにそれを初期化し、
その名前を入力関数に渡すだけです。ただし、ミニバッファ入力関数が
使ってないときには、そのリストを手で修正しても平気です。
query-replace
の引数(と、ほかのコマンドの似た引数)のための履歴リスト。
補完(completion)は、省略形からはじめて名前の残りを埋める機能です。
補完は、ユーザの入力を有効な名前のリストと比較し、名前のどこまでが
一意に決められるかをユーザがタイプしたもので判別することによって、働きます。
たとえば、C-x b(switch-to-buffer
)とタイプし、続いて切替えたい
バッファ名の最初の何文字かをタイプし、
続いてTAB(minibuffer-complete
)をタイプすると、
Emacsはその名前を可能なかぎり長いところまで展開します。
標準的Emacsコマンドはシンボル名、ファイル名、バッファ名、プロセス名の 補完を提供しています。本章の関数を使えば、ほかの種類の名前の補完を 実装することができます。
try-completion
関数は補完の基本的なプリミティブです。
これは、与えられた文字列の集合に対して一致する、
与えられた初期文字列の最長の補完を判別して返します。
関数completing-read
は補完のための、より高い水準のインタフェースを
提供します。completing-read
の呼出しで、有効な名前のリストの
判別法を指定します。この関数は次に、補完に便利なコマンドを
いくつかのキーにバインドしたローカル・キーマップをもつミニバッファを
アクティブにします。
ほかの関数は、ある種の名前を補完で読み込む便利で単純なインタフェースを
提供します。
二つの関数try-completion
とall-completion
は、
それら自身はミニバッファとは何の関係ありません。これらを本章で説明したのは、
これらをミニバッファを使う高水準補完機能の近くに置いておきたかったからです。
補完では、stringをcollectionで指定された任意補完のそれぞれに対して
比較します。任意補完の冒頭部分がstringに等しければ、一致です。
任意補完に一致するものがなければ、try-completion
はnil
を返します。
ただ一つの任意補完が一致した場合で、それが完全一致ならば、
try-completion
はt
を返します。さもなくば、その値は
一致した全ての任意補完に共通な最長の始めの部分
(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
は、この関数が何を返そうともそれを返します。
この関数は、三つの引数を持って呼ばれます。それらはstring、predicate、
nil
です(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"
try-completion
に対するものと同じです。
collectionが関数ならば、それが三つの引数をもって呼び出されます。
それらはstring、predicate、t
です。そして
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")
nil
ならば、Emacsは補完において大文字/小文字の
区別をしません。
本節では補完を使ってミニバッファから読み込む基本的なインタフェースを 説明します。
nil
ならば、
completing-read
はそれを入力の一部として、ミニバッファに挿入します。
続いて、いくつかの補完を試みるコマンドを用意して、
ユーザが入力を編集できるようにします。
実際の補完はcollectionとpredicateを関数try-completion
に
渡すことで行なわれます。これはローカル・キーマップにバインドされた
補完のためのある種のコマンドにおいて実行されます。
require-matchがt
ならば、通常のミニバッファを抜けるコマンドでは、
入力がcollectionの要素に補完されないかぎり抜けることはありません。
require-matchがnil
でもt
でもないならば、
タイプされた入力がcollectionの要素自身とならないかぎり、
ミニバッファを抜けるコマンドで抜けることができません。
require-matchがnil
ならば、ミニバッファの入力に関わらず、
ミニバッファを抜けるコマンドは使えます。
ユーザはミニバッファが空のままRETをタイプして、何も入力しないで
抜けることができます。この場合、completing-read
はnil
を返します。
これによってユーザは、コマンドが今読み込んでいる値に対するデフォルトが
どんなものであっても、それを指定することができます。ユーザは、
require-matchの値に関わらず、
このようにRETを使って戻ることができます。
関数completing-read
はread-minibuffer
を呼び出すことで働きます。
require-matchがnil
ならば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-read
はbarfoo
を返します。
completion-read
関数は、実際に補完を行なうコマンドに情報を渡すために、
三つの変数を束縛します。これら変数は、minibuffer-completion-table
、
minibuffer-completion-predicate
、minibuffer-completion-confirm
です。これらについて詳しいことは、section 補完を行なうミニバッファ・コマンドを見てください。
本節では、ミニバッファで補完を行なうために使うキーマップ、コマンド、ユ ーザ・オプションを説明します。
completing-read
は補完の各候補との完全一致が要求されてないときには、
この値をローカル・キーマップとして使います。デフォルトでは、
このキーマップは次のバインドを成します:
minibuffer-completion-help
minibuffer-complete-word
minibuffer-complete
ほかの文字については、minibuffer-local-map
同様にバインドされます。
completing-read
は補完の各候補との完全一致が要求されたときには、
この値をローカル・キーマップとして使います。それゆえ、無条件にミニバッファを
抜けるコマンドexit-minibuffer
はどのキーにもバインドされていません。
デフォルトではこのキーマップは次のバインドを成します:
minibuffer-completion-help
minibuffer-complete-word
minibuffer-complete
minibuffer-complete-and-exit
minibuffer-complete-and-exit
ほかの文字については、minibuffer-local-map
同様にバインドされます。
completing-read
がtry-completion
に
渡すものを内容としています。minibuffer-complete-word
のような
ミニバッファ補完コマンドで使われます。
completing-read
がtry-completion
に渡す述語です。
この変数は、ほかのミニバッファ補完関数でも使われます。
minibuffer-complete-word
は
語構成可能ではない最初の文字を超えて文字を追加することはありません。
See section 構文テーブル。
minibuffer-completion-confirm
がnil
ならば、そうします。
確認が要求されているならば、2度続けて実行すると、--- 本コマンドを
直ちに繰り返すことで、そうなりますが -- このコマンドは確認抜きで
働くよう作られています。
nil
の場合、Emacsはミニバッファを抜ける前に補完の確認を
促します。関数minibuffer-complete-and-exit
はこの変数の値を抜ける前に
チェックします。
minibuffer-completion-table
の値をcollection引数とし、
minibuffer-completion-predicate
の値をpredicate引数として、
all-completions
を呼び出すことで行ないます。補完のリストは、
`*Completions*'という名前のバッファにテキストで表示されます。
standard-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)))
nil
ならば、補完コマンドが、次の文字が一意に決められない
という理由で補完できるものがないという場合はいつでも、可能な補完のリストを
自動的に表示します。
本節ではある種の名前を補完で読み込むための、高水準の便利な関数を 説明します。
ほとんどの場合、Lisp関数の途中でこれら関数を呼ぶべきではありません。
可能なときは、全てのミニバッファ入力をコマンド引数の読込みの一部とし、
interactive
指定の中で済ませます。See section コマンドの定義。
nil
ならば、
文字列あるいはバッファでなければなりません。これはプロンプトには表示されるが、
初期入力としてミニバッファに挿入されることはありません。
existingが非nil
ならば、指定された名前は存在するバッファのもの
でなければなりません。ミニバッファを抜ける普通のコマンドでは、テキストが
有効でないかぎり、抜けることはできません。さらにRETは有効な名前を
見つけるように補完を行ないます(けれども、defaultの有効性は
チェックしません。ユーザがミニバッファに何も入れずに抜けたときは、
値が何であっても、これを返します)。
次の例では、ユーザが`minibuffer.t'を入力し、続いてRETをタイプする。
引数existingがt
で、与えられた入力で始まるバッファ名は
`minibuffer.texi'だけなので、その名前が値となります。
(read-buffer "Buffer name? " "foo" t) ;; この式を評価すると、 ;; 次のプロンプトが ;; 空のミニバッファとともに現れる: ---------- Buffer: Minibuffer ---------- Buffer name? (default foo) -!- ---------- Buffer: Minibuffer ---------- ;; ユーザがminibuffer.t RETとタイプする。 => "minibuffer.texi"
read-from-minibuffer
と同様に使われます。
コマンドはcommandp
がt
を返すものならば何でもコマンドですが、
コマンド名はcommandp
がt
を返すシンボルであることを
思い出してください。
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))
(read-variable "Variable name? ") ;; この式を評価すると、 ;; 次のプロンプトが ;; 空のミニバッファとともに現れる: ---------- Buffer: Minibuffer ---------- Variable name? -!- ---------- Buffer: Minibuffer ----------
ユーザが続いてfill-p RETとタイプすると、read-variable
は
fill-prefix
を返す。
この関数は、read-command
に似ていますが、commandp
の代わりに
述語user-variable-p
を使います:
(read-variable prompt) == (intern (completing-read prompt obarray 'user-variable-p t nil))
ここでファイル名を読み取るために設計された、もう一つの高水準補完関数を 挙げます。これにはデフォルト・ディレクトリの自動挿入という 特殊機能も用意されています。
nil
ならば、
ユーザがRETだけをタイプしたときにはdefaultを返します。
defaultの有効性のチェックは行ないません。ユーザがミニバッファに何も入れずに
抜けたときは、値が何であっても、これを返します。
existingが非nil
ならば、ユーザは存在するファイルの名前を
指定しなければなりません。RETは可能なら有効な名前になるように
補完を行ない、それが有効でないかぎりミニバッファを抜けません。
existingの値がnil
でもt
でもない場合、RETは
補完の後に確認も要求します。existing
がnil
ならば、
存在しないファイルの名前も受けつけます。
引数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
はファイル名を
文字列"/gp/gnu/@linebreak{
elisp/manual.texi"}として返します。
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 ----------
時には意図する可能な補完の全てを含むalistやobarrayを作ることが できない場合もあります。このような場合、与えられた文字列の補完を計算するような 自分のための関数を用意することができます。これを プログラム補完(programmed completion)と呼びます。
本機能を使うには、completing-read
のcollection引数として、
関数定義をもつシンボルを渡せばいいです。関数completing-read
は
自作の補完関数をtry-completion
やall-completions
に知らせて、
自作の関数が作業の全てを行なえるように調整します。
自作の補完関数は、三つの引数を受けつけなければなりません:
nil
。
自作の関数はこの述語を各一致候補に対して呼び出し、述語がnil
を
返したならその一致候補を無視しなければなりません。
フラグの値としては三つあり、三つの操作に対応します:
nil
は、try-completion
を指定します。自作補完関数は
指定文字列の補完を返すか、文字列がすでに完全一致であったならt
を返すか、
文字列に一致する候補がなければnil
を返すかでなければなりません。
t
は、all-completions
を指定します。自作補完関数は、
指定文字列の可能な補完全てのリストを返さなければなりません。
lambda
は、完全一致の検査を指定します。自作補完関数は、
指定文字列が完全一致の候補をもつならばt
を返さなければなりません。
さもなくばnil
です。
補完関数群のcollectionに、lamda式(関数であるリスト)を 関数シンボル同様に使えるようにすれば、一貫性もありきれいにもなるでしょう。 しかし、これは不可能です。補完テーブルとしてのリストがすでに違う意味、 alistとして、割り当てられています。失敗しないようにalistを正常に 操作しようとすることは信頼できないと思われます。なぜならそれが 関数の可能性があるからです。そこで、補完に使いたい自作関数は 全てシンボルにカプセル化するように調整しなければなりません。
Emacsはプログラム補完をファイル名補完に使っています。 See section ファイル名補完。
本節ではユーザに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
は使いません。しかし、どちらもここで説明するのが一番でしょう。
t
を返し、nをタイプすれば
nil
を返します。この関数は、yesの意味のSPCとnoの意味のDELも
受けつけます。C-gのような「とりやめ」の意味のC-]も受けつけます。
というのも、質問がミニバッファのように見えるかもしれないので、
ユーザがC-]を使って抜けようとするだろうという理由によります。
答えは1文字で、RETで終了する必要はありません。
大文字も小文字も区別しません。
「質問をする」というのは、promptに文字列`y or n'を続けて エコー領域に表示することを意味します。入力が期待している答えの一つ (y、n、SPC、DEL、あるいは何か とりやめるもの)ではない場合、関数は`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度に一つだけです。
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 ----------
一連の似通った質問、たとえば「このバッファを保存しますか」と
各バッファについて順番に訊く場合、各質問をバラバラに行なう代わりに、
まとまった質問を尋ねるためのmap-y-or-n-p
を使うべきです。
これによって、ユーザはある種の便利な機能、たとえば一連の問い全てに
1度に答えるという機能を使うことができます。
listの値で指定するオブジェクト群についての質問が行なわれます。
この値はオブジェクトのリストあるいは生成関数のいずれかでなければなりません。
関数ならば、引数を期待してはなりません。そして、質問される次のオブジェクトか、
質問の終りを意味するnil
のいずれかを返さなければなりません。
引数prompterはどのように各質問を訊くかを指定します。 prompterが文字列ならば、質問テキストはこのように計算されます:
(format prompter object)
objectは、次に質問される(listから得た)オブジェクトです。
文字列ではないならば、prompterは引数一つ(質問される次のオブジェクト)の
関数でなければならず、質問テキストを返さなければなりません。
値が文字列ならば、それがユーザに訊く質問です。
この関数は、このオブジェクトに作用する(そしてユーザに訊かない)ことを意味します
t
、あるいはこのオブジェクトは無視する(そしてユーザに訊かない)ことを意味する
nil
を返すこともできます。
引数actorはユーザの答えに対してどのように作用するかを指定します。 これは引数一つの関数でなければならず、ユーザがyesと答えた 各オブジェクトについて呼び出されます。この引数は必ずlistから 得たものになっています。
引数helpを与えるなら、それはこの形式のリストでなければなりません:
(singular plural action)
ここでsingularは概念的に作用を受けるオブジェクトの名詞単数形で、
pluralはそれに対応する名詞複数形です。
action
はactorがどんな作用をするのかを説明する他動詞です。
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
に対しても定義しています。
section 検索と置換を参照してください。
action-alistを使って、可能な答えとそれらが何を意味するかを追加指定する
ことができます。これは(char function help)
という形式が
要素であるalistで、各要素が追加の答えを一つ定義します。
この要素においては、charが文字(追加の答え)で、functionが
引数(listからのオブジェクト)一つの関数、helpが文字列です。
ユーザがcharで応じると、map-y-or-n-p
はfunctionを
呼び出します。
それが非nil
を返したならば、オブジェクトは「作用された」と判断します。
そして、map-y-or-n-p
はlistの次のオブジェクトに進みます。
nil
を返したならば、同一のオブジェクトに対してプロンプトが
繰り返されます。
map-y-or-n-p
が、マウスを使って起動したコマンドから呼ばれた場合は、
--- より精確には、last-nonmenu-event
(see section コマンド・ループからの情報)が
nil
あるいはリストならば -- ダイアログ・ボックスあるいは
ポップアップ・メニューを使って質問をします。この場合、キーボード入力や
エコー領域は使いません。呼出し周辺でlast-nonmenu-event
を
適当な値に束縛することで、マウスあるいはキーボード入力を使用することを
強制できます。
map-y-or-n-p
の戻り値は、作用を受けたオブジェクトの個数です。
本節では、ミニバッファに関連する基本的な関数と変数とを説明します。
last-command-char
で見つかります。see section コマンド・ループからの情報)を
挿入した後に、アクティブなミニバッファを抜けます。
nil
を返します。
help-form
をミニバッファ内ローカルに
再束縛するために使います(see section ヘルプ関数)。
nil
を返します。
nil
ならば、現フレームを意味します。
フレームが使うミニバッファ・ウィンドウは、
そのフレームの一部である必要がないことに注意してください -- 自身の
ミニバッファを持っていないフレームは、必然的にほかのフレームの
ミニバッファ・ウィンドウを使うことになります。
nil
を返します。
与えられたウィンドウがミニバッファか否かを判別するために、
それを(minibuffer-window)
の結果との比較によるのは、正しくありません。
なぜなら、フレームが沢山あれば、ミニバッファ・ウィンドウも
複数存在できるからです。
nil
を返します。
nil
ならば、ウィンドウ・オブジェクトでなければなりません。
関数scroll-other-window
がミニバッファから呼ばれると、
このウィンドウをスクロールします。
最後に、再帰的ミニバッファを扱ういくつかの関数と変数を挙げます (see section 再帰編集):
nil
ならば、ミニバッファ・ウィンドウにいるときであっても
ミニバッファを使うようなコマンド(たとえばfind-file
)を起動できます。
こういった起動が、新しいミニバッファに対する再帰編集レベルを引き起こします。
外側レベルのミニバッファは内側を編集している間不可視となります。
この変数は、ミニバッファ・ウィンドウを選択した状態でミニバッファを起動するときだけ 影響します。ミニバッファにいるときにウィンドウを切替えたならば、 そのほかのウィンドウを選択している間はいつでもミニバッファ・コマンドを 起動できます。
コマンド名が非nil
の属性enable-recursive-minibuffers
をもつならば、
そのコマンドがミニバッファから起動された場合であっても、
それはミニバッファを使って引数を読むことができます。
ミニバッファ・コマンドnext-matching-history-element
(通常ミニバッファではM-s)はこの機能を使っています。
Go to the first, previous, next, last section, table of contents.