Files
neovim/test/functional/ex_cmds/marks_spec.lua
Justin M. Keyes 671e9d4913 feat(marks): :marks completion, list extmarks #40743
Problem:
- No UI for listing extmarks.
- `:marks` doesn't support cmdline-completion.

Solution:
- Add completion and extmarks support to `:marks`.
- Update `get_buf_local_marks` to include the ":" (prompt-buffer) mark.
2026-07-15 05:55:51 -04:00

63 lines
2.3 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local command = n.command
local eq = t.eq
local exec_capture = n.exec_capture
local exec_lua = n.exec_lua
local feed = n.feed
local fn = n.fn
local matches = t.matches
describe(':marks', function()
before_each(function()
n.clear {}
fn.setline(1, { 'one', 'two', 'three' })
feed('ma')
exec_lua(function()
local ns = vim.api.nvim_create_namespace('my.plugin')
vim.api.nvim_buf_set_extmark(0, ns, 1, 0, {})
vim.api.nvim_buf_set_extmark(0, ns, 2, 1, {})
vim.api.nvim_create_namespace('empty.ns') -- no extmarks: not completed, not mentioned
end)
end)
it('completes names, lists extmarks', function()
-- Completion offers the set marks and the buffer's extmark namespaces.
eq({ '"', "'", '.', 'a', 'my.plugin' }, fn.getcompletion('marks ', 'cmdline'))
-- :marks (no args) only mentions the namespaces instead of listing their extmarks.
local out = exec_capture('marks')
matches('mark line col file/text', out)
matches('Extmark namespaces %(use ":marks {ns}"%): my%.plugin', out)
eq(nil, out:find('empty%.ns'))
-- ":marks {ns}" lists that namespace's extmarks.
out = exec_capture('marks my.plugin')
matches('id%s+line%s+col text', out)
matches('1%s+2%s+0 two', out)
matches('2%s+3%s+1 three', out)
-- Not a namespace: the usual mark-names filter.
matches('mark line col file/text', exec_capture('marks aB'))
end)
it(':filter on file/text column; E283; "No marks set"', function()
fn.setpos("'b", { 0, 2, 1, 0 })
local out = exec_capture('filter /two/ marks')
matches(' b%s+2%s+0 two', out)
eq(nil, out:find(' a ', 1, true)) -- mark a is on "one": filtered out
matches('E283: No marks matching "z"', t.pcall_err(command, 'marks z'))
-- Bare :marks with every row filtered out.
matches('No marks set', exec_capture('filter /xxx-nomatch/ marks'))
end)
it("prompt buffer: ':' mark in getmarklist() and :marks", function()
command('enew | set buftype=prompt')
feed('ifoo<Esc>')
local found = false
for _, m in ipairs(fn.getmarklist(fn.bufnr(''))) do
found = found or m.mark == "':"
end
eq(true, found)
matches(' :%s+%d+%s+%d+ ', exec_capture('marks'))
end)
end)