在映射中使用“ z =“

时间:2018-11-27 20:00:36

标签: vim

如果我在<Esc>[s1z=`]a映射中使用inoremap(跳至正常模式,找到先前的拼写错误,将其替换为首选,跳回到上一次编辑并追加),一切正常。问题是我经常不希望选择第一个拼写。如果我删除了 1 ,我会得到拼写菜单,但是`]a似乎被吞噬了,使我仍然停留在正常模式下的更正单词的第一个字符上。映射本身不应该寻找输入,因为z=本身应该处理菜单项。的确,如果我手动运行这些命令(没有 1 ,它会按预期工作。我曾尝试制作命名标记并跳回到这些标记,但似乎z=及其后的所有内容都被消耗掉了。一方面,有人对我选择拼写菜单后如何继续进行映射有任何建议吗?

1 个答案:

答案 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'的原始值