この記事は vim advent calendar の 8 日目の記事。
http://qiita.com/advent-calendar/2015/vim
vimconf 2015 でのどっちしゃべるか迷ってしゃべらなかったほうのテーマを書く。
rlhelp.vim は年末にいじるよ…。
ここで書くのは複数環境で動く .vimrc や .gvimrc の書き方であって、それらを複数環境で同期させる方法ではない。これについてはそのうち書くかも。
どうやって環境を切り分けるかというのはわりと出てくるんだけど、どういうときに切り分けたほうがいいか、うまい切り分け方というのはあまりない情報なので自分の設定から引っ張りだしてみる。
- https://raw.githubusercontent.com/januswel/dotfiles/master/.vimrc
- https://raw.githubusercontent.com/januswel/dotfiles/master/.gvimrc
動かしてる環境は次。
- MacVim
- GUI, term 両方
- Windows Kaoriya 版 gvim
- GUI のみ
- CentOS vim-enhanced
- term のみ
.gvimrc
まず GUI 環境向けの設定は .gvimrc に書くようにする。
" display & informationsetlines=25" typicalsetcolumns=90" margin for 'number' and 'foldcolumn'setcmdheight=1" MacVim $VIM/gvimrc overwrites my .vimrc settingssetguioptions=c" show no GUI components" no way to use a mousesetmouse=setnomousefocussetmousehide" fontif has('win32') " When VL Gothic isn't found in the system, use MS Gothic.setguifont=VL_Gothic:h12:cSHIFTJIS,MS_Gothic:h12:cSHIFTJIS
setlinespace=0elseif has('mac')setguifont=VL_Gothic:h16
setlinespace=0endif" turn off disabling IM at entering input modeif exists('&imdisableactivate')set noimdisableactivate
endif
次のオプションは GUI オンリーではないんだけど term 環境でいじると「ちがうそうじゃない」となるのでこちらに書く。
- 'lines'
- 'columns'
また、ランタイムによっては $VIM/gvimrc で .vimrc の設定を書き換えてしまうものもあるのでそれはさらに .gvimrc で再設定しなおす。この例では 'cmdheight' 。
ここらへんは次のページを参照。
http://qiita.com/janus_wel/items/925feab6bf5d35a42e1e
他はマウスやフォントなど、 GUI ならではの設定が並ぶ。
フォントは環境によって指定方法が異なるので :help setting-guifontを読んだり、 set guifont?して使っているシステムの指定方法を確認するといい。
フォントによっては 1 行の間隔が開きすぎているものもあるのでその場合は 'linespace' に負の数を指定すると行間をつめることができる。
特定のオプションがあるかどうかを exists で調べることができる。上の例だと imdisableactivate オプションがあるかどうか。なぜか imdisableactivate はヘルプにないからオプションがあるかどうかを直で調べるしかないんだよね…。
encoding
ここからすべて .vimrc の内容。
基本的に Windows 以外は UTF-8 環境なので 'encoding' を変更する必要はないんだけど Windows だけは cmd.exe が cp932 しか扱えないのでそこらへんをうまくする。
if has('win32')if has('gui_running')let&termencoding=&encodingsetencoding=utf-8elsesetencoding=cp932
endifendif
GUI のことは .gvimrc に書くと言っといてアレなんだけど、 'encoding' に関する設定が分散するのは避けたいので .vimrc 側に集約する。
cmd.exe から vim 起動すると cp932 環境で完結するのである意味楽なんだけど gvim で UTF-8 使ってると :!ではじまるコマンド打つときにそのままでは文字コードがあわなくて文字化けする。たとえば :!mkdir 新しいフォルダとか。
その場合 'termencoding' というオプションがあるのでこれをあわせてやる。 cmd.exe が呼び出されるときに引数を 'encoding' から 'termencoding' に変換して渡してくれる。
クリップボード
yank 内容をクリップボードと共有する設定。
if has('gui')|| has('xterm_clipboard')setclipboard=unnamed
endif
has 関数に見慣れない文字列を指定しているけど、これはランタイムが指定した機能を持っているかどうかをチェックしている。
各オプションが使えるかどうかを調べる場合はヘルプを読む。たとえば上の例だと :help 'clipboard'すると次のようなことが書いてある。
{only in GUI versions or when the |+xterm_clipboard| feature is included}
only in GUI versions
と書いてある場合 has('gui')
と書く。
同様に +feature_name feature
云々と書いてある場合 has('feature_name')
と書いていく。で、今回は or
とも書いてあるので ||
でつなぐという塩梅。
印刷
if has('printer')setprintoptions=number:ysetprintheader=%<%t%=page\ %Nif has('win32')setprintfont=VL_Gothic:h12:cSHIFTJIS
endifendif
印刷関連の設定。これも printer 機能があるかどうかを調べてから設定する。
ちなみに手早く目的とする機能を持ったランタイムかどうかを確認するには :version。機能一覧が +/- 付きで出てくる。 + が使える / - が使えない。
プラグイン読み込み制御
標準でついてくるプラグインをロードさせない、という設定もできる。
if has('win32') " in Windows, processing tar, gzip and zip with vim is non-sense...let loaded_gzip =1let loaded_tarPlugin =1let loaded_zipPlugin =1else " setting for bash (:help sh.vim)let is_bash =1endif
一般的な vim プラグインの作法として特定の変数が定義されていると読み込まない、というものがある。なので標準プラグインなんだけど特にいらないや、という場合 .vimrc で先に該当変数を定義して読み込みを抑止できる。
上の例のそれぞれ詳細は次のヘルプに譲る。
- loaded_gzip
- :help gzip
- loaded_tarPlugin
- :help :TarDiff
- loaded_zipPlugin
- :help g:zip_zipcmd
- is_bash
- :help sh.vim
スペルチェック
特定の機能があるときだけマッピングを有効にする、ということもできる。
if has('spell')&& has('syntax')nnoremap<silent><Leader>s :setlocalspell!<CR>:setlocalspell?<CR>endif
:setlocal spellでそのバッファーだけスペルチェックを有効にできる。このスペルチェックは :help 'spell'読むとわかるとおり spell 機能と syntax 機能が必要なのでそのチェックをしている。
スペルチェックは日本語を認識しないので常に有効にすると日本語の下に常に波線が出てしまうのでこうやって必要なときに有効にしている。
まとめ
いろいろな環境で動くのが vim の利点ということを kaoriya さんが言っていたけども、実際にいろいろな環境に適応させるにはいろいろな設定が必要なのでみんなでこういう情報共有していきましょう。