今さらながらviについて勉強してみた

つけ麺を食べるとお腹が痛くなります。
どうも、伊藤くんです。

普段コードを書くときはVisualStudioCodeというエディタで書くことが多いのですが、CUIでAWS EC2とかいじってるときに、たまにviを使います。

ですが覚えてるコマンドなどはほとんどなく、「a」で入力モードにして、「esc」でコマンドモードにして、保存するときは「:wq」コマンドで保存する、くらいしか理解しておりませんでして。

せやかてさすがにもうちょっと使えるようにしないとなーということで、viのお勉強を少しだけしてみました。

viとは

viとは、CUI環境で使えるエディタです。EC2にsshで接続したときとかに、設定ファイルの一部を変更するときやプログラムのコードを書くときに活躍します。

viの派生にvimというものもあり、微妙に使用が違うのですが、過去に「vimで編集したらうまくいかないけどviで編集したらなぜかうまくいったんご」ってことが数回あったので、伊藤くんはいつもviを使っています。

ちなみに「ViIMproved」の略で「vim」らしいです。ええ。そうですか。

起動方法

$ vi aaa.txt

でおkです。この場合、aaa.txtが既に存在する場合はそれを開き、存在しない場合は新たにaaa.txtというファイルが作成されます。(実際は保存したタイミングで作成されるのかな?)

なんかsudoをつけて実行しないと保存とかができないケースがよくあります。よくわかりませんが毎回sudoをつけるのが無難かと。

ちなみに「$ vi -R aaa.txt」みたいな感じで「-R」オプションをつけると、読み取り専用で開きます。

3つのモード

viには3つのモードがあり、それらを適宜切り替えながら作業をしていきます。

・コマンドモード
コマンドを入力することで行の削除とかコピペとかをホイホイホイ!ってやるモードです。viを開くと、最初にこのモードから始まります。コマンドの種類は覚えきれないほど多いです。100種類以上ありそうな雰囲気です。

・入力モード
普通に文字とかを入力するモードです。コマンドモードから特定のコマンドを入力することでこのモードに切り替えられます。

・ラストラインモード
コマンドモードでは表現できないような長いコマンドを入力できるモードらしいです。文字の置換や文書の保存、viの終了などを行います。コマンドモードで「:」を入力するとこのモードに切り替わる。っていう認識であってるかな?

いろんなコマンド

ここからはそこそこ主要っぽいコマンドを書いていきます。すべてコマンドモードでの操作です。

カーソル移動系コマンド

hまたは←・・・カーソルを左に1文字移動
jまたは↓・・・カーソルを下に1文字移動
kまたは↑・・・カーソルを上に1文字移動
lまたは→・・・カーソルを右に1文字移動
^・・・現在の行の先頭へ移動
$・・・現在の行の末尾へ移動
G・・・最終行へ移動
【数字】G・・・【数字】行目へ移動
Ctrl + f・・・ファイルの末尾に向かって1画面ずつスクロール
Ctrl + b・・・ファイルの先頭に向かって1画面ずつスクロール

カーソル移動系はざっとこんな感じです。矢印キーで移動できるならh,j,k,lの存在意義はあるのでしょうか。

文字の挿入・追加(入力モードに変更)コマンド

a・・・カーソルの後ろから入力モード開始
i・・・カーソルの前から入力モード開始
o・・・カーソルの下に新しい行を追加し、そこから入力モード開始
I(大文字のi)・・・カーソル行の先頭から入力モード開始
A・・・カーソル行の最後から入力モード開始
O・・・カーソルの上に新しい行を追加し、そこから入力モード開始

正直「a」だけ覚えておけばいい気がします・・・。

削除系コマンド

x・・・カーソル上の1文字を削除
dw・・・カーソル上の1単語を削除
dd・・・カーソル行を削除
【数字】x・・・カーソルから右に【数字】文字削除
D・・・カーソルから行の最後まで削除
【数字】dd・・・カーソル行から【数字】行削除
dG・・・カーソル行から最終行まで削除
dH・・・1行目からカーソル行まで削除

「dw」、「dd」あたりは使えそうですかねえ。

保存・終了系コマンド

ZZ・・・保存して終了
以下、「:」を入力し、ラストラインモードにした状態でのコマンド
:w・・・保存
:q・・・viを終了
:q!・・・変更を破棄してviを終了
:wq・・・保存して終了
:e!・・・変更を破棄し、ファイルを再読み込み

いつも「:wq」で保存して終了してたけど、「ZZ」でもできるんですね。てかこの2つは何が違うんだろうか。

検索、コピペ系コマンド

/【文字列】・・・カーソル位置から下に向かって【文字列】を検索
?【文字列】・・・カーソル位置から上に向かって【文字列】を検索
n・・・次を検索
N・・・前を検索
yy・・・カーソル行のコピー
yw・・・単語のコピー
P(大文字)・・・カーソル行の上の行にペースト
p(小文字)・・・カーソル行の下の行にペースト

単語をコピーした場合は、pはカーソルの右、Pはカーソルの左にペーストになりました。

その他のコマンド

u・・・最後に実行した編集の取り消し(macでいう⌘+Z的な)
.(ピリオド)・・・最後に実行した編集の繰り返し
J・・・カーソル行と次の行を連結
r【文字】・・・カーソル上の1文字を【文字】に置換
cw・・・カーソルから右の単語を削除し、入力モード開始
以下、ラストラインモード
:s/【文字列1】/【文字列2】/g・・・【文字列1】を【文字列2】に置換

「u」と「.(ピリオド)」は優秀そうですねえ。「 J」とかいつ使うん・・・。

オプション(設定系)コマンド

オプションは、以下のようなものがある。
number・・・行番号を表示
ignorecase・・・検索で大文字小文字を区別しない
list・・・タブや行末文字など、普段表示されない文字を表示
showmode・・・操作モードを表示
これらを、以下のように指定する。
:set 【オプション】
解除したい場合は、以下のようにする。
:set no【オプション】

numberとかは普通に便利かもですね。showmodeは、やってみましたが見た目上変化がなく、よくわかりませんでした・・・。

解除のコマンドは、「no」と【オプション】の間に逆にスペースがないので、ご注意ください。
:set nonumber みたいな感じになります。

また、デフォルトでオプションを設定しておきたい場合は、ホームディレクト以下に「.exrc」という名前のファイルを作成し、setコマンドを記述すればいいみたいです。

ちょろっと勉強してみた結果

確かにコマンドがたくさんありますが、それらを覚えて使いこなしたところで、さすがにGUIの便利系エディタには勝てない気がしました。

ですのでやはり、今後もEC2にsshで接続した時にちょっろviを操作する程度で使っていきたいと思います。

「dw,dd,u,.(ピリオド)、検索、置換」くらいを覚えればまあまあ便利に使えるような気がしますので、それだけ覚えることにします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です