GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Tree_002dsitter-Major-Modes.html ・ emacs-doc.conao3.com

38.8 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を有効にするための条件が満たされていない場合、自動的に警告を出力します。

ツリーシッターのメジャーモードが「ネイティブ」な対応モードと設定を共有している場合、次のように共通の設定を含む「ベースモード」を作成できます。

(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)))
関数: treesit-ready-p language &optional quiet

この関数は、Tree-sitterを有効にするための条件を確認します。具体的には、EmacsがTree-sitter付きでビルドされているか、バッファのサイズがTree-sitterで処理可能な範囲に収まっているか、そしてlanguageの文法がシステム上で利用可能であるか(Tree-sitter Language Grammarを参照)を確認します。

この関数は、tree-sitter を有効化できない場合に警告を出力します。quiet が message の場合は警告がメッセージになり、quiet が t の場合は警告もメッセージも表示されません。

必要な条件がすべて満たされている場合、この関数は non-nil を返し、そうでない場合は nil を返します。

関数: treesit-major-mode-setup

この関数は、メジャーモード向けにTree-sitterの一部の機能を有効にします。

現在、以下の機能を設定しています。

  • treesit-font-lock-settings(パーサーベースのFont Lockを参照)がnilでない場合、フォント化の設定が行われます。
  • 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(アウトライン・マイナーモードを参照)がnilでない場合、アウトライン・マイナーモードが設定されます。
  • treesit-thing-settings で sexp および/または sentence が定義されている場合(ユーザー定義の「Things」とナビゲーション を参照)、forward-sexp-function や forward-sentence-function といった変数を定義することで、それぞれ sexps 単位および文単位で移動するナビゲーションコマンドが利用可能になります。

これらのTree-sitter組み込み機能の詳細については、パーサーベースのFont Lock、パーサーベースのインデント、およびバランス式をまたぐ移動を参照してください。

メジャーモードにおける複数言語の混在をサポートする方法については、複数言語のテキスト解析を参照してください。

beginning-of-defun や end-of-defun のほか、Emacs には defun を扱うための追加関数がいくつか用意されています。treesit-defun-at-point はポイントにある defun ノードを返し、treesit-defun-name は defun ノードの名前を返します。

関数: treesit-defun-at-point

この関数は、point にある defun ノードを返すか、見つからない場合は nil を返します。また、treesit-defun-tactic の値も考慮し、その値が top-level であれば最上位の defun を、nested であればその直下の defun を返します。

この関数が動作するには treesit-defun-type-regexp が必要です。nil の場合は、単に nil を返します。

関数: treesit-defun-name node

この関数は node の defun 名を返します。node の defun 名がない場合、node が defun ノードでない場合、または node が nil である場合は、nil を返します。

言語やメジャーモードによって、defun名は関数名、クラス名、構造体名などの名前になります。

treesit-defun-name-function が nil の場合、この関数は常に nil を返します。

変数: treesit-defun-name-function

nil 以外の場合、この変数の値は、ノードを引数として呼び出され、そのノードの defun 名を返す関数である必要があります。この関数は treesit-defun-name と同じセマンティクスを持つ必要があります。すなわち、ノードが defun ノードでない場合、あるいは defun ノードであっても名前を持たない場合、またはノードが nil である場合は、nil を返す必要があります。