2

我真的很爱key-chord.el。它已成为我工作流程中不可或缺的一部分,但有时我希望我可以将它们放在 minibuffer 中(用于诸如 evil-search 之类的事情)。具体来说,我想jj退出evil-search并向下移动一条线。这可能吗?

我知道我可以将一个既作为前缀又作为命令的命令组合在一起(参见这个 SO question),所以我可以绑定j到一个自插入命令和jj我的特殊命令。在指定的空闲时间后如何中断事件循环?我确实jj在一个蓝色的月亮上打字一次,我仍然喜欢暂停的灵活性。

还有其他我不知道的方法来实现我想要的吗?

编辑:

最初,这个问题一般是关于 minibuffer 的。key-chord.el似乎与minibuffer-local-map. 但是,它不适用于isearch-mode-map. 将命令绑定到单个常规键,就像j在 isearch 中一样。这就是我要解决的问题。

4

2 回答 2

3

我找到了一个手动重现 key-chord.el 行为的解决方案。

(defun isearch-exit-chord-worker (&optional arg)
  (interactive "p")
  (execute-kbd-macro (kbd "<backspace> <return>")))

(defun isearch-exit-chord (arg)
  (interactive "p")
  (isearch-printing-char)
  (unless (fboundp 'smartrep-read-event-loop)
    (require 'smartrep))
  (run-at-time 0.3 nil 'keyboard-quit)
  (condition-case e
    (smartrep-read-event-loop
      '(("j" . isearch-exit-chord-worker)
         ("k" . isearch-exit-chord-worker)))
    (quit nil)))

;; example bindings
(define-key isearch-mode-map "j" 'isearch-exit-chord)
(define-key isearch-mode-map "k" 'isearch-exit-chord)

这种方法实际上比key-chord.el.

  • 它不使用输入法,因此您可以结合使用不同的输入法。
  • 第一个字符立即显示,如果不正确则收回,而key-chord.el仅在延迟后显示。
于 2014-01-05T23:20:27.210 回答
2

我发现这很有用:

(defun isearch-enable-key-chord ()
  (key-chord-mode 1)
  (key-chord-define isearch-mode-map "jj" 'isearch-cancel))
(add-hook 'isearch-mode-hook 'isearch-enable-key-chord)
于 2015-04-17T14:16:33.647 回答