Hatena::ブログ(Diary)

日記

2013-01-31

IMESupportがSublime Text 3に対応しました & Linuxでの日本語入力に関して

IMESupportがPackageControlに登録されました。

登録されたのは去年の11月末なんですが、書くのを忘れていました。現在はPackageControlからインストール可能です。

ただし、PackageControl自体が現時点ではSublime Text 3に対応していないため、Sublime Text 2のみです。

IMESupportがSublime Text 3に対応しました。

今までと同じリポジトリなので、git cloneするかzipダウンロードしてインストールしてください。ST2/ST3の両対応となっています。

以下の点を含め、まだ動作がおかしい点があるかもしれません。

  • (ST3のみ)フォントの種別が適用されない。(フォント名の設定をまだ実装していないため)
  • (ST3のみ)特定の条件でインライン入力の位置がずれているような?(まだちゃんと確認していません)

ちなみに、ST3はプラグインが別プロセスで動作するようになったためプラグインのクラッシュの影響を受けなくなったそうですが、IMESupportはSetWindowsHookExを使ってsublime_text.exeのプロセスプラグイン側のコードを動作させるようにしたため、IMESupportがクラッシュの要因になる可能性があります。

(別プロセスからIMEの制御が出来ないのでこうするしかありませんでした。)

Linuxでの日本語入力

現在のSublime Text 2は(InputHelperみたいなものを除いて)日本語入力できません。(Sublime Text 3は未確認です)

この状況を打破すべく、SublimeIBus の開発を開始しました。 これは ibus.el を Sublime Text 2 に移植したものです。まだまともに日本語入力できる状態ではないですが、LinuxSublime Textで日本語入力したいと思っている方は、ぜひ開発に協力してください。

2013-01-28

Sublime Text Tips 3. 保存確認を出さないバッファを作成する

通常、 バッファを変更すると変更マークが付き、保存しないままそのバッファを閉じようとすると保存確認ダイアログが表示されます。これは、バッファスクラッチバッファに設定すれば保存確認ダイアログを表示せずに閉じることができるようになります。

スクラッチバッファに設定するには、対象のViewオブジェクトに対して set_scratch を呼び出します。

view.set_scratch(True)  # スクラッチバッファに設定する

スクラッチバッファにするとバッファを編集しても変更マークが付かず、保存確認ダイアログも出ないため、プラグインが情報を表示するためにバッファを作成する際はスクラッチバッファに設定しておくとよいです。

Sublime Text Tips 2. コンソールで使用できる変数

Sublime Text 2はPython処理系を内蔵しており、シェルpythonを起動したときのインタラクティブシェルのような、対話的な実行環境が利用できます。

コンソールを表示するには、メニューから View→Show Console を選択します。

コンソールではあらかじめ幾つかのモジュールインポートされていたり、グローバル変数が設定されています。

使える物の一覧は、「globals().keys()」で表示できます。コンソールで入力してみると、以下のように表示されます。

>>> globals().keys()
['zipimport', '__builtins__', '__package__', 'sys', 'window', 'sublimelog', 'uzipimporter', 'LogWriter', '__name__', 'os', '__doc__', 'sublime', 'view']

つまり、あらかじめ以下のようにインポートされた状態になっています。

import zipimport
import os
import sys
import sublime
import sublimelog  # 詳細不明

また、viewとwindow変数が利用できます。viewは sublime.View クラス、 windowは sublime.Window クラスのインスタンスです。これらのクラスの詳細は API Reference - Sublime Text 2 Documentation を参照してください。

uzipimporterとLogWriterはよくわかりません。

viewとwindowには現在のビュー(タブ)とウィンドウに対応するインスタンスが設定されていて、ビューやウィンドウを切り替えると、この変数の内容も変わります。

特に重要なのはview変数です。Sublime Text 2のプラグイン作成では sublime.View クラスを使用して、カーソル位置を変更したり、テキスト内容を変更したりします。view変数が使えるため、実行しようとしているコード片をコンソールで気軽に実行することができます。

例えば、view.sel() は現在のカーソル位置、選択位置を返します。カーソルを移動してからコンソールに移って view.sel() を実行してみてください。カーソル位置により結果が変わってくることがわかると思います。カーソル位置は、簡単に言うとファイルの先頭からの文字数で表わされるんですが、詳細はまた別の記事で書こうと思います。

コンソールはSublime Text 2のプラグイン作成に大いに役立ちます。ぜひ活用してください。

Sublime Text Tips 1. sys.argvが存在しない

Sublime Text 2のPython処理系にはsys.argvが存在しません。実際にコンソールで「sys.argv」と入力してみると以下のエラーが表示されます。

(ちなみに、次の記事で説明する通り、コンソールではsysモジュールインポート済みのため、 import sys を実行する必要はありません。)

>>> sys.argv
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute 'argv'

このことは、sys.argv を参照するモジュールで問題になります。たとえば、doctestモジュールはsys.argvを参照するため、そのまま使用するとエラーになってしまいます。

とりあえず、doctestを実行する前に、以下の通りにsys.argvに適当に設定しておけば、エラーは回避できます。

import sys
sys.argv = ["sublime_text.exe"]  # 適当に設定

これはあくまでSublime Text 2のPython処理系で実行したときの話です。doctestに限れば普通のテストはシェルから .py を叩いて実行したいはずなので、その場合は関係ありません。

ただし、普通のPython処理系では import sublime のようにしてSublime Text 2のモジュールを利用することはできないため、テストをSublime Text 2上で実行する必要があります。プラグインのテストをdoctestで書きたい場合は、上記の内容に気を付ける必要があります。

