Vimコマンド習得のすゝめ

本投稿は TECOTEC Advent Calendar 2022 の18日目の記事です。

こんにちは、決済認証システム開発事業部の下鵜瀬です。

今回は、Vimコマンドのすゝめということで記事を書きます。

Vimコマンドというと、例えば「hjklキーで上下左右に移動する」といった初見の人には癖が強過ぎるあれのことですね。

それゆえ、「早々に使うのを諦めました。」という人も少なくないのですが、使いこなせるようになれば、キーボードの端に位置している「BackSpaceキー」や「十字キー」を使わずにファイルの編集を行えるようになります。

また、IDEをVimキーバインドにしてくれる素晴らしいプラグインも存在しており、IDE上でのコーディングが爆速になるメリットもあるので、是非習得されることをお勧めします。(IDE標準のショートカットも非常に優秀なので、ダブルで利用すれば最強です)

もし興味があれば、Vimコマンドをゲーム感覚で練習できるサイトもあるので、挑戦してみてください。 vim-adventures.com

【入門編】必須コマンドを覚える

まずは、何から覚えればよいか分からない人のために「viエディタ*1」を触るための必須コマンドを入門レベルとして紹介します。

コマンド 説明
i 入力モードに切り替え
[esc] コマンドモードに切り替え
:w 変更を保存
:q 変更が無ければファイルを閉じる
:wq 変更を保存してファイルを閉じる
:q! 保存されていない変更を破棄してファイルを強制的に閉じる| 

初期はコマンドモードで、i を押すと画面左下が「-- 挿入 --」(入力モード)に切り替わります。

「入力モード」にすることで普段通りのキー操作が可能なのでとりあえず凌げますが、爆速には程遠いので次のステップに行きましょう。

【基本編】コーディングで使えるレベルにする

続いて、基本編です。

若干の煩わしさはあるものの、「BackSpaceキーや十字キーを使うことなく快適に操作する」が実現できます。

コマンド 説明 操作例
h カーソルを左に移動 -
j カーソルを下に移動 -
k カーソルを上に移動 -
l カーソルを右に移動 -
v ビジュアルモード v → l → l → l ... で、右方向にマウスで範囲選択するのと同じ
y 選択範囲をコピー v → h,j,k,l で範囲選択後に y でコピー
yy 行全体をコピー -
p コピーした範囲をペースト -
a カーソルを1つ右に移動して入力モードに切り替え ※なお、カーソル位置に文字を入力したい場合は i
x カーソルの右の文字を1文字削除 ※Windowsのdeleteボタンと同じ動き
d 選択範囲を削除 -
c 選択範囲を削除して入力モードに切り替え -
dd 行全体を削除 -
u 操作を1つ戻る -
0(ゼロ) カーソルがある行の先頭に移動 -
^ カーソルがある行の先頭文字に移動 -
$ カーソルがある行の末尾に移動 -
A カーソルがある行の末尾に移動して入力モード -
o カーソルがある行の下に改行を追加して入力モードに切り替え o → 文字入力 でカーソルがある行の次の行に入力
gg ファイルの先頭に移動 -
G ファイルの末尾に移動 -

例として、以下の1~4の操作を連続でやってみます。

どのコマンドをいつ使用しているかは、画面右下の表示で確認できます。

※ペーストの時だけうまく表示されませんでした。


  1. yy で1行コピー

  2. pでペースト

  3. dd で1行削除

  4. gg でファイルの先頭に移動


そうですね、分かります。一気に覚えるコマンドが増えました。

最初は「上下左右の移動」だけで挫けそうになり、「入力モード」に切り替えて「BackSpaceキー」や「十字キー」を使いたくなります。 ただ、そこをグッと我慢して「コマンドモード」でいる時間を長くすることが習得への近道だと考えています。

基本レベルのコマンドをマスターすれば使いこなせている感が出てくるので、コマンド操作が一気に楽しくなると思います。

【応用編】コーディングを爆速にする

基本編をマスターしたら、いよいよ爆速にしていきます。

ポイントは、応用編のコマンドを「意識して使うこと」です。

何故なら、基本編のコマンドを組み合わせるだけでも十分なスピードでコーディングが出来てしまうためであり、いかに応用編のコマンドの使用頻度を高められるかが大切だと考えているからです。

