Неправильный отступ при редактировании Yaml в Vim

91

Кажется, что Vim неправильно реагирует на символ тире в файлах YAML, что нарушает формат.

Например, у меня есть блок, который должен выглядеть так:

  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. Я хочу создать массив с двумя значениями.

Как это исправить?

Глюон
источник

Ответы:

25

Установите этот плагин:

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

Он сделан с учетом Ansible, но теоретически он будет работать со всеми типами файлов YAML. К сожалению, вам придется: установить filetype = ansible, если вы не работаете с файлами, связанными с ansible.

К. Норберт
источник
Я видел этот плагин - он ожидает, что имя файла будет иметь определенное имя и / или находиться в определенной папке. Я редактирую не только файлы Ansible playbook. Вот почему я даже не пытался его установить. Спасибо, я настрою yml на тип ansible.
Glueon
1
вау, большая разница, я думаю, хотя обычный yamlсинтаксис тоже стоит исправить
Акостадинов
По правде говоря, если вы пойдете по этому пути, вам придется вставить # vim:ft=ansible:все свои файлы, которые не являются доступными.
Элайджа Линн
163

Чтобы получить красивый YAML с двумя пробелами по умолчанию, когда я нажимаю возврат каретки после двоеточия, я добавил это в свой .vimrc:

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

Это также хорошо сочетается с чертой ожидаемого результата OP.

киминоа
источник
2
Спасибо, работает.
Gayan Weerakutti
4
Подумайте о том, чтобы поместить его в ~ / vim / ftplugin / yaml.vim и заменить короткие имена длинными именами для удобства чтения в будущем.
exic
3
@LeviNoecker, да, просто разделите их запятыми вот такautocmd FileType yaml,yml setlocal ...
Trey Stout
2
Чтобы это сработало, мне нужно было filetype plugin indent onсначала. Также неплохо иметь syntax onперед этим.
Элайджа Линн
4
Это сумма моих комментариев выше -> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64
Элайджа Линн
20

Вы можете отключить повторный переход при вводе :ключа:

:set indentkeys-=<:>

Отредактируйте ~/.vimrcфайл и добавьте эти строки:

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

Примечание: autocmd идет после filetype.


Вы можете активировать повторный переход, набрав CTRL-Fв режиме INSERT , например:

hello: world
    foo: bar<C-F>
кев
источник
10

Вы можете использовать эту автокоманду, чтобы Vim правильно делал отступ для файлов YAML (поместите его в свои .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

По сути, для файла YAML он указывает Vim:

  • Используйте 2 пробела для отступа.
  • Используйте пробелы вместо табуляции.
  • Пропускайте изменение отступа строк после вставки символа комментария ( #) в начало строки или двоеточия.
Евгений Ярмаш
источник
Добавление .yml также помогает
Герт ван ден Берг
К чему? Куда?
mr.zog 02
3

Вы можете добавить комментарий в свой YAML, чтобы сообщить Vim о специальной конфигурации для этого файла. Например:

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

Затем каждый, кто использует этот файл с vim по умолчанию, может поделиться конфигурацией создателя файла. Это хорошо работает, особенно при сотрудничестве.

Ян Цидун
источник
1

Вот что у augroupменя есть для 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
Моше
источник
0

Я обнаружил, что https://github.com/stephpy/vim-yaml отлично работает. Это плагин vim, который выполняет отступы (и подсветку синтаксиса) файлов yaml. Его установка решает и конкретную проблему, о которой вы спрашивали.

Вам необходимо установить плагин (см. Документацию в репозитории GitHub), и пока filetype=yamlон исправит ваш отступ. Это поможет вам обоим

  1. когда вы набираете предоставленный фрагмент, или
  2. если у вас уже есть написанный yaml, вы можете выбрать его (с Vпомощью для выбора по строкам, затем используйте jили, kчтобы выбрать больше строк), а затем запустить форматирование vim с помощью=
Том Салиба
источник