Skip to main content

Fzf

info

You can enable the extra with the :LazyExtras command. Plugins marked as optional will only be configured if they are installed.

Alternatively, you can add it to your lazy.nvim imports
lua/config/lazy.lua
require("lazy").setup({
spec = {
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
{ import = "lazyvim.plugins.extras.editor.fzf" },
{ import = "plugins" },
},
})

Options

Additional options for this extra can be configured in your lua/config/options.lua file:

lua/config/options.lua
-- In case you don't want to use `:LazyExtras`,
-- then you need to set the option below.
vim.g.lazyvim_picker = "fzf"

Below you can find a list of included plugins and their default settings.

caution

You don't need to copy the default settings to your config. They are only shown here for reference.

fzf-lua

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.fzf["ctrl-f"] = "preview-page-down"
config.defaults.keymap.fzf["ctrl-b"] = "preview-page-up"
config.defaults.keymap.builtin["<c-f>"] = "preview-page-down"
config.defaults.keymap.builtin["<c-b>"] = "preview-page-up"

-- Trouble
if LazyVim.has("trouble.nvim") then
config.defaults.actions.files["ctrl-t"] = require("trouble.sources.fzf").actions.open
end

-- 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)

local img_previewer ---@type string[]?
for _, v in ipairs({
{ cmd = "ueberzug", args = {} },
{ cmd = "chafa", args = { "{file}", "--format=symbols" } },
{ cmd = "viu", args = { "-b" } },
}) do
if vim.fn.executable(v.cmd) == 1 then
img_previewer = vim.list_extend({ v.cmd }, v.args)
break
end
end

return vim.tbl_deep_extend("force", defaults, {
fzf_colors = true,
fzf_opts = {
["--no-scrollbar"] = true,
},
defaults = {
-- formatter = "path.filename_first",
formatter = "path.dirname_first",
},
previewers = {
builtin = {
extensions = {
["png"] = img_previewer,
["jpg"] = img_previewer,
["jpeg"] = img_previewer,
["gif"] = img_previewer,
["webp"] = img_previewer,
},
ueberzug_scaler = "fit_contain",
},
},
-- 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 = not vim.tbl_isempty(LazyVim.lsp.get_clients({ bufnr = 0, name = "vtsls" })) and {
layout = "vertical",
vertical = "down:15,border-top",
hidden = "hidden",
} or {
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

fzf-lua

opts = nil

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

todo-comments.nvim (optional)

opts = nil