nvim/lua/plugins/hugo.lua
2025-03-20 14:15:45 -03:00

103 lines
2.4 KiB
Lua

local M = {
"phelipetls/vim-hugo",
}
M.config = function()
local function is_hugo_project()
local config_files = { "hugo.toml", "hugo.yaml", "hugo.json" }
for _, file in ipairs(config_files) do
if vim.fn.glob(file) ~= "" then
return true
end
end
return false
end
local function get_archetypes()
local kinds = {}
local archetype_paths = {
"archetypes/",
"themes/*/archetypes/",
}
for _, path in ipairs(archetype_paths) do
local files = vim.fn.glob(path .. "*.md", false, true)
for _, file in ipairs(files) do
local kind = vim.fn.fnamemodify(file, ":t:r")
table.insert(kinds, kind)
end
end
return kinds
end
local function get_content_completions(lead)
local search_path = lead:match("^content/") and lead or "content/" .. lead
local matches = vim.fn.glob("content/**/*", false, true)
local completions = {}
for _, match in ipairs(matches) do
local display = match:gsub("^content/", "")
if match:match("^" .. vim.pesc(search_path)) then
if vim.fn.isdirectory(match) == 2 then
display = display .. "/"
end
table.insert(completions, display)
end
end
return completions
end
local function run_hugo_command(args)
local cmd = "hugo " .. table.concat(args, " ")
vim.cmd("!" .. cmd)
end
local function hugo_complete_arglead(lead, cmd_line, _)
cmd_line = cmd_line:gsub("%s+", " ")
local parts = vim.split(cmd_line, " ")
local basic_subcommands = {
"server",
"new",
"help",
"version",
"config",
}
if #parts <= 2 then
return vim.tbl_filter(function(sub)
return sub:match("^" .. vim.pesc(lead or ""))
end, basic_subcommands)
end
if parts[2] == "new" then
if #parts == 3 then
return { "content" }
end
if parts[3] == "content" then
-- If the previous part is -k or --kind
if parts[#parts - 1] == "-k" or parts[#parts - 1] == "--kind" then
return get_archetypes()
end
return get_content_completions(lead)
end
end
return {}
end
if is_hugo_project() then
vim.api.nvim_create_user_command("Hugo", function(opts)
run_hugo_command(opts.fargs)
end, {
nargs = "*",
complete = hugo_complete_arglead,
})
end
end
return M