Neocomplete.vimでpythonコード作成時にもomni補完が適用させるようにしたいなあと。
手っ取り早い方法としてはjedi.vimを用いるという手があり普段は自分も愛用してますが、
諸事情により辞書ファイルを作成し、それを参照して補完させるようにしました。
辞書作成方法
docs.python.jpの索引ページをスクレイピングし、
掲載されている項目(関数、クラス、用語)を辞書ファイル項目としました。
言語はRuby、スクレイピングにはNokogiriを使用し、若干力技な部分も入ってます。
辞書作成コード
make_python_dicts.rb
require'nokogiri'require'open-uri'require'net/http'# マルチバイト文字のチェックメソッド追加classStringdefhas_multibytes?self.bytesdo|byte|returntrueif(byte&0b10000000)!=0endfalseendend# 引数チェック(バージョンと出力ファイル名取得)ifARGV.size==1versions="2.7"DICT_NAME=ARGV[0].to_selsifARGV.size==2DICT_NAME=ARGV[0].to_sversions=ARGV[1].to_selseputs"Argument error"exitend# 索引ページのURL生成BASE_URL="http://docs.python.jp/"+versions+'/'.freezeINDEX_URL=BASE_URL+'genindex.html'.freeze# 指定したバージョンの索引ページが存在するか確認res=Net::HTTP.get_response(URI.parse(INDEX_URL))ifres.code!='200'puts"status error : "+res.code.to_sexitend# 索引ページのソース取得index=Nokogiri::HTML(open(INDEX_URL))link_tags=index.xpath('//div[@class="genindex-jumpbox"]')# A~Zまでの索引ページより索引項目抽出(日本語項目&補助項目は除外)items=[]link_tags.search('//p[position()=1]//a').eachdo|tag|urls=URI.escape(BASE_URL+tag[:href])doc=Nokogiri::HTML(open(urls))doc.search('.//table[@class="indextable"]//a[position()=1]').eachdo|item|item=item.text.split[0]unlessitem.match(/^[-.:(]|,$/)||item.has_multibytes?items<<itemendendend# 取得した全項目から重複分を省きソート後、辞書ファイルとして書き出しFile.open(DICT_NAME,'w')do|f|items.uniq!.sort!items.each{|item|f.puts(item)}end
実行方法
第一引数で出力する辞書ファイル名、第二引数で作成したいpythonのversionを指定する。
なお第二引数は省略した場合はversion2.7の辞書ファイルが作成される。
(2016/6月現在は索引ページが存在する2.7と3.5のversionが指定できる)
# 出力ファイル名のみ指定
$ ruby make_python_dict.rb python.dict
# 出力ファイルとversion指定(ver 3.5)
$ ruby make_python_dict.rb python.dict 3.5
上記辞書ファイルを用いたNeocomplete.vimによる補完設定例
.vimrcに以下のように設定し、作成した辞書ファイルを読み込んでやればOKです。
"補完候補表示パターン設定
let g:neocomplete#force_omni_input_patterns.python = '[^. \t]\.\w*'
" 辞書参照設定
let g:neocomplete#sources#dictionary#dictionaries = {
\ 'python': $HOME . '/dicts/python.dict',
\ }
補足&参照サイト
力技&おおまかにチェックしただけなので、辞書ファイルに不備等あるかもしれません。
またver2.7とver3.5の各辞書ファイルをgithubに置いておきます。もし使いたい場合にはどうぞ。