🔗

vi を Vim ではなく nvi にする (update-alternatives)

2021/08/30に公開

Vim と nvi

vi は Unix な環境で多くの人々に愛されるエディタの一つです。しかし、今日ではオリジナルの vi が使われることは多くなく、代わりに Vim や nvi が利用されています。

Vim は高機能なエディタです。Vi IMproved の名にあるように、オリジナルの vi に数多くの改良を加え強力なエディタとして成長しています。最近の Linux ディストリビューションでは vi と実行すると Vim が起動するものが少なくありません。

nvi は Vim と異なりシンプルなエディタです。オリジナルの vi との互換性が高く、軽量なエディタに仕上がっています。FreeBSD や NetBSD などでは vi と実行すると nvi が起動します。

vi はシンプルでありたい

私はよく Vim を利用します。Vim の高度に発展した機能はもはや生活の一部と言っても過言ではありません。しかし、そんな Vim は高機能過ぎるが故に、もはや vi ではないようにすら感じられます。vi の本来の動作により忠実であるのは nvi です。vi と実行したときには nvi が起動すべきだと感じます。

ここでは、vi と実行したときに Vim ではなく nvi を起動するように設定を変更します。

実行環境

Vim と nvi はインストール済です。

$ uname -r
5.11.0-27-generic
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"

vi の中身

私達が vi と実行したときに実行されるファイルはどこにあるのでしょうか。そしてそれは何者なのでしょうか。これを知るには which コマンドと ls -l コマンドを利用します。

$ which vi
/usr/bin/vi
$ ls -l $(which vi)
lrwxrwxrwx 1 root root 20 Aug 20 07:48 /usr/bin/vi -> /etc/alternatives/vi

vi の実行ファイルは /usr/bin/vi にあって、それは /etc/alternatives/vi へのシンボリックリンクのようです。さらに追い掛けてみましょう。

$ ls -l $(readlink `which vi`)
lrwxrwxrwx 1 root root 17 Aug 20 07:48 /etc/alternatives/vi -> /usr/bin/vim.gtk3
$ ls -l $(readlink $(readlink `which vi`))
-rwxr-xr-x 1 root root 3503512 Apr 15  2020 /usr/bin/vim.gtk3

vi の実行ファイルは 2 段階のリンクになっていて、最終的に Vim の実行ファイル (/usr/bin/vim.gtk3) に行き着きました。

/etc/alternatives は何者か

前章を見ると /usr/bin/vi から直接 /usr/bin/vim.gtk3 にリンクしても良いように思われます。どうしてわざわざ /etc/alternatives 配下を経由して 2 段階のリンクにしているのでしょうか。

一般的なコマンドには複数の実装がある場合があります。例えば、vi には Vim や nvi といった実装があり、cc には gcc や clang といった実装があります。ここでは、vi や cc といったコマンド (のパス、またはファイル名) を一般名 (general name)、Vim や gcc といったコマンドの実装 (のパス、またはファイル名) を選択肢 (alternative) と呼ぶことにします。

前章で確認したように、一般名はその機能を提供する何らかの選択肢へのシンボリックリンクとなっています。ここで一般名から選択肢への直接のリンクにするのではなく、/etc/alternatives を介したリンクにすることで嬉しいことがあります。それは、システム管理者が一般名に対する選択肢を変更する場合、変更を /etc 配下で完結させられることです。
FHS によれば、マシン固有の設定は /etc 配下に置くことが推奨されています。対して、/usr は複数のマシンで共有可能なファイルを置くので、内容を書き換えるべきではありません。例えば、/usr/bin にある一般名に対する選択肢を直接変更すると、/usr がネットワークファイルシステムであった場合などに複数のマシンに影響が及ぶことになります (そしてこれはどこかで問題を発生させるかもしれません)。

/etc/alternatives は update-alternative で利用されるディレクトリです。update-alternative は Debian の alternatives システム (一般名に対する選択肢を選択するシステム) を管理するコマンドです。このコマンドを利用することで、一般名に対する選択肢の関連するファイル (man page など) を含めたリンク一式を管理することができます。整合が取れなくなる恐れがあるので /etc/alternatives 配下のシンボリックリンクを直接操作することは控えるべきです。update-alternatives の詳細については man page を参照してください。

vi を Vim ではなく nvi にする

次のように実行すると vi と実行すると nvi が起動するようになります。また、vi の man page など情報なども nvi のそれに変更されます。

$ sudo update-alternatives --config vi
alternative vi (/usr/bin/vi を提供) には 2 個の選択肢があります。

  選択肢    パス             優先度  状態
------------------------------------------------------------
* 0            /usr/bin/vim.gtk3   50        自動モード
  1            /usr/bin/nvi        20        手動モード
  2            /usr/bin/vim.gtk3   50        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 1
update-alternatives: /usr/bin/vi (vi) を提供するためにマニュアルモードで /usr/bin/nvi を使います

この設定を元に戻すには次のように実行します。

$ sudo update-alternatives --auto vi

おわりに

おわりです。

update-alternatives --display editor を実行したところ、ed の優先度が -100 になっていることに気付いて思わず笑ってしまいました。

参考

  • What is etc/alternatives used for?, Ask Ubuntu, Stack Exchange Inc, asked Jun 17 '14 by Pandya, answered Jun 17 '14 by Mahesh. 2021-08-20 閲覧.
  • update-alternatives, Ubuntu Manpage, Canonical Ltd. 2021-08-29 閲覧.
  • 青木峰郎, ふつうの Linux プログラミング 第 2 版, SB クリエイティブ, 2014, pp. 179.
  • hier, Ubuntu Manpage, Canonical Ltd. 2021-08-29 閲覧.

Discussion