Handle path filters on telescope grep

This commit is contained in:
2025-01-08 17:33:47 +01:00
parent bdb42577ba
commit 7ca3d65b02
2 changed files with 83 additions and 8 deletions
+9 -8
View File
@@ -4,14 +4,14 @@ return {
load = vim.cmd.packadd,
cmd = "Telescope",
keys = {
{ "<leader>f", "<cmd>Telescope find_files<cr>", desc = "Find Files" },
{ "<leader>F", "<cmd>Telescope live_grep theme=ivy<cr>", desc = "Grep" },
{ "<leader>gl", "<cmd>Telescope git_commits<CR>", desc = "Git log" },
{ "<leader>gh", "<cmd>Telescope git_bcommits<CR>", desc = "Git history" },
{ "<leader>gB", "<cmd>Telescope git_branches<CR>", desc = "Git branches" },
{ "<leader>gs", "<cmd>Telescope git_status<CR>", desc = "Git status" },
{ "<leader>gc", "<cmd>Telescope git_show<CR>", desc = "Show last commit" },
{ "<leader>zh", "<cmd>Telescope help_tags<CR>", desc = "Read help" },
{ "<leader>f", "<cmd>Telescope find_files<cr>", desc = "Find Files" },
{ "<leader>F", "<cmd>Telescope ripgrep theme=ivy<cr>", desc = "Grep" },
{ "<leader>gl", "<cmd>Telescope git_commits<CR>", desc = "Git log" },
{ "<leader>gh", "<cmd>Telescope git_bcommits<CR>", desc = "Git history" },
{ "<leader>gB", "<cmd>Telescope git_branches<CR>", desc = "Git branches" },
{ "<leader>gs", "<cmd>Telescope git_status<CR>", desc = "Git status" },
{ "<leader>gc", "<cmd>Telescope git_show<CR>", desc = "Show last commit" },
{ "<leader>zh", "<cmd>Telescope help_tags<CR>", desc = "Read help" },
},
after = function()
local actions = require("telescope.actions")
@@ -44,6 +44,7 @@ return {
})
telescope.load_extension("fzf")
telescope.load_extension("ripgrep")
end
},
}
@@ -0,0 +1,74 @@
local conf = require("telescope.config").values
local finders = require("telescope.finders")
local make_entry = require("telescope.make_entry")
local pickers = require("telescope.pickers")
local ripgrep = function(opts)
opts = opts or {}
opts.cwd = opts.cwd and vim.fn.expand(opts.cwd) or vim.loop.cwd()
opts.pattern = opts.pattern or "%s"
local custom_grep = finders.new_async_job {
command_generator = function(prompt)
if not prompt or prompt == "" then
return nil
end
local split = vim.split(prompt, " ")
local search = split[1]
local glob = {}
if not search or search == "" then
return nil
end
if split[2] ~= nil and #split[2] > 0 then
local g = split[2]
local glob_flag = "--iglob"
-- switch to case sensitive glob if there's an upercase letter.
if g:match("%u") then
glob_flag = "--glob"
end
if g:match("^[%w/%._-]") then
g = "*" .. g
elseif g:sub(1, 1) == "^" then
g = g:sub(2)
end
if g:match("[%w/%._-]$") then
g = g .. "*"
elseif g:sub(#g) == "$" then
g = g:sub(1, #g - 1)
end
glob = { glob_flag, g }
end
return vim.iter({
{ "rg", "--color=never", "--no-heading", "--with-filename", "--line-number", "--column", "--smart-case", },
glob,
{ "--", search },
}):flatten():totable()
end,
entry_maker = make_entry.gen_from_vimgrep(opts),
cwd = opts.cwd,
}
pickers
.new(opts, {
debounce = 100,
prompt_title = "Live Grep",
finder = custom_grep,
previewer = conf.grep_previewer(opts),
sorter = require("telescope.sorters").empty(),
})
:find()
end
return require("telescope").register_extension {
setup = function() end,
exports = {
ripgrep = ripgrep,
},
}