【问题标题】:How to find and replace something like this in vim?如何在 vim 中查找和替换类似的东西?
【发布时间】:2019-01-24 09:12:13
【问题描述】:

输入

if(statement)
{

输出

if ( statement ) {

我可以使用

找到输入
/if(\S\(.*\))

解释:

if( 是要搜索的关键字, \S 否定空格, (.*) 表示中间的任何内容, ) 结束括号。

需要:

尝试将编码指南自动化,而不是编写没有编码指南的代码,而且我是一个懒惰的编码器,想要运行 autocmd 以获取编码指南。

编辑:

:%s/if(\S\(.*\)\S)/if ( \1 )/gc

非常接近,但它删除了 'if(' 之后的第一个字符和 ')' 之前的最后一个字符

【问题讨论】:

  • “类似这样的东西”太含糊了。你到底想做什么?
  • 天哪,从哪里开始。 vim 有自动编码格式,看看:h = 是缩进的。根据您的编码语言,有一些文件类型插件通过设置formatexpr 为您进行格式化。然后是可以使用的外部 linter(看看 ale github.com/w0rp/ale)。我强烈建议使用 vim 提供的工具,而不是构建这样的正则表达式。
  • @DoktorOSwaldo = 用于缩进,而不是一般格式(除非您使用重新定义它的自定义插件)。
  • 所以,将捕获括号放在它们应该在的位置,if(\(\S.*\S\))。或if(\(\S\(.*\S\)\?\)) 允许在if 条件内使用单个字符变量。
  • @melpomene IDK 知道使用什么术语。对不起?你能推荐一下吗?

标签: regex search vim


【解决方案1】:
:%s/if(\(\S.*\S\))/if ( \1 )/gc

\1 这里用于替换 ( ) 之间的第一个匹配模式,所以在我的情况下它是 \S.*\S

\S.*\S 是没有任何空格的任何东西。

【讨论】:

  • 这将如何将{ 向上移动,就像在您的示例中一样?
  • 哦,谢谢指出。将谷歌,查找,实施并取回:D
【解决方案2】:

这里不需要:substitute;您已经有了正则表达式,您可以将其与:global 一起使用来查找所有行,然后将:join 与下一行一起使用:

:global /if(\S\(.*\))/join

如果您更喜欢:substitute,您也可以这样做,方法是匹配换行符 (\n)、任何缩进和开头的卷曲。我这里用\zs来限制匹配;这使我免于使用捕获组

:%substitute/if(\S\(.*\)\zs\n\s*{/ {/

注意!注意事项

您说您的目的是实现编码指南的自动化。虽然像上面这样的 Vim 命令对于偶尔的战术编辑来说是很好的,但我不会基于正则表达式的自动化(可能没有被人类彻底检查)工具,因为它们只能近似大多数的语法编程语言。 Vim 的语法高亮很好,你可以忍受偶尔的错误表述。直接处理源代码本身是不同的。为此,有更好的工具可以直接实现语言的语法规则(通常不是通过正则表达式,而是一个成熟且经过测试的解析器)。您没有提及语言,但快速搜索 «language» linter«language» 代码样式检查 应该可以帮助您开始。

【讨论】:

  • 好的。注意力确实是有道理的,但学习起来很有趣。不会用它来编辑源代码。取点。不知道 linter 或代码样式检查器。我会专门使用C语言。
【解决方案3】:

试试这个 vim 自动化表达式:

:%s/\vif\((.*)\)/if ( \1 )/gc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2019-07-24
    • 2010-12-07
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多