Vim で help が引ける npm パッケージを作った

色々あって node.js から Vim の help を引く必要が出てきたので、npm パッケージにしてみた。人生初 npm パッケージです。

https://www.npmjs.com/package/vimhelp
https://github.com/thinca/node-vimhelp

特に必然性はなかったのだけど、せっかくなので勉強も兼ねて ES2015 で書いてみた。node.js にも依存しているので、node.js 6 以降が必須です。 このパッケージは外部プロセスとして Vim を起動して、help を引きます。なので環境に Vim が必要です。また、プラグインの help も引きたいというそれだけのために Git を使った簡易プラグインマネージャも付いてます。こちらを使う場合は Git が必要。 使い方とかは README を参照してください。

苦労した点

初めての npm

今回初めてだったので、npm の作法やら ES2015 の機能やら、ついでにテストやらカバレッジ計測やら色々調べながらやった結果、必要以上に時間がかかってしまった…。

非同期地獄

node.js の非同期 API は、呼び出しスタックの奥底に 1 つでも非同期が混じると根本から非同期の API にする必要が出てくるのがだいぶしんどく感じた。Promise のおかげでネスト深いは回避できているものの、やはりまだしんどい印象が拭えない。ES2016 で入るとの噂の await があるとここがかなりマシになりそうな予感がするので、はよ。

外部プロセスのテスト

外部プロセスを起動するようなプログラムのテストはどこまでモックにするべきかがかなり悩ましい。コマンド実行部分をモックにすると、想定したコマンドが実行されているかまではテストできるが、想定したコマンドが期待した結果を生むかまではテストできない。そこまですべきなのかどうなのか…。 今はモック化するのが難しかったという理由もあって、テストでも実際にコマンドが実行されている。なのでプラグインマネージャのテストが走る度に git clone が実行されるという感じに…。実行も遅くなるので正直しんどい。

機能実現のアプローチについて

今回 Vim の help を引くという機能を実現するにあたって、Vim を実際に実行するという手段を選んだわけだけど、helptags や help ファイルを直接読んでパースするという手段も考えられた。 実際のところ、直接読んだ方が速度や効率は良いと思う。ただ、tags ファイルをパースしたり、Vim がやっている :help の引数の独自解釈などを自分でやるのが面倒だったため、今回は直接起動する方法を取った。こちらの方法だと、今後 Vim が :help の動作を拡張などした場合にも対応できる。そういう機会はそうそうないとは思うけども。少なくとも私が必要としている用途においてはこれでも十分な速度で動いている。

さいごに

初 npm パッケージ、作ってみたのはいいけど自分以外には需要なさそう。まだ欲しい機能がいくつかあるので、のんびり更新していく予定。

Software Desing 2016年5月号の Vim 特集記事に寄稿しました

技術評論社から発売される Software Design 2016年5月号 の第1特集「Vim[実践]投入」に寄稿しました。

gihyo.jp

全5章の構成で、5人の Vimmer が1人1章を担当する豪華な内容になっています。

書いたこと

私は第2章「Vim だからできる、一歩先行く編集術」を担当しました。

今回の特集は、4月から新社会人になった方々をメインターゲットに、入門者向けの内容になっています。 その中でも第2章では、Vim ならではの機能について紹介しました。

この記事を見て、多くあるエディタの中から Vim を選ぶ意義について感じてもらえれば幸いです。

書けなかったこと

今回、これから Vim を使い始める人達を対象に記事を書くということで、help の引き方についての解説を入れたかったのですが、紙面の都合上叶いませんでした。

Vim を使っていくにあたって、help を引くことはとても重要です。Vim は設計上の目標(:help design-goals)の一つによくドキュメント化されていることを挙げており、大抵のことは help に書いてあります。また、プラグインについても、まともなプラグインであればドキュメントが書かれていて、Vim の中からいつでも参照できるようになっています。

調べ方を知っておくというのは Vim に限らず重要なことです。記事内での解説は叶いませんでしたが、もし Vim を使うことに決めた場合は、まずはヘルプのヘルプ(:help helphelp)などを見て引き方を知っておくとよいでしょう。

それでは、よい Vim ライフを!

カラースキームに個人的に求めるもの

最近 Vim のカラースキームの自作に関する記事をちらほら見かける。

