首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取当前段落开始/结束的行号

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

Stack Overflow用户
提问于 2018-12-06 10:42:18
回答 1查看 105关注 0票数 1

为了满足我目前正在编写的脚本的需要,我试图以最快的方式获得当前段落开头/结尾的行号。

一开始我使用的是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/25/6

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

如果有人知道如何不断地获得当前段落开头和结尾的行号,我将很高兴听到它!

希望我的问题足够清楚!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-06 11:17:09

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

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

如果使用:noautocmd (或临时设置:help 'eventignore')作为运动的前缀,则可以避免触发插件操作(这比Vim的内部游标移动成本要高得多)(在CursorMoved事件上)。

摘要

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53649588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档