h1mesuke/unite-outline

Asynchronous heading extraction.

Opened this issue · 3 comments

現在、unite-outline の見出し抽出は非同期ではないため、見出しの抽出中はユーザーは他の操作が行えない。
大抵の場合、見出しの抽出は瞬時に終わるため、これが問題となる局面は少ないが、

以下の場合に、抽出時の待ち時間が大きくなり、無視できなくなることがある。

  • 見出し抽出に外部プログラムを使う場合
    • C/C++/Java における ctags の使用がこれにあたる
    • Windows では特にプロセスの起動が遅く、
      200行程度のバッファからの見出し抽出に1秒以上を要するとの報告があった
  • ファイルが大きい場合
    • 数万行とかいう規模になってくるとさすがに厳しいか
  • マシンが貧弱な場合

このような場合でも、ユーザーをブロックすることなく見出しの抽出を行えるよう、
見出しの抽出を非同期に行えるようにすべきである。

案1: vimproc を使う

一番有力な案。というか、これ以外にどういうやり方があるものかまったく思いつかないw

もし、ユーザーが vimproc をインストールしており、かつ、オプションで非同期な抽出を許可する設定をしていれば、vimproc を使って非同期に見出しを抽出する。この辺の設定は filetype_option としてファイルタイプごとに持たせられればいいかな。非同期な見出し抽出が必要になるファイルタイプって限られると思うので。

抽出結果はファイルを介して受け渡すのが無難か?
とするならば、常時 FileCache から読むような感じになるか。もはやキャッシュではないなあ。

vimproc について理解を深める必要がある。ソースを読んで仕組みを把握しよう。neocomplcache がまさにこういった vimproc の使い方をしているとのことなので、参考にできるだろう。

問題点

  • vimproc は導入の敷居が高い
    • ビルドが必要、Windows だと特にめんどい

案2: シェルにバックグラウンド実行させる

結局 system() 経由でシェルを叩くんだから、シェルにバックグラウンド実行させるという方法もある。
vimproc は導入の敷居が高いので、なしでもいけるらそっちの方がいい。

問題点

  • シェルによってバックグラウンド実行の指定方法が異なる
    • & だったり &! だったり
    • cmd.exe もこれまた違う

非同期は確かに魅力的ですが、neocomplcache+vimprocがあれだけ苦労したように、デバッグがかなり面倒です。
安定して動作させるにはかなりの苦労が必要になります。注意してください。

安定して動作させるにはかなりの苦労が必要

Shougoさんが言うからには相当厄介なんでしょうね……
私はまだ neocomplcache が具体的にどのように vimproc を使っているのか、詳細を見ていないので
その辺まだよくわかっていません。vimproc を使うかどうかもまだ検討段階です。

unite-outline で求められている非同期、ということだと、また違った選択肢があるかも知れません。
そういったことも含めて、しばらくは調査期間ということになりそうです。ご忠告感謝!

neocomplcacheの場合はかなりややこしいです。
なぜなら、裏でVimの別プロセスを起動していて、それがキャッシュをするという仕組みだからです。
そっちでエラーになると分からないので……。
厳密にはvimprocはいらないんですが、わざわざ引数をパースするのも面倒なのでvimprocが必要、ということにしています。直接通信できるんなら、まだマシだったんですけどね。