私自身も最近、いいカラースキームないかなーと探していたりするので(作る気は皆無)、私が探す際のポイントなんかを書いておく。

ちなみにこの記事では主にカラースキームの機能面についてのみ言及する。 配色に関しては私はセンスがほぼないので、色について完全に感覚で選んでいて参考にならない。

一通りの色が定義してある

最重要項目なのだけど、できていないものが多い。個人的には全て設定されていてほしい。 大きく分けて Vim 自身が使う部品のハイライトと、テキスト内の構文ハイライトで使うものがある。

前者の一覧は :help highlight-groups で見ることができる。この記事を書いている時点での最新版である Vim 7.4.1639 では以下の 45 個だ。たまーに本体への機能追加で増えるので、注意したい。

                                                        *hl-ColorColumn*
ColorColumn     'colorcolumn' で設定された列の表示に使われる
                                                        *hl-Conceal*
Conceal         Conceal されたテキストの代わりに表示される代替文字の表示に使わ
                れる ('conceallevel' 参照)
                                                        *hl-Cursor*
Cursor          カーソル下の文字
                                                        *hl-CursorIM*
CursorIM        Cursorと同じだが、IMEモードにいるとき使われる|CursorIM|。
                                                        *hl-CursorColumn*
CursorColumn    'cursorcolumn' がオンになっているときのカーソルがある画面上の桁
                                                        *hl-CursorLine*
CursorLine      'cursorline' がオンになっているときのカーソルがある画面上の行
                                                        *hl-Directory*
Directory       ディレクトリ名(とリストにある特別な名前)
                                                        *hl-DiffAdd*
DiffAdd         差分モード: 追加された行 |diff.txt|
                                                        *hl-DiffChange*
DiffChange      差分モード: 変更された行 |diff.txt|
                                                        *hl-DiffDelete*
DiffDelete      差分モード: 削除された行 |diff.txt|
                                                        *hl-DiffText*
DiffText        差分モード: 変更された行中の変更されたテキスト |diff.txt|
                                                        *hl-ErrorMsg*
ErrorMsg        コマンドラインに現れるエラーメッセージ
                                                        *hl-VertSplit*
VertSplit       垂直分割したウィンドウの区切りとなる桁
                                                        *hl-Folded*
Folded          閉じた折り畳みの行
                                                        *hl-FoldColumn*
FoldColumn      'foldcolumn'
                                                        *hl-SignColumn*
SignColumn      目印|signs|が表示される行。
                                                        *hl-IncSearch*
IncSearch       'incsearch' のハイライト; ":s///c" で置換されたテキストにも使
                われる。
                                                        *hl-LineNr*
LineNr          ":number" と ":#" コマンドの行番号。'number' オプションか
                'relativenumber' オプションが設定されているときにはその表示に
                も使われる。
                                                        *hl-CursorLineNr*
CursorLineNr    LineNr と同じだが 'cursorline''relativenumber' が設定され
                ているときに現在行に使われる。
                                                        *hl-MatchParen*
MatchParen      カーソル下の文字、または直後の文字が括弧であるとき、その文字と
                対応する括弧に使われる。|pi_paren.txt|

                                                        *hl-ModeMsg*
ModeMsg         'showmode' のメッセージ (例. "-- INSERT --")
                                                        *hl-MoreMsg*
MoreMsg         |more-prompt|
                                                        *hl-NonText*
NonText         ウィンドウの端の '~' と '@'、'showbreak' で設定された文字など、
                実際のテキストには存在しない文字(例. 全角文字が行末に収まらな
                いとき ">" が表示される)。
                                                        *hl-Normal*
Normal          通常のテキスト
                                                        *hl-Pmenu*
Pmenu           ポップアップメニュー: 通常の項目。
                                                        *hl-PmenuSel*
PmenuSel        ポップアップメニュー: 選択されている項目。
                                                        *hl-PmenuSbar*
PmenuSbar       ポップアップメニュー: スクロールバー。
                                                        *hl-PmenuThumb*
PmenuThumb      ポップアップメニュー: スクロールバーのつまみ部分。
                                                        *hl-Question*
Question        ヒットエンタープロンプト|hit-enter|とyes/noクエスチョン
                                                        *hl-Search*
Search          最後に検索した語のハイライト('hlsearch')を参照。
                quickfixウィンドウ内の現在行のハイライトや、それに類するものに
                使われる。
                                                        *hl-SpecialKey*
