Vim в качестве ide для mql

 

В общем, захотелось отказаться от metaeditor'a. Получилось весьма годно, хочу поделится.

Требования: 1. ОС - linux (для винды можно, но это не ко мне); 2 - установленная dos2unix утилита; 3 - установленный clangd(LSP сервер); 4 - пакетный менеджер vim-plug для вима https://github.com/junegunn/vim-plug. 5 - директория терминала "~/.wine/drive_c/Program Files/MetaTrader 5"; 6 - я юзаю консольный вим, как там с гуём будет - не проверял.

В прицепе необходимые файлы. Инструкция:

1. Кидаем в ~ .vimrc (ну или скопировать в свой). Запустить vim, выполнить :PlugInstall

2. Перезапустить vim, выполнить :CocConfig, скопировать туда

{
    "signature.enable": true,
    "signature.target": "float",
    "signature.maxWindowHeight": 100,

    "languageserver": {
        "clangd": {
            "command": "clangd",
            "filetypes": [
                "c",
                "cpp",
                "objc",
                "objcpp"
            ],
            "rootPatterns": [
                ".clangd",
                "compile_flags.txt",
                "compile_commands.json",
                ".vim/",
                ".git/",
                ".hg/"
            ],
            "initializationOptions": {
                "cache": {
                    "directory": "/tmp/clangd"
                }
            }
        }
    }
}

3. Скопировать coc.nvim_vimrc  в ~/.vim/plugged/

4. Скопировать в один из PATH путей compile_mql (при необходимости смените владельца/группу, дайте права на выполнение).

5. mql компилятор отказывается компилировать, когда в путях пробелы, создаём ссылку

ln -s "${HOME}/.wine/drive_c/Program Files/MetaTrader 5/MQL5" "${HOME}/.wine/"

6. В ~/.wine/MQL5/Include создаём compile_flags.txt с содержимым (вместо YOUR_HOME_DIR вписать свою домашнюю директорию, ${HOME} не работает):

-xc++-header
-IYOUR_HOME_DIR/.wine/MQL5/Include
-DVIM

7. Кидаем в поддиректорию Include (у меня это Include/myincl) vim.mqh (он должен быть включён в каждый скрипт/эксперт).

8. В директории со скриптами/экспертами создаём compile_flags.txt с содержимым:

-xc++
-IYOUR_HOME_DIR/.wine/MQL5/Include
-DVIM


Вроде всё. Теперь можно вообще не касаться метаэдитора, создали файл, редактируем в виме, компилируем там же. Нужно отметить:

1. Это значительно более совершенный инструмент, чем автокомплит и смежное в метаэдиторе, clangd не запутать ни хитрой макроснёй, ни шаблонами (эдитор на шаблонах не работает даже в простых случаях). Ну и сам вим шустрее (по крайней мере эдитора через вайн).

2. Компилируем в виме через F7, просмотр результатов через :copen или :clist/:cnext/... с возможностью прыгнуть на ошибку/предупреждение, т.е. всё серьезно.

3. Сочетания по всяким кодерским фишкам (перейти к определению/...) смотреть в coc.nvim_vimrc, основное:

gd - defenition
gy - type defenition
gy - implementation
gr - reference
K  - show documentation
[g - diagnost previous
]g - diagnost next
<leadir>rn - rename    (у меня leadir - ,)
<space>a - diagnost list
<space>o - outline list
<space>s - symbol list

