Posts Tagged ‘gEdit’

EmEditor を Gedit 風にカスタマイズ

以前
Tab キーでのスニペット挿入が秀丸でも EmEditor でもできずもどかしい!
なんて書いたけど…

窓の杜 – 【NEWS】スニペットの強化で入力作業が大幅に軽減された「EmEditor」v9のベータ版が公開

ぅおい! EmEditor v9 はできるんかい。
有償でも絶対に買うよ、会社なんだから無償バージョンアップを続けるのも辛いだろうし。
閉じ括弧の自動保管とかなんてウザいだけだからいらないんだが。
コード保管も使い物にならないだろうし、Visual Studio レベルなら考えるけど

よし、EmEditor を普段使っている Gedit 設定風にカスタマイズしてしまおう!

Ubuntu ではテキスト編集を全て Gedit で行っているのでもう手が勝手に動く私。
どうでもいいが最近 gEdit と書くか Gedit と書くかで迷うようになった。

まず Shift+Home で行の一番先頭まで選択してしまう件をなんとかしたい。

得に Python をやっているとインデントの先頭までを選択はよく行う。
Ctrl+Shift+Alt+Home でインデントの先頭になるけどコンナの普通に何度も押せるかい!
これは「ヘルプ – キーボードマップ」から

shift_home

と割付変更、これだけでインデントの先頭までを選択になる。
もう一度 Home を叩けば行の先頭へ、これで Gedit と完全に同じだ。

ぱぇぽぃ2 ? Blog Archive ? Home キーを 2 回叩け

それに Shift+Tab での逆インデントが範囲選択中しか行えないのが理解できない。
範囲選択されていなくてもその行を逆インデントしたほうが直感的だと思うんだが。
というか Python でコレができないのは致命的、半角スペース 4 つが普通なんだから。

ちなみに Linux の /usr/bin 以下にある Python スクリプトは全部半角スペース 4 つである。
Windows ならともかく Linux でこのインデント以外にて Python を書いている人は…略。
とにかく Shift+Tab で逆インデントしてくれないとスクリプトを書くのに効率が悪すぎる。

なのにキー割り当てに設定が無い、しかたがないのでマクロを作って Shift+Tab に割付。
Gedit はカーソル位置がどこでも逆インデントできるけど結局は先頭でしか行わない私。

if (document.selection.IsEmpty) {
	if (document.Config.Indent.InsertSpaces)
		document.selection.DeleteLeft(4);
	else
		document.selection.DeleteLeft(1);
} else {
	document.selection.UnIndent(1);
}

Python でなく js で書いているのは気にしない。
Windows 7 RC には IronPython しかインストールしていないからである。
とりあえずこれでインデントに対する私的な不満は無くなった。

gedit でデバッグ

んで、外部ツールに IronPython を登録してコチラも F5 に割り付けてと。

f5exec

Python の設定を開いて「タブ/インデント」はインデント開始文字を空に。
勝手にインデントしてしまうのが私は気に入らない、直感的でないものは極力排除。
タブの代わりに 4 つの空白を挿入に変更、これで望みどおりの動作になった。

後はスニペットに似たようなのをガシガシ登録。
でもスニペットだと認識するのに少し時間が掛かるみたい、改良を気長に待つとするか。

doc

しかしスニペットプラグインウインドウを表示した状態でないと使えない、残念。
常に有効状態にするには…

emeditor9b

こうするしかないかな、もう少し弄くってみます。
公開している(実際に私が利用している)Gedit プラグインと同様なマクロも書かねば。

追記

bg

スニペットのプロパティに
「バックグラウンドでも実行」
ってのがあった、チェックすれば常に有効になるみたい。

Shift-JIS で読み直しする gedit pligin

Windows から持ってきた Shift-JIS なテキストファイルを gEdit にドロップで開くと文字化け。
Cinema や minipoli のコードを「俺どう書いたっけ?」と自分で参考にする時が結構あるのよ。
もう慣れてしまったけど毎回毎回読み直しするのも面倒になってきた。

Gedit/PythonPluginHowTo – GNOME Live!

一旦破棄して gedit.Encoding 指定で読み込めばプラグインで作れそうだ。
create_tab_from_uri の引数で行ジャンプまで指定できるんだ、これは面白そう。

ということでさっき Shift-JIS で読み直しするプラグインをこさえて本サイト更新!
製作時間は一時間、あぁプラグインは楽でいい。

EUC-JP も考慮しようかと思ったけど私は現在 EUC-JP なファイルを持っていない…
それより意図的に私が作らないほうが「作ってみようかな?」という人が出てくるかも。
なんて思ったので Shift-JIS のみで公開することにした、手抜きじゃないですよ。

それと gEdit プラグインの応用 1 なんてページを増やした。
カーソル位置の GtkTextIter 取得方法くらいは解説しなきゃ誰も始められないかなと。
こんなのをチビチビ作っているが需要は微妙である。

次はサイドバーとかを使いたいんだが…アイデアが浮かばない。

