HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //home/ubuntu/neovim/test/functional/legacy/069_multibyte_formatting_spec.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 t = require('test.testutil')
local n = require('test.functional.testnvim')()

local feed, insert, eq, eval, clear, feed_command, expect =
  n.feed, n.insert, t.eq, n.eval, n.clear, n.feed_command, n.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)