SpecialKey      ":map" でリストされるメタキーと特別なキー。テキスト中の
                unprintableな文字を表示するのにも使われる。
                一般に: 実際とは異なる文字で表示されるテキスト
                                                        *hl-SpellBad*
SpellBad        スペルチェッカに認識されない単語。|spell|
                これは他のハイライトと同時に組み合わせられる。
                                                        *hl-SpellCap*
SpellCap        大文字で始まるべき単語。 |spell|
                これは他のハイライトと同時に組み合わせられる。
                                                        *hl-SpellLocal*
SpellLocal      スペルチェッカによって他の地域で使われると判断される単語。
                |spell|これは他のハイライトと同時に組み合わせられる。
                                                        *hl-SpellRare*
SpellRare       スペルチェッカによってまず使わないと判断される単語。|spell|
                これは他のハイライトと同時に組み合わせられる。
                                                        *hl-StatusLine*
StatusLine      カレントウィンドウのステータスライン
                                                        *hl-StatusLineNC*
StatusLineNC    非カレントウィンドウのステータスライン。
                Note: これが "StatusLine" に等しい場合、カレントウィンドウのス
                テータスラインに "^^^" が使われる。
                                                        *hl-TabLine*
TabLine         タブページの行の、アクティブでないタブページのラベル
                                                        *hl-TabLineFill*
TabLineFill     タブページの行の、ラベルがない部分
                                                        *hl-TabLineSel*
TabLineSel      タブページの行の、アクティブなタブページのラベル
                                                        *hl-Title*
Title           ":set all"、":autocmd" などによる出力のタイトル。
                                                        *hl-Visual*
Visual          ビジュアルモード選択
                                                        *hl-VisualNOS*
VisualNOS       vimが "Not Owning the Selection" のときのビジュアルモード選択。
                これをサポートしているのはX11GUI|gui-x11|と|xterm-clipboard|の
                み。
                                                        *hl-WarningMsg*
WarningMsg      警告メッセージ
                                                        *hl-WildMenu*
WildMenu        'wildmenu' 補完における現在の候補

後者の、構文ハイライトに使われるもののリストは、:help group-name で確認できる。

        *Comment        o コメント

        *Constant       o 定数
         String         o 文字列定数: "これは文字列です"
         Character      o 文字定数: 'c', '\n'
         Number         o 数値定数: 234, 0xff
         Boolean        o ブール値の定数: TRUE, false
         Float          o 不動小数点数の定数: 2.3e10

        *Identifier     o 変数名
         Function       o 関数名(クラスメソッドを含む)

        *Statement      o 命令文
         Conditional    o if, then, else, endif, switch, その他
         Repeat         o for, do, while, その他
         Label          o case, default, その他
         Operator       o "sizeof", "+", "*", その他
         Keyword        o その他のキーワード
         Exception      o try, catch, throw

        *PreProc        o 一般的なプリプロセッサー命令
         Include        o #include プリプロセッサー
         Define         o #define プリプロセッサー
         Macro          o Defineと同値
         PreCondit      o プリプロセッサーの #if, #else, #endif, その他

        *Type           o int, long, char, その他
         StorageClass   o static, register, volatile, その他
         Structure      o struct, union, enum, その他
         Typedef        o typedef宣言

        *Special        o 特殊なシンボル
         SpecialChar    o 特殊な文字定数
         Tag            o この上で CTRL-] を使うことができる
         Delimiter      o 注意が必要な文字
         SpecialComment o コメント内の特記事項
         Debug          o デバッグ命令

        *Underlined     o 目立つ文章, HTMLリンク

        *Ignore         o (見た目上)空白, 不可視  |hl-Ignore|

        *Error          o エラーなど、なんらかの誤った構造

        *Todo           o 特別な注意が必要なもの; 大抵はTODO FIXME XXXなど
                          のキーワード

こちらは、先頭に * が付いているものだけ定義されていればよい。それ以外のものはデフォルトで同じグループの * 付きのものにリンクされているので、同じ色で表示される。

CUI/GUI 対応

私は VimCUI でも GUI でも使うので、両対応のものが欲しい。両者でほぼ同じ見た目だと嬉しい。

