yu nkt’s blog

nkty blog

I'm an enterprise software and system architecture. This site dedicates sharing knowledge and know-how about system architecture with me and readers.

vimでyamlのオートインデントを設定

Kubernetesyamlなど、最近はVimyaml (yml)ファイルを記述する機会が増えました。 ただ、Vimのデフォルトのオートインデントだと、yamlファイルはかなり扱いにくいと思います。 今回は、Vimで快適にyamlファイルを編集するための設定を書きます。

最終形だけ欲しい場合は、他の設定も含まれていますが、こちらをご覧ください。

github.com

プラグイン

まず、プラグインをインストールします。 私はNeoBundleを利用しているため、.vimrcの、NeoBundleプラグインを指定する場所に、このように書きます。

NeoBundle 'chase/vim-ansible-yaml'

chase/vim-ansible-yamlプラグインは、filetypeがansibleのファイルを対象に、yamlファイルのオートインデントを正しく(多くの人の思い通りに)するプラグインです。

スペース数

次に、インデントのスペース数を設定しましょう。 私は、普段は4なのですが、yamlファイルは2であることが多いので、拡張子に合わせてこのように記載します。

" Indent width
if has("autocmd")
  "ファイルタイプの検索を有効にする
  filetype plugin on
  "ファイルタイプに合わせたインデントを利用
  filetype indent on
  "sw=softtabstop, sts=shiftwidth, ts=tabstop, et=expandtabの略
  autocmd FileType c           setlocal sw=4 sts=4 ts=4 et
  autocmd FileType html        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType ruby        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType js          setlocal sw=4 sts=4 ts=4 et
  autocmd FileType zsh         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType python      setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scala       setlocal sw=4 sts=4 ts=4 et
  autocmd FileType json        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType yml        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType yaml        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType html        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType css         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scss        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType sass        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType javascript  setlocal sw=4 sts=4 ts=4 et
endif

ポイントは、ymlとyamlの行です。

空行の後の行はインデントをクリア

空行があるというのは、複数のyamlファイルを書くときなどだと思います。 そのため、空行があったら、インデントをリセットして欲しいと思います。 その設定は、以下のようにかけば良いです。 これは、chase/vim-ansible-yamlプラグインのオプション設定です。

let g:ansible_options = {'ignore_blank_lines': 0}

yaml/ymlファイルをansibleファイルと見なす

再度書きますが、chase/vim-ansible-yamlプラグインは、filetypeがansibleのファイルを対象に、yamlファイルのオートインデントを正しく(多くの人の思い通りに)するプラグインです。 ですので、普通にyamlファイルやymlファイルを開いただけでは、filetypeがyamlとなっているため、このプラグインが機能しません。

そこで、ファイルタイプをansibleと見なすための設定をします。

vim ~/.vim/filetype.vim

ここに、以下のように記載します。

augroup filetypedetect
  au BufRead,BufNewFile *.yaml setfiletype ansible
  au BufRead,BufNewFile *.yml  setfiletype ansible
augroup END

これで、yamlファイルとyamlファイルが、ansibleと見なされるようになります。

おわりに

これで、yamlファイルとymlファイルが快適に作成出来るようになると思います。 具体的には、

apiVersion: apps/v1

と書いた後に、改行をしたら、もともとは勝手にインデントが追加されていたと思いますが、インデントなしで次の行が書けます。

また、元々の設定では、

metadata: 
  name

このnameの後に、コロンを入力したら、自動的にインデントが上がってしまう現象などもあると思いますが、それもなくなります。

補足

ちなみに、Vimでは、行のインデントを上げる(1つ左にする)のは、Ctrl+t、インデントを下げるのはCtrl+d、です。 Vimを記述しているなら、これは覚えておくと便利だと思います。