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-nao
Copyright=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 って更新毎に必ず一ヶ所はおかしな所があるよね。