本文を読み飛ばす

SyntasticとSphinx ReST (1)

vimのplugin Syntasticは結構気に入ってます.

Syntasticはファイル保存時に
そのファイルを文法チェックしてくれます.

さらに文法チェックの表示は
vim内に反映されるのでで簡単に取り扱えるので
非常に直感的です.

今回はこのpluginとSphinxを連携させてみます.
また、単なるReSTだと拡張部分のチェックに問題があるので調整してみます。

mazu,Syntasticはファイル保存時に
そのファイルを文法チェックしてくれます.

コンパイルや実行などする前にチェックが入るので,
エディタから別作業に移る前にある程度のチェックができます.

このため, 作業を移る回数が減って作業効率があがるわけです.

そのSyntasticではReSTチェックもできます.

現状の不満点

ただしSphinxのReSTには独自の拡張directiveがいろいろ入っているので

普通にReSTのチェックをすると「そのdirectiveはないですよー」っていう

エラーが数多く出てチェックになりません.

理由

これはSyntasticが文法のチェックに rst2xmlを使っているのが理由です.

rst2xmlはReSTのコアであるdocutilsに付属のコマンドで
sphinxの拡張directiveは認識しません.

Syntasticはrst2xmlの出力を解析して
vimに渡しているのでsphinx固有のdirectiveは理解できず,
エラーとなります.

対策 その1

rst2xmlの代わりにsphinx-buildを使います.

これでsphinxのdirectiveもチェックすることができます :D

次の不満点

sphinx-buildは重いです.

対策 その2

このことをSphinx MLで相談したところ

  • Sphinxのディレクティブを反映したrst2null.pyを作るのは面倒
  • 出力処理を省けば早くなるかも

ということで出力処理を省けるようなコードを教えてもらうことができました.

ありがとうございます > sphinx-ML

shpinxの出力処理を省略する

まず以下のコードをconf.pyに追加します:

from sphinx.builders import Builder

class NullBuilder(Builder):
    name = 'null'

def get_target_uri(self, docname, typ=None):
    return ''

def get_outdated_docs(self):
    """毎回全てのrstを処理対象にしたい場合は、以下を参考にこのメソッドを実装。
        https://bitbucket.org/birkenfeld/sphinx/src/b799dcd0bb9f/sphinx/builders/text.py#cl-30
    """
    return []

def write(self, build_docnames, updated_docnames, method='update'):
    pass

def prepare_writing(self, docnames):
    pass

def write_doc(self, docname, doctree):
    pass


def setup(app):
    app.add_builder(NullBuilder)

確認します.:

$ sphinx-build -t null

さて, この状態で時間比較してみます.:

$ time rst2xml
$ time sphinx-build -t xml
$ time sphinx-build -t null

数字はCore i3 2120Tのマシンのものです

rst2xml
2.005s
null
2.797s
xml
7.799s

おぉすごい改善効果...

後でTegra 1GHzのマシンでもやってみようか...

Syntasticの修正

Syntasticからsphinx-buildを使います.

ファイルを修正します:

$ mkdir ~/.bundle/syntastic/syntax_checkers/rst
$ cp ~/.bundle/syntastic/syntax_checkers/rst{.vim,}
$ vi ~/.bundle/syntastic/syntax_checkers/rst.vim

この作業で従来のrst2xml.pyにsphinx-buildを追加しています.

sphinx-buildのオプションは

-t null
上で示した出力なしを指定します
./doc
document source
./build
出力先, 出力しないけど必要です

次にrst.vimを調整します:

$ vi ~/.bundle/syntastic/syntax_checkers/rst.vim

次にsphinx用のvimスクリプトを調整します:

$ cp ~/.bundle/syntastic/syntax_checkers/rst/{rst,sphinx-build}.vim
$ vi ~/.bundle/syntastic/syntax_checkers/rst/sphinx-build.vim

ここでのポイントはError, Warningなどを
抽出する正規表現をsphinx-build用に修正することです.

残った問題点

2つあります

  • 処理速度がまだ遅い, 私は我慢できる...かなぁ...
  • sourceとdestのdirectoryが決め打ちになっている
  • 普通のReSTを編集するにもsphinx-buildが立ち上がる

どちらもいまのところどうしようもないと思っています.

ReSTとsphinx用ReSTは別にするというのも考えていますが,
そこまで環境は作り込めていません

今回はとりあえずの方法を提示しました. 試していただけると幸いです. :D

コメント

Comments powered by Disqus
宣伝: