From a8e1659edcec45ab41c64940d1efe06335e95faf Mon Sep 17 00:00:00 2001 From: bhagwan Date: Wed, 8 May 2024 05:55:24 -0700 Subject: [PATCH] feat(API): simplify preview as lua function --- lua/fzf-lua/core.lua | 24 ++++++++++++++++++++++++ lua/fzf-lua/providers/module.lua | 10 ++++------ lua/fzf-lua/providers/nvim.lua | 13 ++++++------- lua/fzf-lua/shell.lua | 8 +------- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/lua/fzf-lua/core.lua b/lua/fzf-lua/core.lua index 11c35d87..164bce1e 100644 --- a/lua/fzf-lua/core.lua +++ b/lua/fzf-lua/core.lua @@ -566,6 +566,30 @@ M.build_fzf_cli = function(opts) opts.fzf_opts["--" .. flag] = opts[flag] end end + -- convert preview action functions to strings using our shell wrapper + do + local preview_cmd + local preview_spec = opts.fzf_opts["--preview"] + if type(preview_spec) == "function" then + preview_cmd = shell.raw_action(preview_spec, "{}", opts.debug) + elseif type(preview_spec) == "table" then + preview_spec = vim.tbl_extend("keep", preview_spec, { + fn = preview_spec.fn or preview_spec[1], + -- by default we use current item only "{}" + -- using "{+}" will send multiple selected items + field_index = "{}", + }) + if preview_spec.type == "cmd" then + preview_cmd = shell.raw_preview_action_cmd( + preview_spec.fn, preview_spec.field_index, opts.debug) + else + preview_cmd = shell.raw_action(preview_spec.fn, preview_spec.field_index, opts.debug) + end + end + if preview_cmd then + opts.fzf_opts["--preview"] = preview_cmd + end + end opts.fzf_opts["--bind"] = M.create_fzf_binds(opts.keymap.fzf) opts.fzf_opts["--color"] = M.create_fzf_colors(opts) opts.fzf_opts["--expect"] = actions.expect(opts.actions) diff --git a/lua/fzf-lua/providers/module.lua b/lua/fzf-lua/providers/module.lua index 31d63097..37a624c8 100644 --- a/lua/fzf-lua/providers/module.lua +++ b/lua/fzf-lua/providers/module.lua @@ -2,7 +2,6 @@ local uv = vim.uv or vim.loop local core = require "fzf-lua.core" local path = require "fzf-lua.path" local utils = require "fzf-lua.utils" -local shell = require "fzf-lua.shell" local config = require "fzf-lua.config" local M = {} @@ -21,11 +20,10 @@ M.metatable = function(opts) table.sort(methods, function(a, b) return a < b end) - opts.preview = shell.raw_action(function(args) - -- TODO: retrieve method help - local help = "" - return string.format("%s:%s", args[1], help) - end, nil, opts.debug) + opts.preview = function(args) + local options_md = require("fzf-lua.cmd").options_md() + return type(options_md) == "table" and options_md[args[1]:lower()] or "" + end opts.fzf_opts["--preview-window"] = "hidden:down:10" diff --git a/lua/fzf-lua/providers/nvim.lua b/lua/fzf-lua/providers/nvim.lua index cb23b831..2a3a267f 100644 --- a/lua/fzf-lua/providers/nvim.lua +++ b/lua/fzf-lua/providers/nvim.lua @@ -2,7 +2,6 @@ local uv = vim.uv or vim.loop local core = require "fzf-lua.core" local path = require "fzf-lua.path" local utils = require "fzf-lua.utils" -local shell = require "fzf-lua.shell" local config = require "fzf-lua.config" local devicons = require "fzf-lua.devicons" @@ -51,13 +50,13 @@ M.commands = function(opts) table.sort(entries, function(a, b) return a < b end) end - opts.preview = shell.raw_action(function(args) + opts.preview = function(args) local cmd = args[1] if commands[cmd] then cmd = vim.inspect(commands[cmd]) end return cmd - end, nil, opts.debug) + end core.fzf_exec(entries, opts) end @@ -216,7 +215,7 @@ M.marks = function(opts) string.format("%-5s %s %s %s", "mark", "line", "col", "file/text")) opts.fzf_opts["--header-lines"] = 1 - --[[ opts.preview = shell.raw_action(function (args, fzf_lines, _) + --[[ opts.preview = function (args, fzf_lines, _) local mark = args[1]:match("[^ ]+") local bufnr, lnum, _, _ = unpack(vim.fn.getpos("'"..mark)) if vim.api.nvim_buf_is_loaded(bufnr) then @@ -228,7 +227,7 @@ M.marks = function(opts) end return "UNLOADED: " .. name end - end) ]] + end ]] core.fzf_exec(entries, opts) end @@ -274,11 +273,11 @@ M.registers = function(opts) end end - opts.preview = shell.raw_action(function(args) + opts.preview = function(args) local r = args[1]:match("%[(.*)%] ") local _, contents = pcall(vim.fn.getreg, r) return contents and register_escape_special(contents) or args[1] - end, nil, opts.debug) + end core.fzf_exec(entries, opts) end diff --git a/lua/fzf-lua/shell.lua b/lua/fzf-lua/shell.lua index 6d1e97b3..b5a0d212 100644 --- a/lua/fzf-lua/shell.lua +++ b/lua/fzf-lua/shell.lua @@ -69,8 +69,7 @@ function M.raw_async_action(fn, fzf_field_expression, debug) end) uv.pipe_connect(pipe, pipe_path, function(err) if err then - error(string.format("pipe_connect(%s) failed with error: %s", - pipe_path, err)) + error(string.format("pipe_connect(%s) failed with error: %s", pipe_path, err)) else vim.schedule(function() fn(pipe, unpack(args)) @@ -110,11 +109,6 @@ function M.raw_async_action(fn, fzf_field_expression, debug) return action_cmd, id end -function M.async_action(fn, fzf_field_expression, debug) - local action_string, id = M.raw_async_action(fn, fzf_field_expression, debug) - return libuv.shellescape(action_string), id -end - function M.raw_action(fn, fzf_field_expression, debug) local receiving_function = function(pipe, ...) local ret = fn(...)