在Vim中编辑Yaml时缩进错误

在Vim中编辑Yaml时缩进错误,vim,yaml,Vim,Yaml,Vim似乎无法正确响应YAML文件中的破折号符号,因此破坏了格式 例如,我有一个块,它应该是这样的: handlers: - name: restart exim4 service: name=exim4 state=restarted 当我完成键入重新启动exim4并键入服务:Vim重新插入我的最后一行服务时: handlers: - name: restart exim4 service: name=exim4 s

Vim似乎无法正确响应YAML文件中的破折号符号,因此破坏了格式

例如,我有一个块,它应该是这样的:

  handlers:
        - name: restart exim4
          service: name=exim4 state=restarted
当我完成键入
重新启动exim4
并键入
服务:
Vim重新插入我的最后一行
服务时:

  handlers:
        - name: restart exim4
        service: name=exim4 state=restarted
显然,Vim试图按列对齐句子,但这不是YAML所需要的。我想创建一个具有两个值的数组

如何修复此问题?

安装此插件:


它在设计时考虑了Ansible,但在理论上它可以处理所有类型的YAML文件。如果您没有处理与ansible相关的文件,则必须:设置filetype=ansible。键入
键时,您可以禁用reindent:

:set indentkeys-=<:>
注意:
autocmd
位于
filetype
之后


您可以在插入模式下键入CTRL-F来触发reindent,例如:

hello: world
    foo: bar<C-F>
# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
foo:
  bar:
  - a
  - b
hello:world
福:酒吧

为了在我点击冒号后面的回车键时将nice 2-space YAML作为默认值,我将其添加到我的
。vimrc

autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
" 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
这也很好地实现了OP的预期结果。

我发现它非常有效。这是一个vim插件,它对yaml文件进行缩进(和语法突出显示)。安装它也解决了您所问的特定问题

您需要安装插件(请参阅GitHub repo中的doco),只要您的
filetype=yaml
,它就会纠正您的缩进。这对你们俩都有帮助

  • 当您键入您提供的代码段时,或者
  • 如果您已经编写了一些yaml,您可以选择它(使用
    V
    进行行选择,然后使用
    j
    k
    选择更多行),然后使用
    =
    触发vim格式化

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

    “修复YAML文件的自动缩进
    A组yaml_fix
    自动驾驶!
    autocmd文件类型yaml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=0#indentkeys-=
    螺旋端
    
    基本上,对于YAML文件,它指示Vim:

    • 缩进时使用2个空格
    • 使用空格代替制表符
    • 在行首或冒号插入注释字符(
      #
      )后跳过重新缩进行

    您可以在YAML中添加注释,告诉Vim此文件的特殊配置。例如:

    hello: world
        foo: bar<C-F>
    
    # vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
    foo:
      bar:
      - a
      - b
    

    然后,使用此文件和默认vim的每个人都可以共享文件创建者的配置。尤其是在合作时,它工作得很好。

    以下是我为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
    

    我看到了这个插件-它希望文件名有一个特定的名称和/或在一个特定的文件夹中。Ansible playbooks不是我编辑的唯一文件。这就是为什么我甚至没有尝试安装它。谢谢,我会将yml设置为“Ansible”类型。哇,这是一个很大的不同,我认为常规的
    yaml
    语法也值得修复,如果是的话走这个路线,你必须在所有的不可操作的文件中放上代码“{ vi=:ft= ANDISC::/CODE”。谢谢,它是这样做的。考虑把它放进~/Vim/ftPultIn/YAMLVIM,用更短的名字替换未来的可读性的短名称。,我必须先在
    上使用
    文件类型插件缩进。还有一个很好的方法是在
    上使用
    语法。这是我在上面的评论的总和-->添加。yml还有助于什么?在哪里?在
    VIM-Vi改进8.1上仍然使用8个空格缩进(2018年5月18日,编译日期2020年4月15日06:40:31)
    保存带有注释的文件,然后用Vim重新打开。