5

fコンテキスト: 2 回すばやく押すと(、その時点で を押すとどうなるかというマイナー モードを作成したいと考えています。これは単に(. たとえば、paredit モードまたは autopair モードが有効になっているバッファーでは、(通常、 を押すと が挿入され()ます。paredit モードのバッファーでは、選択したテキストがラップされることがあります。たとえば、選択a bして を押す(と、選択が に置き換えられ(a b)ます。

2 回押されたことを検出するには、 http://www.emacswiki.org/emacs/electric-dot-and-dash.elfの短いコードのロジックを使用するだけです。

(したがって、唯一欠けている部分は、Emacs に「今すぐトリガーを押してください!」と伝える Lisp コード スニペットです。

私の頭に浮かんだ最初のことは、スニペットがすべきことでした

  1. キーにバインドされたコマンドを見つける(
  2. 次に、そのコマンドで call-interactively を呼び出します。

ただし、自動ペアリング パッケージ (autopair または paredit または他の同様のパッケージ)(が、コマンドの呼び出しに使用されたキーを検索するロジックを持つコマンドにバインドされている場合、またはパッケージが単に post-self-insert に依存している場合、これは機能しません。 binding の代わりに -hook または post-command-hook (


アップデート

Key Chordのドキュメントを調べたところ、この質問への回答で私がやろうとしていることには、より簡単な解決策があることがわかりました:

(require 'key-chord)
(key-chord-mode 1)

(defvar my-easy-open-paren-mode-map
  (let ((map (make-sparse-keymap)))
    (key-chord-define map ",." (kbd "("))
    map))
(define-minor-mode my-easy-open-paren-mode
  "In this mode, pressing . and , together is another way of pressing the open paren.")

(defvar my-easy-semicolon-mode-map
  (let ((map (make-sparse-keymap)))
    (key-chord-define map ";;" (kbd "C-e ;"))
    map))
(define-minor-mode my-easy-semicolon-mode
  "In this mode, pressing semicolon twice fast is another way of pressing C-e and semicolon.")

(add-hook 'prog-mode-hook 'my-easy-open-paren-mode)

(add-hook 'c-mode-common-hook 'my-easy-semicolon-mode)

ただし、キーの押下をトリガーすることは、他のコンテキストでは依然として役立つ場合があります。

4

2 に答える 2

6

キーの 2 回押しに機能をバインドするためのKey Chordライブラリを高く評価するかもしれません。(英語で書く場合は使用をお勧めしませんfが、YMMV を使用してください。)

post-self-insert-hookバインディングが の場合でも実行されself-insert-commandます。post-command-hookいずれにせよ実行されますが、間違った関数や入力イベントが表示されることが心配な場合は、それらを操作できます...

バインディングを調べた後、関数はthis-command、実行しようとしている関数とcall-interactively必要last-command-eventなキーに設定できます。例えば:

(defun my-fake-paren ()
  (interactive)
  (let ((command (key-binding "(")))
    (setq last-command-event ?\()
    (setq this-command command)
    (call-interactively command)))
于 2013-09-19T22:12:21.957 に答える
1

あなたがリンクしているページは同じことをしているように見えますが、私はこの種のものにKey Chordを使用しています. トリックは、呼び出しをcall-interactively正しく機能させることです。last-command-event変数をリセットする let でラップしましたcall-interactively。これは、「(」であると見なされます。これは、paredit および基本モードで機能します。

(require 'key-chord)
(key-chord-mode 1)

(defun my-paren-call ()
  (interactive)
  (let ((last-command-event ?\())
    (call-interactively (key-binding "("))))

(key-chord-define-global "ff" 'my-paren-call)
于 2013-09-19T22:44:05.817 に答える