Help us understand the problem. What is going on with this article?

Vim の種類 (Vim family)

More than 1 year has passed since last update.

みなさん、Vim は使ってますか。ひとくちに Vim と言っても、多くの種類(タイプ)が存在しています。ディストリビューションごとに最適化されたもの(vim-gtk など)や、そもそも Vim 自体の機能が制限されたもの(vim-tiny など)などが存在しています。しかし、環境に依存しない Vim 自体の種類(タイプ)として基本的に以下の5つに大別できます。

  • tiny
  • small
  • normal
  • big
  • huge

です。以上の5つは Vim の機能が制約された順(昇順;英語通り一番上が一番小さい)に並んでいます。それぞれの Vim についてどの機能が解放されているかはここにて記述されています。もしくは、Vim のヘルプコマンドでも確認できるので、:h[elp] ve[rsion] を実行してください。また、比較的目にする Vim の中に、vim.basicvim.full というものがありますが、これらについても後述します(これらは基本的な Vim ファミリーとしてはカウントしない。同様に vim-enhancedvim-common も同様)

あなたの Vim はどのタイプ?

$ vim --version | grep -e Huge -e Small -e Normal
Huge version without GUI.  Features included (+) or not (-):

標準出力の先頭に注目です。Huge とあります。この Vim は今回、この記事で目指そうとしている Vim のタイプサイズです。これが、Huge 以外、ましてや Small であったりするのなら、あなたにとってこの記事は有意義かもしれません。また、grep の or検索で、3タイプしか指定していませんがバージョン情報で得られるタイプは3つしかないようです(Tiny / Big はそれぞれ Small / Huge 側で吸収される?もしくはどちらとも Normal に属する?調べてもわかりませんでした…)

Vim tiny

vim-tiny とは、最小構成でビルドされた Vim です。シンタックスハイライト(:syntax on)が有効にならなかったり、複数バッファ(:n など)、テキストオブジェクト(ciw)などが使用できなかったらまず間違いなく tiny な Vim がインストールされています。Ubuntu ではデフォルトで vim-tiny です。

$ uname -a
Linux ubuntu 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ which vi
/usr/bin/vi
$ ls -l /usr/bin/vi
/usr/bin/vi -> /etc/alternatives/vi
$ ls -l /etc/alternatives/vi
/etc/alternatives/vi -> /usr/bin/vim.tiny

Ubuntu ユーザはまっさきに tiny じゃない Vim をインストールするべきです!

話を戻し、vim-tiny について書き連ねます。

$ vim.tiny --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct  6 2011 10:32:12)
Included patches: 1-154
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Small version without GUI.  Features included (+) or not (-):
-arabic -autocmd -balloon_eval -browse +builtin_terms -byte_offset -cindent 
-clientserver -clipboard -cmdline_compl +cmdline_hist -cmdline_info -comments 
-conceal -cryptv -cscope -cursorbind -cursorshape -dialog -diff -digraphs -dnd 
-ebcdic -emacs_tags -eval -ex_extra -extra_search -farsi -file_in_path 
-find_in_path -float -folding -footer +fork() -gettext -hangul_input +iconv 
-insert_expand +jumplist -keymap -langmap -libcall -linebreak -lispindent 
-listcmds -localmap -lua -menu -mksession -modify_fname -mouse -mouse_dec 
-mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse -mouse_xterm 
+multi_byte -multi_lang -mzscheme -netbeans_intg -osfiletype -path_extra -perl 
-persistent_undo -printer -profile -python -python3 -quickfix -reltime 
-rightleft -ruby -scrollbind -signs -smartindent -sniff -startuptime 
-statusline -sun_workshop -syntax -tag_binary -tag_old_static -tag_any_white 
-tcl +terminfo -termresponse -textobjects -title -toolbar -user_commands 
-vertsplit -virtualedit +visual -visualextra -viminfo -vreplace +wildignore 
-wildmenu +windows +writebackup -X11 +xfontset -xim -xsmp -xterm_clipboard 
-xterm_save 
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
  user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H     -Wall -g -O2 -DTINY_VIMRC -D_FORTIFY_SOURCE=1      
Linking: gcc   -Wl,-Bsymbolic-functions -Wl,--as-needed -o vim    -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo  -lselinux -ldl

vim-tiny の詳細情報(バージョン)を確認したところ、約120の features(機能)のうち12個しか有効になっていません。それぞれ見ていきます。

