我在Windows下使用GVIM.并希望将CAPSLOCK映射到Ctrl + ^
有什么办法吗?
顺便说一下,我在网上看到大量样本如何使用注册表黑客交换CAPS和Esc,但是没有一个使用VIM map命令,而是使用外部工具和注册表更改.
Dan*_*tta 56
Linux呢?使用X,使用xmodmap来改变键映射,例如
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
Run Code Online (Sandbox Code Playgroud)
将Esc映射到CapsLock键.谷歌更多的例子.
rso*_*ren 26
如果您的目的只是为了避免在Vim之外工作,可以将这些行放在.vimrc中:
au VimEnter * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'
Run Code Online (Sandbox Code Playgroud)
当您输入Vim时,第一行映射转义为大写锁定键,第二行在退出时将正常功能返回到大写锁定.
这需要安装xorg-xmodmap包的Linux.
Cou*_*son 12
对于Mac OS,您可以在"系统首选项"中重新映射系统范围内的"大写锁定"键.
遵循这条道路:
系统首选项>键盘>修饰键
然后单击"大写锁定"旁边的下拉框并选择"^控制".
liw*_*iwp 11
Capslock(和Control,以及Shift等)是一个修饰键,这意味着它与另一个普通键一起使用来修改该键的含义.AFAIK操作系统不会将修改键传递给应用程序,除非还按下了普通键,例如按下CTRL将不会被应用程序看到,但CTRL-C会是.
Nir*_*han 10
在Linux系统中,这可以使用xmodmap完成.
将其保存在主文件夹中的文本文件中
! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock
Run Code Online (Sandbox Code Playgroud)
使用类似.capstoescswitc的名称保存此文件
然后通过终端执行此文件.
xmodmap ~/.capstoescswitc
Run Code Online (Sandbox Code Playgroud)
如果想要尊重它,只需在脚本文件中切换关键变量即可.
有关详细信息,请参阅此页面
Caps Lock永不超出vim范围的解决方案;caps_to_esc.ahk
#IfWinActive, ahk_class Vim ; vim window class
Capslock::Esc
#IfWinActive
Run Code Online (Sandbox Code Playgroud)
运行以下命令:
wget -O - https://raw.githubusercontent.com/grabantot/scripts/master/install/install_caps_to_esc.sh | bash
Run Code Online (Sandbox Code Playgroud)
或手动执行以下操作:
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"
Run Code Online (Sandbox Code Playgroud)
~/.xbindkeysrc:"bash $HOME/caps_to_esc.sh"
Caps_Lock
Run Code Online (Sandbox Code Playgroud)
killall xbindkeys && xbindkeysxbindkeys按下Caps_Lock并调用caps_to_esc.sh脚本时将检测xpropxdotoolxset,然后通过来发送Caps_Lock密钥xdotoolxbindkeys 将检测到我们发送的Caps_Lock,但我们将其忽略我认为你不能。我相信 CAPS-LOCK 可能在 vim 看到它之前就被操作系统翻译了。因此,您需要在操作系统级别进行黑客攻击,就像您已经看到的注册表黑客攻击一样。
编辑:autohotkey 看起来可以用来弥合 vim-OS 差距。这样,第三方应用程序就可以在操作系统级别进行黑客攻击,而您只需挂钩该应用程序即可。