Vim:在正常模式下切换键盘布局



在vim中退出插入模式时,我正试图自动将键盘布局从de切换到us。langmap不是一个选项,因为我在全系统范围内起诉我们和es的键盘布局。

有人能解释为什么使用吗

function! SetUsLayout()
silent !setxkbmap us,de
endfunction
autocmd InsertLeave * call SetUsLayout()

离开插入模式时,不会从de切换到us,也不会从us切换到de?我已经读过:如何在切换到vim正常模式时自动更改键盘布局?但找不到答案。

首先完全改变为我们,然后混合布局并不能解决问题:

function! SetUsLayout()
silent !setxkbmap us
silent !setxkbmap us,de
endfunction
autocmd InsertLeave * call SetUsLayout()

也不起作用。在这两种情况下,都会继续使用插入模式下激活的布局。功能

function! SetUsLayout()
silent !setxkbmap us
endfunction
autocmd InsertLeave * call SetUsLayout()

然而,它运行得非常好。从最初的取消布局切换到us布局。然而,这不是一种选择,因为再也不可能切换回es。

有关完整答案和备选方案,您可以在此处查看vi/vim stackexchange上的此线程。

我不确定我是否正确理解了你的问题,因为你提到了用于插入字符的[de]和[es>布局。

这是一个解决方案,如果你想要:

  • [de]插入字符的布局
  • [us]用于正常模式操作的布局
function! SetUsLayout()
silent !setxkbmap us
endfunction
function! SetDeLayout()
silent !setxkbmap de
endfunction
function! SetUsDeLayout()
silent !setxkbmap us,de
endfunction
autocmd VimEnter * call SetUsLayout()
autocmd InsertLeave,CmdlineLeave * call SetUsLayout()
autocmd InsertEnter,CmdlineEnter * call SetDeLayout()
autocmd VimLeave * call SetUsDeLayout()

根据您的喜好安排VimLeave函数,我还添加了Cmdline Enter/Leave事件,以便在nvim命令行中键入我的母语。

还要注意:

  • 对于宏、插件等……此解决方案使您能够使用本机[us]布局,从而避免一些麻烦和重映射。这就是这个解决方案相对于langmap的主要优势。

  • 在我的neovim上,替换模式不会触发事件";InsertModeEnter";,因此,如果您的配置也是这样的话,那么您必须在那里使用us布局。

  • 在正常模式下,按字符查找(即f/f/t/t(需要使用[us]布局,这可能会很麻烦。在这种情况下,您可以添加映射,例如:

nnoremap fy fz
nnoremap Fy Fz
nnoremap ty tz
nnoremap Ty TZ

然而,它可能不适用于所有字母,奇怪的是,在我的配置中,它需要按两次键映射才能将其考虑在内(就好像它必须在内存中加载规则一样(。一旦完成,它的工作速度就像它是本地的一样快。

最新更新