Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

実践 複数環境で動く .vimrc/.gvimrc

$
0
0

この記事は vim advent calendar の 8 日目の記事。

http://qiita.com/advent-calendar/2015/vim

vimconf 2015 でのどっちしゃべるか迷ってしゃべらなかったほうのテーマを書く。
rlhelp.vim は年末にいじるよ…。

ここで書くのは複数環境で動く .vimrc や .gvimrc の書き方であって、それらを複数環境で同期させる方法ではない。これについてはそのうち書くかも。

どうやって環境を切り分けるかというのはわりと出てくるんだけど、どういうときに切り分けたほうがいいか、うまい切り分け方というのはあまりない情報なので自分の設定から引っ張りだしてみる。

動かしてる環境は次。

  • MacVim
    • GUI, term 両方
  • Windows Kaoriya 版 gvim
    • GUI のみ
  • CentOS vim-enhanced
    • term のみ

.gvimrc

まず GUI 環境向けの設定は .gvimrc に書くようにする。

.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 さんが言っていたけども、実際にいろいろな環境に適応させるにはいろいろな設定が必要なのでみんなでこういう情報共有していきましょう。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>