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

はじめまして、ゴリラです。
ご縁があってこの度Vimについての連載をさせて頂く事になりました。

本連載ではVimに興味ある方や、Vimを使い始めたばかりの方向けの内容を予定しています。筆者自身もまだVim歴が8ヶ月と浅いのですが、みなさんにVimの良さが伝わるように頑張っていきますので、何卒よろしくお願い致します。

自己紹介

普段プログラマーとして働きつつプライベートでは趣味でOSS活動をしています。とくにVimが好きで、Vimに関する記事を書いたりゴリラ.vimといったイベントを主催したり、プラグインを作ったりしています。

Vimの良さ

Vimというと一般的にとっつきにくい、学習コストが高いと言われることが多いと思います。Vimにはモードといった概念があり、そして機能がとても豊富なためそのような印象があるのは仕方ないと考えています。しかし、Vimは学習コストといったデメリットよりもメリットが圧倒的に多いです。筆者が思うVimの良さを簡潔にまとめると以下の4つになります。

  • モードがあるため操作性・機能性の幅が広い
  • オペレーター、モーション、テキストオブジェクト、リピートによる高速編集が可能
  • プラグインによる機能の拡張
  • ヘルプがとても充実している

特にモードとモーション、オペレーター、テキストオブジェクトは知っていると編集効率が大幅に向上します。ヘルプはVimの機能がほぼ全て載っています。ネット上の記事では紹介されることが少ない機能がたくさんあります。ヘルプを読むだけでVimへの理解が深まります。

早速ですが、上記の機能の良さについて紹介します。ただVimの機能が多くて紹介しきれないので、より詳細な機能は連載を通して紹介していきます。

モードについて

Vimでは主に以下のモードがあります。代表的な機能は一般的によく使われる機能をピックアップした内容になっています。

モード 代表的な機能
ノーマルモード カーソル移動、ヤンク(コピー)、貼り付け(プット)、削除など
挿入モード 入力、貼り付け、入力補完、単語削除など
ビジュアルモード 範囲選択、コピー、削除、フィルターなど
コマンドラインモード 保存、終了、文字列置換など

Vimにおいてコピーはヤンク、貼り付けはプットと呼ばれています。以降に出てくるヤンクとプットは適宜読み替えてください。

上表以外にも選択モードやExモードなどありますが、知らなくても特に困ることはないので今回は紹介を省きます。

Vimを起動するとノーマルモードで立ち上がります。この挙動は insertmode オプションで変更することができます。オプションを有効にすると起動時に挿入モードで立ち上がります。各モードにできることが異なっていて、入力モードはテキスト入力、ノーマルモードはテキスト編集に特化しています。

基本的にVimはモードを切り替えながら編集していきます。かと言ってモードを意識することはほとんどありません。Vimのモード切り替えはキーボードの入力切り替えと同じイメージです。日本語入力・英数入力を場面によって使い分けているのと同じ感覚です。

モードの切り替え

Vimではモードの切り替えは次の様になっています。

