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


38.6 ユーザー定義の“Things”とナビゲーション

バッファーにおいて関数やクラスの定義、ステートメント、コードブロック、文字列、コメント等といった特定のthings(物、オブジェクト)を識別して探せれば便利なときが多々あります。Emacsではどんな種類のtree-sitterノードが“thing”に相当するかをユーザーが定義できます。これにより次の関数へのジャンプ、ポイント位置にあるコードブロックのマーク、2つの関数の引数の入れ替えといった便利な機能が有効になります。

Emacsの“things”機能はtree-sitterのパターンマッチング機能とは独立した機能であり、パワーは比較的劣るもののパースツリーのナビゲーションと横断にはより適しています。

thingsはtreesit-thing-settingsで定義することができます。

Variable: treesit-thing-settings

これは言語それぞれにたいするthing定義のalistである。各エントリーのキーは言語シンボル、値は(thing pred)という形式のthing定義のリスト。ここでthingdefunsexpsentenceのようにthingを表すシンボル、predはこのthingがtree-sitterの何の種類のノードかを指定する。

predはノードのタイプにマッチするregexp文字列、ノードを引数としてそのノードがthingとして適格かを示すブーリアン値をリターンする関数、あるいは(regexp . fn)というコンスでもよい。これは正規表現regexpと関数fnからなるコンスであり、ノードはregexpとthingとしての適格性を調べるfnの両方を満足する必要がある。

predは再帰的に定義することもできる。(or pred…)と記述すると、predのいずれかが満たされればノードがthingとして適格であることを意味する。(not pred)と記述すれば、predが満たされないことでノードが適格であることを意味する。

最後にpredはこのリスト内で定義された他のpredを参照できる。たとえば(or sexp sentence)はこのあist内の他のルールとして定義されたsexpsentenceいずれかのthingであることを定義している。

以下はC/C++にたいするtreesit-thing-settingsの例:

((c
  (defun "function_definition")
  (sexp (not "[](),[{}]"))
  (comment "comment")
  (string "raw_string_literal")
  (text (or comment string)))
 (cpp
  (defun ("function_definition" . cpp-ts-mode-defun-valid-p))
  (defclass "class_specifier")
  (comment "comment")))

これは教示目的のために修正された例であって、C/C++のモードが実際にthingを定義する方法とは異なることに注意。

このセクションの残りの部分では、thing定義の恩恵を受ける関数をいくつか紹介します。以下の関数の他にもthing機能を利用する、たとえばtreesit-search-forwardtreesit-induce-sparse-tree等のツリー横断関数のような他の関数も別の場所で紹介されています。ノードの取得を参照してください。

Function: treesit-thing-prev position thing

この関数はpositionの前にある指定されたthingであるような最初のノードをリターンする。そのようなノードがなければnilをリターンする。ノードがリターンされた場合には、ノード終端位置はposition以前であることが保証されている。言い換えると、この関数がpositionを取り囲むようなノードをリターンすることはあり得ない

thingdefunのようなthingシンボル、あるいは"function_definition"のように単なるthing定義でもよい。

Function: treesit-thing-next position thing

この関数はtreesit-thing-prevと似ているがpositionとりにあるthingであるような最初のノードだけをリターンする点が異なる。ノードがリターンされた場合には、ノード先頭位置はposition以降であることが保証されている。

Function: treesit-navigate-thing position arg side thing &optional tactic

この関数はtreesit-thing-prevtreesit-thing-next上に構築されており、ナビゲーションコマンドにおいて役に立つと思われる機能を提供する。この関数はpositionからarg個のthingインスタンスを横断して移動した後の位置をリターンする。横断するだけの十分なthingが存在しなければnilをリターンする。この関数はポイントを移動しない。

正のargthingのその個数のインスタンス分前方への移動、負のargは後方への移動を意味する。この関数はsidebegならthingの先頭で停止、endならthingの終端で停止する。

treesit-thing-prevの場合のようにthingtreesit-thing-settingsで定義されたthingシンボル、あるいはthing定義を指定できる。

tacticはこの関数がthing間を移動する方法を決定する。nestedtop-levelrestrictednilのいずれか。nestednilは通常のネストされたナビゲーションを意味する。まず兄弟を横断しての移動を試み、カレントレベルに兄弟がなければ親に移動してその兄弟を横断、のように移動する。top-levelはネストされたthingを無視してトップレベルのthingだけを横断した移動、restrictedpositionを囲い込むようなthingがあればその中に制限された移動を意味する。このtactic(戦術)はカレントネストレベルに留まって上位に移動したくないようなコマンドにたいして有用。

Function: treesit-thing-at position thing &optional strict

この関数はpositionを囲い込むthingであるような最小のノードをリターンする。そのようなノードがなければnilをリターンする。

リターンされるノードはpositionを囲い込んでいなければならない。すなわちノード開始位置がposition以前、ノード終端位置がposition以降であること。

strictが非nilなら、この関数は厳格な比較を使用する。すなわち開始位置はpositionより厳密に前、終端位置はpositionより厳密に後でなければならない。

thingtreesit-thing-settingsで定義されたthingシンボル、またはthing定義のいずれか。

便利なラッパー関数もあります。treesit-beginning-of-thingはthing先頭にポイントを移動、treesit-end-of-thingはthing終端にポイントを移動、treesit-thing-at-pointはポイント位置にあるthingをリターンします。

treesit-beginning-of-defuntreesit-end-of-defuntreesit-defun-at-pointのように、(treesit-defun-type-regexpのフォールバックとしての)defun定義使用に特化したdefunコマンドもあります。さらにこれらの関数は移動の戦術としてtreesit-defun-tacticを使用します。これらの詳細については別のセクションで説明します(Tree-sitterとのメジャーモード開発を参照)。

This page has generated for branch:emacs-30, commit:ab5505a8acf795c0a0a2745dd6fb666954c6a4bb to check Japanese translation.