2

何かを実行してから別のemacsコマンドYを呼び出し、コマンドYのインタラクティブインターフェイスもコピーするemacsコマンドXを定義するにはどうすればよいですか?

query-replaceの代替バージョンをcase-fold-searchの一時的に切り替えられた値で定義したいと思います。

(defun alt-query-replace (a b c d e)
  (interactive)
  (let ((case-fold-search (not case-fold-search))
    (query-replace a b c d e)))

これは機能しません。alt-query-replaceを呼び出すと、「引数の数が間違っています」と表示されます。alt-query-replaceのインタラクティブなインターフェースをquery-replaceと同じにしたい。query-replaceのソースコードを調べる必要がありますか、それとも一般的なアプローチがありますか?

4

2 に答える 2

5

別の関数を呼び出す代わりに、元の関数の動作を変更したい場合は、元の関数にアドバイスすることができます。

GNU Emacs Lisp リファレンス マニュアルの章 17.3 Around-Adviceから:

アラウンドアドバイスを使用すると、Lisp 式を元の関数定義の「アラウンド」に「ラップ」できます。

 (defadvice foo (around foo-around)
   "Ignore case in `foo'."
   (let ((case-fold-search t))
     ad-do-it))

あなたの場合、次のように書くことができます:

(defadvice query-replace (around alt-query-replace (from-string to-string &optional delimited start end))
    (let ((case-fold-search (not case-fold-search)))
      ad-do-it))
(ad-activate 'query-replace)
于 2009-10-20T12:32:48.940 に答える
4

対話型の呼び出しを使用します。


(defun alt-query-replace ()
  (interactive)
  (let ((case-fold-search (not case-fold-search)))
    (call-interactively 'query-replace)))
于 2009-10-20T10:15:59.107 に答える