rcodetools 0.8.3 リリース

rcodetools 0.8.3 をリリースしました。以下のバグを修正しました。

「 gem install rcodetools 」、あるいは http://rubyforge.org/projects/rcodetools/ から tarball をダウンロードしてください。

rcodetools.el も忘れずに更新してください。


やっぱりエンコードが utf-8 だと xmp が動かない - ひがきの日記

$ xmpfilter -S ruby19 --dev --detect-rbtest utf8ng.rb # こっちは NG
/usr/local/lib/ruby19/gems/1.9.1/gems/rcodetools-0.8.1.0/lib/rcodetools/xmpfilter.rb:41:in `detect_rbtest': invalid byte sequence in Windows-31J (ArgumentError) from /usr/local/bin/xmpfilter:79:in `

'
$ LANG=ja_JP.UTF-8 xmpfilter -S ruby19 --dev --detect-rbtest utf8ng.rb
(動作する)

これはロケールエンコーディング以外のエンコーディングスクリプトを作成した場合で確認できました。
Ruby 1.9正規表現マッチはエンコーディングが正しく設定されてないとできないことが原因です。しかし、ロケールエンコーディング以外のファイルを読み込んだ時点でエンコーディングが狂ってしまうのではまります。*1
ASCII 文字でしか正規表現マッチしないので、とりあえず以下の行を加えてバイナリとして処理してみました。強引な気がしますが、どうなんでしょうね…

Encoding.default_external = "ASCII-8BIT" if RUBY_VERSION >= "1.9"

それに伴い、 column はバイト数で指定する必要がでてきます。 EUC-JP や Shift_JIS はバイト数=文字幅なので問題ありませんが、 UTF-8 はバイト数と文字幅が異なるので注意。そのように rcodetools.el も修正しました。

rct-complete の Ruby 1.9 用クイックハック - ひがきの日記

Ruby 1.9 を使っていると、以下のコードを補完できない。

# -*- coding: utf-8 -*-
"こんにちは".enc

同じように、文字列に対して enc で始まるメソッドを探してるだけなのに。

これは Ruby 1.8 でも起こります。なぜなら、バイト数と文字幅が異なるからです。

追記

方向性としては magic comment を調べて force_encoding のが正解ですね。

Ruby 1.9 的にはそれが正しいでしょう。しかし、( Ruby 1.8 用の) magic comment が指定されていないスクリプトの場合はどうするのかは悩みます。 rcodetools 自体は Ruby 1.9 で動かしていて、注釈・補完用に内部で起動する Ruby インタプリタRuby 1.8 …というケースです。
なので、 Ruby 1.9.2 が出てしばらくしたら encdet.rb を使おうかなと思っています。そのころには標準添付になっているかな。

/\\/=~"表".encode("Shift_JIS").force_encoding("ASCII-8BIT")がマッチしちゃったり

まあ rcodetoolsRuby 1.8 で動かした場合も起きるでしょう。

*1:この場合エンコーディング UZEEEEEEEEEEEEE って感じなんだが。