rcmdnk's blog

Amazon.co.jp: Simple Skeletons: VIMIC: デジタルミュージック

先日Vim 8.0がリリース されましたが、最近プラグインで8.0以上じゃないとダメだよ、という 物も出てきました。

こう言った時に、 dein.vim等を使ってvimrcで 全てのプラグインを管理していると古いvimしか入ってない環境でちょっと面倒です。

そういった場合に一つのvimrcで簡単に処理する書き方について。

vimrc内でのVimのバージョンチェック

vimrcに限ったことではありませんが、 Vimのメジャーバージョンはv:versionと言う値に入っています。

コマンドモードで

:ehco v:version

とすると800とか704とか出てくると思います。(vim 7.4だと704。)

これを使えばVimスクリプトで

1
2
3
if v:version >= 800
  echo "settings for new version!"
endif

みたいな感じでif文で囲ってそのバージョンに沿った設定を書いていけばOK。

また、細かいパッチレベルで導入された設定とか対応プラグインを使いたい場合は、

1
2
3
if (v:version == 704 && has("patch786")) || v:version >= 705
  echo "settings for 7.4 + patch 786 or later"
endif

な感じで、hasを使ってpatch + パッチ番号を調べることで そのパッチが入ってるかどうかを調べられます。

今使っている.vimrc の中だと、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"...
" Dein
if s:use_dein && v:version >= 704
  " settings for dein
  " ...
  if (v:version == 704 && has("patch786")) || v:version >= 705
    call dein#add('itchyny/vim-parenmatch')
  endif
  " ...
  if v:version >= 800
    call dein#add('chrisbra/vim-diff-enhanced')
  endif
  " ...
endif
"...
" Colors
augroup MyColors
  autocmd!
  "...
  " Set all white characters on black background for current line
  if &cursorline
    autocmd ColorScheme * hi CursorLine cterm=underline
    autocmd InsertEnter * hi CursorLine cterm=bold
    autocmd InsertLeave * hi CursorLine cterm=underline

    " SpecialKey, needed for cursorline
    autocmd ColorScheme * hi link MySpecialKey SpecialKey
    if v:version >= 702
      autocmd VimEnter,WinEnter * let w:m_sp = matchadd("MySpecialKey", '\(\t\| \+$\)')
    else
      autocmd VimEnter,WinEnter * match MySpecialKey '\(\t\| \+$\)'
    end
  endif
  "...
  " two-byte space
  autocmd ColorScheme * hi link TwoByteSpace Error
  if v:version >= 702
    autocmd VimEnter,WinEnter * let w:m_tbs = matchadd("TwoByteSpace", ' ')
  else
    autocmd VimEnter,WinEnter * 2match TwoByteSpace ' '
  end
  "...
augroup END
"...
" Ignore double-width characters
if (v:version == 704 && has("patch88")) || v:version >= 705
  set spelllang+=cjk
endif
"...
" Break indent
"if (v:version == 704 && has("patch338")) || v:version >= 705
"  set breakindent    " indent even for wrapped lines
"  " breakindent option (autocmd is necessary when new file is opened in Vim)
"  " necessary even for default(min:20,shift:0)
"  autocmd MyAutoGroup BufEnter * set breakindentopt=min:20,shift:0
"endif
"...
" No automatic break at the end of the file
if (v:version == 704 && has("patch785")) || v:version >= 705
  set nofixendofline
endif
"...

こんな感じ。

dein.vimは7.4以上対応なのでそのように。

dein.vimで導入しているプラグインのうち、 itchyny/vim-parenmatch という、カッコのマッチング表示をVimのデフォルト版より軽量にしたものですが、 この中で使ってるOptionSetというイベントが導入されたのが 7.4のパッチ786なのでそれを要求。

chrisbra/vim-diff-enhanceddiffの表示をより良い感じにしてくれるプラグインですが、 このプラグインが最近のアップデートで8.0を要求してくる様になりました。 以前は7.4で使えていたのですが、 昨日の変更 で8.0を要求する様になったみたいです。

Color設定のところでは全角文字を可視化したりするのにmatchaddを使っていますが、この関数が7.2から 導入されたものなので7.2以上で使います。 7.1以下ではmatch2matchを使っていますが、 これとあと3matchというのがあり、これらは一度しか使えないため (もう一度使うと前の設定は破棄される) ここではまだ大丈夫ですがもっと色々設定したいと思うと破綻してしまいます。

その場合は優先度の低いものを無視、と言う形にすると思いますが、 もう7.1とかしか使えない環境なら逆にわざわざvimrcを持ってくほどでもないので それ程気にする所でもないかな、と。

set spelllang+=cjkはスペルチェック時に日本語を除外する設定です。 英語などでスペルチェックを有効にしておくと日本語の様な2バイト文字は全て 意味不明なものとしてスペルチェックにひっかかってしまいます。

主に日本語書く時には切っておけば良い、というものではあるのですが、 いちいち変更するのも面倒なので日本語とかはチェックから外したい、 という場合には7.4 patch88以降だとこの設定が出来ます。

breakindentは7.4 patch338で導入されたオプションで wrapオプションを有効にして長い行を折り返す様に表示している場合、 折り返された行もその行の本来のインデントの一から折り返し業が始まる様に出来るオプションです。

ちょっと短い画面の表示とかだと逆に見づらいかな、ということで今はオフにしていますが、 ものによっては大分見やすくなるものもあると思うので好みで。

fixendofline(またはfixeol)は7.4 patch 785で導入されたオプションで、 有効になっているとファイルの最終行に改行コードを加える様になります。

デフォルトでオンになっていますが、このオプションが導入される前は 常にオンな状態で動作を変えるにはファイルをバイナリとして認識させ この最後に加える仕様を止める等という無理矢理な方法しかありませんでした。

このオプションが導入されたことによりnofixendoflineを設定しておくだけで 勝手に改行コードを追加することはなくなります。

というわけで、ちょっとプラグインのアップデートでバージョンチェックの 更新が必要だったので使ってる所をおさらいしてみた、と言う感じです。

恐らくまだパッチでバージョン途中で追加されたオプションに関するものとかで 7.3, 7.4辺りにも見逃してるものが多々あると思いますが、 何か気づいたものがあれば教えてもらえるとうれしいです。

Sponsored Links
Sponsored Links

« GNU screenで再接続時に二重起動を防ぐスクリプト Bose QuietControl 30の予約が開始されていた »

}