我在Windows下使用GVIM。 并希望将CAPSLOCK映射到Ctrl + ^
有什么办法吗?
顺便说一下,我在网上看到大量样本如何使用注册表黑客交换CAPS和Esc,但没有一个使用VIM map命令,而是使用外部工具和注册表更改。
答案 0 :(得分:55)
Linux呢?使用X,使用xmodmap来改变键映射,例如
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
将Esc映射到CapsLock键。 Google提供了更多示例。
答案 1 :(得分:25)
如果您的目的只是为了避免在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。
答案 2 :(得分:16)
在Windows下?使用AutoHotkey。它不是vim映射,但正如其他人所说,你无法映射它。我使用AHK将我的CAPSLOCK映射到CTRL。
答案 3 :(得分:11)
对于Mac OS,您可以在“系统偏好设置”中重新映射系统范围内的“大写锁定”键。
遵循以下道路:
系统偏好>键盘>修饰键
然后点击“大写锁定”旁边的下拉框,选择“^控制”。
答案 4 :(得分:10)
Capslock(和Control,以及Shift等)是一个修饰键,这意味着它与另一个普通键一起使用来修改该键的含义。 AFAIK操作系统不会将修改键传递给应用程序,除非还按下了普通键,例如应用程序将看不到按CTRL
,但CTRL-C
将会显示。
答案 5 :(得分:9)
在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
答案 6 :(得分:5)
Caps Lock
的解决方案
;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
和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
启用,如果是,则通过xdotool
xbindkeys
会检测我们发送的Caps_Lock,但我们会忽略它答案 7 :(得分:4)
我认为你不能。 我相信CAPS-LOCK可能是在vim看到它之前由操作系统翻译的。 因此,您需要在操作系统级别进行操作,就像您已经看到的注册表黑客一样。
编辑:autohotkey看起来可以用于bridge the vim-OS gap。通过这种方式,第三方应用程序正在操作系统级别的黑客攻击,而您只是挂钩该应用程序。
答案 8 :(得分:3)
由于有适用于Linux和Windows(Autohotkey)的解决方案,我建议使用pckeyboardhack for Mac在任何地方重新映射CapsLock。
答案 9 :(得分:1)
@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'
答案 10 :(得分:1)
CAPSLOCK
重映射到ESC
和CTRL
如果您想将CAPSLOCK
重新映射到两者
ESC
(单独按下时)CTRL
(用其他键按下时)
您可以使用 ililim 的this little piece of open source software。您不需要管理员权限,ESC
和CTRL
仍可以按预期工作。
我用它来享受方便的CTRL + anything
按下操作而不会伤害我的小拇指,并切换了我在MobaXterm中通过ssh使用的Vim模式。要安装,请遵循this description。
CAPSLOCK
重映射到ESC
和CTRL
要在Linux上执行相同的操作,可以使用XCAPE。要在Ubuntu上安装,请使用:
sudo apt install xcape
对于实际映射,请执行以下操作:
setxkbmap -option ctrl:nocaps
xcape -e 'Control_L=Escape'
第一个命令是将CAPSLOCK
映射到ESC
,而第二个命令则负责用其他键按下CTRL
。
要在X会话中永久使用此功能,可以将其添加到~/.xprofile
。
答案 11 :(得分:0)
我想这样做的原因之一是像其他人提到的那样创建一个软封锁,可能是为了避免在正常模式下保持大写锁定。 我在离开插入模式时使用vimcaps插件来关闭大写锁定,似乎工作正常。
答案 12 :(得分:0)
在Mac上,也可以使用Karabiner(https://pqrs.org/osx/karabiner/)
$ brew jar安装karabiner元素
安装后,您可以在简单的修改标签中将 capslock 键映射到 esc 键。请注意,这是系统范围的,这意味着您到处都会丢失Capslock密钥。需要大写锁定的IMO。
答案 13 :(得分:0)
答案 14 :(得分:0)
我仔细研究了这个问题的答案以自己做,但我正在寻找稍微不同的东西:
CAPS -> Esc
和 CAPS + <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
看起来它暂时像一种魅力,但我正在寻找反馈:)
答案 15 :(得分:0)
对于 X (Linux),正如@Dan Andreatta 所提到的,使用 xmodmap
来更改键映射,例如
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
将 Esc 映射到 CapsLock 键。
您也可以通过将其添加到 X 初始化文件中来设置它,例如 .xinitrc
— 在使用 startx
时运行 —:
clear lock
keycode 0x42 = Escape
通常,它被放在一个 .Xmodmap
文件中,然后它在 .xinitrc
中运行。
Vim 的文档有一整页专门讨论这个主题,comments section 特别有用。