テキストエディタの色分け表示については Gedit は超強力です。
実はコレ Gedit ではなく GtkSourceView 自体の機能だったりする。
下記ディレクトリに定義 XML ファイルがある時点で解るだろうけど。
/usr/share/gtksourceview-3.0/language-specs
プログラミングは基本や計算ばかりじゃ面白くないよね。
やはり GUI のほうが楽しいですよね。
今回は GtkSourceView でこの色分け機能を使う方法でも。
GtkLanguageManager を使います、驚くほど簡単です。
読み込むファイルを用意するのが面倒なので自分の Python コードを。
#!/usr/bin/env python3 import sys from gi.repository import Gtk, GLib, Gio, GtkSource, Pango # My src FILENAME = __file__ class ColorLang(Gtk.Window): """ GtkSourceLanguageManager Sample """ def __init__(self): Gtk.Window.__init__(self) # # GtkSourceView self.view = GtkSource.View() self.view.set_show_line_numbers(True) # Set Monospace Font font_desc = Pango.font_description_from_string("Monospace 10") self.view.override_font(font_desc) # # LanguageManager manager = GtkSource.LanguageManager.new() lang = manager.guess_language(FILENAME) """ or ContentType contype, result = Gio.content_type_guess(FILENAME) lang = manager.guess_language(None, contype) """ buf = self.view.get_buffer() buf.set_language(lang) # Read with open(FILENAME) as f: s = f.read() buf.set_text(s) sw = Gtk.ScrolledWindow() sw.add(self.view) # append the filename and ContentType hbar = Gtk.HeaderBar() hbar.set_title(GLib.path_get_basename(FILENAME)) hbar.set_subtitle(Gio.content_type_guess(FILENAME)[0]) hbar.set_show_close_button(True) self.set_titlebar(hbar) self.add(sw) self.resize(400, 400) self.connect("delete-event", Gtk.main_quit) self.show_all() ColorLang() Gtk.main()
ファイル名か ContentType を指定すると推測して定義ファイルから探し当てる。
ソレを set_language で突っ込む、マジでこれだけ。
でも g_content_type_guess だと ContentType は拡張子依存みたい。
本気で拡張子否依存にするなら自力で取得する必要有り、のようです。
で、まあ当然のように Gedit とまったく同じ色分けになりました。
これじゃつまんない、自分で定義したいという人は定義 XML を作って
gtk_source_language_manager_set_search_path でセットする。
GtkSourceView 3 Reference Manual: GtkSourceLanguageManager
しかし language という名ではつい gettext 関連と思ってしまいます。
いや、筆者が今までそう思い違いしていたというオチだyo!