このセクションではメジャーモード用に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)))
この関数はtree-sitterをアクティブにするための条件をチェックする。tree-sitterとともにEmacsがビルドされているか、tree-sitterが処理するにあたってカレントバッファーのサイズが大き過ぎないか、そのシステムでlanguageにたいするグラマー(Tree-sitter言語グラマーを参照)が利用できるかどうかをチェックする。
この関数はtree-sitterをアクティブにできなければ警告を発する。quietがmessage
なら、警告をメッセージに変更する。quietがt
の場合には警告やメッセージは何も表示されない。
この関数は必要とされる条件すべてが適えば非nil
、そうでなければnil
をリターンする。
この関数はメジャーモードにたいしてtree-sitterに一部機能をアクティブにする。
現在のところ以下の機能のセットアップを行う:
treesit-font-lock-settings
(パーサーベースのFont Lockを参照)が非nil
ならフォント表示(fontification)をセットアップ。
treesit-simple-indent-rules
あるいはtreesit-indent-function
(パーサーベースのインデントを参照)が非nil
ならインデントをセットアップ。
treesit-defun-type-regexp
が非nil
なら、beginning-of-defun
とend-of-defun
にたいしてナビゲーション関数をセットアップ。
treesit-defun-name-function
が非nil
なら、add-log-current-defun
によって使用されるadd-log関数をセットアップ。
treesit-simple-imenu-settings
(Imenuを参照)が非nil
ならImenuをセットアップ。
treesit-outline-predicate
(Outlineマイナーモードを参照)が非nil
なら、Outlineマイナーモードをセットアップ。
sexp
および/またはsentence
がtreesit-thing-settings
(ユーザー定義の“Things”とナビゲーションを参照)で定義されていれば、forward-sexp-function
やforward-sentence-function
のような変数を定義することによってsexpやsentence単位で移動するナビゲーションコマンドが有効になる。
これらtree-sitter組み込み機能の詳細についてはパーサーベースのFont Lock、パーサーベースのインデント、バランスのとれたカッコを越えた移動を参照してください。
メジャーモードにおける複数言語のミックスのサポートについては複数言語のパースを参照してください。
beginning-of-defun
やend-of-defun
の他にも、Emacsはdefunにたいして処理を行う追加の関数をいくつか提供します。treesit-defun-at-point
はポイント位置のdefunノード、treesit-defun-name
はdefunノードの名前をリターンする関数です。
この関数はポイント位置のdefunノードを、defunが見つからなければnil
をリターンする。この関数はtreesit-defun-tactic
に注意を払う。この変数の値がtop-level
ならトップレベルのdefunを、値がnested
ならすぐ外側のdefunをリターンする。
この関数が機能するためにはtreesit-defun-type-regexp
が必要となる。この変数の値がnil
であれば、この関数は単にnil
をリターンする。
この関数はnodeのdefun名をリターンする。nodeにたいするdefun名が存在しない、nodeがdefunノードではない、あるいはnodeがnil
の場合はnil
をリターンする。
言語とメジャーモードに応じて関数、クラス、構造体等の名前がdefun名となる。
treesit-defun-name-function
がnil
の場合には、この関数は常にnil
をリターンする。
この変数の値が非nil
の場合には、ノードを引数として呼び出されてそのノードの名前をリターンする関数であること。この関数は意味合いとしてはtreesit-defun-name
と同じである必要がある。つまりそのノードがdefunノードではない、defunノードだが名前がない、あるいはノードがnil
の場合にはnil
をリターンすること。