Vim(ヴィム。「ヴィアイエム」という読み方は誤りVim documentation: intro - pronounceVim日本語ドキュメント intro - pronounce)は、vi から派生し、発展した高機能なテキストエディタである。
概要 Vimはオランダ人のプログラマ、ブラム・ムールナーによってAmiga向けに開発された。のちにWindowsを含むさまざまな環境に移植され、特にUnix系オペレーティングシステム (OS) ではEmacsと並んで広く使用されているテキストエディタとなっている。
Vimという名称は、オリジナルのviエディタに近づくことを目標として、開発当初Vi IMitation(viの模倣)の略とされていた。しかし、やがてviを超えることを目指してVi IMproved(viの改良)とされるようになり、今日ではオリジナルのviを大きく上回る機能を持つに至っている。
VimはGUIを必要とせずCUIでも動くため、Unix系OSに標準のエディタとして搭載されていることが多い。コンピュータの大容量化と高速化にともない、2000年以降のOSでは viに代わってより高機能な Vim、あるいはその機能劣化版が標準装備されるようになってきている。このため、コマンドライン上でviを実行すると代わりにVimが起動するディストリビューションが一般的となった。
Vimは基本的にCUIで動作するが、GUIで動くVimのことを特にGVim(gVim, gvim, ジーヴィム)と呼び区別している。マウス操作など、X GUI (Unix, Linux) /Windows GUI (Windows) であることを生かしたGVimにしかない機能もある。
viエディタと同様、キーボードのみで操作されることを前提としていたため、キーボードのみですべての操作が可能になっている。その基本的な操作方法はviと同じで、状況に応じてモードを使い分けることでテキストを編集していき、小さなコマンドの組み合わせをその場で作ることによって多種多様な機能を実現する。
他のエディタとは操作方法がまるで異なるため、一通りのテキスト編集作業ができるようになるまで慣れが必要となる。しかしながら、一旦慣れてしまえば軽快なテキスト編集ができるため、数多くのVim愛好家が存在する。Vimの他の機能と併せて、プログラムコードやシステム設定ファイルを編集するのに特化しているため、特にプログラマーやシステム管理者に利用者が多い。
vi系 (vi, Vim, nvi) のキーボード操作法は、エディタをはじめ、各種ビューワや、ブラウザのプラグインにいたるまでその後のソフトウェアの操作方法に強い影響を与えていった。
Vimの大きな特徴として高いカスタマイズ性を挙げることができる。オリジナルのviがどんな環境でも設定なしですべての機能が利用できる万人向けのエディタだったのに対し、Vimでは設定ファイルを用いることでより個人の好みにあったエディタにカスタマイズすることができる。
エディタの詳細設定は主に ~/.vimrc(Windows版では %USERPROFILE%\_vimrc)というファイルに書いておき、起動時にVimがそれを読み込むことで設定が反映される仕組みになっている。Vimは独自のスクリプト言語 (Vim script) を用いて自身の機能を拡張することができ、かなり幅広い機能強化を行うことが可能である。有志らによって書かれた有用なスクリプトはプラグインとして www.vim.org 上や個人のブログ上で公開されている。~/.vim(windows版では %USERPROFILE%\vimfiles)フォルダ以下にこれらのプラグインファイルを置くことで機能を拡張できる。
Vimは、多言語、多コーデックを扱うことができ、iconvで対応しているものならばたいてい利用できる。しかし日本語などのマルチバイト文字を書くには不便が多く、もっぱら英文編集での利用が一般的である。
ライセンス形態は、GPL互換のチャリティウェアとなっており、いわゆるフリーでオープンソースなソフトウェアとして配布されており、Vimを起動するとウガンダの子供たちへの援助を募るメッセージが表示される。
モード切替 は複数のモードを用いてテキストの編集を行う。この独特な機能は初学者を混乱させやすい。
あらゆるエディタは、テキストの挿入とエディタに与えるコマンド指示を区別するという意味でモードを持つと言えるが、他のほとんどのエディタはこのモードを全く異なる方法で実装している。 は と同様、モード毎にキー割り当ても切替わるという点において独自性を持つ。これによって、マウスやメニューを全く使わず、最低限のメタキーの使用だけで全ての編集機能を使えるようになっている。
には6つの基本モードと5つの派生モードが存在する。しかしながら実質使用されるのは次の4つのモードであり、その他のモードは重要ではなく、特に意識されていない。
モード状態ノーマルモードカーソル移動やテキストの削除、コピー、ペーストなどの簡単な指示を行う。ビジュアルモードテキストを選択するだけのモード。挿入モード実際にテキストを入力するモード。コマンドラインモードファイルを開いたり、検索・置換などの様々な指示を行う。
その他のモード
選択モード 文字選択モード 行選択モード 矩形選択モード モード オペレータ待機モード 置換モード 仮想置換モード (挿入モード) 挿入ノーマルモード 挿入ビジュアルモード 挿入セレクトモード (ビジュアルモード) 文字ビジュアルモード 行ビジュアルモード 矩形ビジュアルモード
もっとも簡単な使い方の例としては、 コマンドラインモードでファイルを開き、 ノーマルモードでカーソルを移動させ、 挿入モードでテキストを入力し、( キーで再度ノーマルモードに戻り) コマンドラインモードでファイルを保存する。
ノーマルモード 普通の編集コマンドを全て入力することができる。 カーソルの移動をしたり、いくつかのキーを押すことでショートカットのように編集することができる。
キーボード操作コマンド表現機能j下にカーソル移動k上にカーソル移動h左にカーソル移動l右にカーソル移動 dw単語を削除 yy一行コピー+1ページ下にスクロール
エディタの起動時にはこのモードで始まり、他のモードはこのモードから起動する。全ての操作の中心となる重要なモード。他のモード中に か +、+ を押すことでこのモードに移行できる。操作中にどのモードにいるのか分からなくなった場合は を押すとノーマルモードに移行できる。
演算子未解決モード ノーマルモードの派生モード。「実行範囲の指示が必要なコマンド」を実行した場合にVimが指示を待っている状態。
例えば、ノーマルモードで キー の意を押すとこのモードに入る。続けて キーを押した場合は一行削除、 の意を押した場合は一単語削除、(行末の意)を押した場合は行末までを削除、となる。 とキーボード操作すると、カーソル位置から5行分の削除となる。
ビジュアルモード テキストの部分選択を行うだけのモード。選択後に別途コマンドを与えることにより、選択領域のコピーや削除を始めとしたテキスト処理を行う事が出来る。
テキスト選択中にも移動コマンドなどを行う事ができ、選択範囲を素早く変更できる。移動コマンド以外のコマンドを使うと選択領域に対してそのコマンドが実行される。
ノーマルモードから下記の操作でこのモードに移行できる。その区別は、
キーボード操作コマンド表現機能v文字単位のビジュアルモードに移行V行単位のビジュアルモードに移行+矩形選択ビジュアルモードに移行 gv前回選択した範囲をもう一度選択
このモードの時にはコマンドラインに「」と表示される。
セレクトモード ほとんどビジュアルモードと同じだが、印字可能文字が入力されると選択範囲を削除して挿入モードに入る。 の選択モードに似ている。
ノーマルモードから 、 で移行できる。また、ビジュアルモード時に + で移行できる。
このモードの時はコマンドラインに「」と表示される。
挿入ビジュアルモード 挿入モードでビジュアル選択を開始したときのモード。
例えば + 、+ 、+ + を実行するとこのモードに入る。
このモードの時にはコマンドラインに「」と表示される。
挿入セレクトモード 挿入モードでセレクトモードを開始したときのモード。
例えばマウスをドラッグしたり、+ を押したときこのモードに入る。
このモードの時にはコマンドラインに「」と表示される。
挿入モード このモードでは、タイプされたテキストがそのまま書き込まれる( のメモ帳などでテキストを入力する場合と同じ)。ノーマルモードから 、、、、、 などをタイプすることで挿入モードに移行できる。
キーボード操作コマンド表現機能iカーソル位置の前から挿入モードを開始する。I行の先頭から挿入モードを開始する。aカーソル位置の後から挿入モードを開始する。A行末から挿入モードを開始する。oカーソルの下に空行を挿入し、その先頭から挿入モードを開始するOカーソルの上に空行を挿入し、その先頭から挿入モードを開始する
他にもこのモードに移行するためのコマンドがいくつかある。
このモード時にはコマンドラインに「」と表示される。
挿入ノーマルモード 挿入モード時に一度だけノーマルモードのコマンドを実行できる。挿入モード時に +(または キー)を押すのが面倒なときに使用される。
挿入モード時に、 + で挿入ノーマルモードに入る。
このモードの時にはコマンドラインに「」と表示される。
置換モード ノーマルモードからRでこのモードに移行する。文字をタイプするとその分文字が置換されていく。 抜けるには + を押す。
コマンドラインモード ウインドウの下部に一行のテキストを入力できる。
コマンドや関数の実行、検索、置換処理など多様な処理を行うことができる。
ノーマルモードから 、、を押すことで移行できる。
キーボード操作機能コロンに続けてコマンドを打ち込み、 キーで実行する。補完機能あり。ヘルプテキストには「:sort」などとコロンで始まるテキストで書いてある。前方検索を行う。続けて検索したい文字列のパターンを正規表現で入力し、 キーで検索を開始する。インクリメンタルサーチ可。後方検索を行う。続けて検索したい文字列のパターンを正規表現で入力し、 キーで検索を開始する。インクリメンタルサーチ可。外部コマンドでフィルタ処理する。続けて実行するコマンド文字列を入力し、 キーでコマンド実行を開始する。
モード コマンドラインモードの変種。コマンドラインモードとは次の点で異なる。 毎回 (コロン)を押す必要がない。 コマンド実行後もモードに留まる。 コマンドを実行するごとに画面が更新されない。 通常のコマンドライン編集機能が使えない。 マップと短縮入力が使えない。 ノーマルモードから 、 でモードに移行できる。 の場合はコマンドライン編集や補完が使えるようになる。 モードを抜けるときは :vi(または :visual)を使う。
起動と終了 起動方法 コマンドライン上で、次のコマンドを実行する。 下のコマンドは のコマンドラインで動作するが、 版も基本的に同様のコマンドで起動できる。
コマンド概要vim [options] [file ..]ファイルを編集するvim -g [options] [file ..]ファイルを編集するgvim [options] [file ..]ファイルを編集する
詳しいコマンドラインオプションについて知りたいならば、次のいずれかのコマンドを実行する。
コマンド概要man vimvimのマニュアルを読むvim --helpvimのヘルプを出力
vim について初めて学ぶ者は次のコマンドを実行するとチュートリアルを起動できる。
コマンド概要vimtutor [-g] [言語]-g オプションで gvim 起動。 言語を ja にすると日本語でチュートリアルを始められる。
以下に 関連のコマンドをまとめる。
コマンド概要vim通常起動。デフォルト。exモードで起動。ノーマルモードに戻るには :vi を実行。 -e オプションを付けた場合と同じ。view読み取り専用(リードオンリー)モードで起動。-R オプションを付けた場合と同じ。gvim gviewGUIバージョン。-g オプションを付けた場合と同じ。evim eviewGUIバージョンのイージー(簡単)モードで起動。-y オプションを付けた場合と同じ。rvim rview rgvim rgview制限版。-Z オプションを付けた場合と同じ。vimtutorチュートリアルを起動。
実際には、vim コマンド以外はほぼ vim のオプションで代替できるので、環境によっては用意されていないこともある。
終了方法 Vimを終了させたい時は、 キーボード操作コマンド表現機能 :qバッファを一つ閉じる。:quit と同じ。他に開いているウインドウがあればアプリケーション自体は閉じない。 :qa開いているバッファを全て閉じる。:qall、:quitall と同じ。 保存して終了させたい時は、:wa コマンドで全バッファ内容を保管しておく必要がある。 :wq現在のバッファを保存して閉じる。 :x:wq とほぼ同じだが、書き込みが行われるのは変更点がある時だけである。 :wqa全てのバッファを保存して閉じる。 :xa:wqa とほぼ同じだが、書き込みが行われるのは変更点がある時だけである。
中断したい時は、ノーマルモードで + を押す。 ではタスクバーに最小化されるが、端末版ではプロセスをバックグラウンドに移す。
また、ノーマルモード時に で保存せずに終了、ノーマルモード時に で保存して終了となる。
機能 概要 前身であるviが機能を絞ったコンパクトな印象を一般に持たれているのと比べると、Vimはかなり巨大なアプリケーションである。 Vimはバージョンを重ねるごとに積極的に機能を追加する傾向があり、実装されている機能の種類、数は公開されているエディタの中でもトップクラスに多い。ただし設定によりviに近い操作性に戻すことも可能であり、いくつかのLinuxディストリビューションでは機能を絞ったvimをviとして配布しているものもある。
以下に示す機能の中には設定でオフにしたり、好みに合わせてカスタマイズ可能なものが多く、必ずしも説明と一致しない場合があることに注意。
テキスト編集機能 テキストエディタとして基本的な機能は揃っている。 多段階アンドゥ(元に戻す)とリドゥ(やり直す) コピー(ヤンク)&ペースト 豊富なカーソル移動 豊富な選択方法(語選択・行選択・矩形選択・段落選択) スペルチェック
オペレータと範囲指定 オペレータとは、コピー(: yank)、削除(: delete)、変更(: change)、選択(: visual)といった操作の意味を決定づけるキーである。ただし、このキー単独では操作は完結せず、ここに範囲を指定するコマンドが続くことで、単語の削除や、カッコ内の選択、パラグラフのコピーなどの多彩なアクションが可能になる。
範囲を指定するコマンドには、移動系のキー( など)や、テキストオブジェクト(iw, i", a", a(など)がある。
Vimでは、その場で適切なオペレータと範囲指定コマンドの組み合わせを考え、実行していくことで編集を行っていく。
例えば、コマンドggVGは、分解すると「一番上に移動(gg)して行選択(V)を一番下まで(G)」となるので、「すべて選択」の意味になる。
コマンドオペレータ範囲指定y$コピー()カーソル位置から行末まで()daw削除()カーソル下の単語( )ci"変更()""で囲まれたテキスト( )vip選択()空行で挟まれたパラグラフ全体( )
マーク 文章中の特定の位置にマークを付け、カーソルを移動する際の目印にすることができる。
ノーマルモード中に+(適当なアルファベット1文字) を入力すると、現在のカーソル位置を記憶する。
ノーマルモード中に+(先ほど指定したアルファベット1文字) を入力すると、先ほど記憶したカーソル位置にジャンプする。 レジスタ レジスタとは、テキストの断片を一時保存しておく場所のことで、クリップボードとほぼ同じ概念だが、複数個のスペースが用意されている点が異なる。アルファベット一文字に1スペースが割り当てられており、ノーマルモード中に+(適当なアルファベット1文字) を入力することでレジスタにアクセスできる。例えば でレジスタaにカーソルから文末までヤンク(コピー)することができ、 で貼り付けられる。 マクロ マクロとは、操作を記録して別の場所で同じ操作を繰り返し行うときに有用な機能である。
ノーマルモード中に+(適当なアルファベット1文字) を入力すると記録状態になり、再びを打ち込むまでの間のタイプしたキーが保存される。
ノーマルモード中に+(先ほど指定したアルファベット1文字) を入力すると記録された操作を再生できる。
ジャンプ Vimではカーソル位置が大きく動き、バッファ間でも頻繁に移動することが多い。そのため、カーソル位置の履歴を記憶している。
直前のカーソル位置に戻りたい場合ノーマルモードでを押す。逆に進みたい場合はを押す。
外部コマンドctagsでタグリストを予め作成しておけば、カーソル下の単語の意味や関数の定義を調べたい場合に、を押すことで、その定義元にジャンプすることができる。これを特にタグジャンプと呼ぶ。
インデントとタブ ファイルタイプごとに、適切な自動改行(オートインデント)を行うことができる。Vimではデフォルトで40以上のプログラミング言語の自動改行に対応している。自動入力されるスペース(またはタブ文字)の数は任意に決めることが可能で、後述するハイライト機能によって可視化することもできる。 また、タブ文字は:expandtabでスペースに一括変換することもできる。
検索・置換・ソート バッファ内の特定のテキストを検索および置換することができる。検索にマッチした単語はハイライトできる。 検索単語には正規表現を用いることができ、複雑なテキストにもマッチさせることができる。
ノーマルモード中にまたはを押すと、バッファ内の単語を検索できる。
ノーマルモード中にまたはを押すと、カーソル下の単語を検索できる。
コマンドモードで :s/OLD/NEW/ を入力することで OLDをNEWに置換することができる。
コマンドモードで :sort を入力することでテキストを行単位で並べ替えることができる。
補完
挿入モード中に, を押すと、文中の単語をポップアップ表示、補完することができる。 コマンドモード中でも補完はでき、機能名がうろ覚えでもサジェストしてくれる(:help wildmenu)。 プラグインを用いれば、コードスニペットや、時刻、関数名などの自由度の高い補完も可能になる。
ファイル管理 保存時に自動バックアップ エディタが強制終了した場合でも、直前の場所から編集を再開できる(:help swapfile, :help viminfo)。
ユーザーインターフェイス
行番号やルーラー(横目盛)を表示 ステータスバーの表示内容変更 ビジュアルベル カーソル行の強調 フォントの変更(gVimのみ) アイコン付きツールバー(gVimのみ) マウスの利用(gVimおよび対応した端末のみ)
強調表示(シンタックスハイライト) ソースコード・テキストファイルの色分けを行い見やすく表示する。Vimでは非常に多くの文法を色分けすることが可能であり、デフォルトで400種類以上用意されている。この数は他のテキストエディタと比較しても群を抜いている。特にVimでは、UNIXの設定ファイルを編集するケースが多いことから/etc配下の多くのファイルが色分け表示される。この機能は、gVimだけでなく、カラー表示が可能な端末上でも利用できる。
このシンタックスの定義ファイルは、正規表現を駆使することで必要に応じて拡張できる。 また、色分けのカラースキームも自由に変更することができ、自分の好みに応じて様々に使い分けることができる。 折り畳み(フォールディング) プログラマ支援機能の一つで、長い段落・関数などは折りたたんで、コンパクトに表示したほうが俯瞰しやすくなる。 いくつかの折り畳み方法があり、自分で範囲を指定して折り畳むことも可能だが、自動で判別して折り畳ませることもできる。
マルチバッファ・ウインドウ分割・タブページ
一つのVimウインドウの中で、複数のテキストを同時並行で編集することができる。 ウインドウを上下左右、任意の個数に分割して使い分けることができる。 これを利用して、片側にファイルツリーを表示したり、シェルを表示したり、ヘルプを表示したりすることが可能になる。 差分表示
ファイルの変更点を分かりやすく比較するために、ウインドウを左右に分割して差分表示を行う機能がある。 このとき変更点は色分け・折り畳みがなされ、左右画面ともに同時スクロールする。 Quickfix 統合開発環境と同様、ソースファイルを編集した後Vimから直接コンパイルできる。コンパイルエラーが発生したときには、Quickfixと呼ばれるもう一つのウィンドウが表示される。エラーメッセージに基づいて、直接他のウィンドウ内に表示されたソースファイルのエラーの出た箇所へジャンプすることができる(:help quickfix参照)。
キーマッピングの変更・コマンド定義 ノーマル・挿入・ビジュアル・コマンドモードのキーマッピングを自由に変更できる。 特に長くて記憶できないが有用なキーバインドを短く定義し直すのに使われる。 独自の処理を行うコマンドも定義することができ、役に立つものはプラグインとして公開されている。
ヘルプ
Vimにはテキスト形式の膨大なドキュメントが存在する。:helpgrepか:helpコマンドを用いれば、ユーザはヘルプ全体の中から単語を探すことができる。このヘルプテキストはあちこちにタグ名が記載されており、Wikiのようにタグジャンプを駆使して分からない単語の説明に移動できる。
カスタマイズ は とは異なり、個人の好みに合わせて徹底的にカスタマイズできる。 は環境非依存で特に設定せずに使うのが一般的だが、プログラマ向けの は設定を多用して各個人向けに使いやすくするのが一般的である。その設定の範囲は基本的なインタフェースから、キーボードマクロまで幅広い。
は、後述する独自のスクリプト言語(スクリプト、:help vim-script-intro)を持っており、カスタマイズ処理は主にこの言語で記述する。 や個人のブログ上で、便利なスクリプトがプラグインとして公開されている。
の初期設定は主に ~/.vimrcヴィムアールシー、Windows版では _vimrcというテキストファイルで行い、~/.vim ディレクトリ版では vimfilesに多数のプラグインスクリプトを配置することによって機能拡張を実現する。個人の設定は多種多様だがほとんどのユーザーは、~/.vimrc にはオプション(:help options)やキーマップの変更などを記述する。
set コマンドでオプションを設定する。 オプションの名前に no を付けるとその否定になる。
コマンド意味set nocompatible と互換モードにしないset number行番号を表示するset autoindent smartindentプログラミング用に自動インデントするset expandtabタブ文字をスペース文字に変換するset nobackupバックアップをとらない。syntax on構文強調表示機能を有効にするnnoremap ; :キーマップの変更。vnoremap ; :キーマップの変更。inoremap <C-a> <C-o>0キーマップの変更。inoremap <C-e> <C-o>$キーマップの変更。
~/.vim 以下はある程度用途ごとにディレクトリが分けられている。 ダウンロードしたプラグインは指定されたディレクトリに置くことで動作する。
細かい説明は のディレクトリ構成を参照。
~/.vimrc ~/.vim/ after/ autoload/ compiler/ colors/ doc/ plugin/ ftdetect/ ftplugin/ syntax/ indent/ macros/
Vim script Vimには独自のスクリプト言語(Vim script, 言語に着目した場合VimLとも略される, 詳細はVim script)が備わっており、それを用いればマクロで対応するのが難しいような複雑な作業を自動化できる。Vimの設定ファイル類(vimrc、プラグイン、インデント定義、シンタックス定義、カラースキーム、ファイルタイプ判別)はすべてVim scriptであり、変更すれば挙動を細かくカスタマイズできる。通常はユーザーのホームディレクトリ以下の設定ファイル群でこれらの設定を上書きして利用する。Vimのコマンドモードとは、このVim scriptを一行実行しているにすぎない。:normalを使うことでノーマルモードのコマンドもVim script上で利用できる。
Vim scriptは、JavaScriptに近い言語仕様を採用しており、while文やif文などの一般的な制御構文から、リストやハッシュなどのデータ構造までをサポートしているが、オブジェクト指向言語のように厳密なクラスや継承の概念はない。しかしながら、モード概念と絡んでいることもあって文法が複雑であり、文法や挙動に一貫性が無い部分もある(例:.演算子など)。このため、Vim scriptでバグの少ないプラグインを書くのは慣れが必要となる。また、Vim scriptは、PythonやLisp、Luaなどといった他のスクリプト言語と比較すると、パフォーマンスが悪いケースが多いが、これはスクリプトを行ごとに逐次実行していることによる。
コンパイル時に に追加できる や や などのインタフェースを使用すれば、Vim scriptの中でインラインに他言語を利用することもできる。ただし、Vimの機能にアクセスするためにはVim scriptの関数をevalするなどして間接的に呼び出すしかなく、完全な代替にはなっていない。
Vim scriptはVimのカスタマイズ性の中核を担っているが、上述した文法や性能の問題から弱点を認め、他言語への転換を図ることを目的の一つとしてNeovimがフォークしている。
Vim9 script Vimバージョン9.0から新しくVim9 script言語が追加された。パフォーマンス向上を主な目標としており、スクリプトをコンパイルすることで10~100倍の実行速度向上が期待されている。また、文法がより一般的なプログラミング言語(JavaScriptなど)に近くなった。
旧来のVim scriptのサポートは継続される。
プラグイン プラグインのVim scriptは、~/.vim以下の適当な場所に配置することで動作する。Vim.orgでホストされているVimのプラグインは、もともと小さな機能をもったスクリプトが多かった。しかしながら、2000年代後半以降Vimには高性能で多機能なプラグインが急激に増加してきた。その背景には、コンピュータの高性能化や、Vim scriptのハックが進んだことなどが挙げられる。しかし、Vim.org からダウンロードしてきた第三者によるプラグインファイル(しばしば複数のファイルから成る)は、自分で解凍して複数のディレクトリに配置しなければならなかった。このため、自分の書いた設定ファイルと、第三者の書いたプラグインとが混在し、プラグインが増加するにつれて管理が複雑化することが多かった。
プラグインの管理 Vimball による管理