在 Vim 中编辑 Yaml 时缩进错误

Posted

技术标签:

【中文标题】在 Vim 中编辑 Yaml 时缩进错误【英文标题】:Wrong indentation when editing Yaml in Vim 【发布时间】:2015-01-13 19:01:43 【问题描述】:

Vim 似乎没有对 YAML 文件中的破折号做出正确反应,因此破坏了格式。

例如,我有一个应该如下所示的块:

  handlers:
        - name: restart exim4
          service: name=exim4 state=restarted

当我输入完 restart exim4 并输入 service: 后,Vim 会重新缩进我最后的 service 行:

  handlers:
        - name: restart exim4
        service: name=exim4 state=restarted

很明显,Vim 试图对齐句子按列,但这不是 YAML 所需要的。我想创建一个包含两个值的数组。

如何解决?

【问题讨论】:

【参考方案1】:

为了在我在冒号后按回车时将漂亮的 2 空格 YAML 作为默认值,我将其添加到我的 .vimrc

autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab

这对于 OP 的预期结果也很合适。

【讨论】:

谢谢,它成功了。 考虑将其放入 ~/vim/ftplugin/yaml.vim 并用长名称替换短名称,以便将来阅读。 @LeviNoecker 是的,只是用逗号分隔它们,就像这样autocmd FileType yaml,yml setlocal ... 为此,我必须先拥有filetype plugin indent on。还有一个很好的接触是在此之前有syntax on 这是我上面的cmets的总和 --> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64【参考方案2】:

安装这个插件:

https://github.com/chase/vim-ansible-yaml

它是在考虑 Ansible 的情况下制作的,但理论上它适用于各种 YAML 文件。不幸的是,如果您不使用 ansible 相关文件,您将不得不 :set filetype=ansible。

【讨论】:

我看到了这个插件 - 它希望文件名具有特定名称和/或位于特定文件夹中。 Ansible 剧本不是我编辑的唯一文件。这就是为什么我什至没有尝试安装它。谢谢,我会将 yml 设置为“ansible”类型。 哇,有很大的不同,我认为虽然常规的 yaml 语法也值得修复 说实话,如果你走这条路,你必须把# vim:ft=ansible:放在你所有的非ansible文件中。【参考方案3】:

您可以在键入: 键时禁用重新缩进:

:set indentkeys-=<:>

请编辑~/.vimrc 文件,并添加以下行:

filetype plugin indent on
autocmd FileType yaml setl indentkeys-=<:>

注意:autocmdfiletype 之后。


你可以在INSERT模式下输入CTRL-F来触发reindent,例如:

hello: world
    foo: bar<C-F>

【讨论】:

【参考方案4】:

您可以使用此自动命令使 Vim 正确缩进 YAML 文件(将其放入您的 .vimrc):

" Fix auto-indentation for YAML files
augroup yaml_fix
    autocmd!
    autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=0# indentkeys-=<:>
augroup END

基本上,对于 YAML 文件,它会指示 Vim:

使用 2 个空格进行缩进。 使用空格而不是制表符。 在行首或冒号插入注释字符 (#) 后跳过重新缩进的行。

【讨论】:

添加 .yml 也有帮助 为了什么?在哪里?【参考方案5】:

你可以在你的 YAML 中添加一个注释来告诉 Vim 这个文件的特殊配置。例如:

# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
foo:
  bar:
  - a
  - b

然后每个使用默认 vim 的文件的人都可以共享文件创建者的配置。尤其是配合的时候效果很好。

【讨论】:

VIM - Vi IMproved 8.1 (2018 May 18, compiled Apr 15 2020 06:40:31) 上仍然缩进 8 个空格 保存带有注释的文件,然后用 Vim 重新打开。【参考方案6】:

我发现 https://github.com/stephpy/vim-yaml 工作得很好。这是一个 vim 插件,可以对 yaml 文件进行缩进(和语法高亮)。安装它也解决了您询问的特定问题。

您需要安装插件(请参阅 GitHub 存储库中的文档),并且只要您的 filetype=yaml 它会更正您的缩进。对你们都有帮助

    在您输入所提供的 sn-p 时,或 如果你已经写了一些 yaml,你可以选择它(使用V 进行逐行选择,然后使用jk 选择更多行)然后使用= 触发vim 格式化

【讨论】:

【参考方案7】:

这是我为 yaml 准备的 augroup

augroup filetype_yaml
    autocmd!
    autocmd BufNewFile,BufReadPost *.yaml,yml set filetype=yaml foldmethod=indent
    autocmd FileType yaml |
        setlocal shiftwidth=2 |
        setlocal softtabstop=2 |
        setlocal tabstop=2
augroup END

【讨论】:

【参考方案8】:

我找到了一个非常好的答案,而不是更新 .vimrc。

hereIgnacio Vazquez-Abrams

【讨论】:

以上是关于在 Vim 中编辑 Yaml 时缩进错误的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置 Vim 自动缩进以编辑 Python 文件?

vi vim 括号自动缩进设置及解释

YAML缩进和分离

vim 编辑器设置 行号和缩进

Vim编辑器的自动缩进设定

Vim编辑器的基本使用和多行缩进