tags: optimized performance with the builtin previewer (#245)

main
bhagwan 3 years ago
parent 028460f728
commit 46c9e2bcd2

@ -238,6 +238,7 @@ require'fzf-lua'.setup {
-- Only valid with the builtin previewer:
cursor = 'Cursor', -- cursor highlight (grep/LSP matches)
cursorline = 'CursorLine', -- cursor line
search = 'Search', -- search matches (ctags)
-- title = 'Normal', -- preview border title (file/buffer)
-- scrollbar_f = 'PmenuThumb', -- scrollbar "full" section highlight
-- scrollbar_e = 'PmenuSbar', -- scrollbar "empty" section highlight

@ -272,6 +272,7 @@ Consult the list below for available settings:
-- Only valid with the builtin previewer:
cursor = 'Cursor', -- cursor highlight (grep/LSP matches)
cursorline = 'CursorLine', -- cursor line
search = 'Search', -- search matches (ctags)
-- title = 'Normal', -- preview border title (file/buffer)
-- scrollbar_f = 'PmenuThumb', -- scrollbar "full" section highlight
-- scrollbar_e = 'PmenuSbar', -- scrollbar "empty" section highlight

@ -0,0 +1,69 @@
--
-- classic
-- https://github.com/rxi/classic
--
-- Copyright (c) 2014, rxi
--
-- This module is free software; you can redistribute it and/or modify it under
-- the terms of the MIT license. See LICENSE for details.
--
local Object = {}
Object.__index = Object
function Object:new()
end
function Object:extend()
local cls = {}
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
cls.super = self
setmetatable(cls, self)
return cls
end
function Object:implement(...)
for _, cls in pairs({...}) do
for k, v in pairs(cls) do
if self[k] == nil and type(v) == "function" then
self[k] = v
end
end
end
end
function Object:is(T)
local mt = getmetatable(self)
while mt do
if mt == T then
return true
end
mt = getmetatable(mt)
end
return false
end
function Object:__tostring()
return "Object"
end
function Object:__call(...)
local obj = setmetatable({}, self)
obj:new(...)
return obj
end
return Object

@ -38,6 +38,7 @@ M.globals = {
-- builtin preview only
cursor = 'Cursor',
cursorline = 'CursorLine',
search = 'Search',
-- title = 'Normal',
-- scrollbar_f = 'PmenuThumb',
-- scrollbar_e = 'PmenuSbar',
@ -355,22 +356,22 @@ M.globals.blines = {
},
}
M.globals.tags = {
previewer = M._default_previewer_fn,
previewer = { _ctor = previewers.builtin.tags },
prompt = 'Tags> ',
ctags_file = "tags",
file_icons = true and M._has_devicons,
git_icons = true,
color_icons = true,
actions = M.globals.files.actions,
actions = M.globals.files.actions,
}
M.globals.btags = {
previewer = M._default_previewer_fn,
previewer = { _ctor = previewers.builtin.tags },
prompt = 'BTags> ',
ctags_file = "tags",
file_icons = true and M._has_devicons,
git_icons = true,
color_icons = true,
actions = M.globals.files.actions,
actions = M.globals.files.actions,
}
M.globals.colorschemes = {
prompt = 'Colorschemes> ',
@ -648,7 +649,7 @@ function M.normalize_opts(opts, defaults)
opts.cwd = nil
end
end
-- test for valid git_repo
opts.git_icons = opts.git_icons and path.is_git_repo(opts.cwd, true)

@ -1,34 +1,19 @@
local path = require "fzf-lua.path"
local shell = require "fzf-lua.shell"
local utils = require "fzf-lua.utils"
local previewer_base = require "fzf-lua.previewer"
local Object = require "fzf-lua.class"
local api = vim.api
local fn = vim.fn
local Previewer = {}
Previewer.base = {}
Previewer.buffer_or_file = {}
Previewer.help_tags = {}
Previewer.man_pages = {}
Previewer.marks = {}
-- Constructors call on Previewer.base.<o>()
for c, _ in pairs(Previewer) do
setmetatable(Previewer[c], {
__call = function (cls, ...)
return cls:new(...)
end,
})
end
Previewer.base = Object:extend()
function Previewer.base:new(o, opts, fzf_win)
self = setmetatable(previewer_base(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, previewer_base
)})
o = o or {}
self.type = "builtin"
self.opts = opts;
self.win = fzf_win
self.delay = self.win.winopts.preview.delay or 100
self.title = self.win.winopts.preview.title
@ -227,11 +212,10 @@ function Previewer.base:scroll(direction)
end
Previewer.buffer_or_file = Previewer.base:extend()
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
)})
Previewer.buffer_or_file.super.new(self, o, opts, fzf_win)
return self
end
@ -384,7 +368,8 @@ function Previewer.buffer_or_file:do_syntax(entry)
end
end
local function set_cursor_hl(self, entry)
function Previewer.buffer_or_file:set_cursor_hl(entry)
vim.api.nvim_win_call(self.win.preview_winid, function()
local lnum, col = tonumber(entry.line), tonumber(entry.col) or 1
local pattern = entry.pattern or entry.text
@ -408,6 +393,7 @@ local function set_cursor_hl(self, entry)
if self.win.winopts.hl.cursor and lnum and lnum > 0 and col and col > 1 then
fn.matchaddpos(self.win.winopts.hl.cursor, {{lnum, math.max(1, col)}}, 11)
end
end)
end
function Previewer.buffer_or_file:update_border(entry)
@ -429,9 +415,7 @@ 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)
self:set_cursor_hl(entry)
-- syntax highlighting
if self.syntax then
@ -453,11 +437,10 @@ function Previewer.buffer_or_file:preview_buf_post(entry)
end
Previewer.help_tags = Previewer.base:extend()
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
)})
Previewer.help_tags.super.new(self, o, opts, fzf_win)
self.split = o.split
self.help_cmd = o.help_cmd or "help"
self.filetype = "help"
@ -552,11 +535,10 @@ end
-- inherit from help_tags for the specialized
-- 'gen_winopts()' without ':set number'
Previewer.man_pages = Previewer.help_tags:extend()
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
)})
Previewer.man_pages.super.new(self, o, opts, fzf_win)
self.filetype = "man"
self.cmd = o.cmd or "man -c %s | col -bx"
return self
@ -580,11 +562,10 @@ function Previewer.man_pages:populate_preview_buf(entry_str)
self.win:update_scrollbar()
end
Previewer.marks = Previewer.buffer_or_file:extend()
function Previewer.marks:new(o, opts, fzf_win)
self = setmetatable(Previewer.buffer_or_file(o, opts, fzf_win), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.buffer_or_file, Previewer.base
)})
Previewer.marks.super.new(self, o, opts, fzf_win)
return self
end
@ -612,4 +593,44 @@ function Previewer.marks:parse_entry(entry_str)
}
end
Previewer.tags = Previewer.buffer_or_file:extend()
function Previewer.tags:new(o, opts, fzf_win)
Previewer.tags.super.new(self, o, opts, fzf_win)
return self
end
function Previewer.tags:parse_entry(entry_str)
-- first parse as normal entry
local entry = self.super.parse_entry(self, entry_str)
-- add the ctag part:
-- must use 'super.' and send self as 1st arg
-- or the ':' syntactic suger will send super's
-- self which doesn't have self.opts
local scode = entry_str:match("%:.-/^?\t?(.*)/")
if scode then
scode = string.gsub(scode, "[$]$", "")
scode = string.gsub(scode, [[\\]], [[\]])
scode = string.gsub(scode, [[\/]], [[/]])
scode = string.gsub(scode, "[*]", [[\*]])
end
entry.ctag = scode
return entry
end
function Previewer.tags:set_cursor_hl(entry)
-- pcall(vim.fn.clearmatches, self.win.preview_winid)
api.nvim_win_call(self.win.preview_winid, function()
-- start searching at line 1 in case we
-- didn't reload the buffer (same file)
api.nvim_win_set_cursor(0, {1, 0})
fn.clearmatches()
fn.search(entry.ctag, "W")
if self.win.winopts.hl.search then
fn.matchadd(self.win.winopts.hl.search, entry.ctag)
end
utils.zz()
end)
end
return Previewer

