为啥在 Vim 中将 Esc 重新映射到 CAPS LOCK 如此复杂?

Posted

技术标签:

【中文标题】为啥在 Vim 中将 Esc 重新映射到 CAPS LOCK 如此复杂?【英文标题】:Why is so complicated to remap Esc to CAPS LOCK in Vim?为什么在 Vim 中将 Esc 重新映射到 CAPS LOCK 如此复杂? 【发布时间】:2011-01-09 20:14:00 【问题描述】:

我看到了 vim wiki 提示,它说要将 Esc 重新映射到 CAPS LOCK,您必须编辑以下 Windows 代码:

REGEDIT4
[HKEY_CURRENT_USER\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00

是否可以仅通过在 _vimrc 中添加或修改行来将 Esc 重新映射到 CAPS LOCK?

【问题讨论】:

paxdiablo,这非常常见。为什么?因为 CAPS LOCK 是有史以来最没用的钥匙,但拥有黄金地段。它是一个更方便的位置,例如,另一个 ctrl 键,或者,如果您曾经使用过 Vim,则可以使用急需的 ESC 键。 “也许你应该考虑一个非模态编辑器”你显然不使用 Vim。 如果重新映射到大写字母,就不必扔掉键盘了。 @Pierre:我是 ESC 映射器的 CAPS-LOCK 之一。我可以确认在没有重新映射的情况下在机器上工作对我来说很烦人。然而,提高生产力仍然值得,因为 99% 的时间我都在我自己的机器上工作(或我自己的机器上的 SSH),它有重新映射。 我使用Uncap。我写它是为了方便地将 Caps Lock 映射到 Escape。它只需要从project page 下载uncap.exe 并双击它。无需安装、配置或重新启动。因此,在我自己以外的机器上也很容易使用它。使用uncap -k 命令杀死该程序可以轻松关闭映射。此外,该项目还附带了detailed documentation 在 Windows、Linux 和 Mac OS/X 上映射键的其他方式。 【参考方案1】:

我建议您为此使用 AutoHotkey。

您可以更改每个应用程序的热键:

SetTitleMatchMode,2
#IfWinActive,VIM
   CAPSLOCK::ESC
return

#IfWinActive
   CAPSLOCK::CTRL
return

这个脚本,例如设置 caps 在 vi​​m 中转义,并控制其他任何地方。

【讨论】:

@jay 但是大写锁定在哪里结束了? @sayth 大多数人从不需要它——我已经好几年没有它了。 我不得不为 gVim 使用 #IfWinActive ahk_class Vim【参考方案2】:

capslock 键没有 vim 键标识符,因此您必须使用扫描码来完成。

这就像试图将 ctrl 键或 shift 键映射到某个东西 - 这些键本身不会做任何事情,它们是键修饰符,因此它们不能以相同的方式被捕获。

【讨论】:

【参考方案3】:

映射必须在操作系统级别而不是 vim 中完成,因此复杂性来自操作系统。例如,在我的 Ubuntu 机器上,~/.Xmodmap 中有以下内容:

! Esc on caps lock
remove Lock = Caps_Lock
keysym Caps_Lock = Escape

但是,我认为 REGEDIT 脚本并没有那么糟糕。有点丑,但只有两行!

【讨论】:

更简单:setxkbmap -option caps:escape 或将其添加到 X/input 配置的相关部分。 @ephemient 感谢您的提示。 也可以通过 GUI 执行此操作。转到系统/首选项/键盘,打开布局选项卡,打开选项对话框。在 Caps Lock 标题下,有一系列不同的行为可供选择,其中之一是交换 Caps Lock 和 ESC。【参考方案4】:

您也可以试试这个:SharpKeys。 我用它交换了 CapLock 和 Esc。

【讨论】:

【参考方案5】:

您也可以使用 Ctrl-C 转义(至少在 vim 中可用)。这是我通常使用的。不过,我通常会交换控件和大写锁定,并且通过 Windows 中的注册表设置和 ubuntu 中的键盘配置来完成。

编辑:正如@mMontu 善意指出的那样,Ctrl-C 比 Esc 更残酷:正如this appropriate question 中所述,

vim 不会检查你是否只写了一个 缩写,它不会运行你的花哨的自动命令 每次离开插入模式时都会设置插件

我没有注意到,因为我的vimming还没有那么先进。

【讨论】:

你应该知道 Ctrl-C 和 ESC 之间的细微差别:***.com/questions/5030164/…【参考方案6】:

另一个对我很有效的替代方法是使用在 this website

本质上:安装 Microsoft 的 Keyboard Layout Creator,然后编辑其源代码以允许重新映射 CAPS LOCK 并创建您自己的自定义布局。

【讨论】:

【参考方案7】:

在 Windows 上将 CAPSLOCK 重新映射为 ESCCTRL

我已经描述过的一个非常好的工具 in this answer 使您可以将 CAPSLOCK 重新映射到两者

    ESC(单独按下时)和 到CTRL(用其他键按下时)

只需使用 ililim 的this little piece of open source software。

您不需要管理员权限,ESCCTRL 仍按预期工作。

我用它来享受方便的CTRL + anything 按压而不伤到我的小指,并在我通过 MobaXterm 中的 ssh 使用的 Vim 中切换模式。安装只需关注this description。

【讨论】:

以上是关于为啥在 Vim 中将 Esc 重新映射到 CAPS LOCK 如此复杂?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VIM 中映射 CAPS LOCK 键?

如何在鱼壳中将转义插入模式重新映射为'jk'?

mac下vim键盘映射不起作用

OSX:以编程方式重新映射 Caps Lock 的功能(通过系统偏好设置)?

win10用autohotkey怎样将caps改为caps+esc就是按caps+esc锁定大写?

VIM键盘映射 (Map)~转载