获取当前段落的开始/结束的行号

时间:2018-12-06 10:42:18

标签: vim neovim

由于需要我当前正在编写的脚本,我试图以最快的方式获得当前段落开始/结束的行号。

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

的确,当光标位于第4行时,line("'{")返回1,而line("'}")返回6,当我希望它类似于{{ 1}}或1/2

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

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

希望我的问题很清楚!

1 个答案:

答案 0 :(得分:0)

段落的定义主要基于空行,尽管:help paragraph也提到了一些(相当模糊并且继承自vi的) nroff 宏,它们可以定义段落。

  • 如果您不关心晦涩的部分,而只是将定义基于空行,则可以使用pacman循环和:while来检查空行,从而自己检测段落。此显式迭代完全避免了光标移动,但是如果段落很大(跨越数百行),则可能会很慢。
  • 仅当光标当前位于段落之间时,您当前的方法才会崩溃。您可以明确地检查(再次忽略晦涩的部分),然后再执行跳转,例如通过empty(getline(lnum))
  • 最简单的方法(对于模糊的部分也只有完全正确的方法)总是会跳来跳去。在normal! {内部,屏幕更新仅按需发生(通过:function)。您需要保存和还原当前视图,以使用户不会注意到:
:redraw

如果在动作前加上let l:save_view = winsaveview() " Code that jumps around here. call winrestview(l:save_view) (或暂时设置:help 'eventignore'),则可以避免触发插件动作(这可能比Vim内部光标移动的代价高得多)(在{ {1}}事件。

摘要

有几种选择;哪个适合您,取决于您的典型数据和用例。