@ -2,35 +2,21 @@ local path = require "fzf-lua.path"
local shell = require "fzf-lua.shell"
local utils = require "fzf-lua.utils"
local libuv = require "fzf-lua.libuv"
local previewer_base = require "fzf-lua.previewer"
local Object = require "fzf-lua.class"
local Previewer = {}
Previewer.base = {}
Previewer.head = {}
Previewer.cmd = {}
Previewer.bat = {}
Previewer.cmd_async = {}
Previewer.bat_async = {}
Previewer.git_diff = {}
Previewer.man_pages = {}
Previewer.buffer = {}
-- Constructors call on Previewer.<o>()
for c, _ in pairs(Previewer) do
setmetatable(Previewer[c], {
__call = function (cls, ...)
return cls:new(...)
end,
})
end
Previewer.base = Object:extend()
-- Previewer base object
function Previewer.base:new(o, opts)
self = setmetatable(previewer_base(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, previewer_base
)})
o = o or {}
self.type = "cmd";
self.cmd = o.cmd;
self.args = o.args or "";
self.relative = o.relative
self.opts = opts;
return self
end
@ -39,11 +25,10 @@ function Previewer.base:preview_window(_)
end
-- Generic shell command previewer
Previewer.cmd = Previewer.base:extend()
function Previewer.cmd:new(o, opts)
self = setmetatable(Previewer.base(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.base
)})
Previewer.cmd.super.new(self, o, opts)
return self
end
@ -69,11 +54,10 @@ function Previewer.cmd:action(o)
end
-- Specialized bat previewer
Previewer.bat = Previewer.cmd:extend()
function Previewer.bat:new(o, opts)
self = setmetatable(Previewer.cmd(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd, Previewer.base
)})
Previewer.bat.super.new(self, o, opts)
self.theme = o.theme
return self
end
@ -90,12 +74,10 @@ function Previewer.bat:cmdline(o)
end
-- Specialized head previewer
Previewer.head = Previewer.cmd:extend()
function Previewer.head:new(o, opts)
self = setmetatable(Previewer.cmd(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd, Previewer.base
)})
self.theme = o.theme
Previewer.head.super.new(self, o, opts)
return self
end
@ -111,11 +93,10 @@ function Previewer.head:cmdline(o)
end
-- new async_action from nvim-fzf
Previewer.cmd_async = Previewer.base:extend()
function Previewer.cmd_async:new(o, opts)
self = setmetatable(Previewer.base(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.base
)})
Previewer.cmd_async.super.new(self, o, opts)
return self
end
@ -131,11 +112,10 @@ function Previewer.cmd_async:cmdline(o)
return act
end
Previewer.bat_async = Previewer.cmd_async:extend()
function Previewer.bat_async:new(o, opts)
self = setmetatable(Previewer.cmd_async(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd_async, Previewer.base
)})
Previewer.bat_async.super.new(self, o, opts)
self.theme = o.theme
return self
end
@ -160,12 +140,12 @@ function Previewer.bat_async:cmdline(o)
return act
end
Previewer.git_diff = Previewer.cmd_async:extend()
function Previewer.git_diff:new(o, opts)
self = setmetatable(Previewer.cmd_async(o, opts), {
__index = vim.tbl_deep_extend("keep",
self, Previewer.cmd_async, Previewer.base
)})
Previewer.git_diff.super.new(self, o, opts)
self.cmd = path.git_cwd(self.cmd, opts.cwd)
self.pager = o.pager
return self
end
@ -196,11 +176,10 @@ function Previewer.git_diff:cmdline(o)
return act
end
Previewer.man_pages = Previewer.cmd_async:extend()
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
)})
Previewer.man_pages.super.new(self, o, opts)
self.cmd = self.cmd or "man"
return self
end

