Neovim
Тип файла#
-- init.lua
vim.filetype.add({ extension = { oxl = "oxl" } })Сервер: Neovim 0.11+#
vim.lsp.config("oxl", {
cmd = { "oxl", "lsp" },
filetypes = { "oxl" },
root_markers = { "oxl.toml", ".git" },
init_options = { debounceMs = 150 }, -- необязательно
})
vim.lsp.enable("oxl")Сервер: nvim-lspconfig (Neovim 0.9–0.10)#
В lspconfig нет готового сервера OxL, его регистрируют как пользовательский:
local configs = require("lspconfig.configs")
if not configs.oxl then
configs.oxl = {
default_config = {
cmd = { "oxl", "lsp" },
filetypes = { "oxl" },
root_dir = require("lspconfig.util").root_pattern("oxl.toml", ".git"),
single_file_support = true, -- одиночные .oxl анализируются отдельно
},
}
end
require("lspconfig").oxl.setup({})Горячие клавиши и inlay-подсказки#
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(ev)
local c = vim.lsp.get_client_by_id(ev.data.client_id)
if c and c.name == "oxl" then
vim.lsp.inlay_hint.enable(true, { bufnr = ev.buf }) -- типы, ошибки цепочек, роли шагов
vim.api.nvim_create_autocmd("BufWritePre", { -- форматирование = oxl fmt
buffer = ev.buf, callback = function() vim.lsp.buf.format({ async = false }) end })
end
end,
})Стандартные отображения Neovim 0.10+: K — hover, grn — переименование, gra — быстрые исправления, grr — ссылки,
<C-]> — определение. Категории inlay-подсказок можно отключить в init_options:
init_options = { inlayHints = { callMarkers = false } } (LSP).
Подсветка tree-sitter#
Грамматика лежит в share/oxl/tree-sitter-oxl (в репозитории — tools/tree-sitter-oxl). Исходник парсера src/parser.c в
репозитории не хранится, его создаёт tree-sitter generate:
cd /opt/oxl-1.0.0-beta/share/oxl/tree-sitter-oxl
npm install && npx tree-sitter generate # создаёт src/parser.c-- nvim-treesitter (ветка main): регистрируем парсер
vim.api.nvim_create_autocmd("User", {
pattern = "TSUpdate",
callback = function()
require("nvim-treesitter.parsers").oxl = {
install_info = { path = "/opt/oxl-1.0.0-beta/share/oxl/tree-sitter-oxl", generate = false },
}
end,
})
-- затем: :TSInstall oxl
vim.treesitter.language.register("oxl", "oxl")Запросы подсветки скопируйте в конфигурацию:
mkdir -p ~/.config/nvim/queries/oxl
cp /opt/oxl-1.0.0-beta/share/oxl/tree-sitter-oxl/queries/highlights.scm ~/.config/nvim/queries/oxl/Семантические токены от сервера добавляются поверх (контекстные слова вроде on, durable, within подсвечиваются по смыслу).
Отладка: nvim-dap#
local dap = require("dap")
dap.adapters.oxl = { type = "executable", command = "oxl", args = { "dap" } }
dap.configurations.oxl = {
{
name = "Debug OxL package",
type = "oxl",
request = "launch",
program = "${workspaceFolder}", -- пакет, .oxl-файл или исполняемый файл с отладочной информацией
cwd = "${workspaceFolder}",
stopOnEntry = false,
oxlProfile = "dev",
},
}:lua require("dap").continue() соберёт пакет (oxl build --profile dev --debug-info full) и остановится на точках останова.
Подробности — отладка.