emacs(具体的には)で関数のリストを呼び出す関数を書きたいのですがkill-buffer-query-functions
、それらのいずれかがユーザーの操作を必要とする場合は、nil
代わりに単に返すようにして、すべてが非対話的に実行されるようにします。通常は値が。の例外をdefadvice
ユーザーに要求するすべての関数を変更するため に使用することを考えています。次に、すべてをフォームでラップします。唯一の問題は、ユーザーに何かを促す可能性のあるすべてのemaceselisp関数の完全なリストがないことです。throw
nil
catch
誰かがそのようなリストを持っていますか、またはこれについて行くより簡単な方法はありますか?例として、関数yes-or-no-p
とy-or-n-p
は確かにこのリストに含まれread-string
ますcompleting-read
。
基本的に、このコードに省略記号を入力します。
(defun eval-but-return-if-requires-user (form &optional interactive-return)
"Evaluate FORM, but immediately stop and return INTERACTIVE-RETURN if any part of FORM would require user interaction."
;; Set up the safety net
(catch 'ui-required
(let ((ui-requiring-functions '( ... )) ; What goes in this list?
(ui-required-callback
;; A function that takes any number of args and throws an exception
'(lambda (&rest args)
(throw 'ui-required interactive-return)))
(flet-redefinitions
;; Use the above callback to create a list of redefinitions for `flet'
(mapcar (lambda (func)
(cons func (cdr ui-required-callback)))
ui-requiring-functions)))
`(flet
,flet-redefinitions ; Perform the function redefinitions,
,form)))) ; Then evaluate FORM
基本的に、すべてをcatchブロックでラップしてから、引数を取り、適切な例外をスローする関数本体を定義します。に渡される再定義のリストを設定しましたflet
。これにより、前述の例外スロー本体を使用するようにこれらの関数が一時的に再定義されます。最後に、form
これらの一時的な関数の再定義を使用して評価します。
さて、そのコードにはおそらくいくつかの引用エラーがありますが、再定義する関数の適切なリストがあればうまくいくと思います。
ユーザーの操作が必要なフォーム内の特定の関数呼び出しだけでなく、ユーザーの操作が必要な場合は、フォーム全体を返すようにしたいことに注意してください。私がこれを必要とする理由を理解するために、フォームが次の質問のいずれかを尋ねる可能性があることを考慮してください。
- この非常に重要なファイルを削除しますか?はい、もしくは、いいえ
- この非常に重要なファイルを保持しますか?はい、もしくは、いいえ
明らかに、yes-or-no-p
常に戻るように変更した場合nil
(つまり、「いいえ」)、重要なファイルを削除から保存することは保証されません。したがって、どのような質問が行われるかわからないので、ユーザーに質問したい場合は、フォーム全体を単純に中止して特定の値を返すようにします。
基本的に、「このコードを評価しますが、それを行うために何か質問が必要な場合は、それを忘れて戻ってください」と言いたいですnil
。