あけましておめでとうございます。
ということで GtkSourceView でアプリを作っているのだが。
GtkSourceDrawSpacesFlags というのがある。
gtk_source_view_set_draw_spaces で指定するのね。
以前書いたコードに追記して試しに使ってみる。
#!/usr/bin/env python #-*- coding:utf-8 -*- from gi.repository import Gtk, Gio, GtkSource, Pango 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", "O", "open", self.on_open), ("save", Gtk.STOCK_SAVE, "_Save", " S", "save", self.on_save), ("save_as", Gtk.STOCK_SAVE_AS, "Save as...", " S", "save as", self.on_save_as), ("quit", Gtk.STOCK_QUIT, "Quit", " 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() # GtkSourceView self.view = GtkSource.View() desc = Pango.font_description_from_string("Monospace 11") self.view.override_font(desc) self.view.set_show_line_numbers(True) self.view.set_wrap_mode(Gtk.WrapMode.CHAR) self.view.set_draw_spaces(GtkSource.DrawSpacesFlags.ALL) # 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)
これは、まるで秀丸ではないか。
なんだよ、GtkSourceView には改行やタブ文字表示機能があるんだ。
dconf-editor で Gedit の設定を漁ったけど無かった…
GTK_SOURCE_DRAW_SPACES_NBSP とかは試してもよく解らないのだけど。
日本語圏内では解らないことなのだろうか、うーん。
ついでに、上記コードのようにフォント指定を作っている。
いや、デフォルトに戻したくなる場合もあるわけで。
# Get Default Font settings = Gtk.Settings.get_default() defaultfont = settings.props.gtk_font_name desc = Pango.font_description_from_string(defaultfont)
これでデフォルトの PangoFontDescription が得られるわけだ。
どうでもいいけど Fedora の Monospace では半角全角で幅が違う。
VL ゴシックにすればいいわけだがコレは人によるからな。
ぶっちゃけ設定は Gedit の劣化パクリである。
括弧の強調表示方法がイマイチ解らない、GtkSourceBuffer 側なのよね。
現在インデントが全部半角スペースになる現象に悩まされている…
明日には出したいな、休みは明日までだし。