mirror of
https://github.com/neovim/neovim.git
synced 2025-10-10 11:56:30 +00:00

A bit big, but practically it was a lot simpler to change over all fillchars and all listchars at once, to not need to maintain two parallel implementations. This is mostly an internal refactor, but it also removes an arbitrary limitation: that 'fillchars' and 'listchars' values can only be single-codepoint characters. Now any character which fits into a single screen cell can be used.
215 lines
7.3 KiB
Lua
215 lines
7.3 KiB
Lua
local helpers = require('test.functional.helpers')(after_each)
|
|
local Screen = require('test.functional.ui.screen')
|
|
local clear, command = helpers.clear, helpers.command
|
|
local eval = helpers.eval
|
|
local eq = helpers.eq
|
|
local exc_exec = helpers.exc_exec
|
|
local insert = helpers.insert
|
|
local feed = helpers.feed
|
|
local meths = helpers.meths
|
|
|
|
describe("'fillchars'", function()
|
|
local screen
|
|
|
|
before_each(function()
|
|
clear()
|
|
screen = Screen.new(25, 5)
|
|
screen:attach()
|
|
end)
|
|
|
|
local function shouldfail(val, errval)
|
|
errval = errval or val
|
|
eq('Vim(set):E474: Invalid argument: fillchars=' .. errval, exc_exec('set fillchars=' .. val))
|
|
end
|
|
|
|
describe('"eob" flag', function()
|
|
it("uses '~' by default", function()
|
|
eq('', eval('&fillchars'))
|
|
screen:expect([[
|
|
^ |
|
|
~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('supports whitespace', function()
|
|
screen:expect([[
|
|
^ |
|
|
~ |*3
|
|
|
|
|
]])
|
|
command('set fillchars=eob:\\ ')
|
|
screen:expect([[
|
|
^ |
|
|
|*4
|
|
]])
|
|
end)
|
|
|
|
it('supports multibyte char', function()
|
|
command('set fillchars=eob:ñ')
|
|
screen:expect([[
|
|
^ |
|
|
ñ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('supports composing multibyte char', function()
|
|
command('set fillchars=eob:å̲')
|
|
screen:expect([[
|
|
^ |
|
|
å̲ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('handles invalid values', function()
|
|
shouldfail('eob:') -- empty string
|
|
shouldfail('eob:馬') -- doublewidth char
|
|
shouldfail('eob:xy') -- two ascii chars
|
|
shouldfail('eob:\255', 'eob:<ff>') -- invalid UTF-8
|
|
end)
|
|
end)
|
|
|
|
it('"diff" flag', function()
|
|
screen:try_resize(45, 8)
|
|
screen:set_default_attr_ids({
|
|
[1] = { background = Screen.colors.Grey, foreground = Screen.colors.DarkBlue },
|
|
[2] = { background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1 },
|
|
[3] = { background = Screen.colors.LightBlue },
|
|
[4] = { reverse = true },
|
|
[5] = { reverse = true, bold = true },
|
|
})
|
|
command('set fillchars=diff:…')
|
|
insert('a\nb\nc\nd\ne')
|
|
command('vnew')
|
|
insert('a\nd\ne\nf')
|
|
command('windo diffthis')
|
|
screen:expect([[
|
|
{1: }a │{1: }a |
|
|
{1: }{2:……………………………………………………}│{1: }{3:b }|
|
|
{1: }{2:……………………………………………………}│{1: }{3:c }|
|
|
{1: }d │{1: }d |
|
|
{1: }e │{1: }^e |
|
|
{1: }{3:f }│{1: }{2:……………………………………………………}|
|
|
{4:[No Name] [+] }{5:[No Name] [+] }|
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('has global value', function()
|
|
screen:try_resize(50, 5)
|
|
insert('foo\nbar')
|
|
command('set laststatus=0')
|
|
command('1,2fold')
|
|
command('vsplit')
|
|
command('set fillchars=fold:x')
|
|
screen:expect([[
|
|
^+-- 2 lines: fooxxxxxxxx│+-- 2 lines: fooxxxxxxx|
|
|
~ │~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('has window-local value', function()
|
|
screen:try_resize(50, 5)
|
|
insert('foo\nbar')
|
|
command('set laststatus=0')
|
|
command('1,2fold')
|
|
command('vsplit')
|
|
command('setl fillchars=fold:x')
|
|
screen:expect([[
|
|
^+-- 2 lines: fooxxxxxxxx│+-- 2 lines: foo·······|
|
|
~ │~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('using :set clears window-local value', function()
|
|
screen:try_resize(50, 5)
|
|
insert('foo\nbar')
|
|
command('set laststatus=0')
|
|
command('setl fillchars=fold:x')
|
|
command('1,2fold')
|
|
command('vsplit')
|
|
command('set fillchars&')
|
|
screen:expect([[
|
|
^+-- 2 lines: foo········│+-- 2 lines: fooxxxxxxx|
|
|
~ │~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
end)
|
|
|
|
describe("'listchars'", function()
|
|
local screen
|
|
|
|
before_each(function()
|
|
clear()
|
|
screen = Screen.new(50, 5)
|
|
screen:attach()
|
|
end)
|
|
|
|
it('has global value', function()
|
|
feed('i<tab><tab><tab><esc>')
|
|
command('set list laststatus=0')
|
|
command('vsplit')
|
|
command('set listchars=tab:<->')
|
|
screen:expect([[
|
|
<------><------>^<------> │<------><------><------>|
|
|
~ │~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('has window-local value', function()
|
|
feed('i<tab><tab><tab><esc>')
|
|
command('set list laststatus=0')
|
|
command('setl listchars=tab:<->')
|
|
command('vsplit')
|
|
command('setl listchars<')
|
|
screen:expect([[
|
|
> > ^> │<------><------><------>|
|
|
~ │~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('using :set clears window-local value', function()
|
|
feed('i<tab><tab><tab><esc>')
|
|
command('set list laststatus=0')
|
|
command('setl listchars=tab:<->')
|
|
command('vsplit')
|
|
command('set listchars=tab:>-,eol:$')
|
|
screen:expect([[
|
|
>------->-------^>-------$│<------><------><------>|
|
|
~ │~ |*3
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('supports composing chars', function()
|
|
screen:set_default_attr_ids {
|
|
[1] = { foreground = Screen.colors.Blue1, bold = true },
|
|
}
|
|
feed('i<tab><tab><tab>x<esc>')
|
|
command('set list laststatus=0')
|
|
-- tricky: the tab value forms three separate one-cell chars,
|
|
-- thus it should be accepted despite being a mess.
|
|
command('set listchars=tab:d̞̄̃̒̉̎ò́̌̌̂̐l̞̀̄̆̌̚,eol:å̲')
|
|
screen:expect([[
|
|
{1:d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚}^x{1:å̲} |
|
|
{1:~ }|*3
|
|
|
|
|
]])
|
|
|
|
meths._invalidate_glyph_cache()
|
|
screen:_reset()
|
|
screen:expect([[
|
|
{1:d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚}^x{1:å̲} |
|
|
{1:~ }|*3
|
|
|
|
|
]])
|
|
end)
|
|
end)
|