Vimの使い方

Vimとは

VimはVi IMprovedの略で、viというエディタを拡張したものだ。多くの環境で、単にviとするとvimが起動する。以下、Vimのこともviと呼ぶことにする。viはUNIX-likeな環境において、Emacsと人気を二分するエディタである(エディタ戦争を参照)。本研究室ではリモートサーバにsshでログインして作業することが多くなる。この時、VSCodeなどをリモート接続してファイルを編集することも可能なのだが、せっかく数値計算の研究室に配属されたことだし、教養としてviとEmacsくらいは使えるようになっておこう。以下、私の趣味でviを使うが、簡単な操作くらいはどちらも使えるようになっておくのが望ましい。

Vimの使い方を解説したサイトは多数あるが、例えば

はじめてのVim 〜 Vimはいいぞ!ゴリラと学ぶVim講座

等で学ぶと良いだろう。

モードについて

Vimの最大の特徴はモードがあることだ。起動直後はノーマルモードとなっており、そのままでは入力ができない。iなどを押すと入力モードとなり、文字が入力できるようになる。ESCを押すとノーマルモードに戻る。

また、:を押すことでコマンドラインモードになる。ここでは置換など様々なことができる。vなどを押すことでビジュアルモードになり、テキストの一部分を選択したり、選択した範囲について操作ができる。以下にモード間の遷移図を示すが、とりあえず「エスケープキーを押せばノーマルモードに戻る」と覚えておけばよい。

modes

終了の仕方

Vimで最初に躓きがちなのは「起動したは良いが終了の仕方がわからない」というものだ。何はともあれ終了方法を確認しよう。

まず、適当なディレクトリで、新しいファイルtest.txtをvimで開いてみよう。

vim test.txt

Vimは起動時に「ノーマルモード」になっており、そのままでは文字入力ができない。まずはこのまま終了してみよう。シフトキーを押しながらzを二回、すなわちZZと入力してみよう。Vimが終了してターミナルに戻ったはずだ。「何もしていなければノーマルモードでZZで終了する」とおぼえておこう。

もう一度Vimを起動しよう。

vim test.txt

ここで「i」を押して編集モードに切り替えよう。

画面の下が-- 挿入 --という表示になったはずだ。この状態では、通常のエディタのように文字列を入力することができる。この状態で、Hello Vim!と入力し、改行してからESCを押そう。ESCを押したらノーマルモードになる。この状態でやはりZZを入力しよう。編集内容が保存されて終了する。ちゃんと保存されたかcatで確認してみよう。

$ cat test.txt
Hello Vim!

ちゃんと表示されたはずだ。

ZZは、ノーマルモードにおいて「編集内容を保存して終了せよ」というコマンドだが、現在の編集内容を保存しないで終了したい場合もあるだろう。その場合はコマンドモードを使う。

もう一度Vimを起動しよう。

vim test.txt

iキーでインサートモードになり、適当な文字を入力してからESCを押してノーマルモードに戻ろう。この状態で:を押すとコマンドモードとなる。コマンドモードでqを入力してエンターを押すと終了するが、保存されていない編集内容があるとメッセージが出て終了できない。ここで、q!と、!をつけると、保存してない内容があっても終了する。逆にwqとすると、現在の編集内容をファイルに書き込んでから終了する(ノーマルモードでのZZと同じ)。

とりあえず

とだけ覚えておけば良い。

カーソル移動の仕方

この状態でhlキーでカーソルが移動することを確認してみよう。Vimには、以下のように多様な移動手段がある。

カーソル移動:h,j,k,l

まずはhjklでカーソル移動ができる。それぞれ以下の通りだ。

画面移動:Ctrl+u,d,f,b,e,y

Ctrlキーとudfbeyの組み合わせて、画面移動ができる。

表示画面中の移動

表示している画面はそのままで、カーソルだけ移動するコマンドもある。

行頭、行末移動:^, $

Vimには他にも多くの移動方法がある。よく使うのが「^」と「$」だ。それぞれ

である。

ファイルの先頭、最後へ移動:gg, G

ggでファイルの先頭に、Gでファイルの最後に移動できる。これも使用頻度が高いので覚えておきたい。

単語単位の移動:w,e,b

「w, e, b」で単語単位の移動ができる。それぞれ

となる。これらは「ピリオド、コンマ、エクスクラメーションマーク」といったマークを区別して移動する(マークを単語として扱う)が、大文字の「W, E, B」とするとマークを単語として扱わない。

編集

ヤンク、削除、貼り付け:y,d,p

Vimでは「yy」でカーソルのある行を一行コピーできる(ヤンクと呼ぶ)。コピーした行は「p」で貼り付けることができる。Hello Vim!の行で「yyp」と入力せよ。

Hello Vim!
Hello Vim!

と二行になったはずだ。

Vimは、操作の前に数字を入力すると、その数だけ操作を繰り返す。上記の状態で「5p」と入力せよ。

Hello Vim!
Hello Vim!
Hello Vim!
Hello Vim!
Hello Vim!
Hello Vim!
Hello Vim!

「5 行 追加しました」の表示とともに上記のように行が増えたはずだ。

「dd」により行を一行削除できる。適当な行で「dd」と入力せよ。一行消え、「Hello Vim!」が6行になったはずだ。この状態でggで一番上に行って、5ddと入力せよ。5行消えて、一行だけになったはずだ。

アンドゥ:u

uで直前の操作のアンドゥが出来る。ddで一行消して、uを押してみよう。操作が取り消されたはずだ。

