vim - 如何替换 vi 中的匹配分隔符?

标签 vim vi replace delimiter

我有一些匹配分隔符的文本(在本例中是花括号,并且文本恰好是 LaTeX,这只是偶然的):

\nb{\vec{n},\vec{y}} \in \vec{z}

我想做的是将 \nb{...} 全局替换为 (...),同时尊重分隔符的嵌套。即,结果应该是

(\vec{n},\vec{y}) \in \vec{z}

而不是

(\vec{n},\vec{y}} \in \vec{z)

这是 :%s/\\nb{\(.*\)}/(\1)/g 生成的内容。标准正则表达式无法处理匹配的分隔符,所以我没想到这种方式会起作用。我可以使用一些特定于 vi 的技巧来做到这一点吗?

最佳答案

如果您安装了 surround.vim 那么以下应该可以解决问题

:set nowrapscan
:let @q="/\\m\\\\nb{/e+1\<cr>cs{)dF\\@q"
gg@q

如果您不这样做:

:set nowrapscan
let @q="/\\m\\\\nb{<cr>dt{yi{\"_ca{()\<esc>\"0P@q"
gg@q

概述

创建一个递归宏来搜索 \nb{ ,将光标定位在 { 内部,将 }{ 替换为 ()

细节的荣耀

  • :set nowrapscan 这可以防止搜索在文件周围循环。
  • :let @q="..." 将我们的宏存储在 q 寄存器中
  • /\m\nb{/e+1 搜索 \nb{ 并将光标定位在 { 之后
  • cs{) 环绕版本只会将周围的 { 更改为 )
  • @q 再次运行宏
  • 使用了 ",因此必须转义一些内容才能正常工作。
  • gg@q 转到文件顶部并执行寄存器q中的宏

非环绕版本略有不同

  • yi{ 复制 { 内的文本
  • "_ca{()<esc> 更改内部文本(包括 { )并替换为 ()
  • "0P 将我们刚刚复制的内容粘贴到 ()

关于vim - 如何替换 vi 中的匹配分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437206/

相关文章:

javascript - 用 javascript 将字符串中的 html 实体替换(LaTeX)命令

php - 如何从 php 中的字符串中删除 ♥(或 ♥)?

vim - 如何打开另一个垂直窗口(:vsp) on the left in vim?

linux - 在我的命令行中运行 vi 后发生了一些奇怪的事情

vim - 将粘贴 (p) 映射到“0p

java - 如何从 Java 中的给定字符串中删除注释?

regex - vim 正则表达式 : how to replace enclosing backticks with tags

vim - 我可以对 Vim 中的视觉 block 选择执行多项操作吗?

vim - 我想在我的 .vimrc 中保存一个 vim 宏?

linux - 使用 vim,如何快速刷新正在处理的网页?