Indentasi salah saat mengedit Yaml di Vim

91

Vim tampaknya tidak bereaksi dengan benar pada simbol tanda hubung dalam file YAML karena itu merusak format.

Misalnya saya memiliki blok yang akan terlihat seperti ini:

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

Ketika saya selesai mengetik restart exim4dan mengetik service:Vim kembali servicebaris terakhir saya :

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

Jadi jelas Vim mencoba menyelaraskan kalimat berdasarkan kolom tetapi bukan itu yang dibutuhkan di YAML. Saya ingin membuat array dengan dua nilai.

Bagaimana cara memperbaikinya?

Glueon
sumber

Jawaban:

25

Instal plugin ini:

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

Itu dibuat dengan mempertimbangkan Ansible, tetapi secara teori ini akan bekerja dengan semua jenis file YAML. Sayangnya, Anda harus: menyetel filetype = ansible, jika Anda tidak bekerja dengan file terkait yang memungkinkan.

K. Norbert
sumber
Saya melihat plugin ini - ia mengharapkan nama file memiliki nama tertentu dan / atau berada di folder tertentu. Playbook yang mungkin bukan satu-satunya file yang saya edit. Itu sebabnya saya bahkan tidak mencoba menginstalnya. Terima kasih, saya akan menyetel yml agar memiliki tipe 'ansible'.
Glueon
1
wow, membuat perbedaan besar, saya pikir meskipun yamlsintaks biasa juga layak diperbaiki
akostadinov
Sebenarnya, jika Anda mengikuti rute ini, Anda harus memasukkan # vim:ft=ansible:semua file Anda yang tidak mungkin.
Elijah Lynn
163

Untuk mendapatkan YAML 2 ruang yang bagus sebagai default ketika saya menekan carriage return setelah titik dua, saya menambahkan ini ke saya .vimrc:

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

Ini juga bermain bagus dengan tanda hubung untuk hasil yang diharapkan OP.

kiminoa
sumber
2
Terima kasih, itu berhasil.
Gayan Weerakutti
4
Pertimbangkan untuk memasukkannya ke dalam ~ / vim / ftplugin / yaml.vim dan mengganti nama pendek dengan nama panjang agar terbaca di masa mendatang.
exic
3
@LeviNoecker ya hanya koma pisahkan mereka seperti iniautocmd FileType yaml,yml setlocal ...
Trey Stout
2
Agar ini berhasil, saya harus memiliki yang filetype plugin indent onpertama. Juga sentuhan yang bagus harus dimiliki syntax onsebelum itu.
Elijah Lynn
4
Ini adalah jumlah dari komentar saya di atas -> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64
Elijah Lynn
20

Anda dapat menonaktifkan reindent saat Anda mengetik :kunci:

:set indentkeys-=<:>

Harap edit ~/.vimrcfile, dan tambahkan baris berikut:

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

Catatan: autocmd datang setelah filetype.


Anda dapat memicu pengindentasian ulang dengan mengetik CTRL-Fdalam mode INSERT , misalnya:

hello: world
    foo: bar<C-F>
kev
sumber
10

Anda dapat menggunakan perintah otomatis ini untuk membuat Vim mengindentasi file YAML dengan benar (taruh ke Anda .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

Pada dasarnya, untuk file YAML itu menginstruksikan Vim untuk:

  • Gunakan 2 spasi untuk indentasi.
  • Gunakan spasi sebagai ganti tab.
  • Lewati baris yang mengindentasi ulang setelah menyisipkan karakter komentar ( #) di awal baris, atau titik dua.
Eugene Yarmash
sumber
Menambahkan .yml juga membantu
Gert van den Berg
Untuk apa? Dimana?
mr.zog
3

Anda dapat menambahkan komentar di YAML Anda untuk memberi tahu konfigurasi khusus Vim untuk file ini. Sebagai contoh:

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

Kemudian setiap orang, yang menggunakan file ini dengan vim default, dapat membagikan konfigurasi pembuat file. Ini bekerja dengan baik terutama saat bekerja sama.

Yan QiDong
sumber
1

Inilah yang augroupsaya miliki untuk 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
sumber
0

Saya telah menemukan https://github.com/stephpy/vim-yaml berfungsi dengan baik. Ini adalah plugin vim yang melakukan indentasi (dan penyorotan sintaks) dari file yaml. Menginstalnya menyelesaikan masalah spesifik yang Anda tanyakan juga.

Anda perlu menginstal plugin (lihat dokumen di repo GitHub) dan selama filetype=yamlitu akan memperbaiki indentasi Anda. Ini akan membantu kalian berdua

  1. saat Anda mengetik cuplikan yang Anda berikan, atau
  2. jika Anda sudah memiliki beberapa yaml tertulis, Anda dapat memilihnya (dengan Vuntuk pemilihan garis-bijaksana kemudian gunakan jatau kuntuk memilih lebih banyak baris) kemudian memicu pemformatan vim dengan=
Tom Saleeba
sumber