表示画面中の移動:H, M, L

また「Hello Vim!」を増やそう。yy100pで100行くらい追加した後、以下のカーソル、画面移動コマンドを試そう。

ビジュアル選択モード:v

vを押すことでビジュアル選択モードになる。適当なところでvを押して、jkで選択範囲を指定できることを確認しよう。その後、ESCでノーマルモードに戻ってから、以下の操作でファイル全てを選択する。

その後dにより全て消して良い。

対応する括弧へ飛ぶ:%

%を押すと、対応する括弧に飛んでくれる。

((()))

と入力し、適当な括弧で%を押してみよ。カーソルが対応する括弧に飛ぶ。これはC/C++など、ブロックを括弧で作るプログラムを組む時に便利だ。

矩形選択:Ctrl+v

vで行単位の選択ができたが、Ctrl+vで矩形選択ができる。ただし、WindowsではデフォルトでCtrl+vが「貼り付け」になっているためにこの機能は使えない。もし矩形選択を使いたければ、Windows Terminalの設定から「JSONファイルを開く」を選び、

        {
            "command": "paste",
            "keys": "ctrl+v"
        },

の行の下に

        {
            "command": "null",
            "keys": "ctrl+v"
        },

を追加すればよい。これでCtrl+Vで貼り付けができなくなるが、マウスの右クリックで貼り付けができるので問題ない。

以下の文章を作成せよ。

* Hello Vim!
* Hello Vim!
* Hello Vim!
* Hello Vim!
* Hello Vim!

このうち、Helloだけ消したくなったとする。置換でもできるが、最初のHelloの冒頭にカーソルを移動し、Ctrl+vで矩形選択開始、その後、最後のHelloの単語末まで移動してd。これでHelloが消えた。

カーソル位置にある数字の増減:Ctrl+a, Ctrl+x

カーソル位置にある数字を増減できる。

print(a[1])

と入力し、1のところにカーソルを合わせてCtrl+aやCtrl+xを押してみよ。数字が増減するはずだ。

行ジャンプ:数字

:を押すとコマンドモードになるが、そこで数字を入力すると行ジャンプができる。:50と入力してリターンを押してみよ。50行目に飛ぶはずだ。

行をまとめる:J, gJ

Jで次の行をまとめることができる。

Hello
Vim!

と入力し、「Hello」の最後にカーソルを合わせてJを入力せよ。「Hello Vim!」になったはずだ。Jでは、改行が空白になる。空白を入れたくなければgJとする。vによるビジュアル選択を組み合わせるとたまに便利。

検索・置換

検索

/で検索ができる。/を入力するとカーソルが下に移動し、/の右で入力待ちになる。そこで何か入力する。

search1.png

この状態でリターンを押すと、カーソルが単語の先頭に飛び、検索した単語がハイライトされる。

search2.png

次に検索を行うまでハイライトされ続ける。ハイライトを消したければ、コマンドラインモードでnohlsearchと入力する。Vimはコマンドが判別できる最低限入力すれば実行できるため、:nohとだけ入力してもハイライトを消すことができる。

デフォルトでは、入力が終わってリターンキーを押すまで検索されないが、:set incsearchにより検索がインクリメンタルサーチになり、入力した文字列に一致する単語を動的に探してくれる。:set noincsearchで元に戻せる。

置換

コマンドラインモードで%s/置換前/置換後/gを実行すると、「置換前」の文字列を「置換後」の文字列に置換できる。

例えば、以下のプログラムを見てみよう。

p[X] = p[X] + q[X] * h;

これはx座標の運動量の更新のコードだが、Y座標に修正したい。この場合は:%s/X/Y/gを実行することで変更できる。

置換実行直前

replace1.png

置換実行直後

replace2.png

1行にわたって、3箇所置換した、という結果が表示されている。

最後のgを、gcにすると、置換を毎回確認するようになる。

replace3.png

検索がヒットするたびに、検索するかどうかの確認をする。この状態で入力できる文字(y/n/a/q/l/^E/^Y)?の意味は以下の通り。

最後の^E^Yは、Ctrl + Eと Ctrl + Yで画面をスクロールできるよ、という意味だ。

ビジュアル選択した状態で置換することができる。まず、vでビジュアルモードに入り、一部を選択しよう。

visual1.png

この状態で:を押すと、ビジュアル選択した状態でコマンドモードに入る。

visual2.png

すると、コマンドモードに:'<,'>が入力された状態で入力待ちになる。ここで:'<,'>s/Hello/Hi!/gなどと入力して実行すれば、選択されたところのみ置換される。

置換実行前

visual3.png

置換実行後

visual4.png

3行に渡って3箇所置換されたことがわかる。

ヘルプ

Vimはヘルプが充実している。:helpと入力するとヘルプを見ることができる。また、例えば「G」というコマンドの意味を知りたければ:help gなどとすれば良い。

その他

Vimは慣れると楽しいのだが、慣れていないと独特なキーバインドに戸惑うだろう。

まずはVimのチュートリアルをすると、一通りの操作を覚えることができる。コマンドラインでvimtutorを実行してみよう。多くの場合、日本語版がインストールされているはずだ。

Vimtutor

あとはこの文章の指示にしたがって修正していくと自然にキーバインドを覚えることができる。

また、Vimのキーバインドを覚えるためのゲームがある。

Vim Adventures

Vim Adventures

こちらは英語だが、ゲームをしながらキーバインドに慣れることができる。