Emacsには数多くの括弧の対応関係表示機能が備わっており、括弧(あるいはその他の対になる区切り文字)がどのように、またそもそも対応しているかを容易に確認できます。
閉じ区切り文字である自己挿入文字を入力すると、Emacsは対応する開き区切り文字の位置を、画面上にあれば簡潔に表示します。画面上にない場合は、その付近のテキストの一部をエコーエリアに表示します。いずれの場合も、どのグループを閉じようとしているのかが分かります。開き区切り文字と閉じ区切り文字が対応していない場合—例えば ‘[x)’ のような場合—には、エコーエリアに警告メッセージが表示されます。
対応括弧の表示は、3つの変数によって制御されます:
blink-matching-paren で機能のオン/オフを切り替えます。nil で無効にしますが、デフォルトは有効にする t
です。jump
に設定すると、一致する開始デリミタにカーソルを一時的に移動させることでインジケーションが機能します。jump-offscreen に設定すると、開始デリミタが画面外にあってもカーソルがジャンプします。
blink-matching-delay
は、一致する開始デリミタを表示し続ける秒数を指定します。値は整数または浮動小数点数で、デフォルトは 1 です。
blink-matching-paren-distance
は、一致する開始デリミタを見つけるために、何文字前まで遡って検索するかを指定します。この範囲内で一致が見つからない場合、Emacs
はスキャンを停止し、何も表示されません。デフォルト値は 102400 です。
Show Parenモードは、より強力な自動マッチング機能を提供するマイナーモードです。ポイントが開きデリミタの前、または閉じデリミタの後にあるとき、そのデリミタと対応する閉じデリミタ、および必要に応じてその間のテキストがハイライトされます。Show Parenモードをグローバルに切り替えるには、M-x show-paren-modeと入力してください。現在のバッファのみで切り替えるには、M-x show-paren-local-modeと入力してください。
デフォルトでは、このモードは編集用のすべてのバッファで有効になっていますが、データを表示するバッファでは有効になりません。これはユーザーオプション
show-paren-predicate で制御されます。
モードをカスタマイズするには、M-x customize-group RET paren-showingと入力してください。このモードの動作を制御するカスタマイズ可能なオプションには、以下が含まれます。
show-paren-highlight-openparen
は、ポイントが開き括弧の直前にある場合にその括弧をハイライトするかどうかを制御します。これにより、いずれにせよその位置がカーソルで示されます。デフォルトは
non-nil (yes) です。
show-paren-style
は、2つの括弧のみを強調表示するか、あるいはその間のテキストも含めて強調表示するかを制御します。ここで指定可能なオプションは、parenthesis(対応する括弧を表示)、expression(括弧で囲まれた式全体を強調表示)、および mixed(ウィンドウ内に表示されている場合は対応する括弧を、そうでない場合は式を強調表示)です。
show-paren-when-point-inside-paren で非nil の場合、point が括弧内にあるときにもハイライトされます。デフォルトは nil です。
show-paren-when-point-in-periphery、non-nil
の場合、ポイントが行頭の空白文字にあり、かつその行の最初または最後の非空白文字位置に括弧がある場合、あるいはポイントが行末にあり、かつその行の最後の非空白文字位置に括弧がある場合にも、ハイライトが発生します。
show-paren-context-when-offscreen が非 nil
の場合、ポイントが閉じデリミタにあり、開きデリミタが画面外にあるときに、エコー領域に何らかのコンテキストを表示します。コンテキストは通常、開きデリミタを含む行となりますが、開きデリミタが単独の行にある場合は、直前の非空白行がコンテキストに含まれます。
show-paren-not-in-comments-or-strings の値が all の場合、コメントや文字列内の区切り文字はハイライトされません。それ以外の場合、値が on-mismatch に設定されていると、コメント内の不一致な区切り文字はハイライトされません。デフォルトは
nil であるため、コメントや文字列内の区切り文字は常にハイライトされます。
Electric Pairモードは、丸括弧、波括弧、角括弧、引用符などの対応する区切り文字のペアを簡単に挿入できるマイナーモードです(何が対応する区切り文字とみなされるかは、メジャーモードによって異なります)。Electric Pairモードをグローバルに切り替えるには、M-x electric-pair-modeと入力してください。現在のバッファのみで切り替えるには、M-x electric-pair-local-modeと入力してください。
このモードが有効な場合、開き区切り文字を入力すると、その文字と、それに続けて対応する閉じ区切り文字の両方が挿入され、ポイントはその2文字の間に配置されます。これにより、ほとんどの場合、対応する閉じ区切り文字を入力する必要がなくなります。それでも閉じ区切り文字を入力した場合、ポイントが同種の閉じ区切り文字の直前にない限り、Emacsは単にその文字を挿入します。その場合、ポイントは閉じ区切り文字の直後に移動し、追加の閉じ区切り文字は挿入されません。したがって、<開き区切り文字>, <対応する閉じ区切り文字> というシーケンスを入力することは、<開き区切り文字>, C-f というシーケンスに代わる、おそらくより便利な方法となります。
アクティブリージョン(マークとリージョンを参照)がある場合、エレクトリックペアモードの動作は異なります。開きデリミタまたは閉じデリミタのいずれかを挿入すると、リージョン内の文字が結果として得られた一対の対応デリミタで囲まれ、入力したデリミタの直後にポイントが残ります(これにより、開きデリミタに続くテキストの前、あるいは閉じデリミタの後のいずれかで入力を続けることが容易になります)。
開き区切り文字を挿入する際にプレフィックス引数を指定し—かつリージョンがアクティブな場合は、閉じ区切り文字を挿入する際にも—これにより、そのプレフィックス引数の数値分だけ、対応する区切り文字の入れ子ペアが挿入されます。
Electric Pairモードの動作を変更するためのユーザーオプションがいくつか用意されています:
electric-pair-preserve-balance, when non-nil (the default), makes typing a delimiter preserve the
balance between opening and closing delimiters. Thus, if you type an
opening delimiter and there is an unpaired matching closing delimiter later
in the buffer, then only the opening delimiter gets inserted (and not a
matching closing delimiter immediately following it); likewise, if there is
an unpaired opening delimiter, then typing a matching closing delimiter
later in the buffer inserts this character even when the following character
is another matching closing delimiter.
nil
に設定されている場合、開きデリミタを入力すると、この文字のみが挿入されます。ただし、ポイントが対応する開きデリミタの直前または直後、あるいは英数字の直前にある場合に限ります。それ以外の位置で開きデリミタを入力すると、バッファの後方にペアになっていない対応する閉じデリミタが存在していても、自動的にその直後に一致する閉じデリミタが挿入されます。また、同じ種類の閉じデリミタの直前に閉じデリミタを入力しても、その文字は挿入されず、バッファの前方にペアになっていない対応する開きデリミタが存在していても、前述の通りポイントが移動します。
活動領域がある場合、この変数は効果を持ちません。
electric-pair-delete-adjacent-pairs で、非 nil(デフォルト)の場合、DEL キー(通常は BACKSPACE キーです。DEL で削除できない場合
を参照)を入力して開始デリミタを削除すると、直後に続く対応する終了デリミタも自動的に削除されます(ただし、ペアとなるデリミタの間に、空白文字を含む何らかの文字がある場合は除きます)。nil に設定されている場合、BACKSPACE
を入力すると開始デリミタのみが削除されます。(BACKSPACE
を入力して終了デリミタを削除すると、常にその文字のみが削除されます。)
electric-pair-open-newline-between-pairs が nil 以外(デフォルト)であり、point
が開きデリミタと、その直後に続く対応する閉じデリミタとの間にある場合、改行を入力すると point
の後に自動的に余分な改行が挿入されます(メジャーモードによっては、point がある空行がインデントされることがあります)。nil に設定されている場合は、通常通り、改行を入力しても point の前に1行だけ改行が挿入されます。
electric-pair-skip-whitespace がデフォルトの非 nil
値であり、ポイントが閉じデリミタと空白文字のみで区切られている場合、同じ種類の閉じデリミタを入力してもその文字は挿入されず、代わりにポイントは既に存在する閉じデリミタの直後へ移動します。また、このオプションを設定して、ポイントが移動した先の空白文字も併せて削除することも可能です。nil
に設定した場合、閉じデリミタを入力すると単にその文字が挿入されます(これにより、後続の同じ種類の閉じデリミタが不均衡になっても同様です)。