| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ミニバッファ(minibuffer)は、単純な数値前置引数ではなく、 より複雑な引数を読み取るためにEmacsのコマンドが使う特別なバッファです。 これらの引数には、ファイル名、バッファ名、 (M-xでの)コマンド名があります。 ミニバッファは、エコー領域と同様に、フレームの最下行に表示されますが、 引数を読み取るときにのみ表示されます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ほとんどの意味において、ミニバッファはEmacsの普通のバッファです。 編集コマンドなどのバッファ内でのほとんどの操作は、 ミニバッファでも普通に動作します。 しかし、バッファを操作するコマンドの多くは、 ミニバッファには適用できません。 ミニバッファの名前はつねに`*Minibuf-number'という形式であって、 変更できません。 ミニバッファはミニバッファ専用の特別なウィンドウだけに表示されます。 これらのウィンドウはつねにフレームの最下行に現れます。 (ミニバッファを持たないフレームや、 ミニバッファ用ウィンドウのみの特殊なフレームもある。 28.8 ミニバッファとフレームを参照。)
ミニバッファ用のウィンドウは通常は1行だけです。 ウィンドウサイズを変更するコマンドで一時的に大きさを変えられますが、 ミニバッファから抜けると通常サイズに戻ります。 ミニバッファ用ウィンドウのサイズを恒久的に変更するには、 ミニバッファを使っていないときに、フレームの別のウィンドウにおいて ウィンドウサイズを変更するコマンドを使います。 ミニバッファだけを持つフレームの場合、 フレームのサイズを変更すればミニバッファのサイズを変更できます。
すでにミニバッファが活性であるときにコマンドがミニバッファを使用することを 再帰ミニバッファと呼びます。 最初のミニバッファの名前は` *Minibuf-0*'です。 再帰ミニバッファは、名前の最後の数を増やして命名します。 (名前は空白で始まるため、通常のバッファの一覧には表示されない。) 再帰ミニバッファの中で、もっとも内側の(つまりもっとも再帰が深い)ものが 活性なミニバッファです。 これを単にミニバッファと呼びます。 変数enable-recursive-minibuffersを設定すれば、 再帰ミニバッファを許可したり禁止できます。 あるいは、コマンドシンボルにこの名前の属性を入れます (see 節 19.9 ミニバッファに関するその他)。
他のバッファと同様に、ミニバッファは 複数のローカルキーマップ(see 節 21. キーマップ)を使うことがあります。 これらには、さまざまな終了コマンドや補完コマンド(see 節 19.5 補完) が含まれます。
minibuffer-local-mapは(補完なしの)普通の入力用。
minibuffer-local-ns-mapも同様だが、 RETと同様にSPCで抜ける。 これは主にMocklisp互換用に使われる。
minibuffer-local-completion-mapは弱い補完用。
minibuffer-local-completion-mapは強い補完や慎重な補完用。| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
多くの場合、テキストを文字列として読み取るためにミニバッファを使います。 Lispオブジェクトのテキスト表現を読み取るためにも使えます。 ミニバッファでの入力のもっとも基本的な関数は read-from-minibufferであり、どちらの目的にも使えます。
多くの場合、Lisp関数の途中でミニバッファの入力関数を呼ぶべきではありません。 そのかわりに、interactiveの指定で、 コマンドの引数を読み取る操作の一部として すべてのミニバッファ入力を行います。 See 節 20.2 コマンドの定義。
nil以外であれば、 readを用いてテキストを Lispオブジェクトへ変換する(see 節 18.3 入力関数)。
この関数がまず行うことは、ミニバッファを活性にし、 プロンプトprompt-stringとともに表示することである。 prompt-stringは文字列であること。 これで、ユーザーはミニバッファでテキストを編集できるようになる。
ユーザーがミニバッファを抜けるコマンドを打つと、 read-from-minibufferは ミニバッファ内のテキストから戻り値を構築する。 通常、当該テキストを含む文字列を返す。 しかし、readがnil以外であると、 read-from-minibufferはテキストを読み取った結果である Lispオブジェクトを評価せずに返す。 (読み取りについてはsee 節 18.3 入力関数。)
引数defaultは、履歴コマンドで使うデフォルト値を指定する。 これは文字列かnilであること。 readがnil以外である場合、 ユーザーの入力が空であるときには、 readへの入力としてもdefaultを用いる。 しかし、(readがnilである)通常の場合、 ユーザーの入力が空のとき、read-from-minibufferは defaultを返さずに空文字列""を返す。 この意味において、この関数は本章の他のミニバッファ用入力関数と異なる。
keymapがnil以外であると、 ミニバッファのローカルキーマップとして用いる。 keymapを省略したりnilであると、 minibuffer-local-mapの値をキーマップとして用いる。 キーマップを指定することは、 補完などのさまざまな応用向けにミニバッファをカスタマイズする もっとも重要な方法である。
引数histは、ミニバッファでの入力を保存し履歴コマンドを使用可能に するために用いる履歴リスト変数を指定する。 デフォルトはminibuffer-historyである。 see 節 19.4 ミニバッファの履歴。
変数minibuffer-allow-text-propertiesがnil以外であると、 返される文字列には、ミニバッファで指定されたテキスト属性が含まれる。 さもなければ、値を返すときにすべてのテキスト属性を取り除く。
引数inherit-input-methodがnil以外であると、 ミニバッファに入るまえにどのバッファにいたかに関わらず、 そのバッファから現在の入力方式(see 節 32.11 入力方式)と enable-multibyte-characters(see 節 32.1 テキスト表現)の設定を 継承する。
initial-contentsが文字列であれば、 read-from-minibufferは、 ユーザーがテキスト編集を始めるまえに、 この文字列をミニバッファに挿入しその末尾にポイントを置く。 この文字列を初期内容とするミニバッファが現れる。
あるいは、initial-contentsは、 (string . position)という形式のコンスセルでもよい。 これは、文字列stringをミニバッファに挿入し、 ポイントは末尾にではなく 先頭からposition番目の文字に置くことを意味する。
使用上の注意: 引数initial-contentsとdefaultは、 多かれ少なかれ同じことを行う代替方法を提供する。 read-from-minibufferの1つの呼び出しにおいて、 両者の機能を同時に使うことに意味はない。 一般には、defaultを使うことを勧める。 というのは、ユーザーがデフォルト値を望む場合にはデフォルト値を挿入でき、 それ以外の場合にはデフォルト値を削除しなくてもよいからである。
read-from-minibufferと同様に使われる。 使用するキーマップはminibuffer-local-mapである。
省略可能な引数historyは、nil以外であると、 履歴リストと(省略可能な)リスト内での初期位置を指定する。 省略可能な引数defaultは、 ユーザー入力が空の場合に返されるデフォルト値であり、文字列であること。 省略可能な引数inherit-input-methodは、 カレントバッファの入力方式を継承するかどうかを指定する。
この関数は関数read-from-minibufferの インターフェイスを単純化したものである。
(read-string prompt initial history default inherit)
==
(let ((value
(read-from-minibuffer prompt initial nil nil
history default inherit)))
(if (equal value "")
default
value))
|
nilであると、 read-from-minibufferはミニバッファで指定されたすべての テキスト属性を返すまえに取り除く。 すべてのミニバッファがread-from-minibufferを使うので、 この変数はすべてのミニバッファ入力に適用される。
この変数の値に関わらず、 補完関数は無条件にテキスト属性を廃棄することに注意。
exit-minibuffer
exit-minibuffer
abort-recursive-edit
next-history-element
previous-history-element
next-matching-history-element
previous-matching-history-elementread-from-minibufferと同様に使われる。
これは関数read-from-minibufferの インターフェイスを単純化したものであり、 引数keymapとしてminibuffer-local-ns-mapの値を渡す。 キーマップminibuffer-local-ns-mapでは C-qを再バインドしないため、 クォートすれば空白を文字列に含めることができる。
(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
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、ミニバッファで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-from-minibufferの インターフェイスを単純化したものである。
(eval-minibuffer prompt initial) == (eval (read-minibuffer prompt initial)) |
eval-minibufferとの違いは、 初期フォームformを省略できないことであり、 このフォームをテキスト文字列としではなく表示表現に 変換するLispオブジェクトとして扱うことである。 prin1を用いて表示するので、 これが文字列であると初期テキストにはダブルクォート文字(`"')が現れる。 see 節 18.5 出力関数。
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を返す。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ミニバッファ履歴リスト(minibuffer history list)は ミニバッファでの以前の入力を記録し、 ユーザーがそれらを手軽に再利用できるようにします。 履歴リストは実際にはシンボルでありリストではありません。 最新のものが先頭にある(以前の入力の)文字列のリストを値とする変数です。
異なる種類の入力に用いる多くの別々の履歴リストがあります。 ミニバッファを利用するたびに適した履歴リストを指定するのは、 Lispプログラマの責任です。
基本的なミニバッファ入力関数 read-from-minibufferとcompleting-readの両者は、 読者が指定する履歴リストを省略可能な引数histとして受け付けます。 指定可能な値はつぎのとおりです。
startposを指定した場合、整合性を保つために、 履歴リストの当該要素をミニバッファの初期内容にも指定すること。
histを指定しなければ、 デフォルトの履歴リストminibuffer-historyを用いる。 その他の標準的な履歴リストについては以下を参照。 読者が独自の履歴リスト変数を作成してもよい。 初めて使用するまえに単にnilで初期化しておく。
read-from-minibufferとcompleting-readの両者は 履歴リストに新たな要素を自動的に追加し、 リスト上の要素を再利用するためのコマンドをユーザーに提供する。 履歴リストを使うために読者のプログラムで行うべきことは、 履歴リストを初期化し必要なときにその名前を入力関数に渡すだけである。 ミニバッファ入力関数が履歴リストを使用していないときには、 履歴リストを変更しても安全である。
標準的なミニバッファ履歴リスト変数を以下にあげておく。
query-replace(および同様のコマンド)の引数用の履歴リスト。| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
補完(completion)とは、 名前の省略から始まる名前の残り部分を補充する機能です。 ユーザー入力を正しい名前のリストと比較し、 すでにユーザーが入力したものに名前が どの程度一致するかを決定することで補完します。 たとえば、C-x b(switch-to-buffer)と打って、 切り替えたいバッファ名の始めの数文字を打って TAB(minibuffer-complete)を打つと、 Emacsは可能な限りその名前を補充します。
Emacsの標準のコマンドは、 シンボル、ファイル、バッファ、プロセスの名前を補完できます。 本節の関数を用いれば、その他の種類の名前の補完も実装できます。
関数try-completionは補完のための基本関数です。 与えられた文字列の集まりから 初期文字列にもっとも適合する最長のものを返します。
関数completing-readは補完のための上位レベルの インターフェイスを提供します。 completing-readの呼び出しには、 正しい名前のリストを決定する方法を指定します。 この関数は、補完に有用なコマンドを数個のキーにバインドした ローカルキーマップを使うミニバッファを活性にします。 その他の関数は、特定の種類の名前を補完して読み取るために 単純化したインターフェイスを提供します。
(These are too low level to use the minibuffer.)
19.5.1 基本補完関数 Low-level functions for completing strings.
(reading buffer name, file name, etc.)
19.5.2 補完とミニバッファ Invoking the minibuffer with completion. 19.5.3 補完を行うミニバッファコマンド Minibuffer commands that do completion. 19.5.4 高レベルの補完関数 Convenient special cases of completion
19.5.5 ファイル名の読み取り Using completion to read file names. 19.5.6 プログラム補完 Finding the completions for a given file name.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
2つの関数try-completionとall-completionsは、 それ自身ではミニバッファを使いません。 これらについて本章で述べるのは、 ミニバッファを使う上位レベルの補完機能と同列にしておくためです。
補完では、collectionで指定した各補完候補と stringを比較する。 補完候補の先頭部分がstringに等しければ、 その補完候補は一致するという。 一致する補完候補がなければ、try-completionはnilを返す。 たった1つの補完候補に一致し、かつ、完全に一致すれば、 try-completionはtを返す。 さもなければ、一致する補完候補すべてに共通する最長の文字列を値とする。
collectionが連想リスト(see 節 5.8 連想リスト)であると、 連想リストの要素のCAR群が補完候補の集まりになる。
collectionがオブジェクト配列(see 節 7.3 シンボルの作成とインターン)であると、 オブジェクト配列内のすべてのシンボルの名前が補完候補の集まりになる。 グローバル変数obarrayは、インターンしたすべてのLispシンボルの 名前を収めたオブジェクト配列を保持する。
新たなオブジェクト配列を作成する唯一の正しい方法は、 まず空で作成してからinternで1つ1つシンボルを追加することである ことに注意。 なお、1つのシンボルを複数のオブジェクト配列にはインターンできない。
引数predicateがnil以外である場合、 それは1引数の関数であること。 その関数は一致する補完候補の検査に使われ、 predicateがnil以外を返す場合にのみ一致した候補とみなす。 predicateに渡す引数は、 (CARが文字列である)連想リストのコンスセルであるか、 オブジェクト配列からの(シンボル名ではない)シンボルである。
collectionには、関数であるシンボルを使うこともできる。 その関数には補完処理を完遂する責任がある。 try-completionはその関数が返したものを返す。 その関数は3引数、つまり、 string、predicate、nilで呼ばれる。 (第3引数がある理由は、 all-completionsでも同じ関数を使い、 いずれの場合にも適切に動作できるようにするため。) see 節 19.5.6 プログラム補完。
以下の最初の例では、 文字列`foo'は連想リストの3つのCARに一致する。 すべての一致は`fooba'で始まるため、これが結果になる。 2番目の例では、たった1つの一致があり、しかも、完全に一致するので、 値は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の検査に通るのは3つの一致のうち2つだけである (文字列`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の3引数で呼ばれる。 all-completionsはこの関数が返す値を返す。 see 節 19.5.6 プログラム補完。
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は補完において大文字小文字を区別しない。| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節ではミニバッファからの補完による読み取り用の 基本インターフェイスについて述べます。
実際の補完は、collectionとpredicateを 関数try-completionに渡して行う。 これは、補完を用いるローカルキーマップでバインドされたコマンドで行われる。
require-matchがnilであると、 ミニバッファでの入力に関わらず ミニバッファから抜けるコマンドは動作する。 require-matchがtであると、 ミニバッファでの入力がcollectionの1つの要素に補完できない限り、 ミニバッファから抜ける通常のコマンドは動作しない。 require-matchがnilでもtでもないと、 ミニバッファでの入力がcollectionの1つの要素に一致しない限り、 ミニバッファから抜けるコマンドは動作しない。
しかし、require-matchの値に関わらず、 空の入力はつねに許される。 その場合、completing-readはdefaultを返す。 defaultの値は(nilでなければ)履歴コマンドを介しても ユーザーが使える。
ミニバッファが空の状態でRETを打つと、 ユーザーは空入力で抜けることができる。 そうすると、completing-readは""を返す。 これにより、読み取った値に対してコマンドが使うどんなデフォルトでも指定できる。 require-matchの値、および、collectionに空文字列が 含まれるかどうかに関わらず、ユーザーはこのようにしてRETで戻れる。
関数completing-readはread-minibufferを呼び出すことで動作する。 require-matchがnilであると、 キーマップとしてminibuffer-local-completion-mapを使い、 nil以外であるとminibuffer-local-must-match-mapを使う。 see 節 19.5.3 補完を行うミニバッファコマンド。
引数histは、入力を保存しミニバッファ履歴コマンドで 使う履歴リスト変数を指定する。 デフォルトはminibuffer-historyである。 see 節 19.4 ミニバッファの履歴。
initialがnil以外であると、 completing-readはこれを入力の一部としてミニバッファに挿入する。 これにより、ユーザーは補完コマンドとともに入力を編集できる。 ほとんどの場合、initialではなくdefaultを使うことを勧める。
引数inherit-input-methodがnil以外であると、 ミニバッファに入るまえのカレントバッファがなんであれ、 カレントバッファから現在の入力方式(see 節 32.11 入力方式)と enable-multibyte-characters(see 節 32.1 テキスト表現) の設定を継承する。
組み込み変数completion-ignore-caseがnil以外であると、 大文字小文字を区別せずに候補に対して入力を比較する。 see 節 19.5.1 基本補完関数。
completing-readを用いた例を以下に示す。
(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を返す。
関数completing-readは、 補完を実際に行うコマンドに情報を渡すために3つの変数を束縛する。 3つの変数とは、minibuffer-completion-table、 minibuffer-completion-predicate、 minibuffer-completion-confirmである。 これらについて詳しくは、19.5.3 補完を行うミニバッファコマンドを参照。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、補完を行うためにミニバッファで用いられるキーマップ、 コマンド、ユーザーオプションについて述べます。
completing-readは、 補完候補の1つと完全に一致しなくてもよい場合に ローカルキーマップとしてこの値を使う。 デフォルトでは、このキーマップのバインディングはつぎのとおり。
minibuffer-completion-help
minibuffer-complete-word
minibuffer-complete他の文字はminibuffer-local-map (see 節 19.2 ミニバッファでのテキスト文字列の読み取り)と同様にバインドされる。
completing-readは、 補完候補の1つと完全に一致する必要がある場合に ローカルキーマップとしてこの値を使う。 そのため、ミニバッファから無条件に抜けるコマンド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-completion-confirmがnilであるときには、 ミニバッファの内容を補完後に抜ける。 確認が必要であるときには、 このコマンドをただちに繰り返すことで確認をとる。 このコマンドは、連続して2回呼ばれると、 確認しないようにプログラムしてある。nil以外の場合、 Emacsはミニバッファから抜けるまえに補完を確認してくる。 関数minibuffer-complete-and-exitは、 抜けるまえにこの変数の値を検査する。minibuffer-completion-tableの値を、 引数predicateとしてminibuffer-completion-predicateの値を 用いてall-completionsを呼び出すことで動作する。 補完のリストは、`*Completions*'という名前のバッファに テキストとして表示される。standard-outputに completionsを表示する。 (ストリームについては詳しくはsee 節 18. Lispオブジェクトの読み取りと表示。) 引数completionsは、普通は、all-completionsが 返した補完のリストであるが、そうでなくてもよい。 各要素は、シンボルか文字列であり、その場合、そのまま表示される。 各要素が2つの文字列から成るリストである場合、 文字列を連結したものを表示する。
この関数は、minibuffer-completion-helpから呼ばれる。 以下のように、with-output-to-temp-bufferとともに 用いるのがもっとも一般的である。
(with-output-to-temp-buffer "*Completions*"
(display-completion-list
(all-completions (buffer-string) my-alist)))
|
nil以外であると、 つぎの補充文字が一意に決まらない場合には、 自動的に補完のリストを表示する。| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、特定の種類の名前を補完付きで読み取るための 高レベルの便利な関数について述べます。
多くの場合、これらの関数をLisp関数の途中では呼び出さないでください。 可能な場合には、interactiveの指定で、 コマンドの引数を読み取る操作の一部としてすべてのミニバッファ入力を 行ってください。 See 節 20.2 コマンドの定義。
nil以外であるときには、文字列かバッファであること。 これはプロンプトとして現れるが、 ミニバッファには初期入力として挿入されない。
existingがnil以外であると、 指定した名前は既存のバッファ名であること。 テキストが正しくないとミニバッファから抜ける通常のコマンドは動作せず、 RETは正しい名前を探すため補完を行う。 (しかし、defaultが正しいかどうかは検査しない。 ユーザーがミニバッファを空で抜ければ、 なんであろうと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"
|
iswitchb-read-bufferを設定すると、 バッファ名を読み取るためにread-bufferを呼び出す すべてのEmacsコマンドは、 バッファ名を読むためにパッケージiswitchbを使うようになる。read-from-minibufferと同様に使われる。 なんであってもcommandpがtを返せばコマンドであり、 commandpがtを返すシンボルはコマンド名であることに注意。 see 節 20.3 対話的呼び出し。
引数defaultは、ユーザー入力が空だった場合に返したい値を指定する。 これは、シンボルか文字列であること。 文字列であると、read-commandは、これを返すまえにインターンする。 defaultがnilであると、デフォルトを指定しないことを意味し、 ユーザー入力が空であると戻り値はnilである。
(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))
|
引数defaultは、ユーザー入力が空だった場合に返したい値を指定する。 これは、シンボルか文字列であること。 文字列であると、read-variableは、これを返すまえにインターンする。 defaultがnilであると、デフォルトを指定しないことを意味し、 ユーザー入力が空であると戻り値は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))
|
32.10.4 ユーザー指定のコーディングシステムの関数read-coding-systemや read-non-nil-coding-systemも参照してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ここでは、ファイル名を読み取るように設計された高レベルの 別の補完関数について述べます。 デフォルトディレクトリの自動挿入などの特別な機能を提供します。
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を試してほしい。 注意: ほとんどの場合、initialではなくdefaultを使うことを勧める。
例を示す。
(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/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 ---------- |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
意図した補完候補を持った連想リストやオブジェクト配列を 作成することが困難な場合もあります。 そのような場合、与えられた文字列に対する補完を計算する 独自の関数を与えることができます。 これをプログラム補完(programmed completion)と呼びます。
この機能を使うには、completing-readの引数collectionに 関数定義を持つシンボルを渡します。 関数completing-readは、 try-completionやall-completionsに 読者の補完関数を渡すようにして、読者の関数にすべてを任せます。
補完関数はつぎの3つの引数を受け取ります。
nil。 読者の関数では、各補完候補についてこの述語を呼び出し、 nilが返されたら当該候補を無視する。
3つの操作型に対応してフラグの値は3つあります。
nilはtry-completionを指定する。 補完関数は、指定された文字列の補完を返すこと。 あるいは、文字列が一意に完全に一致する場合にはtを返し、 文字列の補完がまったくなければnilを返す。
文字列が一意に完全に一致する場合であっても、 より長い候補に一致する場合には、 この関数はtではなく文字列を返すこと。
tはall-completionsを指定する。 補完関数は、指定された文字列に対する補完のリストを返すこと。
lambdaは、完全な一致を指定する。 補完関数は、指定された文字列が候補に完全に一致する場合にはtを返し、 さもなければnilを返すこと。補完関数collectionには関数シンボルに加えて、 ラムダ式(関数であるリスト)も許すほうが 一貫性があって見通しがよいはずですが、それは不可能です。 リストには補完候補表としての意味がすでにあり、連想リストがそれです。 関数としての可能性もある通常の連想リストの扱いに失敗するようでは、 信頼性がなくなります。 そのため、読者が補完に使用したい関数は、 シンボルに入れておく必要があるのです。
Emacsは、ファイル名の補完にはプログラム補完を用います。 See 節 24.8.6 ファイル名の補完。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節ではユーザーにyes/noを問い合わせるための関数について述べます。 関数y-or-n-pには、1文字で答えます。 誤った答えでも重大な問題に至らないような問い合わせに便利です。 yes-or-no-pには3文字か4文字で答える必要があるため、 より重要な問い合わせに適しています。
これらの関数がマウスを使って起動されたコマンドから呼ばれると、 より正確には、last-nonmenu-event(see 節 20.4 コマンドループからの情報)が nilかリストであると、 関数は問い合わせのための対話ボックスやポップアップメニューを使います。 さもなければ、キーボード入力を使います。 呼び出しにおいてlast-nonmenu-eventに適切な値を束縛することで マウスかキーボード入力の使用を強制できます。
厳密にいえば、yes-or-no-pはミニバッファを使いますが、 y-or-n-pは使いません。 ですが、両者をここで説明しておきます。
tを返し、 nを打てばnilを返します。 さらに、SPCを「y」、DELを「n」ともみなします。 C-]をC-gのように『中断』ともみなします。 というのは、問い合わせはミニバッファを使っているようにみえるので、 これから抜けるためにユーザーがC-]を使いそうだからである。 応答は1文字であり、RETで終える必要はない。 大文字と小文字は同じ意味である。
『問い合わせ』では、エコー領域にpromptを表示し、 文字列`(y or n) 'が続きます。 入力が正しい応答(y、n、SPC、 DEL、中断など)でないと、 関数は`Please answer y or n.'を表示して 問い合わせるを繰り返す。
応答は編集できないので、この関数は実際にはミニバッファを使わない。 ミニバッファが使うのと同じ画面領域を使う エコー領域(see 節 37.3 エコー領域)を実際には使う。 問い合わせ中は、カーソルはエコー領域に移動する。
応答とその意味は、 たとえ`y'や`n'であっても組み込まれているわけではない。 キーマップquery-replace-mapがそれらを指定する。 see 節 33.5 探索と置換。
以下の例では、ユーザーはまず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度に1つのメッセージだけが表示される。
y-or-n-pと同様だが、ユーザーがseconds秒以内に答えないと、 入力を待たずにdefault-valueを返す。 これにはタイマを使う。 39.7 遅延実行のためのタイマを参照。 引数secondsは整数でも浮動小数点でもよい。tを返し、 `no'を入力するとnilを返す。 応答を終えるためにユーザーはRETを打つ必要がある。 大文字と小文字は同じ意味である。
yes-or-no-pは、まず、promptに続けて `(yes or no) 'をエコー領域に表示する。 ユーザーは正しい応答の1つを入力する必要がある。 さもないと、この関数は`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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
各バッファについて『バッファを保存するか』などの 一連の単純な問い合わせをする場合には、 個々に問い合わせるかわりに map-y-or-n-pを用いてまとめて問い合わせるべきです。
listの値は、問い合わせ対象のオブジェクトを指定する。 オブジェクトのリストであるか、生成関数であること。 関数である場合、それは引数なしで呼ばれ、 つぎの問い合わせ対象のオブジェクトを返すか、 問い合わせの終了を意味するnilを返す。
引数prompterは、各問い合わせをどのように問うかを指定する。 prompterが文字列であると、問い合わせ文はつぎのように計算される。
(format prompter object) |
ここで、objectは(listから得た) 問い合わせ対象のオブジェクトである。
文字列でなければ、prompterは 1引数(問い合わせ対象のオブジェクト)の関数であり、 問い合わせ文を返す。 値が文字列であれば、それがユーザーへの問い合わせ文になる。 関数は、(ユーザーに問い合わせずに) 当該オブジェクトを処理することを意味するtか、 (ユーザーに問い合わせずに)当該オブジェクトを無視することを意味する nilを返してもよい。
引数actorは、ユーザーの応答に対してどのように動作するかを指定する。 これは1引数の関数であり、ユーザーが「はい」と答えたオブジェクトで 呼ばれる。 引数は、つねにlistから得たオブジェクトである。
引数helpを指定する場合、つぎの形のリストであること。
(singular plural action) |
ここで、 singularは操作対象のオブジェクトを 記述する単数形の名詞を含んだ文字列であり、 pluralは対応する複数形の名詞であり、 actionは動作を記述する他動詞であること。
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に対する(応答の)意味を定義する。 33.5 探索と置換を参照。
action-alistを使って、 可能な応答とそれらの意味を追加指定することもできる。 これは、(char function help)の形の要素から成る 連想リストであり、それぞれが1つの追加応答を定義する。 この要素の中で、 charは(応答である)1つの文字、 functionは1引数(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 節 20.4 コマンドループからの情報)が、 nilかリストであると、 関数は問い合わせのための対話ボックスやポップアップメニューを使う。 その場合、キーボード入力やエコー領域は使わない。 呼び出しにおいてlast-nonmenu-eventに適切な値を束縛することで マウスかキーボード入力の使用を強制できる。
map-y-or-n-pの戻り値は、処理したオブジェクトの個数である。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
別のプログラムへ渡すパスワードを読み取るには、 関数read-passwdを使います。
省略可能な引数confirmがnil以外であると、 パスワードを2回読み取り、両者が同一である必要がある。 同一でないと、連続して2回同じパスワードを打つまで ユーザーは何度でも繰り返す必要がある。
省略可能な引数defaultは、ユーザーが空のパスワードを 入力したときに返すデフォルトのパスワードを指定する。 defaultがnilであると、 read-passwdはそのような場面では空文字列を返す。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、ミニバッファに関係する他の基本関数や変数について述べます。
last-command-charにある) 最新のキーボード入力文字を活性なミニバッファに挿入してから抜ける。nilを返す。help-formのローカルな束縛に使われる。 (see 節 23.5 ヘルプ機能)。nilを返す。nilであると、カレントフレームを意味する。 フレームで使うミニバッファ用ウィンドウは、 そのフレームの一部である必要はない。 ミニバッファを持たないフレームでは、 他のフレームのミニバッファ用ウィンドウを使う。nil以外を返す。与えられたウィンドウがミニバッファ用であるかどうかを調べるために、 (minibuffer-window)の戻り値と比較するのは正しくありません。 というのは、フレームが複数個あると 複数のミニバッファ用ウィンドウがあるからです。
nil以外を返す。nil以外であると、 値はウィンドウオブジェクトであること。 ミニバッファで関数scroll-other-windowが呼ばれると、 scroll-other-windowはこのウィンドウをスクロールする。最後に、再帰ミニバッファ(see 節 20.11 再帰編集)を扱う 関数と変数について述べます。
nil以外であると、 ミニバッファ用ウィンドウが活性であっても、 (find-fileなどの)ミニバッファを使うコマンドを起動できる。 そのような起動では、新たなミニバッファに対する再帰編集レベルが作られる。 内側の(深い)ミニバッファを編集中には、 外側の(浅い)レベルのミニバッファは見えない。
この変数がnilであると、 ミニバッファ用ウィンドウが活性なときには、 別のウィンドウに切り替えたとしてもミニバッファコマンドは使えない。
コマンド名にnil以外の 属性enable-recursive-minibuffersがあると、 当該コマンドをミニバッファから起動したときでさえ、 当該コマンドはミニバッファを使って引数を読み取れます。 ミニバッファコマンドnext-matching-history-element (ミニバッファでは通常M-s)は、この機能を使っています。
| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |