mirror of
https://github.com/neovim/neovim.git
synced 2026-07-25 02:10:45 +00:00
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.
63 lines
2.3 KiB
Lua
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)
|