問題タブ [advising-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
emacs - Emacs Lisp、マクロをマッピングして引数の 1 つを評価する方法
Bob Glickstein は、"Writing GNU Emacs Extensions" の第 3 章で、スクロール機能をアドバイスする方法について説明しています。(彼はそれらを可逆にすることを提案しているので、スクロールする前に状態を保存する必要があります。)
たとえば、スクロールアップコマンドの場合、このアドバイスは次のように行われます
良い。もちろん、すべてのスクロール コマンドに対してこれを行う必要があります。では、それらを順番に並べて、まとめてアドバイスしていきたいと思います。
(ベクトルを使用して 5 つの引用符を保存します。)
しかし今、私は立ち往生しています。
defadvice はマクロであり、fun-name を評価しないため、(存在しない) 関数 fun-name を 4 回アドバイスします。
それを行う方法はありますか?
(私は Emacs 24 を使用しています)
emacs - Emacs term-mode: 一部のホストでリモートのデフォルト ディレクトリの設定を停止する
私はterm-mode
Emacs 内で Bash シェルを実行していました。リモート ホストでは、term-mode
のディレクトリ追跡機能default-directory
がホスト名を含むように設定されているため、タブ補完とファイル アクセスは Tramp を介してリモートで行われます。ただし、NFS から同じディレクトリをロードするため、ワークステーションとほとんど同じファイルシステムを共有するリモート ホストを使用することがあります。これらの場合、Tramp は私を遅らせすぎます。default-directory
これらのシステムを使用する場合、Emacs がローカルに設定できるようにしたいと思います。これを行うためにterm-handle-ansi-terminal-messages
、システムterm.el
から、.emacs
. この部分を置き換えます:
これとともに:
これはterm-equivalent-filesystem-host-group-p
、ホストが同等のファイルシステムを持つものとして扱われるべきかどうかを伝える関数を呼び出します。
この方法には望ましい効果がありますが、システムの Lisp コードをコピーして変更することは、コードの将来の変更に対して堅牢ではありません。関数の機能の半分 (メッセージ ループまたはdefault-directory
and ange-ftp-
… 変数の設定) を複製せずに関数をアドバイスすることはできないと思います。
これを行うより良い方法はありますか?
emacs - emacs: マークリングの使い方は?
を実行するC-u C-SPC
と、emacs は「前にいた場所」に移動します。その後C-u C-SPC
押すと前の場所に戻ります。それはとても素晴らしいです、そして私はそれをたくさん使います。
しかし、何かがいつも私を悩ませていました: マークリングから欠落している唯一のマークはwhere-I-invoked-this-in-the-placeです! パンくずを置いてきて、「おっと、道に迷ったかもしれないから戻って確認してみよう」と言って、パンくずを残さずに今いる場所に戻るようなものです。
私は関数をアドバイスしようとしましたが、私の人生では、プログラムで をシミュレートすることはできませんC-SPC C-SPC
。
- 「Ch k」のように、キーの組み合わせが何をするかを「見る」(エコー、メッセージ、トレースなど) 方法を教えてください
C-SPC C-SPC
。後者についてのマニュアルの内容は次のとおりです(強調は私のものです)
C-SPC は、コマンド set-mark-command を実行します。これは、`simple.el' 内のインタラクティブにコンパイルされた Lisp 関数です。
C-@、C-SPC にバインドされます。
(set-mark-command ARG)
ポイントがある場所にマークを設定するか、マークにジャンプします。マークを設定すると、ポイントとマークの間のテキストであるリージョンも変更されます。これは、一部のエディターが「選択」と呼ぶものに Emacs で最も近いものです。
前置引数なしで、ポイントにマークを設定し、古いマーク位置をローカル マーク リングにプッシュします。また、以前のマークが別のバッファに設定されている場合は、グローバル マーク リングに古いマークをプッシュします。
しかし、「ポイントにマークを設定する」ために「前置引数なし」で(非対話的に)使用しようとすると、「引数の数が間違っています」というデバッガエラーが発生します..?(引数と前置引数の違いを認識しています)。
哲学的で非現実的な答えでも構いません。ここでのアイデアが何であるかを理解したいだけです。
emacs - Emacs - 空白のキルをスキップ
キルリングが本質的に空白のみのエントリ (タブ、改行、スペースのみなど) を無視するようにしようとしています。いくつかの質問。
- そもそも空白のエントリがキルリングに入らないようにするか、ヤンクでスキップする方がよいでしょうか? 私は後者を想定しました。
その場合、現在のキル、ヤンク、およびヤンクの挿入の間で、どの関数にアドバイスする必要があるかについて完全に迷っています-しかし、キルリングから空白をヤンクしないように操作する必要があるかどうかは完全にはわかりません。
ありがとう!
編集:これを行う方法は、「current-kill」を操作して、空白以外のエントリに到達するまで自分自身を呼び出し続けることだと確信していますか? (またはリングの終わりのいずれか早い方)
emacs - 特定の基本モード バッファーの変数を変更する方法
show-trailing-whitespace
目標:いくつかを除いて、すべてのバッファーを有効にしたいと考えています。問題を引き起こす例外は*Shell Command Output*
、 とその従兄弟*Async Shell Command*
です。
通常は にshow-trailing-whitespace
カスタマイズしていt
ます。したがって、すべての新しいバッファでアクティブになります。
また、特定のバッファーに対してオフにしたいと思います*Shell Command Output*
。これは私にとって問題を引き起こします:
- 出力バッファは特別なモードを使用しません。それはまだです
fundamental-mode
。fundamental-mode-hook
この設定をフックできるものはありません。 after-major-mode-change-hook
メジャー モードが に変更されたときに実行される がありますfundamental-mode
が、バッファはそのモードで開始されるため、このフックは実行されません。- にフックする方法はないようです
get-buffer-create
。
この特定の例ではいつadvise
でも関数を実行できることはわかっていますget-buffer-create
が、できるだけ回避するようにしています。
ヒントはありますか?
emacs - 特定の他の関数から呼び出された場合にのみ、関数に関するアドバイスをトリガーします
現在のディレクトリと親ディレクトリでdired-do-shell-command
(にバインドされている)を呼び出せないという制限を回避しようとしています。スタックトレースは下部に貼り付けられます。!
.
..
このエラーを回避するために、以下のようにアドバイスを定義できます。
ただし、これはへのすべての呼び出しに影響しますdired-get-filename
。スタックが。の場合にのみトリガーしたいdired-do-shell-command -> dired-get-marked-files -> dired-get-filename
。
私が考えることができる唯一のアプローチは次のとおりです
(with-output-to-string (backtrace))
アドバイス定義で一致するものを検索します- 他のメソッドにアドバイスを追加して、アドバイス定義でテストできる変数を設定します。
それを行うためのより良い方法はありますか?からの文字列ではなく、データ構造として現在のスタックトレースへのアクセスを探していると思います(backtrace)
emacs - 書き込み専用バッファ?
ほとんどのコンソールがバッファーでどのように機能するかを模倣したいのですが、それを行う方法はありますか?つまり、バッファへのテキストの追加のみを許可し、削除は許可しませんか?
おそらく、文字を削除するいくつかの組み込み関数を無効にするかアドバイスすることができますが、これはあまりスケーラブルなソリューションではないのではないかと思います...いくつかを見逃す可能性があります。
emacs - setfの新しい変数指定子を追加しますか?
これはCommonLispで(オーバーロードによって)可能だと思いますが、setf
EmacsLispについてはよくわかりません。
私がやりたいことは次のようなものです:
ここで、フォーム(local ...)
は私が書いたコードを呼び出し、その値スロットの設定に使用するシンボルを返します。
編集:gv.elを見ると、アドバイスgv-get
がその仕事をするように思えますが、おそらくそれのためのより良い手順がありますか?
EDIT2:ステファンからの提案を試してみました、近いですが、良くありません:(
これは次のように拡張されます。
明らかに、私が望んでいたものではありません。私は上記のようにアドバイスとでそれをやろうとしていましたがgv-define-expander
、引用が多すぎてlet
、冗長な置換で式の一部を失う方法を見つけることができません。
EDIT3:
OK、変数が設定される値のスコープまたは評価シーケンスで何かを真剣に台無しにしない限り、これは機能しているようです。
emacs - 失敗したスニペット補完を適切に処理する
私は yasnippet からスニペットを展開するために TAB を使用します。スニペットを展開しない場合、通常はインデント (TAB にバインドされたデフォルトのコマンド) に戻りyas-fallback-behavior
ます。call-other-command
return-nil
私が望む望ましい機能は、TABを押すことです:
- スニペットの完成を試み、成功または失敗します。
- PHP モードであるかどうかを確認し、
php-complete-function
サイレント モードで を呼び出し、成功、または失敗します。 - デフォルトは現在のインデント コマンド (
indent-for-tab-command
) です。
現在、1 つ、次に 3 つと完全に実行されます。yas--fallback
ただし、次のコードを使用してアドバイスすることで、ほとんどの場合機能させることができました。
残っている唯一の主な問題は、TAB を使用して何かをインデントしようとすると、暗黙のうちに失敗するのでphp-complete-function
はなく、代わりに、PHP 完了の複数のチェックからのメッセージでミニバッファーをスパムすることです。
したがって、この場合、その機能からのメッセージングを禁止する方法はありますか?同じチェックをすべて実行せずに、基本的に私のアドバイスで機能を再プログラミングしますか? あるいは、yasnippet でこれを行うより良い方法はありますか?
emacs - defadvice は元の関数で変数を使用できますか?
Emacs Lispから修正した例を取り上げましょう: ad-get-arg と ad-get-args の使用方法?
(my-add 1 2 3)
出力でうまく動作します:
元の関数から値を(my-add 1 2)
取得できません:c
私の質問は、本体で提供されていないオプションの引数 (または、より一般的には、元の関数の変数) をどのように使用できますdefadvice
か?