Vimオプションを設定して認定試験中のYAML編集を楽にしたい
はじめに
この記事ではYAML編集を楽にしてくれるvimオプション設定について紹介します。管理者系のレッドハット認定試験を受験をするとき、YAMLのファイルを編集する必要があることが多いです。YAMLはスペースでインデントを整える必要があり、その入力には細心の注意が必要です。
YAMLの編集でインデントのミスをすると、構文解析エラーになったり、エラーにならなくとも誤動作につながったりします。そうなると、編集ミスのために、トラブルシュートをしなければならなくなり、余計な時間を使ってしまいます。試験中にはインデントの設定ミスは最小にしたいものです。
自分の経験上、vimでのYAML編集にごだわるのは試験対策としてすごく効果的です。でも、試験環境ではネットにアクセスできないので、vimの設定内容は暗記しておく必要があり、あまり凝った設定はできません。この記事の内容は試験対策限定ということでご理解ください。
vimのインデント操作については次の記事でも紹介しているので合わせてご覧ください。
お気に入りの呪文
私の机の前の壁にはホワイトボードがあって、そこには以下の呪文が書かれた紙が貼ってあります。これは、vimで設定するYAML編集を楽にするためのvimオプションですが、なかなか覚えられないのでよく見える場所に貼っているのです。
vim :set sts=2 sw=2 et ai
このvimオプションには次のような効果があります。
Tabキーを入力すると、自動的にスペース2個分のインデントが入る。
改行すると前の行のインデントと同じ位置にカーソルが移動する。
YAMLのインデントはスペースで入力する必要がありますが、間違ってTabキーを入力してしまうと、YAMLの解釈時にエラーになってしまいます。しかし、Tabとスペースは見た目上では区別がつかないので非常にやっかいです。
この呪文は私が発明したものではありません。Red Hat Learning Subscription (RHLS)でOpenShiftのトレーニングビデオを見ていたときのことです。外国人講師の方がYAMLを編集するときにこれらのオプションをvimのコマンドモードで1行でササッと設定していたのを見ました。とてもカッコよく見えたので真似することにしました。
呪文の内容を解読する
vimではコロン(:)を入力するとコマンドモードになり、そこでvimのオプションを設定することができます。例えば :set number と設定すると行番号が表示されます。上の呪文は以下の独立したオプションを一行で設定していたのです。
sts: soft tab stop (Tabキーを押したときに挿入されるスペースの数)
sw: shift width (インデントのスペースの数)
et: expand tab (挿入モードのときにTabキーをスペースに置き換える)
ai: auto indent (改行を入力したときに自動的にインデントを設定)
~/.vimrcに呪文を設定する
vimでYAMLファイルを開くたびに毎回この呪文を入力するのは面倒です。vimでは~/.vimrcというファイルにオプションを書いておくことができますので、次のように設定することができます。こうすることでYAMLファイルの編集がすごく楽になりますし、間違ってインデントにTabが含まれることもなくなります。

このような短縮形の名前ではとても覚えられないという方は、それぞれのオプションの本来の名前で覚えた方がよいかもしれません。

呪文を忘れたらどうするか
試験環境でvimオプションをど忘れてしまった場合、vimのコマンドモードから該当オプションを検索することが可能です。思いつく限り、3つの方法があります。試験中は~/.vimrcの設定に多くの時間をかけられないので、少し試してみてうまくいかなければ清くあきらめましょう。
(1) コマンド入力でTab補完を使う
コマンド入力時に :set の次にコマンドの最初の何文字かを入力してTabキーを押すと候補を出力してくれます。オプション名を忘れたときには、これで大抵の場合はなんとかなるでしょう。
例えば、softtabstopを探していたとき、:set stの次にTabキーを入力します。

そうすると、stに相当する複数のオプションの候補が出力されるので、softtabstopを探すことができます。

(2) :help option-listからオプションを探す
vimのコマンドモードで :help option-list を実行すると、以下のようなコンパクトなオプションリストが表示されます。この中から"tab"とか"stop"で検索すればsofttabstopが見つかるでしょう。

(3) :optionsからインデント関連オプションを表示する
まったくオプションを思い出せない場合、インデント関連のオプションの一覧を開いて探すという方法もあります。コマンドモードで :options を実行すると、オプションの種類がリストされますので、14 tabs and indenting にカーソルを合わせてEnterキーを押してください。

すると以下のようなインデント関連のコマンドのリストが表示されますので、上から眺めていくと、shiftwidthやsofttabstopのようなオプションが見つかります。

カーソル位置を表示させる
長いYAMLファイルを編集しているとき、インデントの位置合わせが難しいことがあります。そのような場合、:set cursorcolumn (短縮形 cuc) も~/.vimrcに設定しておくと目視でYAMLのインデントの位置を確認しやすいです。vimのビジュアルモードで、ブロックをまとめてペーストや移動をするときに便利です。

まとめ
現状、私がOpenShiftやAnsibleの認定試験を受験するときに設定する~/.vimrcは次のようにしています。ご参考まで。
set softtabstop=2
set shiftwidth=2
set expandtab
set autoindent
set cursorcolumn