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

26.5 コードのアライメント

アライメントとは、ある領域内の一連の行において、すべての行で特定の部分が同じ列から始まるように空白を調整する処理のことです。これは通常、テキストやコードの可読性を高めるために行われます。代表的な例は、C系プログラミング言語における一連の代入文のアライメントです:

int a = 1;
short foo = 2;
double blah = 4;

一般的に以下に揃えられます:

int    a    = 1;
short  foo  = 2;
double blah = 4;

コマンド M-x align を使用すると、現在のリージョン内の行を揃えることができます。このコマンドは、多くのマークアップ言語やプログラミング言語に共通するアライメントパターンを認識しています。これらのパターンを、異なるコンテキストにおいて各種テキストをどのように揃えるかを規定する アライメントルール の集合としてエンコードしています。

ユーザーオプション align-rules-list は、M-x align が参照すべきアライメントルールを指定します。このオプションの値は、アライメントルールを記述する要素からなるリストです。各要素はコンスセル (title . attributes) であり、title はシンボルとしてのアライメントルール名、attributes はそのルールが適用される条件や、行の分割・アライメント方法を定義するルール属性のリストです。各ルール属性はコンスセル (attribute . value) であり、attribute は属性名、value はその値です。必須の属性は regexp のみで、その値は正規表現であり、M-x align が空白文字を展開または縮小すべき各行の箇所に一致する部分式を含んでいます(正規表現におけるバックスラッシュ を参照)。利用可能なアライメントルール属性の詳細については、align-rules-list (C-h v align-rules-list RET) のドキュメント文字列を参照してください。デフォルトでは、このオプションには Emacs がサポートする多くの言語向けの長いアライメントルールリストが設定されています。デフォルトのルールでは、modes ルール属性を使用して、M-x align を適用すべきメジャーモードを指定します。また、メジャーモードは、バッファローカル変数 align-mode-rules-list に nil 以外のアライメントルールリストを設定することで、align-rules-list をオーバーライドすることもできます。align-mode-rules-list が nil 以外の場合、M-x align は align-rules-list の代わりにこれを参照します。

アライメント規則に加えて、M-x align は 除外規則 と呼ばれる別の種類の規則を使用します。除外規則は、領域 M-x align 内のどの部分をアライメントせず、そのまま保持するかを指定します。ユーザーオプション align-exclude-rules-list でこれらの除外規則を指定します。align-rules-list と同様に、align-exclude-rules-list の値も除外規則を記述するコンスセルのリストです。デフォルトでは、align-exclude-rules-list に Lisp、C、およびその他の言語における引用文字列やコメントのアライメントを除外する規則が含まれています。align-exclude-rules-list のデフォルトの除外規則に加えて、メジャーモードは align-mode-exclude-rules-list に nil 以外の規則リストを設定することで、独自の除外規則を定義できます。これは、align-mode-rules-list が align-rules-list を上書きするのと同様に、align-exclude-rules-list を上書きします。

M-x align はリージョンを一連の セクション(通常は空白行以外の行の並び)に分割し、空白領域を拡張または縮小することで、一致するすべてのアライメントルールに従って各セクションを整列させます。M-x align は単一セクション内のすべての行を一貫して整列させますが、リージョン内の異なるセクションをそれぞれ異なる方法で整列させる場合があります。ユーザーオプション align-region-separate は、M-x align がリージョンをセクションに分割する方法を指定します。このオプションには、シンボル entire、group、または正規表現のいずれかを指定できます。align-region-separate が entire の場合、Emacs はリージョン全体を単一のセクションとして整列させます。このオプションが group の場合、Emacs はリージョン内の連続する空白行以外の行の各グループを、個別のセクションとして整列させます。align-region-separate が正規表現の場合、M-x align はリージョン内からその正規表現に一致する箇所をスキャンし、それらをセクション区切り文字として扱います。デフォルトでは、align-region-separate は空白行、および空白文字と単一の波括弧のみを含む行に一致する正規表現(‘{’ または ‘}’)に設定されています。正規表現では精度が不十分な特殊なケースでは、align-region-separate にリージョンをアライメントセクションに分割する方法を定義する関数を設定することもできます。詳細は align-region-separate のドキュメント文字列を参照してください。特定のアライメントルールは align-region-separate の値を上書きし、separate ルール属性を指定することで独自のセクション区切り文字を定義できます。

