SublimeText3 - SublimeCodeIntelの補完が効かない - TypeError: must be str, not bytes

SublimeText3のRubyモードでEclipseのContet Assistみたいに補完したい

SublimeText 3でRubyスクリプトをコーディングするときに、コンテキストに応じた補完が効くと便利だと思って調べたら、SublimeCodeIntelというプラグインがデファクトスタンダードのようです。Package Controlから、

  1. Shift + Command + P
  2. Installと入力
  3. SublimeCodeIntelを選択
  4. return

としてインストールしました。

動かない問題

早速Rubyスクリプトを書いて、補完が効くかどうか試してみたのですが、コーディング途中に自動的に表示されるはずの補完候補が表示されませんでした。 SublimeCodeIntelのログは~/.codeintel/codeintel.logに記録されるということだったので、

1
less ~/.codeintel/codeintel.log

のように確認してみると、以下のようなエラーがでていました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Updating indexes for 'Ruby'... The first time this can take a while.
scan_purelang: path: '/Users/yuasa/Desktop/simpledb.rb' lang: Ruby
Doing CodeIntel for 'Ruby' (hold on)...
eval 'a' at simpledb.rb#19  <Trigger 'ruby-complete-object-methods' at 475 (explicit)>
Unexpected error with evaluator: 'a' at simpledb.rb#19
Traceback (most recent call last):
  File "/Users/yuasa/Library/Application Support/Sublime Text 3/Packages/SublimeCodeIntel/libs/codeintel2/tree.py",
   line 317, in eval
    cplns = self.eval_cplns()

  (...中略...)

  File "/Users/yuasa/Library/Application Support/Sublime Text 3/Packages/SublimeCodeIntel/libs/textinfo.py",
   line 621, in _classify_encoding
    norm_emacs_encoding = _norm_encoding(emacs_encoding)
  File "/Users/yuasa/Library/Application Support/Sublime Text 3/Packages/SublimeCodeIntel/libs/textinfo.py",
   line 1493, in _norm_encoding
    return codecs.lookup(encoding).name
TypeError: must be str, not bytes
done eval: eval error
Done 'Ruby' CodeIntel! Full CodeIntel took 58ms

このうち、最後の

1
TypeError: must be str, not bytes

という部分がメインのエラーのようです。

解決方法 (gitレポジトリのdevelopmentブランチを使う)

「SublimeText3 TypeError: must be str, not bytes」検索してみると、github上のissueページ(TypeError: must be str, not bytes in codeintel.log when trying to do anything #333)が出てきます。議論は途中で途切れていて、ちゃんとしたcloseになっていないような気がしますが、Statusはclosedになっています。真ん中くらいの投稿をみると、「developmentブランチには修正がかかっていて、githubからSublimeTextのプラグインフォルダに直接レポジトリをcloneするとちゃんと動いた」とのこと。

ということで、ターミナルから以下のようにして、gitレポジトリをcloneし、developmentブランチを使うように設定してみます。

1
2
3
4
5
6
7
8
9
10
#いま入っているプラグインを削除
cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages/
rm -rf SublimeCodeIntel

#githubからレポジトリをclone
git clone https://github.com/SublimeCodeIntel/SublimeCodeIntel

#developmentブランチに切替(checkout)
cd SublimeCodeIntel
git checkout development

として、SublimeText3を再起動し、Rubyスクリプトを編集してみます。

動作確認

たとえば、新規ファイルを開いて、Shift + Command + P→Ruby→(Set Syntax: Rubyを選択)→ReturnでRubyモードにしてから、

1
2
str="test string"
puts str.len

のように入力すると、以下のように補完ウインドウが表示されます。また、「.(ドット)」までで止めると、ちゃんとStringクラスが提供するメソッド一覧が表示されて、選ぶことができます。

もう少し難しいサンプルは以下。

感想

便利!これで、C++ベースの中・大規模プログラムはEclipse、RubyベースのスクリプトはSublimeText3で決まりになりました。2015年は、X線データ解析や各種作業の自動化のために記述するシェルスクリプトもRubyベースに移行する予定です。

参考文献

[tmkm-amazon]9784844335672[/tmkm-amazon]