Why MQL4 + nvim ?
nvim 上で MT4 の EA を自作するための MQL4 開発環境を整える。
Prepare the MQL4 editing environment to create your own MT4 EA using nvim.
何しろ MQL4 + nvim に関する情報が少ないので大変。みんな MetaEditor 上でコーディングしてるのだろうか? あれは使いやすいとは言えない。nvim でコーディングしたい。
After all, it is difficult because there is little information about MQL4 + nvim. I wonder if everyone is coding on MetaEditor? I can’t say that it’s easy to use. I want to code with nvim.
Syntax highlight with tree-sitter ?
tree-sitter は MQL4 に非対応のようだ。代替案を探すと、vim-mql4 や mql4-dev が見つかった。
It seems that tree-sitter is not compatible with MQL4. I searched for alternatives and found vim-mql4 and mql4-dev.
tree-sitter ほどカラフルにはならないが、一色よりはだいぶ可読性が高まる。
It’s not as colorful as tree-sitter, but it’s much more readable than one color.
Plugin
MQL4 のためのプラグインとしては、mql4-dev のほぼ一択。シンタックスハイライト、コンパイル、スニペット、などができるらしい。
As a plugin for MQL4, mql4-dev is almost the only choice. It seems to be able to do syntax highlighting, compilation, snippets, etc.
推奨そのまま As recommended
オススメではないが、仮に、mql4-dev に書いてあるとおりにすると下記のようになる。Packer 使用。
Although it is not recommended, if you follow the instructions in mql4-dev, it will look like the following. (Using Packer):
-- MQL4
-- use { "vobornik/vim-mql4" } -- Syntax Highlighting
use { "pnetherwood/mql4-dev" } -- Syntax, Snippets, Compiling, and so on for MQL4 (including vobornik/vim-mql4)
use { "tpope/vim-dispatch" } -- Async compiling for mql4-dev
use { "vim-scripts/OmniCppComplete" } -- Completion for mql4-dev
- vim-mql4
-
シンタックスハイライトをしてくれる。これだけでもすごくコーディング作業がしやすくなる。ただし、mql4-dev に含まれているようなので、インストール不要。
It does syntax highlighting. This alone will make your coding work much easier. However, it seems to be included in mql4-dev, so there is no need to install it. - mql4-dev
-
シンタックスハイライト、スニペット集(snipMate形式?)、コンパイルなどを行う。vim-mql4 が含まれている。
Syntax highlighting, snippet collection (snipMate format?), compilation, etc. It contains vim-mql4. - vim-dispatch
-
mql4-dev の非同期コンパイルで使用するプラグインらしい。まだ使っていない。古い。
It seems to be a plugin used for asynchronous compilation of mql4-dev. I don’t use it. - OmniCppComplete
-
mql4-dev の補完候補表示に使用するプラグインらしい。nvim-cmp で代用できる。
It seems to be a plugin used to display completion candidates for mql4-dev. You can use nvim-cmp instead.
修正版 Latest & modified for me.
先程のではだいぶ古い。近年のプラグインに合わせるとこういう感じ。
The previous one is quite old. It looks like this when matched with recent plug-ins.
use { "nvim-cmp" } -- Completion
use { "luasnip" } -- Snippets
-- MQL4
use { "pnetherwood/mql4-dev" } -- Syntax, Snippets, Compiling, and so on for MQL4 (including vobornik/vim-mql4)
nvim-cmp と luasnip の設定は、after/plugins/ フォルダの nvim-cmp.lua と luasnip.lua で行う。ここに書くこと!
Settings
あれをこうしてどうして。luasnip で読み込むようにして。
How to use & convert snippets
Where is the snippets file ?
mql4-dev の snippet のオリジナルは以下の場所にある。
The original mql4-dev snippet is available at the following location.
~/.local/share/nvim/site/pack/packer/start/mql4-dev/UltiSnips/mql4.snippets
mkdir ~/.config/nvim/snippets
cp ~/.local/share/nvim/site/pack/packer/start/mql4-dev/UltiSnips/mql4.snippets ~/.config/nvim/snippets/
~/.config/nvim/snippets を luasnip で読み込ませるように設定しておくこと。
Correct the loading error
さてこの mql4-dev が用意してくれる下記のような snippets は、luasnip では読み込みエラーになる。
Now, the following snippets prepared by mql4-dev will cause a loading error in luasnip.
// Wrong
snippet Print "Displays a message in the log"
Print(${1:argument}, ${2:...});
endsnippet
snippet ではじまり、中身はインデントし、endsnippet を使用しない、以下のような書き方が正しい。
The correct way to write it is to start with “snippet”, indent the contents, and not use “endsnippet”.
// Correct
snippet Print "Displays a message in the log"
Print(${1:argument}, ${2:...});
この変換を行ってくれるサービスやプラグインは見当たらなかったので、bash スクリプトを組んだ。
I couldn’t find any services or plugins that would do this conversion, so I wrote a bash script.
#!/bin/bash
# 入力ファイルと出力ファイルのパス
input_file="./mql4.snippets"
output_file="${input_file%.snippets}-converted.snippets"
# スニペットの変換を開始
{
in_snippet=false
while IFS= read -r line || [ -n "$line" ]; do
if [[ $line == snippet* ]]; then
in_snippet=true
echo "$line" # スニペット開始行を出力
elif [[ $line == endsnippet ]]; then
in_snippet=false # スニペット終了行を無視
elif $in_snippet; then
echo " $line" # スニペット内の行をインデント
else
echo "$line" # スニペット外の行をそのまま出力
fi
done <"$input_file"
} >"$output_file"
# 完了メッセージ
echo "Converted file saved to $output_file"
変換を実行する。
Execute conversion.
// 実行権限を付与 - Add execute permission
chmod +x convert_snipmate.sh
// 変換実行 - Execute conversion
bash ./convert_snipmate.sh
// 元ファイル名を変更 - Change original filename
mv mql4.snippets mql4.snippets.org
// 変換されたファイル名を正しく直す - Change converted filename (Must for reading by nvim-cmp)
mv mql4-converted.snippets mql4.snippets
以上で、変換された mql4-converted.snippets が作成される。
オリジナルファイルをリネームし、変換後のファイル名を mql4.snippets に直しておくこと。そうしないと luasnip に読み込まれない。
The converted mql4-converted.snippets is now created.
Rename the original file and change the converted file name to mql4.snippets. Otherwise it will not be loaded by luasnip.
Done !
以上で、mql4 ファイルを開くと luasnip がスニペットを補完してくれるはずだ。
Now, when you open the mql4 file, luasnip should complete the snippet.
Compiling
macOS 上の WineSkin で動いている MT4 なので、MetaEditor の Windows 用コマンドを走らせるのは少し面倒そうだ。これができれば便利だろうが、まだやってない。
Since MT4 runs on WineSkin on macOS, running MetaEditor’s Windows commands seems a bit troublesome. It would be convenient if I could do this, but I haven’t done it yet.
コメント
コメント一覧 (2件)
Care to share setting of your lsp? clangd?
i have a lot trouble with the lsp. ( lsp config )
Hum, sorry, I already moved for MT5/MQL5 now.
So I don’t remember so much about mql4.
Looking back on my memory, I read *.mq4 & *.mqh files as ‘c’ language in somehow.
Maybe using ‘~/.config/nvim/filetype/mq4.vim’ or so at that time.
Now, I let my nvim to read mq5 or mqh as c++ filetype.
It’s just for Treesitter colorings as c++.
But, like you know, LSP does not work.
this is my ~/.confi/nvim/lua/core/filetype.lua
This just changes the filetype by ‘// mql4’ or ‘//mql5’ in the first line of each file.
mql4 as c, mql5 as c++.
But, actually the LSP does not work. So I’m writing codes without LSP.
Since the syntax is slightly different from original c or c++, so we need to wait for the comming of the TreeSitter rules or nvim plugin for mql4 or mql5.
“`
— Settings for each filetype
— mq4, mq5, mqh
vim.filetype.add({
extension = {
mq4 = ‘c’, — MQL4ファイルはC言語として扱う
mq5 = ‘cpp’, — MQL5ファイルはC++言語として扱う
mqh = ‘cpp’, — 共通ヘッダーファイルはデフォルトでC++として扱う
},
})
— mqh ファイルの先頭行に基づいて filetype を設定する関数
— 先頭行に ‘// mql4’ の記載あり … c 扱い
— 先頭行に ‘// mql5’ の記載あり … cpp 扱い
local function set_mqh_filetype()
— ファイルの先頭行を取得
local first_line = vim.fn.getline(1)
— コメントでファイルタイプを判定
if first_line:match(‘^// mql4’) then
vim.bo.filetype = ‘c’
elseif first_line:match(‘^// mql5’) then
vim.bo.filetype = ‘cpp’
else
— デフォルトで c とする(必要に応じて変更)
vim.bo.filetype = ‘c’
end
end
— ファイルを開いた時や保存した時に filetype を自動的に設定する
vim.api.nvim_create_autocmd({ ‘BufReadPost’, ‘BufWritePost’ }, {
pattern = ‘*.mqh’,
callback = function() set_mqh_filetype() end,
})
“`
I hope this information helps you somehow.