M-x align をプレフィックス引数 (C-u) 付きで呼び出すと、有用ではあるものの、時に干渉が強すぎることもあるアライメントルールがさらに有効になります。例えば、以下のような形式の Lisp バッファでは:

(set-face-attribute 'mode-line-inactive nil
                    :box nil
                    :background nil
                    :underline "black")

(C-u M-x align) と入力すると、以下のようになります:

(set-face-attribute 'mode-line-inactive nil
                    :box                nil
                    :background         nil
                    :underline          "black")

ほとんどの場合、まずはプレフィックス引数なしで M-x align を試し、それで期待通りの結果が得られない場合は、C-/ で元に戻してから C-u M-x align で再度試してください。

コマンド M-x align-highlight-rule を使用すると、現在のリージョンにおける特定のアライメント規則または除外規則の効果を可視化できます。このコマンドは規則のタイトルの入力を求め、その規則が影響を及ぼすリージョン内の箇所をハイライトします。アライメント規則の場合、このコマンドは M-x align が拡張または縮小させる空白部分をハイライトし、除外規則の場合は、M-x align がアライメントから除外する箇所をハイライトします。このコマンドによって作成されたハイライトを解除するには、M-x align-unhighlight-rule と入力してください。

コマンド M-x align-current は M-x align と似ていますが、現在のリージョンに関わらず、ポイントを含むアライメントセクションに対してのみ作用する点が異なります。このコマンドは、align-region-separate が定義するセクション区切り文字に基づいて、現在のセクションの境界を決定します。M-x align-entire は M-x align の別のバリエーションであり、align-region-separate を無視して、リージョン全体を一貫したアライメントを持つ単一のアライメントセクションとして整列させます。align-region-separate を entire に設定すると、M-x align はデフォルトで M-x align-entire と同様に動作します。リージョン全体を単一のアライメントセクションとして整列させた際の効果を示すため、以下のコードを考えてみましょう。

one = 1;
foobarbaz = 2;

spam = 3;
emacs = 4;

領域がこれらの線をすべて含む場合、M-x align と入力すると次のようになります:

one       = 1;
foobarbaz = 2;

spam  = 3;
emacs = 4;

一方、M-x align-entire はすべての行を一つのセクションとして揃えるため、‘=’ はすべての行の同じ列に表示されます:

one       = 1;
foobarbaz = 2;

spam      = 3;
emacs     = 4;

M-x align-regexp コマンドを使用すると、align-rules-list の定義済みルールではなく、その場で定義したアライメントルールを用いて現在のリージョンを整列させることができます。M-x align-regexp は正規表現の入力を求め、その正規表現を、本コマンドが現在のリージョンの整列に使用するアドホックなアライメントルールの regexp 属性として用います。デフォルトでは、本コマンドは指定した正規表現の最初の部分式に一致する空白文字を調整します。M-x align-regexp を接頭辞引数付きで呼び出すと、使用する部分式の入力が求められるほか、パディングとして使用する空白文字の量や、各行における正規表現のすべての一致箇所に対してルールを繰り返し適用するかどうかを指定できます。正規表現とその部分式の詳細については、正規表現におけるバックスラッシュ を参照してください。

ユーザーオプション align-indent-before-aligning が nil 以外の場合、Emacs はリージョンを M-x align に合わせる前にインデントします。インデント を参照してください。デフォルトでは align-indent-before-aligning は nil に設定されています。

ユーザーオプション align-to-tab-stop は、整列する部分がタブストップから開始されるかどうかを指定します(タブストップ を参照)。このオプションが nil の場合、M-x align はタブストップを無視し、整列に必要な分だけの空白を使用します。これが nil 以外の記号である場合、M-x align はその記号の値を確認し、その値が nil 以外であれば、M-x align はタブストップに合わせて整列します。デフォルトではこのオプションは indent-tabs-mode に設定されており、インデントにタブを使用するバッファでは、整列時にタブストップが考慮されます。タブ vs. スペース を参照してください。

ユーザーオプション align-default-spacing は、行を整列させる際に、M-x align およびその関連コマンドが各行の異なる部分間のパディングに使用するデフォルトの空白量を指定します。align-to-tab-stop が nil である場合、align-default-spacing の値はパディングに使用するスペースの数となります。align-to-tab-stop が nil 以外である場合、align-default-spacing の値は代わりに使用するタブストップの数となります。各整列ルールは、spacing 属性ルールを用いて align-default-spacing が指定するデフォルト値を上書きできます。