2016-07-21 5 views
3

私はEmacsモードを使用していくつかのファイルに注釈を付けます(実際のモードは重要ではありません)。これはライブラリとして提供され、コンパイルされたlispコードが付いています(もちろん)。私はその中の一つの関数をオーバーライドすることによってその動作を変更したい。私のローカルEmacsセッションのためだけです。今のところ、私はライブラリのソースファイルから関数をコピーして貼り付け、それをちょっと修正してからeval-last-sexpを押します。ここまでは順調ですね。しかし、私は一貫性のない結果を得ます:.elcファイルから来る関数をEmacsがどのように処理して、ソースから来た関数をどのように扱っているのかよくわかりません。時には私自身のバージョンの関数が動作していることがあります。時にはオリジナルのバージョンもあります。非常に紛らわしい(そして迷惑な)。Emacsライブラリ内の単一の関数をオーバーライドします。

私は一貫してEmacsライブラリのlisp関数を置き換えることができますは読み取り専用のライブラリのソースファイルを変更することなく使用できますか?

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

は、関数名とバージョンとlambdaname-of-func-to-overrideを置き換えます。このような

答えて

1

何かがトリックを行う必要があります。

私はadd-function(およびadvice-add)のドキュメントを見て、:overrideは実際にあなたが望むものではないかもしれないことをお勧めします。

+1

「add-function」とその他はEmacs 24.4でのみ追加されました(私はEmacsを更新する必要があります)。 –

1

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

を@Jackが提案したように使用することは良い解決策です。なぜなら、そのオーバーライドは関数が定義される前に適用でき、関数の通常の定義から生き残るからです。

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

関連する問題