Next: , Previous: , Up: ミニバッファー   [Contents][Index]


21.2 ミニバッファーでのテキスト文字列の読み取り

ミニバッファー入力にたいする基本的なプリミティブはread-from-minibufferで、これは文字列とLispオブジェクトの両方からテキスト表現されたフォームを読み取ることができます。関数read-regexpは特別な種類の文字列である正規表現式(正規表現を参照)の読み取りに使用されます。コマンドや変数、ファイル名などの読み取りに特化した関数もあります(補完を参照)。

ほとんどの場合でにはLisp関数の途中でミニバッファー入力関数を呼び出すべきではありません。かわりにinteractive指定されたコマンドの引数の読み取りの一環として、すべてのミニバッファー入力を行います。コマンドの定義を参照してください。

Function: read-from-minibuffer prompt &optional initial keymap read history default inherit-input-method

この関数はミニバッファーから入力を取得するもっとも一般的な手段である。デフォルトでは任意のテキストを受け入れて、それを文字列としてリターンする。しかしreadが非nilなら、テキストをLispオブジェクトに変換するためにreadを使用する(入力関数を参照)。

この関数が最初に行うのはミニバッファーをアクティブにして、プロンプトにprompt(文字列でなければならない)を用いてミニバッファーを表示することである。その後にユーザーはミニバッファーでテキストを編集できる。

ミニバッファーをexitするためにユーザーがコマンドをタイプするとき、read-from-minibufferはミニバッファー内のテキストからリターン値を構築する。通常はそのテキストを含む文字列がリターンされる。しかしreadが非nilなら、read-from-minibufferはテキストを読み込んで結果を未評価のLispオブジェクトでリターンする(読み取りについての詳細はSee 入力関数を参照)。

引数defaultはヒストリーコマンドを通じて利用できるデフォルト値を指定する。値には文字列、文字列リスト、またはnilを指定する。文字列と文字列リストは、ユーザーがM-nで利用可能な“未来のヒストリー(future history)”になる。更に(keymap引数を通じて)呼び出しで補完が提供された場合には、defaultの値をM-nで使い果たすと、その補完候補が“未来のヒストリー”に追加される。minibuffer-default-add-functionを参照のこと。

readが非nilなら、ユーザーの入力が空のときのreadの入力としてもdefaultが使用される。defaultが文字列リストの場合には最初の文字列が入力として使用される。defaultnilなら、空の入力はend-of-fileエラーとなる。しかし通常(readnil)の場合には、ユーザーの入力が空のときread-from-minibufferdefaultを無視して空文字列""をリターンする。この点ではこの関数はこのチャプターの他のどのミニバッファー入力関数とも異なる。

keymapが非nilなら、そのキーマップはミニバッファー内で使用されるローカルキーマップとなる。keymapが省略またはnilなら、minibuffer-local-mapの値がキーマップとして使用される。キーマップの指定は補完のようなさまざまなアプリケーションにたいしてミニバッファーをカスタマイズする、もっとも重要な方法である。

引数historyは入力の保存やミニバッファー内で使用されるヒストリーコマンドが使用するヒストリーリスト変数を指定する。デフォルトはminibuffer-historyhistoryがシンボルtなら、ヒストリーを記録しない。同様にオプションでヒストリーリスト内の開始位置を指定できる。ミニバッファーのヒストリーを参照のこと。

変数minibuffer-allow-text-propertiesが非nilなら、リターンされる文字列にはミニバッファーでのすべてのテキストプロパティが含まれる。それ以外なら、値がリターンされるときすべてのテキストプロパティが取り除かれる(この変数はデフォルトではnil)。

minibuffer-prompt-properties内のテキストプロパティはプロンプトに適用される。このプロパティリストはデフォルトではプロンプトに使用するフェイスを定義する。このフェイスが与えられるとフェイスリストの最後に適用されて表示前にマージされる。

ユーザーがプロンプトの外観を完全に制御したければすべてのフェイスリストの最後にdefaultフェイスを指定するのがもっとも簡便な方法である。たとえば:

(read-from-minibuffer
 (concat
  (propertize "Bold" 'face '(bold default))
  (propertize " and normal: " 'face '(default))))

引数inherit-input-methodが非nilなら、ミニバッファーにエンターする前にカレントだったバッファーが何であれ、カレントの入力メソッド(入力メソッドを参照)、およびenable-multibyte-charactersのセッティング(テキストの表現方法を参照)が継承される。

ほとんどの場合、initialの使用は推奨されない。非nil値の使用は、historyにたいするコンスセル指定と組み合わせる場合のみ推奨する。入力の初期値を参照のこと。

