新しいWindows用Vimのインストーラーを作っている話

# 公式インストーラー

Windows用Vimの公式インストーラーは、[vim.orgで公開](https://www.vim.org/download.php#pc)されています。Vimの原作者である Bram Moolenaar 氏による唯一の公式ビルドで、現時点で公開されているバージョンは 8.1.0001 (ファイル名: `gvim81.exe`)です。ただ更新頻度は低く、大抵はマイナーバージョンアップの直後や、重大なセキュリティー問題があった場合などにしか更新されません。

# 公式ナイトリービルド

そこで、私と Christian Brabandt 氏 ([@chrisbra](https://github.com/chrisbra)) で立ち上げたのが、[vim-win32-installer](https://github.com/vim/vim-win32-installer)です。これは、毎日ドイツ時間の午前0時に[Vimの公式リポジトリー](https://github.com/vim/vim)をチェックし、もし更新があれば、インストーラーとzipパッケージを自動で作成するというものです。自動ビルドであるため、不安定なバージョンが公開されることもありますが、最新バージョンを簡単に試せるという利点があります。(本日(12/13)時点での最新バージョンは 8.1.0578。)
GitHubの[Vim organization](https://github.com/vim)の配下にある公式のナイトリービルドですが、あくまでナイトリービルドであるため、公式なリリースではなく、準公式的な扱いである点には注意が必要です。

# NSIS

いずれのインストーラーも[NSIS](https://nsis.sourceforge.io/Main_Page)というソフトを使って作成されているのですが、以下のような問題が指摘されてきました。

* 見た目が古臭い。
* インストール中・アンインストール中にコマンドプロンプトが開かれて邪魔だ。
* インストール中・アンインストール中に何度もメッセージボックスが開かれて邪魔だ。
* メッセージボックスのせいで、サイレントインストールができない。
* 多言語対応していない。

以下はスクリーンショットの例です。

最初に表示されるメッセージボックス:
![vim-old-1.png](https://qiita-image-store.s3.amazonaws.com/0/59454/05c049fa-2de2-0550-0d91-2e23bb351904.png)
コンポーネント選択画面:
![vim-old-2.png](https://qiita-image-store.s3.amazonaws.com/0/59454/4465e87f-fe92-2543-ab6f-b20f981036df.png)


# MUI2対応インストーラー

これらを解消するために作られたプロジェクトが Guopeng Wen 氏 ([@gpwen](https://github.com/gpwen)) による、[vim-installer-mui2](https://github.com/gpwen/vim-installer-mui2)です。

* NSISの[Modern UI 2 (MUI2)](https://nsis.sourceforge.io/Docs/Modern%20UI%202/Readme.html)という機能を利用することで、見た目を刷新するとともに、多言語にも対応。
* コマンドプロンプトを開かないように修正。
* メッセージボックスを開かないようにし、必要な情報はインストーラーの画面上に表示するように修正。
* サイレントインストールに対応。

このように、指摘されていた問題はすべて解消されています。

このプロジェクトは、かつては本家に取り入れてもらうべく精力的に開発されていたのですが、本家に取り込まれる様子がなかったことからか2011年ごろには開発が停止してしまいました。

# 取り込まれなかった原因

gpwen氏のMUI2インストーラーが本家に取り込まれなかった理由は、おおざっぱに言うと変更が大きすぎたからでした。

実は、現行のインストーラーはNSISによるユーザーインターフェース部分と、`install.exe`という実行ファイルによるシステムへの登録処理部分の2つに分かれています。インストーラーの実行中にコマンドプロンプトが開かれるのは、この`install.exe`が実行されているからなのです。

gpwen版では、この`install.exe`の処理もすべてNSIS部分に取り込んでしまっていました。これにより本家に対する変更が非常に大きなものになってしまっていました。(スクリプトのサイズが元の10倍以上。)

一方、人によっては、zipパッケージを解凍し、`install.exe`を手動で実行してシステムへの登録のみ行うという使い方をしています。そのため、`install.exe`を削除するわけにはいかず、このままではNSIS部分と`install.exe`で同じような処理を二重管理せざるを得ません。この[二重管理を避けたい](https://github.com/vim/vim/issues/3485#issuecomment-425577926)というのも取り込まれなかった理由です。

# 新たなMUI2版

そこで今回、変更を少なくし、コードの二重管理も避けた新たなMUI2インストーラーを作成することにしました。今までの指摘に対応したうえで、さらにいくつか改善を行っています。

* UIはgpwen版をベースとし、MUI2のきれいなUIを使いつつ、多言語にも対応。
* システムへの登録部分は`install.exe`を使いつつ、実行時にコマンドプロンプトを表示しないように変更。(実は、gpwen版もかつてはそのような実装だったようですが。)
* 邪魔なメッセージボックスもgpwen版同様に削除。
* サイレントインストールに対応。
* HighDPIにも対応し、高DPI環境での表示を改善。
* インストール項目の選択を記憶し、次回のインストールでは自動で同じ項目を選択する。

こうして出来上がったのが、[PR #3501](https://github.com/vim/vim/pull/3501) です。スクリプトサイズも本家の2倍程度で済んでいます。

以下はスクリーンショットの例です。

最初に表示される画面:
![vim-mui2-1.png](https://qiita-image-store.s3.amazonaws.com/0/59454/54916592-c195-4f02-22db-a59d10261baf.png)

コンポーネント選択画面:
![vim-mui2-2.png](https://qiita-image-store.s3.amazonaws.com/0/59454/4c6e6653-fe63-bd9d-c295-735bae247b35.png)

見た目もきれいになり、日本語表示されているのが分かります。


([VimConf Hackathon](https://qiita.com/k-takata/items/fcefee08b0dc7be0d517#2%E6%97%A5%E7%9B%AE)でも)Bram氏からの反応も悪くなく、数週間から数カ月のうちに本家に取り込まれるかもしれません。[todo.txt](https://github.com/vim/vim/blob/master/runtime/doc/todo.txt)にも以下のように記載されています。


https://github.com/vim/vim/blob/5c5697f29829fc3b21fc5452fe8f239f6a4cb8e1/runtime/doc/todo.txt#L131-L134

```
Patch to simplify nsis installer. (Ken Takata, 2018 Sep 24, was #3479)
Now included in #3501, using MUI2.  Use the zip file to get the binary files:
https://github.com/vim/vim/files/2475621/nsis-icons.zip
Ready to include now.
```

https://github.com/vim/vim/blob/5c5697f29829fc3b21fc5452fe8f239f6a4cb8e1/runtime/doc/todo.txt#L433-L444

```
Improve the installer for MS-Windows.  There are a few alternatives:
- mui2 installer improved by Ken Takata (2018 Sep 29)
- Installer from Cream (Steve Hall).
- Modern UI 2.0 for the Nsis installer. (Guopeng Wen)
    https://github.com/gpwen/vim-installer-mui2
-  make it possible to do a silent install, see
    http://nsis.sourceforge.net/Docs/Chapter4.html#4.12
    Version from Guopeng Wen does this.
- MSI installer: https://github.com/petrkle/vim-msi/
- The one on Issue 279.
Problem: they all work slightly different (e.g. don't install vimrun.exe).
How to test that it works well for all Vim users?
```

# 今後について

上記の新MUI2インストーラーは、本家にはまだ取り込まれていませんが、[vim-win32-installer](https://github.com/vim/vim-win32-installer)では既に先行してダウンロードできるようになっています。[リリースページ](https://github.com/vim/vim-win32-installer/releases)の`gvim_8.1.xxxx_x86-mui2.exe`が32bit版、`gvim_8.1.xxxx_x64-mui2.exe`が64bit版です(ファイル名に`-mui2`が付いている)。ぜひ、ダウンロードして現行のインストーラー(`gvim_8.1.xxxx_x86.exe`)と比較してみてください。

実際に使ってみて、意見や要望などがあれば以下にお寄せください。

* [新win32-installerについて要望、バグ報告、議論するスレ · Issue #1196 · vim-jp/issues](https://github.com/vim-jp/issues/issues/1196)

2018-12-22 追記:
新インストーラーが [v8.1.0616](https://github.com/vim/vim/commit/af610b8e66a7fefcb8db07ee65686f51e1cb288a) として本体にマージされました。vim-win32-installerでは、[v8.1.0618](https://github.com/vim/vim-win32-installer/releases/tag/v8.1.0618)以降で新MUI2版が正式なインストーラーとなっています。

# 参考: 第三者によるインストーラー

公式版ではないWindows用インストーラーとしては以下のようなものもあります。

* [Vim 8.1.0577 builds for Windows](https://tuxproject.de/projects/vim/) -- tux氏によるビルド。最新の言語インターフェースに追従しているのが特徴。
* [Cream :: a modern configuration of the Vim text editor](http://cream.sourceforge.net/download.html) -- 使いやすい設定を追加したCream版と、そうではないwithout Cream版がある。最近は更新が滞っている模様。
* [petrkle/vim-msi: Unofficial msi package of vim and gvim.](https://github.com/petrkle/vim-msi) -- MSI形式のインストーラー。
* [jcasale/vim-msi: A WIX project that packages gvim into a Windows MSI.](https://github.com/jcasale/vim-msi) -- もう一つのMSI形式のインストーラー。