获取当前段落的 start/end 行号

Get line number of start/end of current paragraph

由于我目前正在编写的脚本的需要,我正在尝试以最快的方式获取当前段落的 start/end 的行号。

起初我使用的是 line("'{")line("'}"),但这在这个用例中实际上不起作用: 1. this is a 2. paragraph 3. 4. 5. this is another paragraph 6. that is below the first one

的确,当光标在第 4 行时,line("'{")returns1line("'}")returns6,当我'我希望它类似于 1/25/6

我不愿意让光标移动以获得想要的结果,因为每次用户更改段落时都会执行这些操作,并且移动光标有点慢。

如果有人知道如何始终获取当前段落开始和结束的行号,我将很高兴听到!

希望我的问题足够清楚!

段落的定义主要是基于空行,虽然:help paragraph也提到了一些(相当晦涩,继承自vi)nroff可以定义段落的宏。

  • 如果您不关心晦涩的部分,而只是将您的定义基于空行,您可以使用 :while 循环和 empty(getline(lnum)) 来检查空行,从而检测段落自己。这种显式迭代完全避免了光标移动,但如果有非常大的段落(跨越数百行),可能会很慢。
  • 只有当光标当前位于段落之间时,您当前的方法才会失效。您可以明确地检查它(再次忽略晦涩的部分),然后才执行跳转,例如通过 normal! {.
  • 最简单的(也是唯一一个对于晦涩的部分也完全正确的)实现总是跳来跳去。在 :function 中,屏幕更新仅按需进行(通过 :redraw)。您需要保存和恢复当前视图,以免用户注意到:
let l:save_view = winsaveview()
" Code that jumps around here.
call winrestview(l:save_view)

如果你在动作前加上 :noautocmd 前缀(或临时设置 :help 'eventignore'),你可以避免插件动作(这比 Vim 的内部光标昂贵得多移动)被触发(在 CursorMoved 事件上)。

总结

有几个选项;哪一个适合你,取决于你的典型数据和用例。