検索エンジンから来た人に注意このマニュアルは、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.