+builtin_terms      幾つかの組み込み端末 |builtin-terms| をサポート
+cmdline_hist       ユーザーの打ち込んだコマンドは記録される。これらの履歴は上下矢印キーで呼び出せる
+fork()             Unix のみ。fork コマンドをサポート
+iconv              エンコーディングの変換をサポート。utf8<->latin1
+jumplist           CTRL-O と CTRL-I コマンドで前の古い位置に移動し、
                    そして再び新しい位置に戻ることができます。
+multi_byte         Multibyte サポート
+terminfo           terminfo で termcapを代替
+visual             Visual mode サポート (矩形選択モードを除く)
+wildignore         ファイルパターンのリスト。パターンのどれかにマッチしたファイルは、
                    ワイルドカードの展開時と、ファイル/ディレクトリ名の補完時に無視される
+windows            1つ以上のウィンドウをサポート
+writebackup        'writebackup'|がデフォルトで有効
+xfontset           X fontset サポート

ヴィジュアルモードはあるものの、矩形選択はできないようですね。機能が少ないということは、サイズも小さいということです。

$ du -h /usr/local/bin/vim
2.1M    /usr/local/bin/vim
$ du -h /usr/bin/vim.tiny
615K    /usr/bin/vim.tiny

上は huge な Vim です。全然違いますね。

tiny な vim ではほとんどのことが出来ません。:echo でさえ E319: Sorry, the command is not abailable in this version と言われてしまいます。つまり、あなたが手塩にかけて育ててきた vimrc は多くが機能しません。そんな場合に以下の一文を vimrc 冒頭に書いておきましょう。

if !1 | finish | endif

if で評価して1でなければ、スクリプトの読み込みを終了します。これは、+eval がない時でも、if 1 だけは評価してくれるので、それを利用してます。

{expr1}が非ゼロと評価された場合に、対応する ":else" か ":endif" までの命令を実行する。(:h if)

こうしておくことで、tiny な Vim で設定済みの vimrc を読み込んだ時の大量エラーを未然に防ぐ事ができます。

その他の Vim(small, normal, big, huge)

features list を載せておきます。

行頭の文字はその機能が含まれる最小構成です

略称 タイプ
T tiny
S small
N normal
B big
H huge
m 手動で組み込むか他の機能に依存
(none) システム依存

例えば "N" と書いてあれば、その機能は normal、big、huge バージョンの Vim に含まれます。(:h ve)

vim.basic

基本的に Vim は vim.basic のソフトリンクになっている、もしくは完全な複製になっています。つまり、sudo apt-get install vimvimvim.basic を指しています。

$ diff -s <(vim --version) <(vim.basic --version)
Files /dev/fd/63 and /dev/fd/62 are identical

表示されるバージョン情報が一致しています。つまり、機能などが同じということです。md5 チェックサムを確認してみましょう。

$ md5sum /usr/bin/vim
846a03055b1ca58efd3a49313f44b665    /usr/bin/vim
$ md5sum /usr/bin/vim.basic
846a03055b1ca58efd3a49313f44b665    /usr/bin/vim.basic

同一ですね。ls -l で詳細を辿って行くと、/usr/bin/vim -> /etc/alternatives/vim -> /usr/bin/vim.basic であることでわかります。つまり、一般的な Vim = vim.basic です。

vim.full

以前、パッケージリストの中にあった vim.full は今は存在していません。しかし、手動で Vim 関連パッケージをインストールすることで full な Vim にすることができます。

$ apt-cache search vim | grep vim-
jvim-canna - Japanized VIM (Canna version)
jvim-doc - Documentation for jvim (Japanized VIM)
vim-addon-manager - manager of addons for the Vim editor
vim-gtk - Vi IMproved - enhanced vi editor - with GTK2 GUI
vim-latexsuite - view, edit and compile LaTeX documents from within Vim
vim-nox - Vi IMproved - enhanced vi editor
vim-scripts - plugins for vim, adding bells and whistles
vim-syntax-gtk - Syntax files to highlight GTK+ keywords in vim
vim-vimoutliner - script for building an outline editor on top of Vim
vim-common - Vi IMproved - Common files
vim-dbg - Vi IMproved - enhanced vi editor (debugging symbols)
vim-doc - Vi IMproved - HTML documentation
vim-gnome - Vi IMproved - enhanced vi editor - with GNOME2 GUI
vim-gui-common - Vi IMproved - Common GUI files
vim-runtime - Vi IMproved - Runtime files
vim-tiny - Vi IMproved - enhanced vi editor - compact version
vim-rails - plugins for vim to allow easier editing of Rails Applications
  • GUI

    $ sudo apt-get install vim-gnome
    
  • without GUI

    $ sudo apt-get install vim-nox
    

