f

アーカイブ

2016-08-16

KaoriYa版Vimの独自設定を無効化する方法

WindowsにおけるVimとしては,KaoriYaで配布されているVim(KaoriYa版Vim)が日本では有名だ。

KaoriYa版では使いやすいように公式とは異なるKaoriYa独自の追加設定がなされている。通常であれば,使いやすくなるので問題ないが,一部自分の設定に影響を及ぼしてしまう。このKaoriYa独自設定を無効化したくなったのでその方法を調べた。

2016-08-17T22:00追記:確認にはVim 7.4.1944 +kaoriya (2016-06-20)を使った。

端的に結論を書くと,以下のコマンドをコマンドプロンプトから実行して,KaoriYa版Vimと同じ場所に無効化のための設定ファイルを作ればいい。

REM VIM変数にKaoriYa版Vimの配置場所を指定。例:C:\Users\senooken\local\opt\vim74-kaoriya-win64
set VIM=%USERPROFILE%\local\opt\vim74-kaoriya-win64

echo let g:vimrc_local_finish = 1 > %VIM%\gvimrc_local.vim
echo let g:gvimrc_local_finish = 1 > %VIM%\vimrc_local.vim

KaoriYa版Vimを普段使わない理由と使う理由

個人としては,2年ほど前まではKaoriYa版Vim(GVim)を使っていた。しかし,途中からChocolateyでインストールできることに気づいたので,公式で配布されているVimに切り替えた。公式のVimに切り替えた理由は以下2点だ。

  1. 公式のインストーラーを使えば,右クリックにメニューが追加され便利。
  2. 派生版よりも公式を使ったほうが安心。

第1の理由だが,公式版のVimをインストールすれば,ファイルを右クリックしたときに,[Edit with Vim]というメニューが表示され,これを選ぶことで素早くどんなファイルでもGVimで開くことができる。KaoriYa版GVimでは右クリックのメニューには登録してくれないので,右クリックメニューで使えるようにするには以下のどちらかの方法で自分で設定することになる。

  • 自分でレジストリーをいじって登録
  • 右クリック→[送る]の候補に登録

後者の[送る]メニューへ登録するには,%AppData%\Microsoft\Windows\SendToディレクトリ(エクスプローラーのアドレスにshell:sendtoでもアクセス可能)にgvim.exeのショートカットを配置すればいい。この方法なら管理者権限も不要で簡単だ。しかし,[送る]メニューは右リックメニューの真ん中から下の方に表示されるので,アクセスしにくい。

2016-08-16T23:30追記:なお,右クリックメニューにこだわらなければタスクバーに登録したアイコンからGVimを起動して,ファイルをGVImにドラッグドロップすることでも,素早くアクセスできる。しかし,GVimの起動のためにマウスカーソルをタスクバーに移動させると気が散るのであまりよくない。

右クリックからGVimを使うときのメニュー

第2の理由としては,KaoriYa版独自の設定は使わないほうがいいと思ったからだ。例えば,KaoriYa版のVimではfileencodingjapanという値を使える

2016-08-16T23:30追記:コメントでの指摘のとおり,encodingの値としてjapanはVimの公式設定として利用可能な値だ(:help encoding-values)。ここは,KaoriYa版ではfileencodingsの値に,guessが使えるという記憶違いだった。KaoriYa版の独自設定は,当てているパッチをみれば原理的にはわかるらしいが,Vimのソースに関する知識がいるので理解するのは簡単ではない。公開日が2009年と少し古いが,以下の記事でKaoriYa独自機能について解説されているのでわかりやすい。

KaoriYa 版で追加される機能まとめ - 永遠に未完成

この記事で紹介されている通り,KaoriYa版どうかはif has('kaoriya') ... endifで判別できるので,KaoriYa版独自機能を使うならば,このように条件判定を行ってから使い,公式版のVimでも動作するようにしよう。

しかし,当然ながらこの設定はVimのヘルプには掲載されていない。そのため,例えば,外人やVimをよく知らない人がこの設定をみたら意味を理解するのが極めて難しくなる。だから,このような公式で提供されていない非標準設定の利用は控えるべきだろう。

上記2点の理由から普段はKaoriYa版Vimは使っていない。ただし,KaoriYa版Vimでなければならない場面が1箇所ある。それは,管理者権限が使えない場面だ。管理者権限が使えない状況というのは,例えば会社や共有のパソコンなどでの利用が想定される。管理者権限が使えなければ,公式で配布されているイン ストーラーでインストールすることができない。実際は,公式ではこのことを考えて解凍するだけで使えるバイナリ版も配布している。しかし,これは使わないほうがいい。なぜか?それは,公式の単独パッケージでは以下2点の問題があり極めて使いにくいからだ。

  • バージョンが古い。
  • syntaxやplugin,diff.exeなど通常であれば付属する標準設定・プラグインや標準コマンドが付属しない。

