Vimコマンドを使ってYAMLファイルのインデントを素早く修正したい


はじめに

レッドハットは、Ansible、OpenShift、OpenStackなど、構築や設定の際にYAML形式のファイルを使う製品を扱っています。そこで、常日頃からYAML形式のファイルの編集方法に慣れておくことが大事になります。

YAML形式のファイルを作成・修正するには、普通のテキストエディタを使います。RHEL上でのエディタとしては、vim, nano, gedit, VSCodeなどがありますが、その中でもvimを使えるようにしておいた方が良いでしょう。

vimはどのマシンでも大抵最初からインストールされています。sshでサーバーにリモートログインしたときにすぐに使うことができるというのがvimをオススメする理由です。この記事では、vimを使ったインデントの修正方法についてまとめてみたいと思います。

サンプルYAMLファイル

ここではOpenShiftで使うマニフェストファイル編集するシーンを想定してYAML編集方法について紹介します。OpenShift 4.15のStorageのドキュメントを参考に、PVC (PersistentVolumeClaim) のマニフェストファイルを編集してみましょう。

PDFからYAMLコピーするとインデントが消える!

HTMLやEPubの文書からYAML形式の文字列をコピー&ペーストするときには、オリジナルのドキュメントのインデント(部分のスペース)はそのままコピーされます。しかし、PDFのドキュメントからコピーしてエディタにペーストすると、インデントは消えてしまいます。この消えてしまったインデントを復元するというのをvimコマンドでやってみたいと思います。

PDFドキュメント上のPVC
PDFからvimにペーストしたときのPVC

インデントの修正方法

方法1: スペースキーを連打する

オリジナルのPDFと比較するとわかりますが、4行めのname: myclaimは、3行めのmetadata:の値に相当するので、インデントを深くすべきです。4行めのインデントをスペース2個分だけ深くしたいときは、以下のような操作をすれば可能です。

  1. カーソルを4行めに移動して

  2. 'i' キーを押して「挿入モード」に変更

  3. スペースキーを2回押す

この方法はスペースキーを使って素直にインデントのためのスペースを入力しています。でも、カーソル移動のための「コマンドモード」から「挿入モード」にモードを切り替えないといけません。複数の行について同じ方法でインデントを操作するには、行を移動するためにESCキーを押して「コマンドモード」に戻す必要があり、このモード切り替えに手間がかかります。

「挿入モード」でスペースキーを打つ代わりに、Ctrl-t によってインデントを深くすることができます。逆にインデントを削除するのは、Ctrl-d です。

方法2: '>>' を使う

’>>' を使うことで、「挿入モード」にモードを変更しなくてもインデントを修正することは可能です。

  1. カーソルを4行めに移動して

  2. '>>' を押す

インデントが必要な行でこれを繰り返すことでファイル全体をインデントを調整することができますが、逆にインデントを浅くするには '<<' を押します。

vimでは繰り返し同じ編集操作をするときには '.' (ドット) を使うことができます。行を変更しながら、'>>' を繰り返し実施するような場合は以下のように '>>' の代わりに '.' で済ますことができます。

1. カーソルを4行めに移動して
2. '>>' を押す
3. 'j' を押してカーソルを5行めに移動する
4. '.' を押す('>>'と同じ効果)
5. 'j' を押してカーソルを6行めに移動する
6. '.' を押す('>>'と同じ効果)
7. 以下同様

方法3: ビジュアルモードを使う

spec:より下の行(6行-11行)のブロックは、すべてインデントを深くすべきですが、これを行ごとに修正するのは手間がかかります。

vimには、複数行をビジュアルに操作する「ビジュアルモード」があります。この機能を使うと選択した範囲に対して一括してインデントを操作することが可能です。このケースでは行単位でのインデントを操作したいので「行ビジュアルモード」を使います。

「行ビジュアルモード」でインデントをまとめて深くする場合は以下のような操作になります。

  1. カーソルを6行めに移動して

  2. 'Shift+v' を押してラインビジュアルモードに入る

  3. カーソルを最後の行に移動することで、6行-11行が選択された状態になる

  4. '>' を押すことで選択された行すべての行のインデントが深くなる

行ビジュアルモードでの複数行の選択
行ビジュアルモードで’>’を押した結果

逆に、インデントを浅くするにはビジュアルモードで複数行を選択した状態にしたまま '<' を押します。

方法4: '>G' を使う

上の方法ではビジュアルモードを使いましたが、該当行の先頭にカーソルを移動した後、ファイルの末尾までの行すべてを一回の操作でシフトさせることができます。

  1. カーソルを6行めに移動して

  2. '>G' を押すと、6行-11行までインデントが深くなる。

spec:の下の行すべてのような、ファイルの末尾までの行のインデントを一度に編集するのであれば、この方法が一番簡単だと思います。
逆に、インデントを浅くするには '<G' を使います。

'>G' を押した結果

おわりに

最近「実践Vim」という本を読み始めました。かなり以前にKindleで購入していたのですが放置していたのでした。この本の最初の方に '>G' の使い方が紹介してあって、「こんな便利な機能があったのか!」と驚きました(AnsibleやOpenShiftでYAMLファイルを編集していて、ブロックのインデントを一括して深くしたいというシーンが多いですよね)。Vimの提供機能は多いのですが、とっつきにくく、欲しい機能にたどり着くまでに時間がかかります。また便利な機能が見つかったら、ここで紹介したいと思います。




この記事が気に入ったらサポートをしてみませんか?