【问题标题】:How can I get gg=G in vim to ignore a comma?如何在 vim 中获取 gg=G 以忽略逗号?
【发布时间】:2014-01-28 17:54:53
【问题描述】:

我在 vim 中打开了 autoindent 和 smartindent,但关闭了 nocindent。我正在尝试缩进一些 JSON 文本而不漂亮地打印整个内容,这太侵入性了:

{
  "a" : "value1",
  "b": "value2",
  "c": "value3",
  ...

由 gg=G 格式化为:

{
  "a" : "value1",
    "b": "value2",
    "c": "value3",
    ...

那里的逻辑是什么,如果可能的话,我可以设置哪些选项来修复它?我尝试切换 autoindent、smarindent 和 cindent 等选项(使用它们的“no”对应项),但它对 = 命令没有影响。我最近的尝试有以下选择:

autoindent
smartindent
nocindent
cinoptions=
indentexpr=
indentkeys=0{,0},:,0#,!^F,o,O,e

【问题讨论】:

  • 对于另一种 JSON 漂亮的打印解决方案,请查看 python 的 json.tool。我做了一个快速的 vim 命令:command! -range -nargs=0 -bar JsonTool <line1>,<line2>!python -m json.tool。现在您可以通过 :%JsonTool 重新格式化整个缓冲区。
  • 是的,这就是我最初所做的......使用那个 python 命令。但是,例如将数组元素放在单独的行上,这太麻烦了。有限的内置压头实际上更符合要求,尤其是使用 abjuk 的解决方案。不过还是谢谢……学习该命令真是太好了!技术。

标签: json vim macvim auto-indent


【解决方案1】:

我可以解释其中的逻辑,但我不确定能否轻松解决。 Vim 的内部缩进遵循 C 风格的语法,因此由于 "a" : "value1", 行不以 ; 结尾,它假定以下行是该语句的延续,它们应该缩进以显示这一点。

:help C-indenting 深入讨论了各种缩进选项及其交互方式。我略读了一下,没有什么特别之处,但值得一读。

如果您有一个可以更好地识别代码结构的外部格式化程序,您可以随时设置equalprg 来运行它,而不是使用内部格式化程序。

编辑:再想一想,set cinoptions+=+0 将禁用缩进以继续行。这也会影响常规代码,但这可能是一个合理的权衡,取决于哪个更让你烦恼。如果您正在编辑独立的 .json 文件,也可以按文件类型设置它。

【讨论】:

  • 这一切如何适用于拥有:set nocindent 的 OP?
  • 对,但他使用gg=G 格式化整个文件,无论如何都使用C-indenter(除非他将equalprg 设置为某些东西)。 cindent 仅对键入时自动缩进很重要。 cinoptions 也会影响 =
【解决方案2】:

内置缩进设置不会完全涵盖复杂的非 C 语言,如 JSON。最好使用定制的缩进设置,例如vim-json 中的indent/json.vim 缩进插件。

【讨论】:

  • 我确实同意使用内置压头格式化 json 很愚蠢,但更方便的是解决即时需求,我不想搞砸如何格式化 JSON用手。 @abjuk 的建议解决了我的迫切需求,但我仍然会给你 +10 的支持,反正你不需要 :)
猜你喜欢
  • 1970-01-01
  • 2020-07-01
  • 2012-07-24
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2014-07-05
  • 2018-05-20
相关资源
最近更新 更多