GitGutterのshift-jis対応

引き続きSublimeText2を調整中。

パッケージの一覧を眺めると色々なシステムや言語についてのプラグインがあって、全く聞いたことのなかったものもあり、眺めているだけでもそれなりに面白い。

その中でちょっと目を引いたのが、GitGutterという、Git上の最新のテキストと編集中のテキストと比較して、変更された行にマークが付くというプラグイン。

Gitというのが何かというのを書くとそれだけで長くなるけど、バージョン管理システムの一種で、過去の編集履歴を保存して、最新の状態や以前保存した状態などを、後からでも調べることが出来る。
あーだこうだと変更して、結局今日どこを変えたのかよくわからなくなることがあり、そういう場合winmergeで差分をとって調べていたけど、エディタ上で調べる事ができる。
それどころかGitのデータを更新するのも別プラグインで出来るので、その気になればテキストエディタのみで編集からバージョン管理まで全部出来てしまう。

とっても便利なんだけど、1つ困ったことにshift-jisのテキストでは差分チェックが働かない。
最終的にgit diffコマンドで差分を表示する仕組みなのに、gitから読み込まれるはずのファイルが空っぽのまま。
ConvertToUtf8で編集は問題なく出来るけど、Gitから読み込んだデータはshift-jisのままだから、途中でなんだかんだとエラーが発生してしまう様子。

gitから最新データを読みこんだ時、shift-jisからutf-8に変換して、utf-8同士の比較という形にすれば動くんだけど、そのファイルがshift-jisかを調べてもわからなかった。
self.view.encoding()は"Undefined"だから、shift-jisかeuc-jpか、はたまた他の文字コードなのか不明。
ConvertToUTF8の中からならデータを取れるんだけど、他のプラグインからそれを知る方法が、そもそもあるのか無いのかよくわからない。
まあ最悪外部ファイルにでも文字コード保存すればいいわけだから、無いってことはないんだろうけど。
読み込んだデータから文字コードを割り出すことは可能だけど、自動認識ではなく手動で設定されている場合には上手くいかなそう。

とにかくちょっとやそっとじゃ歯が立ちそうになかったので、よく考えたら自分が困るのはshift-jisの時だけなので、わからん時はshift-jis(正確にはcp932)決め打ちにしたら、なんか動いた。
update_git_fileの中の該当箇所を
                                try:
contents = contents.decode(encoding.replace(' ', ''))
except UnicodeError:
try:
contents = contents.decode("cp932")
except UnicodeError:
contents = contents.decode("utf-8")
contents = contents.encode("utf-8")


という風に書き換えた。
正しい書き方かどうかはあやしいけど、とりあえずはutf-8のもshift-jisのも想定通りに動くようになった。

これとは別に、大きめファイルを編集していると遅くなるという問題があるけど、これはSublimeText3で動かして、かつ設定に"non_blocking": trueを追加すると解決する(らしい)。
2のままでもバッファの更新頻度を落とせば対応出来そうな気はするんだけど、これもちょっと見ただけではわからなかった。
マルチスレッドにしようにも外部との入出力が絡んでるし。
色々考えるよりもライセンス買って3の開発版使った方が費用対効果が良さそう。
とりあえずはlive_modeをfalseに設定して、テキストを保存したタイミングで比較するようにして様子見中。

6/13追記
self.view.encoding()はUndefinedになっている場合だけでなく、cp1252等別のコードと誤認したままの場合もあるようなので、添付のソースコードを修正。
posted by unaunagi at 2013/06/13 02:22 | Comment(0) | TrackBack(0) | デジタル>プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/366148493
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。