mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +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)
 |