builtin previewer rework, added previewers for help_tags, man_pages

main
bhagwan 3 years ago
parent 81ed9c4d6b
commit df3804ed55

@ -456,10 +456,12 @@ require'fzf-lua'.setup {
["Hint"] = { icon = "", color = "magenta" }, -- hint
},
},
-- placeholders for additional user customizations
loclist = {},
helptags = {},
manpages = {},
-- uncomment to disable the previewer
-- helptags = { previewer = { _new = false } },
-- manpages = { previewer = { _new = false } },
-- uncomment 2 lines to use `man` command as native fzf previewer
-- manpages = { previewer = { cmd = "man", _new = function()
-- return require 'fzf-lua.previewer'.man_pages end } },
-- optional override of file extension icon colors
-- available colors (terminal):
-- clear, bold, black, red, green, yellow

@ -125,7 +125,7 @@ M.globals = {
page_down = '<S-down>', -- preview scroll down
page_reset = '<S-left>', -- reset scroll to orig pos
},
_new = function() return require 'fzf-lua.previewer.builtin' end,
_new = function() return require 'fzf-lua.previewer.builtin'.buffer_or_file end,
},
},
}
@ -365,6 +365,9 @@ M.globals.helptags = {
["ctrl-v"] = actions.help_vert,
["ctrl-t"] = actions.help_tab,
},
previewer = {
_new = function() return require 'fzf-lua.previewer.builtin'.help_tags end,
},
}
M.globals.manpages = {
prompt = 'Man> ',
@ -375,6 +378,9 @@ M.globals.manpages = {
["ctrl-v"] = actions.man_vert,
["ctrl-t"] = actions.man_tab,
},
previewer = {
_new = function() return require 'fzf-lua.previewer.builtin'.man_pages end,
},
}
M.globals.lsp = {
previewer = function() return M.globals.default_previewer end,
@ -538,6 +544,11 @@ function M.normalize_opts(opts, defaults)
-- globals.default_previewer
opts.previewer = opts.previewer()
end
if type(opts.previewer) == 'table' then
-- merge with the default builtin previewer
opts.previewer = vim.tbl_deep_extend("keep",
opts.previewer, M.globals.previewers.builtin)
end
if opts.cwd and #opts.cwd > 0 then
opts.cwd = vim.fn.expand(opts.cwd)

@ -18,7 +18,7 @@ M.fzf = function(opts, contents)
elseif opts.previewer and type(opts.previewer) == 'table' then
preview_opts = opts.previewer
end
if preview_opts then
if preview_opts and type(preview_opts._new) == 'function' then
previewer = preview_opts._new()(preview_opts, opts, fzf_win)
opts.preview = previewer:cmdline()
if type(previewer.override_fzf_preview_window) == 'function' then

@ -7,25 +7,32 @@ local api = vim.api
local fn = vim.fn
local Previewer = {}
Previewer.base = {}
Previewer.buffer_or_file = {}
Previewer.help_tags = {}
Previewer.man_pages = {}
-- signgleton instance used for our keymappings
local _self = nil
setmetatable(Previewer, {
__call = function (cls, ...)
return cls:new(...)
end,
})
-- Constructors call on Previewer.base.<o>()
for c, _ in pairs(Previewer) do
setmetatable(Previewer[c], {
__call = function (cls, ...)
return cls:new(...)
end,
})
end
function Previewer:setup_keybinds()
function Previewer.base:setup_keybinds()
if not self.win or not self.win.fzf_bufnr then return end
local keymap_tbl = {
toggle_full = { module = 'previewer.builtin', fnc = 'toggle_full()' },
toggle_wrap = { module = 'previewer.builtin', fnc = 'toggle_wrap()' },
toggle_hide = { module = 'previewer.builtin', fnc = 'toggle_hide()' },
page_up = { module = 'previewer.builtin', fnc = 'scroll(-1)' },
page_down = { module = 'previewer.builtin', fnc = 'scroll(1)' },
page_reset = { module = 'previewer.builtin', fnc = 'scroll(0)' },
toggle_full = { module = 'previewer.builtin', fnc = 'base.toggle_full()' },
toggle_wrap = { module = 'previewer.builtin', fnc = 'base.toggle_wrap()' },
toggle_hide = { module = 'previewer.builtin', fnc = 'base.toggle_hide()' },
page_up = { module = 'previewer.builtin', fnc = 'base.scroll(-1)' },
page_down = { module = 'previewer.builtin', fnc = 'base.scroll(1)' },
page_reset = { module = 'previewer.builtin', fnc = 'base.scroll(0)' },
}
local function funcref_str(keymap)
return ([[<Cmd>lua require('fzf-lua.%s').%s<CR>]]):format(keymap.module, keymap.fnc)
@ -39,7 +46,7 @@ function Previewer:setup_keybinds()
end
end
function Previewer:new(o, opts, fzf_win)
function Previewer.base:new(o, opts, fzf_win)
self = setmetatable(previewer_base(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, previewer_base
@ -67,32 +74,14 @@ function Previewer:new(o, opts, fzf_win)
return self
end
function Previewer:close()
function Previewer.base:close()
self:restore_winopts(self.win.preview_winid)
self:clear_preview_buf()
self.backups = {}
_self = nil
end
function Previewer:update_border(entry)
if self.title then
if self.opts.cwd then
entry.path = path.relative(entry.path, self.opts.cwd)
end
local title = (' %s '):format(entry.path)
if entry.bufnr then
-- local border_width = api.nvim_win_get_width(self.win.preview_winid)
local buf_str = ('buf %d:'):format(entry.bufnr)
title = (' %s %s '):format(buf_str, entry.path)
end
self.win:update_title(title)
end
if self.scrollbar then
self.win:update_scrollbar()
end
end
function Previewer:gen_winopts()
function Previewer.base:gen_winopts()
return {
wrap = self.wrap,
number = true,
@ -107,7 +96,7 @@ function Previewer:gen_winopts()
}
end
function Previewer:backup_winopts(win)
function Previewer.base:backup_winopts(win)
if not win or not api.nvim_win_is_valid(win) then return end
for opt, _ in pairs(self:gen_winopts()) do
if utils.nvim_has_option(opt) then
@ -116,14 +105,14 @@ function Previewer:backup_winopts(win)
end
end
function Previewer:restore_winopts(win)
function Previewer.base:restore_winopts(win)
if not win or not api.nvim_win_is_valid(win) then return end
for opt, value in pairs(self.backups) do
vim.api.nvim_win_set_option(win, opt, value)
end
end
function Previewer:set_winopts(win)
function Previewer.base:set_winopts(win)
if not win or not api.nvim_win_is_valid(win) then return end
for opt, v in pairs(self:gen_winopts()) do
if utils.nvim_has_option(opt) then
@ -132,76 +121,7 @@ function Previewer:set_winopts(win)
end
end
local function set_cursor_hl(self, entry)
local lnum, col = tonumber(entry.line), tonumber(entry.col) or 1
local pattern = entry.pattern or entry.text
if not lnum or lnum < 1 then
api.nvim_win_set_cursor(0, {1, 0})
if pattern ~= '' then
fn.search(pattern, 'c')
end
else
if not pcall(api.nvim_win_set_cursor, 0, {lnum, math.max(0, col - 1)}) then
return
end
end
utils.zz()
self.orig_pos = api.nvim_win_get_cursor(0)
fn.clearmatches()
if lnum and lnum > 0 and col and col > 1 then
fn.matchaddpos(self.hl_cursor, {{lnum, math.max(1, col)}}, 11)
end
end
function Previewer:do_syntax(entry)
if not self.preview_bufnr then return end
local bufnr = self.preview_bufnr
local preview_winid = self.win.preview_winid
if self.preview_bufloaded and vim.bo[bufnr].filetype == '' then
if fn.bufwinid(bufnr) == preview_winid then
-- do not enable for large files, treesitter still has perf issues:
-- https://github.com/nvim-treesitter/nvim-treesitter/issues/556
-- https://github.com/nvim-treesitter/nvim-treesitter/issues/898
local lcount = api.nvim_buf_line_count(bufnr)
local bytes = api.nvim_buf_get_offset(bufnr, lcount)
local syntax_limit_reached = 0
if self.syntax_limit_l > 0 and lcount > self.syntax_limit_l then
syntax_limit_reached = 1
end
if self.syntax_limit_b > 0 and bytes > self.syntax_limit_b then
syntax_limit_reached = 2
end
if syntax_limit_reached > 0 then
utils.info(string.format(
"syntax disabled for '%s' (%s), consider increasing '%s(%d)'", entry.path,
utils._if(syntax_limit_reached==1,
("%d lines"):format(lcount),
("%db"):format(bytes)),
utils._if(syntax_limit_reached==1, 'syntax_limit_l', 'syntax_limit_b'),
utils._if(syntax_limit_reached==1, self.syntax_limit_l, self.syntax_limit_b)
))
end
if syntax_limit_reached == 0 then
-- prepend the buffer number to the path and
-- set as buffer name, this makes sure 'filetype detect'
-- gets the right filetype which enables the syntax
local tempname = path.join({tostring(bufnr), entry.path})
pcall(api.nvim_buf_set_name, bufnr, tempname)
-- nvim_buf_call has less side-effects than window switch
api.nvim_buf_call(bufnr, function()
vim.cmd('filetype detect')
end)
end
end
end
end
function Previewer:set_tmp_buffer()
function Previewer.base:set_tmp_buffer()
if not self.win or not self.win:validate_preview() then return end
local tmp_buf = api.nvim_create_buf(false, true)
api.nvim_buf_set_option(tmp_buf, 'bufhidden', 'wipe')
@ -209,7 +129,7 @@ function Previewer:set_tmp_buffer()
return tmp_buf
end
function Previewer:clear_preview_buf()
function Previewer.base:clear_preview_buf()
local retbuf = nil
if self.win and self.win:validate_preview() then
-- attach a temp buffer to the window
@ -231,119 +151,60 @@ function Previewer:clear_preview_buf()
return retbuf
end
function Previewer:display_last_entry()
function Previewer.base:display_last_entry()
self:display_entry(self.last_entry)
end
function Previewer:preview_buf_post(entry)
local bufnr = self.preview_bufnr
local preview_winid = self.win.preview_winid
-- set preview win options or load the file
-- if not already loaded from buffer
vim.api.nvim_win_call(preview_winid, function()
set_cursor_hl(self, entry)
end)
-- set preview window options
if not utils.is_term_buffer(bufnr) then
self:set_winopts(preview_winid)
end
-- reset the preview window highlights
self.win:reset_win_highlights(preview_winid)
-- local ml = vim.bo[entry.bufnr].ml
-- vim.bo[entry.bufnr].ml = false
if self.syntax then
vim.defer_fn(function()
self:do_syntax(entry)
-- vim.bo[entry.bufnr].ml = ml
end, self.syntax_delay)
end
self:update_border(entry)
end
function Previewer:display_entry(entry)
if not entry then return
function Previewer.base:display_entry(entry_str)
if not entry_str then return
else
-- save last entry even if we don't display
self.last_entry = entry
self.last_entry = entry_str
end
if not self.win or not self.win:validate_preview() then return end
if rawequal(next(self.backups), nil) then
self:backup_winopts(self.win.src_winid)
end
local preview_winid = self.win.preview_winid
local previous_bufnr = api.nvim_win_get_buf(preview_winid)
local previous_bufnr = api.nvim_win_get_buf(self.win.preview_winid)
assert(not self.preview_bufnr or previous_bufnr == self.preview_bufnr)
-- clear the current preview buffer
local bufnr = self:clear_preview_buf()
-- store the preview buffer
self.preview_bufnr = bufnr
if entry.bufnr and api.nvim_buf_is_loaded(entry.bufnr) then
-- must convert to number or our backup will have conflicting keys
bufnr = tonumber(entry.bufnr)
-- display the buffer in the preview
api.nvim_win_set_buf(preview_winid, bufnr)
-- store current preview buffer
self.preview_bufnr = bufnr
self:preview_buf_post(entry)
else
-- mark the buffer for unloading the next call
self.preview_bufloaded = true
-- make sure the file is readable (or bad entry.path)
if not vim.loop.fs_stat(entry.path) then return end
-- read the file into the buffer
utils.read_file_async(entry.path, vim.schedule_wrap(function(data)
if not vim.api.nvim_buf_is_valid(bufnr) then
return
end
-- store the new preview buffer
self.preview_bufnr = self:clear_preview_buf()
local lines = vim.split(data, "[\r]?\n")
-- specialized previewer populate function
self:populate_preview_buf(entry_str)
-- if file ends in new line, don't write an empty string as the last
-- line.
if data:sub(#data, #data) == "\n" or data:sub(#data-1,#data) == "\r\n" then
table.remove(lines)
end
local ok = pcall(vim.api.nvim_buf_set_lines, bufnr, 0, -1, false, lines)
if not ok then
return
end
self:preview_buf_post(entry)
end))
-- set preview window options
if not utils.is_term_buffer(self.preview_bufnr) then
self:set_winopts(self.win.preview_winid)
end
-- reset the preview window highlights
self.win:reset_win_highlights(self.win.preview_winid)
end
function Previewer:action(_)
function Previewer.base:action(_)
local act = raw_action(function (items, _, _)
local entry = path.entry_to_file(items[1], self.opts.cwd)
self:display_entry(entry)
self:display_entry(items[1])
return ""
end, "{}")
return act
end
function Previewer:cmdline(_)
function Previewer.base:cmdline(_)
return vim.fn.shellescape(self:action())
-- return 'true'
end
function Previewer:preview_window(_)
function Previewer.base:preview_window(_)
return 'nohidden:right:0'
end
function Previewer:override_fzf_preview_window()
function Previewer.base:override_fzf_preview_window()
return self.win and not self.win.winopts.split
end
function Previewer.scroll(direction)
function Previewer.base.scroll(direction)
if not _self then return end
local self = _self
local preview_winid = self.win.preview_winid
@ -388,7 +249,7 @@ function Previewer.scroll(direction)
end
end
function Previewer.toggle_wrap()
function Previewer.base.toggle_wrap()
if not _self then return end
local self = _self
self.wrap = not self.wrap
@ -397,7 +258,7 @@ function Previewer.toggle_wrap()
end
end
function Previewer.toggle_full()
function Previewer.base.toggle_full()
if not _self then return end
local self = _self
self.expand = not self.expand
@ -406,7 +267,7 @@ function Previewer.toggle_full()
end
end
function Previewer.toggle_hide()
function Previewer.base.toggle_hide()
if not _self then return end
local self = _self
self.hidden = not self.hidden
@ -420,10 +281,265 @@ function Previewer.toggle_hide()
self:display_last_entry()
end
end
-- close_preview() calls Previewer:close()
-- close_preview() calls Previewer.base:close()
-- which will clear out our singleton so
-- we must save it again to call redraw
_self = self
end
function Previewer.buffer_or_file:new(o, opts, fzf_win)
self = setmetatable(Previewer.base(o, opts, fzf_win), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.base
)})
return self
end
function Previewer.buffer_or_file:populate_preview_buf(entry_str)
local entry = path.entry_to_file(entry_str, self.opts.cwd)
if entry.bufnr and api.nvim_buf_is_loaded(entry.bufnr) then
-- must convert to number or our backup will have conflicting keys
local bufnr = tonumber(entry.bufnr)
-- display the buffer in the preview
api.nvim_win_set_buf(self.win.preview_winid, bufnr)
-- store current preview buffer
self.preview_bufnr = bufnr
self:preview_buf_post(entry)
else
-- mark the buffer for unloading the next call
self.preview_bufloaded = true
-- make sure the file is readable (or bad entry.path)
if not vim.loop.fs_stat(entry.path) then return end
-- read the file into the buffer
utils.read_file_async(entry.path, vim.schedule_wrap(function(data)
if not vim.api.nvim_buf_is_valid(self.preview_bufnr) then
return
end
local lines = vim.split(data, "[\r]?\n")
-- if file ends in new line, don't write an empty string as the last
-- line.
if data:sub(#data, #data) == "\n" or data:sub(#data-1,#data) == "\r\n" then
table.remove(lines)
end
local ok = pcall(vim.api.nvim_buf_set_lines, self.preview_bufnr, 0, -1, false, lines)
if not ok then
return
end
self:preview_buf_post(entry)
end))
end
end
function Previewer.buffer_or_file:do_syntax(entry)
if not entry then return end
if not self.preview_bufnr then return end
local bufnr = self.preview_bufnr
local preview_winid = self.win.preview_winid
if self.preview_bufloaded and vim.bo[bufnr].filetype == '' then
if fn.bufwinid(bufnr) == preview_winid then
-- do not enable for large files, treesitter still has perf issues:
-- https://github.com/nvim-treesitter/nvim-treesitter/issues/556
-- https://github.com/nvim-treesitter/nvim-treesitter/issues/898
local lcount = api.nvim_buf_line_count(bufnr)
local bytes = api.nvim_buf_get_offset(bufnr, lcount)
local syntax_limit_reached = 0
if self.syntax_limit_l > 0 and lcount > self.syntax_limit_l then
syntax_limit_reached = 1
end
if self.syntax_limit_b > 0 and bytes > self.syntax_limit_b then
syntax_limit_reached = 2
end
if syntax_limit_reached > 0 then
utils.info(string.format(
"syntax disabled for '%s' (%s), consider increasing '%s(%d)'", entry.path,
utils._if(syntax_limit_reached==1,
("%d lines"):format(lcount),
("%db"):format(bytes)),
utils._if(syntax_limit_reached==1, 'syntax_limit_l', 'syntax_limit_b'),
utils._if(syntax_limit_reached==1, self.syntax_limit_l, self.syntax_limit_b)
))
end
if syntax_limit_reached == 0 then
-- prepend the buffer number to the path and
-- set as buffer name, this makes sure 'filetype detect'
-- gets the right filetype which enables the syntax
local tempname = path.join({tostring(bufnr), entry.path})
pcall(api.nvim_buf_set_name, bufnr, tempname)
-- nvim_buf_call has less side-effects than window switch
api.nvim_buf_call(bufnr, function()
vim.cmd('filetype detect')
end)
end
end
end
end
local function set_cursor_hl(self, entry)
local lnum, col = tonumber(entry.line), tonumber(entry.col) or 1
local pattern = entry.pattern or entry.text
if not lnum or lnum < 1 then
api.nvim_win_set_cursor(0, {1, 0})
if pattern ~= '' then
fn.search(pattern, 'c')
end
else
if not pcall(api.nvim_win_set_cursor, 0, {lnum, math.max(0, col - 1)}) then
return
end
end
utils.zz()
self.orig_pos = api.nvim_win_get_cursor(0)
fn.clearmatches()
if lnum and lnum > 0 and col and col > 1 then
fn.matchaddpos(self.hl_cursor, {{lnum, math.max(1, col)}}, 11)
end
end
function Previewer.buffer_or_file:update_border(entry)
if self.title then
if self.opts.cwd then
entry.path = path.relative(entry.path, self.opts.cwd)
end
local title = (' %s '):format(entry.path)
if entry.bufnr then
-- local border_width = api.nvim_win_get_width(self.win.preview_winid)
local buf_str = ('buf %d:'):format(entry.bufnr)
title = (' %s %s '):format(buf_str, entry.path)
end
self.win:update_title(title)
end
if self.scrollbar then
self.win:update_scrollbar()
end
end
function Previewer.buffer_or_file:preview_buf_post(entry)
-- set preview win options or load the file
-- if not already loaded from buffer
vim.api.nvim_win_call(self.win.preview_winid, function()
set_cursor_hl(self, entry)
end)
-- local ml = vim.bo[entry.bufnr].ml
-- vim.bo[entry.bufnr].ml = false
if self.syntax then
vim.defer_fn(function()
self:do_syntax(entry)
-- vim.bo[entry.bufnr].ml = ml
end, self.syntax_delay)
end
self:update_border(entry)
end
function Previewer.help_tags:new(o, opts, fzf_win)
self = setmetatable(Previewer.base(o, opts, fzf_win), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.base
)})
self:init_help_win()
return self
end
function Previewer.help_tags:gen_winopts()
return {
wrap = self.wrap,
number = false,
relativenumber = false,
cursorline = true,
cursorlineopt = 'both',
cursorcolumn = false,
signcolumn = 'no',
list = false,
foldenable = false,
foldmethod = 'manual',
}
end
function Previewer.help_tags:exec_cmd(str)
str = str or ''
vim.cmd("help " .. str)
end
function Previewer.help_tags:parse_entry(entry_str)
return entry_str
end
function Previewer.help_tags:init_help_win(str)
self:exec_cmd(str)
self.help_bufnr = api.nvim_get_current_buf()
self.help_winid = api.nvim_get_current_win()
pcall(vim.api.nvim_win_set_height, 0, 0)
pcall(vim.api.nvim_win_set_width, 0, 0)
end
function Previewer.help_tags:populate_preview_buf(entry_str)
local entry = self:parse_entry(entry_str)
vim.api.nvim_win_call(self.help_winid, function()
self.prev_help_bufnr = api.nvim_get_current_buf()
self:exec_cmd(entry)
self.preview_bufnr = api.nvim_get_current_buf()
self.orig_pos = api.nvim_win_get_cursor(0)
end)
api.nvim_win_set_buf(self.win.preview_winid, self.preview_bufnr)
api.nvim_win_set_cursor(self.win.preview_winid, self.orig_pos)
if self.scrollbar then
self.win:update_scrollbar()
end
if self.prev_help_bufnr ~= self.preview_bufnr and
-- only delete the help buffer when the help
-- tag triggers opening a different help file
api.nvim_buf_is_valid(self.prev_help_bufnr) then
api.nvim_buf_delete(self.prev_help_bufnr, {force=true})
-- save the last buffer so we can close it
-- at the win_leave event
self.prev_help_bufnr = self.preview_bufnr
end
end
function Previewer.help_tags:win_leave()
if vim.api.nvim_win_is_valid(self.help_winid) then
api.nvim_win_close(self.help_winid, true)
end
if vim.api.nvim_buf_is_valid(self.help_bufnr) then
vim.api.nvim_buf_delete(self.help_bufnr, {force=true})
end
if vim.api.nvim_buf_is_valid(self.prev_help_bufnr) then
vim.api.nvim_buf_delete(self.prev_help_bufnr, {force=true})
end
self.help_winid = nil
self.help_bufnr = nil
self.prev_help_bufnr = nil
end
-- inherit from help_tags
function Previewer.man_pages:new(o, opts, fzf_win)
self = setmetatable(Previewer.base(o, opts, fzf_win), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.help_tags, Previewer.base
)})
self:init_help_win("echo")
return self
end
function Previewer.man_pages:exec_cmd(str)
str = str or ''
vim.cmd("Man " .. str)
end
function Previewer.man_pages:parse_entry(entry_str)
return entry_str:match("[^[,( ]+")
-- return require'fzf-lua.providers.manpages'.getmanpage(entry_str)
end
return Previewer

