忍者ブログ

Py淡 (PyTan)

Home > ブログ > Sublime

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Panda3dを使用したPythonスクリプト用のSublime Textビルドコマンド設定

{
    "cmd": ["C:/Panda3D-1.9.0/python/ppython.exe", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "working_dir": "C:/Panda3D-1.9.0/bin"
}
をppython.sublime-buildとしてPortableApps\sublime_text\Data\Packages\Userに保存。 私のsublimeはPortableApps.com経由なのでユーザー設定ファイルが変なところにある。普通はC:\Users\ユーザー名\AppData\Roaming\Sublime Text 2\Packages\Userにあるはず。 これをTools→BuildSystemから選んで、Ctrl+Bでスクリプトが起動できるようになる。 OpenGLのエラーが出る場合は素直にビデオドライバの型番をしらべてメーカーから最新版をダウンロードする。WindowsUpdateのドライバーではNVIDIA FX580でエラーになった。
PR

Google日本語入力とSublime Textの相性が悪い問題が解決!

Sublime Textは開発者がオーストラリア人のJon Skinnerさんで、Gtkをベースにした独自のGUIでできているらしいのでやはり日本語に弱く、日本語IMEを使うと入力中の日本語がカーソルのある位置でインライン表示されずに画面左上あたりに表示されてしまう問題がある。



これはIMESupportという素晴らしいプラグインのお陰でちゃんとした位置に表示されるようになるんだけども、Google日本語入力では”ひらがなモード”から”Direct inputモード”にしてアルファベットを入力しようとすると入力モードの[あ]とか[A]とかのインライン表示が常にカーソルを追いかけて来てしまう。EmEditorなど日本語対応している他のエディタだとIMEの切替時や入力モードの切替時に一度表示されておしまい。

MS-IMEならこの問題はないが、とてもおかしな変換ばかりするので使い物にならない。ATOKは好きでダウンロード販売で買ってずっと使っていたが、インストーラーのファイルがどっかに行ってしまい、再ダウンロードしようとしたら期限切れだそうで、バカバカしい。

普段はプログラミングにアルファベットを入力することの方が多いがデフォルトのIMEを英語に設定しても必ず日本語のDirect inputモードに戻ってしまうので、このインライン表示が非常にうっとおしい。

どうにかならないかとGithub上のIMESupportプラグインのコードを眺めていると割りと短い綺麗なコードでこれならハックできるかもしれないと思い色々やってみたら、二行コメントアウトするだけで見事に問題が解決出来てしまった。詳細はプールリクエストしていますが、imesupportplugin.pyの162行目あたり、上の画像のifのブロックをコメントアウトするだけです。このファイルは通常はC:\Users\ユーザー名\AppData\Roaming\Sublime Text 2\Packages\IMESupportにあるはずです。

Sublime TextのプラグインってPythonなのでとてもハードルが低かった。なんか作ってみたくなった。

Sublime Text2からPythonコードをgeany_run_script.batっぽく実行。

OpenCVで複数namedWindowを使ったコードをSublime Text2から走らせるとなぜか最初のウィンドウが出てこないという奇妙なバグがあって、これのせいでSublime Text断念して、Geanyへ戻ったというエントリーを書いたばかりですが、自分でビルドしたoverviewプラグインがまだ不安定で二度ほどクラッシュしてしまったので、overviewは正式版のリリースを待った方がいいかもしれないので、Sublimeを再考してみました。

自分用のGeanyのRunスクリプトっぽいPythonビルドシステムをつくって差し替えればいいのではないかと思いついた。

SublimeのビルドシステムについてはUnofficial docを参考にした。

GeanyはPythonスクリプトを起動する度に動的にgeany_run_script.batという起動スクリプトを生成して、ここからPythonコードを起動する。strerrとかstroutとか全部このbatが走っているcmdにくるという仕様。簡単だが恐ろしく安定しているので理に適っていると思う。

geany_run_script.batの内容は以下の感じ。

python "your_script.py"

pause
del "%0"

pause

delのラインで自分自身を消しているので、基本的にはgeany_run_script.batというファイルはお目にかかれないが、たまに消し損ないがある。たぶんDropboxとかその辺が同期しようとしてファイルをロックしてしまうのではないかと推定。


これと同じようなことをbatでやればいいのだから第一引数の%1をpythonスクリプトへのパスにして、

C:\\Python27\\python.exe %1


とかやって、これをRunLikeGeany.batとかで保存。このバッチファイルをビルドシステムから呼び出したいので、

{
    "cmd": ["C:/path/to/RunLikeGeany.bat", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
}

こんな感じの設定をpython-geany-style.sublime-buildとかの名前でSublimeのData/Packages/Userに保存しておけば新たなビルドシステムが登録される。

これで、Geanyと似たような動作が得られて、OpenCVの問題も一部解消した(ウィンドウが全部でた)。しばらくSublimeを試そう。。。


追記:このバッチファイルをつかっても、Sublimeがcmdとsubprocessモジュールのパイプで通信しながらstdoutを読み出しているっぽいけども、これがやたら遅れる。もともとビルドメッセージを取ってくるためのものなので遅くても問題ないからしょうがないが、なんとかパイプをフラッシュするタイミングを速くできないものか。やっぱGeanyがいいかも・・。

追記2:一番動作がGeanyのRunスクリプトに近くなるのは、

C:\\Python27\\python.exe %1
pause

というバッチをPythonスクリプトと同じフォルダにおいておいて、これにドラッグすると一応同じ動作になって、Pythonスクリプト終了してもpauseでcmdが生き残るのでエラーがあった場合は確認できる。

しかし、これでもまだ何度も繰り返すことを考えるとまだ面倒なのでAHKスクリプトでショートカットキーをSublimeに割り当てて、このバッチを呼び出すという荒業も考える。スマートな解決法ではないので最後の手段だな。


追記3:Sublimeの中でPythonのコンソールを持てるSublimeREPLというのを知って、つかってみたらすごかった。OpenCVの問題も解決し、さらにはコードセレクションをぽちぽちDreamPieに送っている私のAHKスクリプトを引退に追いやる勢い。Sublime恐るべし。Geanyとはユーザー数とエコシステムが違うなぁ。

追記4:REPLにLoadFileToReplを組み合わせたらかなりGeanyの実行環境に近づいてきて、これでGeanyから乗り換え完了かと思ったが、REPLはすごいんだけども、やっぱり複雑なことをすると変なことがおこったりもするようだ。multiprocessingモジュールとQueueをつかったスクリプト(https://gist.github.com/i-namekawa/a24709d92f890b541bb4)を走らせたらWorkerクラスが__main__に見つからないとかでエラー。Geanyで同じのを実行するとちゃんと動いた。REPLの特殊な環境が干渉してたぶんスクリプトの実行しているスコープに影響が出たっぽい。やっぱりGeanyのシンプルさと安定性はすごいのかも。

http://stackoverflow.com/a/23722631/566035
Ctrl + BでReplでPythonスクリプトを実行するためのビルド設定。