Fedora 16 の update 通知があったので適用。
100 個もあるのか、まぁ chrome や flash も含まれていることだし。
PyGI が上書きされちゃったみたいだけど GBoxed 関連は修正されていた。
修正してくれたようで、放置されると疑ってごめんなさい。
ところで Fedora は ~/.bash_profile, ~/.bashrc どちらにもエイリアス指定が無い。
けど ll が通る、’ls -alF’ ではなく ‘ls -l’ のエイリアスのようだが。
Ubuntu から乗り換えて半年以上たつのに今頃違いに気がついた私って…
Ubuntu は ~/.bashrc で指定だけど Fedora はチト違うんだね。
てか Fedora は which コマンドのみで alias も探せるようにしているのか。
alias コマンドで充分だと思うけど。
【88】シェル(bash)を自分用にカスタマイズ【alias の覚書】 – 分室の分室
ついでに見つけたページ、lls は早速真似させていただくことにする。
Content Type でソートできれば拡張子もいらないけどさすがに無理か。
**********
ところで上画像のように Update に GtkSourceView があった。
何って Gedit や Anjuta の GTK+ 製エディタ部品そのものです。
テキストの DnD 編集で Gedit が落ちるのは、直っていなかった…
思いついた、コレを使って Gjot2 の代わりでも試しに作ってみようかなと。
Gedit のハイライト設定をパクれば表示は Gedit と同じになって便利かも。
API ドキュメントは以下にある。
GtkSourceView 3 Reference Manual
PyGI からは GtkSource の import で使える。
とりあえず基本読み書きと行番号表示のみの最小限コード。
#!/usr/bin/env python #-*- coding:utf-8 -*- from gi.repository import Gtk, Gio, Gdk, GtkSource class TextEditor(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) # GtkUIManager and GtkAccelGroup self.uimanager = Gtk.UIManager() accelgroup = self.uimanager.get_accel_group() self.add_accel_group(accelgroup) # GtkActionGroup self.actiongroup = Gtk.ActionGroup("editor_menu") # GtkActionEntry ae = [ ("open", Gtk.STOCK_OPEN, "_Open", "<Control>O", "open", self.on_open), ("save", Gtk.STOCK_SAVE, "_Save", "<Control>S", "save", self.on_save), ("save_as", Gtk.STOCK_SAVE_AS, "Save as...", "<Shift><Control>S", "save as", self.on_save_as), ("quit", Gtk.STOCK_QUIT, "Quit", "<Control>Q", "quit", self.on_quit), ("file", None, "_File") ] self.actiongroup.add_actions(ae) self.uimanager.insert_action_group(self.actiongroup, 0) self.uimanager.add_ui_from_string(menu_xml) # MenuBar menubar = self.uimanager.get_widget('/MenuBar') # Toolbar and Style toolbar = self.uimanager.get_widget('/ToolBar') toolbar.set_style(Gtk.ToolbarStyle.ICONS) style = toolbar.get_style_context() Gtk.StyleContext.add_class(style, Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) # StatusBar statusbar = Gtk.Statusbar() # # # Create GtkSourceView self.view = GtkSource.View() # Show Line Number self.view.set_show_line_numbers(True) # # # Add sw = Gtk.ScrolledWindow() sw.add(self.view) vbox = Gtk.VBox() vbox.pack_start(menubar, False, True, 0) vbox.pack_start(toolbar, False, True, 0) vbox.pack_start(sw, True, True, 0) vbox.pack_start(statusbar, False, True, 0) self.add(vbox) # self self.open_filename = "" self.resize(300, 300) self.set_title("Text Editor") self.show_all() self.set_focus(self.view) def on_open(self, widget, data=None): dlg = Gtk.FileChooserDialog( "Open File", self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT)) r = dlg.run() if r == Gtk.ResponseType.ACCEPT: self.open_filename = dlg.get_filename() f = open(self.open_filename, "r") t = f.read() f.close() buf = self.view.get_buffer() buf.set_text(t) dlg.destroy() def on_save(self, widget, data=None): if self.open_filename == "": self.on_save_as(widget) else: buf = self.view.get_buffer() t = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False) f = open(self.open_filename, "w") f.write(t) f.close() def on_save_as(self, widget, data=None): dlg = Gtk.FileChooserDialog( "Save File", self, Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT)) r = dlg.run() if r == Gtk.ResponseType.ACCEPT: buf = self.view.get_buffer() t = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False) self.open_filename = dlg.get_filename() f = open(self.open_filename, "w") f.write(t) f.close() dlg.destroy() def on_quit(self, widget, data=None): self.emit("destroy") menu_xml = """<ui> <menubar name="MenuBar"> <menu action="file"> <menuitem action="open"/> <menuitem action="save"/> <menuitem action="save_as"/> <separator/> <menuitem action="quit"/> </menu> </menubar> <toolbar name="ToolBar"> <toolitem action="open"/> <toolitem action="save"/> </toolbar> </ui>""" class App(Gtk.Application): def __init__(self): Gtk.Application.__init__( self, application_id="apps.test.editor", flags=Gio.ApplicationFlags.FLAGS_NONE) self.connect("activate", self.on_activate) def on_activate(self, data=None): w = TextEditor() w.set_application(self) if __name__ == "__main__": app = App() app.run(None)
FileChooserDialog の save で WARNNING が出て困っていたけど…
Gedit でも出るヤン、FileChooserDialog 自体のバグだろう。
読み書きに関しては Gio を使うべきなんだろうけど今はワカンネ!
これで問題なく読み書きできるから充分かと。
ついでに今頃解ったけど destroy を emit すれば閉じることができる。
GtkApplication が管理するので delete-event は使えない。
しかし GtkSourceView のみなら DnD 編集しても落っこちないのね。
Gedit 側のバグだったみたい、とにかく気長に修正待ちするけど。
ということで Gedit と同じ行番号表示ができるエディタでっきあっがりぃ。
コレを上手く使って Gjot2 の代わりっぽいを作りたいな。
平書きな Python コードも既に 1000 個を越えているしもっとまとめたい。
っっってその大半が PyGtk のコード、PyGI に書き直しメンドクセ!
まあその財産があるからこんなコードが数時間で書けるのであるが。