このことから,管理者権限が使えない場面や,レジストリーを汚したくない,携帯性を高めたいという場面においてはKaoriYa版Vimを使うしかない。そのため,会社ではKaoriYa版GVimを使っている。

2016-08-16T23:30追記:コメントでの指摘で初めて知ったが,現在の最新の公式のWindows版VimのNightly BuildがGitHubで配布されているようだ。ここからであれば,必要な付属品が全て同梱されたバイナリーが入手できることを実際にダウンロードして確認できた。指摘をくれたkaoriyaさんにツイートで教えてもらったが,VimのWebページではアナウンスしておらず,メーリングリストでお知らせがあったようだ。

Releasesのページを確認したところ,2016-01-27のv7.4.1185からバイナリー版の配布を始めたようだ。約半年前の今年に入ってからなので比較的最近配布されるようになったようだ。

KaoriYa版Vimの問題点

しかし,KaoriYa版Vimでは前述の通り独自設定がなされており,場合によっては自分の設定と競合することもあるだろう。実際に僕には問題となった。具体的には,gvimrcで設定されているcolorscheme morningの設定だ。

普段は~/.vimrcに以下の設定を記述することで,VimとGVimの両方でカーソル行を薄水色でハイライトするようにしている。

set cursorline  " hightlight cursor line
highlight CursorLine cterm=NONE ctermbg=LightCyan guibg=LightCyan

公式のVimとGVimを使う限り,この設定で何も問題はない。しかし,KaoriYa版GVimでだけ,カーソル行のハイライトがmorningのカラースキームで上書きされてしまう。

回避策としては,~/.gvimrcにも上記のハイライト設定を記述することで,KaoriYa版GVimで設定されたハイライト設定をさらに上書きする方法がある。しかし,公式版のVimでは正常に動作しているのに,日本独自のKaoriYa版Vimのためだけにこのような設定をするのは好ましくない。それに,今まで~/.vimrcの一箇所の設定だけで済んでいたのに,同じ内容を~/.gvimrcにも記述する必要があり,保守性が悪くなってしまう。

2016-08-16T23:30追記:コメントでの指摘のとおり本来であれば,GVim固有の設定は~/.gvimrcに記述すべきであり,このことは以下のとおり公式でも推奨されている。

The gvimrc file is where GUI-specific startup commands should be placed.

:h gvimrc

しかし,:highlightのハイライト設定に限れば,VimとGVimとで同時に設定でき,例えばcolorschemeの設定などで分けて書くのはあまり現実的ではない。だから,~/.vimrcの設定をそのまま使いたい。

KaoriYa版Vimの独自設定の無効化方法

幸いなことに,KaoriYa版の設定を無効化する方法があるので,この方法で対応する。

無効化の方法は,KaoriYa版に付属するvimrcgvimrcの冒頭に記載されている。内容をまとめると以下の表のとおりとなる。

Kaoriya版Vimの独自設定の無効化条件

vimgvim
グローバル設定
  • g:vimrc_local_finishの値が非0
  • $VIM/vimrc_local.vimが存在
  • g:gvimrc_local_finishの値が非0
  • $VIM/gvimrc_local.vimが存在

ユーザー設定
  • g:vimrc_first_finishの値が非0
  • $HOME/.vimrc_first.vimが存在
  • g:gvimrc_first_finishの値が非0
  • $HOME/.gvimrc_first.vimが存在

変数$VIMはKaoriYa版のvim.exeやgvim.exeの配置場所を表す。上記設定を簡単に実現するならば,例えばvimrc_local.vim内にlet g:vimrc_local_finish = 1と記述すればよい。ユーザー設定ファイル.vimrc_first.vimも一応使えるが,ホームディレクトリをあまり汚したくないのでグローバル設定で対処した。

同様の設定をgvimrcに対しても設定すればいい。手作業でやってもいいが,面倒なのでコマンドプロンプトで以下のコマンドを実行してvimrc_local.vimを作成してやればKaoriYa版Vimの独自設定の無効化は完了だ。

REM VIM変数にKaoriYa版Vimの配置場所を指定。例:C:\Users\senooken\local\opt\vim74-kaoriya-win64
set VIM=%USERPROFILE%\local\opt\vim74-kaoriya-win64

echo let g:vimrc_local_finish = 1 > %VIM%\gvimrc_local.vim
echo let g:gvimrc_local_finish = 1 > %VIM%\vimrc_local.vim

自分にはKaoriYa版のgvimrcの設定だけが問題だったので,gvimrcだけ無効化した。

グローバル変数の設定だけで済むのならば,自分の~/.vimrcに以下を追記してやるだけで済む。

let g:vimrc_local_finish  = 1
let g:gvimrc_local_finish = 1

この程度であれば,自分の設定で保持してもいいのだが,無効化にはファイルの存在までチェックしているので,面倒だがファイルを作るしかない。そのため,vimrc_local.vimg:vimrc_local_finishの設定も押し込めた。おそらく,このグローバル変数が他でも使われていることを心配して念の為二重にしているのだろう。

