2

を使用してユーザーにコマンドを要求し、ユーザーread-commandがミニバッファーに空の文字列を入力したかどうかに基づいてアクションを実行する必要があります。

ほとんどのread-command場合、有効なコマンドを返します。しかし、ユーザーが (ミニバッファーでエンターを押すだけで) 空白の文字列を入力すると、nil、文字列でもコマンドでもない奇妙なオブジェクトが返されます ( および によるstringpcommandp)。

ELISP> (setq strange-object (read-command "Enter some command" nil) )
ELISP> (equal nil strange-object)
nil
ELISP> (if strange-object "YES" "NO")
"YES"
ELISP> (mapcar (lambda (fun) (funcall fun strange-object)) (list 'stringp 'commandp 'char-or-string-p 'functionp 'integerp 'listp) )
(nil nil nil nil nil nil)
ELISP> (prin1-to-string strange-object)
""
ELISP> (equal "" strange-object)
nil

どうやって:

  1. このオブジェクトの読み取り構文にアクセスしますか?
  2. ここで定義されたすべての型述語と照合せずに、オブジェクトの型を決定します
  3. このオブジェクトに対する等価性をテストしますか?
  4. 行儀が悪いのはなぜread-command?の仕様read-command:

read-command は、`minibuf.c' の組み込み関数です。

(read-command PROMPT &optional DEFAULT-VALUE)

コマンドの名前を読み取り、シンボルとして返します。PROMPT でプロンプトを出します。デフォルトでは、リストの場合は DEFAULT-VALUE またはその最初の要素を返します。

[戻る]

nilとして渡したので、期待していましDEFAULT-VALUEたが、どうやらread-command気にしないようです。

のソースを読み込んでminibuf.c何が起こっているのかを確認しようとしましたが、それを機能させることもできませんでした。ここemacs-23.3b.tar.gzからダウンロードし、emacs でソースを探しましたが、見つかりませんでした。どちらもそこに存在していないようです。非常にイライラするものです。ポインタをいただければ幸いです。minibuf.c

4

1 に答える 1