Neovim
Setup Neovim usa dois plugins upstream que você provavelmente já tem: nvim-treesitter pra grammar, nvim-lspconfig pro servidor LSP. httui-lang pluga nos dois.
Instalação
Seção intitulada “Instalação”1. O binário do servidor LSP
Seção intitulada “1. O binário do servidor LSP”cargo install httui-lspOu pegue um binário pré-buildado de
Releases e
ponha no seu PATH. Verifique:
httui-lsp --version2. O parser tree-sitter
Seção intitulada “2. O parser tree-sitter”:TSInstall httuiIsso puxa tree-sitter-httui e compila o parser no seu install
de nvim-treesitter. (Já registrado upstream desde
nvim-treesitter v0.x.)
3. A entrada lspconfig
Seção intitulada “3. A entrada lspconfig”No seu config Neovim, adicione:
-- init.lualocal lspconfig = require("lspconfig")
-- servidor httui-langlocal configs = require("lspconfig.configs")if not configs.httui_lsp then configs.httui_lsp = { default_config = { cmd = { "httui-lsp" }, filetypes = { "httui", "markdown" }, root_dir = function(fname) return vim.fs.find( { ".httui", "runbooks", "connections.toml", "envs" }, { upward = true, path = fname } )[1] and vim.fs.dirname(vim.fs.find( { ".httui", "runbooks", "connections.toml", "envs" }, { upward = true, path = fname } )[1]) end, settings = { httui = { env = "staging", -- ou leia dinamicamente }, }, }, }endlspconfig.httui_lsp.setup({})(O lspconfig upstream vai eventualmente shippar uma config
built-in httui_lsp — até lá o snippet acima é canônico.)
Associação de filetype
Seção intitulada “Associação de filetype”Diga pro Neovim reconhecer .httui como filetype próprio:
vim.filetype.add({ extension = { httui = "httui", },})O LSP attacha tanto no filetype httui quanto no markdown (pra
rodar dentro de blocos fenced .md).
Integração tree-sitter
Seção intitulada “Integração tree-sitter”Habilite highlight + indent + folds via nvim-treesitter:
require("nvim-treesitter.configs").setup({ ensure_installed = { "httui", "markdown", "markdown_inline" }, highlight = { enable = true }, indent = { enable = true }, fold = { enable = true },})
-- Opcional: usa folds tree-sittervim.opt.foldmethod = "expr"vim.opt.foldexpr = "nvim_treesitter#foldexpr()"Pra injeção markdown (httui dentro de fences .md), isso é
tratado automaticamente pelos parsers — o parser markdown sabe
delegar pro httui em regiões fenced http/db-*.
Key bindings
Seção intitulada “Key bindings”Bindings LSP padrão funcionam — defina uma vez no seu
on_attach:
local on_attach = function(client, bufnr) local opts = { buffer = bufnr } vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) vim.keymap.set("n", "gr", vim.lsp.buf.references, opts) vim.keymap.set("n", "<F2>", vim.lsp.buf.rename, opts) vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts) vim.keymap.set("n", "<leader>f", function() vim.lsp.buf.format({ async = true }) end, opts)end
lspconfig.httui_lsp.setup({ on_attach = on_attach })Completion
Seção intitulada “Completion”Pareie com nvim-cmp ou seu plugin de completion preferido. O
httui-lsp serve completions via LSP padrão, sem setup custom além
de ter o source LSP habilitado no cmp:
require("cmp").setup({ sources = { { name = "nvim_lsp" }, -- seus outros },})Digitar {{ dispara o popup de completion com todos os aliases
acima do cursor + env vars do env ativo.
Ambiente ativo
Seção intitulada “Ambiente ativo”O LSP pega o env ativo do user.toml na raiz do vault. Pra
trocar de dentro do Neovim, use um comando custom:
vim.api.nvim_create_user_command("HttuiEnv", function(opts) local clients = vim.lsp.get_active_clients({ name = "httui_lsp" }) for _, c in ipairs(clients) do c.notify("workspace/didChangeConfiguration", { settings = { httui = { env = opts.args } }, }) endend, { nargs = 1 })Depois :HttuiEnv staging troca o env pra hover/completion.
Rodar blocos do Neovim
Seção intitulada “Rodar blocos do Neovim”O LSP pode despachar uma mensagem “roda esse bloco” pro desktop httui se ele tá rodando no mesmo vault. Binde via code action ou comando custom:
vim.keymap.set("n", "<leader>br", function() vim.lsp.buf.execute_command({ command = "httui.runBlock", arguments = { uri = vim.uri_from_bufnr(0), position = vim.api.nvim_win_get_cursor(0), }, })end, { desc = "Roda bloco httui sob o cursor" })Se o desktop não tá rodando, o comando é no-op (LSP retorna “no runtime”).
Pra execução headless, dê shell pra httui-tui run:
vim.keymap.set("n", "<leader>brt", function() local file = vim.api.nvim_buf_get_name(0) vim.cmd("split | terminal httui-tui run " .. file .. " --env staging")end, { desc = "Roda runbook httui na TUI" })Opções específicas de filetype
Seção intitulada “Opções específicas de filetype”vim.api.nvim_create_autocmd("FileType", { pattern = "httui", callback = function() vim.opt_local.tabstop = 2 vim.opt_local.shiftwidth = 2 vim.opt_local.expandtab = true vim.opt_local.commentstring = "# %s" end,})Troubleshooting
Seção intitulada “Troubleshooting”:LspInfo diz que httui_lsp não tá attached
Seção intitulada “:LspInfo diz que httui_lsp não tá attached”Cheque:
:LspLogCausas comuns: httui-lsp não tá no PATH, raiz do vault não
detectada (forneça root_dir explícito).
Sem highlight dentro de fences markdown
Seção intitulada “Sem highlight dentro de fences markdown”Garanta que os dois parsers estão instalados:
:TSInstall httui markdown markdown_inlineE :TSPlayground pra confirmar que httui aparece sob fences
http/db-*.
LSP inicia mas sem completions
Seção intitulada “LSP inicia mas sem completions”Provavelmente config de env faltando. Adicione no seu setup:
settings = { httui = { env = "local" } }(Até um envs/local.toml vazio faz o LSP feliz se local é
referenciado.)
Relacionado
Seção intitulada “Relacionado”- Capacidades do LSP — o que o servidor dá
- Tree-sitter — tipos de node + queries
- Setup VS Code — editor irmão