如何使用其他按键图创建伪插入模式?


9

我处于定期使用两种不同的键盘布局(Programmers-DvorakTurkish-F)的情况中,与众不同。这些布局彼此之间有很大的不同,我只能精通一组肌肉记忆的vim。我非常精通Dvorak布局中的vim命令,但是如果我的键盘是Turkish-F布局,则几乎无法使用。不幸的是,我经常用英语和土耳其语甚至混合语言来编辑文件。我的熟练程度是,我可以在各自的键盘布局中很好地键入任何一种语言,但是我的大脑拒绝交叉连接它们,甚至从Dvorak布局中用土耳其语键入几个单词,反之亦然。

我有两个按键致敬的绑定来更改Xorg中的布局,但是即使这样,在编辑混合语言文件时,vim中的工作流程也很笨拙:

<vim commands…>i<switch to tr>…content…<escape><switch to en><vim commands…>

我希望能够将其简化为:

<vim commands…><leader>i…content…<escape><vim commands…>

...这样就可以使用<leader>i一组:imap值来模拟土耳其语布局,而无需更改系统键盘布局。同时,i将切换到插入模式,但没有多余的:imap值。值本身很容易,我只需要像这样的字母映射即可:

:imap a u
:imap A U
:imap o i
:imap O İ
"etc.

问题是,如何设置两个插入模式,一种正常插入模式和一个伪插入模式是除了一堆映射的相同的,以及如何可以触发这些模式与<leader>i<leader>a等?


1
这是一个不同的想法:您有InsertEnterand InsertLeaveautocmds,可用于自动切换布局。具体来说,InsertLeave您可以在上检查是否为土耳其语,如果是土耳其语,请切换至Dvorak,设置一个标志,然后在再次输入插入时再次切换至土耳其语(如果是上次退出插入模式的情况)。
马丁·图尔诺伊

@Carpetsmoker我看不到如何解决我的问题。即使有些东西要“检查”(我不确定您认为我要在那里检查...部分问题是我逐字逐句地来回查询),原因之一是当时的思路:imap是,即使在远程ssh会话中或未$DISPLAY设置时它也可以工作。
卡雷布(Caleb)2015年

Answers:


7

Vim以键盘映射的形式具有类似这样的功能。来自:help mbyte-keymap

When the keyboard doesn't produce the characters you want to enter in your
text, you can use the 'keymap' option.  This will translate one or more
(English) characters to another (non-English) character.  This only happens
when typing text, not when typing Vim commands.  This avoids having to switch
between two keyboard settings.

仅插入模式Caps Lock描述了这种模拟Caps Lock的映射。如您所见,映射文件类似于您在问题中概述的文件。

您可以通过:set iminsert=1或动态通过启用此设置i_CTRL-^/search'imsearch'选项也适用。


3

Ingo Karkat的回答似乎完全是正确的解决方案,已经解决了我的情况。但是,对于刚开始使用vim语言映射功能的其他任何人,这里有一些详细的说明。

首先,您需要一个语言映射文件。就像在Caps Lock示例中一样,您需要在~/.vim/keymap/dvorak2turkishf.vim从Githu b 下载我的完整映射)中输入以下内容:

let b:keymap_name = "dvorak2turkishf"
loadkeymap
; f
, g
. ğ
p ı
y o
f d
g r
" etc...

有了它,在某些情况下(但在其他情况下)则无需设置绑定来激活它。您需要向~/.vimrc文件中添加一些内容。

首先,将搜索键映射绑定到输入键映射:

set imsearch=-1

然后设置哪个键映射将用于替代语言输入模式:

set keymap=dvorak2turkishf

关闭备用输入模式,因此默认情况下不会更改:

set iminsert=0

设置自动命令以在离开插入模式时关闭备用语言开关时运行:

autocmd InsertLeave * set iminsert=0

为您可能会在备用语言输入模式中结束的所有各种方式添加绑定,以便在绑定之前使用<leader>(通常\)来将语言映射swtich设置为on,然后再进行切换:

nnoremap <leader>i :set iminsert=1<Cr>i
nnoremap <leader>I :set iminsert=1<Cr>I
nnoremap <leader>a :set iminsert=1<Cr>a
nnoremap <leader>A :set iminsert=1<Cr>A
nnoremap <leader>c :set iminsert=1<Cr>c
nnoremap <leader>C :set iminsert=1<Cr>C
nnoremap <leader>r :set iminsert=1<Cr>r
nnoremap <leader>R :set iminsert=1<Cr>R
nnoremap <leader>o :set iminsert=1<Cr>o
nnoremap <leader>O :set iminsert=1<Cr>O

为启用地图时设置不同的光标颜色:

:highlight Cursor guifg=NONE guibg=Green
:highlight lCursor guifg=NONE guibg=Cyan

总之,这是我的config中更改的内容。最后一点,您处于插入模式,您可以使用来打开和关闭语言映射选项<ctrl>+^

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.