使用key作为前缀和命令

时间:2013-12-12 03:55:58

标签: emacs elisp

我想知道如何使用密钥作为其他密钥的前缀和命令本身。

  1. 我可以使用key-chord.el对此进行排序,方法是将键和弦绑定到第一个键后面的命令,但它有几个问题

    • 只能与字母数字键一起使用
    • 不真实,因为我必须在超时之前快速按键
  2. easy-killexpand-region等一些软件包支持此功能,但它们具有复杂的代码库,而且我的lisp技能并不引人注目......

  3. 我将如何设法做到这一点?我真的希望<menu>绑定到evil-ex,但我还想绑定<menu>作为所有移动(如箭头键)的前缀,将标记设置为一个无弦的cua-selection-mode

    由于邪恶之前没有动作,也没有自我插入的动作,这将是一个完美的用例。 <menu>是完美的,因为它紧挨着箭头键和其他动作键(例如,结束,回家等)并且未经修改。

2 个答案:

答案 0 :(得分:5)

如果我理解你想要什么,我建议最好忘记计时器并等待一点延迟(即,将<menu>作为命令的意图与用作前缀键的意图区分开来)。

我推荐的方法,并且使用了很多,是定义前缀键(在您的情况下,例如,<menu>),然后将您正在考虑使用的命令用于{{1}在<menu>上。这就像点击<menu> <menu>一次并试图依靠一些微小的延迟等一样快。

它允许您认为在<menu>上的命令(实际上它在<menu>上)为 可重复

通常使这样的命令可重复,以便<menu> <menu>重复命令一次,<menu> <menu> <menu>重复两次,依此类推。 IOW,我倾向于将这个技巧用于我真正想要轻松重复的命令,只需按住一个键即可。

这是一个简单的例子,从我在2009年提出的更为一般性的建议<menu> <menu> <menu> <menu>HERE。在该邮件列表消息中,如果向下滚动到#9,您将看到使用此类密钥的提议,#12显示相同的示例,#15直接解决您的问题。主题标题是“有蛋糕会吃,吃蛋糕会有 - krazy key koncept kontroversy ”,其主题 正是你提出的问题


emacs-devel@gnu.org

正如我所说,我长期以来一直使用这种技术能够(a)具有“重复前缀键”和(b)还有其他键定义。

答案 1 :(得分:1)

似乎你想要smartrep这样的东西,它可以指定一个密钥作为几个命令的公共前缀。开箱即用的唯一一件事就是将命令绑定到公共前缀键,因此您需要稍微弄清楚smartrep内部的内容。你所追求的功能是

(smartrep-read-event-loop
  '((KEY1 command)
    (KEY2 command)
    ...))

这是一段可以帮助您入门的代码:

(defun my-command-with-prefix ()
  (interactive)

  (invoke-prefix-command)

  (initialize-event-loop)

  ;; The form
  ;;
  ;;   (condition-case ERR FORM (quit QUIT-HANDLER))
  ;;
  ;; is there to catch C-g key presses and make sure that
  ;; finalization code is run.
  (condition-case e
      (smartrep-read-event-loop
       '(("a" . command1)
         ("b" . command2)
         ("c" . command3)))

    (quit nil))

  ;; finalize loop
  (finalize-event-loop))

上面的代码段实际上是here找到的代码的简化版本。