如何在VIM中映射CAPS LOCK键?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在VIM中映射CAPS LOCK键?相关的知识,希望对你有一定的参考价值。
我在Windows下使用VIM。并希望将CAPS LOCK映射到Ctrl ^
有什么办法吗?
顺便说一下,我在网上看到大量样本如何使用注册表黑客交换CAPS和Esc,但是没有一个使用VIM map命令,而是使用外部工具和注册表更改。
Linux呢?使用X,使用xmodmap来改变键映射,例如
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
将Esc映射到Caps Lock键。谷歌更多的例子。
我想这样做的原因之一是创建一个软锁,就像其他人提到的那样,可能是为了避免在正常模式下保持大写锁定。我在离开插入模式时使用了xbindkeys
插件来关闭大写锁定,似乎工作正常。
在Mac上,也可以使用Karabiner(bridge the vim-OS gap)
$ brew cask安装karabiner-elements
安装后,您可以在简单修改选项卡中将capslock键映射到esc键。警告这是系统范围的,这意味着你到处都丢失了大写密钥。需要封锁的IMO。
如果您的目的只是为了避免在Vim之外工作,可以将这些行放在.vimrc中:
au VimEnter * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'
当您输入Vim时,第一行映射转义为大写锁定键,第二行在退出时将正常功能返回到大写锁定。
这需要安装xorg-xmodmap包的Linux。
在窗户下?使用AutoHotkey。它不是vim映射,但正如其他人所说,你无法映射它。我使用AHK将我的CAPSLOCK映射到CTRL。
对于Mac OS,您可以在“系统首选项”中重新映射系统范围内的“大写锁定”键。
遵循这条道路:
系统首选项>键盘>修饰键
然后单击“大写锁定”旁边的下拉框并选择“^控制”。
Capslock(和Control,以及Shift等)是一个修饰键,这意味着它与另一个普通键一起使用来修改该键的含义。 AFAIK操作系统不会将修改键传递给应用程序,除非还按下了普通键,例如应用程序不会看到按CTRL
,但CTRL-C
将会。
在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
如果想要反转它,只需在脚本文件中切换关键变量即可。
有关更多信息,请参阅此page
Solution that doesn't break Caps Lock
outside of vim
视窗
- 安装autohotkey。
- 运行autohotkey脚本:
;caps_to_esc.ahk
#IfWinActive, ahk_class Vim ; vim window class
Capslock::Esc
#IfWinActive
Linux的
运行此命令:
wget -O - https://raw.githubusercontent.com/grabantot/scripts/master/install/install_caps_to_esc.sh | bash
或手动执行以下操作:
sudo apt-get install xdotool xbindkeys
。我们还将使用xprop
和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"
- 添加新的绑定到qazxsw poi:
~/.xbindkeysrc
"bash $HOME/caps_to_esc.sh" Caps_Lock
How it works:
- qazxsw poi将检测何时按下Caps Lock并调用qazxsw poi脚本
- 在脚本中通过
killall xbindkeys && xbindkeys
检测活动窗口wm_class - 检查wm_class是否对我们感兴趣(gnome-terminal,vscode,gvim,chrome),如果不是,请退出
- 通过
xbindkeys
发送Escape键 - 检查Caps Lock是否通过
caps_to_esc.sh
打开,如果是,则通过xprop
发送Caps_Lock密钥 xdotool
将检测我们发送的Caps_Lock但我们忽略它
我不认为你可以。我相信CAPS-LOCK可能是在vim看到它之前由操作系统翻译的。因此,你需要在操作系统级别进行攻击,就像你已经看过的注册表黑客一样。
编辑:autohotkey看起来它可以用于xset
。这样,第三方应用程序正在操作系统级别的黑客攻击,而您只是挂钩该应用程序。
由于Linux和Windows(Autohotkey)有一个解决方案,我想建议使用xdotool
for Mac重新映射CapsLock。
以上是关于如何在VIM中映射CAPS LOCK键?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Vim 中将 Esc 重新映射到 CAPS LOCK 如此复杂?
OSX:以编程方式重新映射 Caps Lock 的功能(通过系统偏好设置)?
我如何知道在 Dev-C++ 中 Caps Lock 是不是打开?