あけましておめでとうございます。
ということで GtkSourceView でアプリを作っているのだが。
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 側なのよね。
現在インデントが全部半角スペースになる現象に悩まされている…
明日には出したいな、休みは明日までだし。