L'Isola di Niente
L'Isola di Niente » Gedit Tips » Gedit プラグインの応用 1

Gedit プラグインの応用 1

Gedit のエディタ部分は GtkSourceView という GtkTextView サブクラスそのままである。
なので Gtk+ の知識があれば何でもできます、Windows での秀丸マクロより遥に自由度が高いです。
ここでは簡単な解説とコード例をいくつか。

キーボードアクセラレータ

Gedit プラグインの作り方で解説している GtkActionEntry の四番目引数 accelerator で指定します。
たとえば Control+Shift+G で実効したいなら
actions = [("but_active", None, "アクティブ以外全部閉じる", "<Control><Shift>G", 
            "アクティブなタブ以外全部閉じる", self.on_but_active_activate)]
という具合に文字列で指定します、<Alt> も使えますし GtkUIManager によりメニューへもしっかり反映されます。
デフォルト割り当てのキーが優先するので何も割り当てされていないのを確認してから指定してください。

文字列の加工、挿入、削除

基本的にすべてのテキスト操作は自分で作成したハンドラ内で行います
プラグインを呼び出すと activate シグナルが発生するのでそのハンドラにて
肝心の編集は Python の強力な文字列編集機能が使えます

    def on_testtest_activate(self, action, data=None):
        """
            下記の buf の中にテキスト文書が入っています
            コレを GtkTextIter を介して編集を行います
        """
        # この view が GtkSourceView
        view = self.window.get_active_view()

        # この buf が GtkTextBuffer
        buf = view.get_buffer()

        # カーソル位置の GtkTextIter 取得
        it = buf.get_iter_at_offset(buf.props.cursor_position)

        # カーソル位置の一つ手前の GtkTextIter 取得(漢字も一文字となる)
        previter = buf.get_iter_at_offset(buf.props.cursor_position - 1)

        # 文書の最初や最後の GtkTextIter 取得
        startiter = buf.get_start_iter()
        enditer   = buf_get_end_iter()

        # GtkTextIter 位置の文字を得る(漢字も一文字となる)
        c = it.get_char()
        if c == "あ":
            pass

        # GtkTextIter の比較
        pos = buf.props.cursor_position
        while 1:
            # 次の GtkTextIter を得る
            pos += 1
            nextiter = buf.get_iter_at_offset(pos)
            # EOF に到達か?
            if nextiter.equal(enditer):
                break

        # 選択範囲の文字列取得(最初と最後がタプルで戻る、選択されていないなら例外)
        try:
            select_start, select_end = buf.get_selection_bounds()
        except:
            pass
        text = select_start.get_text(select_end)

        # 指定範囲の削除
        buf.delete(select_start, select_end)

        # GtkTextIter 位置に文字列の挿入
        buf.insert(it, "ズッコン")

        # カーソル位置に直接文字列の挿入
        buf.insert_at_cursor("バッコン")
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.