バッファを編集しないキーストロークを検出するにはどうすればよいですか?


8

バッファを編集しないキーストローク(フックなど)を検出する最良の方法は何ですか?つまり、ポイントモーションの矢印キー、への呼び出しbeginning-of-bufferなどです。

その理由はycmd、emacsのバインディングに取り組んでおり、ユーザーが編集を停止してバッファー内を移動していることを(少なくともヒューリスティックに)検出できるようにしたいためです。これは、解析のためにバッファの内容を出荷する良い機会です。vimクライアントは、ユーザーが挿入モードを終了したときにこれを実行し、私はその動作をエミュレートしようとしています。


8
この種のもののアイドルタイマーに興味があるかもしれません:gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html
giordano

2
別のアイデア(またはアイドルタイマーに関するアイデアの改良):アイドルタイマーself-insert-commandを使用する代わりに、タイマーをキャンセルして再スケジュールすることをお勧めします。この方法では、ユーザー何かを行っても、「何か」がテキスト挿入でない限り、タイマーはリセットされません。
mbork 2014年

2
mbork:after-change-functionsは、テキストの変更に反応するための一般的なメカニズムです。
フィル、2014年

1
を使用しpost-command-hookます。それはすべてでトリガーされるため、必要なアクションを実行する前に、トリガーされたものに対してフィルタリングを行う必要がある場合があります。
Malabarba 2014年

1
これがこの特定の問題に関連しているかどうかはわかりませんが、buffer-chars-modified-tick関数が役立つ場合があります。
Jon O.

回答:


2

次のフックを追加します。

  • するにはpre-command-hook、一部の監視変数をに設定tします。これは、コマンドが変更されなかったことを示します。
  • するにはafter-change-functions、このセンチネル値をに設定しnilます。(これはフックであり、ただのようには聞こえません。これを指摘してくれた@philsに感謝します。)
  • するにはpost-command-hook、このセンチネル値を確認して関数を実行します。

これは、実行の順序によって機能する場合と機能しない場合があります。表示されない場合は、下のコメントでお知らせください。


仕事を終えたら、例を掲載します。


私は今仕事に行かなければなりません…
Sean Allred 2014年

2
自己挿入を勧めないでください。変更後関数を使用する
Malabarba '

機会があればこれを試してみます。
アビンガム、2014年

4
@abingham原則として、アドバイスよりもフックの方が適しています。フックは関数をアタッチするために特別に設計されていますが、アドバイスは予期しない場所に何かをアタッチする方法です。この特定のケースでは、バイトコンパイルとの信頼性が低いため、いくつかの非常に基本的な関数に助言することはお勧めできません。
マラバルバ2014年

2
私はショーンが言及することを意図していたと思いますpost-self-insert-hook(答えのそのビットはアドバイスとフックを混同しているようですself-insert-command)。いずれにせよ、after-change-functions実際に望むことを実際に行うので、一般的には好むと思います(自己挿入が、バッファーを変更する唯一の種類のキーストロークではないため)。
フィル、2014年

0

ちょっとした考え -

これは、実際には「キーストローク」ではなく、コマンドに関するものです。どのように実行されても、違いますか?私が正しく理解していれば、あなたは本当に、呼び出された特定のコマンドがバッファを変更するかどうかを知る方法を探しています。

もしそうなら、おそらく次のようなことをします:

  • pre-command-hookその上に関数を置き、(1)の現在の値を記録し、(buffer-modified-p)次に(2)を使用set-modified-pして、バッファーを変更しないようにします。

  • post-command-hookその上に関数を置きます(1)コマンドが(記録された値をの新しい現在の値と比較することによって)バッファーを変更したかどうかをチェックし(buffer-modified-p)、それに応じて機能します。(2)新しい値がnil変更前の値にリセットされた場合を使用してset-modified-p

強引な種類(呼び出された各コマンドをチェックする)ですが、試してみる価値があるかもしれません。

それに応じて動作する」部分がすべてのバッファー変更コマンドの何もしない場合、および多くの非変更コマンドの何もない場合(たとえば、以前の非変更コマンドでそれを実行したため)、そうすれば、少なくとも必要以上それに応じた行動」をすることはありません。しかし、チェックの部分だけでは、コストがかかりすぎたり、やり過ぎになる可能性があります(物事を遅くしすぎる)-見てみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.