@ -1,31 +1,5 @@
local utils = require "fzf-lua.utils"
local Previewer = {}
-- Constructor
setmetatable(Previewer, {
__call = function (cls, ...)
return cls:new(...)
end,
})
-- Previewer base object
function Previewer:new(o, opts)
o = o or {}
self = setmetatable({}, { __index = self })
self.cmd = o.cmd;
self.args = o.args or "";
self.relative = o.relative
self.pager = o.pager
self.opts = opts;
return self
end
function Previewer:preview_window(_)
utils.warn("Previewer:preview_window wasn't implemented, will use defaults")
return nil
end
Previewer.fzf = {}
Previewer.fzf.cmd = function() return require 'fzf-lua.previewer.fzf'.cmd end
Previewer.fzf.bat = function() return require 'fzf-lua.previewer.fzf'.bat end
@ -40,5 +14,6 @@ Previewer.builtin.buffer_or_file = function() return require 'fzf-lua.previewer.
Previewer.builtin.help_tags = function() return require 'fzf-lua.previewer.builtin'.help_tags end
Previewer.builtin.man_pages = function() return require 'fzf-lua.previewer.builtin'.man_pages end
Previewer.builtin.marks = function() return require 'fzf-lua.previewer.builtin'.marks end
Previewer.builtin.tags = function() return require 'fzf-lua.previewer.builtin'.tags end
return Previewer

@ -93,7 +93,7 @@ local fzf_tags = function(opts)
end
local add_tag = function(t, fzf_cb, co)
local line = getlinenumber(t)
local line = t.line or getlinenumber(t)
local tag = string.format("%s:%s: %s %s",
core.make_entry_file(opts, t.file),
utils.ansi_codes.green(tostring(line)),
@ -119,6 +119,9 @@ local fzf_tags = function(opts)
add_tag({
name = name,
file = file,
-- unless we're using native previewer
-- do not need to extract the line number
line = type(opts.previewer) == 'table' and 1,
text = text,
}, cb, co)
end)

Loading…
Cancel
Save