実は CSApprox.vim というプラグインを使うと任意の GUI 向けカラースキームを CUI 向けに変換することができるのだけど…変換したファイルの管理などを考えると面倒なのであまりやりたくない。最初から対応していてくれると嬉しい。

background=dark

そろそろ完全に個人の好みの領域に入ってきました。黒背景が好きです。

単色系より色んな色が使われているやつ

単色系のはスタイリッシュではあると思うけども、せっかく色がついてるのに見分けづらかったりして実用性に疑問があるので。はい。個人的な好みになります。

VertSplit は文字が見えないやつ

完全に指定が細かくなってきた。ウィンドウの垂直分割(左右に分ける)の縦区切りの線、あれ | が使われているのだけど、背景色と前景色を同じにして見えなくなってるほうが好き。

すごく細かいところを挙げるとまだある気がするけどこの辺にしておこう。

以上

なにかオススメあったら教えてください。

参考

カラースキームを作ってみよう - 永遠に未完成

vimproc に Windows の DLL ダウンロード機能を入れた

tl;dr

以下を vimrc の最初の方に書く。

let g:vimproc#download_windows_dll = 1

本文

vimproc は外部プロセスを非同期実行するのに必要な Vim のライブラリ。これを利用しているプラグインも結構ある。
これはとても便利なのだけど、動的ライブラリを別途ビルドする必要がある。
LinuxMac OS X なんかの環境では、標準でビルド環境が整備されているのもあり、ここで苦労することはあまりないと思う。しかし、Windows だと標準ではビルド環境がないため、ビルドすること自体が難しい。
kaoriya 版の Vim に同梱されている vimproc には DLL も含まれているので、これを利用している人もいるのではないだろうか。
ただ、最新版が使いたかったり、複数 OS で同じ設定を使いたいという理由でプラグインマネージャで vimproc を管理したい人もいるだろう。私がそうだ。そういった場合、kaoriya 版のプラグインはちょっと使いづらい。
とりあえずビルドだけでもなんとかならないか、と思って以前やったのがこれ。

Add appveyor.yml to build DLL for MS Windows by thinca · Pull Request #217 · Shougo/vimproc.vim · GitHub

これによって、vimproc のバージョンが上がり、タグが打たれると、自動で DLL がビルドされて誰でもダウンロードできるようになった。ダウンロードは以下のページからできる。

https://github.com/Shougo/vimproc.vim/releases

というわけで自分でビルドしなくてもダウンロードして配置するだけ。便利。だったのだけど、正直ダウンロードしてくるのも面倒になった。プラグインマネージャで vimproc をインストールした直後は必ず「DLL がない」とエラーが出る。とてもつらい。
すでにビルド済みバイナリはネット上にあるわけなので、ダウンロードも自動でやってくれるとラクチン。というわけでそういう機能を作った。

Download windows dll automatically by thinca · Pull Request #242 · Shougo/vimproc.vim · GitHub

最初は全自動だったのだけど、デフォルトでダウンロードされるのは困る、という意見もあり、確かにアグレッシブすぎる感じがしたので、設定を足した。以下の設定を vimrc に書いておけば、DLL がない場合は vimproc がロードされるタイミングで自動でダウンロードされる*1。また、DLL が古かった場合は自動で更新してくれる(この場合は Vim の再起動が必要)。

let g:vimproc#download_windows_dll = 1

この設定は vimproc が使用されるより前に書く必要があり、プラグインマネージャが vimproc を使う場合もあるため、できるだけ vimrc の先頭に書いた方が良い。
これでようやく vimproc の DLL との格闘に終止符を打てた気がする。
Vim には job という外部プロセスを非同期実行するための機能が入りつつあり、きちんと入って各プラグインがこちらを利用し始めたら vimproc 自体がオワコンになる可能性も 0 ではないが*2、今は気にしないでおこう…。

*1:ダウンロードも最初は curl 必須だったのだけど、raa0121 さんの提案で powershell でもダウンロードするようにしたので大抵の環境でダウンロード可能になった。raa0121++

*2:vimproc には非同期実行以外にもいくつか機能があるのでそっちの用途で使われる可能性はありそう

全角スペースを可視化するプラグイン zenspace.vim を作った

プログラミングをしていると、混ざっていると困る全角スペース。
可視化するように設定を書いている人も多いんじゃないでしょうか。
実際ググると、全角スペースを表示するための設定がたくさん出てきます。私も vimrc に設定書いてました。
でもこれ…みんなやってるなら、もうプラグインでよくない?
ってことでプラグインにしました。

