fix: get mark list from opts.bufnr instead of using :marks (#1935)

Should fix marks when going through builtin.builtin
This commit is contained in:
pjmtdw
2022-05-16 05:00:01 +09:00
committed by GitHub
parent 20040cac31
commit 2e421ef02d
2 changed files with 47 additions and 18 deletions

View File

@@ -993,11 +993,45 @@ internal.colorscheme = function(opts)
end end
internal.marks = function(opts) internal.marks = function(opts)
local marks = vim.api.nvim_exec("marks", true) local local_marks = {
local marks_table = vim.fn.split(marks, "\n") items = vim.fn.getmarklist(opts.bufnr),
name_func = function(_, line)
-- Pop off the header. return vim.api.nvim_buf_get_lines(opts.bufnr, line - 1, line, false)[1]
table.remove(marks_table, 1) end,
}
local global_marks = {
items = vim.fn.getmarklist(),
name_func = function(mark, _)
-- get buffer name if it is opened, otherwise get file name
return vim.api.nvim_get_mark(mark, {})[4]
end,
}
local marks_table = {}
local marks_others = {}
local bufname = vim.api.nvim_buf_get_name(opts.bufnr)
for _, cnf in ipairs { local_marks, global_marks } do
for _, v in ipairs(cnf.items) do
-- strip the first single quote character
local mark = string.sub(v.mark, 2, 3)
local _, lnum, col, _ = unpack(v.pos)
local name = cnf.name_func(mark, lnum)
-- same format to :marks command
local line = string.format("%s %6d %4d %s", mark, lnum, col - 1, name)
local row = {
line = line,
lnum = lnum,
col = col,
filename = v.file or bufname,
}
-- non alphanumeric marks goes to last
if mark:match "%w" then
table.insert(marks_table, row)
else
table.insert(marks_others, row)
end
end
end
marks_table = vim.fn.extend(marks_table, marks_others)
pickers.new(opts, { pickers.new(opts, {
prompt_title = "Marks", prompt_title = "Marks",

View File

@@ -635,20 +635,15 @@ function make_entry.gen_from_apropos(opts)
end end
function make_entry.gen_from_marks(_) function make_entry.gen_from_marks(_)
return function(line) return function(item)
local split_value = utils.max_split(line, "%s+", 4)
local mark_value = split_value[1]
local cursor_position = vim.fn.getpos("'" .. mark_value)
return { return {
value = line, value = item.line,
ordinal = line, ordinal = item.line,
display = line, display = item.line,
lnum = cursor_position[2], lnum = item.lnum,
col = cursor_position[3], col = item.col,
start = cursor_position[2], start = item.lnum,
filename = vim.api.nvim_buf_get_name(cursor_position[1]), filename = item.filename,
} }
end end
end end