Pular para o conteúdo

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.

Terminal window
cargo install httui-lsp

Ou pegue um binário pré-buildado de Releases e ponha no seu PATH. Verifique:

Terminal window
httui-lsp --version
:TSInstall httui

Isso puxa tree-sitter-httui e compila o parser no seu install de nvim-treesitter. (Já registrado upstream desde nvim-treesitter v0.x.)

No seu config Neovim, adicione:

-- init.lua
local lspconfig = require("lspconfig")
-- servidor httui-lang
local 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
},
},
},
}
end
lspconfig.httui_lsp.setup({})

(O lspconfig upstream vai eventualmente shippar uma config built-in httui_lsp — até lá o snippet acima é canônico.)

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).

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-sitter
vim.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-*.

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 })

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.

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 } },
})
end
end, { nargs = 1 })

Depois :HttuiEnv staging troca o env pra hover/completion.

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" })
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,
})

Cheque:

:LspLog

Causas comuns: httui-lsp não tá no PATH, raiz do vault não detectada (forneça root_dir explícito).

Garanta que os dois parsers estão instalados:

:TSInstall httui markdown markdown_inline

E :TSPlayground pra confirmar que httui aparece sob fences http/db-*.

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.)