Vim

概要

Vimはオランダ人のプログラマーBram Moolenaarによって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と同じで、状況に応じてモードを使い分けることでテキストを編集していき、小さなコマンドの組み合わせをその場で作ることによって多種多様な機能を実現する。
Windows系エディタ（メモ帳など）などの他のエディタとは操作方法がまるで異なるため、一通りのテキスト編集作業ができるようになるまで慣れが必要となる。しかしながら、一旦慣れてしまえばメモ帳などとは比較にならないほどのテキスト編集速度を得ることができるため、数多くの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を起動するとウガンダの子供たちへの援助を募るメッセージが表示される。

移植された環境

viエディタはもともとUnix上でしか動作しなかったが、Vimは AmigaOS（公開時のプラットフォーム）だけでなく、Atari MiNT、BeOS、MS-DOS、Windows、IBM OS/2 と OS/390、MorphOS、OpenVMS、QNX、RISC OS、UNIX、Linux、BSD、Mac OS、macOSなど、多数のプラットフォームに移植されてきた。
また、独立した移植版がAndroidとiOSでも動作する。

その他の動き

誕生から25年近く経ち、機能追加を重ねることで、Vimはソースコードが30万行を超える巨大で煩雑なアプリケーションになった。
この巨大化したコードを刷新して、現代的なアーキテクチャに作り変えようとNeovimプロジェクトが2014年2月にフォークした。プラグインの互換性を保ちながら、より自由度の高い機能を提供できるようにすること、内部構造をスリム化しメンテナンスしやすくすることが目的として挙げられている。
このプロジェクトはbountysource.comで3万ドル強の出資金を集めることに成功している。

演算子未解決モード

ノーマルモードの派生モード。「実行範囲の指示が必要なコマンド」を実行した場合にVimが指示を待っている状態。
例えば、ノーマルモードで dキーを押すとこのモードに入る。続けて d キーを押した場合は一行削除、wを押した場合は一単語削除、$（行末の意）を押した場合は行末までを削除、となる。d 5 d とキーボード操作すると、カーソル位置から5行分の削除となる。

セレクトモード

ほとんどビジュアルモードと同じだが、印字可能文字が入力されると選択範囲を削除して挿入モードに入る。Windows の選択モードに似ている。
ノーマルモードから g h、g Hで移行できる。また、ビジュアルモード時に Ctrl+g で移行できる。
このモードの時はコマンドラインに「-- SELECT --」と表示される。

挿入ビジュアルモード

挿入モードでビジュアル選択を開始したときのモード。
例えば  Ctrl+o v、Ctrl+o V、Ctrl+o Ctrl+v を実行するとこのモードに入る。
このモードの時にはコマンドラインに「-- (insert) VISUAL --」と表示される。

挿入セレクトモード

挿入モードでセレクトモードを開始したときのモード。
例えばマウスをドラッグしたり、⇧ Shift+→ を押したときこのモードに入る。
このモードの時にはコマンドラインに「-- (insert) SELECT --」と表示される。

挿入ノーマルモード

挿入モード時に一度だけノーマルモードのコマンドを実行できる。挿入モード時に Ctrl+[（または ESC キー）を押すのが面倒なときに使用される。
挿入モード時に、 Ctrl+o で挿入ノーマルモードに入る。
このモードの時にはコマンドラインに「-- (insert) --」と表示される。

置換モード

ノーマルモードからRでこのモードに移行する。文字をタイプするとその分文字が置換されていく。
抜けるには  Ctrl+[ を押す。

概要

前身であるviが機能を絞ったコンパクトな印象を一般に持たれているのと比べると、Vimはかなり巨大なアプリケーションである。
Vimはバージョンを重ねるごとに積極的に機能を追加する傾向があり、実装されている機能の種類、数は公開されているエディタの中でもトップクラスに多い。ただし設定によりviに近い操作性に戻すことも可能であり、いくつかのLinuxディストリビューションでは機能を絞ったvimをviとして配布しているものもある。
以下に示す機能の中には設定でオフにしたり、好みに合わせてカスタマイズ可能なものが多く、必ずしも説明と一致しない場合があることに注意。

マーク

文章中の特定の位置にマークを付け、カーソルを移動する際の目印にすることができる。
ノーマルモード中にm+(適当なアルファベット1文字) を入力すると、現在のカーソル位置を記憶する。
ノーマルモード中に`+(先ほど指定したアルファベット1文字) を入力すると、先ほど記憶したカーソル位置にジャンプする。

レジスタ

レジスタとは、テキストの断片を一時保存しておく場所のことで、クリップボードとほぼ同じ概念だが、複数個のスペースが用意されている点が異なる。アルファベット一文字に1スペースが割り当てられており、ノーマルモード中に"+(適当なアルファベット1文字) を入力することでレジスタにアクセスできる。例えば" a y $でレジスタaにカーソルから文末までヤンク（コピー）することができ、" a p で貼り付けられる。

マクロ

マクロとは、操作を記録して別の場所で同じ操作を繰り返し行うときに有用な機能である。
ノーマルモード中にq+(適当なアルファベット1文字) を入力すると記録状態になり、再びqを打ち込むまでの間のタイプしたキーが保存される。
ノーマルモード中に@+(先ほど指定したアルファベット1文字) を入力すると記録された操作を再生できる。

ジャンプ

Vimではカーソル位置が大きく動き、バッファ間でも頻繁に移動することが多い。そのため、カーソル位置の履歴を記憶している。
直前のカーソル位置に戻りたい場合ノーマルモードでCtrl+oを押す。逆に進みたい場合はCtrl+iを押す。
外部コマンドctagsでタグリストを予め作成しておけば、カーソル下の単語の意味や関数の定義を調べたい場合に、Ctrl+]を押すことで、その定義元にジャンプすることができる。これを特にタグジャンプと呼ぶ。

インデントとタブ

ファイルタイプごとに、適切な自動改行（オートインデント）を行うことができる。Vimではデフォルトで40以上のプログラミング言語の自動改行に対応している。自動入力されるスペース（またはタブ文字）の数は任意に決めることが可能で、後述するハイライト機能によって可視化することもできる。
また、タブ文字は:expandtabでスペースに一括変換することもできる。

検索・置換・ソート

バッファ内の特定のテキストを検索および置換することができる。検索にマッチした単語はハイライトできる。
検索単語には正規表現を用いることができ、複雑なテキストにもマッチさせることができる。
ノーマルモード中に/または?を押すと、バッファ内の単語を検索できる。
ノーマルモード中に*または#を押すと、カーソル下の単語を検索できる。
コマンドモードで :s/OLD/NEW/ を入力することで OLDをNEWに置換することができる。
コマンドモードで :sort を入力することでテキストを行単位で並べ替えることができる。

補完

挿入モード中にCtrl+n, Ctrl+pを押すと、文中の単語をポップアップ表示、補完することができる。
コマンドモード中でも補完はでき、機能名がうろ覚えでもサジェストしてくれる（:help wildmenu）。
プラグインを用いれば、コードスニペットや、時刻、関数名などの自由度の高い補完も可能になる。

強調表示（シンタックスハイライト）

ソースコード・テキストファイルの色分けを行い見やすく表示する。Vimでは非常に多くの文法を色分けすることが可能であり、デフォルトで400種類以上用意されている。この数は他のテキストエディタと比較しても群を抜いている。特にVimでは、UNIXの設定ファイルを編集するケースが多いことから/etc配下の多くのファイルが色分け表示される。この機能は、gVimだけでなく、カラー表示が可能な端末上でも利用できる。
このシンタックスの定義ファイルは、正規表現を駆使することで必要に応じて拡張できる。
また、色分けのカラースキームも自由に変更することができ、自分の好みに応じて様々に使い分けることができる。

折り畳み（フォールディング）

プログラマ支援機能の一つで、長い段落・関数などは折りたたんで、コンパクトに表示したほうが俯瞰しやすくなる。
いくつかの折り畳み方法があり、自分で範囲を指定して折り畳むことも可能だが、自動で判別して折り畳ませることもできる。

マルチバッファ・ウインドウ分割・タブページ

一つのVimウインドウの中で、複数のテキストを同時並行で編集することができる。
ウインドウを上下左右、任意の個数に分割して使い分けることができる。
これを利用して、片側にファイルツリーを表示したり、シェルを表示したり、ヘルプを表示したりすることが可能になる。

差分表示

ファイルの変更点を分かりやすく比較するために、ウインドウを左右に分割して差分表示を行う機能がある。
このとき変更点は色分け・折り畳みがなされ、左右画面ともに同時スクロールする。

Quickfix

統合開発環境と同様、ソースファイルを編集した後Vimから直接コンパイルできる。コンパイルエラーが発生したときには、Quickfixと呼ばれるもう一つのウィンドウが表示される。エラーメッセージに基づいて、直接他のウィンドウ内に表示されたソースファイルのエラーの出た箇所へジャンプすることができる（:help quickfix参照）。

キーマッピングの変更・コマンド定義

ノーマル・挿入・ビジュアル・コマンドモードのキーマッピングを自由に変更できる。
特に長くて記憶できないが有用なキーバインドを短く定義し直すのに使われる。
独自の処理を行うコマンドも定義することができ、役に立つものはプラグインとして公開されている。

ヘルプ

Vimにはテキスト形式の膨大なドキュメントが存在する。:helpgrepか:helpコマンドを用いれば、ユーザはヘルプ全体の中から単語を探すことがでる。このヘルプテキストはあちこちにタグ名が記載されており、Wikiのようにタグジャンプを駆使して分からない単語の説明に移動できる。

Vimスクリプト

Vimには独自のスクリプト言語（Vimスクリプト, 言語に着目した場合VimLとも略される, 詳細はVim script）が備わっており、それを用いればマクロで対応するのが難しいような複雑な作業を自動化できる。Vimの設定ファイル類（vimrc、プラグイン、インデント定義、シンタックス定義、カラースキーム、ファイルタイプ判別）はすべてVimスクリプトであり、変更すれば挙動を細かくカスタマイズできる。通常はユーザーのホームディレクトリ以下の設定ファイル群でこれらの設定を上書きして利用する。Vimのコマンドモードとは、このVimスクリプトを一行実行しているにすぎない。:normalを使うことでノーマルモードのコマンドもVimスクリプト上で利用できる。
Vimスクリプトは、Javascriptに近い言語仕様を採用しており、while文やif文などの一般的な制御構文から、リストやハッシュなどのデータ構造までをサポートしているが、オブジェクト指向言語のように厳密なクラスや継承の概念はない。しかしながら、モード概念と絡んでいることもあって文法が複雑であり、文法や挙動に一貫性が無い部分もある（例：.演算子など）。このため、Vimスクリプトでバグの少ないプラグインを書くのは慣れが必要となる。また、Vimスクリプトは、PythonやLisp、Luaなどといった他のスクリプト言語と比較すると、パフォーマンスが悪いケースが多いが、これはスクリプトを行ごとに逐次実行していることによる。
コンパイル時に Vim に追加できる Perl や Python や Ruby などのインタフェースを使用すれば、Vimスクリプトの中でインラインに他言語を利用することもできる。ただし、Vimの機能にアクセスするためにはVimスクリプトの関数をevalするなどして間接的に呼び出すしかなく、完全な代替にはなっていない。
VimスクリプトはVimのカスタマイズ性の中核を担っているが、上述した文法や性能の問題から弱点を認め、他言語への転換を図ることを目的の一つとしてNeovimがフォークしている。

プラグイン

プラグインのVimスクリプトは、~/.vim以下の適当な場所に配置することで動作する。Vim.orgでホストされているVimのプラグインは、もともと小さな機能をもったスクリプトが多かった。しかしながら、2000年代後半以降Vimには高性能で多機能なプラグインが急激に増加してきた。その背景には、コンピュータの高性能化や、Vimスクリプトのハックが進んだことなどが挙げられる。しかし、Vim.org からダウンロードしてきた第三者によるプラグインファイル（しばしば複数のファイルから成る）は、自分で解凍して複数のディレクトリに配置しなければならなかった。このため、自分の書いた設定ファイルと、第三者の書いたプラグインとが混在し、プラグインが増加するにつれて管理が複雑化することが多かった。

Vimball による管理

プラグイン管理の負担を軽減するために、Vimがバージョン7になると、Vimball（ヴィムボール）と呼ばれる機能が搭載されるようになった。これはプラグインをVimballという形式に圧縮して単一のファイルでプラグインを提供しようとするものである。このVimballを使うことでプラグインのインストール・アンインストールを簡便に行う事ができ、プラグインのインストール面での負担が軽減された。Vimball形式で提供されているプラグインをインストールするには、Vim.org からダウンロードしてきたファイル（拡張子 .vba）を手持ちのVimエディタで開き、:so %  を実行することで自動的に展開・インストールされる。このときインストールしたプラグイン情報も同時に記録されるのでアンインストールもできる。アンインストールするには:RmVimball [プラグインの名前]を入力する（使用方法の詳細は:help vimball）。
しかしながらVimball形式に対応したスクリプトが非常に少なかったことや、プラグインのバージョン管理まで面倒を見てくれなかったことから、プラグイン管理の負担が劇的に改善されることはなく、現在は主流の管理方法ではなくなってきており、Gitを用いた方法に移行しつつある。

GitHub による管理

2000年代後半になるとプラグインの管理方法は大きく変わりはじめた。それはGitHubの登場によって多数のプラグインが、分散型バージョン管理システムGitで管理されるようになってきたためである。GitHubが個人に無料でスペースを提供したため、自分の設定ファイル群である ~/.vim (dotvim, vimfiles) をGitHub上で管理する者が増加し、プラグイン管理もすべてGitで管理したいという需要が出てきた。
まず、pathogen（パソゲン、Tim Pope作）というプラグインが登場した。これは自分の~/.vim全体をGitで管理し、第三者プラグインはGitのsubmodule機能によって管理するようにした。これのプラグインの登場により、第三者プラグインと自分の書いたプラグインとを別々に管理できるようになったことで、Vimball形式の時の問題点はほとんど解決され、プラグイン管理の負担を劇的に低減させることに成功した。さらにGitを使った利点として、自分で好きなようにフォークして変更できることも大きなメリットであった。
しかし、Gitによってプラグインの更新が楽になったとはいえ、その更新もインストールもプラグインごとに管理しなければならない点は変わらなかった。2010〜2011年になると、その部分を自動化し改良したVimスクリプトが登場し始める。このようなスクリプトの代表例としてVundle（バンドル、gmarik作）が挙げられる。これらのスクリプトを用いることで使いたいプラグインの名前やレポジトリを列挙するだけで、コマンドひとつで一括インストール、一括更新が可能になった。これに呼応する形でVim.orgにアップロードされていたプラグインもその殆どがGitHub上に移植された。
これらのプラグイン管理用のプラグインが整備されたことにより、初期（数年前まで）の管理方法に比較するとVimのプラグイン管理の環境は格段に向上した。

Vimの派生エディタ

Viをモデルとした派生物にはnviやElvisがあり、中でも最も機能的に発展したのがVimである。そのVimをモデルとしたプロジェクトもいくつかあるが、Vimの機能群は巨大なため、全てを模倣するのは困難であることから、結局Viクローンと同程度の機能実装にとどまっている。逆にVimの機能を制限して操作の敷居を低くしたCreamという派生物もある。

Neovim

現在、派生物の中で最も精力的に開発されているプロジェクトはNeovimであり、Vimのリファクタリングプロジェクトであることから、機能的にはVimとほぼ変わらないものの、新機能の追加やもはや使われなくなった機能の削除などが行われている。GUIアーキテクチャの改善や、スクリプトの高速化、他アプリケーションへの埋め込みが容易になることが謳われている。