MetaEditor 帮助

Styler

此函数意在根据推荐的标准格式化源代码。这可以使源代码具有可读性并且看起来像专业的。格式正确的代码无论是对作者还是其他用户,都会使进一步的分析更加容易。若要启动styler应该执行"Styler Styler"命令在"工具" 菜单或使用"Ctrl+," 组合键。

通过styler更改源代码格式可以返回使用"撤销 撤销" 命令在"编辑"  菜单,在"标准" 工具栏或通过按下"Ctrl+Z"组合键。

常见说明

以下类型的源代码操作以正确的格式在styler 中实施:

  • 用其他指定行替换指定行;
  • 对齐运算符语言;
  • 插入注释到文件标题;
  • 函数,结构,类和方法之前插入注释;
  • 文件末尾插入注释。

styler基于上述的操作类型,执行以下更正:

空格和空行

删除不必要的空格符号可以使源代码紧凑并改善其获取。styler也用三个空格符号替换每个标签符号,在打开第三方软件时,避免源代码格式化失真是必须的。

Styler移除空格:

  • 在行的末尾;
  • 之前 "" 符号;
  • "if" 和 "(", "while" 和"(", "for" 和 "(", "switch" 和 "(", "return" 和 "("之间。
  • 之后";" 内部"for()";
  • 之后"!";
  • 附近 "(" 和")";
  • 附近"<" 和 ">";
  • 附近"|" 和"^";
  • 附近"+", "-", "/" 和 "%";
  • 附近"[" 和 "]";
  • 附近"==" 和 "==";
  • 附近 "!=" 和 "!=";
  • 附近 "<=" 和 ">=";
  • 附近 "+=" 和 "+=";
  • 附近"-=" 和 "-=";
  • 附近 "*=" 和 "*=";
  • 附近 "/=" 和 "/=";
  • 附近 "<<" 和 ">>";
  • 一次一个空格到"," 和 "="的右侧和左侧。

Styler 位置:

  • 一次一个空格到"||" 和 "&&" 的右侧和左侧(结果是 " || " 和" && ")。

其它的替换:

  • 在像"int* a" 的结构中,"*" 和 "&"符号表示变量但不是类型,所以这种结构被替换为 "int *a";
  • 双空行替换为一个空行。

在格式化之前

格式化后

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的设置 如何,标签大小都与三个空格等同。

除了替换格式一览,而隔行对齐

在某种情况下,syler执行的替换规则不应用。为了通过相邻线保持作者对齐而实施。styler通过相邻线分辨隔行对齐,为以下关键词和符号:

  • "//" ― "C" 评论的符号;
  • "{" ― 左大括号;
  • "}" ― 右大括号;
  • "return" ―"返回" 操作符;
  • "delete" ― "删除"操作符;
  • "=" ― 等号;
  • ":" ― 冒号;
  • "." ― 点。

如果分析过程中styler发现上述的一个单词或符号与上一行在相同的位置,那么不进行替换。

格式化函数和运算符

  • 函数/运算符类型声明的两个空格被设置在"{" 和 "}" 符号之前,它可以打开和关闭函数/运算符。
  • 运算符开始的三个空格被设置在位于函数和运算符"{" 和"}"符号之间的每行之前。
  • 在未关闭的情况下"{" 或 "}" 带有一些文本的符号在运算符中,这些符号位于不同的行。
  • 也要考虑前一行而进行对齐。如果前一行包含未关闭括号或未完成的算术表达式,那么当前行将从前一行的"(" 或 "="之后的第一个位置开始。
  • "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);
     }
  }

对齐结构,类和枚举的声明

在这种表达式中,使用所谓的双极制表:

  • 三个空格放置在描述的成员/方法类型指示之前;
  • 类或结构的成员或方法的名称从行的22位置开始指定;
  • 访问成员和方法的分类符 ("private", "protected", 和"virtual") 根据 "class" 单词来对齐。

在格式化之前

格式化后

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;
  };

对准评论

声明的对准评论和定义之间是有区别的:

  • 在函数和方法定义中,第一级的评论向左对齐(没有缩进);
  • 声明中的第一级评论对齐行中的第三位;
  • 下面级别的评论与指定的运算符相应级别对齐。

在格式化之前

格式化后

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 |
//+------------------------------------------------------------------+

如果没有的情况下,函数,类,结构等等的前面会插入以下类型的评论:

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

下面的拦截评论插入在文件的末尾:

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