diff --git a/after/ftplugin/lua.lua b/after/ftplugin/lua.lua new file mode 100644 index 0000000..01dc31b --- /dev/null +++ b/after/ftplugin/lua.lua @@ -0,0 +1,4 @@ +-- Run selection (simpler, but requires visual mode to be active) +vim.keymap.set('v', 'x', ':lua =getline("\'<", "\'>")', { desc = 'execute selection' }) +-- Run whole buffer +vim.keymap.set('n', 'xx', ':luafile %', { desc = 'execute buffer' }) diff --git a/lua/plugins/local.lua b/lua/plugins/local.lua new file mode 100644 index 0000000..585749a --- /dev/null +++ b/lua/plugins/local.lua @@ -0,0 +1,9 @@ +return { + dir = '~/.config/nvim/lua/plugins/local/rooter.lua', + name = 'rooter', + config = function() + require('rooter').setup { + greeting = 'Loaded via lazy.nvim!', + } + end, +} diff --git a/lua/plugins/local/rooter.lua b/lua/plugins/local/rooter.lua new file mode 100644 index 0000000..6b20b16 --- /dev/null +++ b/lua/plugins/local/rooter.lua @@ -0,0 +1,93 @@ +local log_level = vim.log.levels.ERROR + +local function log(msg, level) + if level == vim.log.levels.ERROR then + vim.notify(msg, level) + else + print(msg) + end +end + +local function get_root() + local clients = vim.lsp.get_clients { bufnr = 0 } + if #clients == 0 then return vim.fs.root(0, { '.git' }) end + + -- Define priority order (higher priority first) + local priority_order = { + 'vtsls', + 'eslint', -- formatting/linting servers last + } + + -- Find highest priority client + for _, priority_name in ipairs(priority_order) do + for _, client in ipairs(clients) do + if client.name == priority_name then return client.config.root_dir end + end + end + + -- Fallback to first client with a root_dir + for _, client in ipairs(clients) do + if client.config.root_dir then return client.config.root_dir end + end + + local git_root = vim.fs.root(0, { '.git' }) + if git_root then return git_root end + + log 'No LSP client found with root_dir' +end + +local function debounce(fn, ms) + local timer = nil + return function(...) + local args = { ... } + if timer then + timer:stop() + timer:close() + end + timer = vim.uv.new_timer() + timer:start(ms, 0, function() + vim.schedule(function() fn(unpack(args)) end) + timer:close() + timer = nil + end) + end +end + +local function on_lsp_attach() + local root = get_root() + if root then + vim.notify('root_dir detected: ' .. root, log_level) + vim.cmd('lcd ' .. root) + else + vim.notify('No project root found', log_level) + end +end + +local debounced_on_attacched = debounce(function() + on_lsp_attach() + vim.notify 'on_attach_done' +end, 1000) + +local M = {} + +-- Plugin configuration +M.config = { + greeting = 'Hello from rooter!', + some = 'option', +} + +-- Main plugin function +function M.setup(opts) + M.config = vim.tbl_deep_extend('force', M.config, opts or {}) + + vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('my-rooter', { clear = true }), + callback = debounced_on_attacched, + }) + + -- Create user commands + -- vim.api.nvim_create_user_command('MyPluginGreet', function() print(M.config.greeting) end, {}) + -- vim.api.nvim_create_user_command('MyPluginStatus', function() print('Plugin loaded with config:', vim.inspect(M.config)) end, {}) +end + +return M