zenspace.vim - Show Ideographic Space (a.k.a. Zenkaku Space).
https://github.com/thinca/vim-zenspace

全角スペースを表示するためだけのプラグインです。(画像内のタブの表示は 'listchars' によるもの)

デフォルトでは 'list' オプションの値に連動して、可視/不可視を切り替えます。なので、'list' オプションをオンにしてください。

set list

'list' オプションとかいいから常に表示しろよ、って場合は g:zenspace#default_mode を設定してください。

let g:zenspace#default_mode = 'on'

zenspace.vim は、常に表示する "on"、表示しない "off"、'list' オプションに追従する "list" の 3 つのモードがあり、ウィンドウ毎に独立しています。
デフォルト値を変える場合は上記の通り g:zenspace#default_mode を設定してください。個別のウィンドウで変更したい場合は :ZenSpaceOn :ZenSpaceOff :ZenSpaceList を使用してください。

Q & A

Q. 色を変えたいんだけど?
A. 赤に変える例を載せておきます。

augroup vimrc-highlight
  autocmd!
  autocmd ColorScheme * highlight ZenSpace ctermbg=Red guibg=Red
augroup END

Q. 普通のスペースとかは表示できないの?
A. 全角スペース専用です。通常のスペースやタブや行末スペースは、Vim 標準の 'listchars' オプションを設定するといい感じに表示できるので、そっちを使うことをオススメします。

Q. Conceal とか使って□で表示できない?
A. 検討したんですが、Conceal の制限がキツすぎて見送りました。詳細はこちらを読んでください。


Enjoy!

Vim に追加された assert 系の関数の紹介

この記事は Vim script Advent Calendar 2015 の 3 日目の記事です。

はじめに

先月末に、Vim の組み込み関数に assert 系の関数が追加されました。
今回はこの関数について紹介します。

歴史

割とどうでもいいので読み飛ばし可です。

2015-11-29 Vim 7.4.944

assertEqual()、assertTrue()、assertFalse() が追加されました。また、一緒に使うための v:errors も追加されました。

しかし、関数名について苦情が多く出ました
Vim script の組み込み関数の多くは、単語の区切りがなく1単語です。例えば deepcopy() や matchlist() などです。
一部の関数には _ が使われており、has_key() や complete_add() があります。
そして中には大文字を含む関数もありますが、今のところそれらは全て ID と言う単語に使われており、synID() や diff_hlID() などです。これらは例外と言えそうです。
つまり今まで camelCase が使われていなかったのにも関わらず突然 camelCase の関数が追加されたので、それはさすがにおかしいという話になりました。

2015-11-30 Vim 7.4.945

assertEqual()、assertTrue()、assertFalse() がそれぞれ assert_equal()、assert_true()、assert_false() にリネームされました。
また、先の話で別途提案された、各関数にエラー時のメッセージを渡すためのオプショナルの引数を追加するパッチが適用されました。
わずか1日でのスピード対応、ドキュメントもテストも修正されて完璧…と思いきや…肝心の実装が適用されておらず、関数名は変わっていませんでした…。

2015-12-01 Vim 7.4.946

無事実装も適用され、assert_equal()、assert_true()、assert_false() にリネームされました。

2015-12-03 Vim 7.4.950

一通り解決されたかに思いましたが、変数 v:errors が初期化されていないという問題が発見されました。
現在 vim_dev にパッチを投げています
恐らくすぐに適用されると思います。
適用されました

使い方

仕組みは単純です。
v:errors は配列になっていて、各 assert 関数が失敗すると、v:errors にメッセージが文字列として追加されます。
なので使用前にまず v:errors を初期化します。

let v:errors = []

続いて適当に assert 系の関数を呼びます。

function! Test() abort
  let actual = 2 + 2
  call assert_equal(5, actual)
endfunction

call Test()

v:errors を見ると、失敗の結果がわかります。

echo v:errors
" => ['function Test line 2: Expected 5 but got 4']

結果のメッセージの : の左側にある文字列は expand('') の結果に行番号の情報を足したものです。
メッセージの右側には失敗時の値が出ます。
また、assert 系の関数には追加でメッセージを渡すことができ、渡すと : の右側はこのメッセージが表示されます。

