如何使vim拼写错误仅搜索当前行?

时间:2019-04-29 14:56:40

标签: vim spell-checking

此vim绑定将使<C-l>更正先前的拼写错误:

inoremap <C-l> <c-g>u<Esc>[s1z=`]a<c-g>u

如何修改它以使其仅在当前行上纠正先前的错误?

1 个答案:

答案 0 :(得分:0)

此答案available on Stack Exchange here的版本较短且更好。想法是一样的,但是执行效果更好。

在当前解决方案有效的同时,上面链接中的答案完全重用了原始映射。


下面的原始答案

我一直在修改您的映射的不同版本,并且几乎想出了一个很好的解决方案(尽管非常不雅),需要将其添加到您的配置文件中,如下所示:

function! FixLastSpellCurrentLine()
  let s:linenum1 = line('.')
  execute 'normal ms[s'
  let s:linenum2 = line('.')
  execute 'normal `s'
  if s:linenum1 == s:linenum2
      execute 'normal ms[s1z=`sl'
  endif
  let s:islastchar = col(".") == col("$")-1
  if s:islastchar
      :startinsert!
  else
      execute 'normal h'
      :startinsert
  endif
endfunction

imap <C-l> <esc>:call FixLastSpellCurrentLine()<CR>

这可能无法在所有情况下都达到预期的效果,但这已经足够接近了,我认为它可能会激发您或其他人进行改进。这个想法只是检查先前的拼写错误发生在哪里并比较行。我认为可以按照这些思路或多或少地实现这一点,但是我仍然不相信这种解决方案是理想的。

它的作用:

  • 从您当前的光标位置进入正常模式并调用已定义的函数。
  • 然后将当前行的值存储到s:linenum1中。
  • 它用ms标记当前位置,并跳至文件中找到的上一个拼写错误(如果有)。
  • 从那里,它再次将行号捕获到s:linenum2中以查看其是否不同。
  • 它返回到原来的位置,并确定行是否已更改。如果更改,它将返回到光标所处的插入模式,并且如果在另一行上发生任何拼写错误,将无法更正。
  • 如果未更改,它将纠正拼写错误,并返回到光标的原始位置。