neovim-config/lua/snippets.lua

67 lines
1.7 KiB
Lua

local ls = require('luasnip')
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
local f = ls.function_node
-- Function to find the project root by looking for .csproj file
local function find_project_root(filepath)
local dir = vim.fn.fnamemodify(filepath, ':h')
while dir ~= '/' do
local files = vim.fn.glob(dir .. '/*.csproj', false, true)
if #files > 0 then
return dir
end
dir = vim.fn.fnamemodify(dir, ':h')
end
return nil
end
-- Function to get namespace from file path
local function get_namespace()
local filepath = vim.fn.expand('%:p')
local project_root = find_project_root(filepath)
if not project_root then
return 'YourNamespace'
end
local relative_path = filepath:sub(#project_root + 2) -- +2 to remove leading /
local dir_path = vim.fn.fnamemodify(relative_path, ':h')
if dir_path == '.' or dir_path == '' then
-- File is in project root
local project_name = vim.fn.fnamemodify(vim.fn.glob(project_root .. '/*.csproj'), ':t:r')
return project_name
end
-- Convert directory path to namespace (replace / with .)
local namespace = dir_path:gsub('/', '.')
-- Get project name and prepend it
local project_name = vim.fn.fnamemodify(vim.fn.glob(project_root .. '/*.csproj'), ':t:r')
if project_name and project_name ~= '' then
return project_name .. '.' .. namespace
end
return namespace
end
-- Function to get class name from filename
local function get_classname()
return vim.fn.expand('%:t:r')
end
-- C# class snippet
ls.add_snippets('cs', {
s('csc', {
t('namespace '),
f(function() return get_namespace() end),
t({ ';', '', 'public class ' }),
f(function() return get_classname() end),
t({ '', '{', '\t' }),
i(0),
t({ '', '}' }),
}),
})