VIM:如何使用正则表达式根据括号类型重新格式化列表?

问题描述 投票:0回答:2

我正在尝试使用正则表达式在 VIM 中编写一个粗略的代码格式化程序,通常情况下没问题,但我陷入了这个问题:如何仅重新格式化列表,并且如果它位于某种类型的括号内。比如说我想重新格式化

a = [1, 2, 3, 4]

进入

a = 
[1,
2,
3,
4]

但不进行操作

b = |1, 2, 3, 4|

到目前为止,我已经使用它查找所有出现的单词+逗号+任何字符,并将其替换为逗号和回车。

au BufWrite <buffer> %s/\w\zs,\ze./,\r/ge
regex vim
2个回答
1
投票

您可以混合使用

:s
substitute()
来进行匹配。例如,考虑以下文本:

a = [1, 2, 3, 4]
b = |1, 2, 3, 4|

使用:

:%s/\s*\[.\{-}]/\=substitute(submatch(0), '\s\+', '\n', 'g')

退货:

a =
[1,
2,
3,
4]
b = |1, 2, 3, 4|

它的作用是匹配

[...]
,然后用换行符替换其中的每个空格。


0
投票

您还可以使用正则表达式:

:%s/^.*|\n\zs\|,/,\r/g

这意味着

^.*|\n
匹配包含字符
|
的每一行,然后命令
\zs
超越了这个选择,现在可以匹配剩余行中的每个逗号...

© www.soinside.com 2019 - 2024. All rights reserved.