Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion neovim/lua/plugins/fzf.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ return {
{
"ibhagwan/fzf-lua",
dependencies = { "echasnovski/mini.nvim", version = "*" },
event = "VeryLazy",
keys = {
{ "gd", "<cmd>FzfLua lsp_definitions<CR>", desc = "Go to definition" },
{
"gsd",
"<cmd>vsplit | FzfLua lsp_definitions<CR>",
desc = "Go to definition in a split",
},
{ "gy", "<cmd>FzfLua lsp_typedefs<CR>", desc = "Go to type definition" },
{ "grt", "<cmd>FzfLua lsp_typedefs<CR>", desc = "Go to type definition" },
{ "grr", "<cmd>FzfLua lsp_references<CR>", desc = "Go to references" },
{
"gri",
Expand Down
1 change: 1 addition & 0 deletions neovim/lua/plugins/mini.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ return {
event = "UIEnter",
opts = {
cmdline = {
autocorrect = { enable = false },
autopeek = { enable = false },
},
completion = {},
Expand Down
73 changes: 73 additions & 0 deletions neovim/plugin/fuzzy.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
-- Fuzzy finder using findfunc + matchfuzzy, with wildtrigger autocomplete.

-- Files cache, cleared on each cmdline entry.
local filescache = {}

--- Get a list of all files using built-in globpath.
local function glob_files()
local raw = vim.fn.globpath(".", "**", true, true)
local files = {}
for _, path in ipairs(raw) do
if vim.fn.isdirectory(path) == 0 then
files[#files + 1] = vim.fn.fnamemodify(path, ":.")
end
end
return files
end

--- Get a list of all files using fd.
local function fd_files()
local result = vim.fn.systemlist({
"fd",
"--exclude",
".git",
"--follow",
"--full-path",
"--hidden",
"--type",
"file",
})
if vim.v.shell_error ~= 0 then
vim.api.nvim_err_writeln(table.concat(result, "\n"))
return {}
end
return result
end

local files_fetcher = vim.fn.executable("fd") == 1 and fd_files or glob_files

--- findfunc: return fuzzy-matched filenames for :find.
--- Exposed as a global for v:lua access.
function _G.FindFunc(file)
if #filescache == 0 then
filescache = files_fetcher()
end
if file == "" then
return filescache
end
return vim.fn.matchfuzzy(filescache, file)
end

vim.o.findfunc = "v:lua.FindFunc"

-- Cmdline autocompletion via wildtrigger + cache clearing.
-- FIXME(kirill.morozov): create autocommand only if Neovim >= 0.12
local fuzzy_group = vim.api.nvim_create_augroup("fuzzy", { clear = true })

vim.api.nvim_create_autocmd("CmdlineChanged", {
group = fuzzy_group,
pattern = { ":", "/", "?" },
desc = "Trigger cmdline autocompletion",
callback = function()
vim.fn.wildtrigger()
end,
})

vim.api.nvim_create_autocmd("CmdlineEnter", {
group = fuzzy_group,
pattern = ":",
desc = "Clear files cache on cmdline entry",
callback = function()
filescache = {}
end,
})
59 changes: 59 additions & 0 deletions neovim/plugin/keymaps.lua
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,21 @@ vim.keymap.set(
vim.lsp.buf.code_action,
{ desc = "Select a code action" }
)
vim.keymap.set("n", "gsd", function()
vim.cmd.vsplit()
vim.lsp.buf.definition()
end, { desc = "Go to definition in a split" })
vim.keymap.set("n", "<leader>s", function()
if next(vim.lsp.get_clients({ bufnr = 0 })) then
vim.lsp.buf.document_symbol()
end
end, { desc = "Document symbols" })
vim.keymap.set(
"n",
"<leader>S",
vim.lsp.buf.workspace_symbol,
{ desc = "Workspace symbols" }
)

-- Move text up and down
vim.keymap.set("n", "<A-Down>", ":m .+1<CR>==", { desc = "Move line down" })
Expand All @@ -78,3 +93,47 @@ vim.keymap.set("v", "<A-Up>", ":m '<-2<CR>gv=gv", { desc = "Move selection up" }

-- Open in split
vim.keymap.set("n", "gsf", "<C-w>vgf", { desc = "Go to file in a split" })

-- Search
vim.keymap.set("n", "<Leader>/", ":grep ", { desc = "Grep" })

-- Find and buffer navigation
vim.keymap.set("n", "<Leader>f", ":find ", { desc = "Find file" })
vim.keymap.set("n", "<Leader>b", ":buffer ", { desc = "Switch buffer" })
vim.keymap.set("n", "<Leader>h", ":help ", { desc = "Help" })
vim.keymap.set("n", "<Leader>j", vim.cmd.jumps, { desc = "List jumps" })

-- Diagnostics
vim.keymap.set("n", "<Leader>d", function()
vim.diagnostic.setloclist({ open = true })
end, { desc = "Document diagnostics" })
vim.keymap.set("n", "<Leader>D", function()
vim.diagnostic.setqflist({ open = true })
end, { desc = "Workspace diagnostics" })

-- <C-v> in cmdline: open :find, :buffer, :help in a vertical split.
local vert_replacements = {
find = "vert sfind",
buffer = "vert sbuffer",
help = "vert help",
}

vim.keymap.set("c", "<C-v>", function()
if vim.fn.getcmdtype() ~= ":" then
return "<C-v>"
end
local line = vim.fn.getcmdline()
for cmd, vert_cmd in pairs(vert_replacements) do
if line:match("^%s*" .. cmd .. "%s") then
local new_line =
line:gsub("^(%s*)" .. cmd .. "%s", "%1" .. vert_cmd .. " ", 1)
return "<C-U>" .. new_line .. "<CR>"
end
end
return "<C-v>"
end, { expr = true, desc = "Open in vertical split from cmdline" })

-- Re-open last command pre-filled for editing
vim.keymap.set("n", "<Leader>'", function()
vim.fn.feedkeys(":" .. vim.fn.histget(":"), "tn")
end, { silent = true, desc = "Resume last command" })
Loading