Next: , Previous: , Up: プログラムソースの解析   [Contents][Index]


37.7 tree-sitterを用いるメジャーモードの開発

このセクションではメジャーモード用にtree-sitterを統合した開発における一般的なガイドラインの一部について説明します。

tree-sitter機能をサポートするメジャーモードは、大枠では以下のようなパターンにしたがう必要があります:

(define-derived-mode woomy-mode prog-mode "Woomy"
  "A mode for Woomy programming language."
  (when (treesit-ready-p 'woomy)
    (setq-local treesit-variables ...)
    ...
    (treesit-major-mode-setup)))

treesit-ready-pはtree-sitterを有効にする条件が揃っていなければ、自動的に警告を発します。

tree-sitterを使うメジャーモードは、その“ネイティブ”な相手先モードとセットアップを共有する場合には、以下のように共通のセットアップを含んだ“ベースモード”を作成することができます:

(define-derived-mode woomy--base-mode prog-mode "Woomy"
  "An internal mode for Woomy programming language."
  (common-setup)
  ...)

(define-derived-mode woomy-mode woomy--base-mode "Woomy"
  "A mode for Woomy programming language."
  (native-setup)
  ...)

(define-derived-mode woomy-ts-mode woomy--base-mode "Woomy"
  "A mode for Woomy programming language."
  (when (treesit-ready-p 'woomy)
    (setq-local treesit-variables ...)
    ...
    (treesit-major-mode-setup)))
Function: treesit-ready-p language &optional quiet

この関数はtree-sitterをアクティブにするための条件をチェックする。tree-sitterとともにEmacsがビルドされているか、tree-sitterが処理するにあたってカレントバッファーのサイズが大き過ぎないか、そのシステムでlanguageにたいするグラマー(Tree-sitter Language Grammarを参照)が利用できるかどうかをチェックする。

この関数はtree-sitterをアクティブにできなければ警告を発する。quietmessageなら、警告をメッセージに変更する。quiettの場合には警告やメッセージは何も表示されない。

この関数は必要とされる条件すべてが適えば非nil、そうでなければnilをリターンする。

Function: treesit-major-mode-setup

この関数はメジャーモードにたいしてtree-sitterに一部機能をアクティブにする。

現在のところ以下の機能のセットアップを行う:

  • treesit-font-lock-settings (パーサーベースのFont Lockを参照)が非nilならフォント表示(fontification)をセットアップ。
  • treesit-simple-indent-rules (パーサーベースのインデントを参照)が非nilならインデントをセットアップ。
  • treesit-defun-type-regexpが非nilなら、beginning-of-defunend-of-defunにたいしてナビゲーション関数をセットアップ。
  • treesit-defun-name-functionが非nilなら、add-log-current-defunによって使用されるadd-log関数をセットアップ。
  • treesit-simple-imenu-settingsが非nilならImenuをセットアップ。

これらtree-sitter組み込み機能の詳細についてはパーサーベースのFont Lockパーサーベースのインデント釣り合いのとれたカッコを越えた移動を参照してください。

メジャーモードにおける複数言語のミックスのサポートについては複数言語ののパースを参照してください。

beginning-of-defunend-of-defunの他にも、Emacsはdefunにたいして処理を行う追加の関数をいくつか提供します。treesit-defun-at-pointはポイント位置のdefunノード、treesit-defun-nameはdefunノードの名前をリターンする関数です。

Function: treesit-defun-at-point

この関数はポイント位置のdefunノードを、defunが見つからなければnilをリターンする。この関数はtreesit-defun-tacticに注意を払う。この変数の値がtop-levelならトップレベルのdefunを、値がnestedならすぐ外側のdefunをリターンする。

この関数が機能するためにはtreesit-defun-type-regexpが必要となる。この変数の値がnilであれば、この関数は単にnilをリターンする。

Function: treesit-defun-name node

この関数はnodeのdefun名をリターンする。nodeにたいするdefun名が存在しない、nodeがdefunノードではない、あるいはnodenilの場合はnilをリターンする。

言語とメジャーモードに応じて関数、クラス、構造体等の名前がdefun名となる。

treesit-defun-name-functionnilの場合には、この関数は常にnilをリターンする。

Variable: treesit-defun-name-function

この変数の値が非nilの場合には、ノードを引数として呼び出されてそのノードの名前をリターンする関数であること。この関数は意味合いとしてはtreesit-defun-nameと同じである必要がある。つまりそのノードがdefunノードではない、defunノードだが名前がない、あるいはノードがnilの場合にはnilをリターンすること。