試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ2/3)

GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ1/3)」の続き。

言語ファイルと色スキームファイルの探索ディレクトリに関するテスト

言語ファイルと色スキームファイルの配置/探索ディレクトリについては「GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ1/3)」で扱ったが、Pythonのシェルからこの動作を確認してみる。
下は環境変数XDG_DATA_HOMEと環境変数XDG_DATA_DIRSが未定義の場合のテスト例。

>>> import gtksourceview2
>>> lm = gtksourceview2.language_manager_get_default()
(言語ファイルの探索パスを表示)
>>> lm.props.search_path
['/home/[ユーザ名]/.local/share/gtksourceview-2.0/language-specs', '/home/[ユーザ名]/.gnome2/gtksourceview-1.0/language-specs', '/usr/local/share/gtksourceview-2.0/language-specs', '/usr/share/gtksourceview-2.0/language-specs', '/usr/share/gdm/gtksourceview-2.0/language-specs']
(利用可能な言語名の一覧を表示)
>>> lm.props.language_ids
['cpp', 'desktop', 'octave', 'java', 'yacc', 'php', 'eiffel', 'verilog', 'perl', 'def', 'gettext-translation', 'python', 'libtool', 'sql', 'chdr', 'vbnet', 'dpatch', 'dot', 'tcl', 'idl', 'ada', 'dtd', 'pkgconfig', 'latex', 'haddock', 'glsl', 'gap', 'cuda', 'haskell-literate', 'xslt', 't2t', 'pascal', 'fortran', 'ruby', 'makefile', 'awk', 'nsis', 'objective-caml', 'erlang', 'r', 'haskell', 'gtkrc', 'prolog', 'html', 'sh', 'xml', 'gtk-doc', 'msil', 'vhdl', 'nemerle', 'mallard', 'dosbatch', 'rpmspec', 'diff', 'm4', 'ocl', 'ini', 'lua', 'objc', 'changelog', 'texinfo', 'asp', 'scheme', 'vala', 'c', 'forth', 'css', 'c-sharp', 'cmake', 'js', 'd', 'boo', 'docbook']

>>> ssm = gtksourceview2.style_scheme_manager_get_default()
(色スキームファイルの探索パスを表示)
>>> ssm.props.search_path
['/home/[ユーザ名]/.local/share/gtksourceview-2.0/styles', '/usr/local/share/gtksourceview-2.0/styles', '/usr/share/gtksourceview-2.0/styles', '/usr/share/gdm/gtksourceview-2.0/styles']
(利用可能な色スキーム名の一覧を表示)
>>> ssm.props.scheme_ids
['tango', 'cobalt', 'oblivion', 'classic', 'kate']

下は環境変数XDG_DATA_HOMEが定義されている場合のテスト例(環境変数XDG_DATA_DIRSは未定義)。以下、言語と色スキームのそれぞれの一覧の表示は省略している。

>>> import gtksourceview2
>>> lm = gtksourceview2.language_manager_get_default()
(言語ファイルの探索パスを表示)
>>> lm.props.search_path
['[環境変数XDG_DATA_HOMEのディレクトリ]/gtksourceview-2.0/language-specs', '/home/[ユーザ名]/.gnome2/gtksourceview-1.0/language-specs', '/usr/local/share/gtksourceview-2.0/language-specs', '/usr/share/gtksourceview-2.0/language-specs', '/usr/share/gdm/gtksourceview-2.0/language-specs']
>>> ssm = gtksourceview2.style_scheme_manager_get_default()
(色スキームファイルの探索パスを表示)
>>> ssm.props.search_path
['[環境変数XDG_DATA_HOMEのディレクトリ]/gtksourceview-2.0/styles', '/usr/local/share/gtksourceview-2.0/styles', '/usr/share/gtksourceview-2.0/styles', '/usr/share/gdm/gtksourceview-2.0/styles']

下は環境変数XDG_DATA_DIRSが「/path/to/dir:/foo/bar」と定義されている場合のテスト例(XDG_DATA_HOMEは未定義)。

>>> import gtksourceview2
>>> lm = gtksourceview2.language_manager_get_default()
(言語ファイルの探索パスを表示)
>>> lm.props.search_path
['/home/[ユーザ名]/.local/share/gtksourceview-2.0/language-specs', '/home/[ユーザ名]/.gnome2/gtksourceview-1.0/language-specs', '/path/to/dir/gtksourceview-2.0/language-specs', '/foo/bar/gtksourceview-2.0/language-specs']
>>> ssm = gtksourceview2.style_scheme_manager_get_default()
(色スキームファイルの探索パスを表示)
>>> ssm.props.search_path
['/home/[ユーザ名]/.local/share/gtksourceview-2.0/styles', '/path/to/dir/gtksourceview-2.0/styles', '/foo/bar/gtksourceview-2.0/styles']

なお、言語マネージャとスタイルスキームマネージャのオブジェクトのGObjectプロパティsearch-pathに新しいリストを書き込む(代入する)ことにより、探索パスをプログラム内で独自に指定することもできる。

lm.props.search_path = ['/path/to/dir1', '/path/to/dir2']
ssm.props.search_path = ['/path/to/dir3', '/path/to/dir4']

実際の処理の流れ

言語マネージャとスタイルスキームマネージャの取得

まずは言語マネージャとスタイルスキームマネージャのオブジェクトを「GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ1/3)」で扱った関数によって取得しておく。

class MainWindow(gtk.Window):
  def __init__(self, *args, **kwargs):
    gtk.Window.__init__(self, *args, **kwargs)
    ...
    self.__lm = gtksourceview2.language_manager_get_default()
    self.__ssm = gtksourceview2.style_scheme_manager_get_default()
言語の決定とバッファオブジェクトの作成

バッファオブジェクトに関連付ける言語の決定は

  • 言語マネージャオブジェクトのguess_language()による自動判別(判別に成功すると戻り値に言語オブジェクトが得られる/失敗するとNoneが返る)
  • 言語マネージャオブジェクトのget_language()による手動指定

のいずれかによって言語オブジェクト(gtksourceview2.Languageクラス)を取得する形で行う。
これをgtksourceview2.Bufferクラスのコンストラクタ引数languageに指定してバッファオブジェクトを作成する。言語の指定は後からGObjectプロパティlanguageへの代入で行うこともできる。
下は自動判別の例。

    guessed_lang = self.__lm.guess_language(filename='[ファイルの場所]')
    if guessed_lang:
      self.__sourcebuf = gtksourceview2.Buffer(language=guessed_lang)

下はget_language()で言語名を指定して手動で設定する例。

    self.__sourcebuf = gtksourceview2.Buffer()
    lang = self.__lm.get_language('python')
    self.__sourcebuf.props.language = lang

これは

    self.__sourcebuf = gtksourceview2.Buffer(language=self.__lm.get_language('python'))

と等価。
処理の流れに関するメモの続きとサンプルコードの全体はページ3で扱う。

(「GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ3/3)」に続く)

関連記事:

使用したバージョン:

  • Python 2.6.4
  • PyGTK 2.16.0
  • PyGtkSourceView 2.8.0