GtkSourceLanguageManager

テキストエディタの色分け表示については 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()

languagemanager

ファイル名か 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!