4. При передаче массивов в функции заменяем & на ref, иначе не будет показывать sinature help для этой функции (void examp_fn(int ref ar[]). На жалобы clang'a на на точки при разыменовывании указателей забиваем, не критично.

5. В каждый заголовочный файл делаем include guard, вроде этого:

#ifndef NEW_FILE_MQH
#define NEW_FILE_MQH
...// кодим здесь
#endif //NEW_FILE_MQH

6. clang'у не нравится #propert strict

7. Каждый пост с новой версией файлов будет обромлён хештегом #vim_as_mql_ide_X для удобного поиска среди возможного флуда, где X - версия.

8. vim.mqh содержит декларации функций/констант. Естественно, я не скопипастил всё, будет неплохо если кто-то подключится к процессу и накидает туда деклараций (но не менять форматирование существующий - отступы, комменты; для возможности лeгко сделать diff). Обновлённый vim.mqh можно выслать мне, я его солью в один и выложу.

9. В качестве шпаргалки для вима можно взять https://www.linux.org.ru/forum/general/15373588


#vim_as_mql_ide_0

Файлы:
 

Новый релиз, на мой взгляд, плюшки интереснее, чем в официальных релизах ))

1. Прикрутил препроцессор от clang'а к мкл. Теперь можно реализовать любые препроцессорные трюки, даже такое http://jhnet.co.uk/articles/cpp_magic. Весь процесс выглядит так: F7->clang препроцессор->mql препроцессор/компилятор. Для передачи мкл компилятору мкл специфичных конструкций (ну дабы не бесить и путать clang всяким мусором, ему не очень нравится) делать так

#ifndef VIM
input int            MA_Period=13; // Ну или INPUT макрос
input int            MA_Shift=0;
#else
int            MA_Period=13;
int            MA_Shift=0;
#endif

#ifndef VIM
mqlcpp_#import "user32.dll"
#endif
   int GetCursorPos(int ref point[]);
   int GetWindowRect(HWND hWnd, int ref rect[]);
#ifndef VIM
mqlcpp_#import
#endif

перед директивами мкл препроцессору добавляем mqlcpp__, иначе её начнёт обрабатывать первый препроцессор. Заголовки из стд библиотеки включать следующим образом

#ifndef VIM
mqlcpp_#include <Arrays/ArrayObj.mqh>
#endif

Почему? В них нет include guard'ов. Если будут (три дополнительных строки в каждый файл), то можно включать обычным образом.

2. Разыменовывать указатели теперь можно нормальным способом, а не так, как захотели в МК

this->member;
pntr->field;

3. С передачей массивов в функции аналогично - можно теперь делать нормальным общепринятым способом

void fn(int ar[]);   // в топку &

4. Исходники с кодировкой utf-16 не подойдут (будет таковой если в исходниках есть кириллица). Но перекодировать в utf-8 просто

$ dos2unix file1 ...


Синтаксис получился плюсовым, можно сказать. Удобно для портирования в/из мкл + значит хорошая поддержка со стороны clang (автокомплит и т.п.).


ЗЫ: т.к. поиск на форуме вообще огонь (поиск по форуму через поисковик тоже не айс), буду делать ссылку на последнюю версию на главной странице своего профиля.


#vim_as_mql_ide_1

Файлы:
 

Плюсану. Заодно и подержу тему наверху, может разрабы почитают.

Смысл в том, что редактор у Вас реально убогий (подсветка всех вхождений переменной, автозамена имени переменной/функции во всем проекте, поиск всех ссылок на переменную и тд.., в общем смотрим любую "взрослую" IDE и сравниваем). Препроцессор вроде и есть, а по факту - обрубок. По шаблонам, то же самое: non-type template-parameter отсутствует, возможность специализации шаблонов отсутствует. Может как-нибудь и развитие в этом направлении запланируете?

 
Vladimir Simakov:

Плюсану. Заодно и подержу тему наверху, может разрабы почитают.

Смысл в том, что редактор у Вас реально убогий (подсветка всех вхождений переменной, автозамена имени переменной/функции во всем проекте, поиск всех ссылок на переменную и тд.., в общем смотрим любую "взрослую" IDE и сравниваем). Препроцессор вроде и есть, а по факту - обрубок. По шаблонам, то же самое: non-type template-parameter отсутствует, возможность специализации шаблонов отсутствует. Может как-нибудь и развитие в этом направлении запланируете?

Перед тем как называть убогим, будьте добры написать весь список функционала редактора.

