タグ付けされた質問 「advice」

4
Emacs 24.4の新しいアドバイスシステムの実用的な利点
Emacs 24.4には新しいアドバイスシステムが付属しています。NEWSファイルは述べています: **新しいパッケージnadvice.elは、より軽量なアドバイス機能を提供します。次のように階層化されます。 *** add-function/ remove-function。これは、プロセスフィルターや<foo>-functionフックなど、関数を実行する場所でコードを追加/削除するために使用できます。 *** advice-add/ advice-remove名前付き関数に関するアドバイスを追加/削除するには、よくdefadviceやる。 Q:この新しいパッケージの実際的な利点と意味は何ですか? 私は特に、次の点に対処する回答に興味があります。 (アドオンパッケージを書くのではなく)Emacsをカスタマイズするためにアドバイスだけを使用している場合、新しいシステムに切り替える必要がありますか?ある時点で古いシステムを置き換えますか? 私が達成できない新しいシステムで正確に何ができdefadviceますか? 「機能を実行する場所でコードを追加/削除」できることの重要性は何ですか?
53 emacs24.4  advice 

1
nadviceを使用するにはどうすればよいですか?
私の設定にはアドバイスがたくさんあり、新しい光沢のあるミニマリストのnadvice.elパッケージについて聞いています。 私はマニュアルを検索し、ソースを読みましたが、私は率直に認めます。 ここの誰かがガイドを教えてくれたり、古いスタイルのアドバイスを移植する方法を教えてもらえますか?

