L'Isola di Niente » 覚え書きのページ » gEdit プラグインの応用 1
gEdit プラグインの応用 1
gEdit のエディタ部分は PyGtksourceview2 という GtkTextView サブクラスそのままである。
なので PyGtk の知識があれば何でもできます、Windows での秀丸マクロより遥に自由度が高いです。
ここでは簡単な解説とコード例をいくつか。
PyGtksourceview2 Reference Manual
Chapter 13. TextView Widget
なので PyGtk の知識があれば何でもできます、Windows での秀丸マクロより遥に自由度が高いです。
ここでは簡単な解説とコード例をいくつか。
PyGtksourceview2 Reference Manual
Chapter 13. TextView Widget
キーボードアクセラレータ
gEdit プラグインの作り方で解説している GtkActionEntry の四番目引数 accelerator で指定します。
たとえば Control+Shift+G で実効したいなら
デフォルト割り当てのキーが優先するので何も割り当てされていないのを確認してから指定してください。
たとえば Control+Shift+G で実効したいなら
actions = [("testtest", None, "引用に変換", "<Control><Shift>G", "すてーたすばー", self.on_testtest_activate)]
という具合に文字列で指定します、<Alt> も使えますし GtkUIManager によりメニューへもしっかり反映されます。デフォルト割り当てのキーが優先するので何も割り当てされていないのを確認してから指定してください。
文字列の加工、挿入、削除
基本的にすべてのテキスト操作は自分で作成したハンドラ内で行います。
内部は UNICODE 化されているのかポジションを得ると漢字でも一つとみなされます。
よく使いそうな細かいやり方を少々。
文書の最初や最後の GtkTextIter 取得
肝心の文字列編集は Python 標準操作で行います。
def on_testtest_activate(self, action):
# この view が PyGtksourceview2
view = self._window.get_active_view()
# この buf が GtkTextBuffer
buf = view.get_buffer()
この buf の中にテキスト文書が入っていますので GtkTextIter を介して編集を行います。内部は UNICODE 化されているのかポジションを得ると漢字でも一つとみなされます。
よく使いそうな細かいやり方を少々。
文書の最初や最後の GtkTextIter 取得
startiter = textbuffer.get_start_iter() enditer = textbuffer_get_end_iter()カーソル位置の GtkTextIter 取得
pos = buf.get_property("cursor-position")
it = buf.get_iter_at_offset(pos)
カーソル位置の一つ手前の GtkTextIter 取得(漢字も一文字となる)pos = buf.get_property("cursor-position")
it = buf.get_iter_at_offset(pos-1)
GtkTextIter 位置の文字を得る(漢字も一文字となる)c = it.get_char()
if c == "あ":
pass
GtkTextIter の比較while 1:
# 次の GtkTextIter を得る
pos += 1
nextiter = buf.get_iter_at_offset(pos)
# EOF に到達か?
if nextiter.equal(enditer):
break
選択範囲の文字列取得(最初と最後がタプルで戻る、選択されていないなら例外)try:
startiter, enditer = buf.get_selection_bounds()
except:
return
text = startiter.get_text(enditer)
指定範囲の削除buf.delete(it, nextiter)GtkTextIter 位置に文字列の挿入
buf.insert(it, "ズッコン")カーソル位置に直接文字列の挿入
buf.insert_at_cursor("バッコン")
肝心の文字列編集は Python 標準操作で行います。
Copyright(C) sasakima-nao All rights reserved 2002 --- 2010.
