例如,更改
text 12345 {\ color {red} text 123 \ ref {label} 567
1234} 567
到
text 12345 text 123 \ ref {label} 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}
答案 0 :(得分:3)
没有得到你真正的意思。有很多方法可以做到。
{\color{red}text 123 \ref{label} 567}
^
|cursor
你可以这样做:
d f } $ x
如果你安装了surround.vim,删除周围的括号会更容易。 (ds{
)
修改强>
更新问题:
打开您的文件,然后输入:
:g#{\\color{red}#normal 0df}$x
希望命令符合你的要求。
EDIT II 基于问题更新
如果你的目标文本对象是跨行,你可以试试这个:
g/{\\color{red}/normal 0f{mz%x`zxdf}
如果你的目标模式跨越多行(不仅仅是一两个,可能很多),以上行就可以工作。但是语法必须正确,这意味着{ , }
必须配对。
答案 1 :(得分:2)
我会使用正则表达式替换:
%s/\v\{\\color\{\w+\}(.*)} ?$/\1
\v
非常神奇(理智的正则表达式)
{\\color\{\w+\}
颜色不错
(.*)
捕获您要保存的文字
} ?$
关闭乳头支架和线末端的可选空间
/\1
用第一个捕获替换整个东西,这是颜色标记BS
对于已修改的示例,您可以使用\_.
代替.
,因为它包含换行符。
%s/\v\{\\color\{\w+\}(\_.*)}/\1