249 lines
9.5 KiB
Lua
249 lines
9.5 KiB
Lua
---@class FzfLuaOpts: lazyvim.util.pick.Opts
|
|
---@field cmd string?
|
|
|
|
---@type LazyPicker
|
|
local picker = {
|
|
name = "fzf",
|
|
commands = {
|
|
files = "files",
|
|
},
|
|
|
|
---@param command string
|
|
---@param opts? FzfLuaOpts
|
|
open = function(command, opts)
|
|
opts = opts or {}
|
|
if opts.cmd == nil and command == "git_files" and opts.show_untracked then
|
|
opts.cmd = "git ls-files --exclude-standard --cached --others"
|
|
end
|
|
return require("fzf-lua")[command](opts)
|
|
end,
|
|
}
|
|
if not LazyVim.pick.register(picker) then
|
|
return {}
|
|
end
|
|
|
|
local function symbols_filter(entry, ctx)
|
|
if ctx.symbols_filter == nil then
|
|
ctx.symbols_filter = require("lazyvim.config").get_kind_filter(ctx.bufnr) or false
|
|
end
|
|
if ctx.symbols_filter == false then
|
|
return true
|
|
end
|
|
return vim.tbl_contains(ctx.symbols_filter, entry.kind)
|
|
end
|
|
|
|
return {
|
|
desc = "Awesome picker for FZF (alternative to Telescope)",
|
|
recommended = true,
|
|
{
|
|
"ibhagwan/fzf-lua",
|
|
event = "VeryLazy",
|
|
opts = function(_, opts)
|
|
local config = require("fzf-lua.config")
|
|
local actions = require("fzf-lua.actions")
|
|
|
|
-- Quickfix
|
|
config.defaults.keymap.fzf["ctrl-q"] = "select-all+accept"
|
|
config.defaults.keymap.fzf["ctrl-u"] = "half-page-up"
|
|
config.defaults.keymap.fzf["ctrl-d"] = "half-page-down"
|
|
config.defaults.keymap.fzf["ctrl-x"] = "jump"
|
|
config.defaults.keymap.builtin["<c-f>"] = "preview-page-down"
|
|
config.defaults.keymap.builtin["<c-b>"] = "preview-page-up"
|
|
|
|
-- Trouble
|
|
config.defaults.actions.files["ctrl-t"] = require("trouble.sources.fzf").actions.open
|
|
|
|
-- Toggle root dir / cwd
|
|
config.defaults.actions.files["ctrl-r"] = function(_, ctx)
|
|
local o = vim.deepcopy(ctx.__call_opts)
|
|
o.root = o.root == false
|
|
o.cwd = nil
|
|
o.buf = ctx.__CTX.bufnr
|
|
LazyVim.pick.open(ctx.__INFO.cmd, o)
|
|
end
|
|
config.defaults.actions.files["alt-c"] = config.defaults.actions.files["ctrl-r"]
|
|
config.set_action_helpstr(config.defaults.actions.files["ctrl-r"], "toggle-root-dir")
|
|
|
|
-- use the same prompt for all
|
|
local defaults = require("fzf-lua.profiles.default-title")
|
|
local function fix(t)
|
|
t.prompt = t.prompt ~= nil and " " or nil
|
|
for _, v in pairs(t) do
|
|
if type(v) == "table" then
|
|
fix(v)
|
|
end
|
|
end
|
|
end
|
|
fix(defaults)
|
|
|
|
return vim.tbl_deep_extend("force", defaults, {
|
|
fzf_colors = true,
|
|
fzf_opts = {
|
|
["--no-scrollbar"] = true,
|
|
},
|
|
defaults = {
|
|
-- formatter = "path.filename_first",
|
|
formatter = "path.dirname_first",
|
|
},
|
|
-- Custom LazyVim option to configure vim.ui.select
|
|
ui_select = function(fzf_opts, items)
|
|
return vim.tbl_deep_extend("force", fzf_opts, {
|
|
prompt = " ",
|
|
winopts = {
|
|
title = " " .. vim.trim((fzf_opts.prompt or "Select"):gsub("%s*:%s*$", "")) .. " ",
|
|
title_pos = "center",
|
|
},
|
|
}, fzf_opts.kind == "codeaction" and {
|
|
winopts = {
|
|
layout = "vertical",
|
|
-- height is number of items minus 15 lines for the preview, with a max of 80% screen height
|
|
height = math.floor(math.min(vim.o.lines * 0.8 - 16, #items + 2) + 0.5) + 16,
|
|
width = 0.5,
|
|
preview = {
|
|
layout = "vertical",
|
|
vertical = "down:15,border-top",
|
|
},
|
|
},
|
|
} or {
|
|
winopts = {
|
|
width = 0.5,
|
|
-- height is number of items, with a max of 80% screen height
|
|
height = math.floor(math.min(vim.o.lines * 0.8, #items + 2) + 0.5),
|
|
},
|
|
})
|
|
end,
|
|
winopts = {
|
|
width = 0.8,
|
|
height = 0.8,
|
|
row = 0.5,
|
|
col = 0.5,
|
|
preview = {
|
|
scrollchars = { "┃", "" },
|
|
},
|
|
},
|
|
files = {
|
|
cwd_prompt = false,
|
|
actions = {
|
|
["alt-i"] = { actions.toggle_ignore },
|
|
["alt-h"] = { actions.toggle_hidden },
|
|
},
|
|
},
|
|
grep = {
|
|
actions = {
|
|
["alt-i"] = { actions.toggle_ignore },
|
|
["alt-h"] = { actions.toggle_hidden },
|
|
},
|
|
},
|
|
lsp = {
|
|
symbols = {
|
|
symbol_hl = function(s)
|
|
return "TroubleIcon" .. s
|
|
end,
|
|
symbol_fmt = function(s)
|
|
return s:lower() .. "\t"
|
|
end,
|
|
child_prefix = false,
|
|
},
|
|
code_actions = {
|
|
previewer = vim.fn.executable("delta") == 1 and "codeaction_native" or nil,
|
|
},
|
|
},
|
|
})
|
|
end,
|
|
config = function(_, opts)
|
|
require("fzf-lua").setup(opts)
|
|
require("fzf-lua").register_ui_select(opts.ui_select or nil)
|
|
end,
|
|
keys = {
|
|
{ "<esc>", "<c-c>", ft = "fzf", mode = "t", nowait = true },
|
|
{ "<c-j>", "<Down>", ft = "fzf", mode = "t", nowait = true },
|
|
{ "<c-k>", "<Up>", ft = "fzf", mode = "t", nowait = true },
|
|
{
|
|
"<leader>,",
|
|
"<cmd>FzfLua buffers sort_mru=true sort_lastused=true<cr>",
|
|
desc = "Switch Buffer",
|
|
},
|
|
{ "<leader>/", LazyVim.pick("live_grep"), desc = "Grep (Root Dir)" },
|
|
{ "<leader>:", "<cmd>FzfLua command_history<cr>", desc = "Command History" },
|
|
{ "<leader><space>", LazyVim.pick("auto"), desc = "Find Files (Root Dir)" },
|
|
-- find
|
|
{ "<leader>fb", "<cmd>FzfLua buffers sort_mru=true sort_lastused=true<cr>", desc = "Buffers" },
|
|
{ "<leader>fc", LazyVim.pick.config_files(), desc = "Find Config File" },
|
|
{ "<leader>ff", LazyVim.pick("auto"), desc = "Find Files (Root Dir)" },
|
|
{ "<leader>fF", LazyVim.pick("auto", { root = false }), desc = "Find Files (cwd)" },
|
|
{ "<leader>fg", "<cmd>FzfLua git_files<cr>", desc = "Find Files (git-files)" },
|
|
{ "<leader>fr", "<cmd>FzfLua oldfiles<cr>", desc = "Recent" },
|
|
{ "<leader>fR", LazyVim.pick("oldfiles", { cwd = vim.uv.cwd() }), desc = "Recent (cwd)" },
|
|
-- git
|
|
{ "<leader>gc", "<cmd>FzfLua git_commits<CR>", desc = "Commits" },
|
|
{ "<leader>gs", "<cmd>FzfLua git_status<CR>", desc = "Status" },
|
|
-- search
|
|
{ '<leader>s"', "<cmd>FzfLua registers<cr>", desc = "Registers" },
|
|
{ "<leader>sa", "<cmd>FzfLua autocmds<cr>", desc = "Auto Commands" },
|
|
{ "<leader>sb", "<cmd>FzfLua grep_curbuf<cr>", desc = "Buffer" },
|
|
{ "<leader>sc", "<cmd>FzfLua command_history<cr>", desc = "Command History" },
|
|
{ "<leader>sC", "<cmd>FzfLua commands<cr>", desc = "Commands" },
|
|
{ "<leader>sd", "<cmd>FzfLua diagnostics_document<cr>", desc = "Document Diagnostics" },
|
|
{ "<leader>sD", "<cmd>FzfLua diagnostics_workspace<cr>", desc = "Workspace Diagnostics" },
|
|
{ "<leader>sg", LazyVim.pick("live_grep"), desc = "Grep (Root Dir)" },
|
|
{ "<leader>sG", LazyVim.pick("live_grep", { root = false }), desc = "Grep (cwd)" },
|
|
{ "<leader>sh", "<cmd>FzfLua help_tags<cr>", desc = "Help Pages" },
|
|
{ "<leader>sH", "<cmd>FzfLua highlights<cr>", desc = "Search Highlight Groups" },
|
|
{ "<leader>sj", "<cmd>FzfLua jumps<cr>", desc = "Jumplist" },
|
|
{ "<leader>sk", "<cmd>FzfLua keymaps<cr>", desc = "Key Maps" },
|
|
{ "<leader>sl", "<cmd>FzfLua loclist<cr>", desc = "Location List" },
|
|
{ "<leader>sM", "<cmd>FzfLua man_pages<cr>", desc = "Man Pages" },
|
|
{ "<leader>sm", "<cmd>FzfLua marks<cr>", desc = "Jump to Mark" },
|
|
{ "<leader>sR", "<cmd>FzfLua resume<cr>", desc = "Resume" },
|
|
{ "<leader>sq", "<cmd>FzfLua quickfix<cr>", desc = "Quickfix List" },
|
|
{ "<leader>sw", LazyVim.pick("grep_cword"), desc = "Word (Root Dir)" },
|
|
{ "<leader>sW", LazyVim.pick("grep_cword", { root = false }), desc = "Word (cwd)" },
|
|
{ "<leader>sw", LazyVim.pick("grep_visual"), mode = "v", desc = "Selection (Root Dir)" },
|
|
{ "<leader>sW", LazyVim.pick("grep_visual", { root = false }), mode = "v", desc = "Selection (cwd)" },
|
|
{ "<leader>uC", LazyVim.pick("colorschemes"), desc = "Colorscheme with Preview" },
|
|
{
|
|
"<leader>ss",
|
|
function()
|
|
require("fzf-lua").lsp_document_symbols({
|
|
regex_filter = symbols_filter,
|
|
})
|
|
end,
|
|
desc = "Goto Symbol",
|
|
},
|
|
{
|
|
"<leader>sS",
|
|
function()
|
|
require("fzf-lua").lsp_live_workspace_symbols({
|
|
regex_filter = symbols_filter,
|
|
})
|
|
end,
|
|
desc = "Goto Symbol (Workspace)",
|
|
},
|
|
},
|
|
},
|
|
|
|
{
|
|
"folke/todo-comments.nvim",
|
|
optional = true,
|
|
-- stylua: ignore
|
|
keys = {
|
|
{ "<leader>st", function() require("todo-comments.fzf").todo() end, desc = "Todo" },
|
|
{ "<leader>sT", function () require("todo-comments.fzf").todo({ keywords = { "TODO", "FIX", "FIXME" } }) end, desc = "Todo/Fix/Fixme" },
|
|
},
|
|
},
|
|
|
|
{
|
|
"neovim/nvim-lspconfig",
|
|
opts = function()
|
|
local Keys = require("lazyvim.plugins.lsp.keymaps").get()
|
|
-- stylua: ignore
|
|
vim.list_extend(Keys, {
|
|
{ "gd", "<cmd>FzfLua lsp_definitions jump_to_single_result=true ignore_current_line=true<cr>", desc = "Goto Definition", has = "definition" },
|
|
{ "gr", "<cmd>FzfLua lsp_references jump_to_single_result=true ignore_current_line=true<cr>", desc = "References", nowait = true },
|
|
{ "gI", "<cmd>FzfLua lsp_implementations jump_to_single_result=true ignore_current_line=true<cr>", desc = "Goto Implementation" },
|
|
{ "gy", "<cmd>FzfLua lsp_typedefs jump_to_single_result=true ignore_current_line=true<cr>", desc = "Goto T[y]pe Definition" },
|
|
})
|
|
end,
|
|
},
|
|
}
|