Diary?

2007-09-14
Fri

(20:09)

試しに Scribes のプラグインを書いてみた。各種のプログラミング言語ごとにオートインデントとかの機能を提供するプラグインなんだけど、とりあえず Python 版だけ書いた。ってか、俺の場合あとは C と Makefile だけで事足りそうだなあ。

インストール手順は以下の通り。

  1. 上記のファイルをダウンロードして適当な場所で解凍
  2. PluginLanguageMode.py と LanguageMode ディレクトリを ~/.gnome2/scribes/plugins にコピー
  3. もしかしたら scribes を立ち上げ直す必要があるかも

で、今のところ出来ることは

  • Ctrl + [ で前の、 Ctrl + ] で後のクラス/関数定義へジャンプ
  • 制御構造 (class, def, if など) をタイプして改行すると自動インデント
  • return, yield などの後に自動アンインデント

ぐらい。適当に書いたのでバグが残っているけど、まあそこは直していくつもり。あとは何がいるかなあ。クラスブラウザはあると便利かもしれないし、 pychecker との連携もあると嬉しいかもしれない。

ちなみにプラグインの書き方はまだオフィシャルなドキュメントがないけど、まあソースを読めば大体わかる。とりあえずサンプル、ってか上記のプラグインのコードの一部。

name = 'Language Mode Plugin'
authors = ['Kuwata Chikara <lawless-882@jeans.ocn.ne.jp>']
version = 0.1
autoload = True
class_name = 'LanguageModePlugin'
short_description = 'Support functions for programming.'
long_description = '''Support functions for programming.'''
 
class LanguageModePlugin(object):
  def __init__(self, editor):
    self.__editor = editor
    self.__manager = None
   
  def load(self):
    from SCRIBES.utils import get_language
    from SCRIBES.info import home_plugin_folder
    import LanguageMode
    from imp import load_source
    lang = get_language(self.__editor.uri)
    if lang != None:
      mode = lang.get_id() + 'Mode'
      module = load_source(mode, home_plugin_folder + '/LanguageMode/' + mode + '.py')
      cls = getattr(module, mode)
      self.__manager = cls(self.__editor)
    return
  
  def unload(self):
    if self.__manager != None:
      self.__manager.destroy()
    return

コードの要素を上から見ていくと

name
プラグイン名。とりあえず書いとく。
authors
作者(複数可)。何に使ってるか知らん。
version
プラグインのバージョン。
autoload
これが False だと起動時に読み込まれないっぽい
class_name
プラグインのクラス名。
short_description, long_description
プラグインの説明。

とりあえずここまでは必須の要素っぽい。

それで肝心のプラグイン本体なんだけど、これは

  • コンストラクタで Editor のインスタンスを受け取る
  • load() メソッドと unload() メソッドが定義されている

のが条件で、あとはお好きなように。ここから先は Scribes というよりも PyGtk, PyGObject, PyGtkSourceView といった巨大パッケージの知識の世界だ。ちなみに Gtk は「カーソルのある行の文字列を取得」などといった処理が一発で出来るメソッドがないなど、非常に使いにくい部分がある。さすがに Scribes の作者も頭にきたのか、SCRIBES.utils, SCRIBES.lines などでユーティリティ関数が多く定義されている。

それにしてもだ、俺はプラグインが嫌いなんじゃなくて vim スクリプトや elisp が嫌いだったんだなあ。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。