Humanity

Edit the world by your favorite way

netupvim で Windows でも最新の Vim を追いかけよう

これは Vim Advent Calendar 2017 その2 の21日目の記事です。


github.com

内容は上記リポジトリの README.md のパクリです。 netupvim 便利だよ!って事が言いたかった。

序文

WindowsVim を使っているとふと最新の Vim欲しい時があります。 そんな時 netupvim があればダブルクリックで最新の Vim を取得できます。

最新の Vim をサクッと持ってくる

リリースから以下のファイルを含むフォルダを解凍し、そのまま UPDATE.bat を実行するだけです。

  • netupvim.exe
  • UPDATE.bat
  • RESTORE.bat

f:id:tyru:20171205024802g:plain

…が、ちょっと待ってください。 今回は最新版の Vim が欲しいのでしたが、普通に実行すると少し古めの Kaoriya の安定版がダウンロードされてきてしまいます。

netupvim は

  1. Kaoriya 安定版
  2. Kaoriya 開発版
  3. Kaoriya 人柱版
  4. 本家版 (vim/vim-win32-installer)

のいずれかに対応しています。 このうち 2~4 を使いたい場合は netupvim.ini を作り、それぞれ以下のように記述します(README からの引用です)。

# 開発版
source = "develop"
# 人柱版
source = "canary"
# vim/vim-win32-installer 版
source = "vim.org"

2つ注意点としては

  • これらの版はあくまでも開発・実験用であり、予告なく不安定な動作の Vim が配信され る可能性があることに留意してください。
  • また、一度 netupvim を実行した後で source プロパティを変更した場合の動作は未 定義です。直近でサポートする予定はありません。

なので先ほど実行してしまいましたが、実行後に変更はしないようにしましょう。

例えば

  1. Kaoriya 安定版
  2. Kaoriya 開発版
  3. Kaoriya 人柱版
  4. 本家版 (vim/vim-win32-installer)

みたいな感じでそれぞれのフォルダを分けて置いとくと良さそうです。

すでにダウンロードした Kaoriya Vim や本家 Vim を最新化したい

安心してください。 netupvim はダウンロードだけでなくアップデートにも対応しています。 というか記事の都合上ダウンロードを先に紹介してしまいましたが、名前からも分かる通り本来アップデートのためのツールです。

先ほど解凍した以下のファイルを vim.exe と同じフォルダにぶち込みます。

  • netupvim.exe
  • UPDATE.bat
  • RESTORE.bat

Kaoriya 安定版ならそのまま実行するだけですが、その他のバージョンの場合先ほど書いた netupvim.ini を作るのを忘れずに。 作ったら UPDATE.bat で一発更新。簡単ですね。

netupvim の更新

先ほどの GIF で気づいた方もいるでしょうが、勝手に更新されます。やっぱり本当にダブルクリックだけで全てが最新化されます。便利。

f:id:tyru:20171206012147j:plain

Vim 8 時代のがんばらないプラグイン管理のすすめ

これは Vim Advent Calendar 2017 の20日目の記事です。


皆さん Vim しておられるでしょうか。 Yes と答えた方、プラグインマネージャーは使っていますか?

巷では Vimプラグイン管理にはプラグインマネージャーを入れる必要があるかのような勢いで「まずプラグインマネージャーを入れる」といった記事が沢山ありますが、 個人的にはプラグインマネージャーより Vim 標準で使える パッケージ機能 をまず試してみてほしいです。

この機能はざっくり言うと「ディレクトリ以下に置いたプラグインを読み込む」ほぼそれだけですが、必要十分な機能は揃っていると思います。 またちょっとの工夫であなたの使っているプラグインマネージャーの機能も代替できるかもしれません。 もしかしたらプラグインマネージャーほどの多機能さは必要ないことに気付くかもしれませんよ?

本記事ではそんな多機能は求めてない方やミニマリストの方におすすめなパッケージ機能に関して、Vim 8 リリースから1年経った今だからこそ紹介します。

