如何在 Vim 中使用 CapsLock 代替 Escape?

如何在 Vim 中使用 CapsLock 代替 Escape?

我想将我的映射CapsLockEscape.我如何CapsLock代表.vimrc

我知道将空间映射到命令我会这样做:

:map <space> viw

我如何在不进行注册表破解的情况下映射CapsLockEscape- 我正在寻找 Vim 命令?

如果没有黑客或其他软件就不可能实现这一点,我想将快捷方式分配jjESCin .vimrc。我目前正在这样做:

inoremap jj <esc>

但是,如果我处于视觉模式,则这不起作用。我怎样才能jj模拟退出键?

答案1

我不认为你可以CapsLock从 Vim 内部进行映射。您可以使用以下命令在 X 内重新映射它setxkbmap:

setxkbmap -option caps:swapescape

要在控制台中重新映射,如果您的发行版使用systemd,您可以使用自定义键盘布局,/etc/vconsole.conf拱门维基,对于其他初始化系统,请参阅这个 U&L 答案

答案2

如果您想将 和 映射Caps LockEscapeEscape而不是交换它们,请使用

setxkbmap -option caps:escape

代替...:swapescape

使用

setxkbmap -option

要清除任何现有选项,则上述操作应该有效。

答案3

您可以xmodmap在 Vim 启动时使用调用将 Capslock 映射到 Escape。一旦离开 Vim,修改就可以恢复。将以下行添加到您的.vimrc

au VimEnter * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'

但是,如果您有多个 Vim 会话,这将导致问题。一旦关闭其中一个,所有修改都会恢复,因为它xmodmap是全局操作的。

答案4

~/.vimrc在您的或文件中尝试此操作~/.vim/vimrc

:autocmd BufWinEnter * !setxkbmap -option caps:swapescape
:autocmd BufWinLeave * !setxkbmap -option

~/.bashrc您可以在或中使用别名来代替第一行~/.profile

alias vim="setxkbmap -option caps:swapescape && vim"

这些方法的缺点是,只要您没有关闭 vim,您的 CapsLock 将成为您的 Escape,反之亦然,在整个机器范围内。

解决方案:

为此,我仅在所需模式(即 InsertMode)期间使用键绑定交换超时:
au CursorHoldI * stopinsert
au InsertEnter * silent! let updaterestore=&updatetime | set updatetime=15000 | execute "!setxkbmap -option caps:swapescape" | redraw!
au InsertLeave * silent! let &updatetime=updaterestore | execute "!setxkbmap -option" | redraw!

现在,在InsertMode期间,CapsLock和Escape将在机器范围内互换,但由于我已将InsertMode的超时设置为15000,所以我不必担心它,因为它会在不活动的15秒内自动反转。 ;-)

-希曼舒

相关内容