場合によっては、一度に数行のコードのインデントを変更したいことがあります。その一つの方法は、マークを使用することです。マークが有効で、リージョンが空でない場合、TAB
はリージョン内のすべての行をインデントします。あるいは、C-M-\ (indent-region)
コマンドを使えば、マークの有効・無効にかかわらず、リージョン内のすべての行をインデントできます(インデントコマンドを参照してください)。
さらに、Emacsでは大量のコードをインデントするための以下のコマンドが用意されています。
1つの括弧グループ内のすべての行を再インデントしてください。
defun内の1つの段落を埋めるか、そのdefun内の全行を再インデントする。
括弧内のグループ全体を厳密に横方向にずらし、1行目が適切にインデントされるようにする。
リージョン内のすべての行を厳密に横にずらすが、コメントや文字列の内部から始まる行は変更しない。
単一の括弧グループ内の内容を再インデントするには、グループの開始位置の前にポイントを置き、C-M-q
と入力します。これにより、グループ全体のインデント(つまり、グループが始まる行のインデント)に影響を与えることなく、グループ内の相対的なインデントが変更されます。C-M-q が実行する機能はメジャーモードによって異なり、Lispモードでは indent-pp-sexp、Cモードでは c-indent-exp となります。グループ全体のインデントも併せて修正するには、まず TAB と入力してください。
ポイント周辺の defun 全体を再インデントするには、M-q (prog-fill-reindent-defun)
と入力します。ポイントがコメントや文字列内にある場合、このコマンドは代わりにそのコメントや文字列を埋めてインデントします。何をもってコメント、文字列、あるいは
defun とするかは、メジャーモードによって異なります。defun の範囲は変数 beginning-of-defun-function と end-of-defun-function によって決定され(The
Emacs Lisp Reference Manual の List
Motion を参照)、埋め合わせの仕組みは fill-paragraph-function
によって決定されます(The Emacs Lisp Reference Manual の Filling
を参照)。
グループ内の相対的なインデントは維持したいが、先頭行のインデントは変更したくない場合は、ポイントをその先頭行に移動して C-u TAB と入力してください。Lisp、C、およびその他のいくつかのメジャーモードでは、数値引数を指定した TAB は、通常通り現在の行を再インデントし、その後、現在の行から始まる括弧内のグループ内のすべての行を同じ量だけ再インデントします。ただし、これは巧妙な仕組みになっており、文字列の内部から始まる行は変更しません。また、Cモード時にCプリプロセッサの行を変更することはありませんが、それらに付随している可能性のある継続行は再インデントします。
コマンド M-x indent-code-rigidly は、indent-rigidly と同様に、リージョン内のすべての行を水平方向に厳密にシフトします(インデントコマンドを参照)。リージョンの開始位置が文字列の内部でない限り、文字列の内部から始まる行のインデントは変更されません。接頭辞引数で、インデントする列数を指定します。