2013-01-21

Sublime Text2は四畳半完全なエディタです

VimEmacsEclipseなど、現在のウインドウを横分割や縦分割していくものは

四畳半のようなウインドウの構成にすることができない問題。

http://d.hatena.ne.jp/tyru/20110108/matp

四畳半問題を解決できるウインドウ分割法のことを四畳半分割法という。今決めた。

そのような分割法を備えるウインドウマネージャ四畳半完全という。今決めた。

http://d.hatena.ne.jp/tyru/20110108/try_to_solve_matp

Sublime Text 2は四畳半のようなウインドウ分割が可能です。

f:id:chikatoike:20130121225305p:image

このような分割にするには、.sublime-keymap で以下のように定義してキーバインドを実行します。

[
    {
        "keys": ["alt+shift+6"],
        "command": "set_layout",
        "args": {
            "cols": [0.0, 0.33, 0.66, 1.0],
            "rows": [0.0, 0.33, 0.66, 1.0],
            "cells": [
                [0, 0, 1, 2], // 1
                [1, 0, 3, 1], // 2
                [2, 1, 3, 3], // 3
                [0, 2, 2, 3], // 4
                [1, 1, 2, 2]  // 5
            ]
        }
    }
]

私もいまいち仕様がよくわかっていないので詳しい説明はしません。ただ、画像とキーバインド定義を見ればわかる通り、画像のウィンドウに表示されているAAの番号とキーバインド定義のコメントに書いてある番号が対応しています。

きっかけ

http://qiita.com/items/5ccbe63d36009680e0e6#comment-3e9349993ae4ccb1db78

IMESupportの不具合報告を受けたんですが、そのとき Sublime Text 2 で複雑なウィンドウ分割が可能なことを初めて知りました。

そしていつか読んだtyruさんの四畳半問題をすぐに思い出して、試してみたら出来てしまいました。

参考

http://www.sublimetext.com/forum/viewtopic.php?f=6&t=7284

set_layoutコマンドの説明が書いてあります。

2012-12-15

Sublime Text 2 でアニメーションGIFを再生する

この記事は Sublime Text 2 Advent Calendar 2012 の 15日目です。

no title

VimはXPM形式の画像ファイルを画像として表示することができます。これは、テキストエディタのシンタックスハイライトを利用して、1文字を1ピクセルとみなして描画することで実現しています。

そして Sublime Text 2 でも当然、同じ方法で画像を表示することが出来ます。今回はさらにアニメーションGIFを再生してみました。

再生時の動画

以下のGIF動画は実際に再生しているところを録画したものです。nyancat の動画を再生しています。nyancat をご存知の方も多いでしょう。

f:id:chikatoike:20121215231218g:image

アニメーションGIFを再生する手順は以下の通りです。 上の動画は手順2から録画しています。

  1. 後述するパッケージ(SublimeMediaPlayer)を導入する
  2. コマンドパレットで "MediaPlayer: Play GIF Select" を選択する
  3. 画面下部にテキストボックスが表示されるので、再生したいGIFファイルのパスを入力してEnterを押す
  4. しばらく待つと再生が始まります。
  5. アニメーションを終了するには再生しているタブを閉じてください。

nyancatのアニメーションGIFはパッケージに同梱していないので、 セキュリティチェックが必要です から入手してください。

パッケージ 「SublimeMediaPlayer」

GitHub - chikatoike/SublimeMediaPlayer

SublimeMediaPlayer は上記のURLにあるので、 git clone するなり zip で落すなりしてインストールしてください。

急いで作ったのでけっこうひどいコードです。

今のところアニメーションGIFの再生しかできませんが、時間がなかっただけで、jpegやpngといった静止画の表示も技術的には可能です。

GIFアニメーションを読み込むために pyglet というライブラリを使っています。

また、 "MediaPlayer: Play GIF Select" 以外に、"MediaPlayer: Play GIF dinosaur.gif" というコマンドも用意していて、これはリポジトリに同梱している dinosaur.gif を再生します。このgifファイルはpygletのリポジトリにあったものです。

対応するプラットフォーム

pyglet がWindows/MacOSX/Linux に対応しているので、全てのプラットフォームで動作すると考えられますが、Windowsでしか動作確認していません。

おわりに

明日のSublime Text 2 Advent Calendar は yudai tachibana さんです。

2012-11-20

IMESupportが64bit版に対応しました。

https://github.com/chikatoike/IMESupport

これまでWindows 64bitでは、Sublime Text 2のx86版では動作するものの、x64版では動作しない状態でした。

今回正式にx64版のSublime Text 2に対応しました。

動作確認はWindows 8 64bitのみで行なっているので、Windows XP/Vista/7 では確認していませんが、多分動作するでしょう。

また、以前のバージョンには、プロジェクト移動でクラッシュするという問題があったのですが、これもx64対応と同時に修正しました。

また、現在Package Controlへ登録申請中です。登録されたらまた報告します。

実装方法の変更

以前の記事で、ウィンドウのサブクラス化を使っていると書きましたが、これは SetWindowsHookEx を使ってローカルフックする方法に変更しました。元々最初に実装していたときは、フックを利用しようとしていましたが、フック関数はDLL内に実装する必要があると書いてあったので、pythonのみでは実装できないと思って、サブクラス化を使用していました。その後、あらためて確認したら、DLLにする必要があるのはグローバルフックのみであることに気付きました。IMESupportはSublime Text 2のウィンドウメッセージのみフックできればよいので、pythonのみでローカルフックする処理を実装しました。