如果我在<Esc>[s1z=`]a
映射中使用inoremap
(跳至正常模式,找到先前的拼写错误,将其替换为首选,跳回到上一次编辑并追加),一切正常。问题是我经常不希望选择第一个拼写。如果我删除了 1 ,我会得到拼写菜单,但是`]a
似乎被吞噬了,使我仍然停留在正常模式下的更正单词的第一个字符上。映射本身不应该寻找输入,因为z=
本身应该处理菜单项。的确,如果我手动运行这些命令(没有 1 ,它会按预期工作。我曾尝试制作命名标记并跳回到这些标记,但似乎z=
及其后的所有内容都被消耗掉了。一方面,有人对我选择拼写菜单后如何继续进行映射有任何建议吗?
答案 0 :(得分:3)
我认为Vim按下z=
后立即停止处理映射的右侧,因为它不是一个完整的命令(您必须在菜单中提供建议的索引才能将其完成)。
:normal
命令具有相同的问题:
:norm[al][!] {commands}
...
{commands}
应该是完整的命令。如果{commands}
未完成命令,最后一个 将被中止,就像键入<Esc>
或<C-C>
一样。
或者,您可以调用feedkeys()
函数来按z=
。
例如:
ino <c-j> <c-r>=<sid>fix_typo()<cr>
fu! s:fix_typo() abort
let spell_save = &l:spell
try
setl spell
call feedkeys("\e\e[sz=", 'int')
augroup fix_typo
au!
au TextChanged * call feedkeys('`]a', 'int')
\ | exe 'au! fix_typo'
\ | aug! fix_typo
augroup END
finally
call timer_start(0, {-> execute('let &l:spell = '.spell_save)})
endtry
return ''
endfu
此代码使用C-j
键以插入模式安装映射。如果您不喜欢此密钥,可以使用另一个密钥。
该映射调用s:fix_typo()
函数,该函数:
'spell'
以避免错误E756
Esc Esc [s z=
来提示建议TextChanged
并按下`]a
的自动程序'spell'
的原始值