summaryrefslogtreecommitdiffstats
path: root/runtime/syntax
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax')
-rw-r--r--runtime/syntax/Makefile9
-rw-r--r--runtime/syntax/amiga.vim5
-rw-r--r--runtime/syntax/ant.vim94
-rw-r--r--runtime/syntax/c.vim12
-rw-r--r--runtime/syntax/chuck.vim187
-rw-r--r--runtime/syntax/csh.vim5
-rw-r--r--runtime/syntax/css.vim19
-rw-r--r--runtime/syntax/dcl.vim5
-rw-r--r--runtime/syntax/deb822sources.vim24
-rw-r--r--runtime/syntax/debsources.vim9
-rw-r--r--runtime/syntax/dosbatch.vim31
-rw-r--r--runtime/syntax/elmfilt.vim5
-rw-r--r--runtime/syntax/exports.vim5
-rw-r--r--runtime/syntax/fortran.vim374
-rw-r--r--runtime/syntax/generator/Makefile43
-rw-r--r--runtime/syntax/generator/README.md26
-rw-r--r--runtime/syntax/generator/gen_syntax_vim.vim704
-rw-r--r--runtime/syntax/generator/update_date.vim14
-rw-r--r--runtime/syntax/generator/vim.vim.base1192
-rw-r--r--runtime/syntax/go.vim29
-rw-r--r--runtime/syntax/gpg.vim21
-rw-r--r--runtime/syntax/i3config.vim8
-rw-r--r--runtime/syntax/java.vim137
-rw-r--r--runtime/syntax/lex.vim6
-rw-r--r--runtime/syntax/lisp.vim6
-rw-r--r--runtime/syntax/mail.vim19
-rw-r--r--runtime/syntax/maple.vim6
-rw-r--r--runtime/syntax/netrw.vim6
-rw-r--r--runtime/syntax/odin.vim103
-rw-r--r--runtime/syntax/quarto.vim8
-rw-r--r--runtime/syntax/r.vim14
-rw-r--r--runtime/syntax/rhelp.vim10
-rw-r--r--runtime/syntax/rmd.vim8
-rw-r--r--runtime/syntax/rpcgen.vim6
-rw-r--r--runtime/syntax/sh.vim48
-rw-r--r--runtime/syntax/shared/debversions.vim6
-rw-r--r--runtime/syntax/sm.vim6
-rw-r--r--runtime/syntax/spec.vim2
-rw-r--r--runtime/syntax/swayconfig.vim12
-rw-r--r--runtime/syntax/tags.vim6
-rw-r--r--runtime/syntax/testdir/README.txt45
-rw-r--r--runtime/syntax/testdir/dumps/c_00.dump4
-rw-r--r--runtime/syntax/testdir/dumps/c_01.dump10
-rw-r--r--runtime/syntax/testdir/dumps/c_02.dump10
-rw-r--r--runtime/syntax/testdir/dumps/c_03.dump10
-rw-r--r--runtime/syntax/testdir/dumps/c_04.dump6
-rw-r--r--runtime/syntax/testdir/dumps/c_05.dump10
-rw-r--r--runtime/syntax/testdir/dumps/c_06.dump10
-rw-r--r--runtime/syntax/testdir/dumps/c_99.dump2
-rw-r--r--runtime/syntax/testdir/dumps/java_comments_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_comments_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_comments_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_escapes_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_numbers_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_numbers_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_numbers_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_numbers_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_numbers_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_numbers_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_string_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/java_switch_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/markdown_conceal_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/markdown_conceal_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/modula2_iso_00.dump2
-rw-r--r--runtime/syntax/testdir/dumps/modula2_pim_00.dump2
-rw-r--r--runtime/syntax/testdir/dumps/modula2_r10_00.dump2
-rw-r--r--runtime/syntax/testdir/dumps/sh_10_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/sh_10_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/sh_10_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/sh_10_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/sh_11_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/sh_11_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_abbreviate_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_abbreviate_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_abbreviate_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_augroup_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_augroup_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_behave_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_behave_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_command_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_command_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_00.dump6
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_01.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_02.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_03.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_04.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_05.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_06.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_07.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_08.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_09.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_10.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_11.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_12.dump12
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_13.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_14.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_15.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_16.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_17.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_18.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_19.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_20.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_21.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_22.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_23.dump12
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_24.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_25.dump12
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_26.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_27.dump12
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_28.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_29.dump12
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_30.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_31.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_32.dump10
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_33.dump12
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_34.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_35.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_36.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_37.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_38.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_39.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_40.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_41.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_42.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_43.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_44.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_45.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_46.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_47.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_48.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_49.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_50.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_51.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_52.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_53.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_54.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_55.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_56.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_57.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_58.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_59.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_60.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_61.dump16
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_62.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_63.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_64.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_65.dump14
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_66.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_commands_99.dump2
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_def_fold_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_echo_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_echo_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_echo_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_execute_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_execute_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_execute_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_execute_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_func_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_func_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_07.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_08.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_09.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_07.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_08.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_09.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_function_fold_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_highlight_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_highlight_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_highlight_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_highlight_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_map_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_map_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_map_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_map_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_map_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_map_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menu_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menu_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menu_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menu_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menu_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menu_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menutranslate_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menutranslate_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menutranslate_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_menutranslate_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_substitute_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_07.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_09.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_ex_syntax_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_expr_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_expr_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_expr_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_expr_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_expr_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_03.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_07.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_08.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_key_notation_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_keymap_00.dump2
-rw-r--r--runtime/syntax/testdir/dumps/vim_line_continuation_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_line_continuation_01.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_line_continuation_02.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_line_continuation_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_new_00.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_new_99.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_00.dump30
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_01.dump28
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_02.dump40
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_03.dump40
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_04.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_05.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_06.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_07.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_08.dump20
-rw-r--r--runtime/syntax/testdir/dumps/vim_syntax_99.dump30
-rw-r--r--runtime/syntax/testdir/dumps/vim_variables_00.dump2
-rw-r--r--runtime/syntax/testdir/dumps/vim_variables_01.dump2
-rw-r--r--runtime/syntax/testdir/ftplugin/java.vim5
-rw-r--r--runtime/syntax/testdir/input/c.c1
-rw-r--r--runtime/syntax/testdir/input/java_comments.java25
-rw-r--r--runtime/syntax/testdir/input/java_escapes.java123
-rw-r--r--runtime/syntax/testdir/input/java_numbers.java88
-rw-r--r--runtime/syntax/testdir/input/java_string.java104
-rw-r--r--runtime/syntax/testdir/input/java_switch.java122
-rw-r--r--runtime/syntax/testdir/input/markdown_conceal.markdown15
-rw-r--r--runtime/syntax/testdir/input/setup/markdown_conceal.vim8
-rw-r--r--runtime/syntax/testdir/input/sh_10.sh49
-rw-r--r--runtime/syntax/testdir/input/sh_11.sh20
-rw-r--r--runtime/syntax/testdir/input/vim_ex_abbreviate.vim25
-rw-r--r--runtime/syntax/testdir/input/vim_ex_augroup.vim19
-rw-r--r--runtime/syntax/testdir/input/vim_ex_behave.vim7
-rw-r--r--runtime/syntax/testdir/input/vim_ex_command.vim5
-rw-r--r--runtime/syntax/testdir/input/vim_ex_commands.vim4
-rw-r--r--runtime/syntax/testdir/input/vim_ex_def.vim125
-rw-r--r--runtime/syntax/testdir/input/vim_ex_def_fold.vim126
-rw-r--r--runtime/syntax/testdir/input/vim_ex_echo.vim38
-rw-r--r--runtime/syntax/testdir/input/vim_ex_execute.vim41
-rw-r--r--runtime/syntax/testdir/input/vim_ex_function.vim182
-rw-r--r--runtime/syntax/testdir/input/vim_ex_function_fold.vim183
-rw-r--r--runtime/syntax/testdir/input/vim_ex_highlight.vim55
-rw-r--r--runtime/syntax/testdir/input/vim_ex_map.vim87
-rw-r--r--runtime/syntax/testdir/input/vim_ex_menu.vim87
-rw-r--r--runtime/syntax/testdir/input/vim_ex_menutranslate.vim51
-rw-r--r--runtime/syntax/testdir/input/vim_ex_substitute.vim86
-rw-r--r--runtime/syntax/testdir/input/vim_ex_syntax.vim177
-rw-r--r--runtime/syntax/testdir/input/vim_expr.vim71
-rw-r--r--runtime/syntax/testdir/input/vim_key_notation.vim163
-rw-r--r--runtime/syntax/testdir/input/vim_line_continuation.vim49
-rw-r--r--runtime/syntax/testdir/input/vim_new.vim17
-rw-r--r--runtime/syntax/testdir/input/vim_syntax.vim75
-rw-r--r--runtime/syntax/testdir/runtest.vim320
-rw-r--r--runtime/syntax/tex.vim6
-rw-r--r--runtime/syntax/tmux.vim8
-rw-r--r--runtime/syntax/vim.vim550
-rw-r--r--runtime/syntax/xmath.vim6
-rw-r--r--runtime/syntax/xxd.vim6
-rw-r--r--runtime/syntax/yacc.vim5
327 files changed, 9304 insertions, 1365 deletions
diff --git a/runtime/syntax/Makefile b/runtime/syntax/Makefile
index f3b578c..bc6de0b 100644
--- a/runtime/syntax/Makefile
+++ b/runtime/syntax/Makefile
@@ -1,5 +1,8 @@
# Portable Makefile for running syntax tests.
+# To run the test manually:
+# ../../src/vim -u 'testdir/runtest.vim' --cmd 'breakadd func RunTest'
+
# Override this if needed, the default assumes Vim was build in the src dir.
#VIMPROG = vim
VIMPROG = ../../src/vim
@@ -11,6 +14,8 @@ VIMRUNTIME = ../..
# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=45 --log-file=valgrind.$*
# ENVVARS = LC_ALL=C LANG=C LANGUAGE=C
+# Run the syntax tests with a C locale
+ENVVARS = LC_ALL=C
RUN_VIMTEST = VIMRUNTIME=$(VIMRUNTIME) $(VALGRIND) $(ENVVARS) ../$(VIMPROG) -f $(GUI_FLAG)
@@ -25,11 +30,11 @@ test:
@# the "vimcmd" file is used by the screendump utils
@echo "../$(VIMPROG)" > testdir/vimcmd
@echo "$(RUN_VIMTEST)" >> testdir/vimcmd
- VIMRUNTIME=$(VIMRUNTIME) $(VIMPROG) --clean --not-a-term $(DEBUGLOG) -u testdir/runtest.vim
+ VIMRUNTIME=$(VIMRUNTIME) $(ENVVARS) $(VIMPROG) --clean --not-a-term $(DEBUGLOG) -u testdir/runtest.vim
@# FIXME: Temporarily show the whole file to find out what goes wrong
@#if [ -f testdir/messages ]; then tail -n 6 testdir/messages; fi
@if [ -f testdir/messages ]; then cat testdir/messages; fi
clean testclean:
- rm -f testdir/failed/* testdir/done/* testdir/vimcmd testdir/messages
+ rm -f testdir/failed/* testdir/done/* testdir/vimcmd testdir/messages testdir/Xtestscript
diff --git a/runtime/syntax/amiga.vim b/runtime/syntax/amiga.vim
index 5a664c4..9402196 100644
--- a/runtime/syntax/amiga.vim
+++ b/runtime/syntax/amiga.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: AmigaDos
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
" Version: 10
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_AMIGA
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_AMIGA
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/ant.vim b/runtime/syntax/ant.vim
index 6696f96..b023123 100644
--- a/runtime/syntax/ant.vim
+++ b/runtime/syntax/ant.vim
@@ -1,9 +1,9 @@
" Vim syntax file
-" Language: ANT build file (xml)
-" Maintainer: Johannes Zellner <johannes@zellner.org>
-" Last Change: Tue Apr 27 13:05:59 CEST 2004
-" Filenames: build.xml
-" $Id: ant.vim,v 1.1 2004/06/13 18:13:18 vimboss Exp $
+" Language: ANT build file (xml)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2024 Jan 27
+" Filenames: build.xml
" Quit when a syntax file was already loaded
if exists("b:current_syntax")
@@ -44,48 +44,48 @@ call AntSyntaxScript('jpython', 'python.vim')
syn cluster xmlTagHook add=antElement
-syn keyword antElement display WsdlToDotnet addfiles and ant antcall antstructure apply archives arg argument
-syn keyword antElement display assertions attrib attribute available basename bcc blgenclient bootclasspath
-syn keyword antElement display borland bottom buildnumber buildpath buildpathelement bunzip2 bzip2 cab
-syn keyword antElement display catalogpath cc cccheckin cccheckout cclock ccmcheckin ccmcheckintask ccmcheckout
-syn keyword antElement display ccmcreatetask ccmkattr ccmkbl ccmkdir ccmkelem ccmklabel ccmklbtype
-syn keyword antElement display ccmreconfigure ccrmtype ccuncheckout ccunlock ccupdate checksum chgrp chmod
-syn keyword antElement display chown classconstants classes classfileset classpath commandline comment
-syn keyword antElement display compilerarg compilerclasspath concat concatfilter condition copy copydir
-syn keyword antElement display copyfile coveragepath csc custom cvs cvschangelog cvspass cvstagdiff cvsversion
-syn keyword antElement display daemons date defaultexcludes define delete deletecharacters deltree depend
-syn keyword antElement display depends dependset depth description different dirname dirset disable dname
-syn keyword antElement display doclet doctitle dtd ear echo echoproperties ejbjar element enable entity entry
-syn keyword antElement display env equals escapeunicode exclude excludepackage excludesfile exec execon
-syn keyword antElement display existing expandproperties extdirs extension extensionSet extensionset factory
-syn keyword antElement display fail filelist filename filepath fileset filesmatch filetokenizer filter
-syn keyword antElement display filterchain filterreader filters filterset filtersfile fixcrlf footer format
-syn keyword antElement display from ftp generic genkey get gjdoc grant group gunzip gzip header headfilter http
-syn keyword antElement display ignoreblank ilasm ildasm import importtypelib include includesfile input iplanet
-syn keyword antElement display iplanet-ejbc isfalse isreference isset istrue jar jarlib-available
-syn keyword antElement display jarlib-manifest jarlib-resolve java javac javacc javadoc javadoc2 jboss jdepend
-syn keyword antElement display jjdoc jjtree jlink jonas jpcoverage jpcovmerge jpcovreport jsharpc jspc
-syn keyword antElement display junitreport jvmarg lib libfileset linetokenizer link loadfile loadproperties
-syn keyword antElement display location macrodef mail majority manifest map mapper marker mergefiles message
-syn keyword antElement display metainf method mimemail mkdir mmetrics modified move mparse none not options or
-syn keyword antElement display os outputproperty package packageset parallel param patch path pathconvert
-syn keyword antElement display pathelement patternset permissions prefixlines present presetdef project
-syn keyword antElement display property propertyfile propertyref propertyset pvcs pvcsproject record reference
-syn keyword antElement display regexp rename renameext replace replacefilter replaceregex replaceregexp
-syn keyword antElement display replacestring replacetoken replacetokens replacevalue replyto report resource
-syn keyword antElement display revoke rmic root rootfileset rpm scp section selector sequential serverdeploy
-syn keyword antElement display setproxy signjar size sleep socket soscheckin soscheckout sosget soslabel source
-syn keyword antElement display sourcepath sql src srcfile srcfilelist srcfiles srcfileset sshexec stcheckin
-syn keyword antElement display stcheckout stlabel stlist stringtokenizer stripjavacomments striplinebreaks
-syn keyword antElement display striplinecomments style subant substitution support symlink sync sysproperty
-syn keyword antElement display syspropertyset tabstospaces tag taglet tailfilter tar tarfileset target
-syn keyword antElement display targetfile targetfilelist targetfileset taskdef tempfile test testlet text title
-syn keyword antElement display to token tokenfilter touch transaction translate triggers trim tstamp type
-syn keyword antElement display typedef unjar untar unwar unzip uptodate url user vbc vssadd vsscheckin
-syn keyword antElement display vsscheckout vsscp vsscreate vssget vsshistory vsslabel waitfor war wasclasspath
-syn keyword antElement display webapp webinf weblogic weblogictoplink websphere whichresource wlclasspath
-syn keyword antElement display wljspc wsdltodotnet xmlcatalog xmlproperty xmlvalidate xslt zip zipfileset
-syn keyword antElement display zipgroupfileset
+syn keyword antElement WsdlToDotnet addfiles and ant antcall antstructure apply archives arg argument
+syn keyword antElement assertions attrib attribute available basename bcc blgenclient bootclasspath
+syn keyword antElement borland bottom buildnumber buildpath buildpathelement bunzip2 bzip2 cab
+syn keyword antElement catalogpath cc cccheckin cccheckout cclock ccmcheckin ccmcheckintask ccmcheckout
+syn keyword antElement ccmcreatetask ccmkattr ccmkbl ccmkdir ccmkelem ccmklabel ccmklbtype
+syn keyword antElement ccmreconfigure ccrmtype ccuncheckout ccunlock ccupdate checksum chgrp chmod
+syn keyword antElement chown classconstants classes classfileset classpath commandline comment
+syn keyword antElement compilerarg compilerclasspath concat concatfilter condition copy copydir
+syn keyword antElement copyfile coveragepath csc custom cvs cvschangelog cvspass cvstagdiff cvsversion
+syn keyword antElement daemons date defaultexcludes define delete deletecharacters deltree depend
+syn keyword antElement depends dependset depth description different dirname dirset disable dname
+syn keyword antElement doclet doctitle dtd ear echo echoproperties ejbjar element enable entity entry
+syn keyword antElement env equals escapeunicode exclude excludepackage excludesfile exec execon
+syn keyword antElement existing expandproperties extdirs extension extensionSet extensionset factory
+syn keyword antElement fail filelist filename filepath fileset filesmatch filetokenizer filter
+syn keyword antElement filterchain filterreader filters filterset filtersfile fixcrlf footer format
+syn keyword antElement from ftp generic genkey get gjdoc grant group gunzip gzip header headfilter http
+syn keyword antElement ignoreblank ilasm ildasm import importtypelib include includesfile input iplanet
+syn keyword antElement iplanet-ejbc isfalse isreference isset istrue jar jarlib-available
+syn keyword antElement jarlib-manifest jarlib-resolve java javac javacc javadoc javadoc2 jboss jdepend
+syn keyword antElement jjdoc jjtree jlink jonas jpcoverage jpcovmerge jpcovreport jsharpc jspc
+syn keyword antElement junitreport jvmarg lib libfileset linetokenizer link loadfile loadproperties
+syn keyword antElement location macrodef mail majority manifest map mapper marker mergefiles message
+syn keyword antElement metainf method mimemail mkdir mmetrics modified move mparse none not options or
+syn keyword antElement os outputproperty package packageset parallel param patch path pathconvert
+syn keyword antElement pathelement patternset permissions prefixlines present presetdef project
+syn keyword antElement property propertyfile propertyref propertyset pvcs pvcsproject record reference
+syn keyword antElement regexp rename renameext replace replacefilter replaceregex replaceregexp
+syn keyword antElement replacestring replacetoken replacetokens replacevalue replyto report resource
+syn keyword antElement revoke rmic root rootfileset rpm scp section selector sequential serverdeploy
+syn keyword antElement setproxy signjar size sleep socket soscheckin soscheckout sosget soslabel source
+syn keyword antElement sourcepath sql src srcfile srcfilelist srcfiles srcfileset sshexec stcheckin
+syn keyword antElement stcheckout stlabel stlist stringtokenizer stripjavacomments striplinebreaks
+syn keyword antElement striplinecomments style subant substitution support symlink sync sysproperty
+syn keyword antElement syspropertyset tabstospaces tag taglet tailfilter tar tarfileset target
+syn keyword antElement targetfile targetfilelist targetfileset taskdef tempfile test testlet text title
+syn keyword antElement to token tokenfilter touch transaction translate triggers trim tstamp type
+syn keyword antElement typedef unjar untar unwar unzip uptodate url user vbc vssadd vsscheckin
+syn keyword antElement vsscheckout vsscp vsscreate vssget vsshistory vsslabel waitfor war wasclasspath
+syn keyword antElement webapp webinf weblogic weblogictoplink websphere whichresource wlclasspath
+syn keyword antElement wljspc wsdltodotnet xmlcatalog xmlproperty xmlvalidate xslt zip zipfileset
+syn keyword antElement zipgroupfileset
hi def link antElement Statement
diff --git a/runtime/syntax/c.vim b/runtime/syntax/c.vim
index 5ed8fdc..30db943 100644
--- a/runtime/syntax/c.vim
+++ b/runtime/syntax/c.vim
@@ -252,7 +252,7 @@ if exists("c_gnu")
syn keyword cOperator typeof __typeof__
syn keyword cOperator __real__ __imag__
syn keyword cStorageClass __attribute__ __const__ __extension__
- syn keyword cStorageClass inline __inline__
+ syn keyword cStorageClass inline __inline __inline__
syn keyword cStorageClass __restrict__ __volatile__ __noreturn__
endif
syn keyword cType int long short char void
@@ -444,6 +444,14 @@ syn match cUserLabel display "\I\i*" contained
syn match cBitField display "^\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
syn match cBitField display ";\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
+if exists("c_functions")
+ syn match cFunction "\<\h\w*\ze\_s*("
+ endif
+
+if exists("c_function_pointers")
+ syn match cFunctionPointer "\%((\s*\*\s*\)\@<=\h\w*\ze\s*)\_s*(.*)"
+endif
+
if exists("c_minlines")
let b:c_minlines = c_minlines
else
@@ -513,6 +521,8 @@ hi def link cCppOutSkip cCppOutIf2
hi def link cCppInElse2 cCppOutIf2
hi def link cCppOutIf2 cCppOut
hi def link cCppOut Comment
+hi def link cFunction Function
+hi def link cFunctionPointer Function
let b:current_syntax = "c"
diff --git a/runtime/syntax/chuck.vim b/runtime/syntax/chuck.vim
new file mode 100644
index 0000000..6fcf40c
--- /dev/null
+++ b/runtime/syntax/chuck.vim
@@ -0,0 +1,187 @@
+" Vim syntax file
+" Language: ChucK
+" Maintainer: Andrea Callea
+" URL: https://github.com/gacallea/chuck.vim
+" Last Change: 2024 Jan 21 by Andrea Callea
+
+" Sources used for this syntax
+" https://chuck.cs.princeton.edu/doc/language/
+" https://chuck.cs.princeton.edu/doc/reference/
+
+" HISTORY:
+" 2024 Jan 21 - Initial revision
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" https://chuck.cs.princeton.edu/doc/language/type.html
+syn keyword chuckPrimitiveType int float time dur void vec3 vec4
+syn keyword chuckComplexType complex polar
+syn keyword chuckReferenceType Object Event UGen array string
+syn keyword chuckBoolean true false maybe
+syn keyword chuckBoolean null NULL
+
+" https://chuck.cs.princeton.edu/doc/language/oper.html
+syn match chuckOperator "=>"
+syn match chuckOperator "@=>"
+
+syn match chuckOperator "=^"
+
+syn match chuckOperator "+"
+syn match chuckOperator "-"
+syn match chuckOperator "*"
+syn match chuckOperator "/"
+syn match chuckOperator "%"
+syn match chuckOperator "!"
+syn match chuckOperator "&"
+syn match chuckOperator "|"
+syn match chuckOperator "\^"
+
+syn match chuckOperator "+=>"
+syn match chuckOperator "-=>"
+syn match chuckOperator "*=>"
+syn match chuckOperator "/=>"
+syn match chuckOperator "%=>"
+syn match chuckOperator "!=>"
+syn match chuckOperator "&=>"
+syn match chuckOperator "|=>"
+syn match chuckOperator "\^=>"
+
+syn match chuckOperator "&&"
+syn match chuckOperator "||"
+syn match chuckOperator "=="
+syn match chuckOperator "!="
+syn match chuckOperator ">"
+syn match chuckOperator ">="
+syn match chuckOperator "<"
+syn match chuckOperator "<="
+
+syn match chuckOperator ">>"
+syn match chuckOperator "<<"
+
+syn match chuckOperator "++"
+syn match chuckOperator "--"
+syn match chuckOperator "<<<"
+syn match chuckOperator ">>>"
+
+syn keyword chuckOperator new
+
+" https://chuck.cs.princeton.edu/doc/language/ctrl.html
+syn keyword chuckConditional if else
+syn keyword chuckRepeat while do until for each
+
+" https://chuck.cs.princeton.edu/doc/language/time.html
+syn keyword chuckTimeAndDuration samp ms second minute hour day week
+syn keyword chuckTimeAndDuration now later
+
+" these may need some additional keywords I missed, for a future revision
+syn keyword chuckKeyword dac adc
+syn keyword chuckKeyword fun function
+syn keyword chuckKeyword return
+syn keyword chuckKeyword const
+syn match chuckKeyword "@"
+syn keyword chuckKeyword pi
+syn keyword chuckKeyword me
+syn keyword chuckKeyword repeat break continue
+syn keyword chuckKeyword class extends public private static pure this
+syn keyword chuckKeyword spork
+syn keyword chuckKeyword cherr chout
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckBaseClasses Shred Math Machine Std
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckBasicUGen Gain Impulse Step SndBuf SndBuf2
+syn keyword chuckBasicUGen ADSR Envelope Delay DelayL DelayA Echo
+syn keyword chuckBasicUGen Noise CNoise Osc SinOsc TriOsc SawOsc PulseOsc SqrOsc
+syn keyword chuckBasicUGen Phasor HalfRect FullRect
+syn keyword chuckBasicUGen Chugraph Chugen UGen_Multi UGen_Stereo Mix2 Pan2
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckFilterUGen FilterBasic LPF HPF BPF BRF BiQuad ResonZ
+syn keyword chuckFilterUGen OnePole OneZero TwoPole TwoZero PoleZero
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckSTKUGen JCRev NRev PRCRev
+syn keyword chuckSTKUGen Chorus Modulate PitShift SubNoise
+syn keyword chuckSTKUGen BLT Blit BlitSaw BlitSquare FilterStk
+syn keyword chuckSTKUGen WvIn WaveLoop WvOut WvOut2 StkInstrument
+syn keyword chuckSTKUGen BandedWG BlowBotl BlowHole
+syn keyword chuckSTKUGen Bowed Brass Clarinet Flute Mandolin
+syn keyword chuckSTKUGen ModalBar Moog Saxofony Shakers Sitar StifKarp
+syn keyword chuckSTKUGen VoicForm KrstlChr FM BeeThree FMVoices
+syn keyword chuckSTKUGen HevyMetl HnkyTonk FrencHrn PercFlut Rhodey TubeBell Wurley
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckAdvancedUGen LiSa LiSa2 LiSa6 LiSa8 LiSa10
+syn keyword chuckAdvancedUGen LiSa16 GenX Gen5 Gen7 Gen9 Gen10 Gen17
+syn keyword chuckAdvancedUGen CurveTable WarpTable Dyno
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckChugin ABSaturator AmbPan3 Bitcrusher Elliptic ExpDelay ExpEnv FIR
+syn keyword chuckChugin FoldbackSaturator GVerb KasFilter MagicSine Mesh2D
+syn keyword chuckChugin Multicomb Pan4 Pan8 Pan16 PitchTrack PowerADSR RegEx
+syn keyword chuckChugin Sigmund Spectacle WinFuncEnv WPDiodeLadder WPKorg35
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckUnitAnalyzer UAna UAnaBlob Windowing
+syn keyword chuckUnitAnalyzer FFT IFFT DCT IDCT
+syn keyword chuckUnitAnalyzer Centroid Flux RMS RollOff
+syn keyword chuckUnitAnalyzer Flip UnFlip XCorr
+syn keyword chuckUnitAnalyzer Chroma Kurtosis MFCC SFM ZeroX AutoCorr FeatureCollector
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckChAI MLP KNN KNN2 HMM SVM Word2Vec PCA Wekinator AI
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckInputOutput IO FileIO OscIn OscOut OscMsg
+syn keyword chuckInputOutput Hid HidMsg KBHit SerialIO
+syn keyword chuckInputOutput MidiIn MidiOut MidiMsg MidiFileIn
+
+" https://chuck.cs.princeton.edu/doc/reference/
+syn keyword chuckUtilities CKDoc StringTokenizer ConsoleInput
+
+" https://github.com/wilsaj/chuck.vim/blob/master/syntax/chuck.vim
+syn match chuckNumber /\%(\i\|\$\)\@<![-]\?\d\+/ display
+syn match chuckHex /\<0[xX]\x\+[lL]\=\>/ display
+syn match chuckFloat /\%(\i\|\$\)\@<![-]\?\%(\d*\.\d\+\|\d\+\.\)/ display
+
+" this may need fixing/improvements
+syn match chuckComment "//.*$"
+syn region chuckComment start="/\*" end="\*/"
+syn match chuckSpecialChar contained "\\n"
+syn match chuckSpecialChar contained "\\t"
+syn match chuckSpecialChar contained "\\a"
+syn match chuckSpecialChar contained /\\"/
+syn match chuckSpecialChar contained "\\0"
+syn region chuckString start=/"/ end=/"/ display contains=chuckSpecialChar
+
+hi def link chuckPrimitiveType Type
+hi def link chuckComplexType Type
+hi def link chuckReferenceType Type
+hi def link chuckBoolean Boolean
+hi def link chuckOperator Operator
+hi def link chuckConditional Conditional
+hi def link chuckRepeat Repeat
+hi def link chuckTimeAndDuration Keyword
+hi def link chuckKeyword Keyword
+hi def link chuckBaseClasses Special
+hi def link chuckBasicUGen Structure
+hi def link chuckFilterUGen Structure
+hi def link chuckSTKUGen Structure
+hi def link chuckAdvancedUGen Structure
+hi def link chuckChugin Structure
+hi def link chuckUnitAnalyzer Structure
+hi def link chuckChAI Structure
+hi def link chuckInputOutput Special
+hi def link chuckUtilities Special
+hi def link chuckNumber Number
+hi def link chuckHex Number
+hi def link chuckFloat Float
+hi def link chuckComment Comment
+hi def link chuckSpecialChar SpecialChar
+hi def link chuckString String
+
+let b:current_syntax = "chuck"
diff --git a/runtime/syntax/csh.vim b/runtime/syntax/csh.vim
index 6a056c7..0ad85ad 100644
--- a/runtime/syntax/csh.vim
+++ b/runtime/syntax/csh.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: C-shell (csh)
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
" Version: 14
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_CSH
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_CSH
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/css.vim b/runtime/syntax/css.vim
index f8104ea..f4d09cf 100644
--- a/runtime/syntax/css.vim
+++ b/runtime/syntax/css.vim
@@ -7,7 +7,7 @@
" Nikolai Weibull (Add CSS2 support)
" URL: https://github.com/vim-language-dept/css-syntax.vim
" Maintainer: Jay Sitter <jay@jaysitter.com>
-" Last Change: 2021 Oct 20
+" Last Change: 2024 Mar 2
" quit when a syntax file was already loaded
if !exists("main_syntax")
@@ -127,7 +127,7 @@ syn match cssColor contained "#\x\{8\}\>" contains=cssUnitDecorators
syn region cssURL contained matchgroup=cssFunctionName start="\<\(uri\|url\|local\|format\)\s*(" end=")" contains=cssStringQ,cssStringQQ oneline
syn region cssMathGroup contained matchgroup=cssMathParens start="(" end=")" containedin=cssFunction,cssMathGroup contains=cssCustomProp,cssValue.*,cssFunction,cssColor,cssStringQ,cssStringQQ oneline
-syn region cssFunction contained matchgroup=cssFunctionName start="\<\(var\|calc\)\s*(" end=")" contains=cssCustomProp,cssValue.*,cssFunction,cssColor,cssStringQ,cssStringQQ oneline
+syn region cssFunction contained matchgroup=cssFunctionName start="\<\(var\|calc\)\s*(" end=")" contains=cssCustomProp,cssValue.*,cssFunction,cssURL,cssColor,cssStringQ,cssStringQQ oneline
syn region cssFunction contained matchgroup=cssFunctionName start="\<\(rgb\|clip\|attr\|counter\|rect\|cubic-bezier\|steps\)\s*(" end=")" oneline contains=cssValueInteger,cssValueNumber,cssValueLength,cssFunctionComma
syn region cssFunction contained matchgroup=cssFunctionName start="\<\(rgba\|hsl\|hsla\|color-stop\|from\|to\)\s*(" end=")" oneline contains=cssColor,cssValueInteger,cssValueNumber,cssValueLength,cssFunctionComma,cssFunction
syn region cssFunction contained matchgroup=cssFunctionName start="\<\(linear-\|radial-\|conic-\)\=\gradient\s*(" end=")" oneline contains=cssColor,cssValueInteger,cssValueNumber,cssValueLength,cssFunction,cssGradientAttr,cssFunctionComma
@@ -176,6 +176,8 @@ syn keyword cssBackgroundAttr contained cover contain
syn match cssBorderProp contained "\<border\(-\(top\|right\|bottom\|left\)\)\=\(-\(width\|color\|style\)\)\=\>"
syn match cssBorderProp contained "\<border\(-\(top\|bottom\)-\(left\|right\)\)\=-radius\>"
+syn match cssBorderProp contained "\<border-\(inline\|block\)\(-\(start\|end\)\)\=\(-\(style\|width\|color\)\)\=\>"
+syn match cssBorderProp contained "\<border-\(start\|end\)-\(start\|end\)-radius\>"
syn match cssBorderProp contained "\<border-image\(-\(outset\|repeat\|slice\|source\|width\)\)\=\>"
syn match cssBorderProp contained "\<box-decoration-break\>"
syn match cssBorderProp contained "\<box-shadow\>"
@@ -195,6 +197,7 @@ syn keyword cssBorderAttr contained clone slice
syn match cssBoxProp contained "\<padding\(-\(top\|right\|bottom\|left\)\)\=\>"
syn match cssBoxProp contained "\<margin\(-\(top\|right\|bottom\|left\)\)\=\>"
+syn match cssBoxProp contained "\<\(margin\|padding\)\(-\(inline\|block\)\(-\(start\|end\)\)\)\=\>"
syn match cssBoxProp contained "\<overflow\(-\(x\|y\|style\)\)\=\>"
syn match cssBoxProp contained "\<rotation\(-point\)\=\>"
syn keyword cssBoxAttr contained visible hidden scroll auto
@@ -227,7 +230,7 @@ syn match cssFlexibleBoxAttr contained "\<space\(-\(between\|around\|evenly\)\)\
" CSS Fonts Module Level 3
" http://www.w3.org/TR/css-fonts-3/
-syn match cssFontProp contained "\<font\(-\(family\|\|feature-settings\|kerning\|language-override\|size\(-adjust\)\=\|stretch\|style\|synthesis\|variant\(-\(alternates\|caps\|east-asian\|ligatures\|numeric\|position\)\)\=\|weight\)\)\=\>"
+syn match cssFontProp contained "\<font\(-\(display\|family\|feature-settings\|kerning\|language-override\|size\(-adjust\)\=\|stretch\|style\|synthesis\|variant\(-\(alternates\|caps\|east-asian\|ligatures\|numeric\|position\)\)\=\|weight\)\)\=\>"
" font attributes
syn keyword cssFontAttr contained icon menu caption
@@ -248,6 +251,8 @@ syn keyword cssFontAttr contained italic oblique
syn keyword cssFontAttr contained weight style
" font-weight attributes
syn keyword cssFontAttr contained bold bolder lighter
+" font-display attributes
+syn keyword cssFontAttr contained auto block swap fallback optional
" TODO: font-variant-* attributes
"------------------------------------------------
@@ -282,7 +287,7 @@ syn match cssGeneratedContentAttr contained "\<\(no-\)\=\(open\|close\)-quote\>"
" https://www.w3.org/TR/css-grid-1/
syn match cssGridProp contained "\<grid\>"
syn match cssGridProp contained "\<grid-template\(-\(columns\|rows\|areas\)\)\=\>"
-syn match cssGridProp contained "\<grid-\(column\|row\)\(-\(start\|end\|gap\)\)\=\>"
+syn match cssGridProp contained "\<\(grid-\)\=\(column\|row\)\(-\(start\|end\|gap\)\)\=\>"
syn match cssGridProp contained "\<grid-\(area\|gap\)\>"
syn match cssGridProp contained "\<gap\>"
syn match cssGridProp contained "\<grid-auto-\(flow\|rows\|columns\)\>"
@@ -452,12 +457,12 @@ syn match cssAttrComma ","
" Pseudo class
" https://www.w3.org/TR/selectors-4/
syn match cssPseudoClass ":[A-Za-z0-9_-]*" contains=cssNoise,cssPseudoClassId,cssUnicodeEscape,cssVendor,cssPseudoClassFn
-syn keyword cssPseudoClassId contained link visited active hover before after left right any-link
-syn keyword cssPseudoClassId contained root empty target enabled disabled checked invalid default defined autofill fullscreen host indeterminate in-range modal optional out-of-range picture-in-picture placeholder-shown paused playing read-only read-write required scope
+syn keyword cssPseudoClassId contained link visited active hover before after left right
+syn keyword cssPseudoClassId contained root empty target enabled disabled checked invalid
syn match cssPseudoClassId contained "\<first-\(line\|letter\)\>"
syn match cssPseudoClassId contained "\<\(first\|last\|only\)-\(of-type\|child\)\>"
syn match cssPseudoClassId contained "\<focus\(-within\|-visible\)\=\>"
-syn region cssPseudoClassFn contained matchgroup=cssFunctionName start="\<\(where\|has\|host\|not\|is\|lang\|\(nth\|nth-last\)-\(of-type\|child\)\)(" end=")" contains=cssStringQ,cssStringQQ,cssTagName,cssAttributeSelector,cssClassName,cssIdentifier
+syn region cssPseudoClassFn contained matchgroup=cssFunctionName start="\<\(not\|is\|lang\|\(nth\|nth-last\)-\(of-type\|child\)\)(" end=")" contains=cssStringQ,cssStringQQ,cssTagName,cssAttributeSelector,cssClassName,cssIdentifier
" ------------------------------------
" Vendor specific properties
syn match cssPseudoClassId contained "\<selection\>"
diff --git a/runtime/syntax/dcl.vim b/runtime/syntax/dcl.vim
index 530fbdb..1987ebb 100644
--- a/runtime/syntax/dcl.vim
+++ b/runtime/syntax/dcl.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: DCL (Digital Command Language - vms)
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Mar 26, 2019
" Version: 13
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_DCL
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_DCL
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/deb822sources.vim b/runtime/syntax/deb822sources.vim
index 8111361..f7d337f 100644
--- a/runtime/syntax/deb822sources.vim
+++ b/runtime/syntax/deb822sources.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Debian deb822-format source list file
" Maintainer: Debian Vim Maintainers
-" Last Change: 2023 May 25
+" Last Change: 2024 Jan 30
" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/deb822sources.vim
" Standard syntax initialization
@@ -12,19 +12,19 @@ endif
" case insensitive
syn case ignore
+" A bunch of useful keywords
+syn match deb822sourcesType /\<\(deb-src\|deb\)\ */ contained
+syn match deb822sourcesFreeComponent /\<\(main\|universe\)\> */ contained
+syn match deb822sourcesNonFreeComponent /\<\(contrib\|non-free-firmware\|non-free\|restricted\|multiverse\)\> */ contained
+
" Comments are matched from the first character of a line to the end-of-line
syn region deb822sourcesComment start="^#" end="$"
-" A bunch of useful keywords
-syn match deb822sourcesType /\(deb-src\|deb\)/
-syn match deb822sourcesFreeComponent /\(main\|universe\)/
-syn match deb822sourcesNonFreeComponent /\(contrib\|non-free-firmware\|non-free\|restricted\|multiverse\)/
-
" Include Debian versioning information
runtime! syntax/shared/debversions.vim
-exe 'syn match deb822sourcesSupportedSuites contained + *\([[:alnum:]_./]*\)\<\('. join(g:debSharedSupportedVersions, '\|'). '\)\>\([-[:alnum:]_./]*\)+'
-exe 'syn match deb822sourcesUnsupportedSuites contained + *\([[:alnum:]_./]*\)\<\('. join(g:debSharedUnsupportedVersions, '\|'). '\)\>\([-[:alnum:]_./]*\)+'
+exe 'syn match deb822sourcesSupportedSuites contained + *\([[:alnum:]_./]*\)\<\('. join(g:debSharedSupportedVersions, '\|'). '\)\>\([-[:alnum:]_./]*\) *+'
+exe 'syn match deb822sourcesUnsupportedSuites contained + *\([[:alnum:]_./]*\)\<\('. join(g:debSharedUnsupportedVersions, '\|'). '\)\>\([-[:alnum:]_./]*\) *+'
unlet g:debSharedSupportedVersions
unlet g:debSharedUnsupportedVersions
@@ -37,13 +37,13 @@ syn keyword deb822sourcesYesNo contained yes no
" Match uri's
syn match deb822sourcesUri '\(https\?://\|ftp://\|[rs]sh://\|debtorrent://\|\(cdrom\|copy\|file\):\)[^' <>"]\+'
-syn match deb822sourcesEntryField "^\%(Types\|URIs\|Suites\|Components\): *"
-syn match deb822sourcesOptionField "^\%(Signed-By\|Check-Valid-Until\|Valid-Until-Min\|Valid-Until-Max\|Date-Max-Future\|InRelease-Path\): *"
-syn match deb822sourcesMultiValueOptionField "^\%(Architectures\|Languages\|Targets\)\%(-Add\|-Remove\)\?: *"
-
+syn region deb822sourcesStrictField matchgroup=deb822sourcesEntryField start="^\%(Types\|URIs\|Suites\|Components\): *" end="$" contains=deb822sourcesType,deb822sourcesUri,deb822sourcesSupportedSuites,deb822sourcesUnsupportedSuites,deb822sourcesFreeComponent,deb822sourcesNonFreeComponent oneline
+syn region deb822sourcesField matchgroup=deb822sourcesOptionField start="^\%(Signed-By\|Check-Valid-Until\|Valid-Until-Min\|Valid-Until-Max\|Date-Max-Future\|InRelease-Path\): *" end="$" oneline
+syn region deb822sourcesField matchgroup=deb822sourcesMultiValueOptionField start="^\%(Architectures\|Languages\|Targets\)\%(-Add\|-Remove\)\?: *" end="$" oneline
syn region deb822sourcesStrictField matchgroup=deb822sourcesBooleanOptionField start="^\%(PDiffs\|Allow-Insecure\|Allow-Weak\|Allow-Downgrade-To-Insecure\|Trusted\|Check-Date\): *" end="$" contains=deb822sourcesYesNo oneline
syn region deb822sourcesStrictField matchgroup=deb822sourcesForceBooleanOptionField start="^\%(By-Hash\): *" end="$" contains=deb822sourcesForce,deb822sourcesYesNo oneline
+hi def link deb822sourcesField Default
hi def link deb822sourcesComment Comment
hi def link deb822sourcesEntryField Keyword
hi def link deb822sourcesOptionField Special
diff --git a/runtime/syntax/debsources.vim b/runtime/syntax/debsources.vim
index 9846cfd..76b52cf 100644
--- a/runtime/syntax/debsources.vim
+++ b/runtime/syntax/debsources.vim
@@ -2,7 +2,7 @@
" Language: Debian sources.list
" Maintainer: Debian Vim Maintainers
" Former Maintainer: Matthijs Mohlmann <matthijs@cacholong.nl>
-" Last Change: 2023 Oct 11
+" Last Change: 2024 Jan 30
" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debsources.vim
" Standard syntax initialization
@@ -14,9 +14,9 @@ endif
syn case match
" A bunch of useful keywords
-syn match debsourcesType /\(deb-src\|deb\)/
-syn match debsourcesFreeComponent /\(main\|universe\)/
-syn match debsourcesNonFreeComponent /\(contrib\|non-free-firmware\|non-free\|restricted\|multiverse\)/
+syn match debsourcesType /\<\(deb-src\|deb\)\>/ contained
+syn match debsourcesFreeComponent /\<\(main\|universe\)\>/ contained
+syn match debsourcesNonFreeComponent /\<\(contrib\|non-free-firmware\|non-free\|restricted\|multiverse\)\>/ contained
" Match comments
syn match debsourcesComment /#.*/ contains=@Spell
@@ -34,7 +34,6 @@ unlet g:debSharedUnsupportedVersions
syn match debsourcesUri '\(https\?://\|ftp://\|[rs]sh://\|debtorrent://\|\(cdrom\|copy\|file\):\)[^' <>"]\+'
syn region debsourcesLine start="^" end="$" contains=debsourcesType,debsourcesFreeComponent,debsourcesNonFreeComponent,debsourcesComment,debsourcesUri,debsourcesDistrKeyword,debsourcesUnsupportedDistrKeyword oneline
-
" Associate our matches and regions with pretty colours
hi def link debsourcesType Statement
hi def link debsourcesFreeComponent Statement
diff --git a/runtime/syntax/dosbatch.vim b/runtime/syntax/dosbatch.vim
index a75771b..5560199 100644
--- a/runtime/syntax/dosbatch.vim
+++ b/runtime/syntax/dosbatch.vim
@@ -2,11 +2,11 @@
" Language: MS-DOS/Windows batch file (with NT command extensions)
" Maintainer: Mike Williams <mrmrdubya@gmail.com>
" Filenames: *.bat
-" Last Change: 12th February 2023
+" Last Change: 3rd February 2024
"
" Options Flags:
" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default]
-" dosbatch_colons_comment - any value to treat :: as comment line
+" dosbatch_colons_comment - any value to allow :: comments in code blocks
"
" quit when a syntax file was already loaded
@@ -88,18 +88,22 @@ syn match dosbatchLabel "\<goto\s\+\h\w*\>"lc=4
syn match dosbatchLabel ":\h\w*\>"
" Comments - usual rem but also two colons as first non-space is an idiom
-syn match dosbatchComment "^rem\($\|\s.*$\)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
-syn match dosbatchComment "^@rem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
-syn match dosbatchComment "\srem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
-syn match dosbatchComment "\s@rem\($\|\s.*$\)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchRemComment "^rem\($\|\s.*$\)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchRemComment "^@rem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchRemComment "\srem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchRemComment "\s@rem\($\|\s.*$\)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchColonComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+
+" Commands code blocks
+syn cluster dosbatchCodeBlockComment contains=dosbatchRemComment
if exists("dosbatch_colons_comment")
- syn match dosbatchComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+ syn cluster dosbatchCodeBlockComment add=dosbatchColonComment
else
- syn match dosbatchError "\s*:\s*:.*$"
+ syn match dosbatchColonCommentErr contained "\s*:\s*:.*$"
endif
-
-" Comments in ()'s - still to handle spaces before rem
-syn match dosbatchComment "(rem\([^)]\|\^\@<=)\)*"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchColonCommentErr contained "\s*:\s*:[^)]*\(\(\n\s*\)\?)\)\@="
+syn region dosbatchCodeBlock transparent start=+(+ end=+)+ contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator,@dosbatchCodeBlockComment,dosbatchColonCommentErr,dosbatchCodeBlock
+syn match dosbatchCodeBlockErr ")"
syn keyword dosbatchImplicit append assoc at attrib break cacls cd chcp chdir
syn keyword dosbatchImplicit chkdsk chkntfs cls cmd color comp compact convert copy
@@ -116,6 +120,8 @@ syn keyword dosbatchImplicit vol xcopy
hi def link dosbatchTodo Todo
hi def link dosbatchError Error
+hi def link dosbatchCodeBlockErr dosbatchError
+hi def link dosbatchColonCommentErr dosbatchError
hi def link dosbatchStatement Statement
hi def link dosbatchCommands dosbatchStatement
@@ -140,6 +146,9 @@ hi def link dosbatchBinary dosbatchNumber
hi def link dosbatchOctal dosbatchNumber
hi def link dosbatchComment Comment
+hi def link dosbatchRemComment dosbatchComment
+hi def link dosbatchColonComment dosbatchComment
+
hi def link dosbatchImplicit Function
hi def link dosbatchSwitch Special
diff --git a/runtime/syntax/elmfilt.vim b/runtime/syntax/elmfilt.vim
index d995853..aa1b57c 100644
--- a/runtime/syntax/elmfilt.vim
+++ b/runtime/syntax/elmfilt.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: Elm Filter rules
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
" Version: 9
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_ELMFILT
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_ELMFILT
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/exports.vim b/runtime/syntax/exports.vim
index 05a3f1a..00b7d80 100644
--- a/runtime/syntax/exports.vim
+++ b/runtime/syntax/exports.vim
@@ -1,10 +1,11 @@
" Vim syntax file
" Language: exports
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
" Version: 8
" Notes: This file includes both SysV and BSD 'isms
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_EXPORTS
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_EXPORTS
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/fortran.vim b/runtime/syntax/fortran.vim
index 1fb8a1c..8167e4d 100644
--- a/runtime/syntax/fortran.vim
+++ b/runtime/syntax/fortran.vim
@@ -1,6 +1,6 @@
" Vim syntax file
" Language: Fortran 2023 (and Fortran 2018, 2008, 2003, 95, 90, and 77)
-" Version: (v110) 2024 January 03
+" Version: (v113) 2024 February 01
" Maintainers: Ajit J. Thakkar <ajit@unb.ca>; <https://ajit.ext.unb.ca/>
" Joshua Hollett <j.hollett@uwinnipeg.ca>
" Usage: For instructions, do :help fortran-syntax from Vim
@@ -25,7 +25,7 @@ set cpo&vim
" Choose between fixed and free source form if this hasn't been done yet
if !exists("b:fortran_fixed_source")
if exists("fortran_free_source")
- " User guarantees free source form for all fortran files
+ " User guarantees free source form for all Fortran files
let b:fortran_fixed_source = 0
elseif exists("fortran_fixed_source")
" User guarantees fixed source form for all fortran files
@@ -37,7 +37,7 @@ if !exists("b:fortran_fixed_source")
" Fixed-form file extension defaults
let b:fortran_fixed_source = 1
else
- " Modern fortran compilers still allow both free and fixed source form.
+ " Modern Fortran compilers still allow both free and fixed source form.
" Assume fixed source form unless signs of free source form
" are detected in the first five columns of the first s:lmax lines.
" Detection becomes more accurate and time-consuming if more lines
@@ -61,6 +61,9 @@ if !exists("b:fortran_fixed_source")
endif
endif
+" Group names ending in 'Del' and 'Ob', respectively, indicate features deleted and obsolescent in Fortran 2018 and later
+" Deleted features are highlighted as errors
+" Obsolescent features are highlighted as todo items
syn case ignore
if b:fortran_fixed_source == 1
@@ -78,59 +81,68 @@ syn match fortranConstructName "\%(\<end\s*forall\s\+\)\@15<=\a\w*\>"
syn match fortranConstructName "\%(\<end\s*critical\s\+\)\@17<=\a\w*\>"
syn match fortranConstructName "\%(\<end\s*associate\s\+\)\@18<=\a\w*\>"
-syn match fortranUnitName "\%(\<\%(end\s*\)\?\%(subroutine\|function\|module\|program\|submodule\)\s\+\)\@12<=\a\w\+"
+syn match fortranUnitName "\%(\<\%(end\s*\)\?\%(subroutine\|function\|module\|program\|submodule\)\s\+\)\@12<=\a\w*"
syn match fortranUnitHeader "\<end\>\ze\s*\%(!.*\)\?$"
-syn keyword fortranIntrinsic abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh
+syn keyword fortranIntrinsic abs acos aimag aint anint asin atan atan2 cmplx conjg cos cosh exp ichar index int log log10 max min nint sin sinh sqrt tan tanh
syn keyword fortranIntrinsicR achar iachar transfer dble dprod dim lge lgt lle llt mod
syn keyword fortranIntrinsic command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line same_type_as extends_type_of
-syn keyword fortranIntrinsic selected_real_kind selected_int_kind selected_logical_kind selected_char_kind
+syn keyword fortranIntrinsic selected_real_kind selected_int_kind selected_logical_kind selected_char_kind next previous
syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2
syn keyword fortranIntrinsic adjustl adjustr all allocated any associated bit_size btest ceiling cshift date_and_time digits
syn keyword fortranIntrinsic dot_product eoshift exponent floor fraction iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc merge minexponent minloc
-syn keyword fortranIntrinsic modulo mvbits nearest pack precision present radix random_number random_seed range repeat reshape rrspacing scale scan set_exponent shape size spacing
-"syn keyword fortranIntrinsic count epsilon maxval minval product sum huge tiny
+syn keyword fortranIntrinsic modulo mvbits nearest pack precision present radix random_number random_seed range repeat reshape rrspacing scale scan set_exponent shape spacing
" intrinsic names often used for variables in older Fortran code
-syn match fortranIntrinsic '\<\%(count\|epsilon\|maxval\|minval\|product\|sum\|huge\|tiny\)\>\ze\s*('
-syn keyword fortranIntrinsic spread system_clock transpose trim ubound unpack verify
+syn match fortranIntrinsic '\<\%(count\|epsilon\|maxval\|minval\|product\|sum\|huge\|tiny\|char\)\>\ze\s*('
+syn keyword fortranIntrinsic spread system_clock transpose trim ubound unpack verify is_contiguous event_query
syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
syn keyword fortranIntrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image
syn keyword fortranIntrinsic null cpu_time failed_images stopped_images image_status co_broadcast co_max co_min co_sum co_reduce
syn keyword fortranIntrinsic atomic_add atomic_and atomic_or atomic_xor atomic_fetch_add atomic_fetch_and atomic_fetch_or atomic_fetch_xor atomic_cas
-syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
-syn keyword fortranIntrinsic ieee_max ieee_max_mag ieee_min ieee_min_mag split tokenize ieee_support_subnormal ieee_get_modes ieee_set_modes
-syn keyword fortranIntrinsic ieee_set_status ieee_get_rounding_mode ieee_set_rounding_mode
-syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_sizeof c_associated c_f_pointer c_f_procpointer
-syn keyword fortranIntrinsic out_of_range reduce random_init coshape
+syn keyword fortranIntrinsic ieee_arithmetic ieee_features ieee_exceptions
+syn keyword fortranIntrinsic ieee_class ieee_copy_sign ieee_fma ieee_get_rounding_mode ieee_get_underflow_mode ieee_int ieee_is_finite
+syn keyword fortranIntrinsic ieee_is_nan ieee_is_negative ieee_is_normal ieee_logb ieee_max ieee_max_mag ieee_max_num ieee_max_num_mag
+syn keyword fortranIntrinsic ieee_min ieee_min_mag ieee_min_num ieee_min_num_mag ieee_next_after ieee_next_down ieee_next_up ieee_quiet_eq
+syn keyword fortranIntrinsic ieee_quiet_ge ieee_quiet_gt ieee_quiet_le ieee_quiet_lt ieee_quiet_ne ieee_real ieee_rem ieee_rint ieee_scalb
+syn keyword fortranIntrinsic ieee_selected_real_kind ieee_set_rounding_mode ieee_set_underflow_mode ieee_signaling_eq ieee_signaling_ge
+syn keyword fortranIntrinsic ieee_signaling_gt ieee_signaling_le ieee_signaling_lt ieee_signaling_ne ieee_signbit ieee_support_datatype
+syn keyword fortranIntrinsic ieee_support_denormal ieee_support_divide ieee_support_inf ieee_support_io ieee_support_nan ieee_support_rounding
+syn keyword fortranIntrinsic ieee_support_sqrt ieee_support_subnormal ieee_support_standard ieee_support_underflow_control
+syn keyword fortranIntrinsic ieee_unordered ieee_value ieee_get_flag ieee_get_halting_mode ieee_get_modes ieee_get_status
+syn keyword fortranIntrinsic ieee_set_flag ieee_set_halting_mode ieee_set_modes ieee_set_status ieee_support_flag ieee_support_halting
+syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_sizeof c_associated c_f_pointer c_f_procpointer c_f_strpointer f_c_string
+syn keyword fortranIntrinsic iso_fortran_env compiler_options compiler_version
+syn keyword fortranIntrinsic out_of_range reduce random_init coshape get_team split tokenize
syn keyword fortranIntrinsic acosd asind atand atan2d cosd sind tand acospi asinpi atanpi atan2pi cospi sinpi tanpi
-syn keyword fortranIntrinsic compiler_options compiler_version get_team team_number
-syn match fortranIntrinsic "\<real\s*("me=s+4
-syn match fortranIntrinsic "\<logical\s*("me=s+7
-syn match fortranIntrinsic "\<not\s*("me=s+3
-syn match fortranIntrinsic "\<len\s*("me=s+3
-syn match fortranIntrinsic "\<kind\s*("me=s+4
-" obsolescent type-specific intrinsics
+syn match fortranIntrinsic "\%(^\s*\|type *is *(\s*\)\@12<!\<real\ze\s*("
+syn match fortranIntrinsic '\<\%(logical\|not\|len\|kind\|rank\)\>\ze\s*('
+syn match fortranIntrinsic '\<\%(sign\|size\|team_number\)\>\ze\s*('
+" Obsolescent type-specific intrinsics
syn keyword fortranIntrinsicOb alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl
-" Extra intrinsics provided by some vendors
-syn keyword fortranExtraIntrinsic algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh
+if exists("fortran_vendor_intrinsics")
+ syn keyword fortranIntrinsicVen algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh
+endif
-syn keyword fortranType generic final enumerator import
-syn keyword fortranType c_ptr c_funptr elemental pure impure recursive non_recursive
-syn match fortranTypeOb "^\s*\zs\%(character\s*\)\@15<=\*"
-syn match fortranType "^\s*\zs\%(implicit\s\+\)\?\%(real\|integer\|logical\|complex\|character\|type\)\>"
+syn keyword fortranType generic final enumerator import classof typeof team_type event_type lock_type notify_type
+syn keyword fortranType ieee_flag_type ieee_modes_type ieee_status_type ieee_class_type ieee_round_type ieee_features_type
+syn keyword fortranType c_ptr c_funptr elemental pure impure recursive non_recursive simple
+syn match fortranType "^\s*\%(implicit\s\+\)\?\%(real\|double\s*precision\|integer\|logical\|complex\|character\|type\)\>"
+syn match fortranTypeOb "^\s*\%(character\s*\)\@15<=\*"
syn match fortranType "^\s*\zsimplicit\s\+none\>"
-syn match fortranType "\<\%(class\|type\)\%(of\)\?\>"
+syn match fortranType "\<class\>"
+syn match fortranType "\%(\<type\s\+is\s\+[(]\s*\)\@15<=\%(real\|double\s*precision\|integer\|logical\|complex\|character\)\>"
syn match fortranType "\<\%(end\s*\)\?interface\>"
syn match fortranType "\<enum\s*,\s*bind\s*(\s*c\s*)"
syn match fortranType "\<end\s*\%(enum\|type\)\>"
-syn match fortranType "\<\%(end\s*\)\?enumeration\s\+type"
+syn match fortranType "\<\%(end\s*\)\?enumeration\s\+type\>"
syn match fortranType "\<\%(end\s*\)\?\%(module\s\+\)\?procedure\>"
+syn match fortranType "\%(simple \|pure \|impure \|recursive \|non_recursive \|elemental \|module \)\@17<=\%(real\|double precision\|integer\|logical\|complex\|character\)"
syn match fortranTypeR display "\<double\s*precision\>"
syn match fortranTypeR display "\<double\s\+complex\>"
-syn keyword fortranAttribute value bind deferred contiguous intrinsic non_intrinsic
-syn keyword fortranAttribute asynchronous nopass non_overridable pass volatile extends
-syn keyword fortranAttribute abstract external private public protected intent optional
-syn keyword fortranAttribute pointer target allocatable dimension codimension sequence parameter save
+syn keyword fortranAttribute abstract allocatable bind codimension contiguous deferred dimension extends
+syn keyword fortranAttribute external intent intrinsic non_intrinsic non_overridable nopass optional parameter pass
+syn keyword fortranAttribute pointer private protected public save sequence target value volatile
+syn match fortranAttribute "\<asynchronous\>\ze\s*\%(::\|,\|(\)"
syn keyword fortranUnitHeader result operator assignment
syn match fortranUnitHeader "\<\%(end\s*\)\?\%(subroutine\|function\|module\|program\|submodule\)\>"
@@ -149,17 +161,17 @@ syn keyword fortranTodo contained bug note debug todo fixme
syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
syn match fortranParenError ")"
-syn match fortranOperator "\.\s*n\=eqv\s*\."
+syn match fortranOperator "\.\s*n\?eqv\s*\."
syn match fortranOperator "\.\s*\%(and\|or\|not\)\s*\."
syn match fortranOperator "\%(+\|-\|/\|\*\)"
-syn match fortranOperator "\%(\%(>\|<\)=\=\|==\|/=\|=\)"
+syn match fortranOperator "\%(\%(>\|<\)=\?\|==\|/=\|=\)"
syn match fortranOperator "\%(%\|?\|=>\)"
syn match fortranOperator "\%([\|]\)"
syn match fortranOperatorR "\.\s*[gl][et]\s*\."
syn match fortranOperatorR "\.\s*\%(eq\|ne\)\s*\."
syn keyword fortranReadWrite print flush
-syn match fortranReadWrite '\<\%(backspace\|close\|endfile\|inquire\|open\|read\|rewind\|write\)\ze\s*('
+syn match fortranReadWrite '\<\%(backspace\|close\|endfile\|inquire\|open\|read\|rewind\|wait\|write\)\ze\s*('
"If tabs are allowed then the left margin checks do not work
if exists("fortran_have_tabs")
@@ -170,17 +182,17 @@ endif
"Numbers of various sorts
" Integers
-syn match fortranNumber display "\<\d\+\%(_\a\w*\)\=\>"
+syn match fortranNumber display "\<\d\+\%(_\a\w*\)\?\>"
" floating point number, without a decimal point
-syn match fortranFloatIll display "\<\d\+[deq][-+]\=\d\+\%(_\a\w*\)\=\>"
+syn match fortranFloatIll display "\<\d\+[deq][-+]\?\d\+\%(_\a\w*\)\?\>"
" floating point number, starting with a decimal point
-syn match fortranFloatIll display "\.\d\+\%([deq][-+]\=\d\+\)\=\%(_\a\w*\)\=\>"
+syn match fortranFloatIll display "\.\d\+\%([deq][-+]\?\d\+\)\?\%(_\a\w*\)\?\>"
" floating point number, no digits after decimal
-syn match fortranFloatIll display "\<\d\+\.\%([deq][-+]\=\d\+\)\=\%(_\a\w*\)\=\>"
+syn match fortranFloatIll display "\<\d\+\.\%([deq][-+]\?\d\+\)\?\%(_\a\w*\)\?\>"
" floating point number, D or Q exponents
-syn match fortranFloatIll display "\<\d\+\.\d\+\%([dq][-+]\=\d\+\)\=\%(_\a\w*\)\=\>"
+syn match fortranFloatIll display "\<\d\+\.\d\+\%([dq][-+]\?\d\+\)\?\%(_\a\w*\)\?\>"
" floating point number
-syn match fortranFloat display "\<\d\+\.\d\+\%(e[-+]\=\d\+\)\=\%(_\a\w*\)\=\>"
+syn match fortranFloat display "\<\d\+\.\d\+\%(e[-+]\?\d\+\)\?\%(_\a\w*\)\?\>"
" binary number
syn match fortranBinary display "b["'][01]\+["']"
" octal number
@@ -189,52 +201,59 @@ syn match fortranOctal display "o["'][0-7]\+["']"
syn match fortranHex display "z["'][0-9A-F]\+["']"
" Numbers in formats
syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
-syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\%(e\d+\>\)\="
-syn match fortranFormatSpec display "\d*\%(d\|q\|g\)\d\+\.\d\+\%(e\d+\)\="
+syn match fortranFormatSpec display "\d*e[sn]\?\d\+\.\d\+\%(e\d+\>\)\?"
+syn match fortranFormatSpec display "\d*\%(d\|q\|g\)\d\+\.\d\+\%(e\d+\)\?"
syn match fortranFormatSpec display "\d\+x\>"
" The next match cannot be used because it would pick up identifiers as well
" syn match fortranFormatSpec display "\<\%(a\|i\)\d\+"
" Numbers as labels
-syn match fortranLabelNumber display "^\zs\d\{1,5}\ze\s"
-syn match fortranLabelNumber display "^ \zs\d\{1,4}\ze\s"
-syn match fortranLabelNumber display "^ \zs\d\{1,3}\ze\s"
-syn match fortranLabelNumber display "^ \zs\d\d\=\ze\s"
-syn match fortranLabelNumber display "^ \zs\d\ze\s"
+if (b:fortran_fixed_source == 1)
+ syn match fortranLabelNumber display "^\zs\d\{1,5}\ze\s"
+ syn match fortranLabelNumber display "^ \zs\d\{1,4}\ze\s"
+ syn match fortranLabelNumber display "^ \zs\d\{1,3}\ze\s"
+ syn match fortranLabelNumber display "^ \zs\d\d\?\ze\s"
+ syn match fortranLabelNumber display "^ \zs\d\ze\s"
+else
+ syn match fortranLabelNumber display "^\s*\zs\d\{1,5}\ze\s*\a"
+ syn match fortranLabelNumberOb display "^\s*\zs\d\{1,5}\ze *end\s*\%(do\|if\)\>\ze"
+endif
" Numbers as targets
-syn match fortranTarget display "\%(\<if\s*(.\+)\s*\)\@<=\%(\d\+\s*,\s*\)\{2}\d\+\>"
-syn match fortranTarget display "\%(\<do\s\+\)\@11<=\d\+\>"
-syn match fortranTarget display "\%(\<go\s*to\s*(\=\)\@11<=\%(\d\+\s*,\s*\)*\d\+\>"
+syn match fortranTarget display "\%(\<if\s*(.\+)\s*\)\@<=\%(\d\+\s*,\s*\)\{2}\d\+\>"
+syn match fortranTargetOb display "\%(\<do\s*,\?\s*\)\@11<=\d\+\>"
+syn match fortranTarget display "\%(\<go\s*to\s*(\?\)\@11<=\%(\d\+\s*,\s*\)*\d\+\>"
syn match fortranBoolean "\.\s*\%(true\|false\)\s*\."
-syn keyword fortranKeyword call
-syn keyword fortranKeyword use only contains
+syn keyword fortranKeyword call use only continue allocate deallocate nullify return cycle exit contains
syn match fortranKeyword "\<fail\s\+image\>"
-syn match fortranKeyword "\<\%(error\s\+\)\=stop\>"
-syn keyword fortranKeyword continue
+syn match fortranKeyword "\<\%(error\s\+\)\?stop\>"
syn match fortranKeyword "\<go\s*to\>"
syn match fortranKeywordDel "\<go\s*to\ze\s\+.*,\s*(.*$"
syn match fortranKeywordOb "\<go\s*to\ze\s*(\d\+.*$"
-syn keyword fortranKeywordDel assign pause
-syn keyword fortranKeyword allocate deallocate nullify return cycle exit
+syn keyword fortranKeywordDel pause
+syn match fortranKeywordDel "assign\s*\d\+\s*to\s\+\a\w*"
+syn match fortranStringDel display "[/(,] *\d\+H"
syn region fortranString start=+'+ end=+'+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
-syn match fortranIO '\%(\%((\|,\|, *&\n\)\s*\)\@<=\%(access\|blank\|direct\|exist\|file\|fmt\|form\|formatted\|iostat\|name\|named\|nextrec\|number\|opened\|rec\|recl\|sequential\|status\|unformatted\|unit\)\ze\s*='
+syn match fortranSpecifier '\%(\%((\|,\|, *&\n\)\s*\)\@<=\%(access\|acquired_lock\|action\|advance\|asynchronous\|blank\|decimal\|delim\|direct\|encoding\|end\|eor\|err\)\ze\s*='
+syn match fortranSpecifier '\%(\%((\|,\|, *&\n\)\s*\)\@<=\%(errmsg\|exist\|file\|fmt\|form\|formatted\|id\|iolength\|iomsg\|iostat\|leading_zero\|mold\|name\|named\)\ze\s*='
+syn match fortranSpecifier '\%(\%((\|,\|, *&\n\)\s*\)\@<=\%(new_index\|newunit\|nextrec\|nml\|notify\|number\|opened\|pad\|pending\|pos\|position\|quiet\)\ze\s*='
+syn match fortranSpecifier '\%(\%((\|,\|, *&\n\)\s*\)\@<=\%(read\|readwrite\|rec\|recl\|round\|sequential\|sign\|size\)\ze\s*='
+syn match fortranSpecifier '\%(\%((\|,\|, *&\n\)\s*\)\@<=\%(source\|stat\|status\|stream\|team\|team_number\|unformatted\|unit\|until_count\|write\)\ze\s*='
+syn match fortranSpecifier "\%((\s*\)\@<=\%(un\)\?formatted\ze\s*)"
+syn match fortranSpecifier "\%(local\|local_init\|reduce\|shared\)\ze\s*("
+syn match fortranSpecifier "\<default\s*(\s*none\s*)"
syn keyword fortranIOR format namelist
-syn keyword fortranIO pad position action delim readwrite
-syn keyword fortranIO eor advance nml
-syn keyword fortranIO newunit decimal round iomsg
-syn match fortranIO contains=fortranOperator "\<e\%(nd\|rr\)\s*=\s*\d\+"
syn keyword fortranConditional else then where elsewhere
-syn match fortranConditional "\<if\>"
-syn match fortranConditional "\<else\s*if\>"
+syn match fortranConditional "\<\%(else\s*\)\?if\>"
syn match fortranConditional "\<\%(end\s*\)\?\%(if\|where\|select\)\>"
-syn match fortranConditional "\<select\s\+\%(case\|rank\|type\)\>"
+syn match fortranConditional "\<select\s*\%(case\|rank\|type\)\>"
+syn match fortranConditional "\<\%(case\|rank\|class\)\s\+default\>"
+syn match fortranConditional "^\s*\zs\%(case\|rank\)\ze\s\+("
syn match fortranConditional "\<\%(class\|type\)\s\+is\>"
-syn match fortranConditional "\<\%(case\|rank\)\%(\s\+default\)\?\>"
syn match fortranConditionalDel "\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
syn keyword fortranInclude include
@@ -248,22 +267,26 @@ syn match fortranImageControl "\<notify\s\+wait\ze\s*("
syn keyword fortranUnitHeaderOb entry
syn match fortranUnitHeaderOb display "\<block\s*data\>"
-syn keyword fortranStorageClass in out
-syn match fortranStorageClass "\<in\s*out\>"
-syn match fortranStorageClass "\<kind\s*="me=s+4
-syn match fortranStorageClass "\<len\s*="me=s+3
-syn match fortranStorageClass "^\s*\zsdata\>\%(\s\+\a\w*\s*/\)\@="
-syn match fortranStorageClassOb "^\s*\zscommon\>"
-syn match fortranStorageClassOb "^\s*\zscommon\>\%(\s*/\)\@="
-syn keyword fortranStorageClassOb equivalence
-
-syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
-syn keyword fortranConstant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr
-syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit stat_failed_image stat_unlocked_failed_image
-syn keyword fortranConstant int8 int16 int32 int64 real16 real32 real64 real128 character_kinds integer_kinds logical_kinds real_kinds iostat_inquire_internal_unit
-syn keyword fortranConstant ieee_negative_subnormal ieee_positive_subnormal
-
-" CUDA fortran
+syn keyword fortranStorageClass in out inout
+syn match fortranStorageClass '\<\%(kind\|len\)\>\ze\s*='
+syn match fortranStorageClass "^\s*data\>\ze\%(\s\+\a\)\@="
+syn match fortranStorageClassOb "\<common\>\%(\s*\%(/\|\a\)\)\@="
+syn match fortranStorageClassOb "\<equivalence\>\%(\s*(\)\@="
+
+syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab c_ptrdiff_t
+syn keyword fortranConstant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr
+syn keyword fortranConstant character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit stat_failed_image stat_locked stat_locked_other_image stat_stopped_image stat_unlocked stat_unlocked_failed_image
+syn keyword fortranConstant int8 int16 int32 int64 real16 real32 real64 real128 character_kinds integer_kinds logical_kinds real_kinds iostat_inquire_internal_unit initial_team current_team parent_team
+syn keyword fortranConstant ieee_invalid ieee_overflow ieee_divide_by_zero ieee_underflow ieee_inexact ieee_usual ieee_all
+syn keyword fortranConstant ieee_signaling_nan ieee_quiet_nan ieee_negative_inf ieee_negative_normal ieee_negative_subnormal
+syn keyword fortranConstant ieee_negative_zero ieee_positive_zero ieee_positive_subnormal ieee_positive_normal ieee_positive_inf
+syn keyword fortranConstant ieee_other_value ieee_negative_denormal ieee_positive_denormal ieee_negative_subnormal
+syn keyword fortranConstant ieee_positive_subnormal ieee_nearest ieee_to_zero ieee_up ieee_down ieee_away ieee_other ieee_datatype
+syn keyword fortranConstant ieee_denormal ieee_divide ieee_halting ieee_inexact_flag ieee_inf ieee_invalid_flag ieee_nan
+syn keyword fortranConstant ieee_rounding ieee_sqrt ieee_subnormal ieee_underflow_flag
+syn match fortranConstant "\.\s*nil\s*\."
+
+" CUDA Fortran
if exists("fortran_CUDA")
syn match fortranTypeCUDA "\<attributes\>"
syn keyword fortranTypeCUDA host global device
@@ -324,7 +347,7 @@ else
endif
syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
-syn match fortranOpenMP excludenl "^\s*\zs!\$\%(OMP\)\=&\=\s.*$"
+syn match fortranOpenMP excludenl "^\s*\zs!\$\%(OMP\)\?&\?\s.*$"
syn match fortranEndStatement display ";"
"cpp is often used with Fortran
@@ -333,7 +356,6 @@ syn match cPreProc "^\s*#\s*\%(elif\|if\)\>.*"
syn match cPreProc "^\s*#\s*\%(ifndef\|undef\)\>.*"
syn match cPreCondit "^\s*#\s*\%(else\|endif\)\>.*"
syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
-"syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+
syn match cIncluded contained "<[^>]*>"
syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
@@ -352,43 +374,43 @@ if exists("fortran_fold")
setlocal foldmethod=syntax
endif
if (b:fortran_fixed_source == 1)
- syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%(program\%(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
- syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\%(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%(submodule\%(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranModule transparent fold keepend start="^\s*module\s\+\%(procedure\)\@!\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%(module\%(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
- syn region fortranFunction transparent fold keepend extend start="^\s*\%(elemental \|pure \|impure \|module \|recursive \)\=\s*\%(\%(\%(real \|integer \|logical \|complex \|double \s*precision \)\s*\%((\%(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \%((\%(\s*len\s*=\)\=\s*\d\+\s*)\|(\%(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%($\|function\%(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranSubroutine transparent fold keepend extend start="^\s*\%(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%($\|subroutine\%(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranBlockData transparent fold keepend start="\<block\>" skip="^\s*[!#].*$" excludenl end="\<end\s*block\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
- syn region fortranCritical transparent fold keepend start="^\s*\<critical\s\+" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*critical" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
- syn region fortranTeam transparent fold keepend start="^\s*\<change\s\+team\>" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*team\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
- syn region fortranInterface transparent fold keepend extend start="^\s*\%(abstract \)\=\s*interface\>" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\%(,\s*\%(public\|private\|abstract\)\)\=\s*::" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
+ syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%(program\%(\s\+\z1\>\)\?\|$\)" contains=ALLBUT,fortranModule
+ syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\%(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%(submodule\%(\s\+\z1\>\)\?\|$\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranModule transparent fold keepend start="^\s*module\s\+\%(procedure\)\@9!\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%(module\%(\s\+\z1\>\)\?\|$\)" contains=ALLBUT,fortranProgram
+ syn region fortranFunction transparent fold keepend extend start="\<function\s\+\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%($\|function\%(\s\+\z1\>\)\?\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranSubroutine transparent fold keepend extend start="\<subroutine\s\+\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*\%($\|subroutine\%(\s\+\z1\>\)\?\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranBlockData transparent fold keepend start="\<block\>" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*block\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranAssociate transparent fold keepend start="\<associate\s\+" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
+ syn region fortranCritical transparent fold keepend start="\<critical\s\+" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*critical" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
+ syn region fortranTeam transparent fold keepend start="\<change\s\+team\>" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*team\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
+ syn region fortranInterface transparent fold keepend extend start="\<\%(abstract \)\?\s*interface\>" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\%(,\s*\%(abstract\|private\|public\|bind(c)\|extends(\a\w*)\)\)\{0,4}\s*::\s*\z(\a\w*\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>\%(\s\+\z1\>\)\?" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
syn region fortranMultiComments fold start="^\zs[!c*].*\_s*[!c*]" skip="^[!c*]" end='^\ze\s*[^!c*]'
else
- syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%(program\%(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
- syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\%(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%(submodule\%(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranModule transparent fold keepend start="^\s*module\s\+\%(procedure\)\@!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%(module\%(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
- syn region fortranFunction transparent fold keepend extend start="^\s*\%(elemental \|pure \|impure \|module \|recursive \)\=\s*\%(\%(\%(real \|integer \|logical \|complex \|double \s*precision \)\s*\%((\%(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \%((\%(\s*len\s*=\)\=\s*\d\+\s*)\|(\%(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%($\|function\%(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranSubroutine transparent fold keepend extend start="^\s*\%(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%($\|subroutine\%(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%(program\%(\s\+\z1\>\)\?\|$\)" contains=ALLBUT,fortranModule
+ syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\%(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%(submodule\%(\s\+\z1\>\)\?\|$\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranModule transparent fold keepend start="^\s*module\s\+\%(procedure\)\@9!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%(module\%(\s\+\z1\>\)\?\|$\)" contains=ALLBUT,fortranProgram
+ syn region fortranFunction transparent fold keepend extend start="\<function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%($\|function\%(\s\+\z1\>\)\?\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranSubroutine transparent fold keepend extend start="\<subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\%($\|subroutine\%(\s\+\z1\>\)\?\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranBlockData transparent fold keepend start="\<block\>" skip="^\s*[!#].*$" excludenl end="\<end\s*block\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
syn region fortranAssociate transparent fold keepend start="\<associate\>" skip="^\s*[!#].*$" excludenl end="\<end\s*associate\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
syn region fortranCritical transparent fold keepend start="\<critical\>" skip="^\s*[!#].*$" excludenl end="\<end\s*critical\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
syn region fortranTeam transparent fold keepend start="\<change\s\+team\>" skip="^\s*[!#].*$" excludenl end="\<end\s*team\>" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
- syn region fortranInterface transparent fold keepend extend start="^\s*\%(abstract \)\=\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\%(,\s*\%(public\|private\|abstract\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
+ syn region fortranInterface transparent fold keepend extend start="\<\%(abstract \)\?\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\%(,\s*\%(abstract\|private\|public\|bind(c)\|extends(\a\w*)\)\)\{0,4}\s*::\s*\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>\%(\s\+\z1\>\)\?" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
syn region fortranMultiComments fold start="^\zs\s*!.*\_s*!" skip="^\s*!" end='^\ze\s*[^!]'
endif
if exists("fortran_fold_conditionals")
if (b:fortran_fixed_source == 1)
syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
- syn region fortran90Loop transparent fold keepend extend start="\%(\<end\s\+\)\@<!\<do\%(\s\+\a\|\s*$\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
- syn region fortranIfBlock transparent fold keepend extend start="\%(\<e\%(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\%([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ syn region fortran90Loop transparent fold keepend extend start="\%(\<end\s\+\)\@5<!\<do\%(\s\+\a\|\s*$\)" skip="^\%([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ syn region fortranIfBlock transparent fold keepend extend start="\%(\<e\%(nd\|lse\)\s\+\)\@6<!\<if\s*(.\+)\s*then\>" skip="^\%([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranCase transparent fold keepend extend start="\<select\s*\%(case\|type\|rank\)\>" skip="^\%([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
else
syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
- syn region fortran90Loop transparent fold keepend extend start="\%(\<end\s\+\)\@<!\<do\%(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
- syn region fortranIfBlock transparent fold keepend extend start="\%(\<e\%(nd\|lse\)\s\+\)\@<!\<if\s*(\%(.\|&\s*\n\)\+)\%(\s\|&\s*\n\)*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ syn region fortran90Loop transparent fold keepend extend start="\%(\<end\s\+\)\@5<!\<do\%(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ syn region fortranIfBlock transparent fold keepend extend start="\%(\<e\%(nd\|lse\)\s\+\)\@6<!\<if\s*(\%(.\|&\s*\n\)\+)\%(\s\|&\s*\n\)*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranCase transparent fold keepend extend start="\<select\s*\%(case\|type\|rank\)\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranAttribute,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
endif
endif
@@ -396,92 +418,70 @@ if exists("fortran_fold")
endif
" Define the default highlighting.
-hi def link fortranKeyword Keyword
-hi def link fortranConstructName Identifier
-hi def link fortranConditional Conditional
-hi def link fortranRepeat Repeat
-hi def link fortranTodo Todo
-hi def link fortranContinueMark Special
-hi def link fortranEndStatement Special
-hi def link fortranString String
-hi def link fortranNumber Number
-hi def link fortranBinary Number
-hi def link fortranOctal Number
-hi def link fortranHex Number
-hi def link fortranOperator Operator
hi def link fortranBoolean Boolean
+hi def link fortranComment Comment
+hi def link fortranMultiComments Comment
+hi def link fortranBlock Conditional
+hi def link fortranConditional Conditional
+hi def link fortranConstant Constant
+hi def link fortranConditionalDel Error
+hi def link fortranKeywordDel Error
hi def link fortranLabelError Error
-hi def link fortranObsolescent Todo
-hi def link fortranType Type
-hi def link fortranAttribute Type
-hi def link fortranBlock fortranConditional
-hi def link fortranImageControl Keyword
-hi def link fortranStorageClass StorageClass
-hi def link fortranIntrinsic Function
+hi def link fortranParenError Error
+hi def link fortranStringDel Error
+hi def link fortranTab Error
+hi def link fortranFloat Float
+hi def link fortranFloatIll Float
hi def link fortranCalled Function
+hi def link fortranIntrinsic Function
+hi def link fortranIntrinsicCUDA Function
+hi def link fortranIntrinsicR Function
+hi def link fortranIntrinsicVen Function
hi def link fortranUnitName Function
-hi def link fortranUnitHeader fortranPreCondit
-hi def link fortranReadWrite Keyword
-hi def link fortranIO Keyword
-hi def link fortranConstant Constant
-
+hi def link fortranConstructName Identifier
+hi def link fortranFormatSpec Identifier
+hi def link cInclude Include
hi def link fortranInclude Include
+hi def link fortranIOR Keyword
+hi def link fortranImageControl Keyword
+hi def link fortranKeyword Keyword
+hi def link fortranReadWrite Keyword
+hi def link fortranSpecifier Keyword
+hi def link fortranBinary Number
+hi def link fortranHex Number
+hi def link fortranNumber Number
+hi def link fortranBinary Number
+hi def link fortranOctal Number
+hi def link fortranOperator Operator
+hi def link fortranOperatorR Operator
+hi def link cPreCondit PreCondit
+hi def link fortranUnitHeader PreCondit
+hi def link fortranOpenMP PreProc
+hi def link cPreProc PreProc
+hi def link fortranRepeat Repeat
+hi def link fortranRepeatR Repeat
+hi def link fortranContinueMark Special
+hi def link fortranEndStatement Special
hi def link fortranLabelNumber Special
hi def link fortranTarget Special
-hi def link fortranFloatIll fortranFloat
-
-" Redundant features which may one day become obsolescent
-hi def link fortranIntrinsicR fortranIntrinsic
-hi def link fortranTypeR fortranType
-hi def link fortranStorageClassR fortranStorageClass
-hi def link fortranOperatorR fortranOperator
-hi def link fortranIOR fortranIO
-hi def link fortranRepeatR fortranRepeat
-
-" features deleted or declared obsolescent in Fortran 2023
-if (b:fortran_fixed_source == 1)
- hi def link fortranUnitHeaderOb fortranUnitHeader
- hi def link fortranKeywordOb fortranKeyword
- hi def link fortranKeywordDel fortranKeyword
- hi def link fortranConditionalDel fortranConditional
- hi def link fortranTypeOb fortranType
- hi def link fortranStorageClassOb fortranStorageClass
- hi def link fortranRepeatOb fortranRepeat
- hi def link fortranIntrinsicOb fortranIntrinsic
-else
- hi def link fortranUnitHeaderOb fortranObsolescent
- hi def link fortranKeywordOb fortranObsolescent
- hi def link fortranKeywordDel fortranObsolescent
- hi def link fortranConditionalDel fortranObsolescent
- hi def link fortranTypeOb fortranObsolescent
- hi def link fortranStorageClassOb fortranObsolescent
- hi def link fortranRepeatOb fortranObsolescent
- hi def link fortranIntrinsicOb fortranObsolescent
-endif
-
-hi def link fortranFormatSpec Identifier
-hi def link fortranFloat Float
-hi def link fortranPreCondit PreCondit
-hi def link cIncluded fortranString
-hi def link cInclude Include
-hi def link cPreProc PreProc
-hi def link cPreCondit PreCondit
-hi def link fortranOpenMP PreProc
-hi def link fortranParenError Error
-hi def link fortranComment Comment
-hi def link fortranMultiComments Comment
-hi def link fortranSerialNumber Todo
-hi def link fortranTab Error
-
-if exists("fortran_CUDA")
- hi def link fortranIntrinsicCUDA fortranIntrinsic
- hi def link fortranTypeCUDA fortranType
- hi def link fortranStringCUDA fortranString
-endif
-
-if exists("fortran_vendor_intrinsics")
- hi def link fortranExtraIntrinsic Function
-endif
+hi def link fortranStorageClass StorageClass
+hi def link cIncluded String
+hi def link fortranString String
+hi def link fortranStringCUDA String
+hi def link fortranIntrinsicOb Todo
+hi def link fortranKeywordOb Todo
+hi def link fortranLabelNumberOb Todo
+hi def link fortranRepeatOb Todo
+hi def link fortranSerialNumber Todo
+hi def link fortranStorageClassOb Todo
+hi def link fortranTargetOb Todo
+hi def link fortranTodo Todo
+hi def link fortranTypeOb Todo
+hi def link fortranUnitHeaderOb Todo
+hi def link fortranAttribute Type
+hi def link fortranType Type
+hi def link fortranTypeCUDA Type
+hi def link fortranTypeR Type
let b:current_syntax = "fortran"
diff --git a/runtime/syntax/generator/Makefile b/runtime/syntax/generator/Makefile
new file mode 100644
index 0000000..3cf4b95
--- /dev/null
+++ b/runtime/syntax/generator/Makefile
@@ -0,0 +1,43 @@
+VIM_SRCDIR = ../../../src
+RUN_VIM = $(VIM_SRCDIR)/vim -N -u NONE -i NONE -n
+REVISION ?= $(shell date +%Y-%m-%dT%H:%M:%S%:z)
+
+SRC = $(VIM_SRCDIR)/eval.c $(VIM_SRCDIR)/ex_cmds.h $(VIM_SRCDIR)/ex_docmd.c \
+ $(VIM_SRCDIR)/fileio.c $(VIM_SRCDIR)/option.c $(VIM_SRCDIR)/syntax.c
+
+export VIM_SRCDIR
+
+.PHONY: generate clean
+all: generate
+
+generate: vim.vim
+
+vim.vim: vim.vim.rc update_date.vim
+ @echo "Generating vim.vim ..."
+ @cp -f vim.vim.rc ../vim.vim
+ @$(RUN_VIM) -S update_date.vim
+ @echo "done."
+
+vim.vim.rc: gen_syntax_vim.vim vim.vim.base $(SRC)
+ @echo "Generating vim.vim.rc ..."
+ @rm -f sanity_check.err generator.err
+ @$(RUN_VIM) -S gen_syntax_vim.vim
+ @if test -f sanity_check.err ; then \
+ echo ; \
+ echo "Sanity errors:" ; \
+ cat sanity_check.err ; \
+ exit 1 ; \
+ fi
+ @if test -f generator.err ; then \
+ echo ; \
+ echo "Generator errors:" ; \
+ cat generator.err ; \
+ echo ; \
+ exit 1 ; \
+ fi
+ @echo "done."
+
+clean:
+ rm -f vim.vim.rc
+ rm -f vim.vim
+ rm -f sanity_check.err generator.err
diff --git a/runtime/syntax/generator/README.md b/runtime/syntax/generator/README.md
new file mode 100644
index 0000000..83aceda
--- /dev/null
+++ b/runtime/syntax/generator/README.md
@@ -0,0 +1,26 @@
+# Generator of Vim Script Syntax File
+
+This directory contains a Vim Script generator, that will parse the Vim source file and
+generate a vim.vim syntax file.
+
+Files in this directory where copied from https://github.com/vim-jp/syntax-vim-ex/
+and included here on Feb, 13th, 2024 for the Vim Project.
+
+- Maintainer: Hirohito Higashi
+- License: Vim License
+
+## How to generate
+
+ $ make
+
+This will generate `../vim.vim`
+
+## Files
+
+Name |Description
+---------------------|------------------------------------------------------
+`Makefile` |Makefile to generate ../vim.vim
+`README.md` |This file
+`gen_syntax_vim.vim` |Script to generate vim.vim
+`update_date.vim` |Script to update "Last Change:"
+`vim.vim.base` |Template for vim.vim
diff --git a/runtime/syntax/generator/gen_syntax_vim.vim b/runtime/syntax/generator/gen_syntax_vim.vim
new file mode 100644
index 0000000..b4feeed
--- /dev/null
+++ b/runtime/syntax/generator/gen_syntax_vim.vim
@@ -0,0 +1,704 @@
+" Vim syntax file generator
+" Language: Vim script
+" Maintainer: Hirohito Higashi (h_east)
+" URL: https://github.com/vim-jp/syntax-vim-ex
+" Last Change: 2024 Mar 14
+" Version: 2.0.6
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+language C
+
+function! s:parse_vim_option(opt, missing_opt, term_out_code)
+ try
+ let file_name = $VIM_SRCDIR . '/optiondefs.h'
+ let item = {}
+
+ new
+ exec 'read ' . file_name
+ norm! gg
+ exec '/^.*\s*options\[\]\s*=\s*$/+1;/^\s*#\s*define\s*p_term(/-1yank a'
+ exec '/^#define\s\+p_term(/+1;/^};$/-1yank b'
+ %delete _
+
+ put a
+ " workaround for 'shortname'
+ g/^#\s*ifdef\s*SHORT_FNAME\>/j
+ g/^#/d
+ g/^\s*{\s*"\w\+"\%(\s*,\s*[^,]*\)\{2}[^,]$/j
+ g/^\s*{\s*"\w\+"\s*,.*$/j
+ g!/^\s*{\s*"\w\+"\s*,.*$/d
+
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*{\s*"\(\w\+\)"\s*,\s*\%("\(\w\+\)"\|NULL\)\s*,\s*\%([^,]*\(P_BOOL\)[^,]*\|[^,]*\)\s*,\s*\([^,]*NULL\)\?.*')
+ let item.name = list[1]
+ let item.short_name = list[2]
+ let item.is_bool = empty(list[3]) ? 0 : 1
+ if empty(list[4])
+ call add(a:opt, copy(item))
+ else
+ call add(a:missing_opt, copy(item))
+ endif
+ endfor
+ if empty(a:opt)
+ throw 'opt is empty'
+ endif
+ if empty(a:missing_opt)
+ throw 'missing_opt is empty'
+ endif
+
+ %delete _
+ put b
+ g!/^\s*p_term(\s*"\w\+"\s*,.*$/d
+
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*p_term(\s*"\(\w\+\)"\s*,')
+ let item.name = list[1]
+ call add(a:term_out_code, copy(item))
+ endfor
+ quit!
+ if empty(a:term_out_code)
+ throw 'term_out_code is empty'
+ endif
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+function! s:append_syn_vimopt(lnum, str_info, opt_list, prefix, bool_only)
+ let ret_lnum = a:lnum
+ let str = a:str_info.start
+
+ for o in a:opt_list
+ if !a:bool_only || o.is_bool
+ if !empty(o.short_name)
+ let str .= ' ' . a:prefix . o.short_name
+ endif
+ let str .= ' ' . a:prefix . o.name
+ if len(str) > s:line_break_len
+ if !empty(a:str_info.end)
+ let str .= ' ' . a:str_info.end
+ endif
+ call append(ret_lnum, str)
+ let str = a:str_info.start
+ let ret_lnum += 1
+ endif
+ endif
+ endfor
+ if str !=# a:str_info.start
+ if !empty(a:str_info.end)
+ let str .= ' ' . a:str_info.end
+ endif
+ call append(ret_lnum, str)
+ let ret_lnum += 1
+ endif
+ return ret_lnum
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:parse_vim_command(cmd)
+ try
+ let file_name = $VIM_SRCDIR . '/ex_cmds.h'
+ let item = {}
+
+ new
+ exec 'read ' . file_name
+ norm! gg
+ exec '/^}\?\s*cmdnames\[\]\s*=\s*$/+1;/^};/-1yank'
+ %delete _
+ put
+ g!/^EXCMD(/d
+
+ let lcmd = {}
+ for key in range(char2nr('a'), char2nr('z'))
+ let lcmd[nr2char(key)] = []
+ endfor
+ let lcmd['~'] = []
+
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^EXCMD(\w\+\s*,\s*"\(\a\w*\)"\s*,')
+ if !empty(list)
+ " Small ascii character or other.
+ let key = (list[1][:0] =~# '\l') ? list[1][:0] : '~'
+ call add(lcmd[key], list[1])
+ endif
+ endfor
+ quit!
+
+ for key in sort(keys(lcmd))
+ for my in range(len(lcmd[key]))
+ let omit_idx = 0
+ if my > 0
+ let omit_idx = (key =~# '\l') ? 1 : 0
+ for idx in range(1, strlen(lcmd[key][my]))
+ let spec=0
+ if lcmd[key][my] ==# 'ex'
+ let spec=1
+ echo "cmd name:" lcmd[key][my]
+ endif
+ let matched = 0
+ for pre in range(my - 1, 0, -1)
+ if spec
+ echo "pre:" pre ", my:" my
+ endif
+ if pre == my
+ if spec
+ echo "continue"
+ endif
+ continue
+ endif
+ " for weird abbreviations for delete. (See :help :d)
+ " And k{char} is used as mark. (See :help :k)
+ if lcmd[key][my][:idx] ==# lcmd[key][pre][:idx] ||
+ \ (key ==# 'd' &&
+ \ lcmd[key][my][:idx] =~# '^d\%[elete][lp]$')
+ \ || (key ==# 'k' &&
+ \ lcmd[key][my][:idx] =~# '^k[a-zA-Z]$')
+ let matched = 1
+ let omit_idx = idx + 1
+ if spec
+ echo "match. break. omit_idx:" omit_idx
+ endif
+ break
+ endif
+ endfor
+ if !matched
+ if spec
+ echo "not match. break"
+ endif
+ break
+ endif
+ endfor
+ endif
+
+ let item.name = lcmd[key][my]
+ let item.type = s:get_vim_command_type(item.name)
+ if omit_idx + 1 < strlen(item.name)
+ let item.omit_idx = omit_idx
+ let item.syn_str = item.name[:omit_idx] . '[' .
+ \ item.name[omit_idx+1:] . ']'
+ else
+ let item.omit_idx = -1
+ let item.syn_str = item.name
+ endif
+ call add(a:cmd, copy(item))
+ endfor
+ endfor
+
+ " Check exists in the help. (Usually it does not check...)
+ let doc_dir = './vim/runtime/doc'
+ if 0
+ for vimcmd in a:cmd
+ let find_ptn = '^|:' . vimcmd.name . '|\s\+'
+ exec "silent! vimgrep /" . find_ptn . "/gj " . doc_dir . "/index.txt"
+ let li = getqflist()
+ if empty(li)
+ call s:err_sanity(printf('Ex-cmd `:%s` is not found in doc/index.txt.', vimcmd.name))
+ elseif len(li) > 1
+ call s:err_sanity(printf('Ex-cmd `:%s` is duplicated in doc/index.txt.', vimcmd.name))
+ else
+ let doc_syn_str = substitute(li[0].text, find_ptn . '\(\S\+\)\s\+.*', '\1', '')
+ if doc_syn_str ==# vimcmd.syn_str
+ call s:err_sanity(printf('Ex-cmd `%s` short name differ in doc/index.txt. code: `%s`, document: `%s`', vimcmd.name, vimcmd.syn_str, doc_syn_str))
+ endif
+ endif
+
+ if 1
+ for i in range(2)
+ if i || vimcmd.omit_idx >= 0
+ if !i
+ let base_ptn = vimcmd.name[:vimcmd.omit_idx]
+ else
+ let base_ptn = vimcmd.name
+ endif
+ let find_ptn = '\*:' . base_ptn . '\*'
+ exec "silent! vimgrep /" . find_ptn . "/gj " . doc_dir . "/*.txt"
+ let li = getqflist()
+ if empty(li)
+ call s:err_sanity(printf('Ex-cmd `:%s`%s is not found in the help tag.', base_ptn, !i ? ' (short name of `:' . vimcmd.name . '`)' : ''))
+ elseif len(li) > 1
+ call s:err_sanity(printf('Ex-cmd `:%s`%s is duplicated in the help tag.', base_ptn, !i ? ' (short name of `:' . vimcmd.name . '`)' : ''))
+ endif
+ endif
+ endfor
+ endif
+ endfor
+ endif
+
+ " Add weird abbreviations for delete. (See :help :d)
+ for i in ['l', 'p']
+ let str = 'delete'
+ let item.name = str . i
+ let item.type = s:get_vim_command_type(item.name)
+ let item.omit_idx = -1
+ for x in range(strlen(str))
+ let item.syn_str = str[:x] . i
+ if item.syn_str !=# "del"
+ call add(a:cmd, copy(item))
+ endif
+ endfor
+ endfor
+
+ " Required for original behavior
+ let item.name = 'a' " append
+ let item.type = 0
+ let item.omit_idx = -1
+ let item.syn_str = item.name
+ call add(a:cmd, copy(item))
+ let item.name = 'i' " insert
+ let item.syn_str = item.name
+ call add(a:cmd, copy(item))
+
+ if empty(a:cmd)
+ throw 'cmd is empty'
+ endif
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+function! s:get_vim_command_type(cmd_name)
+ " Return value:
+ " 0: normal
+ " 1: (Reserved)
+ " 2: abbrev (without un)
+ " 3: menu
+ " 4: map
+ " 5: mapclear
+ " 6: unmap
+ " 99: (Exclude registration of "syn keyword")
+ let menu_prefix = '^\%([acinostvx]\?\|tl\)'
+ let map_prefix = '^[acilnostvx]\?'
+ let exclude_list = [
+ \ 'map', 'mapclear',
+ \ 'substitute', 'smagic', 'snomagic',
+ \ 'setlocal', 'setglobal', 'set', 'var',
+ \ 'autocmd', 'augroup', 'doautocmd', 'doautoall',
+ \ 'echo', 'echoconsole', 'echoerr', 'echohl', 'echomsg', 'echon', 'echowindow',
+ \ 'execute',
+ \ 'function', 'endfunction', 'def', 'enddef',
+ \ 'behave', 'augroup', 'normal', 'syntax',
+ \ 'append', 'insert',
+ \ 'Next', 'Print', 'X',
+ \ 'new', 'popup',
+ \ ]
+ " Required for original behavior
+ " \ 'global', 'vglobal'
+
+ if index(exclude_list, a:cmd_name) != -1
+ let ret = 99
+ elseif a:cmd_name =~# '^\%(\%(un\)\?abbreviate\|noreabbrev\|\l\%(nore\|un\)\?abbrev\)$'
+ let ret = 2
+ elseif a:cmd_name =~# menu_prefix . '\%(nore\|un\)\?menu$'
+ let ret = 3
+ elseif a:cmd_name =~# map_prefix . '\%(nore\)\?map$'
+ let ret = 4
+ elseif a:cmd_name =~# map_prefix . 'mapclear$'
+ let ret = 5
+ elseif a:cmd_name =~# map_prefix . 'unmap$'
+ let ret = 6
+ else
+ let ret = 0
+ endif
+ return ret
+endfunc
+
+function! s:append_syn_vimcmd(lnum, str_info, cmd_list, type)
+ let ret_lnum = a:lnum
+ let str = a:str_info.start
+
+ for o in a:cmd_list
+ if o.type == a:type
+ let str .= ' ' . o.syn_str
+ if len(str) > s:line_break_len
+ if !empty(a:str_info.end)
+ let str .= ' ' . a:str_info.end
+ endif
+ call append(ret_lnum, str)
+ let str = a:str_info.start
+ let ret_lnum += 1
+ endif
+ endif
+ endfor
+ if str !=# a:str_info.start
+ if !empty(a:str_info.end)
+ let str .= ' ' . a:str_info.end
+ endif
+ call append(ret_lnum, str)
+ let ret_lnum += 1
+ endif
+ return ret_lnum
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:parse_vim_event(li)
+ try
+ let file_name = $VIM_SRCDIR . '/autocmd.c'
+ let item = {}
+
+ new
+ exec 'read ' . file_name
+ norm! gg
+ exec '/^}\s*event_names\[\]\s*=\s*$/+1;/^};/-1yank'
+ %delete _
+
+ put
+ g!/^\s*{\s*"\w\+"\s*,.*$/d
+
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*{\s*"\(\w\+\)"\s*,')
+ let item.name = list[1]
+ call add(a:li, copy(item))
+ endfor
+
+ quit!
+
+ if empty(a:li)
+ throw 'event is empty'
+ endif
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:parse_vim_function(li)
+ try
+ let file_name = $VIM_SRCDIR . '/evalfunc.c'
+ let item = {}
+
+ new
+ exec 'read ' . file_name
+ norm! gg
+ exec '/^static\s\+funcentry_T\s\+global_functions\[\]\s*=\s*$/+1;/^};/-1yank'
+ %delete _
+
+ put
+ g!/^\s*{\s*"\w\+"\s*,.*$/d
+ g/^\s*{\s*"test"\s*,.*$/d
+ g@//\s*obsolete@d
+ g@/\*\s*obsolete\s*\*/@d
+
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*{\s*"\(\w\+\)"\s*,')
+ let item.name = list[1]
+ call add(a:li, copy(item))
+ endfor
+
+ quit!
+
+ if empty(a:li)
+ throw 'function is empty'
+ endif
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:parse_vim_hlgroup(li)
+ try
+ let file_name = $VIM_SRCDIR . '/highlight.c'
+ let item = {}
+
+ new
+ exec 'read ' . file_name
+ call cursor(1, 1)
+ exec '/^static\s\+char\s\+\*(highlight_init_both\[\])\s*=\%(\s*{\)\?$/+1;/^\s*};/-1yank a'
+ exec '/^static\s\+char\s\+\*(highlight_init_light\[\])\s*=\%(\s*{\)\?$/+1;/^\s*};/-1yank b'
+ exec '/^set_normal_colors(\%(void\)\?)$/+1;/^}$/-1yank d'
+ %delete _
+ put a
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*\%(CENT(\)\?"\%(default\s\+link\s\+\)\?\(\a\+\).*",.*')
+ if !empty(list)
+ let item.name = list[1]
+ let item.type = 'both'
+ call add(a:li, copy(item))
+ endif
+ endfor
+
+ %delete _
+ put b
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*\%(CENT(\)\?"\%(default\s\+link\s\+\)\?\(\a\+\).*",.*')
+ if !empty(list)
+ let item.name = list[1]
+ let item.type = 'light'
+ call add(a:li, copy(item))
+ endif
+ endfor
+
+ %delete _
+ put d
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*if\s*(set_group_colors(.*"\(\a\+\)",')
+ if !empty(list) && list[1] !=# 'Normal'
+ let item.name = list[1]
+ let item.type = 'gui'
+ call add(a:li, copy(item))
+ endif
+ endfor
+
+ let item.name = 'CursorIM'
+ let item.type = 'gui'
+ call add(a:li, copy(item))
+
+ " The following highlight groups cannot be extracted from highlight.c
+ " (TODO: extract from HIGHLIGHT_INIT ?)
+ let item.name = 'LineNrAbove'
+ let item.type = 'both'
+ call add(a:li, copy(item))
+
+ let item.name = 'LineNrBelow'
+ let item.type = 'both'
+ call add(a:li, copy(item))
+
+ quit!
+
+ if empty(a:li)
+ throw 'hlgroup is empty'
+ endif
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:parse_vim_complete_name(li)
+ try
+ let file_name = $VIM_SRCDIR . '/usercmd.c'
+ let item = {}
+
+ new
+ exec 'read ' . file_name
+ norm! gg
+ exec '/^}\s*command_complete\[\]\s*=\s*$/+1;/^};/-1yank'
+ %delete _
+
+ put
+ g!/^\s*{.*"\w\+"\s*}\s*,.*$/d
+ g/"custom\(list\)\?"/d
+
+ for line in getline(1, line('$'))
+ let list = matchlist(line, '^\s*{.*"\(\w\+\)"\s*}\s*,')
+ let item.name = list[1]
+ call add(a:li, copy(item))
+ endfor
+
+ quit!
+
+ if empty(a:li)
+ throw 'complete_name is empty'
+ endif
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:append_syn_any(lnum, str_info, li)
+ let ret_lnum = a:lnum
+ let str = a:str_info.start
+
+ for o in a:li
+ let str .= ' ' . o.name
+ if len(str) > s:line_break_len
+ if !empty(a:str_info.end)
+ let str .= ' ' . a:str_info.end
+ endif
+ call append(ret_lnum, str)
+ let str = a:str_info.start
+ let ret_lnum += 1
+ endif
+ endfor
+ if str !=# a:str_info.start
+ if !empty(a:str_info.end)
+ let str .= ' ' . a:str_info.end
+ endif
+ call append(ret_lnum, str)
+ let ret_lnum += 1
+ endif
+ return ret_lnum
+endfunc
+
+function! s:update_syntax_vim_file(vim_info)
+ try
+ function! s:search_and_check(kword, base_fname, str_info)
+ let a:str_info.start = ''
+ let a:str_info.end = ''
+
+ let pattern = '^" GEN_SYN_VIM: ' . a:kword . '\s*,'
+ let lnum = search(pattern)
+ if lnum == 0
+ throw 'Search pattern ''' . pattern . ''' not found in ' .
+ \ a:base_fname
+ endif
+ let li = matchlist(getline(lnum), pattern . '\s*START_STR\s*=\s*''\(.\{-}\)''\s*,\s*END_STR\s*=\s*''\(.\{-}\)''')
+ if empty(li)
+ throw 'Bad str_info line:' . getline(lnum)
+ endif
+ let a:str_info.start = li[1]
+ let a:str_info.end = li[2]
+ return lnum
+ endfunc
+
+ let target_fname = 'vim.vim.rc'
+ let base_fname = 'vim.vim.base'
+ let str_info = {}
+ let str_info.start = ''
+ let str_info.end = ''
+
+ new
+ exec 'edit ' . target_fname
+ %d _
+ exec 'read ' . base_fname
+ 1delete _
+ call cursor(1, 1)
+
+ " vimCommand
+ let li = a:vim_info.cmd
+ " vimCommand - normal
+ let lnum = s:search_and_check('vimCommand normal', base_fname, str_info)
+ let lnum = s:append_syn_vimcmd(lnum, str_info, li, 0)
+
+ " vimOption
+ let kword = 'vimOption'
+ let li = a:vim_info.opt
+ " vimOption - normal
+ let lnum = s:search_and_check(kword . ' normal', base_fname, str_info)
+ let lnum = s:append_syn_vimopt(lnum, str_info, li, '', 0)
+ " vimOption - turn-off
+ let lnum = s:search_and_check(kword . ' turn-off', base_fname, str_info)
+ let lnum = s:append_syn_vimopt(lnum, str_info, li, 'no', 1)
+ " vimOption - invertible
+ let lnum = s:search_and_check(kword . ' invertible', base_fname, str_info)
+ let lnum = s:append_syn_vimopt(lnum, str_info, li, 'inv', 1)
+ " vimOption - term output code
+ let li = a:vim_info.term_out_code
+ let lnum = s:search_and_check(kword . ' term output code', base_fname, str_info)
+ let lnum = s:append_syn_any(lnum, str_info, li)
+
+ " Missing vimOption
+ let li = a:vim_info.missing_opt
+ let lnum = s:search_and_check('Missing vimOption', base_fname, str_info)
+ let lnum = s:append_syn_vimopt(lnum, str_info, li, '', 0)
+ let lnum = s:append_syn_vimopt(lnum, str_info, li, 'no', 1)
+ let lnum = s:append_syn_vimopt(lnum, str_info, li, 'inv', 1)
+
+ " vimAutoEvent
+ let li = a:vim_info.event
+ let lnum = s:search_and_check('vimAutoEvent', base_fname, str_info)
+ let lnum = s:append_syn_any(lnum, str_info, li)
+
+ " vimHLGroup
+ let li = a:vim_info.hlgroup
+ let lnum = s:search_and_check('vimHLGroup', base_fname, str_info)
+ let lnum = s:append_syn_any(lnum, str_info, li)
+
+ " vimFuncName
+ let li = a:vim_info.func
+ let lnum = s:search_and_check('vimFuncName', base_fname, str_info)
+ let lnum = s:append_syn_any(lnum, str_info, li)
+
+ " vimUserAttrbCmplt
+ let li = a:vim_info.compl_name
+ let lnum = s:search_and_check('vimUserAttrbCmplt', base_fname, str_info)
+ let lnum = s:append_syn_any(lnum, str_info, li)
+
+ " vimCommand - abbrev
+ let kword = 'vimCommand'
+ let li = a:vim_info.cmd
+ let lnum = s:search_and_check(kword . ' abbrev', base_fname, str_info)
+ let lnum = s:append_syn_vimcmd(lnum, str_info, li, 2)
+ " vimCommand - map
+ let lnum = s:search_and_check(kword . ' map', base_fname, str_info)
+ let lnum = s:append_syn_vimcmd(lnum, str_info, li, 4)
+ let lnum = s:search_and_check(kword . ' mapclear', base_fname, str_info)
+ let lnum = s:append_syn_vimcmd(lnum, str_info, li, 5)
+ let lnum = s:search_and_check(kword . ' unmap', base_fname, str_info)
+ let lnum = s:append_syn_vimcmd(lnum, str_info, li, 6)
+ " vimCommand - menu
+ let lnum = s:search_and_check(kword . ' menu', base_fname, str_info)
+ let lnum = s:append_syn_vimcmd(lnum, str_info, li, 3)
+
+ update
+ quit!
+
+ catch /.*/
+ call s:err_gen('')
+ throw 'exit'
+ endtry
+endfunc
+
+" ------------------------------------------------------------------------------
+function! s:err_gen(arg)
+ call s:write_error(a:arg, 'generator.err')
+endfunc
+
+function! s:err_sanity(arg)
+ call s:write_error(a:arg, 'sanity_check.err')
+endfunc
+
+function! s:write_error(arg, fname)
+ let li = []
+ if !empty(v:throwpoint)
+ call add(li, v:throwpoint)
+ endif
+ if !empty(v:exception)
+ call add(li, v:exception)
+ endif
+ if type(a:arg) == type([])
+ call extend(li, a:arg)
+ elseif type(a:arg) == type("")
+ if !empty(a:arg)
+ call add(li, a:arg)
+ endif
+ endif
+ if !empty(li)
+ call writefile(li, a:fname, 'a')
+ else
+ call writefile(['UNKNOWN'], a:fname, 'a')
+ endif
+endfunc
+
+" ------------------------------------------------------------------------------
+try
+ let s:line_break_len = 768
+ let s:vim_info = {}
+ let s:vim_info.opt = []
+ let s:vim_info.missing_opt = []
+ let s:vim_info.term_out_code = []
+ let s:vim_info.cmd = []
+ let s:vim_info.event = []
+ let s:vim_info.func = []
+ let s:vim_info.hlgroup = []
+ let s:vim_info.compl_name = []
+
+ set lazyredraw
+ silent call s:parse_vim_option(s:vim_info.opt, s:vim_info.missing_opt,
+ \ s:vim_info.term_out_code)
+ silent call s:parse_vim_command(s:vim_info.cmd)
+ silent call s:parse_vim_event(s:vim_info.event)
+ silent call s:parse_vim_function(s:vim_info.func)
+ silent call s:parse_vim_hlgroup(s:vim_info.hlgroup)
+ silent call s:parse_vim_complete_name(s:vim_info.compl_name)
+
+ call s:update_syntax_vim_file(s:vim_info)
+ set nolazyredraw
+
+finally
+ quitall!
+endtry
+
+" ---------------------------------------------------------------------
+let &cpo = s:keepcpo
+unlet s:keepcpo
+" vim:ts=2 sw=2
diff --git a/runtime/syntax/generator/update_date.vim b/runtime/syntax/generator/update_date.vim
new file mode 100644
index 0000000..3556189
--- /dev/null
+++ b/runtime/syntax/generator/update_date.vim
@@ -0,0 +1,14 @@
+" Update the date of following line in vim.vim.rc.
+" '" Last Change: '
+"
+language C
+silent new ../vim.vim
+normal gg
+let pat = '^"\s*Last\s*Change:\s\+'
+let lnum = search(pat, 'We', 10)
+if lnum > 0
+ exec 'norm! lD"=strftime("%Y %b %d")' . "\rp"
+ silent update
+endif
+quitall!
+" vim:ts=4 sw=4 et
diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base
new file mode 100644
index 0000000..8f0f05e
--- /dev/null
+++ b/runtime/syntax/generator/vim.vim.base
@@ -0,0 +1,1192 @@
+" Vim syntax file
+" Language: Vim script
+" Maintainer: Hirohito Higashi <h.east.727 ATMARK gmail.com>
+" Doug Kearns <dougkearns@gmail.com>
+" URL: https://github.com/vim-jp/syntax-vim-ex
+" Last Change: 2024 Mar 22
+" Former Maintainer: Charles E. Campbell
+" Base File URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
+" Base File Version: 9.0-25
+
+" DO NOT CHANGE DIRECTLY.
+" THIS FILE PARTLY GENERATED BY gen_syntax_vim.vim.
+" (Search string "GEN_SYN_VIM:" in this file)
+
+" Automatically generated keyword lists: {{{1
+
+" Quit when a syntax file was already loaded {{{2
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" vimTodo: contains common special-notices for comments {{{2
+" Use the vimCommentGroup cluster to add your own.
+syn keyword vimTodo contained COMBAK FIXME TODO XXX
+syn cluster vimCommentGroup contains=vimTodo,@Spell
+
+" regular vim commands {{{2
+" GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand contained', END_STR=''
+
+syn keyword vimCommand contained 2mat[ch] 3mat[ch]
+
+" Lower priority for _new_ to distinguish constructors from the command.
+syn match vimCommand contained "\<new\>(\@!"
+syn match vimCommand contained "\<z[-+^.=]\=\>"
+syn keyword vimStdPlugin contained Arguments Asm Break Cfilter Clear Continue DiffOrig Evaluate Finish Gdb Lfilter Man Over Program Run S Source Step Stop Termdebug TermdebugCommand TOhtml Until Winbar XMLent XMLns
+
+" vimOptions are caught only when contained in a vimSet {{{2
+" GEN_SYN_VIM: vimOption normal, START_STR='syn keyword vimOption contained', END_STR=''
+
+" vimOptions: These are the turn-off setting variants {{{2
+" GEN_SYN_VIM: vimOption turn-off, START_STR='syn keyword vimOption contained', END_STR=''
+
+" vimOptions: These are the invertible variants {{{2
+" GEN_SYN_VIM: vimOption invertible, START_STR='syn keyword vimOption contained', END_STR=''
+
+" termcap codes (which can also be set) {{{2
+" GEN_SYN_VIM: vimOption term output code, START_STR='syn keyword vimOption contained', END_STR=''
+" term key codes
+syn keyword vimOption contained t_F1 t_F2 t_F3 t_F4 t_F5 t_F6 t_F7 t_F8 t_F9 t_k1 t_K1 t_k2 t_k3 t_K3 t_k4 t_K4 t_k5 t_K5 t_k6 t_K6 t_k7 t_K7 t_k8 t_K8 t_k9 t_K9 t_KA t_kb t_kB t_KB t_KC t_kd t_kD t_KD t_KE t_KF t_KG t_kh t_KH t_kI t_KI t_KJ t_KK t_kl t_KL t_kN t_kP t_kr t_ku
+syn match vimOption contained "t_%1"
+syn match vimOption contained "t_#2"
+syn match vimOption contained "t_#4"
+syn match vimOption contained "t_@7"
+syn match vimOption contained "t_*7"
+syn match vimOption contained "t_&8"
+syn match vimOption contained "t_%i"
+syn match vimOption contained "t_k;"
+
+" unsupported settings: some were supported by vi but don't do anything in vim {{{2
+" GEN_SYN_VIM: Missing vimOption, START_STR='syn keyword vimErrSetting contained', END_STR=''
+
+" AutoCmd Events {{{2
+syn case ignore
+" GEN_SYN_VIM: vimAutoEvent, START_STR='syn keyword vimAutoEvent contained', END_STR=''
+
+" Highlight commonly used Groupnames {{{2
+syn keyword vimGroup contained Comment Constant String Character Number Boolean Float Identifier Function Statement Conditional Repeat Label Operator Keyword Exception PreProc Include Define Macro PreCondit Type StorageClass Structure Typedef Special SpecialChar Tag Delimiter SpecialComment Debug Underlined Ignore Error Todo
+
+" Default highlighting groups {{{2
+" GEN_SYN_VIM: vimHLGroup, START_STR='syn keyword vimHLGroup contained', END_STR=''
+syn case match
+
+" Function Names {{{2
+" GEN_SYN_VIM: vimFuncName, START_STR='syn keyword vimFuncName contained', END_STR=''
+
+"--- syntax here and above generated by mkvimvim ---
+" Special Vim Highlighting (not automatic) {{{1
+
+" Set up folding commands for this syntax highlighting file {{{2
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# '[afhlmpPrt]'
+ if g:vimsyn_folding =~# 'a'
+ com! -nargs=* VimFolda <args> fold
+ else
+ com! -nargs=* VimFolda <args>
+ endif
+ if g:vimsyn_folding =~# 'f'
+ com! -nargs=* VimFoldf <args> fold
+ else
+ com! -nargs=* VimFoldf <args>
+ endif
+ if g:vimsyn_folding =~# 'h'
+ com! -nargs=* VimFoldh <args> fold
+ else
+ com! -nargs=* VimFoldh <args>
+ endif
+ if g:vimsyn_folding =~# 'l'
+ com! -nargs=* VimFoldl <args> fold
+ else
+ com! -nargs=* VimFoldl <args>
+ endif
+ if g:vimsyn_folding =~# 'm'
+ com! -nargs=* VimFoldm <args> fold
+ else
+ com! -nargs=* VimFoldm <args>
+ endif
+ if g:vimsyn_folding =~# 'p'
+ com! -nargs=* VimFoldp <args> fold
+ else
+ com! -nargs=* VimFoldp <args>
+ endif
+ if g:vimsyn_folding =~# 'P'
+ com! -nargs=* VimFoldP <args> fold
+ else
+ com! -nargs=* VimFoldP <args>
+ endif
+ if g:vimsyn_folding =~# 'r'
+ com! -nargs=* VimFoldr <args> fold
+ else
+ com! -nargs=* VimFoldr <args>
+ endif
+ if g:vimsyn_folding =~# 't'
+ com! -nargs=* VimFoldt <args> fold
+ else
+ com! -nargs=* VimFoldt <args>
+ endif
+else
+ com! -nargs=* VimFolda <args>
+ com! -nargs=* VimFoldf <args>
+ com! -nargs=* VimFoldh <args>
+ com! -nargs=* VimFoldl <args>
+ com! -nargs=* VimFoldm <args>
+ com! -nargs=* VimFoldp <args>
+ com! -nargs=* VimFoldP <args>
+ com! -nargs=* VimFoldr <args>
+ com! -nargs=* VimFoldt <args>
+endif
+
+" Deprecated variable options {{{2
+if exists("g:vim_minlines")
+ let g:vimsyn_minlines= g:vim_minlines
+endif
+if exists("g:vim_maxlines")
+ let g:vimsyn_maxlines= g:vim_maxlines
+endif
+if exists("g:vimsyntax_noerror")
+ let g:vimsyn_noerror= g:vimsyntax_noerror
+endif
+
+" Variable options {{{2
+if exists("g:vim_maxlines")
+ let s:vimsyn_maxlines= g:vim_maxlines
+else
+ let s:vimsyn_maxlines= 60
+endif
+
+" Numbers {{{2
+" =======
+syn case ignore
+syn match vimNumber '\<\d\+\%(\.\d\+\%(e[+-]\=\d\+\)\=\)\=' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0b[01]\+' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0o\=\o\+' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0x\x\+' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0z\%(\x\x\)\+\%(\.\%(\x\x\)\+\)*' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\%(^\|\A\)\zs#\x\{6}' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn case match
+
+" All vimCommands are contained by vimIsCommand. {{{2
+syn cluster vimCmdList contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimDef,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimMap,vimMark,vimNotFunc,vimNorm,vimSet,vimSyntax,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate
+syn match vimCmdSep "[:|]\+" skipwhite nextgroup=@vimCmdList,vimSubst1
+syn match vimIsCommand "\<\%(\h\w*\|[23]mat\%[ch]\)\>" contains=vimCommand
+syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>"
+syn match vimVar "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
+syn match vimVar "\s\zs&\%([lg]:\)\=\a\+\>"
+syn match vimVar "\s\zs&t_\S[a-zA-Z0-9]\>"
+syn match vimVar "\s\zs&t_k;"
+syn match vimFBVar contained "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
+syn keyword vimCommand contained in
+
+syn cluster vimExprList contains=vimEnvvar,vimFunc,vimFuncVar,vimNumber,vimOper,vimOperParen,vimLetRegister,vimString,vimVar
+
+" Insertions And Appends: insert append {{{2
+" (buftype != nofile test avoids having append, change, insert show up in the command window)
+" =======================
+if &buftype != 'nofile'
+ syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=a\%[ppend]$" matchgroup=vimCommand end="^\.$""
+ syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=c\%[hange]$" matchgroup=vimCommand end="^\.$""
+ syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=i\%[nsert]$" matchgroup=vimCommand end="^\.$""
+endif
+
+" Behave! {{{2
+" =======
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror")
+ syn match vimBehaveError contained "[^ ]\+"
+endif
+syn match vimBehave "\<be\%[have]\>" nextgroup=vimBehaveBang,vimBehaveModel,vimBehaveError skipwhite
+syn match vimBehaveBang contained "\a\@1<=!" nextgroup=vimBehaveModel skipwhite
+syn keyword vimBehaveModel contained mswin xterm
+
+" Filetypes {{{2
+" =========
+syn match vimFiletype "\<filet\%[ype]\(\s\+\I\i*\)*" skipwhite contains=vimFTCmd,vimFTOption,vimFTError
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_vimFTError")
+ syn match vimFTError contained "\I\i*"
+endif
+syn keyword vimFTCmd contained filet[ype]
+syn keyword vimFTOption contained detect indent off on plugin
+
+" Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2
+" ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking.
+syn cluster vimAugroupList contains=@vimCmdList,vimFilter,vimFunc,vimLineComment,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vim9Comment,vimString,vimSubst,vimRegister,vimCmplxRepeat,vimNotation,vimCtrlChar,vimFuncVar,vimContinue
+syn match vimAugroup "\<aug\%[roup]\>" contains=vimAugroupKey,vimAugroupBang skipwhite nextgroup=vimAugroupBang,vimAutoCmdGroup
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'a'
+ syn region vimAugroup fold start="\<aug\%[roup]\>\ze\s\+\%([eE][nN][dD]\)\@!\S\+" matchgroup=vimAugroupKey end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList,vimAugroupkey skipwhite nextgroup=vimAugroupEnd
+else
+ syn region vimAugroup start="\<aug\%[roup]\>\ze\s\+\%([eE][nN][dD]\)\@!\S\+" matchgroup=vimAugroupKey end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList,vimAugroupkey skipwhite nextgroup=vimAugroupEnd
+endif
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noaugrouperror")
+ syn match vimAugroupError "\<aug\%[roup]\>\s\+[eE][nN][dD]\>"
+endif
+
+syn match vimAutoCmdGroup contained "\S\+"
+syn match vimAugroupEnd contained "\c\<END\>"
+syn match vimAugroupBang contained "\a\@1<=!" skipwhite nextgroup=vimAutoCmdGroup
+syn keyword vimAugroupKey contained aug[roup] skipwhite nextgroup=vimAugroupBang,vimAutoCmdGroup,vimAugroupEnd
+
+" Operators: {{{2
+" =========
+syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimRegister,@vimContinue,vim9Comment,vimVar
+syn match vimOper "||\|&&\|[-+*/%.!]" skipwhite nextgroup=vimString,vimSpecFile
+syn match vimOper "\%#=1\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\|!\~#\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
+syn match vimOper "\(\<is\|\<isnot\)[?#]\{0,2}\>" skipwhite nextgroup=vimString,vimSpecFile
+syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=@vimOperGroup
+syn region vimOperParen matchgroup=vimSep start="#\={" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noopererror")
+ syn match vimOperError ")"
+endif
+
+" Functions : Tag is provided for those who wish to highlight tagged functions {{{2
+" =========
+syn cluster vimFuncList contains=vimFuncBang,vimFunctionError,vimFuncKey,vimFuncSID,Tag
+syn cluster vimDefList contains=vimFuncBang,vimFunctionError,vimDefKey,vimFuncSID,Tag
+syn cluster vimFuncBodyList contains=@vimCmdList,vimCmplxRepeat,vimComment,vimContinue,vimCtrlChar,vimDef,vimEnvvar,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimLetHereDoc,vimLineComment,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSearch,vimSpecFile,vimString,vimSubst
+syn cluster vimDefBodyList contains=@vimCmdList,vimCmplxRepeat,vim9Comment,vimContinue,vimCtrlChar,vimDef,vimEnvvar,vimFBVar,vimFunc,vimFunction,vimLetHereDoc,vim9LineComment,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSearch,vimSpecFile,vimString,vimSubst
+
+syn region vimFuncPattern contained matchgroup=vimOper start="/" end="$" contains=@vimSubstList
+syn match vimFunction "\<fu\%[nction]\>" skipwhite nextgroup=vimCmdSep,vimComment,vimFuncPattern contains=vimFuncKey
+syn match vimDef "\<def\>" skipwhite nextgroup=vimCmdSep,vimComment,vimFuncPattern contains=vimDefKey
+
+syn match vimFunction "\<fu\%[nction]\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+" contains=@vimFuncList skipwhite nextgroup=vimFuncParams
+syn match vimDef "\<def\s\+new\%(\i\|{.\{-1,}}\)\+" contains=@vimDefList nextgroup=vimDefParams
+syn match vimDef "\<def\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+" contains=@vimDefList nextgroup=vimDefParams
+
+syn match vimFuncComment contained +".*+ skipwhite skipnl nextgroup=vimFuncBody,vimEndfunction
+syn match vimDefComment contained "#.*" skipwhite skipnl nextgroup=vimDefBody,vimEnddef
+
+syn match vimFuncBang contained "!"
+syn match vimFuncSID contained "\c<sid>"
+syn match vimFuncSID contained "\<[sg]:"
+syn keyword vimFuncKey contained fu[nction]
+syn keyword vimDefKey contained def
+
+syn region vimFuncParams contained matchgroup=Delimiter start="(" skip=+\n\s*\\\|\n\s*"\\ + end=")" skipwhite skipnl nextgroup=vimFuncBody,vimFuncComment,vimEndfunction,vimFuncMod contains=vimFuncParam,@vimContinue
+syn region vimDefParams contained matchgroup=Delimiter start="(" end=")" skipwhite skipnl nextgroup=vimDefBody,vimDefComment,vimEnddef,vimReturnType contains=vimDefParam,vim9Comment
+syn match vimFuncParam contained "\<\h\w*\>\|\.\.\." skipwhite nextgroup=vimFuncParamEquals
+syn match vimDefParam contained "\<\h\w*\>" skipwhite nextgroup=vimParamType,vimFuncParamEquals
+
+syn match vimFuncParamEquals contained "=" skipwhite nextgroup=@vimExprList
+syn match vimFuncMod contained "\<\%(abort\|closure\|dict\|range\)\>" skipwhite skipnl nextgroup=vimFuncBody,vimFuncComment,vimEndfunction,vimFuncMod
+
+syn region vimFuncBody contained start="^" matchgroup=vimCommand end="\<endfu\%[nction]\>" contains=@vimFuncBodyList
+syn region vimDefBody contained start="^" matchgroup=vimCommand end="\<enddef\>" contains=@vimDefBodyList
+
+syn match vimEndfunction "\<endf\%[unction]\>"
+syn match vimEnddef "\<enddef\>"
+
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f'
+ syn region vimFuncFold start="\<fu\%[nction]\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+\s*(" end="\<endf\%[unction]\>" contains=vimFunction fold keepend transparent
+ syn region vimFuncFold start="\<def\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+(" end="\<enddef\>" contains=vimDef fold keepend transparent
+ syn region vimFuncFold start="\<def\s\+new\%(\i\|{.\{-1,}}\)\+(" end="\<enddef\>" contains=vimDef fold keepend transparent
+endif
+
+syn match vimFuncVar contained "a:\%(\K\k*\|\d\+\)\>"
+syn match vimFuncBlank contained "\s\+"
+
+" Types: {{{2
+" =====
+" vimTypes : new for vim9
+syn region vimReturnType contained start=":\s" end="$" matchgroup=vim9Comment end="\ze#" skipwhite skipnl nextgroup=vimDefBody,vimDefComment,vimEnddef contains=vimTypeSep transparent
+syn match vimParamType contained ":\s\+\a" skipwhite skipnl nextgroup=vimFuncParamEquals contains=vimTypeSep,@vimType
+
+syn match vimTypeSep contained ":\s\@=" skipwhite nextgroup=@vimType
+syn keyword vimType contained any blob bool channel float job number string void
+syn match vimType contained "\<func\>"
+syn region vimCompoundType contained matchgroup=vimType start="\<func(" end=")" nextgroup=vimTypeSep contains=@vimType oneline transparent
+syn region vimCompoundType contained matchgroup=vimType start="\<\%(list\|dict\)<" end=">" contains=@vimType oneline transparent
+syn match vimUserType contained "\<\u\w*\>"
+
+syn cluster vimType contains=vimType,vimCompoundType,vimUserType
+
+" Keymaps: (Vim Project Addition) {{{2
+" =======
+
+" TODO: handle Vim9 script comments when something like #13104 is merged
+syn match vimKeymapStart "^" contained skipwhite nextgroup=vimKeymapLhs,vimKeymapLineComment
+syn match vimKeymapLhs "\S\+" contained skipwhite nextgroup=vimKeymapRhs contains=vimNotation
+syn match vimKeymapRhs "\S\+" contained skipwhite nextgroup=vimKeymapTailComment contains=vimNotation
+syn match vimKeymapTailComment "\S.*" contained
+syn match vimKeymapLineComment +".*+ contained contains=@vimCommentGroup,vimCommentString,vimCommentTitle
+
+syn region vimKeymap matchgroup=vimCommand start="\<loadk\%[eymap]\>" end="\%$" contains=vimKeymapStart
+
+" Special Filenames, Modifiers, Extension Removal: {{{2
+" ===============================================
+syn match vimSpecFile "<c\(word\|WORD\)>" nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "<\([acs]file\|amatch\|abuf\)>" nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "\s%[ \t:]"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "\s%$"ms=s+1 nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "\s%<"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "#\d\+\|[#%]<\>" nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFileMod "\(:[phtre]\)\+" contained
+
+" User-Specified Commands: {{{2
+" =======================
+syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,vimComment,vim9Comment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
+syn keyword vimUserCommand contained com[mand]
+syn match vimUserCmd "\<com\%[mand]!\=\>.*$" contains=vimUserAttrb,vimUserAttrbError,vimUserCommand,@vimUserCmdList,vimComFilter
+syn match vimUserAttrbError contained "-\a\+\ze\s"
+syn match vimUserAttrb contained "-nargs=[01*?+]" contains=vimUserAttrbKey,vimOper
+syn match vimUserAttrb contained "-complete=" contains=vimUserAttrbKey,vimOper nextgroup=vimUserAttrbCmplt,vimUserCmdError
+syn match vimUserAttrb contained "-range\(=%\|=\d\+\)\=" contains=vimNumber,vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-count\(=\d\+\)\=" contains=vimNumber,vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-bang\>" contains=vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-bar\>" contains=vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-buffer\>" contains=vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-register\>" contains=vimOper,vimUserAttrbKey
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
+ syn match vimUserCmdError contained "\S\+\>"
+endif
+syn case ignore
+syn keyword vimUserAttrbKey contained bar ban[g] cou[nt] ra[nge] com[plete] n[args] re[gister]
+" GEN_SYN_VIM: vimUserAttrbCmplt, START_STR='syn keyword vimUserAttrbCmplt contained', END_STR=''
+syn keyword vimUserAttrbCmplt contained custom customlist nextgroup=vimUserAttrbCmpltFunc,vimUserCmdError
+syn match vimUserAttrbCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
+
+syn case match
+syn match vimUserAttrbCmplt contained "custom,\u\w*"
+
+" Lower Priority Comments: after some vim commands... {{{2
+" =======================
+syn match vimComment excludenl +\s"[^\-:.%#=*].*$+lc=1 contains=@vimCommentGroup,vimCommentString
+syn match vimComment +\<endif\s\+".*$+lc=5 contains=@vimCommentGroup,vimCommentString
+syn match vimComment +\<else\s\+".*$+lc=4 contains=@vimCommentGroup,vimCommentString
+syn region vimCommentString contained oneline start='\S\s\+"'ms=e end='"'
+" Vim9 comments - TODO: might be highlighted while they don't work
+syn match vim9Comment excludenl +\s#[^{].*$+lc=1 contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +\<endif\s\+#[^{].*$+lc=5 contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +\<else\s\+#[^{].*$+lc=4 contains=@vimCommentGroup,vimCommentString
+" Vim9 comment inside expression
+syn match vim9Comment +\s\zs#[^{].*$+ms=s+1 contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +^\s*#[^{].*$+ contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +^\s*#$+ contains=@vimCommentGroup,vimCommentString
+
+" Environment Variables: {{{2
+" =====================
+syn match vimEnvvar "\$\I\i*"
+syn match vimEnvvar "\${\I\i*}"
+
+" In-String Specials: {{{2
+" Try to catch strings, if nothing else matches (therefore it must precede the others!)
+" vimEscapeBrace handles ["] []"] (ie. "s don't terminate string inside [])
+syn region vimEscapeBrace oneline contained transparent start="[^\\]\(\\\\\)*\[\zs\^\=\]\=" skip="\\\\\|\\\]" end="]"me=e-1
+syn match vimPatSepErr contained "\\)"
+syn match vimPatSep contained "\\|"
+syn region vimPatSepZone oneline contained matchgroup=vimPatSepZ start="\\%\=\ze(" skip="\\\\" end="\\)\|[^\\]['"]" contains=@vimStringGroup
+syn region vimPatRegion contained transparent matchgroup=vimPatSepR start="\\[z%]\=(" end="\\)" contains=@vimSubstList oneline
+syn match vimNotPatSep contained "\\\\"
+syn cluster vimStringGroup contains=vimEscape,vimEscapeBrace,vimPatSep,vimNotPatSep,vimPatSepErr,vimPatSepZone,@Spell
+syn region vimString oneline keepend start=+[^a-zA-Z>!\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ contains=@vimStringGroup
+syn region vimString oneline keepend start=+[^a-zA-Z>!\\@]'+lc=1 end=+'+
+"syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup " see tst45.vim
+syn match vimString contained +"[^"]*\\$+ skipnl nextgroup=vimStringCont
+syn match vimStringCont contained +\(\\\\\|.\)\{-}[^\\]"+
+syn match vimEscape contained "\\."
+" syn match vimEscape contained +\\[befnrt\"]+
+syn match vimEscape contained "\\\o\{1,3}\|\\[xX]\x\{1,2}\|\\u\x\{1,4}\|\\U\x\{1,8}"
+syn match vimEscape contained "\\<" contains=vimNotation
+syn match vimEscape contained "\\<\*[^>]*>\=>"
+
+syn region vimString oneline start=+$'+ skip=+''+ end=+'+ contains=vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region vimString oneline start=+$"+ end=+"+ contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList
+syn match vimStringInterpolationBrace contained "{{"
+syn match vimStringInterpolationBrace contained "}}"
+
+" Substitutions: {{{2
+" =============
+syn cluster vimSubstList contains=vimPatSep,vimPatRegion,vimPatSepErr,vimSubstTwoBS,vimSubstRange,vimNotation
+syn cluster vimSubstRepList contains=vimSubstSubstr,vimSubstTwoBS,vimNotation
+syn cluster vimSubstList add=vimCollection
+syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>[\"#|]\@!" nextgroup=vimSubstPat
+syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)_\@=" nextgroup=vimSubstPat
+syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\ze#.\{-}#.\{-}#" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>[\"#|]\@!" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)_\@=" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\ze#.\{-}#.\{-}#" nextgroup=vimSubstPat
+" TODO: Vim9 illegal separators for abbreviated :s form are [-.:], :su\%[...] required
+" : # is allowed but "not recommended" (see :h pattern-delimiter)
+syn region vimSubstPat contained matchgroup=vimSubstDelim start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1 contains=@vimSubstList nextgroup=vimSubstRep4 oneline
+syn region vimSubstRep4 contained matchgroup=vimSubstDelim start="\z(.\)" skip="\\\\\|\\\z1" end="\z1" matchgroup=vimNotation end="<[cC][rR]>" contains=@vimSubstRepList nextgroup=vimSubstFlagErr oneline
+syn region vimCollection contained transparent start="\\\@<!\[" skip="\\\[" end="\]" contains=vimCollClass
+syn match vimCollClassErr contained "\[:.\{-\}:\]"
+syn match vimCollClass contained transparent "\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|retu\%[rn]\|tab\|escape\|backspace\):\]"
+syn match vimSubstSubstr contained "\\z\=\d"
+syn match vimSubstTwoBS contained "\\\\"
+syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags
+syn match vimSubstFlags contained "[&cegiIlnpr#]\+"
+
+" 'String': {{{2
+syn match vimString "[^(,]'[^']\{-}\zs'"
+
+" Marks, Registers, Addresses, Filters: {{{2
+syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark "'[<>]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark ",\zs'[<>]\ze" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark "[!,:]\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark "\<norm\%[al]\s\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMarkNumber "[-+]\d\+" contained contains=vimOper nextgroup=vimSubst1
+syn match vimPlainMark contained "'[a-zA-Z0-9]"
+syn match vimRange "[`'][a-zA-Z0-9],[`'][a-zA-Z0-9]" contains=vimMark skipwhite nextgroup=vimFilter
+
+syn match vimRegister '[^,;[{: \t]\zs"[a-zA-Z0-9.%#:_\-/]\ze[^a-zA-Z_":0-9]'
+syn match vimRegister '\<norm\s\+\zs"[a-zA-Z0-9]'
+syn match vimRegister '\<normal\s\+\zs"[a-zA-Z0-9]'
+syn match vimRegister '@"'
+syn match vimPlainRegister contained '"[a-zA-Z0-9\-:.%#*+=]'
+syn match vimLetRegister contained '@["0-9\-a-zA-Z#=*+_/]'
+
+syn match vimAddress ",\zs[.$]" skipwhite nextgroup=vimSubst1
+syn match vimAddress "%\ze\a" skipwhite nextgroup=vimString,vimSubst1
+
+syn match vimFilter "^!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile
+syn match vimFilter contained "!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile
+syn match vimComFilter contained "|!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile
+
+" Complex Repeats: (:h complex-repeat) {{{2
+" ===============
+syn match vimCmplxRepeat '[^a-zA-Z_/\\()]q[0-9a-zA-Z"]\>'lc=1
+syn match vimCmplxRepeat '@[0-9a-z".=@:]\ze\($\|[^a-zA-Z]\>\)'
+
+" Set command and associated set-options (vimOptions) with comment {{{2
+syn region vimSet matchgroup=vimCommand start="\<\%(setl\%[ocal]\|setg\%[lobal]\|se\%[t]\)\>" skip="\%(\\\\\)*\\.\n\@!" end="$" end="|" matchgroup=vimNotation end="<[cC][rR]>" keepend contains=vimSetEqual,vimOption,vimErrSetting,vimComment,vim9Comment,vimSetString,vimSetMod
+syn region vimSetEqual contained start="[=:]\|[-+^]=" skip="\\\\\|\\\s" end="[| \t]"me=e-1 end="$" contains=vimCtrlChar,vimSetSep,vimNotation,vimEnvvar
+syn region vimSetString contained start=+="+hs=s+1 skip=+\\\\\|\\"+ end=+"+ contains=vimCtrlChar
+syn match vimSetSep contained "[,:]"
+syn match vimSetMod contained "&vim\=\|[!&?<]\|all&"
+
+" Let And Var: {{{2
+" ===========
+syn keyword vimLet let skipwhite nextgroup=vimVar,vimFuncVar,vimLetHereDoc,vimLetRegister,vimVarList
+syn keyword vimConst cons[t] skipwhite nextgroup=vimVar,vimLetHereDoc,vimVarList
+syn region vimVarList contained start="\[" end="]" contains=vimVar,vimContinue
+
+syn keyword vimUnlet unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars
+syn match vimUnletBang contained "!" skipwhite nextgroup=vimUnletVars
+syn region vimUnletVars contained start="$\I\|\h" skip="\n\s*\\" end="$" end="|" contains=vimVar,vimEnvvar,vimContinue,vimString,vimNumber
+
+VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*\%(trim\s\+\%(eval\s\+\)\=\|eval\s\+\%(trim\s\+\)\=\)\=\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\s*\z1\s*$'
+syn keyword vimLet var skipwhite nextgroup=vimVar,vimFuncVar,vimLetHereDoc
+
+" For: {{{2
+" ===
+syn keyword vimFor for skipwhite nextgroup=vimVar,vimVarList
+
+" Abbreviations: {{{2
+" =============
+" GEN_SYN_VIM: vimCommand abbrev, START_STR='syn keyword vimAbb', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs'
+
+" Autocmd: {{{2
+" =======
+syn match vimAutoEventList contained "\(!\s\+\)\=\(\a\+,\)*\a\+" contains=vimAutoEvent nextgroup=vimAutoCmdSpace
+syn match vimAutoCmdSpace contained "\s\+" nextgroup=vimAutoCmdSfxList
+syn match vimAutoCmdSfxList contained "\S*" skipwhite nextgroup=vimAutoCmdMod
+syn keyword vimAutoCmd au[tocmd] do[autocmd] doautoa[ll] skipwhite nextgroup=vimAutoEventList
+syn match vimAutoCmdMod "\(++\)\=\(once\|nested\)"
+
+" Echo And Execute: -- prefer strings! {{{2
+" ================
+" NOTE: No trailing comments
+
+syn region vimEcho
+ \ matchgroup=vimCommand
+ \ start="\<ec\%[ho]\>"
+ \ start="\<echoe\%[rr]\>"
+ \ start="\<echom\%[sg]\>"
+ \ start="\<echoc\%[onsole]\>"
+ \ start="\<echon\>"
+ \ start="\<echow\%[indow]\>"
+ \ skip=+\\|\|\n\s*\\\|\n\s*"\\ +
+ \ matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimExprList transparent
+
+syn match vimEchohl "\<echohl\=\>" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchohlNone
+syn case ignore
+syn keyword vimEchohlNone contained none
+syn case match
+
+syn cluster vimEcho contains=vimEcho,vimEchohl
+
+syn region vimExecute matchgroup=vimCommand start="\<exe\%[cute]\>" skip=+\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimExprList transparent
+
+" Maps: {{{2
+" ====
+syn match vimMap "\<map\>\ze\s*(\@!" skipwhite nextgroup=vimMapMod,vimMapLhs
+syn match vimMap "\<map!" contains=vimMapBang skipwhite nextgroup=vimMapMod,vimMapLhs
+" GEN_SYN_VIM: vimCommand map, START_STR='syn keyword vimMap', END_STR='skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs'
+" GEN_SYN_VIM: vimCommand mapclear, START_STR='syn keyword vimMap', END_STR='skipwhite nextgroup=vimMapMod'
+syn keyword vimMap mapc[lear] skipwhite nextgroup=vimMapBang,vimMapMod
+" GEN_SYN_VIM: vimCommand unmap, START_STR='syn keyword vimUnmap', END_STR='skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs'
+syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation skipwhite nextgroup=vimMapRhs
+syn match vimMapLhs contained "\%(.\|\S\)\+\ze\s*$" contains=vimCtrlChar,vimNotation skipwhite skipnl nextgroup=vimMapRhsContinue
+syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs
+syn match vimMapMod contained "\%#=1\c<\(buffer\|expr\|\(local\)\=leader\|nowait\|plug\|script\|sid\|unique\|silent\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs
+syn region vimMapRhs contained start="\S" skip=+\\|\|\@1<=|\|\n\s*\\\|\n\s*"\\ + end="|" end="$" contains=@vimContinue,vimCtrlChar,vimNotation skipnl nextgroup=vimMapRhsContinue
+" assume a continuation comment introduces the RHS
+syn region vimMapRhsContinue contained start=+^\s*\%(\\\|"\\ \)+ skip=+\\|\|\@1<=|\|\n\s*\\\|\n\s*"\\ + end="|" end="$" contains=@vimContinue,vimCtrlChar,vimNotation
+syn case ignore
+syn keyword vimMapModKey contained buffer expr leader localleader nowait plug script sid silent unique
+syn case match
+
+" Menus: {{{2
+" =====
+" NOTE: tail comments disallowed
+" GEN_SYN_VIM: vimCommand menu, START_STR='syn keyword vimMenu', END_STR='skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus'
+syn keyword vimMenu popu[p] skipwhite nextgroup=vimMenuBang,vimMenuName
+syn region vimMenuRhs contained contains=@vimContinue,vimNotation start="|\@!\S" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + end="$" matchgroup=vimSep end="|"
+syn region vimMenuRhsContinue contained contains=@vimContinue,vimNotation start=+^\s*\%(\\\|"\\ \)+ skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + end="$" matchgroup=vimSep end="|"
+syn match vimMenuName "\.\@!\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation skipwhite nextgroup=vimCmdSep,vimMenuRhs
+syn match vimMenuName "\.\@!\%(\\\s\|\S\)\+\ze\s*$" contained contains=vimMenuNotation,vimNotation skipwhite skipnl nextgroup=vimCmdSep,vimMenuRhsContinue
+syn match vimMenuNotation "&\a\|&&\|\\\s\|\\\." contained
+syn match vimMenuPriority "\<\d\+\%(\.\d\+\)*\>" contained skipwhite nextgroup=vimMenuName
+syn match vimMenuMod "\c<\%(script\|silent\|special\)>" contained skipwhite nextgroup=vimMenuName,vimMenuPriority,vimMenuMod contains=vimMapModKey,vimMapModErr
+syn keyword vimMenuStatus enable disable nextgroup=vimMenuName skipwhite
+syn match vimMenuBang "\a\@1<=!" contained skipwhite nextgroup=vimMenuName,vimMenuMod
+
+syn region vimMenutranslate
+ \ matchgroup=vimCommand start="\<menut\%[ranslate]\>"
+ \ skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ +
+ \ end="$" matchgroup=vimCmdSep end="|" matchgroup=vimMenuClear end="\<clear\ze\s*\%(["#|]\|$\)"
+ \ contains=@vimContinue,vimMenutranslateName keepend transparent
+" oneline is sufficient to match the current formatting in runtime/lang/*.vim
+syn match vimMenutranslateName "\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation
+syn match vimMenutranslateComment +".*+ contained containedin=vimMenutranslate
+
+" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2
+" ======================
+syn case ignore
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd]-\)\{0,4}x\=\%(f\d\{1,2}\|[^ \t:]\|space\|bar\|bslash\|nl\|newline\|lf\|linefeed\|cr\|retu\%[rn]\|enter\|k\=del\%[ete]\|bs\|backspace\|tab\|esc\|csi\|right\|paste\%(start\|end\)\|left\|help\|undo\|k\=insert\|ins\|mouse\|[kz]\=home\|[kz]\=end\|kplus\|kminus\|kdivide\|kmultiply\|kenter\|kpoint\|space\|k\=\%(page\)\=\%(\|down\|up\|k\d\>\)\)>" contains=vimBracket
+
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}\%(net\|dec\|jsb\|pterm\|urxvt\|sgr\)mouse>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}\%(left\|middle\|right\)\%(mouse\|drag\|release\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}left\%(mouse\|release\)nm>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}x[12]\%(mouse\|drag\|release\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}sgrmouserelease>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}mouse\%(up\|down\|move\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}scrollwheel\%(up\|down\|right\|left\)>" contains=vimBracket
+
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%(sid\|nop\|nul\|lt\|drop\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%(snr\|plug\|cursorhold\|ignore\|cmd\|scriptcmd\|focus\%(gained\|lost\)\)>" contains=vimBracket
+syn match vimNotation '\%(\\\|<lt>\)\=<C-R>[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket
+syn match vimNotation '\%#=1\%(\\\|<lt>\)\=<\%(q-\)\=\%(line[12]\|count\|bang\|reg\|args\|mods\|f-args\|f-mods\|lt\)>' contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([cas]file\|abuf\|amatch\|cexpr\|cword\|cWORD\|client\|stack\|script\|sf\=lnum\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket
+
+syn match vimBracket contained "[\\<>]"
+syn case match
+
+" User Function Highlighting: {{{2
+" (following Gautam Iyer's suggestion)
+" ==========================
+syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncEcho,vimFuncName,vimUserFunc,vimExecute
+syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
+syn keyword vimFuncEcho contained ec ech echo
+
+" User Command Highlighting: {{{2
+syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!'
+
+" Errors And Warnings: {{{2
+" ====================
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror")
+ " TODO: The new-prefix exception should only apply to constructor definitions.
+ syn match vimFunctionError "\s\zs\%(new\)\@![a-z0-9]\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
+ syn match vimFunctionError "\s\zs\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\d\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
+ syn match vimElseIfErr "\<else\s\+if\>"
+ syn match vimBufnrWarn /\<bufnr\s*(\s*["']\.['"]\s*)/
+endif
+
+syn match vimNotFunc "\<if\>\|\<el\%[seif]\>\|\<retu\%[rn]\>\|\<while\>" skipwhite nextgroup=vimOper,vimOperParen,vimVar,vimFunc,vimNotation
+
+" Norm: {{{2
+" ====
+syn match vimNorm "\<norm\%[al]!\=" skipwhite nextgroup=vimNormCmds
+syn match vimNormCmds contained ".*$"
+
+" Syntax: {{{2
+"=======
+syn match vimGroupList contained "[^[:space:],]\+\%(\s*,\s*[^[:space:],]\+\)*" contains=vimGroupSpecial
+syn region vimGroupList contained start=/^\s*["#]\\ \|^\s*\\\|[^[:space:],]\+\s*,/ skip=/\s*\n\s*\\\|\s*\n\s*["#]\\ \|^\s*\\\|^\s*["#]\\ / end=/[^[:space:],]\s*$\|[^[:space:],]\ze\s\+\w/ contains=@vimContinue,vimGroupSpecial
+syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP
+
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror")
+ syn match vimSynError contained "\i\+"
+ syn match vimSynError contained "\i\+=" nextgroup=vimGroupList
+endif
+syn match vimSynContains contained "\<contain\%(s\|edin\)=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimSynKeyContainedin contained "\<containedin=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimSynNextgroup contained "\<nextgroup=" skipwhite skipnl nextgroup=vimGroupList
+if has("conceal")
+ " no whitespace allowed after '='
+ syn match vimSynCchar contained "\<cchar=" nextgroup=vimSynCcharValue
+ syn match vimSynCcharValue contained "\S"
+endif
+
+syn match vimSyntax "\<sy\%[ntax]\>" contains=vimCommand skipwhite nextgroup=vimSynType,vimComment,vim9Comment
+syn cluster vimFuncBodyList add=vimSyntax
+
+" Syntax: case {{{2
+syn keyword vimSynType contained case skipwhite nextgroup=vimSynCase,vimSynCaseError
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncaseerror")
+ syn match vimSynCaseError contained "\i\+"
+endif
+syn keyword vimSynCase contained ignore match
+
+" Syntax: clear {{{2
+syn keyword vimSynType contained clear skipwhite nextgroup=vimGroupList
+
+" Syntax: cluster {{{2
+syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName
+syn region vimClusterName contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="$\||" contains=@vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
+syn match vimGroupAdd contained keepend "\<add=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimGroupRem contained keepend "\<remove=" skipwhite skipnl nextgroup=vimGroupList
+
+" Syntax: foldlevel {{{2
+syn keyword vimSynType contained foldlevel skipwhite nextgroup=vimSynFoldMethod,vimSynFoldMethodError
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynfoldmethoderror")
+ syn match vimSynFoldMethodError contained "\i\+"
+endif
+syn keyword vimSynFoldMethod contained start minimum
+
+" Syntax: iskeyword {{{2
+syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimIskList
+syn match vimIskList contained '\S\+' contains=vimIskSep
+syn match vimIskSep contained ','
+
+" Syntax: include {{{2
+syn keyword vimSynType contained include skipwhite nextgroup=vimGroupList
+
+" Syntax: keyword {{{2
+syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynKeyContainedin
+syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion
+syn region vimSynKeyRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|\|$" contains=@vimSynKeyGroup
+syn match vimSynKeyOpt contained "\%#=1\<\(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>"
+
+" Syntax: match {{{2
+syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation,vimMtchComment
+syn keyword vimSynType contained match skipwhite nextgroup=vimSynMatchRegion
+syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|\|$" contains=@vimSynMtchGroup
+syn match vimSynMtchOpt contained "\%#=1\<\(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>"
+
+" Syntax: off and on {{{2
+syn keyword vimSynType contained enable list manual off on reset
+
+" Syntax: region {{{2
+syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation
+syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
+syn keyword vimSynType contained region skipwhite nextgroup=vimSynRegion
+syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip=+\\\\\|\\\|\n\s*\\\|\n\s*"\\ + end="|\|$" contains=@vimSynRegGroup
+syn match vimSynRegOpt contained "\%#=1\<\(conceal\(ends\)\=\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|keepend\|oneline\|extend\|skipnl\|fold\)\>"
+syn match vimSynReg contained "\<\%(start\|skip\|end\)=" nextgroup=vimSynRegPat
+syn match vimSynMtchGrp contained "matchgroup=" nextgroup=vimGroup,vimHLGroup
+syn region vimSynRegPat contained extend start="\z([-`~!@#$%^&*_=+;:'",./?]\)" skip=/\\\\\|\\\z1\|\n\s*\\\|\n\s*"\\ / end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg
+syn match vimSynPatMod contained "\%#=1\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\="
+syn match vimSynPatMod contained "\%#=1\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\=," nextgroup=vimSynPatMod
+syn match vimSynPatMod contained "lc=\d\+"
+syn match vimSynPatMod contained "lc=\d\+," nextgroup=vimSynPatMod
+syn region vimSynPatRange contained start="\[" skip="\\\\\|\\]" end="]"
+syn match vimSynNotPatRange contained "\\\\\|\\\["
+syn match vimMtchComment contained '"[^"]\+$'
+
+" Syntax: sync {{{2
+" ============
+syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncC,vimSyncLines,vimSyncMatch,vimSyncError,vimSyncLinebreak,vimSyncLinecont,vimSyncRegion
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncerror")
+ syn match vimSyncError contained "\i\+"
+endif
+syn keyword vimSyncC contained ccomment clear fromstart
+syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName
+syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynReg
+syn match vimSyncLinebreak contained "\<linebreaks=" skipwhite nextgroup=vimNumber
+syn keyword vimSyncLinecont contained linecont skipwhite nextgroup=vimSynRegPat
+syn match vimSyncLines contained "\(min\|max\)\=lines=" nextgroup=vimNumber
+syn match vimSyncGroupName contained "\h\w*" skipwhite nextgroup=vimSyncKey
+syn match vimSyncKey contained "\<groupthere\|grouphere\>" skipwhite nextgroup=vimSyncGroup
+syn match vimSyncGroup contained "\h\w*" skipwhite nextgroup=vimSynRegPat,vimSyncNone
+syn keyword vimSyncNone contained NONE
+
+" Additional IsCommand: here by reasons of precedence {{{2
+" ====================
+syn match vimIsCommand "<Bar>\s*\a\+" transparent contains=vimCommand,vimNotation
+
+" Highlighting: {{{2
+" ============
+syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,vimComment,vim9Comment
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror")
+ syn match vimHiCtermError contained "\D\i*"
+endif
+syn match vimHighlight "\<hi\%[ghlight]\>" skipwhite nextgroup=vimHiBang,@vimHighlightCluster
+syn match vimHiBang contained "\a\@1<=!" skipwhite nextgroup=@vimHighlightCluster
+
+syn match vimHiGroup contained "\i\+"
+syn case ignore
+syn keyword vimHiAttrib contained none bold inverse italic nocombine reverse standout strikethrough underline undercurl underdashed underdotted underdouble
+syn keyword vimFgBgAttrib contained none bg background fg foreground
+syn case match
+syn match vimHiAttribList contained "\i\+" contains=vimHiAttrib
+syn match vimHiAttribList contained "\i\+,"he=e-1 contains=vimHiAttrib nextgroup=vimHiAttribList
+syn case ignore
+syn keyword vimHiCtermColor contained black blue brown cyan darkblue darkcyan darkgray darkgreen darkgrey darkmagenta darkred darkyellow gray green grey grey40 grey50 grey90 lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightred lightyellow magenta red seagreen white yellow
+syn match vimHiCtermColor contained "\<color\d\{1,3}\>"
+
+syn case match
+syn match vimHiFontname contained "[a-zA-Z\-*]\+"
+syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'"
+syn match vimHiGuiRgb contained "#\x\{6}"
+
+" Highlighting: hi group key=arg ... {{{2
+syn cluster vimHiCluster contains=vimGroup,vimHiGroup,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiCtermfont,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation,vimComment,vim9comment
+syn region vimHiKeyList contained start="\i\+" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimHiCluster
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_vimhikeyerror")
+ syn match vimHiKeyError contained "\i\+="he=e-1
+endif
+syn match vimHiTerm contained "\cterm="he=e-1 nextgroup=vimHiAttribList
+syn match vimHiStartStop contained "\c\%(start\|stop\)="he=e-1 nextgroup=vimHiTermcap,vimOption
+syn match vimHiCTerm contained "\ccterm="he=e-1 nextgroup=vimHiAttribList
+syn match vimHiCtermFgBg contained "\ccterm[fb]g="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
+syn match vimHiCtermul contained "\cctermul="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
+syn match vimHiCtermfont contained "\cctermfont="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
+syn match vimHiGui contained "\cgui="he=e-1 nextgroup=vimHiAttribList
+syn match vimHiGuiFont contained "\cfont="he=e-1 nextgroup=vimHiFontname
+syn match vimHiGuiFgBg contained "\cgui\%([fb]g\|sp\)="he=e-1 nextgroup=vimHiGroup,vimHiGuiFontname,vimHiGuiRgb,vimFgBgAttrib
+syn match vimHiTermcap contained "\S\+" contains=vimNotation
+syn match vimHiNmbr contained '\d\+'
+
+" Highlight: clear {{{2
+syn keyword vimHiClear contained clear skipwhite nextgroup=vimGroup,vimHiGroup
+
+" Highlight: link {{{2
+" see tst24 (hi def vs hi) (Jul 06, 2018)
+"syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\<hi\%[ghlight]\s\+\)\@<=\(\(def\%[ault]\s\+\)\=link\>\|\<def\>\)" end="$" contains=vimHiGroup,vimGroup,vimHLGroup,vimNotation
+" TODO: simplify and allow line continuations --djk
+syn region vimHiLink contained matchgroup=Type start="\%(\<hi\%[ghlight]!\=\s\+\)\@<=\%(\%(def\%[ault]\s\+\)\=link\>\|\<def\%[ault]\>\)" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimHiCluster
+
+" Control Characters: {{{2
+" ==================
+syn match vimCtrlChar "[- -]"
+
+" Beginners - Patterns that involve ^ {{{2
+" =========
+syn match vimLineComment +^[ \t:]*".*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle,vimComment
+syn match vimLineComment +^[ \t:]*"\("[^"]*"\|[^"]\)*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle
+syn match vim9LineComment +^[ \t:]\+#.*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle
+syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup
+" Note: Look-behind to work around nextgroup skipnl consuming leading whitespace and preventing a match
+syn match vimContinue "^\s*\zs\\"
+syn match vimContinueComment '^\s*\zs["#]\\ .*' contained
+syn cluster vimContinue contains=vimContinue,vimContinueComment
+syn region vimString start="^\s*\\\z(['"]\)" skip='\\\\\|\\\z1' end="\z1" oneline keepend contains=@vimStringGroup,vimContinue
+syn match vimCommentTitleLeader '"\s\+'ms=s+1 contained
+
+" Searches And Globals: {{{2
+" ====================
+syn match vimSearch '^\s*[/?].*' contains=vimSearchDelim
+syn match vimSearchDelim '^\s*\zs[/?]\|[/?]$' contained
+syn region vimGlobal matchgroup=Statement start='\<g\%[lobal]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst1
+syn region vimGlobal matchgroup=Statement start='\<v\%[global]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst1
+
+" Embedded Scripts: {{{2
+" ================
+" perl,ruby : Benoit Cerrina
+" python,tcl : Johannes Zellner
+" mzscheme, lua : Charles Campbell
+
+" Allows users to specify the type of embedded script highlighting
+" they want: (perl/python/ruby/tcl support)
+" g:vimsyn_embed == 0 : don't embed any scripts
+" g:vimsyn_embed =~# 'l' : embed lua (but only if vim supports it)
+" g:vimsyn_embed =~# 'm' : embed mzscheme (but only if vim supports it)
+" g:vimsyn_embed =~# 'p' : embed perl (but only if vim supports it)
+" g:vimsyn_embed =~# 'P' : embed python (but only if vim supports it)
+" g:vimsyn_embed =~# 'r' : embed ruby (but only if vim supports it)
+" g:vimsyn_embed =~# 't' : embed tcl (but only if vim supports it)
+if !exists("g:vimsyn_embed")
+ let g:vimsyn_embed= "lmpPr"
+endif
+
+" [-- lua --] {{{3
+let s:luapath= fnameescape(expand("<sfile>:p:h")."/lua.vim")
+if !filereadable(s:luapath)
+ for s:luapath in split(globpath(&rtp,"syntax/lua.vim"),"\n")
+ if filereadable(fnameescape(s:luapath))
+ let s:luapath= fnameescape(s:luapath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'l' && has("lua")) && filereadable(s:luapath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimLuaRegion
+ exe "syn include @vimLuaScript ".s:luapath
+ VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimLuaScript
+ VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*$+ end=+\.$+ contains=@vimLuaScript
+ syn cluster vimFuncBodyList add=vimLuaRegion
+else
+ syn region vimEmbedError start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+lua\s*<<\s*$+ end=+\.$+
+endif
+unlet s:luapath
+
+" [-- perl --] {{{3
+let s:perlpath= fnameescape(expand("<sfile>:p:h")."/perl.vim")
+if !filereadable(s:perlpath)
+ for s:perlpath in split(globpath(&rtp,"syntax/perl.vim"),"\n")
+ if filereadable(fnameescape(s:perlpath))
+ let s:perlpath= fnameescape(s:perlpath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'p' && has("perl")) && filereadable(s:perlpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimPerlRegion
+ exe "syn include @vimPerlScript ".s:perlpath
+ VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(\S*\)\ze\(\s*["#].*\)\=$+ end=+^\z1\ze\(\s*[#"].*\)\=$+ contains=@vimPerlScript
+ VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*$+ end=+\.$+ contains=@vimPerlScript
+ syn cluster vimFuncBodyList add=vimPerlRegion
+else
+ syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+\.$+
+endif
+unlet s:perlpath
+
+" [-- ruby --] {{{3
+let s:rubypath= fnameescape(expand("<sfile>:p:h")."/ruby.vim")
+if !filereadable(s:rubypath)
+ for s:rubypath in split(globpath(&rtp,"syntax/ruby.vim"),"\n")
+ if filereadable(fnameescape(s:rubypath))
+ let s:rubypath= fnameescape(s:rubypath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'r' && has("ruby")) && filereadable(s:rubypath)
+ syn cluster vimFuncBodyList add=vimRubyRegion
+ unlet! b:current_syntax
+ exe "syn include @vimRubyScript ".s:rubypath
+ VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimRubyScript
+ syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*$+ end=+\.$+ contains=@vimRubyScript
+ syn cluster vimFuncBodyList add=vimRubyRegion
+else
+ syn region vimEmbedError start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+rub[y]\s*<<\s*$+ end=+\.$+
+endif
+unlet s:rubypath
+
+" [-- python --] {{{3
+let s:pythonpath= fnameescape(expand("<sfile>:p:h")."/python.vim")
+if !filereadable(s:pythonpath)
+ for s:pythonpath in split(globpath(&rtp,"syntax/python.vim"),"\n")
+ if filereadable(fnameescape(s:pythonpath))
+ let s:pythonpath= fnameescape(s:pythonpath)
+ break
+ endif
+ endfor
+endif
+if g:vimsyn_embed =~# 'P' && has("pythonx") && filereadable(s:pythonpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimPythonRegion
+ exe "syn include @vimPythonScript ".s:pythonpath
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
+ syn cluster vimFuncBodyList add=vimPythonRegion
+else
+ syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+
+endif
+unlet s:pythonpath
+
+" [-- tcl --] {{{3
+if has("win32") || has("win95") || has("win64") || has("win16")
+ " apparently has("tcl") has been hanging vim on some windows systems with cygwin
+ let s:trytcl= (&shell !~ '\<\%(bash\>\|4[nN][tT]\|\<zsh\)\>\%(\.exe\)\=$')
+else
+ let s:trytcl= 1
+endif
+if s:trytcl
+ let s:tclpath= fnameescape(expand("<sfile>:p:h")."/tcl.vim")
+ if !filereadable(s:tclpath)
+ for s:tclpath in split(globpath(&rtp,"syntax/tcl.vim"),"\n")
+ if filereadable(fnameescape(s:tclpath))
+ let s:tclpath= fnameescape(s:tclpath)
+ break
+ endif
+ endfor
+ endif
+ if (g:vimsyn_embed =~# 't' && has("tcl")) && filereadable(s:tclpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimTclRegion
+ exe "syn include @vimTclScript ".s:tclpath
+ VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimTclScript
+ VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*$+ end=+\.$+ contains=@vimTclScript
+ syn cluster vimFuncBodyList add=vimTclScript
+ else
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
+ endif
+ unlet s:tclpath
+else
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
+endif
+unlet s:trytcl
+
+" [-- mzscheme --] {{{3
+let s:mzschemepath= fnameescape(expand("<sfile>:p:h")."/scheme.vim")
+if !filereadable(s:mzschemepath)
+ for s:mzschemepath in split(globpath(&rtp,"syntax/mzscheme.vim"),"\n")
+ if filereadable(fnameescape(s:mzschemepath))
+ let s:mzschemepath= fnameescape(s:mzschemepath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'm' && has("mzscheme")) && filereadable(s:mzschemepath)
+ unlet! b:current_syntax
+ let s:iskKeep= &isk
+ syn cluster vimFuncBodyList add=vimMzSchemeRegion
+ exe "syn include @vimMzSchemeScript ".s:mzschemepath
+ let &isk= s:iskKeep
+ unlet s:iskKeep
+ VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimMzSchemeScript
+ VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+ contains=@vimMzSchemeScript
+ syn cluster vimFuncBodyList add=vimMzSchemeRegion
+else
+ syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+
+endif
+unlet s:mzschemepath
+
+" Synchronize (speed) {{{2
+"============
+if exists("g:vimsyn_minlines")
+ exe "syn sync minlines=".g:vimsyn_minlines
+endif
+exe "syn sync maxlines=".s:vimsyn_maxlines
+syn sync linecont "^\s\+\\"
+syn sync linebreaks=1
+syn sync match vimAugroupSyncA groupthere NONE "\<aug\%[roup]\>\s\+[eE][nN][dD]"
+
+" ====================
+" Highlighting Settings {{{2
+" ====================
+
+if !exists("skip_vim_syntax_inits")
+ if !exists("g:vimsyn_noerror")
+ hi def link vimBehaveError vimError
+ hi def link vimCollClassErr vimError
+ hi def link vimErrSetting vimError
+ hi def link vimEmbedError vimError
+ hi def link vimFTError vimError
+ hi def link vimFunctionError vimError
+ hi def link vimFunc vimError
+ hi def link vimHiAttribList vimError
+ hi def link vimHiCtermError vimError
+ hi def link vimHiKeyError vimError
+ hi def link vimMapModErr vimError
+ hi def link vimSubstFlagErr vimError
+ hi def link vimSynCaseError vimError
+ hi def link vimSynFoldMethodError vimError
+ hi def link vimBufnrWarn vimWarn
+ endif
+
+ hi def link vimAbb vimCommand
+ hi def link vimAddress vimMark
+ hi def link vimAugroupBang vimBang
+ hi def link vimAugroupError vimError
+ hi def link vimAugroupKey vimCommand
+ hi def link vimAutoCmd vimCommand
+ hi def link vimAutoEvent Type
+ hi def link vimAutoCmdMod Special
+ hi def link vimBang vimOper
+ hi def link vimBehaveBang vimBang
+ hi def link vimBehaveModel vimBehave
+ hi def link vimBehave vimCommand
+ hi def link vimBracket Delimiter
+ hi def link vimCmplxRepeat SpecialChar
+ hi def link vimCommand Statement
+ hi def link vimComment Comment
+ hi def link vim9Comment Comment
+ hi def link vimCommentString vimString
+ hi def link vimCommentTitle PreProc
+ hi def link vimCondHL vimCommand
+ hi def link vimConst vimCommand
+ hi def link vimContinue Special
+ hi def link vimContinueComment vimComment
+ hi def link vimCtrlChar SpecialChar
+ hi def link vimDefComment vimComment
+ hi def link vimDefKey vimCommand
+ hi def link vimDefParam vimVar
+ hi def link vimEcho vimCommand
+ hi def link vimEchohlNone vimGroup
+ hi def link vimEchohl vimCommand
+ hi def link vimElseIfErr Error
+ hi def link vimEndfunction vimCommand
+ hi def link vimEnddef vimCommand
+ hi def link vimEnvvar PreProc
+ hi def link vimError Error
+ hi def link vimEscape Special
+ hi def link vimFBVar vimVar
+ hi def link vimFgBgAttrib vimHiAttrib
+ hi def link vimFuncEcho vimCommand
+ hi def link vimFor vimCommand
+ hi def link vimFTCmd vimCommand
+ hi def link vimFTOption vimSynType
+ hi def link vimFuncBang vimBang
+ hi def link vimFuncComment vimComment
+ hi def link vimFuncKey vimCommand
+ hi def link vimFuncName Function
+ hi def link vimFuncMod Special
+ hi def link vimFuncParam vimVar
+ hi def link vimFuncParamEquals vimOper
+ hi def link vimFuncSID Special
+ hi def link vimFuncVar Identifier
+ hi def link vimGroupAdd vimSynOption
+ hi def link vimGroupName vimGroup
+ hi def link vimGroupRem vimSynOption
+ hi def link vimGroupSpecial Special
+ hi def link vimGroup Type
+ hi def link vimHiAttrib PreProc
+ hi def link vimHiBang vimBang
+ hi def link vimHiClear Type
+ hi def link vimHiCtermColor Constant
+ hi def link vimHiCtermFgBg vimHiTerm
+ hi def link vimHiCtermfont vimHiTerm
+ hi def link vimHiCtermul vimHiTerm
+ hi def link vimHiCTerm vimHiTerm
+ hi def link vimHighlight vimCommand
+ hi def link vimHiGroup vimGroupName
+ hi def link vimHiGuiFgBg vimHiTerm
+ hi def link vimHiGuiFont vimHiTerm
+ hi def link vimHiGuiRgb vimNumber
+ hi def link vimHiGui vimHiTerm
+ hi def link vimHiNmbr Number
+ hi def link vimHiStartStop vimHiTerm
+ hi def link vimHiTerm Type
+ hi def link vimHLGroup vimGroup
+ hi def link vimInsert vimString
+ hi def link vimIskSep Delimiter
+ hi def link vimKeymapLineComment vimComment
+ hi def link vimKeymapTailComment vimComment
+ hi def link vimLet vimCommand
+ hi def link vimLetHereDoc vimString
+ hi def link vimLetHereDocStart Special
+ hi def link vimLetHereDocStop Special
+ hi def link vimLetRegister Special
+ hi def link vimLineComment vimComment
+ hi def link vim9LineComment vimComment
+ hi def link vimMapBang vimBang
+ hi def link vimMapModKey vimFuncSID
+ hi def link vimMapMod vimBracket
+ hi def link vimMap vimCommand
+ hi def link vimMark Number
+ hi def link vimMarkNumber vimNumber
+ hi def link vimMenuBang vimBang
+ hi def link vimMenuClear Special
+ hi def link vimMenuMod vimMapMod
+ hi def link vimMenuName PreProc
+ hi def link vimMenu vimCommand
+ hi def link vimMenuNotation vimNotation
+ hi def link vimMenuPriority Number
+ hi def link vimMenuStatus Special
+ hi def link vimMenutranslateComment vimComment
+ hi def link vimMtchComment vimComment
+ hi def link vimNorm vimCommand
+ hi def link vimNotation Special
+ hi def link vimNotFunc vimCommand
+ hi def link vimNotPatSep vimString
+ hi def link vimNumber Number
+ hi def link vimOperError Error
+ hi def link vimOper Operator
+ hi def link vimOption PreProc
+ hi def link vimParenSep Delimiter
+ hi def link vimPatSepErr vimError
+ hi def link vimPatSepR vimPatSep
+ hi def link vimPatSep SpecialChar
+ hi def link vimPatSepZone vimString
+ hi def link vimPatSepZ vimPatSep
+ hi def link vimPattern Type
+ hi def link vimPlainMark vimMark
+ hi def link vimPlainRegister vimRegister
+ hi def link vimRegister SpecialChar
+ hi def link vimScriptDelim Comment
+ hi def link vimSearchDelim Statement
+ hi def link vimSearch vimString
+ hi def link vimSep Delimiter
+ hi def link vimSetMod vimOption
+ hi def link vimSetSep Statement
+ hi def link vimSetString vimString
+ hi def link vimSpecFile Identifier
+ hi def link vimSpecFileMod vimSpecFile
+ hi def link vimSpecial Type
+ hi def link vimStringCont vimString
+ hi def link vimString String
+ hi def link vimStringEnd vimString
+ hi def link vimStringInterpolationBrace vimEscape
+ hi def link vimSubst1 vimSubst
+ hi def link vimSubstDelim Delimiter
+ hi def link vimSubstFlags Special
+ hi def link vimSubstSubstr SpecialChar
+ hi def link vimSubstTwoBS vimString
+ hi def link vimSubst vimCommand
+ hi def link vimSynCaseError Error
+ hi def link vimSynCase Type
+ hi def link vimSyncC Type
+ hi def link vimSyncError Error
+ hi def link vimSyncGroupName vimGroupName
+ hi def link vimSyncGroup vimGroupName
+ hi def link vimSyncKey Type
+ hi def link vimSyncNone Type
+ hi def link vimSynContains vimSynOption
+ hi def link vimSynError Error
+ hi def link vimSynFoldMethodError Error
+ hi def link vimSynFoldMethod Type
+ hi def link vimSynKeyContainedin vimSynContains
+ hi def link vimSynKeyOpt vimSynOption
+ hi def link vimSynCchar vimSynOption
+ hi def link vimSynCcharValue Character
+ hi def link vimSynMtchGrp vimSynOption
+ hi def link vimSynMtchOpt vimSynOption
+ hi def link vimSynNextgroup vimSynOption
+ hi def link vimSynNotPatRange vimSynRegPat
+ hi def link vimSynOption Special
+ hi def link vimSynPatRange vimString
+ hi def link vimSynRegOpt vimSynOption
+ hi def link vimSynRegPat vimString
+ hi def link vimSynReg Type
+ hi def link vimSyntax vimCommand
+ hi def link vimSynType vimSpecial
+ hi def link vimTodo Todo
+ hi def link vimType Type
+ hi def link vimUnlet vimCommand
+ hi def link vimUnletBang vimBang
+ hi def link vimUnmap vimMap
+ hi def link vimUserAttrbCmpltFunc Special
+ hi def link vimUserAttrbCmplt vimSpecial
+ hi def link vimUserAttrbKey vimOption
+ hi def link vimUserAttrb vimSpecial
+ hi def link vimUserAttrbError Error
+ hi def link vimUserCmdError Error
+ hi def link vimUserCommand vimCommand
+ hi def link vimUserFunc Normal
+ hi def link vimVar Identifier
+ hi def link vimWarn WarningMsg
+endif
+
+" Current Syntax Variable: {{{2
+let b:current_syntax = "vim"
+
+" ---------------------------------------------------------------------
+" Cleanup: {{{1
+delc VimFolda
+delc VimFoldf
+delc VimFoldl
+delc VimFoldm
+delc VimFoldp
+delc VimFoldP
+delc VimFoldr
+delc VimFoldt
+let &cpo = s:keepcpo
+unlet s:keepcpo
+" vim:ts=18 fdm=marker ft=vim
diff --git a/runtime/syntax/go.vim b/runtime/syntax/go.vim
index 4272e80..8685867 100644
--- a/runtime/syntax/go.vim
+++ b/runtime/syntax/go.vim
@@ -5,7 +5,8 @@
" go.vim: Vim syntax file for Go.
" Language: Go
" Maintainer: Billie Cleek <bhcleek@gmail.com>
-" Latest Revision: 2023-08-21
+" Latest Revision: 2024-03-17
+" 2024-03-17: - fix goPackageComment highlight (by Vim Project)
" License: BSD-style. See LICENSE file in source repository.
" Repository: https://github.com/fatih/vim-go
@@ -230,21 +231,31 @@ endif
" import
if s:FoldEnable('import')
syn region goImport start='import (' end=')' transparent fold contains=goImport,goImportString,goComment
+ syn match goImport /^import ()/ transparent fold contains=goImport
else
syn region goImport start='import (' end=')' transparent contains=goImport,goImportString,goComment
+ syn match goImport /^import ()/ transparent contains=goImport
endif
" var, const
if s:FoldEnable('varconst')
syn region goVar start='var (' end='^\s*)$' transparent fold
- \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ syn match goVar /var ()/ transparent fold
+ \ contains=goVar
syn region goConst start='const (' end='^\s*)$' transparent fold
- \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ syn match goConst /const ()/ transparent fold
+ \ contains=goConst
else
syn region goVar start='var (' end='^\s*)$' transparent
- \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ syn match goVar /var ()/ transparent
+ \ contains=goVar
syn region goConst start='const (' end='^\s*)$' transparent
- \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ syn match goConst /const ()/ transparent
+ \ contains=goConst
endif
" Single-line var, const, and import.
@@ -521,12 +532,12 @@ if s:HighlightBuildConstraints() || s:FoldEnable('package_comment')
" matched as comments to avoid looking like working build constraints.
" The he, me, and re options let the "package" itself be highlighted by
" the usual rules.
- exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/'
- \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7'
+ exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package\s/'
+ \ . ' end=/\v\n\s*package\s/he=e-8,me=e-8,re=e-8'
\ . ' contains=@goCommentGroup,@Spell'
\ . (s:FoldEnable('package_comment') ? ' fold' : '')
- exe 'syn region goPackageComment start=/\v^\s*\/\*.*\n(.*\n)*\s*\*\/\npackage/'
- \ . ' end=/\v\*\/\n\s*package/he=e-7,me=e-7,re=e-7'
+ exe 'syn region goPackageComment start=/\v^\s*\/\*.*\n(.*\n)*\s*\*\/\npackage\s/'
+ \ . ' end=/\v\*\/\n\s*package\s/he=e-8,me=e-8,re=e-8'
\ . ' contains=@goCommentGroup,@Spell'
\ . (s:FoldEnable('package_comment') ? ' fold' : '')
hi def link goPackageComment Comment
diff --git a/runtime/syntax/gpg.vim b/runtime/syntax/gpg.vim
index c7f3584..f132a52 100644
--- a/runtime/syntax/gpg.vim
+++ b/runtime/syntax/gpg.vim
@@ -1,9 +1,13 @@
" Vim syntax file
" Language: gpg(1) configuration file
+" Maintainer: This runtime file is looking for a maintainer.
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2010-10-14
-" Updated: 2023-01-23 @ObserverOfTime: added a couple of keywords
+" Latest Revision: 2024-02-11
+" Updated:
+" 2023-01-23 @ObserverOfTime: added a couple of keywords
" 2023-03-21 Todd Zullinger <tmz@pobox.com>: sync with gnupg-2.4.0
+" 2024-02-10 Daniel Kahn Gillmor <dkg@fifthhorseman.net>:
+" mark use-embedded-filename as warning for security reasons
if exists("b:current_syntax")
finish
@@ -21,7 +25,7 @@ syn region gpgComment contained display oneline start='#' end='$'
syn match gpgID contained display '\<\(0x\)\=\x\{8,}\>'
-syn match gpgBegin display '^' skipwhite nextgroup=gpgComment,gpgOption,gpgCommand
+syn match gpgBegin display '^' skipwhite nextgroup=gpgComment,gpgOption,gpgOptionDeprecated,gpgCommand
syn keyword gpgCommand contained skipwhite nextgroup=gpgArg
\ change-passphrase check-sig check-signatures
@@ -41,6 +45,7 @@ syn keyword gpgCommand contained skipwhite nextgroup=gpgArg
\ quick-set-expire quick-set-primary-uid quick-sign-key
\ quick-update-pref receive-keys recv-keys refresh-keys
\ search-keys show-key show-keys sign-key tofu-policy
+
syn keyword gpgCommand contained skipwhite nextgroup=gpgArgError
\ card-edit card-status change-pin check-trustdb
\ clear-sign clearsign dearmor dearmour decrypt
@@ -97,6 +102,7 @@ syn keyword gpgOption contained skipwhite nextgroup=gpgArg
\ trusted-key trust-model try-secret-key ttyname
\ ttytype ungroup user verify-options weak-digest
\ xauthority
+
syn keyword gpgOption contained skipwhite nextgroup=gpgArgError
\ allow-freeform-uid allow-multiple-messages
\ allow-multisig-verification allow-non-selfsigned-uid
@@ -145,7 +151,7 @@ syn keyword gpgOption contained skipwhite nextgroup=gpgArgError
\ no-sk-comments no-skip-hidden-recipients
\ no-symkey-cache not-dash-escaped no-textmode
\ no-throw-keyids no-tty no-use-agent
- \ no-use-embedded-filename no-utf8-strings no-verbose
+ \ no-utf8-strings no-verbose
\ no-version only-sign-text-ids openpgp
\ override-compliance-check pgp6 pgp7 pgp8
\ preserve-permissions print-dane-records quiet
@@ -155,7 +161,7 @@ syn keyword gpgOption contained skipwhite nextgroup=gpgArgError
\ show-notation show-photos show-policy-url
\ show-session-key sk-comments skip-hidden-recipients
\ skip-verify textmode throw-keyids try-all-secrets
- \ unwrap use-agent use-embedded-filename use-keyboxd
+ \ unwrap use-agent use-keyboxd
\ use-only-openpgp-card utf8-strings verbose version
\ warranty with-colons with-fingerprint
\ with-icao-spelling with-key-data with-keygrip
@@ -164,6 +170,10 @@ syn keyword gpgOption contained skipwhite nextgroup=gpgArgError
\ with-subkey-fingerprints with-tofu-info with-wkd-hash
\ yes
+" depcrated for security reasons
+syn keyword gpgOptionDeprecated contained skipwhite nextgroup=gpgArgError
+ \ use-embedded-filename no-use-embedded-filename
+
syn match gpgArg contained display '\S\+\(\s\+\S\+\)*' contains=gpgID
syn match gpgArgError contained display '\S\+\(\s\+\S\+\)*'
@@ -171,6 +181,7 @@ hi def link gpgComment Comment
hi def link gpgTodo Todo
hi def link gpgID Number
hi def link gpgOption Keyword
+hi def link gpgOptionDeprecated WarningMsg
hi def link gpgCommand Error
hi def link gpgArgError Error
diff --git a/runtime/syntax/i3config.vim b/runtime/syntax/i3config.vim
index d451252..8131639 100644
--- a/runtime/syntax/i3config.vim
+++ b/runtime/syntax/i3config.vim
@@ -2,8 +2,8 @@
" Language: i3 config file
" Original Author: Josef Litos (JosefLitos/i3config.vim)
" Maintainer: Quentin Hibon (github user hiqua)
-" Version: 1.0.0
-" Last Change: 2023-11-11
+" Version: 1.0.2
+" Last Change: 2023-12-28
" References:
" http://i3wm.org/docs/userguide.html#configuring
@@ -137,8 +137,7 @@ syn match i3ConfigIpcKeyword /ipc-socket/ contained
syn match i3ConfigParamLine /^ipc-socket .*$/ contains=i3ConfigIpcKeyword
" 4.24 Focus follows mouse
-syn keyword i3ConfigFocusFollowsMouseOpts always contained
-syn match i3ConfigKeyword /^focus_follows_mouse \(yes\|no\|always\)$/ contains=i3ConfigBoolean,i3ConfigFocusFollowsMouseOpts
+syn match i3ConfigKeyword /^focus_follows_mouse \(yes\|no\)$/ contains=i3ConfigBoolean
" 4.25 Mouse warping
syn keyword i3ConfigMouseWarpingOpts output container none contained
@@ -298,7 +297,6 @@ hi def link i3ConfigWorkspaceDir i3ConfigOption
hi def link i3ConfigDotOperator i3ConfigOperator
hi def link i3ConfigClientOpts i3ConfigOption
hi def link i3ConfigIpcKeyword i3ConfigKeyword
-hi def link i3ConfigFocusFollowsMouseOpts i3ConfigOption
hi def link i3ConfigMouseWarpingOpts i3ConfigOption
hi def link i3ConfigPopupFullscreenOpts i3ConfigOption
hi def link i3ConfigFocusWrappingOpts i3ConfigOption
diff --git a/runtime/syntax/java.vim b/runtime/syntax/java.vim
index 00d6071..fe0cabf 100644
--- a/runtime/syntax/java.vim
+++ b/runtime/syntax/java.vim
@@ -2,7 +2,7 @@
" Language: Java
" Maintainer: Claudio Fleiner <claudio@fleiner.com>
" URL: https://github.com/fleiner/vim/blob/master/runtime/syntax/java.vim
-" Last Change: 2022 Jun 08
+" Last Change: 2024 Mar 22
" Please check :help java.vim for comments on some of the options available.
@@ -37,6 +37,14 @@ syn keyword javaBoolean true false
syn keyword javaConstant null
syn keyword javaTypedef this super
syn keyword javaOperator var new instanceof
+" Since the yield statement, which could take a parenthesised operand,
+" and _qualified_ yield methods get along within the switch block
+" (JLS-17, §3.8), it seems futile to make a region definition for this
+" block; instead look for the _yield_ word alone, and if found,
+" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
+" if necessary, on the line before that (h: \@<=), trying to match
+" neither a method reference nor a qualified method invocation.
+syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
syn keyword javaType boolean char byte short int long float double
syn keyword javaType void
syn keyword javaStatement return
@@ -56,6 +64,7 @@ syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
syn match javaUserLabelRef "\k\+" contained
syn match javaVarArg "\.\.\."
syn keyword javaScopeDecl public protected private abstract
+syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
function s:isModuleInfoDeclarationCurrentBuffer() abort
return fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
@@ -142,32 +151,54 @@ if exists("java_space_errors")
endif
endif
-syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" end="->" matchgroup=NONE end=":" contains=javaNumber,javaCharacter,javaString
-syn match javaUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=javaLabel
-syn keyword javaLabel default
+syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@<!\s*:"he=e-1
+syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
+syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
+" Consider grouped _default_ _case_ labels, i.e.
+" case null, default ->
+" case null: default:
+syn keyword javaLabelDefault contained default
+syn keyword javaLabelVarType contained var
+syn keyword javaLabelCastType contained char byte short int
+" Allow for the contingency of the enclosing region not being able to
+" _keep_ its _end_, e.g. case ':':.
+syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal
+syn match javaLabelNumber contained "\<0\>[lL]\@!"
+syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
+hi def link javaLabelDefault javaLabel
+hi def link javaLabelVarType javaOperator
+hi def link javaLabelNumber javaNumber
+hi def link javaLabelCastType javaType
" highlighting C++ keywords as errors removed, too many people find it
" annoying. Was: if !exists("java_allow_cpp_keywords")
" The following cluster contains all java groups except the contained ones
-syn cluster javaTop add=javaExternal,javaError,javaBranch,javaLabelRegion,javaLabel,javaConditional,javaRepeat,javaBoolean,javaConstant,javaTypedef,javaOperator,javaType,javaStatement,javaStorageClass,javaAssert,javaExceptions,javaMethodDecl,javaClassDecl,javaScopeDecl,javaError2,javaUserLabel,javaLangObject,javaAnnotation,javaVarArg
+syn cluster javaTop add=javaExternal,javaError,javaBranch,javaLabelRegion,javaConditional,javaRepeat,javaBoolean,javaConstant,javaTypedef,javaOperator,javaType,javaStatement,javaStorageClass,javaAssert,javaExceptions,javaMethodDecl,javaClassDecl,javaScopeDecl,javaConceptKind,javaError2,javaUserLabel,javaLangObject,javaAnnotation,javaVarArg
" Comments
syn keyword javaTodo contained TODO FIXME XXX
+
if exists("java_comment_strings")
syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
- syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
+ syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
+ syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
syn match javaCommentCharacter contained "'[^\\]'"
- syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber
- syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber
+ syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
+ syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
endif
-syn region javaComment start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,@Spell
+
+syn region javaComment start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaSpaceError,@Spell
syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
syn match javaCommentStar contained "^\s*\*$"
-syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,@Spell
+syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
+syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr skipwhite
+syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr skipwhite
+syn region javaCommentMarkupTagAttr contained transparent matchgroup=htmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=htmlString end=/\%(=\s*\)\@<=\%("[^"]\+"\|'[^']\+'\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr skipwhite oneline
+hi def link javaCommentMarkupTagAttr htmlArg
hi def link javaCommentString javaString
hi def link javaComment2String javaString
hi def link javaCommentCharacter javaCharacter
@@ -184,15 +215,19 @@ if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
" here.
syntax spell default
- syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaTodo,@Spell
- syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle keepend end="\.$" end="\.[ \t\r<&]"me=e-1 end="[^{]@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,@Spell,javaDocTags,javaDocSeeTag
-
- syn region javaDocTags contained start="{@\(code\|link\|linkplain\|inherit[Dd]oc\|doc[rR]oot\|value\)" end="}"
+ syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaSpaceError,@Spell
+ syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle keepend end="\.$" end="\.[ \t\r<&]"me=e-1 end="[^{]@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag
+ syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
syn match javaDocTags contained "@\(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
syn match javaDocParam contained "\s\S\+"
syn match javaDocTags contained "@\(version\|author\|return\|deprecated\|serial\|serialField\|serialData\)\>"
syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\(\k\|\.\)*\(#\k\+\((\_[^)]\+)\)\=\)\=@ extend
+ syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
+ syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
+ syn region javaDocSnippetTagAttr contained transparent matchgroup=htmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=htmlString end=/:$/ end=/\%(=\s*\)\@<=\%("[^"]\+"\|'[^']\+'\|\%([.-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl
+ syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
+ syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
syntax case match
endif
@@ -202,22 +237,35 @@ syn match javaComment "/\*\*/"
" Strings and constants
syn match javaSpecialError contained "\\."
syn match javaSpecialCharError contained "[^']"
-syn match javaSpecialChar contained "\\\([4-9]\d\|[0-3]\d\d\|[\"\\'ntbrf]\|u\x\{4\}\)"
+" Escape Sequences (JLS-17, §3.10.7):
+syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
-" next line disabled, it can cause a crash for a long line
-"syn match javaStringError +"\([^"\\]\|\\.\)*$+
+syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
+syn match javaTextBlockError +"""\s*"""+
+syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
+syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell
+syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
+" The next line is commented out, it can cause a crash for a long line
+"syn match javaStringError +"\%([^"\\]\|\\.\)*$+
syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
syn match javaCharacter "'\\''" contains=javaSpecialChar
syn match javaCharacter "'[^\\]'"
-syn match javaNumber "\<\(0[bB][0-1]\+\|0[0-7]*\|0[xX]\x\+\|\d\(\d\|_\d\)*\)[lL]\=\>"
-syn match javaNumber "\(\<\d\(\d\|_\d\)*\.\(\d\(\d\|_\d\)*\)\=\|\.\d\(\d\|_\d\)*\)\([eE][-+]\=\d\(\d\|_\d\)*\)\=[fFdD]\="
-syn match javaNumber "\<\d\(\d\|_\d\)*[eE][-+]\=\d\(\d\|_\d\)*[fFdD]\=\>"
-syn match javaNumber "\<\d\(\d\|_\d\)*\([eE][-+]\=\d\(\d\|_\d\)*\)\=[fFdD]\>"
-
-" unicode characters
-syn match javaSpecial "\\u\d\{4\}"
-
-syn cluster javaTop add=javaString,javaCharacter,javaNumber,javaSpecial,javaStringError
+" Integer literals (JLS-17, §3.10.1):
+syn keyword javaNumber 0 0l 0L
+syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
+" Decimal floating-point literals (JLS-17, §3.10.2):
+" Against "\<\d\+\>\.":
+syn match javaNumber "\<\d\%(_*\d\)*\."
+syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
+syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
+syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
+" Hexadecimal floating-point literals (JLS-17, §3.10.2):
+syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
+
+" Unicode characters
+syn match javaSpecial "\\u\x\x\x\x"
+
+syn cluster javaTop add=javaString,javaStrTempl,javaCharacter,javaNumber,javaSpecial,javaStringError,javaTextBlockError
if exists("java_highlight_functions")
if java_highlight_functions == "indent"
@@ -231,26 +279,36 @@ if exists("java_highlight_functions")
" 1. class names are always capitalized (ie: Button)
" 2. method names are never capitalized (except constructors, of course)
"syn region javaFuncDef start=+^\s\+\(\(public\|protected\|private\|static\|abstract\|final\|native\|synchronized\)\s\+\)*\(\(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\(<[^>]*>\)\=\(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*([^0-9]+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses
- syn region javaFuncDef start=+^\s\+\(\(public\|protected\|private\|static\|abstract\|final\|native\|synchronized\)\s\+\)*\(<.*>\s\+\)\?\(\(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\(<[^(){}]*>\)\=\(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*(+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses,javaAnnotation
+ syn region javaFuncDef start=+^\s\+\%(\%(public\|protected\|private\|static\|\%(abstract\|default\)\|final\|native\|synchronized\)\s\+\)*\%(<.*>\s\+\)\?\%(\%(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\%([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\%(<[^(){}]*>\)\=\%(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*(+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses,javaAnnotation
endif
- syn match javaLambdaDef "[a-zA-Z_][a-zA-Z0-9_]*\s*->"
+ syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@<!\s*->"
syn match javaBraces "[{}]"
syn cluster javaTop add=javaFuncDef,javaBraces,javaLambdaDef
endif
if exists("java_highlight_debug")
-
" Strings and constants
- syn match javaDebugSpecial contained "\\\d\d\d\|\\."
+ syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
- syn match javaDebugStringError +"\([^"\\]\|\\.\)*$+
+ syn region javaDebugString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError
+ " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
+ " share one colour by default. Do not conflate unrelated parens.
+ syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
+ syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial
+ syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError
+ " The next line is commented out, it can cause a crash for a long line
+" syn match javaDebugStringError contained +"\%([^"\\]\|\\.\)*$+
+ syn match javaDebugTextBlockError contained +"""\s*"""+
syn match javaDebugCharacter contained "'[^\\]'"
syn match javaDebugSpecialCharacter contained "'\\.'"
syn match javaDebugSpecialCharacter contained "'\\''"
- syn match javaDebugNumber contained "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
- syn match javaDebugNumber contained "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
- syn match javaDebugNumber contained "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
- syn match javaDebugNumber contained "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+ syn keyword javaDebugNumber contained 0 0l 0L
+ syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
+ syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
+ syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
+ syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
+ syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
+ syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
syn keyword javaDebugBoolean contained true false
syn keyword javaDebugType contained null this super
syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
@@ -265,7 +323,9 @@ if exists("java_highlight_debug")
hi def link javaDebug Debug
hi def link javaDebugString DebugString
+ hi def link javaDebugStrTempl Macro
hi def link javaDebugStringError javaError
+ hi def link javaDebugTextBlockError javaDebugStringError
hi def link javaDebugType DebugType
hi def link javaDebugBoolean DebugBoolean
hi def link javaDebugNumber Debug
@@ -326,17 +386,20 @@ hi def link javaStorageClass StorageClass
hi def link javaMethodDecl javaStorageClass
hi def link javaClassDecl javaStorageClass
hi def link javaScopeDecl javaStorageClass
+hi def link javaConceptKind NonText
hi def link javaBoolean Boolean
hi def link javaSpecial Special
hi def link javaSpecialError Error
hi def link javaSpecialCharError Error
hi def link javaString String
+hi def link javaStrTempl Macro
hi def link javaCharacter Character
hi def link javaSpecialChar SpecialChar
hi def link javaNumber Number
hi def link javaError Error
hi def link javaStringError Error
+hi def link javaTextBlockError javaStringError
hi def link javaStatement Statement
hi def link javaOperator Operator
hi def link javaComment Comment
@@ -349,6 +412,8 @@ hi def link javaAnnotation PreProc
hi def link javaCommentTitle SpecialComment
hi def link javaDocTags Special
+hi def link javaDocCodeTag Special
+hi def link javaDocSnippetTag Special
hi def link javaDocParam Function
hi def link javaDocSeeTagParam Function
hi def link javaCommentStar javaComment
@@ -358,6 +423,8 @@ hi def link javaExternal Include
hi def link htmlComment Special
hi def link htmlCommentPart Special
+hi def link htmlArg Type
+hi def link htmlString String
hi def link javaSpaceError Error
if s:isModuleInfoDeclarationCurrentBuffer()
diff --git a/runtime/syntax/lex.vim b/runtime/syntax/lex.vim
index 82197ad..b05148e 100644
--- a/runtime/syntax/lex.vim
+++ b/runtime/syntax/lex.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: Lex and Flex
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Contributor: Robert A. van Engelen <engelen@acm.org>
-" Last Change: Apr 24, 2020
" Version: 18
+" Last Change: Apr 24, 2020
+" 2024 Feb 19 by Vim Project (announce adoption)
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/lisp.vim b/runtime/syntax/lisp.vim
index 90513e3..5350b4d 100644
--- a/runtime/syntax/lisp.vim
+++ b/runtime/syntax/lisp.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: Lisp
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Nov 10, 2021
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 31
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_LISP
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_LISP
"
" Thanks to F Xavier Noria for a list of 978 Common Lisp symbols taken from HyperSpec
" Clisp additions courtesy of http://clisp.cvs.sourceforge.net/*checkout*/clisp/clisp/emacs/lisp.vim
diff --git a/runtime/syntax/mail.vim b/runtime/syntax/mail.vim
index 0cd48fc..9beeba6 100644
--- a/runtime/syntax/mail.vim
+++ b/runtime/syntax/mail.vim
@@ -2,7 +2,7 @@
" Language: Mail file
" Previous Maintainer: Felix von Leitner <leitner@math.fu-berlin.de>
" Maintainer: GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com'
-" Last Change: Wed 14 Aug 2013 08:24:52 AM PDT
+" Last Change: Thu 25 Jan 2024 10:34:02 AM EST
" Quit when a syntax file was already loaded
if exists("b:current_syntax")
@@ -12,6 +12,8 @@ endif
let s:cpo_save = &cpo
set cpo&vim
+syn spell toplevel
+
" The mail header is recognized starting with a "keyword:" line and ending
" with an empty line or other line that can't be in the header. All lines of
" the header are highlighted. Headers of quoted messages (quoted with >) are
@@ -61,6 +63,9 @@ syn region mailVerbatim contains=@mailQuoteExps,@NoSpell keepend start="^\z(\(>
syn match mailURL contains=@NoSpell `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-z0-9/]`
syn match mailEmail contains=@NoSpell "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}"
+" Don't spell emojis
+syn match mailEmoji contains=@NoSpell "\%#=2\v[\U1f300-\U1f64f\U1f900-\U1f9ff]"
+
" Make sure quote markers in regions (header / signature) have correct color
syn match mailQuoteExp1 contained "\v^(\> ?)"
syn match mailQuoteExp2 contained "\v^(\> ?){2}"
@@ -86,14 +91,14 @@ endif
" Define the default highlighting.
hi def link mailVerbatim Special
-hi def link mailHeader Statement
+hi def link mailHeader PreProc
hi def link mailHeaderKey Type
-hi def link mailSignature PreProc
+hi def link mailSignature Comment
hi def link mailHeaderEmail mailEmail
-hi def link mailEmail Special
-hi def link mailURL String
-hi def link mailSubject Title
-hi def link mailQuoted1 Comment
+hi def link mailEmail String
+hi def link mailURL Constant
+hi def link mailSubject Statement
+hi def link mailQuoted1 Function
hi def link mailQuoted3 mailQuoted1
hi def link mailQuoted5 mailQuoted1
hi def link mailQuoted2 Identifier
diff --git a/runtime/syntax/maple.vim b/runtime/syntax/maple.vim
index 78f2b4e..b0bd9aa 100644
--- a/runtime/syntax/maple.vim
+++ b/runtime/syntax/maple.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: Maple V (based on release 4)
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer:Charles E. Campbell
" Last Change: Mar 26, 2019
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 17
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_MAPLE
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_MAPLE
"
" Package Function Selection: {{{1
" Because there are a lot of packages, and because of the potential for namespace
diff --git a/runtime/syntax/netrw.vim b/runtime/syntax/netrw.vim
index 1f02bbe..f5b7fdc 100644
--- a/runtime/syntax/netrw.vim
+++ b/runtime/syntax/netrw.vim
@@ -1,6 +1,8 @@
" Language : Netrw Listing Syntax
-" Maintainer : Charles E. Campbell
-" Last change: Nov 07, 2019
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
+" Last Change: Nov 07, 2019
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version : 20
" ---------------------------------------------------------------------
if exists("b:current_syntax")
diff --git a/runtime/syntax/odin.vim b/runtime/syntax/odin.vim
new file mode 100644
index 0000000..6bf06f6
--- /dev/null
+++ b/runtime/syntax/odin.vim
@@ -0,0 +1,103 @@
+vim9script
+
+# Vim indent plugin file
+# Language: Odin
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Website: https://github.com/habamax/vim-odin
+# Last Change: 2024-01-15
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax keyword odinKeyword using transmute cast distinct opaque where dynamic
+syntax keyword odinKeyword struct enum union const bit_field bit_set
+syntax keyword odinKeyword package proc map import export foreign
+syntax keyword odinKeyword size_of offset_of type_info_of typeid_of type_of align_of
+syntax keyword odinKeyword return defer
+syntax keyword odinKeyword or_return or_else
+syntax keyword odinKeyword inline no_inline
+
+syntax keyword odinConditional if when else do for switch case continue break
+syntax keyword odinType string cstring bool b8 b16 b32 b64 rune any rawptr
+syntax keyword odinType f16 f32 f64 f16le f16be f32le f32be f64le f64be
+syntax keyword odinType u8 u16 u32 u64 u128 u16le u32le u64le u128le u16be
+syntax keyword odinType u32be u64be u128be uint uintptr i8 i16 i32 i64 i128
+syntax keyword odinType i16le i32le i64le i128le i16be i32be i64be i128be
+syntax keyword odinType int complex complex32 complex64 complex128 matrix typeid
+syntax keyword odinType quaternion quaternion64 quaternion128 quaternion256
+syntax keyword odinBool true false
+syntax keyword odinNull nil
+syntax match odinUninitialized '\s\+---\(\s\|$\)'
+
+syntax keyword odinOperator in notin not_in
+syntax match odinOperator "?" display
+syntax match odinOperator "->" display
+
+syntax match odinTodo "TODO" contained
+syntax match odinTodo "XXX" contained
+syntax match odinTodo "FIXME" contained
+syntax match odinTodo "HACK" contained
+
+syntax region odinRawString start=+`+ end=+`+
+syntax region odinChar start=+'+ skip=+\\\\\|\\'+ end=+'+
+syntax region odinString start=+"+ skip=+\\\\\|\\'+ end=+"+ contains=odinEscape
+syntax match odinEscape display contained /\\\([nrt\\'"]\|x\x\{2}\)/
+
+syntax match odinProcedure "\v<\w*>(\s*::\s*proc)@="
+
+syntax match odinAttribute "@\ze\<\w\+\>" display
+syntax region odinAttribute
+ \ matchgroup=odinAttribute
+ \ start="@\ze(" end="\ze)"
+ \ transparent oneline
+
+syntax match odinInteger "\-\?\<\d\+\>" display
+syntax match odinFloat "\-\?\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=" display
+syntax match odinHex "\<0[xX][0-9A-Fa-f]\+\>" display
+syntax match odinDoz "\<0[zZ][0-9a-bA-B]\+\>" display
+syntax match odinOct "\<0[oO][0-7]\+\>" display
+syntax match odinBin "\<0[bB][01]\+\>" display
+
+syntax match odinAddressOf "&" display
+syntax match odinDeref "\^" display
+
+syntax match odinMacro "#\<\w\+\>" display
+
+syntax match odinTemplate "$\<\w\+\>"
+
+syntax region odinLineComment start=/\/\// end=/$/ contains=@Spell,odinTodo
+syntax region odinBlockComment start=/\/\*/ end=/\*\// contains=@Spell,odinTodo,odinBlockComment
+syn sync ccomment odinBlockComment
+
+highlight def link odinKeyword Statement
+highlight def link odinConditional Conditional
+highlight def link odinOperator Operator
+
+highlight def link odinString String
+highlight def link odinRawString String
+highlight def link odinChar Character
+highlight def link odinEscape Special
+
+highlight def link odinProcedure Function
+
+highlight def link odinMacro PreProc
+
+highlight def link odinLineComment Comment
+highlight def link odinBlockComment Comment
+
+highlight def link odinTodo Todo
+
+highlight def link odinAttribute Statement
+highlight def link odinType Type
+highlight def link odinBool Boolean
+highlight def link odinNull Constant
+highlight def link odinUninitialized Constant
+highlight def link odinInteger Number
+highlight def link odinFloat Float
+highlight def link odinHex Number
+highlight def link odinOct Number
+highlight def link odinBin Number
+highlight def link odinDoz Number
+
+b:current_syntax = "odin"
diff --git a/runtime/syntax/quarto.vim b/runtime/syntax/quarto.vim
index d5d4ee2..f83071d 100644
--- a/runtime/syntax/quarto.vim
+++ b/runtime/syntax/quarto.vim
@@ -1,7 +1,9 @@
" Language: Quarto (Markdown with chunks of R, Python and other languages)
-" Provisory Maintainer: Jakson Aquino <jalvesaq@gmail.com>
-" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Fri Feb 24, 2023 08:26AM
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: 2023 Feb 24 08:26AM
+" 2024 Feb 19 by Vim Project (announce adoption)
"
" The developers of tools for Quarto maintain Vim runtime files in their
" Github repository and, if required, I will hand over the maintenance of
diff --git a/runtime/syntax/r.vim b/runtime/syntax/r.vim
index 1932d24..fa73194 100644
--- a/runtime/syntax/r.vim
+++ b/runtime/syntax/r.vim
@@ -1,12 +1,14 @@
" Vim syntax file
" Language: R (GNU S)
-" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
-" Former Maintainers: Vaidotas Zemlys <zemlys@gmail.com>
-" Tom Payne <tom@tompayne.org>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainers: Jakson Aquino <jalvesaq@gmail.com>
+" Vaidotas Zemlys <zemlys@gmail.com>
+" Tom Payne <tom@tompayne.org>
" Contributor: Johannes Ranke <jranke@uni-bremen.de>
-" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Sun Dec 24, 2023 08:05AM
-" Filenames: *.R *.r *.Rhistory *.Rt
+" Former Repository: https://github.com/jalvesaq/R-Vim-runtime
+" Filenames: *.R *.r *.Rhistory *.Rt
+" Last Change: 2023 Dec 24 08:05AM
+" 2024 Feb 19 by Vim Project (announce adoption)
"
" NOTE: The highlighting of R functions might be defined in
" runtime files created by a filetype plugin, if installed.
diff --git a/runtime/syntax/rhelp.vim b/runtime/syntax/rhelp.vim
index 8cac585..7407538 100644
--- a/runtime/syntax/rhelp.vim
+++ b/runtime/syntax/rhelp.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: R Help File
-" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
-" Former Maintainer: Johannes Ranke <jranke@uni-bremen.de>
-" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Tue Jun 28, 2016 08:53AM
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainers: Jakson Aquino <jalvesaq@gmail.com>
+" Johannes Ranke <jranke@uni-bremen.de>
+" Former Repository: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: 2016 Jun 28 08:53AM
+" 2024 Feb 19 by Vim Project (announce adoption)
" Remarks: - Includes R syntax highlighting in the appropriate
" sections if an r.vim file is in the same directory or in the
" default debian location.
diff --git a/runtime/syntax/rmd.vim b/runtime/syntax/rmd.vim
index 7b8b7fe..4b4db1e 100644
--- a/runtime/syntax/rmd.vim
+++ b/runtime/syntax/rmd.vim
@@ -1,7 +1,9 @@
" Language: Markdown with chunks of R, Python and other languages
-" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
-" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Sun Dec 24, 2023 07:21AM
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: 2023 Dec 24 07:21AM
+" 2024 Feb 19 by Vim Project (announce adoption)
"
" For highlighting pandoc extensions to markdown like citations and TeX and
" many other advanced features like folding of markdown sections, it is
diff --git a/runtime/syntax/rpcgen.vim b/runtime/syntax/rpcgen.vim
index 60c9b8c..e5a0b0b 100644
--- a/runtime/syntax/rpcgen.vim
+++ b/runtime/syntax/rpcgen.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: rpcgen
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 13
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_RPCGEN
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_RPCGEN
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim
index a83c020..97e74d2 100644
--- a/runtime/syntax/sh.vim
+++ b/runtime/syntax/sh.vim
@@ -1,10 +1,11 @@
" Vim syntax file
" Language: shell (sh) Korn shell (ksh) bash (sh)
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
-" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
-" Last Change: Feb 28, 2023
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainers: Charles E. Campbell
+" Lennart Schultz <Lennart.Schultz@ecmwf.int>
+" Last Change: 2024 Mar 04 by Vim Project
" Version: 208
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
" For options and settings, please use: :help ft-sh-syntax
" This file includes many ideas from Eric Brunet (eric.brunet@ens.fr) and heredoc fixes from Felipe Contreras
@@ -138,17 +139,17 @@ endif
syn cluster shArithParenList contains=shArithmetic,shArithParen,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor,shFunctionKey,shFunctionOne,shFunctionTwo
syn cluster shArithList contains=@shArithParenList,shParenError
syn cluster shCaseEsacList contains=shCaseStart,shCaseLabel,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
-syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shComment,shDblBrace,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
+syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shComment,shDblBrace,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
if exists("b:is_kornshell") || exists("b:is_bash")
syn cluster shCaseList add=shForPP,shDblParen
endif
syn cluster shCommandSubList contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shComment,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
" COMBAK: removing shEscape from shDblQuoteList fails ksh04:43 -- Jun 09, 2022: I don't see the problem with ksh04, so am reinstating shEscape
-syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
+syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
syn cluster shDerefVarList contains=shDerefOffset,shDerefOp,shDerefVarArray,shDerefOpError
-syn cluster shEchoList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
+syn cluster shEchoList contains=shArithmetic,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
syn cluster shFunctionList contains=@shCommandSubList,shCaseEsac,shColon,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
@@ -159,24 +160,29 @@ endif
syn cluster shHereBeginList contains=@shCommandSubList
syn cluster shHereList contains=shBeginHere,shHerePayload
syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
-syn cluster shIdList contains=shArithmetic,shCommandSub,shCommandSubBQ,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
+syn cluster shIdList contains=shArithmetic,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shIf,shOption,shSet,shTest,shTestOpr,shTouch
if exists("b:is_kornshell") || exists("b:is_bash")
syn cluster shLoopList add=shForPP,shDblParen
endif
-syn cluster shPPSLeftList contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
+syn cluster shPPSLeftList contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shSubshare,shValsub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
syn cluster shPPSRightList contains=shDeref,shDerefSimple,shEscape,shPosnParm
-syn cluster shSubShList contains=@shCommandSubList,shCommandSubBQ,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
-syn cluster shTestList contains=shArithmetic,shCharClass,shCommandSub,shCommandSubBQ,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
+syn cluster shSubShList contains=@shCommandSubList,shCommandSubBQ,shSubshare,shValsub,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
+syn cluster shTestList contains=shArithmetic,shCharClass,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
syn cluster shNoZSList contains=shSpecialNoZS
-syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shArithmetic
+syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shArithmetic
" Echo: {{{1
" ====
" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
-syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
-syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+if exists("b:is_kornshell")
+ syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 end="\ze[ \t\n;]}" contains=@shEchoList skipwhite nextgroup=shQuickComment
+ syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 end="\ze[ \t\n;]}" contains=@shEchoList skipwhite nextgroup=shQuickComment
+else
+ syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+ syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+endif
if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
syn region shEchoDeref contained matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
syn region shEchoDeref contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
@@ -336,6 +342,10 @@ syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shComment
" an Error under /bin/sh. By consensus of vimdev'ers!
if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
+ if exists("b:is_kornshell")
+ syn region shSubshare matchgroup=shCmdSubRegion start="\${\ze[ \t\n<]" skip='\\\\\|\\.' end="\zs[ \t\n;]}" contains=@shCommandSubList
+ syn region shValsub matchgroup=shCmdSubRegion start="\${|" skip='\\\\\|\\.' end="}" contains=@shCommandSubList
+ endif
syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
syn match shSkipInitWS contained "^\s\+"
@@ -343,7 +353,7 @@ if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
elseif !exists("g:sh_no_error")
syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
endif
-syn region shCmdParenRegion matchgroup=shCmdSubRegion start="(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
+syn region shCmdParenRegion matchgroup=shCmdSubRegion start="((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
if exists("b:is_bash")
syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
@@ -491,7 +501,11 @@ if !exists("g:sh_no_error")
syn match shDerefWordError "[^}$[~]" contained
endif
syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
-syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
+if exists("b:is_kornshell")
+ syn region shDeref matchgroup=PreProc start="\${\ze[^ \t\n<|]" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
+else
+ syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
+endif
syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList nextgroup=shSpecialStart
@@ -754,6 +768,8 @@ if !exists("skip_sh_syntax_inits")
hi def link shSnglCase Statement
hi def link shCommandSub Special
hi def link shCommandSubBQ shCommandSub
+ hi def link shSubshare shCommandSub
+ hi def link shValsub shCommandSub
hi def link shComment Comment
hi def link shConditional Conditional
hi def link shCtrlSeq Special
diff --git a/runtime/syntax/shared/debversions.vim b/runtime/syntax/shared/debversions.vim
index 6c944cd..4aec246 100644
--- a/runtime/syntax/shared/debversions.vim
+++ b/runtime/syntax/shared/debversions.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Debian version information
" Maintainer: Debian Vim Maintainers
-" Last Change: 2023 Nov 01
+" Last Change: 2024 Jan 25
" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/shared/debversions.vim
let s:cpo = &cpo
@@ -11,7 +11,7 @@ let g:debSharedSupportedVersions = [
\ 'oldstable', 'stable', 'testing', 'unstable', 'experimental', 'sid', 'rc-buggy',
\ 'bullseye', 'bookworm', 'trixie', 'forky',
\
- \ 'trusty', 'xenial', 'bionic', 'focal', 'jammy', 'lunar', 'mantic', 'noble',
+ \ 'trusty', 'xenial', 'bionic', 'focal', 'jammy', 'mantic', 'noble',
\ 'devel'
\ ]
let g:debSharedUnsupportedVersions = [
@@ -23,7 +23,7 @@ let g:debSharedUnsupportedVersions = [
\ 'gutsy', 'hardy', 'intrepid', 'jaunty', 'karmic', 'lucid',
\ 'maverick', 'natty', 'oneiric', 'precise', 'quantal', 'raring', 'saucy',
\ 'utopic', 'vivid', 'wily', 'yakkety', 'zesty', 'artful', 'cosmic',
- \ 'disco', 'eoan', 'hirsute', 'impish', 'kinetic', 'groovy'
+ \ 'disco', 'eoan', 'hirsute', 'impish', 'kinetic', 'lunar', 'groovy'
\ ]
let &cpo=s:cpo
diff --git a/runtime/syntax/sm.vim b/runtime/syntax/sm.vim
index a16575c..13a5bf1 100644
--- a/runtime/syntax/sm.vim
+++ b/runtime/syntax/sm.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: sendmail
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Oct 25, 2016
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 9
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SM
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SM
if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/spec.vim b/runtime/syntax/spec.vim
index aed04bc..12ce8d5 100644
--- a/runtime/syntax/spec.vim
+++ b/runtime/syntax/spec.vim
@@ -102,7 +102,7 @@ syn case ignore
"%% PreAmble Section %%
"Copyright and Serial were deprecated by License and Epoch
syn region specPreAmbleDeprecated oneline matchgroup=specError start='^\(Copyright\|Serial\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
-syn region specPreAmble oneline matchgroup=specCommand start='^\(Prereq\|Summary\|Name\|Version\|Packager\|Requires\|Recommends\|Suggests\|Supplements\|Enhances\|Icon\|URL\|Source\d*\|Patch\d*\|Prefix\|Packager\|Group\|License\|Release\|BuildRoot\|Distribution\|Vendor\|Provides\|ExclusiveArch\|ExcludeArch\|ExclusiveOS\|Obsoletes\|BuildArch\|BuildArchitectures\|BuildRequires\|BuildConflicts\|BuildPreReq\|Conflicts\|AutoRequires\|AutoReq\|AutoReqProv\|AutoProv\|Epoch\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
+syn region specPreAmble oneline matchgroup=specCommand start='^\(Prereq\|Summary\|Name\|Version\|Packager\|Requires\|Recommends\|Suggests\|Supplements\|Enhances\|Icon\|URL\|SourceLicense\|Source\d*\|Patch\d*\|Prefix\|Packager\|Group\|License\|Release\|BuildRoot\|Distribution\|Vendor\|Provides\|ExclusiveArch\|ExcludeArch\|ExclusiveOS\|Obsoletes\|BuildArch\|BuildArchitectures\|BuildRequires\|BuildConflicts\|BuildPreReq\|Conflicts\|AutoRequires\|AutoReq\|AutoReqProv\|AutoProv\|Epoch\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
"%% Description Section %%
syn region specDescriptionArea matchgroup=specSection start='^%description' end='^%'me=e-1 contains=specDescriptionOpts,specEmail,specURL,specNumber,specMacroIdentifier,specComment
diff --git a/runtime/syntax/swayconfig.vim b/runtime/syntax/swayconfig.vim
index 7b1c889..69fe26d 100644
--- a/runtime/syntax/swayconfig.vim
+++ b/runtime/syntax/swayconfig.vim
@@ -2,8 +2,8 @@
" Language: sway config file
" Original Author: Josef Litos (JosefLitos/i3config.vim)
" Maintainer: James Eapen <james.eapen@vai.org>
-" Version: 1.0.0
-" Last Change: 2023-09-14
+" Version: 1.0.2
+" Last Change: 2023-12-28
" References:
" http://i3wm.org/docs/userguide.html#configuring
@@ -43,6 +43,12 @@ syn region swayConfigExecBlock start=/exec\(_always\)\? {/ end=/^}$/ contains=i3
syn keyword swayConfigFloatingModifierOpts normal inverse contained
syn match i3ConfigKeyword /^floating_modifier [$a-zA-Z0-9+]\+ \(normal\|inverse\)$/ contains=i3ConfigVariable,i3ConfigBindModkey,swayConfigFloatingModifierOpts
+syn keyword swayConfigSmartGapsOpts toggle contained
+syn match i3ConfigKeyword /^smart_gaps toggle$/ contains=i3ConfigSmartGapOpts,i3ConfigBoolean,swayConfigSmartGapsOpts
+
+syn keyword swayConfigFocusFollowsMouseOpts always contained
+syn match i3ConfigKeyword /^focus_follows_mouse always$/ contains=i3ConfigBoolean,swayConfigFocusFollowsMouseOpts
+
syn match i3ConfigKeyword /^hide_edge_borders --i3 \w*$/ contains=i3ConfigEdgeKeyword,i3ConfigShParam
syn keyword i3ConfigBarOpts swaybar_command gaps height pango_markup status_edge_padding status_padding wrap_scroll tray_bindcode tray_bindsym icon_theme contained
@@ -118,7 +124,9 @@ syn region swayConfigOutput start=/^output/ skip=/\\$/ end=/$/ contains=swayCon
syn region swayConfigOutput start=/^output .* {$/ end=/}$/ contains=swayConfigOutputKeyword,swayConfigOutputMode,swayConfigOutputOpts,swayConfigOutputOptVals,i3ConfigVariable,i3ConfigNumber,i3ConfigString,i3ConfigColor,i3ConfigBoolean,swayConfigDeviceOps,i3ConfigParen keepend extend
" Define the highlighting.
+hi def link swayConfigSmartGapsOpts i3ConfigOption
hi def link swayConfigFloatingModifierOpts i3ConfigOption
+hi def link swayConfigFocusFollowsMouseOpts i3ConfigOption
hi def link swayConfigBindKeyword i3ConfigBindKeyword
hi def link swayConfigXOpt i3ConfigOption
hi def link swayConfigInhibitKeyword i3ConfigCommand
diff --git a/runtime/syntax/tags.vim b/runtime/syntax/tags.vim
index 4c06dc1..e87e3fc 100644
--- a/runtime/syntax/tags.vim
+++ b/runtime/syntax/tags.vim
@@ -1,8 +1,10 @@
" Language: tags
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Oct 26, 2016
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 8
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TAGS
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TAGS
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/testdir/README.txt b/runtime/syntax/testdir/README.txt
index 22b6084..9c12648 100644
--- a/runtime/syntax/testdir/README.txt
+++ b/runtime/syntax/testdir/README.txt
@@ -26,14 +26,43 @@ Creating a syntax plugin test
-----------------------------
Create a source file in the language you want to test in the "input"
-directory. Make sure to include some interesting constructs with complicated
-highlighting.
-
-Use the filetype name as the base and a file name extension matching the
-filetype. Let's use Java as an example. The file would then be
+directory. Use the filetype name as the base and a file name extension
+matching the filetype. Let's use Java as an example. The file would then be
"input/java.java".
+Make sure to include some interesting constructs with plenty of complicated
+highlighting. Optionally, pre-configure the testing environment by including
+setup commands at the top of the input file. The format for these lines is:
+
+ VIM_TEST_SETUP {command}
+
+where {command} is any valid Ex command, which extends to the end of the line.
+The first 20 lines of the input file are ALWAYS scanned for setup commands and
+these will be executed before the syntax highlighting is enabled. Typically,
+these lines would be included as comments so as not to introduce any syntax
+errors in the input file but this is not required.
+
+Continuing the Java example:
+
+ // VIM_TEST_SETUP let g:java_space_errors = 1
+ // VIM_TEST_SETUP let g:java_minlines = 5
+ class Test { }
+
+As an alternative, setup commands can be included in an external Vim script
+file in the "input/setup" directory. This script file must have the same base
+name as the input file.
+
+So, the equivalent example configuration using this method would be to create
+an "input/setup/java.vim" script file with the following lines:
+
+ let g:java_space_errors = 1
+ let g:java_minlines = 5
+
+Both inline setup commands and setup scripts may be used at the same time, the
+script file will be sourced before any VIM_TEST_SETUP commands are executed.
+
If there is no further setup required, you can now run the tests:
+
make test
The first time this will fail with an error for a missing screendump. The
@@ -69,8 +98,10 @@ are covered by the test. You can follow these steps:
pass, but if you fixed syntax highlighting that was already visible in the
input file, carefully check that the changes in the screendump are
intentional:
+
let fname = '{name}_99.dump'
call term_dumpdiff('failed/' .. fname, 'dumps/' .. fname)
+
Fix the syntax plugin until the result is good.
2. Edit the input file for your language to add the items you have improved.
(TODO: how to add another screendump?).
@@ -82,6 +113,7 @@ are covered by the test. You can follow these steps:
test" should succeed.
3. Prepare a pull request with the modified files:
- syntax plugin: syntax/{name}.vim
+ - Vim setup file: syntax/testdir/input/setup/{name}.vim (if any)
- test input file: syntax/testdir/input/{name}.{ext}
- test dump files: syntax/testdir/dumps/{name}_99.dump
@@ -91,7 +123,6 @@ test.
-TODO: run test for one specific filetype
-TODO: testing with various option values
+TODO: run test for one specific filetype
TODO: test syncing by jumping around
diff --git a/runtime/syntax/testdir/dumps/c_00.dump b/runtime/syntax/testdir/dumps/c_00.dump
index d32cbd2..ac52727 100644
--- a/runtime/syntax/testdir/dumps/c_00.dump
+++ b/runtime/syntax/testdir/dumps/c_00.dump
@@ -1,4 +1,5 @@
>/+0#0000e05#ffffff0|*| |v|i|:|s|e|t| |t|s|=|8+0#e000002&| +0#0000e05&|s|t|s|=|4+0#e000002&| +0#0000e05&|s|w|=|4+0#e000002&| +0#0000e05&|n|o|e|t|:| +0#0000000&@43
+| +0#0000e05&|*| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |g|:|c|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s| |=| |1+0#e000002&| +0#0000000&@29
| +0#0000e05&|*| +0#0000000&@72
| +0#0000e05&|*| |V|I|M| |-| |V|i| |I|M|p|r|o|v|e|d| @3|b|y| |B|r|a|m| |M|o@1|l|e|n|a@1|r| +0#0000000&@33
| +0#0000e05&|*| +0#0000000&@72
@@ -16,5 +17,4 @@
@32|/+0#0000e05&@1| |c|y|g|w|i|n|_|c|o|n|v|_|p|a|t|h|(|)| +0#0000000&@21
|#+0#e000e06&| |i|n|c|l|u|d|e| |<+0#e000002&|l|i|m|i|t|s|.|h|>| +0#0000000&@54
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
-@75
-|"|i|n|p|u|t|/|c|.|c|"| |1|2@1|L|,| |3|1|7|4|B| @33|1|,|1| @10|T|o|p|
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/c_01.dump b/runtime/syntax/testdir/dumps/c_01.dump
index cd6ae05..dd69a19 100644
--- a/runtime/syntax/testdir/dumps/c_01.dump
+++ b/runtime/syntax/testdir/dumps/c_01.dump
@@ -1,9 +1,10 @@
-|#+0#e000e06#ffffff0| |i|n|c|l|u|d|e| |<+0#e000002&|c|y|g|w|i|n|/|v|e|r|s|i|o|n|.|h|>| +0#0000000&@46
+|#+0#e000e06#ffffff0|i|f|d|e|f| |_@1|C|Y|G|W|I|N|_@1| +0#0000000&@57
+|#+0#e000e06&| |i|n|c|l|u|d|e| |<+0#e000002&|c|y|g|w|i|n|/|v|e|r|s|i|o|n|.|h|>| +0#0000000&@46
|#+0#e000e06&| |i|n|c|l|u|d|e| |<+0#e000002&|s|y|s|/|c|y|g|w|i|n|.|h|>| +0#0000000&@7|/+0#0000e05&@1| |f|o|r| |c|y|g|w|i|n|_|c|o|n|v|_|t|o|_|p|o|s|i|x|_|p|a|t|h|(|)| |a|n|d|/|o|r| +0#0000000&@1
@32|/+0#0000e05&@1| |c|y|g|w|i|n|_|c|o|n|v|_|p|a|t|h|(|)| +0#0000000&@21
|#+0#e000e06&| |i|n|c|l|u|d|e| |<+0#e000002&|l|i|m|i|t|s|.|h|>| +0#0000000&@54
-|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
-> @74
+>#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
+@75
|#+0#e000e06&|i|f| |d|e|f|i|n|e|d|(|M|S|W|I|N|)| |&@1| |(|!|d|e|f|i|n|e|d|(|F|E|A|T|_|G|U|I|_|M|S|W|I|N|)| ||@1| |d|e|f|i|n|e|d|(|V|I|M|D|L@1|)@1| +0#0000000&@7
|#+0#e000e06&| |i|n|c|l|u|d|e| |"+0#e000002&|i|s|c|y|g|p|t|y|.|h|"| +0#0000000&@52
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
@@ -16,5 +17,4 @@
|#+0#e000e06&|d|e|f|i|n|e| |E|D|I|T|_|T|A|G| @3|3+0#e000002&| +0#e000e06&@6|/+0#0000e05&@1| |t|a|g| |n|a|m|e| |a|r|g|u|m|e|n|t| |g|i|v|e|n|,| |u|s|e| |t|a|g|n|a|m|e| +0#0000000&@7
|#+0#e000e06&|d|e|f|i|n|e| |E|D|I|T|_|Q|F| @4|4+0#e000002&| +0#e000e06&@6|/+0#0000e05&@1| |s|t|a|r|t| |i|n| |q|u|i|c|k|f|i|x| |m|o|d|e| +0#0000000&@21
@75
-|#+0#e000e06&|i|f| |(|d|e|f|i|n|e|d|(|U|N|I|X|)| ||@1| |d|e|f|i|n|e|d|(|V|M|S|)@1| |&@1| |!|d|e|f|i|n|e|d|(|N|O|_|V|I|M|_|M|A|I|N|)| +0#0000000&@14
-@57|1|9|,|0|-|1| @7|1|2|%|
+@57|1|9|,|1| @9|1|2|%|
diff --git a/runtime/syntax/testdir/dumps/c_02.dump b/runtime/syntax/testdir/dumps/c_02.dump
index 82820ff..72ab11f 100644
--- a/runtime/syntax/testdir/dumps/c_02.dump
+++ b/runtime/syntax/testdir/dumps/c_02.dump
@@ -1,9 +1,10 @@
-|s+0#00e0003#ffffff0|t|a|t|i|c| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|f|i|l|e|_|o|w|n|e|d|(|c+0#00e0003&|h|a|r| +0#0000000&|*|f|n|a|m|e|)|;| @39
+|#+0#e000e06#ffffff0|i|f| |(|d|e|f|i|n|e|d|(|U|N|I|X|)| ||@1| |d|e|f|i|n|e|d|(|V|M|S|)@1| |&@1| |!|d|e|f|i|n|e|d|(|N|O|_|V|I|M|_|M|A|I|N|)| +0#0000000&@14
+|s+0#00e0003&|t|a|t|i|c| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|f|i|l|e|_|o|w|n|e|d|(|c+0#00e0003&|h|a|r| +0#0000000&|*|f|n|a|m|e|)|;| @39
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|e|r@1|(|i+0#00e0003&|n|t|,+0#0000000&| |c|h|a|r|_|u| |*|)|;| @39
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|e|a|r|l|y|_|a|r|g|_|s|c|a|n|(|m|p|a|r|m|_|T| |*|p|a|r|m|p|)|;| @31
-|#+0#e000e06&|i|f|n|d|e|f| |N|O|_|V|I|M|_|M|A|I|N| +0#0000000&@55
->s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|u|s|a|g|e|(|v+0#00e0003&|o|i|d|)+0#0000000&|;| @50
+>#+0#e000e06&|i|f|n|d|e|f| |N|O|_|V|I|M|_|M|A|I|N| +0#0000000&@55
+|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|u|s|a|g|e|(|v+0#00e0003&|o|i|d|)+0#0000000&|;| @50
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|p|a|r|s|e|_|c|o|m@1|a|n|d|_|n|a|m|e|(|m|p|a|r|m|_|T| |*|p|a|r|m|p|)|;| @27
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|c|o|m@1|a|n|d|_|l|i|n|e|_|s|c|a|n|(|m|p|a|r|m|_|T| |*|p|a|r|m|p|)|;| @28
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|c|h|e|c|k|_|t@1|y|(|m|p|a|r|m|_|T| |*|p|a|r|m|p|)|;| @36
@@ -16,5 +17,4 @@
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|_|s|t|a|r|t|_|g|u|i|(|v+0#00e0003&|o|i|d|)+0#0000000&|;| @41
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|c|h|e|c|k|_|s|w|a|p|_|e|x|i|s|t|s|_|a|c|t|i|o|n|(|v+0#00e0003&|o|i|d|)+0#0000000&|;| @31
|#+0#e000e06&| |i|f|d|e|f| |F|E|A|T|_|E|V|A|L| +0#0000000&@57
-|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|s|e|t|_|p|r|o|g|p|a|t|h|(|c|h|a|r|_|u| |*|a|r|g|v|0|)|;| @34
-@57|3|7|,|1| @9|3|0|%|
+@57|3|7|,|1| @9|2|9|%|
diff --git a/runtime/syntax/testdir/dumps/c_03.dump b/runtime/syntax/testdir/dumps/c_03.dump
index 5f0e8d8..17c6f3b 100644
--- a/runtime/syntax/testdir/dumps/c_03.dump
+++ b/runtime/syntax/testdir/dumps/c_03.dump
@@ -1,9 +1,10 @@
-|s+0#00e0003#ffffff0|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|s|e|t|_|p|r|o|g|p|a|t|h|(|c|h|a|r|_|u| |*|a|r|g|v|0|)|;| @34
+|#+0#e000e06#ffffff0| |i|f|d|e|f| |F|E|A|T|_|E|V|A|L| +0#0000000&@57
+|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|s|e|t|_|p|r|o|g|p|a|t|h|(|c|h|a|r|_|u| |*|a|r|g|v|0|)|;| @34
|#+0#e000e06&| |e|n|d|i|f| +0#0000000&@67
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
@75
-@75
->/+0#0000e05&|*| +0#0000000&@72
+> @74
+|/+0#0000e05&|*| +0#0000000&@72
| +0#0000e05&|*| |D|i|f@1|e|r|e|n|t| |t|y|p|e|s| |o|f| |e|r@1|o|r| |m|e|s@1|a|g|e|s|.| +0#0000000&@37
| +0#0000e05&|*|/| +0#0000000&@71
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|c+0#00e0003&|h|a|r| +0#0000000&|*|(|m|a|i|n|_|e|r@1|o|r|s|[|]|)| |=| @44
@@ -16,5 +17,4 @@
|#+0#e000e06&|d|e|f|i|n|e| |M|E|_|A|R|G|_|M|I|S@1|I|N|G| @9|2+0#e000002&| +0#0000000&@41
@4|N|_|(|"+0#e000002&|G|a|r|b|a|g|e| |a|f|t|e|r| |o|p|t|i|o|n| |a|r|g|u|m|e|n|t|"|)+0#0000000&|,| @34
|#+0#e000e06&|d|e|f|i|n|e| |M|E|_|G|A|R|B|A|G|E| @13|3+0#e000002&| +0#0000000&@41
-|@+0#4040ff13&@2| @71
-| +0#0000000&@56|5@1|,|1| @9|4|7|%|
+@57|5@1|,|0|-|1| @7|4|7|%|
diff --git a/runtime/syntax/testdir/dumps/c_04.dump b/runtime/syntax/testdir/dumps/c_04.dump
index 9864b88..03804a5 100644
--- a/runtime/syntax/testdir/dumps/c_04.dump
+++ b/runtime/syntax/testdir/dumps/c_04.dump
@@ -3,8 +3,8 @@
|#+0#e000e06&|d|e|f|i|n|e| |M|E|_|E|X|T|R|A|_|C|M|D| @11|4+0#e000002&| +0#0000000&@41
@4|N|_|(|"+0#e000002&|I|n|v|a|l|i|d| |a|r|g|u|m|e|n|t| |f|o|r|"|)+0#0000000&|,| @43
|#+0#e000e06&|d|e|f|i|n|e| |M|E|_|I|N|V|A|L|I|D|_|A|R|G| @9|5+0#e000002&| +0#0000000&@41
-|}|;| @72
-> @74
+>}|;| @72
+@75
|#+0#e000e06&|i|f|n|d|e|f| |P|R|O|T|O| @10|/+0#0000e05&@1| |d|o|n|'|t| |w|a|n|t| |a| |p|r|o|t|o|t|y|p|e| |f|o|r| |m|a|i|n|(|)| +0#0000000&@14
@75
|/+0#0000e05&@1| |V|a|r|i|o|u|s| |p|a|r|a|m|e|t|e|r|s| |p|a|s@1|e|d| |b|e|t|w|e@1|n| |m|a|i|n|(|)| |a|n|d| |o|t|h|e|r| |f|u|n|c|t|i|o|n|s|.| +0#0000000&@10
@@ -17,4 +17,4 @@
|#+0#e000e06&|i|f|n|d|e|f| |N|O|_|V|I|M|_|M|A|I|N| @4|/+0#0000e05&@1| |s|k|i|p| |t|h|i|s| |f|o|r| |u|n|i|t@1|e|s|t|s| +0#0000000&@24
@75
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|c|h|a|r|_|u| |*|s|t|a|r|t|_|d|i|r| |=| |N+0#e000002&|U|L@1|;+0#0000000&| @7|/+0#0000e05&@1| |c|u|r@1|e|n|t| |w|o|r|k|i|n|g| |d|i|r| |o|n| |s|t|a|r|t|u|p| +0#0000000&@1
-@57|7|3|,|0|-|1| @7|6|4|%|
+@57|7|3|,|1| @9|6|4|%|
diff --git a/runtime/syntax/testdir/dumps/c_05.dump b/runtime/syntax/testdir/dumps/c_05.dump
index 5b977ea..6871cd0 100644
--- a/runtime/syntax/testdir/dumps/c_05.dump
+++ b/runtime/syntax/testdir/dumps/c_05.dump
@@ -1,9 +1,10 @@
-| +0&#ffffff0@74
+|s+0#00e0003#ffffff0|t|a|t|i|c| +0#0000000&|c|h|a|r|_|u| |*|s|t|a|r|t|_|d|i|r| |=| |N+0#e000002&|U|L@1|;+0#0000000&| @7|/+0#0000e05&@1| |c|u|r@1|e|n|t| |w|o|r|k|i|n|g| |d|i|r| |o|n| |s|t|a|r|t|u|p| +0#0000000&@1
+@75
|s+0#00e0003&|t|a|t|i|c| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|h|a|s|_|d|a|s|h|_|c|_|a|r|g| |=| |F|A|L|S|E|;| @40
@75
|#+0#e000e06&| |i|f|d|e|f| |V|I|M|D|L@1| +0#0000000&@60
-|_@1|d|e|c|l|s|p|e|c|(|d|l@1|e|x|p|o|r|t|)| @53
->#+0#e000e06&| |e|n|d|i|f| +0#0000000&@67
+>_@1|d|e|c|l|s|p|e|c|(|d|l@1|e|x|p|o|r|t|)| @53
+|#+0#e000e06&| |e|n|d|i|f| +0#0000000&@67
@4|i+0#00e0003&|n|t| +0#0000000&@67
|#+0#e000e06&| |i|f|d|e|f| |M|S|W|I|N| +0#0000000&@61
|V|i|m|M|a|i|n| @67
@@ -16,5 +17,4 @@
@4|i+0#00e0003&|n|t| +0#0000000&@8|i|;| @56
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
@75
-@4|/+0#0000e05&|*| +0#0000000&@68
-@57|9|1|,|1| @9|8|2|%|
+@57|9|1|,|1| @9|8|1|%|
diff --git a/runtime/syntax/testdir/dumps/c_06.dump b/runtime/syntax/testdir/dumps/c_06.dump
index fd7fe90..55b9f38 100644
--- a/runtime/syntax/testdir/dumps/c_06.dump
+++ b/runtime/syntax/testdir/dumps/c_06.dump
@@ -1,9 +1,10 @@
-| +0&#ffffff0@3|/+0#0000e05&|*| +0#0000000&@68
+| +0&#ffffff0@74
+@4|/+0#0000e05&|*| +0#0000000&@68
| +0#0000e05&@4|*| |D|o| |a|n|y| |s|y|s|t|e|m|-|s|p|e|c|i|f|i|c| |i|n|i|t|i|a|l|i|s|a|t|i|o|n|s|.| @1|T|h|e|s|e| |c|a|n| |N|O|T| |u|s|e| |I|O|b|u|f@1| |o|r
| @4|*| |N|a|m|e|B|u|f@1|.| @1|T|h|u|s| |e|m|s|g|2|(|)| |c|a|n@1|o|t| |b|e| |c|a|l@1|e|d|!| +0#0000000&@26
| +0#0000e05&@4|*|/| +0#0000000&@67
-@4|m|c|h|_|e|a|r|l|y|_|i|n|i|t|(|)|;| @53
-> @74
+@4>m|c|h|_|e|a|r|l|y|_|i|n|i|t|(|)|;| @53
+@75
@4|/+0#0000e05&@1| |S|o|u|r|c|e| |s|t|a|r|t|u|p| |s|c|r|i|p|t|s|.| +0#0000000&@44
@4|s|o|u|r|c|e|_|s|t|a|r|t|u|p|_|s|c|r|i|p|t|s|(|&|p|a|r|a|m|s|)|;| @38
@75
@@ -16,5 +17,4 @@
|#+0#e000e06&|e|l|s|e| +0#0000000&@69
@4|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|v|i|m|_|m|a|i|n|2|(|)|;| @51
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
-|}| @73
-@57|1|0|9|,|0|-|1| @6|B|o|t|
+@57|1|0|9|,|5| @8|9@1|%|
diff --git a/runtime/syntax/testdir/dumps/c_99.dump b/runtime/syntax/testdir/dumps/c_99.dump
index 14b51cd..1af9a49 100644
--- a/runtime/syntax/testdir/dumps/c_99.dump
+++ b/runtime/syntax/testdir/dumps/c_99.dump
@@ -17,4 +17,4 @@
@4|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|v|i|m|_|m|a|i|n|2|(|)|;| @51
|#+0#e000e06&|e|n|d|i|f| +0#0000000&@68
>}| @73
-@57|1|2@1|,|1| @8|B|o|t|
+@57|1|2|3|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_comments_00.dump b/runtime/syntax/testdir/dumps/java_comments_00.dump
new file mode 100644
index 0000000..bc1f359
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_00.dump
@@ -0,0 +1,20 @@
+>/+0#0000e05#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|i|g|n|o|r|e|_|j+0&#ffd7d7255|a|v|a|d|o|c| +0&#ffffff0|g|:|j|a|v|a|_|n|o|_|t|r|a|i|l|_|s|p|a|c|e|_|e|r@1|o|r| +0#ffffff16#ff404010
+|/+0#0000e05#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|a|b|_|s|p|a|c|e|_|e|r@1|o|r| +0#ffffff16#ff404010@1| +0#0000000#ffffff0@22
+|/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |[|g|:|j|a|v|a|_|s|p|a|c|e|_|e|r@1|o|r|s|,|g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s|]| |=| |[|1+0#e000002&|,+0#0000e05&|1+0#e000002&|]+0#0000e05&| +0#0000000&
+|/+0#0000e05&@1| +0#ffffff16#ff404010| +0#0000e05#ffffff0|V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s+0&#ffd7d7255|e|t|l|o|c|a|l| +0&#ffffff0|s|p|e|l@1| +0#0000000&@41
+|c+0#00e0003&|l|a|s@1| +0#0000000&|C|o|m@1|e|n|t|s|T|e|s|t|s| @55
+|{| @2|/+0#0000e05&|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|T|R|A|I|L|I|N|G| |B|L|A|N|K|S| |A|N|D| |M+0&#ffd7d7255|E|S@1|P|I|L@1|I|N|G|S| +0&#ffffff0|A|R|E| |S|I|G|N|I|F|I|C|A|N|T|!| |*|/| +0#ffffff16#ff404010@3| +0#0000000#ffffff0@10
+@4|/+0#0000e05&|*@1| +0#ffffff16#ff404010| +0#0000000#ffffff0@66
+| +0#0000e05&@4|*| +0#e000e06&|T|h|e| |m|e|t|h|o|d| |{|@|c|o|d|e| |m|a|i|n|}| |m|u|s|t| |b|e| |d|e|c|l|a|r|e|d| |{|@|c|o|d|e| |p|u|b|l|i|c|}|,| |{|@|c|o|d|e| +0#0000000&@4
+| +0#e000e06&@4|*| |s|t|a|t|i|c|}|,| |a|n|d| |{|@|c|o|d|e| |v|o|i|d|}|.| +0#0000e05&@1|I|t| |m|u|s|t| |s|p|e|c|i|f|y| |a| |f|o|r|m|a|l| |p|a|r|a|m|e|t|e|r| +0#0000000&@5
+| +0#0000e05&@4|*| |w|h|o|s|e| |d|e|c|l|a|r|e|d| |t|y|p|e| |i|s| |a|r@1|a|y| |o|f| |{+0#e000e06&|@|l|i|n|k| |S|t|r|i|n|g|}|.+0#0000e05&| @1|T|h|e|r|e|f|o|r|e|,| +0#0000000&@8
+| +0#0000e05&@4|*| |e|i|t|h|e|r| |o|f| |t|h|e| |f|o|l@1|o|w|i|n|g| |d|e|c|l|a|r|a|t|i|o|n|s| |i|s| |a|c@1|e|p|t|a|b|l|e|:| +0#0000000&@16
+| +0#0000e05&@4|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|{+0#e000e06&|@|s|n|i|p@1|e|t| |l+0#00e0003&|a|n|g|=+0#e000e06&|"+0#e000002&|j|a|v|a|"|:+0#e000e06&| +0#0000000&@44
+| +0#e000e06&@4|*| |/@1| |@+0#0000000&|h|i|g|h|l|i|g|h|t| +0#e000e06&|s+0#00e0003&|u|b|s|t|r|i|n|g|=+0#e000e06&|"+0#e000002&|m|a|i|n|"| +0#e000e06&|t+0#00e0003&|y|p|e|=+0#e000e06&|"+0#e000002&|i|t|a|l|i|c|"|:+0#e000e06&| +0#0000000&@22
+| +0#e000e06&@4|*| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| +0#0000000&@25
+| +0#e000e06&@4|*| |}|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>|<|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@39
+| +0#0000e05&@4|*|{+0#e000e06&|@|c|o|d|e| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|.@2| |a|r|g|s|)| |{| |}@1|<+0#00e0e07&|/|p+0#af5f00255&|r|e|>+0#00e0e07&| +0#0000000&@11
+| +0#0000e05&@4|*| +0#0000000&@68
+| +0#0000e05&@4|*| |@+0#e000e06&|p|a|r|a|m| +0#00e0e07&|a|r|g|s| +0#0000e05&|o|p|t|i|o|n|a|l| |c+0&#ffd7d7255|o|m@1|a|n|d|e|-+0&#ffffff0|l|i|n|e| |a|r|g|u|m|e|n|t|s| +0#ffffff16#ff404010| +0#0000000#ffffff0@22
+| +0#0000e05&@4|*| |@|j+0&#ffd7d7255|l|s| +0&#ffffff0|1|2|.|1|.|4| |I|n|v|o|k|e| |{+0#e000e06&|@|c|o|d|e| |T|e|s|t|.|m|a|i|n|}| +0#0000000&@31
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/java_comments_01.dump b/runtime/syntax/testdir/dumps/java_comments_01.dump
new file mode 100644
index 0000000..9f92f83
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_01.dump
@@ -0,0 +1,20 @@
+| +0#e000e06#ffffff0@4|*| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| +0#0000000&@25
+| +0#e000e06&@4|*| |}|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>|<|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@39
+| +0#0000e05&@4|*|{+0#e000e06&|@|c|o|d|e| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|.@2| |a|r|g|s|)| |{| |}@1|<+0#00e0e07&|/|p+0#af5f00255&|r|e|>+0#00e0e07&| +0#0000000&@11
+| +0#0000e05&@4|*| +0#0000000&@68
+| +0#0000e05&@4|*| |@+0#e000e06&|p|a|r|a|m| +0#00e0e07&|a|r|g|s| +0#0000e05&|o|p|t|i|o|n|a|l| |c+0&#ffd7d7255|o|m@1|a|n|d|e|-+0&#ffffff0|l|i|n|e| |a|r|g|u|m|e|n|t|s| +0#ffffff16#ff404010| +0#0000000#ffffff0@22
+| +0#0000e05&@4>*| |@|j+0&#ffd7d7255|l|s| +0&#ffffff0|1|2|.|1|.|4| |I|n|v|o|k|e| |{+0#e000e06&|@|c|o|d|e| |T|e|s|t|.|m|a|i|n|}| +0#0000000&@31
+| +0#0000e05&@4|*|/| +0#0000000&@67
+@4|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |m+0#e000002&|a|i|n| +0#0000000&@47
+@4|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |'+0#e000002&|j|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g|'| +0#0000e05&|:| +0#0000000&@11
+@4|p+0#00e0003&|u|b|l|i|c| +0#0000000&|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| @28
+@4|/+0#0000e05&@1| |@+0#0000000&|e|n|d| @63
+|}| @73
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|9|,|3|-|6| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_comments_99.dump b/runtime/syntax/testdir/dumps/java_comments_99.dump
new file mode 100644
index 0000000..024dc48
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@3|/+0#0000e05&|*@1| +0#ffffff16#ff404010| +0#0000000#ffffff0@66
+| +0#0000e05&@4|*| +0#e000e06&|T|h|e| |m|e|t|h|o|d| |{|@|c|o|d|e| |m|a|i|n|}| |m|u|s|t| |b|e| |d|e|c|l|a|r|e|d| |{|@|c|o|d|e| |p|u|b|l|i|c|}|,| |{|@|c|o|d|e| +0#0000000&@4
+| +0#e000e06&@4|*| |s|t|a|t|i|c|}|,| |a|n|d| |{|@|c|o|d|e| |v|o|i|d|}|.| +0#0000e05&@1|I|t| |m|u|s|t| |s|p|e|c|i|f|y| |a| |f|o|r|m|a|l| |p|a|r|a|m|e|t|e|r| +0#0000000&@5
+| +0#0000e05&@4|*| |w|h|o|s|e| |d|e|c|l|a|r|e|d| |t|y|p|e| |i|s| |a|r@1|a|y| |o|f| |{+0#e000e06&|@|l|i|n|k| |S|t|r|i|n|g|}|.+0#0000e05&| @1|T|h|e|r|e|f|o|r|e|,| +0#0000000&@8
+| +0#0000e05&@4|*| |e|i|t|h|e|r| |o|f| |t|h|e| |f|o|l@1|o|w|i|n|g| |d|e|c|l|a|r|a|t|i|o|n|s| |i|s| |a|c@1|e|p|t|a|b|l|e|:| +0#0000000&@16
+| +0#0000e05&@4|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|{+0#e000e06&|@|s|n|i|p@1|e|t| |l+0#00e0003&|a|n|g|=+0#e000e06&|"+0#e000002&|j|a|v|a|"|:+0#e000e06&| +0#0000000&@44
+| +0#e000e06&@4|*| |/@1| |@+0#0000000&|h|i|g|h|l|i|g|h|t| +0#e000e06&|s+0#00e0003&|u|b|s|t|r|i|n|g|=+0#e000e06&|"+0#e000002&|m|a|i|n|"| +0#e000e06&|t+0#00e0003&|y|p|e|=+0#e000e06&|"+0#e000002&|i|t|a|l|i|c|"|:+0#e000e06&| +0#0000000&@22
+| +0#e000e06&@4|*| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| +0#0000000&@25
+| +0#e000e06&@4|*| |}|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>|<|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@39
+| +0#0000e05&@4|*|{+0#e000e06&|@|c|o|d|e| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|.@2| |a|r|g|s|)| |{| |}@1|<+0#00e0e07&|/|p+0#af5f00255&|r|e|>+0#00e0e07&| +0#0000000&@11
+| +0#0000e05&@4|*| +0#0000000&@68
+| +0#0000e05&@4|*| |@+0#e000e06&|p|a|r|a|m| +0#00e0e07&|a|r|g|s| +0#0000e05&|o|p|t|i|o|n|a|l| |c+0&#ffd7d7255|o|m@1|a|n|d|e|-+0&#ffffff0|l|i|n|e| |a|r|g|u|m|e|n|t|s| +0#ffffff16#ff404010| +0#0000000#ffffff0@22
+| +0#0000e05&@4|*| |@|j+0&#ffd7d7255|l|s| +0&#ffffff0|1|2|.|1|.|4| |I|n|v|o|k|e| |{+0#e000e06&|@|c|o|d|e| |T|e|s|t|.|m|a|i|n|}| +0#0000000&@31
+| +0#0000e05&@4|*|/| +0#0000000&@67
+@4|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |m+0#e000002&|a|i|n| +0#0000000&@47
+@4|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |'+0#e000002&|j|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g|'| +0#0000e05&|:| +0#0000000&@11
+@4|p+0#00e0003&|u|b|l|i|c| +0#0000000&|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| @28
+@4|/+0#0000e05&@1| |@+0#0000000&|e|n|d| @63
+>}| @73
+@57|2|5|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_00.dump b/runtime/syntax/testdir/dumps/java_escapes_00.dump
new file mode 100644
index 0000000..d47fb4c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_00.dump
@@ -0,0 +1,20 @@
+>c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|E|s|c|a|p|e|s|T|e|s|t|s| @56
+|{| @2|/+0#0000e05&@1| |j|a|v|a|p| |-|c|o|n|s|t|a|n|t|s| |E|s|c|a|p|e|s|T|e|s|t|s|.|c|l|a|s@1| +0#0000000&@32
+@4|/+0#0000e05&@1| |s|t|a|t|i|c| |f|i|n|a|l| |S|t|r|i|n|g| |h|e|l@1|o| |=| |"|h|e|l@1|o|"|;| +0#0000000&@31
+@4|\+0#e000e06&|u|0@1|7|3|\|u|0@1|7|4|\|u|0@1|6|1|\|u|0@1|7|4|\|u|0@1|6|9|\|u|0@1|6|3| +0#0000000&@34
+@4|\+0#e000e06&|u|0@1|6@1|\|u|0@1|6|9|\|u|0@1|6|e|\|u|0@1|6|1|\|u|0@1|6|c| +0#0000000&@40
+@4|\+0#e000e06&|u|0@1|5|3|\|u|0@1|7|4|\|u|0@1|7|2|\|u|0@1|6|9|\|u|0@1|6|e|\|u|0@1|6|7| +0#0000000&@34
+@4|\+0#e000e06&|u|0@1|6|8|\|u|0@1|6|5|\|u|0@1|6|c|\|u|0@1|6|c|\|u|0@1|6|f| +0#0000000&@40
+@4|\+0#e000e06&|u|0@1|3|d| +0#0000000&@64
+@4|\+0#e000e06&|u|0@1|2@1|\|u|0@1|6|8|\|u|0@1|6|5|\|u|0@1|6|c|\|u|0@1|6|c|\|u|0@1|6|f|\|u|0@1|2@1| +0#0000000&@28
+@4|\+0#e000e06&|u|0@1|3|b| +0#0000000&@64
+@75
+@4|s+0#00e0003&|t|a|t|i|c| +0#0000000&|{| @62
+@8|c+0#00e0003&|h|a|r| +0#0000000&|e@1|[|]| |=| |{| @53
+@12|'+0#e000002&|\+0#e000e06&|b|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|s|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|t|'+0#e000002&|,+0#0000000&| @45
+@12|'+0#e000002&|\+0#e000e06&|n|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|f|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|r|'+0#e000002&|,+0#0000000&| @45
+@12|'+0#e000002&|\+0#e000e06&|"|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|'|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&@1|'+0#e000002&|,+0#0000000&| @45
+@8|}|;| @64
+@75
+@8|S|y|s|t|e|m|.|o|u|t|.|p|r|i|n|t|l|n|(|n+0#af5f00255&|e|w| +0#0000000&|S|t|r|i|n|g|[|]| |{| @33
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_01.dump b/runtime/syntax/testdir/dumps/java_escapes_01.dump
new file mode 100644
index 0000000..e5080e9
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@11|'+0#e000002&|\+0#e000e06&|b|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|s|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|t|'+0#e000002&|,+0#0000000&| @45
+@12|'+0#e000002&|\+0#e000e06&|n|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|f|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|r|'+0#e000002&|,+0#0000000&| @45
+@12|'+0#e000002&|\+0#e000e06&|"|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|'|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&@1|'+0#e000002&|,+0#0000000&| @45
+@8|}|;| @64
+@75
+@8>S|y|s|t|e|m|.|o|u|t|.|p|r|i|n|t|l|n|(|n+0#af5f00255&|e|w| +0#0000000&|S|t|r|i|n|g|[|]| |{| @33
+@12|"+0#e000002&|\+0#e000e06&|b|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|s|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|t|"+0#e000002&|,+0#0000000&| @45
+@12|"+0#e000002&|\+0#e000e06&|n|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|f|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|r|"+0#e000002&|,+0#0000000&| @45
+@12|"+0#e000002&|\+0#e000e06&|"|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|'|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&@1|"+0#e000002&|,+0#0000000&| @45
+@8|}|)|;| @63
+@75
+@8|c+0#00e0003&|h|a|r| +0#0000000&|o@1|[|]| |=| |{| @53
+@12|'+0#e000002&|\+0#e000e06&|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|'+0#e000002&|,+0#0000000&| @15
+@75
+@8|'+0#e000002&|\+0#e000e06&|0@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|'+0#e000002&|,+0#0000000&| @11
+@75
+@4|'+0#e000002&|\+0#e000e06&|0@2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0@1|7|'+0#e000002&|,+0#0000000&| @7
+@75
+@8|'+0#e000002&|\+0#e000e06&|1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|'+0#e000002&|,+0#0000000&| @11
+@57|1|9|,|3|-|9| @7|1|2|%|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_02.dump b/runtime/syntax/testdir/dumps/java_escapes_02.dump
new file mode 100644
index 0000000..da8b1a9
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|'+0#e000002&|\+0#e000e06&|1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|'+0#e000002&|,+0#0000000&| @11
+@8|'+0#e000002&|\+0#e000e06&|2|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|'+0#e000002&|,+0#0000000&| @11
+@8|'+0#e000002&|\+0#e000e06&|3|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|'+0#e000002&|,+0#0000000&| @11
+@8|'+0#e000002&|\+0#e000e06&|4|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|4|7|'+0#e000002&|,+0#0000000&| @11
+@8|'+0#e000002&|\+0#e000e06&|5|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|5|7|'+0#e000002&|,+0#0000000&| @11
+@8>'+0#e000002&|\+0#e000e06&|6|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|6|7|'+0#e000002&|,+0#0000000&| @11
+@8|'+0#e000002&|\+0#e000e06&|7|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|7@1|'+0#e000002&|,+0#0000000&| @11
+@75
+@4|'+0#e000002&|\+0#e000e06&|0|1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|1|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|0|2|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|2|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|0|3|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|3|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|0|4|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|4|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|0|5|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|5|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|0|6|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|6|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|0|7|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|0|7@1|'+0#e000002&|,+0#0000000&| @7
+@75
+@4|'+0#e000002&|\+0#e000e06&|1|0@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|0|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|1@1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1@1|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|1|2|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|7|'+0#e000002&|,+0#0000000&| @7
+@57|3|7|,|3|-|9| @7|2|9|%|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_03.dump b/runtime/syntax/testdir/dumps/java_escapes_03.dump
new file mode 100644
index 0000000..920ab1c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@3|'+0#e000002&|\+0#e000e06&|1|2|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|2|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|1|3|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|3|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|1|4|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|4|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|1|5|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|5|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|1|6|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|6|7|'+0#e000002&|,+0#0000000&| @7
+@4>'+0#e000002&|\+0#e000e06&|1|7|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|1|7@1|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|0@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|0|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|1|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2@1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2@1|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|3|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|3|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|4|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|4|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|5|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|5|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|6|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|6|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|2|7|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|2|7@1|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|0@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|0|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|1|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|2|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|2|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3@1|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3@1|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|4|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|7|'+0#e000002&|,+0#0000000&| @7
+@57|5@1|,|2|-|5| @7|4|7|%|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_04.dump b/runtime/syntax/testdir/dumps/java_escapes_04.dump
new file mode 100644
index 0000000..79f11f1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@3|'+0#e000002&|\+0#e000e06&|3|4|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|4|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|5|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|5|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|6|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|6|7|'+0#e000002&|,+0#0000000&| @7
+@4|'+0#e000002&|\+0#e000e06&|3|7|0|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|3|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|4|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|5|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7|6|'+0#e000002&|,+0#0000000&| |'+0#e000002&|\+0#e000e06&|3|7@1|'+0#e000002&|,+0#0000000&| @7
+@8|}|;| @64
+> @74
+@8|S|y|s|t|e|m|.|o|u|t|.|p|r|i|n|t|l|n|(|n+0#af5f00255&|e|w| +0#0000000&|S|t|r|i|n|g|[|]| |{| @33
+@12|"+0#e000002&|\+0#e000e06&|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|"+0#e000002&|,+0#0000000&| @15
+@75
+@8|"+0#e000002&|\+0#e000e06&|0@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|"+0#e000002&|,+0#0000000&| @11
+@75
+@4|"+0#e000002&|\+0#e000e06&|0@2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0@1|7|"+0#e000002&|,+0#0000000&| @7
+@75
+@8|"+0#e000002&|\+0#e000e06&|1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|"+0#e000002&|,+0#0000000&| @11
+@8|"+0#e000002&|\+0#e000e06&|2|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|"+0#e000002&|,+0#0000000&| @11
+@8|"+0#e000002&|\+0#e000e06&|3|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|"+0#e000002&|,+0#0000000&| @11
+@8|"+0#e000002&|\+0#e000e06&|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|4|7|"+0#e000002&|,+0#0000000&| @11
+@8|"+0#e000002&|\+0#e000e06&|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|5|7|"+0#e000002&|,+0#0000000&| @11
+@8|"+0#e000002&|\+0#e000e06&|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|7|"+0#e000002&|,+0#0000000&| @11
+@57|7|3|,|0|-|1| @7|6|4|%|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_05.dump b/runtime/syntax/testdir/dumps/java_escapes_05.dump
new file mode 100644
index 0000000..487198a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|"+0#e000002&|\+0#e000e06&|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|6|7|"+0#e000002&|,+0#0000000&| @11
+@8|"+0#e000002&|\+0#e000e06&|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|7@1|"+0#e000002&|,+0#0000000&| @11
+@75
+@4|"+0#e000002&|\+0#e000e06&|0|1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|0|2|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|2|7|"+0#e000002&|,+0#0000000&| @7
+@4>"+0#e000002&|\+0#e000e06&|0|3|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|3|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|0|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|4|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|0|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|5|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|0|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|6|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|0|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|0|7@1|"+0#e000002&|,+0#0000000&| @7
+@75
+@4|"+0#e000002&|\+0#e000e06&|1|0@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|0|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1@1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1@1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1|2|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|2|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1|3|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|3|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|4|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|5|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|6|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|1|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7@1|"+0#e000002&|,+0#0000000&| @7
+@57|9|1|,|2|-|5| @7|8|1|%|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_06.dump b/runtime/syntax/testdir/dumps/java_escapes_06.dump
new file mode 100644
index 0000000..01d73c5
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@3|"+0#e000002&|\+0#e000e06&|1|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|1|7@1|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|0@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2@1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|3|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|7|"+0#e000002&|,+0#0000000&| @7
+@4>"+0#e000002&|\+0#e000e06&|2|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7@1|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|0@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|2|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3@1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7@1|"+0#e000002&|,+0#0000000&| @7
+@8|}|)|;| @63
+@4|}| @69
+@57|1|0|9|,|2|-|5| @6|9@1|%|
diff --git a/runtime/syntax/testdir/dumps/java_escapes_99.dump b/runtime/syntax/testdir/dumps/java_escapes_99.dump
new file mode 100644
index 0000000..617317c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_escapes_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@3|"+0#e000002&|\+0#e000e06&|2|0@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|0|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2@1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2@1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|3|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|3|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|4|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|5|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|6|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|2|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|2|7@1|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|0@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|0|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|2|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|2|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3@1|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3@1|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|4|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|4|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|5|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|5|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|6|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6@1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|6|7|"+0#e000002&|,+0#0000000&| @7
+@4|"+0#e000002&|\+0#e000e06&|3|7|0|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|1|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|2|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|3|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|4|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|5|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7|6|"+0#e000002&|,+0#0000000&| |"+0#e000002&|\+0#e000e06&|3|7@1|"+0#e000002&|,+0#0000000&| @7
+@8|}|)|;| @63
+@4|}| @69
+>}| @73
+@57|1|2|3|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_numbers_00.dump b/runtime/syntax/testdir/dumps/java_numbers_00.dump
new file mode 100644
index 0000000..6ffb5d1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_numbers_00.dump
@@ -0,0 +1,20 @@
+>c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|N|u|m|b|e|r|s|T|e|s|t|s| @56
+|{| @73
+@4|s+0#00e0003&|t|a|t|i|c| +0#0000000&|{| @62
+@8|d+0#00e0003&|o|u|b|l|e|[+0#0000000&|]| |d@1| |=| |{| @51
+@12|0+0#e000002&|x|.|0|p|0|,+0#0000000&| |0+0#e000002&|x|0|.|p|0|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|0|,+0#0000000&| |0+0#e000002&|x|0|P|0|,+0#0000000&| @31
+@12|0+0#e000002&|x|.|0|p|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|p|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|0|d|,+0#0000000&| |0+0#e000002&|x|0|P|0|D|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|p|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|0|f|,+0#0000000&| |0+0#e000002&|x|0|P|0|F|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|0|,+0#0000000&| |0+0#e000002&|x|0|.|p|0|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|0|,+0#0000000&| |0+0#e000002&|x|0|P|0|,+0#0000000&| @31
+@12|0+0#e000002&|x|.|0|p|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|p|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|0|d|,+0#0000000&| |0+0#e000002&|x|0|P|0|D|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|p|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|0|f|,+0#0000000&| |0+0#e000002&|x|0|P|0|F|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|-|0|,+0#0000000&| |0+0#e000002&|x|0|.|p|-|0|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|-|0|,+0#0000000&| |0+0#e000002&|x|0|P|-|0|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|-|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|p|-|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|-|0|d|,+0#0000000&| |0+0#e000002&|x|0|P|-|0|D|,+0#0000000&| @23
+@12|0+0#e000002&|x|.|0|p|-|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|p|-|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|-|0|f|,+0#0000000&| |0+0#e000002&|x|0|P|-|0|F|,+0#0000000&| @23
+@12|0+0#e000002&|x|.|0|p|+|0|,+0#0000000&| |0+0#e000002&|x|0|.|p|+|0|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|+|0|,+0#0000000&| |0+0#e000002&|x|0|P|+|0|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|+|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|p|+|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|+|0|d|,+0#0000000&| |0+0#e000002&|x|0|P|+|0|D|,+0#0000000&| @23
+@12|0+0#e000002&|x|.|0|p|+|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|p|+|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|+|0|f|,+0#0000000&| |0+0#e000002&|x|0|P|+|0|F|,+0#0000000&| @23
+@75
+@12|1+0#e000002&|.|,+0#0000000&| |1+0#e000002&|.|2|,+0#0000000&| |1+0#e000002&|.|2|e|3|,+0#0000000&| |1+0#e000002&|.|2|e|3|d|,+0#0000000&| |1+0#e000002&|.|2|e|3|f|,+0#0000000&| @31
+@16|1+0#e000002&|.|2|e|-|3|,+0#0000000&| |1+0#e000002&|.|2|e|-|3|d|,+0#0000000&| |1+0#e000002&|.|2|E|-|3|F|,+0#0000000&| @33
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/java_numbers_01.dump b/runtime/syntax/testdir/dumps/java_numbers_01.dump
new file mode 100644
index 0000000..a66487a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_numbers_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@11|0+0#e000002&|x|.|0|p|+|0|,+0#0000000&| |0+0#e000002&|x|0|.|p|+|0|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|+|0|,+0#0000000&| |0+0#e000002&|x|0|P|+|0|,+0#0000000&| @27
+@12|0+0#e000002&|x|.|0|p|+|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|p|+|0|d|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|+|0|d|,+0#0000000&| |0+0#e000002&|x|0|P|+|0|D|,+0#0000000&| @23
+@12|0+0#e000002&|x|.|0|p|+|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|p|+|0|f|,+0#0000000&| |0+0#e000002&|x|0|.|0|p|+|0|f|,+0#0000000&| |0+0#e000002&|x|0|P|+|0|F|,+0#0000000&| @23
+@75
+@12|1+0#e000002&|.|,+0#0000000&| |1+0#e000002&|.|2|,+0#0000000&| |1+0#e000002&|.|2|e|3|,+0#0000000&| |1+0#e000002&|.|2|e|3|d|,+0#0000000&| |1+0#e000002&|.|2|e|3|f|,+0#0000000&| @31
+@16>1+0#e000002&|.|2|e|-|3|,+0#0000000&| |1+0#e000002&|.|2|e|-|3|d|,+0#0000000&| |1+0#e000002&|.|2|E|-|3|F|,+0#0000000&| @33
+@16|1+0#e000002&|.|2|e|+|3|,+0#0000000&| |1+0#e000002&|.|2|E|+|3|D|,+0#0000000&| |1+0#e000002&|.|2|e|+|3|f|,+0#0000000&| @33
+@12|.+0#e000002&|2|,+0#0000000&| |.+0#e000002&|2|e|3|,+0#0000000&| |.+0#e000002&|2|e|3|d|,+0#0000000&| |.+0#e000002&|2|e|3|f|,+0#0000000&| @39
+@16|.+0#e000002&|2|e|-|3|,+0#0000000&| |.+0#e000002&|2|e|-|3|d|,+0#0000000&| |.+0#e000002&|2|E|-|3|F|,+0#0000000&| @36
+@16|.+0#e000002&|2|e|+|3|,+0#0000000&| |.+0#e000002&|2|E|+|3|D|,+0#0000000&| |.+0#e000002&|2|e|+|3|f|,+0#0000000&| @36
+@12|1+0#e000002&|e|3|,+0#0000000&| |1+0#e000002&|e|3|d|,+0#0000000&| |1+0#e000002&|e|3|f|,+0#0000000&| @46
+@16|1+0#e000002&|e|-|3|,+0#0000000&| |1+0#e000002&|e|-|3|d|,+0#0000000&| |1+0#e000002&|E|-|3|F|,+0#0000000&| @39
+@16|1+0#e000002&|e|+|3|,+0#0000000&| |1+0#e000002&|E|+|3|D|,+0#0000000&| |1+0#e000002&|e|+|3|f|,+0#0000000&| @39
+@12|1+0#e000002&|d|,+0#0000000&| |1+0#e000002&|D|,+0#0000000&| |1+0#e000002&|f|,+0#0000000&| |1+0#e000002&|F|,+0#0000000&| @47
+@75
+|/+0#0000e05&@3| |M|A|L|F|O|R|M|E|D|:| |:|l|e|t| |g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s| |=| |1| ||| |d|o|a|u|t|o|c|m|d| |S|y|n|t|a|x| +0#0000000&@8
+|/+0#0000e05&@1| @9|0|_|x|.|0|p|0|,| |0|x|.|_|0|p|0|,| |0|x|.|0|_|p|0|,| |0|x|.|0|p|_|0|,| |0|x|.|0|p|0|_|,| +0#0000000&@18
+|/+0#0000e05&@1| @9|0|x|0|_|.|0|p|0|,| |0|x|_|0|.|0|p|0|,| |0|x|p|0|,| +0#0000000&@37
+@8|}|;| @64
+@57|1|9|,|5|-|1|7| @6|1|8|%|
diff --git a/runtime/syntax/testdir/dumps/java_numbers_02.dump b/runtime/syntax/testdir/dumps/java_numbers_02.dump
new file mode 100644
index 0000000..73f2e8e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_numbers_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|}|;| @64
+@75
+@8|i+0#00e0003&|n|t| +0#0000000&|O| |=| |0+0#e000002&|;+0#0000000&| @56
+@8|i+0#00e0003&|n|t| +0#0000000&|O@1| |=| |0+0#e000002&@1|;+0#0000000&| @54
+@8|i+0#00e0003&|n|t| +0#0000000&|O|x|O| |=| |0+0#e000002&|x|0|;+0#0000000&| @52
+> @74
+@8|i+0#00e0003&|n|t| +0#0000000&|x| |=| |0+0#e000002&|x|1|2|_|3|4|5|_|6|7|8|;+0#0000000&| @45
+@8|i+0#00e0003&|n|t| +0#0000000&|y| |=| |0+0#e000002&|b|0|1|_|0|1|_|0|1|_|0|1|_|0|1|;+0#0000000&| @41
+@8|i+0#00e0003&|n|t| +0#0000000&|z| |=| |0+0#e000002&|_@1|1|_@1|2|_@1|3|_@1|4|_@1|5|_@1|6|_@1|7|;+0#0000000&| @35
+@75
+@8|/+0#0000e05&@1| |S|t|r|i|n|g|.|f|o|r|m|a|t|(|"|%|a|"|,| |-|1|.|0|)| +0#0000000&@38
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|m|i|n|u|s|_|o|n|e|_|d| |=| |-|0+0#e000002&|x|1|.|0|p|0|;+0#0000000&| @36
+@75
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|z|_|d| |=| |-|0+0#e000002&|x|.|0|p|0|;+0#0000000&| @45
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|y|_|d| |=| |0+0#e000002&|x|a|p|1|_@1|0|_@1|0|;+0#0000000&| @41
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|x|_|d| |=| |.+0#e000002&|0|_@1|1|_@1|2|_@1|3|_@1|4|_@1|5|_@1|6|_@1|7|_@1|8|_@1|9|;+0#0000000&| @23
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|d|o|t|_|O| |=| |.+0#e000002&|0|;+0#0000000&| @48
+@75
+@8|/+0#0000e05&@1| |J|L|S|,| |§|3|.|1|0|.|2|:| +0#0000000&@50
+@57|3|7|,|0|-|1| @7|4@1|%|
diff --git a/runtime/syntax/testdir/dumps/java_numbers_03.dump b/runtime/syntax/testdir/dumps/java_numbers_03.dump
new file mode 100644
index 0000000..e3b5dba
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_numbers_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|/+0#0000e05&@1| |J|L|S|,| |§|3|.|1|0|.|2|:| +0#0000000&@50
+@8|f+0#00e0003&|l|o|a|t| +0#0000000&|m|a|x|_|d|e|c|_|f| |=| |3+0#e000002&|.|4|0|2|8|2|3|5|e|3|8|f|;+0#0000000&| @34
+@8|f+0#00e0003&|l|o|a|t| +0#0000000&|m|a|x|_|h|e|x|_|f| |=| |0+0#e000002&|x|1|.|f@4|e|P|+|1|2|7|f|;+0#0000000&| @31
+@8|f+0#00e0003&|l|o|a|t| +0#0000000&|m|i|n|_|d|e|c|_|f| |=| |1+0#e000002&|.|4|e|-|4|5|f|;+0#0000000&| @39
+@8|f+0#00e0003&|l|o|a|t| +0#0000000&|m|i|n|_|h|e|x|_|f|_|a| |=| |0+0#e000002&|x|0|.|0@4|2|P|-|1|2|6|f|;+0#0000000&| @29
+@8>f+0#00e0003&|l|o|a|t| +0#0000000&|m|i|n|_|h|e|x|_|f|_|b| |=| |0+0#e000002&|x|1|.|0|P|-|1|4|9|f|;+0#0000000&| @34
+@75
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|m|a|x|_|d|e|c|_|d| |=| |1+0#e000002&|.|7|9|7|6|9|3|1|3|4|8|6|2|3|1|5|7|e|3|_@1|0|_@1|8|;+0#0000000&| @20
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|m|a|x|_|h|e|x|_|d| |=| |0+0#e000002&|x|1|.|f|_|f@3|_|f@3|_|f@3|P|+|1|0|2|3|;+0#0000000&| @20
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|m|i|n|_|d|e|c|_|d| |=| |4+0#e000002&|.|9|e|-|3|_@1|2|_@1|4|;+0#0000000&| @34
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|m|i|n|_|h|e|x|_|d|_|a| |=| |0+0#e000002&|x|0|.|0|_|0@3|_|0@3|_|0@2|1|P|-|1|0|2@1|;+0#0000000&| @18
+@8|d+0#00e0003&|o|u|b|l|e| +0#0000000&|m|i|n|_|h|e|x|_|d|_|b| |=| |0+0#e000002&|x|1|.|0|P|-|1|0|7|4|;+0#0000000&| @33
+@75
+@8|/+0#0000e05&@1| |J|L|S|,| |§|3|.|1|0|.|1|:| +0#0000000&@50
+@8|i+0#00e0003&|n|t| +0#0000000&|m|a|x|_|h|e|x| |=| |0+0#e000002&|x|7|f@2|_|f@3|;+0#0000000&| @40
+@8|i+0#00e0003&|n|t| +0#0000000&|m|a|x|_|o|c|t| |=| |0+0#e000002&|1|7@1|_|7@3|_|7@3|;+0#0000000&| @37
+@8|i+0#00e0003&|n|t| +0#0000000&|m|a|x|_|b|i|n| |=| |0+0#e000002&|b|0|1@2|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|;+0#0000000&| @10
+@75
+@8|i+0#00e0003&|n|t| +0#0000000&|m|i|n|_|h|e|x| |=| |0+0#e000002&|x|8|0@2|_|0@3|;+0#0000000&| @40
+@57|5@1|,|3|-|9| @7|7|1|%|
diff --git a/runtime/syntax/testdir/dumps/java_numbers_04.dump b/runtime/syntax/testdir/dumps/java_numbers_04.dump
new file mode 100644
index 0000000..d03904d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_numbers_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|i+0#00e0003&|n|t| +0#0000000&|m|i|n|_|h|e|x| |=| |0+0#e000002&|x|8|0@2|_|0@3|;+0#0000000&| @40
+@8|i+0#00e0003&|n|t| +0#0000000&|m|i|n|_|o|c|t| |=| |0+0#e000002&|2|0@1|_|0@3|_|0@3|;+0#0000000&| @37
+@8|i+0#00e0003&|n|t| +0#0000000&|m|i|n|_|b|i|n| |=| |0+0#e000002&|b|1|0@2|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|;+0#0000000&| @10
+@75
+@8|i+0#00e0003&|n|t| +0#0000000&|m|i|n|u|s|_|o|n|e|_|h|e|x| |=| |0+0#e000002&|x|f@3|_|f@3|;+0#0000000&| @34
+@8>i+0#00e0003&|n|t| +0#0000000&|m|i|n|u|s|_|o|n|e|_|o|c|t| |=| |0+0#e000002&|3|7@1|_|7@3|_|7@3|;+0#0000000&| @31
+@8|i+0#00e0003&|n|t| +0#0000000&|m|i|n|u|s|_|o|n|e|_|b|i|n| |=| |0+0#e000002&|b|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|;+0#0000000&| @4
+@75
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|a|x|_|h|e|x|_|l| |=| |0+0#e000002&|x|7|f@2|_|f@3|_|f@3|_|f@3|L|;+0#0000000&| @26
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|a|x|_|o|c|t|_|l| |=| |0+0#e000002&|7|_|7@3|_|7@3|_|7@3|_|7@3|_|7@3|L|;+0#0000000&| @20
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|a|x|_|b|i|n|_|l| |=| |0+0#e000002&|b|0|1@2|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@2
+@1|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|L|;+0#0000000&| @41
+@75
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|_|h|e|x|_|l| |=| |0+0#e000002&|x|8|0@2|_|0@3|_|0@3|_|0@3|L|;+0#0000000&| @26
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|_|o|c|t|_|l| |=| |0+0#e000002&|1|0|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|L|;+0#0000000&| @19
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|_|b|i|n|_|l| |=| |0+0#e000002&|b|1|0@2|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@2
+@1|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|L|;+0#0000000&| @41
+@75
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|u|s|_|o|n|e|_|h|e|x|_|l| |=| |0+0#e000002&|x|f@3|_|f@3|_|f@3|_|f@3|L|;+0#0000000&| @20
+@57|7|3|,|3|-|9| @7|9|4|%|
diff --git a/runtime/syntax/testdir/dumps/java_numbers_99.dump b/runtime/syntax/testdir/dumps/java_numbers_99.dump
new file mode 100644
index 0000000..7637b85
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_numbers_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|i+0#00e0003&|n|t| +0#0000000&|m|i|n|u|s|_|o|n|e|_|o|c|t| |=| |0+0#e000002&|3|7@1|_|7@3|_|7@3|;+0#0000000&| @31
+@8|i+0#00e0003&|n|t| +0#0000000&|m|i|n|u|s|_|o|n|e|_|b|i|n| |=| |0+0#e000002&|b|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|;+0#0000000&| @4
+@75
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|a|x|_|h|e|x|_|l| |=| |0+0#e000002&|x|7|f@2|_|f@3|_|f@3|_|f@3|L|;+0#0000000&| @26
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|a|x|_|o|c|t|_|l| |=| |0+0#e000002&|7|_|7@3|_|7@3|_|7@3|_|7@3|_|7@3|L|;+0#0000000&| @20
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|a|x|_|b|i|n|_|l| |=| |0+0#e000002&|b|0|1@2|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@2
+@1|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|L|;+0#0000000&| @41
+@75
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|_|h|e|x|_|l| |=| |0+0#e000002&|x|8|0@2|_|0@3|_|0@3|_|0@3|L|;+0#0000000&| @26
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|_|o|c|t|_|l| |=| |0+0#e000002&|1|0|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|L|;+0#0000000&| @19
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|_|b|i|n|_|l| |=| |0+0#e000002&|b|1|0@2|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@2
+@1|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|_|0@3|L|;+0#0000000&| @41
+@75
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|u|s|_|o|n|e|_|h|e|x|_|l| |=| |0+0#e000002&|x|f@3|_|f@3|_|f@3|_|f@3|L|;+0#0000000&| @20
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|u|s|_|o|n|e|_|o|c|t|_|l| |=| |0+0#e000002&|1|7|_|7@3|_|7@3|_|7@3|_|7@3|_|7@3|L|;+0#0000000&| @13
+@8|l+0#00e0003&|o|n|g| +0#0000000&|m|i|n|u|s|_|o|n|e|_|b|i|n|_|l| |=| |0+0#e000002&|b|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@1
+@2|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|_|1@3|L|;+0#0000000&| @35
+@4|}| @69
+>}| @73
+@57|8@1|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_string_00.dump b/runtime/syntax/testdir/dumps/java_string_00.dump
new file mode 100644
index 0000000..0d2f148
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_00.dump
@@ -0,0 +1,20 @@
+>c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|S|t|r|i|n|g|T|e|s|t|s| @2|/+0#0000e05&@1| |J|D|K| |2|1|+| |(|-@1|e|n|a|b|l|e|-|p|r|e|v|i|e|w| |-@1|r|e|l|e|a|s|e| |2|1|)|.| +0#0000000&@11
+|{| @73
+@4|s+0#00e0003&|t|a|t|i|c| +0#0000000&|{| @62
+@8|S|t|r|i|n|g| |s|1| |=| |"+0#e000002&|A| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| |o|v|e|r| |t|h|e| |l|a|z|y| |d|o|g|"|;+0#0000000&| @10
+@8|S|t|r|i|n|g| |s|2| |=| |"+0#e000002&|\+0#e000e06&|"|W+0#e000002&|o@1|f|\+0#e000e06&|s|!+0#e000002&|\+0#e000e06&|"|"+0#e000002&|;+0#0000000&| @40
+@8|S|t|r|i|n|g| |s|3| |=| |"@2| @51
+| +0#e000002&@11|A|\+0#e000e06&|s|\+0#e000002&| +0#0000000&@58
+| +0#e000002&@11|q|u|i|c|k| |\| +0#0000000&@55
+| +0#e000002&@11|b|r|o|w|n|\+0#e000e06&|s|\+0#e000002&| +0#0000000&@54
+| +0#e000002&@11|f|o|x| |\| +0#0000000&@57
+| +0#e000002&@11|j|u|m|p|s|\+0#e000e06&|s|\+0#e000002&| +0#0000000&@54
+| +0#e000002&@11|o|v|e|r| |\| +0#0000000&@56
+| +0#e000002&@11|t|h|e|\+0#e000e06&|s|\+0#e000002&| +0#0000000&@56
+| +0#e000002&@11|l|a|z|y| |\| +0#0000000&@56
+| +0#e000002&@11|d|o|g|"+0#0000000&@2|;| @55
+@8|S|t|r|i|n|g| |s|4| |=| |"@2| @51
+| +0#e000002&@11|"|W|o@1|f|\+0#e000e06&|s|!+0#e000002&|\+0#e000e06&|"|"+0#0000000&@2|;| @48
+@8|S|t|r|i|n|g| |s|5| |=| |"@2| @51
+| +0#e000002&@7|S|t|r|i|n|g| |s|3| |=| |\+0#e000e06&|"|"+0#e000002&@1| +0#0000000&@50
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/java_string_01.dump b/runtime/syntax/testdir/dumps/java_string_01.dump
new file mode 100644
index 0000000..84b6494
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_01.dump
@@ -0,0 +1,20 @@
+| +0#e000002#ffffff0@11|l|a|z|y| |\| +0#0000000&@56
+| +0#e000002&@11|d|o|g|"+0#0000000&@2|;| @55
+@8|S|t|r|i|n|g| |s|4| |=| |"@2| @51
+| +0#e000002&@11|"|W|o@1|f|\+0#e000e06&|s|!+0#e000002&|\+0#e000e06&|"|"+0#0000000&@2|;| @48
+@8|S|t|r|i|n|g| |s|5| |=| |"@2| @51
+| +0#e000002&@7>S|t|r|i|n|g| |s|3| |=| |\+0#e000e06&|"|"+0#e000002&@1| +0#0000000&@50
+| +0#e000002&@11|A|\+0#e000e06&@1|s+0#e000002&|\+0#e000e06&@1| +0#0000000&@56
+| +0#e000002&@11|q|u|i|c|k| |\+0#e000e06&@1| +0#0000000&@54
+| +0#e000002&@11|b|r|o|w|n|\+0#e000e06&@1|s+0#e000002&|\+0#e000e06&@1| +0#0000000&@52
+| +0#e000002&@11|f|o|x| |\+0#e000e06&@1| +0#0000000&@56
+| +0#e000002&@11|j|u|m|p|s|\+0#e000e06&@1|s+0#e000002&|\+0#e000e06&@1| +0#0000000&@52
+| +0#e000002&@11|o|v|e|r| |\+0#e000e06&@1| +0#0000000&@55
+| +0#e000002&@11|t|h|e|\+0#e000e06&@1|s+0#e000002&|\+0#e000e06&@1| +0#0000000&@54
+| +0#e000002&@11|l|a|z|y| |\+0#e000e06&@1| +0#0000000&@55
+| +0#e000002&@11|d|o|g|\+0#e000e06&|"|"+0#e000002&@1|;|"+0#0000000&@2|;| @50
+@75
+@8|/+0#0000e05&@1| |T|h|e|r|e| |a|r|e| |S|P|A|C|E|,| |F@1|,| |H|T|,| |C|R|,| |a|n|d| |L|F| |a|f|t|e|r| |"@2|.| +0#0000000&@17
+@8|S|t|r|i|n|g| |e|m|p|t|y| |=| |"@2| |^+0#0000e05&|L| +0#0000000&@2|^+0#0000e05&|M| +0#0000000&@40
+| +0#e000002&@11|"+0#0000000&@2|;| @58
+@57|1|9|,|3|-|9| @7|1|5|%|
diff --git a/runtime/syntax/testdir/dumps/java_string_02.dump b/runtime/syntax/testdir/dumps/java_string_02.dump
new file mode 100644
index 0000000..ef6549f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_02.dump
@@ -0,0 +1,20 @@
+| +0#e000002#ffffff0@11|"+0#0000000&@2|;| @58
+@75
+@8|S|y|s|t|e|m|.|o|u|t|.|p|r|i|n|t|l|n|(|"@2| @44
+| +0#e000002&@7|"| +0#0000000&@65
+| +0#e000002&@7|"@1| +0#0000000&@64
+| +0#e000002&@7>"@1|\+0#e000e06&|u|0@1|5|c|"+0#e000002&| +0#0000000&@57
+| +0#e000002&@7|"@1|\+0#e000e06&|u|0@1|5|c|"+0#e000002&@1| +0#0000000&@56
+| +0#e000002&@7|"@1|\+0#e000e06&|"|\|u|0@1|2@1|\|u|0@1|2@1| +0#0000000&@50
+| +0#e000002&@7|"@1|\+0#e000e06&|"|"+0#e000002&@1|\+0#e000e06&|u|0@1|5|c|\|u|0@1|2@1| +0#0000000&@48
+| +0#e000002&@7|"@1|\+0#e000e06&|"|"+0#e000002&@1|\+0#e000e06&|"|"+0#e000002&| +0#0000000&@57
+| +0#e000002&@7|"@1|\+0#e000e06&|"|"+0#e000002&@1|\+0#e000e06&|"|"+0#e000002&|\+0#e000e06&|"|"+0#0000000&@2|)|;| @50
+@75
+@8|S|y|s|t|e|m|.|o|u|t|.|p|r|i|n|t|l|n|(|S|T|R|.|"@2| @40
+| +0#e000e06&@7|"| +0#0000000&@65
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&| +0#0000000&@57
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|{|"+0#e000002&|\+0#e000e06&|u|0@1|5|c|\|u|0@1|2@1|"+0#e000002&|}+0#e000e06&| +0#0000000&@40
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|{|"+0#e000002&|\+0#e000e06&|u|0@1|5|c|\|u|0@1|2@1|"+0#e000002&|}+0#e000e06&|"| +0#0000000&@39
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"|\|{|"+0#e000002&|\+0#e000e06&|u|0@1|5|c|\|u|0@1|2@1|\|u|0@1|5|c|\|u|0@1|2@1|"+0#e000002&|}+0#e000e06&| +0#0000000&@26
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|{|"+0#e000002&|\+0#e000e06&|u|0@1|5|c|\|u|0@1|2@1|"+0#e000002&|}+0#e000e06&| +0#0000000&@29
+@57|3|7|,|3|-|9| @7|3|6|%|
diff --git a/runtime/syntax/testdir/dumps/java_string_03.dump b/runtime/syntax/testdir/dumps/java_string_03.dump
new file mode 100644
index 0000000..9e88372
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_03.dump
@@ -0,0 +1,20 @@
+| +0#e000e06#ffffff0@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|{|"+0#e000002&|\+0#e000e06&|u|0@1|5|c|\|u|0@1|2@1|"+0#e000002&|}+0#e000e06&| +0#0000000&@29
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"@1| +0#0000000&@43
+| +0#e000e06&@7|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"|\|{|"+0#e000002&|\+0#e000e06&|"|\|"|"+0#e000002&|}+0#e000e06&|\|"@1|\|"|"+0#0000000&@2|)|;| @5|/+0#0000e05&@1| |J|D|K| |2|1|+|.| +0#0000000&@19
+@75
+@8|S|t|r|i|n|g| |w|o@1|f| |=| |"+0#e000002&|W|o@1|f|"|,+0#0000000&| |d|o|g| |=| |"+0#e000002&|d|o|g|"|,+0#0000000&| |f|o|x| |=| |"+0#e000002&|f|o|x|"|;+0#0000000&| @19
+> @74
+@8|S|t|r|i|n|g| |s|6| |=| |S|T|R| @51
+@12|.|"+0#e000e06&|A| |q|u|i|c|k| |b|r|o|w|n| |\|{|f+0#0000000&|o|x|}+0#e000e06&| |j|u|m|p|s| |o|v|e|r| |t|h|e| |l|a|z|y| |\|{|d+0#0000000&|o|g|}+0#e000e06&|"|;+0#0000000&| @11
+@8|S|t|r|i|n|g| |s|7| |=| |S|T|R|.|p|r|o|c|e|s@1|(|S|t|r|i|n|g|T|e|m|p|l|a|t|e|.|R|A|W| @24
+@12|.|"+0#e000e06&|\|"|\|{|w+0#0000000&|o@1|f|}+0#e000e06&|\|s|!|\|"@1|)+0#0000000&|;| @43
+@8|S|t|r|i|n|g| |s|8| |=| |S|T|R|.|"@2| @47
+| +0#e000e06&@11|A|\|s|\| +0#0000000&@58
+| +0#e000e06&@11|q|u|i|c|k| |\| +0#0000000&@55
+| +0#e000e06&@11|b|r|o|w|n|\|s|\| +0#0000000&@54
+| +0#e000e06&@11|\|{|f+0#0000000&|o|x|}+0#e000e06&| |\| +0#0000000&@54
+| +0#e000e06&@11|j|u|m|p|s|\|s|\| +0#0000000&@54
+| +0#e000e06&@11|o|v|e|r| |\| +0#0000000&@56
+| +0#e000e06&@11|t|h|e|\|s|\| +0#0000000&@56
+| +0#e000e06&@11|l|a|z|y| |\| +0#0000000&@56
+@57|5@1|,|0|-|1| @7|5|7|%|
diff --git a/runtime/syntax/testdir/dumps/java_string_04.dump b/runtime/syntax/testdir/dumps/java_string_04.dump
new file mode 100644
index 0000000..4336a92
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_04.dump
@@ -0,0 +1,20 @@
+| +0#e000e06#ffffff0@11|l|a|z|y| |\| +0#0000000&@56
+| +0#e000e06&@11|\|{|d+0#0000000&|o|g|}+0#e000e06&|"+0#0000000&@2|;| @52
+@8|S|t|r|i|n|g| |s|9| |=| |S|T|R|.|p|r|o|c|e|s@1|(|S|t|r|i|n|g|T|e|m|p|l|a|t|e|.|R|A|W| @24
+@12|.| @61
+@12|"@2| @59
+| +0#e000e06&@11>"|\|{|w+0#0000000&|o@1|f|}+0#e000e06&|\|s|!|\|"|"+0#0000000&@2|)|;| @44
+@8|S|t|r|i|n|g| |s|1|0| |=| |j|a|v|a|.|u|t|i|l|.|F|o|r|m|a|t|P|r|o|c|e|s@1|o|r|.|F|M|T| @24
+@12|.| |"+0#e000e06&|%|-|1|4|s|\|{|"+0#e000002&|A|\+0#e000e06&|s|"+0#e000002&| +0#0000000&|+| |S|T|R| |.| |"+0#e000e06&|q|u|i|c|k|"| +0#0000000&|+| |"+0#e000002&|b|r|o|w|n|"|}+0#e000e06&|%|s|\|{|f+0#0000000&|o|x|}+0#e000e06&| |"| +0#0000000&@10
+@12|+| |j|a|v|a|.|u|t|i|l|.|F|o|r|m|a|t|P|r|o|c|e|s@1|o|r|.|F|M|T| @31
+@12|.| |"+0#e000e06&|%|-|2|0|s|\|{|"+0#e000002&|j|u|m|p|s|\+0#e000e06&|s|o+0#e000002&|v|e|r| |t|h|e|\+0#e000e06&|s|"+0#e000002&| +0#0000000&@33
+@20|+| |S|T|R| |.| |"+0#e000e06&|l|a|z|y|"|}|%|s|\|{|d+0#0000000&|o|g|}+0#e000e06&|"|;+0#0000000&| @29
+@8|S|t|r|i|n|g| |s|1@1| |=| |S|T|R|.|"@2| @46
+| +0#e000e06&@11|\|"|\|{| +0#0000000&@11|/+0#0000e05&@1| |A| |n|e|s|t|e|d| |c|o|m@1|e|n|t|.| +0#0000000&@26
+@8|(|n+0#af5f00255&|e|w| +0#0000000&|j|a|v|a|.|u|t|i|l|.|f|u|n|c|t|i|o|n|.|F|u|n|c|t|i|o|n|<|S|t|r|i|n|g|,| |S|t|r|i|n|g|>|(|)| |{| @14
+@12|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |a|p@1|l|y|(|S|t|r|i|n|g| |b|a|y|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|b|a|y|;| |}|;| @14
+@8|}|)|.|a|p@1|l|y|(|w|o@1|f|)| @52
+@12|}+0#e000e06&|\|s|!|\|"|"+0#0000000&@2|;| @52
+@8|S|t|r|i|n|g| |s|1|2| |=| |j|a|v|a|.|u|t|i|l|.|F|o|r|m|a|t|P|r|o|c|e|s@1|o|r|.|F|M|T| @24
+@12|.|"@2| @58
+@57|7|3|,|4|-|1|3| @6|7|8|%|
diff --git a/runtime/syntax/testdir/dumps/java_string_05.dump b/runtime/syntax/testdir/dumps/java_string_05.dump
new file mode 100644
index 0000000..47804a9
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@11|.|"@2| @58
+| +0#e000e06&@11|%|-|1|4|s|\|{|S+0#0000000&|T|R|.|"@2| @48
+| +0#e000e06&@15|A|\|s|\| +0#0000000&@54
+| +0#e000e06&@15|\|{| +0#0000000&|"+0#e000002&|q|u|i|c|k|"| +0#0000000&|}+0#e000e06&| |\| +0#0000000&@44
+| +0#e000e06&@15|b|r|o|w|n|"+0#0000000&@2|}+0#e000e06&|\| +0#0000000&@48
+| +0#e000e06&@11>%|s|\|{| +0#0000000&|f|o|x| |}+0#e000e06&| |\| +0#0000000&@50
+| +0#e000e06&@11|%|-|2|0|s|\|{|S+0#0000000&|T|R|.|"@2| @48
+| +0#e000e06&@15|j|u|m|p|s|\|s|\| +0#0000000&@50
+| +0#e000e06&@15|o|v|e|r| |\| +0#0000000&@52
+| +0#e000e06&@15|t|h|e|\|s|\| +0#0000000&@52
+| +0#e000e06&@15|\|{| +0#0000000&|"+0#e000002&|l|a|z|y|"| +0#0000000&|}+0#e000e06&| |"+0#0000000&@2|}+0#e000e06&|\| +0#0000000&@41
+| +0#e000e06&@11|%|s|\|{| +0#0000000&|d|o|g| |}+0#e000e06&|"+0#0000000&@2|;| @48
+@8|S|t|r|i|n|g| |s|1|3| |=| |S|T|R| @50
+@12|.|"+0#e000e06&|\|"|\|{| +0#0000000&@9|/+0#0000e05&|*| |A| |n|e|s|t|e|d| |c|o|m@1|e|n|t|.| |*|/| +0#0000000&@23
+@8|(@1|j|a|v|a|.|u|t|i|l|.|f|u|n|c|t|i|o|n|.|F|u|n|c|t|i|o|n|<|S|t|r|i|n|g|,| |S|t|r|i|n|g|>|)| |b|a|y| |-|>| |b|a|y|)| @8
+@28|.|a|p@1|l|y|(|w|o@1|f|)| @34
+@12|}+0#e000e06&|\|s|!|\|"@1|;+0#0000000&| @54
+@4|}| @69
+|}| @73
+@57|9|1|,|4|-|1|3| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_string_99.dump b/runtime/syntax/testdir/dumps/java_string_99.dump
new file mode 100644
index 0000000..a401ad6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_string_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@11|.|"@2| @58
+| +0#e000e06&@11|%|-|1|4|s|\|{|S+0#0000000&|T|R|.|"@2| @48
+| +0#e000e06&@15|A|\|s|\| +0#0000000&@54
+| +0#e000e06&@15|\|{| +0#0000000&|"+0#e000002&|q|u|i|c|k|"| +0#0000000&|}+0#e000e06&| |\| +0#0000000&@44
+| +0#e000e06&@15|b|r|o|w|n|"+0#0000000&@2|}+0#e000e06&|\| +0#0000000&@48
+| +0#e000e06&@11|%|s|\|{| +0#0000000&|f|o|x| |}+0#e000e06&| |\| +0#0000000&@50
+| +0#e000e06&@11|%|-|2|0|s|\|{|S+0#0000000&|T|R|.|"@2| @48
+| +0#e000e06&@15|j|u|m|p|s|\|s|\| +0#0000000&@50
+| +0#e000e06&@15|o|v|e|r| |\| +0#0000000&@52
+| +0#e000e06&@15|t|h|e|\|s|\| +0#0000000&@52
+| +0#e000e06&@15|\|{| +0#0000000&|"+0#e000002&|l|a|z|y|"| +0#0000000&|}+0#e000e06&| |"+0#0000000&@2|}+0#e000e06&|\| +0#0000000&@41
+| +0#e000e06&@11|%|s|\|{| +0#0000000&|d|o|g| |}+0#e000e06&|"+0#0000000&@2|;| @48
+@8|S|t|r|i|n|g| |s|1|3| |=| |S|T|R| @50
+@12|.|"+0#e000e06&|\|"|\|{| +0#0000000&@9|/+0#0000e05&|*| |A| |n|e|s|t|e|d| |c|o|m@1|e|n|t|.| |*|/| +0#0000000&@23
+@8|(@1|j|a|v|a|.|u|t|i|l|.|f|u|n|c|t|i|o|n|.|F|u|n|c|t|i|o|n|<|S|t|r|i|n|g|,| |S|t|r|i|n|g|>|)| |b|a|y| |-|>| |b|a|y|)| @8
+@28|.|a|p@1|l|y|(|w|o@1|f|)| @34
+@12|}+0#e000e06&|\|s|!|\|"@1|;+0#0000000&| @54
+@4|}| @69
+>}| @73
+@57|1|0|4|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_switch_00.dump b/runtime/syntax/testdir/dumps/java_switch_00.dump
new file mode 100644
index 0000000..95e0142
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_00.dump
@@ -0,0 +1,20 @@
+>c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|S|w|i|t|c|h|T|e|s|t|s| @2|/+0#0000e05&@1| |J|D|K| |2|1|+|.| +0#0000000&@43
+|{| @73
+@4|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|e|c|h|o|(|O|b|j|e|c|t| |o|)| |{| |S|y|s|t|e|m|.|o|u|t|.|p|r|i|n|t|l|n|(|o|)|;| |}| @17
+@75
+@4|s+0#00e0003&|t|a|t|i|c| +0#0000000&|{| @62
+@8|i+0#00e0003&|n|t|e|r|f|a|c|e| +0#0000000&|Y|i|e|l|d|a|b|l|e|<|T|>| @44
+@8|{| @65
+@12|T| |y+0#af5f00255&|i|e|l|d|(+0#0000000&|)|;| @52
+@12|d+0#4040ff13&|e|f|a|u|l|t| +0#0000000&|Y|i|e|l|d|a|b|l|e|<|T|>| |d|e|f|a|u|l|t|_|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|t+0#00e0003&|h|i|s|;+0#0000000&| |}| @14
+@12|d+0#4040ff13&|e|f|a|u|l|t| +0#0000000&|Y|i|e|l|d|a|b|l|e|<|T|>| |w|h|e|n|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|t+0#00e0003&|h|i|s|;+0#0000000&| |}| @18
+@8|}| @65
+@75
+@8|/+0#0000e05&@1| |T|h|e|r|e| |a|r|e| |8|0| |b|y|t|e|s| |(|\|@|8|0|<|!|)| |b|e|t|w|e@1|n| |"|:@1|"| |a|n|d| |"|y|i|e|l|d|;|"|.| +0#0000000&@9
+@8|Y|i|e|l|d|a|b|l|e|<|?|>| |y| |=| |(@1|Y|i|e|l|d|a|b|l|e|<|?|>|)| |(|)| |-|>| |0+0#e000002&|)+0#0000000&|:@1| @23
+@75
+@4|y|i|e|l|d|;| @64
+@8|(@1|Y|i|e|l|d|a|b|l|e|<|?|>|)| |(|)| |-|>| |0+0#e000002&|)+0#0000000&|.|w|h|e|n|(|)|.|d|e|f|a|u|l|t|_|(|)|.|y|i|e|l|d|(|)|;| @15
+@75
+@8|e+0#00e0003&|n|u|m| +0#0000000&|L|e|t@1|e|r|s| |{| |O|T|H|E|R|,| |A|L|P|H|A|,| |B|E|T|A| |}| @31
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/java_switch_01.dump b/runtime/syntax/testdir/dumps/java_switch_01.dump
new file mode 100644
index 0000000..0a76a87
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@4|y|i|e|l|d|;| @64
+@8|(@1|Y|i|e|l|d|a|b|l|e|<|?|>|)| |(|)| |-|>| |0+0#e000002&|)+0#0000000&|.|w|h|e|n|(|)|.|d|e|f|a|u|l|t|_|(|)|.|y|i|e|l|d|(|)|;| @15
+@75
+@8|e+0#00e0003&|n|u|m| +0#0000000&|L|e|t@1|e|r|s| |{| |O|T|H|E|R|,| |A|L|P|H|A|,| |B|E|T|A| |}| @31
+> @74
+@8|L|e|t@1|e|r|s| |w|h|e|n| |=| |L|e|t@1|e|r|s|.|O|T|H|E|R|;| @37
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|w|h|e|n|)| |{| @51
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|A|L|P|H|A|:| |{| |e|c|h|o|(|L|e|t@1|e|r|s|.|A|L|P|H|A|)|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @23
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|B|E|T|A|:| @1|{| |e|c|h|o|(|L|e|t@1|e|r|s|.|B|E|T|A|)|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @24
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @3|{| |e|c|h|o|(|L|e|t@1|e|r|s|.|O|T|H|E|R|)|;| |}| @30
+@8|}| @65
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|w|h|e|n|)| |{| @46
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|A|L|P|H|A| @1|-|>| |L|e|t@1|e|r|s|.|A|L|P|H|A|;| @33
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|B|E|T|A| @2|-|>| |L|e|t@1|e|r|s|.|B|E|T|A|;| @34
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@4|-|>| |{| |y+0#af5f00255&|i|e|l|d|(+0#0000000&|L|e|t@1|e|r|s|.|O|T|H|E|R|)|;| |}| @22
+@8|}|)|;| @63
+@57|1|9|,|0|-|1| @7|1|3|%|
diff --git a/runtime/syntax/testdir/dumps/java_switch_02.dump b/runtime/syntax/testdir/dumps/java_switch_02.dump
new file mode 100644
index 0000000..cf213ed
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|}|)|;| @63
+@75
+@8|S|t|r|i|n|g| |y+0#af5f00255&|i|e|l|d| +0#0000000&|=| |n+0#e000002&|u|l@1|;+0#0000000&| @46
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|y+0#af5f00255&|i|e|l|d|)+0#0000000&| |{| @50
+@8>c+0#af5f00255&|a|s|e| +0#0000000&|"+0#e000002&|A|"|:+0#0000000&| |c+0#af5f00255&|a|s|e| +0#0000000&|"+0#e000002&|B|"|:+0#0000000&| |{| |e|c|h|o|(|"+0#e000002&|A| |o|r| |B|"|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @20
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|"+0#e000002&|:|"|:+0#0000000&| @6|{| |e|c|h|o|(|"+0#e000002&|C|o|l|o|n|"|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @25
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|S|t|r|i|n|g| |s|t|r| |w+0#af5f00255&|h|e|n| +0#0000000&|!|s|t|r|.|e|q|u|a|l|s|(|"+0#e000002&@1|)+0#0000000&|:| @29
+@20|{| |e|c|h|o|(|"+0#e000002&|<|n|o|n|-|e|m|p|t|y|>|"|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @23
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|n+0#e000002&|u|l@1|:+0#0000000&| |d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| |{| |e|c|h|o|(|"+0#e000002&|O|t|h|e|r|"|)+0#0000000&|;| |}| @28
+@8|}| @65
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|y+0#af5f00255&|i|e|l|d|)+0#0000000&| |{| @45
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|"+0#e000002&|A|"|,+0#0000000&| |"+0#e000002&|B|"| +0#0000000&@6|-|>| |{| |y+0#af5f00255&|i|e|l|d|(+0#0000000&|"+0#e000002&|A| |o|r| |B|"|)+0#0000000&|;| |}| @19
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|"+0#e000002&|-|>|"| +0#0000000&@6|-|>| |"+0#e000002&|A|r@1|o|w|"|;+0#0000000&| @35
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|S|t|r|i|n|g| |s|t|r| |w+0#af5f00255&|h|e|n| +0#0000000&|!|s|t|r|.|e|q|u|a|l|s|(|"+0#e000002&@1|)+0#0000000&| @26
+@24|-|>| |"+0#e000002&|<|n|o|n|-|e|m|p|t|y|>|"|;+0#0000000&| @33
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|n+0#e000002&|u|l@1|,+0#0000000&| |d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@1|-|>| |"+0#e000002&|O|t|h|e|r|"|;+0#0000000&| @31
+@8|}|)|;| @63
+@57|3|7|,|3|-|9| @7|3|0|%|
diff --git a/runtime/syntax/testdir/dumps/java_switch_03.dump b/runtime/syntax/testdir/dumps/java_switch_03.dump
new file mode 100644
index 0000000..7766af3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|}|)|;| @63
+@75
+@8|O|b|j|e|c|t| |o| |=| |n+0#af5f00255&|e|w| +0#0000000&|O|b|j|e|c|t|(|)|;| @42
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|o|)| |{| @54
+@8>c+0#af5f00255&|a|s|e| +0#0000000&|n+0#e000002&|u|l@1|:+0#0000000&| @5|{| |e|c|h|o|(|"+0#e000002&|n|u|l@1|"|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @26
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|L|e|t@1|e|r|s|[|]| |l@1|:| @1|{| |e|c|h|o|(|"+0#e000002&|S|w|i|t|c|h|T|e|s|t|s|$|1|L|e|t@1|e|r|s|[|]|"|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @4
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @7|{| |e|c|h|o|(|"+0#e000002&|j|a|v|a|.|l|a|n|g|.|O|b|j|e|c|t|"|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @14
+@8|}|;| @64
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|o|)| |{| @49
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|n+0#e000002&|u|l@1| +0#0000000&@6|-|>| |"+0#e000002&|n|u|l@1|"|;+0#0000000&| @36
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|L|e|t@1|e|r|s|[|]| |l@1| @2|-|>| |"+0#e000002&|S|w|i|t|c|h|T|e|s|t|s|$|1|L|e|t@1|e|r|s|[|]|"|;+0#0000000&| @14
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@8|-|>| |"+0#e000002&|j|a|v|a|.|l|a|n|g|.|O|b|j|e|c|t|"|;+0#0000000&| @24
+@8|}|)|;| @63
+@75
+@8|c+0#00e0003&|h|a|r| +0#0000000&|c|h| |=| |'+0#e000002&|c|'|;+0#0000000&| @52
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|c|h|)| |{| @53
+@57|5@1|,|3|-|9| @7|4|7|%|
diff --git a/runtime/syntax/testdir/dumps/java_switch_04.dump b/runtime/syntax/testdir/dumps/java_switch_04.dump
new file mode 100644
index 0000000..38dfe40
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|c|h|)| |{| @53
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|'+0#e000002&|a|'|:+0#0000000&| @6|{| |e|c|h|o|(|'+0#e000002&|a|'|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @29
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|'+0#e000002&|b|'|:+0#0000000&| @6|{| |e|c|h|o|(|'+0#e000002&|b|'|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @29
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @7|{| |e|c|h|o|(|'+0#e000002&|\+0#e000e06&|u|0@3|'+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @24
+@8|}|;| @64
+> @74
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|c|h|)| |{| @48
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|'+0#e000002&|a|'| +0#0000000&@3|-|>| |'+0#e000002&|a|'|;+0#0000000&| @43
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|'+0#e000002&|b|'| +0#0000000&@3|-|>| |'+0#e000002&|b|'|;+0#0000000&| @43
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@4|-|>| |'+0#e000002&|\+0#e000e06&|u|0@3|'+0#e000002&|;+0#0000000&| @38
+@8|}|)|;| @63
+@75
+@8|b+0#00e0003&|y|t|e| +0#0000000&|b| |=| |(|b+0#00e0003&|y|t|e|)+0#0000000&| |2+0#e000002&|;+0#0000000&| @48
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|b|)| |{| @54
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |0+0#e000002&|)+0#0000000&|:| @3|{| |e|c|h|o|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |0+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @20
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |1+0#e000002&|)+0#0000000&|:| @3|{| |e|c|h|o|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @20
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @7|{| |e|c|h|o|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |-|1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @23
+@8|}|;| @64
+@57|7|3|,|0|-|1| @7|6|5|%|
diff --git a/runtime/syntax/testdir/dumps/java_switch_05.dump b/runtime/syntax/testdir/dumps/java_switch_05.dump
new file mode 100644
index 0000000..3a25667
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|}|;| @64
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|b|)| |{| @49
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |0+0#e000002&|)+0#0000000&| |-|>| |(|b+0#00e0003&|y|t|e|)+0#0000000&| |0+0#e000002&|;+0#0000000&| @34
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|b+0#00e0003&|y|t|e|)+0#0000000&| |1+0#e000002&|)+0#0000000&| |-|>| |(|b+0#00e0003&|y|t|e|)+0#0000000&| |1+0#e000002&|;+0#0000000&| @34
+@12>d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@4|-|>| |(|b+0#00e0003&|y|t|e|)+0#0000000&| |-|1+0#e000002&|;+0#0000000&| @37
+@8|}|)|;| @63
+@75
+@8|s+0#00e0003&|h|o|r|t| +0#0000000&|s|h| |=| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |2+0#e000002&|;+0#0000000&| @45
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|s|h|)| |{| @53
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |0+0#e000002&|)+0#0000000&|:| @2|{| |e|c|h|o|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |0+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @19
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|)+0#0000000&|:| @2|{| |e|c|h|o|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @19
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @7|{| |e|c|h|o|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |-|1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @22
+@8|}|;| @64
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|s|h|)| |{| @48
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |0+0#e000002&|)+0#0000000&| @3|-|>| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |0+0#e000002&|;+0#0000000&| @29
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|)+0#0000000&| @3|-|>| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|;+0#0000000&| @29
+@57|9|1|,|4|-|1|3| @6|8|2|%|
diff --git a/runtime/syntax/testdir/dumps/java_switch_06.dump b/runtime/syntax/testdir/dumps/java_switch_06.dump
new file mode 100644
index 0000000..9e72cc7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@11|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|)+0#0000000&| @3|-|>| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|;+0#0000000&| @29
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@8|-|>| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |-|1+0#e000002&|;+0#0000000&| @32
+@8|}|)|;| @63
+@75
+@8|i+0#00e0003&|n|t| +0#0000000&|i| |=| |2+0#e000002&|;+0#0000000&| @56
+> @74
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|i|)| |{| @54
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|0+0#e000002&|b|0|_@1|0@1|_@2|0@2|:+0#0000000&| |{| |e|c|h|o|(|0+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @27
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|0+0#e000002&|x|0@2|_@2|0@1|_@1|1|:+0#0000000&| |{| |e|c|h|o|(|1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @27
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @7|{| |e|c|h|o|(|-|1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @30
+@8|}|;| @64
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|i|)| |{| @49
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|0+0#e000002&|_|0|_|0|_|0|_|0| +0#0000000&@1|-|>| |0+0#e000002&|;+0#0000000&| @41
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|1+0#e000002&| +0#0000000&@5|-|>| |1+0#e000002&|;+0#0000000&| @45
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@4|-|>| |-|1+0#e000002&|;+0#0000000&| @44
+@8|}|)|;| @63
+@4|}| @69
+|}| @73
+@57|1|0|9|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/java_switch_99.dump b/runtime/syntax/testdir/dumps/java_switch_99.dump
new file mode 100644
index 0000000..f275382
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_switch_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@11|c+0#af5f00255&|a|s|e| +0#0000000&|(@1|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|)+0#0000000&| @3|-|>| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |1+0#e000002&|;+0#0000000&| @29
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@8|-|>| |(|s+0#00e0003&|h|o|r|t|)+0#0000000&| |-|1+0#e000002&|;+0#0000000&| @32
+@8|}|)|;| @63
+@75
+@8|i+0#00e0003&|n|t| +0#0000000&|i| |=| |2+0#e000002&|;+0#0000000&| @56
+@75
+@8|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|i|)| |{| @54
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|0+0#e000002&|b|0|_@1|0@1|_@2|0@2|:+0#0000000&| |{| |e|c|h|o|(|0+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @27
+@8|c+0#af5f00255&|a|s|e| +0#0000000&|0+0#e000002&|x|0@2|_@2|0@1|_@1|1|:+0#0000000&| |{| |e|c|h|o|(|1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @27
+@8|d+0#af5f00255&|e|f|a|u|l|t|:+0#0000000&| @7|{| |e|c|h|o|(|-|1+0#e000002&|)+0#0000000&|;| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| |}| @30
+@8|}|;| @64
+@75
+@8|e|c|h|o|(|s+0#af5f00255&|w|i|t|c|h| +0#0000000&|(|i|)| |{| @49
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|0+0#e000002&|_|0|_|0|_|0|_|0| +0#0000000&@1|-|>| |0+0#e000002&|;+0#0000000&| @41
+@12|c+0#af5f00255&|a|s|e| +0#0000000&|1+0#e000002&| +0#0000000&@5|-|>| |1+0#e000002&|;+0#0000000&| @45
+@12|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@4|-|>| |-|1+0#e000002&|;+0#0000000&| @44
+@8|}|)|;| @63
+@4|}| @69
+>}| @73
+@57|1|2@1|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/markdown_conceal_00.dump b/runtime/syntax/testdir/dumps/markdown_conceal_00.dump
new file mode 100644
index 0000000..f90a2b4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/markdown_conceal_00.dump
@@ -0,0 +1,20 @@
+>I+0&#ffffff0|t|a|l|i|c|,| |I|t|a|l|i|c|.| @1|B+0#0000001#ffff4012|o|l|d|,+0#0000000#ffffff0| |B+0#0000001#ffff4012|o|l|d|.+0#0000000#ffffff0| @46
+|B+2&&|o|l|d| |I|t|a|l|i|c|,+0&&| |B+2&&|o|l|d| |I|t|a|l|i|c|.+0&&| @49
+|S+1024&&|t|r|i|k|e|t|h|r|o|u|g|h|,+0&&| |S̶|t̶|r̶|i̶|k̶|e̶|t̶|h̶|r̶|o̶|u̶|g̶|h̶|.| @45
+@75
+@75
+|<+0#00e0e07&|p+0#af5f00255&|>+0#00e0e07&| +0#0000000&@71
+|<+0#00e0e07&|d+0#af5f00255&|e|l|>+0#00e0e07&|S+1024#0000000&|t|r|i|k|e|t|h|r|o|u|g|h|<+0#00e0e07&|/|d+0#af5f00255&|e|l|>+0#00e0e07&|,+0#0000000&| |<+0#00e0e07&|s+0#af5f00255&|>+0#00e0e07&|S+1024#0000000&|t|r|i|k|e|t|h|r|o|u|g|h|<+0#00e0e07&|/|s+0#af5f00255&|>+0#00e0e07&|.+0#0000000&|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>| +0#0000000&@21
+@75
+@75
+@75
+|<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|<|e+0#af5f00255&|m|>+0#00e0e07&|B+2#0000000&|o|l|d| |I|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|<|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|.+0#0000000&| @36
+|<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|<|e+0#af5f00255&|m|>+0#00e0e07&|B+2#0000000&|o|l|d| |I|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|<|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|.+0#0000000&|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>| +0#0000000&@30
+|<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|B+0#0000001#ffff4012|o|l|d|<+0#00e0e07#ffffff0|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|,+0#0000000&| |<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|B+0#0000001#ffff4012|o|l|d|<+0#00e0e07#ffffff0|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|.+0#0000000&| @29
+|<+0#00e0e07&|e+0#af5f00255&|m|>+0#00e0e07&|I+0#0000000&|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|,+0#0000000&| |<+0#00e0e07&|e+0#af5f00255&|m|>+0#00e0e07&|I+0#0000000&|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|.+0#0000000&| @41
+@75
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/markdown_conceal_99.dump b/runtime/syntax/testdir/dumps/markdown_conceal_99.dump
new file mode 100644
index 0000000..d0b6be1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/markdown_conceal_99.dump
@@ -0,0 +1,20 @@
+|I+0&#ffffff0|t|a|l|i|c|,| |I|t|a|l|i|c|.| @1|B+0#0000001#ffff4012|o|l|d|,+0#0000000#ffffff0| |B+0#0000001#ffff4012|o|l|d|.+0#0000000#ffffff0| @46
+|B+2&&|o|l|d| |I|t|a|l|i|c|,+0&&| |B+2&&|o|l|d| |I|t|a|l|i|c|.+0&&| @49
+|S+1024&&|t|r|i|k|e|t|h|r|o|u|g|h|,+0&&| |S̶|t̶|r̶|i̶|k̶|e̶|t̶|h̶|r̶|o̶|u̶|g̶|h̶|.| @45
+@75
+@75
+|<+0#00e0e07&|p+0#af5f00255&|>+0#00e0e07&| +0#0000000&@71
+|<+0#00e0e07&|d+0#af5f00255&|e|l|>+0#00e0e07&|S+1024#0000000&|t|r|i|k|e|t|h|r|o|u|g|h|<+0#00e0e07&|/|d+0#af5f00255&|e|l|>+0#00e0e07&|,+0#0000000&| |<+0#00e0e07&|s+0#af5f00255&|>+0#00e0e07&|S+1024#0000000&|t|r|i|k|e|t|h|r|o|u|g|h|<+0#00e0e07&|/|s+0#af5f00255&|>+0#00e0e07&|.+0#0000000&|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>| +0#0000000&@21
+@75
+@75
+@75
+|<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|<|e+0#af5f00255&|m|>+0#00e0e07&|B+2#0000000&|o|l|d| |I|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|<|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|.+0#0000000&| @36
+|<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|<|e+0#af5f00255&|m|>+0#00e0e07&|B+2#0000000&|o|l|d| |I|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|<|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|.+0#0000000&|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>| +0#0000000&@30
+|<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|B+0#0000001#ffff4012|o|l|d|<+0#00e0e07#ffffff0|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|,+0#0000000&| |<+0#00e0e07&|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|B+0#0000001#ffff4012|o|l|d|<+0#00e0e07#ffffff0|/|s+0#af5f00255&|t|r|o|n|g|>+0#00e0e07&|.+0#0000000&| @29
+|<+0#00e0e07&|e+0#af5f00255&|m|>+0#00e0e07&|I+0#0000000&|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|,+0#0000000&| |<+0#00e0e07&|e+0#af5f00255&|m|>+0#00e0e07&|I+0#0000000&|t|a|l|i|c|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&|.+0#0000000&| @41
+> @74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|5|,|1| @9|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/modula2_iso_00.dump b/runtime/syntax/testdir/dumps/modula2_iso_00.dump
index 797376f..0c24cb8 100644
--- a/runtime/syntax/testdir/dumps/modula2_iso_00.dump
+++ b/runtime/syntax/testdir/dumps/modula2_iso_00.dump
@@ -17,4 +17,4 @@
|(+0#0000e05&|*| |p|r|e|d|e|f|i|n|e|d| |c|o|n|s|t|a|n|t|s| |*|)| +0#0000000&@48
|F+0#e000002&|A|L|S|E| +0#0000000&|N+0#e000002&|I|L| +0#0000000&|T+0#e000002&|R|U|E| +0#0000000&|I+0#e000002&|N|T|E|R@1|U|P|T|I|B|L|E| +0#0000000&|U+0#e000002&|N|I|N|T|E|R@1|U|P|T|I|B|L|E| +0#0000000&@30
@75
-|"|i|n|p|u|t|/|m|o|d|u|l|a|2|_|i|s|o|.|d|e|f|"| |1@1|4|L|,| |2|3|1|8|B| @21|1|,|1| @10|T|o|p|
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/modula2_pim_00.dump b/runtime/syntax/testdir/dumps/modula2_pim_00.dump
index 5e85b7a..36aa0de 100644
--- a/runtime/syntax/testdir/dumps/modula2_pim_00.dump
+++ b/runtime/syntax/testdir/dumps/modula2_pim_00.dump
@@ -17,4 +17,4 @@
|F+0#e000002&|A|L|S|E| +0#0000000&|N+0#e000002&|I|L| +0#0000000&|T+0#e000002&|R|U|E| +0#0000000&@60
@75
|(+0#0000e05&|*| |p|r|e|d|e|f|i|n|e|d| |t|y|p|e|s| |*|)| +0#0000000&@52
-|"|i|n|p|u|t|/|m|o|d|u|l|a|2|_|p|i|m|.|d|e|f|"| |1@2|L|,| |2|1|9|7|B| @21|1|,|1| @10|T|o|p|
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/modula2_r10_00.dump b/runtime/syntax/testdir/dumps/modula2_r10_00.dump
index ab4167a..a2e475e 100644
--- a/runtime/syntax/testdir/dumps/modula2_r10_00.dump
+++ b/runtime/syntax/testdir/dumps/modula2_r10_00.dump
@@ -17,4 +17,4 @@
|N+0#e000002&|I|L| +0#0000000&|F+0#e000002&|A|L|S|E| +0#0000000&|T+0#e000002&|R|U|E| +0#0000000&@60
@75
|(+0#0000e05&|*| |p|r|e|d|e|f|i|n|e|d| |t|y|p|e|s| |*|)| +0#0000000&@52
-|"|i|n|p|u|t|/|m|o|d|u|l|a|2|_|r|1|0|.|d|e|f|"| |1|4|6|L|,| |2|9|8|3|B| @21|1|,|1| @10|T|o|p|
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/sh_10_00.dump b/runtime/syntax/testdir/dumps/sh_10_00.dump
new file mode 100644
index 0000000..b0c98ea
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/sh_10_00.dump
@@ -0,0 +1,20 @@
+>#+0#0000e05#ffffff0|!|/|b|i|n|/|k|s|h| +0#0000000&@64
+@75
+|#+0#0000e05&| |T|h|i|s| |s|c|r|i|p|t| |i|s| |a| |t|e|s|t| |f|i|l|e| |f|o|r| |k|s|h|9|3| |s|h|a|r|e|d|-|s|t|a|t|e| +0#0000000&@23
+|#+0#0000e05&| |c|o|m@1|a|n|d| |s|u|b|s|t|i|t|u|t|i|o|n|s| |(|s|u|b|s|h|a|r|e|s|)| |a|n|d| |m|k|s|h| |v|a|l|u|e| +0#0000000&@24
+|#+0#0000e05&| |s|u|b|s|t|i|t|u|t|i|o|n|s| |(|v|a|l|s|u|b|s|)|.| +0#0000000&@48
+@75
+|#+0#0000e05&| |=@5| +0#0000000&@66
+|#+0#0000e05&| |B|e|l|o|w| |i|s| |s|u|b|s|h|a|r|e| |s|y|n|t|a|x| |s|u|p@1|o|r|t|e|d| |b|y| |b|o|t|h| |k|s|h|9|3| |a|n|d| |m|k|s|h|.| +0#0000000&@14
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|o|n|e| +0#e000e06&|}| +0#0000000&@55
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| @7|e+0#af5f00255&|c|h|o| +0#e000002&|t|w|o| +0#0000000&@50
+|}+0#e000e06&| +0#0000000&@73
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| +0#0000000&@66
+|e+0#af5f00255&|c|h|o| +0#e000002&|t|h|r|e@1| +0#e000e06&@5|}| +0#0000000&@57
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|f+0#e000002&|o|u|r|'+0#af5f00255&|;| +0#e000e06&|}| +0#0000000&@51
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|f+0#e000002&|i|v|e|'+0#af5f00255&| +0#e000002&|;+0#e000e06&|}| +0#0000000&@51
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|s+0#e000002&|i|x|'+0#af5f00255&| +0#0000000&@55
+|}+0#e000e06&| +0#0000000&@73
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| @7|e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|s+0#e000002&|e|v|e|n|'+0#af5f00255&| +0#e000e06&@3|}| +0#0000000&@41
+|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{| |p+0#af5f00255&|r|i|n|t| +0#e000002&|'+0#af5f00255&|e+0#e000002&|i|g|h|t|'+0#af5f00255&| +0#e000e06&@2|}| +0#0000000&@49
+|i|s|_|k|o|r|n|s|h|e|l@1|:| |1|,| @40|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/sh_10_01.dump b/runtime/syntax/testdir/dumps/sh_10_01.dump
new file mode 100644
index 0000000..c1d3531
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/sh_10_01.dump
@@ -0,0 +1,20 @@
+|p+0#af5f00255#ffffff0|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|f+0#e000002&|o|u|r|'+0#af5f00255&|;| +0#e000e06&|}| +0#0000000&@51
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|f+0#e000002&|i|v|e|'+0#af5f00255&| +0#e000002&|;+0#e000e06&|}| +0#0000000&@51
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| |e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|s+0#e000002&|i|x|'+0#af5f00255&| +0#0000000&@55
+|}+0#e000e06&| +0#0000000&@73
+|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|{| @7|e+0#af5f00255&|c|h|o| +0#e000002&|'+0#af5f00255&|s+0#e000002&|e|v|e|n|'+0#af5f00255&| +0#e000e06&@3|}| +0#0000000&@41
+>e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{| |p+0#af5f00255&|r|i|n|t| +0#e000002&|'+0#af5f00255&|e+0#e000002&|i|g|h|t|'+0#af5f00255&| +0#e000e06&@2|}| +0#0000000&@49
+|t+0#af5f00255&|y|p|e|s|e|t| +0#0000000&|n+0#00e0e07&|i|n|e|=+0#0000000&|$+0#e000e06&|{| |p+0#af5f00255&|w|d|;| +0#e000e06&|}| +0#0000000&@52
+@75
+|#+0#0000e05&| |=@5| +0#0000000&@66
+|#+0#0000e05&| |V|a|l|u|e| |s|u|b|s|t|i|t|u|t|i|o|n|s| |o|f| |t|h|e| |f|o|r|m| |$|{|||c|o|m@1|a|n|d|}| |a|r|e| |o|n|l|y| +0#0000000&@20
+|#+0#0000e05&| |s|u|p@1|o|r|t|e|d| |b|y| |m|k|s|h|,| |n|o|t| |k|s|h|9|3|.| +0#0000000&@43
+|i+0#af5f00255&|f| |!| +0#0000000&|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|e+0#af5f00255&|v|a|l| +0#0000000&|'+0#af5f00255&|(+0#e000002&@1|.|s|h|.|v|e|r|s|i|o|n| |>|=| |2|0@1|7|0|7|0|3|)@1|'+0#af5f00255&| +0#0000000&|2+0#e000002&|>+0#af5f00255&|/+0#0000000&|d|e|v|/|n|u|l@1|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&@9
+| +0#00e0e07&@7|v|a|l|s|u|b|f|u|n|c|(|)| |{| +0#0000000&@52
+@16|R+0#e000e06&|E|P|L|Y|=+0#af5f00255&|$+0#e000e06&|1| +0#0000000&@50
+@8|}+0#00e0e07&| +0#0000000&@65
+@8|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |t|e|n|}| +0#0000000&@43
+@8|p+0#af5f00255&|r|i|n|t| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |e|l|e|v|e|n|;+0#af5f00255&|}+0#e000e06&|"+0#af5f00255&| +0#0000000&@36
+@8|p+0#af5f00255&|r|i|n|t|f| +0#0000000&|'+0#af5f00255&|%+0#e000002&|s|'+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |t|w|e|l|v|e| @6|}|"+0#af5f00255&| +0#0000000&@24
+@8|u+0#00e0e07&|n|l|u|c|k|y|=+0#0000000&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |t|h|i|r|t|e@1|n| +0#0000000&@36
+@57|1|9|,|1| @9|4|3|%|
diff --git a/runtime/syntax/testdir/dumps/sh_10_02.dump b/runtime/syntax/testdir/dumps/sh_10_02.dump
new file mode 100644
index 0000000..e03c3f8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/sh_10_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|u+0#00e0e07&|n|l|u|c|k|y|=+0#0000000&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |t|h|i|r|t|e@1|n| +0#0000000&@36
+|}+0#e000e06&| +0#0000000&@73
+@8|t+0#af5f00255&|y|p|e|s|e|t| +0#0000000&|n+0#00e0e07&|o|t|a|f|l|o|a|t|=+0#0000000&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |n|o|t|a|n|u|m|b|e|r| @5|}| +0#0000000&@17
+@8|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|u|n|l|u|c|k|y| +0#e000002&|$+0#e000e06&|n|o|t|a|n|u|m|b|e|r| +0#0000000&@40
+@8|$+0#e000e06&|{|||e+0#af5f00255&|c|h|o| +0#e000002&|f|o@1|}+0#e000e06&| +0#0000000&@54
+@8>$+0#e000e06&|{|||e+0#af5f00255&|c|h|o| +0#e000002&|b|a|r| +0#0000000&@55
+|}+0#e000e06&| +0#0000000&@73
+|f+0#af5f00255&|i| +0#0000000&@72
+@75
+|#+0#0000e05&| |=@5| +0#0000000&@66
+|#+0#0000e05&| |S|h|a|r|e|d|-|s|t|a|t|e| |c|o|m@1|a|n|d| |s|u|b|s|t|i|t|u|t|i|o|n|s| |u|s|i|n|g| |t|h|e| |s|y|n|t|a|x| |$|{|<|f|i|l|e|;|}| +0#0000000&@11
+|#+0#0000e05&| |a|r|e| |o|n|l|y| |s|u|p@1|o|r|t|e|d| |b|y| |k|s|h|9|3|,| |n|o|t| |m|k|s|h|.| +0#0000000&@34
+|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{| +0#0000000&@67
+| +0#e000e06&@7|p+0#af5f00255&|r|i|n|t|f| +0#e000e06&|%|s| |s|t|r| +0#0000000&@53
+|}+0#e000e06&| +0#e000002&|>+0#af5f00255&| +0#0000000&|/|t|m|p|/|s|t|r|f|i|l|e| @58
+|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{|<+0#af5f00255&|/+0#e000e06&|t|m|p|/|s|t|r|f|i|l|e|;|}| +0#0000000&@52
+@75
+|e+0#af5f00255&|x|i|t| +0#0000000&|0+0#e000002&| +0#0000000&@68
+|~+0#4040ff13&| @73
+| +0#0000000&@56|3|7|,|2|-|9| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/sh_10_99.dump b/runtime/syntax/testdir/dumps/sh_10_99.dump
new file mode 100644
index 0000000..f97ea32
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/sh_10_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|p+0#af5f00255&|r|i|n|t|f| +0#0000000&|'+0#af5f00255&|%+0#e000002&|s|'+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |t|w|e|l|v|e| @6|}|"+0#af5f00255&| +0#0000000&@24
+@8|u+0#00e0e07&|n|l|u|c|k|y|=+0#0000000&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |t|h|i|r|t|e@1|n| +0#0000000&@36
+|}+0#e000e06&| +0#0000000&@73
+@8|t+0#af5f00255&|y|p|e|s|e|t| +0#0000000&|n+0#00e0e07&|o|t|a|f|l|o|a|t|=+0#0000000&|$+0#e000e06&|{|||v|a|l|s|u|b|f|u|n|c| |n|o|t|a|n|u|m|b|e|r| @5|}| +0#0000000&@17
+@8|p+0#af5f00255&|r|i|n|t| +0#e000002&|$+0#e000e06&|u|n|l|u|c|k|y| +0#e000002&|$+0#e000e06&|n|o|t|a|n|u|m|b|e|r| +0#0000000&@40
+@8|$+0#e000e06&|{|||e+0#af5f00255&|c|h|o| +0#e000002&|f|o@1|}+0#e000e06&| +0#0000000&@54
+@8|$+0#e000e06&|{|||e+0#af5f00255&|c|h|o| +0#e000002&|b|a|r| +0#0000000&@55
+|}+0#e000e06&| +0#0000000&@73
+|f+0#af5f00255&|i| +0#0000000&@72
+@75
+|#+0#0000e05&| |=@5| +0#0000000&@66
+|#+0#0000e05&| |S|h|a|r|e|d|-|s|t|a|t|e| |c|o|m@1|a|n|d| |s|u|b|s|t|i|t|u|t|i|o|n|s| |u|s|i|n|g| |t|h|e| |s|y|n|t|a|x| |$|{|<|f|i|l|e|;|}| +0#0000000&@11
+|#+0#0000e05&| |a|r|e| |o|n|l|y| |s|u|p@1|o|r|t|e|d| |b|y| |k|s|h|9|3|,| |n|o|t| |m|k|s|h|.| +0#0000000&@34
+|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{| +0#0000000&@67
+| +0#e000e06&@7|p+0#af5f00255&|r|i|n|t|f| +0#e000e06&|%|s| |s|t|r| +0#0000000&@53
+|}+0#e000e06&| +0#e000002&|>+0#af5f00255&| +0#0000000&|/|t|m|p|/|s|t|r|f|i|l|e| @58
+|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{|<+0#af5f00255&|/+0#e000e06&|t|m|p|/|s|t|r|f|i|l|e|;|}| +0#0000000&@52
+@75
+>e+0#af5f00255&|x|i|t| +0#0000000&|0+0#e000002&| +0#0000000&@68
+@57|4|9|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/sh_11_00.dump b/runtime/syntax/testdir/dumps/sh_11_00.dump
new file mode 100644
index 0000000..f2d1d27
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/sh_11_00.dump
@@ -0,0 +1,20 @@
+>#+0#0000e05#ffffff0|!|/|b|i|n|/|b|a|s|h| +0#0000000&@63
+@75
+|#+0#0000e05&| |I|s@1|u|e| |#|9|6|2| +0#0000000&@62
+@75
+|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&| +0#0000000&@69
+@2|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&| +0#0000000&@65
+|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |o|k| +0#0000000&@68
+@75
+|i+0#af5f00255&|f| |t|r|u|e|;| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&@61
+@75
+@2|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |o|k| +0#0000000&@54
+@75
+@2|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&| +0#0000000&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&| +0#0000000&|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |o|k| +0#0000000&@52
+@75
+@2|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&| +0#0000000&@67
+@4|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&| +0#0000000&@63
+@2|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |p|a|r|e|n| |e|r@1|o|r|!| +0#0000000&@56
+@75
+|f+0#af5f00255&|i| +0#0000000&@72
+|i|s|_|b|a|s|h|:| |1|,| @45|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/sh_11_99.dump b/runtime/syntax/testdir/dumps/sh_11_99.dump
new file mode 100644
index 0000000..9612dab
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/sh_11_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|#+0#0000e05&| |I|s@1|u|e| |#|9|6|2| +0#0000000&@62
+@75
+|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&| +0#0000000&@69
+@2|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&| +0#0000000&@65
+|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |o|k| +0#0000000&@68
+@75
+|i+0#af5f00255&|f| |t|r|u|e|;| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&@61
+@75
+@2|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |o|k| +0#0000000&@54
+@75
+@2|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&| +0#0000000&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&| +0#0000000&|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |o|k| +0#0000000&@52
+@75
+@2|a+0#00e0e07&|r@1|=+0#0000000&|(+0#e000e06&| +0#0000000&@67
+@4|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&|3+0#e000002&| +0#0000000&|4+0#e000002&| +0#0000000&@63
+@2|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |p|a|r|e|n| |e|r@1|o|r|!| +0#0000000&@56
+@75
+|f+0#af5f00255&|i| +0#0000000&@72
+> @74
+@57|2|0|,|0|-|1| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_abbreviate_00.dump b/runtime/syntax/testdir/dumps/vim_ex_abbreviate_00.dump
new file mode 100644
index 0000000..5224a4f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_abbreviate_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|a|b@1|r|e|v|i|a|t|e| |c|o|m@1|a|n|d|s| +0#0000000&@48
+@75
+|a+0#af5f00255&|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @48
+|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @45
+|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @45
+@75
+|a+0#af5f00255&|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @41
+|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @38
+|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @38
+@75
+|n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @44
+|c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @41
+|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @41
+@75
+|a+0#af5f00255&|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @41
+|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @38
+|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @38
+@75
+|u+0#af5f00255&|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| @53
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_abbreviate_01.dump b/runtime/syntax/testdir/dumps/vim_ex_abbreviate_01.dump
new file mode 100644
index 0000000..c5cc26f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_abbreviate_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|a+0#af5f00255&|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @41
+|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @38
+|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @38
+@75
+>u+0#af5f00255&|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| @53
+|c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| @51
+|i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| @51
+@75
+|a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&|<+0#af5f00255&|b|u|f@1|e|r|>| +0#0000000&@58
+|c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&|<+0#af5f00255&|b|u|f@1|e|r|>| +0#0000000&@57
+|i+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&|<+0#af5f00255&|b|u|f@1|e|r|>| +0#0000000&@57
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|9|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_abbreviate_99.dump b/runtime/syntax/testdir/dumps/vim_ex_abbreviate_99.dump
new file mode 100644
index 0000000..5cec5ee
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_abbreviate_99.dump
@@ -0,0 +1,20 @@
+|a+0#af5f00255#ffffff0|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @41
+|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @38
+|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @38
+@75
+|n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @44
+|c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @41
+|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @41
+@75
+|a+0#af5f00255&|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| |f|o@1|b|a|r| @41
+|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| |c|f|o@1|b|a|r| @38
+|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|e|x|p|r|>| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| |c|f|o@1|b|a|r| @38
+@75
+|u+0#af5f00255&|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|f|o@1| @53
+|c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|c|f|o@1| @51
+|i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|i|f|o@1| @51
+@75
+|a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&|<+0#af5f00255&|b|u|f@1|e|r|>| +0#0000000&@58
+|c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&|<+0#af5f00255&|b|u|f@1|e|r|>| +0#0000000&@57
+>i+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&|<+0#af5f00255&|b|u|f@1|e|r|>| +0#0000000&@57
+@57|2|5|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_augroup_00.dump b/runtime/syntax/testdir/dumps/vim_ex_augroup_00.dump
new file mode 100644
index 0000000..0424482
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_augroup_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|a|u|g|r|o|u|p| |c|o|m@1|a|n|d| +0#0000000&@52
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|f|o@1| @63
+@2|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @63
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|f|o@1| ||| |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @38
+|a+0#af5f00255&|u|g|r|o|u|p|!| +0#0000000&|f|o@1| @62
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|!|@|#|$|%|^|&|*|(|)|_|+| @54
+@2|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @63
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|!|@|#|$|%|^|&|*|(|)|_|+| ||| |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @29
+|a+0#af5f00255&|u|g|r|o|u|p|!| +0#0000000&|!|@|#|$|%|^|&|*|(|)|_|+| @53
+@75
+|"+0#0000e05&| |l|i|s|t| |g|r|o|u|p|s| +0#0000000&@61
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&@67
+@75
+@57|1|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_augroup_99.dump b/runtime/syntax/testdir/dumps/vim_ex_augroup_99.dump
new file mode 100644
index 0000000..1e07f5b
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_augroup_99.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |V|i|m| |:|a|u|g|r|o|u|p| |c|o|m@1|a|n|d| +0#0000000&@52
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|f|o@1| @63
+@2|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @63
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|f|o@1| ||| |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @38
+|a+0#af5f00255&|u|g|r|o|u|p|!| +0#0000000&|f|o@1| @62
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|!|@|#|$|%|^|&|*|(|)|_|+| @54
+@2|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @63
+@75
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|!|@|#|$|%|^|&|*|(|)|_|+| ||| |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @29
+|a+0#af5f00255&|u|g|r|o|u|p|!| +0#0000000&|!|@|#|$|%|^|&|*|(|)|_|+| @53
+@75
+|"+0#0000e05&| |l|i|s|t| |g|r|o|u|p|s| +0#0000000&@61
+|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&@67
+> @74
+@57|1|9|,|0|-|1| @7|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_behave_00.dump b/runtime/syntax/testdir/dumps/vim_ex_behave_00.dump
new file mode 100644
index 0000000..b3c57de
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_behave_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |b|e|h|a|v|e| |c|o|m@1|a|n|d| +0#0000000&@54
+@75
+|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@62
+|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@62
+@75
+|b+0#af5f00255&|e|h|a|v|e|!| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@61
+|b+0#af5f00255&|e|h|a|v|e|!| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@61
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_behave_99.dump b/runtime/syntax/testdir/dumps/vim_ex_behave_99.dump
new file mode 100644
index 0000000..c3fefeb
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_behave_99.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |V|i|m| |b|e|h|a|v|e| |c|o|m@1|a|n|d| +0#0000000&@54
+@75
+|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@62
+|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@62
+@75
+|b+0#af5f00255&|e|h|a|v|e|!| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@61
+>b+0#af5f00255&|e|h|a|v|e|!| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@61
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|7|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_00.dump b/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
new file mode 100644
index 0000000..3123889
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|c|o|m@1|a|n|d| |c|o|m@1|a|n|d| +0#0000000&@52
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| +0#0000000&@60
+@75
+|c+0#af5f00255&|o|m| +0#0000000&|F|o@1| |c+0#af5f00255&|a|l@1| +0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#0000000&|'+0#e000002&|l|s|'|)+0#0000000&| @49
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_99.dump b/runtime/syntax/testdir/dumps/vim_ex_command_99.dump
new file mode 100644
index 0000000..96cfa16
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_99.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |V|i|m| |:|c|o|m@1|a|n|d| |c|o|m@1|a|n|d| +0#0000000&@52
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| +0#0000000&@60
+@75
+>c+0#af5f00255&|o|m| +0#0000000&|F|o@1| |c+0#af5f00255&|a|l@1| +0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#0000000&|'+0#e000002&|l|s|'|)+0#0000000&| @49
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|5|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump
index bb68b0c..863ae38 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump
@@ -13,8 +13,8 @@
|:| |h+0#af5f00255&|e|l|p| +0#0000000&@68
@1|:| |h+0#af5f00255&|e|l|p| +0#0000000&@67
@75
+|:|2+0#af5f00255&|m|a|t|c|h| +0#0000000&@67
+|:|3+0#af5f00255&|m|a|t|c|h| +0#0000000&@67
|:+0#af5f00255&|a|p@1|e|n|d| +0#0000000&@67
| +0#e000002&@3|t|e|x|t| +0#0000000&@66
-|.+0#af5f00255&| +0#0000000&@73
-|:|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@63
-|"|i|n|p|u|t|/|v|i|m|_|e|x|_|c|o|m@1|a|n|d|s|.|v|i|m|"| |1@1|9|1|L|,| |1|7|2|4|5|B| @15|1|,|1| @10|T|o|p|
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_01.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_01.dump
index 25a889c..23936b8 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_01.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_01.dump
@@ -1,9 +1,11 @@
| +0&#ffffff0|:| |h+0#af5f00255&|e|l|p| +0#0000000&@67
@75
+|:|2+0#af5f00255&|m|a|t|c|h| +0#0000000&@67
+|:|3+0#af5f00255&|m|a|t|c|h| +0#0000000&@67
|:+0#af5f00255&|a|p@1|e|n|d| +0#0000000&@67
-| +0#e000002&@3|t|e|x|t| +0#0000000&@66
+| +0#e000002&@3>t|e|x|t| +0#0000000&@66
|.+0#af5f00255&| +0#0000000&@73
->:|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@63
+|:|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@63
|:|a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&@66
|:|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@64
|:|a+0#af5f00255&|l@1| +0#0000000&@70
@@ -15,6 +17,4 @@
|:|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@64
|:|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@66
|:|a+0#af5f00255&|r|g|d|o| +0#0000000&@68
-|:|a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@64
-|:|a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@65
-@57|1|9|,|1| @10|1|%|
+@57|1|9|,|5| @10|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_02.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_02.dump
index 2fb09df..0a2fbfa 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_02.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_02.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@65
+|:+0&#ffffff0|a+0#af5f00255&|r|g|d|o| +0#0000000&@68
+|:|a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@64
+|:|a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@65
|:|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@65
|:|a+0#af5f00255&|s|c|i@1| +0#0000000&@68
-|:|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@66
+>:|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@66
|:|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|F|o@1| @62
->:|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @62
+|:|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @62
|:|a+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66
|:|b+0#af5f00255&|u|f@1|e|r| +0#0000000&@67
|:|b+0#af5f00255&|N|e|x|t| +0#0000000&@68
@@ -15,6 +17,4 @@
|:|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@61
|:|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@63
|:|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@67
-|:|b+0#af5f00255&|l|a|s|t| +0#0000000&@68
-|:|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@64
@57|3|7|,|1| @10|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_03.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_03.dump
index 1cb1136..9986dbb 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_03.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_03.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@64
+|:+0&#ffffff0|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@67
+|:|b+0#af5f00255&|l|a|s|t| +0#0000000&@68
+|:|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@64
|:|b+0#af5f00255&|n|e|x|t| +0#0000000&@68
|:|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@65
-|:|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64
+>:|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64
|:|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
->:|b+0#af5f00255&|r|e|a|k| +0#0000000&@68
+|:|b+0#af5f00255&|r|e|a|k| +0#0000000&@68
|:|b+0#af5f00255&|r|e|a|k|a|d@1| +0#0000000&@65
|:|b+0#af5f00255&|r|e|a|k|d|e|l| +0#0000000&@65
|:|b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@64
@@ -15,6 +17,4 @@
|:+0#af5f00255&|c|h|a|n|g|e| +0#0000000&@67
| +0#e000002&@3|t|e|x|t| +0#0000000&@66
|.+0#af5f00255&| +0#0000000&@73
-|:|c+0#af5f00255&|N|e|x|t| +0#0000000&@68
-|:|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@67
@57|5@1|,|1| @10|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump
index 4d514b0..a22dd93 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@67
+|.+0#af5f00255#ffffff0| +0#0000000&@73
+|:|c+0#af5f00255&|N|e|x|t| +0#0000000&@68
+|:|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@67
|:|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@66
|:|c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@65
-|:|c+0#af5f00255&|a|b|o|v|e| +0#0000000&@67
+>:|c+0#af5f00255&|a|b|o|v|e| +0#0000000&@67
|:|c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@63
->:|c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@65
+|:|c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@65
|:|c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@65
|:|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@67
|:|c+0#af5f00255&|a|l@1| +0#0000000&@69
@@ -15,6 +17,4 @@
|:|c+0#af5f00255&@1| +0#0000000&@71
|:|c+0#af5f00255&@1|l|o|s|e| +0#0000000&@67
|:|c+0#af5f00255&|d| +0#0000000&@71
-|:|c+0#af5f00255&|d|o| +0#0000000&@70
-|:|c+0#af5f00255&|f|d|o| +0#0000000&@69
@57|7|3|,|1| @10|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_05.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_05.dump
index 15c72f8..f280535 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_05.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_05.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|c+0#af5f00255&|f|d|o| +0#0000000&@69
+|:+0&#ffffff0|c+0#af5f00255&|d| +0#0000000&@71
+|:|c+0#af5f00255&|d|o| +0#0000000&@70
+|:|c+0#af5f00255&|f|d|o| +0#0000000&@69
|:|c+0#af5f00255&|e|n|t|e|r| +0#0000000&@67
|:|c+0#af5f00255&|e|x|p|r| +0#0000000&@68
-|:|c+0#af5f00255&|f|i|l|e| +0#0000000&@68
+>:|c+0#af5f00255&|f|i|l|e| +0#0000000&@68
|:|c+0#af5f00255&|f|i|r|s|t| +0#0000000&@67
->:|c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@63
+|:|c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@63
|:|c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@65
|:|c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@65
|:|c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@66
@@ -15,6 +17,4 @@
|:|c+0#af5f00255&|l|a|s|t| +0#0000000&@68
|:|c+0#af5f00255&|l|e|a|r|j|u|m|p|s| +0#0000000&@63
|:|c+0#af5f00255&|l|i|s|t| +0#0000000&@68
-|:|c+0#af5f00255&|l|o|s|e| +0#0000000&@68
-|:|c+0#af5f00255&|m|a|p| +0#0000000&@69
@57|9|1|,|1| @10|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump
index 368df37..1e7b7b5 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|c+0#af5f00255&|m|a|p| +0#0000000&@69
+|:+0&#ffffff0|c+0#af5f00255&|l|i|s|t| +0#0000000&@68
+|:|c+0#af5f00255&|l|o|s|e| +0#0000000&@68
+|:|c+0#af5f00255&|m|a|p| +0#0000000&@69
|:|c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
|:|c+0#af5f00255&|m|e|n|u| +0#0000000&@68
-|:|c+0#af5f00255&|n|e|x|t| +0#0000000&@68
+>:|c+0#af5f00255&|n|e|x|t| +0#0000000&@68
|:|c+0#af5f00255&|n|e|w|e|r| +0#0000000&@67
->:|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@67
+|:|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@67
|:|c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
|:|c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@62
|:|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
@@ -15,6 +17,4 @@
|:|c+0#af5f00255&|o|m|p|i|l|e|r| +0#0000000&@65
|:|c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@65
|:|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@66
-|:|c+0#af5f00255&|o|n|s|t| +0#0000000&@68
-|:|c+0#af5f00255&|o|p|e|n| +0#0000000&@68
@57|1|0|9|,|1| @9|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_07.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_07.dump
index 7507a13..e5f9736 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_07.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_07.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|c+0#af5f00255&|o|p|e|n| +0#0000000&@68
+|:+0&#ffffff0|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@66
+|:|c+0#af5f00255&|o|n|s|t| +0#0000000&@68
+|:|c+0#af5f00255&|o|p|e|n| +0#0000000&@68
|:|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64
|:|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@67
-|:|c+0#af5f00255&|q|u|i|t| +0#0000000&@68
+>:|c+0#af5f00255&|q|u|i|t| +0#0000000&@68
|:|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
->:|c+0#af5f00255&|s|c|o|p|e| +0#0000000&@67
+|:|c+0#af5f00255&|s|c|o|p|e| +0#0000000&@67
|:|c+0#af5f00255&|s|t|a|g| +0#0000000&@68
|:|c+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
|:|c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@64
@@ -15,6 +17,4 @@
|:|d+0#af5f00255&|e|f| +0#0000000&@70
|:|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@63
|:|d+0#af5f00255&|e|f|e|r| +0#0000000&@68
-|:|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@63
-|:|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@62
@57|1|2|7|,|1| @8|1|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump
index 970062e..2f41043 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@62
+|:+0&#ffffff0|d+0#af5f00255&|e|f|e|r| +0#0000000&@68
+|:|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@63
+|:|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@62
|:|d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@65
|:|d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@63
-|:|d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@66
+>:|d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@66
|:|d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@66
->:|d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@64
+|:|d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@64
|:|d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@66
|:|d+0#af5f00255&|i|f@1|s|p|l|i|t| +0#0000000&@64
|:|d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@65
@@ -15,6 +17,4 @@
|:|d+0#af5f00255&|l|i|s|t| +0#0000000&@68
|:|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@64
|:|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@64
-|:|d+0#af5f00255&|p| +0#0000000&@71
-|:|d+0#af5f00255&|r|o|p| +0#0000000&@69
@57|1|4|5|,|1| @8|1@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_09.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_09.dump
index 686a6e5..ffe0524 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_09.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_09.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|d+0#af5f00255&|r|o|p| +0#0000000&@69
+|:+0&#ffffff0|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@64
+|:|d+0#af5f00255&|p| +0#0000000&@71
+|:|d+0#af5f00255&|r|o|p| +0#0000000&@69
|:|d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@66
|:|d+0#af5f00255&|s|p|l|i|t| +0#0000000&@67
-|:|e+0#af5f00255&|d|i|t| +0#0000000&@69
+>:|e+0#af5f00255&|d|i|t| +0#0000000&@69
|:|e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@66
->:|e+0#af5f00255&|c|h|o| +0#0000000&@69
+|:|e+0#af5f00255&|c|h|o| +0#0000000&@69
|:|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@62
|:|e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@66
|:|e+0#af5f00255&|c|h|o|h|l| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|e+0#af5f00255&|m|e|n|u| +0#0000000&@68
|:|e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@65
|:|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@67
-|:|e+0#af5f00255&|n|d|i|f| +0#0000000&@68
-|:|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@67
@57|1|6|3|,|1| @8|1|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump
index 0229d84..22b28eb 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@67
+|:+0&#ffffff0|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@67
+|:|e+0#af5f00255&|n|d|i|f| +0#0000000&@68
+|:|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@67
|:|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@62
|:|e+0#af5f00255&|n|d|t|r|y| +0#0000000&@67
-|:|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@65
+>:|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@65
|:|e+0#af5f00255&|n|e|w| +0#0000000&@69
->:|e+0#af5f00255&|v|a|l| +0#0000000&@69
+|:|e+0#af5f00255&|v|a|l| +0#0000000&@69
|:|e+0#af5f00255&|x| +0#0000000&@71
|:|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@66
|:|e+0#af5f00255&|x|i|t| +0#0000000&@69
@@ -15,6 +17,4 @@
|:|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@67
|:|f+0#af5f00255&|i|n|d| +0#0000000&@69
|:|f+0#af5f00255&|i|n|a|l| +0#0000000&@68
-|:|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@66
-|:|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@67
@57|1|8|1|,|1| @8|1|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_11.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_11.dump
index 44856a1..7b9a19f 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_11.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_11.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@67
+|:+0&#ffffff0|f+0#af5f00255&|i|n|a|l| +0#0000000&@68
+|:|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@66
+|:|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@67
|:|f+0#af5f00255&|i|r|s|t| +0#0000000&@68
|:|f+0#af5f00255&|i|x|d|e|l| +0#0000000&@67
-|:|f+0#af5f00255&|o|l|d| +0#0000000&@69
+>:|f+0#af5f00255&|o|l|d| +0#0000000&@69
|:|f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@64
->:|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@63
+|:|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@63
|:|f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@61
|:|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@65
|:|f+0#af5f00255&|o|r| +0#0000000&@70
@@ -15,6 +17,4 @@
|:|g+0#af5f00255&|u|i| +0#0000000&@70
|:|g+0#af5f00255&|v|i|m| +0#0000000&@69
|:|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@65
-|:|h+0#af5f00255&|e|l|p| +0#0000000&@69
-|:|h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@64
@57|1|9@1|,|1| @8|1|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump
index 2c0567a..03c5b96 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@64
+|:+0&#ffffff0|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@65
+|:|h+0#af5f00255&|e|l|p| +0#0000000&@69
+|:|h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@64
|:|h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@65
|:|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@65
-|:|h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@65
+>:|h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@65
|:|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@64
->:|h+0#af5f00255&|i|d|e| +0#0000000&@69
+|:|h+0#af5f00255&|i|d|e| +0#0000000&@69
|:|h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@66
|:|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@63
|:+0#af5f00255&|i|n|s|e|r|t| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|i+0#af5f00255&|j|u|m|p| +0#0000000&@68
|:|i+0#af5f00255&|l|i|s|t| +0#0000000&@68
|:|i+0#af5f00255&|m|a|p| +0#0000000&@69
-|:|i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
-|:|i+0#af5f00255&|m|e|n|u| +0#0000000&@68
-@57|2|1|7|,|1| @8|1|8|%|
+@57|2|1|7|,|1| @8|1|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_13.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_13.dump
index 07aba0a..5671882 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_13.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_13.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|i+0#af5f00255&|m|e|n|u| +0#0000000&@68
+|:+0&#ffffff0|i+0#af5f00255&|m|a|p| +0#0000000&@69
+|:|i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
+|:|i+0#af5f00255&|m|e|n|u| +0#0000000&@68
|:|i+0#af5f00255&|m|p|o|r|t| +0#0000000&@67
|:|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
-|:|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@62
+>:|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@62
|:|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
->:|i+0#af5f00255&|n|t|r|o| +0#0000000&@68
+|:|i+0#af5f00255&|n|t|r|o| +0#0000000&@68
|:|i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@66
|:|i+0#af5f00255&|s|p|l|i|t| +0#0000000&@67
|:|i+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@66
|:|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@64
|:|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@64
-|:|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@61
-|:|l+0#af5f00255&|N|e|x|t| +0#0000000&@68
@57|2|3|5|,|1| @8|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump
index 155ecc0..1442dfd 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|l+0#af5f00255&|N|e|x|t| +0#0000000&@68
+|:+0&#ffffff0|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@64
+|:|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@61
+|:|l+0#af5f00255&|N|e|x|t| +0#0000000&@68
|:|l+0#af5f00255&|N|f|i|l|e| +0#0000000&@67
|:|l+0#af5f00255&|i|s|t| +0#0000000&@69
-|:|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@67
+>:|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@67
|:|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@65
->:|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@63
+|:|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@63
|:|l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@65
|:|l+0#af5f00255&|a|f|t|e|r| +0#0000000&@67
|:|l+0#af5f00255&|a|s|t| +0#0000000&@69
@@ -15,6 +17,4 @@
|:|l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66
|:|l+0#af5f00255&|c|d| +0#0000000&@70
|:|l+0#af5f00255&|c|h|d|i|r| +0#0000000&@67
-|:|l+0#af5f00255&|c|l|o|s|e| +0#0000000&@67
-|:|l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@66
@57|2|5|3|,|1| @8|2|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump
index 6fad409..d72931b 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@66
+|:+0&#ffffff0|l+0#af5f00255&|c|h|d|i|r| +0#0000000&@67
+|:|l+0#af5f00255&|c|l|o|s|e| +0#0000000&@67
+|:|l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@66
|:|l+0#af5f00255&|d|o| +0#0000000&@70
|:|l+0#af5f00255&|f|d|o| +0#0000000&@69
-|:|l+0#af5f00255&|e|f|t| +0#0000000&@69
+>:|l+0#af5f00255&|e|f|t| +0#0000000&@69
|:|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@64
->:|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@67
+|:|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@67
|:|l+0#af5f00255&|e|t| +0#0000000&@70
|:|l+0#af5f00255&|e|x|p|r| +0#0000000&@68
|:|l+0#af5f00255&|f|i|l|e| +0#0000000&@68
@@ -15,6 +17,4 @@
|:|l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@65
|:|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&@64
|:|l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@65
-|:|l+0#af5f00255&@1| +0#0000000&@71
-|:|l+0#af5f00255&@1|a|s|t| +0#0000000&@68
@57|2|7|1|,|1| @8|2@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_16.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_16.dump
index 1c63c08..31d88a6 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_16.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_16.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|l+0#af5f00255&@1|a|s|t| +0#0000000&@68
+|:+0&#ffffff0|l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@65
+|:|l+0#af5f00255&@1| +0#0000000&@71
+|:|l+0#af5f00255&@1|a|s|t| +0#0000000&@68
|:|l+0#af5f00255&@1|i|s|t| +0#0000000&@68
|:|l+0#af5f00255&|m|a|k|e| +0#0000000&@68
-|:|l+0#af5f00255&|m|a|p| +0#0000000&@69
+>:|l+0#af5f00255&|m|a|p| +0#0000000&@69
|:|l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
->:|l+0#af5f00255&|n|e|x|t| +0#0000000&@68
+|:|l+0#af5f00255&|n|e|x|t| +0#0000000&@68
|:|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@67
|:|l+0#af5f00255&|n|f|i|l|e| +0#0000000&@67
|:|l+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
@@ -15,6 +17,4 @@
|:|l+0#af5f00255&|o|p|e|n| +0#0000000&@68
|:|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64
|:|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@67
-|:|l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
-|:|l+0#af5f00255&|s| +0#0000000&@71
@57|2|8|9|,|1| @8|2|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump
index 4988382..58d654d 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|l+0#af5f00255&|s| +0#0000000&@71
+|:+0&#ffffff0|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@67
+|:|l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
+|:|l+0#af5f00255&|s| +0#0000000&@71
|:|l+0#af5f00255&|t|a|g| +0#0000000&@69
|:|l+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
-|:|l+0#af5f00255&|u|a| +0#0000000&@70
+>:|l+0#af5f00255&|u|a| +0#0000000&@70
|:|l+0#af5f00255&|u|a|d|o| +0#0000000&@68
->:|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@66
+|:|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@66
|:|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@65
|:|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@62
|:|l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@66
@@ -15,6 +17,4 @@
|:|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@65
|:|m+0#af5f00255&|a|r|k|s| +0#0000000&@68
|:|m+0#af5f00255&|a|t|c|h| +0#0000000&@68
-|:|m+0#af5f00255&|e|n|u| +0#0000000&@69
-|:|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@60
@57|3|0|7|,|1| @8|2|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump
index 5015a82..a2539b5 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@60
+|:+0&#ffffff0|m+0#af5f00255&|a|t|c|h| +0#0000000&@68
+|:|m+0#af5f00255&|e|n|u| +0#0000000&@69
+|:|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@60
|:|m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@65
|:|m+0#af5f00255&|k|e|x|r|c| +0#0000000&@67
-|:|m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@64
+>:|m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@64
|:|m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@66
->:|m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@66
+|:|m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@66
|:|m+0#af5f00255&|k|v|i|e|w| +0#0000000&@67
|:|m+0#af5f00255&|o|d|e| +0#0000000&@69
|:|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@65
@@ -15,6 +17,4 @@
|:|n+0#af5f00255&|e|w| +0#0000000&@70
|:|n+0#af5f00255&|m|a|p| +0#0000000&@69
|:|n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
-|:|n+0#af5f00255&|m|e|n|u| +0#0000000&@68
-|:|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@65
@57|3|2|5|,|1| @8|2|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump
index 31b87c1..b7f7203 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@65
+|:+0&#ffffff0|n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
+|:|n+0#af5f00255&|m|e|n|u| +0#0000000&@68
+|:|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@65
|:|n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@64
|:|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@64
-|:|n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@66
+>:|n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@66
|:|n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@63
->:|n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@63
+|:|n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@63
|:|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@65
|:|n+0#af5f00255&|o|r|m|a|l| +0#0000000&@67
|:|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@63
@@ -15,6 +17,4 @@
|:|o+0#af5f00255&|m|a|p| +0#0000000&@69
|:|o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
|:|o+0#af5f00255&|m|e|n|u| +0#0000000&@68
-|:|o+0#af5f00255&|n|l|y| +0#0000000&@69
-|:|o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
@57|3|4|3|,|1| @8|2|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump
index de2714a..cedd6ab 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
+|:+0&#ffffff0|o+0#af5f00255&|m|e|n|u| +0#0000000&@68
+|:|o+0#af5f00255&|n|l|y| +0#0000000&@69
+|:|o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
|:|o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
|:|o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@66
-|:|o+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
+>:|o+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
|:|o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66
->:|o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@64
+|:|o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@64
|:|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@66
|:|p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@62
|:|p+0#af5f00255&|c|l|o|s|e| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|p+0#af5f00255&|r|o|m|p|t|f|i|n|d| +0#0000000&@63
|:|p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@63
|:|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@67
-|:|p+0#af5f00255&|o|p| +0#0000000&@70
-|:|p+0#af5f00255&|o|p|u|p| +0#0000000&@68
@57|3|6|1|,|1| @8|3|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump
index edfad45..b81c5ee 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|p+0#af5f00255&|o|p|u|p| +0#0000000&@68
+|:+0&#ffffff0|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@67
+|:|p+0#af5f00255&|o|p| +0#0000000&@70
+|:|p+0#af5f00255&|o|p|u|p| +0#0000000&@68
|:|p+0#af5f00255&@1|o|p| +0#0000000&@69
|:|p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@65
-|:|p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@65
+>:|p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@65
|:|p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@66
->:|p+0#af5f00255&|t|a|g| +0#0000000&@69
+|:|p+0#af5f00255&|t|a|g| +0#0000000&@69
|:|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@67
|:|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@66
|:|p+0#af5f00255&|t|j|u|m|p| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|p+0#af5f00255&|u|b|l|i|c| +0#0000000&@67
|:|p+0#af5f00255&|u|t| +0#0000000&@70
|:|p+0#af5f00255&|w|d| +0#0000000&@70
-|:|p+0#af5f00255&|y|3| +0#0000000&@70
-|:|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66
@57|3|7|9|,|1| @8|3|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump
index 3cc8e92..5007492 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66
+|:+0&#ffffff0|p+0#af5f00255&|w|d| +0#0000000&@70
+|:|p+0#af5f00255&|y|3| +0#0000000&@70
+|:|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66
|:|p+0#af5f00255&|y|3|d|o| +0#0000000&@68
|:|p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@66
-|:|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@67
+>:|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@67
|:|p+0#af5f00255&|y|d|o| +0#0000000&@69
->:|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@67
+|:|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@67
|:|p+0#af5f00255&|y|x| +0#0000000&@70
|:|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@66
|:|p+0#af5f00255&|y|x|d|o| +0#0000000&@68
@@ -15,6 +17,4 @@
|:|r+0#af5f00255&|e|c|o|v|e|r| +0#0000000&@66
|:|r+0#af5f00255&|e|d|o| +0#0000000&@69
|:|r+0#af5f00255&|e|d|i|r| +0#0000000&@68
-|:|r+0#af5f00255&|e|d|r|a|w| +0#0000000&@67
-|:|r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@61
@57|3|9|7|,|1| @8|3@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_23.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_23.dump
index d71dfa7..6baf838 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_23.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_23.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@61
+|:+0&#ffffff0|r+0#af5f00255&|e|d|i|r| +0#0000000&@68
+|:|r+0#af5f00255&|e|d|r|a|w| +0#0000000&@67
+|:|r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@61
|:|r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@60
|:|r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@64
-|:|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@67
+>:|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@67
|:|r+0#af5f00255&|e|t|a|b| +0#0000000&@68
->:|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@67
+|:|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@67
|:|r+0#af5f00255&|e|w|i|n|d| +0#0000000&@67
|:|r+0#af5f00255&|i|g|h|t| +0#0000000&@68
|:|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@63
@@ -13,8 +15,6 @@
|:|r+0#af5f00255&|u|n|d|o| +0#0000000&@68
|:|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@66
|:|r+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@65
-|:+0#af5f00255&|s|u|b|s|t|i|t|u|t|e| +0#0000000&@63
+|:|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@63
|:|s+0#af5f00255&|N|e|x|t| +0#0000000&@68
-|:|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@66
-|:|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@64
@57|4|1|5|,|1| @8|3|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump
index fd97b1e..4c937c2 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@64
+|:+0&#ffffff0|s+0#af5f00255&|N|e|x|t| +0#0000000&@68
+|:|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@66
+|:|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@64
|:|s+0#af5f00255&|a|l@1| +0#0000000&@69
|:|s+0#af5f00255&|a|v|e|a|s| +0#0000000&@67
-|:|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66
+>:|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66
|:|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@67
->:|s+0#af5f00255&|b|a|l@1| +0#0000000&@68
+|:|s+0#af5f00255&|b|a|l@1| +0#0000000&@68
|:|s+0#af5f00255&|b|f|i|r|s|t| +0#0000000&@66
|:|s+0#af5f00255&|b|l|a|s|t| +0#0000000&@67
|:|s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@63
@@ -15,6 +17,4 @@
|:|s+0#af5f00255&|c|r|i|p|t|v|e|r|s|i|o|n| +0#0000000&@60
|:|s+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@66
|:|s+0#af5f00255&|e|t| +0#0000000&@70
-|:|s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@62
-|:|s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@64
@57|4|3@1|,|1| @8|3|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_25.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_25.dump
index d073ef7..6b40f2c 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_25.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_25.dump
@@ -1,20 +1,20 @@
-|:+0&#ffffff0|s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@64
+|:+0&#ffffff0|s+0#af5f00255&|e|t| +0#0000000&@70
+|:|s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@62
+|:|s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@64
|:|s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@65
|:|s+0#af5f00255&|f|i|n|d| +0#0000000&@68
-|:|s+0#af5f00255&|f|i|r|s|t| +0#0000000&@67
+>:|s+0#af5f00255&|f|i|r|s|t| +0#0000000&@67
|:|s+0#af5f00255&|h|e|l@1| +0#0000000&@68
->:|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@67
+|:|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@67
|:|s+0#af5f00255&|i|g|n| +0#0000000&@69
|:|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@67
|:|s+0#af5f00255&|l|e@1|p| +0#0000000&@68
|:|s+0#af5f00255&|l|e@1|p|!| +0#0000000&@67
|:|s+0#af5f00255&|l|a|s|t| +0#0000000&@68
-|:+0#af5f00255&|s|m|a|g|i|c| +0#0000000&@67
+|:|s+0#af5f00255&|m|a|g|i|c| +0#0000000&@67
|:|s+0#af5f00255&|m|a|p| +0#0000000&@69
|:|s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
|:|s+0#af5f00255&|m|e|n|u| +0#0000000&@68
|:|s+0#af5f00255&|m|i|l|e| +0#0000000&@68
|:|s+0#af5f00255&|n|e|x|t| +0#0000000&@68
-|:+0#af5f00255&|s|n|o|m|a|g|i|c| +0#0000000&@65
-|:|s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
@57|4|5|1|,|1| @8|3|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump
index 20610ed..f388e4f 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
+|:+0&#ffffff0|s+0#af5f00255&|n|e|x|t| +0#0000000&@68
+|:|s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@65
+|:|s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
|:|s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
|:|s+0#af5f00255&|o|r|t| +0#0000000&@69
-|:|s+0#af5f00255&|o|u|r|c|e| +0#0000000&@67
+>:|s+0#af5f00255&|o|u|r|c|e| +0#0000000&@67
|:|s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@64
->:|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@64
+|:|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@64
|:|s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@64
|:|s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@64
|:|s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@62
@@ -15,6 +17,4 @@
|:|s+0#af5f00255&|t|o|p| +0#0000000&@69
|:|s+0#af5f00255&|t|a|g| +0#0000000&@69
|:|s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@62
-|:|s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@60
-|:|s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@61
@57|4|6|9|,|1| @8|3|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump
index 99b374e..c2bba89 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@61
+|:+0&#ffffff0|s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@62
+|:|s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@60
+|:|s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@61
|:|s+0#af5f00255&|t|a|t|i|c| +0#0000000&@67
|:|s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@63
-|:|s+0#af5f00255&|t|j|u|m|p| +0#0000000&@67
+>:|s+0#af5f00255&|t|j|u|m|p| +0#0000000&@67
|:|s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@65
->:|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@66
+|:|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@66
|:|s+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
|:|s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66
|:|s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@66
@@ -15,6 +17,4 @@
|:|t+0#af5f00255&| +0#0000000&@72
|:|t+0#af5f00255&|N|e|x|t| +0#0000000&@68
|:|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@66
-|:|t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@65
-|:|t+0#af5f00255&|a|b|d|o| +0#0000000&@68
-@57|4|8|7|,|1| @8|4|1|%|
+@57|4|8|7|,|1| @8|4|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump
index e7bcfa9..f575c6f 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|t+0#af5f00255&|a|b|d|o| +0#0000000&@68
+|:+0&#ffffff0|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@66
+|:|t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@65
+|:|t+0#af5f00255&|a|b|d|o| +0#0000000&@68
|:|t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@66
|:|t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@66
-|:|t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@65
+>:|t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@65
|:|t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@66
->:|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@66
+|:|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@66
|:|t+0#af5f00255&|a|b|n|e|w| +0#0000000&@67
|:|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@66
|:|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@66
@@ -15,6 +17,4 @@
|:|t+0#af5f00255&|a|g|s| +0#0000000&@69
|:|t+0#af5f00255&|c|d| +0#0000000&@70
|:|t+0#af5f00255&|c|h|d|i|r| +0#0000000&@67
-|:|t+0#af5f00255&|c|l| +0#0000000&@70
-|:|t+0#af5f00255&|c|l|d|o| +0#0000000&@68
@57|5|0|5|,|1| @8|4|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump
index 52f113e..261cf89 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|t+0#af5f00255&|c|l|d|o| +0#0000000&@68
+|:+0&#ffffff0|t+0#af5f00255&|c|h|d|i|r| +0#0000000&@67
+|:|t+0#af5f00255&|c|l| +0#0000000&@70
+|:|t+0#af5f00255&|c|l|d|o| +0#0000000&@68
|:|t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@66
|:|t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@66
-|:|t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@65
+>:|t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@65
|:|t+0#af5f00255&|f|i|r|s|t| +0#0000000&@67
->:|t+0#af5f00255&|h|r|o|w| +0#0000000&@68
+|:|t+0#af5f00255&|h|r|o|w| +0#0000000&@68
|:|t+0#af5f00255&|j|u|m|p| +0#0000000&@68
|:|t+0#af5f00255&|l|a|s|t| +0#0000000&@68
|:|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|t+0#af5f00255&|n|e|x|t| +0#0000000&@68
|:|t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
|:|t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@66
-|:|t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64
-|:|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
-@57|5|2|3|,|1| @8|4@1|%|
+@57|5|2|3|,|1| @8|4|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_30.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_30.dump
index ae4b19d..d00225d 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_30.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_30.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
+|:+0&#ffffff0|t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@66
+|:|t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64
+|:|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66
|:|t+0#af5f00255&|r|y| +0#0000000&@70
|:|t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@66
-|:|t+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
+>:|t+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
|:|t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66
->:|u+0#af5f00255&|n|d|o| +0#0000000&@69
+|:|u+0#af5f00255&|n|d|o| +0#0000000&@69
|:|u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@65
|:|u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@65
|:|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@61
@@ -15,6 +17,4 @@
|:|u+0#af5f00255&|n|m|e|n|u| +0#0000000&@67
|:|u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@65
|:|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@67
-|:|v+0#af5f00255&|g|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@61
-|:|v+0#af5f00255&|a|r| +0#0000000&@70
@57|5|4|1|,|1| @8|4|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_31.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_31.dump
index 575a94f..07075f7 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_31.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_31.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|v+0#af5f00255&|a|r| +0#0000000&@70
+|:+0&#ffffff0|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@67
+|:|v+0#af5f00255&|g|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@61
+|:|v+0#af5f00255&|a|r| +0#0000000&@70
|:|v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@66
|:|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@66
-|:|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@65
+>:|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@65
|:|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@66
->:|v+0#af5f00255&|i|m|9|s|c|r|i|p|t| +0#0000000&@63
+|:|v+0#af5f00255&|i|m|9|s|c|r|i|p|t| +0#0000000&@63
|:|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@66
|:|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@63
|:|v+0#af5f00255&|i|s|u|a|l| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|v+0#af5f00255&|n|e|w| +0#0000000&@69
|:|v+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
|:|v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
-|:|v+0#af5f00255&|s|p|l|i|t| +0#0000000&@67
-|:|v+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
@57|5@1|9|,|1| @8|4|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump
index 2a225b8..25eecd9 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|v+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
+|:+0&#ffffff0|v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
+|:|v+0#af5f00255&|s|p|l|i|t| +0#0000000&@67
+|:|v+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
|:|v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66
|:|w+0#af5f00255&|i|n|d|o| +0#0000000&@68
-|:|w+0#af5f00255&|r|i|t|e| +0#0000000&@68
+>:|w+0#af5f00255&|r|i|t|e| +0#0000000&@68
|:|w+0#af5f00255&|N|e|x|t| +0#0000000&@68
->:|w+0#af5f00255&|a|l@1| +0#0000000&@69
+|:|w+0#af5f00255&|a|l@1| +0#0000000&@69
|:|w+0#af5f00255&|h|i|l|e| +0#0000000&@68
|:|w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@66
|:|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@67
@@ -15,6 +17,4 @@
|:|w+0#af5f00255&|u|n|d|o| +0#0000000&@68
|:|w+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@65
|:|x+0#af5f00255&|i|t| +0#0000000&@70
-|:|x+0#af5f00255&|a|l@1| +0#0000000&@69
-|:|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
@57|5|7@1|,|1| @8|4|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump
index 4168e67..1339b80 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump
@@ -1,9 +1,11 @@
-|:+0&#ffffff0|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
+|:+0&#ffffff0|x+0#af5f00255&|i|t| +0#0000000&@70
+|:|x+0#af5f00255&|a|l@1| +0#0000000&@69
+|:|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64
|:|x+0#af5f00255&|m|a|p| +0#0000000&@69
|:|x+0#af5f00255&|m|e|n|u| +0#0000000&@68
-|:|x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@65
+>:|x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@65
|:|x+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65
->:|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
+|:|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64
|:|x+0#af5f00255&|u|n|m|a|p| +0#0000000&@67
|:|x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66
|:|y+0#af5f00255&|a|n|k| +0#0000000&@69
@@ -14,7 +16,5 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|||h+0#af5f00255&|e|l|p| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)||+0#0000000&| |h+0#af5f00255&|e|l|p| +0#0000000&@58
@75
-|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a|p@1|e|n|d| @55
-@4|t|e|x|t| @66
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |2+0#af5f00255&|m|a|t|c|h| +0#0000000&@55
@57|5|9|5|,|1| @8|5|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump
index bf88d4f..2c442cb 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump
@@ -1,9 +1,13 @@
-| +0&#ffffff0@3|t|e|x|t| @66
-|.+0#af5f00255&| +0#0000000&@73
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |2+0#af5f00255&|m|a|t|c|h| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |3+0#af5f00255&|m|a|t|c|h| +0#0000000&@55
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a|p@1|e|n|d| @55
+@4|t|e|x|t| @66
+>.+0#af5f00255&| +0#0000000&@73
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@52
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|l@1| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|l@1| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|m|e|n|u| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|s| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|s|c|i@1| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@54
@57|6|1|3|,|1| @8|5|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump
index 01cefde..fcc0eb0 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|F|o@1| ||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @36
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|s|c|i@1| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|F|o@1| ||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @36
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|N|e|x|t| +0#0000000&@56
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l@1| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l@1| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|d@1| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l|t| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@54
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|l|a|s|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|n|e|x|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
@57|6|3|1|,|1| @8|5|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump
index 3658621..816aed4 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k| +0#0000000&@56
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|n|e|x|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|a|d@1| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|d|e|l| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@52
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f|d|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@54
@@ -13,8 +17,4 @@
@4|t|e|x|t| @66
|.+0#af5f00255&| +0#0000000&@73
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|e|x|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|f|i|l|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|o|v|e| +0#0000000&@55
@57|6|4|9|,|1| @8|5|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump
index 3da296c..4e7a780 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|o|v|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@51
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|e|x|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|f|i|l|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|o|v|e| +0#0000000&@55
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|f|t|e|r| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|l@1| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|l@1| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|e|l|o|w| +0#0000000&@55
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&@1|l|o|s|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d| +0#0000000&@59
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d|o| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|d|o| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|n|t|e|r| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|x|p|r| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|l|e| +0#0000000&@56
@57|6@1|7|,|1| @8|5|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump
index 33e2088..51f5a8c 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|l|e| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d|o| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|d|o| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|n|t|e|r| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|x|p|r| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|l|e| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@53
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|d|i|r| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|e|c|k|p|a|t|h| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@52
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|e|a|r|j|u|m|p|s| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|i|s|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|o|s|e| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|e|n|u| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|x|t| +0#0000000&@56
@57|6|8|5|,|1| @8|5|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump
index ef99508..35d89fb 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|x|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|w|e|r| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|o|s|e| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|e|n|u| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|x|t| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|w|e|r| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|f|i|l|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@50
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|y| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|l|d|e|r| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@50
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|s|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|e|n| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|f|i|l|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|q|u|i|t| +0#0000000&@56
@57|7|0|3|,|1| @8|5|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump
index 29d35c5..a4c2e52 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|q|u|i|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|s|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|e|n| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|f|i|l|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|q|u|i|t| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|s|c|o|p|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|s|t|a|g| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|e|t|e| +0#0000000&@55
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|e|r| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@51
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@50
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@51
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@54
-@57|7|2|1|,|1| @8|6|1|%|
+@57|7|2|1|,|1| @8|6|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump
index 426028d..f9fb600 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@54
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@51
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@50
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@51
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|s|p|l|i|t| +0#0000000&@52
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@50
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|p| +0#0000000&@59
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|r|o|p| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|p|l|i|t| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&@57
@57|7|3|9|,|1| @8|6|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump
index 97e291f..12db3d0 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@54
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|p| +0#0000000&@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|r|o|p| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|p|l|i|t| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&@57
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@54
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|n| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@51
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@50
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@53
-@57|7|5|7|,|1| @8|6|4|%|
+@57|7|5|7|,|1| @8|6|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump
index 6764cea..fd68f59 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|e|w| +0#0000000&@57
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@50
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@53
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|e|w| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|v|a|l| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x| +0#0000000&@59
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@54
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|i|t| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|i|t| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|p|o|r|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|d| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|i|s|h| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|r|s|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|x|d|e|l| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d| +0#0000000&@57
@57|7@1|5|,|1| @8|6|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump
index 7456c8d..34a09b1 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@52
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|i|s|h| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|r|s|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|x|d|e|l| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d| +0#0000000&@57
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@49
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@53
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|r| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|r| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|o|t|o| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|v|i|m| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@53
-@57|7|9|3|,|1| @8|6|7|%|
+@57|7|9|3|,|1| @8|6@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump
index df10b4b..25f608e 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@52
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@53
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|d|e| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@51
->"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i|n|s|e|r|t| @55
@4|t|e|x|t| @66
|.+0#af5f00255&| +0#0000000&@73
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|j|u|m|p| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|l|i|s|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|e|n|u| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|p|o|r|t| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
@57|8|1@1|,|1| @8|6|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump
index af1fcde..662461b 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@50
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|e|n|u| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|p|o|r|t| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|t|r|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@54
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|p|l|i|t| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|p|l|i|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@49
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|e|x|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|f|i|l|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|i|s|t| +0#0000000&@57
-@57|8|2|9|,|1| @8|7|0|%|
+@57|8|2|9|,|1| @8|6|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump
index bf31154..48dcb9c 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|i|s|t| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|b|o|v|e| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@49
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|e|x|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|f|i|l|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|i|s|t| +0#0000000&@57
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|b|o|v|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@53
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|f|t|e|r| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|f|t|e|r| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|s|t| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|n|g|u|a|g|e| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|t|e|r| +0#0000000&@56
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|d| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|h|d|i|r| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|l|o|s|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|d|o| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|d|o| +0#0000000&@57
@57|8|4|7|,|1| @8|7|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump
index 0ef0613..6952669 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|d|o| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t| +0#0000000&@57
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|h|d|i|r| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|l|o|s|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|d|o| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|d|o| +0#0000000&@57
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|g|a|c|y| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|t| +0#0000000&@58
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|x|p|r| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|x|p|r| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|i|l|e| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@51
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1| +0#0000000&@59
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|a|s|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|i|s|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|k|e| +0#0000000&@56
@57|8|6|5|,|1| @8|7|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump
index f451055..3f47c96 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|k|e| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p| +0#0000000&@57
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1| +0#0000000&@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|a|s|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|i|s|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|k|e| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|e|x|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|e|w|e|r| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|f|i|l|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|f|i|l|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|a|d|k|e|y|m|a|p| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|a|d|v|i|e|w| +0#0000000&@53
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|p|e|n| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|f|i|l|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|s| +0#0000000&@59
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|t|a|g| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
@57|8@1|3|,|1| @8|7|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump
index 1cd5033..01a8246 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a| +0#0000000&@58
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|f|i|l|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|s| +0#0000000&@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|t|a|g| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a|d|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@53
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@50
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|o|v|e| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k|s| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|t|c|h| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@48
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|e|x|r|c| +0#0000000&@55
@57|9|0|1|,|1| @8|7|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump
index b9d0601..0fb8f18 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|e|x|r|c| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@52
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|t|c|h| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@48
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|e|x|r|c| +0#0000000&@55
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|v|i|e|w| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|o|d|e| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|o|d|e| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|z|f|i|l|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@54
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|e|w| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|e|n|u| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@52
@57|9|1|9|,|1| @8|7@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump
index 7ebe287..810f100 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@54
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|e|n|u| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@52
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@53
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|m|a|l| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|m|a|l| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|m|b|e|r| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|a|p| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|e|n|u| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|l|y| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@54
@57|9|3|7|,|1| @8|7|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump
index 420001c..80238a6 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|e|n|u| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|l|y| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@54
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@50
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|c|l|o|s|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|d|i|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|m|p|t|f|i|n|d| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l|d|o| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p|u|p| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&@1|o|p| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@53
@57|9|5@1|,|1| @8|8|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump
index 2d16427..67137ba 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@53
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l|d|o| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p|u|p| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&@1|o|p| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@53
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|a|g| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|N|e|x|t| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|j|u|m|p| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|l|a|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|n|e|x|t| +0#0000000&@55
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|u|b|l|i|c| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|u|t| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|w|d| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|d|o| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@54
@57|9|7|3|,|1| @8|8|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump
index d172d88..361f834 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|w|d| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|d|o| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|d|o| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|f|i|l|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x| +0#0000000&@58
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x|d|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|c|o|v|e|r| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|o| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|i|r| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@49
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@48
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@52
-@57|9@1|1|,|1| @8|8|4|%|
+@57|9@1|1|,|1| @8|8|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump
index 847d6db..ba57541 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|s|i|z|e| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|i|r| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@49
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@48
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@52
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|s|i|z|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|t|a|b| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|w|i|n|d| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|d|o| +0#0000000&@55
@@ -11,10 +15,6 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|n|d|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||+0#af5f00255&| |s|u|b|s|t|i|t|u|t|e| +0#0000000&@51
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|N|e|x|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|l@1| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|v|e|a|s| +0#0000000&@55
@57|1|0@1|9|,|1| @7|8|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump
index 38ade08..031d9c4 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|v|e|a|s| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@54
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|N|e|x|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|l@1| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|v|e|a|s| +0#0000000&@55
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|N|e|x|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|a|l@1| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|f|i|r|s|t| +0#0000000&@54
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|l|a|s|t| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|l|a|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|n|e|x|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@51
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|v|e|r|s|i|o|n| +0#0000000&@48
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@50
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|n|d| +0#0000000&@56
-@57|1|0|2|7|,|1| @7|8|7|%|
+@57|1|0|2|7|,|1| @7|8|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_58.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_58.dump
index a35547c..1d24fd5 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_58.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_58.dump
@@ -1,20 +1,20 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|n|d| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@50
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|n|d| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|h|e|l@1| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|m|a|l|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|g|n| +0#0000000&@57
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|l|e|n|t| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|l|e|n|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|e@1|p| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|e@1|p|!| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|a|s|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||+0#af5f00255&| |s|m|a|g|i|c| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|g|i|c| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|p| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|e|n|u| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|i|l|e| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|e|x|t| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||+0#af5f00255&| |s|n|o|m|a|g|i|c| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|r|t| +0#0000000&@57
@57|1|0|4|5|,|1| @7|8@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump
index 85800e5..920861c 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|r|t| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|u|r|c|e| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|e|x|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|r|t| +0#0000000&@57
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|u|r|c|e| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@52
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@52
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@51
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|g| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@50
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@48
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@49
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|t|i|c| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@51
-@57|1|0|6|3|,|1| @7|9|0|%|
+@57|1|0|6|3|,|1| @7|8|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump
index 79f5e1e..9733757 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@51
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|j|u|m|p| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@50
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@48
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@49
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|t|i|c| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@51
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|j|u|m|p| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|v|i|e|w| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@53
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&| +0#0000000&@60
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|N|e|x|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@53
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|d|o| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@54
@57|1|0|8|1|,|1| @7|9|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump
index efb27e8..f278eb5 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@53
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|d|o| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|w| +0#0000000&@55
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@50
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@52
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g|s| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|d| +0#0000000&@58
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|h|d|i|r| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|d|o| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@54
-@57|1|0|9@1|,|1| @7|9|3|%|
+@57|1|0|9@1|,|1| @7|9|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump
index 8b85dd9..933f7a0 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@53
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|h|d|i|r| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|d|o| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|f|i|r|s|t| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|h|r|o|w| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|j|u|m|p| +0#0000000&@56
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|a|s|t| +0#0000000&@56
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|a|s|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|m|e|n|u| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@53
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|n|e|x|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|y| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@54
@57|1@2|7|,|1| @7|9|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump
index cf5d08b..f93ac7c 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|y| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@53
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@49
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@49
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|h|i|d|e| +0#0000000&@55
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|e|n|u| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|p|d|a|t|e| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|g|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@49
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|a|r| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@54
@57|1@1|3|5|,|1| @7|9|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump
index bcffc89..5561d99 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@53
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|p|d|a|t|e| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|g|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@49
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|a|r| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|9|s|c|r|i|p|t| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@54
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@51
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@51
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|s|u|a|l| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|e|w| +0#0000000&@57
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|e|w| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|s|p|l|i|t| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|d|o| +0#0000000&@56
@57|1@1|5|3|,|1| @7|9|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump
index 8041747..0e96806 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump
@@ -1,9 +1,13 @@
-|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|d|o| +0#0000000&@56
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|r|i|t|e| +0#0000000&@56
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|s|p|l|i|t| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|d|o| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|r|i|t|e| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|N|e|x|t| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|a|l@1| +0#0000000&@57
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|h|i|l|e| +0#0000000&@56
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|c|m|d| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|p|o|s| +0#0000000&@55
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|n|e|x|t| +0#0000000&@56
@@ -13,8 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|u|n|d|o| +0#0000000&@56
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@53
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|i|t| +0#0000000&@58
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|a|l@1| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p| +0#0000000&@57
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|e|n|u| +0#0000000&@56
@57|1@1|7|1|,|1| @7|9@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump
new file mode 100644
index 0000000..cfb1298
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|i|t| +0#0000000&@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|a|l@1| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|e|n|u| +0#0000000&@56
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@53
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@52
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|a|p| +0#0000000&@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |y+0#af5f00255&|a|n|k| +0#0000000&@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |z+0#af5f00255&| +0#0000000&@60
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1@1|8|9|,|1| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_99.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_99.dump
index 869c6d3..2c0e2ec 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_commands_99.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_commands_99.dump
@@ -17,4 +17,4 @@
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@54
|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |y+0#af5f00255&|a|n|k| +0#0000000&@57
>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |z+0#af5f00255&| +0#0000000&@60
-@57|1@1|9|1|,|1| @7|B|o|t|
+@57|1@1|9|5|,|1| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_00.dump b/runtime/syntax/testdir/dumps/vim_ex_def_00.dump
new file mode 100644
index 0000000..4bc8858
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|d|e|f| |c|o|m@1|a|n|d| +0#0000000&@56
+@75
+@75
+|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&@71
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1| @67
+|d+0#af5f00255&|e|f| +0#0000000&|/+0#af5f00255&|F+0#0000000&|o@1|.|*| @64
+@75
+|d+0#af5f00255&|e|f| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@58
+|d+0#af5f00255&|e|f| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@54
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+@75
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+|"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_01.dump b/runtime/syntax/testdir/dumps/vim_ex_def_01.dump
new file mode 100644
index 0000000..c7b49de
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+|"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+>d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|#+0#0000e05&| |c|u|r|l|y|-|b|r|a|c|e| |n|a|m|e|s| +0#0000000&@55
+|d+0#af5f00255&|e|f| +0#0000000&|{|"|F|"|}|o@1|(+0#e000e06&|)| +0#0000000&@61
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|{|"|o|"|}|o|(+0#e000e06&|)| +0#0000000&@61
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@61
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|{|"|F|"|}|o|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@57
+@57|1|9|,|1| @9|1|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_02.dump b/runtime/syntax/testdir/dumps/vim_ex_def_02.dump
new file mode 100644
index 0000000..7ebe3c6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_02.dump
@@ -0,0 +1,20 @@
+|d+0#af5f00255#ffffff0|e|f| +0#0000000&|{|"|F|"|}|o|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@57
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|{|"|F|"|}|{|"|o|"|}|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@53
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+> @74
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@57
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|#+0#0000e05&| |t|r|a|i|l|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@53
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@57
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@47
+@57|3|7|,|0|-|1| @7|2|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_03.dump b/runtime/syntax/testdir/dumps/vim_ex_def_03.dump
new file mode 100644
index 0000000..50fed41
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_03.dump
@@ -0,0 +1,20 @@
+|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@47
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f|!| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@56
+@2>r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|g+0#e000e06&|:|F+0#0000000&|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@55
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|s+0#e000e06&|:|F+0#0000000&|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@55
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|<+0#e000e06&|S|I|D|>|F+0#0000000&|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@52
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@57|5@1|,|3| @9|4|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_04.dump b/runtime/syntax/testdir/dumps/vim_ex_def_04.dump
new file mode 100644
index 0000000..64141b7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_04.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|f|o@1|#|b|a|r|#|F|o@1|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@49
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+> @74
+|"+0#0000e05&| |s|a|m|e| |n|a|m|e| |a|s| |a|n| |E|x| |c|o|m@1|a|n|d| +0#0000000&@46
+|d+0#af5f00255&|e|f| +0#0000000&|s+0#e000e06&|:|l+0#0000000&|s|(+0#e000e06&|)| +0#0000000&@64
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+@75
+|"+0#0000e05&| |r|e|t|u|r|n| |t|y|p|e|s| +0#0000000&@60
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |v+0#00e0003&|o|i|d| +0#0000000&@59
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |v+0#00e0003&|o|i|d| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@49
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+@57|7|3|,|0|-|1| @7|6|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_05.dump b/runtime/syntax/testdir/dumps/vim_ex_def_05.dump
new file mode 100644
index 0000000..9fc0cfa
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_05.dump
@@ -0,0 +1,20 @@
+|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |l+0#00e0003&|i|s|t|<|d|i|c|t|<|n|u|m|b|e|r|>@1| +0#0000000&@45
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)|:+0#0000000&| |f+0#00e0003&|u|n|c|(|d|i|c|t|<|l|i|s|t|<|n|u|m|b|e|r|>@1|,+0#0000000&| |f+0#00e0003&|u|n|c|,+0#0000000&| |b+0#00e0003&|o@1|l|,+0#0000000&| |f+0#00e0003&|u|n|c|(|n|u|m|b|e|r|,+0#0000000&| |l+0#00e0003&|i|s|t|<|n|u|m|b|e|r|>|)@1
+|:+0#0000000&| |b+0#00e0003&|o@1|l| +0#0000000&@68
+>e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+@75
+|"+0#0000e05&| |:|e|n|d@1|e|f| |t|r|a|i|l|i|n|g| +0#0000000&@56
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+| +0#0000e05&@1|#| |t|r|a|i|l|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@51
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@55
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+@57|9|1|,|1| @9|8|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_06.dump b/runtime/syntax/testdir/dumps/vim_ex_def_06.dump
new file mode 100644
index 0000000..f073026
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_06.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|n|d@1|e|f| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+@75
+@75
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+>d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|x+0#00e0e07&|:+0#0000000&| |b+0#00e0003&|o@1|l|,+0#0000000&| |y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|4+0#e000002&|2|,+0#0000000&| |z+0#00e0e07&|:+0#0000000&| |s+0#00e0003&|t|r|i|n|g| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|z|e|d|"|)+0#e000e06&| +0#0000000&@31
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&| +0#0000000&@66
+@4|x+0#00e0e07&|:+0#0000000&| |b+0#00e0003&|o@1|l|,+0#0000000&| @62
+@4|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|4+0#e000002&|2|,+0#0000000&| @63
+@4|z+0#00e0e07&|:+0#0000000&| |s+0#00e0003&|t|r|i|n|g| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|z|e|d|"|)+0#e000e06&| +0#0000000&@52
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+| +0#0000e05&@1|#| |V|i|m|9|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@51
+@57|1|0|9|,|1| @8|9|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_99.dump b/runtime/syntax/testdir/dumps/vim_ex_def_99.dump
new file mode 100644
index 0000000..2eca72a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_99.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|x+0#00e0e07&|:+0#0000000&| |b+0#00e0003&|o@1|l|,+0#0000000&| |y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|4+0#e000002&|2|,+0#0000000&| |z+0#00e0e07&|:+0#0000000&| |s+0#00e0003&|t|r|i|n|g| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|z|e|d|"|)+0#e000e06&| +0#0000000&@31
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&| +0#0000000&@66
+@4|x+0#00e0e07&|:+0#0000000&| |b+0#00e0003&|o@1|l|,+0#0000000&| @62
+@4|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|4+0#e000002&|2|,+0#0000000&| @63
+@4|z+0#00e0e07&|:+0#0000000&| |s+0#00e0003&|t|r|i|n|g| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|z|e|d|"|)+0#e000e06&| +0#0000000&@52
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+| +0#0000e05&@1|#| |V|i|m|9|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@51
+@2|"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| +0#0000000&@56
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+> @74
+@57|1|2|5|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump
new file mode 100644
index 0000000..78659e7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|d|e|f| |c|o|m@1|a|n|d| +0#0000000&@56
+|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |g|:|v|i|m|s|y|n|_|f|o|l|d|i|n|g| |=| |"+0#e000002&|f|"| +0#0000e05&||| |s|e|t| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@14
+@75
+@75
+|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&@71
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1| @67
+|d+0#af5f00255&|e|f| +0#0000000&|/+0#af5f00255&|F+0#0000000&|o@1|.|*| @64
+@75
+|d+0#af5f00255&|e|f| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@58
+|d+0#af5f00255&|e|f| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@54
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+@75
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+|"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_01.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_01.dump
new file mode 100644
index 0000000..d1803d5
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_01.dump
@@ -0,0 +1,20 @@
+|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+@75
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+>"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+|#+0#0000e05&| |c|u|r|l|y|-|b|r|a|c|e| |n|a|m|e|s| +0#0000000&@55
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |{|"|F|"|}|o@1|(|)|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|{|"|o|"|}|o|(|)|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o|{|"|o|"|}|(|)|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |{|"|F|"|}|o|{|"|o|"|}|(|)|-@43
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |{|"|F|"|}|{|"|o|"|}|{|"|o|"|}|(|)|-@39
+| +0#0000000#ffffff0@74
+@57|1|9|,|1| @9|1|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_02.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_02.dump
new file mode 100644
index 0000000..d9668cd
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o|{|"|o|"|}|(|)|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |{|"|F|"|}|o|{|"|o|"|}|(|)|-@43
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |{|"|F|"|}|{|"|o|"|}|{|"|o|"|}|(|)|-@39
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |n|u|m|b|e|r|-@43
+| +0#0000000#ffffff0@74
+|#+0#0000e05&| |t|r|a|i|l|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@53
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |n|u|m|b|e|r| @1|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)| |#| |c|o|m@1|e|n|t|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |n|u|m|b|e|r| |#| |c|o|m@1|e|n|t|-@33
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f|!| |F|o@1|(|)|:| |n|u|m|b|e|r|-@42
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |g|:|F|o@1|(|)|:| |n|u|m|b|e|r|-@41
+| +0#0000000#ffffff0@56|3|7|,|1| @9|3|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_03.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_03.dump
new file mode 100644
index 0000000..d20fb79
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)| |#| |c|o|m@1|e|n|t|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |n|u|m|b|e|r| |#| |c|o|m@1|e|n|t|-@33
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f|!| |F|o@1|(|)|:| |n|u|m|b|e|r|-@42
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |g|:|F|o@1|(|)|:| |n|u|m|b|e|r|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |s|:|F|o@1|(|)|:| |n|u|m|b|e|r|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |<|S|I|D|>|F|o@1|(|)|:| |n|u|m|b|e|r|-@38
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |f|o@1|#|b|a|r|#|F|o@1|(|)|:| |n|u|m|b|e|r|-@35
+| +0#0000000#ffffff0@74
+|"+0#0000e05&| |s|a|m|e| |n|a|m|e| |a|s| |a|n| |E|x| |c|o|m@1|a|n|d| +0#0000000&@46
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |s|:|l|s|(|)|-@50
+| +0#0000000#ffffff0@74
+@75
+@57|5@1|,|1| @9|4|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_04.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_04.dump
new file mode 100644
index 0000000..bc95a8b
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |s|:|F|o@1|(|)|:| |n|u|m|b|e|r|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |<|S|I|D|>|F|o@1|(|)|:| |n|u|m|b|e|r|-@38
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |f|o@1|#|b|a|r|#|F|o@1|(|)|:| |n|u|m|b|e|r|-@35
+| +0#0000000#ffffff0@74
+|"+0#0000e05&| |s|a|m|e| |n|a|m|e| |a|s| |a|n| |E|x| |c|o|m@1|a|n|d| +0#0000000&@46
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |s|:|l|s|(|)|-@50
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |r|e|t|u|r|n| |t|y|p|e|s| +0#0000000&@60
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |v|o|i|d|-@45
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |v|o|i|d| |#| |c|o|m@1|e|n|t|-@35
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |l|i|s|t|<|d|i|c|t|<|n|u|m|b|e|r|>@1|-@31
+| +0#0000000#ffffff0@74
+@57|7|3|,|1| @9|6|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_05.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_05.dump
new file mode 100644
index 0000000..cc31e3d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |v|o|i|d| |#| |c|o|m@1|e|n|t|-@35
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |l|i|s|t|<|d|i|c|t|<|n|u|m|b|e|r|>@1|-@31
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|:| |f|u|n|c|(|d|i|c|t|<|l|i|s|t|<|n|u|m|b|e|r|>@1|,| |f|u|n|c|,| |b|o@1|l|,| |f|u|n|c|(|n|u|m|b|e|r|,|
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |:|e|n|d@1|e|f| |t|r|a|i|l|i|n|g| +0#0000000&@56
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+@57|9|1|,|1| @9|8|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_06.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_06.dump
new file mode 100644
index 0000000..c93c671
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+> @74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|x|:| |b|o@1|l|,| |y| |=| |4|2|,| |z|:| |s|t|r|i|n|g| |=| |"|z|e|d|"|)|-@17
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|5| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|-@52
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|4| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|0|9|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_99.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_99.dump
new file mode 100644
index 0000000..0b4fce2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|x|:| |b|o@1|l|,| |y| |=| |4|2|,| |z|:| |s|t|r|i|n|g| |=| |"|z|e|d|"|)|-@17
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|5| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|-@52
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|4| |l|i|n|e|s|:| |d|e|f| |F|o@1|(|)|-@51
+> +0#0000000#ffffff0@74
+@57|1|2|6|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_00.dump b/runtime/syntax/testdir/dumps/vim_ex_echo_00.dump
new file mode 100644
index 0000000..f42ea1d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_echo_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|e|c|h|o| |c|o|m@1|a|n|d|s| +0#0000000&@54
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&@7|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|n| +0#0000000&@6|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@4|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@1|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@4|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|f|o|l@1|o|w|i|n|g| |c|o|m@1|a|n|d| |i|s| |:|||"| +0#0000000&||| ||| @40
+@75
+|e+0#af5f00255&|c|h|o|h|l| +0#0000000&|W+0#00e0003&|a|r|n|i|n|g|M|s|g| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|D|o|n|'|t| |p|a|n|i|c|!|"| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| +0#0000000&|N+0#00e0003&|o|n|e| +0#0000000&@21
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&@58
+@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@64
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&@70
+@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&@55
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump b/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump
new file mode 100644
index 0000000..21e7bd2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&@58
+@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@64
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&@70
+@6>\+0#e000e06&| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| +0#0000000&@55
+@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@64
+@75
+|"+0#0000e05&| |:|e|c|h|o| |w|i|t|h|o|u|t| |{|e|x|p|r|}| +0#0000000&@52
+|e+0#af5f00255&|c|h|o||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@58
+@75
+|"+0#0000e05&| |t|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |n|e@1|d|s| ||| +0#0000000&@48
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|f|o@1|"| +0#0000000&||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|9@1|8|7| |(|p|a|r|e|n|t|h|e|s|i|s|e|d| |a|r|g|u|m|e|n|t| |-| |n|o|t| |a| |f|u|n|c|t|i|o|n| |c|a|l@1|)| +0#0000000&@14
+@75
+|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|'+0#e000002&|e|n|d|'|:+0#0000000&| |1+0#e000002&|2|3|}+0#e000e06&| +0#0000000&@52
+@57|1|9|,|7| @9|6|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_99.dump b/runtime/syntax/testdir/dumps/vim_ex_echo_99.dump
new file mode 100644
index 0000000..db81b40
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_echo_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@4|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@64
+@75
+|"+0#0000e05&| |:|e|c|h|o| |w|i|t|h|o|u|t| |{|e|x|p|r|}| +0#0000000&@52
+|e+0#af5f00255&|c|h|o||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@58
+@75
+|"+0#0000e05&| |t|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |n|e@1|d|s| ||| +0#0000000&@48
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|f|o@1|"| +0#0000000&||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|9@1|8|7| |(|p|a|r|e|n|t|h|e|s|i|s|e|d| |a|r|g|u|m|e|n|t| |-| |n|o|t| |a| |f|u|n|c|t|i|o|n| |c|a|l@1|)| +0#0000000&@14
+@75
+|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|'+0#e000002&|e|n|d|'|:+0#0000000&| |1+0#e000002&|2|3|}+0#e000e06&| +0#0000000&@52
+@75
+|i+0#af5f00255&|f| +0#0000000&|1+0#e000002&|2|3| +0#0000000&@68
+@8|e+0#af5f00255&|c|h|o| +0#0000000&|(+0#e000e06&|f+0#00e0e07&|o@1|.+0#af5f00255&|e+0#00e0e07&|n|d|)+0#e000e06&| +0#0000000&@52
+|e+0#af5f00255&|l|s|e| +0#0000000&@70
+@8|e+0#af5f00255&|c|h|o| +0#0000000&|'+0#e000002&|b|a|r|'| +0#0000000&@56
+>e+0#af5f00255&|n|d|i|f| +0#0000000&@69
+@57|3|8|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_execute_00.dump b/runtime/syntax/testdir/dumps/vim_ex_execute_00.dump
new file mode 100644
index 0000000..55d88af
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_execute_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|e|x|e|c|u|t|e| |c|o|m@1|a|n|d| +0#0000000&@52
+@75
+|"+0#0000e05&| |:|h|e|l|p| |:|e|x|e|c|u|t|e| +0#0000000&@58
+@75
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|b|u|f@1|e|r|"| +0#0000000&|n+0#00e0e07&|e|x|t|b|u|f| +0#0000000&@50
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|n|o|r|m|a|l|"| +0#0000000&|c+0#00e0e07&|o|u|n|t| +0#0000000&|.+0#af5f00255&@1| +0#0000000&|"+0#e000002&|w|"| +0#0000000&@45
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|'+0#e000002&|!|l|s|'| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|t|h|e@1|n|d|"| +0#0000000&@45
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|n|o|r|m|a|l| |i|x@2|\+0#e000e06&|<|E|s|c|>|"+0#e000002&| +0#0000000&@47
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|e| |"| +0#0000000&|.+0#af5f00255&@1| +0#0000000&|f+0#00e0e07&|n|a|m|e@1|s|c|a|p|e|(+0#e000e06&|f+0#00e0e07&|i|l|e|n|a|m|e|)+0#e000e06&| +0#0000000&@37
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|!|l|s| |"| +0#0000000&|.+0#af5f00255&@1| +0#0000000&|s+0#00e0e07&|h|e|l@1|e|s|c|a|p|e|(+0#e000e06&|f+0#00e0e07&|i|l|e|n|a|m|e|,+0#0000000&| |1+0#e000002&|)+0#e000e06&| +0#0000000&@32
+|i+0#af5f00255&|f| +0#0000000&|0+0#e000002&| +0#0000000&@70
+@1|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|'+0#e000002&|w|h|i|l|e| |i| |>| |5|'| +0#0000000&@52
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|t|e|s|t|"| +0#0000000&@61
+@1|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@65
+|e+0#af5f00255&|n|d|i|f| +0#0000000&@69
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|'+0#e000002&|w|h|i|l|e| |i| |<| |5| ||| |e|c|h|o| |i| ||| |l|e|t| |i| |=| |i| |+| |1| ||| |e|n|d|w|h|i|l|e|'| +0#0000000&@17
+@75
+|"+0#0000e05&| |f|o|l@1|o|w|i|n|g| |c|o|m@1|a|n|d| |i|s| |:|||"| +0#0000000&@48
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|c|a|l@1| |F|o@1|(|)|"| +0#0000000&||| ||| @50
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_execute_01.dump b/runtime/syntax/testdir/dumps/vim_ex_execute_01.dump
new file mode 100644
index 0000000..5330ff3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_execute_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@65
+|e+0#af5f00255&|n|d|i|f| +0#0000000&@69
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|'+0#e000002&|w|h|i|l|e| |i| |<| |5| ||| |e|c|h|o| |i| ||| |l|e|t| |i| |=| |i| |+| |1| ||| |e|n|d|w|h|i|l|e|'| +0#0000000&@17
+@75
+|"+0#0000e05&| |f|o|l@1|o|w|i|n|g| |c|o|m@1|a|n|d| |i|s| |:|||"| +0#0000000&@48
+>e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|c|a|l@1| |F|o@1|(|)|"| +0#0000000&||| ||| @50
+@75
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|c|a|l@1|"| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|F|o@1|(|)|"| +0#0000000&@59
+@75
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@67
+@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|c|a|l@1|"| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|F|o@1|(|)|"| +0#0000000&@59
+@75
+|"+0#0000e05&| |:|e|x|e|c|u|t|e| |w|i|t|h|o|u|t| |{|e|x|p|r|}| +0#0000000&@49
+|e+0#af5f00255&|x|e|c|u|t|e||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@55
+@75
+@57|1|9|,|1| @9|5|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_execute_02.dump b/runtime/syntax/testdir/dumps/vim_ex_execute_02.dump
new file mode 100644
index 0000000..fbc1fea
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_execute_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|"+0#0000e05&| |t|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |n|e@1|d|s| ||| +0#0000000&@48
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|f|o@1|"| +0#0000000&||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@49
+@75
+@75
+>"+0#0000e05&| |I|s@1|u|e| |#|9@1|8|7| |(|p|a|r|e|n|t|h|e|s|i|s|e|d| |a|r|g|u|m|e|n|t| |-| |n|o|t| |a| |f|u|n|c|t|i|o|n| |c|a|l@1|)| +0#0000000&@14
+@75
+|"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|e|x|e|c|u|t|e| |i|s| |e|x| |c|o|m@1|a|n|d| |n|o|t| |b|u|i|l|t|i|n| |f|u|n|c|t|i|o|n| +0#0000000&@23
+|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|'+0#e000002&|a|r|g|'|:+0#0000000&| |"+0#e000002&|c|a|l@1| |F|o@1|(|)|"|}+0#e000e06&| +0#0000000&@43
+|e+0#00e0e07&|x|e|c|u|t|e| +0#0000000&|(+0#e000e06&|f+0#00e0e07&|o@1|.+0#af5f00255&|a+0#00e0e07&|r|g|)+0#e000e06&| +0#0000000&@57
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|3|7|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_execute_99.dump b/runtime/syntax/testdir/dumps/vim_ex_execute_99.dump
new file mode 100644
index 0000000..afc498c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_execute_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|"+0#e000002&|F|o@1|(|)|"| +0#0000000&@59
+@75
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@67
+@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|c|a|l@1|"| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|F|o@1|(|)|"| +0#0000000&@59
+@75
+|"+0#0000e05&| |:|e|x|e|c|u|t|e| |w|i|t|h|o|u|t| |{|e|x|p|r|}| +0#0000000&@49
+|e+0#af5f00255&|x|e|c|u|t|e||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@55
+@75
+|"+0#0000e05&| |t|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |n|e@1|d|s| ||| +0#0000000&@48
+|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|"+0#e000002&|f|o@1|"| +0#0000000&||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@49
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|9@1|8|7| |(|p|a|r|e|n|t|h|e|s|i|s|e|d| |a|r|g|u|m|e|n|t| |-| |n|o|t| |a| |f|u|n|c|t|i|o|n| |c|a|l@1|)| +0#0000000&@14
+@75
+|"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|e|x|e|c|u|t|e| |i|s| |e|x| |c|o|m@1|a|n|d| |n|o|t| |b|u|i|l|t|i|n| |f|u|n|c|t|i|o|n| +0#0000000&@23
+|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|'+0#e000002&|a|r|g|'|:+0#0000000&| |"+0#e000002&|c|a|l@1| |F|o@1|(|)|"|}+0#e000e06&| +0#0000000&@43
+>e+0#00e0e07&|x|e|c|u|t|e| +0#0000000&|(+0#e000e06&|f+0#00e0e07&|o@1|.+0#af5f00255&|a+0#00e0e07&|r|g|)+0#e000e06&| +0#0000000&@57
+@57|4|1|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_func_00.dump b/runtime/syntax/testdir/dumps/vim_ex_func_00.dump
new file mode 100644
index 0000000..d89f64e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_func_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |Y|N|T|A|X|_|E|X|E| |l|e|t| |g|:|v|i|m|s|y|n|_|n|o|e|r@1|o|r| |=| |1| +0#0000000&@38
+@75
+|f+0#af5f00255&|u|n|c| +0#0000000&|d+0#ffffff16#ff404010|o|i|t|(+0#e000e06#ffffff0|)| +0#0000000&@63
+@75
+|e+0#af5f00255&|n|d|f|u|n|c| +0#0000000&@67
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@74
diff --git a/runtime/syntax/testdir/dumps/vim_ex_func_99.dump b/runtime/syntax/testdir/dumps/vim_ex_func_99.dump
new file mode 100644
index 0000000..f4ec08f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_func_99.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |Y|N|T|A|X|_|E|X|E| |l|e|t| |g|:|v|i|m|s|y|n|_|n|o|e|r@1|o|r| |=| |1| +0#0000000&@38
+@75
+|f+0#af5f00255&|u|n|c| +0#0000000&|d+0#ffffff16#ff404010|o|i|t|(+0#e000e06#ffffff0|)| +0#0000000&@63
+@75
+>e+0#af5f00255&|n|d|f|u|n|c| +0#0000000&@67
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@74
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_00.dump b/runtime/syntax/testdir/dumps/vim_ex_function_00.dump
new file mode 100644
index 0000000..5c67fd8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|f|u|n|c|t|i|o|n| |c|o|m@1|a|n|d| +0#0000000&@51
+@75
+@75
+|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@66
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1| @62
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|/+0#af5f00255&|F+0#0000000&|o@1|.|*| @59
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@53
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@49
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+|"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_01.dump b/runtime/syntax/testdir/dumps/vim_ex_function_01.dump
new file mode 100644
index 0000000..8e169ef
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+|"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+>f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|"+0#0000e05&| |c|u|r|l|y|-|b|r|a|c|e| |n|a|m|e|s| +0#0000000&@55
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|{|"|F|"|}|o@1|(+0#e000e06&|)| +0#0000000&@56
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|{|"|o|"|}|o|(+0#e000e06&|)| +0#0000000&@56
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@56
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|{|"|F|"|}|o|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@52
+@57|1|9|,|1| @10|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_02.dump b/runtime/syntax/testdir/dumps/vim_ex_function_02.dump
new file mode 100644
index 0000000..a6a5eff
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_02.dump
@@ -0,0 +1,20 @@
+|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|{|"|F|"|}|o|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@52
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|{|"|F|"|}|{|"|o|"|}|{|"|o|"|}|(+0#e000e06&|)| +0#0000000&@48
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+> @74
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|"+0#0000e05&| |t|r|a|i|l|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@53
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@50
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@57|3|7|,|0|-|1| @7|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_03.dump b/runtime/syntax/testdir/dumps/vim_ex_function_03.dump
new file mode 100644
index 0000000..af74e02
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@59
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+>f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|g+0#e000e06&|:|F+0#0000000&|o@1|(+0#e000e06&|)| +0#0000000&@58
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|s+0#e000e06&|:|F+0#0000000&|o@1|(+0#e000e06&|)| +0#0000000&@58
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|<+0#e000e06&|S|I|D|>|F+0#0000000&|o@1|(+0#e000e06&|)| +0#0000000&@55
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f|o@1|#|b|a|r|#|F|o@1|(+0#e000e06&|)| +0#0000000&@52
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+@57|5@1|,|1| @9|3|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_04.dump b/runtime/syntax/testdir/dumps/vim_ex_function_04.dump
new file mode 100644
index 0000000..a862ede
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@1|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|"+0#0000e05&| |s|a|m|e| |n|a|m|e| |a|s| |a|n| |E|x| |c|o|m@1|a|n|d| +0#0000000&@46
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|s+0#e000e06&|:|l+0#0000000&|s|(+0#e000e06&|)| +0#0000000&@59
+>e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| |m|o|d|i|f|i|e|r|s| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&@54
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@44
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&@54
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@57|7|3|,|1| @9|4|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_05.dump b/runtime/syntax/testdir/dumps/vim_ex_function_05.dump
new file mode 100644
index 0000000..10b56cc
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_05.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|a+0#e000e06&|b|o|r|t| +0#0000000&@54
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+> @74
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|d+0#e000e06&|i|c|t| +0#0000000&@55
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|c+0#e000e06&|l|o|s|u|r|e| +0#0000000&@52
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&|a+0#e000e06&|b|o|r|t| +0#0000000&|d+0#e000e06&|i|c|t| +0#0000000&|c+0#e000e06&|l|o|s|u|r|e| +0#0000000&@35
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&@53
+@57|9|1|,|0|-|1| @7|5|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_06.dump b/runtime/syntax/testdir/dumps/vim_ex_function_06.dump
new file mode 100644
index 0000000..036e16a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_06.dump
@@ -0,0 +1,20 @@
+|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&@53
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|a+0#e000e06&|b|o|r|t| +0#0000000&@53
+@2>r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|d+0#e000e06&|i|c|t| +0#0000000&@54
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|c+0#e000e06&|l|o|s|u|r|e| +0#0000000&@51
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|r+0#e000e06&|a|n|g|e| +0#0000000&|a+0#e000e06&|b|o|r|t| +0#0000000&|d+0#e000e06&|i|c|t| +0#0000000&|c+0#e000e06&|l|o|s|u|r|e| +0#0000000&@34
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@57|1|0|9|,|3| @8|6|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_07.dump b/runtime/syntax/testdir/dumps/vim_ex_function_07.dump
new file mode 100644
index 0000000..40b00b0
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_07.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| |:|e|n|d|f|u|n|c|t|i|o|n| |t|r|a|i|l|i|n|g| +0#0000000&@51
+@75
+>f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+| +0#0000e05&@1|"| |t|r|a|i|l|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@51
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@50
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53
+@75
+@75
+@57|1|2|7|,|1| @8|7|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_08.dump b/runtime/syntax/testdir/dumps/vim_ex_function_08.dump
new file mode 100644
index 0000000..37b31ce
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_08.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|x+0#00e0e07&|,+0#0000000&| |y+0#00e0e07&|,+0#0000000&| |z+0#00e0e07&|,+0#0000000&| |.+0#00e0e07&@2|)+0#e000e06&| +0#0000000&@48
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+>e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|x+0#00e0e07&|,+0#0000000&| @64
+@6|\+0#e000e06&| +0#0000000&|y+0#00e0e07&|,+0#0000000&| @64
+@6|\+0#e000e06&| +0#0000000&|z+0#00e0e07&|,+0#0000000&| @64
+@6|\+0#e000e06&| +0#0000000&|.+0#00e0e07&@2|)+0#e000e06&| +0#0000000&@62
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|x+0#00e0e07&|,+0#0000000&| |y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|4+0#e000002&|2|,+0#0000000&| |z+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|z|e|d|"|)+0#e000e06&| +0#0000000&@40
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@57|1|4|5|,|1| @8|8|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_09.dump b/runtime/syntax/testdir/dumps/vim_ex_function_09.dump
new file mode 100644
index 0000000..94f80da
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_09.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|x+0#00e0e07&|,+0#0000000&| @64
+@6|\+0#e000e06&| +0#0000000&|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|4+0#e000002&|2|,+0#0000000&| @59
+@6|\+0#e000e06&| +0#0000000&|z+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|z|e|d|"|)+0#e000e06&| +0#0000000&@56
+@2>r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+| +0#0000e05&@1|"| |L|e|g|a|c|y|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@49
+@2|#| |4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| |d|e|l|e|t|e| |f|u|n|c|t|i|o|n| +0#0000000&@57
+@57|1|6|3|,|3| @8|9|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_99.dump b/runtime/syntax/testdir/dumps/vim_ex_function_99.dump
new file mode 100644
index 0000000..7eed707
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_99.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+| +0#0000e05&@1|"| |L|e|g|a|c|y|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@49
+@2|#| |4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@63
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| |d|e|l|e|t|e| |f|u|n|c|t|i|o|n| +0#0000000&@57
+@75
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|F|o@1| @59
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|f|o@1|.+0#af5f00255&|b+0#0000000&|a|r| @55
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1| @58
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|f|o@1|.+0#af5f00255&|b+0#0000000&|a|r| @55
+> @74
+@57|1|8|2|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump
new file mode 100644
index 0000000..fb83fde
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|f|u|n|c|t|i|o|n| |c|o|m@1|a|n|d| +0#0000000&@51
+|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |g|:|v|i|m|s|y|n|_|f|o|l|d|i|n|g| |=| |"+0#e000002&|f|"| +0#0000e05&||| |s|e|t| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@14
+@75
+@75
+|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@66
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1| @62
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|/+0#af5f00255&|F+0#0000000&|o@1|.|*| @59
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@53
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@49
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+|"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_01.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_01.dump
new file mode 100644
index 0000000..461531d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_01.dump
@@ -0,0 +1,20 @@
+|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@62
+@75
+>"+0#0000e05&| |e|m|p|t|y| |d|e|f|i|n|i|t|i|o|n| +0#0000000&@56
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+|"+0#0000e05&| |c|u|r|l|y|-|b|r|a|c|e| |n|a|m|e|s| +0#0000000&@55
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |{|"|F|"|}|o@1|(|)|-@42
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|{|"|o|"|}|o|(|)|-@42
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o|{|"|o|"|}|(|)|-@42
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |{|"|F|"|}|o|{|"|o|"|}|(|)|-@38
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |{|"|F|"|}|{|"|o|"|}|{|"|o|"|}|(|)|-@34
+| +0#0000000#ffffff0@74
+@57|1|9|,|1| @10|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_02.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_02.dump
new file mode 100644
index 0000000..3a64c7f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o|{|"|o|"|}|(|)|-@42
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |{|"|F|"|}|o|{|"|o|"|}|(|)|-@38
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |{|"|F|"|}|{|"|o|"|}|{|"|o|"|}|(|)|-@34
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+|"+0#0000e05&| |t|r|a|i|l|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@53
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| @1|-@44
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |"| |c|o|m@1|e|n|t|-@36
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)|-@45
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |g|:|F|o@1|(|)|-@44
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |s|:|F|o@1|(|)|-@44
+| +0#0000000#ffffff0@56|3|7|,|1| @9|1|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_03.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_03.dump
new file mode 100644
index 0000000..3f26306
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_03.dump
@@ -0,0 +1,20 @@
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| @1|-@44
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |"| |c|o|m@1|e|n|t|-@36
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)|-@45
+> +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |g|:|F|o@1|(|)|-@44
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |s|:|F|o@1|(|)|-@44
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |<|S|I|D|>|F|o@1|(|)|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |f|o@1|#|b|a|r|#|F|o@1|(|)|-@38
+| +0#0000000#ffffff0@74
+|"+0#0000e05&| |s|a|m|e| |n|a|m|e| |a|s| |a|n| |E|x| |c|o|m@1|a|n|d| +0#0000000&@46
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |s|:|l|s|(|)|-@45
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |m|o|d|i|f|i|e|r|s| +0#0000000&@63
+@57|5@1|,|0|-|1| @7|2|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_04.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_04.dump
new file mode 100644
index 0000000..52423a2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_04.dump
@@ -0,0 +1,20 @@
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |<|S|I|D|>|F|o@1|(|)|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |f|o@1|#|b|a|r|#|F|o@1|(|)|-@38
+| +0#0000000#ffffff0@74
+|"+0#0000e05&| |s|a|m|e| |n|a|m|e| |a|s| |a|n| |E|x| |c|o|m@1|a|n|d| +0#0000000&@46
+>++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |s|:|l|s|(|)|-@45
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |m|o|d|i|f|i|e|r|s| +0#0000000&@63
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e|-@40
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e| |"| |c|o|m@1|e|n|t|-@30
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e|-@40
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |a|b|o|r|t|-@40
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |d|i|c|t|-@41
+| +0#0000000#ffffff0@56|7|3|,|1| @9|4|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_05.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_05.dump
new file mode 100644
index 0000000..d2acafc
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|2| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e| |"| |c|o|m@1|e|n|t|-@30
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e|-@40
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |a|b|o|r|t|-@40
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |d|i|c|t|-@41
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |c|l|o|s|u|r|e|-@38
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e| |a|b|o|r|t| |d|i|c|t| |c|l|o|s|u|r|e|-@21
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |r|a|n|g|e|-@39
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |a|b|o|r|t|-@39
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |d|i|c|t|-@40
+| +0#0000000#ffffff0@74
+@57|9|1|,|1| @9|5|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_06.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_06.dump
new file mode 100644
index 0000000..354af8e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)| |r|a|n|g|e| |a|b|o|r|t| |d|i|c|t| |c|l|o|s|u|r|e|-@21
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |r|a|n|g|e|-@39
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |a|b|o|r|t|-@39
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |d|i|c|t|-@40
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |c|l|o|s|u|r|e|-@37
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |r|a|n|g|e| |a|b|o|r|t| |d|i|c|t| |c|l|o|s|u|r|e|-@20
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |:|e|n|d|f|u|n|c|t|i|o|n| |t|r|a|i|l|i|n|g| +0#0000000&@51
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|4| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@56|1|0|9|,|1| @8|6|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_07.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_07.dump
new file mode 100644
index 0000000..fc403c5
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_07.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n|!| |F|o@1|(|)| |r|a|n|g|e| |a|b|o|r|t| |d|i|c|t| |c|l|o|s|u|r|e|-@20
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |:|e|n|d|f|u|n|c|t|i|o|n| |t|r|a|i|l|i|n|g| +0#0000000&@51
+> @74
+|++0#0000e05#a8a8a8255|-@1| @1|4| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|x|,| |y|,| |z|,| |.@2|)|-@34
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|7| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+@57|1|2|7|,|0|-|1| @6|8|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_08.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_08.dump
new file mode 100644
index 0000000..4d519d0
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_08.dump
@@ -0,0 +1,20 @@
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |p|a|r|a|m|e|t|e|r|s| +0#0000000&@62
+@75
+>++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|x|,| |y|,| |z|,| |.@2|)|-@34
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|7| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|x|,| |y| |=| |4|2|,| |z| |=| |"|z|e|d|"|)|-@26
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|6| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|5| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+@75
+@57|1|4|5|,|3|-|1| @6|9|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_09.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_09.dump
new file mode 100644
index 0000000..8ecc529
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_09.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|7| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|x|,| |y| |=| |4|2|,| |z| |=| |"|z|e|d|"|)|-@26
+| +0#0000000#ffffff0@74
+>++0#0000e05#a8a8a8255|-@1| @1|6| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|5| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |d|e|l|e|t|e| |f|u|n|c|t|i|o|n| +0#0000000&@57
+@75
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|F|o@1| @59
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|f|o@1|.+0#af5f00255&|b+0#0000000&|a|r| @55
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1| @58
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|f|o@1|.+0#af5f00255&|b+0#0000000&|a|r| @55
+@57|1|6|3|,|7|-|1| @6|9@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_99.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_99.dump
new file mode 100644
index 0000000..b6770ef
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_99.dump
@@ -0,0 +1,20 @@
+|++0#0000e05#a8a8a8255|-@1| @1|7| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|3| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|x|,| |y| |=| |4|2|,| |z| |=| |"|z|e|d|"|)|-@26
+| +0#0000000#ffffff0@74
+|++0#0000e05#a8a8a8255|-@1| @1|6| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|-@47
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |c|o|m@1|e|n|t|s| +0#0000000&@64
+@75
+|++0#0000e05#a8a8a8255|-@1| @1|5| |l|i|n|e|s|:| |f|u|n|c|t|i|o|n| |F|o@1|(|)|-@46
+| +0#0000000#ffffff0@74
+@75
+|"+0#0000e05&| |d|e|l|e|t|e| |f|u|n|c|t|i|o|n| +0#0000000&@57
+@75
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|F|o@1| @59
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|f|o@1|.+0#af5f00255&|b+0#0000000&|a|r| @55
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1| @58
+|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&|f|o@1|.+0#af5f00255&|b+0#0000000&|a|r| @55
+> @74
+@57|1|8|3|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_highlight_00.dump b/runtime/syntax/testdir/dumps/vim_ex_highlight_00.dump
new file mode 100644
index 0000000..7b0f19f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_highlight_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|h|i|g|h|l|i|g|h|t| |c|o|m@1|a|n|d| +0#0000000&@50
+@75
+|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@65
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@57
+@75
+|"+0#0000e05&| |r|e|s|e|t| +0#0000000&@67
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|c+0#00e0003&|l|e|a|r| +0#0000000&@59
+@75
+|"+0#0000e05&| |d|i|s|a|b|l|e| +0#0000000&@65
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|c+0#00e0003&|l|e|a|r| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@51
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|N+0#00e0003&|O|N|E| +0#0000000&@52
+@75
+|"+0#0000e05&| |a|d@1|/|m|o|d|i|f|y| +0#0000000&@62
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|c+0#00e0003&|t|e|r|m|=+0#0000000&|u+0#e000e06&|n|d|e|r|l|i|n|e| +0#0000000&@41
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@39
+@75
+|"+0#0000e05&| |l|i|n|k| +0#0000000&@68
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|l+0#00e0003&|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@48
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_highlight_01.dump b/runtime/syntax/testdir/dumps/vim_ex_highlight_01.dump
new file mode 100644
index 0000000..95e478d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_highlight_01.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |a|d@1|/|m|o|d|i|f|y| +0#0000000&@62
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|c+0#00e0003&|t|e|r|m|=+0#0000000&|u+0#e000e06&|n|d|e|r|l|i|n|e| +0#0000000&@41
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@39
+@75
+|"+0#0000e05&| |l|i|n|k| +0#0000000&@68
+>h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|l+0#00e0003&|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@48
+|h+0#af5f00255&|i|g|h|l|i|g|h|t|!| +0#0000000&|l+0#00e0003&|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@47
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|l+0#00e0003&|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|N+0#00e0003&|O|N|E| +0#0000000&@51
+|h+0#af5f00255&|i|g|h|l|i|g|h|t|!| +0#0000000&|l+0#00e0003&|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|N+0#00e0003&|O|N|E| +0#0000000&@50
+@75
+|"+0#0000e05&| |d|e|f|a|u|l|t| |l|i|n|k| +0#0000000&@60
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@40
+|h+0#af5f00255&|i|g|h|l|i|g|h|t|!| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@39
+|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|N+0#00e0003&|O|N|E| +0#0000000&@43
+|h+0#af5f00255&|i|g|h|l|i|g|h|t|!| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&|N+0#00e0003&|O|N|E| +0#0000000&@42
+@75
+@75
+|"+0#0000e05&| |l|i|n|e| |c|o|n|t|i|n|u|a|t|i|o|n| |a|n|d| |c|o|m@1|a|n|d| |s|e|p|a|r|a|t|o|r| +0#0000000&@33
+@75
+@57|1|9|,|1| @9|3|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_highlight_02.dump b/runtime/syntax/testdir/dumps/vim_ex_highlight_02.dump
new file mode 100644
index 0000000..38313aa
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_highlight_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|h+0#af5f00255&|i| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@64
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6>\+0#e000e06&| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|f|g|=+0#0000000&|#+0#e000002&|8|0|a|0|f@1| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@58
+@75
+|h+0#af5f00255&|i| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@64
+@6|\+0#e000e06&| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@57
+@6|\+0#e000e06&| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|f|g|=+0#0000000&|#+0#e000002&|8|0|a|0|f@1| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45
+@75
+|h+0#af5f00255&|i| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&|g+0#00e0003&|u|i|f|g|=+0#0000000&|#+0#e000002&|8|0|a|0|f@1| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@5
+@75
+|h+0#af5f00255&|i| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&@63
+@57|3|7|,|7| @9|8|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_highlight_99.dump b/runtime/syntax/testdir/dumps/vim_ex_highlight_99.dump
new file mode 100644
index 0000000..dbd86d4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_highlight_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|f|g|=+0#0000000&|#+0#e000002&|8|0|a|0|f@1| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@58
+@75
+|h+0#af5f00255&|i| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@64
+@6|\+0#e000e06&| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&@57
+@6|\+0#e000e06&| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|f|g|=+0#0000000&|#+0#e000002&|8|0|a|0|f@1| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45
+@75
+|h+0#af5f00255&|i| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&|t+0#00e0003&|e|r|m|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&|g+0#00e0003&|u|i|f|g|=+0#0000000&|#+0#e000002&|8|0|a|0|f@1| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|b+0#e000e06&|o|l|d| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@5
+@75
+|h+0#af5f00255&|i| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&@63
+@6|\+0#e000e06&| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&@59
+@75
+|h+0#af5f00255&|i| +0#0000000&|d+0#00e0003&|e|f|a|u|l|t| |l|i|n|k| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|F+0#00e0003&|o@1| +0#0000000&@63
+@6>\+0#e000e06&| +0#0000000&|C+0#00e0003&|o|m@1|e|n|t| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46
+@57|5@1|,|7| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_00.dump b/runtime/syntax/testdir/dumps/vim_ex_map_00.dump
new file mode 100644
index 0000000..371c1ce
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_map_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|m|a|p| |c|o|m@1|a|n|d|s| +0#0000000&@55
+@75
+|m+0#af5f00255&|a|p|!| +0#0000000&@70
+|m+0#af5f00255&|a|p|!| +0#0000000&|l|h|s| |r|h|s| @62
+|m+0#af5f00255&|a|p| +0#0000000&@71
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| |r|h|s| @63
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|m+0#00e0e07&|a|p|(+0#e000e06&|l+0#00e0e07&|i|s|t|,+0#0000000&| |'+0#e000002&|v|:|v|a|l|'|)+0#e000e06&| +0#0000000&@51
+|c+0#af5f00255&|a|l@1| +0#0000000&|m+0#00e0e07&|a|p| +0#0000000&|(+0#e000e06&|l+0#00e0e07&|i|s|t|,+0#0000000&| |'+0#e000002&|v|:|v|a|l|'|)+0#e000e06&| +0#0000000&@50
+@75
+|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@1|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|m+0#af5f00255&|a|p|c|l|e|a|r|!| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_01.dump b/runtime/syntax/testdir/dumps/vim_ex_map_01.dump
new file mode 100644
index 0000000..7b43533
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_map_01.dump
@@ -0,0 +1,20 @@
+|v+0#af5f00255#ffffff0|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+>l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+|t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56
+@75
+@75
+|"+0#0000e05&| |:|h|e|l|p| |m|a|p|-|b|a|r| +0#0000000&@59
+@75
+|"+0#0000e05&| |<|B|a|r|>| @4|'|<|'| |i|s| |n|o|t| |i|n| |'|c|p|o|p|t|i|o|n|s|'| +0#0000000&@37
+|m+0#af5f00255&|a|p| +0#0000000&|_|l| |:|!|l|s| |<+0#e000e06&|B|a|r|>| +0#0000000&|m|o|r|e|^|M|:|e|c|h|o| |"|r|h|s|"|<+0#e000e06&|C|R|>| +0#0000000&@35
+|"+0#0000e05&| |\||| @7|'|b|'| |i|s| |n|o|t| |i|n| |'|c|p|o|p|t|i|o|n|s|'| +0#0000000&@37
+|m+0#af5f00255&|a|p| +0#0000000&|_|l| |:|!|l|s| |\||| |m|o|r|e|^|M|:|e|c|h|o| |"|r|h|s|"|<+0#e000e06&|C|R|>| +0#0000000&@38
+|"+0#0000e05&| |^|V||| @6|a|l|w|a|y|s|,| |i|n| |V|i|m| |a|n|d| |V|i| +0#0000000&@41
+|m+0#af5f00255&|a|p| +0#0000000&|_|l| |:|!|l|s| |^+0#0000e05&|V||+0#0000000&| |m|o|r|e|^|M|:|e|c|h|o| |"|r|h|s|"|<+0#e000e06&|C|R|>| +0#0000000&@37
+@75
+@57|1|9|,|1| @9|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_02.dump b/runtime/syntax/testdir/dumps/vim_ex_map_02.dump
new file mode 100644
index 0000000..c598781
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_map_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| |:|s|e|a|r|c|h|(|'|f|o@1|\@1|||b|a|r|'|)|<+0#e000e06&|C|R|>|:+0#0000000&|e|c|h|o| |"|r|h|s|"|<+0#e000e06&|C|R|>| +0#0000000&@27
+@75
+@75
+|"+0#0000e05&| |m|u|l|t|i|l|i|n|e| |R|H|S| +0#0000000&@59
+> @74
+|m+0#af5f00255&|a|p| +0#0000000&|<+0#e000e06&|l|e|a|d|e|r|>|b+0#0000000&|a|z| @59
+@2|\+0#e000e06&| +0#0000000&|:|e|c|h|o| |(|<+0#e000e06&|b|a|r|>| +0#0000000&@58
+@2|\+0#e000e06&| +0#0000000&@71
+@2|\+0#e000e06&|'+0#0000000&|b|a|r|'|)|<+0#e000e06&|c|r|>| +0#0000000&@61
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@75
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| @67
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|e|c|h|o| |"|f|o@1|"| @60
+@75
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| @67
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|e|c|h|o| |"|f|o@1|"| @60
+@57|3|7|,|0|-|1| @7|4|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_03.dump b/runtime/syntax/testdir/dumps/vim_ex_map_03.dump
new file mode 100644
index 0000000..4ad6e82
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_map_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@1|\+0#e000e06&| +0#0000000&|e|c|h|o| |"|f|o@1|"| @60
+@75
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s|^+0#0000e05&|V| +0#0000000&@65
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|e|c|h|o| |"|f|o@1|"| @60
+> @74
+|m+0#af5f00255&|a|p| +0#0000000&|l|^+0#0000e05&|V| +0#0000000&|h|s| @64
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|e|c|h|o| |"|f|o@1|"| @60
+@75
+|m+0#af5f00255&|a|p| +0#0000000&|l|^+0#0000e05&|V| +0#0000000&|h|s| @64
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|e|c|h|o| |"|f|o@1|"| @60
+@75
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| |r|h|s| @63
+|m+0#af5f00255&|a|p| +0#0000000&|l|^+0#0000e05&|V| +0#0000000&|h|^+0#0000e05&|V| +0#0000000&|s|^+0#0000e05&|V| +0#0000000&@1|r|h|s| @54
+@75
+|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| @67
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| |(|m|a|t|c|h|e|s| |a|s| |R|H|S| |b|u|t| |h|a|r|m|l|e|s@1|)| +0#0000000&@32
+@57|5@1|,|0|-|1| @7|7|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_04.dump b/runtime/syntax/testdir/dumps/vim_ex_map_04.dump
new file mode 100644
index 0000000..254fc91
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_map_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@1|"+0#0000e05&|\| |c|o|m@1|e|n|t| |(|m|a|t|c|h|e|s| |a|s| |R|H|S| |b|u|t| |h|a|r|m|l|e|s@1|)| +0#0000000&@32
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|c|l|e|a|r|"| +0#0000000&@62
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| @1|#|1|2|6|7|2| +0#0000000&@59
+> @74
+|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&|<+0#e000e06&|l|e|a|d|e|r|>|f+0#0000000&|o@1| |:|e|c|h|o| |c|a|l@1|(| @42
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|{|x|-|>|x|}|,| @63
+@2|\+0#e000e06&| +0#0000000&|[|'|f|o@1|'|]|)|<+0#e000e06&|c|r|>| +0#0000000&@58
+@75
+|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&|<+0#e000e06&|l|e|a|d|e|r|>|b+0#0000000&|a|r| |:|e|c|h|o| |(| @46
+@2|\+0#e000e06&| +0#0000000&@71
+@2|\+0#e000e06&| +0#0000000&|'|b|a|r|'|)|<+0#e000e06&|c|r|>| +0#0000000&@60
+@75
+@75
+|"+0#0000e05&| +0#0000000&|E+0#e000e06&|x|a|m|p|l|e|:| +0#0000000&@64
+|"+0#0000e05&| @2|/|a|u|t|o|l|o|a|d|/|n|e|t|r|w|.|v|i|m| +0#0000000&@51
+@75
+@57|7|3|,|0|-|1| @7|9|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_99.dump b/runtime/syntax/testdir/dumps/vim_ex_map_99.dump
new file mode 100644
index 0000000..37ee7cf
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_map_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|"+0#0000e05&| |I|s@1|u|e| @1|#|1|2|6|7|2| +0#0000000&@59
+@75
+|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&|<+0#e000e06&|l|e|a|d|e|r|>|f+0#0000000&|o@1| |:|e|c|h|o| |c|a|l@1|(| @42
+@2|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@62
+@2|\+0#e000e06&| +0#0000000&|{|x|-|>|x|}|,| @63
+@2|\+0#e000e06&| +0#0000000&|[|'|f|o@1|'|]|)|<+0#e000e06&|c|r|>| +0#0000000&@58
+@75
+|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&|<+0#e000e06&|l|e|a|d|e|r|>|b+0#0000000&|a|r| |:|e|c|h|o| |(| @46
+@2|\+0#e000e06&| +0#0000000&@71
+@2|\+0#e000e06&| +0#0000000&|'|b|a|r|'|)|<+0#e000e06&|c|r|>| +0#0000000&@60
+@75
+@75
+|"+0#0000e05&| +0#0000000&|E+0#e000e06&|x|a|m|p|l|e|:| +0#0000000&@64
+|"+0#0000e05&| @2|/|a|u|t|o|l|o|a|d|/|n|e|t|r|w|.|v|i|m| +0#0000000&@51
+@75
+>i+0#af5f00255&|f| +0#0000000&|!+0#af5f00255&|h+0#00e0e07&|a|s|m|a|p|t|o|(+0#e000e06&|'+0#e000002&|<|P|l|u|g|>|N|e|t|r|w|O|p|e|n|F|i|l|e|'|)+0#e000e06&| +0#0000000&@9|||n+0#af5f00255&|m|a|p| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|<+0#e000e06&|n|o|w|a|i
+|t|>| +0#0000000&|%| |<+0#e000e06&|P|l|u|g|>|N+0#0000000&|e|t|r|w|O|p|e|n|F|i|l|e|||e+0#af5f00255&|n|d|i|f| +0#0000000&@44
+@57|8|7|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_00.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_00.dump
new file mode 100644
index 0000000..09c82c4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menu_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|m|e|n|u| |c|o|m@1|a|n|d|s| +0#0000000&@54
+@75
+|"+0#0000e05&| |:|h|e|l|p| |d|i|s|a|b|l|e| |m|e|n|u|s| +0#0000000&@53
+|m+0#af5f00255&|e|n|u| +0#0000000&|d+0#e000e06&|i|s|a|b|l|e| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|O|p|e|n|\|.|\|.|\|.| +0#0000000&@44
+|a+0#af5f00255&|m|e|n|u| +0#0000000&|e+0#e000e06&|n|a|b|l|e| +0#0000000&|*+0#e000e06&| +0#0000000&@60
+|a+0#af5f00255&|m|e|n|u| +0#0000000&|d+0#e000e06&|i|s|a|b|l|e| +0#0000000&|&+0#e000e06&|T|o@1|l|s|.|*| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |:|h|e|l|p| |m|e|n|u|-|e|x|a|m|p|l|e|s| +0#0000000&@53
+|n+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|A|d@1|\| |V|a|r| +0#0000000&@8|w|b|"|z|y|e|:|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&| |<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>| +0#0000000&@9
+|n+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|R|e|m|o|v|e|\| |V|a|r| +0#0000000&@5|w|b|"|z|y|e|:|u|n|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>| +0#0000000&@14
+|v+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|A|d@1|\| |V|a|r| +0#0000000&@8|"|z|y|:|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&| |<+0#e000e06&|C|-|R|>|z+0#0000000&| |<+0#e000e06&|C|R|>| +0#0000000&@11
+|v+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|R|e|m|o|v|e|\| |V|a|r| +0#0000000&@5|"|z|y|:|u|n|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>| +0#0000000&@17
+|i+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|A|d@1|\| |V|a|r| +0#0000000&@8|<+0#e000e06&|E|s|c|>|w+0#0000000&|b|"|z|y|e|:|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&| |<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>|a+0#0000000&| @3
+|i+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|R|e|m|o|v|e|\| |V|a|r| +0#0000000&@5|<+0#e000e06&|E|s|c|>|w+0#0000000&|b|"|z|y|e|:|u|n|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>|a+0#0000000&| @8
+@75
+@75
+|"+0#0000e05&| |s|p|e|c|i|a|l| |k|e|y|s| +0#0000000&@60
+|m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&@1|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@31
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_01.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_01.dump
new file mode 100644
index 0000000..9b60b2a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menu_01.dump
@@ -0,0 +1,20 @@
+|i+0#af5f00255#ffffff0|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|A|d@1|\| |V|a|r| +0#0000000&@8|<+0#e000e06&|E|s|c|>|w+0#0000000&|b|"|z|y|e|:|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&| |<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>|a+0#0000000&| @3
+|i+0#af5f00255&|m|e|n|u| +0#0000000&|W+0#e000e06&|o|r|d|s|.|R|e|m|o|v|e|\| |V|a|r| +0#0000000&@5|<+0#e000e06&|E|s|c|>|w+0#0000000&|b|"|z|y|e|:|u|n|m|e|n|u|!| |W|o|r|d|s|.|<+0#e000e06&|C|-|R|>|z+0#0000000&|<+0#e000e06&|C|R|>|a+0#0000000&| @8
+@75
+@75
+|"+0#0000e05&| |s|p|e|c|i|a|l| |k|e|y|s| +0#0000000&@60
+>m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&@1|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@31
+|m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|p|e|c|i|a|l|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@31
+|m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|c|r|i|p|t|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&@1|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@31
+|m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|<+0#e000e06&|s|p|e|c|i|a|l|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@22
+|m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|<+0#e000e06&|s|p|e|c|i|a|l|>| +0#0000000&|<+0#e000e06&|s|c|r|i|p|t|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@13
+@75
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|m+0#af5f00255&|e|n|u| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|&+0#e000e06&|F|o@1|\| |b|a|r| +0#0000000&|:|e|c|h|o| |"|F|o@1|b|a|r|"|<+0#e000e06&|C|R|>| +0#0000000&@30
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+|"+0#0000e05&| +0#0000000&|E+0#e000e06&|x|a|m|p|l|e|:| +0#0000e05&|r|u|n|t|i|m|e|/|m|e|n|u|.|v|i|m| |(|m|o|d|i|f|i|e|d|)| +0#0000000&@36
+|a+0#af5f00255&|n| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|1+0#e000002&|0|.|3@1|0| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|C|l|o|s|e|<|T|a|b|>|:|c|l|o|s|e| +0#0000000&|:|c|o|n|f|i|r|m| |c|l|o|s|e|<+0#e000e06&|C|R|>| +0#0000000&@13
+@57|1|9|,|1| @9|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_02.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_02.dump
new file mode 100644
index 0000000..a5c1acf
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menu_02.dump
@@ -0,0 +1,20 @@
+|a+0#af5f00255#ffffff0|n| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|1+0#e000002&|0|.|3@1|0| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|C|l|o|s|e|<|T|a|b|>|:|c|l|o|s|e| +0#0000000&|:|c|o|n|f|i|r|m| |c|l|o|s|e|<+0#e000e06&|C|R|>| +0#0000000&@13
+@75
+|a+0#af5f00255&|n| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|1+0#e000002&|0|.|3@1|0| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|C|l|o|s|e|<|T|a|b|>|:|c|l|o|s|e| +0#0000000&@32
+@8|\+0#e000e06&| +0#0000000&|:|i|f| |w|i|n|h|e|i|g|h|t|(|2|)| |<| |0| |&@1| |t|a|b|p|a|g|e|w|i|n@1|r|(|2|)| |=@1| |0| |<+0#e000e06&|B|a|r|>| +0#0000000&@14
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |e|n|e|w| |<+0#e000e06&|B|a|r|>| +0#0000000&@44
+@8>\+0#e000e06&| +0#0000000&|e|l|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@54
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |c|l|o|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@43
+@8|\+0#e000e06&| +0#0000000&|e|n|d|i|f|<+0#e000e06&|C|R|>| +0#0000000&@55
+@75
+|a+0#af5f00255&|n| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|1+0#e000002&|0|.|3@1|0| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|C|l|o|s|e|<|T|a|b|>|:|c|l|o|s|e| +0#0000000&@32
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|:|i|f| |w|i|n|h|e|i|g|h|t|(|2|)| |<| |0| |&@1| |t|a|b|p|a|g|e|w|i|n@1|r|(|2|)| |=@1| |0| |<+0#e000e06&|B|a|r|>| +0#0000000&@14
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |e|n|e|w| |<+0#e000e06&|B|a|r|>| +0#0000000&@44
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|e|l|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@54
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |c|l|o|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@43
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@57|3|7|,|2|-|9| @7|4|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_03.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_03.dump
new file mode 100644
index 0000000..2ef89ec
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menu_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|\+0#e000e06&| +0#0000000&|e|n|d|i|f|<+0#e000e06&|C|R|>| +0#0000000&@55
+@75
+|a+0#af5f00255&|n| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|1+0#e000002&|0|.|3@1|0| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|C|l|o|s|e|<|T|a|b|>|:|c|l|o|s|e| +0#0000000&|:|i|f| |w|i|n|h|e|i|g|h|t|(|2|)| |<| |0| |&@1| |t|a|b|p|a|g|e|w
+|i|n@1|r|(|2|)| |=@1| |0| |<+0#e000e06&|B|a|r|>| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |e|n|e|w| |<+0#e000e06&|B|a|r|>| +0#0000000&@44
+@8>\+0#e000e06&| +0#0000000&|e|l|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@54
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |c|l|o|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@43
+@8|\+0#e000e06&| +0#0000000&|e|n|d|i|f|<+0#e000e06&|C|R|>| +0#0000000&@55
+@75
+|a+0#af5f00255&|n| +0#0000000&|<+0#e000e06&|s|i|l|e|n|t|>| +0#0000000&|1+0#e000002&|0|.|3@1|0| +0#0000000&|&+0#e000e06&|F|i|l|e|.|&|C|l|o|s|e|<|T|a|b|>|:|c|l|o|s|e| +0#0000000&|:|i|f| |w|i|n|h|e|i|g|h|t|(|2|)| |<| |0| |&@1| |t|a|b|p|a|g|e|w
+|i|n@1|r|(|2|)| |=@1| |0| |<+0#e000e06&|B|a|r|>| +0#0000000&@56
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |e|n|e|w| |<+0#e000e06&|B|a|r|>| +0#0000000&@44
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|e|l|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@54
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&@2|c|o|n|f|i|r|m| |c|l|o|s|e| |<+0#e000e06&|B|a|r|>| +0#0000000&@43
+@8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|e|n|d|i|f|<+0#e000e06&|C|R|>| +0#0000000&@55
+@57|5@1|,|2|-|9| @7|7|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump
new file mode 100644
index 0000000..ad079e6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|"+0#0000e05&| |p|o|p|u|p| |m|e|n|u|s| +0#0000000&@61
+|p+0#af5f00255&|o|p|u|p| +0#0000000&|&+0#e000e06&|F|o@1| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@50
+|p+0#af5f00255&|o|p|u|p|!| +0#0000000&|&+0#e000e06&|F|o@1| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@50
+> @74
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|4|2|3|0| +0#0000000&@60
+@75
+|"+0#0000e05&| |a| |m|e|n|u| |i|t|e|m| |n|a|m|e| |c|a|n@1|o|t| |s|t|a|r|t| |w|i|t|h| |'|.|'| +0#0000000&@34
+@75
+|e+0#af5f00255&|x|p|o|r|t| +0#0000000&|d+0#af5f00255&|e|f| +0#0000000&|H|i|s|t|o|r|y|J|u|m|p|M|e|n|u|(+0#e000e06&|)| +0#0000000&@46
+@4|p+0#af5f00255&|o|p|u|p|.|F+0#0000000&|i|l|t|e|r|M|e|n|u|(+0#e000e06&|"+0#e000002&|J|u|m|p| |h|i|s|t|o|r|y|"|,+0#0000000&| |d+0#00e0e07&|i|r|_|h|i|s|t|,+0#0000000&| @28
+@8|(+0#e000e06&|r+0#00e0e07&|e|s|,+0#0000000&| |_+0#00e0e07&|)+0#e000e06&| +0#0000000&|=+0#af5f00255&|>| +0#0000000&|{+0#e000e06&| +0#0000000&@53
+@12|H|i|s|t|o|r|y|J|u|m|p|(+0#e000e06&|r+0#00e0e07&|e|s|.+0#af5f00255&|t+0#00e0e07&|e|x|t|)+0#e000e06&| +0#0000000&@41
+@8|}+0#e000e06&|)| +0#0000000&@64
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|p+0#af5f00255&|o|p|u|p|\+0#e000e06&|.|F|i|l|t|e|r|M|e|n|u|<|T|a|b|>|F|i|l|t|e|r|(|)|<|C|R|>| +0#0000000&@40
+@57|7|3|,|0|-|1| @7|9|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_99.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_99.dump
new file mode 100644
index 0000000..80608b7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menu_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|"+0#0000e05&| |p|o|p|u|p| |m|e|n|u|s| +0#0000000&@61
+|p+0#af5f00255&|o|p|u|p| +0#0000000&|&+0#e000e06&|F|o@1| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@50
+|p+0#af5f00255&|o|p|u|p|!| +0#0000000&|&+0#e000e06&|F|o@1| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@50
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|4|2|3|0| +0#0000000&@60
+@75
+|"+0#0000e05&| |a| |m|e|n|u| |i|t|e|m| |n|a|m|e| |c|a|n@1|o|t| |s|t|a|r|t| |w|i|t|h| |'|.|'| +0#0000000&@34
+@75
+|e+0#af5f00255&|x|p|o|r|t| +0#0000000&|d+0#af5f00255&|e|f| +0#0000000&|H|i|s|t|o|r|y|J|u|m|p|M|e|n|u|(+0#e000e06&|)| +0#0000000&@46
+@4|p+0#af5f00255&|o|p|u|p|.|F+0#0000000&|i|l|t|e|r|M|e|n|u|(+0#e000e06&|"+0#e000002&|J|u|m|p| |h|i|s|t|o|r|y|"|,+0#0000000&| |d+0#00e0e07&|i|r|_|h|i|s|t|,+0#0000000&| @28
+@8|(+0#e000e06&|r+0#00e0e07&|e|s|,+0#0000000&| |_+0#00e0e07&|)+0#e000e06&| +0#0000000&|=+0#af5f00255&|>| +0#0000000&|{+0#e000e06&| +0#0000000&@53
+@12|H|i|s|t|o|r|y|J|u|m|p|(+0#e000e06&|r+0#00e0e07&|e|s|.+0#af5f00255&|t+0#00e0e07&|e|x|t|)+0#e000e06&| +0#0000000&@41
+@8|}+0#e000e06&|)| +0#0000000&@64
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|p+0#af5f00255&|o|p|u|p|\+0#e000e06&|.|F|i|l|t|e|r|M|e|n|u|<|T|a|b|>|F|i|l|t|e|r|(|)|<|C|R|>| +0#0000000&@40
+> @74
+@57|8|7|,|0|-|1| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menutranslate_00.dump b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_00.dump
new file mode 100644
index 0000000..82bcce4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|m|e|n|u|t|r|a|n|s|l|a|t|e| |c|o|m@1|a|n|d| +0#0000000&@46
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|c+0#e000e06&|l|e|a|r| +0#0000000&@55
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|c+0#e000e06&|l|e|a|r| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@42
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|c+0#e000e06&|l|e|a|r| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@45
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| |&+0#e000e06&|F|u+0#0000000&|B|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@31
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| |&+0#e000e06&|F|u+0#0000000&|B|a|r| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@34
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|\|"|&+0#e000e06&|F|o+0#0000000&@1|"|\+0#e000e06&| |b+0#0000000&|a|r| |\|"|&+0#e000e06&|F|u+0#0000000&|B|a|r| @39
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |"+0#0000000&|b|a|r|"| |&+0#e000e06&|F|u+0#0000000&|B|a|r| @42
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @51
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+@75
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menutranslate_01.dump b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_01.dump
new file mode 100644
index 0000000..f479aeb
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+> @74
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@48
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| @60
+@6|\+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@54
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @51
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+@75
+@57|1|9|,|0|-|1| @7|4|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menutranslate_02.dump b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_02.dump
new file mode 100644
index 0000000..7623f70
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6>\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@48
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| @60
+@6|\+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@54
+@57|3|7|,|7| @9|9|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_menutranslate_99.dump b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_99.dump
new file mode 100644
index 0000000..7f6ccfc
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_menutranslate_99.dump
@@ -0,0 +1,20 @@
+|m+0#af5f00255#ffffff0|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@48
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@75
+|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@61
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|o+0#0000000&@1|\+0#e000e06&| |b+0#0000000&|a|r| @57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|&+0#e000e06&|F|u+0#0000000&|b|a|r| @60
+@6|\+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@54
+> @74
+@57|5|1|,|0|-|1| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump
new file mode 100644
index 0000000..aea97ed
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump
@@ -0,0 +1,20 @@
+>s+0#af5f00255#ffffff0|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@54
+|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@45
+@75
+|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@56
+|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@47
+@75
+|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@58
+|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@49
+@75
+|:|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@53
+|:|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@44
+@75
+|:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@55
+|:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@46
+@75
+|:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@57
+|:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@48
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@41
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump
new file mode 100644
index 0000000..806101c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump
@@ -0,0 +1,20 @@
+|:+0&#ffffff0|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@46
+@75
+|:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@57
+|:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@48
+@75
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@41
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@32
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@43
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@34
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@45
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@36
+@75
+|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|s|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@27
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+| +0#af5f00255&@1|s|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@53
+@2|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
+@57|1|9|,|1| @9|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump
new file mode 100644
index 0000000..b0e722d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@1|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
+| +0#af5f00255&@1|s|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@53
+@2>l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|"+0#0000e05&| |v|a|r|i|o|u|s| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54
+@75
+|s+0#af5f00255&|!+0#e000e06&|/+0#0000000&|!+0#e000e06&|/+0#0000000&@1|!+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |s|"|/|"|/@1|"| |"| |c|o|m@1|e|n|t| |(|w|o|r|k|s| |b|u|t| |d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@32
+|s+0#af5f00255&|#+0#e000e06&|/+0#0000000&|#+0#e000e06&|/+0#0000000&@1|#+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|$+0#e000e06&|/+0#0000000&|$+0#e000e06&|/+0#0000000&@1|$+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|%+0#e000e06&|/+0#0000000&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|&+0#e000e06&|/+0#0000000&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000e05#ffffff0|-| |m|a|t|c|h|e|s| |v|i|m|U|s|e|r|F|u|n|c| +0#0000000&@45
+|"+0#0000e05&| |s|(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@55
+@57|3|7|,|3| @9|4|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump
new file mode 100644
index 0000000..cb12bb3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |s|(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@55
+|s+0#af5f00255&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|,+0#e000e06&|/+0#0000000&|,+0#e000e06&|/+0#0000000&@1|,+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+>s+0#af5f00255&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|.+0#e000e06&|/+0#0000000&|.+0#e000e06&|/+0#0000000&@1|.+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|/+0#e000e06&|X+0#0000000&|/+0#e000e06&|X+0#0000000&@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|:+0#e000e06&|/+0#0000000&|:+0#e000e06&|/+0#0000000&@1|:+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|;+0#e000e06&|/+0#0000000&|;+0#e000e06&|/+0#0000000&@1|;+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|<+0#e000e06&|/+0#0000000&|<+0#e000e06&|/+0#0000000&@1|<+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|=+0#e000e06&|/+0#0000000&|=+0#e000e06&|/+0#0000000&@1|=+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|>+0#e000e06&|/+0#0000000&|>+0#e000e06&|/+0#0000000&@1|>+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|?+0#e000e06&|/+0#0000000&|?+0#e000e06&|/+0#0000000&@1|?+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|@+0#e000e06&|/+0#0000000&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|[+0#e000e06&|/+0#0000000&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |s|\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@42
+|s+0#af5f00255&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+@57|5@1|,|1| @9|7|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump
new file mode 100644
index 0000000..b378260
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |s|||/|||/@1||| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@42
+>s+0#af5f00255&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|~+0#e000e06&|/+0#0000000&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|3|8@1|3| +0#0000000&@60
+@75
+|s|t|r|[|s|]| @68
+|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|T|e|s|t|(+0#e000e06&|)| +0#0000000&@64
+@2|s|t|r|[|s|]| @66
+@2|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@66
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+@57|7|3|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_99.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_99.dump
new file mode 100644
index 0000000..88cb7dc
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_99.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |s|||/|||/@1||| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@42
+|s+0#af5f00255&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|~+0#e000e06&|/+0#0000000&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|3|8@1|3| +0#0000000&@60
+@75
+|s|t|r|[|s|]| @68
+|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|T|e|s|t|(+0#e000e06&|)| +0#0000000&@64
+@2|s|t|r|[|s|]| @66
+@2|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@66
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+> @74
+@57|8|6|,|0|-|1| @7|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_00.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_00.dump
new file mode 100644
index 0000000..916f96d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|s|y|n|t|a|x| |c|o|m@1|a|n|d| +0#0000000&@53
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t+0#00e0003&|e|s|t|M|a|t|c|h| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"+0#0000e05&| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@20
+|"+0#0000e05&| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|c|o|m@1|e|n|t|s| |n|o|t| |c|u|r@1|e|n|t|l|y| |s|u|p@1|o|r|t|e|d| +0#0000000&@34
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&|k|e|y|w|o|r|d| |c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"| |t|a|i|l| |c|o|m@1|e|n|t| @18
+|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t+0#00e0003&|e|s|t|R|e|g|i|o|n| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000002&|s|t|a|r|t|-|p|a|t@1|e|r|n|"| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000002&|s|k|i|p|-|p|a|t@1|e|r|n|"| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|e|n|d|-|p|a
+|t@1|e|r|n|"| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"| |t|a|i|l| |c|o|m@1|e|n|t| @43
+@75
+|"+0#0000e05&| |M|u|l|t|i|l|i|n|e| |c|o|m@1|a|n|d|s| +0#0000000&@54
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&@51
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+@6|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump
new file mode 100644
index 0000000..800e4a7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|0|,|@|t|e|s|t|C|l|u|s|t|e|r| @34
+@6|"+0#0000e05&|\| |t|r|a|n|s|p|a|r|e|n|t| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |s|k|i|p|w|h|i|t|e| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|n|l| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@6|"+0#0000e05&|\| |K|E|Y|W|O|R|D|S| |L|I|S|T| +0#0000000&@52
+@6|"+0#0000e05&|\| |k|e|y|w|o|r|d| |1| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|1| @58
+@57|1|9|,|7| @10|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump
new file mode 100644
index 0000000..54d8734
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|1| @58
+@6|"+0#0000e05&|\| |k|e|y|w|o|r|d| |2| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|2| @58
+@6|"+0#0000e05&|\| |k|e|y|w|o|r|d| |3| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|3| @58
+> @74
+|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t+0#00e0003&|e|s|t|M|a|t|c|h| +0#0000000&@55
+@6|"+0#0000e05&|\| |M|A|T|C|H| |P|A|T@1|E|R|N| +0#0000000&@52
+@6|"+0#0000e05&|\| |p|a|t@1|e|r|n| |s|t|a|r|t| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|/+0#e000002&| +0#0000000&@65
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|r|t| |1| |d|e|s|c|r|i|p|t|i|o|n| +0#0000000&@47
+| +0#e000002&@5|\+0#e000e06&|p+0#e000002&|a|t|1|a| |.|*| |p|a|t|1|b| +0#0000000&@53
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|r|t| |2| |d|e|s|c|r|i|p|t|i|o|n| +0#0000000&@47
+| +0#e000002&@5|\+0#e000e06&|p+0#e000002&|a|t|2|a| |.|*| |p|a|t|2|b| +0#0000000&@53
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|r|t| |3| |d|e|s|c|r|i|p|t|i|o|n| +0#0000000&@47
+| +0#e000002&@5|\+0#e000e06&|p+0#e000002&|a|t|3|a| |.|*| |p|a|t|3|b| +0#0000000&@53
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|t@1|e|r|n| |e|n|d| +0#0000000&@54
+| +0#e000002&@5|\+0#e000e06&|/+0#e000002&| +0#0000000&@66
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@57|3|7|,|0|-|1| @7|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump
new file mode 100644
index 0000000..f0a2481
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+@6|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6>"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|0|,|@|t|e|s|t|C|l|u|s|t|e|r| @34
+@6|"+0#0000e05&|\| |t|r|a|n|s|p|a|r|e|n|t| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |s|k|i|p|w|h|i|t|e| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|n|l| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@57|5@1|,|7| @9|3|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump
new file mode 100644
index 0000000..2298efb
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|s| |o|p|t|i|o|n| +0#0000000&@50
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2| @28
+@6|"+0#0000e05&|\| |f|o|l|d| |o|p|t|i|o|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@62
+@6>"+0#0000e05&|\| |d|i|s|p|l|a|y| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|d+0#e000e06&|i|s|p|l|a|y| +0#0000000&@59
+@6|"+0#0000e05&|\| |e|x|t|e|n|d| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|t|e|n|d| +0#0000000&@60
+@6|"+0#0000e05&|\| |e|x|c|l|u|d|e|n|l| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
+@6|"+0#0000e05&|\| |k|e@1|p|e|n|d| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|k+0#e000e06&|e@1|p|e|n|d| +0#0000000&@59
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t+0#00e0003&|e|s|t|R|e|g|i|o|n| +0#0000000&@53
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |s|t|a|r|t| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000002&|s|t|a|r|t|-|p|a|t@1|e|r|n|"| +0#0000000&@45
+@6|"+0#0000e05&|\| |s|k|i|p| |o|p|t|i|o|n| +0#0000000&@54
+@57|7|3|,|7| @9|4|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump
new file mode 100644
index 0000000..66a6b73
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |s|k|i|p| |o|p|t|i|o|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000002&|s|k|i|p|-|p|a|t@1|e|r|n|"| +0#0000000&@47
+@6|"+0#0000e05&|\| |e|n|d| |o|p|t|i|o|n| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|e|n|d|-|p|a|t@1|e|r|n|"| +0#0000000&@49
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l| |o|p|t|i|o|n| +0#0000000&@51
+@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+@6|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|0|,|@|t|e|s|t|C|l|u|s|t|e|r| @34
+@6|"+0#0000e05&|\| |t|r|a|n|s|p|a|r|e|n|t| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |s|k|i|p|w|h|i|t|e| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@57|9|1|,|7| @9|5|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump
new file mode 100644
index 0000000..12c1fbe
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|n|l| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|s| |o|p|t|i|o|n| +0#0000000&@50
+@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2| @28
+@6|"+0#0000e05&|\| |o|n|e|l|i|n|e| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&@59
+@6|"+0#0000e05&|\| |f|o|l|d| |o|p|t|i|o|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@62
+@6|"+0#0000e05&|\| |d|i|s|p|l|a|y| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|d+0#e000e06&|i|s|p|l|a|y| +0#0000000&@59
+@6|"+0#0000e05&|\| |e|x|t|e|n|d| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|t|e|n|d| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l|e|n|d|s| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l|e|n|d|s| +0#0000000&@55
+@6|"+0#0000e05&|\| |e|x|c|l|u|d|e|n|l| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
+@6|"+0#0000e05&|\| |k|e@1|p|e|n|d| |o|p|t|i|o|n| +0#0000000&@51
+@57|1|0|9|,|7| @8|6|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_07.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_07.dump
new file mode 100644
index 0000000..d7d1055
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_07.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |k|e@1|p|e|n|d| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|k+0#e000e06&|e@1|p|e|n|d| +0#0000000&@59
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6>"+0#0000e05&|\| |c|o|n|t|a|i|n|s| |o|p|t|i|o|n| +0#0000000&@50
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2|,|t|e|s|t|C|o|n|t|a|i|n|e|d|3| @13
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |a|d@1| |o|p|t|i|o|n| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|a+0#e000e06&|d@1|=|t+0#0000000&|e|s|t|A|d@1| @55
+@6|"+0#0000e05&|\| |r|e|m|o|v|e| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|r+0#e000e06&|e|m|o|v|e|=|t+0#0000000&|e|s|t|R|e|m|o|v|e| @49
+@75
+@75
+|"+0#0000e05&| |m|u|l|t|i|l|i|n|e| |g|r|o|u|p| |l|i|s|t| +0#0000000&@52
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|0| +0#0000000&|k|e|y|w|o|r|d| @45
+@57|1|2|7|,|7| @8|7|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump
new file mode 100644
index 0000000..4042d33
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|0| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|1| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|2| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|3| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|4| +0#0000000&|k|e|y|w|o|r|d| @45
+>s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|5| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|6| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|7| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|8| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|9| +0#0000000&|k|e|y|w|o|r|d| @45
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&@51
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=| +0#0000000&@56
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|0| |,| |t|e|s|t|N|e|x|t|1| |,| @43
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|[|2|-|8|]|.|*| |,| @49
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@57|1|4|5|,|1| @8|8|7|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_09.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_09.dump
new file mode 100644
index 0000000..ade5bd5
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_09.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|9| |,| |@|t|e|s|t|C|l|u|s|t|e|r| |s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@32
+@6|"+0#0000e05&|\| |K|E|Y|W|O|R|D|S| |L|I|S|T| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|4| @58
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|5| @58
+@6>\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|6| @58
+@75
+@75
+|"+0#0000e05&| |l|e|a|k|i|n|g| |c|o|n|t|a|i|n|e|d| |g|r|o|u|p|s| +0#0000000&@48
+@75
+|"+0#0000e05&| +0#0000000&|E+0#e000e06&|x|a|m|p|l|e|:| +0#0000e05&|r|u|n|t|i|m|e|/|s|y|n|t|a|x|/|z|s|h|.|v|i|m| +0#0000000&@41
+|"+0#0000e05&| @2|"+0#e000002&|c|l|u|s|t|e|r|"| +0#0000e05&|s|h|o|u|l|d| |n|o|t| |b|e| |h|i|g|h|l|i|g|h|t|e|d| |o|u|t|s|i|d|e| |o|f| |:|s|y|n|t|a|x| |c|o|m@1|a|n|d|s| +0#0000000&@7
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|s+0#e000e06&|:|C+0#0000000&|o|n|t|a|i|n|e|d|G|r|o|u|p|(+0#e000e06&|)| +0#0000000&@46
+| +0#0000e05&@1|"| |.@2| +0#0000000&@67
+@2|f+0#af5f00255&|o|r| +0#0000000&|c+0#00e0e07&|l|u|s|t|e|r| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|[|'+0#e000002&|m|a|r|k|d|o|w|n|H|i|g|h|l|i|g|h|t|_|z|s|h|'|,+0#0000000&| |'+0#e000002&|z|s|h|'|]+0#0000000&| @25
+| +0#0000e05&@3|"| |.@2| +0#0000000&@65
+@2|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@66
+| +0#0000e05&@1|"| |.@2| +0#0000000&@67
+@57|1|6|3|,|7| @8|9@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_99.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_99.dump
new file mode 100644
index 0000000..c1942c8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|9| |,| |@|t|e|s|t|C|l|u|s|t|e|r| |s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@32
+@6|"+0#0000e05&|\| |K|E|Y|W|O|R|D|S| |L|I|S|T| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|4| @58
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|5| @58
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|6| @58
+@75
+@75
+|"+0#0000e05&| |l|e|a|k|i|n|g| |c|o|n|t|a|i|n|e|d| |g|r|o|u|p|s| +0#0000000&@48
+@75
+|"+0#0000e05&| +0#0000000&|E+0#e000e06&|x|a|m|p|l|e|:| +0#0000e05&|r|u|n|t|i|m|e|/|s|y|n|t|a|x|/|z|s|h|.|v|i|m| +0#0000000&@41
+|"+0#0000e05&| @2|"+0#e000002&|c|l|u|s|t|e|r|"| +0#0000e05&|s|h|o|u|l|d| |n|o|t| |b|e| |h|i|g|h|l|i|g|h|t|e|d| |o|u|t|s|i|d|e| |o|f| |:|s|y|n|t|a|x| |c|o|m@1|a|n|d|s| +0#0000000&@7
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|s+0#e000e06&|:|C+0#0000000&|o|n|t|a|i|n|e|d|G|r|o|u|p|(+0#e000e06&|)| +0#0000000&@46
+| +0#0000e05&@1|"| |.@2| +0#0000000&@67
+@2|f+0#af5f00255&|o|r| +0#0000000&|c+0#00e0e07&|l|u|s|t|e|r| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|[|'+0#e000002&|m|a|r|k|d|o|w|n|H|i|g|h|l|i|g|h|t|_|z|s|h|'|,+0#0000000&| |'+0#e000002&|z|s|h|'|]+0#0000000&| @25
+| +0#0000e05&@3|"| |.@2| +0#0000000&@65
+@2|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@66
+| +0#0000e05&@1|"| |.@2| +0#0000000&@67
+>e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@57|1|7@1|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_expr_00.dump b/runtime/syntax/testdir/dumps/vim_expr_00.dump
new file mode 100644
index 0000000..899b73c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_expr_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |S|t|r|i|n|g| +0#0000000&@66
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|'+0#e000002&|I|t|'@1|s| |a| |s|t|r|i|n|g|'| +0#0000000&@53
+|e+0#af5f00255&|c|h|o| +0#0000000&|'+0#e000002&|t|a|b|:| |\|t|,| |n|e|w| |l|i|n|e|:| |\|n|,| |b|a|c|k|s|l|a|s|h|:| |\@1|'| +0#0000000&@31
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|t|a|b|:| |\+0#e000e06&|t|,+0#e000002&| |n|e|w| |l|i|n|e|:| |\+0#e000e06&|n|,+0#e000002&| |b|a|c|k|s|l|a|s|h|:| |\+0#e000e06&@1|"+0#e000002&| +0#0000000&@31
+@75
+|"+0#0000e05&| |S|t|r|i|n|g| |e|s|c|a|p|e| |s|e|q|u|e|n|c|e|s| +0#0000000&@49
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|3|1|6| +0#e000002&|-| |\+0#e000e06&|3|1| +0#e000002&|-| |\+0#e000e06&|3| +0#e000002&|-| |\+0#e000e06&|x|1|f| +0#e000002&|-| |\+0#e000e06&|x|f| +0#e000002&|-| |\+0#e000e06&|X|1|F| +0#e000002&|-| |\+0#e000e06&|X|F| +0#e000002&|-| |\+0#e000e06&|u|0|2|a|4| +0#e000002&|-| |\+0#e000e06&|U|0@4|2|a|4| +0#e000002&|-| |\+0#e000e06&|b| +0#e000002&
+|-| |\+0#e000e06&|e| +0#e000002&|-| |\+0#e000e06&|f| +0#e000002&|-| |\+0#e000e06&|n| +0#e000002&|-| |\+0#e000e06&|r| +0#e000002&|-| |\+0#e000e06&|t| +0#e000002&|-| |\+0#e000e06&@1| +0#e000002&|-| |\+0#e000e06&|"| +0#e000002&|-| |\+0#e000e06&|<|C|-|W|>|"+0#e000002&| +0#0000000&@30
+|e+0#af5f00255&|c|h|o| +0#0000000&|'+0#e000002&|\|3|1|6| |\|3|1| |\|3| |\|x|1|f| |\|x|f| |\|X|1|F| |\|X|F| |\|u|0|2|a|4| |\|U|0@4|2|a|4| |\|b| |\|e| |\|f| |\|n| |\|r| |\|t| |\@1|
+|\|"| |\|<|C|-|W|>|'| +0#0000000&@64
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|3|1|6|0+0#e000002&| |-| |\+0#e000e06&|x|1|f|0+0#e000002&| |-| |\+0#e000e06&|X|1|F|0+0#e000002&| |-| |\+0#e000e06&|u|0|2|a|4|0+0#e000002&| |-| |\+0#e000e06&|U|0@4|2|a|4|0+0#e000002&|"| +0#0000000&@22
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|"|\+0#e000e06&|3|1|6| +0#e000002&|-| |\+0#e000e06&|3|1| +0#e000002&|-| |\+0#e000e06&|3| +0#e000002&|-| |\+0#e000e06&|x|1|f| +0#e000002&|-| |\+0#e000e06&|x|f| +0#e000002&|-| |\+0#e000e06&|X|1|F| +0#e000002&|-| |\+0#e000e06&|X|F| +0#e000002&|-| |\+0#e000e06&|u|0|2|a|4| +0#e000002&|-| |\+0#e000e06&|U|0@4|2|a|4| +0#e000002&|-| |\+0#e000e06&|b
+| +0#e000002&|-| |\+0#e000e06&|e| +0#e000002&|-| |\+0#e000e06&|f| +0#e000002&|-| |\+0#e000e06&|n| +0#e000002&|-| |\+0#e000e06&|r| +0#e000002&|-| |\+0#e000e06&|t| +0#e000002&|-| |\+0#e000e06&@1| +0#e000002&|-| |\+0#e000e06&|"| +0#e000002&|-| |\+0#e000e06&|<|C|-|W|>|"+0#e000002&| +0#0000000&@29
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|'|\|3|1|6| |\|3|1| |\|3| |\|x|1|f| |\|x|f| |\|X|1|F| |\|X|F| |\|u|0|2|a|4| |\|U|0@4|2|a|4| |\|b| |\|e| |\|f| |\|n| |\|r| |\|t| |\@1
+| |\|"| |\|<|C|-|W|>|'| +0#0000000&@63
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|"|\+0#e000e06&|3|1|6|0+0#e000002&| |-| |\+0#e000e06&|x|1|f|0+0#e000002&| |-| |\+0#e000e06&|X|1|F|0+0#e000002&| |-| |\+0#e000e06&|u|0|2|a|4|0+0#e000002&| |-| |\+0#e000e06&|U|0@4|2|a|4|0+0#e000002&|"| +0#0000000&@21
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_expr_01.dump b/runtime/syntax/testdir/dumps/vim_expr_01.dump
new file mode 100644
index 0000000..383c730
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_expr_01.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|$+0#e000002&|'|\|3|1|6| |\|3|1| |\|3| |\|x|1|f| |\|x|f| |\|X|1|F| |\|X|F| |\|u|0|2|a|4| |\|U|0@4|2|a|4| |\|b| |\|e| |\|f| |\|n| |\|r| |\|t| |\@1
+| |\|"| |\|<|C|-|W|>|'| +0#0000000&@63
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|"|\+0#e000e06&|3|1|6|0+0#e000002&| |-| |\+0#e000e06&|x|1|f|0+0#e000002&| |-| |\+0#e000e06&|X|1|F|0+0#e000002&| |-| |\+0#e000e06&|u|0|2|a|4|0+0#e000002&| |-| |\+0#e000e06&|U|0@4|2|a|4|0+0#e000002&|"| +0#0000000&@21
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|C|-|a|>|"+0#e000002&| +0#0000000&@61
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|*|C|-|a|>|"+0#e000002&| +0#0000000&@60
+>e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|C|-|>@1|"+0#e000002&| +0#0000000&@61
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|*|C|-|>@1|"+0#e000002&| +0#0000000&@60
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|C|-|>@1|>+0#e000002&|"| +0#0000000&@60
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|*|C|-|>@1|>+0#e000002&|"| +0#0000000&@59
+@75
+|"+0#0000e05&| |S|t|r|i|n|g| |i|n|t|e|r|p|o|l|a|t|i|o|n| +0#0000000&@52
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|'+0#e000002&|D|o|n|'@1|t| |h|i|g|h|l|i|g|h|t| |i|n|t|e|r|p|o|l|a|t|i|o|n|:| |{@1| |{|1| |+| |2|}| |}@1|'| +0#0000000&@22
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|D|o|n|'|t| |h|i|g|h|l|i|g|h|t| |i|n|t|e|r|p|o|l|a|t|i|o|n|:| |{@1| |{|1| |+| |2|}| |}@1|"| +0#0000000&@23
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|'|H|i|g|h|l|i|g|h|t| |i|n|t|e|r|p|o|l|a|t|i|o|n|:|\|t|{+0#e000e06&@1| +0#e000002&|{+0#e000e06&| +0#0000000&|s+0#00e0e07&|t|r|i|n|g|(+0#e000e06&|{|'+0#e000002&|f|o@1|'|:+0#0000000&| |'+0#e000002&|b|a|r|'|}+0#e000e06&|)| +0#0000000&|}+0#e000e06&| +0#e000002&|}+0#e000e06&@1|'+0#e000002&| +0#0000000&@8
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|'|H|i|g|h|l|i|g|h|t| |i|n|t|e|r|p|o|l|a|t|i|o|n|:|\|t|{+0#e000e06&@1| +0#e000002&|{+0#e000e06&| +0#0000000&|$+0#e000002&|'|n|e|s|t|e|d|:| |{+0#e000e06&@1| +0#e000002&|{+0#e000e06&|1+0#e000002&| +0#0000000&|++0#af5f00255&| +0#0000000&|2+0#e000002&|}+0#e000e06&| +0#e000002&|}+0#e000e06&@1|'+0#e000002&| +0#0000000&|}+0#e000e06&| +0#e000002&|}+0#e000e06&@1|'+0#e000002&| +0#0000000&@6
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|"|H|i|g|h|l|i|g|h|t| |i|n|t|e|r|p|o|l|a|t|i|o|n|:|\+0#e000e06&|t|{@1| +0#e000002&|{+0#e000e06&| +0#0000000&|s+0#00e0e07&|t|r|i|n|g|(+0#e000e06&|{|"+0#e000002&|f|o@1|"|:+0#0000000&| |"+0#e000002&|b|a|r|"|}+0#e000e06&|)| +0#0000000&|}+0#e000e06&| +0#e000002&|}+0#e000e06&@1|"+0#e000002&| +0#0000000&@8
+|e+0#af5f00255&|c|h|o| +0#0000000&|$+0#e000002&|"|H|i|g|h|l|i|g|h|t| |i|n|t|e|r|p|o|l|a|t|i|o|n|:|\+0#e000e06&|t|{@1| +0#e000002&|{+0#e000e06&| +0#0000000&|$+0#e000002&|"|n|e|s|t|e|d|:| |{+0#e000e06&@1| +0#e000002&|{+0#e000e06&|1+0#e000002&| +0#0000000&|++0#af5f00255&| +0#0000000&|2+0#e000002&|}+0#e000e06&| +0#e000002&|}+0#e000e06&@1|"+0#e000002&| +0#0000000&|}+0#e000e06&| +0#e000002&|}+0#e000e06&@1|"+0#e000002&| +0#0000000&@6
+@57|1|9|,|1| @9|2|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_expr_02.dump b/runtime/syntax/testdir/dumps/vim_expr_02.dump
new file mode 100644
index 0000000..3bfab4c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_expr_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|"+0#0000e05&| |N|u|m|b|e|r| +0#0000000&@66
+@75
+|"+0#0000e05&| |H|e|x|a|d|e|c|i|m|a|l| +0#0000000&@61
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|x|F@1| +0#0000000&@64
+>e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|X|F@1| +0#0000000&@64
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|x|F@1| +0#0000000&@64
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|X|F@1| +0#0000000&@64
+@75
+|"+0#0000e05&| |D|e|c|i|m|a|l| +0#0000000&@65
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|2+0#e000002&|5@1| +0#0000000&@65
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|2+0#e000002&|5@1| +0#0000000&@65
+@75
+|"+0#0000e05&| |O|c|t|a|l| +0#0000000&@67
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|3|7@1| +0#0000000&@64
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|o|3|7@1| +0#0000000&@63
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|O|3|7@1| +0#0000000&@63
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|3|7@1| +0#0000000&@64
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|o|3|7@1| +0#0000000&@63
+@57|3|7|,|1| @9|5|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_expr_03.dump b/runtime/syntax/testdir/dumps/vim_expr_03.dump
new file mode 100644
index 0000000..2322e7d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_expr_03.dump
@@ -0,0 +1,20 @@
+|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|o|3|7@1| +0#0000000&@63
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|O|3|7@1| +0#0000000&@63
+@75
+|"+0#0000e05&| |B|i|n|a|r|y| +0#0000000&@66
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|b|1@7| +0#0000000&@58
+>e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|B|1@7| +0#0000000&@58
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|b|1@7| +0#0000000&@58
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|B|1@7| +0#0000000&@58
+@75
+|"+0#0000e05&| |F|l|o|a|t| +0#0000000&@67
+|1+0#e000002&|2|3|.|4|5|6| +0#0000000&@67
+|++0#af5f00255&|0+0#e000002&|.|0@2|1| +0#0000000&@67
+|5+0#e000002&@1|.|0| +0#0000000&@70
+|-+0#af5f00255&|0+0#e000002&|.|1|2|3| +0#0000000&@68
+|1+0#e000002&|.|2|3|4|e|0|3| +0#0000000&@66
+|1+0#e000002&|.|0|E|-|6| +0#0000000&@68
+|-+0#af5f00255&|3+0#e000002&|.|1|4|1|6|e|+|8@1| +0#0000000&@63
+@75
+|"+0#0000e05&| |B|l|o|b| +0#0000000&@68
+@57|5@1|,|1| @9|9|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_expr_99.dump b/runtime/syntax/testdir/dumps/vim_expr_99.dump
new file mode 100644
index 0000000..b8394fb
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_expr_99.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| |B|i|n|a|r|y| +0#0000000&@66
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|b|1@7| +0#0000000&@58
+|e+0#af5f00255&|c|h|o| +0#0000000&@1|0+0#e000002&|B|1@7| +0#0000000&@58
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|b|1@7| +0#0000000&@58
+|e+0#af5f00255&|c|h|o| +0#0000000&|-+0#af5f00255&|0+0#e000002&|B|1@7| +0#0000000&@58
+@75
+|"+0#0000e05&| |F|l|o|a|t| +0#0000000&@67
+|1+0#e000002&|2|3|.|4|5|6| +0#0000000&@67
+|++0#af5f00255&|0+0#e000002&|.|0@2|1| +0#0000000&@67
+|5+0#e000002&@1|.|0| +0#0000000&@70
+|-+0#af5f00255&|0+0#e000002&|.|1|2|3| +0#0000000&@68
+|1+0#e000002&|.|2|3|4|e|0|3| +0#0000000&@66
+|1+0#e000002&|.|0|E|-|6| +0#0000000&@68
+|-+0#af5f00255&|3+0#e000002&|.|1|4|1|6|e|+|8@1| +0#0000000&@63
+@75
+|"+0#0000e05&| |B|l|o|b| +0#0000000&@68
+|e+0#af5f00255&|c|h|o| +0#0000000&|0+0#e000002&|z|F@1|0@1|E|D|0|1|5|D|A|F| +0#0000000&@55
+|e+0#af5f00255&|c|h|o| +0#0000000&|0+0#e000002&|z|F@1|0@1|.|E|D|0|1|.|5|D|A|F| +0#0000000&@53
+>e+0#af5f00255&|c|h|o| +0#0000000&|0+0#e000002&|z|F@1|.|0@1|.|E|D|.|0|1|.|5|D|.|A|F| +0#0000000&@50
+@57|7|1|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_00.dump b/runtime/syntax/testdir/dumps/vim_key_notation_00.dump
new file mode 100644
index 0000000..ed58e2f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |K|e|y| |n|o|t|a|t|i|o|n| +0#0000000&@60
+@75
+|<+0#e000e06&|S|p|a|c|e|>| +0#0000000&@67
+|<+0#e000e06&|T|a|b|>| +0#0000000&@69
+|<+0#e000e06&|T|a|b|>| +0#0000000&@69
+|<+0#e000e06&|N|L|>| +0#0000000&@70
+|<+0#e000e06&|N|e|w|L|i|n|e|>| +0#0000000&@65
+|<+0#e000e06&|L|i|n|e|F|e@1|d|>| +0#0000000&@64
+|<+0#e000e06&|L|F|>| +0#0000000&@70
+|<+0#e000e06&|C|R|>| +0#0000000&@70
+|<+0#e000e06&|R|e|t|u|r|n|>| +0#0000000&@66
+|<+0#e000e06&|E|n|t|e|r|>| +0#0000000&@67
+|<+0#e000e06&|B|S|>| +0#0000000&@70
+|<+0#e000e06&|B|a|c|k|S|p|a|c|e|>| +0#0000000&@63
+|<+0#e000e06&|E|s|c|>| +0#0000000&@69
+|<+0#e000e06&|C|S|I|>| +0#0000000&@69
+|<+0#e000e06&|x|C|S|I|>| +0#0000000&@68
+|<+0#e000e06&|B|a|r|>| +0#0000000&@69
+|<+0#e000e06&|B|s|l|a|s|h|>| +0#0000000&@66
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_01.dump b/runtime/syntax/testdir/dumps/vim_key_notation_01.dump
new file mode 100644
index 0000000..0cbf0ee
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_01.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|B|a|c|k|S|p|a|c|e|>| +0#0000000&@63
+|<+0#e000e06&|E|s|c|>| +0#0000000&@69
+|<+0#e000e06&|C|S|I|>| +0#0000000&@69
+|<+0#e000e06&|x|C|S|I|>| +0#0000000&@68
+|<+0#e000e06&|B|a|r|>| +0#0000000&@69
+><+0#e000e06&|B|s|l|a|s|h|>| +0#0000000&@66
+|<+0#e000e06&|D|e|l|>| +0#0000000&@69
+|<+0#e000e06&|D|e|l|e|t|e|>| +0#0000000&@66
+|<+0#e000e06&|k|D|e|l|>| +0#0000000&@68
+|<+0#e000e06&|U|p|>| +0#0000000&@70
+|<+0#e000e06&|D|o|w|n|>| +0#0000000&@68
+|<+0#e000e06&|L|e|f|t|>| +0#0000000&@68
+|<+0#e000e06&|R|i|g|h|t|>| +0#0000000&@67
+|<+0#e000e06&|x|U|p|>| +0#0000000&@69
+|<+0#e000e06&|x|D|o|w|n|>| +0#0000000&@67
+|<+0#e000e06&|x|L|e|f|t|>| +0#0000000&@67
+|<+0#e000e06&|x|R|i|g|h|t|>| +0#0000000&@66
+|<+0#e000e06&|P|a|s|t|e|S|t|a|r|t|>| +0#0000000&@62
+|<+0#e000e06&|P|a|s|t|e|E|n|d|>| +0#0000000&@64
+@57|1|9|,|1| @10|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_02.dump b/runtime/syntax/testdir/dumps/vim_key_notation_02.dump
new file mode 100644
index 0000000..01fca78
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_02.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|P|a|s|t|e|E|n|d|>| +0#0000000&@64
+|<+0#e000e06&|F|1|>| +0#0000000&@70
+|<+0#e000e06&|F|2|>| +0#0000000&@70
+|<+0#e000e06&|F|3|>| +0#0000000&@70
+|<+0#e000e06&|F|4|>| +0#0000000&@70
+><+0#e000e06&|F|5|>| +0#0000000&@70
+|<+0#e000e06&|F|6|>| +0#0000000&@70
+|<+0#e000e06&|F|7|>| +0#0000000&@70
+|<+0#e000e06&|F|8|>| +0#0000000&@70
+|<+0#e000e06&|F|9|>| +0#0000000&@70
+|<+0#e000e06&|F|1|0|>| +0#0000000&@69
+|<+0#e000e06&|F|1@1|>| +0#0000000&@69
+|<+0#e000e06&|F|1|2|>| +0#0000000&@69
+|<+0#e000e06&|F|1|3|>| +0#0000000&@69
+|<+0#e000e06&|F|1|4|>| +0#0000000&@69
+|<+0#e000e06&|F|1|5|>| +0#0000000&@69
+|<+0#e000e06&|F|1|6|>| +0#0000000&@69
+|<+0#e000e06&|F|1|7|>| +0#0000000&@69
+|<+0#e000e06&|F|1|8|>| +0#0000000&@69
+@57|3|7|,|1| @9|2|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_03.dump b/runtime/syntax/testdir/dumps/vim_key_notation_03.dump
new file mode 100644
index 0000000..dfdf890
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_03.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|F|1|8|>| +0#0000000&@69
+|<+0#e000e06&|F|1|9|>| +0#0000000&@69
+|<+0#e000e06&|F|2|0|>| +0#0000000&@69
+|<+0#e000e06&|F|2|1|>| +0#0000000&@69
+|<+0#e000e06&|F|2@1|>| +0#0000000&@69
+><+0#e000e06&|F|2|3|>| +0#0000000&@69
+|<+0#e000e06&|F|2|4|>| +0#0000000&@69
+|<+0#e000e06&|F|2|5|>| +0#0000000&@69
+|<+0#e000e06&|F|2|6|>| +0#0000000&@69
+|<+0#e000e06&|F|2|7|>| +0#0000000&@69
+|<+0#e000e06&|F|2|8|>| +0#0000000&@69
+|<+0#e000e06&|F|2|9|>| +0#0000000&@69
+|<+0#e000e06&|F|3|0|>| +0#0000000&@69
+|<+0#e000e06&|F|3|1|>| +0#0000000&@69
+|<+0#e000e06&|F|3|2|>| +0#0000000&@69
+|<+0#e000e06&|F|3@1|>| +0#0000000&@69
+|<+0#e000e06&|F|3|4|>| +0#0000000&@69
+|<+0#e000e06&|F|3|5|>| +0#0000000&@69
+|<+0#e000e06&|F|3|6|>| +0#0000000&@69
+@57|5@1|,|1| @9|3|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_04.dump b/runtime/syntax/testdir/dumps/vim_key_notation_04.dump
new file mode 100644
index 0000000..8820c26
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_04.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|F|3|6|>| +0#0000000&@69
+|<+0#e000e06&|F|3|7|>| +0#0000000&@69
+|<+0#e000e06&|x|F|1|>| +0#0000000&@69
+|<+0#e000e06&|x|F|2|>| +0#0000000&@69
+|<+0#e000e06&|x|F|3|>| +0#0000000&@69
+><+0#e000e06&|x|F|4|>| +0#0000000&@69
+|<+0#e000e06&|H|e|l|p|>| +0#0000000&@68
+|<+0#e000e06&|U|n|d|o|>| +0#0000000&@68
+|<+0#e000e06&|I|n|s|e|r|t|>| +0#0000000&@66
+|<+0#e000e06&|I|n|s|>| +0#0000000&@69
+|<+0#e000e06&|k|I|n|s|e|r|t|>| +0#0000000&@65
+|<+0#e000e06&|H|o|m|e|>| +0#0000000&@68
+|<+0#e000e06&|k|H|o|m|e|>| +0#0000000&@67
+|<+0#e000e06&|x|H|o|m|e|>| +0#0000000&@67
+|<+0#e000e06&|z|H|o|m|e|>| +0#0000000&@67
+|<+0#e000e06&|E|n|d|>| +0#0000000&@69
+|<+0#e000e06&|k|E|n|d|>| +0#0000000&@68
+|<+0#e000e06&|x|E|n|d|>| +0#0000000&@68
+|<+0#e000e06&|z|E|n|d|>| +0#0000000&@68
+@57|7|3|,|1| @9|4|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_05.dump b/runtime/syntax/testdir/dumps/vim_key_notation_05.dump
new file mode 100644
index 0000000..939bf89
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_05.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|z|E|n|d|>| +0#0000000&@68
+|<+0#e000e06&|P|a|g|e|U|p|>| +0#0000000&@66
+|<+0#e000e06&|P|a|g|e|D|o|w|n|>| +0#0000000&@64
+|<+0#e000e06&|k|P|a|g|e|U|p|>| +0#0000000&@65
+|<+0#e000e06&|k|P|a|g|e|D|o|w|n|>| +0#0000000&@63
+><+0#e000e06&|k|P|l|u|s|>| +0#0000000&@67
+|<+0#e000e06&|k|M|i|n|u|s|>| +0#0000000&@66
+|<+0#e000e06&|k|D|i|v|i|d|e|>| +0#0000000&@65
+|<+0#e000e06&|k|M|u|l|t|i|p|l|y|>| +0#0000000&@63
+|<+0#e000e06&|k|E|n|t|e|r|>| +0#0000000&@66
+|<+0#e000e06&|k|P|o|i|n|t|>| +0#0000000&@66
+|<+0#e000e06&|k|0|>| +0#0000000&@70
+|<+0#e000e06&|k|1|>| +0#0000000&@70
+|<+0#e000e06&|k|2|>| +0#0000000&@70
+|<+0#e000e06&|k|3|>| +0#0000000&@70
+|<+0#e000e06&|k|4|>| +0#0000000&@70
+|<+0#e000e06&|k|5|>| +0#0000000&@70
+|<+0#e000e06&|k|6|>| +0#0000000&@70
+|<+0#e000e06&|k|7|>| +0#0000000&@70
+@57|9|1|,|1| @9|5|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_06.dump b/runtime/syntax/testdir/dumps/vim_key_notation_06.dump
new file mode 100644
index 0000000..e82c7f3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_06.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|k|7|>| +0#0000000&@70
+|<+0#e000e06&|k|8|>| +0#0000000&@70
+|<+0#e000e06&|k|9|>| +0#0000000&@70
+|<+0#e000e06&|l|t|>| +0#0000000&@70
+|<+0#e000e06&|M|o|u|s|e|>| +0#0000000&@67
+><+0#e000e06&|N|e|t|M|o|u|s|e|>| +0#0000000&@64
+|<+0#e000e06&|D|e|c|M|o|u|s|e|>| +0#0000000&@64
+|<+0#e000e06&|J|s|b|M|o|u|s|e|>| +0#0000000&@64
+|<+0#e000e06&|P|t|e|r|m|M|o|u|s|e|>| +0#0000000&@62
+|<+0#e000e06&|U|r|x|v|t|M|o|u|s|e|>| +0#0000000&@62
+|<+0#e000e06&|S|g|r|M|o|u|s|e|>| +0#0000000&@64
+|<+0#e000e06&|S|g|r|M|o|u|s|e|R|e|l|e|a|s|e|>| +0#0000000&@57
+|<+0#e000e06&|L|e|f|t|M|o|u|s|e|>| +0#0000000&@63
+|<+0#e000e06&|L|e|f|t|M|o|u|s|e|N|M|>| +0#0000000&@61
+|<+0#e000e06&|L|e|f|t|D|r|a|g|>| +0#0000000&@64
+|<+0#e000e06&|L|e|f|t|R|e|l|e|a|s|e|>| +0#0000000&@61
+|<+0#e000e06&|L|e|f|t|R|e|l|e|a|s|e|N|M|>| +0#0000000&@59
+|<+0#e000e06&|M|o|u|s|e|M|o|v|e|>| +0#0000000&@63
+|<+0#e000e06&|M|i|d@1|l|e|M|o|u|s|e|>| +0#0000000&@61
+@57|1|0|9|,|1| @8|7|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_07.dump b/runtime/syntax/testdir/dumps/vim_key_notation_07.dump
new file mode 100644
index 0000000..3e21774
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_07.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|M|i|d@1|l|e|M|o|u|s|e|>| +0#0000000&@61
+|<+0#e000e06&|M|i|d@1|l|e|D|r|a|g|>| +0#0000000&@62
+|<+0#e000e06&|M|i|d@1|l|e|R|e|l|e|a|s|e|>| +0#0000000&@59
+|<+0#e000e06&|R|i|g|h|t|M|o|u|s|e|>| +0#0000000&@62
+|<+0#e000e06&|R|i|g|h|t|D|r|a|g|>| +0#0000000&@63
+><+0#e000e06&|R|i|g|h|t|R|e|l|e|a|s|e|>| +0#0000000&@60
+|<+0#e000e06&|S|c|r|o|l@1|W|h|e@1|l|U|p|>| +0#0000000&@59
+|<+0#e000e06&|S|c|r|o|l@1|W|h|e@1|l|D|o|w|n|>| +0#0000000&@57
+|<+0#e000e06&|S|c|r|o|l@1|W|h|e@1|l|R|i|g|h|t|>| +0#0000000&@56
+|<+0#e000e06&|S|c|r|o|l@1|W|h|e@1|l|L|e|f|t|>| +0#0000000&@57
+|<+0#e000e06&|M|o|u|s|e|D|o|w|n|>| +0#0000000&@63
+|<+0#e000e06&|M|o|u|s|e|U|p|>| +0#0000000&@65
+|<+0#e000e06&|X|1|M|o|u|s|e|>| +0#0000000&@65
+|<+0#e000e06&|X|1|D|r|a|g|>| +0#0000000&@66
+|<+0#e000e06&|X|1|R|e|l|e|a|s|e|>| +0#0000000&@63
+|<+0#e000e06&|X|2|M|o|u|s|e|>| +0#0000000&@65
+|<+0#e000e06&|X|2|D|r|a|g|>| +0#0000000&@66
+|<+0#e000e06&|X|2|R|e|l|e|a|s|e|>| +0#0000000&@63
+|<+0#e000e06&|D|r|o|p|>| +0#0000000&@68
+@57|1|2|7|,|1| @8|8|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_08.dump b/runtime/syntax/testdir/dumps/vim_key_notation_08.dump
new file mode 100644
index 0000000..7337575
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_08.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|D|r|o|p|>| +0#0000000&@68
+|<+0#e000e06&|N|u|l|>| +0#0000000&@69
+|<+0#e000e06&|S|N|R|>| +0#0000000&@69
+|<+0#e000e06&|P|l|u|g|>| +0#0000000&@68
+|<+0#e000e06&|C|u|r|s|o|r|H|o|l|d|>| +0#0000000&@62
+><+0#e000e06&|I|g|n|o|r|e|>| +0#0000000&@66
+|<+0#e000e06&|C|m|d|>| +0#0000000&@69
+|<+0#e000e06&|S|c|r|i|p|t|C|m|d|>| +0#0000000&@63
+|<+0#e000e06&|F|o|c|u|s|G|a|i|n|e|d|>| +0#0000000&@61
+|<+0#e000e06&|F|o|c|u|s|L|o|s|t|>| +0#0000000&@63
+@75
+|<+0#e000e06&|c|w|o|r|d|>| +0#0000000&@67
+|<+0#e000e06&|c|W|O|R|D|>| +0#0000000&@67
+|<+0#e000e06&|c|e|x|p|r|>| +0#0000000&@67
+|<+0#e000e06&|c|f|i|l|e|>| +0#0000000&@67
+|<+0#e000e06&|a|f|i|l|e|>| +0#0000000&@67
+|<+0#e000e06&|a|b|u|f|>| +0#0000000&@68
+|<+0#e000e06&|a|m|a|t|c|h|>| +0#0000000&@66
+|<+0#e000e06&|s|f|i|l|e|>| +0#0000000&@67
+@57|1|4|5|,|1| @8|9|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_key_notation_99.dump b/runtime/syntax/testdir/dumps/vim_key_notation_99.dump
new file mode 100644
index 0000000..67dac5f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_key_notation_99.dump
@@ -0,0 +1,20 @@
+|<+0#e000e06#ffffff0|I|g|n|o|r|e|>| +0#0000000&@66
+|<+0#e000e06&|C|m|d|>| +0#0000000&@69
+|<+0#e000e06&|S|c|r|i|p|t|C|m|d|>| +0#0000000&@63
+|<+0#e000e06&|F|o|c|u|s|G|a|i|n|e|d|>| +0#0000000&@61
+|<+0#e000e06&|F|o|c|u|s|L|o|s|t|>| +0#0000000&@63
+@75
+|<+0#e000e06&|c|w|o|r|d|>| +0#0000000&@67
+|<+0#e000e06&|c|W|O|R|D|>| +0#0000000&@67
+|<+0#e000e06&|c|e|x|p|r|>| +0#0000000&@67
+|<+0#e000e06&|c|f|i|l|e|>| +0#0000000&@67
+|<+0#e000e06&|a|f|i|l|e|>| +0#0000000&@67
+|<+0#e000e06&|a|b|u|f|>| +0#0000000&@68
+|<+0#e000e06&|a|m|a|t|c|h|>| +0#0000000&@66
+|<+0#e000e06&|s|f|i|l|e|>| +0#0000000&@67
+|<+0#e000e06&|s|t|a|c|k|>| +0#0000000&@67
+|<+0#e000e06&|s|c|r|i|p|t|>| +0#0000000&@66
+|<+0#e000e06&|s|l|n|u|m|>| +0#0000000&@67
+|<+0#e000e06&|s|f|l|n|u|m|>| +0#0000000&@66
+><+0#e000e06&|c|l|i|e|n|t|>| +0#0000000&@66
+@57|1|6|3|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_keymap_00.dump b/runtime/syntax/testdir/dumps/vim_keymap_00.dump
index 974c5ad..2c43e3d 100644
--- a/runtime/syntax/testdir/dumps/vim_keymap_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_keymap_00.dump
@@ -17,4 +17,4 @@
|s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&|u|t|f|-+0#af5f00255&|8+0#e000002&| +0#0000000&@54
@75
|@+0#4040ff13&@2| @71
-|"+0#0000000&|i|n|p|u|t|/|v|i|m|_|k|e|y|m|a|p|.|v|i|m|"| |2|6|L|,| |3|9@1|2|B| @23|1|,|1| @10|T|o|p|
+| +0#0000000&@56|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_line_continuation_00.dump b/runtime/syntax/testdir/dumps/vim_line_continuation_00.dump
new file mode 100644
index 0000000..d6b526f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_line_continuation_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |l|i|n|e| |c|o|n|t|i|n|u|a|t|i|o|n|s| |w|i|t|h| |i|n|t|e|r|s|p|e|r|s|e|d| |c|o|m@1|e|n|t|s| +0#0000000&@23
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&| +0#0000000&@61
+@6|"+0#0000e05&|\| |p|a|r|a|m| |a| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|a+0#00e0e07&|,+0#0000000&| @64
+@6|"+0#0000e05&|\| |p|a|r|a|m| |b| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|,+0#0000000&| @64
+@6|"+0#0000e05&|\| |p|a|r|a|m| |c| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|c+0#00e0e07&| +0#0000000&@65
+@6|\+0#e000e06&|)| +0#0000000&@66
+@2|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@65
+@8|"+0#0000e05&|\| |s|t|a|r|t| |s|t|r|i|n|g| +0#0000000&@51
+@8|\+0#e000e06&| +0#0000000&|$|"| @62
+@8|"+0#0000e05&|\| |p|r|i|n|t| |a| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|a+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|a+0#00e0e07&|:|a|}+0#e000e06&|,+0#0000000&| @54
+@8|"+0#0000e05&|\| |p|r|i|n|t| |b| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|b+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|a+0#00e0e07&|:|b|}+0#e000e06&|,+0#0000000&| @54
+@8|"+0#0000e05&|\| |p|r|i|n|t| |c| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|c+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|a+0#00e0e07&|:|c|}+0#e000e06&| +0#0000000&@55
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_line_continuation_01.dump b/runtime/syntax/testdir/dumps/vim_line_continuation_01.dump
new file mode 100644
index 0000000..e5a9a18
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_line_continuation_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@7|"+0#0000e05&|\| |p|r|i|n|t| |a| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|a+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|a+0#00e0e07&|:|a|}+0#e000e06&|,+0#0000000&| @54
+@8|"+0#0000e05&|\| |p|r|i|n|t| |b| +0#0000000&@56
+@8|\+0#e000e06&| +0#0000000&|b+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|a+0#00e0e07&|:|b|}+0#e000e06&|,+0#0000000&| @54
+@8|"+0#0000e05&|\| |p|r|i|n|t| |c| +0#0000000&@56
+@8>\+0#e000e06&| +0#0000000&|c+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|{+0#e000e06&|a+0#00e0e07&|:|c|}+0#e000e06&| +0#0000000&@55
+@8|"+0#0000e05&|\| |e|n|d| |s|t|r|i|n|g| +0#0000000&@53
+@8|\+0#e000e06&|"+0#0000000&| @64
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&| +0#0000000&@65
+@6|"+0#0000e05&|\| |a|r|g| |1| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|1+0#e000002&@1|,+0#0000000&| @63
+@6|"+0#0000e05&|\| |a|r|g| |2| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|2+0#e000002&@1|,+0#0000000&| @63
+@6|"+0#0000e05&|\| |a|r|g| |3| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|3+0#e000002&@1| +0#0000000&@64
+@6|\+0#e000e06&|)| +0#0000000&@66
+@75
+@57|1|9|,|2|-|9| @7|4|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_line_continuation_02.dump b/runtime/syntax/testdir/dumps/vim_line_continuation_02.dump
new file mode 100644
index 0000000..c4ceded
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_line_continuation_02.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|l+0#af5f00255&|e|t| +0#0000000&|d+0#00e0e07&|i|c|t| +0#0000000&|=+0#af5f00255&| +0#0000000&|#+0#e000e06&|{| +0#0000000&@61
+@6|"+0#0000e05&|\| |p|a|i|r| |1| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|a+0#00e0e07&|:+0#0000000&| |1+0#e000002&|,+0#0000000&| @61
+@6|"+0#0000e05&|\| |p|a|i|r| |2| +0#0000000&@59
+@6>\+0#e000e06&| +0#0000000&|b+0#00e0e07&|:+0#0000000&| |2+0#e000002&|,+0#0000000&| @61
+@6|"+0#0000e05&|\| |p|a|i|r| |3| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|c+0#00e0e07&|:+0#0000000&| |3+0#e000002&| +0#0000000&@62
+@6|\+0#e000e06&|}| +0#0000000&@66
+@75
+|l+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|r@1|a|y| +0#0000000&|=+0#af5f00255&| +0#0000000&|[| @61
+| +0#0000e05&@5|"|\| |e|l|e|m|e|n|t| |1| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|1+0#e000002&|,+0#0000000&| @64
+| +0#0000e05&@5|"|\| |e|l|e|m|e|n|t| |2| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|2+0#e000002&|,+0#0000000&| @64
+| +0#0000e05&@5|"|\| |e|l|e|m|e|n|t| |3| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|3+0#e000002&| +0#0000000&@65
+@6|\+0#e000e06&|]+0#0000000&| @66
+|~+0#4040ff13&| @73
+| +0#0000000&@56|3|7|,|7| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_line_continuation_99.dump b/runtime/syntax/testdir/dumps/vim_line_continuation_99.dump
new file mode 100644
index 0000000..05ea464
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_line_continuation_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&|)| +0#0000000&@66
+@75
+|l+0#af5f00255&|e|t| +0#0000000&|d+0#00e0e07&|i|c|t| +0#0000000&|=+0#af5f00255&| +0#0000000&|#+0#e000e06&|{| +0#0000000&@61
+@6|"+0#0000e05&|\| |p|a|i|r| |1| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|a+0#00e0e07&|:+0#0000000&| |1+0#e000002&|,+0#0000000&| @61
+@6|"+0#0000e05&|\| |p|a|i|r| |2| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|:+0#0000000&| |2+0#e000002&|,+0#0000000&| @61
+@6|"+0#0000e05&|\| |p|a|i|r| |3| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|c+0#00e0e07&|:+0#0000000&| |3+0#e000002&| +0#0000000&@62
+@6|\+0#e000e06&|}| +0#0000000&@66
+@75
+|l+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|r@1|a|y| +0#0000000&|=+0#af5f00255&| +0#0000000&|[| @61
+| +0#0000e05&@5|"|\| |e|l|e|m|e|n|t| |1| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|1+0#e000002&|,+0#0000000&| @64
+| +0#0000e05&@5|"|\| |e|l|e|m|e|n|t| |2| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|2+0#e000002&|,+0#0000000&| @64
+| +0#0000e05&@5|"|\| |e|l|e|m|e|n|t| |3| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|3+0#e000002&| +0#0000000&@65
+@6>\+0#e000e06&|]+0#0000000&| @66
+@57|4|9|,|7| @9|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_new_00.dump b/runtime/syntax/testdir/dumps/vim_new_00.dump
new file mode 100644
index 0000000..2ff76f4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_new_00.dump
@@ -0,0 +1,20 @@
+>v+0#af5f00255#ffffff0|i|m|9|s|c|r|i|p|t| +0#0000000&@64
+@75
+|#+0#0000e05&| |V|i|m| |:|n|e|w| |c|o|m@1|a|n|d| |a|n|d| |c|l|a|s@1| |c|o|n|s|t|r|u|c|t|o|r|s|.| +0#0000000&@32
+|c+0#af5f00255&|l|a|s@1| +0#0000000&|T|e|s|t| @64
+@8|d+0#af5f00255&|e|f| +0#0000000&|n|e|w|(+0#e000e06&|)| +0#0000000&@57
+@8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60
+@8|d+0#af5f00255&|e|f| +0#0000000&|n|e|w|O|t|h|e|r|(+0#e000e06&|)| +0#0000000&@52
+@8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60
+@8|d+0#af5f00255&|e|f| +0#0000000&|n|e|w|y|e|t|a|n|o|t|h|e|r|(+0#e000e06&|)| +0#0000000&@47
+@8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60
+|e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@66
+@75
+|T|e|s|t|.+0#af5f00255&|n+0#0000000&|e|w|(+0#e000e06&|)| +0#0000000&@64
+|T|e|s|t|.+0#af5f00255&|n+0#0000000&|e|w|O|t|h|e|r|(+0#e000e06&|)| +0#0000000&@59
+|T|e|s|t|.+0#af5f00255&|n+0#0000000&|e|w|y|e|t|a|n|o|t|h|e|r|(+0#e000e06&|)| +0#0000000&@54
+|n+0#af5f00255&|e|w| +0#0000000&@71
+|q+0#af5f00255&|u|i|t| +0#0000000&@70
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|1|,|1| @10|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_new_99.dump b/runtime/syntax/testdir/dumps/vim_new_99.dump
new file mode 100644
index 0000000..a9fe50f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_new_99.dump
@@ -0,0 +1,20 @@
+|v+0#af5f00255#ffffff0|i|m|9|s|c|r|i|p|t| +0#0000000&@64
+@75
+|#+0#0000e05&| |V|i|m| |:|n|e|w| |c|o|m@1|a|n|d| |a|n|d| |c|l|a|s@1| |c|o|n|s|t|r|u|c|t|o|r|s|.| +0#0000000&@32
+|c+0#af5f00255&|l|a|s@1| +0#0000000&|T|e|s|t| @64
+@8|d+0#af5f00255&|e|f| +0#0000000&|n|e|w|(+0#e000e06&|)| +0#0000000&@57
+@8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60
+@8|d+0#af5f00255&|e|f| +0#0000000&|n|e|w|O|t|h|e|r|(+0#e000e06&|)| +0#0000000&@52
+@8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60
+@8|d+0#af5f00255&|e|f| +0#0000000&|n|e|w|y|e|t|a|n|o|t|h|e|r|(+0#e000e06&|)| +0#0000000&@47
+@8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60
+|e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@66
+@75
+|T|e|s|t|.+0#af5f00255&|n+0#0000000&|e|w|(+0#e000e06&|)| +0#0000000&@64
+|T|e|s|t|.+0#af5f00255&|n+0#0000000&|e|w|O|t|h|e|r|(+0#e000e06&|)| +0#0000000&@59
+|T|e|s|t|.+0#af5f00255&|n+0#0000000&|e|w|y|e|t|a|n|o|t|h|e|r|(+0#e000e06&|)| +0#0000000&@54
+|n+0#af5f00255&|e|w| +0#0000000&@71
+>q+0#af5f00255&|u|i|t| +0#0000000&@70
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|1|7|,|1| @9|A|l@1|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_00.dump b/runtime/syntax/testdir/dumps/vim_syntax_00.dump
index db52967..916f96d 100644
--- a/runtime/syntax/testdir/dumps/vim_syntax_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_syntax_00.dump
@@ -1,20 +1,20 @@
->"+0#0000e05#ffffff0| |V|i|m| |:|s|y|n|t|a|x| |h|i|g|h|l|i|g|h|t|i|n|g| +0#0000000&@48
+>"+0#0000e05#ffffff0| |V|i|m| |:|s|y|n|t|a|x| |c|o|m@1|a|n|d| +0#0000000&@53
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t+0#00e0003&|e|s|t|M|a|t|c|h| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"+0#0000e05&| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@20
+|"+0#0000e05&| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|c|o|m@1|e|n|t|s| |n|o|t| |c|u|r@1|e|n|t|l|y| |s|u|p@1|o|r|t|e|d| +0#0000000&@34
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&|k|e|y|w|o|r|d| |c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"| |t|a|i|l| |c|o|m@1|e|n|t| @18
+|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t+0#00e0003&|e|s|t|R|e|g|i|o|n| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000002&|s|t|a|r|t|-|p|a|t@1|e|r|n|"| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000002&|s|k|i|p|-|p|a|t@1|e|r|n|"| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|e|n|d|-|p|a
+|t@1|e|r|n|"| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"| |t|a|i|l| |c|o|m@1|e|n|t| @43
+@75
+|"+0#0000e05&| |M|u|l|t|i|l|i|n|e| |c|o|m@1|a|n|d|s| +0#0000000&@54
@75
|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&@51
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l| |o|p|t|i|o|n| +0#0000000&@51
@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+@6|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
-@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|,|@|t|e|s|t|C|l|u|s|t|e|r| @35
-@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
-@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|1| @58
-@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|2| @58
-@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|3| @58
-@75
-|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t+0#00e0003&|e|s|t|M|a|t|c|h| +0#0000000&@55
-@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
-|"|i|n|p|u|t|/|v|i|m|_|s|y|n|t|a|x|.|v|i|m|"| |7|5|L|,| |1|5|0|2|B| @23|1|,|1| @10|T|o|p|
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_01.dump b/runtime/syntax/testdir/dumps/vim_syntax_01.dump
index e09801d..800e4a7 100644
--- a/runtime/syntax/testdir/dumps/vim_syntax_01.dump
+++ b/runtime/syntax/testdir/dumps/vim_syntax_01.dump
@@ -1,20 +1,20 @@
-| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|2| @58
-@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|3| @58
-@75
-|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t+0#00e0003&|e|s|t|M|a|t|c|h| +0#0000000&@55
-@6|\+0#e000e06&| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@57
-@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+| +0&#ffffff0@5|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
-@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|,|@|t|e|s|t|C|l|u|s|t|e|r| @35
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|0|,|@|t|e|s|t|C|l|u|s|t|e|r| @34
+@6|"+0#0000e05&|\| |t|r|a|n|s|p|a|r|e|n|t| |o|p|t|i|o|n| +0#0000000&@47
@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |s|k|i|p|w|h|i|t|e| |o|p|t|i|o|n| +0#0000000&@49
@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|n|l| |o|p|t|i|o|n| +0#0000000&@52
@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2| @28
-@6|\+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@62
-@6|\+0#e000e06&| +0#0000000&|d+0#e000e06&|i|s|p|l|a|y| +0#0000000&@59
-@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|t|e|n|d| +0#0000000&@60
-@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
-@57|1|9|,|7| @9|2|3|%|
+@6|"+0#0000e05&|\| |K|E|Y|W|O|R|D|S| |L|I|S|T| +0#0000000&@52
+@6|"+0#0000e05&|\| |k|e|y|w|o|r|d| |1| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|1| @58
+@57|1|9|,|7| @10|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_02.dump b/runtime/syntax/testdir/dumps/vim_syntax_02.dump
index 063a33b..1caffc1 100644
--- a/runtime/syntax/testdir/dumps/vim_syntax_02.dump
+++ b/runtime/syntax/testdir/dumps/vim_syntax_02.dump
@@ -1,20 +1,20 @@
-| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|k+0#e000e06&|e@1|p|e|n|d| +0#0000000&@59
-@75
-|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t+0#00e0003&|e|s|t|R|e|g|i|o|n| +0#0000000&@53
-@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|t|a|r|t|=+0#0000000&|"+0#e000002&|s|t|a|r|t|-|p|a|t@1|e|r|n|"| +0#0000000&@45
-@6>\+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=+0#0000000&|"+0#e000002&|e|n|d|-|p|a|t@1|e|r|n|"| +0#0000000&@49
-@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|k|i|p|=+0#0000000&|"+0#e000002&|s|k|i|p|-|p|a|t@1|e|r|n|"| +0#0000000&@47
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
-@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|,|@|t|e|s|t|C|l|u|s|t|e|r| @35
-@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2| @28
-@6|\+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&@59
-@57|3|7|,|7| @9|5@1|%|
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|1| @58
+@6|"+0#0000e05&|\| |k|e|y|w|o|r|d| |2| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|2| @58
+@6|"+0#0000e05&|\| |k|e|y|w|o|r|d| |3| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|3| @58
+> @74
+|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t+0#00e0003&|e|s|t|M|a|t|c|h| +0#0000000&@55
+@6|"+0#0000e05&|\| |M|A|T|C|H| |P|A|T@1|E|R|N| +0#0000000&@52
+@6|"+0#0000e05&|\| |p|a|t@1|e|r|n| |s|t|a|r|t| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|/+0#e000002&| +0#0000000&@65
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|r|t| |1| |d|e|s|c|r|i|p|t|i|o|n| +0#0000000&@47
+| +0#e000002&@5|\+0#e000e06&|p+0#e000002&|a|t|1|a| |.|*| |p|a|t|1|b| +0#0000000&@53
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|r|t| |2| |d|e|s|c|r|i|p|t|i|o|n| +0#0000000&@47
+| +0#e000002&@5|\+0#e000e06&|p+0#e000002&|a|t|2|a| |.|*| |p|a|t|2|b| +0#0000000&@53
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|r|t| |3| |d|e|s|c|r|i|p|t|i|o|n| +0#0000000&@47
+| +0#e000002&@5|\+0#e000e06&|p+0#e000002&|a|t|3|a| |.|*| |p|a|t|3|b| +0#0000000&@53
+| +0#e000002&@5|"+0#0000e05&|\| |p|a|t@1|e|r|n| |e|n|d| +0#0000000&@54
+| +0#e000002&@5|\+0#e000e06&|/+0#e000002&| +0#0000000&@66
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@57|3|7|,|0|-|1| @7|2|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_03.dump b/runtime/syntax/testdir/dumps/vim_syntax_03.dump
index b3a23dd..31ab527 100644
--- a/runtime/syntax/testdir/dumps/vim_syntax_03.dump
+++ b/runtime/syntax/testdir/dumps/vim_syntax_03.dump
@@ -1,20 +1,20 @@
-| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&@59
-@6|\+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@62
-@6|\+0#e000e06&| +0#0000000&|d+0#e000e06&|i|s|p|l|a|y| +0#0000000&@59
-@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|t|e|n|d| +0#0000000&@60
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l|e|n|d|s| +0#0000000&@55
-@6>\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
-@6|\+0#e000e06&| +0#0000000&|k+0#e000e06&|e@1|p|e|n|d| +0#0000000&@59
-@75
-|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2|,|t|e|s|t|C|o|n|t|a|i|n|e|d|3| @13
-@75
-|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
-@6|\+0#e000e06&| +0#0000000&|a+0#e000e06&|d@1|=|t+0#0000000&|e|s|t|A|d@1| @55
-@6|\+0#e000e06&| +0#0000000&|r+0#e000e06&|e|m|o|v|e|=|t+0#0000000&|e|s|t|R|e|m|o|v|e| @49
-@75
-@75
-|"+0#0000e05&| |c|h|e|c|k| |m|u|l|t|i|l|i|n|e| |g|r|o|u|p| |l|i|s|t| +0#0000000&@46
-|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&@51
-@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=| +0#0000000&@56
-@57|5@1|,|7| @9|8|7|%|
+| +0&#ffffff0@5|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+@6|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6>"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|0|,|@|t|e|s|t|C|l|u|s|t|e|r| @34
+@6|"+0#0000e05&|\| |t|r|a|n|s|p|a|r|e|n|t| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |s|k|i|p|w|h|i|t|e| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|n|l| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@57|5@1|,|7| @9|3@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_04.dump b/runtime/syntax/testdir/dumps/vim_syntax_04.dump
new file mode 100644
index 0000000..d5d9f40
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_syntax_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|s| |o|p|t|i|o|n| +0#0000000&@50
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2| @28
+@6|"+0#0000e05&|\| |f|o|l|d| |o|p|t|i|o|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@62
+@6>"+0#0000e05&|\| |d|i|s|p|l|a|y| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|d+0#e000e06&|i|s|p|l|a|y| +0#0000000&@59
+@6|"+0#0000e05&|\| |e|x|t|e|n|d| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|t|e|n|d| +0#0000000&@60
+@6|"+0#0000e05&|\| |e|x|c|l|u|d|e|n|l| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
+@6|"+0#0000e05&|\| |k|e@1|p|e|n|d| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|k+0#e000e06&|e@1|p|e|n|d| +0#0000000&@59
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t+0#00e0003&|e|s|t|R|e|g|i|o|n| +0#0000000&@53
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |s|t|a|r|t| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000002&|s|t|a|r|t|-|p|a|t@1|e|r|n|"| +0#0000000&@45
+@6|"+0#0000e05&|\| |s|k|i|p| |o|p|t|i|o|n| +0#0000000&@54
+@57|7|3|,|7| @9|4|6|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_05.dump b/runtime/syntax/testdir/dumps/vim_syntax_05.dump
new file mode 100644
index 0000000..47d60c2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_syntax_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |s|k|i|p| |o|p|t|i|o|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000002&|s|k|i|p|-|p|a|t@1|e|r|n|"| +0#0000000&@47
+@6|"+0#0000e05&|\| |e|n|d| |o|p|t|i|o|n| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|e|n|d|-|p|a|t@1|e|r|n|"| +0#0000000&@49
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l| |o|p|t|i|o|n| +0#0000000&@51
+@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l| +0#0000000&@59
+@6|"+0#0000e05&|\| |c@1|h|a|r| |o|p|t|i|o|n| +0#0000000&@53
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&@1|h|a|r|=|&+0#e000002&| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|e|d|i|n| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|r| @41
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=|t+0#0000000&|e|s|t|N|e|x|t|0|,|@|t|e|s|t|C|l|u|s|t|e|r| @34
+@6|"+0#0000e05&|\| |t|r|a|n|s|p|a|r|e|n|t| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|t+0#e000e06&|r|a|n|s|p|a|r|e|n|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |s|k|i|p|w|h|i|t|e| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@57|9|1|,|7| @9|5|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_06.dump b/runtime/syntax/testdir/dumps/vim_syntax_06.dump
new file mode 100644
index 0000000..db1872c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_syntax_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |s|k|i|p|e|m|p|t|y| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|e|m|p|t|y| +0#0000000&@57
+@6|"+0#0000e05&|\| |s|k|i|p|n|l| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|n|l| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|n|t|a|i|n|s| |o|p|t|i|o|n| +0#0000000&@50
+@6>\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2| @28
+@6|"+0#0000e05&|\| |o|n|e|l|i|n|e| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&@59
+@6|"+0#0000e05&|\| |f|o|l|d| |o|p|t|i|o|n| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@62
+@6|"+0#0000e05&|\| |d|i|s|p|l|a|y| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|d+0#e000e06&|i|s|p|l|a|y| +0#0000000&@59
+@6|"+0#0000e05&|\| |e|x|t|e|n|d| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|t|e|n|d| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|n|c|e|a|l|e|n|d|s| |o|p|t|i|o|n| +0#0000000&@47
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|c|e|a|l|e|n|d|s| +0#0000000&@55
+@6|"+0#0000e05&|\| |e|x|c|l|u|d|e|n|l| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|e+0#e000e06&|x|c|l|u|d|e|n|l| +0#0000000&@57
+@6|"+0#0000e05&|\| |k|e@1|p|e|n|d| |o|p|t|i|o|n| +0#0000000&@51
+@57|1|0|9|,|7| @8|7|1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_07.dump b/runtime/syntax/testdir/dumps/vim_syntax_07.dump
new file mode 100644
index 0000000..eb36317
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_syntax_07.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |k|e@1|p|e|n|d| |o|p|t|i|o|n| +0#0000000&@51
+@6|\+0#e000e06&| +0#0000000&|k+0#e000e06&|e@1|p|e|n|d| +0#0000000&@59
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6>"+0#0000e05&|\| |c|o|n|t|a|i|n|s| |o|p|t|i|o|n| +0#0000000&@50
+@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2|,|t|e|s|t|C|o|n|t|a|i|n|e|d|3| @13
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
+@6|"+0#0000e05&|\| |O|P|T|I|O|N|S| +0#0000000&@58
+@6|"+0#0000e05&|\| |a|d@1| |o|p|t|i|o|n| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|a+0#e000e06&|d@1|=|t+0#0000000&|e|s|t|A|d@1| @55
+@6|"+0#0000e05&|\| |r|e|m|o|v|e| |o|p|t|i|o|n| +0#0000000&@52
+@6|\+0#e000e06&| +0#0000000&|r+0#e000e06&|e|m|o|v|e|=|t+0#0000000&|e|s|t|R|e|m|o|v|e| @49
+@75
+@75
+|"+0#0000e05&| |m|u|l|t|i|l|i|n|e| |g|r|o|u|p| |l|i|s|t| +0#0000000&@52
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|0| +0#0000000&|k|e|y|w|o|r|d| @45
+@57|1|2|7|,|7| @8|8|3|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_08.dump b/runtime/syntax/testdir/dumps/vim_syntax_08.dump
new file mode 100644
index 0000000..3906e55
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_syntax_08.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|0| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|1| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|2| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|3| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|4| +0#0000000&|k|e|y|w|o|r|d| @45
+>s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|5| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|6| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|7| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|8| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|9| +0#0000000&|k|e|y|w|o|r|d| @45
+@75
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&@51
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
+@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=| +0#0000000&@56
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|0| |,| |t|e|s|t|N|e|x|t|1| |,| @43
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|[|2|-|8|]|.|*| |,| @49
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@57|1|4|5|,|1| @8|9|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_syntax_99.dump b/runtime/syntax/testdir/dumps/vim_syntax_99.dump
index c50589d..4ca16c6 100644
--- a/runtime/syntax/testdir/dumps/vim_syntax_99.dump
+++ b/runtime/syntax/testdir/dumps/vim_syntax_99.dump
@@ -1,20 +1,20 @@
-| +0&#ffffff0@74
-|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
-@6|\+0#e000e06&| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|t+0#0000000&|e|s|t|C|o|n|t|a|i|n|e|d|1|,|t|e|s|t|C|o|n|t|a|i|n|e|d|2|,|t|e|s|t|C|o|n|t|a|i|n|e|d|3| @13
+|s+0#af5f00255#ffffff0|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|6| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|7| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|8| +0#0000000&|k|e|y|w|o|r|d| @45
+|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|N|e|x|t|9| +0#0000000&|k|e|y|w|o|r|d| @45
@75
-|s+0#af5f00255&|y|n| +0#0000000&|c+0#00e0003&|l|u|s|t|e|r| +0#0000000&|t+0#00e0003&|e|s|t|C|l|u|s|t|e|r| +0#0000000&@51
-@6|\+0#e000e06&| +0#0000000&|a+0#e000e06&|d@1|=|t+0#0000000&|e|s|t|A|d@1| @55
-@6|\+0#e000e06&| +0#0000000&|r+0#e000e06&|e|m|o|v|e|=|t+0#0000000&|e|s|t|R|e|m|o|v|e| @49
-@75
-@75
-|"+0#0000e05&| |c|h|e|c|k| |m|u|l|t|i|l|i|n|e| |g|r|o|u|p| |l|i|s|t| +0#0000000&@46
|s+0#af5f00255&|y|n| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|t+0#00e0003&|e|s|t|K|e|y|w|o|r|d| +0#0000000&@51
+@6|"+0#0000e05&|\| |n|e|x|t|g|r|o|u|p| |o|p|t|i|o|n| +0#0000000&@49
@6|\+0#e000e06&| +0#0000000&|n+0#e000e06&|e|x|t|g|r|o|u|p|=| +0#0000000&@56
-@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t| |,| @56
-@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|2| |,| @55
-@6|\+0#e000e06&| +0#0000000&|@|t|e|s|t|C|l|u|s|t|e|r| @54
-@6|\+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@57
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|0| |,| |t|e|s|t|N|e|x|t|1| |,| @43
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|[|2|-|8|]|.|*| |,| @49
+@6|"+0#0000e05&|\| |a| |c|o|m@1|e|n|t| +0#0000000&@56
+@6|\+0#e000e06&| +0#0000000&|t|e|s|t|N|e|x|t|9| |,| |@|t|e|s|t|C|l|u|s|t|e|r| |s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&@32
+@6|"+0#0000e05&|\| |K|E|Y|W|O|R|D|S| |L|I|S|T| +0#0000000&@52
@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|4| @58
@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|5| @58
-@6>\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|6| @58
-@57|7|5|,|7| @9|B|o|t|
+@6|\+0#e000e06&| +0#0000000&|k|e|y|w|o|r|d|6| @58
+> @74
+@57|1|6|4|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/vim_variables_00.dump b/runtime/syntax/testdir/dumps/vim_variables_00.dump
index 9794113..da77064 100644
--- a/runtime/syntax/testdir/dumps/vim_variables_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_variables_00.dump
@@ -17,4 +17,4 @@
|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|/+0#af5f00255&|=| +0#0000000&|e|x|p|r| @59
|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|%+0#af5f00255&|=| +0#0000000&|e|x|p|r| @59
|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|.+0#af5f00255&|=| +0#0000000&|e|x|p|r| @59
-|"|i|n|p|u|t|/|v|i|m|_|v|a|r|i|a|b|l|e|s|.|v|i|m|"| |1|3|8|L|,| |1|5@1|4|B| @19|1|,|1| @10|T|o|p|
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_variables_01.dump b/runtime/syntax/testdir/dumps/vim_variables_01.dump
index f1ce29d..02f6819 100644
--- a/runtime/syntax/testdir/dumps/vim_variables_01.dump
+++ b/runtime/syntax/testdir/dumps/vim_variables_01.dump
@@ -14,7 +14,7 @@
@75
|l+0#af5f00255&|e|t| +0#0000000&|&+0#00e0e07&|f|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|e|x|p|r| @59
@75
-|l+0#af5f00255&|e|t| +0#0000000&|&+0#00e0e07&|t|_|k|1| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|E+0#e000002&|s|c|>|[|2|3|4|;|"| +0#0000000&@49
+|l+0#af5f00255&|e|t| +0#0000000&|&+0#00e0e07&|t|_|k|1| +0#0000000&|=+0#af5f00255&| +0#0000000&|"+0#e000002&|\+0#e000e06&|<|E|s|c|>|[+0#e000002&|2|3|4|;|"| +0#0000000&@49
@75
|l+0#af5f00255&|e|t| +0#0000000&|&+0#00e0e07&|f|o@1| +0#0000000&|.+0#af5f00255&|=| +0#0000000&|e|x|p|r| @58
@57|1|9|,|1| @9|1|0|%|
diff --git a/runtime/syntax/testdir/ftplugin/java.vim b/runtime/syntax/testdir/ftplugin/java.vim
new file mode 100644
index 0000000..da198e1
--- /dev/null
+++ b/runtime/syntax/testdir/ftplugin/java.vim
@@ -0,0 +1,5 @@
+" The Java source file uses long lines with tabs
+" so use a smaller tabstop value, so that no
+" soft-wrapping occurs (which may cause the syntax
+" tests to miss some lines during scrolling)
+setl ts=4
diff --git a/runtime/syntax/testdir/input/c.c b/runtime/syntax/testdir/input/c.c
index c96fb33..595721b 100644
--- a/runtime/syntax/testdir/input/c.c
+++ b/runtime/syntax/testdir/input/c.c
@@ -1,4 +1,5 @@
/* vi:set ts=8 sts=4 sw=4 noet:
+ * VIM_TEST_SETUP let g:c_comment_strings = 1
*
* VIM - Vi IMproved by Bram Moolenaar
*
diff --git a/runtime/syntax/testdir/input/java_comments.java b/runtime/syntax/testdir/input/java_comments.java
new file mode 100644
index 0000000..be347d7
--- /dev/null
+++ b/runtime/syntax/testdir/input/java_comments.java
@@ -0,0 +1,25 @@
+// VIM_TEST_SETUP unlet! g:java_ignore_javadoc g:java_no_trail_space_error
+// VIM_TEST_SETUP unlet! g:java_no_tab_space_error
+// VIM_TEST_SETUP let [g:java_space_errors,g:java_comment_strings] = [1,1]
+// VIM_TEST_SETUP setlocal spell
+class CommentsTests
+{ /* TRAILING BLANKS AND MESSPILLINGS ARE SIGNIFICANT! */
+ /**
+ * The method {@code main} must be declared {@code public}, {@code
+ * static}, and {@code void}. It must specify a formal parameter
+ * whose declared type is array of {@link String}. Therefore,
+ * either of the following declarations is acceptable:
+ * {@snippet lang="java":
+ * // @highlight substring="main" type="italic":
+ * public static void main(String[] args) { }
+ * }<br /><pre class="snippet">
+ *{@code public static void main(String... args) { }}</pre>
+ *
+ * @param args optional commande-line arguments
+ * @jls 12.1.4 Invoke {@code Test.main}
+ */
+ // @start region = main
+ // @link substring = 'String' target = 'java.lang.String' :
+ public static void main(String[] args) { }
+ // @end
+}
diff --git a/runtime/syntax/testdir/input/java_escapes.java b/runtime/syntax/testdir/input/java_escapes.java
new file mode 100644
index 0000000..eadaa42
--- /dev/null
+++ b/runtime/syntax/testdir/input/java_escapes.java
@@ -0,0 +1,123 @@
+class EscapesTests
+{ // javap -constants EscapesTests.class
+ // static final String hello = "hello";
+ \u0073\u0074\u0061\u0074\u0069\u0063
+ \u0066\u0069\u006e\u0061\u006c
+ \u0053\u0074\u0072\u0069\u006e\u0067
+ \u0068\u0065\u006c\u006c\u006f
+ \u003d
+ \u0022\u0068\u0065\u006c\u006c\u006f\u0022
+ \u003b
+
+ static {
+ char ee[] = {
+ '\b', '\s', '\t',
+ '\n', '\f', '\r',
+ '\"', '\'', '\\',
+ };
+
+ System.out.println(new String[] {
+ "\b", "\s", "\t",
+ "\n", "\f", "\r",
+ "\"", "\'", "\\",
+ });
+
+ char oo[] = {
+ '\0', '\1', '\2', '\3', '\4', '\5', '\6', '\7',
+
+ '\00', '\01', '\02', '\03', '\04', '\05', '\06', '\07',
+
+ '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+
+ '\10', '\11', '\12', '\13', '\14', '\15', '\16', '\17',
+ '\20', '\21', '\22', '\23', '\24', '\25', '\26', '\27',
+ '\30', '\31', '\32', '\33', '\34', '\35', '\36', '\37',
+ '\40', '\41', '\42', '\43', '\44', '\45', '\46', '\47',
+ '\50', '\51', '\52', '\53', '\54', '\55', '\56', '\57',
+ '\60', '\61', '\62', '\63', '\64', '\65', '\66', '\67',
+ '\70', '\71', '\72', '\73', '\74', '\75', '\76', '\77',
+
+ '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+ '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+ '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+ '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+ '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+ '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+ '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+
+ '\100', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
+ '\110', '\111', '\112', '\113', '\114', '\115', '\116', '\117',
+ '\120', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
+ '\130', '\131', '\132', '\133', '\134', '\135', '\136', '\137',
+ '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+ '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+ '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+ '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+ '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+ '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+ '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+ '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+ '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+ '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+ '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+ '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+ '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
+ '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
+ '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
+ '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
+ '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+ '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+ '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+ '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+ };
+
+ System.out.println(new String[] {
+ "\0", "\1", "\2", "\3", "\4", "\5", "\6", "\7",
+
+ "\00", "\01", "\02", "\03", "\04", "\05", "\06", "\07",
+
+ "\000", "\001", "\002", "\003", "\004", "\005", "\006", "\007",
+
+ "\10", "\11", "\12", "\13", "\14", "\15", "\16", "\17",
+ "\20", "\21", "\22", "\23", "\24", "\25", "\26", "\27",
+ "\30", "\31", "\32", "\33", "\34", "\35", "\36", "\37",
+ "\40", "\41", "\42", "\43", "\44", "\45", "\46", "\47",
+ "\50", "\51", "\52", "\53", "\54", "\55", "\56", "\57",
+ "\60", "\61", "\62", "\63", "\64", "\65", "\66", "\67",
+ "\70", "\71", "\72", "\73", "\74", "\75", "\76", "\77",
+
+ "\010", "\011", "\012", "\013", "\014", "\015", "\016", "\017",
+ "\020", "\021", "\022", "\023", "\024", "\025", "\026", "\027",
+ "\030", "\031", "\032", "\033", "\034", "\035", "\036", "\037",
+ "\040", "\041", "\042", "\043", "\044", "\045", "\046", "\047",
+ "\050", "\051", "\052", "\053", "\054", "\055", "\056", "\057",
+ "\060", "\061", "\062", "\063", "\064", "\065", "\066", "\067",
+ "\070", "\071", "\072", "\073", "\074", "\075", "\076", "\077",
+
+ "\100", "\101", "\102", "\103", "\104", "\105", "\106", "\107",
+ "\110", "\111", "\112", "\113", "\114", "\115", "\116", "\117",
+ "\120", "\121", "\122", "\123", "\124", "\125", "\126", "\127",
+ "\130", "\131", "\132", "\133", "\134", "\135", "\136", "\137",
+ "\140", "\141", "\142", "\143", "\144", "\145", "\146", "\147",
+ "\150", "\151", "\152", "\153", "\154", "\155", "\156", "\157",
+ "\160", "\161", "\162", "\163", "\164", "\165", "\166", "\167",
+ "\170", "\171", "\172", "\173", "\174", "\175", "\176", "\177",
+ "\200", "\201", "\202", "\203", "\204", "\205", "\206", "\207",
+ "\210", "\211", "\212", "\213", "\214", "\215", "\216", "\217",
+ "\220", "\221", "\222", "\223", "\224", "\225", "\226", "\227",
+ "\230", "\231", "\232", "\233", "\234", "\235", "\236", "\237",
+ "\240", "\241", "\242", "\243", "\244", "\245", "\246", "\247",
+ "\250", "\251", "\252", "\253", "\254", "\255", "\256", "\257",
+ "\260", "\261", "\262", "\263", "\264", "\265", "\266", "\267",
+ "\270", "\271", "\272", "\273", "\274", "\275", "\276", "\277",
+ "\300", "\301", "\302", "\303", "\304", "\305", "\306", "\307",
+ "\310", "\311", "\312", "\313", "\314", "\315", "\316", "\317",
+ "\320", "\321", "\322", "\323", "\324", "\325", "\326", "\327",
+ "\330", "\331", "\332", "\333", "\334", "\335", "\336", "\337",
+ "\340", "\341", "\342", "\343", "\344", "\345", "\346", "\347",
+ "\350", "\351", "\352", "\353", "\354", "\355", "\356", "\357",
+ "\360", "\361", "\362", "\363", "\364", "\365", "\366", "\367",
+ "\370", "\371", "\372", "\373", "\374", "\375", "\376", "\377",
+ });
+ }
+}
diff --git a/runtime/syntax/testdir/input/java_numbers.java b/runtime/syntax/testdir/input/java_numbers.java
new file mode 100644
index 0000000..e926534
--- /dev/null
+++ b/runtime/syntax/testdir/input/java_numbers.java
@@ -0,0 +1,88 @@
+class NumbersTests
+{
+ static {
+ double[] dd = {
+ 0x.0p0, 0x0.p0, 0x0.0p0, 0x0P0,
+ 0x.0p0d, 0x0.p0d, 0x0.0p0d, 0x0P0D,
+ 0x.0p0f, 0x0.p0f, 0x0.0p0f, 0x0P0F,
+ 0x.0p0, 0x0.p0, 0x0.0p0, 0x0P0,
+ 0x.0p0d, 0x0.p0d, 0x0.0p0d, 0x0P0D,
+ 0x.0p0f, 0x0.p0f, 0x0.0p0f, 0x0P0F,
+ 0x.0p-0, 0x0.p-0, 0x0.0p-0, 0x0P-0,
+ 0x.0p-0d, 0x0.p-0d, 0x0.0p-0d, 0x0P-0D,
+ 0x.0p-0f, 0x0.p-0f, 0x0.0p-0f, 0x0P-0F,
+ 0x.0p+0, 0x0.p+0, 0x0.0p+0, 0x0P+0,
+ 0x.0p+0d, 0x0.p+0d, 0x0.0p+0d, 0x0P+0D,
+ 0x.0p+0f, 0x0.p+0f, 0x0.0p+0f, 0x0P+0F,
+
+ 1., 1.2, 1.2e3, 1.2e3d, 1.2e3f,
+ 1.2e-3, 1.2e-3d, 1.2E-3F,
+ 1.2e+3, 1.2E+3D, 1.2e+3f,
+ .2, .2e3, .2e3d, .2e3f,
+ .2e-3, .2e-3d, .2E-3F,
+ .2e+3, .2E+3D, .2e+3f,
+ 1e3, 1e3d, 1e3f,
+ 1e-3, 1e-3d, 1E-3F,
+ 1e+3, 1E+3D, 1e+3f,
+ 1d, 1D, 1f, 1F,
+
+//// MALFORMED: :let g:java_comment_strings = 1 | doautocmd Syntax
+// 0_x.0p0, 0x._0p0, 0x.0_p0, 0x.0p_0, 0x.0p0_,
+// 0x0_.0p0, 0x_0.0p0, 0xp0,
+ };
+
+ int O = 0;
+ int OO = 00;
+ int OxO = 0x0;
+
+ int x = 0x12_345_678;
+ int y = 0b01_01_01_01_01;
+ int z = 0__1__2__3__4__5__6__7;
+
+ // String.format("%a", -1.0)
+ double minus_one_d = -0x1.0p0;
+
+ double z_d = -0x.0p0;
+ double y_d = 0xap1__0__0;
+ double x_d = .0__1__2__3__4__5__6__7__8__9;
+ double dot_O = .0;
+
+ // JLS, §3.10.2:
+ float max_dec_f = 3.4028235e38f;
+ float max_hex_f = 0x1.fffffeP+127f;
+ float min_dec_f = 1.4e-45f;
+ float min_hex_f_a = 0x0.000002P-126f;
+ float min_hex_f_b = 0x1.0P-149f;
+
+ double max_dec_d = 1.7976931348623157e3__0__8;
+ double max_hex_d = 0x1.f_ffff_ffff_ffffP+1023;
+ double min_dec_d = 4.9e-3__2__4;
+ double min_hex_d_a = 0x0.0_0000_0000_0001P-1022;
+ double min_hex_d_b = 0x1.0P-1074;
+
+ // JLS, §3.10.1:
+ int max_hex = 0x7fff_ffff;
+ int max_oct = 0177_7777_7777;
+ int max_bin = 0b0111_1111_1111_1111_1111_1111_1111_1111;
+
+ int min_hex = 0x8000_0000;
+ int min_oct = 0200_0000_0000;
+ int min_bin = 0b1000_0000_0000_0000_0000_0000_0000_0000;
+
+ int minus_one_hex = 0xffff_ffff;
+ int minus_one_oct = 0377_7777_7777;
+ int minus_one_bin = 0b1111_1111_1111_1111_1111_1111_1111_1111;
+
+ long max_hex_l = 0x7fff_ffff_ffff_ffffL;
+ long max_oct_l = 07_7777_7777_7777_7777_7777L;
+ long max_bin_l = 0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;
+
+ long min_hex_l = 0x8000_0000_0000_0000L;
+ long min_oct_l = 010_0000_0000_0000_0000_0000L;
+ long min_bin_l = 0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000L;
+
+ long minus_one_hex_l = 0xffff_ffff_ffff_ffffL;
+ long minus_one_oct_l = 017_7777_7777_7777_7777_7777L;
+ long minus_one_bin_l = 0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;
+ }
+}
diff --git a/runtime/syntax/testdir/input/java_string.java b/runtime/syntax/testdir/input/java_string.java
new file mode 100644
index 0000000..43a7a05
--- /dev/null
+++ b/runtime/syntax/testdir/input/java_string.java
@@ -0,0 +1,104 @@
+class StringTests // JDK 21+ (--enable-preview --release 21).
+{
+ static {
+ String s1 = "A quick brown fox jumps over the lazy dog";
+ String s2 = "\"Woof\s!\"";
+ String s3 = """
+ A\s\
+ quick \
+ brown\s\
+ fox \
+ jumps\s\
+ over \
+ the\s\
+ lazy \
+ dog""";
+ String s4 = """
+ "Woof\s!\"""";
+ String s5 = """
+ String s3 = \"""
+ A\\s\\
+ quick \\
+ brown\\s\\
+ fox \\
+ jumps\\s\\
+ over \\
+ the\\s\\
+ lazy \\
+ dog\""";""";
+
+ // There are SPACE, FF, HT, CR, and LF after """.
+ String empty = """
+ """;
+
+ System.out.println("""
+ "
+ ""
+ ""\u005c"
+ ""\u005c""
+ ""\"\u0022\u0022
+ ""\"""\u005c\u0022
+ ""\"""\""
+ ""\"""\""\"""");
+
+ System.out.println(STR."""
+ "
+ \{"\"\""}
+ \{"\"\""}\{"\u005c\u0022"}
+ \{"\"\""}\{"\u005c\u0022"}"
+ \{"\"\""}\"\{"\u005c\u0022\u005c\u0022"}
+ \{"\"\""}\"\{"\"\""}\{"\u005c\u0022"}
+ \{"\"\""}\"\{"\"\""}\""
+ \{"\"\""}\"\{"\"\""}\""\""""); // JDK 21+.
+
+ String woof = "Woof", dog = "dog", fox = "fox";
+
+ String s6 = STR
+ ."A quick brown \{fox} jumps over the lazy \{dog}";
+ String s7 = STR.process(StringTemplate.RAW
+ ."\"\{woof}\s!\"");
+ String s8 = STR."""
+ A\s\
+ quick \
+ brown\s\
+ \{fox} \
+ jumps\s\
+ over \
+ the\s\
+ lazy \
+ \{dog}""";
+ String s9 = STR.process(StringTemplate.RAW
+ .
+ """
+ "\{woof}\s!\"""");
+ String s10 = java.util.FormatProcessor.FMT
+ . "%-14s\{"A\s" + STR . "quick" + "brown"}%s\{fox} "
+ + java.util.FormatProcessor.FMT
+ . "%-20s\{"jumps\sover the\s"
+ + STR . "lazy"}%s\{dog}";
+ String s11 = STR."""
+ \"\{ // A nested comment.
+ (new java.util.function.Function<String, String>() {
+ public String apply(String bay) { return bay; };
+ }).apply(woof)
+ }\s!\"""";
+ String s12 = java.util.FormatProcessor.FMT
+ ."""
+ %-14s\{STR."""
+ A\s\
+ \{ "quick" } \
+ brown"""}\
+ %s\{ fox } \
+ %-20s\{STR."""
+ jumps\s\
+ over \
+ the\s\
+ \{ "lazy" } """}\
+ %s\{ dog }""";
+ String s13 = STR
+ ."\"\{ /* A nested comment. */
+ ((java.util.function.Function<String, String>) bay -> bay)
+ .apply(woof)
+ }\s!\"";
+ }
+}
diff --git a/runtime/syntax/testdir/input/java_switch.java b/runtime/syntax/testdir/input/java_switch.java
new file mode 100644
index 0000000..14b2e11
--- /dev/null
+++ b/runtime/syntax/testdir/input/java_switch.java
@@ -0,0 +1,122 @@
+class SwitchTests // JDK 21+.
+{
+ static void echo(Object o) { System.out.println(o); }
+
+ static {
+ interface Yieldable<T>
+ {
+ T yield();
+ default Yieldable<T> default_() { return this; }
+ default Yieldable<T> when() { return this; }
+ }
+
+ // There are 80 bytes (\@80<!) between "::" and "yield;".
+ Yieldable<?> y = ((Yieldable<?>) () -> 0)::
+ yield;
+ ((Yieldable<?>) () -> 0).when().default_().yield();
+
+ enum Letters { OTHER, ALPHA, BETA }
+
+ Letters when = Letters.OTHER;
+
+ switch (when) {
+ case ALPHA: { echo(Letters.ALPHA); break; }
+ case BETA: { echo(Letters.BETA); break; }
+ default: { echo(Letters.OTHER); }
+ }
+
+ echo(switch (when) {
+ case ALPHA -> Letters.ALPHA;
+ case BETA -> Letters.BETA;
+ default -> { yield(Letters.OTHER); }
+ });
+
+ String yield = null;
+
+ switch (yield) {
+ case "A": case "B": { echo("A or B"); break; }
+ case ":": { echo("Colon"); break; }
+ case String str when !str.equals(""):
+ { echo("<non-empty>"); break; }
+ case null: default: { echo("Other"); }
+ }
+
+ echo(switch (yield) {
+ case "A", "B" -> { yield("A or B"); }
+ case "->" -> "Arrow";
+ case String str when !str.equals("")
+ -> "<non-empty>";
+ case null, default -> "Other";
+ });
+
+ Object o = new Object();
+
+ switch (o) {
+ case null: { echo("null"); break; }
+ case Letters[] ll: { echo("SwitchTests$1Letters[]"); break; }
+ default: { echo("java.lang.Object"); break; }
+ };
+
+ echo(switch (o) {
+ case null -> "null";
+ case Letters[] ll -> "SwitchTests$1Letters[]";
+ default -> "java.lang.Object";
+ });
+
+ char ch = 'c';
+
+ switch (ch) {
+ case 'a': { echo('a'); break; }
+ case 'b': { echo('b'); break; }
+ default: { echo('\u0000'); break; }
+ };
+
+ echo(switch (ch) {
+ case 'a' -> 'a';
+ case 'b' -> 'b';
+ default -> '\u0000';
+ });
+
+ byte b = (byte) 2;
+
+ switch (b) {
+ case ((byte) 0): { echo((byte) 0); break; }
+ case ((byte) 1): { echo((byte) 1); break; }
+ default: { echo((byte) -1); break; }
+ };
+
+ echo(switch (b) {
+ case ((byte) 0) -> (byte) 0;
+ case ((byte) 1) -> (byte) 1;
+ default -> (byte) -1;
+ });
+
+ short sh = (short) 2;
+
+ switch (sh) {
+ case ((short) 0): { echo((short) 0); break; }
+ case ((short) 1): { echo((short) 1); break; }
+ default: { echo((short) -1); break; }
+ };
+
+ echo(switch (sh) {
+ case ((short) 0) -> (short) 0;
+ case ((short) 1) -> (short) 1;
+ default -> (short) -1;
+ });
+
+ int i = 2;
+
+ switch (i) {
+ case 0b0__00___000: { echo(0); break; }
+ case 0x000___00__1: { echo(1); break; }
+ default: { echo(-1); break; }
+ };
+
+ echo(switch (i) {
+ case 0_0_0_0_0 -> 0;
+ case 1 -> 1;
+ default -> -1;
+ });
+ }
+}
diff --git a/runtime/syntax/testdir/input/markdown_conceal.markdown b/runtime/syntax/testdir/input/markdown_conceal.markdown
new file mode 100644
index 0000000..8049d68
--- /dev/null
+++ b/runtime/syntax/testdir/input/markdown_conceal.markdown
@@ -0,0 +1,15 @@
+_Italic_, *Italic*. __Bold__, **Bold**.
+___Bold Italic___, ***Bold Italic***.
+~~Strikethrough~~, S̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h̶.
+
+~~~html
+<p>
+<del>Strikethrough</del>, <s>Strikethrough</s>.<br />
+~~~
+
+```html
+<strong><em>Bold Italic</em></strong>.
+<strong><em>Bold Italic</em></strong>.<br />
+<strong>Bold</strong>, <strong>Bold</strong>.
+<em>Italic</em>, <em>Italic</em>.
+```
diff --git a/runtime/syntax/testdir/input/setup/markdown_conceal.vim b/runtime/syntax/testdir/input/setup/markdown_conceal.vim
new file mode 100644
index 0000000..a1585b1
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/markdown_conceal.vim
@@ -0,0 +1,8 @@
+if has('conceal')
+ let g:markdown_syntax_conceal = 1
+ setlocal conceallevel=3 concealcursor=n
+endif
+
+let g:markdown_fenced_languages = ['html']
+highlight link markdownBold Todo
+highlight link htmlBold Todo
diff --git a/runtime/syntax/testdir/input/sh_10.sh b/runtime/syntax/testdir/input/sh_10.sh
new file mode 100644
index 0000000..be463c3
--- /dev/null
+++ b/runtime/syntax/testdir/input/sh_10.sh
@@ -0,0 +1,49 @@
+#!/bin/ksh
+
+# This script is a test file for ksh93 shared-state
+# command substitutions (subshares) and mksh value
+# substitutions (valsubs).
+
+# ======
+# Below is subshare syntax supported by both ksh93 and mksh.
+print ${ echo one }
+print ${ echo two
+}
+print ${
+echo three }
+print ${ echo 'four'; }
+print ${ echo 'five' ;}
+print ${ echo 'six'
+}
+print ${ echo 'seven' }
+echo ${ print 'eight' }
+typeset nine=${ pwd; }
+
+# ======
+# Value substitutions of the form ${|command} are only
+# supported by mksh, not ksh93.
+if ! command eval '((.sh.version >= 20070703))' 2>/dev/null; then
+ valsubfunc() {
+ REPLY=$1
+ }
+ echo ${|valsubfunc ten}
+ print "${|valsubfunc eleven;}"
+ printf '%s' "${|valsubfunc twelve }"
+ unlucky=${|valsubfunc thirteen
+}
+ typeset notafloat=${|valsubfunc notanumber }
+ print $unlucky $notanumber
+ ${|echo foo}
+ ${|echo bar
+}
+fi
+
+# ======
+# Shared-state command substitutions using the syntax ${<file;}
+# are only supported by ksh93, not mksh.
+echo ${
+ printf %s str
+} > /tmp/strfile
+echo ${</tmp/strfile;}
+
+exit 0
diff --git a/runtime/syntax/testdir/input/sh_11.sh b/runtime/syntax/testdir/input/sh_11.sh
new file mode 100644
index 0000000..6e192fc
--- /dev/null
+++ b/runtime/syntax/testdir/input/sh_11.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# Issue #962
+
+arr=(
+ 1 2 3 4
+) # ok
+
+if true; then
+
+ arr=(1 2 3 4) # ok
+
+ arr=( 1 2 3 4 ) # ok
+
+ arr=(
+ 1 2 3 4
+ ) # paren error!
+
+fi
+
diff --git a/runtime/syntax/testdir/input/vim_ex_abbreviate.vim b/runtime/syntax/testdir/input/vim_ex_abbreviate.vim
new file mode 100644
index 0000000..7360e38
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_abbreviate.vim
@@ -0,0 +1,25 @@
+" Vim :abbreviate commands
+
+abbrev <buffer> foo foobar
+cabbrev <buffer> cfoo cfoobar
+iabbrev <buffer> ifoo cfoobar
+
+abbrev <expr> <buffer> foo foobar
+cabbrev <expr> <buffer> cfoo cfoobar
+iabbrev <expr> <buffer> ifoo cfoobar
+
+noreabbrev <buffer> foo foobar
+cnoreabbrev <buffer> cfoo cfoobar
+inoreabbrev <buffer> ifoo cfoobar
+
+abbrev <expr> <buffer> foo foobar
+cabbrev <expr> <buffer> cfoo cfoobar
+iabbrev <expr> <buffer> ifoo cfoobar
+
+unabbrev <buffer> foo
+cunabbrev <buffer> cfoo
+iunabbrev <buffer> ifoo
+
+abclear <buffer>
+cabclear <buffer>
+iabclear <buffer>
diff --git a/runtime/syntax/testdir/input/vim_ex_augroup.vim b/runtime/syntax/testdir/input/vim_ex_augroup.vim
new file mode 100644
index 0000000..2dae59d
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_augroup.vim
@@ -0,0 +1,19 @@
+" Vim :augroup command
+
+augroup foo
+ autocmd BufRead * echomsg "Foo"
+augroup END
+
+augroup foo | autocmd! | augroup END
+augroup! foo
+
+augroup !@#$%^&*()_+
+ autocmd BufRead * echomsg "Foo"
+augroup END
+
+augroup !@#$%^&*()_+ | autocmd! | augroup END
+augroup! !@#$%^&*()_+
+
+" list groups
+augroup
+
diff --git a/runtime/syntax/testdir/input/vim_ex_behave.vim b/runtime/syntax/testdir/input/vim_ex_behave.vim
new file mode 100644
index 0000000..a1e99f0
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_behave.vim
@@ -0,0 +1,7 @@
+" Vim behave command
+
+behave mswin
+behave xterm
+
+behave! mswin
+behave! xterm
diff --git a/runtime/syntax/testdir/input/vim_ex_command.vim b/runtime/syntax/testdir/input/vim_ex_command.vim
new file mode 100644
index 0000000..9e98296
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_command.vim
@@ -0,0 +1,5 @@
+" Vim :command command
+
+" Issue #14135
+
+com Foo call system('ls')
diff --git a/runtime/syntax/testdir/input/vim_ex_commands.vim b/runtime/syntax/testdir/input/vim_ex_commands.vim
index 6826967..571fd7b 100644
--- a/runtime/syntax/testdir/input/vim_ex_commands.vim
+++ b/runtime/syntax/testdir/input/vim_ex_commands.vim
@@ -13,6 +13,8 @@
: help
: help
+:2match
+:3match
:append
text
.
@@ -603,6 +605,8 @@ call Foo() | help
call Foo() |help
call Foo()| help
+call Foo() | 2match
+call Foo() | 3match
" FIXME
call Foo() | append
text
diff --git a/runtime/syntax/testdir/input/vim_ex_def.vim b/runtime/syntax/testdir/input/vim_ex_def.vim
new file mode 100644
index 0000000..dd4ecd1
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_def.vim
@@ -0,0 +1,125 @@
+" Vim :def command
+
+
+" list
+
+def
+def Foo
+def /Foo.*
+
+def | echo "Foo"
+def " comment
+def Foo | echo "Foo"
+def Foo " comment
+
+
+" definition
+
+" empty definition
+def Foo()
+enddef
+
+# curly-brace names
+def {"F"}oo()
+enddef
+
+def F{"o"}o()
+enddef
+
+def Fo{"o"}()
+enddef
+
+def {"F"}o{"o"}()
+enddef
+
+def {"F"}{"o"}{"o"}()
+enddef
+
+def Foo(): number
+ return 42
+enddef
+
+# trailing whitespace
+def Foo(): number
+ return 42
+enddef
+
+def Foo() # comment
+enddef
+
+def Foo(): number # comment
+ return 42
+enddef
+
+def! Foo(): number
+ return 42
+enddef
+
+def g:Foo(): number
+ return 42
+enddef
+
+def s:Foo(): number
+ return 42
+enddef
+
+def <SID>Foo(): number
+ return 42
+enddef
+
+def foo#bar#Foo(): number
+ return 42
+enddef
+
+" same name as an Ex command
+def s:ls()
+enddef
+
+
+" return types
+
+def Foo(): void
+enddef
+
+def Foo(): void # comment
+enddef
+
+def Foo(): list<dict<number>>
+enddef
+
+def Foo(): func(dict<list<number>>, func, bool, func(number, list<number>)): bool
+enddef
+
+
+" :enddef trailing
+
+def Foo()
+ # trailing whitespace
+enddef
+
+def Foo()
+enddef | echo "Foo"
+
+def Foo()
+enddef " comment
+
+
+" parameters
+
+def Foo(x: bool, y = 42, z: string = "zed")
+enddef
+
+def Foo(
+ x: bool,
+ y = 42,
+ z: string = "zed")
+enddef
+
+
+" comments
+
+def Foo()
+ # Vim9-script comment
+ "useless string"
+enddef
+
diff --git a/runtime/syntax/testdir/input/vim_ex_def_fold.vim b/runtime/syntax/testdir/input/vim_ex_def_fold.vim
new file mode 100644
index 0000000..7ab3e3f
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_def_fold.vim
@@ -0,0 +1,126 @@
+" Vim :def command
+" VIM_TEST_SETUP let g:vimsyn_folding = "f" | set fdm=syntax
+
+
+" list
+
+def
+def Foo
+def /Foo.*
+
+def | echo "Foo"
+def " comment
+def Foo | echo "Foo"
+def Foo " comment
+
+
+" definition
+
+" empty definition
+def Foo()
+enddef
+
+# curly-brace names
+def {"F"}oo()
+enddef
+
+def F{"o"}o()
+enddef
+
+def Fo{"o"}()
+enddef
+
+def {"F"}o{"o"}()
+enddef
+
+def {"F"}{"o"}{"o"}()
+enddef
+
+def Foo(): number
+ return 42
+enddef
+
+# trailing whitespace
+def Foo(): number
+ return 42
+enddef
+
+def Foo() # comment
+enddef
+
+def Foo(): number # comment
+ return 42
+enddef
+
+def! Foo(): number
+ return 42
+enddef
+
+def g:Foo(): number
+ return 42
+enddef
+
+def s:Foo(): number
+ return 42
+enddef
+
+def <SID>Foo(): number
+ return 42
+enddef
+
+def foo#bar#Foo(): number
+ return 42
+enddef
+
+" same name as an Ex command
+def s:ls()
+enddef
+
+
+" return types
+
+def Foo(): void
+enddef
+
+def Foo(): void # comment
+enddef
+
+def Foo(): list<dict<number>>
+enddef
+
+def Foo(): func(dict<list<number>>, func, bool, func(number, list<number>)): bool
+enddef
+
+
+" :enddef trailing
+
+def Foo()
+ # trailing whitespace
+enddef
+
+def Foo()
+enddef | echo "Foo"
+
+def Foo()
+enddef " comment
+
+
+" parameters
+
+def Foo(x: bool, y = 42, z: string = "zed")
+enddef
+
+def Foo(
+ x: bool,
+ y = 42,
+ z: string = "zed")
+enddef
+
+
+" comments
+
+def Foo()
+ # Vim9-script comment
+ "useless string"
+enddef
+
diff --git a/runtime/syntax/testdir/input/vim_ex_echo.vim b/runtime/syntax/testdir/input/vim_ex_echo.vim
new file mode 100644
index 0000000..df2bf5c
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_echo.vim
@@ -0,0 +1,38 @@
+" Vim :echo commands
+
+echo "Answer = " 42
+echon "Answer = " 42
+echomsg "Answer = " 42
+echowindow "Answer = " 42
+echoerr "Answer = " 42
+echoconsole "Answer = " 42
+
+echo "following command is :|" | |
+
+echohl WarningMsg | echo "Don't panic!" | echohl None
+
+echo "Answer = "
+ "\ comment
+ \ 42
+
+echo
+ \ "Answer = "
+ "\ comment
+ \ 42
+
+" :echo without {expr}
+echo| echo "Foo"
+
+" trailing comment needs |
+echo "foo" | " comment
+
+
+" Issue #9987 (parenthesised argument - not a function call)
+
+let foo = {'end': 123}
+
+if 123
+ echo (foo.end)
+else
+ echo 'bar'
+endif
diff --git a/runtime/syntax/testdir/input/vim_ex_execute.vim b/runtime/syntax/testdir/input/vim_ex_execute.vim
new file mode 100644
index 0000000..2ec507e
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_execute.vim
@@ -0,0 +1,41 @@
+" Vim :execute command
+
+" :help :execute
+
+execute "buffer" nextbuf
+execute "normal" count .. "w"
+execute '!ls' | echo "theend"
+execute "normal ixxx\<Esc>"
+execute "e " .. fnameescape(filename)
+execute "!ls " .. shellescape(filename, 1)
+if 0
+ execute 'while i > 5'
+ echo "test"
+ endwhile
+endif
+execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
+
+" following command is :|"
+execute "call Foo()" | |
+
+execute "call"
+ "\ comment
+ \ "Foo()"
+
+execute
+ \ "call"
+ "\ comment
+ \ "Foo()"
+
+" :execute without {expr}
+execute| echo "Foo"
+
+" trailing comment needs |
+execute "foo" | " comment
+
+
+" Issue #9987 (parenthesised argument - not a function call)
+
+" FIXME: execute is ex command not builtin function
+let foo = {'arg': "call Foo()"}
+execute (foo.arg)
diff --git a/runtime/syntax/testdir/input/vim_ex_function.vim b/runtime/syntax/testdir/input/vim_ex_function.vim
new file mode 100644
index 0000000..38213b4
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_function.vim
@@ -0,0 +1,182 @@
+" Vim :function command
+
+
+" list
+
+function
+function Foo
+function /Foo.*
+
+function | echo "Foo"
+function " comment
+function Foo | echo "Foo"
+function Foo " comment
+
+
+" definition
+
+" empty definition
+function Foo()
+endfunction
+
+" curly-brace names
+function {"F"}oo()
+endfunction
+
+function F{"o"}o()
+endfunction
+
+function Fo{"o"}()
+endfunction
+
+function {"F"}o{"o"}()
+endfunction
+
+function {"F"}{"o"}{"o"}()
+endfunction
+
+function Foo()
+ return 42
+endfunction
+
+" trailing whitespace
+function Foo()
+ return 42
+endfunction
+
+function Foo() " comment
+ return 42
+endfunction
+
+function! Foo()
+ return 42
+endfunction
+
+function g:Foo()
+ return 42
+endfunction
+
+function s:Foo()
+ return 42
+endfunction
+
+function <SID>Foo()
+ return 42
+endfunction
+
+function foo#bar#Foo()
+ return 42
+endfunction
+
+" same name as an Ex command
+function s:ls()
+endfunction
+
+
+" modifiers
+
+function Foo() range
+endfunction
+
+function Foo() range " comment
+endfunction
+
+function Foo() range
+ return 42
+endfunction
+
+function Foo() abort
+ return 42
+endfunction
+
+function Foo() dict
+ return 42
+endfunction
+
+function Foo() closure
+ return 42
+endfunction
+
+function Foo() range abort dict closure
+ return 42
+endfunction
+
+function! Foo() range
+ return 42
+endfunction
+
+function! Foo() abort
+ return 42
+endfunction
+
+function! Foo() dict
+ return 42
+endfunction
+
+function! Foo() closure
+ return 42
+endfunction
+
+function! Foo() range abort dict closure
+ return 42
+endfunction
+
+
+" :endfunction trailing
+
+function Foo()
+ return 42
+ " trailing whitespace
+endfunction
+
+function Foo()
+ return 42
+endfunction | echo "Foo"
+
+function Foo()
+ return 42
+endfunction " comment
+
+
+" parameters
+
+function Foo(x, y, z, ...)
+ return 42
+endfunction
+
+function Foo(
+ \ x,
+ \ y,
+ \ z,
+ \ ...)
+ return 42
+endfunction
+
+function Foo(x, y = 42, z = "zed")
+ return 42
+endfunction
+
+function Foo(
+ \ x,
+ \ y = 42,
+ \ z = "zed")
+ return 42
+endfunction
+
+
+" comments
+
+function Foo()
+ " Legacy-script comment
+ # 42 " comment
+ return 42
+endfunction
+
+
+" delete function
+
+delfunction Foo
+delfunction foo.bar
+delfunction! Foo
+delfunction foo.bar
+
diff --git a/runtime/syntax/testdir/input/vim_ex_function_fold.vim b/runtime/syntax/testdir/input/vim_ex_function_fold.vim
new file mode 100644
index 0000000..f9d9bee
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_function_fold.vim
@@ -0,0 +1,183 @@
+" Vim :function command
+" VIM_TEST_SETUP let g:vimsyn_folding = "f" | set fdm=syntax
+
+
+" list
+
+function
+function Foo
+function /Foo.*
+
+function | echo "Foo"
+function " comment
+function Foo | echo "Foo"
+function Foo " comment
+
+
+" definition
+
+" empty definition
+function Foo()
+endfunction
+
+" curly-brace names
+function {"F"}oo()
+endfunction
+
+function F{"o"}o()
+endfunction
+
+function Fo{"o"}()
+endfunction
+
+function {"F"}o{"o"}()
+endfunction
+
+function {"F"}{"o"}{"o"}()
+endfunction
+
+function Foo()
+ return 42
+endfunction
+
+" trailing whitespace
+function Foo()
+ return 42
+endfunction
+
+function Foo() " comment
+ return 42
+endfunction
+
+function! Foo()
+ return 42
+endfunction
+
+function g:Foo()
+ return 42
+endfunction
+
+function s:Foo()
+ return 42
+endfunction
+
+function <SID>Foo()
+ return 42
+endfunction
+
+function foo#bar#Foo()
+ return 42
+endfunction
+
+" same name as an Ex command
+function s:ls()
+endfunction
+
+
+" modifiers
+
+function Foo() range
+endfunction
+
+function Foo() range " comment
+endfunction
+
+function Foo() range
+ return 42
+endfunction
+
+function Foo() abort
+ return 42
+endfunction
+
+function Foo() dict
+ return 42
+endfunction
+
+function Foo() closure
+ return 42
+endfunction
+
+function Foo() range abort dict closure
+ return 42
+endfunction
+
+function! Foo() range
+ return 42
+endfunction
+
+function! Foo() abort
+ return 42
+endfunction
+
+function! Foo() dict
+ return 42
+endfunction
+
+function! Foo() closure
+ return 42
+endfunction
+
+function! Foo() range abort dict closure
+ return 42
+endfunction
+
+
+" :endfunction trailing
+
+function Foo()
+ return 42
+ " trailing whitespace
+endfunction
+
+function Foo()
+ return 42
+endfunction | echo "Foo"
+
+function Foo()
+ return 42
+endfunction " comment
+
+
+" parameters
+
+function Foo(x, y, z, ...)
+ return 42
+endfunction
+
+function Foo(
+ \ x,
+ \ y,
+ \ z,
+ \ ...)
+ return 42
+endfunction
+
+function Foo(x, y = 42, z = "zed")
+ return 42
+endfunction
+
+function Foo(
+ \ x,
+ \ y = 42,
+ \ z = "zed")
+ return 42
+endfunction
+
+
+" comments
+
+function Foo()
+ " Legacy-script comment
+ # 42 " comment
+ return 42
+endfunction
+
+
+" delete function
+
+delfunction Foo
+delfunction foo.bar
+delfunction! Foo
+delfunction foo.bar
+
diff --git a/runtime/syntax/testdir/input/vim_ex_highlight.vim b/runtime/syntax/testdir/input/vim_ex_highlight.vim
new file mode 100644
index 0000000..e23968a
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_highlight.vim
@@ -0,0 +1,55 @@
+" Vim :highlight command
+
+" list
+highlight
+highlight Comment
+
+" reset
+highlight clear
+
+" disable
+highlight clear Comment
+highlight Comment NONE
+
+" add/modify
+highlight Comment cterm=underline
+highlight default Comment term=bold
+
+" link
+highlight link Foo Comment
+highlight! link Foo Comment
+highlight link Foo NONE
+highlight! link Foo NONE
+
+" default link
+highlight default link Foo Comment
+highlight! default link Foo Comment
+highlight default link Foo NONE
+highlight! default link Foo NONE
+
+
+" line continuation and command separator
+
+hi Comment
+ "\ comment
+ \ term=bold
+ "\ comment
+ \ ctermfg=Cyan
+ \ guifg=#80a0ff
+ \ gui=bold
+
+hi Comment
+ \ term=bold
+ \ ctermfg=Cyan
+ \ guifg=#80a0ff
+ \ gui=bold | echo "Foo"
+
+hi Comment term=bold ctermfg=Cyan guifg=#80a0ff gui=bold | echo "Foo"
+
+hi default link
+ \ Foo
+ \ Comment
+
+hi default link
+ \ Foo
+ \ Comment | echo "Foo"
diff --git a/runtime/syntax/testdir/input/vim_ex_map.vim b/runtime/syntax/testdir/input/vim_ex_map.vim
new file mode 100644
index 0000000..95f4292
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_map.vim
@@ -0,0 +1,87 @@
+" Vim :map commands
+
+map!
+map! lhs rhs
+map
+map lhs rhs
+
+call map(list, 'v:val')
+call map (list, 'v:val')
+
+mapclear <buffer>
+mapclear! <buffer>
+nmapclear <buffer>
+vmapclear <buffer>
+xmapclear <buffer>
+smapclear <buffer>
+omapclear <buffer>
+imapclear <buffer>
+lmapclear <buffer>
+cmapclear <buffer>
+tmapclear <buffer>
+
+
+" :help map-bar
+
+" <Bar> '<' is not in 'cpoptions'
+map _l :!ls <Bar> more^M:echo "rhs"<CR>
+" \| 'b' is not in 'cpoptions'
+map _l :!ls \| more^M:echo "rhs"<CR>
+" ^V| always, in Vim and Vi
+map _l :!ls | more^M:echo "rhs"<CR>
+
+map lhs :search('foo\\|bar')<CR>:echo "rhs"<CR>
+
+
+" multiline RHS
+
+map <leader>baz
+ \ :echo (<bar>
+ \
+ \'bar')<cr>
+ "\ comment
+
+map lhs
+ "\ comment
+ \ echo "foo"
+
+map lhs
+ "\ comment
+ \ echo "foo"
+
+map lhs
+ "\ comment
+ \ echo "foo"
+
+map l hs
+ "\ comment
+ \ echo "foo"
+
+map l hs
+ "\ comment
+ \ echo "foo"
+
+map lhs rhs
+map l h s rhs
+
+map lhs
+ "\ comment (matches as RHS but harmless)
+echo "clear"
+
+
+" Issue #12672
+
+nnoremap <leader>foo :echo call(
+ "\ comment
+ \ {x->x},
+ \ ['foo'])<cr>
+
+nnoremap <leader>bar :echo (
+ \
+ \ 'bar')<cr>
+
+
+" Example:
+" /autoload/netrw.vim
+
+if !hasmapto('<Plug>NetrwOpenFile') |nmap <buffer> <silent> <nowait> % <Plug>NetrwOpenFile|endif
diff --git a/runtime/syntax/testdir/input/vim_ex_menu.vim b/runtime/syntax/testdir/input/vim_ex_menu.vim
new file mode 100644
index 0000000..fb737c2
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_menu.vim
@@ -0,0 +1,87 @@
+" Vim :menu commands
+
+" :help disable menus
+menu disable &File.&Open\.\.\.
+amenu enable *
+amenu disable &Tools.*
+
+
+" :help menu-examples
+nmenu Words.Add\ Var wb"zye:menu! Words.<C-R>z <C-R>z<CR>
+nmenu Words.Remove\ Var wb"zye:unmenu! Words.<C-R>z<CR>
+vmenu Words.Add\ Var "zy:menu! Words.<C-R>z <C-R>z <CR>
+vmenu Words.Remove\ Var "zy:unmenu! Words.<C-R>z<CR>
+imenu Words.Add\ Var <Esc>wb"zye:menu! Words.<C-R>z <C-R>z<CR>a
+imenu Words.Remove\ Var <Esc>wb"zye:unmenu! Words.<C-R>z<CR>a
+
+
+" special keys
+menu <silent> &Foo\ bar :echo "Foobar"<CR>
+menu <special> &Foo\ bar :echo "Foobar"<CR>
+menu <script> &Foo\ bar :echo "Foobar"<CR>
+menu <silent> <special> &Foo\ bar :echo "Foobar"<CR>
+menu <silent> <special> <script> &Foo\ bar :echo "Foobar"<CR>
+
+
+function Foo()
+ menu <silent> &Foo\ bar :echo "Foobar"<CR>
+endfunction
+
+
+" Example: runtime/menu.vim (modified)
+an <silent> 10.330 &File.&Close<Tab>:close :confirm close<CR>
+
+an <silent> 10.330 &File.&Close<Tab>:close
+ \ :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
+ \ confirm enew <Bar>
+ \ else <Bar>
+ \ confirm close <Bar>
+ \ endif<CR>
+
+an <silent> 10.330 &File.&Close<Tab>:close
+ "\ comment
+ \ :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
+ "\ comment
+ \ confirm enew <Bar>
+ "\ comment
+ \ else <Bar>
+ "\ comment
+ \ confirm close <Bar>
+ "\ comment
+ \ endif<CR>
+
+an <silent> 10.330 &File.&Close<Tab>:close :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
+ \ confirm enew <Bar>
+ \ else <Bar>
+ \ confirm close <Bar>
+ \ endif<CR>
+
+an <silent> 10.330 &File.&Close<Tab>:close :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
+ "\ comment
+ \ confirm enew <Bar>
+ "\ comment
+ \ else <Bar>
+ "\ comment
+ \ confirm close <Bar>
+ "\ comment
+ \ endif<CR>
+
+
+" popup menus
+popup &Foo | echo "Foo"
+popup! &Foo | echo "Foo"
+
+
+" Issue #14230
+
+" a menu item name cannot start with '.'
+
+export def HistoryJumpMenu()
+ popup.FilterMenu("Jump history", dir_hist,
+ (res, _) => {
+ HistoryJump(res.text)
+ })
+enddef
+
+popup\.FilterMenu<Tab>Filter()<CR>
+
diff --git a/runtime/syntax/testdir/input/vim_ex_menutranslate.vim b/runtime/syntax/testdir/input/vim_ex_menutranslate.vim
new file mode 100644
index 0000000..5e0289d
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_menutranslate.vim
@@ -0,0 +1,51 @@
+" Vim :menutranslate command
+
+menutranslate clear
+menutranslate clear | echo "Foo"
+menutranslate clear " comment
+
+menutranslate &Foo\ bar &FuBar | echo "Foo"
+
+menutranslate &Foo\ bar &FuBar " comment
+menutranslate \"&Foo"\ bar \"&FuBar
+menutranslate &Foo\ "bar" &FuBar
+
+menutranslate &Foo\ bar
+ \ &Fubar | echo "Foo"
+
+menutranslate
+ \ &Foo\ bar
+ \ &Fubar | echo "Foo"
+
+menutranslate
+ \ &Foo\ bar
+ \ &Fubar| echo "Foo"
+
+menutranslate
+ \ &Foo\ bar
+ \ &Fubar
+ \ | echo "Foo"
+
+menutranslate &Foo\ bar
+ "\ comment
+ \ &Fubar | echo "Foo"
+
+menutranslate
+ "\ comment
+ \ &Foo\ bar
+ "\ comment
+ \ &Fubar | echo "Foo"
+
+menutranslate
+ \ &Foo\ bar
+ "\ comment
+ \ &Fubar| echo "Foo"
+ "\ comment
+
+menutranslate
+ "\ comment
+ \ &Foo\ bar
+ "\ comment
+ \ &Fubar
+ \ | echo "Foo"
+
diff --git a/runtime/syntax/testdir/input/vim_ex_substitute.vim b/runtime/syntax/testdir/input/vim_ex_substitute.vim
new file mode 100644
index 0000000..340d573
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_substitute.vim
@@ -0,0 +1,86 @@
+substitute/foo/bar/&
+substitute/foo/bar/cegiInp#lr
+
+snomagic/foo/bar/&
+snomagic/foo/bar/cegiInp#lr
+
+smagic/foo/bar/&
+smagic/foo/bar/cegiInp#lr
+
+:substitute/foo/bar/&
+:substitute/foo/bar/cegiInp#lr
+
+:snomagic/foo/bar/&
+:snomagic/foo/bar/cegiInp#lr
+
+:smagic/foo/bar/&
+:smagic/foo/bar/cegiInp#lr
+
+call Foo() | substitute/foo/bar/&
+call Foo() | substitute/foo/bar/cegiInp#lr
+
+call Foo() | snomagic/foo/bar/&
+call Foo() | snomagic/foo/bar/cegiInp#lr
+
+call Foo() | smagic/foo/bar/&
+call Foo() | smagic/foo/bar/cegiInp#lr
+
+let foo = str->substitute(str, pat, sub, flags)
+
+function Foo()
+ substitute/foo/bar/
+ let bar = str->substitute(str, pat, sub, flags)
+endfunction
+
+def Foo()
+ substitute/foo/bar/
+ let bar = str->substitute(str, pat, sub, flags)
+enddef
+
+" various delimiters
+
+s!/!//! " comment
+" s"/"//" " comment (works but disallowed)
+s#/#//# " comment
+s$/$//$ " comment
+s%/%//% " comment
+s&/&//& " comment
+s'/'//' " comment
+" FIXME - matches vimUserFunc
+" s(/(//( " comment
+s)/)//) " comment
+s*/*//* " comment
+s+/+//+ " comment
+s,/,//, " comment
+s-/-//- " comment
+s././/. " comment
+s/X/XX/ " comment
+s:/://: " comment
+s;/;//; " comment
+s</<//< " comment
+s=/=//= " comment
+s>/>//> " comment
+s?/?//? " comment
+s@/@//@ " comment
+s[/[//[ " comment
+" s\/\//\ " comment (disallowed)
+s]/]//] " comment
+s^/^//^ " comment
+s_/_//_ " comment
+s`/`//` " comment
+s{/{//{ " comment
+" s|/|//| " comment (disallowed)
+s}/}//} " comment
+s~/~//~ " comment
+
+
+" Issue #13883
+
+str[s]
+str(s)
+
+def Test()
+ str[s]
+ str(s)
+enddef
+
diff --git a/runtime/syntax/testdir/input/vim_ex_syntax.vim b/runtime/syntax/testdir/input/vim_ex_syntax.vim
new file mode 100644
index 0000000..79437ff
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_syntax.vim
@@ -0,0 +1,177 @@
+" Vim :syntax command
+
+syn match testMatch "pattern" contained " tail comment
+" NOTE: comments not currently supported
+syn keyword testKeyword keyword contained " tail comment
+syn region testRegion start="start-pattern" skip="skip-pattern" end="end-pattern" contained " tail comment
+
+" Multiline commands
+
+syn keyword testKeyword
+ "\ OPTIONS
+ "\ conceal option
+ \ conceal
+ "\ cchar option
+ \ cchar=&
+ "\ contained option
+ \ contained
+ "\ containedin option
+ \ containedin=testContainer
+ "\ nextgroup option
+ \ nextgroup=testNext0,@testCluster
+ "\ transparent option
+ \ transparent
+ "\ skipwhite option
+ \ skipwhite
+ "\ skipempty option
+ \ skipempty
+ "\ skipnl option
+ \ skipnl
+ "\ KEYWORDS LIST
+ "\ keyword 1
+ \ keyword1
+ "\ keyword 2
+ \ keyword2
+ "\ keyword 3
+ \ keyword3
+
+syn match testMatch
+ "\ MATCH PATTERN
+ "\ pattern start
+ \ /
+ "\ part 1 description
+ \pat1a .* pat1b
+ "\ part 2 description
+ \pat2a .* pat2b
+ "\ part 3 description
+ \pat3a .* pat3b
+ "\ pattern end
+ \/
+ "\ OPTIONS
+ "\ conceal option
+ \ conceal
+ "\ cchar option
+ \ cchar=&
+ "\ contained option
+ \ contained
+ "\ containedin option
+ \ containedin=testContainer
+ "\ nextgroup option
+ \ nextgroup=testNext0,@testCluster
+ "\ transparent option
+ \ transparent
+ "\ skipwhite option
+ \ skipwhite
+ "\ skipempty option
+ \ skipempty
+ "\ skipnl option
+ \ skipnl
+ "\ contains option
+ \ contains=testContained1,testContained2
+ "\ fold option
+ \ fold
+ "\ display option
+ \ display
+ "\ extend option
+ \ extend
+ "\ excludenl option
+ \ excludenl
+ "\ keepend option
+ \ keepend
+
+syn region testRegion
+ "\ OPTIONS
+ "\ start option
+ \ start="start-pattern"
+ "\ skip option
+ \ skip="skip-pattern"
+ "\ end option
+ \ end="end-pattern"
+ "\ conceal option
+ \ conceal
+ "\ cchar option
+ \ cchar=&
+ "\ contained option
+ \ contained
+ "\ containedin option
+ \ containedin=testContainer
+ "\ nextgroup option
+ \ nextgroup=testNext0,@testCluster
+ "\ transparent option
+ \ transparent
+ "\ skipwhite option
+ \ skipwhite
+ "\ skipempty option
+ \ skipempty
+ "\ skipnl option
+ \ skipnl
+ "\ contains option
+ \ contains=testContained1,testContained2
+ "\ oneline option
+ \ oneline
+ "\ fold option
+ \ fold
+ "\ display option
+ \ display
+ "\ extend option
+ \ extend
+ "\ concealends option
+ \ concealends
+ "\ excludenl option
+ \ excludenl
+ "\ keepend option
+ \ keepend
+
+syn cluster testCluster
+ "\ OPTIONS
+ "\ contains option
+ \ contains=testContained1,testContained2,testContained3
+
+syn cluster testCluster
+ "\ OPTIONS
+ "\ add option
+ \ add=testAdd
+ "\ remove option
+ \ remove=testRemove
+
+
+" multiline group list
+
+syn keyword testNext0 keyword
+syn keyword testNext1 keyword
+syn keyword testNext2 keyword
+syn keyword testNext3 keyword
+syn keyword testNext4 keyword
+syn keyword testNext5 keyword
+syn keyword testNext6 keyword
+syn keyword testNext7 keyword
+syn keyword testNext8 keyword
+syn keyword testNext9 keyword
+
+syn keyword testKeyword
+ "\ nextgroup option
+ \ nextgroup=
+ "\ a comment
+ \ testNext0 , testNext1 ,
+ "\ a comment
+ \ testNext[2-8].* ,
+ "\ a comment
+ \ testNext9 , @testCluster skipwhite
+ "\ KEYWORDS LIST
+ \ keyword4
+ \ keyword5
+ \ keyword6
+
+
+" leaking contained groups
+
+" Example: runtime/syntax/zsh.vim
+" "cluster" should not be highlighted outside of :syntax commands
+
+function! s:ContainedGroup()
+ " ...
+ for cluster in ['markdownHighlight_zsh', 'zsh']
+ " ...
+ endfor
+ " ...
+endfunction
diff --git a/runtime/syntax/testdir/input/vim_expr.vim b/runtime/syntax/testdir/input/vim_expr.vim
new file mode 100644
index 0000000..cf5838c
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_expr.vim
@@ -0,0 +1,71 @@
+" String
+
+echo 'It''s a string'
+echo 'tab: \t, new line: \n, backslash: \\'
+echo "tab: \t, new line: \n, backslash: \\"
+
+" String escape sequences
+
+echo "\316 - \31 - \3 - \x1f - \xf - \X1F - \XF - \u02a4 - \U000002a4 - \b - \e - \f - \n - \r - \t - \\ - \" - \<C-W>"
+echo '\316 \31 \3 \x1f \xf \X1F \XF \u02a4 \U000002a4 \b \e \f \n \r \t \\ \" \<C-W>'
+echo "\3160 - \x1f0 - \X1F0 - \u02a40 - \U000002a40"
+
+echo $"\316 - \31 - \3 - \x1f - \xf - \X1F - \XF - \u02a4 - \U000002a4 - \b - \e - \f - \n - \r - \t - \\ - \" - \<C-W>"
+echo $'\316 \31 \3 \x1f \xf \X1F \XF \u02a4 \U000002a4 \b \e \f \n \r \t \\ \" \<C-W>'
+echo $"\3160 - \x1f0 - \X1F0 - \u02a40 - \U000002a40"
+
+echo "\<C-a>"
+echo "\<*C-a>"
+echo "\<C->>"
+echo "\<*C->>"
+echo "\<C->>>"
+echo "\<*C->>>"
+
+" String interpolation
+
+echo 'Don''t highlight interpolation: {{ {1 + 2} }}'
+echo "Don't highlight interpolation: {{ {1 + 2} }}"
+echo $'Highlight interpolation:\t{{ { string({'foo': 'bar'}) } }}'
+echo $'Highlight interpolation:\t{{ { $'nested: {{ {1 + 2} }}' } }}'
+echo $"Highlight interpolation:\t{{ { string({"foo": "bar"}) } }}"
+echo $"Highlight interpolation:\t{{ { $"nested: {{ {1 + 2} }}" } }}"
+
+" Number
+
+" Hexadecimal
+echo 0xFF
+echo 0XFF
+echo -0xFF
+echo -0XFF
+
+" Decimal
+echo 255
+echo -255
+
+" Octal
+echo 0377
+echo 0o377
+echo 0O377
+echo -0377
+echo -0o377
+echo -0O377
+
+" Binary
+echo 0b11111111
+echo 0B11111111
+echo -0b11111111
+echo -0B11111111
+
+" Float
+123.456
++0.0001
+55.0
+-0.123
+1.234e03
+1.0E-6
+-3.1416e+88
+
+" Blob
+echo 0zFF00ED015DAF
+echo 0zFF00.ED01.5DAF
+echo 0zFF.00.ED.01.5D.AF
diff --git a/runtime/syntax/testdir/input/vim_key_notation.vim b/runtime/syntax/testdir/input/vim_key_notation.vim
new file mode 100644
index 0000000..8bc128a
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_key_notation.vim
@@ -0,0 +1,163 @@
+" Key notation
+
+<Space>
+<Tab>
+<Tab>
+<NL>
+<NewLine>
+<LineFeed>
+<LF>
+<CR>
+<Return>
+<Enter>
+<BS>
+<BackSpace>
+<Esc>
+<CSI>
+<xCSI>
+<Bar>
+<Bslash>
+<Del>
+<Delete>
+<kDel>
+<Up>
+<Down>
+<Left>
+<Right>
+<xUp>
+<xDown>
+<xLeft>
+<xRight>
+<PasteStart>
+<PasteEnd>
+<F1>
+<F2>
+<F3>
+<F4>
+<F5>
+<F6>
+<F7>
+<F8>
+<F9>
+<F10>
+<F11>
+<F12>
+<F13>
+<F14>
+<F15>
+<F16>
+<F17>
+<F18>
+<F19>
+<F20>
+<F21>
+<F22>
+<F23>
+<F24>
+<F25>
+<F26>
+<F27>
+<F28>
+<F29>
+<F30>
+<F31>
+<F32>
+<F33>
+<F34>
+<F35>
+<F36>
+<F37>
+<xF1>
+<xF2>
+<xF3>
+<xF4>
+<Help>
+<Undo>
+<Insert>
+<Ins>
+<kInsert>
+<Home>
+<kHome>
+<xHome>
+<zHome>
+<End>
+<kEnd>
+<xEnd>
+<zEnd>
+<PageUp>
+<PageDown>
+<kPageUp>
+<kPageDown>
+<kPlus>
+<kMinus>
+<kDivide>
+<kMultiply>
+<kEnter>
+<kPoint>
+<k0>
+<k1>
+<k2>
+<k3>
+<k4>
+<k5>
+<k6>
+<k7>
+<k8>
+<k9>
+<lt>
+<Mouse>
+<NetMouse>
+<DecMouse>
+<JsbMouse>
+<PtermMouse>
+<UrxvtMouse>
+<SgrMouse>
+<SgrMouseRelease>
+<LeftMouse>
+<LeftMouseNM>
+<LeftDrag>
+<LeftRelease>
+<LeftReleaseNM>
+<MouseMove>
+<MiddleMouse>
+<MiddleDrag>
+<MiddleRelease>
+<RightMouse>
+<RightDrag>
+<RightRelease>
+<ScrollWheelUp>
+<ScrollWheelDown>
+<ScrollWheelRight>
+<ScrollWheelLeft>
+<MouseDown>
+<MouseUp>
+<X1Mouse>
+<X1Drag>
+<X1Release>
+<X2Mouse>
+<X2Drag>
+<X2Release>
+<Drop>
+<Nul>
+<SNR>
+<Plug>
+<CursorHold>
+<Ignore>
+<Cmd>
+<ScriptCmd>
+<FocusGained>
+<FocusLost>
+
+<cword>
+<cWORD>
+<cexpr>
+<cfile>
+<afile>
+<abuf>
+<amatch>
+<sfile>
+<stack>
+<script>
+<slnum>
+<sflnum>
+<client>
diff --git a/runtime/syntax/testdir/input/vim_line_continuation.vim b/runtime/syntax/testdir/input/vim_line_continuation.vim
new file mode 100644
index 0000000..a32666a
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_line_continuation.vim
@@ -0,0 +1,49 @@
+" Vim line continuations with interspersed comments
+
+function Foo(
+ "\ param a
+ \ a,
+ "\ param b
+ \ b,
+ "\ param c
+ \ c
+ \)
+ echomsg
+ "\ start string
+ \ $"
+ "\ print a
+ \ a = {a:a},
+ "\ print b
+ \ b = {a:b},
+ "\ print c
+ \ c = {a:c}
+ "\ end string
+ \"
+endfunction
+
+call Foo(
+ "\ arg 1
+ \ 11,
+ "\ arg 2
+ \ 22,
+ "\ arg 3
+ \ 33
+ \)
+
+let dict = #{
+ "\ pair 1
+ \ a: 1,
+ "\ pair 2
+ \ b: 2,
+ "\ pair 3
+ \ c: 3
+ \}
+
+let array = [
+ "\ element 1
+ \ 1,
+ "\ element 2
+ \ 2,
+ "\ element 3
+ \ 3
+ \]
diff --git a/runtime/syntax/testdir/input/vim_new.vim b/runtime/syntax/testdir/input/vim_new.vim
new file mode 100644
index 0000000..985cfd3
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_new.vim
@@ -0,0 +1,17 @@
+vim9script
+
+# Vim :new command and class constructors.
+class Test
+ def new()
+ enddef
+ def newOther()
+ enddef
+ def newyetanother()
+ enddef
+endclass
+
+Test.new()
+Test.newOther()
+Test.newyetanother()
+new
+quit
diff --git a/runtime/syntax/testdir/input/vim_syntax.vim b/runtime/syntax/testdir/input/vim_syntax.vim
deleted file mode 100644
index e8c112c..0000000
--- a/runtime/syntax/testdir/input/vim_syntax.vim
+++ /dev/null
@@ -1,75 +0,0 @@
-" Vim :syntax highlighting
-
-syn keyword testKeyword
- \ conceal
- \ cchar=&
- \ contained
- \ containedin=testContainer
- \ nextgroup=testNext,@testCluster
- \ transparent
- \ skipwhite
- \ skipempty
- \ skipnl
- \ keyword1
- \ keyword2
- \ keyword3
-
-syn match testMatch
- \ "pattern"
- \ conceal
- \ cchar=&
- \ contained
- \ containedin=testContainer
- \ nextgroup=testNext,@testCluster
- \ transparent
- \ skipwhite
- \ skipempty
- \ skipnl
- \ contains=testContained1,testContained2
- \ fold
- \ display
- \ extend
- \ excludenl
- \ keepend
-
-syn region testRegion
- \ start="start-pattern"
- \ end="end-pattern"
- \ skip="skip-pattern"
- \ contained
- \ conceal
- \ cchar=&
- \ contained
- \ containedin=testContainer
- \ nextgroup=testNext,@testCluster
- \ transparent
- \ skipwhite
- \ skipempty
- \ skipnl
- \ contains=testContained1,testContained2
- \ oneline
- \ fold
- \ display
- \ extend
- \ concealends
- \ excludenl
- \ keepend
-
-syn cluster testCluster
- \ contains=testContained1,testContained2,testContained3
-
-syn cluster testCluster
- \ add=testAdd
- \ remove=testRemove
-
-
-" check multiline group list
-syn keyword testKeyword
- \ nextgroup=
- \ testNext ,
- \ testNext2 ,
- \ @testCluster
- \ skipwhite
- \ keyword4
- \ keyword5
- \ keyword6
diff --git a/runtime/syntax/testdir/runtest.vim b/runtime/syntax/testdir/runtest.vim
index 80f1eff..e1cfdcf 100644
--- a/runtime/syntax/testdir/runtest.vim
+++ b/runtime/syntax/testdir/runtest.vim
@@ -85,163 +85,209 @@ func HandleSwapExists()
endif
endfunc
-let ok_count = 0
-let failed_tests = []
-let skipped_count = 0
-let MAX_FAILED_COUNT = 5
-for fname in glob('input/*.*', 1, 1)
- if fname =~ '\~$'
- " backup file, skip
- continue
- endif
-
- let linecount = readfile(fname)->len()
- let root = fnamemodify(fname, ':t:r')
- let filetype = substitute(root, '\([^_.]*\)[_.].*', '\1', '')
- let failed_root = 'failed/' .. root
-
- " Execute the test if the "done" file does not exist or when the input file
- " is newer.
- let in_time = getftime(fname)
- let out_time = getftime('done/' .. root)
- if out_time < 0 || in_time > out_time
- call ch_log('running tests for: ' .. fname)
-
- for dumpname in glob(failed_root .. '_\d*\.dump', 1, 1)
- call delete(dumpname)
- endfor
- call delete('done/' .. root)
-
- let lines =<< trim END
- syntax on
-
- " extra info for shell variables
- func ShellInfo()
- let msg = ''
- for [key, val] in items(b:)
- if key =~ '^is_'
- let msg ..= key .. ': ' .. val .. ', '
- endif
- endfor
- if msg != ''
- echomsg msg
- endif
- endfunc
-
- au! SwapExists * call HandleSwapExists()
- func HandleSwapExists()
- " Ignore finding a swap file for the test input, the user might be
- " editing it and that's OK.
- if expand('<afile>') =~ 'input[/\\].*\..*'
- let v:swapchoice = 'e'
- endif
- endfunc
- END
- call writefile(lines, 'Xtestscript')
+func RunTest()
+ let ok_count = 0
+ let failed_tests = []
+ let skipped_count = 0
+ let MAX_FAILED_COUNT = 5
+ " Create a map of setup configuration filenames with their basenames as keys.
+ let setup = glob('input/setup/*.vim', 1, 1)
+ \ ->reduce({d, f -> extend(d, {fnamemodify(f, ':t:r'): f})}, {})
+
+ for fname in glob('input/*.*', 1, 1)
+ if fname =~ '\~$'
+ " backup file, skip
+ continue
+ endif
- " close all but the last window
- while winnr('$') > 1
- close
- endwhile
+ let linecount = readfile(fname)->len()
+ let root = fnamemodify(fname, ':t:r')
+ let filetype = substitute(root, '\([^_.]*\)[_.].*', '\1', '')
+ let failed_root = 'failed/' .. root
+
+ " Execute the test if the "done" file does not exist or when the input file
+ " is newer.
+ let in_time = getftime(fname)
+ let out_time = getftime('done/' .. root)
+ if out_time < 0 || in_time > out_time
+ call ch_log('running tests for: ' .. fname)
+
+ for dumpname in glob(failed_root .. '_\d*\.dump', 1, 1)
+ call delete(dumpname)
+ endfor
+ call delete('done/' .. root)
- " Redraw to make sure that messages are cleared and there is enough space
- " for the terminal window.
- redraw
+ let lines =<< trim END
+ " extra info for shell variables
+ func ShellInfo()
+ let msg = ''
+ for [key, val] in items(b:)
+ if key =~ '^is_'
+ let msg ..= key .. ': ' .. val .. ', '
+ endif
+ endfor
+ if msg != ''
+ echomsg msg
+ endif
+ endfunc
+
+ au! SwapExists * call HandleSwapExists()
+ func HandleSwapExists()
+ " Ignore finding a swap file for the test input, the user might be
+ " editing it and that's OK.
+ if expand('<afile>') =~ 'input[/\\].*\..*'
+ let v:swapchoice = 'e'
+ endif
+ endfunc
+
+ func LoadFiletype(type)
+ for file in glob("ftplugin/" .. a:type .. "*.vim", 1, 1)
+ exe "source " .. file
+ endfor
+ redraw!
+ endfunc
+
+ func SetUpVim()
+ call cursor(1, 1)
+ " Defend against rogue VIM_TEST_SETUP commands.
+ for _ in range(20)
+ let lnum = search('\C\<VIM_TEST_SETUP\>', 'eW', 20)
+ if lnum < 1
+ break
+ endif
+ exe substitute(getline(lnum), '\C.*\<VIM_TEST_SETUP\>', '', '')
+ endfor
+ call cursor(1, 1)
+ " BEGIN [runtime/defaults.vim]
+ " Also, disable italic highlighting to avoid issues on some terminals.
+ set display=truncate ruler scrolloff=5 t_ZH= t_ZR=
+ syntax on
+ " END [runtime/defaults.vim]
+ redraw!
+ endfunc
+ END
+ call writefile(lines, 'Xtestscript')
+
+ " close all but the last window
+ while winnr('$') > 1
+ close
+ endwhile
+
+ " Redraw to make sure that messages are cleared and there is enough space
+ " for the terminal window.
+ redraw
+
+ " Let "Xtestscript#SetUpVim()" turn the syntax on.
+ let prefix = '-Nu NONE -S Xtestscript'
+ let path = get(setup, root, '')
+ " Source the found setup configuration file.
+ let args = !empty(path)
+ \ ? prefix .. ' -S ' .. path
+ \ : prefix
+ let buf = RunVimInTerminal(args, {})
+ " edit the file only after catching the SwapExists event
+ call term_sendkeys(buf, ":edit " .. fname .. "\<CR>")
+ " set up the testing environment
+ call term_sendkeys(buf, ":call SetUpVim()\<CR>")
+ " load filetype specific settings
+ call term_sendkeys(buf, ":call LoadFiletype('" .. filetype .. "')\<CR>")
+
+ if filetype == 'sh'
+ call term_sendkeys(buf, ":call ShellInfo()\<CR>")
+ endif
- let buf = RunVimInTerminal('-S Xtestscript', {})
- " edit the file only after catching the SwapExists event
- call term_sendkeys(buf, ":edit " .. fname .. "\<CR>")
+ " Screendump at the start of the file: failed/root_00.dump
+ let root_00 = root .. '_00'
+ call ch_log('First screendump for ' .. fname .. ': failed/' .. root_00 .. '.dump')
+ let fail = VerifyScreenDump(buf, root_00, {})
- if filetype == 'sh'
- call term_sendkeys(buf, ":call ShellInfo()\<CR>")
- endif
+ " clear the shell info if there are not enough lines to cause a scroll
+ if filetype == 'sh' && linecount <= 19
+ call term_sendkeys(buf, ":redraw\<CR>")
+ endif
- " Screendump at the start of the file: failed/root_00.dump
- let root_00 = root .. '_00'
- call ch_log('First screendump for ' .. fname .. ': failed/' .. root_00 .. '.dump')
- let fail = VerifyScreenDump(buf, root_00, {})
+ " Make a Screendump every 18 lines of the file: failed/root_NN.dump
+ let topline = 1
+ let nr = 1
+ while linecount - topline > 20
+ let topline += 18
+ call term_sendkeys(buf, printf("%dGzt", topline))
+ let root_next = root .. printf('_%02d', nr)
+ call ch_log('Next screendump for ' .. fname .. ': failed/' .. root_next .. '.dump')
+ let fail += VerifyScreenDump(buf, root_next, {})
+ let nr += 1
+ endwhile
+
+ " Screendump at the end of the file: failed/root_99.dump
+ call term_sendkeys(buf, 'Gzb')
+ let root_last = root .. '_99'
+ call ch_log('Last screendump for ' .. fname .. ': failed/' .. root_last .. '.dump')
+ let fail += VerifyScreenDump(buf, root_last, {})
+
+ call StopVimInTerminal(buf)
+ call delete('Xtestscript')
+
+ " redraw here to avoid the following messages to get mixed up with screen
+ " output.
+ redraw
+
+ " Add any assert errors to s:messages.
+ if len(v:errors) > 0
+ call extend(s:messages, v:errors)
+ " Echo the errors here, in case the script aborts or the "messages" file
+ " is not displayed later.
+ echomsg v:errors
+ let v:errors = []
+ let fail += 1
+ endif
- " clear the shell info if there are not enough lines to cause a scroll
- if filetype == 'sh' && linecount <= 19
- call term_sendkeys(buf, ":redraw\<CR>")
- endif
+ if fail == 0
+ call Message("Test " .. root .. " OK")
- " Make a Screendump every 18 lines of the file: failed/root_NN.dump
- let topline = 1
- let nr = 1
- while linecount - topline > 20
- let topline += 18
- call term_sendkeys(buf, printf("%dGzt", topline))
- let root_next = root .. printf('_%02d', nr)
- call ch_log('Next screendump for ' .. fname .. ': failed/' .. root_next .. '.dump')
- let fail += VerifyScreenDump(buf, root_next, {})
- let nr += 1
- endwhile
-
- " Screendump at the end of the file: failed/root_99.dump
- call term_sendkeys(buf, 'Gzb')
- let root_last = root .. '_99'
- call ch_log('Last screendump for ' .. fname .. ': failed/' .. root_last .. '.dump')
- let fail += VerifyScreenDump(buf, root_last, {})
-
- call StopVimInTerminal(buf)
- call delete('Xtestscript')
-
- " redraw here to avoid the following messages to get mixed up with screen
- " output.
- redraw
-
- " Add any assert errors to s:messages.
- if len(v:errors) > 0
- call extend(s:messages, v:errors)
- " Echo the errors here, in case the script aborts or the "messages" file
- " is not displayed later.
- echomsg v:errors
- let v:errors = []
- let fail += 1
- endif
+ call writefile(['OK'], 'done/' .. root)
- if fail == 0
- call Message("Test " .. root .. " OK")
+ let ok_count += 1
+ else
+ call Message("Test " .. root .. " FAILED")
- call writefile(['OK'], 'done/' .. root)
+ call delete('done/' .. root)
- let ok_count += 1
+ eval failed_tests->add(root)
+ if len(failed_tests) > MAX_FAILED_COUNT
+ call Message('')
+ call Message('Too many errors, aborting')
+ endif
+ endif
else
- call Message("Test " .. root .. " FAILED")
+ call Message("Test " .. root .. " skipped")
+ let skipped_count += 1
+ endif
- call delete('done/' .. root)
+ " Append messages to the file "testdir/messages"
+ call AppendMessages('Input file ' .. fname .. ':')
- eval failed_tests->add(root)
- if len(failed_tests) > MAX_FAILED_COUNT
- call Message('')
- call Message('Too many errors, aborting')
- endif
+ if len(failed_tests) > MAX_FAILED_COUNT
+ break
endif
- else
- call Message("Test " .. root .. " skipped")
- let skipped_count += 1
- endif
+ endfor
- " Append messages to the file "testdir/messages"
- call AppendMessages('Input file ' .. fname .. ':')
+ call Message(s:test_run_message)
+ call Message('OK: ' .. ok_count)
+ call Message('FAILED: ' .. len(failed_tests) .. ': ' .. string(failed_tests))
+ call Message('skipped: ' .. skipped_count)
+ call AppendMessages('== SUMMARY ==')
- if len(failed_tests) > MAX_FAILED_COUNT
- break
+ if len(failed_tests) > 0
+ " have make report an error
+ cquit
endif
-endfor
+endfunc
-call Message(s:test_run_message)
-call Message('OK: ' .. ok_count)
-call Message('FAILED: ' .. len(failed_tests) .. ': ' .. string(failed_tests))
-call Message('skipped: ' .. skipped_count)
-call AppendMessages('== SUMMARY ==')
+call RunTest()
" Matching "if 1" at the start.
endif
-if len(failed_tests) > 0
- " have make report an error
- cquit
-endif
qall!
+
+" vim:ts=8
diff --git a/runtime/syntax/tex.vim b/runtime/syntax/tex.vim
index 5544fb6..d782bd4 100644
--- a/runtime/syntax/tex.vim
+++ b/runtime/syntax/tex.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: TeX
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Apr 22, 2022
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 121
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
"
" Notes: {{{1
"
diff --git a/runtime/syntax/tmux.vim b/runtime/syntax/tmux.vim
index d2b31e8..9766ed5 100644
--- a/runtime/syntax/tmux.vim
+++ b/runtime/syntax/tmux.vim
@@ -1,5 +1,5 @@
" Language: tmux(1) configuration file
-" Version: 3.3a (git-e7c829fc)
+" Version: 3.4 (git-608d1134)
" URL: https://github.com/ericpruitt/tmux.vim/
" Maintainer: Eric Pruitt <eric.pruitt@gmail.com>
" License: 2-Clause BSD (http://opensource.org/licenses/BSD-2-Clause)
@@ -164,9 +164,9 @@ syn keyword tmuxCommands
syn keyword tmuxEnums
\ absolute-centre all always any arrows bar blinking-bar blinking-block
\ blinking-underline block both bottom centre color colour current default
-\ double emacs external failed heavy largest latest left manual next
-\ no-detached none number off on other padded previous right rounded simple
-\ single smallest top underline vi
+\ double emacs external failed heavy keep-group keep-last largest latest left
+\ manual next no-detached none number off on other padded previous right
+\ rounded simple single smallest top underline vi
let &cpo = s:original_cpo
unlet! s:original_cpo s:bg s:i
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index edfef43..b12b5c6 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -1,15 +1,17 @@
" Vim syntax file
-" Language: Vim 9.0 script
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
-" Last Change: May 09, 2023
-" 2023 Nov 12 by Vim Project (:let-heredoc improvements)
-" 2023 Nov 20 by Vim Project (:loadkeymap improvements)
-" 2023 Dec 06 by Vim Project (add missing assignment operators)
-" 2023 Dec 10 by Vim Project (improve variable matching)
-" 2023 Dec 21 by Vim Project (improve ex command matching)
-" 2023 Dec 30 by Vim Project (:syntax improvements)
-" Version: 9.0-25
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
+" Language: Vim script
+" Maintainer: Hirohito Higashi <h.east.727 ATMARK gmail.com>
+" Doug Kearns <dougkearns@gmail.com>
+" URL: https://github.com/vim-jp/syntax-vim-ex
+" Last Change: 2024 Mar 22
+" Former Maintainer: Charles E. Campbell
+" Base File URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
+" Base File Version: 9.0-25
+
+" DO NOT CHANGE DIRECTLY.
+" THIS FILE PARTLY GENERATED BY gen_syntax_vim.vim.
+" (Search string "GEN_SYN_VIM:" in this file)
+
" Automatically generated keyword lists: {{{1
" Quit when a syntax file was already loaded {{{2
@@ -25,39 +27,51 @@ syn keyword vimTodo contained COMBAK FIXME TODO XXX
syn cluster vimCommentGroup contains=vimTodo,@Spell
" regular vim commands {{{2
-syn keyword vimCommand contained a ar[gs] argl[ocal] bad[d] bn[ext] breakd[el] bw[ipeout] cabo[ve] cat[ch] ccl[ose] cfdo chd[ir] class cnf[ile] comc[lear] cp[revious] cstag debugg[reedy] delep dell diffg[et] dig[raphs] do dsp[lit] echoe[rr] em[enu] endfo[r] eval f[ile] fina[lly] foldd[oopen] gr[ep] helpc[lose] his[tory] ij[ump] inor j[oin] keepj[umps] lab[ove] lat lc[d] le[ft] lfir[st] lh[elpgrep] lmak[e] loadk lp[revious] luado ma[rk] mk[exrc] mz[scheme] new nore on[ly] pc[lose] pp[op] promptf[ind] ptj[ump] pu[t] py3f[ile] pyx r[ead] redrawt[abline] ri[ght] rundo sIl sal[l] sbf[irst] sc scp se[t] sg sgn sie sip sme snoremenu spelli[nfo] spr[evious] sri star[tinsert] sts[elect] sus[pend] syncbind tabN[ext] tabl[ast] tabr[ewind] tcld[o] tj[ump] tlu tno[remap] tu[nmenu] undol[ist] v vim9[cmd] vs[plit] win[size] wq xmapc[lear] xr[estore]
-syn keyword vimCommand contained ab arga[dd] argu[ment] balt bo[tright] breakl[ist] cN[ext] cad[dbuffer] cb[uffer] cd cfir[st] che[ckpath] cle[arjumps] cnor comp[iler] cpf[ile] cun def deletel delm[arks] diffo[ff] dir doau e[dit] echom[sg] en[dif] endinterface ex files fini[sh] folddoc[losed] grepa[dd] helpf[ind] hor[izontal] il[ist] interface ju[mps] keepp[atterns] lad[dexpr] later lch[dir] lefta[bove] lg[etfile] lhi[story] lmapc[lear] loadkeymap lpf[ile] luafile mak[e] mks[ession] mzf[ile] nmapc[lear] nos[wapfile] opt[ions] pe[rl] pre[serve] promptr[epl] ptl[ast] public py[thon] pyxdo rec[over] reg[isters] rightb[elow] rv[iminfo] sIn san[dbox] sbl[ast] scI scr[iptnames] setf[iletype] sgI sgp sig sir smenu so[urce] spellr[are] sr srl startg[replace] substitutepattern sv[iew] syntime tabc[lose] tabm[ove] tabs tclf[ile] tl[ast] tlunmenu to[pleft] tunma[p] unh[ide] ve[rsion] vim9s[cript] wN[ext] winc[md] wqa[ll] xme xunme
-syn keyword vimCommand contained abc[lear] argd[elete] as[cii] bd[elete] bp[revious] bro[wse] cNf[ile] cadde[xpr] cbe[fore] cdo cg[etfile] checkt[ime] clo[se] co[py] con[tinue] cq[uit] cuna[bbrev] defc[ompile] deletep delp diffp[atch] disa[ssemble] doaut ea echon endclass endt[ry] exi[t] filet fir[st] foldo[pen] gui helpg[rep] i imapc[lear] intro k lN[ext] laddb[uffer] lb[uffer] lcl[ose] leg[acy] lgetb[uffer] ll lne[xt] loc[kmarks] lr[ewind] lv[imgrep] marks mksp[ell] n[ext] noa nu[mber] ownsyntax ped[it] prev[ious] ps[earch] ptn[ext] pw[d] pydo pyxfile red[o] res[ize] ru[ntime] sI sIp sav[eas] sbm[odified] sce scripte[ncoding] setg[lobal] sgc sgr sign sl[eep] smile sor[t] spellr[epall] srI srn startr[eplace] substituterepeat sw[apname] t tabd[o] tabn[ext] tags te[aroff] tlm tm[enu] tp[revious] type unl verb[ose] vim[grep] w[rite] windo wundo xmenu xunmenu
-syn keyword vimCommand contained abo[veleft] argded[upe] au bel[owright] br[ewind] bufdo c[hange] caddf[ile] cbel[ow] ce[nter] cgetb[uffer] chi[story] cmapc[lear] col[der] conf[irm] cr[ewind] cw[indow] defer deletl dep diffpu[t] dj[ump] dp earlier echow[indow] enddef endw[hile] exp filetype fix[del] for gvim helpt[ags] ia imp is[earch] kee[pmarks] lNf[ile] laddf[ile] lbe[fore] lcs lex[pr] lgete[xpr] lla[st] lnew[er] lockv[ar] ls lvimgrepa[dd] mat[ch] mkv[imrc] nb[key] noautocmd o[pen] p[rint] perld[o] pro ptN[ext] ptp[revious] py3 pyf[ile] q[uit] redi[r] ret[ab] rub[y] sIc sIr sbN[ext] sbn[ext] scg scriptv[ersion] setl[ocal] sge sh[ell] sil[ent] sla[st] sn[ext] sp[lit] spellr[rare] src srp static sun[hide] sy tN[ext] tabe[dit] tabnew tc[d] ter[minal] tlmenu tma[p] tr[ewind] u[ndo] unlo[ckvar] vert[ical] vimgrepa[dd] wa[ll] winp[os] wv[iminfo] xnoreme xwininfo
-syn keyword vimCommand contained abstract argdo bN[ext] bf[irst] brea[k] buffers ca caf[ter] cbo[ttom] cex[pr] cgete[xpr] cl[ist] cn[ext] colo[rscheme] cons[t] cs d[elete] delc[ommand] deletp di[splay] diffs[plit] dl dr[op] ec el[se] endenum ene[w] export filt[er] fo[ld] fu[nction] h[elp] hi iabc[lear] import isp[lit] keepa l[ist] laf[ter] lbel[ow] lcscope lf[ile] lgr[ep] lli[st] lnf[ile] lol[der] lt[ag] lw[indow] menut[ranslate] mkvie[w] nbc[lose] noh[lsearch] ol[dfiles] pa[ckadd] po[p] prof[ile] pta[g] ptr[ewind] py3do python3 qa[ll] redr[aw] retu[rn] rubyd[o] sIe sN[ext] sb[uffer] sbp[revious] sci scs sf[ind] sgi si sim[alt] sm[agic] sno[magic] spe[llgood] spellu[ndo] sre[wind] st[op] stj[ump] sunme syn ta[g] tabf[ind] tabo[nly] tch[dir] tf[irst] tln tmapc[lear] try una[bbreviate] uns[ilent] vi[sual] viu[sage] wh[ile] wn[ext] x[it] xnoremenu y[ank]
-syn keyword vimCommand contained addd arge[dit] b[uffer] bl[ast] breaka[dd] bun[load] cabc[lear] cal[l] cc cf[ile] changes cla[st] cnew[er] com cope[n] cscope debug delel delf[unction] dif[fupdate] difft[his] dli[st] ds[earch] echoc[onsole] elsei[f] endf[unction] enum exu[sage] fin[d] foldc[lose] go[to] ha[rdcopy] hid[e] if in iuna[bbrev] keepalt la[st] lan[guage] lbo[ttom] ld[o] lfdo lgrepa[dd] lma lo[adview] lop[en] lua m[ove] mes[sages] mod[e] nbs[tart] nor omapc[lear] packl[oadall] popu[p] profd[el] ptf[irst] pts[elect] py3f[ile] pythonx quita[ll] redraws[tatus] rew[ind] rubyf[ile] sIg sa[rgument] sba[ll] sbr[ewind] scl scscope sfir[st] sgl sic sin sm[ap] snoreme spelld[ump] spellw[rong] srg sta[g] stopi[nsert] sunmenu sync tab tabfir[st] tabp[revious] tcl th[row] tlnoremenu tn[ext] ts[elect] undoj[oin] up[date] vie[w] vne[w] wi wp[revious] xa[ll] xprop z[^.=]
-syn keyword vimCommand contained al[l] argg[lobal] ba[ll] bm[odified]
+" GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand contained', END_STR=''
+syn keyword vimCommand contained abc[lear] abo[veleft] abs[tract] al[l] ar[gs] arga[dd] argd[elete] argdo argded[upe] arge[dit] argg[lobal] argl[ocal] argu[ment] as[cii] b[uffer] bN[ext] ba[ll] bad[d] balt bd[elete] bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bo[tright] bp[revious] br[ewind] brea[k] breaka[dd] breakd[el] breakl[ist] bro[wse] buffers bufd[o] bun[load] bw[ipeout] c[hange] cN[ext] cNf[ile] cabc[lear] cabo[ve] cad[dbuffer] cadde[xpr] caddf[ile] caf[ter] cal[l] cat[ch] cb[uffer] cbe[fore] cbel[ow] cbo[ttom] cc ccl[ose] cd cdo ce[nter] cex[pr] cf[ile] cfd[o] cfir[st] cg[etfile] cgetb[uffer] cgete[xpr] chd[ir] changes che[ckpath] checkt[ime] chi[story] cl[ist] cla[st] class clo[se] cle[arjumps] cn[ext] cnew[er] cnf[ile] co[py] col[der] colo[rscheme]
+syn keyword vimCommand contained com[mand] comc[lear] comp[iler] con[tinue] conf[irm] cons[t] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] d[elete] delm[arks] deb[ug] debugg[reedy] defc[ompile] defe[r] delc[ommand] delf[unction] di[splay] dif[fupdate] diffg[et] diffo[ff] diffp[atch] diffpu[t] diffs[plit] difft[his] dig[raphs] disa[ssemble] dj[ump] dli[st] dr[op] ds[earch] dsp[lit] e[dit] ea[rlier] el[se] elsei[f] em[enu] en[dif] endin[terface] endc[lass] ende[num] endfo[r] endt[ry] endw[hile] ene[w] enu[m] ev[al] ex exi[t] exp[ort] exu[sage] f[ile] files filet[ype] filt[er] fin[d] fina[l] finall[y] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] foldd[oopen] folddoc[losed] foldo[pen] for g[lobal] go[to] gr[ep] grepa[dd] gu[i] gv[im] h[elp]
+syn keyword vimCommand contained helpc[lose] helpf[ind] helpg[rep] helpt[ags] ha[rdcopy] hi[ghlight] hid[e] his[tory] ho[rizontal] iabc[lear] if ij[ump] il[ist] imp[ort] int[ro] inte[rface] is[earch] isp[lit] j[oin] ju[mps] k kee[pmarks] keepj[umps] keepp[atterns] keepa[lt] l[ist] lN[ext] lNf[ile] la[st] lab[ove] lan[guage] lad[dexpr] laddb[uffer] laddf[ile] laf[ter] lat[er] lb[uffer] lbe[fore] lbel[ow] lbo[ttom] lc[d] lch[dir] lcl[ose] lcs[cope] ld[o] le[ft] lefta[bove] let lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] lg[etfile] lgetb[uffer] lgete[xpr] lgr[ep] lgrepa[dd] lh[elpgrep] lhi[story] ll lla[st] lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] loadk[eymap] loc[kmarks] lockv[ar] lol[der] lop[en] lp[revious] lpf[ile] lr[ewind] lt[ag] lua luad[o] luaf[ile]
+syn keyword vimCommand contained lv[imgrep] lvimgrepa[dd] lw[indow] ls m[ove] ma[rk] mak[e] marks mat[ch] menut[ranslate] mes[sages] mk[exrc] mks[ession] mksp[ell] mkv[imrc] mkvie[w] mod[e] mz[scheme] mzf[ile] n[ext] nb[key] nbc[lose] nbs[tart] noa[utocmd] noh[lsearch] nos[wapfile] nu[mber] o[pen] ol[dfiles] on[ly] opt[ions] ow[nsyntax] p[rint] pa[ckadd] packl[oadall] pc[lose] pe[rl] perld[o] ped[it] po[p] pp[op] pre[serve] prev[ious] pro[mptfind] promptr[epl] prof[ile] profd[el] ps[earch] pt[ag] ptN[ext] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pub[lic] pw[d] py[thon] pyd[o] pyf[ile] py3 py3d[o] python3 py3f[ile] pyx pyxd[o] pythonx pyxf[ile] q[uit] quita[ll] qa[ll] r[ead] rec[over] red[o] redi[r] redr[aw] redraws[tatus] redrawt[abline]
+syn keyword vimCommand contained reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] ru[ntime] rub[y] rubyd[o] rubyf[ile] rund[o] rv[iminfo] sN[ext] sa[rgument] sal[l] san[dbox] sav[eas] sb[uffer] sbN[ext] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbp[revious] sbr[ewind] sc[riptnames] scripte[ncoding] scriptv[ersion] scs[cope] setf[iletype] sf[ind] sfir[st] sh[ell] si[malt] sig[n] sil[ent] sl[eep] sla[st] sn[ext] so[urce] sor[t] sp[lit] spe[llgood] spelld[ump] spelli[nfo] spellr[epall] spellra[re] spellu[ndo] spellw[rong] spr[evious] sr[ewind] st[op] sta[g] star[tinsert] startg[replace] startr[eplace] stat[ic] stopi[nsert] stj[ump] sts[elect] sun[hide] sus[pend] sv[iew] sw[apname] synti[me] sync[bind] smi[le] t tN[ext] ta[g] tags tab tabc[lose]
+syn keyword vimCommand contained tabd[o] tabe[dit] tabf[ind] tabfir[st] tabm[ove] tabl[ast] tabn[ext] tabnew tabo[nly] tabp[revious] tabN[ext] tabr[ewind] tabs tc[d] tch[dir] tcl tcld[o] tclf[ile] te[aroff] ter[minal] tf[irst] th[row] thi[s] tj[ump] tl[ast] tn[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] ty[pe] u[ndo] undoj[oin] undol[ist] unh[ide] unl[et] unlo[ckvar] uns[ilent] up[date] v[global] ve[rsion] verb[ose] vert[ical] vi[sual] vie[w] vim[grep] vimgrepa[dd] vim9[cmd] vim9s[cript] viu[sage] vne[w] vs[plit] w[rite] wN[ext] wa[ll] wh[ile] wi[nsize] winc[md] wind[o] winp[os] wn[ext] wp[revious] wq wqa[ll] wu[ndo] wv[iminfo] x[it] xa[ll] xr[estore] y[ank] z dl dell delel deletl deletel dp dep delp delep deletp deletep a i
+
+syn keyword vimCommand contained 2mat[ch] 3mat[ch]
+
+" Lower priority for _new_ to distinguish constructors from the command.
+syn match vimCommand contained "\<new\>(\@!"
syn match vimCommand contained "\<z[-+^.=]\=\>"
-syn keyword vimStdPlugin contained Arguments Asm Break Cfilter Clear Continue DiffOrig Evaluate Finish Gdb Lfilter Man N[ext] Over P[rint] Program Run S Source Step Stop Termdebug TermdebugCommand TOhtml Until Winbar XMLent XMLns
+syn keyword vimStdPlugin contained Arguments Asm Break Cfilter Clear Continue DiffOrig Evaluate Finish Gdb Lfilter Man Over Program Run S Source Step Stop Termdebug TermdebugCommand TOhtml Until Winbar XMLent XMLns
" vimOptions are caught only when contained in a vimSet {{{2
-syn keyword vimOption contained acd ambw arshape aw backupskip beval bk bri bufhidden cdh ci cinsd cms commentstring conceallevel cpt cscopetagorder csto cursorlineopt dg dir ed enc equalprg expandtab fdls fex fileignorecase fml foldlevel formatexpr gcr gli guifont guitabtooltip hidden hlg imactivatefunc imi inc inex isident keymap langmap linebreak lm lsp makeencoding maxmem mh mmp more mousemoveevent mzq numberwidth opfunc patchexpr pfn pp printfont pumwidth pythonthreehome re restorescreen ro rulerformat scl scs sft shellslash shortmess showtabline slm smoothscroll spell spl srr statusline sw sxq tag tal tenc termwintype tgst titleold tpm ttm tw udir ur verbose viminfofile warn wfh wildchar wim winminheight wmh write
-syn keyword vimOption contained ai anti asd awa balloondelay bevalterm bkc briopt buflisted cdhome cin cinw co compatible confirm crb cscopeverbose csverb cwh dict directory edcompatible encoding errorbells exrc fdm ff filetype fmr foldlevelstart formatlistpat gd go guifontset helpfile highlight hls imactivatekey iminsert include inf isk keymodel langmenu lines lmap luadll makeprg maxmempattern mis mmt mouse mouses mzquantum nuw osfiletype patchmode ph preserveindent printheader pvh pyx readonly revins rop runtimepath scr sect sh shelltemp shortname shq sloc sms spellcapcheck splitbelow ss stl swapfile syn tagbsearch tb term terse thesaurus titlestring tr tty twk ul ut verbosefile virtualedit wb wfw wildcharm winaltkeys winminwidth wmnu writeany
-syn keyword vimOption contained akm antialias autochdir background ballooneval bex bl brk buftype cdpath cindent cinwords cocu complete copyindent cryptmethod csl cuc debug dictionary display ef endoffile errorfile fcl fdn ffs fillchars fo foldmarker formatoptions gdefault gp guifontwide helpheight history hlsearch imaf ims includeexpr infercase iskeyword keyprotocol langnoremap linespace lnr lw mat maxmemtot mkspellmem mod mousef mouseshape mzschemedll odev pa path pheader previewheight printmbcharset pvp pyxversion redrawtime ri rs sb scroll sections shcf shelltype showbreak si sm sn spellfile splitkeep ssl stmp swapsync synmaxcol tagcase tbi termbidi textauto thesaurusfunc tl ts ttybuiltin tws undodir varsofttabstop vfile visualbell wc wh wildignore wincolor winptydll wmw writebackup
-syn keyword vimOption contained al ar autoindent backspace balloonevalterm bexpr bo browsedir casemap cedit cink clipboard cole completefunc cot cscopepathcomp cspc cul deco diff dy efm endofline errorformat fcs fdo fic fixendofline foldclose foldmethod formatprg gfm grepformat guiheadroom helplang hk ic imak imsearch incsearch insertmode isp keywordprg langremap lisp loadplugins lz matchpairs mco ml modeline mousefocus mouset mzschemegcdll oft packpath pdev pi previewpopup printmbfont pvw qe regexpengine rightleft rtp sbo scrollbind secure shell shellxescape showcmd sidescroll smartcase so spelllang splitright ssop sts swb syntax tagfunc tbidi termencoding textmode tildeop tm tsl ttyfast twsl undofile vartabstop vi vop wcm whichwrap wildignorecase window winwidth wop writedelay
-syn keyword vimOption contained aleph arab autoread backup balloonexpr bg bomb bs cb cf cinkeys cm colorcolumn completeopt cp cscopeprg csprg culopt def diffexpr ea ei eof esckeys fdc fdt fileencoding fixeol foldcolumn foldminlines fp gfn grepprg guiligatures hf hkmap icon imc imsf inde is isprint km laststatus lispoptions lop ma matchtime mef mle modelineexpr mousehide mousetime nf ofu para penc pm previewwindow printoptions pw qftf relativenumber rightleftcmd ru sbr scrollfocus sel shellcmdflag shellxquote showcmdloc sidescrolloff smartindent softtabstop spelloptions spo st su swf ta taglength tbis termguicolors textwidth timeout to tsr ttym twt undolevels vb viewdir vsts wcr wi wildmenu winfixheight wiv wrap ws
-syn keyword vimOption contained allowrevins arabic autoshelldir backupcopy bdir bh breakat bsdir cc cfu cino cmdheight columns completepopup cpo cscopequickfix csqf cursorbind define diffopt ead ek eol et fde fen fileencodings fk foldenable foldnestmax fs gfs gtl guioptions hh hkmapp iconstring imcmdline imst indentexpr isf joinspaces jumpoptions kmp lazyredraw lispwords lpl macatsui maxcombine menc mls modelines mousem mp nrformats omnifunc paragraphs perldll pmbcs printdevice prompt pythondll quickfixtextfunc remap rl rubydll sc scrolljump selection shellpipe shiftround showfulltag signcolumn smarttab sol spellsuggest spr sta sua switchbuf tabline tagrelative tbs termwinkey tf timeoutlen toolbar tsrfu ttymouse tx undoreload vbs viewoptions vts wd wic wildmode winfixwidth wiw wrapmargin ww
-syn keyword vimOption contained altkeymap arabicshape autowrite backupdir bdlay bin breakindent bsk ccv ch cinoptions cmdwinheight com completeslash cpoptions cscoperelative csre cursorcolumn delcombine digraph eadirection emo ep eventignore fdi fenc fileformat fkmap foldexpr foldopen fsync gfw gtt guipty hi hkp ignorecase imd imstatusfunc indentkeys isfname js jop kp lbr list lrm magic maxfuncdepth menuitems mm modifiable mousemev mps nu opendevice paste pex pmbfn printencoding pt pythonhome quoteescape renderoptions rlc ruf scb scrolloff selectmode shellquote shiftwidth showmatch siso smc sp spf sps stal suffixes sws tabpagemax tags tc termwinscroll tfu title toolbariconsize ttimeout ttyscroll uc updatecount vdir vif wa weirdinvert wig wildoptions winheight wm wrapscan xtermcodes
-syn keyword vimOption contained ambiwidth ari autowriteall backupext belloff binary breakindentopt bt cd charconvert cinscopedecls cmp comments concealcursor cpp cscopetag cst cursorline dex dip eb emoji equalalways ex fdl fencs fileformats flp foldignore foldtext ft ghr guicursor guitablabel hid hl im imdisable imstyle indk isi key kpc lcs listchars ls makeef maxmapdepth mfd mmd modified mousemodel msm number operatorfunc pastetoggle pexpr popt printexpr pumheight pythonthreedll rdt report rnu ruler scf scrollopt sessionoptions shellredir shm showmode sj smd spc spk sr startofline suffixesadd sxe tabstop tagstack tcldll termwinsize tgc titlelen top ttimeoutlen ttytype udf updatetime ve viminfo wak
+" GEN_SYN_VIM: vimOption normal, START_STR='syn keyword vimOption contained', END_STR=''
+syn keyword vimOption contained al aleph ari allowrevins ambw ambiwidth arab arabic arshape arabicshape acd autochdir ai autoindent ar autoread asd autoshelldir aw autowrite awa autowriteall bg background bs backspace bk backup bkc backupcopy bdir backupdir bex backupext bsk backupskip bdlay balloondelay beval ballooneval bevalterm balloonevalterm bexpr balloonexpr bo belloff bin binary bomb brk breakat bri breakindent briopt breakindentopt bsdir browsedir bh bufhidden bl buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv charconvert cin cindent cink cinkeys cino cinoptions cinsd cinscopedecls cinw cinwords cb clipboard ch cmdheight cwh cmdwinheight cc colorcolumn co columns com comments cms commentstring cp compatible cpt complete cfu completefunc
+syn keyword vimOption contained cot completeopt cpp completepopup csl completeslash cocu concealcursor cole conceallevel cf confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul cursorline culopt cursorlineopt debug def define deco delcombine dict dictionary diff dex diffexpr dip diffopt dg digraph dir directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof endoffile eol endofline ea equalalways ep equalprg eb errorbells ef errorfile efm errorformat ek esckeys ei eventignore et expandtab ex exrc fenc fileencoding fencs fileencodings ff fileformat ffs fileformats fic fileignorecase
+syn keyword vimOption contained ft filetype fcs fillchars fixeol fixendofline fcl foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile hh helpheight hlg helplang hid hidden hl highlight hi history hk hkmap hkp hkmapp hls hlsearch icon iconstring ic ignorecase imaf imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims imsearch imsf imstatusfunc
+syn keyword vimOption contained imst imstyle inc include inex includeexpr is incsearch inde indentexpr indk indentkeys inf infercase im insertmode isf isfname isi isident isk iskeyword isp isprint js joinspaces jop jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw lbr linebreak lines lsp linespace lisp lop lispoptions lw lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc makeencoding mp makeprg mps matchpairs mat matchtime mco maxcombine mfd maxfuncdepth mmd maxmapdepth mm maxmem mmp maxmempattern mmt maxmemtot mis menuitems msm mkspellmem ml modeline mle modelineexpr mls modelines ma modifiable mod modified more mouse mousef mousefocus
+syn keyword vimOption contained mh mousehide mousem mousemodel mousemev mousemoveevent mouses mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc operatorfunc pp packpath para paragraphs paste pt pastetoggle pex patchexpr pm patchmode pa path perldll pi preserveindent pvh previewheight pvp previewpopup pvw previewwindow pdev printdevice penc printencoding pexpr printexpr pfn printfont pheader printheader pmbcs printmbcharset pmbfn printmbfont popt printoptions prompt ph pumheight pw pumwidth pythondll pythonhome pythonthreedll pythonthreehome pyx pyxversion qftf quickfixtextfunc qe quoteescape ro readonly rdt redrawtime re regexpengine rnu relativenumber remap rop renderoptions
+syn keyword vimOption contained report rs restorescreen ri revins rl rightleft rlc rightleftcmd rubydll ru ruler ruf rulerformat rtp runtimepath scr scroll scb scrollbind scf scrollfocus sj scrolljump so scrolloff sbo scrollopt sect sections secure sel selection slm selectmode ssop sessionoptions sh shell shcf shellcmdflag sp shellpipe shq shellquote srr shellredir ssl shellslash stmp shelltemp st shelltype sxe shellxescape sxq shellxquote sr shiftround sw shiftwidth shm shortmess sn shortname sbr showbreak sc showcmd sloc showcmdloc sft showfulltag sm showmatch smd showmode stal showtabline ss sidescroll siso sidescrolloff scl signcolumn scs smartcase si smartindent sta smarttab sms smoothscroll sts softtabstop spell spc spellcapcheck spf spellfile spl spelllang
+syn keyword vimOption contained spo spelloptions sps spellsuggest sb splitbelow spk splitkeep spr splitright sol startofline stl statusline su suffixes sua suffixesadd swf swapfile sws swapsync swb switchbuf smc synmaxcol syn syntax tal tabline tpm tabpagemax ts tabstop tbs tagbsearch tc tagcase tfu tagfunc tl taglength tr tagrelative tag tags tgst tagstack tcldll term tbidi termbidi tenc termencoding tgc termguicolors twk termwinkey twsl termwinscroll tws termwinsize twt termwintype terse ta textauto tx textmode tw textwidth tsr thesaurus tsrfu thesaurusfunc top tildeop to timeout tm timeoutlen title titlelen titleold titlestring tb toolbar tbis toolbariconsize ttimeout ttm ttimeoutlen tbi ttybuiltin tf ttyfast ttym ttymouse tsl ttyscroll tty ttytype udir undodir
+syn keyword vimOption contained udf undofile ul undolevels ur undoreload uc updatecount ut updatetime vsts varsofttabstop vts vartabstop vbs verbose vfile verbosefile vdir viewdir vop viewoptions vi viminfo vif viminfofile ve virtualedit vb visualbell warn wiv weirdinvert ww whichwrap wc wildchar wcm wildcharm wig wildignore wic wildignorecase wmnu wildmenu wim wildmode wop wildoptions wak winaltkeys wcr wincolor wi window wfb winfixbuf wfh winfixheight wfw winfixwidth wh winheight wmh winminheight wmw winminwidth winptydll wiw winwidth wrap wm wrapmargin ws wrapscan write wa writeany wb writebackup wd writedelay xtermcodes
" vimOptions: These are the turn-off setting variants {{{2
-syn keyword vimOption contained noacd noallowrevins noantialias noarabic noarshape noautoindent noautowrite noawa noballoonevalterm nobin nobl nobri nocdhome nocin noconfirm nocrb nocscopeverbose nocsverb nocursorbind nodeco nodiff noeb noek noendoffile noeol noesckeys noexpandtab nofic nofixeol nofoldenable nogd nohid nohkmap nohls noicon noimc noimdisable noinfercase nojoinspaces nolangremap nolinebreak nolnr nolrm nomacatsui noml nomodeline nomodified nomousefocus nomousemoveevent noodev nopi noprompt norelativenumber norevins norl nors noruler nosc noscf noscrollfocus nosecure noshellslash noshiftround noshowcmd noshowmatch nosi nosmartcase nosmarttab nosmoothscroll nosn nospell nosplitright nosr nosta nostmp noswf notagbsearch notagstack notbidi notermbidi noterse notextmode notgc notildeop notitle notop nottimeout nottyfast noudf novb nowa nowb nowfh nowic nowildmenu nowinfixwidth nowmnu nowrapscan nowriteany nows
-syn keyword vimOption contained noai noaltkeymap noar noarabicshape noasd noautoread noautowriteall nobackup nobeval nobinary nobomb nobuflisted nocf nocindent nocopyindent nocscoperelative nocsre nocuc nocursorcolumn nodelcombine nodigraph noed noemo noendofline noequalalways noet noexrc nofileignorecase nofk nofs nogdefault nohidden nohkmapp nohlsearch noignorecase noimcmdline noincsearch noinsertmode nojs nolazyredraw nolisp noloadplugins nolz nomagic nomle nomodelineexpr nomore nomousehide nonu noopendevice nopreserveindent nopvw noremap nori nornu noru nosb noscb noscrollbind noscs nosft noshelltemp noshortname noshowfulltag noshowmode nosm nosmartindent nosmd nosms nosol nosplitbelow nospr nossl nostartofline noswapfile nota notagrelative notbi notbs notermguicolors notextauto notf notgst notimeout noto notr nottybuiltin notx noundofile novisualbell nowarn noweirdinvert nowfw nowildignorecase nowinfixheight nowiv nowrap nowrite nowritebackup noxtermcodes
-syn keyword vimOption contained noakm noanti noarab noari noautochdir noautoshelldir noaw noballooneval nobevalterm nobk nobreakindent nocdh noci nocompatible nocp nocscopetag nocst nocul nocursorline nodg noea noedcompatible noemoji noeof noerrorbells noex nofen nofixendofline nofkmap nofsync noguipty nohk nohkp noic noim noimd noinf nois nolangnoremap nolbr nolist nolpl noma nomh nomod nomodifiable nomousef nomousemev nonumber nopaste nopreviewwindow noreadonly norestorescreen norightleft noro
+" GEN_SYN_VIM: vimOption turn-off, START_STR='syn keyword vimOption contained', END_STR=''
+syn keyword vimOption contained noari noallowrevins noarab noarabic noarshape noarabicshape noacd noautochdir noai noautoindent noar noautoread noasd noautoshelldir noaw noautowrite noawa noautowriteall nobk nobackup nobeval noballooneval nobevalterm noballoonevalterm nobin nobinary nobomb nobri nobreakindent nobl nobuflisted nocdh nocdhome nocin nocindent nocp nocompatible nocf noconfirm noci nocopyindent nocsre nocscoperelative nocst nocscopetag nocsverb nocscopeverbose nocrb nocursorbind nocuc nocursorcolumn nocul nocursorline nodeco nodelcombine nodiff nodg nodigraph noed noedcompatible noemo noemoji noeof noendoffile noeol noendofline noea noequalalways noeb noerrorbells noek noesckeys noet noexpandtab noex noexrc nofic nofileignorecase nofixeol nofixendofline
+syn keyword vimOption contained nofen nofoldenable nofs nofsync nogd nogdefault noguipty nohid nohidden nohk nohkmap nohkp nohkmapp nohls nohlsearch noicon noic noignorecase noimc noimcmdline noimd noimdisable nois noincsearch noinf noinfercase noim noinsertmode nojs nojoinspaces nolnr nolangnoremap nolrm nolangremap nolz nolazyredraw nolbr nolinebreak nolisp nolist nolpl noloadplugins nomagic noml nomodeline nomle nomodelineexpr noma nomodifiable nomod nomodified nomore nomousef nomousefocus nomh nomousehide nomousemev nomousemoveevent nonu nonumber noodev noopendevice nopaste nopi nopreserveindent nopvw nopreviewwindow noprompt noro noreadonly nornu norelativenumber noremap nors norestorescreen nori norevins norl norightleft noru noruler noscb noscrollbind noscf noscrollfocus
+syn keyword vimOption contained nosecure nossl noshellslash nostmp noshelltemp nosr noshiftround nosn noshortname nosc noshowcmd nosft noshowfulltag nosm noshowmatch nosmd noshowmode noscs nosmartcase nosi nosmartindent nosta nosmarttab nosms nosmoothscroll nospell nosb nosplitbelow nospr nosplitright nosol nostartofline noswf noswapfile notbs notagbsearch notr notagrelative notgst notagstack notbidi notermbidi notgc notermguicolors noterse nota notextauto notx notextmode notop notildeop noto notimeout notitle nottimeout notbi nottybuiltin notf nottyfast noudf noundofile novb novisualbell nowarn nowiv noweirdinvert nowic nowildignorecase nowmnu nowildmenu nowfb nowinfixbuf nowfh nowinfixheight nowfw nowinfixwidth nowrap nows nowrapscan nowrite nowa nowriteany
+syn keyword vimOption contained nowb nowritebackup noxtermcodes
" vimOptions: These are the invertible variants {{{2
-syn keyword vimOption contained invacd invallowrevins invantialias invarabic invarshape invautoindent invautowrite invawa invballoonevalterm invbin invbl invbri invcdhome invcin invconfirm invcrb invcscopeverbose invcsverb invcursorbind invdeco invdiff inveb invek invendoffile inveol invesckeys invexpandtab invfic invfixeol invfoldenable invgd invhid invhkmap invhls invicon invimc invimdisable invinfercase invjoinspaces invlangremap invlinebreak invlnr invlrm invmacatsui invml invmodeline invmodified invmousefocus invmousemoveevent invodev invpi invprompt invrelativenumber invrevins invrl invrs invruler invsc invscf invscrollfocus invsecure invshellslash invshiftround invshowcmd invshowmatch invsi invsmartcase invsmarttab invsmoothscroll invsn invspell invsplitright invsr invsta invstmp invswf invtagbsearch invtagstack invtbidi invtermbidi invterse invtextmode invtgc invtildeop invtitle invtop invttimeout invttyfast invudf invvb invwa invwb invwfh invwic invwildmenu invwinfixwidth invwmnu invwrapscan invwriteany invws
-syn keyword vimOption contained invai invaltkeymap invar invarabicshape invasd invautoread invautowriteall invbackup invbeval invbinary invbomb invbuflisted invcf invcindent invcopyindent invcscoperelative invcsre invcuc invcursorcolumn invdelcombine invdigraph inved invemo invendofline invequalalways invet invexrc invfileignorecase invfk invfs invgdefault invhidden invhkmapp invhlsearch invignorecase invimcmdline invincsearch invinsertmode invjs invlazyredraw invlisp invloadplugins invlz invmagic invmle invmodelineexpr invmore invmousehide invnu invopendevice invpreserveindent invpvw invremap invri invrnu invru invsb invscb invscrollbind invscs invsft invshelltemp invshortname invshowfulltag invshowmode invsm invsmartindent invsmd invsms invsol invsplitbelow invspr invssl invstartofline invswapfile invta invtagrelative invtbi invtbs invtermguicolors invtextauto invtf invtgst invtimeout invto invtr invttybuiltin invtx invundofile invvisualbell invwarn invweirdinvert invwfw invwildignorecase invwinfixheight invwiv invwrap invwrite invwritebackup invxtermcodes
-syn keyword vimOption contained invakm invanti invarab invari invautochdir invautoshelldir invaw invballooneval invbevalterm invbk invbreakindent invcdh invci invcompatible invcp invcscopetag invcst invcul invcursorline invdg invea invedcompatible invemoji inveof inverrorbells invex invfen invfixendofline invfkmap invfsync invguipty invhk invhkp invic invim invimd invinf invis invlangnoremap invlbr invlist invlpl invma invmh invmod invmodifiable invmousef invmousemev invnumber invpaste invpreviewwindow invreadonly invrestorescreen invrightleft invro
+" GEN_SYN_VIM: vimOption invertible, START_STR='syn keyword vimOption contained', END_STR=''
+syn keyword vimOption contained invari invallowrevins invarab invarabic invarshape invarabicshape invacd invautochdir invai invautoindent invar invautoread invasd invautoshelldir invaw invautowrite invawa invautowriteall invbk invbackup invbeval invballooneval invbevalterm invballoonevalterm invbin invbinary invbomb invbri invbreakindent invbl invbuflisted invcdh invcdhome invcin invcindent invcp invcompatible invcf invconfirm invci invcopyindent invcsre invcscoperelative invcst invcscopetag invcsverb invcscopeverbose invcrb invcursorbind invcuc invcursorcolumn invcul invcursorline invdeco invdelcombine invdiff invdg invdigraph inved invedcompatible invemo invemoji inveof invendoffile inveol invendofline invea invequalalways inveb inverrorbells invek invesckeys
+syn keyword vimOption contained invet invexpandtab invex invexrc invfic invfileignorecase invfixeol invfixendofline invfen invfoldenable invfs invfsync invgd invgdefault invguipty invhid invhidden invhk invhkmap invhkp invhkmapp invhls invhlsearch invicon invic invignorecase invimc invimcmdline invimd invimdisable invis invincsearch invinf invinfercase invim invinsertmode invjs invjoinspaces invlnr invlangnoremap invlrm invlangremap invlz invlazyredraw invlbr invlinebreak invlisp invlist invlpl invloadplugins invmagic invml invmodeline invmle invmodelineexpr invma invmodifiable invmod invmodified invmore invmousef invmousefocus invmh invmousehide invmousemev invmousemoveevent invnu invnumber invodev invopendevice invpaste invpi invpreserveindent invpvw invpreviewwindow
+syn keyword vimOption contained invprompt invro invreadonly invrnu invrelativenumber invremap invrs invrestorescreen invri invrevins invrl invrightleft invru invruler invscb invscrollbind invscf invscrollfocus invsecure invssl invshellslash invstmp invshelltemp invsr invshiftround invsn invshortname invsc invshowcmd invsft invshowfulltag invsm invshowmatch invsmd invshowmode invscs invsmartcase invsi invsmartindent invsta invsmarttab invsms invsmoothscroll invspell invsb invsplitbelow invspr invsplitright invsol invstartofline invswf invswapfile invtbs invtagbsearch invtr invtagrelative invtgst invtagstack invtbidi invtermbidi invtgc invtermguicolors invterse invta invtextauto invtx invtextmode invtop invtildeop invto invtimeout invtitle invttimeout invtbi invttybuiltin
+syn keyword vimOption contained invtf invttyfast invudf invundofile invvb invvisualbell invwarn invwiv invweirdinvert invwic invwildignorecase invwmnu invwildmenu invwfb invwinfixbuf invwfh invwinfixheight invwfw invwinfixwidth invwrap invws invwrapscan invwrite invwa invwriteany invwb invwritebackup invxtermcodes
" termcap codes (which can also be set) {{{2
-syn keyword vimOption contained t_8b t_8u t_AF t_AL t_bc t_BE t_ce t_cl t_Co t_Cs t_CV t_db t_DL t_Ds t_EI t_F2 t_F4 t_F6 t_F8 t_fd t_fs t_IE t_k1 t_k2 t_K3 t_K4 t_K5 t_K6 t_K7 t_K8 t_K9 t_kb t_KB t_kd t_KD t_KE t_KG t_KH t_KI t_KK t_KL t_kN t_kP t_kr t_ks t_ku t_le t_mb t_md t_me t_mr t_ms t_nd t_op t_PE t_PS t_RB t_RC t_RF t_Ri t_RI t_RK t_RS t_RT t_RV t_Sb t_SC t_se t_Sf t_SH t_Si t_SI t_so t_sr t_SR t_ST t_te t_Te t_TE t_ti t_TI t_ts t_Ts t_u7 t_ue t_us t_Us t_ut t_vb t_ve t_vi t_vs t_VS t_WP t_WS t_XM t_xn t_xs t_ZH t_ZR
-syn keyword vimOption contained t_8f t_AB t_al t_AU t_BD t_cd t_Ce t_cm t_cs t_CS t_da t_dl t_ds t_EC t_F1 t_F3 t_F5 t_F7 t_F9 t_fe t_GP t_IS t_K1 t_k3 t_k4 t_k5 t_k6 t_k7 t_k8 t_k9 t_KA t_kB t_KC t_kD t_ke t_KF t_kh t_kI t_KJ t_kl
+" GEN_SYN_VIM: vimOption term output code, START_STR='syn keyword vimOption contained', END_STR=''
+syn keyword vimOption contained t_AB t_AF t_AU t_AL t_al t_bc t_BE t_BD t_cd t_ce t_Ce t_CF t_cl t_cm t_Co t_CS t_Cs t_cs t_CV t_da t_db t_DL t_dl t_ds t_Ds t_EC t_EI t_fs t_fd t_fe t_GP t_IE t_IS t_ke t_ks t_le t_mb t_md t_me t_mr t_ms t_nd t_op t_RF t_RB t_RC t_RI t_Ri t_RK t_RS t_RT t_RV t_Sb t_SC t_se t_Sf t_SH t_SI t_Si t_so t_SR t_sr t_ST t_Te t_te t_TE t_ti t_TI t_Ts t_ts t_u7 t_ue t_us t_Us t_ut t_vb t_ve t_vi t_VS t_vs t_WP t_WS t_XM t_xn t_xs t_ZH t_ZR t_8f t_8b t_8u
+" term key codes
+syn keyword vimOption contained t_F1 t_F2 t_F3 t_F4 t_F5 t_F6 t_F7 t_F8 t_F9 t_k1 t_K1 t_k2 t_k3 t_K3 t_k4 t_K4 t_k5 t_K5 t_k6 t_K6 t_k7 t_K7 t_k8 t_K8 t_k9 t_K9 t_KA t_kb t_kB t_KB t_KC t_kd t_kD t_KD t_KE t_KF t_KG t_kh t_KH t_kI t_KI t_KJ t_KK t_kl t_KL t_kN t_kP t_kr t_ku
syn match vimOption contained "t_%1"
syn match vimOption contained "t_#2"
syn match vimOption contained "t_#4"
@@ -68,29 +82,35 @@ syn match vimOption contained "t_%i"
syn match vimOption contained "t_k;"
" unsupported settings: some were supported by vi but don't do anything in vim {{{2
-" others have been dropped along with msdos support
-syn keyword vimErrSetting contained bioskey biosk conskey consk autoprint beautify flash graphic hardtabs mesg novice open op optimize redraw slow slowopen sourceany w300 w1200 w9600 hardtabs ht nobioskey nobiosk noconskey noconsk noautoprint nobeautify noflash nographic nohardtabs nomesg nonovice noopen noop nooptimize noredraw noslow noslowopen nosourceany now300 now1200 now9600 w1200 w300 w9600
+" GEN_SYN_VIM: Missing vimOption, START_STR='syn keyword vimErrSetting contained', END_STR=''
+syn keyword vimErrSetting contained akm altkeymap anti antialias ap autoprint bf beautify biosk bioskey consk conskey fk fkmap fl flash gr graphic ht hardtabs macatsui mesg novice open opt optimize oft osfiletype redraw slow slowopen sourceany w1200 w300 w9600
+syn keyword vimErrSetting contained noakm noaltkeymap noanti noantialias noap noautoprint nobf nobeautify nobiosk nobioskey noconsk noconskey nofk nofkmap nofl noflash nogr nographic nomacatsui nomesg nonovice noopen noopt nooptimize noredraw noslow noslowopen nosourceany
+syn keyword vimErrSetting contained invakm invaltkeymap invanti invantialias invap invautoprint invbf invbeautify invbiosk invbioskey invconsk invconskey invfk invfkmap invfl invflash invgr invgraphic invmacatsui invmesg invnovice invopen invopt invoptimize invredraw invslow invslowopen invsourceany
" AutoCmd Events {{{2
syn case ignore
-syn keyword vimAutoEvent contained BufAdd BufDelete BufFilePost BufHidden BufNew BufRead BufReadPost BufUnload BufWinLeave BufWrite BufWritePost CmdlineChanged CmdlineLeave CmdwinEnter ColorScheme CompleteChanged CompleteDonePre CursorHoldI CursorMovedI DiffUpdated DirChanged DirChangedPre EncodingChanged ExitPre FileAppendCmd FileAppendPost FileAppendPre FileChangedRO FileChangedShell FileChangedShellPost FileEncoding FileExplorer FileReadCmd FileReadPost FileReadPre FileType FileWriteCmd FileWritePost FileWritePre FilterReadPost FilterReadPre FilterWritePost FilterWritePre FocusGained FocusLost FuncUndefined GUIEnter GUIFailed InsertChange InsertCharPre InsertEnter InsertLeave InsertLeavePre MenuPopup ModeChanged OptionSet QuickFixCmdPost QuickFixCmdPre QuitPre RemoteReply SafeState SafeStateAgain SessionLoadPost ShellCmdPost ShellFilterPost SigUSR1 SourceCmd SourcePost SourcePre SpellFileMissing StdinReadPost StdinReadPre SwapExists Syntax TabClosed TabEnter TabLeave TabNew TermChanged TerminalOpen TerminalWinOpen TermResponse TextChanged TextChangedI TextChangedP TextChangedT TextYankPost User VimEnter VimLeave VimLeavePre VimResized VimResume VimSuspend WinClosed WinEnter WinLeave WinNew WinResized WinScrolled
-syn keyword vimAutoEvent contained BufCreate BufEnter BufFilePre BufLeave BufNewFile BufReadCmd BufReadPre BufWinEnter BufWipeout BufWriteCmd BufWritePre CmdlineEnter CmdUndefined CmdwinLeave ColorSchemePre CompleteDone CursorHold CursorMoved
+" GEN_SYN_VIM: vimAutoEvent, START_STR='syn keyword vimAutoEvent contained', END_STR=''
+syn keyword vimAutoEvent contained BufAdd BufCreate BufDelete BufEnter BufFilePost BufFilePre BufHidden BufLeave BufNew BufNewFile BufRead BufReadCmd BufReadPost BufReadPre BufUnload BufWinEnter BufWinLeave BufWipeout BufWrite BufWritePost BufWritePre BufWriteCmd CmdlineChanged CmdlineEnter CmdlineLeave CmdwinEnter CmdwinLeave CmdUndefined ColorScheme ColorSchemePre CompleteChanged CompleteDone CompleteDonePre CursorHold CursorHoldI CursorMoved CursorMovedI DiffUpdated DirChanged DirChangedPre EncodingChanged ExitPre FileEncoding FileAppendPost FileAppendPre FileAppendCmd FileChangedShell FileChangedShellPost FileChangedRO FileReadPost FileReadPre FileReadCmd FileType FileWritePost FileWritePre FileWriteCmd FilterReadPost FilterReadPre FilterWritePost FilterWritePre
+syn keyword vimAutoEvent contained FocusGained FocusLost FuncUndefined GUIEnter GUIFailed InsertChange InsertEnter InsertLeave InsertLeavePre InsertCharPre MenuPopup ModeChanged OptionSet QuickFixCmdPost QuickFixCmdPre QuitPre RemoteReply SafeState SafeStateAgain SessionLoadPost ShellCmdPost ShellFilterPost SigUSR1 SourceCmd SourcePre SourcePost SpellFileMissing StdinReadPost StdinReadPre SwapExists Syntax TabNew TabClosed TabEnter TabLeave TermChanged TerminalOpen TerminalWinOpen TermResponse TermResponseAll TextChanged TextChangedI TextChangedP TextChangedT User VimEnter VimLeave VimLeavePre WinNewPre WinNew WinClosed WinEnter WinLeave WinResized WinScrolled VimResized TextYankPost VimSuspend VimResume
" Highlight commonly used Groupnames {{{2
syn keyword vimGroup contained Comment Constant String Character Number Boolean Float Identifier Function Statement Conditional Repeat Label Operator Keyword Exception PreProc Include Define Macro PreCondit Type StorageClass Structure Typedef Special SpecialChar Tag Delimiter SpecialComment Debug Underlined Ignore Error Todo
" Default highlighting groups {{{2
-syn keyword vimHLGroup contained ColorColumn CurSearch Cursor CursorColumn CursorIM CursorLine CursorLineFold CursorLineNr CursorLineSign DiffAdd DiffChange DiffDelete DiffText Directory EndOfBuffer ErrorMsg FoldColumn Folded IncSearch LineNr LineNrAbove LineNrBelow MatchParen Menu MessageWindow ModeMsg MoreMsg NonText Normal Pmenu PmenuExtra PmenuExtraSel PmenuKind PmenuKindSel PmenuSbar PmenuSel PmenuThumb Question QuickFixLine Scrollbar Search SignColumn SpecialKey SpellBad SpellCap SpellLocal SpellRare StatusLine StatusLineNC StatusLineTerm StatusLineTermNC TabLine TabLineFill TabLineSel Terminal Title Tooltip VertSplit Visual VisualNOS WarningMsg WildMenu
-syn match vimHLGroup contained "Conceal"
+" GEN_SYN_VIM: vimHLGroup, START_STR='syn keyword vimHLGroup contained', END_STR=''
+syn keyword vimHLGroup contained ErrorMsg IncSearch ModeMsg NonText StatusLine StatusLineNC EndOfBuffer VertSplit VisualNOS DiffText PmenuSbar TabLineSel TabLineFill Cursor lCursor QuickFixLine CursorLineSign CursorLineFold CurSearch PmenuKind PmenuKindSel PmenuExtra PmenuExtraSel Normal Directory LineNr CursorLineNr MoreMsg Question Search SpellBad SpellCap SpellRare SpellLocal PmenuThumb Pmenu PmenuSel SpecialKey Title WarningMsg WildMenu Folded FoldColumn SignColumn Visual DiffAdd DiffChange DiffDelete TabLine CursorColumn CursorLine ColorColumn Conceal MatchParen StatusLineTerm StatusLineTermNC ToolbarLine ToolbarButton Menu Tooltip Scrollbar CursorIM LineNrAbove LineNrBelow
syn case match
" Function Names {{{2
-syn keyword vimFuncName contained abs argc assert_equal assert_match atan balloon_show bufexists bufwinid ceil ch_canread ch_getbufnr ch_read ch_status complete_check count deletebufline digraph_set eval exists_compiled extendnew findfile fnameescape foldtextresult get getchangelist getcmdcompltype getcompletion getfperm getline getpid getscriptinfo getwininfo glob2regpat histadd hlID indexof inputsecret isinf job_setoptions js_encode libcall list2str log10 mapnew matchdelete matchstrpos mzeval popup_atcursor popup_filter_menu popup_getpos popup_move pow prompt_setinterrupt prop_find prop_type_delete py3eval readblob reg_executing remote_expr remote_startserver reverse screenchars search searchpos setcellwidths setcursorcharpos setmatches settabwinvar shiftwidth sign_place simplify sound_clear spellbadword state strcharpart stridx strridx substitute synID systemlist taglist term_dumpload term_getcursor term_getstatus term_scrape term_setrestore test_autochdir test_gui_event test_null_dict test_null_string test_settime timer_pause toupper typename values winbufnr win_getid win_id2win winnr win_splitmove
-syn keyword vimFuncName contained acos argidx assert_equalfile assert_nobeep atan2 balloon_split buflisted bufwinnr changenr ch_close ch_getjob ch_readblob cindent complete_info cscope_connection did_filetype digraph_setlist eventhandler exp feedkeys flatten fnamemodify foreground getbufinfo getchar getcmdline getcurpos getfsize getloclist getpos gettabinfo getwinpos globpath histdel hlset input insert islocked job_start json_decode libcallnr listener_add luaeval mapset matchend max nextnonblank popup_beval popup_filter_yesno popup_hide popup_notification prevnonblank prompt_setprompt prop_list prop_type_get pyeval readdir reg_recording remote_foreground remove round screencol searchcount server2client setcharpos setenv setpos settagstack sign_define sign_placelist sin soundfold spellsuggest str2float strchars string strtrans swapfilelist synIDattr tabpagebuflist tan term_dumpwrite term_getjob term_gettitle term_sendkeys term_setsize test_feedinput test_ignore_error test_null_function test_option_not_set test_srand_seed timer_start tr undofile virtcol wincol win_gettype winlayout winrestcmd winwidth
-syn keyword vimFuncName contained add arglistid assert_exception assert_notequal autocmd_add blob2list bufload byte2line char2nr ch_close_in ch_info ch_readraw clearmatches confirm cursor diff_filler echoraw executable expand filereadable flattennew foldclosed fullcommand getbufline getcharmod getcmdpos getcursorcharpos getftime getmarklist getqflist gettabvar getwinposx has histget hostname inputdialog interrupt isnan job_status json_encode line listener_flush map match matchfuzzy menu_info nr2char popup_clear popup_findecho popup_list popup_setoptions printf prop_add prop_remove prop_type_list pyxeval readdirex reltime remote_peek rename rubyeval screenpos searchdecl serverlist setcharsearch setfperm setqflist setwinvar sign_getdefined sign_undefine sinh sound_playevent split str2list strdisplaywidth strlen strutf16len swapinfo synIDtrans tabpagenr tanh term_getaltscreen term_getline term_gettty term_setansicolors term_start test_garbagecollect_now test_mswin_event test_null_job test_override test_unknown timer_stop trim undotree virtcol2col windowsversion win_gotoid winline winrestview wordcount
-syn keyword vimFuncName contained and argv assert_fails assert_notmatch autocmd_delete browse bufloaded byteidx charclass chdir ch_log ch_sendexpr col copy debugbreak diff_hlID empty execute expandcmd filewritable float2nr foldclosedend funcref getbufoneline getcharpos getcmdscreenpos getcwd getftype getmatches getreg gettabwinvar getwinposy has_key histnr iconv inputlist invert items job_stop keys line2byte listener_remove maparg matchadd matchfuzzypos min or popup_close popup_findinfo popup_locate popup_settext prompt_getprompt prop_add_list prop_type_add pum_getpos rand readfile reltimefloat remote_read repeat screenattr screenrow searchpair setbufline setcmdline setline setreg sha256 sign_getplaced sign_unplace slice sound_playfile sqrt str2nr strftime strpart strwidth swapname synstack tabpagewinnr tempname term_getansicolors term_getscrolled terminalprops term_setapi term_wait test_garbagecollect_soon test_null_blob test_null_list test_refcount test_void timer_stopall trunc uniq visualmode win_execute winheight win_move_separator winsaveview writefile
-syn keyword vimFuncName contained append asin assert_false assert_report autocmd_get browsedir bufname byteidxcomp charcol ch_evalexpr ch_logfile ch_sendraw complete cos deepcopy digraph_get environ exepath expr10 filter floor foldlevel function getbufvar getcharsearch getcmdtype getenv getimstatus getmousepos getreginfo gettagstack getwinvar haslocaldir hlexists indent inputrestore isabsolutepath job_getchannel join keytrans lispindent localtime mapcheck matchaddpos matchlist mkdir pathshorten popup_create popup_findpreview popup_menu popup_show prompt_setcallback prop_clear prop_type_change pumvisible range reduce reltimestr remote_send resolve screenchar screenstring searchpairpos setbufvar setcmdpos setloclist settabvar shellescape sign_jump sign_unplacelist sort sound_stop srand strcharlen strgetchar strptime submatch synconcealed system tagfiles term_dumpdiff term_getattr term_getsize term_list term_setkill test_alloc_fail test_getvalue test_null_channel test_null_partial test_setmouse timer_info tolower type utf16idx wildmenumode win_findbuf win_id2tabwin win_move_statusline win_screenpos xor
-syn keyword vimFuncName contained appendbufline assert_beeps assert_inrange assert_true balloon_gettext bufadd bufnr call charidx ch_evalraw ch_open ch_setoptions complete_add cosh delete digraph_getlist escape exists extend finddir fmod foldtext garbagecollect getcellwidths getcharstr getcmdwintype getfontname getjumplist getmouseshape getregtype gettext glob hasmapto hlget index inputsave isdirectory job_info js_decode len list2blob log maplist matcharg matchstr mode perleval popup_dialog popup_getoptions
+" GEN_SYN_VIM: vimFuncName, START_STR='syn keyword vimFuncName contained', END_STR=''
+syn keyword vimFuncName contained abs acos add and append appendbufline argc argidx arglistid argv asin assert_beeps assert_equal assert_equalfile assert_exception assert_fails assert_false assert_inrange assert_match assert_nobeep assert_notequal assert_notmatch assert_report assert_true atan atan2 autocmd_add autocmd_delete autocmd_get balloon_gettext balloon_show balloon_split blob2list browse browsedir bufadd bufexists buflisted bufload bufloaded bufname bufnr bufwinid bufwinnr byte2line byteidx byteidxcomp call ceil ch_canread ch_close ch_close_in ch_evalexpr ch_evalraw ch_getbufnr ch_getjob ch_info ch_log ch_logfile ch_open ch_read ch_readblob ch_readraw ch_sendexpr ch_sendraw ch_setoptions ch_status changenr char2nr charclass charcol charidx chdir cindent
+syn keyword vimFuncName contained clearmatches col complete complete_add complete_check complete_info confirm copy cos cosh count cscope_connection cursor debugbreak deepcopy delete deletebufline did_filetype diff diff_filler diff_hlID digraph_get digraph_getlist digraph_set digraph_setlist echoraw empty environ err_teapot escape eval eventhandler executable execute exepath exists exists_compiled exp expand expandcmd extend extendnew feedkeys filereadable filewritable filter finddir findfile flatten flattennew float2nr floor fmod fnameescape fnamemodify foldclosed foldclosedend foldlevel foldtext foldtextresult foreach foreground fullcommand funcref function garbagecollect get getbufinfo getbufline getbufoneline getbufvar getcellwidths getchangelist getchar getcharmod
+syn keyword vimFuncName contained getcharpos getcharsearch getcharstr getcmdcompltype getcmdline getcmdpos getcmdscreenpos getcmdtype getcmdwintype getcompletion getcurpos getcursorcharpos getcwd getenv getfontname getfperm getfsize getftime getftype getimstatus getjumplist getline getloclist getmarklist getmatches getmousepos getmouseshape getpid getpos getqflist getreg getreginfo getregion getregtype getscriptinfo gettabinfo gettabvar gettabwinvar gettagstack gettext getwininfo getwinpos getwinposx getwinposy getwinvar glob glob2regpat globpath has has_key haslocaldir hasmapto histadd histdel histget histnr hlID hlexists hlget hlset hostname iconv indent index indexof input inputdialog inputlist inputrestore inputsave inputsecret insert instanceof interrupt
+syn keyword vimFuncName contained invert isabsolutepath isdirectory isinf islocked isnan items job_getchannel job_info job_setoptions job_start job_status job_stop join js_decode js_encode json_decode json_encode keys keytrans len libcall libcallnr line line2byte lispindent list2blob list2str listener_add listener_flush listener_remove localtime log log10 luaeval map maparg mapcheck maplist mapnew mapset match matchadd matchaddpos matcharg matchbufline matchdelete matchend matchfuzzy matchfuzzypos matchlist matchstr matchstrlist matchstrpos max menu_info min mkdir mode mzeval nextnonblank nr2char or pathshorten perleval popup_atcursor popup_beval popup_clear popup_close popup_create popup_dialog popup_filter_menu popup_filter_yesno popup_findecho popup_findinfo
+syn keyword vimFuncName contained popup_findpreview popup_getoptions popup_getpos popup_hide popup_list popup_locate popup_menu popup_move popup_notification popup_setoptions popup_settext popup_show pow prevnonblank printf prompt_getprompt prompt_setcallback prompt_setinterrupt prompt_setprompt prop_add prop_add_list prop_clear prop_find prop_list prop_remove prop_type_add prop_type_change prop_type_delete prop_type_get prop_type_list pum_getpos pumvisible py3eval pyeval pyxeval rand range readblob readdir readdirex readfile reduce reg_executing reg_recording reltime reltimefloat reltimestr remote_expr remote_foreground remote_peek remote_read remote_send remote_startserver remove rename repeat resolve reverse round rubyeval screenattr screenchar screenchars
+syn keyword vimFuncName contained screencol screenpos screenrow screenstring search searchcount searchdecl searchpair searchpairpos searchpos server2client serverlist setbufline setbufvar setcellwidths setcharpos setcharsearch setcmdline setcmdpos setcursorcharpos setenv setfperm setline setloclist setmatches setpos setqflist setreg settabvar settabwinvar settagstack setwinvar sha256 shellescape shiftwidth sign_define sign_getdefined sign_getplaced sign_jump sign_place sign_placelist sign_undefine sign_unplace sign_unplacelist simplify sin sinh slice sort sound_clear sound_playevent sound_playfile sound_stop soundfold spellbadword spellsuggest split sqrt srand state str2float str2list str2nr strcharlen strcharpart strchars strdisplaywidth strftime strgetchar stridx
+syn keyword vimFuncName contained string strlen strpart strptime strridx strtrans strutf16len strwidth submatch substitute swapfilelist swapinfo swapname synID synIDattr synIDtrans synconcealed synstack system systemlist tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname term_dumpdiff term_dumpload term_dumpwrite term_getaltscreen term_getansicolors term_getattr term_getcursor term_getjob term_getline term_getscrolled term_getsize term_getstatus term_gettitle term_gettty term_list term_scrape term_sendkeys term_setansicolors term_setapi term_setkill term_setrestore term_setsize term_start term_wait terminalprops test_alloc_fail test_autochdir test_feedinput test_garbagecollect_now test_garbagecollect_soon test_getvalue test_gui_event test_ignore_error
+syn keyword vimFuncName contained test_mswin_event test_null_blob test_null_channel test_null_dict test_null_function test_null_job test_null_list test_null_partial test_null_string test_option_not_set test_override test_refcount test_setmouse test_settime test_srand_seed test_unknown test_void timer_info timer_pause timer_start timer_stop timer_stopall tolower toupper tr trim trunc type typename undofile undotree uniq utf16idx values virtcol virtcol2col visualmode wildmenumode win_execute win_findbuf win_getid win_gettype win_gotoid win_id2tabwin win_id2win win_move_separator win_move_statusline win_screenpos win_splitmove winbufnr wincol windowsversion winheight winlayout winline winnr winrestcmd winrestview winsaveview winwidth wordcount writefile xor
"--- syntax here and above generated by mkvimvim ---
" Special Vim Highlighting (not automatic) {{{1
@@ -154,9 +174,6 @@ else
com! -nargs=* VimFoldt <args>
endif
-" commands not picked up by the generator (due to non-standard format) {{{2
-syn keyword vimCommand contained py3
-
" Deprecated variable options {{{2
if exists("g:vim_minlines")
let g:vimsyn_minlines= g:vim_minlines
@@ -177,17 +194,19 @@ endif
" Numbers {{{2
" =======
-syn match vimNumber '\<\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
-syn match vimNumber '-\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
-syn match vimNumber '\<0[xX]\x\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
-syn match vimNumber '\%(^\|\A\)\zs#\x\{6}' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
-syn match vimNumber '\<0[zZ][a-zA-Z0-9.]\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
-syn match vimNumber '0[0-7]\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
-syn match vimNumber '0[bB][01]\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+syn case ignore
+syn match vimNumber '\<\d\+\%(\.\d\+\%(e[+-]\=\d\+\)\=\)\=' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0b[01]\+' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0o\=\o\+' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0x\x\+' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0z\%(\x\x\)\+\%(\.\%(\x\x\)\+\)*' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\%(^\|\A\)\zs#\x\{6}' skipwhite nextgroup=vimGlobal,vimSubst1,vimCommand,vimComment,vim9Comment
+syn case match
" All vimCommands are contained by vimIsCommand. {{{2
-syn match vimCmdSep "[:|]\+" skipwhite nextgroup=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimEcho,vimEchoHL,vimExecute,vimIsCommand,vimExtCmd,vimFilter,vimGlobal,vimHighlight,vimLet,vimMap,vimMark,vimNorm,vimSet,vimSyntax,vimUnlet,vimUnmap,vimUserCmd
-syn match vimIsCommand "\<\h\w*\>" contains=vimCommand
+syn cluster vimCmdList contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimDef,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimMap,vimMark,vimNotFunc,vimNorm,vimSet,vimSyntax,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate
+syn match vimCmdSep "[:|]\+" skipwhite nextgroup=@vimCmdList,vimSubst1
+syn match vimIsCommand "\<\%(\h\w*\|[23]mat\%[ch]\)\>" contains=vimCommand
syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>"
syn match vimVar "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
syn match vimVar "\s\zs&\%([lg]:\)\=\a\+\>"
@@ -196,6 +215,8 @@ syn match vimVar "\s\zs&t_k;"
syn match vimFBVar contained "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
syn keyword vimCommand contained in
+syn cluster vimExprList contains=vimEnvvar,vimFunc,vimFuncVar,vimNumber,vimOper,vimOperParen,vimLetRegister,vimString,vimVar
+
" Insertions And Appends: insert append {{{2
" (buftype != nofile test avoids having append, change, insert show up in the command window)
" =======================
@@ -207,11 +228,12 @@ endif
" Behave! {{{2
" =======
-syn match vimBehave "\<be\%[have]\>" skipwhite nextgroup=vimBehaveModel,vimBehaveError
-syn keyword vimBehaveModel contained mswin xterm
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror")
syn match vimBehaveError contained "[^ ]\+"
endif
+syn match vimBehave "\<be\%[have]\>" nextgroup=vimBehaveBang,vimBehaveModel,vimBehaveError skipwhite
+syn match vimBehaveBang contained "\a\@1<=!" nextgroup=vimBehaveModel skipwhite
+syn keyword vimBehaveModel contained mswin xterm
" Filetypes {{{2
" =========
@@ -224,25 +246,29 @@ syn keyword vimFTOption contained detect indent off on plugin
" Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2
" ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking.
-syn cluster vimAugroupList contains=vimAugroup,vimIsCommand,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimNotFunc,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vim9Comment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vim9Comment,vimLet,vimSet,vimAutoCmd,vimRegion,vimSynLine,vimNotation,vimCtrlChar,vimFuncVar,vimContinue,vimOption
+syn cluster vimAugroupList contains=@vimCmdList,vimFilter,vimFunc,vimLineComment,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vim9Comment,vimString,vimSubst,vimRegister,vimCmplxRepeat,vimNotation,vimCtrlChar,vimFuncVar,vimContinue
+syn match vimAugroup "\<aug\%[roup]\>" contains=vimAugroupKey,vimAugroupBang skipwhite nextgroup=vimAugroupBang,vimAutoCmdGroup
if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'a'
- syn region vimAugroup fold matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
+ syn region vimAugroup fold start="\<aug\%[roup]\>\ze\s\+\%([eE][nN][dD]\)\@!\S\+" matchgroup=vimAugroupKey end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList,vimAugroupkey skipwhite nextgroup=vimAugroupEnd
else
- syn region vimAugroup matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
+ syn region vimAugroup start="\<aug\%[roup]\>\ze\s\+\%([eE][nN][dD]\)\@!\S\+" matchgroup=vimAugroupKey end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList,vimAugroupkey skipwhite nextgroup=vimAugroupEnd
endif
-syn match vimAugroup "aug\%[roup]!" contains=vimAugroupKey
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noaugrouperror")
- syn match vimAugroupError "\<aug\%[roup]\>\s\+[eE][nN][dD]\>"
+ syn match vimAugroupError "\<aug\%[roup]\>\s\+[eE][nN][dD]\>"
endif
-syn keyword vimAugroupKey contained aug[roup]
+
+syn match vimAutoCmdGroup contained "\S\+"
+syn match vimAugroupEnd contained "\c\<END\>"
+syn match vimAugroupBang contained "\a\@1<=!" skipwhite nextgroup=vimAutoCmdGroup
+syn keyword vimAugroupKey contained aug[roup] skipwhite nextgroup=vimAugroupBang,vimAutoCmdGroup,vimAugroupEnd
" Operators: {{{2
" =========
-syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimType,vimRegister,vimContinue,vim9Comment,vimVar
+syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimRegister,@vimContinue,vim9Comment,vimVar
syn match vimOper "||\|&&\|[-+*/%.!]" skipwhite nextgroup=vimString,vimSpecFile
syn match vimOper "\%#=1\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\|!\~#\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
syn match vimOper "\(\<is\|\<isnot\)[?#]\{0,2}\>" skipwhite nextgroup=vimString,vimSpecFile
-syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=vimoperStar,@vimOperGroup
+syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=@vimOperGroup
syn region vimOperParen matchgroup=vimSep start="#\={" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noopererror")
syn match vimOperError ")"
@@ -250,33 +276,70 @@ endif
" Functions : Tag is provided for those who wish to highlight tagged functions {{{2
" =========
-syn cluster vimFuncList contains=vimCommand,vimFunctionError,vimFuncKey,Tag,vimFuncSID
-syn cluster vimFuncBodyList contains=vimAbb,vimAddress,vimAugroupKey,vimAutoCmd,vimCmplxRepeat,vimComment,vim9Comment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimEnvvar,vimExecute,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLetHereDoc,vimLineComment,vimMap,vimMark,vimNorm,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSearch,vimSet,vimSpecFile,vimString,vimSubst,vimSynLine,vimUnmap,vimUserCommand
-syn match vimFunction "\<\(fu\%[nction]\)!\=\s\+\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)*\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
-syn match vimFunction "\<def!\=\s\+\%(\i\|[#.]\|{.\{-1,}}\)*\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
-"syn match vimFunction "\<def!\=\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
+syn cluster vimFuncList contains=vimFuncBang,vimFunctionError,vimFuncKey,vimFuncSID,Tag
+syn cluster vimDefList contains=vimFuncBang,vimFunctionError,vimDefKey,vimFuncSID,Tag
+syn cluster vimFuncBodyList contains=@vimCmdList,vimCmplxRepeat,vimComment,vimContinue,vimCtrlChar,vimDef,vimEnvvar,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimLetHereDoc,vimLineComment,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSearch,vimSpecFile,vimString,vimSubst
+syn cluster vimDefBodyList contains=@vimCmdList,vimCmplxRepeat,vim9Comment,vimContinue,vimCtrlChar,vimDef,vimEnvvar,vimFBVar,vimFunc,vimFunction,vimLetHereDoc,vim9LineComment,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSearch,vimSpecFile,vimString,vimSubst
+
+syn region vimFuncPattern contained matchgroup=vimOper start="/" end="$" contains=@vimSubstList
+syn match vimFunction "\<fu\%[nction]\>" skipwhite nextgroup=vimCmdSep,vimComment,vimFuncPattern contains=vimFuncKey
+syn match vimDef "\<def\>" skipwhite nextgroup=vimCmdSep,vimComment,vimFuncPattern contains=vimDefKey
+
+syn match vimFunction "\<fu\%[nction]\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+" contains=@vimFuncList skipwhite nextgroup=vimFuncParams
+syn match vimDef "\<def\s\+new\%(\i\|{.\{-1,}}\)\+" contains=@vimDefList nextgroup=vimDefParams
+syn match vimDef "\<def\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+" contains=@vimDefList nextgroup=vimDefParams
+
+syn match vimFuncComment contained +".*+ skipwhite skipnl nextgroup=vimFuncBody,vimEndfunction
+syn match vimDefComment contained "#.*" skipwhite skipnl nextgroup=vimDefBody,vimEnddef
+
+syn match vimFuncBang contained "!"
+syn match vimFuncSID contained "\c<sid>"
+syn match vimFuncSID contained "\<[sg]:"
+syn keyword vimFuncKey contained fu[nction]
+syn keyword vimDefKey contained def
+
+syn region vimFuncParams contained matchgroup=Delimiter start="(" skip=+\n\s*\\\|\n\s*"\\ + end=")" skipwhite skipnl nextgroup=vimFuncBody,vimFuncComment,vimEndfunction,vimFuncMod contains=vimFuncParam,@vimContinue
+syn region vimDefParams contained matchgroup=Delimiter start="(" end=")" skipwhite skipnl nextgroup=vimDefBody,vimDefComment,vimEnddef,vimReturnType contains=vimDefParam,vim9Comment
+syn match vimFuncParam contained "\<\h\w*\>\|\.\.\." skipwhite nextgroup=vimFuncParamEquals
+syn match vimDefParam contained "\<\h\w*\>" skipwhite nextgroup=vimParamType,vimFuncParamEquals
+
+syn match vimFuncParamEquals contained "=" skipwhite nextgroup=@vimExprList
+syn match vimFuncMod contained "\<\%(abort\|closure\|dict\|range\)\>" skipwhite skipnl nextgroup=vimFuncBody,vimFuncComment,vimEndfunction,vimFuncMod
+
+syn region vimFuncBody contained start="^" matchgroup=vimCommand end="\<endfu\%[nction]\>" contains=@vimFuncBodyList
+syn region vimDefBody contained start="^" matchgroup=vimCommand end="\<enddef\>" contains=@vimDefBodyList
+
+syn match vimEndfunction "\<endf\%[unction]\>"
+syn match vimEnddef "\<enddef\>"
if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f'
- syn region vimFuncBody contained fold start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\|enddef\>\)" contains=@vimFuncBodyList
-else
- syn region vimFuncBody contained start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\|enddef\>\)" contains=@vimFuncBodyList
+ syn region vimFuncFold start="\<fu\%[nction]\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+\s*(" end="\<endf\%[unction]\>" contains=vimFunction fold keepend transparent
+ syn region vimFuncFold start="\<def\>!\=\s*\%(<[sS][iI][dD]>\|[sg]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)\+(" end="\<enddef\>" contains=vimDef fold keepend transparent
+ syn region vimFuncFold start="\<def\s\+new\%(\i\|{.\{-1,}}\)\+(" end="\<enddef\>" contains=vimDef fold keepend transparent
endif
-syn match vimFuncVar contained "a:\(\K\k*\|\d\+\)"
-syn match vimFuncSID contained "\c<sid>\|\<s:"
-syn keyword vimFuncKey contained fu[nction]
-syn keyword vimFuncKey contained def
-syn match vimFuncBlank contained "\s\+"
-syn keyword vimPattern contained start skip end
+syn match vimFuncVar contained "a:\%(\K\k*\|\d\+\)\>"
+syn match vimFuncBlank contained "\s\+"
+" Types: {{{2
+" =====
" vimTypes : new for vim9
-syn match vimType ":\s*\zs\<\(bool\|number\|float\|string\|blob\|list<\|dict<\|job\|channel\|func\)\>"
+syn region vimReturnType contained start=":\s" end="$" matchgroup=vim9Comment end="\ze#" skipwhite skipnl nextgroup=vimDefBody,vimDefComment,vimEnddef contains=vimTypeSep transparent
+syn match vimParamType contained ":\s\+\a" skipwhite skipnl nextgroup=vimFuncParamEquals contains=vimTypeSep,@vimType
+
+syn match vimTypeSep contained ":\s\@=" skipwhite nextgroup=@vimType
+syn keyword vimType contained any blob bool channel float job number string void
+syn match vimType contained "\<func\>"
+syn region vimCompoundType contained matchgroup=vimType start="\<func(" end=")" nextgroup=vimTypeSep contains=@vimType oneline transparent
+syn region vimCompoundType contained matchgroup=vimType start="\<\%(list\|dict\)<" end=">" contains=@vimType oneline transparent
+syn match vimUserType contained "\<\u\w*\>"
+
+syn cluster vimType contains=vimType,vimCompoundType,vimUserType
" Keymaps: (Vim Project Addition) {{{2
" =======
-" TODO: autogenerated vimCommand keyword list does not handle all abbreviations
-" : handle Vim9 script comments when something like #13104 is merged
+" TODO: handle Vim9 script comments when something like #13104 is merged
syn match vimKeymapStart "^" contained skipwhite nextgroup=vimKeymapLhs,vimKeymapLineComment
syn match vimKeymapLhs "\S\+" contained skipwhite nextgroup=vimKeymapRhs contains=vimNotation
syn match vimKeymapRhs "\S\+" contained skipwhite nextgroup=vimKeymapTailComment contains=vimNotation
@@ -287,17 +350,17 @@ syn region vimKeymap matchgroup=vimCommand start="\<loadk\%[eymap]\>" end="\%$"
" Special Filenames, Modifiers, Extension Removal: {{{2
" ===============================================
-syn match vimSpecFile "<c\(word\|WORD\)>" nextgroup=vimSpecFileMod,vimSubst
-syn match vimSpecFile "<\([acs]file\|amatch\|abuf\)>" nextgroup=vimSpecFileMod,vimSubst
-syn match vimSpecFile "\s%[ \t:]"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst
-syn match vimSpecFile "\s%$"ms=s+1 nextgroup=vimSpecFileMod,vimSubst
-syn match vimSpecFile "\s%<"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst
-syn match vimSpecFile "#\d\+\|[#%]<\>" nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFile "<c\(word\|WORD\)>" nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "<\([acs]file\|amatch\|abuf\)>" nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "\s%[ \t:]"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "\s%$"ms=s+1 nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "\s%<"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst1
+syn match vimSpecFile "#\d\+\|[#%]<\>" nextgroup=vimSpecFileMod,vimSubst1
syn match vimSpecFileMod "\(:[phtre]\)\+" contained
" User-Specified Commands: {{{2
" =======================
-syn cluster vimUserCmdList contains=vimAddress,vimSyntax,vimHighlight,vimAutoCmd,vimCmplxRepeat,vimComment,vim9Comment,vimCtrlChar,vimEscapeBrace,vimFunc,vimFuncName,vimFunction,vimFunctionError,vimIsCommand,vimMark,vimNotation,vimNumber,vimOper,vimRegion,vimRegister,vimLet,vimSet,vimSetEqual,vimSetString,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange,vimSynLine
+syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,vimComment,vim9Comment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
syn keyword vimUserCommand contained com[mand]
syn match vimUserCmd "\<com\%[mand]!\=\>.*$" contains=vimUserAttrb,vimUserAttrbError,vimUserCommand,@vimUserCmdList,vimComFilter
syn match vimUserAttrbError contained "-\a\+\ze\s"
@@ -314,9 +377,10 @@ if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
endif
syn case ignore
syn keyword vimUserAttrbKey contained bar ban[g] cou[nt] ra[nge] com[plete] n[args] re[gister]
-syn keyword vimUserAttrbCmplt contained augroup buffer behave color command compiler cscope dir environment event expression file file_in_path filetype function help highlight history locale mapping menu option packadd shellcmd sign syntax syntime tag tag_listfiles user var
+" GEN_SYN_VIM: vimUserAttrbCmplt, START_STR='syn keyword vimUserAttrbCmplt contained', END_STR=''
+syn keyword vimUserAttrbCmplt contained arglist augroup behave buffer color command compiler cscope diff_buffer dir environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages syntax syntime option packadd runtime shellcmd sign tag tag_listfiles user var breakpoint scriptnames
syn keyword vimUserAttrbCmplt contained custom customlist nextgroup=vimUserAttrbCmpltFunc,vimUserCmdError
-syn match vimUserAttrbCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%(#\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
+syn match vimUserAttrbCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
syn case match
syn match vimUserAttrbCmplt contained "custom,\u\w*"
@@ -353,45 +417,54 @@ syn match vimNotPatSep contained "\\\\"
syn cluster vimStringGroup contains=vimEscape,vimEscapeBrace,vimPatSep,vimNotPatSep,vimPatSepErr,vimPatSepZone,@Spell
syn region vimString oneline keepend start=+[^a-zA-Z>!\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ contains=@vimStringGroup
syn region vimString oneline keepend start=+[^a-zA-Z>!\\@]'+lc=1 end=+'+
-syn region vimString oneline start=+=!+lc=1 skip=+\\\\\|\\!+ end=+!+ contains=@vimStringGroup
-syn region vimString oneline start="=+"lc=1 skip="\\\\\|\\+" end="+" contains=@vimStringGroup
"syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup " see tst45.vim
syn match vimString contained +"[^"]*\\$+ skipnl nextgroup=vimStringCont
syn match vimStringCont contained +\(\\\\\|.\)\{-}[^\\]"+
syn match vimEscape contained "\\."
+" syn match vimEscape contained +\\[befnrt\"]+
+syn match vimEscape contained "\\\o\{1,3}\|\\[xX]\x\{1,2}\|\\u\x\{1,4}\|\\U\x\{1,8}"
+syn match vimEscape contained "\\<" contains=vimNotation
+syn match vimEscape contained "\\<\*[^>]*>\=>"
+
+syn region vimString oneline start=+$'+ skip=+''+ end=+'+ contains=vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region vimString oneline start=+$"+ end=+"+ contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList
+syn match vimStringInterpolationBrace contained "{{"
+syn match vimStringInterpolationBrace contained "}}"
" Substitutions: {{{2
" =============
syn cluster vimSubstList contains=vimPatSep,vimPatRegion,vimPatSepErr,vimSubstTwoBS,vimSubstRange,vimNotation
syn cluster vimSubstRepList contains=vimSubstSubstr,vimSubstTwoBS,vimNotation
syn cluster vimSubstList add=vimCollection
-syn match vimSubst "\(:\+\s*\|^\s*\||\s*\)\<\%(\<s\%[ubstitute]\>\|\<sm\%[agic]\>\|\<sno\%[magic]\>\)[:#[:alpha:]]\@!" nextgroup=vimSubstPat
-"syn match vimSubst "\%(^\|[^\\]\)\<s\%[ubstitute]\>[:#[:alpha:]]\@!" nextgroup=vimSubstPat contained
-syn match vimSubst "\%(^\|[^\\\"']\)\<s\%[ubstitute]\>[:#[:alpha:]\"']\@!" nextgroup=vimSubstPat contained
-syn match vimSubst "/\zs\<s\%[ubstitute]\>\ze/" nextgroup=vimSubstPat
-syn match vimSubst "\(:\+\s*\|^\s*\)s\ze#.\{-}#.\{-}#" nextgroup=vimSubstPat
-syn match vimSubst1 contained "\<s\%[ubstitute]\>" nextgroup=vimSubstPat
-syn match vimSubst2 contained "s\%[ubstitute]\>" nextgroup=vimSubstPat
-syn region vimSubstPat contained matchgroup=vimSubstDelim start="\z([^a-zA-Z( \t[\]&]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1 contains=@vimSubstList nextgroup=vimSubstRep4 oneline
-syn region vimSubstRep4 contained matchgroup=vimSubstDelim start="\z(.\)" skip="\\\\\|\\\z1" end="\z1" matchgroup=vimNotation end="<[cC][rR]>" contains=@vimSubstRepList nextgroup=vimSubstFlagErr oneline
-syn region vimCollection contained transparent start="\\\@<!\[" skip="\\\[" end="\]" contains=vimCollClass
-syn match vimCollClassErr contained "\[:.\{-\}:\]"
-syn match vimCollClass contained transparent "\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|retu\%[rn]\|tab\|escape\|backspace\):\]"
-syn match vimSubstSubstr contained "\\z\=\d"
-syn match vimSubstTwoBS contained "\\\\"
-syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags
-syn match vimSubstFlags contained "[&cegiIlnpr#]\+"
+syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>[\"#|]\@!" nextgroup=vimSubstPat
+syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)_\@=" nextgroup=vimSubstPat
+syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\ze#.\{-}#.\{-}#" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>[\"#|]\@!" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)_\@=" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\ze#.\{-}#.\{-}#" nextgroup=vimSubstPat
+" TODO: Vim9 illegal separators for abbreviated :s form are [-.:], :su\%[...] required
+" : # is allowed but "not recommended" (see :h pattern-delimiter)
+syn region vimSubstPat contained matchgroup=vimSubstDelim start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1 contains=@vimSubstList nextgroup=vimSubstRep4 oneline
+syn region vimSubstRep4 contained matchgroup=vimSubstDelim start="\z(.\)" skip="\\\\\|\\\z1" end="\z1" matchgroup=vimNotation end="<[cC][rR]>" contains=@vimSubstRepList nextgroup=vimSubstFlagErr oneline
+syn region vimCollection contained transparent start="\\\@<!\[" skip="\\\[" end="\]" contains=vimCollClass
+syn match vimCollClassErr contained "\[:.\{-\}:\]"
+syn match vimCollClass contained transparent "\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|retu\%[rn]\|tab\|escape\|backspace\):\]"
+syn match vimSubstSubstr contained "\\z\=\d"
+syn match vimSubstTwoBS contained "\\\\"
+syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags
+syn match vimSubstFlags contained "[&cegiIlnpr#]\+"
" 'String': {{{2
syn match vimString "[^(,]'[^']\{-}\zs'"
" Marks, Registers, Addresses, Filters: {{{2
-syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst
-syn match vimMark "'[<>]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst
-syn match vimMark ",\zs'[<>]\ze" nextgroup=vimFilter,vimMarkNumber,vimSubst
-syn match vimMark "[!,:]\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst
-syn match vimMark "\<norm\%[al]\s\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst
-syn match vimMarkNumber "[-+]\d\+" contained contains=vimOper nextgroup=vimSubst2
+syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark "'[<>]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark ",\zs'[<>]\ze" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark "[!,:]\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMark "\<norm\%[al]\s\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
+syn match vimMarkNumber "[-+]\d\+" contained contains=vimOper nextgroup=vimSubst1
syn match vimPlainMark contained "'[a-zA-Z0-9]"
syn match vimRange "[`'][a-zA-Z0-9],[`'][a-zA-Z0-9]" contains=vimMark skipwhite nextgroup=vimFilter
@@ -437,9 +510,11 @@ syn keyword vimLet var skipwhite nextgroup=vimVar,vimFuncVar,vimLetHereDoc
" For: {{{2
" ===
syn keyword vimFor for skipwhite nextgroup=vimVar,vimVarList
+
" Abbreviations: {{{2
" =============
-syn keyword vimAbb ab[breviate] ca[bbrev] inorea[bbrev] cnorea[bbrev] norea[bbrev] ia[bbrev] skipwhite nextgroup=vimMapMod,vimMapLhs
+" GEN_SYN_VIM: vimCommand abbrev, START_STR='syn keyword vimAbb', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs'
+syn keyword vimAbb ab[breviate] ca[bbrev] cnorea[bbrev] cuna[bbrev] ia[bbrev] inorea[bbrev] iuna[bbrev] norea[bbrev] una[bbreviate] skipwhite nextgroup=vimMapMod,vimMapLhs
" Autocmd: {{{2
" =======
@@ -451,59 +526,104 @@ syn match vimAutoCmdMod "\(++\)\=\(once\|nested\)"
" Echo And Execute: -- prefer strings! {{{2
" ================
-syn region vimEcho oneline excludenl matchgroup=vimCommand start="\<ec\%[ho]\>" skip="\(\\\\\)*\\|" end="$\||" contains=vimFunc,vimFuncVar,vimString,vimVar
-syn region vimExecute oneline excludenl matchgroup=vimCommand start="\<exe\%[cute]\>" skip="\(\\\\\)*\\|" end="$\||\|<[cC][rR]>" contains=vimFuncVar,vimIsCommand,vimOper,vimNotation,vimOperParen,vimString,vimVar
-syn match vimEchoHL "echohl\=" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchoHLNone
+" NOTE: No trailing comments
+
+syn region vimEcho
+ \ matchgroup=vimCommand
+ \ start="\<ec\%[ho]\>"
+ \ start="\<echoe\%[rr]\>"
+ \ start="\<echom\%[sg]\>"
+ \ start="\<echoc\%[onsole]\>"
+ \ start="\<echon\>"
+ \ start="\<echow\%[indow]\>"
+ \ skip=+\\|\|\n\s*\\\|\n\s*"\\ +
+ \ matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimExprList transparent
+
+syn match vimEchohl "\<echohl\=\>" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchohlNone
syn case ignore
-syn keyword vimEchoHLNone none
+syn keyword vimEchohlNone contained none
syn case match
+syn cluster vimEcho contains=vimEcho,vimEchohl
+
+syn region vimExecute matchgroup=vimCommand start="\<exe\%[cute]\>" skip=+\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimExprList transparent
+
" Maps: {{{2
" ====
-syn match vimMap "\<map\>!\=\ze\s*[^(]" skipwhite nextgroup=vimMapMod,vimMapLhs
-syn keyword vimMap cm[ap] cno[remap] im[ap] ino[remap] lm[ap] ln[oremap] nm[ap] nn[oremap] no[remap] om[ap] ono[remap] smap snor[emap] tno[remap] tm[ap] vm[ap] vmapc[lear] vn[oremap] xm[ap] xn[oremap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs
-syn keyword vimMap mapc[lear] smapc[lear]
-syn keyword vimUnmap cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] sunm[ap] tunma[p] unm[ap] unm[ap] vu[nmap] xu[nmap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs
-syn match vimMapLhs contained "\S\+" contains=vimNotation,vimCtrlChar skipwhite nextgroup=vimMapRhs
-syn match vimMapBang contained "!" skipwhite nextgroup=vimMapMod,vimMapLhs
+syn match vimMap "\<map\>\ze\s*(\@!" skipwhite nextgroup=vimMapMod,vimMapLhs
+syn match vimMap "\<map!" contains=vimMapBang skipwhite nextgroup=vimMapMod,vimMapLhs
+" GEN_SYN_VIM: vimCommand map, START_STR='syn keyword vimMap', END_STR='skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs'
+syn keyword vimMap cm[ap] cno[remap] im[ap] ino[remap] lm[ap] ln[oremap] nm[ap] nn[oremap] no[remap] om[ap] ono[remap] smap snor[emap] tma[p] tno[remap] vm[ap] vn[oremap] xm[ap] xn[oremap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs
+" GEN_SYN_VIM: vimCommand mapclear, START_STR='syn keyword vimMap', END_STR='skipwhite nextgroup=vimMapMod'
+syn keyword vimMap cmapc[lear] imapc[lear] lmapc[lear] nmapc[lear] omapc[lear] smapc[lear] tmapc[lear] vmapc[lear] xmapc[lear] skipwhite nextgroup=vimMapMod
+syn keyword vimMap mapc[lear] skipwhite nextgroup=vimMapBang,vimMapMod
+" GEN_SYN_VIM: vimCommand unmap, START_STR='syn keyword vimUnmap', END_STR='skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs'
+syn keyword vimUnmap cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] sunm[ap] tunma[p] unm[ap] vu[nmap] xu[nmap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs
+syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation skipwhite nextgroup=vimMapRhs
+syn match vimMapLhs contained "\%(.\|\S\)\+\ze\s*$" contains=vimCtrlChar,vimNotation skipwhite skipnl nextgroup=vimMapRhsContinue
+syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs
syn match vimMapMod contained "\%#=1\c<\(buffer\|expr\|\(local\)\=leader\|nowait\|plug\|script\|sid\|unique\|silent\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs
-syn match vimMapRhs contained ".*" contains=vimNotation,vimCtrlChar skipnl nextgroup=vimMapRhsExtend
-syn match vimMapRhsExtend contained "^\s*\\.*$" contains=vimContinue
+syn region vimMapRhs contained start="\S" skip=+\\|\|\@1<=|\|\n\s*\\\|\n\s*"\\ + end="|" end="$" contains=@vimContinue,vimCtrlChar,vimNotation skipnl nextgroup=vimMapRhsContinue
+" assume a continuation comment introduces the RHS
+syn region vimMapRhsContinue contained start=+^\s*\%(\\\|"\\ \)+ skip=+\\|\|\@1<=|\|\n\s*\\\|\n\s*"\\ + end="|" end="$" contains=@vimContinue,vimCtrlChar,vimNotation
syn case ignore
syn keyword vimMapModKey contained buffer expr leader localleader nowait plug script sid silent unique
syn case match
" Menus: {{{2
" =====
-syn cluster vimMenuList contains=vimMenuBang,vimMenuPriority,vimMenuName,vimMenuMod
-syn keyword vimCommand am[enu] an[oremenu] aun[menu] cme[nu] cnoreme[nu] cunme[nu] ime[nu] inoreme[nu] iunme[nu] me[nu] nme[nu] nnoreme[nu] noreme[nu] nunme[nu] ome[nu] onoreme[nu] ounme[nu] unme[nu] vme[nu] vnoreme[nu] vunme[nu] skipwhite nextgroup=@vimMenuList
-syn match vimMenuName "[^ \t\\<]\+" contained nextgroup=vimMenuNameMore,vimMenuMap
-syn match vimMenuPriority "\d\+\(\.\d\+\)*" contained skipwhite nextgroup=vimMenuName
-syn match vimMenuNameMore "\c\\\s\|<tab>\|\\\." contained nextgroup=vimMenuName,vimMenuNameMore contains=vimNotation
-syn match vimMenuMod contained "\c<\(script\|silent\)\+>" skipwhite contains=vimMapModKey,vimMapModErr nextgroup=@vimMenuList
-syn match vimMenuMap "\s" contained skipwhite nextgroup=vimMenuRhs
-syn match vimMenuRhs ".*$" contained contains=vimString,vimComment,vim9Comment,vimIsCommand
-syn match vimMenuBang "!" contained skipwhite nextgroup=@vimMenuList
+" NOTE: tail comments disallowed
+" GEN_SYN_VIM: vimCommand menu, START_STR='syn keyword vimMenu', END_STR='skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus'
+syn keyword vimMenu am[enu] an[oremenu] aun[menu] cme[nu] cnoreme[nu] cunme[nu] ime[nu] inoreme[nu] iunme[nu] me[nu] nme[nu] nnoreme[nu] noreme[nu] nunme[nu] ome[nu] onoreme[nu] ounme[nu] sme[nu] snoreme[nu] sunme[nu] tlm[enu] tln[oremenu] tlu[nmenu] tm[enu] tu[nmenu] unme[nu] vme[nu] vnoreme[nu] vunme[nu] xme[nu] xnoreme[nu] xunme[nu] skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus
+syn keyword vimMenu popu[p] skipwhite nextgroup=vimMenuBang,vimMenuName
+syn region vimMenuRhs contained contains=@vimContinue,vimNotation start="|\@!\S" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + end="$" matchgroup=vimSep end="|"
+syn region vimMenuRhsContinue contained contains=@vimContinue,vimNotation start=+^\s*\%(\\\|"\\ \)+ skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + end="$" matchgroup=vimSep end="|"
+syn match vimMenuName "\.\@!\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation skipwhite nextgroup=vimCmdSep,vimMenuRhs
+syn match vimMenuName "\.\@!\%(\\\s\|\S\)\+\ze\s*$" contained contains=vimMenuNotation,vimNotation skipwhite skipnl nextgroup=vimCmdSep,vimMenuRhsContinue
+syn match vimMenuNotation "&\a\|&&\|\\\s\|\\\." contained
+syn match vimMenuPriority "\<\d\+\%(\.\d\+\)*\>" contained skipwhite nextgroup=vimMenuName
+syn match vimMenuMod "\c<\%(script\|silent\|special\)>" contained skipwhite nextgroup=vimMenuName,vimMenuPriority,vimMenuMod contains=vimMapModKey,vimMapModErr
+syn keyword vimMenuStatus enable disable nextgroup=vimMenuName skipwhite
+syn match vimMenuBang "\a\@1<=!" contained skipwhite nextgroup=vimMenuName,vimMenuMod
+
+syn region vimMenutranslate
+ \ matchgroup=vimCommand start="\<menut\%[ranslate]\>"
+ \ skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ +
+ \ end="$" matchgroup=vimCmdSep end="|" matchgroup=vimMenuClear end="\<clear\ze\s*\%(["#|]\|$\)"
+ \ contains=@vimContinue,vimMenutranslateName keepend transparent
+" oneline is sufficient to match the current formatting in runtime/lang/*.vim
+syn match vimMenutranslateName "\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation
+syn match vimMenutranslateComment +".*+ contained containedin=vimMenutranslate
" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2
" ======================
syn case ignore
-syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([scamd]-\)\{0,4}x\=\(f\d\{1,2}\|[^ \t:]\|cmd\|scriptcmd\|cr\|lf\|linefeed\|retu\%[rn]\|k\=del\%[ete]\|bs\|backspace\|tab\|esc\|right\|left\|help\|undo\|insert\|ins\|mouse\|k\=home\|k\=end\|kplus\|kminus\|kdivide\|kmultiply\|kenter\|kpoint\|space\|k\=\(page\)\=\(\|down\|up\|k\d\>\)\)>" contains=vimBracket
-syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([scam2-4]-\)\{0,4}\(right\|left\|middle\)\(mouse\)\=\(drag\|release\)\=>" contains=vimBracket
-syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\(bslash\|plug\|sid\|space\|bar\|nop\|nul\|lt\)>" contains=vimBracket
-syn match vimNotation '\(\\\|<lt>\)\=<C-R>[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket
-syn match vimNotation '\%#=1\(\\\|<lt>\)\=<\%(q-\)\=\(line[12]\|count\|bang\|reg\|args\|mods\|f-args\|f-mods\|lt\)>' contains=vimBracket
-syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([cas]file\|abuf\|amatch\|cword\|cWORD\|client\)>" contains=vimBracket
-syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd]-\)\{0,4}x\=\%(f\d\{1,2}\|[^ \t:]\|space\|bar\|bslash\|nl\|newline\|lf\|linefeed\|cr\|retu\%[rn]\|enter\|k\=del\%[ete]\|bs\|backspace\|tab\|esc\|csi\|right\|paste\%(start\|end\)\|left\|help\|undo\|k\=insert\|ins\|mouse\|[kz]\=home\|[kz]\=end\|kplus\|kminus\|kdivide\|kmultiply\|kenter\|kpoint\|space\|k\=\%(page\)\=\%(\|down\|up\|k\d\>\)\)>" contains=vimBracket
+
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}\%(net\|dec\|jsb\|pterm\|urxvt\|sgr\)mouse>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}\%(left\|middle\|right\)\%(mouse\|drag\|release\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}left\%(mouse\|release\)nm>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}x[12]\%(mouse\|drag\|release\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}sgrmouserelease>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}mouse\%(up\|down\|move\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd2-4]-\)\{0,4}scrollwheel\%(up\|down\|right\|left\)>" contains=vimBracket
+
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%(sid\|nop\|nul\|lt\|drop\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%(snr\|plug\|cursorhold\|ignore\|cmd\|scriptcmd\|focus\%(gained\|lost\)\)>" contains=vimBracket
+syn match vimNotation '\%(\\\|<lt>\)\=<C-R>[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket
+syn match vimNotation '\%#=1\%(\\\|<lt>\)\=<\%(q-\)\=\%(line[12]\|count\|bang\|reg\|args\|mods\|f-args\|f-mods\|lt\)>' contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([cas]file\|abuf\|amatch\|cexpr\|cword\|cWORD\|client\|stack\|script\|sf\=lnum\)>" contains=vimBracket
+syn match vimNotation "\%#=1\%(\\\|<lt>\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket
+
syn match vimBracket contained "[\\<>]"
syn case match
" User Function Highlighting: {{{2
" (following Gautam Iyer's suggestion)
" ==========================
-syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncEcho,vimFuncName,vimUserFunc,vimExecute
-syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
-syn keyword vimFuncEcho contained ec ech echo
+syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncEcho,vimFuncName,vimUserFunc,vimExecute
+syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
+syn keyword vimFuncEcho contained ec ech echo
" User Command Highlighting: {{{2
syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!'
@@ -511,7 +631,8 @@ syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@
" Errors And Warnings: {{{2
" ====================
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror")
- syn match vimFunctionError "\s\zs[a-z0-9]\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
+ " TODO: The new-prefix exception should only apply to constructor definitions.
+ syn match vimFunctionError "\s\zs\%(new\)\@![a-z0-9]\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
syn match vimFunctionError "\s\zs\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\d\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
syn match vimElseIfErr "\<else\s\+if\>"
syn match vimBufnrWarn /\<bufnr\s*(\s*["']\.['"]\s*)/
@@ -526,25 +647,24 @@ syn match vimNormCmds contained ".*$"
" Syntax: {{{2
"=======
-syn match vimGroupList contained "@\=[^[:space:],]\+" nextgroup=vimGroupListComma skipwhite skipnl
-syn match vimGroupListContinue contained "\\" nextgroup=vimGroupList skipwhite
-syn match vimGroupListComma contained "," nextgroup=vimGroupList,vimGroupListContinue skipwhite skipnl
-syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP
+syn match vimGroupList contained "[^[:space:],]\+\%(\s*,\s*[^[:space:],]\+\)*" contains=vimGroupSpecial
+syn region vimGroupList contained start=/^\s*["#]\\ \|^\s*\\\|[^[:space:],]\+\s*,/ skip=/\s*\n\s*\\\|\s*\n\s*["#]\\ \|^\s*\\\|^\s*["#]\\ / end=/[^[:space:],]\s*$\|[^[:space:],]\ze\s\+\w/ contains=@vimContinue,vimGroupSpecial
+syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP
+
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror")
syn match vimSynError contained "\i\+"
syn match vimSynError contained "\i\+=" nextgroup=vimGroupList
endif
-syn match vimSynContains contained "\<contain\(s\|edin\)=" nextgroup=vimGroupList,vimGroupListContinue skipwhite skipnl
-syn match vimSynKeyContainedin contained "\<containedin=" nextgroup=vimGroupList
-syn match vimSynNextgroup contained "nextgroup=" nextgroup=vimGroupList,vimGroupListContinue skipwhite skipnl
+syn match vimSynContains contained "\<contain\%(s\|edin\)=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimSynKeyContainedin contained "\<containedin=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimSynNextgroup contained "\<nextgroup=" skipwhite skipnl nextgroup=vimGroupList
if has("conceal")
+ " no whitespace allowed after '='
syn match vimSynCchar contained "\<cchar=" nextgroup=vimSynCcharValue
syn match vimSynCcharValue contained "\S"
endif
-
syn match vimSyntax "\<sy\%[ntax]\>" contains=vimCommand skipwhite nextgroup=vimSynType,vimComment,vim9Comment
-syn match vimAuSyntax contained "\s+sy\%[ntax]" contains=vimCommand skipwhite nextgroup=vimSynType,vimComment,vim9Comment
syn cluster vimFuncBodyList add=vimSyntax
" Syntax: case {{{2
@@ -559,10 +679,9 @@ syn keyword vimSynType contained clear skipwhite nextgroup=vimGroupList
" Syntax: cluster {{{2
syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName
-syn region vimClusterName contained matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\\|\n\s*\\" matchgroup=vimSep end="$\||" contains=vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
-syn match vimGroupAdd contained "add=" nextgroup=vimGroupList
-syn match vimGroupRem contained "remove=" nextgroup=vimGroupList
-syn cluster vimFuncBodyList add=vimSynType,vimGroupAdd,vimGroupRem
+syn region vimClusterName contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="$\||" contains=@vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
+syn match vimGroupAdd contained keepend "\<add=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimGroupRem contained keepend "\<remove=" skipwhite skipnl nextgroup=vimGroupList
" Syntax: foldlevel {{{2
syn keyword vimSynType contained foldlevel skipwhite nextgroup=vimSynFoldMethod,vimSynFoldMethodError
@@ -578,34 +697,31 @@ syn match vimIskSep contained ','
" Syntax: include {{{2
syn keyword vimSynType contained include skipwhite nextgroup=vimGroupList
-syn cluster vimFuncBodyList add=vimSynType
" Syntax: keyword {{{2
-syn cluster vimSynKeyGroup contains=vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynKeyContainedin
+syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynKeyContainedin
syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion
-syn region vimSynKeyRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|\|\n\s*\\" matchgroup=vimSep end="|\|$" contains=@vimSynKeyGroup
+syn region vimSynKeyRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|\|$" contains=@vimSynKeyGroup
syn match vimSynKeyOpt contained "\%#=1\<\(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>"
-syn cluster vimFuncBodyList add=vimSynType
" Syntax: match {{{2
-syn cluster vimSynMtchGroup contains=vimContinue,vimMtchComment,vimSynCchar,vimSynContains,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation,vim9Comment
+syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation,vimMtchComment
syn keyword vimSynType contained match skipwhite nextgroup=vimSynMatchRegion
-syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip="\n\s*\\" matchgroup=vimSep end="|\|$" contains=@vimSynMtchGroup
+syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|\|$" contains=@vimSynMtchGroup
syn match vimSynMtchOpt contained "\%#=1\<\(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>"
-syn cluster vimFuncBodyList add=vimSynMtchGroup
" Syntax: off and on {{{2
syn keyword vimSynType contained enable list manual off on reset
" Syntax: region {{{2
-syn cluster vimSynRegPatGroup contains=vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation
-syn cluster vimSynRegGroup contains=vimContinue,vimSynCchar,vimSynContains,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
+syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation
+syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
syn keyword vimSynType contained region skipwhite nextgroup=vimSynRegion
-syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\\|\n\s*\\" end="|\|$" contains=@vimSynRegGroup
+syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip=+\\\\\|\\\|\n\s*\\\|\n\s*"\\ + end="|\|$" contains=@vimSynRegGroup
syn match vimSynRegOpt contained "\%#=1\<\(conceal\(ends\)\=\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|keepend\|oneline\|extend\|skipnl\|fold\)\>"
-syn match vimSynReg contained "\(start\|skip\|end\)="he=e-1 nextgroup=vimSynRegPat
+syn match vimSynReg contained "\<\%(start\|skip\|end\)=" nextgroup=vimSynRegPat
syn match vimSynMtchGrp contained "matchgroup=" nextgroup=vimGroup,vimHLGroup
-syn region vimSynRegPat contained extend start="\z([-`~!@#$%^&*_=+;:'",./?]\)" skip="\\\\\|\\\z1\|\n\s*\\" end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg
+syn region vimSynRegPat contained extend start="\z([-`~!@#$%^&*_=+;:'",./?]\)" skip=/\\\\\|\\\z1\|\n\s*\\\|\n\s*"\\ / end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg
syn match vimSynPatMod contained "\%#=1\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\="
syn match vimSynPatMod contained "\%#=1\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\=," nextgroup=vimSynPatMod
syn match vimSynPatMod contained "lc=\d\+"
@@ -613,7 +729,6 @@ syn match vimSynPatMod contained "lc=\d\+," nextgroup=vimSynPatMod
syn region vimSynPatRange contained start="\[" skip="\\\\\|\\]" end="]"
syn match vimSynNotPatRange contained "\\\\\|\\\["
syn match vimMtchComment contained '"[^"]\+$'
-syn cluster vimFuncBodyList add=vimSynType
" Syntax: sync {{{2
" ============
@@ -643,11 +758,11 @@ if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror")
syn match vimHiCtermError contained "\D\i*"
endif
syn match vimHighlight "\<hi\%[ghlight]\>" skipwhite nextgroup=vimHiBang,@vimHighlightCluster
-syn match vimHiBang contained "!" skipwhite nextgroup=@vimHighlightCluster
+syn match vimHiBang contained "\a\@1<=!" skipwhite nextgroup=@vimHighlightCluster
syn match vimHiGroup contained "\i\+"
syn case ignore
-syn keyword vimHiAttrib contained none bold inverse italic nocombine reverse standout strikethrough underline undercurl
+syn keyword vimHiAttrib contained none bold inverse italic nocombine reverse standout strikethrough underline undercurl underdashed underdotted underdouble
syn keyword vimFgBgAttrib contained none bg background fg foreground
syn case match
syn match vimHiAttribList contained "\i\+" contains=vimHiAttrib
@@ -662,16 +777,17 @@ syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'"
syn match vimHiGuiRgb contained "#\x\{6}"
" Highlighting: hi group key=arg ... {{{2
-syn cluster vimHiCluster contains=vimGroup,vimHiGroup,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation
-syn region vimHiKeyList contained oneline start="\i\+" skip="\\\\\|\\|" end="$\||" contains=@vimHiCluster
+syn cluster vimHiCluster contains=vimGroup,vimHiGroup,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiCtermfont,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation,vimComment,vim9comment
+syn region vimHiKeyList contained start="\i\+" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimHiCluster
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_vimhikeyerror")
syn match vimHiKeyError contained "\i\+="he=e-1
endif
syn match vimHiTerm contained "\cterm="he=e-1 nextgroup=vimHiAttribList
-syn match vimHiStartStop contained "\c\(start\|stop\)="he=e-1 nextgroup=vimHiTermcap,vimOption
+syn match vimHiStartStop contained "\c\%(start\|stop\)="he=e-1 nextgroup=vimHiTermcap,vimOption
syn match vimHiCTerm contained "\ccterm="he=e-1 nextgroup=vimHiAttribList
syn match vimHiCtermFgBg contained "\ccterm[fb]g="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
syn match vimHiCtermul contained "\cctermul="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
+syn match vimHiCtermfont contained "\cctermfont="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
syn match vimHiGui contained "\cgui="he=e-1 nextgroup=vimHiAttribList
syn match vimHiGuiFont contained "\cfont="he=e-1 nextgroup=vimHiFontname
syn match vimHiGuiFgBg contained "\cgui\%([fb]g\|sp\)="he=e-1 nextgroup=vimHiGroup,vimHiGuiFontname,vimHiGuiRgb,vimFgBgAttrib
@@ -679,13 +795,13 @@ syn match vimHiTermcap contained "\S\+" contains=vimNotation
syn match vimHiNmbr contained '\d\+'
" Highlight: clear {{{2
-syn keyword vimHiClear contained clear nextgroup=vimHiGroup
+syn keyword vimHiClear contained clear skipwhite nextgroup=vimGroup,vimHiGroup
" Highlight: link {{{2
" see tst24 (hi def vs hi) (Jul 06, 2018)
"syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\<hi\%[ghlight]\s\+\)\@<=\(\(def\%[ault]\s\+\)\=link\>\|\<def\>\)" end="$" contains=vimHiGroup,vimGroup,vimHLGroup,vimNotation
-syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\<hi\%[ghlight]\s\+\)\@<=\(\(def\%[ault]\s\+\)\=link\>\|\<def\>\)" end="$" contains=@vimHiCluster
-syn cluster vimFuncBodyList add=vimHiLink
+" TODO: simplify and allow line continuations --djk
+syn region vimHiLink contained matchgroup=Type start="\%(\<hi\%[ghlight]!\=\s\+\)\@<=\%(\%(def\%[ault]\s\+\)\=link\>\|\<def\%[ault]\>\)" skip=+\\\\\|\\|\|\n\s*\\\|\n\s*"\\ + matchgroup=vimCmdSep end="|" excludenl end="$" contains=@vimContinue,@vimHiCluster
" Control Characters: {{{2
" ==================
@@ -698,7 +814,9 @@ syn match vimLineComment +^[ \t:]*"\("[^"]*"\|[^"]\)*$+ contains=@vimCommentGrou
syn match vim9LineComment +^[ \t:]\+#.*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle
syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup
" Note: Look-behind to work around nextgroup skipnl consuming leading whitespace and preventing a match
-syn match vimContinue "\%(^\s*\)\@32<=\\"
+syn match vimContinue "^\s*\zs\\"
+syn match vimContinueComment '^\s*\zs["#]\\ .*' contained
+syn cluster vimContinue contains=vimContinue,vimContinueComment
syn region vimString start="^\s*\\\z(['"]\)" skip='\\\\\|\\\z1' end="\z1" oneline keepend contains=@vimStringGroup,vimContinue
syn match vimCommentTitleLeader '"\s\+'ms=s+1 contained
@@ -706,8 +824,8 @@ syn match vimCommentTitleLeader '"\s\+'ms=s+1 contained
" ====================
syn match vimSearch '^\s*[/?].*' contains=vimSearchDelim
syn match vimSearchDelim '^\s*\zs[/?]\|[/?]$' contained
-syn region vimGlobal matchgroup=Statement start='\<g\%[lobal]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst
-syn region vimGlobal matchgroup=Statement start='\<v\%[global]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst
+syn region vimGlobal matchgroup=Statement start='\<g\%[lobal]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst1
+syn region vimGlobal matchgroup=Statement start='\<v\%[global]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst1
" Embedded Scripts: {{{2
" ================
@@ -890,6 +1008,7 @@ if exists("g:vimsyn_minlines")
endif
exe "syn sync maxlines=".s:vimsyn_maxlines
syn sync linecont "^\s\+\\"
+syn sync linebreaks=1
syn sync match vimAugroupSyncA groupthere NONE "\<aug\%[roup]\>\s\+[eE][nN][dD]"
" ====================
@@ -908,7 +1027,6 @@ if !exists("skip_vim_syntax_inits")
hi def link vimHiAttribList vimError
hi def link vimHiCtermError vimError
hi def link vimHiKeyError vimError
- hi def link vimKeyCodeError vimError
hi def link vimMapModErr vimError
hi def link vimSubstFlagErr vimError
hi def link vimSynCaseError vimError
@@ -918,14 +1036,14 @@ if !exists("skip_vim_syntax_inits")
hi def link vimAbb vimCommand
hi def link vimAddress vimMark
+ hi def link vimAugroupBang vimBang
hi def link vimAugroupError vimError
hi def link vimAugroupKey vimCommand
- hi def link vimAuHighlight vimHighlight
- hi def link vimAutoCmdOpt vimOption
hi def link vimAutoCmd vimCommand
hi def link vimAutoEvent Type
hi def link vimAutoCmdMod Special
- hi def link vimAutoSet vimCommand
+ hi def link vimBang vimOper
+ hi def link vimBehaveBang vimBang
hi def link vimBehaveModel vimBehave
hi def link vimBehave vimCommand
hi def link vimBracket Delimiter
@@ -938,35 +1056,47 @@ if !exists("skip_vim_syntax_inits")
hi def link vimCondHL vimCommand
hi def link vimConst vimCommand
hi def link vimContinue Special
+ hi def link vimContinueComment vimComment
hi def link vimCtrlChar SpecialChar
- hi def link vimEchoHLNone vimGroup
- hi def link vimEchoHL vimCommand
+ hi def link vimDefComment vimComment
+ hi def link vimDefKey vimCommand
+ hi def link vimDefParam vimVar
+ hi def link vimEcho vimCommand
+ hi def link vimEchohlNone vimGroup
+ hi def link vimEchohl vimCommand
hi def link vimElseIfErr Error
- hi def link vimElseif vimCondHL
+ hi def link vimEndfunction vimCommand
+ hi def link vimEnddef vimCommand
hi def link vimEnvvar PreProc
hi def link vimError Error
hi def link vimEscape Special
hi def link vimFBVar vimVar
hi def link vimFgBgAttrib vimHiAttrib
hi def link vimFuncEcho vimCommand
- hi def link vimHiCtermul vimHiTerm
- hi def link vimFold Folded
hi def link vimFor vimCommand
hi def link vimFTCmd vimCommand
hi def link vimFTOption vimSynType
+ hi def link vimFuncBang vimBang
+ hi def link vimFuncComment vimComment
hi def link vimFuncKey vimCommand
hi def link vimFuncName Function
+ hi def link vimFuncMod Special
+ hi def link vimFuncParam vimVar
+ hi def link vimFuncParamEquals vimOper
hi def link vimFuncSID Special
hi def link vimFuncVar Identifier
hi def link vimGroupAdd vimSynOption
- hi def link vimGroupListContinue vimContinue
hi def link vimGroupName vimGroup
hi def link vimGroupRem vimSynOption
hi def link vimGroupSpecial Special
hi def link vimGroup Type
hi def link vimHiAttrib PreProc
- hi def link vimHiClear vimHighlight
+ hi def link vimHiBang vimBang
+ hi def link vimHiClear Type
+ hi def link vimHiCtermColor Constant
hi def link vimHiCtermFgBg vimHiTerm
+ hi def link vimHiCtermfont vimHiTerm
+ hi def link vimHiCtermul vimHiTerm
hi def link vimHiCTerm vimHiTerm
hi def link vimHighlight vimCommand
hi def link vimHiGroup vimGroupName
@@ -978,13 +1108,10 @@ if !exists("skip_vim_syntax_inits")
hi def link vimHiStartStop vimHiTerm
hi def link vimHiTerm Type
hi def link vimHLGroup vimGroup
- hi def link vimHLMod PreProc
hi def link vimInsert vimString
hi def link vimIskSep Delimiter
- hi def link vimKeyCode vimSpecFile
hi def link vimKeymapLineComment vimComment
hi def link vimKeymapTailComment vimComment
- hi def link vimKeyword Statement
hi def link vimLet vimCommand
hi def link vimLetHereDoc vimString
hi def link vimLetHereDocStart Special
@@ -992,15 +1119,21 @@ if !exists("skip_vim_syntax_inits")
hi def link vimLetRegister Special
hi def link vimLineComment vimComment
hi def link vim9LineComment vimComment
- hi def link vimMapBang vimCommand
+ hi def link vimMapBang vimBang
hi def link vimMapModKey vimFuncSID
hi def link vimMapMod vimBracket
hi def link vimMap vimCommand
hi def link vimMark Number
hi def link vimMarkNumber vimNumber
+ hi def link vimMenuBang vimBang
+ hi def link vimMenuClear Special
hi def link vimMenuMod vimMapMod
- hi def link vimMenuNameMore vimMenuName
hi def link vimMenuName PreProc
+ hi def link vimMenu vimCommand
+ hi def link vimMenuNotation vimNotation
+ hi def link vimMenuPriority Number
+ hi def link vimMenuStatus Special
+ hi def link vimMenutranslateComment vimComment
hi def link vimMtchComment vimComment
hi def link vimNorm vimCommand
hi def link vimNotation Special
@@ -1009,7 +1142,6 @@ if !exists("skip_vim_syntax_inits")
hi def link vimNumber Number
hi def link vimOperError Error
hi def link vimOper Operator
- hi def link vimOperStar vimOper
hi def link vimOption PreProc
hi def link vimParenSep Delimiter
hi def link vimPatSepErr vimError
@@ -1031,10 +1163,10 @@ if !exists("skip_vim_syntax_inits")
hi def link vimSpecFile Identifier
hi def link vimSpecFileMod vimSpecFile
hi def link vimSpecial Type
- hi def link vimStatement Statement
hi def link vimStringCont vimString
hi def link vimString String
hi def link vimStringEnd vimString
+ hi def link vimStringInterpolationBrace vimEscape
hi def link vimSubst1 vimSubst
hi def link vimSubstDelim Delimiter
hi def link vimSubstFlags Special
@@ -1071,7 +1203,7 @@ if !exists("skip_vim_syntax_inits")
hi def link vimTodo Todo
hi def link vimType Type
hi def link vimUnlet vimCommand
- hi def link vimUnletBang vimCommand
+ hi def link vimUnletBang vimBang
hi def link vimUnmap vimMap
hi def link vimUserAttrbCmpltFunc Special
hi def link vimUserAttrbCmplt vimSpecial
@@ -1100,4 +1232,4 @@ delc VimFoldr
delc VimFoldt
let &cpo = s:keepcpo
unlet s:keepcpo
-" vim:ts=18 fdm=marker
+" vim:ts=18 fdm=marker ft=vim
diff --git a/runtime/syntax/xmath.vim b/runtime/syntax/xmath.vim
index 37ae951..466c115 100644
--- a/runtime/syntax/xmath.vim
+++ b/runtime/syntax/xmath.vim
@@ -1,9 +1,11 @@
" Vim syntax file
" Language: xmath (a simulation tool)
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
+" 2024 Feb 19 by Vim Project (announce adoption)
" Version: 10
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XMATH
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XMATH
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
diff --git a/runtime/syntax/xxd.vim b/runtime/syntax/xxd.vim
index 2f90b6b..1c06b42 100644
--- a/runtime/syntax/xxd.vim
+++ b/runtime/syntax/xxd.vim
@@ -1,10 +1,12 @@
" Vim syntax file
" Language: bin using xxd
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Charles E. Campbell
" Last Change: Aug 31, 2016
" Version: 11
+" 2024 Feb 19 by Vim Project (announce adoption)
" Notes: use :help xxd to see how to invoke it
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XXD
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XXD
" quit when a syntax file was already loaded
if exists("b:current_syntax")
diff --git a/runtime/syntax/yacc.vim b/runtime/syntax/yacc.vim
index 3aa01e8..8100489 100644
--- a/runtime/syntax/yacc.vim
+++ b/runtime/syntax/yacc.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: Yacc
-" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Former Maintainer: Charles E. Campbell
" Last Change: Mar 25, 2019
" Version: 17
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_YACC
+" 2024 Feb 19 by Vim Project (announce adoption)
+" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_YACC
"
" Options: {{{1
" g:yacc_uses_cpp : if this variable exists, then C++ is loaded rather than C