1
Emacs let-bound advice
コード内の関数を一時的にオーバーライドしたいと思います。 たとえば、次のことを考えてください。 (defun nadvice/load-quiet (args) (cl-destructuring-bind (file &optional noerror nomessage nosuffix must-suffix) args (list file noerror t nosuffix must-suffix))) (defun nadvice/idle-require-quiet (old-fun &rest args) (advice-add 'load :filter-args #'nadvice/load-quiet) (apply old-fun args) (advice-remove #'load #'nadvice/load-quiet)) (advice-add 'idle-require-load-next :around #'nadvice/idle-require-quiet) 動作しないもの: この。アドバイスを手動で有効または無効にすることを避け、Emacsのシングルスレッドの性質を信頼して物事を処理できれば、ずっときれいになります。 cl-letf元の関数を参照させないため、:filter-args通常行うことを実装できません。 cl-flet 他の関数の関数をオーバーライドすることはできません。 noflet避けたい外部パッケージです。(また、私が必要とする以上のことをします)

3
cc-modeのbefore-save-hook
cc-mode保存する前に関数を実行するようにカスタマイズしたい。1つの解決策は、cc-modeキーマップを変更C-x C-sして、必要な作業を実行して保存する関数にバインドすることです。 私の質問は、これのためにカスタマイズできるフックがあるかどうかです。CCフックドキュメントは言及していないbefore-save-hook、特にためにcc-mode。フックを介してこれをどのように行う必要がありますか? または、これをどのように行うのdefadviceですか?マニュアルを読んだところ、私が見た唯一の方法は、保存する前にアドバイスを有効にし、作業が終わったら無効にすることでした。これは面倒に聞こえます。advicesの慣用的な使い方は何でしょうか?
13 hooks  cc-mode  advice 

2
nadvice.elの引数リストを操作するには?
新しいアドバイスシステムに関する別の質問への回答に続きます。 古いスタイルadvice.elでは、アドバイスされた関数の引数リストの個々のメンバーを操作することは可能でしたが、それらのメンバーに関する操作は行われませんでした。たとえば、次のアドバイス: (defadvice ansi-term (around prompt-for-name last) (let ((name (read-from-minibuffer "Tag: "))) (and (not (string= name "")) (ad-set-arg 1 (concat "Term: " name))) ad-do-it)) ansi-term呼び出しに対するbuffer-name引数の(オプションの)提供を許可しますが、ansi-term独自の対話形式に従ってプロンプトを表示することにより、最初の引数を取得します。 (後で参照するため、ansi-termの署名は(PROGRAM &optional BUFFER-NAME)であり、その対話形式はいくつかの可能なデフォルトでPROGRAMを要求しますが、BUFFER-NAMEに関しては何もしません。) これが可能かどうかはわかりませんnadvice.el。もしそうなら、私はそれがどのように行われるか確信がありません。アドバイスされた関数の引数リストを置き換えるいくつかの方法を見つけました。 たとえば、* info *(elisp)アドバイスコンビネータから: `:filter-args' Call FUNCTION first and use the result (which should be a list) as the new arguments to …
12 advice  arguments 

3
名前のないアドバイスを削除するにはどうすればよいですか?
私は関数にいくつかのアドバイスを追加して楽しんでいました: (advice-add 'executable-find :around (lambda (f &rest args) (apply g args))) ;;; ^ 痛い、タイプミス。それを修正し、上記のコードを再度評価しました。しかし今、私はその機能に関する「修正された」および「壊れた」アドバイスの両方を持っています。 これらを取り除くにはどうすればよいですか?ことを考えるとadvice-removeニーズが関数オブジェクトまたは(ここでは空である)周りのアドバイスのいずれか? (明らかに、私は単に終了して再起動できますが、別の方法がありますか?)
12 advice 

3
透過的な「パススルー」関数ラッパーを作成する方法は?
「透過的な「パススルー」関数ラッパー」とは、wrapperすべての引数を他の関数に渡した結果を返す関数のことwrappeeです。 Emacs Lispではこれはどのように行われますか? NB:理想的なwrapper機能があるとらわれない程度wrappee関数のシグネチャ。つまり、wrappeeの引数の数、位置、名前などは何も知りません。最初に呼び出されたwrappeeかのように、すべての引数をに渡しますwrappee。(必要がへの呼び出しを置き換えるためにコールスタックを台無しに、しかし、ありませんwrapperへの呼び出しでwrappee。) 私は私の質問に部分的な回答を投稿しました: (defun wrapper (&rest args) (apply 'wrappee args)) これは、wrappeeがインタラクティブでない場合にのみ機能します。どうやら、インタラクティブ関数が引数を取得する方法は、(&rest args)呪文の対象とは異なる「チャネル」を表します。したがって、私がまだ必要としているのは、が対話型の関数である場合のwrappee、(&rest args)署名に等しく不可知論的な対応物です。wrappee (この質問は、この前の質問で説明されている問題によって動機付けられました。) 私が求めていることをさらに明確にする必要がある場合のために、以下にいくつかの例を示し、PythonとJavaScriptで同等のものを示します。 Pythonでは、このようなラッパーを実装するいくつかの標準的な方法を以下に示します。 def wrapper(*args, **kwargs): return wrappee(*args, **kwargs) # or wrapper = lambda *args, **kwargs: wrappee(*args, **kwargs) (ここで*argsは「すべての位置引数」を**kwargs表し、「すべてのキーワード引数」を表します。) 同等のJavaScriptは次のようになります。 function wrapper () { return wrappee.apply(this, arguments); } // or wrapper = function () { …
10 advice  arguments 

5
ヘルプからEmacsソースコードを参照するときに表示専用モードに入る方法
Emacsのヘルプを参照して関数をC-h f探しているとき、Elisp / Cの実装をよく調べたいと思います。view-modeこの方法でソースコードにアクセスしたときに自動的に入力して、不要な変更を回避したいと考えています。これを達成するためにアドバイスできるフックまたは関数はありますか?

1
関数をローカルでオーバーライドしますが、元の関数の呼び出しを許可します
アドバイス機能により、関数の動作をグローバルに変更できます。アドバイス定義は、元の関数を呼び出すことができます。 (defadvice foo (around foo-bar activate compile) "Always set `qux' to t when running `foo'." (let ((qux t)) ad-do-it)) clパッケージは提供しflet、ローカルの機能を無効にするマクロを。 (defun foo () "global") (flet ((foo () "local")) (some-code-that-calls-foo)) それは元のfoo関数への参照を許可しません。ローカルのオーバーライドで元の関数を呼び出す必要がある場合はどうなりますか? (defun foo () "global") (flet ((foo () (concat (foo) "+local"))) ;; this will cause an infinite loop when (foo) is …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.