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

31.2.6 バランス式をまたぐ移動

以下に、バランスの取れた括弧式(Emacs 内での移動に関連して sexps とも呼ばれます)を扱ういくつかの関数を挙げます。構文テーブルは、これらの関数が各種文字をどのように解釈するかを制御します。詳細は 構文テーブル を参照してください。sexps またはその一部をスキャンするための低レベルなプリミティブについては、式の解析 を参照してください。ユーザーレベルのコマンドについては、The GNU Emacs Manual の 括弧を用いた編集コマンド を参照してください。

コマンド: forward-list &optional arg

この関数は、arg(デフォルトは1)のバランスが取れた括弧グループを順に辿ります。(単語やペアになった文字列クォートなどの他の構文要素は無視されます。)

コマンド: backward-list &optional arg

この関数は、arg(デフォルトは1)のバランスが取れた括弧グループを後方に移動します。(単語やペアになった文字列クォートなどの他の構文要素は無視されます。)

コマンド: up-list &optional arg escape-strings no-syntax-crossing

この関数は、arg(デフォルトは1)レベル分、括弧の外側へ移動します。引数に負の値を指定すると、後方へ移動しますが、それでもより浅い位置へ移動します。escape-strings が nil 以外(インタラクティブモード時)の場合は、囲んでいる文字列からも抜け出します。no-syntax-crossing が nil 以外(インタラクティブモード時)の場合は、複数の文字列にまたがるリストの先頭へ移動するよりも、囲んでいる文字列から抜けることを優先します。エラーが発生した場合、ポイントの位置は未指定となります。

コマンド: backward-up-list &optional arg escape-strings no-syntax-crossing

この関数は up-list と同様ですが、引数が否定されています。

コマンド: down-list &optional arg

この関数は、arg(デフォルトは1)レベル分、括弧の内側へと進みます。引数に負の値を指定すると、後方に移動しつつも、さらに深い階層へと進みます(−argレベル)。

コマンド: forward-sexp &optional arg

この関数は、arg(デフォルトは1)のバランス式を順に処理します。バランス式には、括弧で囲まれたもののほか、単語や文字列定数などの種類も含まれます。パース式を参照してください。例えば、

---------- Buffer: foo ----------
(concat∗ "foo " (car x) y z)
---------- Buffer: foo ----------

(forward-sexp 3)
     ⇒ nil

---------- Buffer: foo ----------
(concat "foo " (car x) y∗ z)
---------- Buffer: foo ----------

forward-sexp は、変数 forward-sexp-function の値が nil 以外である場合に、実際の処理を行うためにその関数を呼び出し、コマンドの呼び出し時と同じ引数を渡します。メジャーモードは、そのモードに応じてバランス式を移動させるための独自の関数を定義し、この変数にその関数を設定することができます。

コマンド: backward-sexp &optional arg

この関数は、arg(デフォルトは1)のバランス式を逆方向に辿ります。

コマンド: beginning-of-defun &optional arg

この関数は、defun の arg 番目の先頭に戻ります。arg が負の場合、実際には前方に移動しますが、それでも defun の末尾ではなく先頭に移動します。arg のデフォルト値は 1 です。

コマンド: end-of-defun &optional arg

この関数は、defun の arg 番目の末尾まで進みます。arg が負の場合、実際には逆方向に移動しますが、それでも defun の先頭ではなく末尾まで移動します。arg のデフォルト値は 1 です。

ユーザーオプション: defun-prompt-regexp

nil 以外の場合、このバッファローカル変数には、defun を開始する開き括弧の前にどのようなテキストが出現し得るかを指定する正規表現が格納されています。つまり、defun は、この正規表現にマッチする行で始まり、その後に開き括弧の構文を持つ文字が続く行から開始されます。

ユーザーオプション: open-paren-in-column-0-is-defun-start

この変数の値が nil 以外の場合、0列目の開き括弧は defun の開始とみなされます。値が nil の場合、0列目の開き括弧に特別な意味はありません。デフォルトは t です。文字列リテラルの0列目に括弧が含まれている場合は、誤検知を避けるため、バックスラッシュでエスケープしてください。

変数: beginning-of-defun-function

nil 以外の場合、この変数には defun の開始位置を特定するための関数が格納されています。関数 beginning-of-defun は、通常のメソッドを使用する代わりにこの関数を呼び出し、オプション引数を渡します。引数が nil 以外の場合、関数は beginning-of-defun と同様に、その分だけ関数を遡る必要があります。

変数: end-of-defun-function

nil 以外の場合、この変数には defun の終端を特定するための関数が格納されています。関数 end-of-defun は、通常の手法を用いる代わりにこの関数を呼び出します。

Emacsをtree-sitter付きでコンパイルすると、tree-sitterのパーサー情報を利用して構文構造間を移動できるようになります。具体的に何がdefunと見なされるかは言語によって異なるため、メジャーモード側でtreesit-defun-type-regexpを設定してそれを判定する必要があります。そうすれば、treesit-beginning-of-defunとtreesit-end-of-defunを用いることで、defun単位のナビゲーション機能を無償で利用できるようになります。

変数: treesit-defun-type-regexp

この変数は、Emacsがどのノードをdefunとみなすかを決定します。defunノードの型に一致する正規表現を指定できます。(「node」および「node type」については、プログラムソースの解析を参照してください。)

例えば、python-mode はこの変数を、‘function_definition’ または ‘class_definition’ のいずれかにマッチする正規表現に設定します。

正規表現にマッチしたすべてのノードが有効な defun であるとは限りません。そのため、この変数は (regexp . pred) という形式の cons セルである場合もあり、ここで pred はノードを引数として受け取り、そのノードが有効な defun であれば non-nil を、そうでなければ nil を返す関数である必要があります。

変数: treesit-defun-tactic

この変数は、Emacsがネストされたdefunをどのように扱うかを決定します。値が top-level の場合、ナビゲーション関数はトップレベルのdefun間のみを移動します。値が nested の場合、ナビゲーション関数はネストされたdefunを認識します。

変数 forward-sentence-function の値となる関数は、文と呼ばれる構文構造間をどのように移動するかを決定します。メジャーモードは、この変数に独自の関数を割り当てることで、forward-sentence コマンドの動作をカスタマイズできます。Emacs が tree-sitter 付きでコンパイルされている場合、tree-sitter のパーサー情報を利用して構文構造間を移動できます。何をもって文とするかは言語によって異なるため、メジャーモード側で treesit-thing-settings を設定してそれを決定すべきです。すると forward-sentence-function が treesit-forward-sentence に設定され、forward-sentence と backward-sentence を利用することで、モードは文単位のナビゲーション機能を自動的に得ることになります(The extensible self-documenting text editor の Moving by Sentences を参照)。

Emacsをtree-sitter付きでコンパイルすると、tree-sitterのパーサー情報を利用して構文構造間を移動できるようになります。具体的に何がsexpと見なされるかは言語によって異なるため、メジャーモード側でtreesit-thing-settingsを設定してそれを判定する必要があります。するとforward-sexp-functionがtreesit-forward-sexpに設定され、モード側はforward-sexpやbackward-sexpを利用することで、無料でnavigation-by-sexp機能を利用できます(The extensible self-documenting text editorのExpressionsを参照)。