在 HCL 块中排序 属性

Sort a property in HCL Block

我想像这样将 name 属性 移动到块的顶部。

一个文件中有很多resouce块。

之前

resource "datadog_monitor" "A" {
  enable_logs_sample   = "true"
  name                 = "name"
  tags                 = ["env:dev"]
}

resource "datadog_monitor" "B" {
  enable_logs_sample   = "true"
  name                 = "name"
  tags                 = ["env:dev"]
}

之后

resource "datadog_monitor" "A" {
  name                 = "name"
  enable_logs_sample   = "true"
  tags                 = ["env:dev"]
}

resource "datadog_monitor" "B" {
  name                 = "name"
  enable_logs_sample   = "true"
  tags                 = ["env:dev"]
}

好的,我认为 :help :global 和 range/address 机制是 Vim 最好和最被低估的功能之一,因此它可能值得详细 运行 了解。

核心编辑模式与我在 中建议的命令相同:

  • 在匹配特定正则表达式模式的每一行上,
  • 做点什么。

请注意,这是一个“模式”,而不是 one-off 技巧。你不应该用心“学习”这个答案,或者将它提交给“肌肉记忆”,或者在你下次遇到完全相同的问题时将它加入书签。相反,您应该以一种允许您的方式理解其背后的逻辑:

  • 认识到它可能会派上用场的情况,
  • 不用想太多就去应用它。

所以,为了实现上面描述的编辑模式,我们使用:global命令,它的工作原理是这样的:

:[range]global/<pattern>/[range]<command>

其中:

  • in range(可选,默认为%),
  • 标记每行匹配 <pattern>,
  • 然后在 range 上执行 <command>(可选,默认为 .)。

与 Vim 中的许多内容一样,:global 在概念上很酷,但它本身不一定有用。越熟悉ranges/addresses,知道的Ex命令越多,越有用

在这种特定情况下,范围并不重要,但地址和 Ex 命令很重要……它们的总和使得这些问题可以在 IMO 中以一种非常直观的方式解决。

现在,让我们回到我们的问题:

move every "name" line to the top of the block

并用符合我们编辑模式的术语表达:

  • 标记每行匹配 name,
  • 然后将其移动到匹配 resource.
  • 上方最近的行下方

这是一个简单的:

:g/name/m?resource?

当然,要使用的确切正则表达式模式是 context-dependent。

诀窍是将模式内化,这样您就已经知道如何使用您可能遇到的任何新构建块。

这里god-like真的什么都没有