1
0
Files
dotfiles/nvim/.config/nvim/lua/plugins/basic/init.lua

144 lines
4.3 KiB
Lua

vim.pack.add({
{ src = "https://github.com/folke/which-key.nvim" },
{ src = "https://github.com/tpope/vim-fugitive" },
{ src = "https://github.com/stevearc/oil.nvim" },
{ src = "https://github.com/echasnovski/mini.icons" },
{ src = "https://github.com/yorickpeterse/nvim-jump" },
{ src = "https://github.com/ibhagwan/fzf-lua" },
})
require("which-key").setup({
preset = "helix",
})
vim.keymap.set("n", "<leader>gs", vim.cmd.Git, { desc = "Fugitive git command" })
require("oil").setup({
default_file_explorer = true,
view_options = {
show_hidden = true,
},
preview = {
max_width = 0.9,
min_width = { 40, 0.4 },
max_height = 0.9,
min_height = { 5, 0.1 },
},
float = {
max_width = math.floor(vim.o.columns * 0.66),
max_height = math.floor(vim.o.lines * 0.66),
},
keymaps = {
["<Esc><Esc>"] = { "actions.close", mode = "n" },
},
})
vim.api.nvim_create_autocmd("User", {
pattern = "OilEnter",
callback = vim.schedule_wrap(function(args)
local oil = require("oil")
if vim.api.nvim_get_current_buf() == args.data.buf and oil.get_current_dir() then
require("oil.actions").preview.callback()
end
end),
})
vim.keymap.set("n", "<leader>pv", function()
if vim.o.lines >= 40 and vim.o.columns >= 120 then
require("oil").open_float()
else
require("oil").open()
end
end, { desc = "Open file explorer" })
vim.keymap.set({ "n", "x", "o" }, "<leader>f", require("jump").start, {})
local function get_project_root()
-- 1. Prioritize Terraform or nvim config project root (keeps search local to the TF module)
local tf_root = vim.fs.root(0, { ".terraform", ".terraform.lock.hcl" })
local nvim_root = vim.fs.root(0, { "nvim-pack-lock.json" })
-- 2. Fallback to Git root (prioritizes the top-level repo for Rust/Go/etc.)
local git_root = vim.fs.root(0, ".git")
-- 3. Fallback to language markers if not in a git repo
local lang_root = vim.fs.root(0, {
"Cargo.toml",
"go.mod",
"pyproject.toml",
"requirements.txt",
"pom.xml",
"build.gradle",
".luarc.json",
})
-- Chain them in the exact priority order you want
return tf_root or nvim_root or git_root or lang_root or vim.fn.getcwd()
end
local function get_submodule_excludes()
local git_root = vim.fs.root(0, ".git")
if not git_root then
return {}
end
local handle =
io.popen("git -C " .. vim.fn.shellescape(git_root) .. " submodule --quiet foreach 'echo $sm_path' 2>/dev/null")
if not handle then
return {}
end
local excludes = {}
for line in handle:lines() do
table.insert(excludes, line)
end
handle:close()
return excludes
end
vim.keymap.set("n", "<leader>pf", function()
local fzf = require("fzf-lua")
local defaults = fzf.defaults.files
local fd_opts = defaults.fd_opts
local rg_opts = defaults.rg_opts
for _, sub in ipairs(get_submodule_excludes()) do
fd_opts = fd_opts .. " --exclude " .. vim.fn.shellescape(sub)
rg_opts = "-g '!" .. sub .. "' " .. rg_opts
end
rg_opts = "--hidden " .. rg_opts
fzf.files({ cwd = get_project_root(), fd_opts = fd_opts, rg_opts = rg_opts })
end, { desc = "Fuzzy find project files" })
vim.keymap.set("n", "<leader>ps", function()
local fzf = require("fzf-lua")
local defaults = fzf.defaults.grep
local rg_opts = defaults.rg_opts
for _, sub in ipairs(get_submodule_excludes()) do
rg_opts = "-g '!" .. sub .. "' " .. rg_opts
end
rg_opts = "--hidden " .. rg_opts
fzf.live_grep({ cwd = get_project_root(), rg_opts = rg_opts })
end, { desc = "Live grep project text" })
vim.keymap.set("n", "<leader><space>", function()
require("fzf-lua").buffers()
end, { desc = "Fuzzy find open files" })
vim.keymap.set("n", "<leader>gf", function()
local excludes = get_submodule_excludes()
local pathspecs = {}
for _, sub in ipairs(excludes) do
table.insert(pathspecs, ":(exclude)" .. sub)
end
require("fzf-lua").git_files({ cmd = "git ls-files --exclude-standard -- . " .. table.concat(pathspecs, " ") })
end, { desc = "Fuzzy find tracked Git files" })
vim.api.nvim_create_autocmd("BufEnter", {
group = vim.api.nvim_create_augroup("AutoChdirProjectRoot", { clear = true }),
callback = function(args)
-- Only change directory for normal files
if vim.bo[args.buf].buftype == "" and vim.api.nvim_buf_get_name(args.buf) ~= "" then
local root = get_project_root()
if root and root ~= vim.fn.getcwd() then
vim.api.nvim_set_current_dir(root)
end
end
end,
})