.vimrcでviとvimを区別する
viとvimが別々のバイナリとして入っているLinuxディストリビューションでも、
同じソース(vim)を異なるコンフィグでコンパイルされたものであることが多いようです。当然ですが。
要するに /bin/vi も、実体はコンフィグの異なるvimなのです。
どのようなコンフィグでコンパイルされたかを知るには、--versionをつけてコマンドを実行します。
以下はFedora18の例です。
[vi]
% vi --version VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov 12 2012 14:48:38) Included patches: 1-415, 417-712 Modified by <bugzilla@redhat.com> Compiled by <bugzilla@redhat.com> 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_sgr -mouse_sysmouse -mouse_urxvt -mouse_xterm +multi_byte -multi_lang -mzscheme -netbeans_intg -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: "/etc/virc" user vimrc file: "$HOME/.vimrc" user exrc file: "$HOME/.exrc" fall-back for $VIM: "/etc" f-b for $VIMRUNTIME: "/usr/share/vim/vim73" Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -I/usr/local/include -O2 -g -pipe -Wall -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 Linking: gcc -Wl,-z,relro -L/usr/local/lib -Wl,--as-needed -o vim -lm -lselinux -lncurses -lacl -lattr -ldl
[vim]
% vim --version VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 14 2013 13:18:45) 適用済パッチ: 1-415, 417-944 Modified by <bugzilla@redhat.com> Compiled by <bugzilla@redhat.com> Huge 版 without GUI. 機能の一覧 有効(+)/無効(-) +arabic +file_in_path +mouse_sgr +tag_binary +autocmd +find_in_path -mouse_sysmouse +tag_old_static -balloon_eval +float +mouse_urxvt -tag_any_white -browse +folding +mouse_xterm -tcl ++builtin_terms -footer +multi_byte +terminfo +byte_offset +fork() +multi_lang +termresponse +cindent +gettext -mzscheme +textobjects -clientserver -hangul_input +netbeans_intg +title -clipboard +iconv +path_extra -toolbar +cmdline_compl +insert_expand +perl +user_commands +cmdline_hist +jumplist +persistent_undo +vertsplit +cmdline_info +keymap +postscript +virtualedit +comments +langmap +printer +visual +conceal +libcall +profile +visualextra +cryptv +linebreak +python/dyn +viminfo +cscope +lispindent -python3 +vreplace +cursorbind +listcmds +quickfix +wildignore +cursorshape +localmap +reltime +wildmenu +dialog_con -lua +rightleft +windows +diff +menu +ruby/dyn +writebackup +digraphs +mksession +scrollbind -X11 -dnd +modify_fname +signs -xfontset -ebcdic +mouse +smartindent -xim +emacs_tags -mouseshape -sniff -xsmp +eval +mouse_dec +startuptime -xterm_clipboard +ex_extra +mouse_gpm +statusline -xterm_save +extra_search -mouse_jsbterm -sun_workshop +farsi +mouse_netterm +syntax システム vimrc: "/etc/vimrc" ユーザ vimrc: "$HOME/.vimrc" ユーザ exrc: "$HOME/.exrc" 省略時の $VIM: "/etc" 省略時の $VIMRUNTIME: "/usr/share/vim/vim73" コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -I/usr/local/include -O2 -g -pipe -Wall -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 リンク: gcc -L. -Wl,-z,relro -rdynamic -Wl,-export-dynamic -Wl,--enable-new-dtags -Wl,-rpath,/usr/lib/perl5/CORE -Wl,-z,relro -L/usr/local/lib -Wl,--as-needed -o vim -lm -lnsl -lselinux -lncurses -lacl -lattr -lgpm -ldl -Wl,--enable-new-dtags -Wl,-rpath,/usr/lib/perl5/CORE -fstack-protector -L/usr/local/lib -L/usr/lib/perl5/CORE -lperl -lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
で、ちょっと意外なのがviも .vimrc を読みに行くという事実なのです。
できればviは.exrcだけを読んでほしいと思うのですが...
なので、viで解釈できない文を.vimrcに書いてしまうとロード時にエラーとなってしまいます。
例えばNeoBundle(https://github.com/Shougo/neobundle.vim)を使おうとすると、
サンプルにあるように以下のような.vimrcになります。
set nocompatible if has('vim_starting') set runtimepath+=~/.vim/bundle/neobundle.vim/ endif call neobundle#rc(expand('~/.vim/bundle/')) NeoBundleFetch 'Shougo/neobundle.vim' NeoBundle 'Shougo/vimproc' ... filetype plugin indent on NeoBundleCheck
ところがこの状態でvimでなくてviを起動すると、以下のようなエラーが出てしまいます。
% /bin/vi Error detected while processing /home/penkoba/.vimrc: line 6: E492: Not an editor command: NeoBundleFetch 'Shougo/neobundle.vim' line 7: E492: Not an editor command: NeoBundle 'Shougo/vimproc' line 12: E492: Not an editor command: NeoBundleCheck
そこで、さきほどの.vimrcを修正します。
if 1 set nocompatible if has('vim_starting') set runtimepath+=~/.vim/bundle/neobundle.vim/ endif call neobundle#rc(expand('~/.vim/bundle/')) NeoBundleFetch 'Shougo/neobundle.vim' NeoBundle 'Shougo/vimproc' ... filetype plugin indent on NeoBundleCheck endif
全体を if 1 〜 endif で括りました。
これでviを起動してもエラーとなりません。
これは、vimのビルドconfig中の +eval/-eval の違いを利用しています。
eval featureが組み込まれていない場合(vi)、この区間はコメントとして扱われ、無視されます。
注意しなくてはならないのは、viにはifが条件文として解釈されるわけではないので、
if 0 と書けばviのみで実行されるというわけではありませんし、else節を書いても無駄という点です。
ただしifのネストは許可されていて、対応するendifまできちんと無視してくれます。
(上記例でもネストしていますが、5行目のendifでは終わらずに最後のendifまでコメントとして解釈されます)
詳しくはvimで :h no-eval-feature でヘルプが読めます。
vimがあるのにviを使うことがあるのかという疑問があるかもしれませんが、
例えばgitのコミットメッセージを修正するときのデフォルトエディタはviだったりするので
一応viも気持ちよく使えるようにしておくに越したことはないですね。