【问题标题】:Additional modifier keys in emacs?emacs中的附加修饰键?
【发布时间】:2012-08-13 17:24:56
【问题描述】:

我最近一直在修改我的 Emacs 设置,但我遇到了一个开始让我烦恼的问题。我希望能够引入额外的修饰符,如键。为了让事情更清楚,我正在尝试做的是当我处于 dired-mode 时(它不接受文本输入,因此可以反弹普通字母)我希望这样当我按住字母 s并按jl 光标分别移动到下一个和上一个目录行。有效地使s 键充当修饰符。

我已经考虑让s 应用一个修饰符,例如superhyper,但这些都用于全局事物。这可能吗?如果没有,那就太可惜了。

编辑:

我所追求的似乎有些混乱。如果我定义一个普通的键序列,例如

(define-key map (kbd "s j") 'dired-next-dirline)

然后我必须在按j 移动到下一个目录行之前每次一直按s 键。这不是我正在寻找的东西(不要听起来很生气 :P)我希望 s 像一个修饰符一样我可以保持 s保持向下并继续点击j 以向下移动。

我希望我已经说得更清楚了。谢谢。

【问题讨论】:

  • 我的理解是在 Emacs 中添加一个真正的修饰键是一个操作系统级别的过程。这对您没有用,因为您只希望它在某些 Emacs 上下文中如此行事。所以 AFAIK,你所要求的目前无法完成。
  • 可能有一个命令临时更改键盘映射,这样您只需重复按键序列中的最后一个按键。 C-x e(执行宏)执行此操作 - 要重复宏,只需再次点击 ekmacro-call-macro 的源代码似乎是开始阅读的地方...
  • @legoscia 我喜欢临时更改键盘映射的想法,但我认为使用宏有点不必要。如果没有人想出更好的主意,您可能想将其发布为答案。谢谢

标签: emacs customization key-bindings


【解决方案1】:

我在代码中挖掘并想出了这个。它将s j 绑定到my-dired-next-dirline,但是在你完成之后,只需j 就足以再做一次。任何其他键都会重置临时绑定。

请注意,set-temporary-overlay-map 函数是在 Emacs 24.2 中添加的,在撰写本文时尚未发布,因此您需要构建 Emacs from git

(defun my-dired-next-dirline ()
  (interactive)
  (dired-next-dirline 1)
  (set-temporary-overlay-map
   (let ((map (make-sparse-keymap)))
     (define-key map [?j] 'my-dired-next-dirline)
     map)
   nil))

(eval-after-load "dired"
  '(progn
     (let ((prefix-map (make-sparse-keymap)))
       (define-key prefix-map "j" 'my-dired-next-dirline)  
       (define-key dired-mode-map "s" prefix-map))))

【讨论】:

    【解决方案2】:

    Key chords 可能就是您要找的。​​p>

    【讨论】:

    • 感谢您的回复,不幸的是,这不是我想要的,因为每次我想将它用作修饰符时,我都必须一直按 s
    • 当你想使用它们作为修饰符时,你是否每次都必须按 shift 或其他修饰符?
    • 对不起,我可能不是很清楚。我想一直按住它,而不必一直按该键即可将其用作修饰符。
    【解决方案3】:

    这个问题早于它,但 Hydra 包允许您执行此操作以及更多操作。

    https://github.com/abo-abo/hydra

    在此处查看示例:https://github.com/abo-abo/hydra/blob/master/hydra-examples.el 和此处https://github.com/abo-abo/hydra/blob/master/hydra-test.el

    Wiki 还有更多有用的例子https://github.com/abo-abo/hydra/wiki/Hydras-by-Topic

    Hydra 最初只有一种相当不透明的隐喻语法,因此很难入门。我不确定为什么要使用从颜色到神话故事和许多头被“征服”的怪物的这种奇怪的双层隐喻来描述本质上是:

    • 执行操作并保持按键模式(实际上是您所要求的。)(所谓的blue hydra)
    • 执行操作并退出按键模式 (a red hydra)

    等等。

    谢天谢地,在 2015 年 2 月添加了更文字的语法,检查测试以并排查看颜色和文字语法。 (也是这个提交https://github.com/abo-abo/hydra/commit/0a3cc60f5856eb4a38204b9075d67d058ba56bef

    另请参阅作者的这篇文章。 http://oremacs.com/2015/02/02/colorful-hydrae/

    【讨论】:

      【解决方案4】:

      如果键和弦不是您想要的(正如您在对Tom's answer 的评论中建议的那样),那么您似乎想要一个使用键序列的简单define-key。即

      (define-key dired-mode-map (kbd "s j") 'dired-previous-line)
      

      这有禁用 s 键的原始功能的缺点,但你可以将其重新绑定到序列 s-s,我想。

      【讨论】:

      • 感谢您的回答,但不幸的是,这与另一个答案相同。我已经编辑了我的问题以使其更清楚,希望您能帮助我。
      • 我明白了。我误解了您对汤姆回答的评论。我做了一点挖掘,看起来将普通键视为修饰键非常困难或不可能。事实上,在某些情况下,例如远程终端情况下,从技术上讲,无法查看某个键是否仍被按下。 legoscia 的评论可能是您最好的选择。
      • 这似乎很难。我正在考虑使用临时键盘映射解决方案,它也可以在其他领域派上用场。无论如何感谢您的帮助,非常感谢。
      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多