Fedora 15 (GNOME 3) 64bit 生活六日目。
※ Gedit Plugin
Gedit/PythonPluginHowTo – GNOME Live!
Gedit 3 のプラグインは妙に複雑になった感じだけどやってみると簡単。
Gedit プラグインの作り方 – L’Isola di Niente
私の公開しているこのページを Gedit 3 用に改造してみる。
*.gedit-plugin 拡張子であったファイルは *.plugin と拡張子を変更。
セクション名を [Plugin] に、IAge を 3 に変更、v2 との違いはコレだけだ。
肝心のコード
#-*- coding:utf-8 -*- import gedit import gtk class TestPligin(gedit.Plugin): def __init__(self): gedit.Plugin.__init__(self) def activate(self, window): self.window = window def deactivate(self, window): pass def update_ui(self, window): pass
↓
#-*- coding:utf-8 -*- from gi.repository import GObject, Gedit, Gtk class TestPligin(GObject.Object, Gedit.WindowActivatable): __gtype_name__ = "TestPligin" window = GObject.property(type=Gedit.Window) def __init__(self): GObject.Object.__init__(self) def do_activate(self): pass def do_deactivate(self): pass def do_update_state(self): pass
ということみたい、コールバックに引数は無くなったんだね。
__gtype_name__ は class 名と同じにしなければいけないみたい。
多重継承の敬称元を Gedit.AppActivatable とか3つから選べになっている。
普通なら Gedit.WindowActivatable だけでいいだろう。
下のほうにあるサンプルコードは継承元を書き忘れているじゃん…
後は self.window のメソッドを辿って弄くっていく。
v2 のコードから gtk → Gtk に全置換する必要がある。
それと activate のコールバックは引数を3つにしておく必要があった。
user_data を指定しなくても None が送られてくるみたい、注意ね。
ついでに GtkMessageDialog の引数は enum 形式に変更されていた。
指定がよく解らない人は dir() で辿って(私はそうやった)
testtest.plugin
[Plugin] Loader=python Module=testtest IAge=3 Name=testtest Name[ja]=テストテスト Description=plugin test Description[ja]=プラグインのテスト Authors=sasakima-naoCopyright=Copyright © 2011 sasakima-nao Website=http://palepoli.skr.jp/
testtest.py
#-*- coding:utf-8 -*- from gi.repository import GObject, Gedit, Gtk ui_str = """<ui> <menubar name="MenuBar"> <menu name="EditMenu" action="Edit"> <placeholder name="EditOps_3"> <menuitem name="testtest" action="testtest"/> </placeholder> </menu> </menubar> </ui> """ class TestTest(GObject.Object, Gedit.WindowActivatable): __gtype_name__ = "TestTest" window = GObject.property(type=Gedit.Window) def __init__(self): GObject.Object.__init__(self) def do_activate(self): # GtkUIManager を得る manager = self.window.get_ui_manager() # GtkActionGroup を新規で作成 self._action_group = Gtk.ActionGroup("TestTestActions") # GtkActionEntry を作成 # name, stock_id, label, accelerator, tooltip, callback actions = [("testtest", None, "引用に変換", None, "すてーたすばー", self.on_testtest_activate)] # GtkActionGroup に挿入 self._action_group.add_actions(actions) # GtkUIManager に追加 manager.insert_action_group(self._action_group, -1) self._ui_id = manager.add_ui_from_string(ui_str) def do_deactivate(self): manager = self.window.get_ui_manager() manager.remove_ui(self._ui_id) manager.remove_action_group(self._action_group) manager.ensure_update() def do_update_state(self): pass def on_testtest_activate(self, action, data=None): view = self.window.get_active_view() buf = view.get_buffer() try: begin, end = buf.get_selection_bounds() except: self.messagebox("変換したいテキストを選択してください") return text = begin.get_text(end) lines = text.split("\n") # list の join に変更 result = [] for line in lines: result.append("> {0}".format(line)) buf.delete_selection(True, True) buf.insert_at_cursor("\n".join(result)) def messagebox(self, text): dlg = Gtk.MessageDialog( self.window, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, text) r = dlg.run() dlg.destroy()
と2つのファイルを作成して ~/.local/share/gedit/plugins に置く。
Gedit を再起動して設定からこのプラグインを選択。
GtkUIManager のメソッドや XML UI 指定は v2 と変わっていないようだ。
これで Gedit 3 のプラグイン作りはなんとかなりそう。
ついでに、外部ツールで実行前にファイルを保存するように指定すると動作しない。
gedit って更新毎に必ず一ヶ所はおかしな所があるよね。