• Neovimでmoonbitを書こう


    moonbitもくもく会でNeovimのmoonbit設定を書いたので共有してみる。

    実際の設定はここから見れる。

    moonbit_lsp.lua:

    lsp.lua:

    lsp.toml(vim):

    moonbitのLSPについて

    クローズドソースだけどパッケージは公開されている。 Bunでも動くっぽいので自分はBunでインストールした。

    npm install -g @moonbit/moonbit-lsp

    filetype

    まずmoonbitのファイルを認識させるためにfiletypeを設定する。

    Neovim(lua)だとこんな感じ。

    vim.api.nvim_create_autocmd("BufRead", {
      pattern = "*.mbt",
      command = "set filetype=moonbit",
    })

    VimとNeovim(Vim script)だとこんな感じ。

    autocmd BufRead *.mbt set filetype=moonbit

    lspconfig

    こんな感じで書く。

    普通にmoonbit-lspコマンドを実行しているだけ。

    local util = require 'lspconfig.util'
    
    return {
      default_config = {
        cmd = { 'moonbit-lsp' },
        filetypes = { "moonbit" },
        root_dir = util.root_pattern 'moon.mod.json',
      },
      docs = {
        description = [[
    The moonbit language server.
    ]],
      },
    }
    local server_config = require('lspconfig.configs')
    server_config.moonbit = require "configs/moonbit_lsp"
    
    lspconfig.moonbit.setup({})

    試してはないけど1ファイルでも動かせると思う。

    local server_config = require('lspconfig.configs')
    local util = require 'lspconfig.util'
    server_config.moonbit = {
      default_config = {
        cmd = { 'moonbit-lsp' },
        filetypes = { "moonbit" },
        root_dir = util.root_pattern 'moon.mod.json',
      },
      docs = {
        description = [[
    The moonbit language server.
    ]],
      },
    }
    
    lspconfig.moonbit.setup({})

    quickrun

    tempfile: '%{tempname()}.mbt'はなくても動くかもしれないけど動作確認はしていない。

    let g:quickrun_config = {
    \   "moonbit" : #{
    \     type: 'moonbit/run',
    \   },
    \  'moonbit/run': #{
    \    cmdopt: 'run',
    \    command: 'moon',
    \    tempfile: '%{tempname()}.mbt',
    \  },
    }

    vim-lsp

    ついでにvim-lspでもやってみた。

    こっちはよくサーバー追加してたので簡単だった。

    if executable('moonbit-lsp')
      au User lsp_setup call lsp#register_server({
          \ 'name': 'moonbit',
          \ 'cmd': ["moonbit-lsp" ],
          \ 'allowlist': ['moonbit'],
          \ })
    endif

    今日のもくもく会は設定まわりで終わってしまったので、ちゃんと構文とかも触っていきたい。