必ずではありませんが基本的にVimはノーマルモードを介して各モードに切り替えます。各モードに共通するのはEscでノーマルモードに切り替えることです。Esc以外にも、Ctrl-[Ctrl-cCtrl-\ + Ctrl-nでノーマルモードに切り替えることができます。ただしCtrl-cCtrl-\ + Ctrl-nEscと等価ではないです。具体的にどこが等価ではないのかは次回の記事にて紹介します。

図以外にもモードを切り替える方法があります。まとめると次のようになります。

現在モード 切り替え先モード キー
ノーマル 挿入 i、I、a、A、o、O
コマンドラインモード :、/、?
ビジュアルモード v、V、Ctrl-v

挿入モードに切り替えるキーがいくつかあり、キーによってすこし動きが異なります。実際どのような動きになるのかは基本操作の項目で紹介します。

オペレーター、モーション、テキストオブジェクト、リピートについて

Vimにおいてとても重要な機能は

  • オペレーター
  • モーション
  • テキストオブジェクト
  • リピート

と筆者は考えています。

オペレーターは変更、削除、ヤンク、選択といった操作のことです。モーションはカーソル移動のことです。例えば現在のカーソルから行の最後尾のテキストを削除したい場合、削除のオペレーターdと行最後尾に移動するモーション$を組み合わせることで実現できます。

テキストオブジェクトはテキストを一つのまとまりとして扱います。テキストオブジェクトはオペレーターもしくは選択モードの後にのみ使用できます。例えば、単語というテキストオブジェクトiwで、削除のオペレーターであるdと組み合わせて、diwと入力するだけで1単語を削除できます。

リピートは変更を単発で繰り返すことを指します。ここで指している変更とはテキストを変更することを指しています。例えば "gorilla" を削除した後に、"everyone" にカーソルを移動し . を入力するだけでdiwの変更を繰り返すことができます。リピートは強力な機能で、無駄なキーストロークを減らすことができるので積極的に使用していきましょう。

このように、Vimではオペレーターとモーション、テキストオブジェクト、リピートを組み合わせることで高速編集を実現しています。Vimは慣れるまで少し時間がかかりますが、慣れてしまえばテキスト編集の効率を大幅に上げることができます。

本記事ではオペレーターやテキストオブジェクトなどについては少ししか触れていませんが、次回の記事にて詳しく紹介します。

ヘルプについて

Vimはヘルプを引くコマンドが用意されています。このヘルプはとても強力で、ほぼすべての機能の説明が網羅されています。例えばオペレーターは他に何があるのかを知りたいときにコマンドラインモードで:h operatorを実行するだけでヘルプを引けます。ヘルプはデフォルトは英語ですが日本語にすることも可能です。

他にヘルプ検索コマンドhelpg {pattern}も用意されています。helpgはすべてのヘルプから{pattern}を含んだ文字列を検索して結果一覧を表示します。例えばhelpg ノーマルモードと検索した場合、次の画像のように結果一覧が表示されます(画像をクリックすると拡大表示されます)。

Vimのヘルプは量が多く、どこから読み進めたら良いのかわからない方もいるかと思いますのでお勧めのヘルプ一覧をまとめました。Vimを始めたての方はまず "index" から読んでおくと良いかと思います。

ヘルプ 概要
helphelp ヘルプの説明
vim-modes モードの紹介
index 各モードのすべてのコマンド一覧
quickref よく使うコマンドのクイックリファレンス
ex-cmd-index VimのExコマンド一覧
functions-list 組み込み関数の機能別一覧
option-list オプション(cursorlineなど)一覧
map-overview マップコマンドとモードの対応表
usr_41 Vim scriptの基本
eval Vim scriptの仕様相当の内容

Vimの基本操作

一通りVimの概要についてご紹介しましたが、実際にVimを始めるとき最低限覚える必要がある操作をピックアップして紹介します。

カーソル移動

先程説明したとおりVimはノーマルモードで立ち上がります。ノーマルモードでのカーソル移動をまず覚えましょう。

動作 キー
左に移動 h
下に移動 j
上に移動 k
右に移動 l
ファイル先頭に移動 gg
ファイル最後尾に移動 G
指定した{count}行に移動、例:11G {count}G

挿入モード

Iは行頭の非空白文字に移動してから挿入モード。

aは現在位置から一文字右に移動してから挿入モード。

Aは行末に移動して挿入モード。

oは行の下に新しい行を作成して挿入モード。

Ooと逆で、上に新しい行を作成し挿入モード。

ビジュアルモード

範囲選択もモーションの一つです。そのためオペレーターと組み合わせることができます。つまり、選択した範囲に対して削除、ヤンクを行うことができます。ビジュアルモードの切り替え方法もいくつかありますのでご紹介していきます。

vは文字単位の範囲選択を開始。

Vは行単位の範囲選択を開始。

Ctrl-vは矩形選択を開始。

コマンドラインモード

コマンドラインモードでは変更の保存、Vimの終了、置換、検索などを行うことができます。最低限覚えておく必要があるものをご紹介します。

:w {filename} {filename}に内容を保存、ファイルがない場合は新規作成される

:w 変更した内容を保存

:q Vimを終了

:q! 変更があると:qでは終了できないので!をつけてVimを終了

:wq 保存して終了

:%s/banana/gorilla/g bananaをgorillaに置換

/{word} {word}の検索

最後に

Vimは強力な機能がたくさんあります。本記事で紹介したのはほんの一部です。次回は本記事では紹介しきれなかった各モードで主要な機能を紹介しますので、楽しみにしていただけばと思います。