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

How to make vim spell error search the current line only?

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

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

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

这个答案有一个更短更好的版本 available on Stack Exchange here。思路是一样的,但是执行起来更好

虽然当前解决方案有效,但上面 link 中的答案完全重用了原始映射。


原回答如下

我一直在修改你的映射的不同版本,几乎想出了一个很好的解决方案(虽然它很不优雅)需要添加到你的配置文件中,如下所示:

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 中以查看它是否不同。
  • 它会回到原来的位置并确定线路是否已更改。如果它改变了,它会 return 进入插入模式到光标所在的位置,并且如果它发生在另一行将不会更正任何拼写错误。
  • 如果没有改变,它会更正拼写错误,return到光标原来的位置。