Neocomplete.vimでpythonコード作成時にもomni補完が適用させるようにしたいなあと。
手っ取り早い方法としてはjedi.vimを用いるという手があり普段は自分も愛用してますが、
諸事情により辞書ファイルを作成し、それを参照して補完させるようにしました。
辞書作成方法
docs.python.jpの索引ページをスクレイピングし、
掲載されている項目(関数、クラス、用語)を辞書ファイル項目としました。
言語はRuby、スクレイピングにはNokogiriを使用し、若干力技な部分も入ってます。
辞書作成コード
make_python_dicts.rb
require 'nokogiri'
require 'open-uri'
require 'net/http'
# マルチバイト文字のチェックメソッド追加
class String
def has_multibytes?
self.bytes do |byte|
return true if (byte & 0b10000000) != 0
end
false
end
end
# 引数チェック(バージョンと出力ファイル名取得)
if ARGV.size == 1
versions = "2.7"
DICT_NAME = ARGV[0].to_s
elsif ARGV.size == 2
DICT_NAME = ARGV[0].to_s
versions = ARGV[1].to_s
else
puts "Argument error"
exit
end
# 索引ページのURL生成
BASE_URL = "http://docs.python.jp/" + versions + '/'.freeze
INDEX_URL = BASE_URL + 'genindex.html'.freeze
# 指定したバージョンの索引ページが存在するか確認
res = Net::HTTP.get_response(URI.parse(INDEX_URL))
if res.code != '200'
puts "status error : " + res.code.to_s
exit
end
# 索引ページのソース取得
index = Nokogiri::HTML(open(INDEX_URL))
link_tags = index.xpath('//div[@class="genindex-jumpbox"]')
# A~Zまでの索引ページより索引項目抽出(日本語項目&補助項目は除外)
items = []
link_tags.search('//p[position()=1]//a').each do |tag|
urls = URI.escape(BASE_URL + tag[:href])
doc = Nokogiri::HTML(open(urls))
doc.search('.//table[@class="indextable"]//a[position()=1]').each do |item|
item = item.text.split[0]
unless item.match(/^[-.:(]|,$/) || item.has_multibytes?
items << item
end
end
end
# 取得した全項目から重複分を省きソート後、辞書ファイルとして書き出し
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に置いておきます。もし使いたい場合にはどうぞ。