必須環境

Vim 8 リリースは 2016年9月12日なので、もしかしたらすでにインストール済みの Vim が 8 だったという方もいるでしょう。 Vim 8 は Vim プラグイン開発に便利な機能がかなり沢山追加されました。 そのためすでに Vim 8 以降でしか使えない機能を使ったプラグインが多数公開されていますので、 ぜひアップグレードすることをお勧めします。

パッケージ機能のススメ

まずはパッケージ機能について解説します。 と思ったのですが既に id:thinca さんがパッケージ機能についての解説記事を書いてくれているのでそちらをご参照ください。

Vim 8.0 Advent Calendar 6 日目 パッケージ - Qiita

要約すると

このようにパッケージ機能はとても基本的な機能しか提供しません。 しかしこれだけでプラグイン管理に必要な大体の機能は揃っています。

例えば上記ディレクトリを作ってプラグインgit clone 等でダウンロードすれば それだけでプラグインが起動時に読み込まれるということです。

$ mkdir -p ~/.vim/pack/mypackage/start/
$ cd ~/.vim/pack/mypackage/start/
$ git clone ...

そう、Vim 8 なら無理にプラグインマネージャーを使わずとも簡単にプラグインを読み込めるのです。 更新するのだって簡単で、プラグインリポジトリgit pull すればいいだけです。

私が既存のプラグインマネージャーで疑問に感じている点として、yum や apt といった OS のパッケージマネージャではコマンドラインからコマンド一発でインストールできるのに、なぜ現在多くの Vim プラグインマネージャではわざわざインストールするのに vimrc を変更してインストール、という2ステップが必要なのか?というのがあります。 それにプラグインを削除する時は vimrc の記述や、(もし書いてたら)プラグインの設定も同時に削除しなければなりません。 なんだか管理を余計に複雑にしていませんか?

パッケージ機能で不十分な点

ここまで読んで「自分にとってはパッケージ機能で十分だ」と感じた人もいるでしょう。 しかしパッケージ機能だけでは足りない点がいくつかあります。 例えば次のような機能です。

  1. プラグインのバージョンを固定したい
    • 別 PC で全く同じ環境を手間なく復元したい
  2. 一括アップデートしたい
  3. 遅延ロードしたい
    • 特定のファイルタイプ設定時や Ex コマンドを実行したタイミングでプラグインをロードしたい

これらの問題を解消するためにはプラグインマネージャーを使う必要があるでしょう。 私は現在 Volt と呼ばれるコマンドラインから扱う Go 製の Vim プラグインマネージャー *1 を開発中で、上記の問題点はもちろん全て解決されています。

github.com

しかし本記事では引き続きプラグインマネージャーではなく、あえて Vim 標準のパッケージ機能と運用の工夫のみ上記の問題を解消する方法について解説します。

Git で設定ファイルとプラグインを管理する

まず、vimrc とプラグインを Git submodule で管理する方法を解説します。 これにより Vim プラグインを特定のバージョンにロックすることができ、いつでもどこからでも git clone --recursive で .vim ディレクトリを持ってこれるようになります。

  1. ~/.vim を Git で管理する
  2. プラグインを git submodule で管理する
  3. リポジトリGitHub で公開する

~/.vim を Git で管理する

既に管理してる方も多いとは思いますが、まずは ~/.vim ディレクトリを Git で管理します。 今回は ~/.vim ディレクトリそのものを Git リポジトリ化してしまいましょう。 ちなみに私は dotfiles というディレクトリにホームディレクトリの設定ファイル・ディレクトリを突っ込んで管理しています (~/.vim には symlink を貼っています)。

$ cd ~/.vim
$ git init

以下はお好みで管理対象を変えてください。
今回は手抜きで全部突っ込みます。

$ curl -L https://raw.githubusercontent.com/github/gitignore/master/Global/Vim.gitignore -o .gitignore
$ git add -A
$ git commit -m 'Initial commit'

