NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    viと、GUIエディタとの使い分け

    本記事は  エディタウィーク  4日目の記事です。
    👩‍🏫  3日目  ▶▶ 本記事  ▶▶  5日目   👨‍🏫

    こんにちは、小山です。 料理にハマり、旬の食材を美味しくいただくことに余念がない今日この頃です。

    今回は、運用作業やトラブルシューティング時によく使うvi(コマンド)について、
    実際に経験した事例を2つ交えて紹介したいと思います。

    想定読者

    vi[vim]初心者
    GUIエディタが使えない作業環境でちょっと楽したいエンジニア
    駆け出しエンジニア

    以下特別説明が必要でない限り、vi[vim]はviと省略させていただきます。

    はじめに viコマンドでファイル操作

    基本は vi ファイル名 でファイル編集ができます。 viにはインサートモード、コマンドモードという2つのモードがあり、 起動直後はコマンドモードという状態で、文字の入力以外の操作実施をするモードです(ファイル内の文字の検索や、コピーペースト等)。
    インサートモードはファイルに文字の入力をするモードです。
    インサートモードとコマンドモードの切り替えは以下で実行します。とっても簡単。
    コマンドモード→インサートモードにしたい時、キーボードの[i]を一回押します。
    インサートモード→コマンドモードにしたい時、キーボードの[ESC]キーを一回押します。

    ケース1 設定ファイル書き換えたらアプリが起動しなかった

    「システムのメンテナンスモード切替等でhoge.confファイルを操作したらアプリが立ち上がらない!!」
    こんな時はまずエラーログと設定ファイルの確認です。
    「設定ファイルが長くて、編集箇所までスクロールするのめんどくさい!!」
    そんな時は、検索機能を活用して目当ての箇所まで一気に移動しましょう。

    コマンド 機能
    /検索文字列 文字列を↓方向に検索
    ?検索文字列 文字列を↑方向に検索
    n ↑方向に次を検索
    N ↓方向に次を検索

    viは現在のファイル内のカーソル位置から検索を実施するため、 カーソル位置を起点としてファイルの1行目に向かっていくのが上方向で 最終行に向かっていくのが下方向です。

    vi hoge.conf #設定ファイルの確認
    /huga  #ファイル内の文字列hugaがある箇所を検索

    この時、hugaがファイル内に複数ある場合に[n]もしくは[N]で次の一致箇所へ移動します。 設定ファイルの行がわかっている場合は、

    行番号G

    で移動するのが早いと思います。 余談ですが、筆者は5Gで早く移動できると覚えました。

    また、編集前の設定ファイルをバックアップで持っている場合は

    vi -o file1 file2

    -o オプションを使うことで同時にファイルを開くことができます。
    (単純な比較をしたいだけならdiffコマンドや、WinMergeを使用しても良いかもしれません)

    ケース2 yamlファイルの整形間違ってた

    yamlファイルはDocker ComposeやAnsible、CloudFormationなどで良く使用されますが、
    インデントの位置やスペース間違いで動かなくなるとても繊細な特徴を持っています。

    Tab文字を許容していないため、見た目が同じでも動かない事もあり かなりトラブルシューティングが厄介です。

    以下の2つのファイルを準備して実際にviでトラブルシューティングしてみます。
    インデントの位置が正しく設定されたtest.ymlファイルと、誤った設定となっているtest-broken.ymlファイルです。

    #test.yml
    services:
      app:
        image: nginx
        ports:
          - "80:80"
        environment:
          - DEBUG=true
      db:
        image: postgres
        volumes:
          - db-data:/var/lib/postgresql/data
    
    volumes:
      db-data:
    
    # test-broken.yml
    services:
      app:
       image: nginx      
        ports:
          - "80:80"
        environment:
          - DEBUG=true
      db:
        image: postgres
        volumes:
         - db-data:/var/lib/postgresql/data   
    
    volumes:
      db-data:
    

    この状態ではぱっと見どこに誤りがあるのかわかりませんね。
    というかどちらも同じように見えます。

    今回は正しいファイル(test.ymlファイル)があるので2つのファイルを比較してみましょう。
    (ケース1で説明したように、diffコマンドでも問題ありません)

    vi -d test.yml test-broken.yml

    以下コマンド実行結果です。

    2つのファイルの比較

    このように、インデントの位置が違う箇所が赤く表示されました。

    ちなみに、diffコマンドを実行すると下記のような結果となります。 違いがある箇所が出力されますが、viの方が見やすいですね。

    diff test.yml test-broken.yml

    diffコマンド実行結果、個人的にはviコマンドの方が見やすいと思います

    今回はお手本ファイルがありましたが、開発時はお手本なしでトラブルシューティングをすることも多くあります。 その場合、 :set list コマンドを実行することで見えない文字を可視化できます。
    (:set はviの設定をするコマンドで、今回はlistモードに変更しています)
    改行位置を視認することによって余計なスペースがある箇所が確認できます。

    viのコマンドラインモードで

    :set list 

    と実行すると見えない文字が可視化されます。

    見えない文字(改行)を可視化

    今回のブログでは使用しませんが、運用作業時は

    :set number

    で行番号を行頭に表示して作業することが多いです。 実稼働環境での作業で、想定箇所と異なった場所を操作して事故が起こる。なんてことが起こりえないように、またトラブルが発生した時に操作箇所を迅速にエスカレーションするためにもおすすめの設定です。

    GUIエディタと比べてのおすすめポイントとGUIとの使い分け

    GUIエディタが多く使われるこのご時世にvi[vim]を紹介する理由は、 環境構築が簡単(Linuxなら大体標準搭載)であること、SSHやSSM越しの操作でも使用できるため実際の運用シーンで未だ活用する場面が多いためです。
    また、viは操作がキーボード上で完結するため初期学習コストの高ささえ乗り越えてしまえばとても楽に操作できます。

    GUIエディタは開発作業時にはIDE補完やLint、 ドキュメント・図表作成時にはMarkdownやdraw.io等との連携などviが持ちえない機能を多く持っています。 そのため、どちらかを選ぶのではなく両方の良いとこどりをしていくことが大事です。

    筆者はローカルでの開発時やドキュメント作成時はVS Code(プライベートではCursor)を使用し、 本番環境での作業やタイポ等の簡単な修正はviで済ませています。

    最後に

    世の中にはvimmerなる方がいらっしゃると伝え聞きます。 お手柔らかなレビューお待ちしております。

    次回はCursorを用いて開発経験のないインフラエンジニアがアプリ開発をした話をしたいと思います。

    執筆者:小山
    AWSメインのクラウドエンジニア
    旅と海が好きなバックパッカー