まとめ

KaoriYa版Vimの独自設定を無効化する方法をまとめた。こういったローカル設定に関する情報はあまりないと思うので,誰かの参考になるのではないかと思って記事にまとめた。

KaoriYa版Vimは1999年から配布が行われており,約20年の歴史がある。日本でのVimの普及に大きな役割を担っていると思う。今後もVimを使っていくつもりなので,KaoriYa版Vimの動向もときどきチェックしていこうと思う。上記のKaoriya版独自設定の無効化にでは,グローバル変数だけでいいのではないかという意見も気が向いたらissueで質問してみようかしら…(遠い目)。

6 件のコメント:

  1. 幾つか間違った or 推奨されない記載があるのでコメントを入れておきます。
    あといくつか補足情報を。


    > Kaoriya版のVimではfileencodingにjapanという値を使える。しかし,当然ながらこの設定はVimのヘルプには掲載されていない。

    これはKaoriYa版の機能ではなく、オリジナルから存在する機能です。
    ヘルプ上は :help encoding-values に記載されており、
    日本人以外にも知ることのできる情報です。
    できれば訂正をお願いします。

    なおKaoriYa版の差分はすべて以下で公開しています。
    必要かどうかの判断にどうぞ。
    https://github.com/koron/vim-kaoriya-patches : パッチ
    https://github.com/koron/vim-kaoriya : ビルド環境


    > 今まで~/.vimrcの一箇所の設定だけで済んでいたのに,同じ内容を~/.gvimrcにも記述する必要があり,保守性が悪くなってしまう。

    GUIの設定を書くのならば .gvimrc に書くべきであり、
    これはVimが公式に推奨する方法です。
    「このような標準から外れるようなことはすべきではない」



    > 公式の単独パッケージでは以下2点の問題があり極めて使いにくい

    公式の最新版はココにあります。良かったらコチラをどうぞ。
    https://github.com/vim/vim-win32-installer/releases
    その際は netupvim をちょっと設定すれば常に最新版を使えるようになります。
    https://github.com/koron/netupvim


    なお KaoriYa版 のデフォルト設定の提供方法については、
    Vim 8.0 のリリースに合わせて大きく変えたいと考えています。
    最新のVimでは default.vim が導入されたので、それを活用したいなと。
    すぐに導入しない理由は、既に使ってる人たちの互換性を再優先と考えているからです。

    返信削除
  2. > できれば訂正をお願いします。

    この文脈に沿う形で言うと、代替案としては migemo を起動する g/ か、
    独自でマップしてる c_CTRL-X あたりが良いかもしれません。

    返信削除
    返信
    1. コメント&ご指摘ありがとうございます。
      今晩、ご指摘いただいた内容を確認して、記事に反映させていただきます。

      削除
    2. 内容を確認しました。何点か質問させてください。

      1. > Kaoriya版のVimではfileencodingにjapan
      これはこちらの完全な勘違いでした。`japan`ではなく,`guess`のことでした。うろ覚えで誤りを書いてしまい,すみませんでした。修正します。

      参考
      * [KaoriYa 版で追加される機能まとめ \- 永遠に未完成](http://thinca.hatenablog.com/entry/20090619/1245338963)
      * https://github.com/koron/vim-kaoriya-patches/blob/5dd464ec230894b8bbdd0ec6548550b1cf9a4f29/master/2530-guess_encode_feature.diff

      2. > GUIの設定を書くのならば .gvimrc に書くべきであり、これはVimが公式に推奨する方法です。

      たぶんご理解いただいていると思いますが,ここの文章の趣旨は独自設定を使うのはやめようというものです。

      それとは別件ですが,GUIの設定を.gvimrcに書くことが公式で推奨されているという事実はどこかの引用でしょうか?

      ヘルプを確認したところ,以下の記述以上の根拠はみつかりませんでした。気になるので,もしあれば教えてください。
      > The gvimrc file is where GUI-specific startup commands should be placed.
      http://vimhelp.appspot.com/gui.txt.html#gvimrc

      「GUI固有設定は原則.gvimrcに書くべき」ということを主張だと思いますが,重箱の隅を突くようで恐縮ですが,今回の`highlight`の設定はCUIとGUIを同時に設定でき,GUI固有の設定でもないので(分けて書くこともできますが…),`.vimrc`で共通化させても問題ないように思いました。

      3. 最新のVimの配布場所
      今まで公式のVimとは以下のVimの公式サイトでダウンロードできるもののことだと思っていました。
      http://www.vim.org/download.php

      今回教えていただいたGitHubのページは,公式サイトで言及が見当たりませんが,こちらが最新の公式Vimの配布元なのでしょうか?

      削除
    3. 指摘内容を記事に反映させました。

      削除
    4. 確認に使ったKaoriYa版Vimのバージョンを明記して,上記コメント欄での質問に対してツイッターでいただいた回答内容を記事に反映した。

      削除