1

例如,改变

文本 12345 {\color{red}文本 123 \ref{label} 567

第1234章 567

文本 12345 文本 123 \ref{标签} 567

1234 567

vim中应该做什么样的操作?

我的目标是找到所有模式{\color{red} 并删除模式和模式的匹配大括号},同时将文本保留在两者之间。模式{\color{red}可以在行中的任何位置(不一定在行的开头)。之间的文本{\color{red} ...}可以有多行,如上所示。

非常感谢你的帮助。

编辑:我只是想办法做到这一点,但可能效率不够。

:g/\\color{red}/norm ndiBvaBpd% 

g:全局
/\\color{red}:匹配模式
/norm:普通模式命令
n:将光标从光标转发到下一个匹配模式。但是如果模式在行的开头,它可能会找不到它。
diB:从光标处删除内部块
vaB:选择光标周围的块
p:放置到选定的块
d%:删除\color{red}

4

2 回答 2

3

没明白你的真正意思。有很多方法可以做到这一点。

{\color{red}text 123 \ref{label} 567}
^
|cursor

你可以这样做: df}$x

如果你安装了环绕.vim,移除周围的大括号会更容易。( ds{)

编辑

对于问题更新:

打开你的文件,然后输入:

:g#{\\color{red}#normal 0df}$x

希望命令做你想做的事。

EDIT II基于问题更新

如果您的目标文本对象跨越线,您可以试试这个:

g/{\\color{red}/normal 0f{mz%x`zxdf}

如果您的目标模式跨越多条线(不仅是一/两条,可能很多),则上述线有效。但是语法必须正确,这意味着{ , } 必须成对

于 2013-03-08T21:02:32.973 回答
2

我会为此使用正则表达式替换:

%s/\v\{\\color\{\w+\}(.*)} ?$/\1

\v非常神奇(理智的正则表达式)

{\\color\{\w+\}颜色的东西

(.*)捕获要保存的文本

} ?$闭合奶嘴支架和行尾的可选空间

/\1用第一个捕获替换整个东西,这是颜色标签 BS 之间的东西

对于您编辑的示例,您可以使用,\_.而不是.因为它包含换行符。

%s/\v\{\\color\{\w+\}(\_.*)}/\1

于 2013-03-11T00:32:02.210 回答