emacs でソースコードを整形する方法

emacsの機能を駆使して,ソースコードを半自動的に整形する方法.

手順はたったの2stepです.具体的には

  • step-1 C-c C-q で自動インデント
  • step-2 M-x align-regex でキーワードを指定してテキストを整列

という流れになります.

以下例としてC言語で記述されたソースコードを使いますが,同じ手順でC以外の他の言語(C++はもちろんphp,ruby,lispなど)でも整形できます.

元のソース

const char* foo(int code) {
  const char *msg = NULL;
  switch (code) {
      case LS_SUCCESS: msg = "success";break;
  case LS_NO_RECORD:  msg = "no record";break;
   case LS_NO_TOKEN:   msg = "no token";break;
  }
return msg;
}

step-1 インデントをそろえる

関数内にカーソルを移動させて,C-c C-q

const char* foo(int code) {
    const char *msg = NULL;
    switch (code) {
    case LS_SUCCESS: msg = "success";break;
    case LS_NO_RECORD:  msg = "no record";break;
    case LS_NO_TOKEN:   msg = "no token";break;
    }
    return msg;
}

C-c C-q が覚えにくかったら M-x indent-region を使いましょう.

step-2 M-x align-regex で整列

M-x align-regex を使うと,指定した単語(厳密には正規表現)でテキストを整列できます.
たとえば,変数名 msg で整列したい場合は,M-x align-regex して,"msg" と入力します.

const char* foo(int code) {
    const char *msg = NULL;
    switch (code) {
    case LS_SUCCESS:    msg = "success";break;
    case LS_NO_RECORD:  msg = "no record";break;
    case LS_NO_TOKEN:   msg = "no token";break;
    }
    return msg;
}

続けて,break でも整列させると以下のようなすっきりとしたコードになります.

const char* foo(int code) {
    const char *msg = NULL;
    switch (code) {
    case LS_SUCCESS:    msg = "success";     break;
    case LS_NO_RECORD:  msg = "no record";   break;
    case LS_NO_TOKEN:   msg = "no token";    break;
    }
    return msg;
}


入門GNU Emacs (UNIX text processing)
デボラ キャメロン エリック レイモンド ビル ローゼンブラッド
オライリー・ジャパン
売り上げランキング: 390213
おすすめ度の平均: 5.0
5 明快な語り口調で・・・
5 明快な語り口調で・・・

GNU Emacsマニュアル20.6
GNU Emacsマニュアル20.6
posted with amazlet at 09.04.05
リチャード・M. ストールマン
アスキー
売り上げランキング: 336115
おすすめ度の平均: 5.0
5 1999年版は20.3でした。

入門 GNU Emacs 第3版
入門 GNU Emacs 第3版
posted with amazlet at 09.04.05
Debra Cameron James Elliott Marc Loy Eric Raymond Bill Rosenblatt
オライリー・ジャパン
売り上げランキング: 72135
おすすめ度の平均: 5.0
5 GNU Emacs/Mule
5 チュートリアル以後