isearch中的关键和弦

时间:2014-01-04 20:16:06

标签: emacs evil-mode

我真的很喜欢key-chord.el。它已成为我工作流程中不可或缺的一部分,但有时我希望我可以将它们放在迷你缓冲区中(例如邪恶搜索之类的东西)。具体来说,我希望jj退出evil-search并向下移动一行。这可能吗?

我知道我可以将一个充当前缀和命令的命令组合在一起(参见this SO question),这样我就可以将j绑定到自插入命令,jj我的特殊命令。如何在指定的空闲时间后中断事件循环?我在蓝色的月亮中输入jj一次,我仍然喜欢超时的灵活性。

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

编辑:

原来,这个问题是关于迷你缓冲器的。 key-chord.el似乎可以正常使用minibuffer-local-map。但是,它不适用于isearch-mode-map。将命令绑定到单个常规键(如j)在isearch中可以正常工作。这就是我想要解决的问题。

2 个答案:

答案 0 :(得分: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只会在延迟后显示。

答案 1 :(得分: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)