获取当前段落的 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("'{")
returns1
,line("'}")
returns6
,当我'我希望它类似于 1/2
或 5/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
事件上)。
总结
有几个选项;哪一个适合你,取决于你的典型数据和用例。
由于我目前正在编写的脚本的需要,我正在尝试以最快的方式获取当前段落的 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("'{")
returns1
,line("'}")
returns6
,当我'我希望它类似于 1/2
或 5/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
事件上)。
总结
有几个选项;哪一个适合你,取决于你的典型数据和用例。