6

私はいくつかのファイルに注釈を付けるために Emacs モードを使用しています (実際のモードは重要ではありません)。これはライブラリとして提供され、コンパイル済みの Lisp コードが付属しています (もちろん)。その中の単一の関数をオーバーライドして、その動作を変更したいと考えています。私のローカルEmacsセッションのためだけに。とりあえず、ライブラリのソース ファイルから関数をコピーして貼り付け、少し変更してからeval-last-sexp. ここまでは順調ですね。しかし、一貫性のない結果が得られます。Emacs が.elcソースからの関数と混合されたファイルからの関数をどのように処理するかはわかりません。自分のバージョンの関数が実行されていることもあれば、元のバージョンが実行されていることもあります。非常に紛らわしい(そして迷惑)。

読み取り専用のライブラリのソース ファイルを変更せずに、Emacs ライブラリの Lisp 関数を一貫して置き換える方法はありますか?

4

2 に答える 2

6

このような何かがうまくいくはずです:

(advice-add 'name-of-func-to-override :override
            (lambda () (message "does this instead now")))

name-of-func-to-overrideを関数名に、lambdaをバージョンに置き換えます。

add-function(およびadvice-add) ドキュメントを参照することをお勧め:overrideします。実際には必要なものではない可能性があります。

于 2016-07-21T19:29:03.583 に答える
2

あなたの問題の最も可能性の高い説明はeval-last-sexp、他のライブラリがロードされる前に (コピーして) 時々、最後のライブラリが勝つということです!

関数が定義される前にそのオーバーライドを適用でき、関数の通常の定義が存続するため、@Jack で提案されているように使用advice-addすることは良い解決策です。

つまり、多くの場合、関数をオーバーライドする必要はありません。おそらく必要なのは、独自の名前で独自の関数を定義し、キーマップを変更して、ライブラリの関数ではなく独自の関数を実行することだけです。

于 2016-07-22T18:13:20.917 に答える