※選定基準は「基本編のコマンドである程度代用できるもの」としていますので、Windowsの場合「Shift」や「Ctrl」を利用するコマンドが多めです。

コマンド 説明 操作例
w ワード単位で右に移動 -
b ワード単位で左に移動 -
U カーソルがある行の全変更を取り消し -
O カーソルがある行の上に改行を追加して入力モードに切り替え ※下に改行を追加する場合は o
J カーソルがある行とその下の行を連結 -
cc 行全体を削除して入力モードに切り替え -
C カーソル位置より右を全削除して入力モードに切り替え -
D カーソル位置より右を全削除 -
r 任意文字に変換 r → {任意文字}
R 右方向に連続で変換(rコマンドの連続バージョン) R → {任意文字}
[数字]G 指定した[数字]の行にジャンプ -
Ctrl + v 矩形ビジュアルモード(開始位置からカーソルを移動させた位置まで矩形に範囲選択 Ctrl + v → j → j →... で下方向に同列を範囲選択
Ctrl + a 数字をインクリメント -
Ctrl + x 数字をデクリメント -

例として、別々の変数で定義された文字列を結合する操作をやってみます。(基本編で紹介したコマンドもがんがん使います。)


  1. 8G で8行目に移動

  2. $ で行末に移動し、不要な文字列を削除

  3. ^ で連結する行の先頭に移動し、Ctrl + v で短径ビジュアルモードに切り替えて削除範囲を選択

  4. c で削除して結合演算子(.)に一括編集

  5. J で行を結合


これだけで完璧かと言うともちろんそうではないですが、「キーボード上の指の移動や、キーを押下する回数を減らせる」という意味でコーディングが格段に楽になります。

【番外編】コマンドをカスタマイズしてみる

ここまで標準のコマンドを紹介してきましたが、自分なりにカスタマイズすることも可能です。

viエディター上でカスタムコマンドを使用したい場合、.vimrc というファイルにカスタマイズの内容を記載します。

一部ですが、私の .vimrc の中身を紹介します。

※若干無駄な設定をしているかもしれずお恥ずかしいですが、紹介のために思い切って大公開しています。

# ~/.vimrc

nmap <Esc><Esc> :nohlsearch<CR><Esc>

nnoremap q :E<Enter>
nnoremap <F3> :<C-u>tab stj <C-R>=expand('<cword>')<CR><CR>
nnoremap <C-]> g<C-]>

vnoremap > >gv
vnoremap < <gv

inoremap {<Enter> {}     # 入力モードの時、{ → Enter で {} に自動保管
inoremap [<Enter> []     # 省略
inoremap (<Enter> ()     # 省略

inoremap <C-e> <Esc>$a   # 入力モードの時、Ctrl + e でカーソル行の末尾に移動
inoremap <C-a> <Esc>^a

noremap <C-e> <Esc>$     # コマンドモードの時、Ctrl + e でカーソル行の末尾に移動
noremap <C-a> <Esc>^

# ★ここから下はおすすめ
 
inoremap <c-h> <Left>     # Ctrl + h で、入力モード中に左に移動
inoremap <c-j> <Down>   # 省略
inoremap <c-k> <Up>      # 省略
inoremap <c-l> <Right>   # 省略

inoremap jj <Esc>    # jj を Esc(コマンドモードに切り替え) にマッピング

noremap <c-j> 5j    # Ctrl + j で5行飛ばしで下に移動 
noremap <c-k> 5k

特におすすめなのは、inoremap jj <Esc> です。

なぜなら、モード切替で頻繁に使う「Escキー」 がキーボードの一番左上にあるので 指の移動が地味にめんどくさいから、です。

また、それを jj にマッピングしているのは、jj を入力する機会がほとんどないから、です。

標準コマンドが使いづらいと感じた場合は、自分なりにカスタマイズすることでさらなる開発効率アップを目指せます。

vimrcの中身については、試行錯誤した先人達が沢山記事にしてくれていますので、そちらも参考にしてみてください。

おわりに

今回は、Vimコマンド習得のすゝめとして、一部のコマンドを段階的に紹介させていただきました。

人によっては慣れるまでに一定期間を要します(私の場合は1~2か月かかりました…)が、自分のものに出来ればより楽しく、快適に開発を行えるようになると思います。

皆さんも、是非楽しいVimライフを一緒に送りましょう!

www.tecotec.co.jp

*1:「vi」コマンドで開くテキストエディタ