[ < ] | [ > ] | [ << ] | [ 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-element
read-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 節 38.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を返す。 これにはタイマを使う。 37.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)は、この機能を使っています。
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |