Vim のすゝめ

第6回 vi との互換性

2012.11.19 (2012.12.25更新)

「vi もいいけど Vim もね!」、Vim 使いの「ブイ」(仮名)です。第 6 回目のテーマは「vi との互換性」です。Vim は vi と互換性がありますが、どのようにして互換性を保っているのか知らない人は多いと思います。ここでは、Vim の vi 互換機能の解説と、Vim の一部の機能を vi 互換にする方法について解説します。

1 set nocompatible について

みなさんは、第 1 回に解説した set nocompatible の設定を覚えていますでしょうか。

set nocompatible とは、挙動を vi 互換ではなく、Vim のデフォルト設定にする設定です。つまり、簡単に言うと set nocompatible と設定すると通常の Vim になり、この設定がない場合は vi 互換の Vim として動作するようになります [1]。この連載では、Vim の話をするため、当然 Vim を set nocompatible として使用していることを前提として話をします。これを set compatible とした場合、vi 互換モードとして動作します [2]。vi互換モードは Vim の動作に与える影響が大きく、ほとんどの Vim plugin も動作しなくなるため、Vim を Vim として使用する場合に有効にするべきではありません。set nocompatible は Vim に与える影響が大きいので、.vimrcの先頭に記述する必要があります。

$ vim -C

上記のように “-C” オプションを付加して Vim を起動すると、”compatible” オプションがオンになるので、vi互換モードで起動することができます。

ちなみに、vi が vim へシンボリックリンクされる場合、vi 互換モードがオンになるように設定されている環境があります。ただし .vimrc は普通に読み込まれるため、.vimrc が存在すると、Vim として起動します。環境によっては、ディストリビューションが用意したシステムのvimrc で “nocompatible” オプションがセットされることがあります [3]。Vim を viとして使用する場合は明示的に “compatible” オプションをオンにすることを推奨します。

2 cpoptions について

「vi 互換モードにするには影響が大きすぎるが、一部の挙動のみを vi 互換にしたい」という要求は少なからずあることでしょう。そのような要求に答えるため、Vim は “cpoptions” (vi compatible options) というオプションを用意しています。このオプションは 1 文字のフラグの列で構成されており、フラグを設定するとそれに対応する挙動が vi 互換モードになります。set compatible としたときは、全てのフラグがオンになります。

このオプションで変更できる挙動は極めて数が多いので、ここでは詳しく述べません。詳しくは、:help 'cpoptions' を参照してください。

例として、cw の挙動を vi 互換に設定してみましょう。

set cpoptions+=$

上記の設定を .vimrc に追加します。すると、行に対して変更するとき、行を再描画せず、変更するテキストの最後に “$” を表示します。これは vi 互換の挙動です。”=” ではなく、”+=” を使用している点に注意してください。”+=” は現在の値に追加しますが、”=” では他のフラグがリセットされてしまいます。

さらに、アンドゥの挙動を vi 互換にする設定も追加するには、代わりに次の設定を用います。

set cpoptions+=u$

“cpoptions” のフラグ “u” はアンドゥの挙動を vi 互換にする設定です。

3 vi と Vim の違い

基本的に、この連載中で紹介している機能は Vim でしか使えません。簡単には「この連載で紹介されている機能が Vim に追加された機能だ」と理解しておけばよいです。ただ、具体的な違いを説明しておいたほうがよいと思いますので、簡単にまとめておきます。以下は Vim の独自機能です。

  • noremap が追加され、マッピングの状態に影響を受けないマッピング定義ができる
  • ウインドウ、タブ機能が追加され、バッファの機能も拡張されているため複数のファイルを同時に編集しやすくなっている
  • Quick Fix によりビルド結果を参照できる
  • 独自 grep の内蔵
  • ファイルの diff を Vim 内で表示
  • 拡張正規表現(+, ?, a, x, zs, ze ...)の追加
  • 無限アンドゥ・リドゥが可能
  • 補完機能
  • マッピングが柔軟になっている
  • Vim script やプラグインによる強力なカスタマイズ
  • シンタックスハイライト
  • ビジュアルモード
  • テキストオブジェクト
  • リモートファイルやディレクトリを開くことができる
  • ステータス行への情報の表示
  • 多言語対応

次回は「Quick Fix」について解説する予定です。

[1]実際には、.vimrc が存在した時点で自動的に ‘nocompatible’ オプションがセットされます( :help nocompatible 参照)。システムがあらかじめ.vimrc ファイルを用意していることが多いことを考慮すると、Vim を起動したときに set nocompatible が設定されていないことはほとんどありません。ただ、「Vim を Vim として使う」ことを明示するため、本連載では set nocompatible を記述することを推奨しています。
[2]正確には、’nocompatible’ オプションがセットされている場合 (‘compatible’ オプションが無効になっている場合)、vi 互換モードではなくなります。’no{オプション名}’ のオプションをセットするとは、’{オプション名}’ のオプションを無効化する、と同義です。
[3]Ubuntu 12.04 環境で確認。この動作を防ぐには、”alias vi=’vim -C -u NONE’” とエイリアスをしておくと確実です。
This article is made by Vim.

著者プロフィール

v

ブイ。社内では数少ない Vim 使い。ブログ記事の執筆により、社内でのVim の知名度を上げ、Vim を使用する人を増やそうと計画しているらしい。

記事一覧Index