【问题标题】:Vim: remapping Shift-Cmd-Opt-Ctrl to EscapeVim:将 Shift-Cmd-Opt-Ctrl 重新映射为 Escape
【发布时间】:2012-11-28 19:24:02
【问题描述】:

似乎 Steve Losh 的 this article 一直在循环,简而言之,它导致我将 Caps Lock 重新映射到 F19,并在系统级别将 F19 重新映射到 Shift-Command-Ctrl-Alt,从而为我自己的键盘快捷键提供了一个完整的命名空间。

问题是我喜欢在 Vim 中使用 Caps Lock 作为我的转义键。 我试过:map <M-C-D-S> <esc>,但在采购时,点击大写锁定没有任何作用。我猜这是因为 Vim 期望使用修饰符按下实际的键。

我的问题是:是否可以让 Vim 将 Shift-Cmd-Ctrl-Alt 读取为 Escape?

【问题讨论】:

  • 不,Vim 不期待这样的事情。它不能与内部非常有限的字节队列格式无法表示的任何键组合一起使用。因此,您要么需要一些顶级应用程序,将<M-C-D-S> 转换为 vim 的一些转义序列(最好自行转义),要么放弃整个想法。

标签: vim


【解决方案1】:

不,您不能映射四个修饰符。连三个都没有,连两个都没有。而且,嗯……甚至没有。

“修饰符”被称为“修饰符”是有原因的:它们与普通键一起使用来“修改”它们的含义。 Shift、Alt、Cmd 和 Ctrl 键本身不执行任何操作,而 Vim 正确地不执行任何操作,只是在您按下它们时等待进一步的按键操作。

另外,Vim 的输入机制有点“老派”,很可能是为了在它可能运行的多个平台上保持一致。它不会使用普通键注册多个修饰符。这意味着,如果终端不吃掉它们(它确实吃掉了它们),你只能做<C-…><S-…>。 Alt 键并不是一个真正可行的解决方案,因为有多少终端仿真器在处理它,而 Cmd 键是 Mac 专用的,无论如何只能在 MacVim 中使用。

此时,如果您准备将四个键组合在一起以模拟仅 一个 键的功能(这本身就很愚蠢),您不妨简单地使用 <C-c> 哪个,AFAIK,无处不在。你的左手会感谢你的。

【讨论】:

  • 这不是关于一致性,而是关于设计缺陷:当 vim 被创建时,Bram 并没有想到任何人会需要终端无法发送的组合。因此,内部格式为<80>..,其中.. 是termcap 数据库中用于<Del><F1> 等特殊键的键,以及<C-smth> 组合的原始控制字符。 Termcap 数据库与 win32 或 gtk gui 完全无关,但您仍然会看到 echo "\<F1>" 的相同字符串。没有人能阻止它成为 <80>F1<80> 或任何你喜欢的东西,尽管一开始它也有性能和可支持性的好处。
  • 我读过的关于这个主题的几个邮件列表线程实际上有点超出我的头脑,因为对这个主题缺乏直接的兴趣所以,是的,我承认有点模糊那些低级的细节。不过,我的理解是,由于设计选择,Vim 的输入系统无法真正处理这种情况。这些线程相当陈旧,所以我不会打赌在不久的将来这方面的任何进展。感谢您提供更多背景信息。
  • 谢谢你们两位提供这里的信息。 Vim 总是以其无穷无尽的兔子洞让我惊叹。
【解决方案2】:

我最初的问题是XY Problem

你想做 X,并且你认为 Y 是最好的方法。与其问 X,不如问 Y。

我想让 Vim 将 Caps Lock 读为 Esc(同时仍然保持其他疯狂的系统级修改),所以我询问了 Vim 没有的功能有。

事实证明,虽然上面提供的答案很好、准确且内容丰富,但我只是不喜欢被告知“不”。而且我在错误的问题空间中寻找答案。

OP 的链接中讨论的其中一个应用程序 KeyRemap4MacBook 具有高度可扩展性。文档还有很多不足之处,但我能够根据我最初的问题拼凑出一个解决方案。这与“vim 中的地图内容”的原始主题大相径庭,为此我深表歉意,但我希望将其留给需要它的可怜灵魂。

简单地说,上一篇文章建议将这个添加到KR4MB的'private.xml'文件中:

<item>
    <name>Remap Caps Lock to Hyper</name>
    <appendix>OS X doesn't have a Hyper. This maps Left Control to Control + Shift + Option + Command.</appendix>

    <identifier>caps_lock_to_hyper</identifier>

    <autogen>
        --KeyToKey--
        KeyCode::F19,

        KeyCode::COMMAND_L,
        ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L
    </autogen>
</item>

(modified slightly for Caps Lock)

这可以改为:

<item>
  <name>Caps Lock to Hyper OR Escape</name>
  <appendix>Caps Lock should be remapped to F19 (80) in PCKBH</appendix>
  <appendix>This remaps F19 to "Hyper" aka Cmd-Shift-Ctrl-Alt...</appendix>
  <appendix>...but, when pressed alone, F19 sends only escape</appendix>
  <identifier>remap.hyper2hyper_escape</identifier>
  <autogen>
      --KeyOverlaidModifier-- 
      KeyCode::F19, 

      KeyCode::COMMAND_L,
      ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L, 

      KeyCode::ESCAPE
  </autogen>
</item>

这告诉系统,当单独按下 Caps Lock 时,它实际上是 Esc,但如果它与任何其他键一起按下,它是 F19.

【讨论】:

  • 太棒了!我在某处读过有关此的博客文章,但现在找不到。你在其他地方写过这个吗?
  • @jrhorn424 不,还没有。对不起! :)
  • @jrhorn424 这可能是您想到的博文:brettterpstra.com/2012/12/08/a-useful-caps-lock-key 现在我只需要找到一种在 Windows 中完成此操作的方法。
  • @BrandonPugh 谢谢!在 Windows 上进行按键切换的常用方法是 AutoHotkey。不确定它是否适用于如此复杂的东西,但值得一看。
  • 这个答案帮助我意识到我也在找错地方。我在 Mac 上使用 Karibiner Elements 映射我的“Hyper”键。在他们的“从 Internet 导入更多规则”页面上有一个用户创建的脚本可以完美地解决这个问题。 pqrs.org/osx/karabiner/complex_modifications/#caps_lock
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2014-09-06
  • 2011-05-21
相关资源
最近更新 更多