📝

NeoVimでmoonbitの開発環境を整備した

に公開

環境

$ moon version
moon 0.1.20250801 (edae1ae 2025-08-01)
$ nvim --version
NVIM v0.11.3
Build type: Release
LuaJIT 2.1.1748459687

Tree-sitter

NeoVimに組み込みのtree-sitterは標準ではmoonbitの構文をサポートしていない(2025/08/12時点)ので、独自で追加する必要があります。

moonbitから公式のtree-sitter構文が提供されています:
https://github.com/moonbitlang/tree-sitter-moonbit

vim.api.nvim_create_autocmd("User", {
    pattern = "TSUpdate",
    callback = function()
        require("nvim-treesitter.parsers").moonbit = {
            install_info = {
                url = "https://github.com/moonbitlang/tree-sitter-moonbit",
                branch = "main",
                queries = 'queries',
            }
        }
    end
})

参考:

LSP

また、クローズドソースではありますが公式のLanguage Serverも提供されています
https://www.npmjs.com/package/@moonbit/moonbit-lsp

-- Enable moonbit lsp
vim.lsp.config['moonbit-lsp'] = {
    cmd = { 'moonbit-lsp' },
    filetypes = { "moonbit" },
    root_markers = { { "moon.mod.json" }, ".git" }
}
vim.lsp.enable('moonbit-lsp')

LSPが有効になると、定義へのジャンプや補完候補なども取得出来るようになります。

errorformat

moonbitのエラーメッセージは視覚的にわかりやすい形式でエラーを報告してくれるのですが、:makeなどでビルドをした場合にエラーメッセージをvimが標準では解釈することができません。

そこで、errorformatを指定します(暫定で定義しています、もっとよい定義があったら教えてください)

moonbitのエラー例

-- moonbit 用 errorformat(quickfix用)
local moonbit_efm = table.concat({
  "%-Gfailed:%#",
  "%-Gerror:%#",
  "%-G%.%#╭%#",
  "%-G%.%#│%#",
  "%-G%.%#╰%#",
  "%-G%.%#───%#",
  "%-GFinished%.%#",
  "%-Gmoon:%#",
  "%EError:%m",
  "%C%\\[ %f:%l:%c %\\]%.%#",
  "%C\\s%#╰── %m",
  "%Z%.%#───╯%#",
  "%WWarning:%m",
  "%C%\\[ %f:%l:%c %\\]%.%#",
  "%C\\s%#╰── %m",
  "%Z%.%#───╯%#",
}, ",")

-- FileTypeがmoonbitのときだけ適用
vim.api.nvim_create_autocmd("FileType", {
  pattern = "moonbit",
  callback = function()
    vim.opt_local.errorformat = moonbit_efm
  end,
})

Discussion