LoginSignup
5
4

More than 5 years have passed since last update.

Neocomplete用のpython辞書ファイルを作ってみた

Last updated at Posted at 2016-06-21

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.7ver3.5の各辞書ファイルをgithubに置いておきます。もし使いたい場合にはどうぞ。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4