てくなべ (tekunabe)

ansible / network / automation

[Ansible] Playbook(YAML)のための vim のインデント関連設定

■ はじめに

Ansible の Playbook を書いて試すときは、普段 VSCode を使っているため、あまり vim は使っていません。ですが、vim しか使えない環境に置かれたときのために vim で Playbook (YAML) を書くときに便利そうな設定を調べました。

f:id:akira6592:20190321135658g:plain
インデント関連設定をした vim で Playbook をかく

せっかくですのでまとめておきます。


■ .vimrc の中身

今のところ、 .vimrc の中身は以下のようにしています。

set expandtab
set softtabstop=2
set shiftwidth=2
set autoindent

それぞれの設定について簡単に説明します。


set expandtab: Tab キーを押したときに Tab の代わりにスペースを入力する

省略系: set et

通常、Tab キーを押すと tab が入力されます。YAML のインデントには tab ではなくスペースを利用します。 そこで、set expandtab で、Tab キーを押したときに tab の代わりにスペースを入力されうように設定します。


set softtabstop=2: softtab(スペース)の幅をスペース2個にする

省略形: set sts

前述の set expandtab で有効にした Tab キーによるスペース入力の、スペースの数を指定します。 Playbook (YAML)としては、スペースが2個でも4個でも階層的に矛盾がなければ構わないのですが、私はいつもスペース2個なので set softtabstop=2 を設定します。


set shiftwidth=2: インデントレベルの変更時のスペースを2個にする

省略形: set sw=2

>><< などによるインデントレベルの変更時に使うスペースの数です。softtabstop の数と合わせて、set shiftwidth=2を設定します。

f:id:akira6592:20190321135112g:plain
インデントレベルの調整


set autoindent: 自動でインデントする

省略系: set ai

インデントされた状態の行をにカーソルがある状態で改行したときに、次の行で同じインデント位置を保つようにする設定です。

f:id:akira6592:20190321135042g:plain
自動インデント

この設定は少し注意が必要です。手入力時は便利ですが、すでにインデントされたテキストをコピペすると余計なインデントが入ってしまいます。

例えば以下のインデントされたテキストの場合。

- hosts: eos
  gather_facts: no

  tasks:
    - name: test
      eos_command:
        commands:
          - show running-config
      register: result

ペーストすると以下のように余計なインデントが入ってしまいます。これは正しいPlyabookではありません。

- hosts: eos
  gather_facts: no

    tasks:
        - name: test
              eos_command:
                      commands:
                                - show running-config
                                      register: result                                                             

対策は以下のとおりです。(ほかにもあるかもしれません。)

対策1. 自動インデントが不要なときだけ無効(set noautoindent / set noai)に設定する。 対策3. set paste でペーストモードにしてからペーストする。 対策3. そもそも普段は自動インデント無効にしておき、必要な時だけ有効(set autoindent / set ni)に設定する


■ まとめ

vim で Playbook (YAML)を書くときに便利そうな設定をまとめました。YAML では、インデントの数が情報構造に強く関わっているので、特にインデント周りの設定を好みに設定しておくと良いと思いました。

参考

参考にさせていただきました。ありがとうございます。 hatakazu.hatenablog.com

Ansible 公式ドキュメントでは、Ansible vim というプラグインが紹介されています。

docs.ansible.com