live_grep: multiprocess as default provider, added glob support

main
bhagwan 2 years ago
parent 429f9572e0
commit 887d6a4cd3

@ -210,7 +210,13 @@ M.mt_cmd_wrapper = function(opts)
"file_icons",
"color_icons",
"strip_cwd_prefix",
"rg_glob",
}
-- caller reqested rg with glob support
if o.rg_glob then
table.insert(names, "glob_flag")
table.insert(names, "glob_separator")
end
local str = ""
for _, name in ipairs(names) do
if o[name] ~= nil then
@ -228,10 +234,11 @@ M.mt_cmd_wrapper = function(opts)
return '{'..str..'}'
end
if not opts.git_icons and not opts.file_icons then
if not opts.force_multiprocess and
not opts.git_icons and not opts.file_icons then
-- command does not require any processing
return opts.cmd
elseif opts.multiprocess then
elseif opts.multiprocess or opts.force_multiprocess then
local fn_preprocess = [[return require("make_entry").preprocess]]
local fn_transform = [[return require("make_entry").file]]
if not opts.no_remote_config then

@ -83,10 +83,11 @@ M.files = require'fzf-lua.providers.files'.files
M.files_resume = require'fzf-lua.providers.files'.files_resume
M.args = require'fzf-lua.providers.files'.args
M.grep = require'fzf-lua.providers.grep'.grep
M.live_grep = require'fzf-lua.providers.grep'.live_grep
M.live_grep = require'fzf-lua.providers.grep'.live_grep_mt
M.live_grep_old = require'fzf-lua.providers.grep'.live_grep
M.live_grep_native = require'fzf-lua.providers.grep'.live_grep_native
M.live_grep_resume = require'fzf-lua.providers.grep'.live_grep_resume
M.live_grep_glob = require'fzf-lua.providers.grep'.live_grep_glob
M.live_grep_glob = require'fzf-lua.providers.grep'.live_grep_glob_mt
M.grep_last = require'fzf-lua.providers.grep'.grep_last
M.grep_cword = require'fzf-lua.providers.grep'.grep_cword
M.grep_cWORD = require'fzf-lua.providers.grep'.grep_cWORD

@ -290,16 +290,6 @@ M.spawn_stdio = function(opts, fn_transform, fn_preprocess)
-- run the preprocessing fn
if fn_preprocess then fn_preprocess(opts) end
-- nifty hack to avoid having to double escape quotations
-- see my comment within the 'live_grep' code initial_command
opts.cmd = opts.cmd:gsub("{argv%d+}",
function(x)
local idx = x:match("{argv(%d+)}")
-- argv1 is actually the 7th argument if we count
-- arguments already supplied by 'wrap_spawn_stdio'
local argv = vim.v.argv[idx+6]
return vim.fn.shellescape(argv)
end)
-- for i=0,8 do
-- io.stdout:write(("%d %s\n"):format(i, vim.v.argv[i]))

@ -149,6 +149,39 @@ M.preprocess = function(opts)
if opts.git_icons then
opts.diff_files = M.get_diff_files(opts)
end
local argv = function(i)
-- argv1 is actually the 7th argument if we count
-- arguments already supplied by 'wrap_spawn_stdio'
return i and vim.v.argv[i+6] or nil
end
-- did the caller request rg with glob support?
-- mannipulation needs to be done before the argv hack
if opts.rg_glob then
local query = argv(1)
if query and query:find(opts.glob_separator) then
local glob_args = ""
local search_query, glob_str = query:match("(.*)"..opts.glob_separator.."(.*)")
for _, s in ipairs(utils.strsplit(glob_str, "%s")) do
glob_args = glob_args .. ("%s %s ")
:format(opts.glob_flag, vim.fn.shellescape(s))
end
-- reset argv1 so it doesn't get replaced again below
opts.cmd = opts.cmd:gsub("{argv1}",
glob_args .. vim.fn.shellescape(search_query))
end
end
-- nifty hack to avoid having to double escape quotations
-- see my comment inside 'live_grep' initial_command code
opts.cmd = opts.cmd:gsub("{argv%d+}",
function(x)
local idx = x:match("{argv(%d+)}")
return vim.fn.shellescape(argv(idx))
end)
return opts
end

@ -144,6 +144,33 @@ end
M.live_grep_native = function(opts)
-- backward compatibility, by setting git|files icons to false
-- we forces mt_cmd_wrapper to pipe the command as is so fzf
-- runs the command directly in the 'change:reload' event
opts = opts or {}
opts.git_icons = false
opts.file_icons = false
return M.live_grep_mt(opts)
end
M.live_grep_glob_mt = function(opts)
if vim.fn.executable("rg") ~= 1 then
utils.warn("'--glob|iglob' flags requires 'rg' (https://github.com/BurntSushi/ripgrep)")
return
end
-- 'rg_glob = true' enables the glob processsing in
-- 'make_entry.preprocess', only supported with multiprocess
opts = opts or {}
opts.rg_glob = true
opts.force_multiprocess = true
return M.live_grep_mt(opts)
end
M.live_grep_mt = function(opts)
opts = config.normalize_opts(opts, config.globals.grep)
if not opts then return end
@ -169,11 +196,9 @@ M.live_grep_native = function(opts)
-- search query in header line
opts = core.set_header(opts, 2)
-- we do not process any entries in the 'native' version as
-- fzf runs the command directly in the 'change:reload' event
-- since the introduction of 'libuv.spawn_stdio' with '--headless'
-- we can now run the command externally with minimal overhead
if not opts.multiprocess then
if not opts.multiprocess and not opts.force_multiprocess then
opts.git_icons = false
opts.file_icons = false
end

Loading…
Cancel
Save