この記事は Vim 8.0 Advent Calendar の 24 日目の記事です。
今回は、利用者にはあまり影響がない Vim の開発側の変更についてです。
GitHub へ移行
移行当時、割と大きく取り上げられていたので、ご存知の方も多いでしょう。
それまで Vim は、Google Code で Mercurial を使って開発されていました。しかし Google Code のサービス終了に伴い、2015 年 8 月に Vim のリポジトリは GitHub へ移行、リポジトリも Git に変更されました。
また、以前は Vim へのパッチの投稿は vim_dev のメーリングリスト上でのみ行われていましたが、現在では GitHub 上の Pull Request でも受け付けています。貢献への敷居がかなり下がったと言えます。
大規模なソースコードの分割
Vim は長い歴史もあり、かなり巨大なプログラムです。ソースコードもかなりの量があり、eval.c
などは 2 万行を超えていました。
Vim の開発が GitHub に移ったりなどさまざまな変化がある中で、コードのテストカバレッジを Coveralls で計測するようになりました。
しかし、この時にこの巨大なソースコードが問題になったようで、これを回避するためにソースコードの分割が行われました。
概ね、以下のような分割が行われました。
-
eval.c
- →
eval.c
- →
list.c
- →
dict.c
- →
evalfunc.c
- →
userfunc.c
- →
-
spell.c
- →
spell.c
- →
spellfile.c
- →
ANSI-C スタイルの関数定義
Vim 本体のソースコードは、以前までは K&R と呼ばれるスタイルで関数定義を行っていました。以下のような形式です。
/*
* Add a watcher to a list.
*/
void
list_add_watch(l, lw)
list_T *l;
listwatch_T *lw;
{
lw->lw_next = l->lv_watch;
l->lv_watch = lw;
}
関数の引数部分の、型の宣言が括弧の外に書かれています。C 言語を知っている人の中でも、そもそもこのような書き方ができること自体知らない人もいるのではないでしょうか。
Vim の歴史は古く、そのためこの古い書き方がずっと使われてきました。
しかしこの度、現代で広く使われている ANSI-C スタイルの関数定義に書き換えられました。以下のような形式です。
/*
* Add a watcher to a list.
*/
void
list_add_watch(list_T *l, listwatch_T *lw)
{
lw->lw_next = l->lv_watch;
l->lv_watch = lw;
}
ビジュアルモードが常に有効
Vim には大きく分けて、Tiny、Small、Normal、Big、Huge の 5 つのビルドがあり、後になるほど多くの機能が含まれるようになっています。
ビジュアルモード(+visual
機能)は、以前までは Small 以上の Vim に含まれる機能でしたが、7.4.200 からは Tiny も含む全ての Vim で有効になるようになりました。