文字列をキープレスに変換する


8

elispの文字列が与えられた場合、その文字列を再作成するために必要なすべてのキープレスを受け取るemacsをシミュレートしたいと思います。したがって、文字列 "Hello"を指定すると、emacsはShift + H、e、l、l、oを押した場合とまったく同じように動作します。これは常にテキストをバッファに挿入することと同じではないことに注意してください-isearch-modeのようないくつかのモードは直接keypressイベントをリッスンします。

これが必要な理由は、すべての入力がキーボードからのものであると想定したり、バッファ/ウィンドウ/フレームの変更がキーボード入力イベントに関連付けられると想定したりする多くのモードや拡張機能があるためです。彼らがそのイベントに関連するデータを検査する時間。既存のコード本体とシームレスに連携するように取り組んでいる音声認識モードの場合、elispを直接呼び出してアクションを実行するだけでなく、キーを押してアクションを実行するようにelispに指示する必要があります。

unread-command-eventsを見つけましたが、文字列を必要なキーシーケンスに変換する既存のコードは知りません。そのようなものはすでに存在していますか?

回答:


5

する

(execute-kbd-macro (kbd "Hello"))

たまたま働く?


2
この場合は機能しますが、たとえば「C-Beams」という文字列では機能しません。これを回避する1つの方法は、各文字の間にスペースを追加することです。(let ((string "C-Beams")) (execute-kbd-macro (kbd (mapconcat #'char-to-string string " "))))働くでしょう。おそらくもっと良い方法があります...
YoungFrog

うーん、文字列に実際にスペースが含まれている場合、mapconcatトリックは機能しません。たとえば、「Cビーム」は「Cビーム」になります。(execute-kbd-macro (kbd "SPC"))しかし、あなたはmapconcatよりも少し複雑なものを書いてその置換を行うことができます...これは、この特別な扱いを必要とする他の関連するキーがあるかもしれませんが、私を心配させます。
ジョセフガービン

改行とタブにもこの問題があるようです。SPC / RET / TABを代用することもできますが、このアプローチ全体が国際キーボードで問題になるのではないかと思います。
ジョセフガービン

(mapc (lambda (char) (execute-kbd-macro (char-to-string char))) string)うまくいくようです しかし、(もちろん?)タブ文字がある場合、それはTABを打っているふりをします。これは、実際のタブを挿入するコマンドにバインドされていない可能性があります...
YoungFrog

@YoungFrog:まだ壊れているようです\ n
Joseph Garvin

4

さて、私の最初の回答には、コメントで詳述されているように、いくつかの欠点があります。

execute-kbd-macroはの組み込み関数ですC source code

(execute-kbd-macro MACRO &optional COUNT LOOPFUNC)

エディターコマンド文字の文字列としてMACROを実行します。 MACROは、キーボードイベントのベクトルにすることもできます。MACROがシンボルの場合、その関数定義が使用されます。COUNTは繰り返し回数、1回の場合はnil、無限ループの場合は0です。

オプションの3番目の引数LOOPFUNCは、マクロの各反復の前に呼び出される関数にすることができます。LOOPFUNCがnilを返すと、反復が停止します。

(強調鉱山)

したがって、個々のキープレスとして文字列をEmacsに直接渡すソリューションは次のとおりです。

(defun insert-via-kbd (str)
  (execute-kbd-macro (vconcat str)))

これは非常にうまく機能しているようです(日本語も処理します!)。ただし、いくつかの奇妙な点があります。

  • \nトリガされますC-j(ないC-mRETまたは<return>
  • \tトリガーしますTAB(ではありません<tab>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.