2016-10-27 7 views
0

アドバイスを追加するときに、elisp関数のボディの特定の式とどのように一致させますか?具体的には、次の例では、find-fileの代わりにfind-file-noselectを使用するように、つまり、 行(find-file path)は、(find-file-noselect path)になります。アドバイスを使用してelisp関数の本体の式を変更する

(defun tst-fun (path line column) 
    (find-file path) 
    (goto-char (point-min)) 
    (forward-line (1- line)) 
    (forward-char column)) 

;; not sure how to structure this 
(defadvice tst-fun (around noselect activate) 
    (find-file-noselect (ad-get-arg 0)) 
    ad-do-it) 

私はむしろad-add-functionとしてそれを持っているだろうが、ただ、これは最初の作業を取得しようとしています。

+0

アドバイスは、アドバイスされた機能の前、後、または代わりに実行されますが、元の機能自体の動作を変更しません。 – Barmar

+0

@Barmarだから、 'ad-do-it'を'(cdr ad-do-it) 'に設定するなどの方法はありませんか? – jenesaisquoi

+0

これは 'tst-fun'を呼び出し、それが返すものの' cdr'を返します。 – Barmar

答えて

2

アドバイスでfind-filefind-file-noselectと一時的に再定義することができます。

(require 'cl) 
(defadvice tst-fun (around noselect activate) 
    (flet ((find-file (&rest args) 
      (apply 'find-file-noselect args))) 
    ad-do-it)) 
+0

私はそれをする方法がないと確信しています。他のLispの方言には ':INSIDE'のアドバイスがあります。ここで' find-file'に 'tst-fun'の中でしかアドバイスできませんでしたが、Elispはこれを持っていません。 – Barmar

+1

"現代の" Elispでは、これは次のようになります: '(require-cl-lib)(アドバイス-add 'tst-fun:around(lambda(orig&rest args)ファイル)# 'find-file-noselect))(orig argsを適用する)) '。 – Stefan

関連する問題