首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >搜索的模式可以包含在regex (Vim)中吗?

搜索的模式可以包含在regex (Vim)中吗?
EN

Stack Overflow用户
提问于 2012-02-23 04:36:31
回答 2查看 293关注 0票数 4

我对正则表达式非常陌生,我需要一些帮助。首先,我将解释我的动机和一些图表,因为它很难解释,否则。

我最近安装了Vim缩进指南,它显示垂直条/尺子,如下所示(图片来自github帐户):

这样做的方法是在行的开头进行模式匹配,并将它们添加到IndentGuidesEvenIndentGuidesOdd中。这方面的问题是,它不能与空行匹配,而且您得到的不太理想,如下所示:

最简单的解决方案是删除所有的空行/空行,但是没有空格的代码很难读懂。我想到的是在几个阶段转换代码,并最终添加空格,如下所示。

我所做的是:

  • 从只有空格%s/\s\+$//e的所有行中删除空格
  • 截断所有多个空行%s/\n\{3,}/\r\r/e
  • 将空格添加到空行%s/^\ \(\ *\)\([^\ ]\)\(.*\)\n^\ *$\n^\ /\ \1\2\3\r\ \1\r\ /gc

最后一条语句是查看三行代码,其中第一行和第三行为非空,第二行为空。但是,如果第一行缩进8次,第三行只缩3次,则会产生问题。无论如何,在找到第一个模式(在本例中是8个缩进)之后,是否可以在相同的搜索模式中使用它,以确保第1行和第3行以相同的空格开始?我确信我可以用一个迭代函数来完成这个任务,从30个缩进开始,然后按我的方式返回,但这可能有点效率低下。

我知道只有空格的线条是不好的。但是,删除空格是很简单的,而且我已经映射了键来自动完成这一任务。如果需要的话,我可以迅速移除它们。而且,我知道问题比这更复杂,而且有更多的案件需要考虑,但我将在这些案件出现时加以处理。

关于我该怎么做有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-23 10:26:19

为了根据最后一个注释实现第三步,可以使用以下命令。

代码语言:javascript
运行
复制
:%s/^$/\=repeat(' ',min([indent(line('.')-1),indent(line('.')+1)]))

这种全局替换依赖于带有表达式特性的替换(参见:help sub-replace-\=)来用包含重复min([indent(line('.')-1),indent(line('.')+1)])次数的空格字符的字符串替换空行。空格数计算为在临时列表中加入的两个值的最小值。这些值是紧接当前行之前和之后的行的缩进级别(line('.')计算为其数目);缩进级别由indent()函数确定。

票数 3
EN

Stack Overflow用户

发布于 2012-02-23 04:45:33

使用vim填充空白:

代码语言:javascript
运行
复制
:g/^$/s//\=printf('%*s', strlen(matchstr(getline(line('.')-1), '^\s*')),'')

代码语言:javascript
运行
复制
:g/^$/s//\=matchstr(getline(line('.')-1), '^\s*')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9407233

复制
相关文章

相似问题

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