在 Vim 中编辑 Yaml 时错误的缩进

在 YAML 文件中,Vim 似乎不能正确地对破折号作出反应,因此破坏了格式。

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

  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 所需要的。我想创建一个有两个值的数组。

怎么补救?

82161 次浏览

Install this plugin:

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

It is made with Ansible in mind, but in theory it will work with all kinds of YAML files. You will have to :set filetype=ansible unfortunately, if you are not working with ansible related files.

You can disable reindent when you type : key:

:set indentkeys-=<:>

Please edit ~/.vimrc file, and add these lines:

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

Note: autocmd comes after filetype.


You can trigger reindent by typing CTRL-F in INSERT mode, for example:

hello: world
foo: bar<C-F>

In order to get the nice 2-space YAML as the default when I hit carriage return after the colon, I added this to my .vimrc:

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

This also plays nice with the dash for the OP's expected result.

I've found https://github.com/stephpy/vim-yaml to work great. It's a vim plugin that does indentation (and syntax highlighting) of yaml files. Installing it solves the specific problem that you've asked about too.

You need to install the plugin (see the doco in the GitHub repo) and as long as your filetype=yaml it'll correct your indenting. It'll help you both

  1. as you're typing the snippet you've provided, or
  2. if you already have some yaml written, you can select it (with V for line-wise selection then use j or k to select more lines) then trigger the vim formatting with =

You can use this autocommand to make Vim properly indent YAML files (put it to your .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

Basically, for YAML file it instructs Vim to:

  • Use 2 spaces for indentation.
  • Use spaces instead of tabs.
  • Skip re-indenting lines after inserting a comment character (#) at the beginning of a line, or a colon.

You can add a comment in your YAML to tell Vim special config for this file. For example:

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

Then everyone, who use this file with a default vim, can share the file creator's configuration. It works well especially when cooperating.

Here's the augroup I have for yaml:

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

I have found a very good answer instead of updating .vimrc.

here by Ignacio Vazquez-Abrams enter image description here