Заодно и увидите, что ваши заявления или устарели или совершенно ошибочны.

 
Renat Fatkhullin:

Перед тем как называть убогим, будьте добры написать весь список функционала редактора.

Заодно и увидите, что ваши заявления или устарели или совершенно ошибочны.

Редактор:


Подсветка всех вхождений переменной (может кто подскажет как это в редакторе сделать?):

Авто замена имени переменной/функции - я про это:


Поиск всех ссылок на переменную - мне не надо только этот файл или вообще все файлы каталога, мне надо показать все ссылки (аналог Shift+F12 в MVS)

Это только по моим замечаниям.

По препроцессору и шаблонам - это из другой оперы, но ведь я прав (специализацию шаблона вечером еще раз проверю)?
 
В Метаэдитор нужно обязательно добавить ‘Dark theme’ (и вообще настройку цветов) и подключение к github.
 
Renat Fatkhullin:

Перед тем как называть убогим, будьте добры написать весь список функционала редактора.

Заодно и увидите, что ваши заявления или устарели или совершенно ошибочны.

Вы серьёзно? Да элементарный шаблон для вашего редактора непосилен

template <typename T>
class Qwerty
{
public:
   void func1() {}
};
...
Qwerty<int> qwerty;
qwerty.

И неужели за столько лет нельзя было добавить цветовых схем (интересует темная, терпеть не могу светлую)? А макросы в виме, жить без них не могу, ...

Но я не здесь не за развите редактора ратую, вокруг столько готовых, зачем переизобретать.

 
Уж сколько кода я писал в МЕ за 6 лет непрерывного программирования в нем! Мне он всегда нравился. Хотя, пробовал и другие IDE. Там ничего лишнего. А мне и подавно было нужно очень мало. Поэтому, раздутые претензии не поддерживаю. Это все похоже на критику мяча командой футболистов.)) (типа не тот цвет, прыгает грустно...)
 

Ребята, не надо на метаэдитор напирать, реально.

Лично мне нравится.

Ну и этот вариант тоже прикольный.

 
Vladimir Simakov:

Редактор:


Подсветка всех вхождений переменной (может кто подскажет как это в редакторе сделать?):

Авто замена имени переменной/функции - я про это:


Поиск всех ссылок на переменную - мне не надо только этот файл или вообще все файлы каталога, мне надо показать все ссылки (аналог Shift+F12 в MVS)

Это только по моим замечаниям.

По препроцессору и шаблонам - это из другой оперы, но ведь я прав (специализацию шаблона вечером еще раз проверю)?

А вызвать "это" горячими клавишами можно??? Думаю что это ctrl+h если это вообще есть. А нажать ctrl+h в редакторе mql мама не разрешает? Прежде чем предъявлять претензии попробуйте варианты не описанные в справке.

Вот с подсветкой всех переменных, согласен. Не помешает, но и без этого не смертельно. Также как и без сворачивания части кода не страдаю.

Подскажу ещё маленькую примочку: клавиши мыши "Вперёд\Назад" работают в редакторе mql как и в других приложениях.

 
Alexey Viktorov:

А вызвать "это" горячими клавишами можно??? Думаю что это ctrl+h если это вообще есть. А нажать ctrl+h в редакторе mql мама не разрешает? Прежде чем предъявлять претензии попробуйте варианты не описанные в справке.

Вот с подсветкой всех переменных, согласен. Не помешает, но и без этого не смертельно. Также как и без сворачивания части кода не страдаю.

Подскажу ещё маленькую примочку: клавиши мыши "Вперёд\Назад" работают в редакторе mql как и в других приложениях.

Только в редакторе он поменяет только текущий файл, а я говорил про весь проект. Прикинь, метод ты неудачно назвал, а он в 90% файлов твоей библиотеки вызывается и не по одному разу, а файлов уже на десятки счет пошел. Так-то да, 5-10 мин. работы по переименованию во всех местах, но когда в другом IDE ты делаешь это походя...