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










