diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CMakeLists.txt | 14 | ||||
-rw-r--r-- | test/functional/api/extmark_spec.lua | 38 | ||||
-rw-r--r-- | test/functional/api/keymap_spec.lua | 51 | ||||
-rw-r--r-- | test/functional/core/channels_spec.lua | 39 | ||||
-rw-r--r-- | test/functional/fixtures/CMakeLists.txt | 2 | ||||
-rw-r--r-- | test/functional/lua/glob_spec.lua | 8 | ||||
-rw-r--r-- | test/functional/lua/version_spec.lua | 34 | ||||
-rw-r--r-- | test/functional/lua/vim_spec.lua | 112 | ||||
-rw-r--r-- | test/functional/treesitter/fold_spec.lua | 2 | ||||
-rw-r--r-- | test/functional/treesitter/highlight_spec.lua | 6 | ||||
-rw-r--r-- | test/functional/ui/embed_spec.lua | 50 | ||||
-rw-r--r-- | test/functional/ui/screen.lua | 6 | ||||
-rw-r--r-- | test/old/testdir/test_filetype.vim | 1 | ||||
-rw-r--r-- | test/old/testdir/test_syntax.vim | 6 |
14 files changed, 320 insertions, 49 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index da2c29010b..3ae11bd1a7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,7 +7,7 @@ set(TEST_OPTIONS -D CIRRUS_CI=$ENV{CIRRUS_CI} -D CI_BUILD=${CI_BUILD} -D DEPS_INSTALL_DIR=${DEPS_INSTALL_DIR} - -D NVIM_PRG=$<TARGET_FILE:nvim> + -D NVIM_PRG=$<TARGET_FILE:nvim_bin> -D TEST_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D WORKING_DIR=${PROJECT_SOURCE_DIR}) @@ -18,9 +18,8 @@ if(LUA_HAS_FFI) -D TEST_TYPE=unit ${TEST_OPTIONS} -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake - DEPENDS nvim USES_TERMINAL) - add_dependencies(unittest lua-dev-deps) + add_dependencies(unittest lua-dev-deps nvim) else() message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}") endif() @@ -34,16 +33,15 @@ add_custom_target(functionaltest -D TEST_TYPE=functional ${TEST_OPTIONS} -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake - DEPENDS nvim printenv-test printargs-test shell-test pwsh-test streams-test tty-test ${GENERATED_HELP_TAGS} ${GENERATED_SYN_VIM} + DEPENDS printenv-test printargs-test shell-test pwsh-test streams-test tty-test USES_TERMINAL) +add_dependencies(functionaltest lua-dev-deps nvim) add_custom_target(benchmark COMMAND ${CMAKE_COMMAND} -D TEST_TYPE=benchmark ${TEST_OPTIONS} -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake - DEPENDS nvim tty-test + DEPENDS tty-test USES_TERMINAL) - -add_dependencies(functionaltest lua-dev-deps) -add_dependencies(benchmark lua-dev-deps) +add_dependencies(benchmark lua-dev-deps nvim) diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 54f4aaab03..cb16f49e7c 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1639,6 +1639,40 @@ describe('API/extmarks', function() right_gravity = true, }, }, get_extmark_by_id(ns, marks[3], { details = true })) + set_extmark(ns, marks[4], 0, 0, { + end_col = 1, + conceal = 'a', + spell = true, + }) + eq({ + 0, + 0, + { + conceal = 'a', + end_col = 1, + end_right_gravity = false, + end_row = 0, + ns_id = 1, + right_gravity = true, + spell = true, + }, + }, get_extmark_by_id(ns, marks[4], { details = true })) + set_extmark(ns, marks[5], 0, 0, { + end_col = 1, + spell = false, + }) + eq({ + 0, + 0, + { + end_col = 1, + end_right_gravity = false, + end_row = 0, + ns_id = 1, + right_gravity = true, + spell = false, + }, + }, get_extmark_by_id(ns, marks[5], { details = true })) api.nvim_buf_clear_namespace(0, ns, 0, -1) -- legacy sign mark includes sign name command('sign define sign1 text=s1 texthl=Title linehl=LineNR numhl=Normal culhl=CursorLine') @@ -1712,6 +1746,10 @@ describe('API/extmarks', function() aaa bbb ccc |*2 | ]]) + -- decor is not removed twice + command('d3') + api.nvim_buf_del_extmark(0, ns, 1) + command('silent undo') -- mark is deleted with undo_restore == false set_extmark(ns, 1, 0, 0, { invalidate = true, undo_restore = false, sign_text = 'S1' }) set_extmark(ns, 2, 1, 0, { invalidate = true, undo_restore = false, sign_text = 'S2' }) diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index 4f57f6d0bd..0decd710e9 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -460,6 +460,57 @@ describe('nvim_get_keymap', function() desc = 'map description', }, api.nvim_get_keymap('n')[1]) end) + + it('can get abbreviations', function() + command('inoreabbr foo bar') + command('cnoreabbr <buffer> foo baz') + + local mapargs_i = { + abbr = 1, + buffer = 0, + expr = 0, + lhs = 'foo', + lhsraw = 'foo', + lnum = 0, + mode = 'i', + mode_bits = 0x10, + noremap = 1, + nowait = 0, + rhs = 'bar', + script = 0, + scriptversion = 1, + sid = 0, + silent = 0, + } + local mapargs_c = { + abbr = 1, + buffer = 1, + expr = 0, + lhs = 'foo', + lhsraw = 'foo', + lnum = 0, + mode = 'c', + mode_bits = 0x08, + noremap = 1, + nowait = 0, + rhs = 'baz', + script = 0, + scriptversion = 1, + sid = 0, + silent = 0, + } + + local curbuf = api.nvim_get_current_buf() + + eq({ mapargs_i }, api.nvim_get_keymap('ia')) + eq({}, api.nvim_buf_get_keymap(curbuf, 'ia')) + + eq({}, api.nvim_get_keymap('ca')) + eq({ mapargs_c }, api.nvim_buf_get_keymap(curbuf, 'ca')) + + eq({ mapargs_i }, api.nvim_get_keymap('!a')) + eq({ mapargs_c }, api.nvim_buf_get_keymap(curbuf, '!a')) + end) end) describe('nvim_set_keymap, nvim_del_keymap', function() diff --git a/test/functional/core/channels_spec.lua b/test/functional/core/channels_spec.lua index ce13c4755d..56a2f5a571 100644 --- a/test/functional/core/channels_spec.lua +++ b/test/functional/core/channels_spec.lua @@ -4,7 +4,7 @@ local clear, eq, eval, next_msg, ok, source = local command, fn, api = helpers.command, helpers.fn, helpers.api local sleep = vim.uv.sleep local spawn, nvim_argv = helpers.spawn, helpers.nvim_argv -local set_session = helpers.set_session +local get_session, set_session = helpers.get_session, helpers.set_session local nvim_prog = helpers.nvim_prog local is_os = helpers.is_os local retry = helpers.retry @@ -59,6 +59,43 @@ describe('channels', function() eq({ 'notification', 'data', { id, { '' } } }, next_msg()) end) + it('dont crash due to garbage in rpc #23781', function() + local client = get_session() + local server = spawn(nvim_argv, nil, nil, true) + set_session(server) + local address = fn.serverlist()[1] + set_session(client) + + api.nvim_set_var('address', address) + command("let g:id = sockconnect('pipe', address, {'on_data':'OnEvent'})") + local id = eval('g:id') + ok(id > 0) + + command("call chansend(g:id, 'F')") + eq({ 'notification', 'data', { id, { '' } } }, next_msg()) + set_session(server) + assert_alive() + + set_session(client) + command('call chanclose(g:id)') + command("let g:id = sockconnect('pipe', address, {'on_data':'OnEvent'})") + id = eval('g:id') + ok(id > 0) + + command("call chansend(g:id, msgpackdump([[2, 'redraw', 'F']], 'B')[:-4])") + set_session(server) + assert_alive() + set_session(client) + command("call chansend(g:id, 'F')") + eq({ 'notification', 'data', { id, { '' } } }, next_msg()) + + set_session(server) + assert_alive() + set_session(client) + command('call chanclose(g:id)') + server:close() + end) + it('can use stdio channel', function() source([[ let g:job_opts = { diff --git a/test/functional/fixtures/CMakeLists.txt b/test/functional/fixtures/CMakeLists.txt index 6e64b1e4dc..150407fe46 100644 --- a/test/functional/fixtures/CMakeLists.txt +++ b/test/functional/fixtures/CMakeLists.txt @@ -5,7 +5,7 @@ endif() if(WIN32) target_compile_definitions(test_lib INTERFACE MSWIN) endif() -target_link_libraries(test_lib INTERFACE nvim) +target_link_libraries(test_lib INTERFACE nvim_bin) add_executable(tty-test EXCLUDE_FROM_ALL tty-test.c) add_executable(shell-test EXCLUDE_FROM_ALL shell-test.c) diff --git a/test/functional/lua/glob_spec.lua b/test/functional/lua/glob_spec.lua index c7ef498008..1eac037575 100644 --- a/test/functional/lua/glob_spec.lua +++ b/test/functional/lua/glob_spec.lua @@ -67,18 +67,16 @@ describe('glob', function() eq(true, match('dir/*/file.txt', 'dir/subdir/file.txt')) eq(false, match('dir/*/file.txt', 'dir/subdir/subdir/file.txt')) - -- TODO: The spec does not describe this, but VSCode only interprets ** when it's by + -- The spec does not describe this, but VSCode only interprets ** when it's by -- itself in a path segment, and otherwise interprets ** as consecutive * directives. - -- The following tests show how this behavior should work, but is not yet fully implemented. - -- Currently, "a**" parses incorrectly as "a" "**" and "**a" parses correctly as "*" "*" "a". -- see: https://github.com/microsoft/vscode/blob/eef30e7165e19b33daa1e15e92fa34ff4a5df0d3/src/vs/base/common/glob.ts#L112 eq(true, match('a**', 'abc')) -- '**' should parse as two '*'s when not by itself in a path segment eq(true, match('**c', 'abc')) - -- eq(false, match('a**', 'ab')) -- each '*' should still represent at least one character + eq(false, match('a**', 'ab')) -- each '*' should still represent at least one character eq(false, match('**c', 'bc')) eq(true, match('a**', 'abcd')) eq(true, match('**d', 'abcd')) - -- eq(false, match('a**', 'abc/d')) + eq(false, match('a**', 'abc/d')) eq(false, match('**d', 'abc/d')) end) diff --git a/test/functional/lua/version_spec.lua b/test/functional/lua/version_spec.lua index c321421ad0..3bc9e26d41 100644 --- a/test/functional/lua/version_spec.lua +++ b/test/functional/lua/version_spec.lua @@ -288,21 +288,55 @@ describe('version', function() eq(vim.version.last({ v('2.0.0'), v('1.2.3') }), v('2.0.0')) end) + it('le()', function() + eq(true, vim.version.le('1', '1')) + eq(true, vim.version.le({ 3, 1, 4 }, '3.1.4')) + eq(true, vim.version.le('1', '2')) + eq(true, vim.version.le({ 0, 7, 4 }, { 3 })) + eq(false, vim.version.le({ 3 }, { 0, 7, 4 })) + eq(false, vim.version.le({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) + eq(false, vim.version.le('2', '1')) + end) + it('lt()', function() + eq(false, vim.version.lt('1', '1')) + eq(false, vim.version.lt({ 3, 1, 4 }, '3.1.4')) eq(true, vim.version.lt('1', '2')) + eq(true, vim.version.lt({ 0, 7, 4 }, { 3 })) eq(false, vim.version.lt({ 3 }, { 0, 7, 4 })) eq(false, vim.version.lt({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) + eq(false, vim.version.lt('2', '1')) + end) + + it('ge()', function() + eq(true, vim.version.ge('1', '1')) + eq(true, vim.version.ge({ 3, 1, 4 }, '3.1.4')) + eq(true, vim.version.ge('2', '1')) + eq(true, vim.version.ge({ 3 }, { 0, 7, 4 })) + eq(true, vim.version.ge({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) + eq(false, vim.version.ge('1', '2')) + eq(false, vim.version.ge({ 0, 7, 4 }, { 3 })) end) it('gt()', function() + eq(false, vim.version.gt('1', '1')) + eq(false, vim.version.gt({ 3, 1, 4 }, '3.1.4')) eq(true, vim.version.gt('2', '1')) eq(true, vim.version.gt({ 3 }, { 0, 7, 4 })) eq(true, vim.version.gt({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) + eq(false, vim.version.gt('1', '2')) + eq(false, vim.version.gt({ 0, 7, 4 }, { 3 })) end) it('eq()', function() eq(true, vim.version.eq('2', '2')) eq(true, vim.version.eq({ 3, 1, 0 }, '3.1.0')) eq(true, vim.version.eq({ major = 3, minor = 3, patch = 0 }, { 3, 3, 0 })) + eq(false, vim.version.eq('2', '3')) + + -- semver: v3 == v3.0 == v3.0.0 + eq(true, vim.version.eq('3', { 3, 0, 0 })) + eq(true, vim.version.eq({ 3, 0 }, { 3 })) + eq(true, vim.version.eq({ 3, 0, 0 }, { 3 })) end) end) diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index 98968f3695..6e05728b0c 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -128,33 +128,93 @@ describe('lua stdlib', function() eq(1, fn.luaeval('vim.stricmp("\\0C\\0", "\\0B\\0")')) end) - it('vim.deprecate', function() + local function test_vim_deprecate(current_version) -- vim.deprecate(name, alternative, version, plugin, backtrace) - eq( - dedent [[ - foo.bar() is deprecated, use zub.wooo{ok=yay} instead. :help deprecated - This feature will be removed in Nvim version 0.10]], - exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10') - ) - -- Same message, skipped. - eq(vim.NIL, exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10')) - -- Don't show error if not hard deprecated - eq(vim.NIL, exec_lua('return vim.deprecate(...)', 'foo.bar()', 'nil', '5000.0.0')) - -- When `plugin` is specified, don't show ":help deprecated". #22235 - eq( - dedent [[ - foo.bar() is deprecated, use zub.wooo{ok=yay} instead. - This feature will be removed in my-plugin.nvim version 0.3.0]], - exec_lua( - 'return vim.deprecate(...)', - 'foo.bar()', - 'zub.wooo{ok=yay}', - '0.3.0', - 'my-plugin.nvim', - false - ) - ) - end) + -- See MAINTAIN.md for the soft/hard deprecation policy + + describe(('vim.deprecate [current_version = %s]'):format(current_version), function() + before_each(function() + -- mock vim.version() behavior, should be pinned for consistent testing + exec_lua( + [[ + local current_version_mock = vim.version.parse(...) + getmetatable(vim.version).__call = function() + return current_version_mock + end + ]], + current_version + ) + end) + + it('when plugin = nil', function() + eq( + dedent [[ + foo.bar() is deprecated, use zub.wooo{ok=yay} instead. :help deprecated + This feature will be removed in Nvim version 0.10]], + exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10') + ) + -- Same message, skipped. + eq(vim.NIL, exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10')) + + -- Don't show error if not hard-deprecated (only soft-deprecated) + eq( + vim.NIL, + exec_lua('return vim.deprecate(...)', 'foo.baz()', 'foo.better_baz()', '0.12.0') + ) + + -- Show error if hard-deprecated + eq( + dedent [[ + foo.hard_dep() is deprecated, use vim.new_api() instead. :help deprecated + This feature will be removed in Nvim version 0.11]], + exec_lua('return vim.deprecate(...)', 'foo.hard_dep()', 'vim.new_api()', '0.11') + ) + + -- To be deleted in the next major version (1.0) + eq( + dedent [[ + foo.baz() is deprecated. :help deprecated + This feature will be removed in Nvim version 1.0]], + exec_lua [[ return vim.deprecate('foo.baz()', nil, '1.0') ]] + ) + end) + + it('when plugin is specified', function() + -- When `plugin` is specified, don't show ":help deprecated". #22235 + eq( + dedent [[ + foo.bar() is deprecated, use zub.wooo{ok=yay} instead. + This feature will be removed in my-plugin.nvim version 0.3.0]], + exec_lua( + 'return vim.deprecate(...)', + 'foo.bar()', + 'zub.wooo{ok=yay}', + '0.3.0', + 'my-plugin.nvim', + false + ) + ) + + -- plugins: no soft deprecation period + eq( + dedent [[ + foo.bar() is deprecated, use zub.wooo{ok=yay} instead. + This feature will be removed in my-plugin.nvim version 0.11.0]], + exec_lua( + 'return vim.deprecate(...)', + 'foo.bar()', + 'zub.wooo{ok=yay}', + '0.11.0', + 'my-plugin.nvim', + false + ) + ) + end) + end) + end + + test_vim_deprecate('0.10') + test_vim_deprecate('0.10-dev+g0000000') it('vim.startswith', function() eq(true, fn.luaeval('vim.startswith("123", "1")')) diff --git a/test/functional/treesitter/fold_spec.lua b/test/functional/treesitter/fold_spec.lua index 2302cf869e..ac9d227bb6 100644 --- a/test/functional/treesitter/fold_spec.lua +++ b/test/functional/treesitter/fold_spec.lua @@ -729,7 +729,7 @@ void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, con feed('ggVGzf') screen:expect { grid = [[ - {2:^void}{1: }{3:qsort}{4:(}{2:void}{1: }{5:*}{3:base}{4:,}{1: }{2:size_t}{1: }{3:nel}{4:,}{1: }{2:size_t}{1: }{3:width}{4:,}{1: }{2:int}{1: }{4:(}{5:*}{3:compa}| + {4:^void}{1: }{3:qsort}{4:(void}{1: }{5:*}{3:base}{4:,}{1: }{4:size_t}{1: }{3:nel}{4:,}{1: }{4:size_t}{1: }{3:width}{4:,}{1: }{4:int}{1: }{4:(}{5:*}{3:compa}| {0:~ }|*3 | ]], diff --git a/test/functional/treesitter/highlight_spec.lua b/test/functional/treesitter/highlight_spec.lua index f4f7bc691c..932af0332b 100644 --- a/test/functional/treesitter/highlight_spec.lua +++ b/test/functional/treesitter/highlight_spec.lua @@ -766,7 +766,7 @@ describe('treesitter highlighting (help)', function() {1:>ruby} | {1: -- comment} | {1: local this_is = 'actually_lua'} | - < | + {1:<} | ^ | | ]], @@ -779,7 +779,7 @@ describe('treesitter highlighting (help)', function() {1:>lua} | {1: -- comment} | {1: }{3:local}{1: }{4:this_is}{1: }{3:=}{1: }{5:'actually_lua'} | - < | + {1:<} | ^ | | ]], @@ -792,7 +792,7 @@ describe('treesitter highlighting (help)', function() {1:>ruby} | {1: -- comment} | {1: local this_is = 'actually_lua'} | - < | + {1:<} | ^ | | ]], diff --git a/test/functional/ui/embed_spec.lua b/test/functional/ui/embed_spec.lua index e655ee1b54..f6bdd2215d 100644 --- a/test/functional/ui/embed_spec.lua +++ b/test/functional/ui/embed_spec.lua @@ -171,6 +171,56 @@ describe('--embed UI', function() } eq({ [16711935] = true }, seen) -- we only saw the last one, despite 16777215 was set internally earlier end) + + it('updates cwd of attached UI #21771', function() + clear { args_rm = { '--headless' } } + + local screen = Screen.new(40, 8) + screen:attach() + + screen:expect { + condition = function() + eq(helpers.paths.test_source_path, screen.pwd) + end, + } + + -- Change global cwd + helpers.command(string.format('cd %s/src/nvim', helpers.paths.test_source_path)) + + screen:expect { + condition = function() + eq(string.format('%s/src/nvim', helpers.paths.test_source_path), screen.pwd) + end, + } + + -- Split the window and change the cwd in the split + helpers.command('new') + helpers.command(string.format('lcd %s/test', helpers.paths.test_source_path)) + + screen:expect { + condition = function() + eq(string.format('%s/test', helpers.paths.test_source_path), screen.pwd) + end, + } + + -- Move to the original window + helpers.command('wincmd p') + + screen:expect { + condition = function() + eq(string.format('%s/src/nvim', helpers.paths.test_source_path), screen.pwd) + end, + } + + -- Change global cwd again + helpers.command(string.format('cd %s', helpers.paths.test_source_path)) + + screen:expect { + condition = function() + eq(helpers.paths.test_source_path, screen.pwd) + end, + } + end) end) describe('--embed --listen UI', function() diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua index 644ee910b6..07333f2e21 100644 --- a/test/functional/ui/screen.lua +++ b/test/functional/ui/screen.lua @@ -140,6 +140,7 @@ function Screen.new(width, height) suspended = false, mode = 'normal', options = {}, + pwd = '', popupmenu = nil, cmdline = {}, cmdline_block = {}, @@ -212,7 +213,6 @@ function Screen:attach(options, session) if options.ext_linegrid == nil then options.ext_linegrid = true end - self._session = session self._options = options self._clear_attrs = (not options.ext_linegrid) and {} or nil @@ -1108,6 +1108,10 @@ function Screen:_handle_option_set(name, value) self.options[name] = value end +function Screen:_handle_chdir(path) + self.pwd = vim.fs.normalize(path, { expand_env = false }) +end + function Screen:_handle_popupmenu_show(items, selected, row, col, grid) self.popupmenu = { items = items, pos = selected, anchor = { grid, row, col } } end diff --git a/test/old/testdir/test_filetype.vim b/test/old/testdir/test_filetype.vim index 50e60de484..e0c3fdd6c4 100644 --- a/test/old/testdir/test_filetype.vim +++ b/test/old/testdir/test_filetype.vim @@ -140,6 +140,7 @@ func s:GetFilenameChecks() abort \ 'chatito': ['file.chatito'], \ 'chill': ['file..ch'], \ 'chordpro': ['file.chopro', 'file.crd', 'file.cho', 'file.crdpro', 'file.chordpro'], + \ 'chuck': ['file.ck'], \ 'cl': ['file.eni'], \ 'clean': ['file.dcl', 'file.icl'], \ 'clojure': ['file.clj', 'file.cljs', 'file.cljx', 'file.cljc'], diff --git a/test/old/testdir/test_syntax.vim b/test/old/testdir/test_syntax.vim index 10dc798df7..711b2adf7c 100644 --- a/test/old/testdir/test_syntax.vim +++ b/test/old/testdir/test_syntax.vim @@ -197,14 +197,14 @@ func Test_syntax_completion() " Check that clearing "Aap" avoids it showing up before Boolean. hi @Aap ctermfg=blue call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') - call assert_match('^"syn list @Aap @boolean @character ', @:) + call assert_match('^"syn list @Aap @attribute @boolean @character ', @:) hi clear @Aap call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') - call assert_match('^"syn list @boolean @character ', @:) + call assert_match('^"syn list @attribute @boolean @character ', @:) call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx') - call assert_match('^"syn match @boolean @character ', @:) + call assert_match('^"syn match @attribute @boolean @character ', @:) syn cluster Aax contains=Aap call feedkeys(":syn list @A\<C-A>\<C-B>\"\<CR>", 'tx') |