# EE2Eにおける
Java/C/C++インデント規則

The Java/C/C++ indent rule in EE2E.
安藤 利和
Toshikazu Ando
安藤振舞科学研究所
Ando Computer Behavior Research and Design

## 本稿の目的

本稿ではJava/C/C++に対する Eclipse[1]の入力補完ツール EE2E(Emacs Environment to Eclipse)[2]における インデント(字下げ)規則を規定する。 本インデント規則はEE2E 2.4.1より適応される。
手作業でインデントを行う場合その作業は 少なくとも簡単な作業ではない。 しかし機械的にインデント作業を行うためには、 一般的で実現容易なインデント規則が 規定されていなければできない。 本稿ではそのインデント規則を規定する。 それにより直接入力性が向上し、 可読性が高くなり、 結果、より生産性を向上させることができる。 最終的にEE2Eの利用者を増やし知名度を向上させることを目標とする。

### 版数／作成日

本稿の現版数は初版、1.1.2である。 2003年6月6日に作成され、2003年6月7日に改正された。

## 用語の定義

1. 空白１回の字下げを文字数を 「１インデント幅」と規定する。
   EE2EにおいてJava/C/C++のインデント幅は４文字標準とする。
2. 実際その行で何文字先頭に空白を入れるかを表す数値を 「インデント値」 と規定する。
3. インデントするべき対象となる行(現在カーソルが存在する行)のことを 「対象行」と規定する。
4. 対象行のインデント値を 「対象インデント値」と規定する。
5. 対象行が実際何文字インデントすることが必要なのかを定義付ける行のこと 「基準インデント行」とする。
6. 基準インデント行のインデント値を 「基準インデント値」と規定する。

## EE2E Java/C/C++インデント規則の実際

### EE2E Java/C/C++インデント規則

#### '#'のインデント消し

空白を除いた自分の行の先頭が'#'から始まるとき、 その行のインデント値は０として処理終了。

#### コメント文の無視

行内に存在に'#'か'//'が存在する場合、 その文字は無視。

#### フォーテーションに囲まれた'"'、コメント

シングルフォーテーションまたはダブルフォーテーションに囲まれた '#'か'//'、上記の無視することを無視する。

#### ':'のインデント引き

コメントと空白を除いた自分の行の後備が ':'から始まるとき、インデント値-4として次へ。

#### '}'のインデント引き

空白を除いた自分の行の後備が '}'から始まるとき、インデント値-4として次へ。

#### ';'のチェック

対象行の行頭から検索を始めて、 コメントを除いた空白を除いた最初の文字をチェックする。
存在しない場合はインデント値を0として終了。
その文字が';'か'}'でなければインデント値+4。

#### 基準インデント行のチェック

前項の最初の文字があった行頭から検索を始めて、 '}'か':'か'{'か行頭が存在する行を探す。 無い場合はインデント値0。
存在する場合は、その行の行末から、 空白とコメントを除いた最初の文字が存在する行まで移動する。 その行を「基準インデント行」とする。

### インデントのサンプル

#### #対策

    #if 0  // ← 対象行

この場合のインデント値は0である。

#### 空白行は無視

        moemoe();
        hogehoge();  // ← 基準インデント行

        herohero();  // ← 対象行

この場合のインデント値は4である。

#### #は無視

        moemoe();
        hogehoge();  // ← 基準インデント行
    #if 0
        herohero();  // ← 対象行

この場合のインデント値は4である。

#### //も無視

        moemoe();
        hogehoge();  // ← 基準インデント行
    //こめんと
        herohero();  // ← 対象行

この場合のインデント値は4である。

#### 後方の//も無視

        moemoe();
        hogehoge();  //こめんと // ← 基準インデント行
        herohero();  // ← 対象行

この場合のインデント値は4である。

#### フォーテーションに囲まれた#はチェックしない

        public aaa() {
            super(GRID);
            EE2EDebug.printf(3, "Nnn#aaa()"); // ← 基準インデント行
            EE2EPlugin.gethoge();             // ← 対象行

この場合のインデント値は8である。

#### 一文字'}'行の次をチェック

            abc();
        }    // ← 基準インデント行
        def();  // ← 対象行

この場合のインデント値は4である。

#### ':'はマイナス4

        switch(c) {
        HOGE_HERO:
            break;    // ← 基準インデント行
        MOE_MOE:      // ← 対象行
            herohero();

この場合のインデント値は4である。

#### '}'はマイナス4

        switch(c) {
        HOGE_HERO:
            break;
        MOE_MOE:
            herohero(); // ← 基準インデント行
        }               // ← 対象行

この場合のインデント値は4である。

#### ';'をチェックしようとしたら先頭行だった

    //
    #include "stdio.h"

    int main() {   // ← 対象行

この場合のインデント値は0である。

#### 前行字句によるインデント追加

        switch(c) {
        HOGE_HERO:      // ← 基準インデント行
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(空白無視)

        switch(c) {

        HOGE_HERO:      // ← 基準インデント行

            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(コメント無視)

        switch(c) { //
        HOGE_HERO:      // ← 基準インデント行
        //
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(#無視)

        switch(c) {
        HOGE_HERO:      // ← 基準インデント行
    #if 0
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(２重#無視)

        switch(c) {
        HOGE_HERO:      // ← 基準インデント行
    #if 0
    #if HOGE
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(前置//無視)

        switch(c) {
        //
        HOGE_HERO:      // ← 基準インデント行
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(前置//２重無視)

        switch(c) {
    //
        //
        HOGE_HERO:      // ← 基準インデント行
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(前置#重無視)

        switch(c) {
    #if 0
        HOGE_HERO:      // ← 基準インデント行
            break;      // ← 対象行

この場合のインデント値は8である。

#### 基準インデント行のチェック(基準インデント確認)

        HOGE_HERO:
            a = hogehoge // ← 基準インデント行
                + herohero;  // ← 対象行

この場合のインデント値は12である。

#### 基準インデント行のチェック(基準インデント遠距離確認)

        HOGE_HERO:
        //
            a = hogehoge // ← 基準インデント行
                + herohero //
                + herohero
    //
                moemoe;  // ← 対象行

この場合のインデント値は12である。

## 参考文献

1. [１] Eclipse.org Main Page ／ http://www.eclipse.org/
2. [２]EE2E project / http://park.ruru.ne.jp/ando/work/who/ee2e/

ando@park.ruru.ne.jp