diff --git a/lua/lazyvim/plugins/extras/editor/fzf.lua b/lua/lazyvim/plugins/extras/editor/fzf.lua new file mode 100644 index 00000000..33ee1a71 --- /dev/null +++ b/lua/lazyvim/plugins/extras/editor/fzf.lua @@ -0,0 +1,157 @@ +local M = {} + +---@class FzfLuaOpts: table +---@field cwd boolean|string + +---@param opts? {cwd?:string|boolean} +function M.fzf(builtin, opts) + opts = opts or {} + + return function() + local dir = opts.cwd == true and vim.uv.cwd() or LazyVim.root() + opts.cwd = dir + if + builtin == "files" + and vim.uv.fs_stat(dir .. "/.git") + and not vim.uv.fs_stat(dir .. "/.ignore") + and not vim.uv.fs_stat(dir .. "/.rgignore") + then + if opts.cmd == nil then + opts.cmd = "git ls-files --exclude-standard --cached --others" + end + builtin = "git_files" + end + + return require("fzf-lua")[builtin](opts) + end +end + +return { + { + "nvim-telescope/telescope.nvim", + enabled = true, + keys = function() + return {} + end, + }, + { + "ibhagwan/fzf-lua", + event = "VeryLazy", + opts = { + [1] = "default-title", + keymap = { + fzf = { + ["ctrl-q"] = "select-all+accept", + }, + }, + fzf_colors = { + ["fg"] = { "fg", "FzfLuaNormal" }, + ["bg"] = { "bg", "FzfLuaNormal" }, + ["hl"] = { "fg", "Special" }, + ["fg+"] = { "fg", "Visual" }, + ["bg+"] = { "bg", "Visual" }, + ["hl+"] = { "fg", "Special" }, + ["info"] = { "fg", "NonText" }, + ["border"] = { "fg", "FzfLuaBorder" }, + ["gutter"] = { "bg", "FzfLuaNormal" }, + ["query"] = { "fg", "FzfLuaNormal" }, + ["prompt"] = { "fg", "FzfLuaNormal" }, + ["pointer"] = { "fg", "FzfLuaMarker" }, + ["marker"] = { "fg", "FzfLuaMarker" }, + ["header"] = { "fg", "FzfLuaNormal" }, + }, + }, + config = function(_, opts) + if opts.profile then + opts[1] = opts.profile + -- require("fzf-lua").setup({ opts.profile }) + -- opts.profile = nil + end + -- vim.env.FZF_DEFAULT_OPTS = "" + require("fzf-lua").setup(opts) + end, + keys = { + { "", "close", ft = "fzf", mode = "t", nowait = true }, + { "", "", ft = "fzf", mode = "t", nowait = true }, + { "", "", ft = "fzf", mode = "t", nowait = true }, + { + ",", + "FzfLua buffers sort_mru=true sort_lastused=true", + desc = "Switch Buffer", + }, + { "/", M.fzf("live_grep"), desc = "Grep (Root Dir)" }, + { ":", "FzfLua command_history", desc = "Command History" }, + { "", M.fzf("files"), desc = "Find Files (Root Dir)" }, + -- find + { "fb", "FzfLua buffers sort_mru=true sort_lastused=true", desc = "Buffers" }, + { "fc", M.fzf("files", { cwd = vim.fn.stdpath("config") }), desc = "Find Config File" }, + { "ff", M.fzf("files"), desc = "Find Files (Root Dir)" }, + { "fF", M.fzf("files", { cwd = true }), desc = "Find Files (cwd)" }, + { "fg", "FzfLua git_files", desc = "Find Files (git-files)" }, + { "fr", "FzfLua oldfiles", desc = "Recent" }, + { "fR", M.fzf("oldfiles", { cwd = vim.uv.cwd() }), desc = "Recent (cwd)" }, + -- git + { "gc", "FzfLua git_commits", desc = "Commits" }, + { "gs", "FzfLua git_status", desc = "Status" }, + -- search + { 's"', "FzfLua registers", desc = "Registers" }, + { "sa", "FzfLua autocmds", desc = "Auto Commands" }, + { "sb", "FzfLua grep_curbuf", desc = "Buffer" }, + { "sc", "FzfLua command_history", desc = "Command History" }, + { "sC", "FzfLua commands", desc = "Commands" }, + { "sd", "FzfLua diagnostics_document", desc = "Document Diagnostics" }, + { "sD", "FzfLua diagnostics_workspace", desc = "Workspace Diagnostics" }, + { "sg", M.fzf("live_grep"), desc = "Grep (Root Dir)" }, + { "sG", M.fzf("live_grep", { cwd = true }), desc = "Grep (cwd)" }, + { "sh", "FzfLua help_tags", desc = "Help Pages" }, + { "sH", "FzfLua highlights", desc = "Search Highlight Groups" }, + { "sj", "FzfLua jumps", desc = "Jumplist" }, + { "sk", "FzfLua keymaps", desc = "Key Maps" }, + { "sl", "FzfLua loclist", desc = "Location List" }, + { "sM", "FzfLua man_pages", desc = "Man Pages" }, + { "sm", "FzfLua marks", desc = "Jump to Mark" }, + { "sR", "FzfLua resume", desc = "Resume" }, + { "sq", "FzfLua quickfix", desc = "Quickfix List" }, + { "sw", M.fzf("grep_cword"), desc = "Word (Root Dir)" }, + { "sW", M.fzf("grep_cword", { cwd = true }), desc = "Word (cwd)" }, + { "sw", M.fzf("grep_visual"), mode = "v", desc = "Selection (Root Dir)" }, + { "sW", M.fzf("grep_visual", { cwd = true }), mode = "v", desc = "Selection (cwd)" }, + { "uC", M.fzf("colorschemes"), desc = "Colorscheme with Preview" }, + { + "ss", + function() + require("fzf-lua").lsp_document_symbols({ + symbols = require("lazyvim.config").get_kind_filter(), + }) + end, + desc = "Goto Symbol", + }, + { + "sS", + function() + require("fzf-lua").lsp_dynamic_workspace_symbols({ + symbols = require("lazyvim.config").get_kind_filter(), + }) + end, + desc = "Goto Symbol (Workspace)", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = function() + local Keys = require("lazyvim.plugins.lsp.keymaps").get() + vim.list_extend(Keys, { + { + "gd", + "FzfLua lsp_definitions jump_to_single_result=true", + desc = "Goto Definition", + has = "definition", + }, + { "gr", "FzfLua lsp_references jump_to_single_result=true", desc = "References", nowait = true }, + { "gI", "FzfLua lsp_implementations jump_to_single_result=true", desc = "Goto Implementation" }, + { "gy", "FzfLua lsp_typedefs jump_to_single_result=true", desc = "Goto T[y]pe Definition" }, + }) + end, + }, +}