Recuo incorreto ao editar Yaml no Vim

90

O Vim não parece reagir corretamente a um símbolo de traço em arquivos YAML, portanto, quebrando o formato.

Por exemplo, eu tenho um bloco que deve ser semelhante a este:

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

Quando termino de digitar restart exim4e digito, o service:Vim reindenta minha servicelinha final :

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

Então, claramente o Vim tenta alinhar as frases em colunas, mas não é isso que é necessário no YAML. Eu quero criar uma matriz com dois valores.

Como consertar isso?

Glueon
fonte

Respostas:

25

Instale este plugin:

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

É feito com o Ansible em mente, mas em teoria funcionará com todos os tipos de arquivos YAML. Você terá que: set filetype = ansible infelizmente, se você não estiver trabalhando com arquivos relacionados ao ansible.

K. Norbert
fonte
Eu vi este plugin - ele espera que o nome do arquivo tenha um determinado nome e / ou esteja em uma pasta específica. Os playbooks da Ansible não são os únicos arquivos que edito. É por isso que nem tentei instalar. Obrigado, irei definir yml para ter o tipo 'ansible'.
Glueon
1
uau, faz uma grande diferença, acho que embora a yamlsintaxe regular também valha a pena corrigir
akostadinov
Verdade, se você seguir esse caminho, terá que colocar # vim:ft=ansible:todos os seus arquivos não ansíveis.
Elijah Lynn
158

A fim de obter o YAML de 2 espaços agradável como o padrão quando eu pressiono o retorno de carro após os dois pontos, adicionei isto ao meu .vimrc:

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

Isso também funciona bem com o traço para o resultado esperado do OP.

Kiminoa
fonte
2
Obrigado, faz o trabalho.
Gayan Weerakutti
Bom e simples. Funciona com /etc/vim/vimrc(para configuração global) enquanto não consegui fazer o vim-ansible-yamlplug-in funcionar globalmente.
Falha no servidor de
4
Considere colocá-lo em ~ / vim / ftplugin / yaml.vim e substituir os nomes curtos por nomes longos para facilitar a leitura futura.
exic
3
@LeviNoecker sim, apenas separe-os por vírgula assimautocmd FileType yaml,yml setlocal ...
Trey Stout
2
Esta é a soma dos meus comentários acima -> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64
Elijah Lynn
18

Você pode desativar o reindent ao digitar a :chave:

:set indentkeys-=<:>

Edite o ~/.vimrcarquivo e adicione estas linhas:

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

Nota: autocmd vem depois filetype.


Você pode acionar o recuo digitando CTRL-Fno modo INSERT , por exemplo:

hello: world
    foo: bar<C-F>
kev
fonte
9

Você pode usar este comando automático para fazer o Vim recuar arquivos YAML corretamente (coloque-os em seu .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

Basicamente, para o arquivo YAML, ele instrui o Vim a:

  • Use 2 espaços para indentação.
  • Use espaços em vez de tabulações.
  • Pule as linhas de recuo após inserir um caractere de comentário ( #) no início de uma linha ou dois pontos.
Eugene Yarmash
fonte
Adicionar .yml também ajuda
Gert van den Berg
Para quê? Onde?
mr.zog,
3

Você pode adicionar um comentário em seu YAML para informar ao Vim a configuração especial para este arquivo. Por exemplo:

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

Então, todos que usam este arquivo com um vim padrão, podem compartilhar a configuração do criador do arquivo. Funciona bem, especialmente ao cooperar.

Yan QiDong
fonte
1

Aqui está o que augroupeu tenho para 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
Moshe
fonte
0

Descobri que https://github.com/stephpy/vim-yaml funciona muito bem. É um plugin vim que faz recuo (e realce de sintaxe) de arquivos yaml. Instalá-lo também resolve o problema específico sobre o qual você perguntou.

Você precisa instalar o plugin (veja o doco no repositório GitHub) e contanto que filetype=yamlele corrigirá sua indentação. Isso vai ajudar vocês dois

  1. enquanto você digita o snippet fornecido, ou
  2. se você já tem algum yaml escrito, você pode selecioná-lo (com Vpara seleção por linha, use jou kpara selecionar mais linhas) e acione a formatação vim com=
Tom Saleeba
fonte