GtkTextView って内部は UNICODE なのかな

ちょっと gEdit のプラグインを弄くっていたのでありますが。

13.3. Text Buffers

を見てカーソル位置の GtkTextIter を得て後は多分コレでイケるだろうと作っていた。
上手くいったからイイのだろう、で、面白いことを見つけた。

def on_hoge_activate(self, action):
    # バッファを得る
    view = self._window.get_active_view()
    buf = view.get_buffer()
    try:
        # カーソル位置の GtkTextIter 取得
        pos = buf.get_property("cursor-position")
        it = buf.get_iter_at_offset(pos)
        # 一つ前の文字を得る
        it1 = buf.get_iter_at_offset(pos-1)
        s = it1.get_char()
        if s == "\n":
            return
        # 必要な変数を初期化してループ
        count = pos
        itnext = None
        itend = buf.get_end_iter()
        s1 = ""
        while 1:
            # 次の GtkTextIter を得る
            count += 1
            itnext = buf.get_iter_at_offset(count)
            # EOF
            if itnext.equal(itend):
                break
            # 文字を得て比較
            s1 = itnext.get_char()
            #
            # 表示してみる
            print s1
            #
            if s1 == "\n" or s1 == "。":
                break
            elif s == s1:
                # ここまでの範囲を print
                itnext = buf.get_iter_at_offset(count)
                text = it.get_text(itnext)
                print text
                break
    except Exception, s:
        self.messagebox("%s" % s)

とまあ説明しやすく?書き換えたけどカーソル位置から特定範囲の文字列を得る。
具体的にはカーソルの直前文字と同じ文字を見つけたら抜き出すコードです。

これでイイの?
だって Ubuntu って UTF-8 だよ、アルファベットは 1 バイト、日本語は 2?3 バイト。
というか Windows で文字列を弄くる時に絶対に問題になるんですよ文字コードは。
いやまて、get_char() で char を取り出したって結局はポインタなんだし。
でも漢字とか混ぜると破壊されるわけで、内部はどうなるんだろう?

ということで上のように途中で char を抜いた部分にて print してみることにした。
アルファベットとひらがなカタカナ漢字記号を混ぜた文を作って実験。

atom

あれ、char 配列になっていないじゃん。
_ismbslead みたいなことをしているのか内部で UNICODE 化しているか知らないけど.。
これは楽だ、 gEdit プラグインでは UTF-8 であることを意識しないでいいようです。

どうでもいいけど char って character の略なので「キャラ」と読みますお。

アクティブ以外全部閉じる

gEdit のタブ右クリックメニューの name 属性名が知りたい。
いやぁ gEdit のソースコードを見たけど全然解らないや!

gedit

ココの GNOME ftp site って所から ftp で落とせる。
想像していたより小さくて驚いた、まぁ Gtk+ 自体が部品のようなアプリだが。
しかし C でよくぞここまで綺麗に、Windows では考えられない。

でも結局タブの name 属性は解らないまま。
日本語版じゃどうせ解らないから最初からメリケンの Google で探しまくる。
それでもやはり解らない、みんなこういうカスタマイズに興味はないのか?

てゆーか他人が書いたコードをそのまんま貼っている人って以外に多いんだなぁ。
一部日本人だけの特徴だとずっと思っていたよ。

ふと思いついてキーワードから gEdit を外して探してみた。

http://www.tortall.net/mu/wiki/EpiphanyExtensions/tab-menu-close.py?raw

なんか全然関係なさそうだけどコレってもしかして…

ui_str = """<ui>
    <popup name="NotebookPopup">
        <separator/>
        <menuitem name="but_active" action="but_active"/>
    </popup>
</ui>
"""

で gEdit のタブ右クリックメニューに追加できた!
コレさえ解れば簡単だ、ということで [アクティブ以外全部閉じる] 完成。
本サイトにて公開中、以上自己宣伝検索の技でした。

しかしプラグインはたったの百行以下でも成立するからイイね。
これなら結構頻繁に本サイトも更新できるようになりそうだ。

解説ページを作ってみた

gEdit プラグインの作り方解説ページを作ってみた。
トップページ(本サイト)からどうぞ。
しかししばらく Linux でいく宣言した途端に…

それより何故誰もこういうページを作ってくれないんだろう…
てなわけで。

Windows でよく使っていた秀丸マクロは gEdit でまかなえるようになった。
何より Python と PyGtk で書けるというのは嬉しい、勉強した甲斐があった。
秀丸のマクロはヘルプとにらめっこだったからね。

でも動作確認は一旦再起動しなきゃいけないのが面倒。
ここらを柔軟にしてくれると嬉しいけど無理だろうなぁと。
キーボードマクロの記録再生みたいなのは作れるかな?まだ解らない。

後は Shift+Enter で <br /> を打てれば完璧なんだが…

Ctrl+[ で <br />
Ctrl+] で <br /> & 改行

というスニペットを作ってみたけどやはり間違えるや。
まぁこれは慣れの話だ。
とにかく gEdit って結構おもしろい。