Стилизатор
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или "Ctrl+,".
- Изменения оформления кода, сделанные стилизатором, можно откатить. Нажмите " Отменить" в меню "Правка" или "Ctrl+Z".
- Стилизатор поддерживает множество стандартов оформления кода. Изменить стиль можно в настройках редактора. Ниже подробно описываются правила оформления для рекомендуемого стиля MetaQuotes.
|
Общее описание
Для правильного оформления кода в стилизаторе предусмотрены следующие типы действия с кодом:
- Замена заданных строк на заданные;
- Выравнивание операторов языка;
- Вставка комментариев в заголовок файла;
- Вставка комментариев перед функциями, структурами, классами и их методами;
- Вставка комментариев в конце файла.
На основе вышеуказанных типов действий стилизатор производит следующую корректировку:
Пробелы и пустые строки
Удаление лишних знаков пробелов позволяет компактизировать код, улучшив тем самым его восприятие. Также стилизатор заменяет каждый знак табуляции на три пробела, чтобы избежать возможных искажений его форматирования при открытии в сторонних программах.
Стилизатор убирает пробелы:
- В конце строк;
- Перед знаком ";";
- Между "if" и "(", "while" и "(", "for" и "(", "switch" и "(", "return" и "(".
- После ";" внутри "for()";
- После "!";
- Рядом с "(" и ")";
- Рядом с "<" и ">";
- Рядом с "|" и "^";
- Рядом с "+", "-", "/" и "%";
- Рядом с "[" и "]";
- Рядом с "==" и "==";
- Рядом с "!=" и "!=";
- Рядом с "<=" и ">=";
- Рядом с "+=" и "+=";
- Рядом с "-=" и "-=";
- Рядом с "*=" и "*=";
- Рядом с "/=" и "/=";
- Рядом с "<<" и ">>";
- По одному пробелу справа и слева от "," и "=".
Стилизатор устанавливает:
- По одному пробелу справа и слева для "||" и "&&" (результат: " || " и " && ").
Другие замены:
- В конструкциях типа "int* a" знаки "*" и "&" относятся к переменной, а не к типу, поэтому такая конструкция заменяется на "int *a";
- Двойные пустые строки заменяются одной.
До форматирования
|
После форматирования
|
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)
{
}
}
}
}
}
|
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)
{
}
}
}
}
}
|
Исключения замен при форматировании с учетом междустрочного выравнивания
Правила замен стилизатора, указанные выше, не применяются в некоторых случаях. Это предусмотрено для того, чтобы не нарушать авторское выравнивание по соседним строкам. Стилизатор распознает междустрочное выравнивание по соседней строке для следующих ключевых слов и символов:
- "//" — символы "С"-комментария;
- "{" — левая фигурная скобка;
- "}" — правая фигурная скобка;
- "return" — оператор "return";
- "delete" — оператор "delete";
- "=" — символ равенства;
- ":" — двоеточие;
- "." — точка.
Если при анализе строки стилизатор находит одно из вышеуказанных слов или символов на той же позиции, что и в предыдущей или последующей строке, то замены в ней не проводятся.
Форматирование функций и операторов
- Перед символами "{" и "}", открывающими и закрывающими функцию/оператор, устанавливаются два пробела от объявления типа функции/оператора.
- Перед каждой строкой, расположенной между символами "{" и "}" функции/оператора, устанавливается три пробела от начала оператора.
- В случае наличия незакрытых "{" или "}" символов в операторе с каким-либо текстом, эти символы и текст разносятся по разным строкам.
- Также выравнивание происходит с учетом содержимого предыдущей строки. Если в предыдущей строке скобка не закрыта или арифметическое выражение не закончено, то текущая строка будет начинаться с первой позиции после "(" или "=" предыдущей строки.
- Условие "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", "private" и "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-го уровня
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-го уровня
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}
|
void myFunction()
{
//--- комментарий 1-го уровня
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-го уровня
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
else
{
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
}
|
class CTradePad
{
private:
int m_rows;
//--- количество строк
int m_columns;
//--- количество столбцов
int m_button_width;
//--- ширина ячейки
};
|
class CTradePad
{
private:
int m_rows;
//--- количество строк
int m_columns;
//--- количество столбцов
int m_button_width;
//--- ширина ячейки
};
|
Вставка комментариев
Комментарий следующего вида вставляется в заголовок файла при его отсутствии:
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright © 2009, CompanyName.|
//| http://www.companyname.net |
//+------------------------------------------------------------------+
|
Комментарии следующего вида вставляется перед функциями, классами, структурами и т.д. при его отсутствии:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
|
В конце файла вставляется отсекающий комментарий следующего вида:
//+------------------------------------------------------------------+
|