Last active 7 hours ago

shockproof revised this gist 7 hours ago. Go to revision

1 file changed, 199 insertions

fzf.lua(file created)

@@ -0,0 +1,199 @@
1 + return {
2 + 'ibhagwan/fzf-lua',
3 + dependencies = { 'nvim-tree/nvim-web-devicons' },
4 + event = 'VeryLazy',
5 + config = function()
6 + local actions = require('fzf-lua').actions
7 + -- Helper function to create horizontal layout
8 + local function with_horizontal_layout(fzf_func, opts)
9 + return function()
10 + local config = vim.tbl_deep_extend('force', opts or {}, {
11 + winopts = {
12 + fullscreen = true,
13 + preview = {
14 + layout = 'horizontal',
15 + horizontal = 'down:60%',
16 + scrollbar = 'float',
17 + scrolloff = '-4',
18 + },
19 + border = 'rounded',
20 + },
21 + })
22 + fzf_func(config)
23 + end
24 + end
25 + local opts = {
26 + previewers = {
27 + builtin = {
28 + syntax_limit_b = 1024 * 100,
29 + },
30 + },
31 + hls = {
32 + match = 'FzfLuaFzfMatch',
33 + },
34 + fzf_opts = {
35 + ['--cycle'] = true,
36 + },
37 + winopts = {
38 + fullscreen = true,
39 + preview = {
40 + vertical = 'right:60%', -- show preview on the right, take 60% of space
41 + layout = 'vertical',
42 + scrollbar = 'float',
43 + scrolloff = '-4',
44 + },
45 + border = 'rounded',
46 + },
47 + grep = {
48 + rg_glob = true,
49 + glob_flag = '--iglob',
50 + glob_separator = '%s%-%-',
51 + cmd = 'rg --line-number --column --no-heading --color=always',
52 + rg_opts = table.concat({
53 + '--hidden',
54 + '--no-ignore-vcs',
55 + '--glob=!**/.local/**',
56 + '--glob=!**/.rustup/**',
57 + '--glob=!**/node_modules/**',
58 + '--glob=!**/.cargo/**',
59 + '--glob=!**/.continue/**',
60 + '--glob=!**/.mozilla/**',
61 + '--glob=!**/go/pkg/mod/**',
62 + '--glob=!**/Code/User/**',
63 + '--glob=!**/.git/**',
64 + '--glob=!**/.npm/**',
65 + '--glob=!**/.cache/**',
66 + }, ' '),
67 + },
68 + files = {
69 + cmd = table.concat({
70 + 'fd --type f --hidden --follow',
71 + '--exclude .git',
72 + '--exclude node_modules',
73 + '--exclude .cargo',
74 + '--exclude .mozilla',
75 + '--exclude .cache',
76 + '--exclude .npm',
77 + '--exclude .rustup',
78 + '--exclude .dotnet',
79 + '--exclude go/pkg/mod',
80 + '--exclude Code/User',
81 + '--exclude .local',
82 + '--exclude .continue',
83 + }, ' '),
84 + formatter = 'path.dirname_first',
85 + -- formatter = 'path.filename_first',
86 + cwd_prompt_shorten_len = 50, -- shorten prompt beyond this length
87 + cwd_prompt_shorten_val = 3, -- shortened path parts length cwd_prompt_shorten_len = 50,
88 + },
89 + defaults = {
90 + git_icons = true,
91 + file_icons = true,
92 + color_icons = true,
93 + },
94 + keymap = {
95 + builtin = {
96 + true,
97 + ['<C-d>'] = 'preview-page-down',
98 + ['<C-u>'] = 'preview-page-up',
99 + },
100 + fzf = {
101 + true,
102 + ['ctrl-d'] = 'preview-page-down',
103 + ['ctrl-u'] = 'preview-page-up',
104 + ['ctrl-q'] = 'select-all+accept',
105 + },
106 + },
107 + actions = {
108 + files = {
109 + ['enter'] = actions.file_edit_or_qf,
110 + ['ctrl-x'] = actions.file_split,
111 + ['ctrl-v'] = actions.file_vsplit,
112 + ['ctrl-t'] = actions.file_tabedit,
113 + ['alt-q'] = actions.file_sel_to_qf,
114 + },
115 + },
116 + }
117 +
118 + -- https://github.com/ibhagwan/fzf-lua?tab=readme-ov-file#highlight-groups
119 + vim.api.nvim_set_hl(0, 'FzfLuaBorder', { fg = '#54546D' })
120 + vim.api.nvim_set_hl(0, 'FzfLuaDirPart', { fg = '#8DA2C2', italic = true })
121 + vim.api.nvim_set_hl(0, 'FzfLuaFilePart', { fg = '#7CB879', bold = true })
122 +
123 + local fzf = require 'fzf-lua'
124 + fzf.register_ui_select()
125 + fzf.setup(opts)
126 +
127 + local bind_opts = { noremap = true, silent = true }
128 +
129 + local bind = function(keys, func, desc, mode)
130 + vim.keymap.set(mode or 'n', keys, func, vim.tbl_extend('force', bind_opts, { desc = desc }))
131 + end
132 +
133 + bind('<leader>fzf', fzf.builtin, 'fzf ❤️')
134 + bind('<leader>ff', fzf.resume, 'Resume Previous fzf Search')
135 +
136 + -- Files
137 + bind('<A-f>', fzf.files, 'Find Files')
138 + bind('<leader>F', function()
139 + fzf.files {
140 + cwd = vim.fn.expand '%:h',
141 + -- This command uses a regex to find only files in the top-level
142 + -- directory, which solves both the recursion and './' prefix issues.
143 + cmd = 'fd --type f --hidden --max-depth 2',
144 + }
145 + end, 'Find Files (Buffer Dir, Non-Recursive)')
146 + bind('<leader>f/', function()
147 + fzf.files { cwd = '/' }
148 + end, 'Search root / directory')
149 + bind('<leader>fh', function()
150 + fzf.files { cwd = os.getenv 'home', hidden = true }
151 + end, 'Search $HOME directory')
152 + bind('<leader>fm', function()
153 + fzf.files { cwd = '$HOME/notes' }
154 + end, 'Search $HOME/notes directory')
155 + bind('<leader>fn', function()
156 + fzf.files { cwd = vim.fn.stdpath 'config' }
157 + end, 'Search $HOME/.config/nvim directory')
158 +
159 + -- Grep
160 + bind('<A-g>', with_horizontal_layout(fzf.live_grep), 'Grep')
161 + bind('<leader>fM', function()
162 + fzf.live_grep_native { cwd = '$HOME/notes' }
163 + end, 'Grep Notes')
164 + bind('<A-/>', fzf.blines, 'Buffer Lines')
165 + bind('<leader>gw', fzf.grep_cword, 'Grep Word')
166 + bind('<leader>fc', fzf.grep_cword, 'Grep Word (Alt)')
167 + bind('<leader>f.', fzf.grep_cWORD, 'Grep WORD')
168 + bind('<leader>ft', '<cmd>TodoFzfLua<CR>', 'Search TODOs')
169 +
170 + -- Buffers / Recents
171 + bind('<leader><leader>', fzf.buffers, 'Buffers')
172 + bind('<leader>f,', fzf.oldfiles, 'Recent Files')
173 +
174 + -- Git
175 + bind('<leader>gca', fzf.git_commits, 'Git Commits')
176 + bind('<leader>gh', fzf.git_bcommits, 'Git Buffer Commits')
177 +
178 + -- Misc
179 + bind('<leader>K', fzf.keymaps, 'Keymaps')
180 + bind('<leader>fd', with_horizontal_layout(fzf.diagnostics_document), 'Document Diagnostics')
181 + bind('<leader>fD', with_horizontal_layout(fzf.diagnostics_workspace), 'Workspace Diagnostics')
182 + bind('<leader>fq', fzf.quickfix, 'Quickfix List')
183 + bind('<leader>H', fzf.help_tags, 'Help Tags')
184 + bind('<leader>mar', fzf.marks, 'Marks')
185 + bind('<leader>e', fzf.zoxide, 'Zoxide')
186 + bind('<leader>fs', function()
187 + fzf.spell_suggest {
188 + winopts = {
189 + height = 0.4,
190 + width = 0.5,
191 + row = 1, -- relative to cursor
192 + col = 0,
193 + relative = 'cursor',
194 + preview = { hidden = 'hidden' },
195 + },
196 + }
197 + end, 'Spelling Suggest (Cursor)')
198 + end,
199 + }
Newer Older