Function: read-string prompt &optional initial history default inherit-input-method

この関数はミニバッファーから文字列を読み取ってそれをリターンする。引数promptinitialhistoryinherit-input-methodread-from-minibufferで使用する場合と同様。使用されるキーマップはminibuffer-local-map

オプション引数defaultread-from-minibufferの場合と同様に使用されるが、ユーザーの入力が空の場合にリターンするデフォルト値も指定する。read-from-minibufferの場合と同様に値は文字列、文字列リスト、またはnil(空文字列と等価)である。defaultが文字列のときは、その文字列がデフォルト値になる。文字列リストのときは、最初の文字列がデフォルト値になる(これらの文字列はすべて“未来のミニバッファーヒストリー(future minibuffer history)”としてユーザーが利用できる)。

この関数はread-from-minibufferを呼び出すことによって機能する。

(read-string prompt initial history default inherit)
≡
(let ((value
       (read-from-minibuffer prompt initial nil nil
                             history default inherit)))
  (if (and (equal value "") default)
      (if (consp default) (car default) default)
    value))

長い文字列(たとえば複数行に跨がるような文字列)を編集したい場合にread-stringを使うのは理想的ではないかもしれない。そのような場合にはその文字列をユーザーが編集できる通常のバッファーを新たにポップアップしたほうが便利かもしれない。これはread-string-from-bufferを使用して行うことができる。

Function: read-regexp prompt &optional defaults history

この関数はミニバッファーから文字列として正規表現を読み取ってそれをリターンする。ミニバッファーのプロンプト文字列promptが‘:’(とその後にオプションの空白文字)で終端されていなければ、この関数はデフォルトのリターン値(空文字列でない場合。以下参照)の前に‘: ’を付加する。

オプション引数defaultsは、入力が空の場合にリターンするデフォルト値を制御する。値は文字列、nil(空文字列と等価)、文字列リスト、シンボルのうちのいずれか。

defaultsがシンボルの場合、read-regexpは変数read-regexp-defaults-function(以下参照)の値を調べて非nilのときはdefaultsよりそちらを優先的に使用する。この場合は値は以下のいずれか:

  • - regexp-history-last。これは適切なミニバッファーヒストリーリスト(以下参照)の最初の要素を使用することを意味する。
  • - 引数なしの関数。リターン値(nil、文字列、文字列リストのいずれか)がdefaultsの値となる。

これでread-regexpdefaultsを処理した結果はリストに確定する(値がnilまたは文字列の場合は1要素のリストに変換する)。このリストにたいしてread-regexpは以下のような入力として有用な候補をいくつか追加する:

  • - ポイント位置の単語かシンボル。
  • - インクリメンタル検索で最後に使用されたregexp。
  • - インクリメンタル検索で最後に使用された文字列。
  • - 問い合わせつき置換コマンドで最後に使用された文字列またはパターン。

これで関数はユーザー入力を取得するためにread-from-minibufferに渡す正規表現のリストを得た。リストの最初の要素は入力が空の場合のデフォルト値である。リストのすべての要素は“未来のミニバッファーヒストリー(future minibuffer history)”となるリスト(see future list in The GNU Emacs Manualを参照)としてユーザーが利用可能になる。

オプション引数historyが非nilなら、それは使用するミニバッファーヒストリーリストを指定するシンボルである(ミニバッファーのヒストリーを参照)。これが省略またはnilなら、ヒストリーリストのデフォルトはregexp-historyとなる。

ユーザーはcase foldingをオンまたはオフにするかどうかを示すために、M-s cコマンドを使うことができる。ユーザーがこのコマンドを使うと、リターンされる文字列のテキストプロパティcase-foldにはfoldまたはinhibit-foldのいずれかがセットされる。この値を実際に使うかどうかはread-regexpの呼び出し側に任されており、そのための利便的関数としてread-regexp-case-fold-searchが提供されている。典型的な使い方は以下のようになるだろう:

(let* ((regexp (read-regexp "Search for: "))
       (case-fold-search (read-regexp-case-fold-search regexp)))
  (re-search-forward regexp))
User Option: read-regexp-defaults-function

関数read-regexpは、デフォルトの正規表現リストを決定するためにこの変数の値を使用するかもしれない。非nilなら、この変数は以下のいずれかである:

  • - シンボルregexp-history-last
  • - nil、文字列、文字列リストのいずれかをリターンする引数なしの関数。

これらの変数の使い方についての詳細は、上述のread-regexpを参照のこと。