let v:errors = []
function! Test() abort
  let actual = 2 + 2
  call assert_equal(5, actual, 'test fail!')
endfunction

call Test()
echo v:errors
" => ['function Test line 2: ''test fail!''']

終わりに

見てきたように、非常に簡単な仕組みのもので、なんなら Vim script で自作もできそうな仕組みになっています。
今後、Vim 本体での Vim script 周りのテストはこの関数が使われるようになるようです。
本体以外でも、簡易なテストが書きたい場合には使えるかもしれません。

VimConf 2015 に行ってきた

VimConf 2015 に行ってきた。
昨年は主催的ポジションからの参加だったのだけど、今年は割と一般参加的ポジションで、一応スタッフって枠にはなってたけど大したことはしてないし、ラクさせてもらいました。

というわけで各発表についての感想を雑につらつらと。

Vimのgitへの移行について - @

まさかのスライドなし発表すごすぎた。
GitHub 移行は外からだと割とすんなり決まった印象があったけど、やはり裏では色々あったんですね。

deoplete ~ The dark powered auto completion plugin for neovim ~ - @

Shougo さんのバイタリティは相変わらずすごい。…すごい。

私はどのようにVim scriptを書くか? - @

Vim script 入門的な内容。これで Vim script 書く人増えるといいなー。
発表資料がすごく凝っててすごかった。

Hacking Libcall and Java - @

「一般的」の定義について考えさせられる内容だった。もはや持ちネタと言えるレベル。
発表中にツッコミが入ったりしてすごかった。

Vim on Browser - @

ブラウザ上で Vim を動かす話。
プラグインのデモがブラウザでできるってのはかなり便利そうさを感じた。
feature=small でしか動かせないのが残念だけど、普通に動いているのでとにかくすごい。

Vim + Clojure - @

VimClojure を書くのに便利なプラグイン群の紹介。
今年も去年同様 Civilization 5 の話題が盛り込まれており、すごかった。

Introduction to OmniSharp.vim - @

OmniSharp.vim について話した。
たいがいキョドってるのでちゃんと伝わったかすごい心配…。

海外のVimmerが開発したVim pluginの紹介 @

One more thing すごい。

ぼくのかんがえたさいきょうのぷらぐいん vim-gita - @

gita 存在は知ってたけど、改めて見るとやはりすごい便利そうだった。
プログラマじゃないのにこんなの作れるなんてすごい。
まだまだ開発版っぽいので今後はもっとすごくなるらしいので期待したい。

Vim script版 power-assert について - @

power-assert、仕組みまでは理解できても、実際に作ってしまうのはすごい。

切り刻め!HTML - @

フロントエンド周りはあまり詳しくないので、必要になったときにすごく参考になりそうな情報満載だった。

ヘルプを読む - @

逆引きヘルプの提案がすごく便利そうだった。

vim-jpのvimhelp, reading_vimrcのホスト関連のお話 - @

Docker やらその周辺の使いこなし具合がすごかった…。

5年間Yokohama.vimをやってみて感じた事 - @

継続されている Yokohama.vim は本当にすごい。次回も是非参加したいです。

AppVeyorを使ってみよう @

vimproc については私自身はバイナリが欲しかったので、テストはとりあえずいっか、って思っていたのを k_takata さんがやってくれて、すごくありがたかったです。
Cygwin が動かないのは本当に謎…なんなんだ…。

まとめ

つまりまとめると、すごい。

最後に

VimConf は多くの方の協力で成り立っています。まとめ役をやってくれた @ さん、会場提供をしてくれた株式会社ミクシィさんと、その連絡役をしてくれた@Kuniwak さん、発表者の皆さん、スタッフの皆さん、そしてもちろん参加してくれた全ての皆さん、ありがとうございます!
VimConf は恐らく来年も開催されるとは思いますが、イベントをよりよくしていくために、以下のページで KPT をやっています。(KPT はふりかえり手法の1つで、詳しくはググってください google:KPT)

KPT for 2016

この KPT は特にスタッフ専用ということはないので、一般参加者の方でも、なんなら参加したかったけどできなかった方でも、Keep だけでも Problem だけでも Try だけでも、なんでもいいので書いてみてください。
みんなの意見がよりよい VimConf を作っていくはずです。