Tips

IT技術系Tips

Sublime Text3でコードポイントを表示するプラグイン作ってみた

機能

UnicodeUTF-8のコードポイントを表示する。
f:id:kaerouka:20140309205049p:plain
SJISEUC-JPも欲しいって?
それはね・・・後述します・・・。

2014/03/25追記
sjis, euc-jp対応版があるので、使いたい人はそちらがおすすめ。
Sublime Text3でコードポイントを表示するプラグイン作ってみた(sjis対応版) - Tips
os x 10.9.2、sublime text3のみ動作確認済み。

コード

code_point.py

import sublime, sublime_plugin

class CodePointCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        pos = self.view.sel()[0].begin()
        c = self.view.substr(pos)

        d = [
        ("UTF-8:\t\t", "".join([hex(x)[2:] for x in c.encode('utf-8')]).upper()), 
        ("Unicode:\t", hex(ord(c)).upper()[2:])
        ]

        text = "Sample:\t" + c + "\n\n" \
        	+ "".join([x[0] + "0x" + x[1] + "\n" for x in d])

        sublime.message_dialog(text)

使い方

スクリプトを保存

/Users/anonymous/Library/Application Support/Sublime Text 3/Packages/
に、適当な名前でディレクトリを作ります。
anonymousの箇所はアカウント名です。
kaeroukaというディレクトリにしておきます。

ソースをcode_point.pyとして
/Users/anonymous/Library/Application Support/Sublime Text 3/Packages/kaerouka
に保存します。

コマンドパレットに登録

/Users/anonymous/Library/Application Support/Sublime Text 3/Packages/User

User.sublime-commands
という名前でファイルを作ります。
中身は

[
	{ "caption": "code_point", "command": "code_point"}
]

です。

これで、Shift + Command + Pでコマンドパレットを開き
code_pointと入力すると機能が使えます。

ショートカットに登録

Sublime Text > Preferences から、ユーザー用のキーマップファイルを開き、下記のjsonコードをコピペします。

	//コードポイント表示
	{ "keys": ["f2"], "command": "code_point" },

これで、f2を押すと機能が使えます。
デフォルトではf2を押すと、next_bookmakコマンドが起動されますが、私は使わないので上書きしちゃってます。

愚痴

ほんとはSJISくらいは表示したかったんだけど、できなかったんだよねー。

c.encode('utf-8')

は、問題ない。

c.encode('sjis')

は、エラーになる。
エラーの内容はこれ。

LookupError: unknown encoding: shift_jis

なぜか?

Sublime TextのPythonインタプリタって、OSにインストール済みのPython使ってるわけじゃなくて
組み込みのやつなんだってさ。
しかも、独自ビルドしてるっぽくて、JapaneseCodecs入れてないみたいなのね。
JapaneseCodecsはずいぶん昔のバージョンで本家に組み込まれたはずなんだけど、Sublime Textに組み込まれてるPythonインタプリタには入ってないみたい。
悲しい・・・。
でもSublime Text3はベースをPython2からPython3にしたみたいだし、そのうち日本語周りもマシになるんじゃないかなーと期待してる。

2014/03/16 追記
sublime textでsjisを扱う場合、convertToUTF8ってゆうプラグイン使うけど、
sublime test3の場合、Codecs33なるパッケージも一緒に入れる。
こいつ使えばsjisもいけちゃう・・・?
sjisガー!sjisガー!って言ってるけど、実際エンコードで指定するのはcp932だけども。

もう1個愚痴。

このソース

        d = [
        ("UTF-8:\t\t", "".join([hex(x)[2:] for x in c.encode('utf-8')]).upper()), 
        ("Unicode:\t", hex(ord(c)).upper()[2:])
        ]

このソースで、項目名に当たるところに「:\t\t」とかベタ打ちしてあるけど、これにも残念な理由があって
プロポーショナルフォント使ってるから、

        c.ljust(20)

とかやってもずれるんだよね。

なんかいい解決方法ないかな〜(チラッ