次: , 前: Motion in C, 上: C Modes


20.15.2 エレクトリックC文字

Cモードとその関連モードでは、ある種の印字文字は『エレクトリック』です。 つまり、その文字自身を挿入することに加えて、 現在行を字下げし直したり、改行も挿入することさえあります。 この機能は、変数c-auto-newlineで制御されます。 『エレクトリック』文字は、{}:#;,<>/*()です。

自動改行(auto-newline)機能がオン (モード行のモード名のあとに`/a'と表示される)の場合に限り、 エレクトリック文字は改行を挿入します。 この機能は、変数c-auto-newlineで制御されます。 コマンドC-c C-aでこの機能をオン/オフできます。

C-c C-a
自動改行機能をオン/オフする(c-toggle-auto-state)。 数引数を指定した場合、正ならば自動改行機能をオンにし、 負ならばオフにする。

コロン:はエレクトリックです。 なぜなら、単独のコロンの入力の解釈としてはそれが適切だからです。 しかし、C++で2つの連続するコロンを挿入する場合、 コロンのエレクトリックな動作は不便です。 C-c :と打てば、字下げも改行の挿入も行わずにコロンを2つ挿入できます。

C-c :
行の字下げも改行の挿入もせずに、 スコープ演算子を表すコロン2つをポイント位置に挿入する (c-scope-operator)。

エレクトリックキー#は、 プリプロセッサ指令の始まりと思われる位置では、行を字下げし直します。 変数c-electric-pound-behaviorの値が(alignleft)のときには、 このようになります。 この機能をオフにするには、 c-electric-pound-behaviornilを設定します。

変数c-hanging-braces-alistは、 挿入された中括弧の前/後への改行の挿入を制御します。 これは、(syntactic-symbol . nl-list)の形の要素 から成る連想リストです。 c-offsets-alistに現れるほとんどの構文シンボルは、 ここでも意味を持ちます。

リストnl-listは、シンボルbeforeafterのいずれか、 あるいはその両方、もしくはnilを含みます。 中括弧が挿入されるときには、その中括弧が定義する構文上の文脈を c-hanging-braces-alistから探します。 みつかれば、nl-listを使って 中括弧の前/後/前後のどこに改行を挿入するか決定します。 みつからなければ、デフォルトとして中括弧の前後に改行を挿入します。

変数c-hanging-colons-alistは、 挿入されたコロンの前/後への改行の挿入を制御します。 これは、(syntactic-symbol . nl-list)の形の要素 から成る連想リストです。 リストnl-listは、シンボルbeforeafterのいずれか、 あるいはその両方、もしくはnilを含みます。

コロンが挿入されるときには、そのコロンが定義する構文シンボルを この連想リストから探します。 みつかれば、nl-listを使って コロンの前/後のどこに改行を挿入するか決定します。 みつからなければ、改行を挿入しません。

自動改行機能がオンのときには、エレクトリック文字は自動的に改行を削除します。 この機能により、 改行が不要だと思われるもっとも一般的な場面で改行を削除するので、 自動改行機能をユーザーにより受け入れやすくしています。 Emacsは改行を削除することが望ましいいくつかの場面を認識できますが、 変数c-cleanup-listを設定すれば、どの場面で行うか指定できます。 この変数の値はシンボルのリストです。 各要素は、改行を削除してよい場面を1つ指定します。 以下に指定できるシンボルとその意味を示します。

brace-catch-brace
`} catch (condition) {'の構造全体を1行に再配置する。 catchcondition以外に中括弧のあいだになにもないときに `{'を打つと再配置する。
brace-else-brace
`} else {'の構造全体を1行に再配置する。 elseに続けて`{'を打ったときに再配置するが、 中括弧とelseのあいだに空白以外の文字がない場合に限る。
brace-elseif-brace
`} else if (...) {'の構造全体を1行に配置する。 `{'を打ったときに再配置するが、 キーワードとifの条件式を除いて、 `}'と`{'のあいだに空白以外の文字がない場合に限る。
empty-defun-braces
空の関数定義の中括弧、`{'と`}'を同じ行に再配置する。 閉じ中括弧`}'を打ったときに再配置する。
defun-close-semi
structや同様の型宣言のあとのセミコロンを閉じ中括弧と同じ行に再配置する。 セミコロンを打ったときに再配置する。
list-close-comma
配列/合成体の初期化式の中の閉じ中括弧とそれに続くコンマを同じ行に再配置する。 コンマを打ったときに再配置する。
scope-operator
C++のスコープ演算子を表している可能性がある2つのコロンを一緒にする。 2つめのコロンを打ったときに一緒にするが、 コロンのあいだに白文字以外の文字がない場合に限る。