在 Vim 中使用 `!` 命令保持现有缩进

Maintain existing indentation with `!` command in Vim

我正在尝试清理 vim 中的一堆 yaml 文件。 yaml 文件是用于测试的固定装置,它们包含 XML 的文字字符串。它们看起来像:

-
  - "<xml>blah blah blah …1000 characters later</xml>"
  - "<more>…</more>"

我希望它们看起来像:

-
  - >
    <xml>
      <nicely>formatted</nicely>
      …
    </xml>
  - >
    <more>
      …
    </more>

我去掉引号,将光标放在未格式化的 xml 的开头,然后点击 >,输入,<tab>,我得到

-
  - >
    <xml>…

但后来我尝试格式化 xml 我知道的唯一方法:shift-v 到 select 行。 :'<,'>!xmllint --nocdata --format - | awk 'NR>1' 格式化 xml,我得到

-
  - >
<xml>
  <nicely>formatted</nicely>
  …
</xml>

然后我必须重新select xml 并使用 2>> 重新缩进。

在Vim中执行!命令时,有没有更好的方法来保持缩进?

你的问题并没有直接说明这一点,但它在某种程度上暗示了 vim 是缩进被删除的原因,所以要明确一点,缩进是由 xmllint 删除的。

您可以先尝试保存缩进,但如果不同行的缩进不同,这可能会造成混淆。在这种情况下,查看您使用的命令可能更有意义 运行 只需稍后添加缩进 - 您可以通过将其添加到命令过滤器来自动执行此操作,例如:

:'<,'>!xmllint --nocdata --format - | awk 'NR>1' | sed -e 's/^/\t/'