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

33.17.2 メジャーモードによるインデント制御

各メジャーモードの重要な機能は、編集中の言語に合わせてTABキーを適切にインデントするようカスタマイズすることです。本セクションでは、TABキーの仕組みとその制御方法について説明します。本セクションの関数は、予測不能な値を返します。

コマンド: indent-for-tab-command &optional rigid

これは、ほとんどの編集モードで TAB に割り当てられているコマンドです。通常は現在の行をインデントしますが、代わりにタブ文字を挿入したり、領域をインデントしたりすることも可能です。

仕組みは以下の通りです:

  • まず、Transient Mark モードが有効で、リージョンがアクティブであるかを確認します。該当する場合は、indent-region を呼び出してリージョン内のすべてのテキストをインデントします(リージョン全体のインデントを参照)。
  • それ以外の場合、indent-line-function 内のインデント関数が indent-to-left-margin(タブ文字を挿入する単純なコマンド)であるか、あるいは変数 tab-always-indent でタブ文字を挿入することが指定されている場合(後述)、タブ文字が挿入されます。
  • それ以外の場合は、現在の行をインデントします。これは indent-line-function 内の関数を呼び出すことで行われます。行がすでにインデントされており、かつ tab-always-indent の値が complete(後述)である場合は、ポイントにあるテキストの補完を試みます。

rigid が nil 以外(接頭辞引数を用いて対話的に指定した場合)であれば、このコマンドが行をインデントしたりタブを挿入したりした後、新しいインデントを反映させるため、現在の行の先頭から始まるバランス式全体に対しても厳格にインデントを適用します。この引数は、コマンドがリージョンをインデントする場合には無視されます。

変数: indent-line-function

この変数の値は、indent-for-tab-command やその他の各種インデントコマンドが現在の行をインデントする際に使用する関数です。通常、メジャーモードによって設定されます。例えば、Lispモードでは lisp-indent-line、Cモードでは c-indent-line というように設定されます。デフォルト値は indent-relative です。コードの自動インデント を参照してください。

コマンド: indent-according-to-mode

このコマンドは、indent-line-function 内の関数を呼び出し、現在のメジャーモードに適した形で現在の行をインデントします。

コマンド: newline-and-indent

この関数は改行を挿入し、その後、メジャーモードに従ってその新しい行(挿入されたばかりの改行の次の行)をインデントします。インデントは indent-according-to-mode を呼び出すことで行われます。

コマンド: reindent-then-newline-and-indent

このコマンドは、現在の行を再インデントし、ポイントに改行を挿入した上で、その新しい行(挿入されたばかりの改行の次の行)をインデントします。indent-according-to-modeを呼び出すことで、両方の行にインデントを適用します。

ユーザーオプション: tab-always-indent

この変数を使用すると、TAB (indent-for-tab-command) コマンドの動作をカスタマイズできます。値が t(デフォルト)の場合、このコマンドは通常、現在の行をインデントするだけです。値が nil の場合、ポイントが左マージンにあるか、あるいは行のインデント範囲内にある場合にのみ現在の行をインデントし、それ以外の場合はタブ文字を挿入します。値が complete の場合、このコマンドはまず現在の行をインデントしようとし、すでにインデントされている場合は、completion-at-point を呼び出してポイントにあるテキストを補完します(通常バッファにおける補完を参照)。

ユーザーオプション: tab-first-completion

tab-always-indent が complete の場合、展開するかインデントするかは tab-first-completion 変数でさらにカスタマイズできます。 以下の値が使用可能です。

eol

ポイントが行末にある場合のみ完了。

word

次の文字に単語構文がない限り、完了とする。

word-or-paren

次の文字が単語構文であるか、または括弧でない限り、完了とする。

word-or-paren-or-punct

次の文字が単語構文であるか、括弧であるか、または句読点である場合を除き、完了とする。

いずれにせよ、TAB を2回入力すれば必ず補完されます。

一部のメジャーモードでは、構文が異なる別のメジャーモードに属するテキストの埋め込み領域をサポートする必要があります。例としては、ドキュメントとソースコードのスニペットを組み合わせたリテラルプログラミングのソースファイルや、PythonやJSコードのスニペットを含むYacc/Bisonプログラムなどが挙げられます。埋め込みチャンクを正しくインデントするには、プライマリモードはインデント処理を別のモードのインデントエンジンに委譲し(例:JSコードにはjs-indent-lineを、Pythonにはpython-indent-lineを呼び出す)、同時にインデントの指針となるコンテキストを提供する必要があります。一方、メジャーモード側は、自身のインデント処理コード内でwidenを呼び出すことを避け、prog-first-columnに従うべきです。

変数: prog-indentation-context

この変数は、nil でない場合、上位のメジャーモードが提供するサブモードのインデントエンジン用のインデントコンテキストを保持します。値は (first-column . rest) 形式のリストである必要があります。リストの各要素は以下の意味を持ちます:

first-column

トップレベル構造に使用する列。これにより、サブモードで使用されるトップレベル列のデフォルト値(通常は0)が置き換えられます。

rest

この値は現在使用されていません。

他のメジャーモードのサブモードとしての呼び出しをサポートするため、メジャーモードのインデントエンジンでは以下の便利な関数を使用する必要があります。

関数: prog-first-column

プログラムの最上位構造をインデントする際は、列番号のリテラル値(通常は0)を使用する代わりに、この関数を呼び出してください。この関数の戻り値は、最上位構造に使用する列番号となります。上位モードが適用されていない場合、この関数は0を返します。