96 lines
2.6 KiB
Lua
96 lines
2.6 KiB
Lua
return {
|
|
{
|
|
"kevinhwang91/nvim-bqf",
|
|
event = "VeryLazy",
|
|
dependencies = {
|
|
{
|
|
"junegunn/fzf",
|
|
build = function()
|
|
vim.fn["fzf#install"]()
|
|
end,
|
|
},
|
|
},
|
|
config = function()
|
|
local fn = vim.fn
|
|
|
|
function _G.qftf(info)
|
|
local items
|
|
local ret = {}
|
|
-- The name of item in list is based on the directory of quickfix window.
|
|
-- Change the directory for quickfix window make the name of item shorter.
|
|
-- It's a good opportunity to change current directory in quickfixtextfunc :)
|
|
--
|
|
-- local alterBufnr = fn.bufname('#') -- alternative buffer is the buffer before enter qf window
|
|
-- local root = getRootByAlterBufnr(alterBufnr)
|
|
-- vim.cmd(('noa lcd %s'):format(fn.fnameescape(root)))
|
|
--
|
|
if info.quickfix == 1 then
|
|
items = fn.getqflist({ id = info.id, items = 0 }).items
|
|
else
|
|
items = fn.getloclist(info.winid, { id = info.id, items = 0 }).items
|
|
end
|
|
local limit = 31
|
|
local fnameFmt1, fnameFmt2 = "%-" .. limit .. "s", "…%." .. (limit - 1) .. "s"
|
|
local validFmt = "%s │%5d:%-3d│%s %s"
|
|
for i = info.start_idx, info.end_idx do
|
|
local e = items[i]
|
|
local fname = ""
|
|
local str
|
|
if e.valid == 1 then
|
|
if e.bufnr > 0 then
|
|
fname = fn.bufname(e.bufnr)
|
|
if fname == "" then
|
|
fname = "[No Name]"
|
|
else
|
|
fname = fname:gsub("^" .. vim.env.HOME, "~")
|
|
end
|
|
-- char in fname may occur more than 1 width, ignore this issue in order to keep performance
|
|
if #fname <= limit then
|
|
fname = fnameFmt1:format(fname)
|
|
else
|
|
fname = fnameFmt2:format(fname:sub(1 - limit))
|
|
end
|
|
end
|
|
local lnum = e.lnum > 99999 and -1 or e.lnum
|
|
local col = e.col > 999 and -1 or e.col
|
|
local qtype = e.type == "" and "" or " " .. e.type:sub(1, 1):upper()
|
|
str = validFmt:format(fname, lnum, col, qtype, e.text)
|
|
else
|
|
str = e.text
|
|
end
|
|
table.insert(ret, str)
|
|
end
|
|
return ret
|
|
end
|
|
|
|
vim.o.qftf = "{info -> v:lua._G.qftf(info)}"
|
|
|
|
-- Adapt fzf's delimiter in nvim-bqf
|
|
require("bqf").setup({
|
|
filter = {
|
|
fzf = {
|
|
extra_opts = { "--bind", "ctrl-o:toggle-all", "--delimiter", "│" },
|
|
},
|
|
},
|
|
})
|
|
|
|
local toggle_qf = function()
|
|
local qf_open = false
|
|
for _, win in pairs(vim.fn.getwininfo()) do
|
|
if win["quickfix"] == 1 then
|
|
qf_open = true
|
|
end
|
|
end
|
|
if qf_open == true then
|
|
vim.cmd("cclose")
|
|
return
|
|
end
|
|
if not vim.tbl_isempty(vim.fn.getqflist()) then
|
|
vim.cmd("copen")
|
|
end
|
|
end
|
|
|
|
MAP("n", "<Leader>fq", toggle_qf, "Toggle quickfix")
|
|
end,
|
|
},
|
|
}
|