@ -11,6 +11,7 @@ Previewer.bat = {}
Previewer.cmd_async = {}
Previewer.bat_async = {}
Previewer.git_diff = {}
Previewer.man_pages = {}
Previewer.buffer = {}
-- Constructors call on Previewer.<o>()
@ -128,9 +129,9 @@ function Previewer.cmd_async:cmdline(o)
end
function Previewer.bat_async:new(o, opts)
self = setmetatable(Previewer.cmd(o, opts), {
self = setmetatable(Previewer.cmd_async(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd, Previewer.base
self, Previewer.cmd_async, Previewer.base
)})
self.theme = o.theme
return self
@ -157,7 +158,7 @@ function Previewer.bat_async:cmdline(o)
end
function Previewer.git_diff:new(o, opts)
self = setmetatable(Previewer.cmd(o, opts), {
self = setmetatable(Previewer.cmd_async(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd_async, Previewer.base
)})
@ -187,4 +188,34 @@ function Previewer.git_diff:cmdline(o)
return act
end
function Previewer.man_pages:new(o, opts)
self = setmetatable(Previewer.cmd_async(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd_async, Previewer.base
)})
return self
end
function Previewer.man_pages:cmdline(o)
o = o or {}
local act = helpers.choices_to_shell_cmd_previewer(function(items)
-- local manpage = require'fzf-lua.providers.manpages'.getmanpage(items[1])
local manpage = items[1]:match("[^[,( ]+")
local cmd = ("%s %s %s"):format(
self.cmd, self.args, vim.fn.shellescape(manpage))
-- uncomment to see the command in the preview window
-- cmd = vim.fn.shellescape(cmd)
return cmd
end, "{}")
return act
end
function Previewer.man_pages:override_fzf_preview_window()
return true
end
function Previewer.man_pages:preview_window(_)
return nil
end
return Previewer

@ -11,8 +11,8 @@ local actions = require "fzf-lua.actions"
local M = {}
local function getmanpage(line)
-- extract section from the last pair of parentheses
M.getmanpage = function(line)
--[[ -- extract section from the last pair of parentheses
local name, section = line:match("^(.*)%((.-)%)[^()]-$")
if name:sub(-1) == " " then
-- man-db
@ -22,7 +22,8 @@ local function getmanpage(line)
name = name:match("^[^, ]+")
section = section:match("^[^, ]+")
end
return name .. "(" .. section .. ")"
return name .. "(" .. section .. ")" ]]
return line:match("[^[,( ]+")
end
M.manpages = function(opts)
@ -41,9 +42,9 @@ M.manpages = function(opts)
utils.ansi_codes.red(man), desc)
end)
opts.nomulti = true
opts.preview_window = 'hidden:right:0'
opts._fzf_cli_args = "--tiebreak begin --nth 1,2"
opts.preview_window = opts.preview_window or 'right:0'
opts.nomulti = utils._if(opts.nomulti~=nil, opts.nomulti, true)
local selected = core.fzf(opts, fzf_fn)
@ -51,7 +52,7 @@ M.manpages = function(opts)
if #selected > 1 then
for i = 2, #selected do
selected[i] = getmanpage(selected[i])
selected[i] = M.getmanpage(selected[i])
end
end

