OxL Справочник OxL
РусскийEnglish

Neovim

Тип файла#

lua
-- init.lua
vim.filetype.add({ extension = { oxl = "oxl" } })

Сервер: Neovim 0.11+#

lua
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, его регистрируют как пользовательский:

lua
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-подсказки#

lua
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:

sh
cd /opt/oxl-1.0.0-beta/share/oxl/tree-sitter-oxl
npm install && npx tree-sitter generate          # создаёт src/parser.c
lua
-- 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")

Запросы подсветки скопируйте в конфигурацию:

sh
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#

lua
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) и остановится на точках останова. Подробности — отладка.

OxL 1.0.0-beta · Версия документации 1.0.0-beta© OxwaldLink · сгенерировано из Стандарта, исходников std и руководства