プラグインを git submodule で管理する

submodule として Vim プラグインを追加します。 以下は caw.vim を追加する例です。 pack/mypackage/start/caw.vimmypackagecaw.vim は自由に変えて構いません。

$ cd ~/.vim
$ mkdir -p pack/mypackage/start
$ git submodule add https://github.com/tyru/caw.vim pack/mypackage/start/caw.vim
$ git commit -m 'Add caw.vim plugin'

リポジトリGitHub で公開する

リポジトリを作成する方法については沢山記事があるのでググってください。

一括アップデート

管理している Vim プラグインをリモートの最新版に更新するには、

$ git submodule foreach git pull
$ git commit -a -m 'Update all vim plugins'

とします。

git commit しないと次回 git clone --recursiveリポジトリを持ってきた時に古いバージョンのままなので、ちゃんとコミットしておきましょう。

filetype や Ex コマンド実行時に初めてプラグインをロードする (遅延ロード)

本項ではプラグインの遅延ロードをパッケージ機能で実現する方法を解説します。

遅延ロードとは?

dein.vim などのプラグインマネージャーには特定のファイルタイプになった時や特定の Ex コマンドを実行した時に初めてプラグインをロードする機能があります。 これによって

が期待できます。

パッケージ機能での遅延ロード

パッケージ機能でこれを行うには

  1. ~/.vim/pack/mypackage/opt/ ディレクトリに入れ、
  2. 任意の FileType イベントや CmdUndefined イベントで :packadd を実行します
    • FileType イベント:ファイルタイプ設定時
    • CmdUndefined イベント:Ex コマンド実行時にコマンドが見つからなかった場合

すると :packadd によりプラグインがロードされます。

例がないと分かりにくいと思うので、例を載せます。 以下は vimrc に記載する例です。

function! s:config_fugitive()
  " プラグインの設定
  
  " プラグインのロード
  packadd vim-fugitive
endfunction

augroup lazy-load
  autocmd!
  autocmd FileType vim call s:config_xxx()
augroup END

冒頭で言ったプラグインと vimrc を二重管理しなきゃならないという負担は増えますが、標準のパッケージ機能でできるという点は強みでしょう。

ちなみに Volt では上記と同じような設定を自動的にインストールすることで遅延ロードを実現しています(~/.vim/pack/volt/ 以下のファイルを見てみると仕組みが分かると思います)。

未承諾広告】Volt の紹介

ちなみにここで紹介した方法をもっと手軽にやりたい方はぜひ Volt を試してみてください。

プラグインの管理はもちろん、プラグインの設定を個別のファイルに書けたり(一時的に無効化したりアンインストールする時に楽です)、プロファイルと呼ばれる機能により複数の ~/.vim の環境を使い分ける事が驚くほど簡単になったり、他にも様々な機能があります。

後ほどまた記事を書く予定ですが、興味があったらぜひ使ってみてください。

*1:後々 Vim からもシームレスに扱えるようにする予定です

GitHub や BitBucket で強制的に https:// の代わりに ssh の URL を使う

stackoverflow.com

git config --global url.ssh://git@github.com/.insteadOf https://github.com/

  • BitBucket

git config --global url.ssh://git@bitbucket.org/.insteadOf https://bitbucket.org/

特定のユーザだけ ssh の URL を使う (2018/12/08 追記)

git-config の man

Any URL that starts with this value will be rewritten to start, instead, with <base>

と書いてあるので試してみたらいけたやつ。 URL のパス部分まで含めて指定もできるので、

git config --global url.git@github.com:tyru/.insteadOf https://github.com/tyru/

みたいに特定のユーザだけ ssh の URL に変えるというのもできます。

自分の場合は Vim プラグインプラグインマネージャーで管理しているため、リポジトリをダウンロードする時に https の URL で clone される。 それをいちいち書き換えるのも面倒だなと思ってたのだけど、上記の設定で一括で指定できる。