我在 Windows 下使用 GVIM。并想将 CAPSLOCK 映射到 Ctrl+^
有什么办法可以做到这一点?
顺便说一句,我在网上看到了大量如何使用注册表黑客交换 CAPS 和 Esc 的示例,但没有一个使用 VIM map 命令,而是使用外部工具和注册表更改。
Linux?对于 X,使用 xmodmap 更改键映射,例如
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
将 Esc 映射到 CapsLock 键。谷歌获取更多示例。
如果你只是为了避免在 Vim 之外工作,你可以将这些行放在你的 .vimrc 中:
au VimEnter * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'
当您进入 Vim 时,第一行将 escape 映射到 caps lock 键,当您退出时,第二行将正常功能返回到 caps lock。
这需要安装了 xorg-xmodmap 软件包的 Linux。
对于 Mac OS,您可以在“系统偏好设置”中重新映射系统范围内的“大写锁定”键。
遵循这条路径:
系统偏好 > 键盘 > 修饰键
然后单击“大写锁定”旁边的下拉框并选择“^ Control”。
窗户下?使用自动热键。这不是 vim 映射,但正如其他人所说,您无法映射它。我使用 AHK 将我的 CAPSLOCK 映射到 CTRL。
在 Linux 系统中,这可以通过 xmodmap 完成。
将其保存在主文件夹中的文本文件中
! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock
使用类似 .capstoescswitc 的名称保存此文件
然后通过终端执行这个文件。
xmodmap ~/.capstoescswitc
如果要崇敬它只需切换脚本文件中的关键变量。
有关更多信息,请参阅此页面
Capslock(以及 Control 和 Shift 等)是一个修饰键,这意味着它与另一个普通键一起使用来修改该键的含义。AFAIK操作系统不会将修改键传递给应用程序,除非还按下了普通键,例如CTRL
应用程序不会看到按下,但CTRL-C
会看到。
Caps Lock
在 vim 之外不会中断的解决方案;caps_to_esc.ahk
#IfWinActive, ahk_class Vim ; vim window class
Capslock::Esc
#IfWinActive
运行此命令:
wget -O - https://raw.githubusercontent.com/grabantot/scripts/master/install/install_caps_to_esc.sh | bash
或者手动执行这些操作:
sudo apt-get install xdotool xbindkeys
. 我们还将使用xprop
and xset
(应该默认安装)。~/caps_to_esc.sh
脚本:debug_file=/dev/shm/caps_to_esc.debug
debug_msg () {
echo $(date +%s%3N) "$@" >> $debug_file
}
caps_off () {
is_caps_on="false"
xset q | grep "Caps Lock:\s*on" && is_caps_on="true"
debug_msg "is_caps_on ""$is_caps_on"
[ "$is_caps_on" == "false" ] && return 3
debug_msg "Sending Caps Lock"
debug_msg "ignore_next"
xdotool key Caps_Lock
}
should_ignore="false"
tail -n 1 $debug_file | grep "ignore_next" && should_ignore="true"
if [ "$should_ignore" == "true" ]; then
debug_msg "ignored"
exit 1
fi
echo -n "" > $debug_file
# get wm_class by 'xprop | grep WM_CLASS'
declare -a wm_classes=( \
'WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"' \
'WM_CLASS(STRING) = "gvim", "Gvim"' \
'WM_CLASS(STRING) = "code", "Code"' \
'WM_CLASS(STRING) = "google-chrome", "Google-chrome"' \
)
active_window_id=$(xdotool getactivewindow)
active_window_wm_class=$(xprop -id $active_window_id WM_CLASS)
debug_msg "active_wm_class ""$active_window_wm_class"
detected_wm_class=""
for wm_class in "${wm_classes[@]}"; do
# debug_msg "$wm_class"
if [ "$active_window_wm_class" == "$wm_class" ]; then
detected_wm_class="$wm_class"
debug_msg "detected_wm_class ""$detected_wm_class"
fi
done
[ "$detected_wm_class" == "" ] && exit 2
xdotool keyup "Caps_Lock" # !!! very important
caps_off
debug_msg "Sending Escape"
xdotool key "Escape"
debug_msg "sent"
~/.xbindkeysrc
:"bash $HOME/caps_to_esc.sh"
Caps_Lock
killall xbindkeys && xbindkeys
xbindkeys
将检测 Caps_Lock 按下并调用caps_to_esc.sh
脚本xprop
xdotool
xset
,如果打开则通过发送 Caps_Lock 键xdotool
xbindkeys
会检测到我们发送的 Caps_Lock 但我们忽略它我不认为你可以。我相信 CAPS-LOCK 可能在 vim 看到它之前由操作系统翻译。因此,您需要在操作系统级别进行黑客攻击,就像您已经看到的注册表黑客一样。
编辑: autohotkey 看起来可以用来弥补 vim-OS gap。通过这种方式,第三方应用程序正在操作系统级别进行黑客攻击,而您只是在挂钩该应用程序。
由于有适用于 Linux 和 Windows(Autohotkey)的解决方案,我想建议使用pckeyboardhack for Mac 在任何地方重新映射 CapsLock。
@rsoren 的回答有效。但是这样做的问题是,如果打开多个缓冲区,从一个缓冲区退出,也会恢复所有其他缓冲区的映射。用 BufEnter 和 BufLeave 替换 VimEnter 和 VimLeave,对我有用。
au BufEnter * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au BufLeave * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'
CAPSLOCK
到WindowsESC
并CTRL
在 Windows 上如果你想重新映射CAPSLOCK
到两者
ESC
(单独按下时)CTRL
(用其他键按下时)您可以使用ililim的这个小开源软件。您不需要管理员权限,ESC
并且CTRL
仍在按预期工作。
我用它来享受方便的CTRL + anything
按压而不伤到我的小指,并在 Vim 中切换我通过 MobaXterm 中的 ssh 使用的模式。只需按照此说明进行安装。
CAPSLOCK
到LinuxESC
并CTRL
在 Linux 上要在 Linux 上做同样的事情,您可以使用XCAPE。要在 Ubuntu 上安装它,请使用:
sudo apt install xcape
对于实际映射,请执行以下操作:
setxkbmap -option ctrl:nocaps
xcape -e 'Control_L=Escape'
第一个命令是映射CAPSLOCK
到,ESC
而第二个命令负责CTRL
用其他键按下。
要让它在 X 会话中永久工作,您可以将其添加到~/.xprofile
.
正如@Dan Andreatta 提到的那样,使用X(Linux),xmodmap
用于更改键映射,例如
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
将映射Esc到CapsLock键。
您还可以通过将其添加到 X 初始化文件中来设置它,例如.xinitrc
- 在使用时运行startx
-:
clear lock
keycode 0x42 = Escape
通常,它被放在一个.Xmodmap
文件中,然后在.xinitrc
.
Vim 的文档有一整页专门讨论这个主题,评论部分特别有帮助。
截至 2020 年,像我这样的普通 WINDOWS 用户的一个工作示例是使用AutoHotkey
目前使用这个 1 行脚本:
Capslock::Esc
运行它,你的问题就解决了。希望能帮助到你。:)
我想这样做的原因之一是创建一个软大写锁定,就像其他人提到的那样,可能是为了避免在正常模式下保持大写锁定。离开插入模式时,我使用vimcaps插件关闭大写锁定,似乎工作正常。
在 Mac 上,也可以使用 Karabiner ( https://pqrs.org/osx/karabiner/ )
$ brew cask install karabiner-elements
安装后,您可以在简单修改选项卡中将capslock键映射到esc键。需要注意的是,这是系统范围的,这意味着您到处都丢失了 capslock 密钥。需要大写锁定的 IMO。
我通过这个问题的答案自己做,但我正在寻找一些稍微不同的东西:
CAPS -> Esc
ANDCAPS + <something> -> Ctrl + <something>
那么我目前的解决方案是:
# ~/.xprofile
xmodmap $HOME/.xmodmap
和:
! ~/.xmodmap
clear lock
keycode 66 = Escape
keycode 9 = Caps_Lock
add lock = Caps_Lock
clear control
add control = Control_L Control_R Escape
看起来它暂时就像一个魅力,但我正在寻找反馈:)