MetaEditorヘルプ

スタイラー

この機能は、ソースコードを推奨標準にフォーマッティングします。ソースコードを読み易くかつプロフェッショナルが書いたように見せます。正しくフォーマットされたコードは、作者自身だけではなく他のユーザの更なる分析を容易にします。スタイラーを始めるには、「スタイラー スタイラー」コマンド(メニュー「ツール」⇒、または「Ctrl+,」ホットキー)を使用します。

スタイラーによるソースコードのフォーマット変更をロールバックするには、「Undo 元に戻す」コマンド(メニュー「「編集」⇒、「標準」ツールバー、または「Ctrl+Z」ホットキー)を使用します。

概要

スタイラーが持つソースコードを正しい書式に変換するアクションタイプをつぎに示します。

  • 指定した行を他の指定した行の書式に置き換えます。
  • 演算子を整列します。
  • ファイルヘッダコメントを挿入します。
  • 関数、構造体、クラス、およびメソドの前にコメントを挿入します。
  • ファイルの末尾にコメントを挿入します。

スタイラーは、上述したアクションタイプに基づいてつぎの修正を行います。

スペースと空白行

不必要なスペースを削除し、ソースコードをコンパクトにし分かり易さを高めます。さらにスタイラーはタブ記号を3スペース文字に置換して、サードパーティのソフトウェアで開いたときのソースコード書式の乱れを避けることができます。

スタイラーはつぎのスペースを削除します。

  • 行の後
  • ";" 記号の前
  • "if" と "("の間、同様に "while" と "("、"for" と "("、"switch" と "("、並びに "return" と "(" の間
  • ";" の後、"for()" の内部
  • "!" の後
  • "(" と ")" の前後
  • "<" と ">" の前後
  • "|" と "^" の前後
  • "+"、 "-"、 "/" および "%" の前後
  • "[" と "]" の前後
  • "==" と "==" の前後
  • "!=" と "!=" の前後
  • "<=" と ">=" の前後
  • "+=" と "+=" の前後
  • "-=" と "-=" の前後
  • "*=" と "*=" の前後
  • "/=" と "/=" の前後
  • "<<" と ">>" の前後
  • "," と "=" の左右にひとつのスペース

スタイラー配置

  • "||" 並びに "&&" の左右にひとつのスペース( " || " 並びに " && " )を置きます。

その他の置換

  • "int* a" のような構文では、 "*" や "&" 記号は変数に掛かるのであって型にではないので、"int *a"のように置換されます。
  • 2行の空白行は1行に置換されます。

フォーマッティング前

フォーマッティング後

void myFunction() 
  {
   if   (I  <  10)
  {
   printf (“Hello\n”) ;
   if (< 5 )
     {
             printf (“i<5 !\n”) ;
             if (< 3)
               {
                printf (“i<3 !\n”) ;
                if (< 2)
                  {
                  }
               }
            }
  }
     }

void myFunction()
  {
   if(I<10)
     {
      printf(“Hello\n”);
      if(I<5)
        {
         printf(“i<5 !\n”);
         if(i<3)
           {
            printf(“i<3 !\n”);
            if(i<2)
              {
              }
           }
        }
     }
  }

タブサイズはMetaEditorのオプション設定に関係なく3スペースになります。

行揃えに関するフォーマッティング例外

スタイラーによる置換ルールが適用されないいくつかのケースがあります。作成者の隣接行の整列を維持します。スタイラーは隣接行の行揃えをつぎのキーワードや記号で識別します。

  • "//" — "C" 記号 コメント
  • "{" — 左中括弧
  • "}" — 右中括弧
  • "return" — "return" オペレータ
  • "delete" — "delete" オペレータ
  • "=" — 等号記号
  • ":" — コロン
  • "." — ドット

スタイラーが分析中に、上記単語や記号を直前の行と同じ位置に見付けたとき置換は行われません。