Variable: minibuffer-allow-text-properties

この変数がnil (デフォルト)なら、read-from-minibufferread-stringはミニバッファー入力をリターンする前にすべてのテキストプロパティを取り除く。しかしread-no-blanks-input(以下参照)、同様に補完つきでミニバッファー入力を行うread-minibufferとそれに関連する関数(Reading Lisp Objects With the Minibufferを参照)は、この変数の値に関わらず、無条件でfaceプロパティを破棄する。

この変数が非nilなら、補完テーブル由来の文字列(ただし補完された文字列部分のみ)のほとんどのテキストプロパティは保持される。

(let ((minibuffer-allow-text-properties t))
  (completing-read "String: " (list (propertize "foobar" 'data 'zot))))
=> #("foobar" 3 6 (data zot))

この例ではユーザーが‘foo’とタイプしてからTABキーを押下しており、最後の3文字のテキストプロパティだけが保持される。

Variable: minibuffer-local-map

これはミニバッファーからの読み取りにたいするデフォルトローカルキーマップである。デフォルトでは以下のバインディングをもつ:

C-j

exit-minibuffer

RET

exit-minibuffer

M-<

minibuffer-beginning-of-buffer

C-g

abort-recursive-edit

M-n
DOWN

next-history-element

M-p
UP

previous-history-element

M-s

next-matching-history-element

M-r

previous-matching-history-element

変数minibuffer-mode-mapはこの変数にたいするエイリアス。

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

この関数はミニバッファーから文字列を読み取るが、入力の一部として空白文字を認めず、そのかわりに空白文字は入力を終端させる。引数promptinitialinherit-input-methodread-from-minibufferで使用するときと同様。

これは関数read-from-minibufferの簡略化されたインターフェイスであり、キーマップminibuffer-local-ns-mapの値をkeymap引数としてread-from-minibuffer関数に渡す。キーマップminibuffer-local-ns-mapC-qをリバインドしないので、クォートすることによって文字列内にスペースを挿入することが可能である。

minibuffer-allow-text-propertiesの値に関わらず、この関数はテキストプロパティを破棄する。

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

このビルトイン変数は関数read-no-blanks-input内でミニバッファーローカルキーマップとして使用されるキーマップである。デフォルトではminibuffer-local-mapのバインディングに加えて、以下のバインディングが有効になる:

SPC

exit-minibuffer

TAB

exit-minibuffer

?

self-insert-and-exit

Function: format-prompt prompt default &rest format-args

minibuffer-default-prompt-format変数に応じたデフォルト値defaultpromptをフォーマットする。

minibuffer-default-prompt-formatはフォーマット文字列(デフォルトは‘" (default %s)"’)であり、これは‘"Local filename (default somefile): "’のようなプロンプトの“default”部分をどのようにフォーマットするかを指示する。

これをどのように表示させるかをユーザーがカスタマイズできるようにするには、ユーザーに(デフォルト値をもつ)値の入力を求めるコードが、そのコードスニペット行に沿って何らかを調べる必要がある:

(read-file-name
 (format-prompt "Local filename" file)
 nil file)

format-argsnilなら、promptはリテラル文字列として使用される。format-argsが非nilならpromptはフォーマットコントロール文字列として使用され、promptformat-argsformatに渡される(文字列のフォーマットを参照)。

minibuffer-default-prompt-formatは‘""’でもよく、その場合には何のデフォルト値も表示されない。

defaultnilならデフォルト値はなく、したがって結果となる値には“default value”文字列は含まれない。defaultが非nilのリストなら、プロンプトでリストの最初の要素が使用される。

promptminibuffer-default-prompt-formatはいずれもsubstitute-command-keysを通じて実行される(ドキュメント内でのキーバインディングの置き換えを参照)。

Variable: read-minibuffer-restore-windows

このオプションが非nil (デフォルト)の場合には、ミニバッファーからの入力を取得してexitする際に、ミニバッファーにエンターしたフレーム、それが別のフレームならミニバッファーウィンドウを所有するフレームのウィンドウ構成をリストアする。これはたとえば同じフレームにあるミニバッファーから入力を所得中にユーザーがウィンドウを分割した場合には、ミニバッファーのexit時にその分割が取り消されることを意味する。

このオプションがnilなら、そのようなリストアは行われない。したがって上記のような分割はミニバッファーexit後も保持される。


Next: ミニバッファーでのLispオブジェクトの読み取り, Previous: ミニバッファーの概要, Up: ミニバッファー   [Contents][Index]