首页 > 解决方案 > 如何使 vim 拼写错误仅搜索当前行?

问题描述

这个 vim 绑定将<C-l>纠正之前的拼写错误:

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

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

标签: vimspell-checking

解决方案


Stack Exchange 上提供了此答案的更短更好的版本。想法是一样的,但执行更好。

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


原答案如下

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

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

推荐阅读