関数とオペレータのフォーマッティング

  • 関数/オペレータの型宣言の "{" と "}" 記号の前に2スペースを置きます。それらは関数/オペレータの開きと閉じ括弧です。
  • 関数/オペレータの"{" と "}" 記号に挟まれた各構文の前に3スペースを挿入します。
  • "{" または "}" 記号がテキストを伴って閉じていない場合、記号は別の行に配置されます。
  • 直前の行を考慮して整列も行われます。直前の行に閉じていない括弧があったり、演算式が完結していない場合は、現在行のスタート位置を直前行の "(" または "=" の後ろにします。
  • "else" 条件文は、常に "if" と同じ位置に配置されます。

フォーマッティング前

フォーマッティング後

void myFunction()  {
int k[10],t=0;
for(int i=0;i<10;i++){
   k[i]=i;
   t+=i;}   
if  (button==name) {
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}

void myFunction() 
  {
   int k[10],t=0;
   for(int i=0;i<10;i++)
     {
      k[i]=i;
      t+=i;
     }
   if(button==name) 
     {
      bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
      if(!state)
         ObjectSetInteger(0,name,OBJPROP_STATE,false);
     }
   else 
     {
      ObjectSetInteger(0,name,OBJPROP_STATE,false);
     }
  }

構造体、クラス、並びに列挙型宣言の整列

この種の表現にはいわゆる二重レベルの行揃えが使用されます。

  • 型宣言の直前に3スペースが配置されます。
  • クラスや構造体の名前は行の22カラム目からスタートします。
  • メンバーおよびメソドへのアクセススペシフィケータ( "private"、 "protected"、および"virtual" )は "クラス" 宣言に揃えられます。

フォーマッティング前

フォーマッティング後

class CTradePad  {
 private:
 int m_rows;
 int m_columns;
 int m_button_width;
 int m_button_height;
 int m_top;
 int m_left;
 int m_left_previous_header;
  };

class CTradePad  
  {
private:
   int               m_rows;
   int               m_columns;
   int               m_button_width;
   int               m_button_height;
   int               m_top;
   int               m_left;
   int               m_left_previous_header;
  };

コメントの整列

宣言と定義のコメントの整列には違いがあります。

  • 関数とメソド定義内における第1レベルのコメントは左寄せ(インデントなし)に揃えられます。
  • 宣言内における第1レベルのコメントは行の3カラム目に揃えられます。
  • つぎのコメントレベルは、オペレータのレベルに応じて揃えられます。

フォーマッティング前

フォーマッティング後

void myFunction()  {
//--- 1-st level comment
int k[10],t=0;
for(int i=0;i<10;i++){
   k[i]=i;
   t+=i;}   
if  (button==name) {
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
//--- 2-nd level comment
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}

void myFunction() 
  {
//--- 1-st level comment
   int k[10],t=0;
   for(int i=0;i<10;i++)
     {
      k[i]=i;
      t+=i;
     }
   if(button==name) 
     {
      bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
      //--- 2-nd level comment
      if(!state)
         ObjectSetInteger(0,name,OBJPROP_STATE,false);
     }
   else 
     {
      ObjectSetInteger(0,name,OBJPROP_STATE,false);
     }
  }

class CTradePad
  {
private:
   int m_rows;
 //--- number of rows
   int m_columns;   
              //--- number of columns
   int m_button_width; 
//--- cell width
 
  };

class CTradePad
  {
private:
   int               m_rows;
   //--- number of rows
   int               m_columns;
   //--- number of columns
   int               m_button_width;
   //--- cell width
 
  };

コメントの挿入

ファイルヘッダコメントがない場合はつぎのコメントが挿入されます。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                    Copyright © 2009, CompanyName.|
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+

関数、クラス、並びに構造体などの前にコメントがない場合は、つぎのコメントが挿入されます。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

ファイル末尾にはつぎの遮断用コメントが挿入されます。

//+------------------------------------------------------------------+