@ -180,18 +180,13 @@ function FzfWin:new(o)
self.winopts = normalize_winopts(o)
self.previewer = o.previewer
self.previewer_type = o.previewer_type
if self.previewer_type == 'builtin' or self.previewer == 'builtin' then
self.previewer_is_builtin = true
end
if not self.winopts.split and self.previewer_is_builtin then
self.layout = generate_layout(self.winopts)
end
_self = self
return self
end
function FzfWin:attach_previewer(previewer)
self._previewer = previewer
self.previewer_is_builtin = previewer and type(previewer.display_entry) == 'function'
end
function FzfWin:fs_preview_layout(fs)
@ -388,6 +383,9 @@ function FzfWin:redraw()
end
function FzfWin:create()
if not self.winopts.split and self.previewer_is_builtin then
self.layout = generate_layout(self.winopts)
end
-- save sending bufnr/winid
self.src_bufnr = vim.api.nvim_get_current_buf()
self.src_winid = vim.api.nvim_get_current_win()
@ -470,7 +468,11 @@ function FzfWin:close()
end
function FzfWin.win_leave()
if not _self or _self.closing then return end
local self = _self
if self._previewer and self._previewer.win_leave then
self._previewer:win_leave()
end
if not self or self.closing then return end
_self:close()
end

Loading…
Cancel
Save