Mauvaise indentation lors de l'édition de Yaml dans Vim

90

Vim ne semble pas réagir correctement à un symbole de tiret dans les fichiers YAML, cassant ainsi le format.

Par exemple, j'ai un bloc qui devrait ressembler à ceci:

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

Quand j'ai fini de taper restart exim4et de taper service:Vim réindente ma dernière serviceligne:

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

Il est donc clair que Vim essaie d'aligner les phrases par colonne, mais ce n'est pas ce qui est nécessaire dans YAML. Je veux créer un tableau avec deux valeurs.

Comment y remédier?

Glueon
la source

Réponses:

25

Installez ce plugin:

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

Il est conçu avec Ansible à l'esprit, mais en théorie, il fonctionnera avec toutes sortes de fichiers YAML. Vous devrez: set filetype = ansible malheureusement, si vous ne travaillez pas avec des fichiers liés ansible.

K. Norbert
la source
J'ai vu ce plugin - il s'attend à ce que le nom de fichier ait un certain nom et / ou soit dans un dossier spécifique. Les playbooks Ansible ne sont pas les seuls fichiers que je modifie. C'est pourquoi je n'ai même pas essayé de l'installer. Merci, je vais définir yml pour avoir le type «ansible».
Glueon
1
wow, fait une grande différence, je pense que la yamlsyntaxe régulière mérite également d'être
corrigée
En vérité, si vous # vim:ft=ansible:suivez cette voie, vous devez mettre tous vos fichiers non ansibles.
Elijah Lynn
159

Afin d'obtenir le joli YAML à 2 espaces par défaut lorsque je frappe le retour chariot après les deux points, j'ai ajouté ceci à mon .vimrc:

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

Cela joue également bien avec le tableau de bord pour le résultat attendu de l'OP.

Kiminoa
la source
2
Merci, il fait le travail.
Gayan Weerakutti
Sympa et simple. Fonctionne avec /etc/vim/vimrc(pour la configuration globale) alors que je ne pouvais pas faire fonctionner le vim-ansible-yamlplugin globalement.
Erreur de serveur
4
Pensez à le mettre dans ~ / vim / ftplugin / yaml.vim et à remplacer les noms courts par des noms longs pour une lisibilité future.
exic
3
@LeviNoecker oui, séparez-les par une virgule comme çaautocmd FileType yaml,yml setlocal ...
Trey Stout
2
C'est la somme de mes commentaires ci-dessus -> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64
Elijah Lynn
18

Vous pouvez désactiver la réindentation lorsque vous tapez la :clé:

:set indentkeys-=<:>

Veuillez modifier le ~/.vimrcfichier et ajouter ces lignes:

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

Remarque: autocmd vient après filetype.


Vous pouvez déclencher la réindentation en tapant CTRL-Fen mode INSERT , par exemple:

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

Vous pouvez utiliser cette autocommande pour que Vim indente correctement les fichiers YAML (placez-le dans votre .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

Fondamentalement, pour le fichier YAML, il demande à Vim de:

  • Utilisez 2 espaces pour l'indentation.
  • Utilisez des espaces plutôt que des tabulations.
  • Ignorez la ré-indentation des lignes après avoir inséré un caractère de commentaire ( #) au début d'une ligne ou un signe deux-points.
Eugène Yarmash
la source
L'ajout de .yml aide également
Gert van den Berg
À quoi? Où?
mr.zog le
3

Vous pouvez ajouter un commentaire dans votre YAML pour indiquer la configuration spéciale de Vim pour ce fichier. Par exemple:

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

Ensuite, tout le monde, qui utilise ce fichier avec un vim par défaut, peut partager la configuration du créateur du fichier. Cela fonctionne bien surtout en coopération.

Yan QiDong
la source
1

Voici le que augroupj'ai pour 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
la source
0

J'ai trouvé que https://github.com/stephpy/vim-yaml fonctionnait très bien. C'est un plugin vim qui effectue l'indentation (et la coloration syntaxique) des fichiers yaml. L'installer résout également le problème spécifique que vous avez posé.

Vous devez installer le plugin (voir le doco dans le repo GitHub) et tant filetype=yamlqu'il corrigera votre indentation. Cela vous aidera tous les deux

  1. lorsque vous saisissez l'extrait que vous avez fourni, ou
  2. si vous avez déjà écrit du yaml, vous pouvez le sélectionner (avec Vpour la sélection par ligne puis utiliser jou kpour sélectionner plus de lignes) puis déclencher le formatage de vim avec=
Tom Saleeba
la source