mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			341 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Test for multibyte text formatting.
 | ||
| -- Also test, that 'mps' with multibyte chars works.
 | ||
| -- And test "ra" on multibyte characters.
 | ||
| -- Also test byteidx() and byteidxcomp()
 | ||
| 
 | ||
| local helpers = require('test.functional.helpers')(after_each)
 | ||
| local feed, insert, eq, eval, clear, feed_command, expect = helpers.feed,
 | ||
|   helpers.insert, helpers.eq, helpers.eval, helpers.clear, helpers.feed_command,
 | ||
|   helpers.expect
 | ||
| 
 | ||
| describe('multibyte text', function()
 | ||
|   before_each(clear)
 | ||
| 
 | ||
|   it('formatting with "set fo=t"', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|       XYZ
 | ||
|       abc XYZ
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set tw=2 fo=t')
 | ||
|     feed('gqgqjgqgqo<cr>')
 | ||
|     feed('XYZ<cr>')
 | ||
|     feed('abc XYZ<esc><esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|       XYZ
 | ||
|       abc
 | ||
|       XYZ
 | ||
| 
 | ||
|       XYZ
 | ||
|       abc
 | ||
|       XYZ
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('formatting with "set fo=tm"', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|       X
 | ||
|       Xa
 | ||
|       X a
 | ||
|       XY
 | ||
|       X Y
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set tw=1 fo=tm')
 | ||
|     feed('gqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
 | ||
|     feed('X<cr>')
 | ||
|     feed('Xa<cr>')
 | ||
|     feed('X a<cr>')
 | ||
|     feed('XY<cr>')
 | ||
|     feed('X Y<esc><esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|       X
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       Y
 | ||
|       X
 | ||
|       Y
 | ||
| 
 | ||
|       X
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       Y
 | ||
|       X
 | ||
|       Y
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('formatting with "set fo=tm" (part 2)', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|       X
 | ||
|       Xa
 | ||
|       X a
 | ||
|       XY
 | ||
|       X Y
 | ||
|       aX
 | ||
|       abX
 | ||
|       abcX
 | ||
|       abX c
 | ||
|       abXY
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set tw=2 fo=tm')
 | ||
|     feed('gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
 | ||
|     feed('X<cr>')
 | ||
|     feed('Xa<cr>')
 | ||
|     feed('X a<cr>')
 | ||
|     feed('XY<cr>')
 | ||
|     feed('X Y<cr>')
 | ||
|     feed('aX<cr>')
 | ||
|     feed('abX<cr>')
 | ||
|     feed('abcX<cr>')
 | ||
|     feed('abX c<cr>')
 | ||
|     feed('abXY<esc><esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|       X
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       Y
 | ||
|       X
 | ||
|       Y
 | ||
|       a
 | ||
|       X
 | ||
|       ab
 | ||
|       X
 | ||
|       abc
 | ||
|       X
 | ||
|       ab
 | ||
|       X
 | ||
|       c
 | ||
|       ab
 | ||
|       X
 | ||
|       Y
 | ||
| 
 | ||
|       X
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       a
 | ||
|       X
 | ||
|       Y
 | ||
|       X
 | ||
|       Y
 | ||
|       a
 | ||
|       X
 | ||
|       ab
 | ||
|       X
 | ||
|       abc
 | ||
|       X
 | ||
|       ab
 | ||
|       X
 | ||
|       c
 | ||
|       ab
 | ||
|       X
 | ||
|       Y
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('formatting with "set ai fo=tm"', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|         X
 | ||
|         Xa
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set ai tw=2 fo=tm')
 | ||
|     feed('gqgqjgqgqo<cr>')
 | ||
|     feed('X<cr>')
 | ||
|     feed('Xa<esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|         X
 | ||
|         X
 | ||
|         a
 | ||
| 
 | ||
|         X
 | ||
|         X
 | ||
|         a
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('formatting with "set ai fo=tm" (part 2)', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|         X
 | ||
|         Xa
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set noai tw=2 fo=tm')
 | ||
|     feed('gqgqjgqgqo<cr>')
 | ||
|     -- Literal spaces will be trimmed from the by feed().
 | ||
|     feed('<space><space>X<cr>')
 | ||
|     feed('<space><space>Xa<esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|         X
 | ||
|         X
 | ||
|       a
 | ||
| 
 | ||
|         X
 | ||
|         X
 | ||
|       a
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('formatting with "set fo=cqm" and multibyte comments', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|       X
 | ||
|       Xa
 | ||
|       XaY
 | ||
|       XY
 | ||
|       XYZ
 | ||
|       X Y
 | ||
|       X YZ
 | ||
|       XX
 | ||
|       XXa
 | ||
|       XXY
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set tw=2 fo=cqm comments=n:X')
 | ||
|     feed('gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
 | ||
|     feed('X<cr>')
 | ||
|     feed('Xa<cr>')
 | ||
|     feed('XaY<cr>')
 | ||
|     feed('XY<cr>')
 | ||
|     feed('XYZ<cr>')
 | ||
|     feed('X Y<cr>')
 | ||
|     feed('X YZ<cr>')
 | ||
|     feed('XX<cr>')
 | ||
|     feed('XXa<cr>')
 | ||
|     feed('XXY<esc><esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|       X
 | ||
|       Xa
 | ||
|       Xa
 | ||
|       XY
 | ||
|       XY
 | ||
|       XY
 | ||
|       XZ
 | ||
|       X Y
 | ||
|       X Y
 | ||
|       X Z
 | ||
|       XX
 | ||
|       XXa
 | ||
|       XXY
 | ||
| 
 | ||
|       X
 | ||
|       Xa
 | ||
|       Xa
 | ||
|       XY
 | ||
|       XY
 | ||
|       XY
 | ||
|       XZ
 | ||
|       X Y
 | ||
|       X Y
 | ||
|       X Z
 | ||
|       XX
 | ||
|       XXa
 | ||
|       XXY
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('formatting in replace mode', function()
 | ||
|     insert([[
 | ||
|       {
 | ||
| 
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set tw=2 fo=tm')
 | ||
|     feed('RXa<esc>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|       X
 | ||
|       a
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it("as values of 'mps'", function()
 | ||
|     insert([[
 | ||
|       {
 | ||
|       ‘ two three ’ four
 | ||
|       }]])
 | ||
|     feed_command('/^{/+1')
 | ||
|     feed_command('set mps+=‘:’')
 | ||
|     feed('d%<cr>')
 | ||
|     expect([[
 | ||
|       {
 | ||
|        four
 | ||
|       }]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('can be replaced with r', function()
 | ||
|     insert([[
 | ||
|       abba
 | ||
|       aab]])
 | ||
|     feed('gg0Vjra<cr>')
 | ||
|     expect([[
 | ||
|       aaaa
 | ||
|       aaa]])
 | ||
|   end)
 | ||
| 
 | ||
|   it("doesn't interfere with 'whichwrap'", function()
 | ||
|     insert([[
 | ||
|       á
 | ||
|       x]])
 | ||
|     feed_command('set whichwrap+=h')
 | ||
|     feed_command('/^x')
 | ||
|     feed('dh')
 | ||
|     expect([[
 | ||
|       áx]])
 | ||
|   end)
 | ||
| 
 | ||
|   it('can be queried with byteidx() and byteidxcomp()', function()
 | ||
|     -- One char of two bytes.
 | ||
|     feed_command("let a = '.é.'")
 | ||
|     -- Normal e with composing char.
 | ||
|     feed_command("let b = '.é.'")
 | ||
|     eq(0, eval('byteidx(a, 0)'))
 | ||
|     eq(1, eval('byteidx(a, 1)'))
 | ||
|     eq(3, eval('byteidx(a, 2)'))
 | ||
|     eq(4, eval('byteidx(a, 3)'))
 | ||
|     eq(-1, eval('byteidx(a, 4)'))
 | ||
|     eq(0, eval('byteidx(b, 0)'))
 | ||
|     eq(1, eval('byteidx(b, 1)'))
 | ||
|     eq(4, eval('byteidx(b, 2)'))
 | ||
|     eq(5, eval('byteidx(b, 3)'))
 | ||
|     eq(-1, eval('byteidx(b, 4)'))
 | ||
|     eq(0, eval('byteidxcomp(a, 0)'))
 | ||
|     eq(1, eval('byteidxcomp(a, 1)'))
 | ||
|     eq(3, eval('byteidxcomp(a, 2)'))
 | ||
|     eq(4, eval('byteidxcomp(a, 3)'))
 | ||
|     eq(-1, eval('byteidxcomp(a, 4)'))
 | ||
|     eq(0, eval('byteidxcomp(b, 0)'))
 | ||
|     eq(1, eval('byteidxcomp(b, 1)'))
 | ||
|     eq(2, eval('byteidxcomp(b, 2)'))
 | ||
|     eq(4, eval('byteidxcomp(b, 3)'))
 | ||
|     eq(5, eval('byteidxcomp(b, 4)'))
 | ||
|     eq(-1, eval('byteidxcomp(b, 5)'))
 | ||
|   end)
 | ||
| 
 | ||
|   it('correctly interact with the \zs pattern', function()
 | ||
|     eq('a1a2a3a', eval([[substitute('123', '\zs', 'a', 'g')]]))
 | ||
|   end)
 | ||
| end)
 | 