GUI を必要とするか否かでインストールしなければならない Vim も変わるということです。

結局どうすればいいのか

とりあえず、huge な Vim さえインストールできればいいんです。つまり、ソースからビルドしましょう。

Vim をソースからビルドする

[手順]

  • 公式サイトから Raw vim をダウンロードし、パッチを当てる
  • パッチ適応済みのリポジトリからダウンロード

どちらかの方法で Vim のソースコードを準備できればよいです。今回は後者で行きます。前者は非常に面倒です。何事も簡潔な方がいいので後者を採用します。どうしても前者がいいという方は、以下のサイトを参考にしてみてください。

現在(2014/7/15)の最新バージョンは7.4α版です。

Mercurial 利用

$ sudo apt-get install mercurial
$ hg clone https://vim.googlecode.com/hg/ vim74

Mercurial で Vim を引っ張ってくる方法がデファクトスタンダートとなりつつあるようです。カレントディレクトリにダウンロードされます。

Git 利用

vim-jp が非公式で Git にリポジトリを複製しているので、Git からでもソースコードを取得できます。

$ sudo apt-get install git
$ git clone https://github.com/vim-jp/vim.git vim74

また今回、Mercurial と Git があがりましたが、以下の文献も参照されたし。

事前準備をする

gccmake などのツールがインストールされていなければしてください。ほぼ多くの環境ではすでにされていると思いますが。

$ sudo apt-get install build-essential gettext

ncurses を用意する

ncurses は、端末に依存しない形式でテキストユーザインタフェース(TUI)を作成するための API を提供するライブラリ。画面切り替えを最適化し、リモートシェルで使ってもレイテンシを最小に抑えるようになっている。(ncurses - Wikipedia)

Vim のビルドに必須です。

$ sudo apt-get install libncurses5-dev

各種スクリプト言語のインターフェースを有効化するための準備

スクリプト言語 コマンド
Python $ sudo apt-get install python-dev python3-dev
Ruby $ sudo apt-get install ruby-dev ruby-devel
Perl $ sudo apt-get install libperl-dev
Lua $ sudo apt-get install luajit lua5.2 liblua5.2-dev
Tcl $ sudo apt-get install tcl-dev
Scheme $ sudo apt-get install plt-scheme

GVim のインターフェースを有効化するための準備

必要ならどうぞ

$ sudo apt-get install xorg-dev libgtk2.0-dev

ビルドします!

さきほどダウンロードしたディレクトリへ。

$ cd vim74

いつもの ./confugure && make && sudo make install なのですが、./configure に引数を指定します。

$ ./configure \
--prefix=$HOME/local \
--with-features=huge \
--enable-multibyte \
--enable-rubyinterp \
--enable-pythoninterp \
--enable-perlinterp \
--enable-fontset

結論から言うと上記のようにしました。見やすさから改行を入れていますが、以下にワンライナーも載せておきます。コピペの際に…

$ ./configure --prefix=$HOME/local --with-features=huge --enable-multibyte --enable-rubyinterp --enable-pythoninterp --enable-perlinterp --enable-fontset

ここで引数の説明です。

  • --prefix=PATH でインストール先のパスを設定します
    • デフォルトでは /usr/local/
    • このディレクトリ以下に bin/man/ ができます
  • --with-features で Vim の大まかな機能を設定します
    • ここで指定できるのは今までで説明してきた、tiny、small、normal、big、huge です
    • デフォルトでは normal。何もなければ huge が安泰
    • どの type で何が有効になるかはここを参照
  • --enable-FEATURE で「機能」が有効化します
  • --disable-FEATURE で「機能」が無効化します
  • --with-PACKAGE で「パッケージ」が有効化します
  • --without-PACKAGE で「パッケージ」が無効化します
  • FEATURE や PACKAGE の一覧は ./configure --help で見れます。

最後に make してエラーがなければビルド完了します。

$ make && sudo make install

これでOKです。

$ $HOME/local/vim --version | grep Huge
Huge version without GUI.  Features included (+) or not (-):

結論

長々と書いてきたため、何を言いたかったのか伝わりにくいので以下に箇条書します。

  • Vim にはいっぱい種類がある
  • いろんなサイズの Vim がある
  • vim-tiny は一番小さい。Ubuntu ではデフォ
  • とりあえず、Huge な Vim であれば問題ない
  • Huge な Vim を入れよう

Huge な Vim を入れよう!

Huge な Vim を入れよう!

課題

  • vim-enhanced
  • vim-common
  • 上記2つについて言及
  • これらはあくまでもパッケージ名である。Vim 自体のタイプではない

参考文献

mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away