From 98ded081dddc5c5070535b045116eb5f63a11d95 Mon Sep 17 00:00:00 2001 From: Jessica Clarke Date: Mon, 22 Jun 2026 17:58:04 +0000 Subject: [PATCH 001/647] patch 9.2.0700: configure: -lrt requirement for timer_create not detected Problem: configure does not actually check whether -lrt is needed for timer_create(); the test only compiles instead of linking, so the requirement is missed when cross-compiling Solution: Use AC_LINK_IFELSE instead of AC_COMPILE_IFELSE for the timer_create checks so the link actually decides whether -lrt is required (Jessica Clarke) AC_COMPILE_IFELSE won't try to link, so if the function exists in the system headers, we will always detect that -lrt is not needed, as the code will compile regardless of linker flags. If not cross-compiling, the following AC_RUN_IFELSE will end up trying to link, so if -lrt is needed it will fail to link and we will interpret timer_create as not working, rather than that we just need to link with -lrt. But when we are cross-compiling we will skip the AC_RUN_IFELSE and assume that it works, failing to link when we later build if -lrt is in fact needed. closes: #20605 related: 2cf145b78b88 ("patch 9.1.0837: cross-compiling has some issues") Signed-off-by: Jessica Clarke Signed-off-by: Christian Brabandt --- src/auto/configure | 10 ++++++---- src/configure.ac | 4 ++-- src/version.c | 2 ++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/auto/configure b/src/auto/configure index a20eea1667..f5d6dea01c 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -15078,7 +15078,7 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_link "$LINENO" then : vim_cv_timer_create=yes else case e in #( @@ -15086,7 +15086,8 @@ else case e in #( ;; esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $vim_cv_timer_create" >&5 @@ -15117,7 +15118,7 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_link "$LINENO" then : vim_cv_timer_create_with_lrt=yes else case e in #( @@ -15125,7 +15126,8 @@ else case e in #( ;; esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $vim_cv_timer_create_with_lrt" >&5 diff --git a/src/configure.ac b/src/configure.ac index 710cb317fc..b71e553394 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -4037,7 +4037,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM( dnl Check for timer_create. It probably requires the 'rt' library. AC_CACHE_CHECK([for timer_create without -lrt], [vim_cv_timer_create], [ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([ #include ], [ timer_create(CLOCK_MONOTONIC, NULL, NULL); @@ -4051,7 +4051,7 @@ if test "x$vim_cv_timer_create" = "xno" ; then save_LIBS="$LIBS" LIBS="$LIBS -lrt" AC_CACHE_CHECK([for timer_create with -lrt], [vim_cv_timer_create_with_lrt], [ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([ #include ], [ timer_create(CLOCK_MONOTONIC, NULL, NULL); diff --git a/src/version.c b/src/version.c index b93bdd9e1c..ddd8a02ca6 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 700, /**/ 699, /**/ From caab0767f99007b23c44127e543920a9bd9d2636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Marek?= Date: Mon, 22 Jun 2026 18:04:06 +0000 Subject: [PATCH 002/647] patch 9.2.0701: tests: test_terminal.vim does not wait for job to finish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: tests: Test_terminal_eof_arg() and Test_terminal_duplicate_eof_arg() do not wait until the python job finishes Solution: Wait for the job to be dead before checking its exit value (Vladimír Marek). closes: #20571 Signed-off-by: Vladimír Marek Signed-off-by: Christian Brabandt --- src/testdir/test_terminal.vim | 8 ++++++-- src/version.c | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim index fced4d158b..98e82fcb4c 100644 --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -942,7 +942,9 @@ func Test_terminal_eof_arg() call WaitFor({-> getline('$') =~ 'hello'}) call assert_equal('hello', getline('$')) endif - let exitval = bufnr()->term_getjob()->job_info().exitval + let job = bufnr()->term_getjob() + call WaitForAssert({-> assert_equal('dead', job_status(job))}) + let exitval = job->job_info().exitval if !has('win32') call assert_equal(123, exitval) else @@ -984,7 +986,9 @@ func Test_terminal_duplicate_eof_arg() call WaitFor({-> getline('$') =~ 'hello'}) call assert_equal('hello', getline('$')) endif - let exitval = bufnr()->term_getjob()->job_info().exitval + let job = bufnr()->term_getjob() + call WaitForAssert({-> assert_equal('dead', job_status(job))}) + let exitval = job->job_info().exitval if !has('win32') call assert_equal(123, exitval) else diff --git a/src/version.c b/src/version.c index ddd8a02ca6..db18e0cc92 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 701, /**/ 700, /**/ From 8513982a5ed5a84ba8e4e532505b07b4fa1efbdb Mon Sep 17 00:00:00 2001 From: yilisharcs Date: Mon, 22 Jun 2026 18:54:44 +0000 Subject: [PATCH 003/647] runtime(fennel): add more ";" comment leaders to 'comments' closes: #20579 Signed-off-by: yilisharcs Signed-off-by: Christian Brabandt --- runtime/ftplugin/fennel.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/ftplugin/fennel.vim b/runtime/ftplugin/fennel.vim index 2a9623faff..054089d92d 100644 --- a/runtime/ftplugin/fennel.vim +++ b/runtime/ftplugin/fennel.vim @@ -10,7 +10,7 @@ endif let b:did_ftplugin = 1 setlocal commentstring=;\ %s -setlocal comments=:;;,:; +setlocal comments=:;;;;,:;;;,:;;,:; setlocal formatoptions-=t setlocal suffixesadd=.fnl setlocal lisp From 8c670b3a5116e247ad4e481083a9eb4a90b9a89e Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 22 Jun 2026 19:05:36 +0000 Subject: [PATCH 004/647] runtime(fennel): Update Last Update header forgotten from commit 8513982a5ed5a84ba8e4e532505b07b4fa1efbdb Signed-off-by: Christian Brabandt --- runtime/ftplugin/fennel.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/ftplugin/fennel.vim b/runtime/ftplugin/fennel.vim index 054089d92d..8f2f22506b 100644 --- a/runtime/ftplugin/fennel.vim +++ b/runtime/ftplugin/fennel.vim @@ -3,6 +3,7 @@ " Maintainer: Gregory Anders " Last Update: 2023 Jun 9 " 2024 May 24 by Riley Bruins ('commentstring') +" 2026 Jun 22 by yilisharcs, add all more lisp 'comments' #20579 if exists('b:did_ftplugin') finish From 5767d80b3794b17e5b61afec966fdeb7c0c4506f Mon Sep 17 00:00:00 2001 From: ShivaPriyanShanmuga Date: Mon, 22 Jun 2026 19:07:09 +0000 Subject: [PATCH 005/647] patch 9.2.0702: :windo and :tabdo create an extra window with 'winfixbuf' Problem: With 'winfixbuf' set in the current window, :windo and :tabdo create an extra split window, even though they only visit existing windows/tabpages and don't change the current window's buffer (Collin Kennedy) Solution: Skip the 'winfixbuf' escape in ex_listdo() for :windo and :tabdo (ShivaPriyanShanmuga) fixes: #14301 closes: #20600 Signed-off-by: ShivaPriyanShanmuga Signed-off-by: Christian Brabandt --- src/ex_cmds2.c | 6 ++++- src/testdir/test_winfixbuf.vim | 41 ++++++++++++++++++++++------------ src/version.c | 2 ++ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index afe9c4b58a..f867c3c9c9 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -478,7 +478,11 @@ ex_listdo(exarg_T *eap) buf_T *buf = curbuf; int next_fnum = 0; - if (curwin->w_p_wfb) + // ":windo" and ":tabdo" only visit existing windows/tabpages, they don't + // change the current window's buffer, so they can't escape a 'winfixbuf' + // window (which would create a split). + if (curwin->w_p_wfb && eap->cmdidx != CMD_windo && + eap->cmdidx != CMD_tabdo) { if ((eap->cmdidx == CMD_ldo || eap->cmdidx == CMD_lfdo) && !eap->forceit) diff --git a/src/testdir/test_winfixbuf.vim b/src/testdir/test_winfixbuf.vim index 898443d9b5..ba5cb979b7 100644 --- a/src/testdir/test_winfixbuf.vim +++ b/src/testdir/test_winfixbuf.vim @@ -2857,36 +2857,34 @@ func Test_tNext() set tags& endfunc -" Call :tabdo and choose the next available 'nowinfixbuf' window. -func Test_tabdo_choose_available_window() +" Call :tabdo and stay in the 'winfixbuf' window: it only visits tabpages and +" doesn't change the current buffer, so it must not switch to another window +" even when a 'nowinfixbuf' window is available. +func Test_tabdo_stay_in_winfixbuf_window() call s:reset_all_buffers() let [l:first, _] = s:make_args_list() - " Make a split window that is 'nowinfixbuf' but make it the second-to-last - " window so that :tabdo will first try the 'winfixbuf' window, pass over it, - " and prefer the other 'nowinfixbuf' window, instead. - " " +-------------------+ " | 'nowinfixbuf' | " +-------------------+ " | 'winfixbuf' | <-- Cursor is here " +-------------------+ split - let l:nowinfixbuf_window = win_getid() " Move to the 'winfixbuf' window now exe "normal \j" let l:winfixbuf_window = win_getid() let l:expected_windows = s:get_windows_count() tabdo echo '' - call assert_equal(l:nowinfixbuf_window, win_getid()) + call assert_equal(l:winfixbuf_window, win_getid()) call assert_equal(l:first, bufnr()) call assert_equal(l:expected_windows, s:get_windows_count()) endfunc -" Call :tabdo and create a new split window if all available windows are 'winfixbuf'. -func Test_tabdo_make_new_window() +" Call :tabdo and do not create a new window even when the only window is +" 'winfixbuf'. +func Test_tabdo_no_new_window() call s:reset_all_buffers() let [l:first, _] = s:make_buffers_list() @@ -2896,11 +2894,9 @@ func Test_tabdo_make_new_window() let l:current_windows = s:get_windows_count() tabdo echo '' - call assert_notequal(l:current, win_getid()) + call assert_equal(l:current, win_getid()) call assert_equal(l:first, bufnr()) - exe "normal \j" - call assert_equal(l:first, bufnr()) - call assert_equal(l:current_windows + 1, s:get_windows_count()) + call assert_equal(l:current_windows, s:get_windows_count()) endfunc " Fail :tag but :tag! is allowed @@ -3214,6 +3210,23 @@ func Test_windo() call assert_equal(l:current_window, win_getid()) endfunc +" Call :windo and do not create a new window even when the only window is +" 'winfixbuf'. +func Test_windo_no_new_window() + call s:reset_all_buffers() + + let [l:first, _] = s:make_buffers_list() + exe $"buffer! {l:first}" + + let l:current = win_getid() + let l:current_windows = s:get_windows_count() + + windo echo '' + call assert_equal(l:current, win_getid()) + call assert_equal(l:first, bufnr()) + call assert_equal(l:current_windows, s:get_windows_count()) +endfunc + " Fail :wnext but :wnext! is allowed func Test_wnext() call s:reset_all_buffers() diff --git a/src/version.c b/src/version.c index db18e0cc92..67a0fa6508 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 702, /**/ 701, /**/ From a82ed3a6f37e0dcc821e0c3c0d5764b227e40901 Mon Sep 17 00:00:00 2001 From: Miguel Barro Date: Mon, 22 Jun 2026 19:19:24 +0000 Subject: [PATCH 006/647] patch 9.2.0703: session file does not store relative Vim9 autoload imports Problem: mksession misses relative or absolute imports in the session, homonymous autoload scripts imported from different scripts cause errors (after v9.2.0579). Solution: Correctly write scripts imported via :import autoload, skip any that are no longer readable, and comment out imports whose autoload prefix or file name tail would conflict with an earlier one (Miguel Barro). fixes: #12641 closes: #20564 Signed-off-by: Miguel Barro Signed-off-by: Christian Brabandt --- src/session.c | 38 +++++++++- src/testdir/test_mksession.vim | 124 +++++++++++++++++++++++++++++++++ src/version.c | 2 + 3 files changed, 161 insertions(+), 3 deletions(-) diff --git a/src/session.c b/src/session.c index 090448937f..0fa03e556d 100644 --- a/src/session.c +++ b/src/session.c @@ -1333,10 +1333,42 @@ ex_mkrc(exarg_T *eap) for (sid = 1; sid <= script_items.ga_len; ++sid) { si = SCRIPT_ITEM(sid); - if (si->sn_autoload_prefix && - (fprintf(fd, "import autoload '%s'", si->sn_name) < 0 || - put_eol(fd) == FAIL)) + + // Autoload script paths may be absolute, relative to the + // current script or relative to a 'runtimepath' directory + // Ignore if missing + if ((si->sn_autoload_prefix || si->sn_import_autoload) + && file_is_readable(si->sn_name)) + { + // Check if conflicts with a previous import + int b_sid = sid - 1; + char_u *name = gettail(si->sn_name); + + for (; b_sid; --b_sid) + { + scriptitem_T *b_si = SCRIPT_ITEM(b_sid); + + // Only autoload may conflict. Ignore if missing + if ((!b_si->sn_autoload_prefix && !b_si->sn_import_autoload) + || !file_is_readable(b_si->sn_name)) + continue; + + // compare prefixes if available + if (si->sn_autoload_prefix != NULL && b_si->sn_autoload_prefix != NULL + && (STRCMP(si->sn_autoload_prefix, b_si->sn_autoload_prefix) == 0)) + break; + + // otherwise compare tails + char_u *b_name = gettail(b_si->sn_name); + if (STRCMP(name, b_name) == 0) + break; + } + + // import the auto script if there are no conflicts + if (fprintf(fd, "%simport autoload '%s'", b_sid ? "# " : "", si->sn_name) < 0 || + put_eol(fd) == FAIL) failed = TRUE; + } } #endif } diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 4dec8815a4..0bccad1c66 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -1598,4 +1598,128 @@ func Test_mksession_localmappings() endfunc +" Test vim9 script relative auto imports (issue #12641) +func Test_mksession_vim9_relative_auto_import() + + " Dummy vim9 script + let script_sources =<< trim END + vim9script + import autoload './XAuto.vim' + nnoremap dummy-test XAuto.Test() + END + call writefile(script_sources, 'XScript.vim', 'D') + + let auto_sources =<< trim END + vim9script + const ref_txt = 'Hello from vim9 dummy relative auto script!' + export def Test() + if !has("gui_running") + exe $"echomsg '{ref_txt}'" + endif + writefile([ref_txt], 'XDummyOutput') + enddef + END + call writefile(auto_sources, 'XAuto.vim', 'D') + + " Source the script + const ref_txt = 'Hello from vim9 dummy relative auto script!' + source XScript.vim + + " Execute mapping + normal dummy-test + + if !has('gui_running') + call assert_match(ref_txt, execute('messages'), 'No vim9 auto script XAuto.Test() execution') + endif + call assert_true(filereadable('XDummyOutput'), 'Output file was not created by Vim9 auto script') + call assert_equal([ref_txt], readfile('XDummyOutput')) + call delete('XDummyOutput') + + " Create a session file + mksession! XDummySession.vim + defer delete('XDummySession.vim') + call assert_true(filereadable('XDummySession.vim'), 'Session file was not created') + + " Check the session file mappings are operational + let test_sources =<< trim END + " Load session + source XDummySession.vim + " Execute mapping + normal dummy-test + " on my way + cq + END + call writefile(test_sources, 'XTest.vim', 'D') + " spawn a new Vim instance to load the session and execute the mapping + call system(GetVimCommand('XTest.vim')) + call assert_true(filereadable('XDummyOutput'), + \ 'Expected output file was not created by Vim9 auto script mapping') + defer delete('XDummyOutput') + call assert_equal([ref_txt], readfile('XDummyOutput')) + +endfunc + +" Test vim9 script avoid homonimous auto imports +func Test_mksession_vim9_duplicate_import() + + " Auto script + let auto_sources =<< trim END + vim9script + const ref_txt = 'Hello from a duplicated vim9 script!' + export def Test() + writefile([ref_txt], 'XDummyOutput') + enddef + END + + " Dummy vim9 script + let script_sources =<< trim END + vim9script + import autoload './XAuto.vim' + nnoremap dummy-test XAuto.Test() + END + + for i in range(1, 5) + let dir = $'XDir{i}' + call mkdir(dir, 'p') + defer delete(dir, 'rf') + + let autofile = dir . '/XAuto.vim' + call writefile(auto_sources, autofile, 'D') + + let scriptfile = dir . '/XScript.vim' + call writefile(script_sources, scriptfile, 'D') + exe "source " . scriptfile + endfor + + " Create a session file + mksession! XDummySession.vim + defer delete('XDummySession.vim') + call assert_true(filereadable('XDummySession.vim'), 'Session file was not created') + + " Check there are commented imports in the session file + let commented_imports = filter(readfile('XDummySession.vim'), + \ {_, v -> v =~ '^# import autoload'}) + call assert_equal(4, len(commented_imports), + \ 'Session file does not contain the expected number of commented imports') + + " Check the session file mappings are operational + const ref_txt = 'Hello from a duplicated vim9 script!' + let test_sources =<< trim END + " Load session + source XDummySession.vim + " Execute mapping + normal dummy-test + " on my way + cq + END + call writefile(test_sources, 'XTest.vim', 'D') + " spawn a new Vim instance to load the session and execute the mapping + call system(GetVimCommand('XTest.vim')) + call assert_true(filereadable('XDummyOutput'), + \ 'Expected output file was not created by Vim9 auto script mapping') + defer delete('XDummyOutput') + call assert_equal([ref_txt], readfile('XDummyOutput')) + +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 67a0fa6508..45b222e7ad 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 703, /**/ 702, /**/ From d1f7c37656763c3cccc7e3d4198ffe567054b76d Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 22 Jun 2026 19:30:28 +0000 Subject: [PATCH 007/647] patch 9.2.0704: GTK4: not handling mouse events Problem: GTK4: not handling mouse events Solution: Emit mouse moved events and handle mouse dragging (Foxe Chen). closes: #20545 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/version.c | 2 ++ 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 4874b2f626..bcadb31a56 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -2046,6 +2046,10 @@ modifiers_gdk2mouse(guint state) // -1 means no button is pressed (MOUSE_LEFT is 0x00, so can't use 0). static int mouse_pressed_button = -1; +static guint motion_repeat_timer = 0; +static gboolean motion_repeat_offset = FALSE; +static int mouse_press_x = -1, mouse_press_y = -1; + static void button_press_event(GtkGestureClick *gesture, int n_press UNUSED, double x, double y, gpointer data UNUSED) @@ -2083,6 +2087,9 @@ button_press_event(GtkGestureClick *gesture, int n_press UNUSED, default: return; } + mouse_press_x = (int)x; + mouse_press_y = (int)y; + mouse_pressed_button = button; vim_modifiers = modifiers_gdk2mouse(state); gui_send_mouse_event(button, (int)x, (int)y, repeated_click, vim_modifiers); @@ -2101,6 +2108,13 @@ button_release_event(GtkGestureClick *gesture, int n_press UNUSED, state = gdk_event_get_modifier_state(event); vim_modifiers = modifiers_gdk2mouse(state); + // If we are repeating motion events, then stop + if (motion_repeat_timer != 0) + { + timeout_remove(motion_repeat_timer); + motion_repeat_timer = 0; + } + mouse_pressed_button = -1; gui_send_mouse_event(MOUSE_RELEASE, (int)x, (int)y, FALSE, vim_modifiers); } @@ -2108,6 +2122,43 @@ button_release_event(GtkGestureClick *gesture, int n_press UNUSED, static double prev_mouse_x = -1.0; static double prev_mouse_y = -1.0; +static GdkModifierType cur_state = 0; + + static timeout_cb_type +mouse_repeat_timer_cb(gpointer data) +{ + int x, y; + + if (mouse_pressed_button == -1) + { + motion_repeat_timer = 0; + return G_SOURCE_REMOVE; + } + + // If there already is a mouse click in the input buffer, wait another + // time (otherwise we would create a backlog of clicks) + if (vim_used_in_input_buf() > 10) + return G_SOURCE_CONTINUE; + + x = (int)prev_mouse_x; + y = (int)prev_mouse_y; + + // Fake a motion event. + // + // Trick: Pretend the mouse moved to the next character on every other + // event, otherwise drag events will be discarded, because they are still in + // the same character. + if (motion_repeat_offset) + x += gui.char_width; + motion_repeat_offset = !motion_repeat_offset; + + gui_send_mouse_event(MOUSE_DRAG, x, y, FALSE, + modifiers_gdk2mouse(cur_state)); + + // Always continue, when button is released, then this timer is removed. + return G_SOURCE_CONTINUE; +} + static void motion_notify_event(GtkEventControllerMotion *controller UNUSED, double x, double y, gpointer data UNUSED) @@ -2115,17 +2166,54 @@ motion_notify_event(GtkEventControllerMotion *controller UNUSED, if (mouse_pressed_button >= 0) { GdkModifierType state; - GdkEvent *event; + GdkEvent *event; + int w, h; event = gtk_event_controller_get_current_event( GTK_EVENT_CONTROLLER(controller)); + if (event != NULL) { - state = gdk_event_get_modifier_state(event); + cur_state = state = gdk_event_get_modifier_state(event); gui_send_mouse_event(MOUSE_DRAG, (int)x, (int)y, FALSE, modifiers_gdk2mouse(state)); } + + // Only start repeating motion if pointer is outside of draw area (and + // mouse button is being pressed down). Make frequency of motion + // repeats depend on how far away the pointer is from the start of the + // drag. + // + w = gtk_widget_get_width(gui.drawarea); + h = gtk_widget_get_height(gui.drawarea); + + if (motion_repeat_timer > 0) + timeout_remove(motion_repeat_timer); + + if (x < 0 || y < 0 || x >= w || y >= h) + { + int dx, dy; + int offshoot; + int delay; + + dx = x < 0 ? -x + mouse_press_x : x - mouse_press_x; + dy = y < 0 ? -y + mouse_press_y : y - mouse_press_y; + + offshoot = dx > dy ? dx : dy; + + if (offshoot > 127) + delay = 5; + else + delay = (130 * (127 - offshoot)) / 127 + 5; + + motion_repeat_timer = timeout_add(delay, + mouse_repeat_timer_cb, NULL); + } + else + motion_repeat_timer = 0; } + else + gui_mouse_moved((int)x, (int)y); // Only unhide if mouse actually moved. GTK seems to send a motion event // when switching tabs, causing the cursor to unhide. @@ -2139,7 +2227,7 @@ motion_notify_event(GtkEventControllerMotion *controller UNUSED, static void enter_notify_event(GtkEventControllerMotion *controller UNUSED, - double x UNUSED, double y UNUSED, gpointer data UNUSED) + double x, double y, gpointer data UNUSED) { prev_mouse_x = x; prev_mouse_y = y; diff --git a/src/version.c b/src/version.c index 45b222e7ad..6662a529e7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 704, /**/ 703, /**/ From 7aeab74687f92acff3ef3ab83a3c75dc0d3c2887 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 22 Jun 2026 19:36:59 +0000 Subject: [PATCH 008/647] patch 9.2.0705: :delete # silently fails to update "# and clobbers "0 Problem: ':delete #' silently fails to update "# and clobbers "0. Solution: Treat "# like "/, writable only with :let and setreg(). closes: #20592 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/doc/change.txt | 18 ++++++++++-------- runtime/doc/tags | 1 + src/errors.h | 4 ++-- src/po/vim.pot | 7 +++---- src/register.c | 9 ++++----- src/testdir/test_excmd.vim | 13 +++++++++++++ src/testdir/test_registers.vim | 1 + src/version.c | 2 ++ src/vim9compile.c | 2 +- 9 files changed, 37 insertions(+), 20 deletions(-) diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt index afcdca16b0..639484e339 100644 --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1,4 +1,4 @@ -*change.txt* For Vim version 9.2. Last change: 2026 Jun 18 +*change.txt* For Vim version 9.2. Last change: 2026 Jun 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1332,10 +1332,11 @@ and ":put" commands and with CTRL-R. the command was executed completely from a mapping. {not available when compiled without the |+cmdline_hist| feature} - *quote_#* *quote#* -6. Alternate file register "# + +6. Alternate file register "# *quote_#* *quote#* *@#* Contains the |alternate-file| name for current window -This register is writeable and changes which buffer CTRL-^ enters. +This register is writable with `:let` and |setreg()|. This changes which buffer +CTRL-^ enters. You can't yank or delete into this register. A String is matched against existing buffer names, like |:buffer|: > let @# = 'buffer_name' Also supports using buffer number and |file-pattern|. @@ -1398,11 +1399,12 @@ When writing to this register, nothing happens. This can be used to delete text without affecting the normal registers. When reading from this register, nothing is returned. -10. Last search pattern register "/ *quote_/* *quote/* +10. Last search pattern register "/ *quote_/* *quote/* Contains the most recent search-pattern. This is used for "n" and 'hlsearch'. -It is writable with `:let`, you can change it to have 'hlsearch' highlight -other matches without actually searching. You can't yank or delete into this -register. The search direction is available in |v:searchforward|. +This register is writable with `:let` and |setreg()|. You can change it to have +'hlsearch' highlight other matches without actually searching. You can't yank +or delete into this register. The search direction is available in +|v:searchforward|. Note that the value is restored when returning from a function |function-search-undo|. diff --git a/runtime/doc/tags b/runtime/doc/tags index 405e1254d4..11ae058bbc 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -4015,6 +4015,7 @@ $quote eval.txt /*$quote* ? pattern.txt /*?* ?? eval.txt /*??* @ repeat.txt /*@* +@# change.txt /*@#* @/ change.txt /*@\/* @: repeat.txt /*@:* @= change.txt /*@=* diff --git a/src/errors.h b/src/errors.h index 530e47c1d9..e1e7ada84d 100644 --- a/src/errors.h +++ b/src/errors.h @@ -2287,8 +2287,8 @@ EXTERN char e_line_count_changed_unexpectedly[] #ifdef FEAT_EVAL EXTERN char e_uniq_compare_function_failed[] INIT(= N_("E882: Uniq compare function failed")); -EXTERN char e_search_pattern_and_expression_register_may_not_contain_two_or_more_lines[] - INIT(= N_("E883: Search pattern and expression register may not contain two or more lines")); +EXTERN char e_register_char_cannot_contain_multiple_lines[] + INIT(= N_("E883: Register '%c' cannot contain multiple lines")); EXTERN char e_function_name_cannot_contain_colon_str[] INIT(= N_("E884: Function name cannot contain a colon: %s")); #endif diff --git a/src/po/vim.pot b/src/po/vim.pot index b185a51444..bbbf9f0cc2 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-06-16 19:21+0000\n" +"POT-Creation-Date: 2026-06-22 19:36+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -6678,9 +6678,8 @@ msgstr "" msgid "E882: Uniq compare function failed" msgstr "" -msgid "" -"E883: Search pattern and expression register may not contain two or more " -"lines" +#, c-format +msgid "E883: Register '%c' cannot contain multiple lines" msgstr "" #, c-format diff --git a/src/register.c b/src/register.c index 95a1145e43..5d22dc34a8 100644 --- a/src/register.c +++ b/src/register.c @@ -181,12 +181,11 @@ valid_yank_reg( if ( (regname > 0 && ASCII_ISALNUM(regname)) || (!writing && vim_strchr((char_u *) #ifdef FEAT_EVAL - "/.%:=" + "/#.%:=" #else - "/.%:" + "/#.%:" #endif , regname) != NULL) - || regname == '#' || regname == '"' || regname == '-' || regname == '_' @@ -3093,7 +3092,7 @@ write_reg_contents_lst( { yankreg_T *old_y_previous, *old_y_current; - if (name == '/' || name == '=') + if (name == '/' || name == '=' || name == '#') { char_u *s; @@ -3101,7 +3100,7 @@ write_reg_contents_lst( s = (char_u *)""; else if (strings[1] != NULL) { - emsg(_(e_search_pattern_and_expression_register_may_not_contain_two_or_more_lines)); + semsg(_(e_register_char_cannot_contain_multiple_lines), name); return; } else diff --git a/src/testdir/test_excmd.vim b/src/testdir/test_excmd.vim index 0de0771f78..eea75d7e5d 100644 --- a/src/testdir/test_excmd.vim +++ b/src/testdir/test_excmd.vim @@ -4,11 +4,24 @@ source util/screendump.vim func Test_ex_delete() new + call setline(1, ['a', 'b', 'c']) 2 " :dl is :delete with the "l" flag, not :dlist .dl call assert_equal(['a', 'c'], getline(1, 2)) + %delete _ + + " :delete # used to clobber "0 + call setreg('#', '') + call setreg('0', '') + call setline(1, ['a', 'b', 'c']) + call assert_fails("1delete #", 'E488:') + call assert_equal(['a', 'b', 'c'], getline(1, '$')) + call assert_equal('', getreg('#')) + call assert_equal('', getreg('0')) + + bw! endfunc func Test_range_error() diff --git a/src/testdir/test_registers.vim b/src/testdir/test_registers.vim index e1c493ac4b..d59da86b33 100644 --- a/src/testdir/test_registers.vim +++ b/src/testdir/test_registers.vim @@ -423,6 +423,7 @@ func Test_set_register() call assert_equal('', @=) call assert_fails("call setreg('/', ['a', 'b'])", 'E883:') call assert_fails("call setreg('=', ['a', 'b'])", 'E883:') + call assert_fails("call setreg('#', ['a', 'b'])", 'E883:') call assert_equal(0, setreg('_', ['a', 'b'])) " Test for recording to a invalid register diff --git a/src/version.c b/src/version.c index 6662a529e7..14fb4ea489 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 705, /**/ 704, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index aa9384bbe9..181df2a6fb 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1481,7 +1481,7 @@ valid_dest_reg(int name) { if (name == '@') name = '"'; - if (name == '/' || name == '=' || valid_yank_reg(name, TRUE)) + if (name == '/' || name == '=' || name == '#' || valid_yank_reg(name, TRUE)) return TRUE; emsg_invreg(name); return FAIL; From fc6d0d418d7508a0c9ec55306b937ba18d2cca25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E4=BA=91?= Date: Mon, 22 Jun 2026 19:43:17 +0000 Subject: [PATCH 009/647] runtime(beancount): Add support for non-ASCII account names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes: #20597 Signed-off-by: 依云 Signed-off-by: Christian Brabandt --- runtime/syntax/beancount.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/syntax/beancount.vim b/runtime/syntax/beancount.vim index 4909c4bc08..78d505eebb 100644 --- a/runtime/syntax/beancount.vim +++ b/runtime/syntax/beancount.vim @@ -2,6 +2,7 @@ " Language: beancount " Maintainer: Nathan Grigg " Latest Revision: 2024-11-25 +" 2026 Jun 22 by Vim Project: allow non-ASCII account names if exists("b:current_syntax") finish @@ -16,7 +17,7 @@ syn match beanAmount "\v[-+]?[[:digit:].,]+" nextgroup=beanCurrency contained \ skipwhite syn match beanCurrency "\v\w+" contained " Account name: alphanumeric with at least one colon. -syn match beanAccount "\v[[:alnum:]]+:[-[:alnum:]:]+" contained +syn match beanAccount "\v[[:alnum:]]+:\S+" contained syn match beanTag "\v#[-[:alnum:]]+" contained syn match beanLink "\v\^\S+" contained " We must require a space after the flag because you can have flags per From 6fd0a9cc303c94c9f894f7f52181bd0b1f06f4b3 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 22 Jun 2026 19:45:05 +0000 Subject: [PATCH 010/647] patch 9.2.0706: tests: test_terminal3 may fail when $SHELL is zsh Problem: tests: test_terminal3 may fail when the shell ($SHELL) is zsh with a custom prompt, because the prompt wraps the terminal line and shifts the expected output. Solution: Reset $HOME and $PS1 to sane defaults so the shell uses a minimal prompt, and adjust the expected window height. closes: #20599 Signed-off-by: Christian Brabandt --- src/testdir/test_terminal3.vim | 8 +++++--- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index 22d19909a5..cf87038ef1 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1197,7 +1197,7 @@ func Test_terminal_max_combining_chars() " somehow doesn't work on MS-Windows CheckUnix let cmd = "cat samples/terminal_max_combining_chars.txt\" - let buf = Run_shell_in_terminal({'term_rows': 15, 'term_cols': 35}) + let buf = Run_shell_in_terminal({'term_rows': 15, 'term_cols': 35, 'env': {'HOME': '/nonexisting', 'PS1':''}}) call TermWait(buf) call term_sendkeys(buf, cmd) " last char is a space with many combining chars @@ -1214,6 +1214,8 @@ func Test_term_getpos() defer delete('XTest_getpos_result') let lines =<< trim EOL + let $PS1='' + let $HOME='/nonexisting' term ++curwin sh EOL call writefile(lines, 'XTest_getpos', 'D') @@ -1243,8 +1245,8 @@ func Test_term_getpos() call WaitForAssert({-> assert_true(filereadable('XTest_getpos_result'))}) call WaitForAssert({-> assert_equal(2, len(readfile('XTest_getpos_result')))}) let result = readfile('XTest_getpos_result') - " 15 - 1: statusline - 1: for prompt line - call assert_equal(13, str2nr(result[1]) - str2nr(result[0])) + " 15 - 1: statusline - 1: for prompt line, w$-w0 = 12 + call assert_equal(12, str2nr(result[1]) - str2nr(result[0])) call assert_true(str2nr(result[0]) > 1) " Regression: line('w0') and line('w$') must not move cursor position diff --git a/src/version.c b/src/version.c index 14fb4ea489..e663c2117f 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 706, /**/ 705, /**/ From 4ed61e0a199d635c6cdaaff6c0657db3a8d3d445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Marek?= Date: Mon, 22 Jun 2026 19:55:32 +0000 Subject: [PATCH 011/647] runtime(dtrace): handle DTrace probe highlighting before action blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recognize DTrace probe descriptions that are followed immediately by an action block, such as: BEGIN{ trace(1); } syscall::open:entry{ trace(1); } The fourth probe field now consumes the remaining non-whitespace text, and the lookahead allows zero or more whitespace before the following token. closes: #20560 Signed-off-by: Vladimír Marek Signed-off-by: Christian Brabandt --- runtime/syntax/dtrace.vim | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runtime/syntax/dtrace.vim b/runtime/syntax/dtrace.vim index 392fa1c1c9..fcaa216fa7 100644 --- a/runtime/syntax/dtrace.vim +++ b/runtime/syntax/dtrace.vim @@ -4,6 +4,7 @@ " http://docs.sun.com/app/docs/doc/817-6223 " Version: 1.5 " Last Change: 2008/04/05 +" 2026 Jun 22 by Vim project: handle DTrace probe descriptions that are followed immediately by an action block " Maintainer: Nicolas Weber " dtrace lexer and parser are at @@ -35,8 +36,8 @@ syn match dtraceComment "\%^#!.*-s.*" " XXX: This allows a probe description to end with ',', even if it's not " followed by another probe. " XXX: This doesn't work if followed by a comment. -let s:oneProbe = '\%(BEGIN\|END\|ERROR\|\S\{-}:\S\{-}:\S\{-}:\S\{-}\)\_s*' -exec 'syn match dtraceProbe "'.s:oneProbe.'\%(,\_s*'.s:oneProbe.'\)*\ze\_s\%({\|\/[^*]\|\%$\)"' +let s:oneProbe = '\%(BEGIN\|END\|ERROR\|\S\{-}:\S\{-}:\S\{-}:\S*\)\_s*' +exec 'syn match dtraceProbe "'.s:oneProbe.'\%(,\_s*'.s:oneProbe.'\)*\ze\_s*\%({\|\/[^*]\|\_s*\S\|\%$\)"' " Note: We have to be careful to not make this match /* */ comments. " Also be careful not to eat `c = a / b; b = a / 2;`. We use the same From 4ed08ee60060ea7515422af97d251a96d6e54695 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 22 Jun 2026 20:05:58 +0000 Subject: [PATCH 012/647] runtime(doc): document Solaris as supported OS related: #20567 Signed-off-by: Christian Brabandt --- runtime/doc/vi_diff.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/doc/vi_diff.txt b/runtime/doc/vi_diff.txt index d87db7cc59..7b85800add 100644 --- a/runtime/doc/vi_diff.txt +++ b/runtime/doc/vi_diff.txt @@ -1,4 +1,4 @@ -*vi_diff.txt* For Vim version 9.2. Last change: 2026 Mar 08 +*vi_diff.txt* For Vim version 9.2. Last change: 2026 Jun 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1388,6 +1388,7 @@ macOS: | fully supported up until v10.6 (?) MS-Windows 7, 8, 10, 11: | fully supported OpenVMS: | supported QNX: | still supported (?) +Solaris: | supported (on maintained versions) UNIX: | supported (on maintained versions) zOS/OS390: | still supported (?) From d167c50de4b954e5ddd97208187c5b3b77dd89cc Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Mon, 22 Jun 2026 20:13:22 +0000 Subject: [PATCH 013/647] patch 9.2.0707: completion: popup misplaced when text before it is concealed Problem: When the cursor line has concealed text before the start of the completion, the insert-mode completion popup is drawn at the wrong screen column and the cursor no longer lines up with the completed text. Solution: Record the concealed width before the cursor on its screen line in a new `win_T` field while `win_line()` draws it, subtract it in `pum_display()` to place the menu over the visible text, and redraw the cursor line so `win_line()` corrects the cursor too. closes: #20539 Signed-off-by: Barrett Ruth Signed-off-by: Christian Brabandt --- src/drawline.c | 4 + src/insexpand.c | 9 ++ src/popupmenu.c | 11 +++ src/structs.h | 4 + ...est_pum_position_with_concealed_match.dump | 10 ++ .../Test_pum_position_with_concealed_rl.dump | 10 ++ ...Test_pum_position_with_concealed_text.dump | 10 ++ ...Test_pum_position_with_concealed_wrap.dump | 10 ++ src/testdir/test_ins_complete.vim | 98 +++++++++++++++++++ src/version.c | 2 + 10 files changed, 168 insertions(+) create mode 100644 src/testdir/dumps/Test_pum_position_with_concealed_match.dump create mode 100644 src/testdir/dumps/Test_pum_position_with_concealed_rl.dump create mode 100644 src/testdir/dumps/Test_pum_position_with_concealed_text.dump create mode 100644 src/testdir/dumps/Test_pum_position_with_concealed_wrap.dump diff --git a/src/drawline.c b/src/drawline.c index 86911cefc2..a2679e1467 100644 --- a/src/drawline.c +++ b/src/drawline.c @@ -3813,6 +3813,10 @@ win_line( else # endif wp->w_wcol = wlv.col - wlv.boguscols; + // Screen cells concealed before the cursor on this screen line, so + // pum_display() can line the menu up with the visible text; + // "skip_cells" is the concealed cell at the cursor not yet counted. + wp->w_wcol_conceal_off = wlv.vcol_off_co + skip_cells; if (wlv.vcol + skip_cells < wp->w_virtcol) // Cursor beyond end of the line with 'virtualedit'. wp->w_wcol += wp->w_virtcol - wlv.vcol - skip_cells; diff --git a/src/insexpand.c b/src/insexpand.c index 5adad45309..c7186b9297 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -1896,6 +1896,15 @@ ins_compl_show_pum(void) pum_display(compl_match_array, compl_match_arraysize, cur); curwin->w_cursor.col = col; +#ifdef FEAT_CONCEAL + // The cursor was temporarily moved to "compl_col" above to position the + // menu, so the screen update left w_wcol conceal-corrected for that column + // rather than for the real cursor. Redraw the cursor line so the caret is + // positioned correctly when the cursor line has concealed text. + if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin)) + redrawWinline(curwin, curwin->w_cursor.lnum); +#endif + // After adding leader, set the current match to shown match. if (compl_started && compl_curr_match != compl_shown_match) compl_curr_match = compl_shown_match; diff --git a/src/popupmenu.c b/src/popupmenu.c index b7929607d9..bed2495b87 100644 --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -361,6 +361,17 @@ pum_display( { // w_wcol includes virtual text "above" int wcol = curwin->w_wcol % curwin->w_width; +#ifdef FEAT_CONCEAL + // w_wcol does not account for text concealed before the cursor; + // shift by the offset win_line() recorded for the cursor line so the + // menu lines up with the visible text. + if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin)) + { + wcol -= curwin->w_wcol_conceal_off; + if (wcol < 0) + wcol = 0; + } +#endif #ifdef FEAT_RIGHTLEFT if (pum_rl) cursor_col = curwin->w_wincol + curwin->w_width - wcol - 1; diff --git a/src/structs.h b/src/structs.h index 5d6511a5a8..70010567d2 100644 --- a/src/structs.h +++ b/src/structs.h @@ -4367,6 +4367,10 @@ struct window_S * buffer, thus w_wrow is relative to w_winrow. */ int w_wrow, w_wcol; // cursor position in window +#ifdef FEAT_CONCEAL + int w_wcol_conceal_off; // screen cells concealed before w_wcol on + // the cursor's screen line, set by win_line() +#endif /* * Info about the lines currently in the window is remembered to avoid diff --git a/src/testdir/dumps/Test_pum_position_with_concealed_match.dump b/src/testdir/dumps/Test_pum_position_with_concealed_match.dump new file mode 100644 index 0000000000..f8d39c8bff --- /dev/null +++ b/src/testdir/dumps/Test_pum_position_with_concealed_match.dump @@ -0,0 +1,10 @@ +|++0#e0e0e08#6c6c6c255|f+0#0000000#ffffff0|o@1|b|a|r| @67 +|++0#e0e0e08#6c6c6c255|f+0#0000000#ffffff0|o@1|b|a|r> @67 +| +0#0000001#e0e0e08|f|o@1|b|a|r| @8| +0#4040ff13#ffffff0@58 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |K|e|y|w|o|r|d| |L|o|c|a|l| |c|o|m|p|l|e|t|i|o|n| |(|^|N|^|P|)| |T|h|e| |o|n|l|y| |m|a|t|c|h| +0&&@25 diff --git a/src/testdir/dumps/Test_pum_position_with_concealed_rl.dump b/src/testdir/dumps/Test_pum_position_with_concealed_rl.dump new file mode 100644 index 0000000000..c2f497a871 --- /dev/null +++ b/src/testdir/dumps/Test_pum_position_with_concealed_rl.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@68|r|a|b|o@1|f +| @67> |r|a|b|o@1|f +| +0#4040ff13&@59| +0#0000001#e0e0e08@8|r|a|b|o@1|f +| +0#4040ff13#ffffff0@73|~ +| @73|~ +| @73|~ +| @73|~ +| @73|~ +| @73|~ +|-+2#0000000&@1| |K|e|y|w|o|r|d| |L|o|c|a|l| |c|o|m|p|l|e|t|i|o|n| |(|^|N|^|P|)| |T|h|e| |o|n|l|y| |m|a|t|c|h| +0&&@25 diff --git a/src/testdir/dumps/Test_pum_position_with_concealed_text.dump b/src/testdir/dumps/Test_pum_position_with_concealed_text.dump new file mode 100644 index 0000000000..a30e2f86bb --- /dev/null +++ b/src/testdir/dumps/Test_pum_position_with_concealed_text.dump @@ -0,0 +1,10 @@ +|f+0&#ffffff0|o@1|b|a|r| @68 +|f|o@1|b|a|r> @68 +|f+0#0000001#e0e0e08|o@1|b|a|r| @8| +0#4040ff13#ffffff0@59 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |K|e|y|w|o|r|d| |L|o|c|a|l| |c|o|m|p|l|e|t|i|o|n| |(|^|N|^|P|)| |T|h|e| |o|n|l|y| |m|a|t|c|h| +0&&@25 diff --git a/src/testdir/dumps/Test_pum_position_with_concealed_wrap.dump b/src/testdir/dumps/Test_pum_position_with_concealed_wrap.dump new file mode 100644 index 0000000000..0f3a3cbe0f --- /dev/null +++ b/src/testdir/dumps/Test_pum_position_with_concealed_wrap.dump @@ -0,0 +1,10 @@ +|f+0&#ffffff0|o@1|b|a|r| @13 +|a@19 +| |f|o@1|b|a|r> @12 +| +0#0000001#e0e0e08|f|o@1|b|a|r| @8| +0#4040ff13#ffffff0@3 +|~| @18 +|~| @18 +|~| @18 +|~| @18 +|~| @18 +|-+2#0000000&@1| |T|h|e| |o|n|l|y| |m|a|t|c|h| +0&&@2 diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 93ca66f5a9..cb901d609f 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -870,6 +870,104 @@ func Test_pum_stopped_by_timer() call StopVimInTerminal(buf) endfunc +" The completion popup menu must line up with the start of the completed text +" on screen, also when there is concealed text before it on the line. +func Test_pum_position_with_concealed_text() + CheckScreendump + + let lines =<< trim END + call setline(1, ['CONCEALED foobar', 'CONCEALED foo']) + syntax match Hidden /CONCEALED / conceal + setlocal conceallevel=3 concealcursor=nvic + set completeopt=menu,menuone + END + + call writefile(lines, 'Xpumconceal', 'D') + let buf = RunVimInTerminal('-S Xpumconceal', #{rows: 10}) + call TermWait(buf, 50) + call term_sendkeys(buf, "2GA") + call TermWait(buf, 50) + call term_sendkeys(buf, "\\") + call VerifyScreenDump(buf, 'Test_pum_position_with_concealed_text', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + +" Same alignment when the concealed text comes from a match and is shown as a +" replacement character with 'conceallevel' 2. +func Test_pum_position_with_concealed_match() + CheckScreendump + + let lines =<< trim END + call setline(1, ['XXX foobar', 'XXX foo']) + call matchadd('Conceal', 'XXX ', 10, -1, {'conceal': '+'}) + setlocal conceallevel=2 concealcursor=nvic + set completeopt=menu,menuone + END + + call writefile(lines, 'Xpumconcealmatch', 'D') + let buf = RunVimInTerminal('-S Xpumconcealmatch', #{rows: 10}) + call TermWait(buf, 50) + call term_sendkeys(buf, "2GA") + call TermWait(buf, 50) + call term_sendkeys(buf, "\\") + call VerifyScreenDump(buf, 'Test_pum_position_with_concealed_match', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + +" The menu lines up with the visible text in a 'rightleft' window too, where +" the cursor screen column is mirrored. +func Test_pum_position_with_concealed_rl() + CheckScreendump + CheckFeature rightleft + + let lines =<< trim END + set rightleft + call setline(1, ['CONCEALED foobar', 'CONCEALED foo']) + syntax match Hidden /CONCEALED / conceal + setlocal conceallevel=3 concealcursor=nvic + set completeopt=menu,menuone + END + + call writefile(lines, 'Xpumconcealrl', 'D') + let buf = RunVimInTerminal('-S Xpumconcealrl', #{rows: 10}) + call TermWait(buf, 50) + call term_sendkeys(buf, "2GA") + call TermWait(buf, 50) + call term_sendkeys(buf, "\\") + call VerifyScreenDump(buf, 'Test_pum_position_with_concealed_rl', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + +" The recorded offset is per screen line, so the menu also lines up when the +" concealed text and the completion are on a wrapped continuation line. +func Test_pum_position_with_concealed_wrap() + CheckScreendump + + let lines =<< trim END + call setline(1, ['foobar', 'aaaaaaaaaaaaaaaaaaaa CONCEALED foo']) + syntax match Hidden /CONCEALED / conceal + setlocal conceallevel=3 concealcursor=nvic + set completeopt=menu,menuone + END + + call writefile(lines, 'Xpumconcealwrap', 'D') + let buf = RunVimInTerminal('-S Xpumconcealwrap', #{rows: 10, cols: 20}) + call TermWait(buf, 50) + call term_sendkeys(buf, "2GA") + call TermWait(buf, 50) + call term_sendkeys(buf, "\\") + call VerifyScreenDump(buf, 'Test_pum_position_with_concealed_wrap', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + func Test_complete_stopinsert_startinsert() nnoremap startinsert inoremap stopinsert diff --git a/src/version.c b/src/version.c index e663c2117f..ff0e68e1c7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 707, /**/ 706, /**/ From ccdc81701459a1e5d8f6d84221f34fcb7e127e50 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 23 Jun 2026 17:49:27 +0000 Subject: [PATCH 014/647] CI: Restore daily Coverity Scan I finally got a note that Coverity is online back again. This partially reverts commit 0abffbff23adc4ae6e3c78af921a8c9a8cb6670f. ("CI: Remove Cirrus CI and Coverity Scan") related: #20431 Signed-off-by: Christian Brabandt --- .github/workflows/coverity.yml | 85 ++++++++++++++++++++++++++++++++++ Filelist | 1 + README.md | 1 + ci/lychee.toml | 1 + runtime/doc/todo.txt | 5 +- 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/coverity.yml diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml new file mode 100644 index 0000000000..b4c64f3f28 --- /dev/null +++ b/.github/workflows/coverity.yml @@ -0,0 +1,85 @@ +name: Coverity +on: + schedule: + - cron: '42 0 * * *' # Run once per day, to avoid Coverity's submission limits + workflow_dispatch: + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + scan: + runs-on: ubuntu-24.04 + + env: + CC: gcc + DEBIAN_FRONTEND: noninteractive + TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} + + steps: + - name: Checkout repository from github + if: env.TOKEN + uses: actions/checkout@v6.0.2 + + - name: Download Coverity + if: env.TOKEN + run: | + wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=vim" -O coverity_tool.tgz + mkdir cov-scan + tar ax -f coverity_tool.tgz --strip-components=1 -C cov-scan + + - name: Install packages + if: env.TOKEN + run: | + sudo apt-get update && sudo apt-get install -y \ + autoconf \ + gettext \ + libcanberra-dev \ + libperl-dev \ + python3-dev \ + liblua5.4-dev \ + lua5.4 \ + ruby-dev \ + tcl-dev \ + libgtk2.0-dev \ + desktop-file-utils \ + libtool-bin \ + libsodium-dev + + - name: Set up environment + if: env.TOKEN + run: | + echo "$(pwd)/cov-scan/bin" >> $GITHUB_PATH + ( + echo "NPROC=$(getconf _NPROCESSORS_ONLN)" + echo "CONFOPT=--enable-perlinterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp" + ) >> $GITHUB_ENV + + - name: Configure + if: env.TOKEN + run: | + ./configure --with-features=huge ${CONFOPT} --enable-fail-if-missing + # Append various warning flags to CFLAGS. + sed -i -f ci/config.mk.sed src/auto/config.mk + sed -i -f ci/config.mk.${CC}.sed src/auto/config.mk + # -O2 gives false warning and turns it into an error: + # warning: function may return address of local variable [-Wreturn-local-addr] + sed -i 's/-O2 \?//' src/auto/config.mk + + - name: Build/scan vim + if: env.TOKEN + run: | + cov-build --dir cov-int make -j${NPROC} + + - name: Submit results + if: env.TOKEN + run: | + tar zcf cov-scan.tgz cov-int + curl --form token=$TOKEN \ + --form email=$EMAIL \ + --form file=@cov-scan.tgz \ + --form version="$(git rev-parse HEAD)" \ + --form description="Automatic GHA scan" \ + 'https://scan.coverity.com/builds?project=vim' + env: + EMAIL: ${{ secrets.COVERITY_SCAN_EMAIL }} diff --git a/Filelist b/Filelist index 8f36b1c66f..019fa1aeea 100644 --- a/Filelist +++ b/Filelist @@ -14,6 +14,7 @@ SRC_ALL = \ .github/workflows/ci-windows.yml \ .github/workflows/ci.yml \ .github/workflows/codeql-analysis.yml \ + .github/workflows/coverity.yml \ .github/workflows/link-check.yml \ .github/actions/build_vim_on_linux/action.yml \ .github/actions/test_artifacts/action.yml \ diff --git a/README.md b/README.md index 387e5b2bca..569aed94d4 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Github Build status](https://github.com/vim/vim/workflows/GitHub%20CI/badge.svg)](https://github.com/vim/vim/actions?query=workflow%3A%22GitHub+CI%22) [![Coverage Status](https://codecov.io/gh/vim/vim/coverage.svg?branch=master)](https://codecov.io/gh/vim/vim?branch=master) +[![Coverity Scan](https://scan.coverity.com/projects/241/badge.svg)](https://scan.coverity.com/projects/vim) [![Debian CI](https://badges.debian.net/badges/debian/testing/vim/version.svg)](https://buildd.debian.org/vim) [![Packages](https://repology.org/badge/tiny-repos/vim.svg)](https://repology.org/metapackage/vim) [![Fossies codespell report](https://fossies.org/linux/test/vim-master.tar.gz/codespell.svg)](https://fossies.org/linux/test/vim-master.tar.gz/codespell.html) diff --git a/ci/lychee.toml b/ci/lychee.toml index 515e4f54d9..8b9f0099f2 100644 --- a/ci/lychee.toml +++ b/ci/lychee.toml @@ -26,6 +26,7 @@ exclude = [ '^file://.*', '^https?://(www\.)?badges\.debian\.net/.*$', '^https?://(www\.)?repology\.org/.*$', + '^https?://scan\.coverity\.com/.*$', '^https?://(www\.)?img\.shields\.io/.*$', '^https?://(www\.)?fossies\.org/.*$', '^https?://(www\.)?adobe\.com.*$', diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 66b8f96ed5..f265b39689 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Jun 12 +*todo.txt* For Vim version 9.2. Last change: 2026 Jun 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1999,6 +1999,9 @@ Dominique can't reproduce it. ":function f(x) keepjumps" creates a function where every command is executed like it has ":keepjumps" before it. +Coverity: Check if there are new reported defects: +https://scan.coverity.com/projects/241 + Problem with editing file in binary mode. (Ingo Krabbe, 2009 Oct 8) Display error when 'tabline' that includes a file name with double-width From 8dfde7b3363151a228a69793ca8c940dd874506f Mon Sep 17 00:00:00 2001 From: Pooyan Khanjankhani Date: Tue, 23 Jun 2026 19:22:53 +0000 Subject: [PATCH 015/647] runtime(dnsmasq): add new keywords and order existing keywords alphabetically closes: #20616 Signed-off-by: Pooyan Khanjankhani Signed-off-by: Christian Brabandt --- runtime/syntax/dnsmasq.vim | 331 ++++++++++++++++++++++--------------- 1 file changed, 195 insertions(+), 136 deletions(-) diff --git a/runtime/syntax/dnsmasq.vim b/runtime/syntax/dnsmasq.vim index a4cc8b577b..c7064ea2ca 100644 --- a/runtime/syntax/dnsmasq.vim +++ b/runtime/syntax/dnsmasq.vim @@ -6,6 +6,7 @@ " File: runtime/syntax/dnsmasq.vim " Version: 2.76 " Last Change: 2015 Sep 27 +" 2026 Jun 23 by Vim project update dnsmasq keywords #20616 " Modeline: vim: ts=8:sw=2:sts=2: " " License: VIM License @@ -78,142 +79,200 @@ syn match DnsmasqKeywordSpecial "\:"me=e-1 syn match DnsmasqKeywordSpecial ",\"hs=s+1 contains=DnsmasqSpecial syn match DnsmasqKeywordSpecial "\:"me=e-1 -syn match DnsmasqKeyword "^\s*add-mac\>" -syn match DnsmasqKeyword "^\s*add-subnet\>" -syn match DnsmasqKeyword "^\s*addn-hosts\>" -syn match DnsmasqKeyword "^\s*address\>" -syn match DnsmasqKeyword "^\s*alias\>" -syn match DnsmasqKeyword "^\s*all-servers\>" -syn match DnsmasqKeyword "^\s*auth-zone\>" -syn match DnsmasqKeyword "^\s*bind-dynamic\>" -syn match DnsmasqKeyword "^\s*bind-interfaces\>" -syn match DnsmasqKeyword "^\s*bogus-nxdomain\>" -syn match DnsmasqKeyword "^\s*bogus-priv\>" -syn match DnsmasqKeyword "^\s*bootp-dynamic\>" -syn match DnsmasqKeyword "^\s*bridge-interface\>" -syn match DnsmasqKeyword "^\s*cache-size\>" -syn match DnsmasqKeyword "^\s*clear-on-reload\>" -syn match DnsmasqKeyword "^\s*cname\>" -syn match DnsmasqKeyword "^\s*conf-dir\>" -syn match DnsmasqKeyword "^\s*conf-file\>" -syn match DnsmasqKeyword "^\s*conntrack\>" -syn match DnsmasqKeyword "^\s*dhcp-alternate-port\>" -syn match DnsmasqKeyword "^\s*dhcp-authoritative\>" -syn match DnsmasqKeyword "^\s*dhcp-boot\>" -syn match DnsmasqKeyword "^\s*dhcp-broadcast\>" -syn match DnsmasqKeyword "^\s*dhcp-circuitid\>" -syn match DnsmasqKeyword "^\s*dhcp-client-update\>" -syn match DnsmasqKeyword "^\s*dhcp-duid\>" -syn match DnsmasqKeyword "^\s*dhcp-fqdn\>" -syn match DnsmasqKeyword "^\s*dhcp-generate-names\>" -syn match DnsmasqKeyword "^\s*dhcp-host\>" -syn match DnsmasqKeyword "^\s*dhcp-hostsfile\>" -syn match DnsmasqKeyword "^\s*dhcp-ignore\>" -syn match DnsmasqKeyword "^\s*dhcp-ignore-names\>" -syn match DnsmasqKeyword "^\s*dhcp-lease-max\>" -syn match DnsmasqKeyword "^\s*dhcp-leasefile\>" -syn match DnsmasqKeyword "^\s*dhcp-luascript\>" -syn match DnsmasqKeyword "^\s*dhcp-mac\>" -syn match DnsmasqKeyword "^\s*dhcp-match\>" -syn match DnsmasqKeyword "^\s*dhcp-no-override\>" -syn match DnsmasqKeyword "^\s*dhcp-option\>" -syn match DnsmasqKeyword "^\s*dhcp-option-force\>" -syn match DnsmasqKeyword "^\s*dhcp-optsfile\>" -syn match DnsmasqKeyword "^\s*dhcp-proxy\>" -syn match DnsmasqKeyword "^\s*dhcp-range\>" -syn match DnsmasqKeyword "^\s*dhcp-relay\>" -syn match DnsmasqKeyword "^\s*dhcp-remoteid\>" -syn match DnsmasqKeyword "^\s*dhcp-script\>" -syn match DnsmasqKeyword "^\s*dhcp-scriptuser\>" -syn match DnsmasqKeyword "^\s*dhcp-sequential-ip\>" -syn match DnsmasqKeyword "^\s*dhcp-subscrid\>" -syn match DnsmasqKeyword "^\s*dhcp-userclass\>" -syn match DnsmasqKeyword "^\s*dhcp-vendorclass\>" -syn match DnsmasqKeyword "^\s*dhcp-hostsdir\>" -syn match DnsmasqKeyword "^\s*dns-rr\>" -syn match DnsmasqKeyword "^\s*dnssec\>" -syn match DnsmasqKeyword "^\s*dnssec-check-unsigned\>" -syn match DnsmasqKeyword "^\s*dnssec-no-timecheck\>" -syn match DnsmasqKeyword "^\s*dnssec-timestamp\>" -syn match DnsmasqKeyword "^\s*dns-forward-max\>" -syn match DnsmasqKeyword "^\s*domain\>" -syn match DnsmasqKeyword "^\s*domain-needed\>" -syn match DnsmasqKeyword "^\s*edns-packet-max\>" -syn match DnsmasqKeyword "^\s*enable-dbus\>" -syn match DnsmasqKeyword "^\s*enable-ra\>" -syn match DnsmasqKeyword "^\s*enable-tftp\>" -syn match DnsmasqKeyword "^\s*except-interface\>" -syn match DnsmasqKeyword "^\s*expand-hosts\>" -syn match DnsmasqKeyword "^\s*filterwin2k\>" -syn match DnsmasqKeyword "^\s*group\>" -syn match DnsmasqKeyword "^\s*host-record\>" -syn match DnsmasqKeyword "^\s*interface\>" -syn match DnsmasqKeyword "^\s*interface-name\>" -syn match DnsmasqKeyword "^\s*ipset\>" -syn match DnsmasqKeyword "^\s*ignore-address\>" -syn match DnsmasqKeyword "^\s*keep-in-foreground\>" -syn match DnsmasqKeyword "^\s*leasefile-ro\>" -syn match DnsmasqKeyword "^\s*listen-address\>" -syn match DnsmasqKeyword "^\s*local\>" -syn match DnsmasqKeyword "^\s*localmx\>" -syn match DnsmasqKeyword "^\s*local-ttl\>" -syn match DnsmasqKeyword "^\s*local-service\>" -syn match DnsmasqKeyword "^\s*localise-queries\>" -syn match DnsmasqKeyword "^\s*log-async\>" -syn match DnsmasqKeyword "^\s*log-dhcp\>" -syn match DnsmasqKeyword "^\s*log-facility\>" -syn match DnsmasqKeyword "^\s*log-queries\>" -syn match DnsmasqKeyword "^\s*max-ttl\>" -syn match DnsmasqKeyword "^\s*max-cache-ttl\>" -syn match DnsmasqKeyword "^\s*min-cache-ttl\>" -syn match DnsmasqKeyword "^\s*min-port\>" -syn match DnsmasqKeyword "^\s*mx-host\>" -syn match DnsmasqKeyword "^\s*mx-target\>" -syn match DnsmasqKeyword "^\s*naptr-record\>" -syn match DnsmasqKeyword "^\s*neg-ttl\>" -syn match DnsmasqKeyword "^\s*no-daemon\>" -syn match DnsmasqKeyword "^\s*no-dhcp-interface\>" -syn match DnsmasqKeyword "^\s*no-hosts\>" -syn match DnsmasqKeyword "^\s*no-negcache\>" -syn match DnsmasqKeyword "^\s*no-ping\>" -syn match DnsmasqKeyword "^\s*no-poll\>" -syn match DnsmasqKeyword "^\s*no-resolv\>" -syn match DnsmasqKeyword "^\s*pid-file\>" -syn match DnsmasqKeyword "^\s*port\>" -syn match DnsmasqKeyword "^\s*proxy-dnssec\>" -syn match DnsmasqKeyword "^\s*ptr-record\>" -syn match DnsmasqKeyword "^\s*pxe-prompt\>" -syn match DnsmasqKeyword "^\s*pxe-service\>" -syn match DnsmasqKeyword "^\s*query-port\>" -syn match DnsmasqKeyword "^\s*quiet-ra\>" -syn match DnsmasqKeyword "^\s*quiet-dhcp\>" -syn match DnsmasqKeyword "^\s*quiet-dhcp6\>" -syn match DnsmasqKeyword "^\s*ra-param\>" -syn match DnsmasqKeyword "^\s*read-ethers\>" -syn match DnsmasqKeyword "^\s*rebind-domain-ok\>" -syn match DnsmasqKeyword "^\s*rebind-localhost-ok\>" -syn match DnsmasqKeyword "^\s*resolv-file\>" -syn match DnsmasqKeyword "^\s*rev-server\>" -syn match DnsmasqKeyword "^\s*selfmx\>" -syn match DnsmasqKeyword "^\s*server\>" -syn match DnsmasqKeyword "^\s*servers-file\>" -syn match DnsmasqKeyword "^\s*srv-host\>" -syn match DnsmasqKeyword "^\s*stop-dns-rebind\>" -syn match DnsmasqKeyword "^\s*strict-order\>" -syn match DnsmasqKeyword "^\s*synth-domain\>" -syn match DnsmasqKeyword "^\s*tag-if\>" -syn match DnsmasqKeyword "^\s*test\>" -syn match DnsmasqKeyword "^\s*tftp-max\>" -syn match DnsmasqKeyword "^\s*tftp-lowercase\>" -syn match DnsmasqKeyword "^\s*tftp-no-blocksize\>" -syn match DnsmasqKeyword "^\s*tftp-no-fail\>" -syn match DnsmasqKeyword "^\s*tftp-port-range\>" -syn match DnsmasqKeyword "^\s*tftp-root\>" -syn match DnsmasqKeyword "^\s*tftp-secure\>" -syn match DnsmasqKeyword "^\s*tftp-unique-root\>" -syn match DnsmasqKeyword "^\s*txt-record\>" -syn match DnsmasqKeyword "^\s*user\>" -syn match DnsmasqKeyword "^\s*version\>" +syn match DnsmasqKeyword "^\s*\zsadd-cpe-id\>" +syn match DnsmasqKeyword "^\s*\zsadd-mac\>" +syn match DnsmasqKeyword "^\s*\zsadd-subnet\>" +syn match DnsmasqKeyword "^\s*\zsaddn-hosts\>" +syn match DnsmasqKeyword "^\s*\zsaddress\>" +syn match DnsmasqKeyword "^\s*\zsalias\>" +syn match DnsmasqKeyword "^\s*\zsall-servers\>" +syn match DnsmasqKeyword "^\s*\zsauth-peer\>" +syn match DnsmasqKeyword "^\s*\zsauth-sec-servers\>" +syn match DnsmasqKeyword "^\s*\zsauth-server\>" +syn match DnsmasqKeyword "^\s*\zsauth-soa\>" +syn match DnsmasqKeyword "^\s*\zsauth-ttl\>" +syn match DnsmasqKeyword "^\s*\zsauth-zone\>" +syn match DnsmasqKeyword "^\s*\zsbind-dynamic\>" +syn match DnsmasqKeyword "^\s*\zsbind-interfaces\>" +syn match DnsmasqKeyword "^\s*\zsbogus-nxdomain\>" +syn match DnsmasqKeyword "^\s*\zsbogus-priv\>" +syn match DnsmasqKeyword "^\s*\zsbootp-dynamic\>" +syn match DnsmasqKeyword "^\s*\zsbridge-interface\>" +syn match DnsmasqKeyword "^\s*\zscaa-record\>" +syn match DnsmasqKeyword "^\s*\zscache-rr\>" +syn match DnsmasqKeyword "^\s*\zscache-size\>" +syn match DnsmasqKeyword "^\s*\zsclear-on-reload\>" +syn match DnsmasqKeyword "^\s*\zscname\>" +syn match DnsmasqKeyword "^\s*\zsconf-dir\>" +syn match DnsmasqKeyword "^\s*\zsconf-file\>" +syn match DnsmasqKeyword "^\s*\zsconf-script\>" +syn match DnsmasqKeyword "^\s*\zsconnmark-allowlist-enable\>" +syn match DnsmasqKeyword "^\s*\zsconnmark-allowlist\>" +syn match DnsmasqKeyword "^\s*\zsconntrack\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-alternate-port\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-authoritative\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-boot\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-broadcast\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-circuitid\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-client-update\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-duid\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-fqdn\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-generate-names\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-host\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-hostsdir\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-hostsfile\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-ignore-clid\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-ignore-names\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-ignore\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-lease-max\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-leasefile\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-luascript\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-mac\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-match\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-name-match\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-no-override\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-option-force\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-option-pxe\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-option\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-optsdir\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-optsfile\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-proxy\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-pxe-vendor\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-range\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-rapid-commit\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-relay\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-remoteid\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-reply-delay\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-script\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-scriptuser\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-sequential-ip\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-split-relay\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-subscrid\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-ttl\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-userclass\>" +syn match DnsmasqKeyword "^\s*\zsdhcp-vendorclass\>" +syn match DnsmasqKeyword "^\s*\zsdns-forward-max\>" +syn match DnsmasqKeyword "^\s*\zsdns-loop-detect\>" +syn match DnsmasqKeyword "^\s*\zsdns-rr\>" +syn match DnsmasqKeyword "^\s*\zsdnssec-check-unsigned\>" +syn match DnsmasqKeyword "^\s*\zsdnssec-debug\>" +syn match DnsmasqKeyword "^\s*\zsdnssec-limits\>" +syn match DnsmasqKeyword "^\s*\zsdnssec-no-timecheck\>" +syn match DnsmasqKeyword "^\s*\zsdnssec-timestamp\>" +syn match DnsmasqKeyword "^\s*\zsdnssec\>" +syn match DnsmasqKeyword "^\s*\zsdo-0x20-encode\>" +syn match DnsmasqKeyword "^\s*\zsdo-x20-encode\>" +syn match DnsmasqKeyword "^\s*\zsdomain-needed\>" +syn match DnsmasqKeyword "^\s*\zsdomain\>" +syn match DnsmasqKeyword "^\s*\zsdumpfile\>" +syn match DnsmasqKeyword "^\s*\zsdumpmask\>" +syn match DnsmasqKeyword "^\s*\zsdynamic-host\>" +syn match DnsmasqKeyword "^\s*\zsedns-packet-max\>" +syn match DnsmasqKeyword "^\s*\zsenable-dbus\>" +syn match DnsmasqKeyword "^\s*\zsenable-ra\>" +syn match DnsmasqKeyword "^\s*\zsenable-tftp\>" +syn match DnsmasqKeyword "^\s*\zsenable-ubus\>" +syn match DnsmasqKeyword "^\s*\zsexcept-interface\>" +syn match DnsmasqKeyword "^\s*\zsexpand-hosts\>" +syn match DnsmasqKeyword "^\s*\zsfast-dns-retry\>" +syn match DnsmasqKeyword "^\s*\zsfilter-AAAA\>" +syn match DnsmasqKeyword "^\s*\zsfilter-A\>" +syn match DnsmasqKeyword "^\s*\zsfilter-rr\>" +syn match DnsmasqKeyword "^\s*\zsfilterwin2k\>" +syn match DnsmasqKeyword "^\s*\zsgroup\>" +syn match DnsmasqKeyword "^\s*\zshelp\>" +syn match DnsmasqKeyword "^\s*\zshost-record\>" +syn match DnsmasqKeyword "^\s*\zshostsdir\>" +syn match DnsmasqKeyword "^\s*\zsignore-address\>" +syn match DnsmasqKeyword "^\s*\zsinterface-name\>" +syn match DnsmasqKeyword "^\s*\zsinterface\>" +syn match DnsmasqKeyword "^\s*\zsipset\>" +syn match DnsmasqKeyword "^\s*\zskeep-in-foreground\>" +syn match DnsmasqKeyword "^\s*\zsleasefile-ro\>" +syn match DnsmasqKeyword "^\s*\zsleasequery\>" +syn match DnsmasqKeyword "^\s*\zslisten-address\>" +syn match DnsmasqKeyword "^\s*\zslocal-service\>" +syn match DnsmasqKeyword "^\s*\zslocal-ttl\>" +syn match DnsmasqKeyword "^\s*\zslocal\>" +syn match DnsmasqKeyword "^\s*\zslocalise-queries\>" +syn match DnsmasqKeyword "^\s*\zslocalmx\>" +syn match DnsmasqKeyword "^\s*\zslog-async\>" +syn match DnsmasqKeyword "^\s*\zslog-debug\>" +syn match DnsmasqKeyword "^\s*\zslog-dhcp\>" +syn match DnsmasqKeyword "^\s*\zslog-facility\>" +syn match DnsmasqKeyword "^\s*\zslog-malloc\>" +syn match DnsmasqKeyword "^\s*\zslog-queries\>" +syn match DnsmasqKeyword "^\s*\zsmax-cache-ttl\>" +syn match DnsmasqKeyword "^\s*\zsmax-port\>" +syn match DnsmasqKeyword "^\s*\zsmax-tcp-connections\>" +syn match DnsmasqKeyword "^\s*\zsmax-ttl\>" +syn match DnsmasqKeyword "^\s*\zsmin-cache-ttl\>" +syn match DnsmasqKeyword "^\s*\zsmin-port\>" +syn match DnsmasqKeyword "^\s*\zsmx-host\>" +syn match DnsmasqKeyword "^\s*\zsmx-target\>" +syn match DnsmasqKeyword "^\s*\zsnaptr-record\>" +syn match DnsmasqKeyword "^\s*\zsneg-ttl\>" +syn match DnsmasqKeyword "^\s*\zsnftset\>" +syn match DnsmasqKeyword "^\s*\zsno-0x20-encode\>" +syn match DnsmasqKeyword "^\s*\zsno-daemon\>" +syn match DnsmasqKeyword "^\s*\zsno-dhcp-interface\>" +syn match DnsmasqKeyword "^\s*\zsno-dhcpv4-interface\>" +syn match DnsmasqKeyword "^\s*\zsno-dhcpv6-interface\>" +syn match DnsmasqKeyword "^\s*\zsno-hosts\>" +syn match DnsmasqKeyword "^\s*\zsno-ident\>" +syn match DnsmasqKeyword "^\s*\zsno-negcache\>" +syn match DnsmasqKeyword "^\s*\zsno-ping\>" +syn match DnsmasqKeyword "^\s*\zsno-poll\>" +syn match DnsmasqKeyword "^\s*\zsno-resolv\>" +syn match DnsmasqKeyword "^\s*\zsno-round-robin\>" +syn match DnsmasqKeyword "^\s*\zspid-file\>" +syn match DnsmasqKeyword "^\s*\zsport-limit\>" +syn match DnsmasqKeyword "^\s*\zsport\>" +syn match DnsmasqKeyword "^\s*\zsproxy-dnssec\>" +syn match DnsmasqKeyword "^\s*\zsptr-record\>" +syn match DnsmasqKeyword "^\s*\zspxe-prompt\>" +syn match DnsmasqKeyword "^\s*\zspxe-service\>" +syn match DnsmasqKeyword "^\s*\zsquery-port\>" +syn match DnsmasqKeyword "^\s*\zsquiet-dhcp6\>" +syn match DnsmasqKeyword "^\s*\zsquiet-dhcp\>" +syn match DnsmasqKeyword "^\s*\zsquiet-ra\>" +syn match DnsmasqKeyword "^\s*\zsquiet-tftp\>" +syn match DnsmasqKeyword "^\s*\zsra-param\>" +syn match DnsmasqKeyword "^\s*\zsread-ethers\>" +syn match DnsmasqKeyword "^\s*\zsrebind-domain-ok\>" +syn match DnsmasqKeyword "^\s*\zsrebind-localhost-ok\>" +syn match DnsmasqKeyword "^\s*\zsresolv-file\>" +syn match DnsmasqKeyword "^\s*\zsrev-server\>" +syn match DnsmasqKeyword "^\s*\zsscript-arp\>" +syn match DnsmasqKeyword "^\s*\zsscript-on-renewal\>" +syn match DnsmasqKeyword "^\s*\zsselfmx\>" +syn match DnsmasqKeyword "^\s*\zsserver\>" +syn match DnsmasqKeyword "^\s*\zsservers-file\>" +syn match DnsmasqKeyword "^\s*\zsshared-network\>" +syn match DnsmasqKeyword "^\s*\zssrv-host\>" +syn match DnsmasqKeyword "^\s*\zsstop-dns-rebind\>" +syn match DnsmasqKeyword "^\s*\zsstrict-order\>" +syn match DnsmasqKeyword "^\s*\zsstrip-mac\>" +syn match DnsmasqKeyword "^\s*\zsstrip-subnet\>" +syn match DnsmasqKeyword "^\s*\zssynth-domain\>" +syn match DnsmasqKeyword "^\s*\zstag-if\>" +syn match DnsmasqKeyword "^\s*\zstest\>" +syn match DnsmasqKeyword "^\s*\zstftp-lowercase\>" +syn match DnsmasqKeyword "^\s*\zstftp-max\>" +syn match DnsmasqKeyword "^\s*\zstftp-mtu\>" +syn match DnsmasqKeyword "^\s*\zstftp-no-blocksize\>" +syn match DnsmasqKeyword "^\s*\zstftp-no-fail\>" +syn match DnsmasqKeyword "^\s*\zstftp-port-range\>" +syn match DnsmasqKeyword "^\s*\zstftp-root\>" +syn match DnsmasqKeyword "^\s*\zstftp-secure\>" +syn match DnsmasqKeyword "^\s*\zstftp-single-port\>" +syn match DnsmasqKeyword "^\s*\zstftp-unique-root\>" +syn match DnsmasqKeyword "^\s*\zstrust-anchor\>" +syn match DnsmasqKeyword "^\s*\zstxt-record\>" +syn match DnsmasqKeyword "^\s*\zsumbrella\>" +syn match DnsmasqKeyword "^\s*\zsuse-stale-cache\>" +syn match DnsmasqKeyword "^\s*\zsuser\>" +syn match DnsmasqKeyword "^\s*\zsversion\>" if b:dnsmasq_backrgound_light == 1 From 98f5171ef6ba9aa6aea7223e833115e544199bd4 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 23 Jun 2026 19:44:48 +0000 Subject: [PATCH 016/647] patch 9.2.0708: Leaks in do_autocmd in error case Problem: Leak in do_autocmd in error case (Cheng) Solution: goto err_exit in the error case and clean up, make the double ++once an actual error closes: #20606 Signed-off-by: Christian Brabandt --- src/autocmd.c | 12 ++++++++---- src/testdir/test_autocmd.vim | 33 +++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/autocmd.c b/src/autocmd.c index 2e7f1efd01..98014cf037 100644 --- a/src/autocmd.c +++ b/src/autocmd.c @@ -1025,7 +1025,10 @@ do_autocmd(exarg_T *eap, char_u *arg_in, int forceit) if (STRNCMP(cmd, "++once", 6) == 0 && VIM_ISWHITE(cmd[6])) { if (once) + { semsg(_(e_duplicate_argument_str), "++once"); + goto err_exit; + } once = TRUE; cmd = skipwhite(cmd + 6); } @@ -1036,7 +1039,7 @@ do_autocmd(exarg_T *eap, char_u *arg_in, int forceit) if (nested) { semsg(_(e_duplicate_argument_str), "++nested"); - return; + goto err_exit; } nested = TRUE; cmd = skipwhite(cmd + 8); @@ -1051,12 +1054,12 @@ do_autocmd(exarg_T *eap, char_u *arg_in, int forceit) // be removed and "nested" accepted as the start of the // command. emsg(_(e_invalid_command_nested_did_you_mean_plusplus_nested)); - return; + goto err_exit; } if (nested) { semsg(_(e_duplicate_argument_str), "nested"); - return; + goto err_exit; } nested = TRUE; cmd = skipwhite(cmd + 6); @@ -1075,7 +1078,7 @@ do_autocmd(exarg_T *eap, char_u *arg_in, int forceit) cmd = expand_sfile(cmd); if (cmd == NULL) // some error - return; + goto err_exit; cmd_need_free = TRUE; } } @@ -1111,6 +1114,7 @@ do_autocmd(exarg_T *eap, char_u *arg_in, int forceit) break; } +err_exit: if (cmd_need_free) vim_free(cmd); vim_free(tofree); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 54116a5857..4828b3ea9e 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -3208,8 +3208,41 @@ func Test_autocmd_once() close call assert_fails('au WinNew * ++once ++once echo bad', 'E983:') + call assert_false(exists('#WinNew')) endfunc +func Test_autocmd_dup_arg() + " Duplicate ++once / ++nested, or the legacy "nested" used twice, must + " error out *and* not create the autocommand. Using an environment + " variable in the pattern also exercises the error-exit path that frees + " the expanded pattern (checked by the address/leak sanitizers). + augroup XdupTest + au! + augroup END + let $XAUTODIR = 'Xfoo' + + " New behavior: duplicate ++once now aborts, the autocmd is not added + call assert_fails('au XdupTest WinNew $XAUTODIR/* ++once ++once echo bad', 'E983:') + call assert_false(exists('#XdupTest#WinNew')) + + call assert_fails('au XdupTest WinNew $XAUTODIR/* ++nested ++nested echo bad', 'E983:') + call assert_false(exists('#XdupTest#WinNew')) + + call assert_fails('au XdupTest WinNew $XAUTODIR/* nested nested echo bad', 'E983:') + call assert_false(exists('#XdupTest#WinNew')) + + " "nested" without "++" is rejected in Vim9 script (also frees the pattern) + call assert_fails('vim9cmd au XdupTest WinNew $XAUTODIR/* nested echo bad', 'E1078:') + call assert_false(exists('#XdupTest#WinNew')) + + augroup XdupTest + au! + augroup END + augroup! XdupTest + let $XAUTODIR = '' +endfunc + + func Test_autocmd_bufreadpre() new let b:bufreadpre = 1 diff --git a/src/version.c b/src/version.c index ff0e68e1c7..753a36d2de 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 708, /**/ 707, /**/ From 2fd83d0ddcaa2120dfc5fe5e7746c7c5e73db92a Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Tue, 23 Jun 2026 19:51:54 +0000 Subject: [PATCH 017/647] patch 9.2.0709: GTK4: a few minor issues Problem: GTK4: a few minor issues Solution: Update docs for 'mouseshape' option, remove unnecessary code, respect "v" flag in 'guioptions' (Foxe Chen) closes: #20609 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 4 ++-- src/gui_gtk4.c | 21 ++++++++++----------- src/version.c | 2 ++ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 9743dea438..7339133c6d 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Jun 17 +*options.txt* For Vim version 9.2. Last change: 2026 Jun 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -6458,7 +6458,7 @@ A jump table for the options with a short description can be found at |Q_op|. x any X11 pointer number (see X11/cursorfont.h) The "avail" column contains a 'w' if the shape is available for Win32, - x for X11 (including GTK+ 2), g for GTK+ 3. + x for X11 (including GTK+ 2), g for GTK+ 3 and GTK 4. Any modes not specified or shapes not available use the normal mouse pointer. diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index bcadb31a56..5126f99198 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -2217,8 +2217,9 @@ motion_notify_event(GtkEventControllerMotion *controller UNUSED, // Only unhide if mouse actually moved. GTK seems to send a motion event // when switching tabs, causing the cursor to unhide. - if (p_mh && fabs(prev_mouse_x - x) > 0.05 - && fabs(prev_mouse_y - y) > 0.05) + if (p_mh && ((prev_mouse_x == -1 || prev_mouse_y == -1) + || (fabs(prev_mouse_x - x) > 0.05 + && fabs(prev_mouse_y - y) > 0.05))) gui_mch_mousehide(FALSE); prev_mouse_x = x; @@ -4362,17 +4363,9 @@ mch_set_mouse_shape(int shape) last_shape = shape; } -#else // !FEAT_MOUSESHAPE - - void -mch_set_mouse_shape(int shape UNUSED) -{ -} - #endif // FEAT_MOUSESHAPE - /* * Menus, scrollbars, dialogs, toolbar. * (merged from gui_gtk4.c) @@ -5362,10 +5355,16 @@ gui_mch_dialog( if (buttons != NULL) { - GtkWidget *but_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + GtkWidget *but_box; char **buttons_arr; // Note that array is allocated, not strings int n_buttons; + // Check 'v' flag in 'guioptions': vertical button placement. + if (vim_strchr(p_go, GO_VERTICAL) != NULL) + but_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + else + but_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + gtk_widget_set_halign(but_box, GTK_ALIGN_CENTER); gtk_box_set_homogeneous(GTK_BOX(but_box), TRUE); gtk_box_append(GTK_BOX(vertbox), but_box); diff --git a/src/version.c b/src/version.c index 753a36d2de..3f52cbadff 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 709, /**/ 708, /**/ From 7908164c9d6a5ac7bda34d45681d6f298e32419d Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Tue, 23 Jun 2026 20:03:31 +0000 Subject: [PATCH 018/647] patch 9.2.0710: GTK4 GUI resize handling can be improved Problem: GTK4 GUI resize handling can be improved Solution: Remove the resize debounce, set the draw area's size request in gui_mch_set_text_area_pos() via vim_form_move_resize() (Foxe Chen). reverts: #20327 closes: #20486 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.c | 15 ++++++ src/gui.h | 4 ++ src/gui_gtk4.c | 114 +++++++++++++++++------------------------ src/gui_gtk4_da.c | 68 ++++++++++-------------- src/gui_gtk4_f.c | 9 +--- src/proto/gui_gtk4.pro | 2 + src/version.c | 2 + 7 files changed, 99 insertions(+), 115 deletions(-) diff --git a/src/gui.c b/src/gui.c index 0cd586114a..0ca09d8eb1 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1625,6 +1625,14 @@ gui_resize_shell(int pixel_width, int pixel_height) gui_position_components(pixel_width); gui_reset_scroll_region(); +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) && !defined(USE_GTK4_SNAPSHOT) + // We do not resize the draw area via the "resize" signal. This is because + // when the window is resized, the form widget is the one that is resized, + // so let that call gui_resize_shell() which will allocate the surface and + // allocate the drawing area size/position. + gui_gtk4_resize(pixel_width, pixel_height); +#endif + /* * At the "more" and ":confirm" prompt there is no redraw, put the cursor * at the last line here (why does it have to be one row too low?). @@ -1647,6 +1655,9 @@ gui_resize_shell(int pixel_width, int pixel_height) gui_update_scrollbars(TRUE); gui_update_cursor(FALSE, TRUE); +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) + gui_gtk_calculate_bleed(pixel_width, pixel_height); +#endif #if defined(FEAT_XIM) && !defined(FEAT_GUI_GTK) xim_set_status_area(); #endif @@ -1821,6 +1832,10 @@ gui_set_shellsize( gui_position_components(width); gui_update_scrollbars(TRUE); gui_reset_scroll_region(); + +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) + gui_gtk_calculate_bleed(width, height); +#endif } /* diff --git a/src/gui.h b/src/gui.h index 674601e0f7..78ad3a09bb 100644 --- a/src/gui.h +++ b/src/gui.h @@ -273,6 +273,10 @@ typedef struct Gui #ifdef FEAT_DIRECTX bool directx_enabled; // DirectX (DirectWrite) rendering active #endif +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) + int bleed_right; // Number of pixels to bleed bg color right + int bleed_bot; // Number of pixels to bleed bg color down +#endif #ifdef FEAT_MENU # ifndef FEAT_GUI_GTK diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 5126f99198..7084516d87 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -299,12 +299,9 @@ static void tabline_menu_press_event(GtkGestureClick *gesture, int n_press, doub static void mainwin_destroy_cb(GObject *object, gpointer data); static gboolean delete_event_cb(GtkWindow *window, gpointer data); static void mainwin_fullscreened_cb(GObject *obj, GParamSpec *pspec, gpointer user_data); -#ifndef USE_GTK4_SNAPSHOT static void drawarea_realize_cb(GtkWidget *widget, gpointer data); -#endif static void drawarea_unrealize_cb(GtkWidget *widget, gpointer data); #ifndef USE_GTK4_SNAPSHOT -static void drawarea_resize_cb(GtkDrawingArea *area, int width, int height, gpointer data); static void drawarea_scale_factor_cb(GObject *object, GParamSpec *pspec, gpointer data); static cairo_surface_t *create_backing_surface(int width, int height); #endif @@ -598,13 +595,11 @@ gui_mch_init(void) gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(gui.drawarea), (GtkDrawingAreaDrawFunc)draw_event, NULL, NULL); - g_signal_connect(G_OBJECT(gui.drawarea), "resize", - G_CALLBACK(drawarea_resize_cb), NULL); g_signal_connect(G_OBJECT(gui.drawarea), "notify::scale-factor", G_CALLBACK(drawarea_scale_factor_cb), NULL); +#endif g_signal_connect(G_OBJECT(gui.drawarea), "realize", G_CALLBACK(drawarea_realize_cb), NULL); -#endif g_signal_connect(G_OBJECT(gui.drawarea), "unrealize", G_CALLBACK(drawarea_unrealize_cb), NULL); @@ -887,10 +882,10 @@ gui_mch_newfont(void) { int w, h; + // Do not subtract width and height with menubar, toolbar, etc, because + // those are not part of the shell. w = gtk_widget_get_width(gui.formwin); h = gtk_widget_get_height(gui.formwin); - w -= get_menu_tool_width(); - h -= get_menu_tool_height(); gui_resize_shell(w, h); } @@ -968,7 +963,13 @@ gui_mch_get_screen_dimensions(int *screen_w, int *screen_h) gui_mch_enable_menu(int showit) { if (gui.menubar != NULL) + { gtk_widget_set_visible(gui.menubar, showit); + // Draw area might become blank after this for some reason, queue a + // redraw, same for toolbar as well. + if (gui.drawarea != NULL) + gtk_widget_queue_draw(gui.drawarea); + } } #endif @@ -982,6 +983,8 @@ gui_mch_show_toolbar(int showit) if (showit) vim_toolbar_set_style(VIM_TOOLBAR(gui.toolbar), toolbar_flags, tbis_flags); + if (gui.drawarea != NULL) + gtk_widget_queue_draw(gui.drawarea); } } #endif @@ -2339,10 +2342,10 @@ menubar_popover_closed_hook(GSignalInvocationHint *ihint UNUSED, } #endif -#ifndef USE_GTK4_SNAPSHOT static void drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) { +#ifndef USE_GTK4_SNAPSHOT int w, h; // Use formwin size since drawarea may not have its final size yet @@ -2363,10 +2366,10 @@ drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) if (gui.surface != NULL) cairo_surface_destroy(gui.surface); gui.surface = create_backing_surface(w, h); +#endif gui_mch_new_colors(); } -#endif static void drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) @@ -2384,42 +2387,8 @@ drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) } #ifndef USE_GTK4_SNAPSHOT -// Debounced resize: drawarea_resize_cb only resizes the backing surface -// (preserving old content) and (re)arms a short timeout. The actual -// gui_resize_shell() runs from drawarea_resize_apply_cb once the user has -// stopped dragging for ~100 ms, by which time no input is pending and -// update_screen() will not bail in screenclear()'s wake. -static guint drawarea_resize_timeout_id = 0; -static int drawarea_resize_pending_w = 0; -static int drawarea_resize_pending_h = 0; - - static gboolean -drawarea_resize_apply_cb(gpointer data UNUSED) -{ - int width = drawarea_resize_pending_w; - int height = drawarea_resize_pending_h; - - drawarea_resize_timeout_id = 0; - - if (width <= 0 || height <= 0) - return G_SOURCE_REMOVE; - if (updating_screen) - { - drawarea_resize_timeout_id = g_timeout_add(50, - drawarea_resize_apply_cb, NULL); - return G_SOURCE_REMOVE; - } - - gui.force_redraw = TRUE; - gui_resize_shell(width, height); - if (gui.in_use) - redraw_all_later(UPD_CLEAR); - return G_SOURCE_REMOVE; -} - - static void -drawarea_resize_cb(GtkDrawingArea *area UNUSED, int width, int height, - gpointer data UNUSED) + void +gui_gtk4_resize(int width, int height) { cairo_t *cr; cairo_surface_t *old_surface; @@ -2428,9 +2397,6 @@ drawarea_resize_cb(GtkDrawingArea *area UNUSED, int width, int height, if (width <= 0 || height <= 0) return; - drawarea_resize_pending_w = width; - drawarea_resize_pending_h = height; - // Keep the backing surface in sync with the drawing area so GTK keeps // showing the previous frame. Re-creating it preserves the old // contents. @@ -2465,13 +2431,6 @@ drawarea_resize_cb(GtkDrawingArea *area UNUSED, int width, int height, cairo_destroy(cr); } } - - // Debounce: (re)arm the apply timeout, so gui_resize_shell() only - // runs once the resize stream settles. - if (drawarea_resize_timeout_id != 0) - g_source_remove(drawarea_resize_timeout_id); - drawarea_resize_timeout_id = g_timeout_add(100, - drawarea_resize_apply_cb, NULL); } static void @@ -4977,20 +4936,41 @@ gui_mch_update_scrollbar_size(void) void gui_mch_set_text_area_pos(int x, int y, int w, int h) { + // "h" may be negative especially when draw area size is smaller than + // "gui.char_height". + if (w <= 0 || h <= 0) + return; last_text_area_w = w; last_text_area_h = h; - // Don't use vim_form_move_resize for drawarea because its - // set_size_request would prevent the window from shrinking. - // Just update position; the actual allocation is handled by - // vim_form_size_allocate which gives drawarea the formwin's full size. - vim_form_move(VIM_FORM(gui.formwin), gui.drawarea, x, y); - - // Surface sizing is owned by drawarea_resize_cb; don't recreate it - // here. Recreating on every text-area change wiped any preserved - // content whenever a sub-cell resize shifted the cell grid, and - // update_screen() may bail (char_avail()) during a drag and leave - // the fresh surface blank. + + vim_form_move_resize(VIM_FORM(gui.formwin), gui.drawarea, x, y, w, h); +} + +#ifdef USE_GTK4_SNAPSHOT +/* + * Calculate the number of pixels to bleed background color to. Should be called + * after all UI elements are positioned and resized. + */ + void +gui_gtk_calculate_bleed(int width, int height) +{ + gui.bleed_right = width - last_text_area_w; + gui.bleed_bot = height - last_text_area_h; + + if (gui.which_scrollbars[SBAR_LEFT]) + gui.bleed_right -= gui.scrollbar_width; + if (gui.which_scrollbars[SBAR_RIGHT]) + gui.bleed_right -= gui.scrollbar_width; + if (gui.which_scrollbars[SBAR_BOTTOM]) + gui.bleed_bot -= gui.scrollbar_height; + + // Not sure if this can happen, but be safe... + if (gui.bleed_right < 0) + gui.bleed_right = 0; + if (gui.bleed_bot < 0) + gui.bleed_bot = 0; } +#endif /* * ============================================================ diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 34dad93a61..11b7463892 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -75,7 +75,7 @@ struct _VimDrawArea int n_rows; int n_cols; - int resize_count; + int bleed_right; // Used for hollow and part style cursors. For the block cursor, that is // simply rendered as a cell using vim_draw_area_add_glyphs(). May be NULL. @@ -107,7 +107,6 @@ G_DEFINE_TYPE(VimDrawArea, vim_draw_area, GTK_TYPE_WIDGET) static void draw_image_free(DrawImage *dimg); #endif static void vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot); -static void vim_draw_area_size_allocate(GtkWidget *widget, int width, int height, int baseline); static void vim_draw_area_finalize(GObject *obj) @@ -138,10 +137,10 @@ vim_draw_area_class_init(VimDrawAreaClass *class) GObjectClass *obj_class = G_OBJECT_CLASS(class); widget_class->snapshot = vim_draw_area_snapshot; - widget_class->size_allocate = vim_draw_area_size_allocate; obj_class->finalize = vim_draw_area_finalize; + gtk_widget_class_set_layout_manager_type(widget_class, GTK_TYPE_BIN_LAYOUT); } static void @@ -178,7 +177,6 @@ vim_draw_area_set_size(VimDrawArea *self, int rows, int cols) self->n_cols = cols; self->cells = g_realloc_n(self->cells, rows * cols, sizeof(DrawCell)); memset(self->cells, 0, rows * (sizeof(DrawCell) * cols)); - self->resize_count++; } static void @@ -574,14 +572,17 @@ draw_node_render(DrawNode *dnode, int row, VimDrawArea *da) if (!(dnode->dnode_flags & DRAW_NODE_NOBG)) { int width = dnode->n_cells * gui.char_width; - int bleed = gtk_widget_get_width(GTK_WIDGET(da)) - FILL_X(da->n_cols); // If this draw node touches the end of the draw area. Bleed its // background to the right if the space the draw area covers is slightly // bigger than its actual visible area (that all cells cover). This just // makes things like status bars look a bit nicer - if (END_COL(dnode) == da->n_cols - 1 && bleed > 0) - width += bleed; + // + // Don't do this for the bottom, because that will make the cursor in + // the cmdline look weird. Instead only bleed downwards when drawing the + // global background color (see vim_draw_area_snapshot()) + if (END_COL(dnode) == da->n_cols - 1) + width += gui.bleed_right; nodes[n_nodes++] = gsk_color_node_new(&dnode->bg_color, &GRAPHENE_RECT_INIT(FILL_X(dnode->start_col), FILL_Y(row), @@ -1475,8 +1476,8 @@ vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) garray_T invert_ga; gui_mch_set_bg_color(gui.back_pixel); - height = gtk_widget_get_height(widget); - width = gtk_widget_get_width(widget); + height = gtk_widget_get_height(widget) + gui.bleed_bot; + width = gtk_widget_get_width(widget) + gui.bleed_right; if (self->cells == NULL) { @@ -1485,6 +1486,23 @@ vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) return; } + // If number of pixels to bleed has changed, then dirty the nodes at the + // right edge of the draw area. + if (self->bleed_right != gui.bleed_right) + { + self->bleed_right = gui.bleed_right; + for (int r = 0; r < self->n_rows; r++) + { + DrawCell *dcell = &GET_ROW(self, r)[self->n_cols - 1]; + + if (dcell->dnode != NULL) + { + (void)draw_node_make_dirty(dcell->dnode); + draw_node_render(dcell->dnode, r, self); + } + } + } + // For inverted cells, we first build an array of bounds that represent // blocks of inverted cells. Then we apply a white color to each of those // bounds and then finish the blend. @@ -1565,36 +1583,4 @@ vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) #endif } - static void -vim_draw_area_size_allocate( - GtkWidget *widget, - int width, - int height, - int baseline UNUSED) -{ - VimDrawArea *self = VIM_DRAW_AREA(widget); - int old_count = self->resize_count; - - gui_resize_shell(width, height); - - if (old_count == self->resize_count) - { - // Number of columns or rows hasn't changed. However still re render the - // draw nodes at the right edge of the draw area, so that they can - // update their background bleed (see draw_node_render()). - for (int r = 0; r < self->n_rows; r++) - { - DrawCell *dcell = &GET_ROW(self, r)[self->n_cols - 1]; - - if (dcell->dnode != NULL) - { - (void)draw_node_make_dirty(dcell->dnode); - draw_node_render(dcell->dnode, r, self); - } - } - } - - return; -} - #endif // USE_GTK4_SNAPSHOT diff --git a/src/gui_gtk4_f.c b/src/gui_gtk4_f.c index 52941874fb..29c17aa6d5 100644 --- a/src/gui_gtk4_f.c +++ b/src/gui_gtk4_f.c @@ -209,18 +209,13 @@ vim_form_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) static gboolean vim_form_resize_idle_cb(VimForm *self) { - int w, h; - self->resize_idle_id = 0; - // Use drawarea's actual allocation, not formwin's if (gui.drawarea == NULL) goto exit; - w = gtk_widget_get_width(gui.drawarea); - h = gtk_widget_get_height(gui.drawarea); - if (w > 1 && h > 1) - gui_resize_shell(w, h); + if (self->last_width > 1 && self->last_height > 1) + gui_resize_shell(self->last_width, self->last_height); exit: g_object_unref(self); diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index acfb13c9a5..eaf8eb2686 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -52,6 +52,7 @@ void gui_mch_draw_hollow_cursor(guicolor_T color); void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_flash(int msec); void gui_mch_invert_rectangle(int r, int c, int nr, int nc); +void gui_gtk4_resize(int width, int height); void gui_mch_update(void); int gui_mch_wait_for_chars(long wtime); void gui_mch_flush(void); @@ -103,6 +104,7 @@ void gui_mch_create_scrollbar(scrollbar_T *sb, int orient); void gui_mch_destroy_scrollbar(scrollbar_T *sb); void gui_mch_update_scrollbar_size(void); void gui_mch_set_text_area_pos(int x, int y, int w, int h); +void gui_gtk_calculate_bleed(int width, int height); char_u *gui_mch_browse(int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter); char_u *gui_mch_browsedir(char_u *title, char_u *initdir); int gui_mch_dialog(int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield, int ex_cmd); diff --git a/src/version.c b/src/version.c index 3f52cbadff..7433593c77 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 710, /**/ 709, /**/ From fa3680c6fa93b6bb2c96ae536f56c56750477cfc Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 23 Jun 2026 20:16:49 +0000 Subject: [PATCH 019/647] patch 9.2.0711: leak in ins_compl_infercase_gettext() in error case Problem: leak in ins_compl_infercase_gettext() in error case (Cheng) Solution: free wca before returning. closes: #20607 Signed-off-by: Christian Brabandt --- src/insexpand.c | 1 + src/version.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/insexpand.c b/src/insexpand.c index c7186b9297..3b20d2a3c7 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -699,6 +699,7 @@ ins_compl_infercase_gettext( if (ga_grow(&gap, 10) == FAIL) { ga_clear(&gap); + vim_free(wca); return (char_u *)"[failed]"; } p = (char_u *)gap.ga_data + gap.ga_len; diff --git a/src/version.c b/src/version.c index 7433593c77..c3ae1b07d9 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 711, /**/ 710, /**/ From 5c1b989b4aabf1549910752dcfb44030e64edfcc Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Tue, 23 Jun 2026 20:32:43 +0000 Subject: [PATCH 020/647] patch 9.2.0712: GTK4: dialogs not handling mnemonics correctly Problem: GTK4: dialogs not handling mnemonics correctly Solution: Allow using mnemonics without alt key (Foxe Chen). closes: #20618 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ src/version.c | 2 ++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 7084516d87..fe9381f2f6 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -5209,6 +5209,13 @@ typedef struct gboolean *done; } DialogButtonState; +typedef struct +{ + GtkWidget *win; + gboolean *done; + gboolean no_alt; +} DialogState; + static void dialog_button_clicked_cb(GtkButton *button, DialogButtonState *state) { @@ -5222,13 +5229,16 @@ dialog_key_pressed_cb( guint keyval, guint keycode, GdkModifierType state, - gboolean *done) + DialogState *dstate) { if (keyval == GDK_KEY_Escape) { - *done = TRUE; + *dstate->done = TRUE; return TRUE; } + + if (dstate->no_alt && !(state & gtk_accelerator_get_default_mod_mask())) + return gtk_widget_mnemonic_activate(dstate->win, FALSE); return FALSE; } @@ -5264,6 +5274,7 @@ gui_mch_dialog( int response = -1; gboolean done = FALSE; gboolean win_closed = FALSE; + DialogState state; utf8_title = CONVERT_TO_UTF8(title); if (utf8_title != NULL) @@ -5306,13 +5317,14 @@ gui_mch_dialog( gtk_label_set_max_width_chars(GTK_LABEL(label), 40); gtk_box_append(GTK_BOX(message_box), label); - // Close the dialog when the key is pressed. the GTK3 GUI also allows - // mnemonics without key, but that behaviour comes from GTK+ 1.2 (from - // 1999!), so most users probably don't care... + // Close the dialog when the key is pressed. Also allow using + // mnemonics without key (if there is no text field). key_controller = gtk_event_controller_key_new(); g_signal_connect(key_controller, "key-pressed", - G_CALLBACK(dialog_key_pressed_cb), &done); + G_CALLBACK(dialog_key_pressed_cb), &state); gtk_widget_add_controller(GTK_WIDGET(win), key_controller); + state.done = &done; + state.win = GTK_WIDGET(win); if (textfield != NULL) { @@ -5331,6 +5343,30 @@ gui_mch_dialog( // (which is set as the default widget). gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); gtk_box_append(GTK_BOX(vertbox), entry); + state.no_alt = FALSE; + } + else + { + GListModel *controllers; + int len; + + // Set all shortcut controllers in the window to not require a modifier + // for mnemonics. + controllers = gtk_widget_observe_controllers(GTK_WIDGET(win)); + len = g_list_model_get_n_items(controllers); + for (int i = 0; i < len; i++) + { + GtkEventController *controller; + + controller = g_list_model_get_item(controllers, i); + if (GTK_IS_SHORTCUT_CONTROLLER(controller)) + gtk_shortcut_controller_set_mnemonics_modifiers( + GTK_SHORTCUT_CONTROLLER(controller), 0); + } + g_object_unref(controllers); + + gtk_window_set_mnemonics_visible(win, TRUE); + state.no_alt = TRUE; } if (buttons != NULL) diff --git a/src/version.c b/src/version.c index c3ae1b07d9..b03ecdf307 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 712, /**/ 711, /**/ From 7948a2c3d8b6971663a6a9a34a35653aa93db09e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 23 Jun 2026 21:02:46 +0000 Subject: [PATCH 021/647] patch 9.2.0713: completion: ruler not updated correctly when the popup menu is visible Problem: While the insert-mode completion popup menu is visible, the ruler - and the ruler shown in a status line when 'laststatus' is set - shows the column where the completion started instead of the real cursor column. With a status line the ruler can also stay at the column from before the completion until the next key is pressed. Solution: Position the popup menu at the completion start column without moving the cursor there, so the ruler keeps reflecting the real cursor column. Also mark the status line for redraw before the menu is shown, so its ruler is updated for the real cursor column while the menu is visible. closes: #20626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/cmdexpand.c | 2 +- src/insexpand.c | 23 ++++++++----------- src/popupmenu.c | 18 +++++++-------- src/proto/popupmenu.pro | 2 +- .../dumps/Test_autocompletedelay_1.dump | 2 +- .../dumps/Test_autocompletedelay_4.dump | 2 +- .../Test_autocompletedelay_longest_2.dump | 2 +- .../Test_autocompletedelay_longest_4.dump | 2 +- .../Test_autocompletedelay_preinsert_2.dump | 2 +- .../dumps/Test_fuzzy_autocompletedelay_1.dump | 2 +- .../dumps/Test_fuzzy_autocompletedelay_2.dump | 2 +- ...fo_popupwin_clears_cmdline_on_hide_01.dump | 2 +- .../Test_popup_and_previewwindow_pbuffer.dump | 2 +- .../Test_popup_and_previewwindow_pedit.dump | 2 +- src/testdir/dumps/Test_pum_highlights_09.dump | 2 +- src/testdir/dumps/Test_pum_matchins_11.dump | 2 +- .../dumps/Test_pum_statusline_ruler_1.dump | 8 +++++++ .../dumps/Test_pum_with_preview_win.dump | 2 +- .../Test_pum_with_special_characters_13.dump | 2 +- .../dumps/Test_pumopt_opacity_text_attrs.dump | 2 +- ...est_pumopt_opacity_textprop_undercurl.dump | 2 +- .../dumps/Test_pumopt_opacity_wide_bg.dump | 2 +- .../Test_pumopt_opacity_wide_bg_shifted.dump | 2 +- .../dumps/Test_shortmess_complmsg_2.dump | 2 +- src/testdir/dumps/Test_winhighlight_8.dump | 2 +- src/testdir/dumps/Test_winhighlight_9.dump | 2 +- src/testdir/test_ins_complete.vim | 18 +++++++++++++++ src/version.c | 2 ++ 28 files changed, 69 insertions(+), 46 deletions(-) create mode 100644 src/testdir/dumps/Test_pum_statusline_ruler_1.dump diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 496ab7b883..961ced5773 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -458,7 +458,7 @@ cmdline_pum_display(void) { if (p_po > 0 && p_po < 100 && !pum_redraw_in_same_position()) pum_call_update_screen(); - pum_display(compl_match_array, compl_match_arraysize, compl_selected); + pum_display(compl_match_array, compl_match_arraysize, compl_selected, -1); } /* diff --git a/src/insexpand.c b/src/insexpand.c index 3b20d2a3c7..f5ad940081 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -1889,22 +1889,19 @@ ins_compl_show_pum(void) // part of the screen would be updated. We do need to redraw here. dollar_vcol = -1; - // Compute the screen column of the start of the completed text. - // Use the cursor to get all wrapping and other settings right. + // Position the menu at the completion start without moving the cursor + // there, so the ruler keeps showing the real cursor column. col = curwin->w_cursor.col; curwin->w_cursor.col = compl_col; - compl_selected_item = cur; - pum_display(compl_match_array, compl_match_arraysize, cur); + validate_cursor_col(); + int pum_wcol = curwin->w_wcol; curwin->w_cursor.col = col; - -#ifdef FEAT_CONCEAL - // The cursor was temporarily moved to "compl_col" above to position the - // menu, so the screen update left w_wcol conceal-corrected for that column - // rather than for the real cursor. Redraw the cursor line so the caret is - // positioned correctly when the cursor line has concealed text. - if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin)) - redrawWinline(curwin, curwin->w_cursor.lnum); -#endif + validate_cursor_col(); + compl_selected_item = cur; + // Flag the status line so the ruler is redrawn for the real cursor column + // when the menu update redraws the screen. + curwin->w_redr_status = true; + pum_display(compl_match_array, compl_match_arraysize, cur, pum_wcol); // After adding leader, set the current match to shown match. if (compl_started && compl_curr_match != compl_shown_match) diff --git a/src/popupmenu.c b/src/popupmenu.c index bed2495b87..08aa442865 100644 --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -290,8 +290,10 @@ pum_compute_horizontal_placement(int cursor_col) pum_display( pumitem_T *array, int size, - int selected) // index of initially selected item, -1 if + int selected, // index of initially selected item, -1 if // out of range + int pum_wcol) // screen column to align the menu to, or -1 + // to use the cursor column { int cursor_col; int above_row; @@ -326,7 +328,7 @@ pum_display( pum_win_row = curwin->w_wrow + W_WINROW(curwin); pum_win_height = curwin->w_height; pum_win_col = curwin->w_wincol; - pum_win_wcol = curwin->w_wcol; + pum_win_wcol = pum_wcol >= 0 ? pum_wcol : curwin->w_wcol; pum_win_width = curwin->w_width; #if defined(FEAT_QUICKFIX) @@ -359,8 +361,9 @@ pum_display( cursor_col = cmdline_compl_startcol(); else { - // w_wcol includes virtual text "above" - int wcol = curwin->w_wcol % curwin->w_width; + int wcol = pum_wcol >= 0 ? pum_wcol : curwin->w_wcol; + // w_wcol includes virtual text "above". + wcol %= curwin->w_width; #ifdef FEAT_CONCEAL // w_wcol does not account for text concealed before the cursor; // shift by the offset win_line() recorded for the cursor line so the @@ -1671,16 +1674,11 @@ pum_may_redraw(void) } else { - int wcol = curwin->w_wcol; - // Window layout changed, recompute the position. // Use the remembered w_wcol value, the cursor may have moved when a // completion was inserted, but we want the menu in the same position. pum_undisplay(); - curwin->w_wcol = pum_win_wcol; - curwin->w_valid |= VALID_WCOL; - pum_display(array, len, selected); - curwin->w_wcol = wcol; + pum_display(array, len, selected, pum_win_wcol); } } diff --git a/src/proto/popupmenu.pro b/src/proto/popupmenu.pro index 4afd678125..f7a00511cf 100644 --- a/src/proto/popupmenu.pro +++ b/src/proto/popupmenu.pro @@ -2,7 +2,7 @@ void pum_set_border(int enable); void pum_set_shadow(int enable); void pum_set_margin(int enable); -void pum_display(pumitem_T *array, int size, int selected); +void pum_display(pumitem_T *array, int size, int selected, int pum_wcol); void pum_call_update_screen(void); int pum_under_menu(int row, int col, int only_redrawing); void pum_opacity_changed(void); diff --git a/src/testdir/dumps/Test_autocompletedelay_1.dump b/src/testdir/dumps/Test_autocompletedelay_1.dump index 51128fc2f3..c792e09ea9 100644 --- a/src/testdir/dumps/Test_autocompletedelay_1.dump +++ b/src/testdir/dumps/Test_autocompletedelay_1.dump @@ -7,4 +7,4 @@ |f+0#0000001#ffd7ff255|o@1| @11| +0#4040ff13#ffffff0@59 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|T|o|p| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|2| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_4.dump b/src/testdir/dumps/Test_autocompletedelay_4.dump index 53199f9d60..31d58c55c1 100644 --- a/src/testdir/dumps/Test_autocompletedelay_4.dump +++ b/src/testdir/dumps/Test_autocompletedelay_4.dump @@ -7,4 +7,4 @@ |f+0#0000001#ffd7ff255|o@1| @11| +0#4040ff13#ffffff0@59 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|3| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_longest_2.dump b/src/testdir/dumps/Test_autocompletedelay_longest_2.dump index 19a83bfa78..8d7eabd605 100644 --- a/src/testdir/dumps/Test_autocompletedelay_longest_2.dump +++ b/src/testdir/dumps/Test_autocompletedelay_longest_2.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|T|o|p| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|6| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_longest_4.dump b/src/testdir/dumps/Test_autocompletedelay_longest_4.dump index 09a8514da0..95a4857bd2 100644 --- a/src/testdir/dumps/Test_autocompletedelay_longest_4.dump +++ b/src/testdir/dumps/Test_autocompletedelay_longest_4.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|3| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_preinsert_2.dump b/src/testdir/dumps/Test_autocompletedelay_preinsert_2.dump index 17252dfa3e..6b6520925e 100644 --- a/src/testdir/dumps/Test_autocompletedelay_preinsert_2.dump +++ b/src/testdir/dumps/Test_autocompletedelay_preinsert_2.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|3| @10|A|l@1| diff --git a/src/testdir/dumps/Test_fuzzy_autocompletedelay_1.dump b/src/testdir/dumps/Test_fuzzy_autocompletedelay_1.dump index ed15dc9627..b82983f94b 100644 --- a/src/testdir/dumps/Test_fuzzy_autocompletedelay_1.dump +++ b/src/testdir/dumps/Test_fuzzy_autocompletedelay_1.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|T|o|p| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|3| @10|A|l@1| diff --git a/src/testdir/dumps/Test_fuzzy_autocompletedelay_2.dump b/src/testdir/dumps/Test_fuzzy_autocompletedelay_2.dump index 84083f6634..550f1e154c 100644 --- a/src/testdir/dumps/Test_fuzzy_autocompletedelay_2.dump +++ b/src/testdir/dumps/Test_fuzzy_autocompletedelay_2.dump @@ -7,4 +7,4 @@ |v+0#0000001#ffd7ff255|i|m| @11| +0#4040ff13#ffffff0@59 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|2| @10|A|l@1| diff --git a/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump b/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump index 27947cd33f..b098b70f6d 100644 --- a/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump +++ b/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump @@ -12,4 +12,4 @@ |f+0#0000001#ffd7ff255|o|u|r| @10| +0#0000000#ffffff0@59 |f+0#0000001#e0e0e08|i|v|e| @11|o|n|e| @2| +0#0000000#ffffff0@52 |f|i|v|e> @10| +0#0000001#e0e0e08|t|w|o| @2| +0#0000000#ffffff0@52 -|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@2| +0#0000001#e0e0e08|t|h|r|e@1| | +0#0000000#ffffff0@34|1|6|,|1| @9|B|o|t| +|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@2| +0#0000001#e0e0e08|t|h|r|e@1| | +0#0000000#ffffff0@34|1|6|,|5| @9|B|o|t| diff --git a/src/testdir/dumps/Test_popup_and_previewwindow_pbuffer.dump b/src/testdir/dumps/Test_popup_and_previewwindow_pbuffer.dump index 0eab2a62c6..e01908c6b1 100644 --- a/src/testdir/dumps/Test_popup_and_previewwindow_pbuffer.dump +++ b/src/testdir/dumps/Test_popup_and_previewwindow_pbuffer.dump @@ -16,5 +16,5 @@ |a|b|0> @71 |~+0#4040ff13&| @73 |~| @73 -|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1@1|,|1| @10|B|o|t +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1@1|,|4| @10|B|o|t |-+2&&@1| |K|e|y|w|o|r|d| |L|o|c|a|l| |c|o|m|p|l|e|t|i|o|n| |(|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |1|0| +0#0000000&@26 diff --git a/src/testdir/dumps/Test_popup_and_previewwindow_pedit.dump b/src/testdir/dumps/Test_popup_and_previewwindow_pedit.dump index b235c7d511..fe27c9d6c1 100644 --- a/src/testdir/dumps/Test_popup_and_previewwindow_pedit.dump +++ b/src/testdir/dumps/Test_popup_and_previewwindow_pedit.dump @@ -16,5 +16,5 @@ |a+0#0000001#ffd7ff255|b|6| @11| +0#0000000#a8a8a8255| +0&#ffffff0@58 |a|b|0> @71 |~+0#4040ff13&| @73 -|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1@1|,|1| @10|B|o|t +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1@1|,|4| @10|B|o|t |-+2&&@1| |K|e|y|w|o|r|d| |L|o|c|a|l| |c|o|m|p|l|e|t|i|o|n| |(|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |1|0| +0#0000000&@26 diff --git a/src/testdir/dumps/Test_pum_highlights_09.dump b/src/testdir/dumps/Test_pum_highlights_09.dump index 4e7d08b793..552f3361a2 100644 --- a/src/testdir/dumps/Test_pum_highlights_09.dump +++ b/src/testdir/dumps/Test_pum_highlights_09.dump @@ -17,4 +17,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|2| @10|A|l@1| diff --git a/src/testdir/dumps/Test_pum_matchins_11.dump b/src/testdir/dumps/Test_pum_matchins_11.dump index a44a6ee566..d11ba8c048 100644 --- a/src/testdir/dumps/Test_pum_matchins_11.dump +++ b/src/testdir/dumps/Test_pum_matchins_11.dump @@ -16,5 +16,5 @@ |~| @73 |~| @73 |~| @73 -|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|A|l@1 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|4| @11|A|l@1 |-+2&&@1| |O|m|n|i| |c|o|m|p|l|e|t|i|o|n| |(|^|O|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |3| +0#0000000&@34 diff --git a/src/testdir/dumps/Test_pum_statusline_ruler_1.dump b/src/testdir/dumps/Test_pum_statusline_ruler_1.dump new file mode 100644 index 0000000000..43de9b69f4 --- /dev/null +++ b/src/testdir/dumps/Test_pum_statusline_ruler_1.dump @@ -0,0 +1,8 @@ +|a+0&#ffffff0@1| |a@2| |a@1> @30 +|~+0#4040ff13&| @4| +0#0000001#e0e0e08|a@1| @12| +0#4040ff13#ffffff0@17 +|~| @4| +0#0000001#ffd7ff255|a@2| @11| +0#4040ff13#ffffff0@17 +|~| @38 +|~| @38 +|~| @38 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @8|1|,|1|0| @10|A|l@1 +|-+2&&@1| |m+0#00e0003&|a|t|c|h| |1| |o|f| |2| +0#0000000&@24 diff --git a/src/testdir/dumps/Test_pum_with_preview_win.dump b/src/testdir/dumps/Test_pum_with_preview_win.dump index ad0df78146..d2487bfdb6 100644 --- a/src/testdir/dumps/Test_pum_with_preview_win.dump +++ b/src/testdir/dumps/Test_pum_with_preview_win.dump @@ -8,5 +8,5 @@ |t+0#0000001#ffd7ff255|h|r|e@1| @9| +0#4040ff13#ffffff0@59 |~| @73 |~| @73 -|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|A|l@1 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|4| @11|A|l@1 |-+2&&@1| |O|m|n|i| |c|o|m|p|l|e|t|i|o|n| |(|^|O|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |3| +0#0000000&@34 diff --git a/src/testdir/dumps/Test_pum_with_special_characters_13.dump b/src/testdir/dumps/Test_pum_with_special_characters_13.dump index 313d500783..3ed2c9573d 100644 --- a/src/testdir/dumps/Test_pum_with_special_characters_13.dump +++ b/src/testdir/dumps/Test_pum_with_special_characters_13.dump @@ -9,4 +9,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|5| @10|A|l@1| diff --git a/src/testdir/dumps/Test_pumopt_opacity_text_attrs.dump b/src/testdir/dumps/Test_pumopt_opacity_text_attrs.dump index 62e7df726b..1d708e641b 100644 --- a/src/testdir/dumps/Test_pumopt_opacity_text_attrs.dump +++ b/src/testdir/dumps/Test_pumopt_opacity_text_attrs.dump @@ -17,4 +17,4 @@ |ほ*&|げ|ほ|げ|ほ|げ|漢*4#e000e06&|字|テ|ス|ト|あ*0#0000000&|い|う|え|お|カ|タ|カ|ナ| +&@34 |ほ*&|げ|ほ|げ|ほ|げ|漢*4#e000e06&|字|テ|ス|ト|あ*0#0000000&|い|う|え|お|カ|タ|カ|ナ| +&@34 |ほ*&|げ|ほ|げ|ほ|げ|漢*4#e000e06&|字|テ|ス|ト|あ*0#0000000&|い|う|え|お|カ|タ|カ|ナ| +&@34 -|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1| @10|T|o|p| +|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|7|-|5| @8|T|o|p| diff --git a/src/testdir/dumps/Test_pumopt_opacity_textprop_undercurl.dump b/src/testdir/dumps/Test_pumopt_opacity_textprop_undercurl.dump index a1242fde84..2558f5bf1a 100644 --- a/src/testdir/dumps/Test_pumopt_opacity_textprop_undercurl.dump +++ b/src/testdir/dumps/Test_pumopt_opacity_textprop_undercurl.dump @@ -17,4 +17,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1|3| @9|A|l@1| diff --git a/src/testdir/dumps/Test_pumopt_opacity_wide_bg.dump b/src/testdir/dumps/Test_pumopt_opacity_wide_bg.dump index 6b9bb9935a..23c67a84cf 100644 --- a/src/testdir/dumps/Test_pumopt_opacity_wide_bg.dump +++ b/src/testdir/dumps/Test_pumopt_opacity_wide_bg.dump @@ -17,4 +17,4 @@ |ほ*&|げ|ほ|げ|ほ|げ|漢|字|テ|ス|ト|あ|い|う|え|お|カ|タ|カ|ナ| +&@34 |ほ*&|げ|ほ|げ|ほ|げ|漢|字|テ|ス|ト|あ|い|う|え|お|カ|タ|カ|ナ| +&@34 |ほ*&|げ|ほ|げ|ほ|げ|漢|字|テ|ス|ト|あ|い|う|え|お|カ|タ|カ|ナ| +&@34 -|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1| @10|T|o|p| +|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|7|-|5| @8|T|o|p| diff --git a/src/testdir/dumps/Test_pumopt_opacity_wide_bg_shifted.dump b/src/testdir/dumps/Test_pumopt_opacity_wide_bg_shifted.dump index f67556307b..4aee9cd6aa 100644 --- a/src/testdir/dumps/Test_pumopt_opacity_wide_bg_shifted.dump +++ b/src/testdir/dumps/Test_pumopt_opacity_wide_bg_shifted.dump @@ -17,4 +17,4 @@ |a|ほ*&|げ|ほ|げ|ほ|げ|漢|字|テ|ス|ト|あ|い|う|え|お|カ|タ|カ|ナ| +&@33 |ほ*&|げ|ほ|げ|ほ|げ|漢|字|テ|ス|ト|あ|い|う|え|お|カ|タ|カ|ナ| +&@34 |a|ほ*&|げ|ほ|げ|ほ|げ|漢|字|テ|ス|ト|あ|い|う|え|お|カ|タ|カ|ナ| +&@33 -|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1| @10|T|o|p| +|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|7|-|5| @8|T|o|p| diff --git a/src/testdir/dumps/Test_shortmess_complmsg_2.dump b/src/testdir/dumps/Test_shortmess_complmsg_2.dump index 66c421b59a..99d03a4ec7 100644 --- a/src/testdir/dumps/Test_shortmess_complmsg_2.dump +++ b/src/testdir/dumps/Test_shortmess_complmsg_2.dump @@ -9,4 +9,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|6| @10|A|l@1| diff --git a/src/testdir/dumps/Test_winhighlight_8.dump b/src/testdir/dumps/Test_winhighlight_8.dump index 69568fc95c..c5ff052503 100644 --- a/src/testdir/dumps/Test_winhighlight_8.dump +++ b/src/testdir/dumps/Test_winhighlight_8.dump @@ -4,5 +4,5 @@ |w+0#0000001#ffd7ff255|a+0#ffffff16#e000002|l@1| @10| +0#0000000#a8a8a8255| +0&#ffffff0@20||+1&&|S+0&&|i|x| @33 |w+0#0000001#ffd7ff255|h+0#ffffff16#e000002|i|l|e| @9| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@20||+1#0000000&|~+0#4040ff13&| @35 |w+0#0000001#ffd7ff255|i+0#ffffff16#e000002|n|c|m|d| @8| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@20||+1#0000000&|~+0#4040ff13&| @35 -|w+0#0000001#ffd7ff255|i+0#ffffff16#e000002|n|d|o| @9| +0#0000000#a8a8a8255| +3&#ffffff0@2|1|,|1| @11|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|A|l@1 +|w+0#0000001#ffd7ff255|i+0#ffffff16#e000002|n|d|o| @9| +0#0000000#a8a8a8255| +3&#ffffff0@2|1|,|6| @11|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|A|l@1 |-+2&&@1| |C|o|m@1|a|n|d|-|l|i|n|e| |c|o|m|p|l|e|t|i|o|n| |(|^|V|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |1|5| +0#0000000&@25 diff --git a/src/testdir/dumps/Test_winhighlight_9.dump b/src/testdir/dumps/Test_winhighlight_9.dump index 174531af71..67877d0889 100644 --- a/src/testdir/dumps/Test_winhighlight_9.dump +++ b/src/testdir/dumps/Test_winhighlight_9.dump @@ -4,5 +4,5 @@ |S|i|x| @33| +0#0000001#ffd7ff255|w|a|l@1| @10| +0#0000000#a8a8a8255| +0&#ffffff0@20 |~+0#4040ff13&| @35| +0#0000001#ffd7ff255|w|h|i|l|e| @9| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@20 |~| @35| +0#0000001#ffd7ff255|w|i|n|c|m|d| @8| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@20 -|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|5| @11|A|l@1| +0#0000001#ffd7ff255|w|i|n|d|o| @9| +0#0000000#a8a8a8255| +3&#ffffff0@2|1|,|1| @11|A|l@1 +|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|5| @11|A|l@1| +0#0000001#ffd7ff255|w|i|n|d|o| @9| +0#0000000#a8a8a8255| +3&#ffffff0@2|1|,|6| @11|A|l@1 |-+2&&@1| |C|o|m@1|a|n|d|-|l|i|n|e| |c|o|m|p|l|e|t|i|o|n| |(|^|V|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |1|5| +0#0000000&@25 diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index cb901d609f..4df2efb061 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -1025,6 +1025,24 @@ func Test_pum_with_preview_win() call StopVimInTerminal(buf) endfunc +func Test_pum_statusline_ruler() + CheckScreendump + + " With a status line, the ruler must follow the real cursor column after a + " completion inserts text, not stay at the completion start column. + let lines =<< trim END + call setline(1, 'aa aaa ') + set laststatus=2 ruler + END + call writefile(lines, 'Xstlruler', 'D') + let buf = RunVimInTerminal('-S Xstlruler', #{rows: 8, cols: 40}) + call term_sendkeys(buf, "A\") + call VerifyScreenDump(buf, 'Test_pum_statusline_ruler_1', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + func Test_scrollbar_on_wide_char() CheckScreendump diff --git a/src/version.c b/src/version.c index b03ecdf307..02d7bc410e 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 713, /**/ 712, /**/ From 19ab872a905e0f6f2a9df3aa008459f286dc4e5c Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 24 Jun 2026 17:29:22 +0000 Subject: [PATCH 022/647] patch 9.2.0714: Coverity warns for NULL deref Problem: Coverity warns for NULL dereference in f_remote_startserver() Solution: Return early if the server name is null. related: #20624 Signed-off-by: Christian Brabandt --- src/clientserver.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/clientserver.c b/src/clientserver.c index 5b0d4a2df9..60849fe1e1 100644 --- a/src/clientserver.c +++ b/src/clientserver.c @@ -1176,6 +1176,8 @@ f_remote_startserver(typval_T *argvars UNUSED, typval_T *rettv UNUSED) } char_u *server = tv_get_string_chk(&argvars[0]); + if (server == NULL) + return; # ifdef MSWIN if (clientserver_method == CLIENTSERVER_METHOD_MSWIN) serverSetName(server); diff --git a/src/version.c b/src/version.c index 02d7bc410e..5a42a1ef14 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 714, /**/ 713, /**/ From f67e912ffefb6a9f0ddb2f7dc123e34a552d1f11 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 24 Jun 2026 17:30:22 +0000 Subject: [PATCH 023/647] patch 9.2.0715: Coverity warns about copy/paste error in hl_blend_attr() Problem: Coverity warns about copy/paste error in hl_blend_attr() Solution: Use foreground color instead, regenerate dump closes: #20624 Signed-off-by: Christian Brabandt --- src/highlight.c | 4 ++-- src/testdir/dumps/Test_popupwin_opacity_hl_80.dump | 4 ++-- src/version.c | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/highlight.c b/src/highlight.c index 325e5d65f0..717a8f5fb6 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -3581,7 +3581,7 @@ hl_blend_attr(int char_attr, int popup_attr, int blend, int blend_fg UNUSED) under_fg_rgb = char_aep->ae_u.cterm.fg_rgb; #endif new_en.ae_u.cterm.fg_color = blend_cterm_colors( - popup_aep->ae_u.cterm.bg_color, popup_bg_rgb, + popup_aep->ae_u.cterm.fg_color, popup_bg_rgb, under_fg, under_fg_rgb, fallback_fg_rgb, blend); } // Approximate cterm bg by blending with the underlying bg @@ -3768,7 +3768,7 @@ hl_pum_blend_attr(int char_attr, int popup_attr, int blend UNUSED) popup_bg_rgb = popup_aep->ae_u.cterm.bg_rgb; #endif new_en.ae_u.cterm.fg_color = blend_cterm_colors( - popup_aep->ae_u.cterm.bg_color, popup_bg_rgb, + popup_aep->ae_u.cterm.fg_color, popup_bg_rgb, under_fg, under_fg_rgb, fallback_fg_rgb, blend); } // Approximate cterm bg by blending with the underlying bg diff --git a/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump b/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump index c57365eaae..78d3115450 100644 --- a/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump +++ b/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump @@ -1,7 +1,7 @@ >1+0&#ffffff0| @73 |2| @73 -|3| @7|f+0#ff404010#87d7ff255|o@1| +0#5fafd7255&@1|b+0#0000001&|a|r| +0#0000000#ffffff0@57 -|4| @7|b+0#0000001#87d7ff255|a|z| +0#5fafd7255&@4| +0#0000000#ffffff0@57 +|3| @7|f+0#ff404010#87d7ff255|o@1| +0#d75f5f255&@1|b+0#0000001&|a|r| +0#0000000#ffffff0@57 +|4| @7|b+0#0000001#87d7ff255|a|z| +0#0000000&@4| +0&#ffffff0@57 |5| @73 |6| @73 |7| @73 diff --git a/src/version.c b/src/version.c index 5a42a1ef14..de6662811d 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 715, /**/ 714, /**/ From 758543dcb7527e4d4bfe3f51196c9134632b3a7a Mon Sep 17 00:00:00 2001 From: "Wu, Zhenyu" Date: Wed, 24 Jun 2026 17:34:25 +0000 Subject: [PATCH 024/647] patch 9.2.0716: filetype: not all supertux files are recognized Problem: filetype: not all supertux files are recognized Solution: Detect more supertux related files as scheme filetype (Wu Zhenyu) levels: *.stwm: supertux world map https://github.com/SuperTux/supertux/wiki/Worldmap-Format *.stl: supertux level https://github.com/SuperTux/supertux/wiki/Level-Format *.stxt: supertux scrolling texts https://github.com/SuperTux/supertux/wiki/File_formats#scrolling-texts images: *.sprite: supertux sprite https://github.com/SuperTux/supertux/wiki/Sprite *.strf: supertux tileset https://github.com/SuperTux/supertux/wiki/Tileset *.satc: supertux autotiles configuration *.stcd: supertux converter data font: *.stf: supetux font particles: *.stcp: supertux custom particle music: *.music: supertux music config: ~/.local/share/supertux2/config: supertux config https://github.com/SuperTux/supertux/wiki/S-Expression#supertux-config-file *.stsg: supertux save game info: info: https://github.com/SuperTux/supertux/wiki/File_formats#level-subsets related: #16287 closes: #20615 Signed-off-by: Wu, Zhenyu Signed-off-by: Christian Brabandt --- runtime/filetype.vim | 2 +- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 680b62b37a..efcea55e30 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1062,7 +1062,7 @@ au BufNewFile,BufRead .zshrc,.zshenv,.zlogin,.zlogout,.zcompdump,.zsh_history se au BufNewFile,BufRead *.zsh,*.zsh-theme,*.zunit setf zsh " Scheme, Supertux configuration, Lips.js history, Guile init file ("racket" patterns are now separate, see above) -au BufNewFile,BufRead *.scm,*.ss,*.sld,*.stsg,*/supertux2/config,.lips_repl_history,.guile setf scheme +au BufNewFile,BufRead *.scm,*.ss,*.sld,*.stwm,*.stl,*.stxt,*.sprite,*.strf,*.satc,*.stcd,*.stf,*.stcp,*.music,*.stsg,*/supertux2/config,supertux2/*/info,.lips_repl_history,.guile setf scheme " SiSU au BufNewFile,BufRead *.sst.meta,*.-sst.meta,*._sst.meta setf sisu diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 61a72fd1f3..7924789e28 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -729,7 +729,7 @@ def s:GetFilenameChecks(): dict> sass: ['file.sass'], sbt: ['file.sbt'], scala: ['file.scala', 'file.mill'], - scheme: ['file.scm', 'file.ss', 'file.sld', 'file.stsg', 'any/local/share/supertux2/config', '.lips_repl_history', '.guile'], + scheme: ['file.scm', 'file.ss', 'file.sld', 'file.stwm', 'file.stl', 'file.stxt', 'file.sprite', 'file.strf', 'file.satc', 'file.stcd', 'file.stf', 'file.stcp', 'file.music', 'file.stsg', 'any/local/share/supertux2/config', 'supertux2/levels/world1/info', '.lips_repl_history', '.guile'], scilab: ['file.sci', 'file.sce'], screen: ['.screenrc', 'screenrc'], scss: ['file.scss'], diff --git a/src/version.c b/src/version.c index de6662811d..aebc461077 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 716, /**/ 715, /**/ From 05df981c35e066dd45ebe12af26fb4e662a932ef Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 24 Jun 2026 17:45:48 +0000 Subject: [PATCH 025/647] patch 9.2.0717: tests: strange indent in Test_autocmd_dup_arg() Problem: tests: strange indent in Test_autocmd_dup_arg() (after v9.2.0708) Solution: Indent using the settings in the modeline. closes: #20619 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/testdir/test_autocmd.vim | 56 ++++++++++++++++++------------------ src/version.c | 2 ++ 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 4828b3ea9e..b2a3dea149 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -3212,34 +3212,34 @@ func Test_autocmd_once() endfunc func Test_autocmd_dup_arg() - " Duplicate ++once / ++nested, or the legacy "nested" used twice, must - " error out *and* not create the autocommand. Using an environment - " variable in the pattern also exercises the error-exit path that frees - " the expanded pattern (checked by the address/leak sanitizers). - augroup XdupTest - au! - augroup END - let $XAUTODIR = 'Xfoo' - - " New behavior: duplicate ++once now aborts, the autocmd is not added - call assert_fails('au XdupTest WinNew $XAUTODIR/* ++once ++once echo bad', 'E983:') - call assert_false(exists('#XdupTest#WinNew')) - - call assert_fails('au XdupTest WinNew $XAUTODIR/* ++nested ++nested echo bad', 'E983:') - call assert_false(exists('#XdupTest#WinNew')) - - call assert_fails('au XdupTest WinNew $XAUTODIR/* nested nested echo bad', 'E983:') - call assert_false(exists('#XdupTest#WinNew')) - - " "nested" without "++" is rejected in Vim9 script (also frees the pattern) - call assert_fails('vim9cmd au XdupTest WinNew $XAUTODIR/* nested echo bad', 'E1078:') - call assert_false(exists('#XdupTest#WinNew')) - - augroup XdupTest - au! - augroup END - augroup! XdupTest - let $XAUTODIR = '' + " Duplicate ++once / ++nested, or the legacy "nested" used twice, must + " error out *and* not create the autocommand. Using an environment + " variable in the pattern also exercises the error-exit path that frees + " the expanded pattern (checked by the address/leak sanitizers). + augroup XdupTest + au! + augroup END + let $XAUTODIR = 'Xfoo' + + " New behavior: duplicate ++once now aborts, the autocmd is not added + call assert_fails('au XdupTest WinNew $XAUTODIR/* ++once ++once echo bad', 'E983:') + call assert_false(exists('#XdupTest#WinNew')) + + call assert_fails('au XdupTest WinNew $XAUTODIR/* ++nested ++nested echo bad', 'E983:') + call assert_false(exists('#XdupTest#WinNew')) + + call assert_fails('au XdupTest WinNew $XAUTODIR/* nested nested echo bad', 'E983:') + call assert_false(exists('#XdupTest#WinNew')) + + " "nested" without "++" is rejected in Vim9 script (also frees the pattern) + call assert_fails('vim9cmd au XdupTest WinNew $XAUTODIR/* nested echo bad', 'E1078:') + call assert_false(exists('#XdupTest#WinNew')) + + augroup XdupTest + au! + augroup END + augroup! XdupTest + let $XAUTODIR = '' endfunc diff --git a/src/version.c b/src/version.c index aebc461077..72f154f3e6 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 717, /**/ 716, /**/ From f2954c821ebf007503bc29cd25d01974f691432c Mon Sep 17 00:00:00 2001 From: Dmytro Meleshko Date: Wed, 24 Jun 2026 17:51:22 +0000 Subject: [PATCH 026/647] patch 9.2.0718: :syn sync without an argument also lists syntax cluster Problem: :syn sync without an argument also lists every defined cluster Solution: Fix control flow in syn_cmd_list() so that only the syncing items are printed when this function gets called by :syn sync. (dmitmel) closes: #20614 Signed-off-by: Dmytro Meleshko Signed-off-by: Christian Brabandt --- src/po/vim.pot | 22 +++++++++++----------- src/syntax.c | 32 ++++++++++++++++++-------------- src/testdir/test_syntax.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/po/vim.pot b/src/po/vim.pot index bbbf9f0cc2..131e52457f 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-06-22 19:36+0000\n" +"POT-Creation-Date: 2026-06-24 17:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3109,26 +3109,26 @@ msgstr "" msgid "syncing on C-style comments" msgstr "" -msgid "no syncing" +msgid "" +"\n" +"--- Syntax sync items ---" msgstr "" -msgid "syncing starts at the first line" +msgid "" +"\n" +"syncing on items" msgstr "" -msgid "syncing starts " +msgid "no syncing" msgstr "" -msgid " lines before top line" +msgid "syncing starts at the first line" msgstr "" -msgid "" -"\n" -"--- Syntax sync items ---" +msgid "syncing starts " msgstr "" -msgid "" -"\n" -"syncing on items" +msgid " lines before top line" msgstr "" msgid "" diff --git a/src/syntax.c b/src/syntax.c index 4333c31839..6f22d9ece6 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -3834,9 +3834,22 @@ syn_cmd_list( msg_puts(_("syncing on C-style comments")); syn_lines_msg(); syn_match_msg(); - return; } - else if (!(curwin->w_s->b_syn_sync_flags & SF_MATCH)) + else if (curwin->w_s->b_syn_sync_flags & SF_MATCH) + { + msg_puts_title(_("\n--- Syntax sync items ---")); + if (curwin->w_s->b_syn_sync_minlines > 0 + || curwin->w_s->b_syn_sync_maxlines > 0 + || curwin->w_s->b_syn_sync_linebreaks > 0) + { + msg_puts(_("\nsyncing on items")); + syn_lines_msg(); + syn_match_msg(); + } + for (id = 1; id <= highlight_num_groups() && !got_int; ++id) + syn_list_one(id, syncing, FALSE); + } + else { if (curwin->w_s->b_syn_sync_minlines == 0) msg_puts(_("no syncing")); @@ -3852,20 +3865,11 @@ syn_cmd_list( } syn_match_msg(); } - return; - } - msg_puts_title(_("\n--- Syntax sync items ---")); - if (curwin->w_s->b_syn_sync_minlines > 0 - || curwin->w_s->b_syn_sync_maxlines > 0 - || curwin->w_s->b_syn_sync_linebreaks > 0) - { - msg_puts(_("\nsyncing on items")); - syn_lines_msg(); - syn_match_msg(); } + return; } - else - msg_puts_title(_("\n--- Syntax items ---")); + + msg_puts_title(_("\n--- Syntax items ---")); if (ends_excmd2(eap->cmd, arg)) { /* diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim index 170e2e3b93..d4a81dd656 100644 --- a/src/testdir/test_syntax.vim +++ b/src/testdir/test_syntax.vim @@ -419,6 +419,25 @@ func Test_syn_sync() call assert_match('SyncHere', execute('syntax sync')) syn sync clear call assert_notmatch('SyncHere', execute('syntax sync')) + + syn sync minlines=10 + syntax cluster xmlStuff contains=xmlGroup1,xmlGroup2 + syntax region xmlComment start=// keepend contains=@Spell + syntax sync match xmlSync1 grouphere xmlComment // + syntax cluster xmlAll contains=ALL + let out = execute('syntax sync') + call assert_match('xmlSync1', out) + call assert_match('xmlSync2', out) + call assert_match('grouphere xmlComment', out) + call assert_match('groupthere NONE', out) + call assert_notmatch('xmlStuff', out) + call assert_notmatch('xmlAll', out) + call assert_notmatch('cluster', out) + call assert_notmatch('keepend', out) + " should output 4 lines: 1 header + 3 syn sync lines + call assert_equal(4, len(split(out, '\n'))) + syn clear endfunc diff --git a/src/version.c b/src/version.c index 72f154f3e6..7fd7b6b801 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 718, /**/ 717, /**/ From 037a19e1c1f737abc560ffc1d2edf2b535194816 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 24 Jun 2026 18:19:53 +0000 Subject: [PATCH 027/647] patch 9.2.0719: GTK4: default menu is lacking Problem: GTK4: default menu is lacking: accelerator text is not shown, mnemonics and 'winaltkeys' do not work Solution: Replace the GMenuModel-based menus with a custom widget set (VimMenuBar, VimMenuBarItem, VimMenu, VimMenuItem) in a new gui_gtk4_menu.c, modelled on the GTK3 menu bar: show accelerator text, support mnemonics and 'winaltkeys', add keyboard navigation, instant tooltips, and the popup and F10 menus, and implement the previously stubbed menu functions (Foxe Chen). closes: #20593 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- Filelist | 2 + runtime/doc/gui_x11.txt | 13 +- runtime/doc/tags | 1 + src/Makefile | 14 +- src/gui_gtk4.c | 770 +++++++++++------------------ src/gui_gtk4_da.c | 2 + src/gui_gtk4_menu.c | 1038 +++++++++++++++++++++++++++++++++++++++ src/gui_gtk4_menu.h | 61 +++ src/gui_gtk4_tb.c | 2 + src/menu.c | 4 - src/structs.h | 2 + src/version.c | 2 + 12 files changed, 1412 insertions(+), 499 deletions(-) create mode 100644 src/gui_gtk4_menu.c create mode 100644 src/gui_gtk4_menu.h diff --git a/Filelist b/Filelist index 019fa1aeea..c073e1ad6d 100644 --- a/Filelist +++ b/Filelist @@ -518,6 +518,8 @@ SRC_UNIX = \ src/gui_gtk4_da.h \ src/gui_gtk4_tb.c \ src/gui_gtk4_tb.h \ + src/gui_gtk4_menu.c \ + src/gui_gtk4_menu.h \ src/gui_gtk_res.xml \ src/gui_motif.c \ src/gui_xmdlg.c \ diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index 2e558d8a0a..8a084505e8 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -1,4 +1,4 @@ -*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jun 13 +*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jun 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -782,5 +782,16 @@ Most newer applications will provide their current selection via PRIMARY ("*) and use CLIPBOARD ("+) for cut/copy/paste operations. You thus have access to both by choosing to use either of the "* or "+ registers. + *gtk4-menu-navigation* +In the GTK 4 GUI, you may also navigate the menu items with these keyboard +mappings: + key meaning ~ + Go to next item + Go to previous item + Go to parent submenu + Go to current item's submenu + Go to next menu bar item + Go to previous menu bar item + vim:tw=78:sw=4:ts=8:noet:ft=help:norl: diff --git a/runtime/doc/tags b/runtime/doc/tags index 11ae058bbc..3abd3e035e 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -8260,6 +8260,7 @@ gtk-css gui_x11.txt /*gtk-css* gtk-tooltip-colors gui_x11.txt /*gtk-tooltip-colors* gtk3-slow gui_x11.txt /*gtk3-slow* gtk4-hwaccel gui_x11.txt /*gtk4-hwaccel* +gtk4-menu-navigation gui_x11.txt /*gtk4-menu-navigation* gtk4-slow gui_x11.txt /*gtk4-slow* gu change.txt /*gu* gugu change.txt /*gugu* diff --git a/src/Makefile b/src/Makefile index 89e023c9d0..e0f7057b83 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1244,6 +1244,7 @@ GTK4_SRC = gui.c gui_gtk4.c gui_gtk4_f.c \ gui_gtk4_da.c \ gui_beval.o \ gui_gtk4_tb.c \ + gui_gtk4_menu.c \ $(GRESOURCE_SRC) GTK4_OBJ = objects/gui.o objects/gui_gtk4.o \ objects/gui_gtk4_f.o \ @@ -1251,6 +1252,7 @@ GTK4_OBJ = objects/gui.o objects/gui_gtk4.o \ objects/gui_gtk4_da.o \ objects/gui_beval.o \ objects/gui_gtk4_tb.o \ + objects/gui_gtk4_menu.o \ $(GRESOURCE_OBJ) GTK4_DEFS = -DFEAT_GUI_GTK $(NARROW_PROTO) GTK4_IPATH = $(GUI_INC_LOC) @@ -1320,7 +1322,7 @@ HAIKUGUI_TESTTARGET = gui HAIKUGUI_BUNDLE = # All GUI files -ALL_GUI_SRC = gui.c gui_gtk.c gui_gtk_f.c gui_gtk4.c gui_gtk4_f.c gui_gtk4_cb.c gui_gtk4_da.c gui_gtk4_tb.c gui_motif.c gui_xmdlg.c gui_xmebw.c gui_gtk_x11.c gui_x11.c gui_haiku.cc +ALL_GUI_SRC = gui.c gui_gtk.c gui_gtk_f.c gui_gtk4.c gui_gtk4_f.c gui_gtk4_cb.c gui_gtk4_da.c gui_gtk4_tb.c gui_gtk4_menu.c gui_motif.c gui_xmdlg.c gui_xmebw.c gui_gtk_x11.c gui_x11.c gui_haiku.cc ALL_GUI_PRO = proto/gui.pro proto/gui_gtk.pro proto/gui_gtk4.pro proto/gui_motif.pro proto/gui_xmdlg.pro proto/gui_gtk_x11.pro proto/gui_x11.pro proto/gui_w32.pro proto/gui_photon.pro # }}} @@ -3421,6 +3423,9 @@ objects/gui_gtk4_da.o: gui_gtk4_da.c objects/gui_gtk4_tb.o: gui_gtk4_tb.c $(CCC) -o $@ gui_gtk4_tb.c +objects/gui_gtk4_menu.o: gui_gtk4_menu.c + $(CCC) -o $@ gui_gtk4_menu.c + objects/gui_haiku.o: gui_haiku.cc $(CCC) -o $@ gui_haiku.cc @@ -4518,7 +4523,7 @@ objects/gui_gtk4.o: auto/osdef.h gui_gtk4.c vim.h protodef.h auto/config.h featu structs.h regexp.h gui.h libvterm/include/vterm.h \ libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ globals.h errors.h gui_gtk4_f.h auto/gui_gtk_gresources.h \ - gui_gtk4_cb.h gui_gtk4_da.h gui_gtk4_tb.h + gui_gtk4_cb.h gui_gtk4_da.h gui_gtk4_tb.h gui_gtk4_menu.h objects/gui_gtk4_f.o: auto/osdef.h gui_gtk4_f.c vim.h protodef.h auto/config.h feature.h \ os_unix.h ascii.h keymap.h termdefs.h macros.h option.h \ beval.h structs.h regexp.h gui.h \ @@ -4539,6 +4544,11 @@ objects/gui_gtk4_tb.o: auto/osdef.h gui_gtk4_tb.c vim.h protodef.h auto/config.h beval.h structs.h regexp.h gui.h \ libvterm/include/vterm.h libvterm/include/vterm_keycodes.h alloc.h \ ex_cmds.h spell.h proto.h globals.h errors.h gui_gtk4_tb.h +objects/gui_gtk4_menu.o: auto/osdef.h gui_gtk4_menu.c vim.h protodef.h auto/config.h feature.h \ + os_unix.h ascii.h keymap.h termdefs.h macros.h option.h \ + beval.h structs.h regexp.h gui.h \ + libvterm/include/vterm.h libvterm/include/vterm_keycodes.h alloc.h \ + ex_cmds.h spell.h proto.h globals.h errors.h gui_gtk4_menu.h objects/gui_gtk_f.o: auto/osdef.h gui_gtk_f.c vim.h protodef.h auto/config.h feature.h \ os_unix.h ascii.h keymap.h termdefs.h macros.h option.h \ beval.h structs.h regexp.h gui.h \ diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index fe9381f2f6..b5f1f93b40 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -36,6 +36,9 @@ #ifdef FEAT_TOOLBAR # include "gui_gtk4_tb.h" #endif +#ifdef FEAT_MENU +# include "gui_gtk4_menu.h" +#endif /* * Geometry string parser, replacing XParseGeometry to remove X11 dependency. @@ -126,9 +129,6 @@ static int last_shape = 0; #define DEFAULT_FONT "Monospace 10" -// Menu action group for GMenu-based menus -static GSimpleActionGroup *menu_action_group = NULL; - // Cursor blinking state static enum { BLINK_NONE, @@ -283,9 +283,6 @@ static void enter_notify_event(GtkEventControllerMotion *controller, double x, d static gboolean scroll_event(GtkEventControllerScroll *controller, double dx, double dy, gpointer data); static void focus_in_event(GtkEventControllerFocus *controller, gpointer data); static void focus_out_event(GtkEventControllerFocus *controller, gpointer data); -#ifdef FEAT_MENU -static gboolean menubar_popover_closed_hook(GSignalInvocationHint *ihint, guint n_param_values, const GValue *param_values, gpointer data); -#endif #ifdef FEAT_DND static gboolean drop_cb(GtkDropTarget *target, const GValue *value, double x, double y, gpointer data); #endif @@ -293,7 +290,7 @@ static gboolean drop_cb(GtkDropTarget *target, const GValue *value, double x, do static void tabline_enter_cb(GtkEventController *controller, double x, double y, void *udata); static void on_select_tab(GtkNotebook *notebook, gpointer *page, gint idx, gpointer data); static void on_tab_reordered(GtkNotebook *notebook, gpointer *page, gint idx, gpointer data); -static GMenu *create_tabline_popup_menu(GActionGroup **agroup_store); +static VimMenu *create_tabline_popup_menu(void); static void tabline_menu_press_event(GtkGestureClick *gesture, int n_press, double x, double y, GtkWidget *popover); #endif static void mainwin_destroy_cb(GObject *object, gpointer data); @@ -481,30 +478,10 @@ gui_mch_init(void) gtk_window_set_child(GTK_WINDOW(gui.mainwin), vbox); #ifdef FEAT_MENU - { - GMenu *gmenu = g_menu_new(); - gui.menubar = gtk_popover_menu_bar_new_from_model( - G_MENU_MODEL(gmenu)); - g_object_set_data_full(G_OBJECT(gui.menubar), "vim-gmenu", - gmenu, g_object_unref); - gtk_widget_set_name(gui.menubar, "vim-menubar"); - gtk_widget_set_visible(gui.menubar, FALSE); - gtk_box_append(GTK_BOX(vbox), gui.menubar); - } - // Return keyboard focus to the drawing area when a menubar popover - // closes (issue #20274). GtkPopoverMenuBar owns its popovers - // privately, so attach via an emission hook on GtkPopover::closed - // and filter for popovers under our menubar inside the callback. - { - GTypeClass *cls = g_type_class_ref(GTK_TYPE_POPOVER); - guint sig_id = g_signal_lookup("closed", GTK_TYPE_POPOVER); - - if (sig_id != 0) - g_signal_add_emission_hook(sig_id, 0, - menubar_popover_closed_hook, NULL, NULL); - if (cls != NULL) - g_type_class_unref(cls); - } + gui.menubar = vim_menu_bar_new(); + gtk_widget_set_name(gui.menubar, "vim-menubar"); + gtk_widget_set_visible(gui.menubar, FALSE); + gtk_box_append(GTK_BOX(vbox), gui.menubar); #endif #ifdef FEAT_TOOLBAR @@ -544,28 +521,25 @@ gui_mch_init(void) // Create right click popup menu for tabline { GtkGesture *click; - GActionGroup *agroup; - GMenu *menu; - GtkWidget *popover; + VimMenu *menu; click = gtk_gesture_click_new(); - menu = create_tabline_popup_menu(&agroup); - popover = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu)); - g_object_unref(menu); + menu = create_tabline_popup_menu(); - gtk_widget_set_parent(popover, gui.tabline); - g_object_set_data(G_OBJECT(gui.tabline), "menu", popover); - gtk_widget_insert_action_group(gui.tabline, "tabline", agroup); - g_object_unref(agroup); + gtk_widget_set_parent(GTK_WIDGET(menu), gui.tabline); + g_object_set_data(G_OBJECT(gui.tabline), "menu", menu); - gtk_popover_set_has_arrow(GTK_POPOVER(popover), FALSE); - gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM); + gtk_popover_set_has_arrow(GTK_POPOVER(menu), FALSE); + gtk_popover_set_position(GTK_POPOVER(menu), GTK_POS_BOTTOM); + // Make popover start at top left corner + gtk_widget_set_halign(GTK_WIDGET(menu), GTK_ALIGN_START); // Listen for anny mouse button gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(click), 0); g_signal_connect_object(click, "pressed", - G_CALLBACK(tabline_menu_press_event), popover, G_CONNECT_DEFAULT); + G_CALLBACK(tabline_menu_press_event), + menu, G_CONNECT_DEFAULT); gtk_widget_add_controller(gui.tabline, GTK_EVENT_CONTROLLER(click)); } #endif @@ -812,6 +786,19 @@ gui_mch_exit(int rc UNUSED) // Make sure to destroy popover used for balloon eval, or we will get a // warning from GTK that the draw area still has children left. gui_mch_destroy_beval_area(balloonEval); +#endif +#ifdef FEAT_MENU + // Make sure to unparent any popover menus + { + vimmenu_T *menu; + + FOR_ALL_MENUS(menu) + { + if ((menu->name[0] == ']' || menu_is_popup(menu->name)) + && menu->submenu_id != NULL) + gtk_widget_unparent(menu->submenu_id); + } + } #endif gtk_window_destroy(GTK_WINDOW(gui.mainwin)); } @@ -1939,6 +1926,19 @@ key_press_event(GtkEventControllerKey *controller UNUSED, state |= GDK_SHIFT_MASK; } +#ifdef FEAT_MENU + // If there is a menu and 'wak' is "yes", or 'wak' is "menu" and the key + // is a menu shortcut, we ignore everything with the ALT modifier. + if ((state & GDK_ALT_MASK) + && gui.menu_is_active + && (*p_wak == 'y' + || (*p_wak == 'm' + && len == 1 + && gui_is_menu_shortcut(string[0])))) + // Tell GTK we have not handled the key (so it can handle it). + return FALSE; +#endif + // Check for special keys if (len == 0 || len == 1) { @@ -2227,6 +2227,10 @@ motion_notify_event(GtkEventControllerMotion *controller UNUSED, prev_mouse_x = x; prev_mouse_y = y; + + // Make sure keyboard input goes to the drawing area. Fixes issues with menu + // still being focused. + gtk_widget_grab_focus(gui.drawarea); } static void @@ -2237,8 +2241,7 @@ enter_notify_event(GtkEventControllerMotion *controller UNUSED, prev_mouse_y = y; // Make sure keyboard input goes to the drawing area. - if (!gtk_widget_has_focus(gui.drawarea)) - gtk_widget_grab_focus(gui.drawarea); + gtk_widget_grab_focus(gui.drawarea); } static gboolean @@ -2300,48 +2303,6 @@ focus_out_event(GtkEventControllerFocus *controller UNUSED, } } -#ifdef FEAT_MENU - static gboolean -grab_drawarea_focus_idle(gpointer data UNUSED) -{ - if (gui.drawarea != NULL && !gtk_widget_has_focus(gui.drawarea)) - gtk_widget_grab_focus(gui.drawarea); - return G_SOURCE_REMOVE; -} - - static gboolean -menubar_popover_closed_hook(GSignalInvocationHint *ihint UNUSED, - guint n_param_values, const GValue *param_values, - gpointer data UNUSED) -{ - GObject *obj; - GtkWidget *popover; - GtkWidget *parent; - - if (n_param_values < 1 || gui.menubar == NULL || gui.drawarea == NULL) - return TRUE; - obj = g_value_get_object(¶m_values[0]); - if (!GTK_IS_POPOVER(obj)) - return TRUE; - popover = GTK_WIDGET(obj); - - // Only react to popovers that descend from the menubar. - for (parent = gtk_widget_get_parent(popover); - parent != NULL; - parent = gtk_widget_get_parent(parent)) - { - if (parent != gui.menubar) - continue; - // Defer the grab to the next main loop iteration; calling it - // synchronously while GTK is still completing the popover close - // has no effect (issue #20274). - g_idle_add(grab_drawarea_focus_idle, NULL); - break; - } - return TRUE; // keep the emission hook installed -} -#endif - static void drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) { @@ -2818,6 +2779,7 @@ gui_mch_enable_scrollbar(scrollbar_T *sb, int flag) gtk_widget_set_visible(sb->id, flag); } +#if defined(FEAT_MENU) /* * ============================================================ * Menu stubs @@ -2827,56 +2789,22 @@ gui_mch_enable_scrollbar(scrollbar_T *sb, int flag) void gui_mch_menu_grey(vimmenu_T *menu, int grey) { - if (menu->id == NULL || menu_action_group == NULL) - return; - - // For toolbar items, use gtk_widget_set_sensitive - if (menu->parent != NULL && menu_is_toolbar(menu->parent->name)) - { - if (menu->id != (GtkWidget *)1) - gtk_widget_set_sensitive(menu->id, !grey); + if (menu->id == NULL) return; - } - - // For menu items, enable/disable the GSimpleAction - if (menu->label != NULL) - { - GAction *action = g_action_map_lookup_action( - G_ACTION_MAP(menu_action_group), - (const char *)menu->label); - if (action != NULL) - g_simple_action_set_enabled(G_SIMPLE_ACTION(action), !grey); - } + gtk_widget_set_sensitive(menu->id, !grey); + gui_mch_update(); } -#if defined(FEAT_MENU) /* * Make menu item hidden or not hidden. */ void gui_mch_menu_hidden(vimmenu_T *menu, int hidden) { - // GMenu-based menu items have no real widget, only the (GtkWidget *)1 - // marker; they cannot be toggled via the widget API. - if (menu->id == NULL || menu->id == (GtkWidget *)1) + if (menu->id == NULL) return; - - if (hidden) - { - if (gtk_widget_get_visible(menu->id)) - { - gtk_widget_set_visible(menu->id, FALSE); - gui_mch_update(); - } - } - else - { - if (!gtk_widget_get_visible(menu->id)) - { - gtk_widget_set_visible(menu->id, TRUE); - gui_mch_update(); - } - } + gtk_widget_set_visible(menu->id, !hidden); + gui_mch_update(); } void @@ -3053,52 +2981,34 @@ on_tab_reordered( * Handle selecting an item in the tab line popup menu. */ static void -tabline_menu_action_cb( - GSimpleAction *action UNUSED, - GVariant *parameter UNUSED, - void *udata) +tabline_menu_event_cb(VimMenuItem *item, VimMenuItemEvent event, void *udata) { - send_tabline_menu_event(tabpage_hover, GPOINTER_TO_INT(udata)); + if (event == VIM_MENU_ITEM_CLICKED) + send_tabline_menu_event(tabpage_hover, GPOINTER_TO_INT(udata)); } static void -add_tabline_menu_item( - GMenu *gmenu, - GActionMap *amap, - const char *name, - const char *action, - int resp) +add_tabline_menu_item(VimMenu *menu, const char *name, int resp) { - GSimpleAction *act = g_simple_action_new(action, NULL); - char detailed[32]; + VimMenuItem *item = VIM_MENU_ITEM(vim_menu_item_new(name, + tabline_menu_event_cb, GINT_TO_POINTER(resp))); - g_signal_connect(act, "activate", G_CALLBACK(tabline_menu_action_cb), - GINT_TO_POINTER(resp)); - g_action_map_add_action(amap, G_ACTION(act)); - g_object_unref(act); - - vim_snprintf(detailed, sizeof(detailed), "tabline.%s", action); - g_menu_append(gmenu, name, detailed); + vim_menu_insert_item(menu, item, -1); } /* * Create a menu for the tab line. */ - static GMenu * -create_tabline_popup_menu(GActionGroup **agroup_store) + static VimMenu * +create_tabline_popup_menu(void) { - GMenu *gmenu = g_menu_new(); - GSimpleActionGroup *agroup = g_simple_action_group_new(); + VimMenu *menu = VIM_MENU(vim_menu_new()); - add_tabline_menu_item(gmenu, G_ACTION_MAP(agroup), - _("Close Tab"), "close-tab", TABLINE_MENU_CLOSE); - add_tabline_menu_item(gmenu, G_ACTION_MAP(agroup), - _("New Tab"), "new-tab", TABLINE_MENU_NEW); - add_tabline_menu_item(gmenu, G_ACTION_MAP(agroup), - _("Open Tab..."), "open-tab", TABLINE_MENU_OPEN); + add_tabline_menu_item(menu, _("Close Tab"), TABLINE_MENU_CLOSE); + add_tabline_menu_item(menu, _("New Tab"), TABLINE_MENU_NEW); + add_tabline_menu_item(menu, _("Open Tab..."), TABLINE_MENU_OPEN); - *agroup_store = G_ACTION_GROUP(agroup); - return gmenu; + return menu; } static void @@ -3826,43 +3736,92 @@ gui_get_x11_windis(Window *win UNUSED, Display **dis UNUSED) } #if defined(FEAT_MENU) - void -gui_gtk_set_mnemonics(int enable UNUSED) +/* + * Translate Vim's mnemonic tagging to GTK+ style and convert to UTF-8 + * if necessary. The caller must vim_free() the returned string. + * + * Input Output + * _ __ + * && & + * & _ stripped if use_mnemonic == FALSE + * end of menu label text + */ + static char_u * +translate_mnemonic_tag(char_u *name, int use_mnemonic) { - // TODO: implement? -} + char_u *buf; + char_u *psrc; + char_u *pdest; + int n_underscores = 0; - static void -popupmenu_closed_cb(GtkPopover *popover, gpointer data UNUSED) -{ - gtk_widget_unparent(GTK_WIDGET(popover)); - if (gui.drawarea != NULL) - gtk_widget_queue_draw(gui.drawarea); -} + name = CONVERT_TO_UTF8(name); + if (name == NULL) + return NULL; -typedef struct { - GtkPopover *popover; - vimmenu_T *menu; -} popup_item_data_T; + for (psrc = name; *psrc != NUL && *psrc != TAB; ++psrc) + if (*psrc == '_') + ++n_underscores; - static void -popup_item_clicked_cb(GtkButton *button UNUSED, gpointer data) + buf = alloc(psrc - name + n_underscores + 1); + if (buf != NULL) + { + pdest = buf; + for (psrc = name; *psrc != NUL && *psrc != TAB; ++psrc) + { + if (*psrc == '_') + { + *pdest++ = '_'; + *pdest++ = '_'; + } + else if (*psrc != '&') + { + *pdest++ = *psrc; + } + else if (*(psrc + 1) == '&') + { + *pdest++ = *psrc++; + } + else if (use_mnemonic) + { + *pdest++ = '_'; + } + } + *pdest = NUL; + } + + CONVERT_TO_UTF8_FREE(name); + return buf; +} + +/* + * Enable or disable accelerators for the toplevel menus. + */ + void +gui_gtk_set_mnemonics(int enable) { - popup_item_data_T *d = data; + vimmenu_T *menu; + char_u *name; - if (d->popover != NULL) - gtk_popover_popdown(d->popover); - if (d->menu != NULL) + FOR_ALL_MENUS(menu) { - gui_menu_cb(d->menu); - gui_mch_flush(); + if (menu->id == NULL) + continue; + + name = translate_mnemonic_tag(menu->name, enable); + // Don't think the check if necessary but still do it anyways + if (VIM_IS_MENU_BAR_ITEM(menu->id)) + vim_menu_bar_item_set_text(VIM_MENU_BAR_ITEM(menu->id), + (const char *)name); + vim_free(name); } } static void -popup_item_data_free(gpointer data, GClosure *closure UNUSED) +popupmenu_closed_cb(GtkWidget *popover, void *udata UNUSED) { - g_free(data); + gtk_widget_unparent(popover); + if (gui.drawarea != NULL) + gtk_widget_queue_draw(gui.drawarea); } /* @@ -3872,93 +3831,24 @@ popup_item_data_free(gpointer data, GClosure *closure UNUSED) gui_gtk_popup_at(vimmenu_T *menu, int x, int y) { GtkWidget *popover; - GtkWidget *box; - GtkWidget *parent; GdkRectangle rect; - vimmenu_T *child; - int mode; - int natural_width = 0; - if (menu == NULL || menu->children == NULL) + if (menu == NULL || menu->submenu_id == NULL) return; - // Attach the popover to drawarea's parent rather than to drawarea itself. - // GtkDrawingArea is a leaf widget whose snapshot does not iterate children, - // and parenting a popover to it has been observed to leave the drawing area - // blank while the popover is open. - parent = gtk_widget_get_parent(gui.drawarea); - if (parent == NULL) - parent = gui.drawarea; - - // Build the popover by hand instead of using gtk_popover_menu_new_from_model. - // GtkPopoverMenu relies on the "menu." action-group lookup walking up - // the parent chain, which has been observed to silently fail on some - // compositors when the popover is parented via gtk_widget_set_parent. Wiring - // each menu item to a plain "clicked" signal sidesteps that entirely. - popover = gtk_popover_new(); - gtk_widget_set_parent(popover, parent); - gtk_popover_set_has_arrow(GTK_POPOVER(popover), FALSE); - gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM); - gtk_widget_add_css_class(popover, "menu"); - - box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_popover_set_child(GTK_POPOVER(popover), box); - - mode = get_menu_mode_flag(); - - for (child = menu->children; child != NULL; child = child->next) - { - GtkWidget *item; - char_u *label; - popup_item_data_T *cb_data; - - if (menu_is_separator(child->name)) - { - item = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); - gtk_box_append(GTK_BOX(box), item); - continue; - } - - label = CONVERT_TO_UTF8(child->dname); - item = gtk_button_new_with_mnemonic( - label != NULL ? (const char *)label : ""); - CONVERT_TO_UTF8_FREE(label); - - gtk_widget_add_css_class(item, "flat"); - gtk_widget_add_css_class(item, "model"); - gtk_button_set_has_frame(GTK_BUTTON(item), FALSE); - gtk_widget_set_halign(item, GTK_ALIGN_FILL); - { - GtkWidget *btn_label = gtk_button_get_child(GTK_BUTTON(item)); - if (GTK_IS_LABEL(btn_label)) - gtk_label_set_xalign(GTK_LABEL(btn_label), 0.0); - } - - if (!(child->modes & child->enabled & mode)) - gtk_widget_set_sensitive(item, FALSE); - - cb_data = g_new0(popup_item_data_T, 1); - cb_data->popover = GTK_POPOVER(popover); - cb_data->menu = child; - g_signal_connect_data(item, "clicked", - G_CALLBACK(popup_item_clicked_cb), - cb_data, popup_item_data_free, 0); - - gtk_box_append(GTK_BOX(box), item); - } + popover = vim_menu_copy(VIM_MENU(menu->submenu_id)); + gtk_widget_set_parent(popover, gui.drawarea); rect.x = x; rect.y = y; - // GtkPopover with GTK_POS_BOTTOM centres horizontally on the pointing-to - // rectangle. Use the box's natural width so the popover's left edge ends - // up at the cursor (down-and-to-the-right of the pointer). - gtk_widget_measure(box, GTK_ORIENTATION_HORIZONTAL, -1, - NULL, &natural_width, NULL, NULL); - rect.width = natural_width > 0 ? natural_width : 1; - rect.height = 1; + rect.width = rect.height = 1; + + // Make sure popover aligns down-and-to-the-right of the pointer. + gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM); + gtk_widget_set_halign(popover, GTK_ALIGN_START); gtk_popover_set_pointing_to(GTK_POPOVER(popover), &rect); - g_signal_connect(popover, "closed", + g_signal_connect(GTK_POPOVER(popover), "closed", G_CALLBACK(popupmenu_closed_cb), NULL); gtk_popover_popup(GTK_POPOVER(popover)); } @@ -3977,23 +3867,8 @@ gui_make_popup(char_u *path_name, int mouse_pos) gui_mch_getmouse(&x, &y); else { - // Find the cursor position relative to parent of drawarea - GtkWidget *parent = gtk_widget_get_parent(gui.drawarea); - graphene_point_t point; - if (parent == NULL) - parent = gui.drawarea; - - if (!gtk_widget_compute_point(gui.drawarea, parent, - &GRAPHENE_POINT_INIT(0, 0), &point)) - x = y = 0; - else - { - x = point.x; - y = point.y; - } - - x += FILL_X(curwin->w_wincol + curwin->w_wcol + 1) + 1; - y += FILL_Y(W_WINROW(curwin) + curwin->w_wrow + 1) + 1; + x = FILL_X(curwin->w_wincol + curwin->w_wcol + 1) + 1; + y = FILL_Y(W_WINROW(curwin) + curwin->w_wrow + 1) + 1; } gui_gtk_popup_at(menu, x, y); @@ -4339,7 +4214,6 @@ static int last_text_area_h = 0; * ============================================================ * Menu functions * ============================================================ - * TODO: Implement using GMenu + GtkPopoverMenuBar */ /* @@ -4427,109 +4301,107 @@ create_toolbar_icon(vimmenu_T *menu) return image; } -/* - * GTK4 Menu system using GMenu + GSimpleActionGroup + GtkPopoverMenuBar. - * - * Each menu/submenu has a GMenu stored in menu->submenu_id (cast to - * GtkWidget* to fit the struct field type). - * Actions are added to a GSimpleActionGroup attached to gui.mainwin. - */ - -static int menu_action_id = 0; - static void -menu_action_cb(GSimpleAction *action UNUSED, GVariant *parameter UNUSED, - gpointer data) +menu_button_clicked_cb( + VimMenuItem *item, + VimMenuItemEvent event, + vimmenu_T *menu) { - // Force-close any open popover menus in the menubar. - // GTK4 marks them as not-visible but Vim's custom main loop - // may not process the rendering update, so we flush explicitly. - if (gui.menubar != NULL) + if (event == VIM_MENU_ITEM_CLICKED) + gui_menu_cb(menu); + else if (event == VIM_MENU_ITEM_SELECTED) { - GtkWidget *item; + // Show tooltip instantly in cmdline message. + char_u *tooltip; + static gboolean did_msg = FALSE; - for (item = gtk_widget_get_first_child(gui.menubar); - item != NULL; - item = gtk_widget_get_next_sibling(item)) - { - GtkWidget *child; + if (State & MODE_CMDLINE) + return; - for (child = gtk_widget_get_first_child(item); - child != NULL; - child = gtk_widget_get_next_sibling(child)) - { - if (GTK_IS_POPOVER(child)) - gtk_popover_popdown(GTK_POPOVER(child)); - } + tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]); + if (tooltip != NULL && utf_valid_string(tooltip, NULL)) + { + msg((char *)tooltip); + did_msg = TRUE; + setcursor(); + out_flush_cursor(TRUE, FALSE); } + else if (did_msg) + { + msg(""); + did_msg = FALSE; + setcursor(); + out_flush_cursor(TRUE, FALSE); + } + CONVERT_TO_UTF8_FREE(tooltip); } - - gui_menu_cb((vimmenu_T *)data); - gui_mch_flush(); -} - - static char * -make_action_name(vimmenu_T *menu) -{ - // Create a unique action name from the menu pointer - static char buf[64]; - vim_snprintf(buf, sizeof(buf), "menu%d", menu_action_id++); - return buf; } void -gui_mch_add_menu(vimmenu_T *menu, int idx UNUSED) +gui_mch_add_menu(vimmenu_T *menu, int idx) { - GMenu *submenu; + vimmenu_T *parent; + GtkWidget *parent_widget; + gboolean use_mnemonic; + char_u *text; if (menu->name[0] == ']' || menu_is_popup(menu->name)) { - // Popup menus - just create a GMenu, don't add to menubar - submenu = g_menu_new(); - menu->submenu_id = (GtkWidget *)(gpointer)submenu; + // Attach the popover to drawarea's parent rather than to drawarea + // itself. GtkDrawingArea is a leaf widget whose snapshot does not + // iterate children, and parenting a popover to it has been observed to + // leave the drawing area blank while the popover is open. + menu->submenu_id = g_object_ref_sink(vim_menu_new()); + gtk_widget_set_parent(menu->submenu_id, gui.drawarea); return; } - if (menu->parent != NULL && menu->parent->submenu_id == NULL) - return; - if (!menu_is_menubar(menu->name)) - return; + parent = menu->parent; - // Create a submenu for this menu - submenu = g_menu_new(); - menu->submenu_id = (GtkWidget *)(gpointer)submenu; + if ((parent != NULL && parent->submenu_id == NULL) + || !menu_is_menubar(menu->name)) + return; - // Add to parent menu or menubar's model - { - GMenu *parent_menu; - char_u *label; + menu->submenu_id = g_object_ref_sink(vim_menu_new()); - label = CONVERT_TO_UTF8(menu->dname); + use_mnemonic = parent != NULL || p_wak[0] != 'n'; + text = translate_mnemonic_tag(menu->name, use_mnemonic); - if (menu->parent != NULL) - parent_menu = (GMenu *)(gpointer)menu->parent->submenu_id; - else - parent_menu = (GMenu *)(gpointer)g_object_get_data( - G_OBJECT(gui.menubar), "vim-gmenu"); + if (parent != NULL) + { + parent_widget = parent->submenu_id; + menu->id = g_object_ref_sink(vim_menu_item_new( + (const char *)text, NULL, NULL)); - if (parent_menu != NULL) - g_menu_append_submenu(parent_menu, (const char *)label, - G_MENU_MODEL(submenu)); + vim_menu_item_set_submenu(VIM_MENU_ITEM(menu->id), + VIM_MENU(menu->submenu_id)); + vim_menu_insert_item(VIM_MENU(parent_widget), + VIM_MENU_ITEM(menu->id), idx); + } + else + { + parent_widget = gui.menubar; + menu->id = g_object_ref_sink(vim_menu_bar_item_new( + (const char *)text, VIM_MENU(menu->submenu_id))); - CONVERT_TO_UTF8_FREE(label); + vim_menu_bar_insert_item(VIM_MENU_BAR(parent_widget), + VIM_MENU_BAR_ITEM(menu->id), idx); } + + vim_free(text); } void gui_mch_add_menu_item(vimmenu_T *menu, int idx) { - vimmenu_T *parent = menu->parent; + vimmenu_T *parent = menu->parent; #ifdef FEAT_TOOLBAR if (parent != NULL && menu_is_toolbar(parent->name)) { if (menu_is_separator(menu->name)) { + // TODO menu->id = vim_toolbar_insert_separator(VIM_TOOLBAR(gui.toolbar), idx); } @@ -4565,51 +4437,36 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx) if (parent == NULL || parent->submenu_id == NULL) return; + if (menu_is_separator(menu->name)) + { + menu->id = g_object_ref_sink(vim_menu_insert_separator( + VIM_MENU(parent->submenu_id), idx)); + } + else { - GMenu *parent_menu = (GMenu *)(gpointer)parent->submenu_id; + char_u *text; + char_u *accel_text = NULL; + gboolean use_mnemonic; - if (menu_is_separator(menu->name)) - { - // GMenu doesn't have real separators; use a section - GMenu *section = g_menu_new(); - g_menu_insert_section(parent_menu, idx, NULL, - G_MENU_MODEL(section)); - g_object_unref(section); - menu->id = NULL; - } - else - { - char *action_name; - char detailed[80]; - char_u *label; - GSimpleAction *action; - - // Create a unique action - action_name = make_action_name(menu); - action = g_simple_action_new(action_name, NULL); - g_signal_connect(action, "activate", - G_CALLBACK(menu_action_cb), menu); - - if (menu_action_group == NULL) - { - menu_action_group = g_simple_action_group_new(); - gtk_widget_insert_action_group(gui.mainwin, "menu", - G_ACTION_GROUP(menu_action_group)); - } - g_action_map_add_action(G_ACTION_MAP(menu_action_group), - G_ACTION(action)); - g_object_unref(action); - - label = CONVERT_TO_UTF8(menu->dname); - vim_snprintf(detailed, sizeof(detailed), "menu.%s", action_name); - g_menu_insert(parent_menu, idx, (const char *)label, detailed); - CONVERT_TO_UTF8_FREE(label); - - menu->id = (GtkWidget *)1; // non-NULL marker - // Store action name for later use (grey/enable) - menu->label = (GtkWidget *)vim_strsave( - (char_u *)action_name); - } + use_mnemonic = p_wak[0] != 'n'; + text = translate_mnemonic_tag(menu->name, use_mnemonic); + + if (menu->actext != NULL && menu->actext[0] != NUL) + accel_text = CONVERT_TO_UTF8(menu->actext); + + // Add our own reference to the widget + menu->id = g_object_ref_sink(vim_menu_item_new((const char *)text, + (VimMenuItemFunc)menu_button_clicked_cb, menu)); + + if (accel_text != NULL) + vim_menu_item_set_accel(VIM_MENU_ITEM(menu->id), + (const char *)accel_text); + + vim_menu_insert_item(VIM_MENU(parent->submenu_id), + VIM_MENU_ITEM(menu->id), idx); + + vim_free(text); + CONVERT_TO_UTF8_FREE(accel_text); } } @@ -4624,7 +4481,7 @@ gui_mch_menu_set_tip(vimmenu_T *menu) { char_u *tooltip; - if (menu->id == NULL || menu->parent == NULL || gui.toolbar == NULL) + if (menu->id == NULL) return; tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]); @@ -4633,104 +4490,29 @@ gui_mch_menu_set_tip(vimmenu_T *menu) CONVERT_TO_UTF8_FREE(tooltip); } -/* - * Return TRUE if "menu" has a corresponding entry in its parent's GMenu. - * Popup menus, toolbar children and orphaned submenus do not. - */ - static int -menu_has_gmenu_slot(vimmenu_T *menu) -{ - if (menu == NULL || menu->name == NULL) - return FALSE; - if (menu->name[0] == ']' || menu_is_popup(menu->name)) - return FALSE; - if (menu->parent != NULL) - { - if (menu_is_toolbar(menu->parent->name)) - return FALSE; - if (menu->parent->submenu_id == NULL) - return FALSE; - return TRUE; - } - return menu_is_menubar(menu->name); -} - -/* - * Find the parent GMenu containing the entry for "menu" and the position of - * that entry. Returns TRUE on success. - */ - static int -get_gmenu_pos_in_parent(vimmenu_T *menu, GMenu **parent_out, int *pos_out) -{ - GMenu *parent_gmenu; - vimmenu_T *first_sibling; - vimmenu_T *sib; - int pos = 0; - - if (!menu_has_gmenu_slot(menu)) - return FALSE; - - if (menu->parent != NULL) - { - parent_gmenu = (GMenu *)(gpointer)menu->parent->submenu_id; - first_sibling = menu->parent->children; - } - else - { - if (gui.menubar == NULL) - return FALSE; - parent_gmenu = (GMenu *)(gpointer)g_object_get_data( - G_OBJECT(gui.menubar), "vim-gmenu"); - first_sibling = root_menu; - } - if (parent_gmenu == NULL) - return FALSE; - - for (sib = first_sibling; sib != NULL && sib != menu; sib = sib->next) - if (menu_has_gmenu_slot(sib)) - pos++; - if (sib != menu) - return FALSE; - - *parent_out = parent_gmenu; - *pos_out = pos; - return TRUE; -} - void gui_mch_destroy_menu(vimmenu_T *menu) { - GMenu *parent_gmenu = NULL; - int pos = 0; - // For toolbar buttons and separators, remove from the toolbar box. - if (menu->id != NULL && menu->id != (GtkWidget *)1) + if (menu->parent != NULL && menu_is_toolbar(menu->parent->name)) { vim_toolbar_remove(VIM_TOOLBAR(gui.toolbar), menu->id); menu->id = NULL; return; } - menu->id = NULL; - // Remove the entry from the parent GMenu so the visible menu updates. - if (get_gmenu_pos_in_parent(menu, &parent_gmenu, &pos)) - g_menu_remove(parent_gmenu, pos); - - // Remove the GAction created for this item and free its name. - if (menu->label != NULL) - { - if (menu_action_group != NULL) - g_action_map_remove_action(G_ACTION_MAP(menu_action_group), - (const char *)menu->label); - VIM_CLEAR(menu->label); - } + // For popup menus, unparent the menu as well + if (menu->name[0] == ']' || menu_is_popup(menu->name)) + gtk_widget_unparent(menu->submenu_id); + else if (menu->parent == NULL) + // Remove from menubar + vim_menu_bar_remove(VIM_MENU_BAR(gui.menubar), menu->id); + else + // Remove from parent menu + vim_menu_remove(VIM_MENU(menu->parent->submenu_id), menu->id); - // Release our reference on the submenu GMenu (if any). - if (menu->submenu_id != NULL) - { - g_object_unref(menu->submenu_id); - menu->submenu_id = NULL; - } + g_clear_object(&menu->submenu_id); + g_clear_object(&menu->id); } void @@ -4745,28 +4527,32 @@ gui_mch_show_popupmenu(vimmenu_T *menu) static void show_menubar_popover(void) { - GMenu *gmenu; - GtkWidget *popover; + GtkWidget *menu; GdkRectangle rect; if (gui.menubar == NULL || gui.drawarea == NULL) return; - gmenu = (GMenu *)g_object_get_data(G_OBJECT(gui.menubar), "vim-gmenu"); - if (gmenu == NULL || g_menu_model_get_n_items(G_MENU_MODEL(gmenu)) == 0) + + if (gtk_widget_is_visible(gui.menubar)) + { + // If menubar is visible, then just show first menu in menubar, like how + // GTK traditionally seems to do it? + vim_menu_bar_show(VIM_MENU_BAR(gui.menubar), NULL); return; + } - popover = gtk_popover_menu_new_from_model(G_MENU_MODEL(gmenu)); - gtk_widget_set_parent(popover, gui.drawarea); - gtk_popover_set_has_arrow(GTK_POPOVER(popover), FALSE); - gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM); + // Copy and convert the menubar into a menu popover + menu = vim_menu_bar_to_menu(VIM_MENU_BAR(gui.menubar)); + + gtk_widget_set_parent(menu, gui.drawarea); + gtk_popover_set_position(GTK_POPOVER(menu), GTK_POS_BOTTOM); rect.x = 0; rect.y = 0; rect.width = 1; rect.height = 1; - gtk_popover_set_pointing_to(GTK_POPOVER(popover), &rect); - g_signal_connect(popover, "closed", - G_CALLBACK(popupmenu_closed_cb), NULL); - gtk_popover_popup(GTK_POPOVER(popover)); + gtk_popover_set_pointing_to(GTK_POPOVER(menu), &rect); + g_signal_connect(menu, "closed", G_CALLBACK(popupmenu_closed_cb), NULL); + gtk_popover_popup(GTK_POPOVER(menu)); } /* diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 11b7463892..8db224ea67 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -140,7 +140,9 @@ vim_draw_area_class_init(VimDrawAreaClass *class) obj_class->finalize = vim_draw_area_finalize; + // Add a layout manager so it can handle child popovers gtk_widget_class_set_layout_manager_type(widget_class, GTK_TYPE_BIN_LAYOUT); + } static void diff --git a/src/gui_gtk4_menu.c b/src/gui_gtk4_menu.c new file mode 100644 index 0000000000..174f2f772b --- /dev/null +++ b/src/gui_gtk4_menu.c @@ -0,0 +1,1038 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#include "vim.h" + +#ifdef FEAT_MENU + +#include +#include "gui_gtk4_menu.h" + +// Note that this may return NULL for popup menus +#define GET_MENU_BAR(m) VIM_MENU_BAR(gtk_widget_get_ancestor( \ + GTK_WIDGET(m), VIM_TYPE_MENU_BAR)) + +/* + * Similar as GtkButton but set CSS name to "item" to emulate GtkPopoverMenuBar + * styling. Always has a submenu. + */ +struct _VimMenuBarItem +{ + GtkButton parent; + + GtkWidget *menu; +}; + +G_DEFINE_TYPE(VimMenuBarItem, vim_menu_bar_item, GTK_TYPE_BUTTON) + + static void +vim_menu_bar_item_dispose(GObject *object) +{ + VimMenuBarItem *self = VIM_MENU_BAR_ITEM(object); + + g_clear_pointer((GtkWidget **)&self->menu, gtk_widget_unparent); + + G_OBJECT_CLASS(vim_menu_bar_item_parent_class)->dispose(object); +} + + static void +vim_menu_bar_item_class_init(VimMenuBarItemClass *class) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); + GObjectClass *obj_class = G_OBJECT_CLASS(class); + + obj_class->dispose = vim_menu_bar_item_dispose; + + gtk_widget_class_set_css_name(widget_class, "item"); +} + + static void +vim_menu_bar_item_init(VimMenuBarItem *self) +{ + // Enable mnemonics + gtk_button_set_use_underline(GTK_BUTTON(self), TRUE); +} + + GtkWidget * +vim_menu_bar_item_new(const char *text, VimMenu *menu) +{ + VimMenuBarItem *item = g_object_new(VIM_TYPE_MENU_BAR_ITEM, NULL); + + gtk_button_set_label(GTK_BUTTON(item), text); + + item->menu = GTK_WIDGET(menu); + gtk_popover_set_position(GTK_POPOVER(menu), GTK_POS_BOTTOM); + // Make popover start at top left corner + gtk_widget_set_halign(GTK_WIDGET(menu), GTK_ALIGN_START); + gtk_widget_set_parent(GTK_WIDGET(menu), GTK_WIDGET(item)); + + return GTK_WIDGET(item); +} + + void +vim_menu_bar_item_set_text(VimMenuBarItem *self, const char *text) +{ + gtk_button_set_label(GTK_BUTTON(self), text); +} + +/* + * Similar to GtkPopoverMenuBar + */ +struct _VimMenuBar +{ + GtkWidget parent; + + GList *items; + + // Currently visible item that has submenu popped up, else NULL + GtkWidget *active_item; +}; + +G_DEFINE_TYPE(VimMenuBar, vim_menu_bar, GTK_TYPE_WIDGET) + + static void +vim_menu_bar_dispose(GObject *object) +{ + VimMenuBar *self = VIM_MENU_BAR(object); + + g_clear_list(&self->items, (GDestroyNotify)gtk_widget_unparent); + + G_OBJECT_CLASS(vim_menu_bar_parent_class)->dispose(object); +} + + static void +vim_menu_bar_class_init(VimMenuBarClass *class) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); + GObjectClass *obj_class = G_OBJECT_CLASS(class); + + obj_class->dispose = vim_menu_bar_dispose; + + gtk_widget_class_set_layout_manager_type(widget_class, GTK_TYPE_BOX_LAYOUT); + gtk_widget_class_set_css_name(widget_class, "menubar"); +} + + static void +vim_menu_bar_init(VimMenuBar *self) +{ + GtkLayoutManager *lm = gtk_widget_get_layout_manager(GTK_WIDGET(self)); + + gtk_orientable_set_orientation(GTK_ORIENTABLE(lm), + GTK_ORIENTATION_HORIZONTAL); + gtk_box_layout_set_spacing(GTK_BOX_LAYOUT(lm), 0); +} + + GtkWidget * +vim_menu_bar_new(void) +{ + return g_object_new(VIM_TYPE_MENU_BAR, NULL); +} + +/* + * Create a VimMenu widget with the menus of the menu bar as its submenus. Note + * that it is a deep copy. + */ + GtkWidget * +vim_menu_bar_to_menu(VimMenuBar *self) +{ + GtkWidget *menu = vim_menu_new(); + int i = 0; + + for (GList *l = self->items; l != NULL; l = l->next, i++) + { + VimMenuBarItem *baritem = l->data; + GtkWidget *item; + + item = vim_menu_item_new( + gtk_button_get_label(GTK_BUTTON(baritem)), NULL, NULL); + + vim_menu_item_set_submenu(VIM_MENU_ITEM(item), + VIM_MENU(vim_menu_copy(VIM_MENU(baritem->menu)))); + + vim_menu_insert_item(VIM_MENU(menu), VIM_MENU_ITEM(item), i); + } + return menu; +} + +/* + * Set the currently active menu of the menubar to "item". If NULL, then close + * any submenus. + */ + static void +vim_menu_bar_set_active_item( + VimMenuBar *self, + VimMenuBarItem *item, + gboolean force) +{ + // Do nothing if currently active item is "item", or if there is not + // currently active item. User must click a menu item first for menus to + // automatically appear on hover. This is unless "force" is TRUE. + // + // Only make item selected if there is no active item (no submenu open), or + // if the item was set as the active item.. + if ((!force && self->active_item == NULL) + || self->active_item == GTK_WIDGET(item)) + { + if (self->active_item == NULL) + gtk_widget_set_state_flags(GTK_WIDGET(item), + GTK_STATE_FLAG_SELECTED, FALSE); + return; + } + + if (self->active_item != NULL) + { + // Call this before popdown, since "closed" signal may be emitted + // immediately. + gtk_widget_unset_state_flags(self->active_item, + GTK_STATE_FLAG_SELECTED); + gtk_popover_popdown(GTK_POPOVER( + VIM_MENU_BAR_ITEM(self->active_item)->menu) + ); + } + + self->active_item = GTK_WIDGET(item); + if (item != NULL) + { + gtk_popover_popup(GTK_POPOVER(item->menu)); + gtk_widget_set_state_flags(GTK_WIDGET(item), + GTK_STATE_FLAG_SELECTED, FALSE); + } +} + + static void +vim_menu_bar_item_enter_cb( + GtkEventController *controller, + double x UNUSED, + double y UNUSED, + VimMenuBar *menubar) +{ + VimMenuBarItem *self; + + self = VIM_MENU_BAR_ITEM(gtk_event_controller_get_widget(controller)); + vim_menu_bar_set_active_item(menubar, self, FALSE); +} + + static void +vim_menu_bar_item_leave_cb( + GtkEventController *controller, + VimMenuBar *menubar) +{ + VimMenuBarItem *self; + + self = VIM_MENU_BAR_ITEM(gtk_event_controller_get_widget(controller)); + + // If the item is the currently active item, then don't deselect it. + if (menubar->active_item != GTK_WIDGET(self)) + gtk_widget_unset_state_flags(GTK_WIDGET(self), + GTK_STATE_FLAG_SELECTED); +} + + static void +vim_menu_bar_item_clicked_cb(VimMenuBarItem *self, VimMenuBar *menubar) +{ + vim_menu_bar_set_active_item(menubar, self, TRUE); +} + + static void +vim_menu_bar_item_menu_closed_cb(VimMenu *menu UNUSED, VimMenuBar *menubar) +{ + if (menubar->active_item != NULL) + gtk_widget_unset_state_flags(GTK_WIDGET(menubar->active_item), + GTK_STATE_FLAG_SELECTED); + vim_menu_bar_set_active_item(menubar, NULL, TRUE); + // Make sure to focus drawarea + gtk_widget_grab_focus(gui.drawarea); +} + +/* + * Insert the menu item at the given index in the menu bar. + */ + void +vim_menu_bar_insert_item(VimMenuBar *self, VimMenuBarItem *item, int idx) +{ + GtkEventController *controller; + GList *next_sibling; + + next_sibling = g_list_nth(self->items, idx); + gtk_widget_insert_before(GTK_WIDGET(item), GTK_WIDGET(self), + next_sibling == NULL ? NULL : next_sibling->data); + + self->items = g_list_insert(self->items, item, idx); + + controller = gtk_event_controller_motion_new(); + g_signal_connect_object(controller, "enter", + G_CALLBACK(vim_menu_bar_item_enter_cb), self, G_CONNECT_DEFAULT); + g_signal_connect_object(controller, "leave", + G_CALLBACK(vim_menu_bar_item_leave_cb), self, G_CONNECT_DEFAULT); + gtk_widget_add_controller(GTK_WIDGET(item), controller); + + g_signal_connect_object(item, "clicked", + G_CALLBACK(vim_menu_bar_item_clicked_cb), self, G_CONNECT_DEFAULT); + + g_signal_connect_object(item->menu, "closed", + G_CALLBACK(vim_menu_bar_item_menu_closed_cb), + self, G_CONNECT_DEFAULT); +} + +/* + * Remove the menu item or separator from the menu bar + */ + void +vim_menu_bar_remove(VimMenuBar *self, GtkWidget *item) +{ + self->items = g_list_remove(self->items, item); + gtk_widget_unparent(item); +} + +/* + * Show the given menu in the menubar. If "item" is NULL, then show first menu. + */ + void +vim_menu_bar_show(VimMenuBar *self, VimMenuBarItem *item) +{ + if (item == NULL) + item = g_list_nth_data(self->items, 0); + + vim_menu_bar_set_active_item(self, item, TRUE); +} + +/* + * If "dir" is negative, then move to the item previous of currently the active + * item. If "dir" is positive, then move to the next item. Return the resulting + * item or NULL if there are no suitable ones. + */ + static GtkWidget * +vim_menu_bar_move_active_item(VimMenuBar *self, int dir) +{ + GtkWidget *(*func)(GtkWidget *); + GtkWidget *(*null_func)(GtkWidget *); + GtkWidget *widget = self->active_item; + + if (widget == NULL) + return gtk_widget_get_first_child(GTK_WIDGET(self)); + + if (dir > 0) + { + func = gtk_widget_get_next_sibling; + null_func = gtk_widget_get_first_child; + } + else + { + func = gtk_widget_get_prev_sibling; + null_func = gtk_widget_get_last_child; + } + + while (TRUE) + { + widget = func(widget); + if (widget == NULL) + { + if (null_func == NULL) + break; + widget = null_func(GTK_WIDGET(self)); + null_func = NULL; + if (widget == NULL) + break; + } + break; + } + return widget; +} + +/* + * Menu button that can be used to perform actions, or if there is a submenu, + * toggle the state of the submenu popover. CSS name is "modelbutton" to make it + * styled like GtkPopoverMenu + */ +struct _VimMenuItem +{ + GtkButton parent; + + GtkWidget *label; // Displays text for button. + GtkWidget *aux_widget; // Either an icon or a label showing the accelerator + // text. + + GtkWidget *submenu; // Submenu popover if any (VimMenu) + + // Callback called when clicked or selected, we store this so that copying a + // menu item works properly. + VimMenuItemFunc func; + void *func_udata; +}; + +G_DEFINE_TYPE(VimMenuItem, vim_menu_item, GTK_TYPE_BUTTON) + + static void +vim_menu_item_dispose(GObject *object) +{ + VimMenuItem *self = VIM_MENU_ITEM(object); + + g_clear_pointer(&self->label, gtk_widget_unparent); + g_clear_pointer(&self->aux_widget, gtk_widget_unparent); + g_clear_pointer((GtkWidget **)&self->submenu, gtk_widget_unparent); + + G_OBJECT_CLASS(vim_menu_item_parent_class)->dispose(object); +} + + static void +vim_menu_item_class_init(VimMenuItemClass *class) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); + GObjectClass *obj_class = G_OBJECT_CLASS(class); + + obj_class->dispose = vim_menu_item_dispose; + + gtk_widget_class_set_layout_manager_type(widget_class, GTK_TYPE_BOX_LAYOUT); + gtk_widget_class_set_css_name(widget_class, "modelbutton"); +} + + static void +vim_menu_item_init(VimMenuItem *self) +{ + GtkLayoutManager *lm = gtk_widget_get_layout_manager(GTK_WIDGET(self)); + + gtk_orientable_set_orientation(GTK_ORIENTABLE(lm), + GTK_ORIENTATION_HORIZONTAL); + gtk_box_layout_set_spacing(GTK_BOX_LAYOUT(lm), 0); +} + +/* + * Create a new menu item with the given text to display. "func" may be NULL if + * not needed. + */ + GtkWidget * +vim_menu_item_new(const char *text, VimMenuItemFunc func, void *udata) +{ + VimMenuItem *item = g_object_new(VIM_TYPE_MENU_ITEM, NULL); + + item->func = func; + item->func_udata = udata; + item->label = gtk_label_new_with_mnemonic(text); + + // Make sure label is on the right and pushes everything to the left + gtk_widget_set_halign(item->label, GTK_ALIGN_START); + gtk_widget_set_hexpand(item->label, TRUE); + gtk_widget_set_parent(item->label, GTK_WIDGET(item)); + + return GTK_WIDGET(item); +} + +/* + * Update displayed text for menu item + */ + void +vim_menu_item_set_text(VimMenuItem *self, const char *text) +{ + gtk_label_set_text_with_mnemonic(GTK_LABEL(self->label), text); +} + + static void +vim_menu_item_set_aux_widget(VimMenuItem *self, GtkWidget *aux) +{ + self->aux_widget = aux; + gtk_widget_set_halign(self->aux_widget, GTK_ALIGN_END); + gtk_widget_set_hexpand(self->aux_widget, FALSE); + gtk_widget_set_margin_start(self->aux_widget, 50); +} + +/* + * Set the accelerator text for the menu item. + */ + void +vim_menu_item_set_accel(VimMenuItem *self, const char *accel_text) +{ + assert(self->aux_widget == NULL); + + vim_menu_item_set_aux_widget(self, gtk_label_new(accel_text)); + gtk_widget_insert_after(self->aux_widget, GTK_WIDGET(self), self->label); +} + +/* + * Set the submenu popover for the menu item + */ + void +vim_menu_item_set_submenu(VimMenuItem *self, VimMenu *submenu) +{ + GtkWidget *icon; + + assert(self->submenu == NULL); + assert(self->aux_widget == NULL); + + // Add arrow icon pointing to right + icon = gtk_image_new_from_icon_name("pan-end-symbolic"); + vim_menu_item_set_aux_widget(self, icon); + gtk_widget_insert_after(self->aux_widget, GTK_WIDGET(self), self->label); + + gtk_popover_set_position(GTK_POPOVER(submenu), GTK_POS_RIGHT); + // Make top of popover be aligned with button. + gtk_widget_set_valign(GTK_WIDGET(submenu), GTK_ALIGN_START); + + self->submenu = GTK_WIDGET(submenu); + gtk_widget_set_parent(GTK_WIDGET(submenu), GTK_WIDGET(self)); +} + +/* + * Create a deep copy of the menu item + */ + static GtkWidget * +vim_menu_item_copy(VimMenuItem *self) +{ + GtkWidget *copy; + + copy = vim_menu_item_new( + gtk_label_get_text(GTK_LABEL(self->label)), + self->func, self->func_udata); + + if (self->submenu != NULL) + vim_menu_item_set_submenu(VIM_MENU_ITEM(copy), + VIM_MENU(vim_menu_copy(VIM_MENU(self->submenu)))); + else if (self->aux_widget != NULL) + vim_menu_item_set_accel(VIM_MENU_ITEM(copy), + gtk_label_get_text(GTK_LABEL(self->aux_widget))); + return copy; +} + +/* + * Similar to GtkPopoverMenu, except uses GtkWidgets directly like GTK3, instead + * of abstracting it into GMenuModel. + */ +struct _VimMenu +{ + GtkPopover parent; + + GtkWidget *box; + GtkWidget *scr; + + GList *items; + + // Currently active item showing submenu popover, or being hovered on, or + // NULL. Note that item may have submenu but not have it open, when + // navigating via keyboard. + GtkWidget *active_item; + + // Used when mouse is hovering over an item and user is navigating with + // keyboard. When the scrolled window scrolls down or up, this causes a + // mouse enter event, causing the active item to go to the item that the + // mouse is hovered on, instead of the next item (from keyboard navigation). + gboolean ignore_hover; + double prev_x; + double prev_y; +}; + +G_DEFINE_TYPE(VimMenu, vim_menu, GTK_TYPE_POPOVER) + + static void +vim_menu_dispose(GObject *object) +{ + VimMenu *self = VIM_MENU(object); + + g_clear_list(&self->items, (GDestroyNotify)gtk_widget_unparent); + g_clear_pointer(&self->scr, gtk_widget_unparent); + + G_OBJECT_CLASS(vim_menu_parent_class)->dispose(object); +} + + static void +vim_menu_class_init(VimMenuClass *class) +{ + GObjectClass *obj_class = G_OBJECT_CLASS(class); + + obj_class->dispose = vim_menu_dispose; +} + + static gboolean +vim_menu_select_active_item(VimMenu *self, gboolean open) +{ + VimMenuItem *item; + + gtk_widget_set_state_flags(self->active_item, + GTK_STATE_FLAG_SELECTED, FALSE); + + // Make sure to focus item, so that scrolled window knows what to do. + gtk_widget_grab_focus(GTK_WIDGET(self->active_item)); + + item = VIM_MENU_ITEM(self->active_item); + if (item->func != NULL) + item->func(item, VIM_MENU_ITEM_SELECTED, item->func_udata); + + if (open && VIM_MENU_ITEM(self->active_item)->submenu != NULL) + { + GtkWidget *submenu = VIM_MENU_ITEM(self->active_item)->submenu; + gtk_popover_popup(GTK_POPOVER(submenu)); + return TRUE; + } + return FALSE; +} + +/* + * Set the active item of the menu to "item". If "item" is NULL, then close any + * submenus. If "open" is FALSE, then don't open the submenu if any. + */ + static void +vim_menu_set_active_item(VimMenu *self, VimMenuItem *item, gboolean open) +{ + if (self->active_item == GTK_WIDGET(item)) + return; + + if (self->active_item != NULL) + { + if (VIM_MENU_ITEM(self->active_item)->submenu != NULL) + gtk_popover_popdown(GTK_POPOVER( + VIM_MENU_ITEM(self->active_item)->submenu + )); + gtk_widget_unset_state_flags(GTK_WIDGET(self->active_item), + GTK_STATE_FLAG_SELECTED); + } + + self->active_item = GTK_WIDGET(item); + if (item != NULL) + (void)vim_menu_select_active_item(self, open); +} + + static void +vim_menu_closed_cb(VimMenu *self, void *udata UNUSED) +{ + vim_menu_set_active_item(self, NULL, FALSE); +} + +/* + * If "dir" is negative, then move to the item previous of currently the active + * item. If "dir" is positive, then move to the next item. Return the resulting + * item or NULL if there are no suitable ones. + */ + static GtkWidget * +vim_menu_move_active_item(VimMenu *self, int dir) +{ + GtkWidget *(*func)(GtkWidget *); + GtkWidget *(*null_func)(GtkWidget *); + GtkWidget *widget = self->active_item; + + // If there is no currently active item, then just use the first one + if (widget == NULL) + { + widget = gtk_widget_get_first_child(self->box); + while (widget != NULL && !VIM_IS_MENU_ITEM(widget)) + widget = gtk_widget_get_next_sibling(widget); + return widget; + } + + // Could also just use GList functions, but this seems simpler (no + // difference anyways). + if (dir > 0) + { + func = gtk_widget_get_next_sibling; + null_func = gtk_widget_get_first_child; + } + else + { + func = gtk_widget_get_prev_sibling; + null_func = gtk_widget_get_last_child; + } + + while (TRUE) + { + widget = func(widget); + if (widget == NULL) + { + if (null_func == NULL) + break; + widget = null_func(self->box); + null_func = NULL; + if (widget == NULL) + break; + } + if (VIM_IS_MENU_ITEM(widget)) + break; + } + return widget; +} + + static void +vim_menu_reset_parent_prelight(VimMenu *self) +{ + GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(self)); + VimMenu *parent_menu; + + // gtk_widget_get_ancestor assumes the widget itself is also an ancestor, so + // we must get parent of menu first. + parent_menu = VIM_MENU(gtk_widget_get_ancestor(parent, VIM_TYPE_MENU)); + + if (parent_menu == NULL) + // TRUE for popup menus + return; + + if (parent_menu->active_item != NULL) + gtk_widget_unset_state_flags(GTK_WIDGET(parent_menu->active_item), + GTK_STATE_FLAG_PRELIGHT); +} + +/* + * Close all submenus in the menubar given a menu widget + */ + static void +vim_menu_close_all(VimMenu *self) +{ + VimMenuBar *menubar = GET_MENU_BAR(self); + + // Must check if NULL, because popup menus don't have a parent. + if (menubar != NULL) + vim_menu_bar_set_active_item(menubar, NULL, TRUE); + else + gtk_popover_popdown(GTK_POPOVER(self)); + + // Grab focus after popup menus without a menubar are closed + gtk_widget_grab_focus(gui.drawarea); +} + + static gboolean +vim_menu_key_pressed_cb( + GtkEventController *controller UNUSED, + guint keyval, + guint keycode UNUSED, + GdkModifierType state, + VimMenu *self) +{ + GtkWidget *widget; + + switch (keyval) + { + case GDK_KEY_Down: + case GDK_KEY_KP_Down: + case GDK_KEY_Up: + case GDK_KEY_KP_Up: + case GDK_KEY_Tab: + case GDK_KEY_KP_Tab: + case GDK_KEY_ISO_Left_Tab: + // Go to the previous or next item if any + widget = vim_menu_move_active_item(self, + (state & GDK_SHIFT_MASK) + || keyval == GDK_KEY_Up ? -1 : 1); + vim_menu_set_active_item(self, VIM_MENU_ITEM(widget), FALSE); + self->ignore_hover = TRUE; + return TRUE; + case GDK_KEY_Left: + // Pressing control switches menu bar item. + if (state & GDK_CONTROL_MASK) + { + VimMenuBar *menubar = GET_MENU_BAR(self); + + if (menubar != NULL) + { + widget = vim_menu_bar_move_active_item(menubar, -1); + vim_menu_bar_set_active_item(menubar, + VIM_MENU_BAR_ITEM(widget), TRUE); + } + return TRUE; + } + // Go to parent menu (if any). We can do this by just closing the + // popover. + gtk_popover_popdown(GTK_POPOVER(self)); + // For some reason when pointer is hovered over draw area, the + // active item in the parent menu will stay prelighted even when the + // active item is moved. + vim_menu_reset_parent_prelight(self); + return TRUE; + case GDK_KEY_Right: + if (state & GDK_CONTROL_MASK) + { + VimMenuBar *menubar = GET_MENU_BAR(self); + + if (menubar != NULL) + { + widget = vim_menu_bar_move_active_item(menubar, 1); + vim_menu_bar_set_active_item(menubar, + VIM_MENU_BAR_ITEM(widget), TRUE); + } + return TRUE; + } + // Open submenu if active item has one + if (self->active_item != NULL + && vim_menu_select_active_item(self, TRUE)) + { + // Select first item in opened submenu + VimMenu *submenu = VIM_MENU( + VIM_MENU_ITEM(self->active_item)->submenu + ); + + vim_menu_set_active_item(submenu, + VIM_MENU_ITEM( + gtk_widget_get_first_child(submenu->box)), + FALSE); + } + self->ignore_hover = TRUE; + return TRUE; + case GDK_KEY_Escape: + // Close all popover menus + vim_menu_close_all(self); + return TRUE; + case GDK_KEY_ISO_Enter: + case GDK_KEY_3270_Enter: + case GDK_KEY_KP_Enter: + case GDK_KEY_Return: + if (self->active_item != NULL) + g_signal_emit_by_name(self->active_item, "clicked"); + return TRUE; + default: + break; + } + return FALSE; +} + + + static void +vim_menu_motion_cb( + GtkEventController *controller UNUSED, + double x, + double y, + VimMenu *self) +{ + if (self->prev_x == -1 || self->prev_y == -1 || + (fabs(self->prev_x - x) > 0.05 && fabs(self->prev_y - y) > 0.05)) + self->ignore_hover = FALSE; + self->prev_x = x; + self->prev_y = y; +} + + static void +vim_menu_focus_cb(GtkEventController *controller UNUSED, VimMenu *self) +{ + gtk_popover_set_mnemonics_visible(GTK_POPOVER(self), TRUE); +} + + static void +vim_menu_init(VimMenu *self) +{ + GtkEventController *controller; + GtkWidget *stack; + GtkWidget *parent_box; + GListModel *controllers; + + gtk_popover_set_has_arrow(GTK_POPOVER(self), FALSE); + gtk_popover_set_autohide(GTK_POPOVER(self), TRUE); + + // Do not make child popovers close parent popovers when they are closed. + gtk_popover_set_cascade_popdown(GTK_POPOVER(self), FALSE); + + stack = gtk_stack_new(); + + // "stack" and "parent_box" have no use other than to make the css structure + // of the popup menu be exactly like GtkPopoverMenu. This is so that GTK + // themes style VimMenu exactly like GtkPopoverMenu. + parent_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_stack_add_child(GTK_STACK(stack), parent_box); + gtk_stack_set_visible_child(GTK_STACK(stack), parent_box); + + self->box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_set_hexpand(self->box, TRUE); + gtk_widget_set_vexpand(self->box, TRUE); + gtk_box_append(GTK_BOX(parent_box), self->box); + + self->scr = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(self->scr), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_propagate_natural_width( + GTK_SCROLLED_WINDOW(self->scr), TRUE); + gtk_scrolled_window_set_propagate_natural_height( + GTK_SCROLLED_WINDOW(self->scr), TRUE); + + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(self->scr), stack); + gtk_popover_set_child(GTK_POPOVER(self), self->scr); + + gtk_widget_add_css_class(GTK_WIDGET(self), "menu"); + + // Add key controller for basic movement + controller = gtk_event_controller_key_new(); + // Make sure we get the key presses first and handle them if possible + gtk_event_controller_set_propagation_phase(controller, + GTK_PHASE_CAPTURE); + g_signal_connect_object(controller, "key-pressed", + G_CALLBACK(vim_menu_key_pressed_cb), + self, G_CONNECT_DEFAULT); + gtk_widget_add_controller(GTK_WIDGET(self), controller); + + // Show mnemonic underline always + controller = gtk_event_controller_focus_new(); + g_signal_connect_object(controller, "enter", + G_CALLBACK(vim_menu_focus_cb), self, G_CONNECT_DEFAULT); + gtk_widget_add_controller(GTK_WIDGET(self), controller); + + controller = gtk_event_controller_motion_new(); + g_signal_connect_object(controller, "motion", + G_CALLBACK(vim_menu_motion_cb), self, G_CONNECT_DEFAULT); + gtk_widget_add_controller(GTK_WIDGET(self), controller); + + g_signal_connect(self, "closed", G_CALLBACK(vim_menu_closed_cb), NULL); + + // Set all shortcut controllers in the window to not require a modifier for + // mnemonics. + controllers = gtk_widget_observe_controllers(GTK_WIDGET(self)); + for (int i = 0; i < g_list_model_get_n_items(controllers); i++) + { + controller = g_list_model_get_item(controllers, i); + if (GTK_IS_SHORTCUT_CONTROLLER(controller)) + gtk_shortcut_controller_set_mnemonics_modifiers( + GTK_SHORTCUT_CONTROLLER(controller), 0); + } + g_object_unref(controllers); + + self->prev_x = self->prev_y = -1; +} + + GtkWidget * +vim_menu_new(void) +{ + return g_object_new(VIM_TYPE_MENU, NULL); +} + + static GtkWidget * +vim_menu_insert(VimMenu *self, GtkWidget *item, int idx) +{ + if (idx > 0) + { + GList *prev = g_list_nth(self->items, idx - 1); + if (prev == NULL) + gtk_box_append(GTK_BOX(self->box), item); + else + gtk_box_insert_child_after(GTK_BOX(self->box), item, + prev->data); + } + else if (idx == 0) + gtk_box_prepend(GTK_BOX(self->box), item); + else + gtk_box_append(GTK_BOX(self->box), item); + + self->items = g_list_insert(self->items, item, idx); + return item; +} + + static void +vim_menu_item_clicked_cb(VimMenuItem *self, VimMenu *menu) +{ + // Only close all menus if item is a regular button (no submenu). If item + // has a submenu, then just toggle it on and off. + if (self->submenu != NULL) + { + if (gtk_widget_is_visible(self->submenu)) + gtk_popover_popdown(GTK_POPOVER(self->submenu)); + else + gtk_popover_popup(GTK_POPOVER(self->submenu)); + return; + } + + // Since we set the "cascade-popdown" property to FALSE, we must popdown the + // toplevel menu/popover, so that all submenus are closed. + vim_menu_close_all(menu); + if (self->func != NULL) + self->func(self, VIM_MENU_ITEM_CLICKED, self->func_udata); +} + + static void +vim_menu_item_enter_cb( + GtkEventController *controller, + double x UNUSED, + double y UNUSED, + VimMenu *menu) +{ + VimMenuItem *self; + + if (menu->ignore_hover || !gtk_event_controller_motion_contains_pointer( + GTK_EVENT_CONTROLLER_MOTION(controller))) + return; + + self = VIM_MENU_ITEM(gtk_event_controller_get_widget(controller)); + vim_menu_set_active_item(menu, self, TRUE); +} + + static void +vim_menu_item_leave_cb(GtkEventController *controller, VimMenu *menu) +{ + VimMenuItem *self; + + if (gtk_event_controller_motion_contains_pointer( + GTK_EVENT_CONTROLLER_MOTION(controller))) + return; + + self = VIM_MENU_ITEM(gtk_event_controller_get_widget(controller)); + if (menu->active_item == GTK_WIDGET(self)) + vim_menu_set_active_item(menu, NULL, FALSE); +} + +/* + * Insert the menu item at the given index in the menu. If "idx" is negative, + * then append the menu item. + */ + void +vim_menu_insert_item(VimMenu *self, VimMenuItem *item, int idx) +{ + GtkEventController *controller; + + vim_menu_insert(self, GTK_WIDGET(item), idx); + + controller = gtk_event_controller_motion_new(); + g_signal_connect_object(controller, "enter", + G_CALLBACK(vim_menu_item_enter_cb), self, G_CONNECT_DEFAULT); + g_signal_connect_object(controller, "leave", + G_CALLBACK(vim_menu_item_leave_cb), self, G_CONNECT_DEFAULT); + gtk_widget_add_controller(GTK_WIDGET(item), controller); + + g_signal_connect_object(item, "clicked", + G_CALLBACK(vim_menu_item_clicked_cb), + self, G_CONNECT_DEFAULT); +} + +/* + * Insert a separator at the given position and return it. + */ + GtkWidget * +vim_menu_insert_separator(VimMenu *self, int idx) +{ + return vim_menu_insert(self, + gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), idx); +} + +/* + * Remove the menu item or separator from the menu + */ + void +vim_menu_remove(VimMenu *self, GtkWidget *item) +{ + self->items = g_list_remove(self->items, item); + gtk_box_remove(GTK_BOX(self->box), item); +} + +/* + * Create a deep copy of the menu + */ + GtkWidget * +vim_menu_copy(VimMenu *self) +{ + GtkWidget *copy = vim_menu_new(); + int i = 0; + + for (GList *l = self->items; l != NULL; l = l->next, i++) + { + VimMenuItem *item; + GtkWidget *item_copy; + + if (!VIM_IS_MENU_ITEM(l->data)) + { + assert(GTK_IS_SEPARATOR(l->data)); + vim_menu_insert_separator(VIM_MENU(copy), i); + continue; + } + + item = l->data; + item_copy = vim_menu_item_copy(item); + + vim_menu_insert_item(VIM_MENU(copy), VIM_MENU_ITEM(item_copy), i); + } + return copy; +} + +#endif // FEAT_MENU diff --git a/src/gui_gtk4_menu.h b/src/gui_gtk4_menu.h new file mode 100644 index 0000000000..f6965e6dc0 --- /dev/null +++ b/src/gui_gtk4_menu.h @@ -0,0 +1,61 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#ifndef GUI_GTK4_MENU_H +#define GUI_GTK4_MENU_H + +#include "vim.h" + +#ifdef FEAT_MENU + +# include + +# define VIM_TYPE_MENU_BAR_ITEM (vim_menu_bar_item_get_type()) +G_DECLARE_FINAL_TYPE(VimMenuBarItem, vim_menu_bar_item, VIM, MENU_BAR_ITEM, GtkButton) + +# define VIM_TYPE_MENU_BAR (vim_menu_bar_get_type()) +G_DECLARE_FINAL_TYPE(VimMenuBar, vim_menu_bar, VIM, MENU_BAR, GtkWidget) + +# define VIM_TYPE_MENU_ITEM (vim_menu_item_get_type()) +G_DECLARE_FINAL_TYPE(VimMenuItem, vim_menu_item, VIM, MENU_ITEM, GtkButton) + +# define VIM_TYPE_MENU (vim_menu_get_type()) +G_DECLARE_FINAL_TYPE(VimMenu, vim_menu, VIM, MENU, GtkPopover) + +typedef enum +{ + VIM_MENU_ITEM_CLICKED, + VIM_MENU_ITEM_SELECTED +} VimMenuItemEvent; + +typedef void (*VimMenuItemFunc)(VimMenuItem *item, VimMenuItemEvent event, void *udata); + +GtkWidget *vim_menu_bar_item_new(const char *text, VimMenu *menu); +void vim_menu_bar_item_set_text(VimMenuBarItem *self, const char *text); + +GtkWidget *vim_menu_bar_new(void); +GtkWidget *vim_menu_bar_to_menu(VimMenuBar *self); +void vim_menu_bar_insert_item(VimMenuBar *self, VimMenuBarItem *item, int idx); +void vim_menu_bar_remove(VimMenuBar *self, GtkWidget *item); +void vim_menu_bar_show(VimMenuBar *self, VimMenuBarItem *item); + +GtkWidget *vim_menu_item_new(const char *text, VimMenuItemFunc func, void *udata); +void vim_menu_item_set_text(VimMenuItem *self, const char *text); +void vim_menu_item_set_accel(VimMenuItem *self, const char *accel_text); +void vim_menu_item_set_submenu(VimMenuItem *self, VimMenu *submenu); + +GtkWidget *vim_menu_new(void); +void vim_menu_insert_item(VimMenu *self, VimMenuItem *item, int idx); +GtkWidget *vim_menu_insert_separator(VimMenu *self, int idx); +void vim_menu_remove(VimMenu *self, GtkWidget *item); +GtkWidget *vim_menu_copy(VimMenu *self); + +#endif + +#endif diff --git a/src/gui_gtk4_tb.c b/src/gui_gtk4_tb.c index 79682cfb13..1971a4728e 100644 --- a/src/gui_gtk4_tb.c +++ b/src/gui_gtk4_tb.c @@ -92,6 +92,8 @@ vim_toolbar_init(VimToolbar *self) self->overflow_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); gtk_popover_set_child(GTK_POPOVER(popover), self->overflow_box); gtk_popover_set_has_arrow(GTK_POPOVER(popover), FALSE); + // Make sure popover aligns to top right of button + gtk_widget_set_halign(popover, GTK_ALIGN_END); gtk_menu_button_set_popover(GTK_MENU_BUTTON(self->overflow_btn), popover); } diff --git a/src/menu.c b/src/menu.c index 5fd83d80b5..861d787112 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1074,10 +1074,6 @@ free_menu(vimmenu_T **menup) // Also may rebuild a tearoff'ed menu if (gui.in_use) gui_mch_destroy_menu(menu); -# ifdef USE_GTK4 - // GTK4 uses "menu->label" for action name - vim_free((char_u *)menu->label); -# endif #endif // Don't change *menup until after calling gui_mch_destroy_menu(). The diff --git a/src/structs.h b/src/structs.h index 70010567d2..b112c6d182 100644 --- a/src/structs.h +++ b/src/structs.h @@ -4733,7 +4733,9 @@ struct VimMenu # if defined(GTK_CHECK_VERSION) && !GTK_CHECK_VERSION(3,4,0) GtkWidget *tearoff_handle; # endif +# ifndef USE_GTK4 GtkWidget *label; // Used by "set wak=" code. +# endif # endif # ifdef FEAT_GUI_MOTIF int sensitive; // turn button on/off diff --git a/src/version.c b/src/version.c index 7fd7b6b801..8d517c22f8 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 719, /**/ 718, /**/ From 03a8a13e93d6c2a96c74bb634289de79ee7e97d3 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 24 Jun 2026 18:29:23 +0000 Subject: [PATCH 028/647] patch 9.2.0720: GTK4: no support for browsefilter Problem: GTK4: no support for browsefilter Solution: Add browsefilter support (Foxe Chen) closes: #20612 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk.c | 43 ++++++++++++++++++++----------------- src/gui_gtk4.c | 58 +++++++++++++++++++++++++++++++++++++++++++++----- src/version.c | 2 ++ 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/gui_gtk.c b/src/gui_gtk.c index 84eae6d41b..13eaf70a73 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -1270,32 +1270,35 @@ gui_mch_browse(int saving, gfilter = gtk_file_filter_new(); patt = alloc(STRLEN(filter)); - while (p != NULL && *p != NUL) + if (patt != NULL) { - if (*p == '\n' || *p == ';' || *p == '\t') + while (p != NULL && *p != NUL) { - STRNCPY(patt, filter, i); - patt[i] = '\0'; - if (*p == '\t') - gtk_file_filter_set_name(gfilter, (gchar *)patt); - else + if (*p == '\n' || *p == ';' || *p == '\t') { - gtk_file_filter_add_pattern(gfilter, (gchar *)patt); - if (*p == '\n') + STRNCPY(patt, filter, i); + patt[i] = '\0'; + if (*p == '\t') + gtk_file_filter_set_name(gfilter, (gchar *)patt); + else { - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc), - gfilter); - if (*(p + 1) != NUL) - gfilter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(gfilter, (gchar *)patt); + if (*p == '\n') + { + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc), + gfilter); + if (*(p + 1) != NUL) + gfilter = gtk_file_filter_new(); + } } + filter = ++p; + i = 0; + } + else + { + p++; + i++; } - filter = ++p; - i = 0; - } - else - { - p++; - i++; } } vim_free(patt); diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index b5f1f93b40..a193233a90 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -4805,12 +4805,13 @@ gui_mch_browse(int saving, char_u *dflt, char_u *ext UNUSED, char_u *initdir, - char_u *filter UNUSED) + char_u *filter) { - GtkFileDialog *dlg; - FileDialogData fdd; - char_u dirbuf[MAXPATHL]; - char_u *result = NULL; + GtkFileDialog *dlg; + FileDialogData fdd; + char_u dirbuf[MAXPATHL]; + char_u *result = NULL; + GListStore *filters; title = CONVERT_TO_UTF8(title); @@ -4833,6 +4834,53 @@ gui_mch_browse(int saving, g_object_unref(dir); } + // Add file filters + filters = g_list_store_new(GTK_TYPE_FILE_FILTER); + if (filter != NULL && *filter != NUL) + { + int i = 0; + char_u *patt; + char_u *p = filter; + GtkFileFilter *gfilter; + + gfilter = gtk_file_filter_new(); + patt = alloc(STRLEN(filter)); + if (patt != NULL) + { + while (p != NULL && *p != NUL) + { + if (*p == '\n' || *p == ';' || *p == '\t') + { + STRNCPY(patt, filter, i); + patt[i] = '\0'; + if (*p == '\t') + gtk_file_filter_set_name(gfilter, (gchar *)patt); + else + { + gtk_file_filter_add_pattern(gfilter, (gchar *)patt); + if (*p == '\n') + { + g_list_store_append(filters, gfilter); + g_object_unref(gfilter); + if (*(p + 1) != NUL) + gfilter = gtk_file_filter_new(); + } + } + filter = ++p; + i = 0; + } + else + { + p++; + i++; + } + } + } + vim_free(patt); + } + gtk_file_dialog_set_filters(dlg, G_LIST_MODEL(filters)); + g_object_unref(filters); + if (saving && dflt != NULL && *dflt != NUL) gtk_file_dialog_set_initial_name(dlg, (const char *)dflt); diff --git a/src/version.c b/src/version.c index 8d517c22f8..77fdc87d88 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 720, /**/ 719, /**/ From 37d9805675abc6c75fb44fabd510df5313f486b0 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 24 Jun 2026 18:40:50 +0000 Subject: [PATCH 029/647] patch 9.2.0721: serverlist() returns strings separated by \n Problem: serverlist() returns strings separated by \n (Christian J. Robinson) Solution: Return a list of server names when given the option dict argument (Foxe Chen). fixes: #20582 closes: #20601 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 18 ++++++-- runtime/doc/version9.txt | 1 + src/clientserver.c | 74 +++++++++++++++++++++++-------- src/evalfunc.c | 4 +- src/if_xcmdsrv.c | 19 ++++---- src/os_mswin.c | 18 ++++---- src/proto/if_xcmdsrv.pro | 2 +- src/proto/os_mswin.pro | 2 +- src/proto/socketserver.pro | 2 +- src/socketserver.c | 22 ++++----- src/testdir/test_clientserver.vim | 37 ++++++++++++++++ src/testdir/test_vim9_builtin.vim | 11 +++++ src/version.c | 2 + 13 files changed, 153 insertions(+), 59 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index d362273f4e..47d320a73d 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Jun 17 +*builtin.txt* For Vim version 9.2. Last change: 2026 Jun 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -9865,15 +9865,25 @@ server2client({clientid}, {string}) *server2client()* Return type: |Number| -serverlist() *serverlist()* +serverlist([{dict}]) *serverlist()* Return a list of available server names, one per line. When there are no servers or the information is not available - an empty string is returned. See also |clientserver|. + an empty string is returned. {only available when compiled with the |+clientserver| feature} + + If {dict} is given, then it is a |Dictionary| supporting the + following options: + key type meaning ~ + list |Boolean| Return a list of strings, + where each string is a server + name. + + See also |clientserver|. + Example: > :echo serverlist() < - Return type: |String| + Return type: |String| or list setbufline({buf}, {lnum}, {text}) *setbufline()* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index a515589de5..ecde258764 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -52688,6 +52688,7 @@ Changed ~ - During |complete()|-triggered completion, CTRL-N and CTRL-P are now subject to insert-mode mappings. - It is possible to clear the alternate file register |quote#|. +- |serverlist()| can return a list of all available server names. *added-9.3* diff --git a/src/clientserver.c b/src/clientserver.c index 60849fe1e1..13f3fafcb2 100644 --- a/src/clientserver.c +++ b/src/clientserver.c @@ -598,24 +598,33 @@ cmdsrv_main( } else if (STRICMP(argv[i], "--serverlist") == 0) { + list_T *list = NULL; + garray_T ga; + # ifdef MSWIN if (clientserver_method == CLIENTSERVER_METHOD_MSWIN) // Win32 always works? - res = serverGetVimNames(); + list = serverGetVimNames(); # endif # ifdef FEAT_SOCKETSERVER if (clientserver_method == CLIENTSERVER_METHOD_SOCKET) -# ifdef MSWIN - res = vim_strsave((char_u *)""); -# else - res = socketserver_list(); -# endif + list = socketserver_list(); # endif # ifdef FEAT_X11 if (clientserver_method == CLIENTSERVER_METHOD_X11 && xterm_dpy != NULL) - res = serverGetVimNames(xterm_dpy); + list = serverGetVimNames(xterm_dpy); # endif + + ga_init2(&ga, 1, 80); + if (list != NULL) + { + list_join(&ga, list, (char_u *)"\n", TRUE, FALSE, 0); + ga_append(&ga, NUL); + list_free(list); + } + res = ga.ga_data; + if (did_emsg) mch_errmsg("\n"); } @@ -1250,32 +1259,59 @@ f_server2client(typval_T *argvars UNUSED, typval_T *rettv) void f_serverlist(typval_T *argvars UNUSED, typval_T *rettv) { - char_u *r = NULL; + list_T *list = NULL; + bool use_list = false; + + if (check_for_opt_dict_arg(argvars, 0) == FAIL) + return; + + if (argvars[0].v_type != VAR_UNKNOWN) + { + dict_T *d = argvars[0].vval.v_dict; + + use_list = dict_get_bool(d, "list", false); + } # ifdef FEAT_CLIENTSERVER # ifdef MSWIN if (clientserver_method == CLIENTSERVER_METHOD_MSWIN) - r = serverGetVimNames(); + list = serverGetVimNames(); # endif # ifdef FEAT_SOCKETSERVER if (clientserver_method == CLIENTSERVER_METHOD_SOCKET) -# ifdef MSWIN - r = vim_strsave((char_u *)""); -# else - r = socketserver_list(); -# endif + list = socketserver_list(); # endif # ifdef FEAT_X11 if (clientserver_method == CLIENTSERVER_METHOD_X11) { - make_connection(); - if (X_DISPLAY != NULL) - r = serverGetVimNames(X_DISPLAY); + make_connection(); + if (X_DISPLAY != NULL) + list = serverGetVimNames(X_DISPLAY); } # endif # endif - rettv->v_type = VAR_STRING; - rettv->vval.v_string = r; + if (use_list && list != NULL) + { + list->lv_refcount++; + rettv->v_type = VAR_LIST; + rettv->vval.v_list = list; + } + else + { + garray_T ga; + + ga_init2(&ga, 1, 80); + + if (list != NULL) + { + list_join(&ga, list, (char_u *)"\n", TRUE, FALSE, 0); + ga_append(&ga, NUL); + list_free(list); + } + + rettv->v_type = VAR_STRING; + rettv->vval.v_string = (char_u *)ga.ga_data; + } } #endif diff --git a/src/evalfunc.c b/src/evalfunc.c index 45002c5bf8..3aeda7e11b 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2815,8 +2815,8 @@ static const funcentry_T global_functions[] = ret_list_number, f_searchpos}, {"server2client", 2, 2, FEARG_1, arg2_string, ret_number_bool, f_server2client}, - {"serverlist", 0, 0, 0, NULL, - ret_string, f_serverlist}, + {"serverlist", 0, 1, 0, arg1_dict_any, + ret_any, f_serverlist}, {"setbufline", 3, 3, FEARG_3, arg3_setbufline, ret_number_bool, f_setbufline}, {"setbufvar", 3, 3, FEARG_3, arg3_buffer_string_any, diff --git a/src/if_xcmdsrv.c b/src/if_xcmdsrv.c index 43e1e34070..22423a2edf 100644 --- a/src/if_xcmdsrv.c +++ b/src/if_xcmdsrv.c @@ -629,9 +629,9 @@ ServerWait( * Fetch a list of all the Vim instance names currently registered for the * display. * - * Returns a newline separated list in allocated memory or NULL. + * Returns a list of strings or NULL on failure. */ - char_u * + list_T * serverGetVimNames(Display *dpy) { char_u *regProp; @@ -639,7 +639,7 @@ serverGetVimNames(Display *dpy) char_u *p; long_u numItems; int_u w; - garray_T ga; + list_T *list; if (registryProperty == None) { @@ -647,6 +647,10 @@ serverGetVimNames(Display *dpy) return NULL; } + list = list_alloc(); + if (list == NULL) + return NULL; + /* * Read the registry property. */ @@ -656,7 +660,6 @@ serverGetVimNames(Display *dpy) /* * Scan all of the names out of the property. */ - ga_init2(&ga, 1, 100); for (p = regProp; (long_u)(p - regProp) < numItems; p++) { entry = p; @@ -667,18 +670,14 @@ serverGetVimNames(Display *dpy) w = None; sscanf((char *)entry, "%x", &w); if (WindowValid(dpy, (Window)w)) - { - ga_concat(&ga, p + 1); - GA_CONCAT_LITERAL(&ga, "\n"); - } + list_append_string(list, p + 1, -1); while (*p != 0) p++; } } if (regProp != empty_prop) XFree(regProp); - ga_append(&ga, NUL); - return ga.ga_data; + return list; } ///////////////////////////////////////////////////////////// diff --git a/src/os_mswin.c b/src/os_mswin.c index edaa03d4f7..6831171cf7 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -2256,16 +2256,14 @@ enumWindowsGetServer(HWND hwnd, LPARAM lparam) static BOOL CALLBACK enumWindowsGetNames(HWND hwnd, LPARAM lparam) { - garray_T *ga = (garray_T *)lparam; + list_T *list = (list_T *)lparam; char server[MAX_PATH]; // Get the title of the window if (getVimServerName(hwnd, server, sizeof(server)) == 0) return TRUE; - // Add the name to the list - ga_concat(ga, (char_u *)server); - GA_CONCAT_LITERAL(ga, "\n"); + list_append_string(list, (char_u *)server, -1); return TRUE; } @@ -2371,17 +2369,17 @@ serverSetName(char_u *name) } } - char_u * + list_T * serverGetVimNames(void) { - garray_T ga; + list_T *list = list_alloc(); - ga_init2(&ga, 1, 100); + if (list == NULL) + return NULL; - enum_windows(enumWindowsGetNames, (LPARAM)(&ga)); - ga_append(&ga, NUL); + enum_windows(enumWindowsGetNames, (LPARAM)list); - return ga.ga_data; + return list; } int diff --git a/src/proto/if_xcmdsrv.pro b/src/proto/if_xcmdsrv.pro index 74245b75a2..d8ce00259b 100644 --- a/src/proto/if_xcmdsrv.pro +++ b/src/proto/if_xcmdsrv.pro @@ -2,7 +2,7 @@ int serverRegisterName(Display *dpy, char_u *name); void serverChangeRegisteredWindow(Display *dpy, Window newwin); int serverSendToVim(Display *dpy, char_u *name, char_u *cmd, char_u **result, Window *server, Bool asExpr, int timeout, Bool localLoop, int silent); -char_u *serverGetVimNames(Display *dpy); +list_T *serverGetVimNames(Display *dpy); Window serverStrToWin(char_u *str); int serverSendReply(char_u *name, char_u *str); int serverReadReply(Display *dpy, Window win, char_u **str, int localLoop, int timeout); diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro index bcb789f518..32b4aff009 100644 --- a/src/proto/os_mswin.pro +++ b/src/proto/os_mswin.pro @@ -48,7 +48,7 @@ char_u *mch_resolve_path(char_u *fname, int reparse_point); void win32_set_foreground(void); void serverInitMessaging(void); void serverSetName(char_u *name); -char_u *serverGetVimNames(void); +list_T *serverGetVimNames(void); int serverSendReply(char_u *name, char_u *reply); int serverSendToVim(char_u *name, char_u *cmd, char_u **result, void *ptarget, int asExpr, int timeout, int silent); void serverForeground(char_u *name); diff --git a/src/proto/socketserver.pro b/src/proto/socketserver.pro index 69d292c3ab..c1cb3d9a10 100644 --- a/src/proto/socketserver.pro +++ b/src/proto/socketserver.pro @@ -1,7 +1,7 @@ /* socketserver.c */ int socketserver_start(char_u *name, bool quiet); void socketserver_stop(void); -char_u *socketserver_list(void); +list_T *socketserver_list(void); int set_ref_in_socketserver_channel(int copyID); void socketserver_parse_messages(void); int socketserver_send(char_u *name, char_u *str, char_u **result, bool is_expr, int timeout, bool silent, channel_T **ch); diff --git a/src/socketserver.c b/src/socketserver.c index 48c00c3580..d109a21750 100644 --- a/src/socketserver.c +++ b/src/socketserver.c @@ -225,16 +225,21 @@ socketserver_cleanup(void) /* * List available sockets that can be connected to, only in common directories * that Vim knows about. Vim instances with custom socket paths will not be - * detected. Returns a newline separated string on success and NULL on failure. + * detected. Returns a list of strings (with reference count not set) on success + * and NULL on failure. */ - char_u * + list_T * socketserver_list(void) { + list_T *list = list_alloc(); + + if (list == NULL) + return NULL; + # ifdef MSWIN // Only support addresses on Windows - return vim_strsave((char_u *)""); + return list; # else - garray_T str; string_T buf; string_T path; DIR *dirp; @@ -255,8 +260,6 @@ socketserver_list(void) buf.length = 0; path.length = 0; - ga_init2(&str, 1, 100); - for (size_t i = 0 ; i < ARRAY_LENGTH(known_dirs); i++) { const char_u *dir = known_dirs[i]; @@ -285,9 +288,8 @@ socketserver_list(void) buf.length = vim_snprintf_safelen((char *)buf.string, MAXPATHL, "%s/%s", path.string, dp->d_name); - ga_concat_len(&str, (char_u *)dp->d_name, + list_append_string(list, (char_u *)dp->d_name, buf.length - (path.length + 1)); - ga_append(&str, '\n'); } closedir(dirp); @@ -298,9 +300,7 @@ socketserver_list(void) vim_free(path.string); vim_free(buf.string); - ga_append(&str, NUL); - - return str.ga_data; + return list; # endif } diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index 754aa77305..18877a9d8b 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -540,6 +540,43 @@ func Test_clientserver_env_method() endtry endfunc +" Test if serverlist() can return a list of strings +func Test_clientserver_serverlist_list() + CheckNotGui + + let g:test_is_flaky = 1 + let cmd = GetVimCommand() + + if cmd == '' + throw 'GetVimCommand() failed' + endif + + " Don't use channel:2000, because previous tests use that and it may take a + " while for the channel to fully close. + let actual = cmd .. ' --servername XVIMTEST' + + let job = job_start(actual, {'stoponexit': 'kill', 'out_io': 'null'}) + + call WaitForAssert({-> assert_match('XVIMTEST', serverlist())}) + + call assert_equal('list', typename(serverlist(#{list: v:true}))) + call assert_true(serverlist(#{list: v:true})->index('XVIMTEST') != -1) + + if has('win32') || has('gui_running') + call job_stop(job, 'kill') + else + call system(actual .. " --remote-expr 'execute(\"qa!\")'") + endif + try + call WaitForAssert({-> assert_equal("dead", job_status(job))}) + finally + if job_status(job) != 'dead' + call assert_report('Server did not exit') + call job_stop(job, 'kill') + endif + endtry +endfunc + " Uncomment this line to get a debugging log " call ch_logfile('channellog', 'w') diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 3f95ee8b25..9b5abba5ce 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -3600,6 +3600,17 @@ def Test_remote_startserver() v9.CheckSourceDefAndScriptFailure(['remote_startserver({})'], ['E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1']) enddef +def Test_remote_serverlist() + CheckFeature clientserver + + v9.CheckSourceDefAndScriptFailure(['serverlist("")'], ['E1013: Argument 1: type mismatch, expected dict but got string', 'E1206: Dictionary required for argument 1']) + v9.CheckSourceScriptFailure(['vim9script', 'serverlist({list: ""})'], 'E1135: Using a String as a Bool: ""') + var l: any = serverlist() + assert_equal(v:t_string, type(l)) + l = serverlist({'list': true}) + assert_equal(v:t_list, type(l)) +enddef + def Test_remove_literal_list() var l: list = [1, 2, 3, 4] assert_equal([1, 2], remove(l, 0, 1)) diff --git a/src/version.c b/src/version.c index 77fdc87d88..05a8e6cd7a 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 721, /**/ 720, /**/ From 9ed2c957fee9508c158bbc92b1404e93a2854197 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 24 Jun 2026 18:57:35 +0000 Subject: [PATCH 030/647] patch 9.2.0722: GTK4: find/replace dialog can be improved Problem: GTK4: find/replace dialog can be improved Solution: Store the action buttons in the dialog struct, update their sensitivity when the search field changes, close the dialog on Escape and set the dialog's default widget (Foxe Chen) closes: #20613 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 102 +++++++++++++++++++++++++++++++++++++++++++++---- src/version.c | 2 + 2 files changed, 97 insertions(+), 7 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index a193233a90..06efcfec15 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -5297,6 +5297,9 @@ typedef struct GtkWidget *mcase; // Match case check GtkWidget *up; // Direction up radio GtkWidget *down; // Direction down radio + GtkWidget *find; // 'Find Next' action button + GtkWidget *replace; // 'Replace With' action button + GtkWidget *all; // 'Replace All' action button } SharedFindReplace; static SharedFindReplace find_widgets = {0}; @@ -5347,6 +5350,61 @@ dialog_destroyed_cb(GtkWidget *widget UNUSED, gpointer data) *(GtkWidget **)data = NULL; } + static void +entry_changed_cb(GtkWidget *entry, GtkWidget *dialog) +{ + const gchar *entry_text; + gboolean nonempty; + + entry_text = gtk_editable_get_text(GTK_EDITABLE(entry)); + + if (!entry_text) + return; // Shouldn't happen + + nonempty = (entry_text[0] != '\0'); + + if (dialog == find_widgets.dialog) + gtk_widget_set_sensitive(find_widgets.find, nonempty); + + if (dialog == repl_widgets.dialog) + { + gtk_widget_set_sensitive(repl_widgets.find, nonempty); + gtk_widget_set_sensitive(repl_widgets.replace, nonempty); + gtk_widget_set_sensitive(repl_widgets.all, nonempty); + } +} + + static gboolean +find_key_pressed_cb( + GtkEventControllerKey *controller, + guint keyval, + guint keycode, + GdkModifierType state, + SharedFindReplace *frdp) +{ + // If the user is holding one of the key modifiers we will just bail out, + // thus preserving the possibility of normal focus traversal. + if (state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) + return FALSE; + + // the Escape key synthesizes a cancellation action + if (keyval == GDK_KEY_Escape) + { + // Destroy rather than hide the dialog: reusing a hidden toplevel loses + // window decorations on Wayland + gtk_window_destroy(GTK_WINDOW(frdp->dialog)); + return TRUE; + } + + return FALSE; +} + + static void +entry_activate_cb(GtkWidget *widget UNUSED, void *udata) +{ + gtk_widget_grab_focus(GTK_WIDGET(udata)); +} + static void find_replace_dialog_create(char_u *arg, int do_replace) { @@ -5356,6 +5414,7 @@ find_replace_dialog_create(char_u *arg, int do_replace) int mcase = !p_ic; GtkWidget *vertbox, *grid, *hbox, *tmp, *btn; gboolean sensitive; + GtkEventController *key_controller; frdp = do_replace ? &repl_widgets : &find_widgets; entry_text = get_find_dialog_text(arg, &wword, &mcase); @@ -5368,7 +5427,7 @@ find_replace_dialog_create(char_u *arg, int do_replace) } // If the dialog already exists, just raise it. - if (frdp->dialog) + if (frdp->dialog != NULL) { if (entry_text != NULL) { @@ -5380,7 +5439,15 @@ find_replace_dialog_create(char_u *arg, int do_replace) (gboolean)mcase); } gtk_window_present(GTK_WINDOW(frdp->dialog)); + + // For :promptfind dialog, always give keyboard focus to 'what' entry. + // For :promptrepl dialog, give it to 'with' entry if 'what' has a + // non-empty entry; otherwise, to 'what' entry. gtk_widget_grab_focus(frdp->what); + if (do_replace && g_utf8_strlen( + gtk_editable_get_text(GTK_EDITABLE(frdp->what)), -1) > 0) + gtk_widget_grab_focus(frdp->with); + vim_free(entry_text); return; } @@ -5392,7 +5459,7 @@ find_replace_dialog_create(char_u *arg, int do_replace) gtk_window_set_destroy_with_parent(GTK_WINDOW(frdp->dialog), TRUE); gtk_window_set_title(GTK_WINDOW(frdp->dialog), do_replace ? _("VIM - Search and Replace...") - : _("VIM - Search...")); + : _("VIM - Search...")); gtk_window_set_resizable(GTK_WINDOW(frdp->dialog), FALSE); g_signal_connect(frdp->dialog, "destroy", @@ -5433,7 +5500,17 @@ find_replace_dialog_create(char_u *arg, int do_replace) frdp->with = gtk_entry_new(); gtk_widget_set_hexpand(frdp->with, TRUE); gtk_grid_attach(GTK_GRID(grid), frdp->with, 1, 1, 1, 1); + gtk_entry_set_activates_default(GTK_ENTRY(frdp->with), TRUE); + + // Make the entry activation only change the input focus onto the + // with item. + gtk_entry_set_activates_default(GTK_ENTRY(frdp->what), FALSE); + g_signal_connect(G_OBJECT(frdp->what), "activate", + G_CALLBACK(entry_activate_cb), frdp->with); } + else + // Make the entry activation do the search. + gtk_entry_set_activates_default(GTK_ENTRY(frdp->what), TRUE); // Checkboxes hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12); @@ -5472,6 +5549,18 @@ find_replace_dialog_create(char_u *arg, int do_replace) btn = gtk_button_new_with_label(_("Find Next")); gtk_widget_set_sensitive(btn, sensitive); + frdp->find = btn; + + key_controller = gtk_event_controller_key_new(); + g_signal_connect(key_controller, "key-pressed", + G_CALLBACK(find_key_pressed_cb), frdp); + gtk_widget_add_controller(GTK_WIDGET(frdp->dialog), key_controller); + + g_signal_connect(G_OBJECT(frdp->what), "changed", + G_CALLBACK(entry_changed_cb), frdp->dialog); + + // Make it so that when entry is activated, this button will be activated. + gtk_window_set_default_widget(GTK_WINDOW(frdp->dialog), btn); g_signal_connect(btn, "clicked", G_CALLBACK(find_replace_cb), GINT_TO_POINTER(do_replace ? FRD_R_FINDNEXT : FRD_FINDNEXT)); gtk_box_append(GTK_BOX(hbox), btn); @@ -5479,13 +5568,17 @@ find_replace_dialog_create(char_u *arg, int do_replace) if (do_replace) { btn = gtk_button_new_with_label(_("Replace")); + gtk_widget_set_sensitive(btn, sensitive); g_signal_connect(btn, "clicked", G_CALLBACK(find_replace_cb), GINT_TO_POINTER(FRD_REPLACE)); + frdp->replace = btn; gtk_box_append(GTK_BOX(hbox), btn); btn = gtk_button_new_with_label(_("Replace All")); + gtk_widget_set_sensitive(btn, sensitive); g_signal_connect(btn, "clicked", G_CALLBACK(find_replace_cb), GINT_TO_POINTER(FRD_REPLACEALL)); + frdp->all = btn; gtk_box_append(GTK_BOX(hbox), btn); } @@ -5494,11 +5587,6 @@ find_replace_dialog_create(char_u *arg, int do_replace) G_CALLBACK(gtk_window_destroy), frdp->dialog); gtk_box_append(GTK_BOX(hbox), btn); - // Connect Enter key in entry to Find Next - g_signal_connect_swapped(frdp->what, "activate", - G_CALLBACK(find_replace_cb), - GINT_TO_POINTER(do_replace ? FRD_R_FINDNEXT : FRD_FINDNEXT)); - gtk_window_present(GTK_WINDOW(frdp->dialog)); gtk_widget_grab_focus(frdp->what); if (do_replace && entry_text != NULL && entry_text[0] != NUL) diff --git a/src/version.c b/src/version.c index 05a8e6cd7a..d9613a8fb9 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 722, /**/ 721, /**/ From 5fdb44c438747d419a403110f3c2dd792f539497 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 24 Jun 2026 19:35:59 +0000 Subject: [PATCH 031/647] patch 9.2.0723: term_start() does not support "noclose" Problem: term_start() does not support "noclose" Solution: Add support for "noclose" for the "term_finish" option of term_start() (Foxe Chen) closes: #20620 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/doc/tags | 1 + runtime/doc/terminal.txt | 8 +++++--- runtime/doc/version9.txt | 1 + src/job.c | 3 ++- src/testdir/test_terminal.vim | 16 ++++++++++++++++ src/version.c | 2 ++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/runtime/doc/tags b/runtime/doc/tags index 3abd3e035e..1e06d460b4 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -11012,6 +11012,7 @@ tempfile change.txt /*tempfile* template autocmd.txt /*template* tempname() builtin.txt /*tempname()* term++close terminal.txt /*term++close* +term++noclose terminal.txt /*term++noclose* term++open terminal.txt /*term++open* term++shell terminal.txt /*term++shell* term-dependent-settings term.txt /*term-dependent-settings* diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index 01fd88ca66..99d9f3a4af 100644 --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -1,4 +1,4 @@ -*terminal.txt* For Vim version 9.2. Last change: 2026 Apr 06 +*terminal.txt* For Vim version 9.2. Last change: 2026 Jun 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -232,7 +232,7 @@ Command syntax ~ keys in the terminal window. For MS-Windows see the ++eof argument below. - *term++close* *term++open* + *term++close* *term++noclose* *term++open* Supported [options] are: ++close The terminal window will close automatically when the job terminates. @@ -1001,9 +1001,11 @@ term_start({cmd} [, {options}]) *term_start()* terminal window, see |term_setkill()| "term_finish" What to do when the job is finished: "close": close any windows + "noclose": window will not be opened "open": open window if needed Note that "open" can be interruptive. - See |term++close| and |term++open|. + See |term++close|, |term++noclose| and + |term++open|. "term_opencmd" command to use for opening the window when "open" is used for "term_finish"; must have "%d" where the buffer number diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index ecde258764..310e9e695c 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -52657,6 +52657,7 @@ Other ~ not drop leading spaces |stl-%0{|. - Generated Session and View files are written in Vim9 script, see |:mksession|, |:mkview| and |:mkvimrc| +- The "term_finish" option of term_start() supports a "noclose" value. Platform specific ~ ----------------- diff --git a/src/job.c b/src/job.c index 937d55f6be..c7c546aa38 100644 --- a/src/job.c +++ b/src/job.c @@ -386,7 +386,8 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported, int supported2) if (!(supported2 & JO2_TERM_FINISH)) break; val = tv_get_string(item); - if (STRCMP(val, "open") != 0 && STRCMP(val, "close") != 0) + if (STRCMP(val, "open") != 0 && STRCMP(val, "close") != 0 + && STRCMP(val, "noclose") != 0) { semsg(_(e_invalid_value_for_argument_str_str), "term_finish", val); diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim index 98e82fcb4c..096904e111 100644 --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -774,6 +774,22 @@ func Test_terminal_finish_open_close() call assert_equal('opened the buffer in a window', g:result) unlet g:result bwipe + + " Test "noclose" for term_start() + let cmd = Get_cat_123_cmd() + + let buf = term_start(cmd, { + \ 'term_finish': 'noclose', + \ 'hidden': v:true + \ }) + + call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))}) + + let info = getbufinfo(buf)[0] + call assert_equal(1, info.hidden) + call assert_equal(1, info.listed) + call assert_equal(1, info.loaded) + call WaitForAssert({-> assert_equal(['123'], getbufline(buf, 1, 1))}) endfunc func Test_terminal_cwd() diff --git a/src/version.c b/src/version.c index d9613a8fb9..43deacfd7a 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 723, /**/ 722, /**/ From 1ccf3388dc950aab43330035d5d0daeb80536b8f Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 24 Jun 2026 19:40:51 +0000 Subject: [PATCH 032/647] patch 9.2.0724: Use-after-free when freeing exit_cb job on exit Problem: Use-after-free when freeing exit_cb job on exit Solution: Return when def_functions has been freed already (Foxe Chen) closes: #20621 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_func.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index a2faec225d..3774609c80 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -2,6 +2,7 @@ import './util/vim9.vim' as v9 source util/screendump.vim +source util/shared.vim func Test_def_basic() def SomeFunc(): string @@ -5045,4 +5046,27 @@ def Test_void_method_chain() v9.CheckScriptFailure(lines, 'E1186: Expression does not result in a value: bufload(') enddef +def Test_term_wait_in_job_exit_cb() + CheckUnix + CheckFeature terminal + + var cmd = g:GetVimCommand() + + var lines =<< eval trim END + var buf: number = term_start(["{cmd}", "+q"], {{}}) + + var job: job = term_getjob(buf) + + job_setoptions(job, {{ + exit_cb: (_, _) => {{ + term_wait(buf) + }} + }}) + END + + # This shouldn't cause an ASAN error immediately, but will result in a use + # after free when Vim exits. + v9.CheckDefSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 43deacfd7a..010537fa1e 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 724, /**/ 723, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 181df2a6fb..3b1b9e9ef8 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -5238,7 +5238,7 @@ delete_def_function_contents(dfunc_T *dfunc, int mark_deleted) void unlink_def_function(ufunc_T *ufunc) { - if (ufunc->uf_dfunc_idx <= 0) + if (ufunc->uf_dfunc_idx <= 0 || def_functions.ga_data == NULL) return; dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) From d22ff1c955ff87e8273210eae125aab0e85b6c30 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 22 Jun 2026 13:00:36 +0900 Subject: [PATCH 033/647] patch 9.2.0725: [security]: Stack out-of-bounds write in spell_soundfold_sal() Problem: [security]: A crafted spell file with non-collapsing SAL rules can make soundfold() write one byte past the end of the MAXWLEN result buffer. This is the same class of out-of-bounds write as GHSA-q8mh-6qm3-25g4 (fixed in 9.2.0698 for the SOFO branch), found while auditing the surrounding code. Solution: Bound the single-byte SAL result writes and the terminating NUL to MAXWLEN - 1, matching the SOFO branch. The single-byte branch of spell_soundfold_sal() guarded its writes with "reslen < MAXWLEN", allowing reslen to reach MAXWLEN (254). The trailing "res[reslen] = NUL" then wrote at index 254 of the 254-byte stack buffer res[MAXWLEN], an off-by-one out-of-bounds write. Input is case-folded to about 253 characters, so a 253-character argument together with a SAL map that does not collapse (collapse_result false) reaches the boundary. Related to previous issue [GHSA-q8mh-6qm3-25g4](https://github.com/vim/vim/security/advisories/GHSA-q8mh-6qm3-25g4) (9.2.0698) Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-m3hf-xcm3-xhm2 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/spell.c | 6 +++--- src/testdir/test_spellfile.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/spell.c b/src/spell.c index 96700782ef..1276604251 100644 --- a/src/spell.c +++ b/src/spell.c @@ -3513,7 +3513,7 @@ spell_soundfold_sal(slang_T *slang, char_u *inword, char_u *res) // no '<' rule used i += k - 1; z = 0; - while (*s != NUL && s[1] != NUL && reslen < MAXWLEN) + while (*s != NUL && s[1] != NUL && reslen < MAXWLEN - 1) { if (reslen == 0 || res[reslen - 1] != *s) res[reslen++] = *s; @@ -3523,7 +3523,7 @@ spell_soundfold_sal(slang_T *slang, char_u *inword, char_u *res) c = *s; if (strstr((char *)pf, "^^") != NULL) { - if (c != NUL) + if (c != NUL && reslen < MAXWLEN - 1) res[reslen++] = c; STRMOVE(word, word + i + 1); i = 0; @@ -3542,7 +3542,7 @@ spell_soundfold_sal(slang_T *slang, char_u *inword, char_u *res) if (z0 == 0) { - if (k && !p0 && reslen < MAXWLEN && c != NUL + if (k && !p0 && reslen < MAXWLEN - 1 && c != NUL && (!slang->sl_collapse || reslen == 0 || res[reslen - 1] != c)) // condense only double letters diff --git a/src/testdir/test_spellfile.vim b/src/testdir/test_spellfile.vim index 9ec728a768..951538d514 100644 --- a/src/testdir/test_spellfile.vim +++ b/src/testdir/test_spellfile.vim @@ -405,6 +405,30 @@ func Test_spellfile_format_error() let &rtp = save_rtp endfunc +" An over-length soundfold() argument must not overflow the MAXWLEN result +" buffer in the single-byte branch of spell_soundfold_sal(). +func Test_spellfile_soundfold_sal_overflow() + let save_enc = &encoding + set encoding=latin1 + " A SAL map that appends without collapsing, so the result is not shorter + " than the input. + call writefile(['SET ISO8859-1', 'SAL collapse_result false', + \ 'SAL a aaaa', 'SAL b bbbb'], 'Xsal.aff') + call writefile(['2', 'hello', 'world'], 'Xsal.dic') + mkspell! Xsal Xsal + set spl=Xsal.latin1.spl spell + + " 253 input characters hit the buffer boundary; the result must not exceed + " MAXWLEN - 1. + call assert_true(strlen(soundfold(repeat('a', 253))) <= 253) + + set nospell spl& spelllang& + call delete('Xsal.aff') + call delete('Xsal.dic') + call delete('Xsal.latin1.spl') + let &encoding = save_enc +endfunc + " Test for format errors in suggest file func Test_sugfile_format_error() let save_rtp = &rtp diff --git a/src/version.c b/src/version.c index 010537fa1e..ed23c9f597 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 725, /**/ 724, /**/ From 984f29860ed4e7259de932ca7a8027e650efae7a Mon Sep 17 00:00:00 2001 From: glepnir Date: Wed, 24 Jun 2026 20:37:21 +0000 Subject: [PATCH 034/647] patch 9.2.0726: filetype detect missing from completion Problem: ":filetype detect" is a valid command but not offered by command-line completion. Solution: Add "detect" to the completion candidates (glepnir) closes: #20625 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/cmdexpand.c | 4 ++-- src/testdir/test_cmdline.vim | 8 ++++++-- src/version.c | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 961ced5773..bedcfdf368 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -3392,9 +3392,9 @@ get_filetypecmd_arg(expand_T *xp UNUSED, int idx) if (idx < 0) return NULL; - if (filetype_expand_what == EXP_FILETYPECMD_ALL && idx < 4) + if (filetype_expand_what == EXP_FILETYPECMD_ALL && idx < 5) { - char *opts_all[] = {"indent", "plugin", "on", "off"}; + char *opts_all[] = {"detect", "indent", "plugin", "on", "off"}; return (char_u *)opts_all[idx]; } if (filetype_expand_what == EXP_FILETYPECMD_PLUGIN && idx < 3) diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index d1e20f6d29..9c34e81499 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -734,11 +734,13 @@ func Test_getcompletion() call assert_equal([], l) let l = getcompletion('', 'filetypecmd') - call assert_equal(["indent", "off", "on", "plugin"], l) + call assert_equal(["detect", "indent", "off", "on", "plugin"], l) let l = getcompletion('not', 'filetypecmd') call assert_equal([], l) let l = getcompletion('o', 'filetypecmd') call assert_equal(['off', 'on'], l) + let l = getcompletion('det', 'filetypecmd') + call assert_equal(['detect'], l) let l = getcompletion('tag', 'function') call assert_true(index(l, 'taglist(') >= 0) @@ -3635,7 +3637,9 @@ endfunc func Test_completion_filetypecmd() set wildoptions& call feedkeys(":filetype \\\"\", 'tx') - call assert_equal('"filetype indent off on plugin', @:) + call assert_equal('"filetype detect indent off on plugin', @:) + call feedkeys(":filetype det\\\"\", 'tx') + call assert_equal('"filetype detect', @:) call feedkeys(":filetype plugin \\\"\", 'tx') call assert_equal('"filetype plugin indent off on', @:) call feedkeys(":filetype indent \\\"\", 'tx') diff --git a/src/version.c b/src/version.c index ed23c9f597..fb0e9f310b 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 726, /**/ 725, /**/ From a25aaa0336b717932e44d1e6c415f468daf3d09b Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Wed, 24 Jun 2026 20:44:15 +0000 Subject: [PATCH 035/647] patch 9.2.0727: popup images not rendered correctly when unfocused Problem: popup images not rendered correctly when unfocused Solution: Avoid refreshing on update_cursor() calls, silence GTK2 deprecation warnings (Christoffer Aasted) closes: #20610 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui.c | 10 ---------- src/gui.h | 3 +++ src/popupwin.c | 42 +++++++++++++++++++++++++++++++++++++++++- src/version.c | 2 ++ 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/gui.c b/src/gui.c index 0ca09d8eb1..6e898f1c38 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1355,11 +1355,6 @@ gui_update_cursor( if (!gui.in_focus) { gui_mch_draw_hollow_cursor(cbg); -#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) -# if !GTK_CHECK_VERSION(4,0,0) - update_popup_images(); -# endif -#endif return; } @@ -1428,11 +1423,6 @@ gui_update_cursor( #endif } gui.highlight_mask = old_hl_mask; -#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) -# if !GTK_CHECK_VERSION(4,0,0) - update_popup_images(); -# endif -#endif } #if defined(FEAT_MENU) diff --git a/src/gui.h b/src/gui.h index 78ad3a09bb..56e86d7a7f 100644 --- a/src/gui.h +++ b/src/gui.h @@ -28,6 +28,9 @@ typedef GdkEvent GdkEventKey; // GTK4: GdkEventKey merged into GdkEvent # endif # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wstrict-prototypes" +# if !defined(USE_GTK3) && !defined(USE_GTK4) +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +# endif # include # pragma GCC diagnostic pop #endif diff --git a/src/popupwin.c b/src/popupwin.c index d3d27a2e17..a497ea58ca 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -120,6 +120,11 @@ static void redraw_overlapped_opacity_popups(int winrow, int wincol, #ifdef FEAT_IMAGE_KITTY static void popup_image_clear_kitty(win_T *wp); #endif +#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) +# if !GTK_CHECK_VERSION(4,0,0) +static void popup_image_clear_cairo(win_T *wp); +# endif +#endif #ifdef FEAT_IMAGE static bool popup_image_composites_frames(void); #endif @@ -4293,7 +4298,15 @@ popup_hide(win_T *wp) // rendered until they are removed. gui_gtk4_remove_image(wp); #endif + wp->w_popup_flags |= POPF_HIDDEN; + +#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) +# if !GTK_CHECK_VERSION(4,0,0) + popup_image_clear_cairo(wp); +# endif +#endif + // Do not decrement b_nwindows, we still reference the buffer. if (wp->w_winrow + popup_height(wp) >= cmdline_row) clear_cmdline = TRUE; @@ -4496,6 +4509,11 @@ popup_free(win_T *wp) #ifdef FEAT_IMAGE_GDK if (gui.in_use) gui_gtk4_remove_image(wp); +#endif +#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) +# if !GTK_CHECK_VERSION(4,0,0) + popup_image_clear_cairo(wp); +# endif #endif sign_undefine_by_name(popup_get_sign_name(wp), FALSE); wp->w_buffer->b_locked = FALSE; @@ -7100,6 +7118,28 @@ popup_image_clear_kitty(win_T *wp) } # endif +# if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) +# if !GTK_CHECK_VERSION(4,0,0) + static void +popup_image_clear_cairo(win_T *wp) +{ + if (!gui.in_use + || wp->w_popup_image_emit_cells_w <= 0 + || wp->w_popup_image_emit_cells_h <= 0) + return; + + gui_redraw_block(wp->w_popup_image_emit_row, + wp->w_popup_image_emit_col, + wp->w_popup_image_emit_row + wp->w_popup_image_emit_cells_h - 1, + wp->w_popup_image_emit_col + wp->w_popup_image_emit_cells_w - 1, + GUI_MON_NOCLEAR); + + wp->w_popup_image_emit_cells_w = 0; + wp->w_popup_image_emit_cells_h = 0; +} +# endif +# endif + # if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) /* * Called after the terminal screen has been cleared: kitty deletes @@ -7148,7 +7188,7 @@ update_popup_images(void) } # endif -# ifdef FEAT_IMAGE_GDI +# if defined(FEAT_IMAGE_GDI) || defined(FEAT_IMAGE_CAIRO) static void popup_maybe_emit_image_rect( win_T *wp, diff --git a/src/version.c b/src/version.c index fb0e9f310b..99f4351a60 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 727, /**/ 726, /**/ From c30ee2efa905473e54b095b8467af986b033296b Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 26 Jun 2026 19:03:59 +0000 Subject: [PATCH 036/647] patch 9.2.0728: filetype: supertux info pattern is relative to current dir Problem: filetype: supertux info pattern is relative to current directory (after 9.2.0716). Solution: Add `*/` to the start of the pattern (zeertzjq) closes: #20629 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- runtime/filetype.vim | 2 +- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/runtime/filetype.vim b/runtime/filetype.vim index efcea55e30..7a39bdd8bf 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1062,7 +1062,7 @@ au BufNewFile,BufRead .zshrc,.zshenv,.zlogin,.zlogout,.zcompdump,.zsh_history se au BufNewFile,BufRead *.zsh,*.zsh-theme,*.zunit setf zsh " Scheme, Supertux configuration, Lips.js history, Guile init file ("racket" patterns are now separate, see above) -au BufNewFile,BufRead *.scm,*.ss,*.sld,*.stwm,*.stl,*.stxt,*.sprite,*.strf,*.satc,*.stcd,*.stf,*.stcp,*.music,*.stsg,*/supertux2/config,supertux2/*/info,.lips_repl_history,.guile setf scheme +au BufNewFile,BufRead *.scm,*.ss,*.sld,*.stwm,*.stl,*.stxt,*.sprite,*.strf,*.satc,*.stcd,*.stf,*.stcp,*.music,*.stsg,*/supertux2/config,*/supertux2/*/info,.lips_repl_history,.guile setf scheme " SiSU au BufNewFile,BufRead *.sst.meta,*.-sst.meta,*._sst.meta setf sisu diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 7924789e28..10a1d07d28 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -729,7 +729,7 @@ def s:GetFilenameChecks(): dict> sass: ['file.sass'], sbt: ['file.sbt'], scala: ['file.scala', 'file.mill'], - scheme: ['file.scm', 'file.ss', 'file.sld', 'file.stwm', 'file.stl', 'file.stxt', 'file.sprite', 'file.strf', 'file.satc', 'file.stcd', 'file.stf', 'file.stcp', 'file.music', 'file.stsg', 'any/local/share/supertux2/config', 'supertux2/levels/world1/info', '.lips_repl_history', '.guile'], + scheme: ['file.scm', 'file.ss', 'file.sld', 'file.stwm', 'file.stl', 'file.stxt', 'file.sprite', 'file.strf', 'file.satc', 'file.stcd', 'file.stf', 'file.stcp', 'file.music', 'file.stsg', 'any/local/share/supertux2/config', 'any/supertux2/levels/world1/info', '.lips_repl_history', '.guile'], scilab: ['file.sci', 'file.sce'], screen: ['.screenrc', 'screenrc'], scss: ['file.scss'], diff --git a/src/version.c b/src/version.c index 99f4351a60..7673cd9798 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 728, /**/ 727, /**/ From 26dfed583f662c6f40a1ffdbfeb3b1b50189ad93 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Fri, 26 Jun 2026 19:16:25 +0000 Subject: [PATCH 037/647] runtime(doc): Add installer updates to version9.txt The NSIS installer has been reworked in https://github.com/vim/vim-win32-installer/pull/457. Add the updates to version9.txt. closes: #20630 Signed-off-by: K.Takata Signed-off-by: Christian Brabandt --- runtime/doc/version9.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 310e9e695c..dc4f28d91c 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Jun 18 +*version9.txt* For Vim version 9.2. Last change: 2026 Jun 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52664,6 +52664,13 @@ Platform specific ~ - support OpenType font features in 'guifont' for DirectWrite (Win32) - Include strptime() fallback for MS-Windows - Hardware-accelerated rendering for the GTK4 GUI via |gtk4-hwaccel|. +- The NSIS installer has been reworked (Win32): + - Support per-user and per-machine install. + - Change the install directory structure. + - Replace the batch files with the Vim launchers. + - Support adding the Vim directory to PATH. + - Support selecting install components from the command line options. + - Move the source code to the vim/vim-win32-installer repository. xxd ~ --- From c44a6561cc886d1518f02ca7dffdae270e2aec00 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 26 Jun 2026 19:46:11 +0000 Subject: [PATCH 038/647] patch 9.2.0729: % skips parens on continued quoted lines Problem: The "%" command and bracket/text-object motions can skip the matching paren or bracket on a line with quotes and a trailing backslash. Solution: Use the quote state at the search start when an odd-quote line is continued with a backslash, instead of always treating the search as starting in quotes (Barrett Ruth). closes: #20631 Signed-off-by: Barrett Ruth Signed-off-by: Christian Brabandt --- src/search.c | 6 +++--- src/testdir/test_search.vim | 13 +++++++++++++ src/testdir/test_textobjects.vim | 10 ++++++++++ src/version.c | 2 ++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/search.c b/src/search.c index 77f945ddf8..7db964f22b 100644 --- a/src/search.c +++ b/src/search.c @@ -2664,9 +2664,9 @@ findmatchlimit( do_quotes = 1; if (start_in_quotes == MAYBE) { - // Do we need to use at_start here? - inquote = TRUE; - start_in_quotes = TRUE; + inquote = at_start; + if (inquote) + start_in_quotes = TRUE; } else if (backwards) inquote = TRUE; diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index c4178fdece..be0a460b71 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -2166,6 +2166,19 @@ func Test_search_match_paren() normal [( call assert_equal([1, 4], [line('.'), col('.')]) + call setline(1, ['x" (a "b" )\', '")']) + call cursor(1, 4) + normal % + call assert_equal([1, 11], [line('.'), col('.')]) + normal % + call assert_equal([1, 4], [line('.'), col('.')]) + call cursor(1, 10) + normal [( + call assert_equal([1, 4], [line('.'), col('.')]) + call cursor(1, 4) + normal ]) + call assert_equal([1, 11], [line('.'), col('.')]) + " matching parenthesis in 'virtualedit' mode with cursor after the eol call setline(1, 'abc(defgh)') set virtualedit=all diff --git a/src/testdir/test_textobjects.vim b/src/testdir/test_textobjects.vim index 320cd169b6..a336dc0cf8 100644 --- a/src/testdir/test_textobjects.vim +++ b/src/testdir/test_textobjects.vim @@ -648,6 +648,16 @@ func Test_textobj_find_paren_forward() normal 0di) call assert_equal('foo ()', getline(1)) + call setline(1, ['x" (a "b" )\', '")']) + call cursor(1, 6) + normal va)y + call assert_equal('(a "b" )', @") + + call setline(1, ['x" [a "b" ]\', '"]']) + call cursor(1, 6) + normal va]y + call assert_equal('[a "b" ]', @") + bw! endfunc diff --git a/src/version.c b/src/version.c index 7673cd9798..3ebb3b8d2e 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 729, /**/ 728, /**/ From 83581d7b383dfdd65368d2d20715d34ceeb29b63 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Fri, 26 Jun 2026 20:06:25 +0000 Subject: [PATCH 039/647] patch 9.2.0730: GTK4 GUI tabline is not updated Problem: GTK4 GUI tabline is not updated Solution: Call gui_mch_update() in gui_mch_show_tabline(), matching the GTK3 GUI (Foxe Chen). related: #20633 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 6 ++++-- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 06efcfec15..e96801eb45 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -2825,8 +2825,10 @@ gui_mch_draw_menubar(void) void gui_mch_show_tabline(int showit) { - if (gui.tabline != NULL) - gtk_widget_set_visible(gui.tabline, showit); + if (gui.tabline == NULL) + return; + gtk_widget_set_visible(gui.tabline, showit); + gui_mch_update(); } int diff --git a/src/version.c b/src/version.c index 3ebb3b8d2e..782667cc23 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 730, /**/ 729, /**/ From add09091a25603ec536a95c9ba7375e862bb1405 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Fri, 26 Jun 2026 20:09:48 +0000 Subject: [PATCH 040/647] patch 9.2.0731: GTK4 GUI scrollbar size not updated when restoring a session Problem: GTK4 GUI scrollbar size not updated when restoring a session Solution: In vim_form_move_resize() queue a resize for a hidden widget (Foxe Chen). closes: #20633 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4_f.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/gui_gtk4_f.c b/src/gui_gtk4_f.c index 29c17aa6d5..56949d9971 100644 --- a/src/gui_gtk4_f.c +++ b/src/gui_gtk4_f.c @@ -174,6 +174,8 @@ vim_form_move_resize( gint h) { gtk_widget_set_size_request(widget, w, h); + if (!gtk_widget_get_visible(widget)) + gtk_widget_queue_resize(widget); vim_form_move(self, widget, x, y); } diff --git a/src/version.c b/src/version.c index 782667cc23..362b50a9d7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 731, /**/ 730, /**/ From 2913a6900242141446b6f539abfd39f6ea92ee2b Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Fri, 26 Jun 2026 20:12:56 +0000 Subject: [PATCH 041/647] patch 9.2.0732: session: terminal restored using absolute columns/rows Problem: session: terminal restored using absolute columns/row values Solution: Implement proportional scaling using the new rows and column values (Foxe Chen). closes: #20627 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/terminal.c | 9 ++++++--- src/testdir/test_mksession.vim | 20 ++++++++++---------- src/version.c | 2 ++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/terminal.c b/src/terminal.c index 3a8f6cc677..5ec9b71a65 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1116,11 +1116,14 @@ term_write_session(FILE *fd, win_T *wp, hashtab_T *terminal_bufs) // Create the terminal and run the command. This is not without // risk, but let's assume the user only creates a session when this // will be OK. - if (fprintf(fd, "terminal ++curwin ++cols=%d ++rows=%d ", - term->tl_cols, term->tl_rows) < 0) + if (fprintf(fd, "exe ':terminal ++curwin" + " ++cols=' .. ((&columns * %d + %ld) / %ld)" + " .. ' ++rows=' .. ((&lines * %d + %ld) / %ld) ", + term->tl_cols, Columns / 2, Columns, + term->tl_rows, Rows / 2, Rows) < 0) return FAIL; # ifdef MSWIN - if (fprintf(fd, "++type=%s ", term->tl_job->jv_tty_type) < 0) + if (fprintf(fd, ".. ' ++type=%s' ", term->tl_job->jv_tty_type) < 0) return FAIL; # endif if (term->tl_command != NULL && fputs((char *)term->tl_command, fd) < 0) diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 0bccad1c66..b63f0edfc8 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -466,13 +466,13 @@ func Test_mksession_terminal_shell() let lines = readfile('Xtest_mks.out') let term_cmd = '' for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' let term_cmd = line elseif line =~ 'badd.*' . &shell call assert_report('unexpected shell line: ' . line) endif endfor - call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+\s*.*$', term_cmd) + call assert_match('exe '':terminal ++curwin ++cols='' \.\. ((&columns \* \d\+ + \d\+) \/ \d\+) \.\. '' ++rows='' \.\. ((&lines \* \d\+ + \d\+) \/ \d\+)\s.*$', term_cmd) call StopShellInTerminal(bufnr('%')) call delete('Xtest_mks.out') @@ -486,7 +486,7 @@ func Test_mksession_terminal_no_restore_cmdarg() let lines = readfile('Xtest_mks.out') let term_cmd = '' for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' call assert_report('session must not restore terminal') endif endfor @@ -503,7 +503,7 @@ func Test_mksession_terminal_no_restore_funcarg() let lines = readfile('Xtest_mks.out') let term_cmd = '' for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' call assert_report('session must not restore terminal') endif endfor @@ -521,7 +521,7 @@ func Test_mksession_terminal_no_restore_func() let lines = readfile('Xtest_mks.out') let term_cmd = '' for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' call assert_report('session must not restore terminal') endif endfor @@ -539,7 +539,7 @@ func Test_mksession_terminal_no_ssop() let lines = readfile('Xtest_mks.out') let term_cmd = '' for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' call assert_report('session must not restore terminal') endif endfor @@ -559,11 +559,11 @@ func Test_mksession_terminal_restore_other() let lines = readfile('Xtest_mks.out') let term_cmd = '' for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' let term_cmd = line endif endfor - call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+.*other', term_cmd) + call assert_match('exe '':terminal ++curwin ++cols='' \.\. ((&columns \* \d\+ + \d\+) \/ \d\+) \.\. '' ++rows='' \.\. ((&lines \* \d\+ + \d\+) \/ \d\+).*other', term_cmd) call StopShellInTerminal(bufnr('%')) call delete('Xtest_mks.out') @@ -584,9 +584,9 @@ func Test_mksession_terminal_shared_windows() let found_var = 0 for line in lines - if line =~ '^terminal' + if line =~ '^exe '':terminal' let found_creation = 1 - call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+', line) + call assert_match('exe '':terminal ++curwin ++cols='' \.\. ((&columns \* \d\+ + \d\+) \/ \d\+) \.\. '' ++rows='' \.\. ((&lines \* \d\+ + \d\+) \/ \d\+)', line) elseif line =~ $"^var term_buf_{term_buf}: number = bufnr()$" let found_var = 1 elseif line =~ "^execute 'buffer ' . term_buf_" . term_buf . "$" diff --git a/src/version.c b/src/version.c index 362b50a9d7..03be3800d5 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 732, /**/ 731, /**/ From b57390fee781a4872e70f2441709de80fb7ba8fd Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 26 Jun 2026 20:19:50 +0000 Subject: [PATCH 042/647] patch 9.2.0733: GTK3: GUI slow on X11 since dropping the alpha channel Problem: With the GTK3 GUI, scrolling and moving the window are slow on X11 on setups where the accelerated drawing path expects an ARGB surface (after v9.2.0646) Solution: Choose the offscreen surface content per display backend: keep the alpha-less surface on Wayland, where it avoids needless alpha compositing, and use an ARGB surface on X11 again, which is the accelerated path there, restoring the speed (Hirohito Higashi). fixes: #20603 closes: #20634 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 17 ++++++++++++++--- src/version.c | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index bf16d3e07f..d28ccde863 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -801,6 +801,17 @@ draw_event(GtkWidget *widget UNUSED, return FALSE; } +/* + * On Wayland an alpha-less surface avoids needless alpha compositing; on X11 + * the ARGB (Render) path is the accelerated one, so keep the alpha there. + */ +# ifdef GDK_WINDOWING_WAYLAND +# define GUI_GTK_SURFACE_CONTENT \ + (gui.is_wayland ? CAIRO_CONTENT_COLOR : CAIRO_CONTENT_COLOR_ALPHA) +# else +# define GUI_GTK_SURFACE_CONTENT CAIRO_CONTENT_COLOR_ALPHA +# endif + # if GTK_CHECK_VERSION(3,10,0) static gboolean scale_factor_event(GtkWidget *widget, @@ -814,7 +825,7 @@ scale_factor_event(GtkWidget *widget, gtk_window_get_size(GTK_WINDOW(gui.mainwin), &w, &h); gui.surface = gdk_window_create_similar_surface( gtk_widget_get_window(widget), - CAIRO_CONTENT_COLOR, + GUI_GTK_SURFACE_CONTENT, w, h); int usable_height = h; @@ -2900,7 +2911,7 @@ drawarea_realize_cb(GtkWidget *widget, gpointer data UNUSED) #if GTK_CHECK_VERSION(3,0,0) gui.surface = gdk_window_create_similar_surface( gtk_widget_get_window(widget), - CAIRO_CONTENT_COLOR, + GUI_GTK_SURFACE_CONTENT, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget)); #else @@ -3035,7 +3046,7 @@ drawarea_configure_event_cb(GtkWidget *widget, gui.surface = gdk_window_create_similar_surface( gtk_widget_get_window(widget), - CAIRO_CONTENT_COLOR, + GUI_GTK_SURFACE_CONTENT, event->width, event->height); gtk_widget_queue_draw(widget); diff --git a/src/version.c b/src/version.c index 03be3800d5..742ff9a216 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 733, /**/ 732, /**/ From 91023adc67e13158ae1462485a400de787f7aefe Mon Sep 17 00:00:00 2001 From: Mateo Gjika <104777599+mateoxh@users.noreply.github.com> Date: Fri, 26 Jun 2026 20:29:50 +0000 Subject: [PATCH 043/647] runtime(cabal): Update compiler, ftplugin, syntax, add indent script closes: #20623 Signed-off-by: Mateo Gjika <104777599+mateoxh@users.noreply.github.com> Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/compiler/cabal.vim | 3 +- runtime/ftplugin/cabal.vim | 10 ++-- runtime/indent/cabal.vim | 100 +++++++++++++++++++++++++++++++++++++ runtime/syntax/cabal.vim | 3 +- 5 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 runtime/indent/cabal.vim diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 10f8ecbac3..f2200c4ac6 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -370,6 +370,7 @@ runtime/indent/basic.vim @dkearns runtime/indent/beancount.vim @nathangrigg runtime/indent/bpftrace.vim @sgruszka runtime/indent/bst.vim @tpope +runtime/indent/cabal.vim @mateoxh runtime/indent/cdl.vim @dkearns runtime/indent/chatito.vim @ObserverOfTime runtime/indent/clojure.vim @axvr diff --git a/runtime/compiler/cabal.vim b/runtime/compiler/cabal.vim index 02d4d9b8e1..3590e93e31 100644 --- a/runtime/compiler/cabal.vim +++ b/runtime/compiler/cabal.vim @@ -33,7 +33,8 @@ CompilerSet errorformat= \%E%f:%l:%c:\ %trror:%m, \%E%f:%l:%c:\ %trror:, \%Z\ %\\+\|%.%#, - \%C%m + \%C%m, + \%-G%.%# let &cpo = s:save_cpo unlet s:save_cpo diff --git a/runtime/ftplugin/cabal.vim b/runtime/ftplugin/cabal.vim index e7e4ab18a9..91b9298930 100644 --- a/runtime/ftplugin/cabal.vim +++ b/runtime/ftplugin/cabal.vim @@ -3,16 +3,16 @@ " Maintainer: Riley Bruins " Last Change: 2024 Jul 06 " 2026 Jan 13 by Vim project: set compiler #19152 +" 2026 Jun 26 by Vim project: set expandtab #20623 if exists('b:did_ftplugin') finish endif let b:did_ftplugin = 1 -compiler cabal - -let b:undo_ftplugin = 'compiler make' +setlocal expandtab +setlocal comments=:-- commentstring=--\ %s -setl comments=:-- commentstring=--\ %s +compiler cabal -let b:undo_ftplugin .= '| setl com< cms<' +let b:undo_ftplugin = 'compiler make | setlocal com< cms< et<' diff --git a/runtime/indent/cabal.vim b/runtime/indent/cabal.vim new file mode 100644 index 0000000000..3faaa6def8 --- /dev/null +++ b/runtime/indent/cabal.vim @@ -0,0 +1,100 @@ +" Vim indent file +" Language: Haskell Cabal Build file +" Maintainer: Mateo Gjika <@mateoxh> + +if exists('b:did_indent') + finish +endif + +let b:did_indent = 1 + +setlocal indentexpr=GetCabalIndent() +setlocal indentkeys=!^F,o,O,e,0=elif,<:> + +let b:undo_indent = 'setlocal inde< indk<' + +let s:save_cpo = &cpo +set cpo&vim + +function! GetCabalIndent() abort + let categories = '\v\c^<(executable|(foreign-)?library|flag|source-repository|test-suite|benchmark|common|custom-setup)>' + let line = getline(v:lnum) + let prevline = getline(v:lnum - 1) + + if line =~# categories + return 0 + endif + + if line =~# '^\s*--' + return -1 + endif + + if line =~# '^\s*}' + let [lnum, col] = s:searchpairpos('{','','}','bnW') + if [lnum, col] == [0, 0] + return -1 + else + return indent(lnum) + endif + endif + + if line =~# '^\s*||' + if prevline =~# '^\s*||' + return indent(v:lnum - 1) + else + return indent(v:lnum - 1) + 1 + endif + endif + + if line =~# '\v^\s*' + let [lnum, col] = s:searchpairpos('\v', '', '\v\zs', 'bnW') + return col - 1 + elseif line =~# '\v^\s*' + let [lnum, col] = s:searchpairpos('\v', '\v', '\v\zs', 'bnW') + return col - 1 + endif + + if prevline =~# '\v^\s*<(if|elif|else)>' + return indent(v:lnum - 1) + shiftwidth() + endif + + if prevline =~# categories + return indent(v:lnum - 1) + shiftwidth() + endif + + if empty(prevline) || line =~# '\v^\s*\S+:' + call cursor(v:lnum, 1) + let prevCond = search('\v^\s*<(if|elif|else)>', 'bnW', 0, 0, + \ "synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment'") + let prevCat = search(categories, 'bnW', 0, 0, + \ "synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment'") + if prevCond > prevCat + return indent(v:lnum) > indent(prevCond) + \ ? indent(prevCond) + shiftwidth() + \ : indent(prevCond) + elseif prevCat > 0 + return indent(prevCat) + shiftwidth() + else + return 0 + endif + endif + + if line !~# '\v^\s*(|--)' + if prevline =~# '\v^\s*\S+:$' + return indent(v:lnum - 1) + shiftwidth() + endif + if prevline =~# '\v^\s*\S+:\s*\S' + return match(prevline, '\v^\s*\S+:\s*\zs') + endif + endif + + return indent(prevnonblank(v:lnum - 1)) +endfunction + +function! s:searchpairpos(start, middle, end, flags) abort + return searchpairpos(a:start, a:middle, a:end, a:flags, + \ "synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment'") +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/runtime/syntax/cabal.vim b/runtime/syntax/cabal.vim index ddc905615b..fffc0c7752 100644 --- a/runtime/syntax/cabal.vim +++ b/runtime/syntax/cabal.vim @@ -8,6 +8,7 @@ " " 2026 Apr 29 by Léana: add missing haskell language editions " 2026 Apr 20 by Vim project: remove wrong oneline keyword #20018 +" 2026 Jun 26 by Vim project: add elif keyword #20623 " " v1.6: Added support for foreign-libraries " Added highlighting for various fields @@ -53,7 +54,7 @@ syn iskeyword @,48-57,192-255,- " Case sensitive matches syn case match -syn keyword cabalConditional if else +syn keyword cabalConditional if elif else syn keyword cabalFunction os arche impl flag syn match cabalComment /--.*$/ From f82132813cc1e689c3eb5997963f9678db2a39dd Mon Sep 17 00:00:00 2001 From: Shane Harper Date: Fri, 26 Jun 2026 20:45:25 +0000 Subject: [PATCH 044/647] patch 9.2.0734: function pointer passed to STRNCMP() instead of a length Problem: In the popup 'close' option-value completion check, a function pointer (the address of close()) was passed as STRNCMP()'s third argument instead of the string length. Solution: Pass the length (close_len). (Shane Harper) The user-visible effect was negligible: ":set completepopup=close:o" offered no completions instead of "on" and "off". closes: #20642 Co-Authored-By: Claude Opus 4.8 Signed-off-by: Shane Harper Signed-off-by: Christian Brabandt --- src/optionstr.c | 2 +- src/testdir/test_options.vim | 3 +++ src/version.c | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/optionstr.c b/src/optionstr.c index b60e595868..b187dc3192 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -3516,7 +3516,7 @@ expand_set_popupoption(optexpand_T *args, int *numMatches, char_u ***matches, int is_border = xp->xp_pattern - args->oe_set_arg >= border_len && STRNCMP(xp->xp_pattern - border_len, "border:", border_len) == 0; int is_close = xp->xp_pattern - args->oe_set_arg >= close_len && - STRNCMP(xp->xp_pattern - close_len, "close:", close) == 0; + STRNCMP(xp->xp_pattern - close_len, "close:", close_len) == 0; int is_resize = xp->xp_pattern - args->oe_set_arg >= resize_len && STRNCMP(xp->xp_pattern - resize_len, "resize:", resize_len) == 0; int is_shadow = xp->xp_pattern - args->oe_set_arg >= shadow_len && diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index 4b7eea1b2f..7580ace6db 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -663,6 +663,9 @@ func Test_set_completion_string_values() call feedkeys(":set completepopup=height:10,align:\\\"\", 'xt') call assert_equal('"set completepopup=height:10,align:item', @:) call assert_equal([], getcompletion('set completepopup=bogusname:', 'cmdline')) + call assert_equal(['on', 'off'], getcompletion('set completepopup=close:', 'cmdline')) + call assert_equal(['on', 'off'], getcompletion('set completepopup=close:o', 'cmdline')) + call assert_equal(['off'], getcompletion('set previewpopup=close:of', 'cmdline')) " opacity: numeric, 0..100 only call assert_true(index(getcompletion('set completepopup=', 'cmdline'), diff --git a/src/version.c b/src/version.c index 742ff9a216..85bb6d17e1 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 734, /**/ 733, /**/ From 1188cac8f42509f4bdabaf5e102c961ba3fd1205 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 26 Jun 2026 20:54:47 +0000 Subject: [PATCH 045/647] runtime(doc): Tweak documentation style and typo closes: #20644 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/change.txt | 8 ++++---- runtime/doc/terminal.txt | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt index 639484e339..bc0979c5f3 100644 --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1,4 +1,4 @@ -*change.txt* For Vim version 9.2. Last change: 2026 Jun 22 +*change.txt* For Vim version 9.2. Last change: 2026 Jun 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1334,9 +1334,9 @@ and ":put" commands and with CTRL-R. feature} 6. Alternate file register "# *quote_#* *quote#* *@#* -Contains the |alternate-file| name for current window -This register is writable with `:let` and |setreg()|. This changes which buffer -CTRL-^ enters. You can't yank or delete into this register. +Contains the |alternate-file| name for current window. +This register is writable with `:let` and |setreg()|. This changes which +buffer CTRL-^ enters. You can't yank or delete into this register. A String is matched against existing buffer names, like |:buffer|: > let @# = 'buffer_name' Also supports using buffer number and |file-pattern|. diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index 99d9f3a4af..a16c123d1c 100644 --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -1,4 +1,4 @@ -*terminal.txt* For Vim version 9.2. Last change: 2026 Jun 24 +*terminal.txt* For Vim version 9.2. Last change: 2026 Jun 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -232,7 +232,7 @@ Command syntax ~ keys in the terminal window. For MS-Windows see the ++eof argument below. - *term++close* *term++noclose* *term++open* + *term++close* *term++noclose* *term++open* Supported [options] are: ++close The terminal window will close automatically when the job terminates. @@ -1001,7 +1001,7 @@ term_start({cmd} [, {options}]) *term_start()* terminal window, see |term_setkill()| "term_finish" What to do when the job is finished: "close": close any windows - "noclose": window will not be opened + "noclose": window will not be closed "open": open window if needed Note that "open" can be interruptive. See |term++close|, |term++noclose| and From 6b611b0d15603c52ebdad17172b0232b4f65704e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 26 Jun 2026 15:41:24 +0900 Subject: [PATCH 046/647] patch 9.2.0735: [security]: arbitrary Ex command execution during C omni-completion Problem: [security]: With C omni-completion, a crafted tags file can execute arbitrary Ex commands when completing a struct/union member (cipher-creator) Solution: Escape the type field before inserting it into the :vimgrep pattern so it cannot close the pattern and start a new command (Hirohito Higashi). Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-mf92-v4xw-j45x Co-Authored-By: Claude Opus 4.8 (1M context) " Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/autoload/ccomplete.vim | 2 +- src/testdir/Make_all.mak | 2 + src/testdir/test_plugin_ccomplete.vim | 62 +++++++++++++++++++++++++++ src/version.c | 2 + 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/testdir/test_plugin_ccomplete.vim diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim index 51237be98b..dc3388b524 100644 --- a/runtime/autoload/ccomplete.vim +++ b/runtime/autoload/ccomplete.vim @@ -600,7 +600,7 @@ def StructMembers( # {{{1 return [] endif execute 'silent! keepjumps noautocmd ' - .. n .. 'vimgrep ' .. '/\t' .. typename .. '\(\t\|$\)/j ' + .. n .. 'vimgrep ' .. '/\t' .. escape(typename, '/\') .. '\(\t\|$\)/j ' .. fnames qflist = getqflist() diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index b81e7e6bf6..dd0708c5ca 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -243,6 +243,7 @@ NEW_TESTS = \ test_partial \ test_paste \ test_perl \ + test_plugin_ccomplete \ test_plugin_comment \ test_plugin_glvs \ test_plugin_helpcurwin \ @@ -523,6 +524,7 @@ NEW_TESTS_RES = \ test_partial.res \ test_paste.res \ test_perl.res \ + test_plugin_ccomplete.res \ test_plugin_comment.res \ test_plugin_glvs.res \ test_plugin_helpcurwin.res \ diff --git a/src/testdir/test_plugin_ccomplete.vim b/src/testdir/test_plugin_ccomplete.vim new file mode 100644 index 0000000000..a635bd50bd --- /dev/null +++ b/src/testdir/test_plugin_ccomplete.vim @@ -0,0 +1,62 @@ +" Tests for the C omni-completion plugin (runtime/autoload/ccomplete.vim). + +func s:WriteTags(lines) + " Mark unsorted so lookup is a linear scan regardless of entry order. + let tagsfile = tempname() + call writefile(["!_TAG_FILE_SORTED\t0\t/0/"] + a:lines, tagsfile) + return tagsfile +endfunc + +" A crafted typeref field is interpolated into the :vimgrep pattern in +" StructMembers(). Without escaping, "/" closes the pattern and "|" starts a +" new Ex command, so the field runs as an Ex command during completion. +func Test_ccomplete_no_exec_via_typeref() + unlet! g:ccomplete_injected + let tagsfile = s:WriteTags([ + \ "myvar\tmain.c\t/^x$/;\"\tv\ttyperef:x/|let g:ccomplete_injected = 1|\"", + \ ]) + + let save_tags = &tags + let &tags = tagsfile + + new + call ccomplete#Complete(1, '') + call ccomplete#Complete(0, 'myvar.x') + + call assert_false(exists('g:ccomplete_injected'), + \ 'typeref field was executed as an Ex command during omni-completion') + + bwipe! + let &tags = save_tags + unlet! g:ccomplete_injected +endfunc + +" A legitimate typeref must still drive struct-member completion: escaping the +" field value must not break the normal path. +func Test_ccomplete_typeref_completion_still_works() + let tagsfile = s:WriteTags([ + \ "myvar\tmain.c\t/^x$/;\"\tv\ttyperef:struct:mystruct", + \ "alpha\tmain.c\t/^x$/;\"\tm\tstruct:mystruct", + \ "beta\tmain.c\t/^x$/;\"\tm\tstruct:mystruct", + \ ]) + + let save_tags = &tags + let &tags = tagsfile + + new + call ccomplete#Complete(1, '') + let items = ccomplete#Complete(0, 'myvar.') + + call assert_equal(type([]), type(items), + \ 'ccomplete#Complete did not return a list') + let names = map(copy(items), 'v:val.word') + call assert_true(index(names, 'alpha') >= 0, + \ 'struct member "alpha" missing from completion: ' . string(names)) + call assert_true(index(names, 'beta') >= 0, + \ 'struct member "beta" missing from completion: ' . string(names)) + + bwipe! + let &tags = save_tags +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 85bb6d17e1..5a976ac577 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 735, /**/ 734, /**/ From 43afc581a37a35762dd0ef292f038b9dc5680a24 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 26 Jun 2026 20:07:01 +0900 Subject: [PATCH 047/647] patch 9.2.0736: potential command execution in PHP omni-completion Problem: With PHP omni-completion, a crafted file can potentially execute arbitrary commands when completing a class member. Solution: Quote the class name before inserting it into the search() pattern run via win_execute(). Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/autoload/phpcomplete.vim | 3 ++- src/testdir/Make_all.mak | 2 ++ src/testdir/test_plugin_phpcomplete.vim | 35 +++++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/testdir/test_plugin_phpcomplete.vim diff --git a/runtime/autoload/phpcomplete.vim b/runtime/autoload/phpcomplete.vim index 5b4263ae45..93f7d8b450 100644 --- a/runtime/autoload/phpcomplete.vim +++ b/runtime/autoload/phpcomplete.vim @@ -2082,7 +2082,8 @@ function! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_nam let result = [] let popup_id = popup_create(a:file_lines, {'hidden': v:true}) - call win_execute(popup_id, 'call search(''\c\(class\|interface\|trait\)\_s\+'.a:class_name.'\(\>\|$\)'')') + call win_execute(popup_id, 'call search(' + \ . string('\c\(class\|interface\|trait\)\_s\+' . a:class_name . '\(\>\|$\)') . ')') call win_execute(popup_id, "let cfline = line('.')") call win_execute(popup_id, "call search('{')") call win_execute(popup_id, "let endline = line('.')") diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index dd0708c5ca..533497cba0 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -252,6 +252,7 @@ NEW_TESTS = \ test_plugin_matchit \ test_plugin_matchparen \ test_plugin_netrw \ + test_plugin_phpcomplete \ test_plugin_python3complete \ test_plugin_osc52 \ test_plugin_tar \ @@ -533,6 +534,7 @@ NEW_TESTS_RES = \ test_plugin_matchit.res \ test_plugin_matchparen.res \ test_plugin_netrw.res \ + test_plugin_phpcomplete.res \ test_plugin_python3complete.res \ test_plugin_osc52.res \ test_plugin_tar.res \ diff --git a/src/testdir/test_plugin_phpcomplete.vim b/src/testdir/test_plugin_phpcomplete.vim new file mode 100644 index 0000000000..7f66be47b7 --- /dev/null +++ b/src/testdir/test_plugin_phpcomplete.vim @@ -0,0 +1,35 @@ +" Tests for the PHP omni-completion plugin (runtime/autoload/phpcomplete.vim). + +" A buffer class name is interpolated into a search() pattern run via +" win_execute(). Without escaping, "'" closes the string and "|" starts a new +" Ex command, so the name runs as an Ex command during completion. +func Test_phpcomplete_no_exec_via_class_name() + unlet! g:phpcomplete_injected + let lines = [' 0, 'no class structure returned') + call assert_match('class Foo', result[0].content, + \ 'class body missing from returned content') + call assert_match('bar', result[0].content, + \ 'class member missing from returned content') +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 5a976ac577..b96b4c5169 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 736, /**/ 735, /**/ From 12286e442665c69587d923efde22b6e3f4c556c9 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Sat, 27 Jun 2026 08:35:08 +0000 Subject: [PATCH 048/647] patch 9.2.0737: tests: comment test can be improved Problem: tests: comment test can be improved Solution: Simplify tests (Maxim Kim) Currently test suite for the comment package uses separate vim in terminal to do tests, which is inefficient and unnecessary complex. The reason is the comment.Toggle() uses '' to get function name for the opfunc and this fools vim's test runner. - use lambda func for opfunc inside Toggle() - simplify tests not to use terminal closes: #20649 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- .../dist/opt/comment/autoload/comment.vim | 90 ++-- src/testdir/test_plugin_comment.vim | 469 ++++++++---------- src/version.c | 2 + 3 files changed, 246 insertions(+), 315 deletions(-) diff --git a/runtime/pack/dist/opt/comment/autoload/comment.vim b/runtime/pack/dist/opt/comment/autoload/comment.vim index 74e091c358..13fa59c839 100644 --- a/runtime/pack/dist/opt/comment/autoload/comment.vim +++ b/runtime/pack/dist/opt/comment/autoload/comment.vim @@ -1,7 +1,7 @@ vim9script # Maintainer: Maxim Kim -# Last Update: 2025-06-13 +# Last Update: 2026-06-27 # # Toggle comments # Usage: @@ -11,70 +11,68 @@ vim9script # xnoremap gc comment.Toggle() # nnoremap gcc comment.Toggle() .. '_' # nnoremap gC comment.Toggle() .. '$' -export def Toggle(...args: list): string - if len(args) == 0 - &opfunc = matchstr(expand(''), '[^. ]*\ze[') - return 'g@' - endif - if empty(&cms) || !&ma | return '' | endif - var cms = substitute(substitute(&cms, '\S\zs%s\s*', ' %s', ''), '%s\ze\S', '%s ', '') - var [lnum1, lnum2] = [line("'["), line("']")] - var cms_l = split(escape(cms, '*.\^$['), '\s*%s\s*') +export def Toggle(): string + &opfunc = (_) => { + if empty(&cms) || !&ma | return | endif + var cms = substitute(substitute(&cms, '\S\zs%s\s*', ' %s', ''), '%s\ze\S', '%s ', '') + var [lnum1, lnum2] = [line("'["), line("']")] + var cms_l = split(escape(cms, '*.\^$['), '\s*%s\s*') - var first_col = indent(lnum1) - var start_col = getpos("'[")[2] - 1 - if len(cms_l) == 1 && lnum1 == lnum2 && first_col < start_col + var first_col = indent(lnum1) + var start_col = getpos("'[")[2] - 1 + if len(cms_l) == 1 && lnum1 == lnum2 && first_col < start_col var line_start = getline(lnum1)[0 : start_col - 1] var line_end = getline(lnum1)[start_col : -1] line_end = line_end =~ $'\c^\s*{cms_l[0]}' ? - \ substitute(line_end, $'\c^\s*\zs{cms_l[0]}\s\ze\s*', line_end =~ '^\s' ? ' ' : '', '') : - \ printf(substitute(cms, '%s\@!', '%%', ''), line_end) + \ substitute(line_end, $'\c^\s*\zs{cms_l[0]}\s\ze\s*', line_end =~ '^\s' ? ' ' : '', '') : + \ printf(substitute(cms, '%s\@!', '%%', ''), line_end) setline(lnum1, line_start .. line_end) - return '' - endif + return + endif - if len(cms_l) == 0 | return '' | endif - if len(cms_l) == 1 | call add(cms_l, '') | endif - var comment = false - var indent_spaces = false - var indent_tabs = false - var indent_min = indent(lnum1) - var indent_start = matchstr(getline(lnum1), '^\s*') - for lnum in range(lnum1, lnum2) + if len(cms_l) == 0 | return | endif + if len(cms_l) == 1 | call add(cms_l, '') | endif + var comment = false + var indent_spaces = false + var indent_tabs = false + var indent_min = indent(lnum1) + var indent_start = matchstr(getline(lnum1), '^\s*') + for lnum in range(lnum1, lnum2) if getline(lnum) =~ '^\s*$' | continue | endif var indent_str = matchstr(getline(lnum), '^\s*') if indent_min > indent(lnum) - indent_min = indent(lnum) - indent_start = indent_str + indent_min = indent(lnum) + indent_start = indent_str endif indent_spaces = indent_spaces || (stridx(indent_str, ' ') != -1) indent_tabs = indent_tabs || (stridx(indent_str, "\t") != -1) if getline(lnum) !~ $'\c^\s*{cms_l[0]}.*{cms_l[1]}$' - comment = true + comment = true endif - endfor - var mixed_indent = indent_spaces && indent_tabs - var lines = [] - var line = '' - for lnum in range(lnum1, lnum2) + endfor + var mixed_indent = indent_spaces && indent_tabs + var lines = [] + var line = '' + for lnum in range(lnum1, lnum2) if getline(lnum) =~ '^\s*$' - line = getline(lnum) + line = getline(lnum) elseif comment - if exists("g:comment_first_col") || exists("b:comment_first_col") - line = printf(substitute(cms, '%s\@!', '%%', 'g'), getline(lnum)) - else - # consider different whitespace indenting - var indent_current = mixed_indent ? matchstr(getline(lnum), '^\s*') : indent_start - line = printf(indent_current .. substitute(cms, '%s\@!', '%%', 'g'), - strpart(getline(lnum), strlen(indent_current))) - endif + if exists("g:comment_first_col") || exists("b:comment_first_col") + line = printf(substitute(cms, '%s\@!', '%%', 'g'), getline(lnum)) + else + # consider different whitespace indenting + var indent_current = mixed_indent ? matchstr(getline(lnum), '^\s*') : indent_start + line = printf(indent_current .. substitute(cms, '%s\@!', '%%', 'g'), + strpart(getline(lnum), strlen(indent_current))) + endif else - line = substitute(getline(lnum), $'\c^\s*\zs{cms_l[0]} \?\| \?{cms_l[1]}$', '', 'g') + line = substitute(getline(lnum), $'\c^\s*\zs{cms_l[0]} \?\| \?{cms_l[1]}$', '', 'g') endif add(lines, line) - endfor - noautocmd keepjumps setline(lnum1, lines) - return '' + endfor + noautocmd keepjumps setline(lnum1, lines) + } + return 'g@' enddef diff --git a/src/testdir/test_plugin_comment.vim b/src/testdir/test_plugin_comment.vim index befae9a4d2..8ddd720dd0 100644 --- a/src/testdir/test_plugin_comment.vim +++ b/src/testdir/test_plugin_comment.vim @@ -1,6 +1,7 @@ " Test for the comment package -CheckRunVimInTerminal +packadd comment + func Test_basic_comment() let lines =<< trim END vim9script @@ -10,18 +11,15 @@ func Test_basic_comment() enddef END - let input_file = "test_basic_comment_input.vim" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=vim - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcc") - call term_sendkeys(buf, "2jgcip") - let output_file = "comment_basic_test.vim" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcc + normal 2jgcip - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["# vim9script", "", "# def Hello()", '# echo "Hello"', "# enddef"], result) endfunc @@ -34,18 +32,15 @@ func Test_basic_uncomment() # enddef END - let input_file = "test_basic_uncomment_input.vim" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=vim - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcc") - call term_sendkeys(buf, "2jgcip") - let output_file = "uncomment_basic_test.vim" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcc + normal 2jgcip - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["# vim9script", "", "def Hello()", ' echo "Hello"', "enddef"], result) endfunc @@ -55,17 +50,14 @@ func Test_backward_slash_uncomment() .\" .TL Test backward slash uncomment END - let input_file = "Test_backward_slash_uncomment_input.mom" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=nroff - let buf = RunVimInTerminal('-c "packadd comment" -c "set ft=nroff" ' .. input_file, {}) - call term_sendkeys(buf, "gcc") - let output_file = "backward_slash_uncomment_test.mom" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcc - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal([".TL Test backward slash uncomment"], result) endfunc @@ -74,17 +66,14 @@ func Test_caseinsensitive_uncomment() rem echo "Hello" END - let input_file = "test_caseinsensitive_uncomment_input.bat" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=dosbatch - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcc") - let output_file = "comment_testinsensitive_uncomment_test.bat" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcc - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(['echo "Hello"'], result) endfunc @@ -93,17 +82,14 @@ func Test_bothends_comment() int main() {} END - let input_file = "test_bothends_comment_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcc") - let output_file = "comment_bothends_test.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcc - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["/* int main() {} */"], result) endfunc @@ -114,17 +100,14 @@ func Test_bothends_uncomment() /* } */ END - let input_file = "test_bothends_uncomment_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcip") - let output_file = "uncomment_bothends_test.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcip - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {", " return 0;", "}"], result) endfunc @@ -135,17 +118,14 @@ func Test_mixed_comment() # print(x*x) END - let input_file = "test_mixed_comment_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcG") - let output_file = "comment_mixed_test.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcG - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["# for x in range(10):", "# # print(x)", "# # print(x*x)"], result) endfunc @@ -156,34 +136,28 @@ func Test_mixed_comment2() # print(x*x) END - let input_file = "test_mixed_comment_input2.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcG") - let output_file = "comment_mixed_test2.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcG - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["# # for x in range(10):", "# print(x)", "# # print(x*x)"], result) endfunc func Test_mixed_indent_comment() let lines = ["int main() {", "\tif 1 {", "\t return 0;", "\t}", " return 1;", "}"] - let input_file = "test_mixed_indent_comment_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "gcip") - let output_file = "comment_mixed_indent_test.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal gcip - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["/* int main() { */", "\t/* if 1 { */", "\t /* return 0; */", "\t/* } */", " /* return 1; */", "/* } */"], result) endfunc @@ -194,17 +168,15 @@ func Test_buffer_first_col_comment() pass END - let input_file = "test_first_col_comment_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=python + let b:comment_first_col = 1 - let buf = RunVimInTerminal('-c "packadd comment" -c "let b:comment_first_col=1" ' .. input_file, {}) - call term_sendkeys(buf, "jgcc") - let output_file = "comment_first_col_test.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal jgcc - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["def Hello():", '# print("Hello")', " pass"], result) endfunc @@ -215,17 +187,17 @@ func Test_global_first_col_comment() pass END - let input_file = "test_first_col_comment_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=python + let g:comment_first_col = 1 + + normal jgcj - let buf = RunVimInTerminal('-c "packadd comment" -c "let g:comment_first_col=1" ' .. input_file, {}) - call term_sendkeys(buf, "jgcj") - let output_file = "comment_first_col_test.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + unlet g:comment_first_col - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["def Hello():", '# print("Hello")', "# pass"], result) endfunc @@ -243,17 +215,15 @@ func Test_textobj_icomment() print(x*x*x*x*x) END - let input_file = "test_textobj_icomment_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dic..") - let output_file = "comment_textobj_icomment.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dic.. - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["for x in range(10):", " print(x) ", " print(x*x*x*x) ", " print(x*x*x*x*x) ", "", " print(x*x*x*x*x)"], result) endfunc @@ -271,17 +241,15 @@ func Test_textobj_icomment2() } END - let input_file = "test_textobj_icomment2_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dic..") - let output_file = "comment_textobj_icomment2.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dic. - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["#include ", "", "int main() {", " printf(\"hello\"); printf(\" world\\n\");", " ", "", " return 0;", "}"], result) endfunc @@ -295,17 +263,15 @@ func Test_textobj_icomment3() } END - let input_file = "test_textobj_icomment3_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "jjjdic") - let output_file = "comment_textobj_icomment3.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal jjjdic - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["#include ", "", "int main() {", " printf(\"hello\");printf(\" world\\n\");", " return 0;", "}"], result) endfunc @@ -323,17 +289,15 @@ func Test_textobj_acomment() print(x*x*x*x*x) END - let input_file = "test_textobj_acomment_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac..") - let output_file = "comment_textobj_acomment.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac.. - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["for x in range(10):", " print(x)", " print(x*x*x*x)", " print(x*x*x*x*x)", "", " print(x*x*x*x*x)"], result) endfunc @@ -351,17 +315,15 @@ func Test_textobj_acomment2() } END - let input_file = "test_textobj_acomment2_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac.") - let output_file = "comment_textobj_acomment2.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac. - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["#include ", "", "int main() {", " printf(\"hello\");printf(\" world\\n\");", " return 0;", "}"], result) endfunc @@ -375,17 +337,15 @@ func Test_textobj_acomment3() } END - let input_file = "test_textobj_acomment3_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "jjjdac") - let output_file = "comment_textobj_acomment3.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal jjjdac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["#include ", "", "int main() {", " printf(\"hello\");printf(\" world\\n\");", " return 0;", "}"], result) endfunc @@ -396,17 +356,15 @@ func Test_textobj_firstline_comment() int main() {} END - let input_file = "test_textobj_firstlinecomment_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac") - let output_file = "comment_textobj_firstline_comment.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {}"], result) endfunc @@ -416,17 +374,15 @@ func Test_textobj_noleading_space_comment() }/* main end */ END - let input_file = "test_textobj_noleading_space_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dacdic") - let output_file = "comment_textobj_noleading_space_comment.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dacdic - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {", "}"], result) endfunc @@ -436,52 +392,46 @@ func Test_textobj_noleading_space_comment2() } /* main end */ END - let input_file = "test_textobj_noleading_space_input2.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac.") - let output_file = "comment_textobj_noleading_space_comment2.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac. - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {", "}"], result) endfunc func Test_textobj_trailing_spaces_comment() let lines = ['# print("hello") ', '# print("world") ', "#", 'print("!")'] - let input_file = "test_textobj_trailing_spaces_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "jdac") - let output_file = "comment_textobj_trailing_spaces_comment.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal jdac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(['print("!")'], result) endfunc func Test_textobj_trailing_spaces_last_comment() let lines = ['# print("hello") ', '# print("world") ', "#", '', ''] - let input_file = "test_textobj_trailing_spaces_last_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "jdac") - let output_file = "comment_textobj_trailing_spaces_last_comment.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal jdac - call StopVimInTerminal(buf) - let result = readfile(output_file) - call assert_equal([], result) + let result = getline(1, '$') + call assert_equal([''], result) endfunc func Test_textobj_last_line_empty_comment() @@ -491,18 +441,16 @@ func Test_textobj_last_line_empty_comment() # END - let input_file = "test_textobj_last_line_empty_input.py" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=python - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac") - let output_file = "comment_textobj_last_line_empty_comment.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac - call StopVimInTerminal(buf) - let result = readfile(output_file) - call assert_equal([], result) + let result = getline(1, '$') + call assert_equal([''], result) endfunc func Test_textobj_cursor_on_leading_space_comment() @@ -513,17 +461,15 @@ func Test_textobj_cursor_on_leading_space_comment() } END - let input_file = "test_textobj_cursor_on_leading_space_comment_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "jjdac") - let output_file = "comment_textobj_cursor_on_leading_space_comment.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal jjdac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {", "}"], result) endfunc @@ -536,17 +482,15 @@ func Test_textobj_conseq_comment() } END - let input_file = "test_textobj_conseq_comment_input.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac") - let output_file = "comment_textobj_conseq_comment.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {", " printf(\"hello\");", " printf(\"world\");", "}"], result) endfunc @@ -560,17 +504,15 @@ func Test_textobj_conseq_comment2() } END - let input_file = "test_textobj_conseq_comment_input2.c" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=c - let buf = RunVimInTerminal('-c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac") - let output_file = "comment_textobj_conseq_comment2.c" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(["int main() {", " printf(\"hello\");", "", " // world", " printf(\"world\");", "}"], result) endfunc @@ -579,18 +521,14 @@ func Test_inline_comment() echo "Hello" This should be a comment END - let input_file = "test_inline_comment_input.vim" - call writefile(lines, input_file, "D") - - let buf = RunVimInTerminal('-c "packadd comment" -c "nnoremap gC comment#Toggle()..''$''" ' .. input_file, {}) - call term_sendkeys(buf, "fTgC") + enew + call setline(1, lines) + filetype plugin on + set ft=vim - let output_file = "comment_inline_test.vim" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal fTgC - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(['echo "Hello" " This should be a comment'], result) endfunc @@ -599,18 +537,14 @@ func Test_inline_uncomment() echo "Hello" " This should be a comment END - let input_file = "test_inline_uncomment_input.vim" - call writefile(lines, input_file, "D") + enew + call setline(1, lines) + filetype plugin on + set ft=vim - let buf = RunVimInTerminal('-c "packadd comment" -c "nnoremap gC comment#Toggle()..''$''" ' .. input_file, {}) - call term_sendkeys(buf, '$F"gC') + normal $F"gC - let output_file = "uncomment_inline_test.vim" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) - - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(['echo "Hello" This should be a comment'], result) endfunc @@ -619,17 +553,14 @@ func Test_textobj_selection_exclusive_inline_comment() print("Hello") # selection exclusive END - let input_file = "test_selection_exclusive_inline_comment_input.py" - call writefile(lines, input_file, "D") - - let buf = RunVimInTerminal('-c "set selection=exclusive" -c "packadd comment" ' .. input_file, {}) - call term_sendkeys(buf, "dac") + enew + call setline(1, lines) + filetype plugin on + syntax on + set ft=python - let output_file = "test_selection_exclusive_inline_comment.py" - call term_sendkeys(buf, $":w {output_file}\") - defer delete(output_file) + normal dac - call StopVimInTerminal(buf) - let result = readfile(output_file) + let result = getline(1, '$') call assert_equal(['print("Hello")'], result) endfunc diff --git a/src/version.c b/src/version.c index b96b4c5169..fa30c5e705 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 737, /**/ 736, /**/ From e876e256fb7da5ff9b722290bffd195d1b30a905 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 Jun 2026 08:38:13 +0000 Subject: [PATCH 049/647] CI: Bump actions/checkout in the github-actions group across 1 directory Bumps the github-actions group with 1 update in the / directory: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 6.0.2 to 7.0.0 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v6.0.2...v7.0.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... closes: #20646 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/ci-linux.yml | 2 +- .github/workflows/ci-linux_asan.yml | 2 +- .github/workflows/ci-macos.yml | 2 +- .github/workflows/ci-windows.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/coverity.yml | 2 +- .github/workflows/link-check.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 2bd08c452a..016c58e0ae 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -83,7 +83,7 @@ jobs: steps: - name: Checkout repository from GitHub - uses: actions/checkout@v6.0.3 + uses: actions/checkout@v7.0.0 - name: Build timeout-minutes: 15 diff --git a/.github/workflows/ci-linux_asan.yml b/.github/workflows/ci-linux_asan.yml index 54dcd2dca6..db8cf437c6 100644 --- a/.github/workflows/ci-linux_asan.yml +++ b/.github/workflows/ci-linux_asan.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout repository from GitHub - uses: actions/checkout@v6.0.3 + uses: actions/checkout@v7.0.0 - name: Build timeout-minutes: 15 diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index 2ab16012c2..9acda1df40 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout repository from GitHub - uses: actions/checkout@v6.0.3 + uses: actions/checkout@v7.0.0 - name: Install packages if: matrix.features == 'huge' diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 013d5142b1..25c7f1c075 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -128,7 +128,7 @@ jobs: release: false - name: Checkout repository from GitHub - uses: actions/checkout@v6.0.3 + uses: actions/checkout@v7.0.0 - name: Create a list of download URLs shell: cmd diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e5c02fbb9a..8a5c8f2dd5 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,7 +44,7 @@ jobs: steps: - name: Checkout repository from github - uses: actions/checkout@v6.0.3 + uses: actions/checkout@v7.0.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml index b4c64f3f28..5ff1dfada7 100644 --- a/.github/workflows/coverity.yml +++ b/.github/workflows/coverity.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout repository from github if: env.TOKEN - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.0 - name: Download Coverity if: env.TOKEN diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml index da69554647..73aee1ca6b 100644 --- a/.github/workflows/link-check.yml +++ b/.github/workflows/link-check.yml @@ -8,7 +8,7 @@ jobs: lychee: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.3 + - uses: actions/checkout@v7.0.0 - name: Run Lychee uses: lycheeverse/lychee-action@v2 with: From 43939cf9ebf5302bb51c85d00ac83de7e01452d5 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sat, 27 Jun 2026 08:39:43 +0000 Subject: [PATCH 050/647] patch 9.2.0738: ml_recover() may write beyond block buffer Problem: A crafted swap file can cause an out-of-bounds write during recovery when the same block is referenced twice with different pe_page_count values (cipher-creator) Solution: Check hp->bh_page_count against page_count after mf_get() and clamp page_count to the actual block size. closes: #20645 Signed-off-by: Christian Brabandt --- src/memline.c | 14 ++++++++++++++ src/po/vim.pot | 5 ++++- src/testdir/samples/recover-mismatch-pc.swp | Bin 0 -> 28672 bytes src/testdir/test_recover.vim | 17 +++++++++++++++-- src/version.c | 2 ++ 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/testdir/samples/recover-mismatch-pc.swp diff --git a/src/memline.c b/src/memline.c index 4ad09f43a5..2e0403d416 100644 --- a/src/memline.c +++ b/src/memline.c @@ -1680,6 +1680,20 @@ ml_recover(int checkext) */ has_error = FALSE; + // Verify the cached block's actual size matches the + // pointer entry's pe_page_count. mf_get() cache hits + // return the original block without resizing, so a + // crafted swap file referencing the same block twice + // with different pe_page_count values would cause an + // OOB write below. + if (hp->bh_page_count != page_count) + { + ++error; + ml_append(lnum++, (char_u *)_("??? BLOCK PAGE COUNT MISMATCH"), + (colnr_T)0, TRUE); + page_count = hp->bh_page_count; + } + // Check the length of the block. // If wrong, use the length given in the pointer block. if (page_count * mfp->mf_page_size != dp->db_txt_end) diff --git a/src/po/vim.pot b/src/po/vim.pot index 131e52457f..4996b205ff 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-06-24 17:52+0000\n" +"POT-Creation-Date: 2026-06-27 08:41+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1978,6 +1978,9 @@ msgstr "" msgid "???BLOCK MISSING" msgstr "" +msgid "??? BLOCK PAGE COUNT MISMATCH" +msgstr "" + msgid "??? from here until ???END lines may be messed up" msgstr "" diff --git a/src/testdir/samples/recover-mismatch-pc.swp b/src/testdir/samples/recover-mismatch-pc.swp new file mode 100644 index 0000000000000000000000000000000000000000..dd5a1fa083e9817bd8b926c28b65a02b120be911 GIT binary patch literal 28672 zcmeI%u?~VT5CG6h;;exm0NoAf!Y?>D$}aH(9Nhg~Kf{(d!cLlZLx;OGxqD5g8{6S} ztNT+MV(il)2oT6s;BxM!uYNo<6ifB*pk1PBlyK!5-N0tD70@OXys-Nk;=?%)1@JrAQ30t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk c1PBlyK!5-N0t5&UAV7cs0RjXF5Xeg42S98GRsaA1 literal 0 HcmV?d00001 diff --git a/src/testdir/test_recover.vim b/src/testdir/test_recover.vim index bb61e1995d..0c8e28196a 100644 --- a/src/testdir/test_recover.vim +++ b/src/testdir/test_recover.vim @@ -514,8 +514,8 @@ func Test_recover_corrupted_swap_file1() call assert_match('???ILLEGAL BLOCK NUMBER', content) call delete(target) bw! -" -" " Test 2: Segfault + + " Test 2: Segfault new let sample = 'samples/recover-crash2.swp' let target = 'Xpoc2.swp' @@ -531,6 +531,19 @@ func Test_recover_corrupted_swap_file1() call assert_match('???LINES MISSING', content) call delete(target) bw! + + " Test 3: wrong page_count header + new + let sample = 'samples/recover-mismatch-pc.swp' + let target = 'Xmismatch-pc.swp' + call writefile(readblob(sample), target, 'bD') + try + sil noa recover! Xmismatch-pc.swp + catch + endtry + " Verifies no crash occurs. The OOB write is only reliably triggered + " interactively due to memory pressure evicting blocks in the test runner. + bw! endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index fa30c5e705..7cfc8de777 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 738, /**/ 737, /**/ From 1f33732613304958c935f302d8cb44bddc7f672f Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 28 Jun 2026 16:18:45 +0000 Subject: [PATCH 051/647] runtime: guard recommended style settings consistently Normalize the 15 existing guards to the documented two-level form get(g:, 'X_recommended_style', get(g:, 'filetype_recommended_style', 1)): fix the two non-standard "!exists() || != 0" guards (python, arduino) and tolk's wrong fallback variable, and convert the simple one-level guards. Add the guard to filetype plugins that set stylistic indentation/format options without one: aap, abap, ada, cabal, cobol, elixir, falcon, graphql, heex, idris2, mermaid, occam, racket, scala, swift, tera. Settings that are required rather than stylistic are left untouched, e.g. make/gomod/scdoc (mandatory tabs), chatito and vroom (indent mandated by the format), and the textwidth/formatoptions cases in gitcommit/help/ jjdescription. Supported by AI. fixes: #20036 closes: #20650 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Christian Brabandt --- runtime/ftplugin/aap.vim | 6 +++++- runtime/ftplugin/abap.vim | 6 +++++- runtime/ftplugin/ada.vim | 10 +++++++--- runtime/ftplugin/arduino.vim | 4 +++- runtime/ftplugin/cabal.vim | 6 +++++- runtime/ftplugin/cobol.vim | 8 ++++++-- runtime/ftplugin/elixir.vim | 7 ++++++- runtime/ftplugin/falcon.vim | 6 +++++- runtime/ftplugin/gdscript.vim | 3 ++- runtime/ftplugin/gleam.vim | 4 +++- runtime/ftplugin/go.vim | 4 +++- runtime/ftplugin/graphql.vim | 10 +++++++--- runtime/ftplugin/hare.vim | 3 ++- runtime/ftplugin/haredoc.vim | 3 ++- runtime/ftplugin/heex.vim | 6 +++++- runtime/ftplugin/idris2.vim | 8 ++++++-- runtime/ftplugin/markdown.vim | 4 +++- runtime/ftplugin/mermaid.vim | 12 ++++++++---- runtime/ftplugin/meson.vim | 4 +++- runtime/ftplugin/occam.vim | 23 +++++++++++++++-------- runtime/ftplugin/python.vim | 4 +++- runtime/ftplugin/racket.vim | 6 +++++- runtime/ftplugin/ruby.vim | 4 +++- runtime/ftplugin/rust.vim | 4 +++- runtime/ftplugin/sass.vim | 4 +++- runtime/ftplugin/scala.vim | 6 +++++- runtime/ftplugin/swift.vim | 8 ++++++-- runtime/ftplugin/tera.vim | 10 +++++++--- runtime/ftplugin/tolk.vim | 4 +++- runtime/ftplugin/yaml.vim | 4 +++- runtime/ftplugin/zig.vim | 4 +++- 31 files changed, 145 insertions(+), 50 deletions(-) diff --git a/runtime/ftplugin/aap.vim b/runtime/ftplugin/aap.vim index cd7e2a425e..b6e7b0ec0f 100644 --- a/runtime/ftplugin/aap.vim +++ b/runtime/ftplugin/aap.vim @@ -2,6 +2,7 @@ " Language: Aap recipe " Maintainer: The Vim Project " Last Change: 2024 Jan 14 +" 2026 Jun 27 by Vim Project (add recommended style guard) " Former Maintainer: Bram Moolenaar " Only do this when not done yet for this buffer @@ -25,7 +26,10 @@ setlocal comments=s:#\ -,m:#\ \ ,e:#,n:#,fb:- setlocal commentstring=#\ %s " Expand tabs to spaces to avoid trouble. -setlocal expandtab +if get(g:, 'aap_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab +endif if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") let b:browsefilter = "Aap Recipe Files (*.aap)\t*.aap\n" diff --git a/runtime/ftplugin/abap.vim b/runtime/ftplugin/abap.vim index fd6b8418fe..5a2148b8e2 100644 --- a/runtime/ftplugin/abap.vim +++ b/runtime/ftplugin/abap.vim @@ -6,6 +6,7 @@ " Last Change: 2023 Aug 28 by Vim Project (undo_ftplugin) " 2024 Jan 14 by Vim Project (browsefilter) " 2025 Jun 08 by Riley Bruins ('comments', 'commentstring') +" 2026 Jun 27 by Vim Project (add recommended style guard) " -------------------------------------------------------------------------- " Only do this when not done yet for this buffer @@ -17,7 +18,10 @@ let b:did_ftplugin = 1 let s:cpo_save = &cpo set cpo&vim -setlocal softtabstop=2 shiftwidth=2 +if get(g:, 'abap_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal softtabstop=2 shiftwidth=2 +endif setlocal suffixesadd=.abap setlocal commentstring=\"\ %s setlocal comments=:\",:* diff --git a/runtime/ftplugin/ada.vim b/runtime/ftplugin/ada.vim index 7d2bdae9a8..2e90ed326c 100644 --- a/runtime/ftplugin/ada.vim +++ b/runtime/ftplugin/ada.vim @@ -24,6 +24,7 @@ " set undo_ftplugin " mark as unmaintained " use buffer-local abbreviation +" 27.06.2026 add recommended style guard " Help Page: ft-ada-plugin "------------------------------------------------------------------------------ " Provides mapping overrides for tag jumping that figure out the current @@ -148,9 +149,12 @@ if exists("g:ada_folding") elseif g:ada_folding[0] == 's' setlocal foldmethod=syntax endif - setlocal tabstop=8 - setlocal softtabstop=3 - setlocal shiftwidth=3 + if get(g:, 'ada_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal tabstop=8 + setlocal softtabstop=3 + setlocal shiftwidth=3 + endif endif " Section: Abbrev {{{1 diff --git a/runtime/ftplugin/arduino.vim b/runtime/ftplugin/arduino.vim index 60b11dab1a..994bbb58c6 100644 --- a/runtime/ftplugin/arduino.vim +++ b/runtime/ftplugin/arduino.vim @@ -4,6 +4,7 @@ " Ken Takata " Last Change: 2024 Apr 12 " 2024 Jun 02 by Riley Bruins ('commentstring') +" 2026 Jun 27 by Vim Project (normalize recommended style guard) " " Most of the part was copied from c.vim. @@ -21,7 +22,8 @@ set cpo-=C let b:undo_ftplugin = "setl fo< com< ofu< cms< def< inc<" -if !exists("g:arduino_recommended_style") || g:arduino_recommended_style != 0 +if get(g:, 'arduino_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) " Use the default setting of Arduino IDE. setlocal expandtab tabstop=2 softtabstop=2 shiftwidth=2 let b:undo_ftplugin ..= " et< ts< sts< sw<" diff --git a/runtime/ftplugin/cabal.vim b/runtime/ftplugin/cabal.vim index 91b9298930..5b696fceea 100644 --- a/runtime/ftplugin/cabal.vim +++ b/runtime/ftplugin/cabal.vim @@ -4,13 +4,17 @@ " Last Change: 2024 Jul 06 " 2026 Jan 13 by Vim project: set compiler #19152 " 2026 Jun 26 by Vim project: set expandtab #20623 +" 2026 Jun 27 by Vim Project: add recommended style guard if exists('b:did_ftplugin') finish endif let b:did_ftplugin = 1 -setlocal expandtab +if get(g:, 'cabal_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab +endif setlocal comments=:-- commentstring=--\ %s compiler cabal diff --git a/runtime/ftplugin/cobol.vim b/runtime/ftplugin/cobol.vim index 5e52702fd5..a8c0d2975d 100644 --- a/runtime/ftplugin/cobol.vim +++ b/runtime/ftplugin/cobol.vim @@ -4,6 +4,7 @@ " (formerly Tim Pope ) " Last Update: By Ankit Jain (add gtk support) on 15.08.2020 " 2024 Jan 14 by Vim Project (browsefilter) +" 2026 Jun 27 by Vim Project (add recommended style guard) " Insert mode mappings: " Normal mode mappings: < > << >> [[ ]] [] ][ @@ -20,8 +21,11 @@ set cpo&vim setlocal commentstring=\ \ \ \ \ \ *%s setlocal comments=:* setlocal fo+=croqlt -setlocal expandtab -setlocal textwidth=72 +if get(g:, 'cobol_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab + setlocal textwidth=72 +endif " matchit support if exists("loaded_matchit") diff --git a/runtime/ftplugin/elixir.vim b/runtime/ftplugin/elixir.vim index d067f472b7..ba92c11ac7 100644 --- a/runtime/ftplugin/elixir.vim +++ b/runtime/ftplugin/elixir.vim @@ -2,6 +2,7 @@ " Language: Elixir " Maintainer: Mitchell Hanberg " Last Change: 2023 Dec 27 +" 2026 Jun 27 by Vim Project (add recommended style guard) if exists("b:did_ftplugin") finish @@ -23,7 +24,11 @@ if exists('loaded_matchit') && !exists('b:match_words') \ ',{:},\[:\],(:)' endif -setlocal shiftwidth=2 softtabstop=2 expandtab iskeyword+=!,? +if get(g:, 'elixir_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal shiftwidth=2 softtabstop=2 expandtab +endif +setlocal iskeyword+=!,? setlocal comments=:# setlocal commentstring=#\ %s diff --git a/runtime/ftplugin/falcon.vim b/runtime/ftplugin/falcon.vim index 1000b62e76..d135778647 100644 --- a/runtime/ftplugin/falcon.vim +++ b/runtime/ftplugin/falcon.vim @@ -5,6 +5,7 @@ " License: You may redistribute this under the same terms as Vim itself " Last Update: 2020 Oct 10 " 2024 Jan 14 by Vim Project (browsefilter) +" 2026 Jun 27 by Vim Project (add recommended style guard) " -------------------------------------------------------------------------- " Only do this when not done yet for this buffer @@ -16,7 +17,10 @@ let b:did_ftplugin = 1 let s:cpo_save = &cpo set cpo&vim -setlocal softtabstop=4 shiftwidth=4 +if get(g:, 'falcon_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal softtabstop=4 shiftwidth=4 +endif setlocal suffixesadd=.fal,.ftd " Matchit support diff --git a/runtime/ftplugin/gdscript.vim b/runtime/ftplugin/gdscript.vim index d1f41c8eaf..b52dd00272 100644 --- a/runtime/ftplugin/gdscript.vim +++ b/runtime/ftplugin/gdscript.vim @@ -5,6 +5,7 @@ vim9script # Maintainer: Maxim Kim # Website: https://github.com/habamax/vim-gdscript # Last Change: 2024 Jul 14 +# 2026 Jun 27 by Vim Project (normalize recommended style guard) if exists("b:did_ftplugin") | finish | endif @@ -23,7 +24,7 @@ setlocal commentstring=#\ %s setlocal foldignore= setlocal foldexpr=GDScriptFoldLevel() -if get(g:, 'gdscript_recommended_style', 1) +if get(g:, 'gdscript_recommended_style', get(g:, 'filetype_recommended_style', 1)) setlocal noexpandtab tabstop=4 softtabstop=0 shiftwidth=0 b:undo_ftplugin ..= ' | setlocal expandtab< tabstop< softtabstop< shiftwidth<' endif diff --git a/runtime/ftplugin/gleam.vim b/runtime/ftplugin/gleam.vim index fb3ae8bb34..c89665acbb 100644 --- a/runtime/ftplugin/gleam.vim +++ b/runtime/ftplugin/gleam.vim @@ -5,6 +5,7 @@ " Based On: https://github.com/gleam-lang/gleam.vim " Last Change: 2025 Apr 21 " 2026 Feb 13 by Vim Project (remove 'formatprg' #19108) +" 2026 Jun 27 by Vim Project (normalize recommended style guard) if exists('b:did_ftplugin') finish @@ -16,7 +17,8 @@ setlocal commentstring=//\ %s setlocal suffixesadd=.gleam let b:undo_ftplugin = "setlocal com< cms< sua<" -if get(g:, "gleam_recommended_style", 1) +if get(g:, 'gleam_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal expandtab setlocal shiftwidth=2 setlocal smartindent diff --git a/runtime/ftplugin/go.vim b/runtime/ftplugin/go.vim index 6559ad1011..606e75771e 100644 --- a/runtime/ftplugin/go.vim +++ b/runtime/ftplugin/go.vim @@ -9,6 +9,7 @@ " 2025 Jul 02 by Vim Project (add section movement mappings #17641) " 2025 Jul 05 by Vim Project (update b:undo_ftplugin #17664) " 2026 Feb 13 by Vim Project (remove formatprg #19108) +" 2026 Jun 27 by Vim Project (normalize recommended style guard) if exists('b:did_ftplugin') finish @@ -29,7 +30,8 @@ command! -buffer -nargs=* GoKeywordPrg call s:GoKeywordPrg() let b:undo_ftplugin = 'setl fo< com< cms< kp<' \ . '| delcommand -buffer GoKeywordPrg' -if get(g:, 'go_recommended_style', 1) +if get(g:, 'go_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal noexpandtab softtabstop=0 shiftwidth=0 let b:undo_ftplugin .= ' | setl et< sts< sw<' endif diff --git a/runtime/ftplugin/graphql.vim b/runtime/ftplugin/graphql.vim index 1717ebf2cc..c5ed37b5a4 100644 --- a/runtime/ftplugin/graphql.vim +++ b/runtime/ftplugin/graphql.vim @@ -5,6 +5,7 @@ " URL: https://github.com/jparise/vim-graphql " License: MIT " Last Change: 2024 Dec 21 +" 2026 Jun 27 by Vim Project (add recommended style guard) if exists('b:did_ftplugin') finish @@ -15,8 +16,11 @@ setlocal comments=:# setlocal commentstring=#\ %s setlocal formatoptions-=t setlocal iskeyword+=$,@-@ -setlocal softtabstop=2 -setlocal shiftwidth=2 -setlocal expandtab +if get(g:, 'graphql_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal softtabstop=2 + setlocal shiftwidth=2 + setlocal expandtab +endif let b:undo_ftplugin = 'setlocal com< cms< fo< isk< sts< sw< et<' diff --git a/runtime/ftplugin/hare.vim b/runtime/ftplugin/hare.vim index ebd7fbdcc3..1d162d6ad8 100644 --- a/runtime/ftplugin/hare.vim +++ b/runtime/ftplugin/hare.vim @@ -4,6 +4,7 @@ vim9script # Language: Hare # Maintainer: Amelia Clarke # Last Change: 2026 Jan 24 +# 2026 Jun 27 by Vim Project (normalize recommended style guard) # Upstream: https://git.sr.ht/~sircmpwn/hare.vim if exists('b:did_ftplugin') @@ -30,7 +31,7 @@ setlocal isfname+=: b:undo_ftplugin ..= ' | setl inc< inex< isf< pa<' # Follow the official style guide by default. -if get(g:, 'hare_recommended_style', 1) +if get(g:, 'hare_recommended_style', get(g:, 'filetype_recommended_style', 1)) setlocal noexpandtab setlocal shiftwidth=8 setlocal softtabstop=0 diff --git a/runtime/ftplugin/haredoc.vim b/runtime/ftplugin/haredoc.vim index 04cabfb4b5..1ab7e947dd 100644 --- a/runtime/ftplugin/haredoc.vim +++ b/runtime/ftplugin/haredoc.vim @@ -4,6 +4,7 @@ vim9script # Language: Haredoc (Hare documentation format) # Maintainer: Amelia Clarke # Last Change: 2026 Jan 24 +# 2026 Jun 27 by Vim Project (normalize recommended style guard) # Upstream: https://git.sr.ht/~sircmpwn/hare.vim if exists('b:did_ftplugin') @@ -29,7 +30,7 @@ setlocal isfname+=: b:undo_ftplugin ..= ' | setl inex< isf< pa<' # Follow the official style guide by default. -if get(g:, 'hare_recommended_style', 1) +if get(g:, 'hare_recommended_style', get(g:, 'filetype_recommended_style', 1)) setlocal noexpandtab setlocal shiftwidth=8 setlocal softtabstop=0 diff --git a/runtime/ftplugin/heex.vim b/runtime/ftplugin/heex.vim index 2f53d22ee6..2bb8eaa9ee 100644 --- a/runtime/ftplugin/heex.vim +++ b/runtime/ftplugin/heex.vim @@ -3,6 +3,7 @@ " Maintainer: Mitchell Hanberg " Last Change: 2022 Sep 21 " 2025 Apr 16 by Vim Project (set 'cpoptions' for line continuation, #17121) +" 2026 Jun 27 by Vim Project (add recommended style guard) if exists("b:did_ftplugin") finish @@ -12,7 +13,10 @@ let b:did_ftplugin = 1 let s:cpo_save = &cpo set cpo&vim -setlocal shiftwidth=2 softtabstop=2 expandtab +if get(g:, 'heex_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal shiftwidth=2 softtabstop=2 expandtab +endif setlocal comments=:<%!-- setlocal commentstring=<%!--\ %s\ --%> diff --git a/runtime/ftplugin/idris2.vim b/runtime/ftplugin/idris2.vim index 54e5acef90..1638b32fb6 100644 --- a/runtime/ftplugin/idris2.vim +++ b/runtime/ftplugin/idris2.vim @@ -1,6 +1,7 @@ " Vim ftplugin file " Language: Idris 2 " Last Change: 2024 Nov 05 +" 2026 Jun 27 by Vim Project (add recommended style guard) " Maintainer: Idris Hackers (https://github.com/edwinb/idris2-vim), Serhii Khoma " License: Vim (see :h license) " Repository: https://github.com/ShinKage/idris2-nvim @@ -11,8 +12,11 @@ if exists("b:did_ftplugin") finish endif -setlocal shiftwidth=2 -setlocal tabstop=2 +if get(g:, 'idris2_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal shiftwidth=2 + setlocal tabstop=2 +endif " Set g:idris2#allow_tabchar = 1 to use tabs instead of spaces if exists('g:idris2#allow_tabchar') && g:idris2#allow_tabchar != 0 diff --git a/runtime/ftplugin/markdown.vim b/runtime/ftplugin/markdown.vim index d4ee5ac242..c8f9d57fd5 100644 --- a/runtime/ftplugin/markdown.vim +++ b/runtime/ftplugin/markdown.vim @@ -3,6 +3,7 @@ " Maintainer: Tim Pope " Last Change: 2023 Dec 28 " 2024 May 24 by Riley Bruins ('commentstring') +" 2026 Jun 27 by Vim Project (normalize recommended style guard) if exists("b:did_ftplugin") finish @@ -23,7 +24,8 @@ else let b:undo_ftplugin = "setl cms< com< fo< flp< et< ts< sts< sw<" endif -if get(g:, 'markdown_recommended_style', 1) +if get(g:, 'markdown_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4 endif diff --git a/runtime/ftplugin/mermaid.vim b/runtime/ftplugin/mermaid.vim index 5547ad3e1f..a9ac9d521e 100644 --- a/runtime/ftplugin/mermaid.vim +++ b/runtime/ftplugin/mermaid.vim @@ -3,6 +3,7 @@ " Maintainer: Craig MacEachern " Last Change: 2022 Oct 13 " 2024 Jul 18 by Vim Project (adjust comments) +" 2026 Jun 27 by Vim Project (add recommended style guard) if exists("b:did_ftplugin") finish @@ -12,10 +13,13 @@ let s:keepcpo= &cpo set cpo&vim " Use mermaid live editor's style -setlocal expandtab -setlocal shiftwidth=2 -setlocal softtabstop=-1 -setlocal tabstop=4 +if get(g:, 'mermaid_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab + setlocal shiftwidth=2 + setlocal softtabstop=-1 + setlocal tabstop=4 +endif setlocal comments=:%% setlocal commentstring=%%\ %s diff --git a/runtime/ftplugin/meson.vim b/runtime/ftplugin/meson.vim index 17ffd5320a..6f700a8d6a 100644 --- a/runtime/ftplugin/meson.vim +++ b/runtime/ftplugin/meson.vim @@ -5,6 +5,7 @@ " Original Author: Laurent Pinchart " Last Change: 2018 Nov 27 " 2024 Jan 14 by Vim Project (browsefilter) +" 2026 Jun 27 by Vim Project (normalize recommended style guard) if exists("b:did_ftplugin") | finish | endif let b:did_ftplugin = 1 @@ -17,7 +18,8 @@ setlocal formatoptions+=croql formatoptions-=t let b:undo_ftplugin = "setl com< cms< fo<" -if get(g:, "meson_recommended_style", 1) +if get(g:, 'meson_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal expandtab setlocal shiftwidth=2 setlocal softtabstop=2 diff --git a/runtime/ftplugin/occam.vim b/runtime/ftplugin/occam.vim index 1404c0ea33..b4dfaa1c45 100644 --- a/runtime/ftplugin/occam.vim +++ b/runtime/ftplugin/occam.vim @@ -5,6 +5,7 @@ " Last Change: 23 April 2003 " 2024 Jan 14 by Vim Project (browsefilter) " 2025 Jun 08 by Riley Bruins ('commentstring') +" 2026 Jun 27 by Vim Project (add recommended style guard) " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -15,12 +16,15 @@ let s:keepcpo= &cpo set cpo&vim "{{{ Indent settings -" Set shift width for indent -setlocal shiftwidth=2 -" Set the tab key size to two spaces -setlocal softtabstop=2 -" Let tab keys always be expanded to spaces -setlocal expandtab +if get(g:, 'occam_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + " Set shift width for indent + setlocal shiftwidth=2 + " Set the tab key size to two spaces + setlocal softtabstop=2 + " Let tab keys always be expanded to spaces + setlocal expandtab +endif "}}} "{{{ Formatting @@ -28,8 +32,11 @@ setlocal expandtab setlocal formatoptions-=t formatoptions+=cql setlocal comments+=:-- setlocal commentstring=--\ %s -" Maximum length of comments is 78 -setlocal textwidth=78 +if get(g:, 'occam_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + " Maximum length of comments is 78 + setlocal textwidth=78 +endif "}}} "{{{ File browsing filters diff --git a/runtime/ftplugin/python.vim b/runtime/ftplugin/python.vim index 6f20468896..50d86537d9 100644 --- a/runtime/ftplugin/python.vim +++ b/runtime/ftplugin/python.vim @@ -6,6 +6,7 @@ " Repository: https://github.com/tpict/vim-ftplugin-python " Last Change: 2024/05/13 " 2024 Nov 30 use pytest compiler (#16130) +" 2026 Jun 27 by Vim Project (normalize recommended style guard) if exists("b:did_ftplugin") | finish | endif let b:did_ftplugin = 1 @@ -119,7 +120,8 @@ if has("browsefilter") && !exists("b:browsefilter") endif endif -if !exists("g:python_recommended_style") || g:python_recommended_style != 0 +if get(g:, 'python_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) " As suggested by PEP8. setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4 endif diff --git a/runtime/ftplugin/racket.vim b/runtime/ftplugin/racket.vim index 000f0ea3b3..70e0ccdc3f 100644 --- a/runtime/ftplugin/racket.vim +++ b/runtime/ftplugin/racket.vim @@ -6,6 +6,7 @@ " Last Change: 2025 Aug 09 " 2026 Mar 31 by Vim project: use shellescape for the K mapping " 2026 Apr 01 by Vim project: make K mapping more robust for shell injection +" 2026 Jun 27 by Vim Project: add recommended style guard if exists("b:did_ftplugin") finish @@ -18,7 +19,10 @@ set cpo&vim " quick hack to allow adding values setlocal iskeyword=@,!,#-',*-:,<-Z,a-z,~,_,94 -setlocal shiftwidth=2 softtabstop=2 +if get(g:, 'racket_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal shiftwidth=2 softtabstop=2 +endif " Enable auto begin new comment line when continuing from an old comment line setlocal comments=:;;;;,:;;;,:;;,:; diff --git a/runtime/ftplugin/ruby.vim b/runtime/ftplugin/ruby.vim index ab0a32576c..8a63dce1e0 100644 --- a/runtime/ftplugin/ruby.vim +++ b/runtime/ftplugin/ruby.vim @@ -4,6 +4,7 @@ " URL: https://github.com/vim-ruby/vim-ruby " Last Change: 2023 Dec 31 " 2024 Jan 14 by Vim Project (browsefilter) +" 2026 Jun 27 by Vim Project (normalize recommended style guard) if (exists("b:did_ftplugin")) finish @@ -160,7 +161,8 @@ let b:undo_ftplugin = "setl inc= sua= path= tags= fo< com< cms< kp=" \."| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip" \."| if exists('&ofu') && has('ruby') | setl ofu< | endif" -if get(g:, 'ruby_recommended_style', 1) +if get(g:, 'ruby_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal shiftwidth=2 softtabstop=2 expandtab let b:undo_ftplugin .= ' | setl sw< sts< et<' endif diff --git a/runtime/ftplugin/rust.vim b/runtime/ftplugin/rust.vim index 4765f81704..38c33fd5b2 100644 --- a/runtime/ftplugin/rust.vim +++ b/runtime/ftplugin/rust.vim @@ -4,6 +4,7 @@ " Last Change: 2024 Mar 17 " 2024 May 23 by Riley Bruins " Last Change: 2023 Dec 28 +" 2026 Jun 27 by Vim Project normalize recommended style guard " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -23,7 +24,8 @@ if &filetype =~# '\' let b:undo_ftplugin .= ' isk<' endif -if get(g:, 'sass_recommended_style', 1) +if get(g:, 'sass_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal shiftwidth=2 softtabstop=2 expandtab let b:undo_ftplugin .= ' sw< sts< et<' endif diff --git a/runtime/ftplugin/scala.vim b/runtime/ftplugin/scala.vim index 769499cfc1..0720b8849b 100644 --- a/runtime/ftplugin/scala.vim +++ b/runtime/ftplugin/scala.vim @@ -5,6 +5,7 @@ " License: Same as Vim " Last Change: 11 August 2021 " 2023 Aug 28 by Vim Project (undo_ftplugin) +" 2026 Jun 27 by Vim Project (add recommended style guard) " ---------------------------------------------------------------------------- if exists('b:did_ftplugin') || &cp @@ -25,7 +26,10 @@ else endif setlocal commentstring=//\ %s -setlocal shiftwidth=2 softtabstop=2 expandtab +if get(g:, 'scala_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal shiftwidth=2 softtabstop=2 expandtab +endif setlocal include=^\\s*import setlocal includeexpr=substitute(v:fname,'\\.','/','g') diff --git a/runtime/ftplugin/swift.vim b/runtime/ftplugin/swift.vim index a86b782c22..0bf72f23ab 100644 --- a/runtime/ftplugin/swift.vim +++ b/runtime/ftplugin/swift.vim @@ -8,6 +8,7 @@ " " Vim maintainer: Emir SARI " Last Change: 2021 Jan 08 +" 2026 Jun 27 by Vim Project (add recommended style guard) " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -18,6 +19,9 @@ let b:did_ftplugin = 1 let b:undo_ftplugin = "setlocal comments< expandtab< tabstop< shiftwidth< smartindent<" setlocal comments=s1:/*,mb:*,ex:*/,:///,:// -setlocal expandtab -setlocal sw=4 sts=4 +if get(g:, 'swift_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab + setlocal sw=4 sts=4 +endif setlocal smartindent diff --git a/runtime/ftplugin/tera.vim b/runtime/ftplugin/tera.vim index ce4134ae03..a1ea7e5a32 100644 --- a/runtime/ftplugin/tera.vim +++ b/runtime/ftplugin/tera.vim @@ -3,6 +3,7 @@ " Maintainer: Muntasir Mahmud " Last Change: 2025 Mar 08 " 2025 Apr 16 by Vim Project (set 'cpoptions' for line continuation, #17121) +" 2026 Jun 27 by Vim Project (add recommended style guard) if exists("b:did_ftplugin") finish @@ -25,9 +26,12 @@ endif setlocal includeexpr=substitute(v:fname,'\\([^.]*\\)$','\\1','g') setlocal suffixesadd=.tera -setlocal expandtab -setlocal shiftwidth=2 -setlocal softtabstop=2 +if get(g:, 'tera_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab + setlocal shiftwidth=2 + setlocal softtabstop=2 +endif let b:undo_ftplugin = "setlocal autoindent< commentstring< comments< " .. \ "includeexpr< suffixesadd< expandtab< shiftwidth< softtabstop<" diff --git a/runtime/ftplugin/tolk.vim b/runtime/ftplugin/tolk.vim index f1339b7b6c..fa184350b0 100644 --- a/runtime/ftplugin/tolk.vim +++ b/runtime/ftplugin/tolk.vim @@ -3,6 +3,7 @@ " Maintainer: redavy " Upstream: https://github.com/redavy/vim-tolk " Last Update: 24 May 2026 +" 27 Jun 2026 by Vim Project (normalize recommended style guard) if exists("b:did_ftplugin") finish @@ -11,7 +12,8 @@ let b:did_ftplugin = 1 setlocal commentstring=//\ %s -if get(g:, 'tolk_recommended_style', get(g:, 'recommended_style', 1)) +if get(g:, 'tolk_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal tabstop=2 setlocal shiftwidth=2 setlocal expandtab diff --git a/runtime/ftplugin/yaml.vim b/runtime/ftplugin/yaml.vim index 12036a86aa..bb8cb84475 100644 --- a/runtime/ftplugin/yaml.vim +++ b/runtime/ftplugin/yaml.vim @@ -3,6 +3,7 @@ " Previous Maintainer: Nikolai Weibull (inactive) " Last Change: 2024 Oct 04 " 2025 Apr 22 by Vim project re-order b:undo_ftplugin (#17179) +" 2026 Jun 27 by Vim Project normalize recommended style guard if exists("b:did_ftplugin") finish @@ -17,7 +18,8 @@ let b:undo_ftplugin = "setl com< cms< et< fo<" setlocal comments=:# commentstring=#\ %s expandtab setlocal formatoptions-=t formatoptions+=croql -if get(g:, "yaml_recommended_style",1) +if get(g:, 'yaml_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) let b:undo_ftplugin ..= " sw< sts<" setlocal shiftwidth=2 softtabstop=2 endif diff --git a/runtime/ftplugin/zig.vim b/runtime/ftplugin/zig.vim index 55c3008c8f..682abb56f3 100644 --- a/runtime/ftplugin/zig.vim +++ b/runtime/ftplugin/zig.vim @@ -2,6 +2,7 @@ " Language: Zig " Maintainer: Mathias Lindgren " Last Change: 2024 Oct 04 +" 2026 Jun 27 by Vim Project (normalize recommended style guard) " Based on: https://codeberg.org/ziglang/zig.vim if exists("b:did_ftplugin") @@ -20,7 +21,8 @@ setlocal suffixesadd=.zig,.zir,.zon let &l:define='\v(|||^\s*\#\s*define)' let b:undo_ftplugin = 'setl isk< fo< sua< mp< def<' -if get(g:, 'zig_recommended_style', 1) +if get(g:, 'zig_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) setlocal expandtab setlocal tabstop=8 setlocal softtabstop=4 From 8ce43ea4e3cb315f566bcd9048c254ba58042964 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 28 Jun 2026 16:24:13 +0000 Subject: [PATCH 052/647] patch 9.2.0739: completion: 'autocompletedelay' blocks the main loop and drops autocommands Problem: With a non-zero 'autocompletedelay', Insert-mode autocommands (TextChangedI, TextChangedP, CursorMovedI) are delayed, and while typing faster than the delay they are dropped entirely, because the delay blocks the main loop. Solution: Make 'autocompletedelay' non-blocking: instead of busy-waiting before showing the popup menu, defer it with an input-wait timeout (K_COMPLETE_DELAY) modeled on CursorHoldI, so typing stays responsive and the Insert-mode autocommands fire normally. The delay timer coexists with 'updatetime': the main loop waits for the sooner of the two and triggers the event whose deadline was reached, so 'autocompletedelay' no longer shadows CursorHold timing. Changing the completion leader, for example with Backspace, updates the visible popup immediately like a zero delay; only the first popup is deferred. Update the 'autocompletedelay' screendumps for the non-blocking display. One test opened the menu with CTRL-N right after the delay expired and could race with the deferred popup, so it now waits a little longer than the delay before sending the key. fixes: #20591 closes: #20598 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/edit.c | 27 ++++++- src/getchar.c | 7 +- src/insexpand.c | 79 +++++++++---------- src/keymap.h | 2 + src/proto/insexpand.pro | 3 + .../dumps/Test_autocompletedelay_2.dump | 2 +- .../dumps/Test_autocompletedelay_3.dump | 2 +- .../dumps/Test_autocompletedelay_5.dump | 6 +- .../Test_autocompletedelay_longest_1.dump | 4 +- .../Test_autocompletedelay_longest_3.dump | 4 +- .../Test_autocompletedelay_preinsert_1.dump | 4 +- src/testdir/test_ins_complete.vim | 6 +- src/ui.c | 32 +++++++- src/version.c | 2 + 14 files changed, 121 insertions(+), 59 deletions(-) diff --git a/src/edit.c b/src/edit.c index c10654e368..1860ba3716 100644 --- a/src/edit.c +++ b/src/edit.c @@ -100,12 +100,16 @@ static int ins_need_undo; // call u_save() before inserting a static int dont_sync_undo = FALSE; // CTRL-G U prevents syncing undo for // the next left/right cursor key +// With 'autocompletedelay' set, arm the delay and let the main loop fire +// Insert-mode autocommands; the popup is shown later on K_COMPLETE_DELAY. +// Otherwise trigger completion right away. #define TRIGGER_AUTOCOMPLETE() \ do { \ update_screen(UPD_VALID); /* Show char (deletion) immediately */ \ out_flush(); \ ins_compl_enable_autocomplete(); \ - goto docomplete; \ + if (!ins_compl_arm_autocomplete_delay())\ + goto docomplete; \ } while (0) #define MAY_TRIGGER_AUTOCOMPLETE(c) \ @@ -601,7 +605,7 @@ edit( /* * Get a character for Insert mode. Ignore K_IGNORE and K_NOP. */ - if (c != K_CURSORHOLD) + if (c != K_CURSORHOLD && c != K_COMPLETE_DELAY) lastc = c; // remember the previous char for CTRL-D // After using CTRL-G U the next cursor key will not break undo. @@ -632,7 +636,10 @@ edit( if (p_hkmap) c = hkmap(c); // Hebrew mode mapping #endif - goto docomplete; + // Defer until the delay expires (K_COMPLETE_DELAY), or + // trigger now when no delay is in effect. + if (!ins_compl_arm_autocomplete_delay()) + goto docomplete; } } } @@ -1163,6 +1170,19 @@ edit( dont_sync_undo = MAYBE; break; + case K_COMPLETE_DELAY: // 'autocompletedelay' expired + ins_compl_clear_autocomplete_delay(); + if (!ins_compl_has_autocomplete() || char_avail() + || curwin->w_cursor.col == 0) + break; + c = char_before_cursor(); + if (!vim_isprintc(c)) + break; + // The completion may have been cleared while waiting, so re-enable + // autocomplete to match a zero delay. + ins_compl_enable_autocomplete(); + goto docomplete; + #ifdef FEAT_GUI_MSWIN // On MS-Windows ignore , we get it when closing the window // was cancelled. @@ -1408,6 +1428,7 @@ edit( goto normalchar; docomplete: + ins_compl_clear_autocomplete_delay(); compl_busy = TRUE; #ifdef FEAT_FOLDING disable_fold_update++; // don't redraw folds here diff --git a/src/getchar.c b/src/getchar.c index 25422be0d1..309c0d7c15 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -4195,8 +4195,11 @@ fix_input_buffer(char_u *buf, int len) else #endif if (p[0] == NUL || (p[0] == K_SPECIAL - // timeout may generate K_CURSORHOLD - && (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD) + // timeout may generate K_CURSORHOLD, + // 'autocompletedelay' timeout K_COMPLETE_DELAY + && (i < 2 || p[1] != KS_EXTRA + || (p[2] != (int)KE_CURSORHOLD + && p[2] != (int)KE_COMPLETE_DELAY)) #if defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL)) // Win32 console passes modifiers && ( diff --git a/src/insexpand.c b/src/insexpand.c index f5ad940081..0361d9a6e7 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -205,6 +205,7 @@ static buf_T *compl_curr_buf = NULL; // buf where completion is active // longer fixed timeout is used (COMPL_FUNC_TIMEOUT_MS or // COMPL_FUNC_TIMEOUT_NON_KW_MS). - girish static int compl_autocomplete = FALSE; // whether autocompletion is active +static bool compl_autocomplete_pending = false; static int compl_timeout_ms = COMPL_INITIAL_TIMEOUT_MS; static int compl_time_slice_expired = FALSE; // time budget exceeded for current source static int compl_from_nonkeyword = FALSE; // completion started from non-keyword @@ -2609,7 +2610,9 @@ ins_compl_new_leader(void) compl_enter_selects = !compl_used_match && compl_selected_item != -1; - // Show the popup menu with a different set of matches. + // Show the popup menu with a different set of matches. With + // 'autocompletedelay' the menu is already visible here, so update it + // immediately rather than re-arming the delay, like a zero delay does. if (!compl_interrupted) show_pum(save_w_wrow, save_w_leftcol); @@ -7295,13 +7298,6 @@ ins_complete(int c, int enable_pum) int save_w_leftcol; int insert_match; int no_matches_found; -#ifdef ELAPSED_FUNC - elapsed_T compl_start_tv = {0}; // Time when match collection starts - int disable_ac_delay; - - disable_ac_delay = compl_started && ctrl_x_mode_normal() - && (c == Ctrl_N || c == Ctrl_P || c == Ctrl_R || ins_compl_pum_key(c)); -#endif compl_direction = ins_compl_key2dir(c); insert_match = ins_compl_use_match(c); @@ -7314,10 +7310,6 @@ ins_complete(int c, int enable_pum) else if (insert_match && stop_arrow() == FAIL) return FAIL; -#ifdef ELAPSED_FUNC - if (compl_autocomplete && p_acl > 0 && !disable_ac_delay) - ELAPSED_INIT(compl_start_tv); -#endif compl_curr_win = curwin; compl_curr_buf = curwin->w_buffer; compl_shown_match = compl_curr_match; @@ -7373,34 +7365,6 @@ ins_complete(int c, int enable_pum) if (!shortmess(SHM_COMPLETIONMENU) && !compl_autocomplete) ins_compl_show_statusmsg(); - // Wait for the autocompletion delay to expire -#ifdef ELAPSED_FUNC - if (compl_autocomplete && p_acl > 0 && !disable_ac_delay - && !no_matches_found && ELAPSED_FUNC(compl_start_tv) < p_acl) - { - cursor_on(); - setcursor(); - out_flush_cursor(FALSE, FALSE); - do - { - if (char_avail()) - { - if (ins_compl_preinsert_effect() - && ins_compl_win_active(curwin)) - { - ins_compl_delete(); // Remove pre-inserted text - compl_ins_end_col = compl_col; - } - ins_compl_restart(); - compl_interrupted = TRUE; - break; - } - else - ui_delay(2L, TRUE); - } while (ELAPSED_FUNC(compl_start_tv) < p_acl); - } -#endif - // Show the popup menu, unless we got interrupted. if (enable_pum && !compl_interrupted) show_pum(save_w_wrow, save_w_leftcol); @@ -7423,6 +7387,41 @@ ins_compl_enable_autocomplete(void) #endif } +/* + * Arm the 'autocompletedelay' timer when the delay is in effect. + * Return true when the popup should be deferred, false to trigger it now. + */ + bool +ins_compl_arm_autocomplete_delay(void) +{ +#ifdef ELAPSED_FUNC + if (p_acl > 0) + { + compl_autocomplete_pending = true; + return true; + } +#endif + return false; +} + +/* + * Clear the pending 'autocompletedelay' state. + */ + void +ins_compl_clear_autocomplete_delay(void) +{ + compl_autocomplete_pending = false; +} + +/* + * Return true while waiting for 'autocompletedelay' to expire. + */ + bool +ins_compl_autocomplete_pending(void) +{ + return compl_autocomplete_pending; +} + /* * Remove (if needed) and show the popup menu */ diff --git a/src/keymap.h b/src/keymap.h index b3be60c48d..a8c9e275c0 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -281,6 +281,7 @@ enum key_extra , KE_ESC = 107 // used for K_ESC , KE_WILD = 108 // triggers wildmode completion , KE_OSC = 109 // finished OSC sequence + , KE_COMPLETE_DELAY = 110 // 'autocompletedelay' expired }; /* @@ -489,6 +490,7 @@ enum key_extra #define K_FOCUSLOST TERMCAP2KEY(KS_EXTRA, KE_FOCUSLOST) #define K_CURSORHOLD TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLD) +#define K_COMPLETE_DELAY TERMCAP2KEY(KS_EXTRA, KE_COMPLETE_DELAY) #define K_COMMAND TERMCAP2KEY(KS_EXTRA, KE_COMMAND) #define K_SCRIPT_COMMAND TERMCAP2KEY(KS_EXTRA, KE_SCRIPT_COMMAND) diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index 2c1882dc19..b574652aaf 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -76,6 +76,9 @@ void ins_compl_insert(int move_cursor, int insert_prefix); void ins_compl_check_keys(int frequency, int in_compl_func); int ins_complete(int c, int enable_pum); void ins_compl_enable_autocomplete(void); +bool ins_compl_arm_autocomplete_delay(void); +void ins_compl_clear_autocomplete_delay(void); +bool ins_compl_autocomplete_pending(void); void free_insexpand_stuff(void); void f_preinserted(typval_T *argvars, typval_T *rettv); /* vim: set ft=c : */ diff --git a/src/testdir/dumps/Test_autocompletedelay_2.dump b/src/testdir/dumps/Test_autocompletedelay_2.dump index 65dc8f42ea..0dd4850d0c 100644 --- a/src/testdir/dumps/Test_autocompletedelay_2.dump +++ b/src/testdir/dumps/Test_autocompletedelay_2.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|2| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_3.dump b/src/testdir/dumps/Test_autocompletedelay_3.dump index d3ed65d902..ffc63d3873 100644 --- a/src/testdir/dumps/Test_autocompletedelay_3.dump +++ b/src/testdir/dumps/Test_autocompletedelay_3.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|3| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_5.dump b/src/testdir/dumps/Test_autocompletedelay_5.dump index 0dd4850d0c..c792e09ea9 100644 --- a/src/testdir/dumps/Test_autocompletedelay_5.dump +++ b/src/testdir/dumps/Test_autocompletedelay_5.dump @@ -2,9 +2,9 @@ |f|o@1|b|a|r| @68 |f|o@1|b|a|r|b|a|z| @65 |f> @73 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 +|f+0#0000001#ffd7ff255|o@1|b|a|r|b|a|z| @5| +0#4040ff13#ffffff0@59 +|f+0#0000001#ffd7ff255|o@1|b|a|r| @8| +0#4040ff13#ffffff0@59 +|f+0#0000001#ffd7ff255|o@1| @11| +0#4040ff13#ffffff0@59 |~| @73 |~| @73 |-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|2| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_longest_1.dump b/src/testdir/dumps/Test_autocompletedelay_longest_1.dump index 10a50793cc..6ac0522388 100644 --- a/src/testdir/dumps/Test_autocompletedelay_longest_1.dump +++ b/src/testdir/dumps/Test_autocompletedelay_longest_1.dump @@ -1,10 +1,10 @@ |a+0&#ffffff0|u|t|o|c|o|m|p|l|e|t|e| @62 |a|u|t|o|c|o|m|x@2| @64 -|a|u|t|o|c>o+0#00e0003&|m| +0#0000000&@67 +|a|u|t|o|c> @69 |~+0#4040ff13&| @73 |~| @73 |~| @73 |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|T|o|p| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|6| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_longest_3.dump b/src/testdir/dumps/Test_autocompletedelay_longest_3.dump index 52bda2c30c..8149ef5906 100644 --- a/src/testdir/dumps/Test_autocompletedelay_longest_3.dump +++ b/src/testdir/dumps/Test_autocompletedelay_longest_3.dump @@ -1,10 +1,10 @@ |a+0&#ffffff0|u|t|o|c|o|m|p|l|e|t|e| @62 |a|u|t|o|c|o|m|x@2| @64 -|a|u>t+0#00e0003&|o|c|o|m| +0#0000000&@67 +|a|u> @72 |~+0#4040ff13&| @73 |~| @73 |~| @73 |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|3| @10|A|l@1| diff --git a/src/testdir/dumps/Test_autocompletedelay_preinsert_1.dump b/src/testdir/dumps/Test_autocompletedelay_preinsert_1.dump index 3b1bc4bbd5..8149ef5906 100644 --- a/src/testdir/dumps/Test_autocompletedelay_preinsert_1.dump +++ b/src/testdir/dumps/Test_autocompletedelay_preinsert_1.dump @@ -1,10 +1,10 @@ |a+0&#ffffff0|u|t|o|c|o|m|p|l|e|t|e| @62 |a|u|t|o|c|o|m|x@2| @64 -|a|u>t+0#00e0003&|o|c|o|m|p|l|e|t|e| +0#0000000&@62 +|a|u> @72 |~+0#4040ff13&| @73 |~| @73 |~| @73 |~| @73 |~| @73 |~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|1| @10|A|l@1| +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|3|,|3| @10|A|l@1| diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 4df2efb061..d4298aeb96 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -5954,10 +5954,12 @@ func Test_autocompletedelay() call term_sendkeys(buf, "Sf\") call VerifyScreenDump(buf, 'Test_autocompletedelay_7', {}) - " After the menu is open, ^N/^P and Up/Down should not delay + " After the menu is open, ^N/^P and Up/Down should not delay. + " Wait a bit longer than 'autocompletedelay' so the popup is surely shown + " before sending CTRL-N, otherwise the keys race with the deferred popup. call term_sendkeys(buf, "\:set completeopt=menu noruler\") call term_sendkeys(buf, "\Sf") - sleep 500ms + sleep 600ms call term_sendkeys(buf, "\") call VerifyScreenDump(buf, 'Test_autocompletedelay_8', {}) call term_sendkeys(buf, "\") diff --git a/src/ui.c b/src/ui.c index f277ba4075..3ba656d3a5 100644 --- a/src/ui.c +++ b/src/ui.c @@ -301,13 +301,20 @@ inchar_loop( return 0; } # endif - if (wtime < 0 && did_start_blocking) + // When an autocomplete is pending, wake at the sooner of + // 'autocompletedelay' and 'updatetime' so the delay does not postpone + // CursorHold. Once CursorHold has fired, only the delay is left. + bool delay_pending = ins_compl_autocomplete_pending() && p_acl > 0; + + if (wtime < 0 && did_start_blocking && !delay_pending) // blocking and already waited for p_ut wait_time = -1; else { if (wtime >= 0) wait_time = wtime; + else if (delay_pending) + wait_time = did_start_blocking ? p_acl : MIN(p_acl, p_ut); else // going to block after p_ut wait_time = p_ut; @@ -325,6 +332,29 @@ inchar_loop( // no character available within "wtime" return 0; + // The 'autocompletedelay' expired: trigger the popup. When + // 'updatetime' is shorter, fall through to CursorHold instead. + if (delay_pending && elapsed_time >= p_acl && maxlen >= 3 + && !typebuf_changed(tb_change_cnt)) + { + if (buf == NULL) + { + char_u ibuf[3]; + + ibuf[0] = CSI; + ibuf[1] = KS_EXTRA; + ibuf[2] = (int)KE_COMPLETE_DELAY; + add_to_input_buf(ibuf, 3); + } + else + { + buf[0] = K_SPECIAL; + buf[1] = KS_EXTRA; + buf[2] = (int)KE_COMPLETE_DELAY; + } + return 3; + } + // No character available within 'updatetime'. did_start_blocking = TRUE; if (trigger_cursorhold() && maxlen >= 3 diff --git a/src/version.c b/src/version.c index 7cfc8de777..0ca0f16e8d 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 739, /**/ 738, /**/ From 27865e206ce6bba7cd5fe5ba379ce245e447bc92 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Sun, 28 Jun 2026 16:46:50 +0000 Subject: [PATCH 053/647] patch 9.2.0740: GTK4: scrollbar wrongly displayed Problem: GTK4: scrollbar wrongly displayed Solution: Calculate scrollbar size in gui_mch_enable_scrollbar for gtk4 gui (Foxe Chen) closes: #20628 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.c | 5 -- src/gui_gtk4.c | 122 ++++++++++++++++++++++------------------- src/proto/gui_gtk4.pro | 1 - src/version.c | 2 + 4 files changed, 67 insertions(+), 63 deletions(-) diff --git a/src/gui.c b/src/gui.c index 6e898f1c38..7b08f786ff 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1725,11 +1725,6 @@ gui_set_shellsize( if (!gui.shell_created) return; -#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) - // Get the scrollbar width + height if possible - gui_mch_update_scrollbar_size(); -#endif - #if defined(MSWIN) || defined(FEAT_GUI_GTK) // If not setting to a user specified size and maximized, calculate the // number of characters that fit in the maximized window. diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index e96801eb45..5a4e78481d 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -2766,6 +2766,64 @@ gui_mch_forked(void) { } +/* + * Try getting the actual size of the scrollbar, and update gui.scrollbar_width + * and gui.scrollbar_height. + */ + static void +gui_gtk4_update_scrollbar_size(void) +{ + win_T *wp; + int w = -1, h = -1; + GtkWidget *sbar; + + FOR_ALL_WINDOWS(wp) + { + sbar = wp->w_scrollbars[SBAR_LEFT].id; + + if (sbar == NULL || !gtk_widget_get_visible(sbar) + || (!gui.which_scrollbars[SBAR_LEFT] + && wp->w_scrollbars[SBAR_RIGHT].id != NULL)) + sbar = wp->w_scrollbars[SBAR_RIGHT].id; + + if (sbar != NULL && gtk_widget_get_visible(sbar)) + { + GtkRequisition min, nat; + int sw; + + // Use preferred size, since widget may not have its size allocated + // yet. + gtk_widget_get_preferred_size(sbar, &min, &nat); + sw = MAX(min.width, nat.width); + if (sw > 0) + { + w = sw; + break; + } + } + + } + + sbar = gui.bottom_sbar.id; + if (sbar != NULL && gtk_widget_get_visible(sbar)) + { + GtkRequisition min, nat; + int sh; + + gtk_widget_get_preferred_size(sbar, &min, &nat); + sh = MAX(min.height, nat.height); + + if (sh > 0) + h = sh; + } + + if (w != -1) + gui.scrollbar_width = w; + if (h != -1) + gui.scrollbar_height = h; +} + + /* * ============================================================ * Scrollbar @@ -2776,7 +2834,14 @@ gui_mch_forked(void) gui_mch_enable_scrollbar(scrollbar_T *sb, int flag) { if (sb->id != NULL) + { + gboolean was_visible = gtk_widget_get_visible(sb->id); + gtk_widget_set_visible(sb->id, flag); + + if (!was_visible && flag) + gui_gtk4_update_scrollbar_size(); + } } #if defined(FEAT_MENU) @@ -4658,63 +4723,6 @@ gui_mch_destroy_scrollbar(scrollbar_T *sb) } } -/* - * Try getting the actual size of the scrollbar, and update gui.scrollbar_width - * and gui.scrollbar_height. - */ - void -gui_mch_update_scrollbar_size(void) -{ - win_T *wp; - int w = -1, h = -1; - GtkWidget *sbar; - - FOR_ALL_WINDOWS(wp) - { - sbar = wp->w_scrollbars[SBAR_LEFT].id; - - if (sbar == NULL || !gtk_widget_get_visible(sbar) - || (!gui.which_scrollbars[SBAR_LEFT] - && wp->w_scrollbars[SBAR_RIGHT].id != NULL)) - sbar = wp->w_scrollbars[SBAR_RIGHT].id; - - if (sbar != NULL && gtk_widget_get_visible(sbar)) - { - GtkRequisition min, nat; - int sw; - - // Use preferred size, since widget may not have its size allocated - // yet. - gtk_widget_get_preferred_size(sbar, &min, &nat); - sw = MAX(min.width, nat.width); - if (sw > 0) - { - w = sw; - break; - } - } - - } - - sbar = gui.bottom_sbar.id; - if (sbar != NULL && gtk_widget_get_visible(sbar)) - { - GtkRequisition min, nat; - int sh; - - gtk_widget_get_preferred_size(sbar, &min, &nat); - sh = MAX(min.height, nat.height); - - if (sh > 0) - h = sh; - } - - if (w != -1) - gui.scrollbar_width = w; - if (h != -1) - gui.scrollbar_height = h; -} - /* * ============================================================ * Text area position diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index eaf8eb2686..a40b102260 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -102,7 +102,6 @@ int gui_mch_get_scrollbar_xpadding(void); int gui_mch_get_scrollbar_ypadding(void); void gui_mch_create_scrollbar(scrollbar_T *sb, int orient); void gui_mch_destroy_scrollbar(scrollbar_T *sb); -void gui_mch_update_scrollbar_size(void); void gui_mch_set_text_area_pos(int x, int y, int w, int h); void gui_gtk_calculate_bleed(int width, int height); char_u *gui_mch_browse(int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter); diff --git a/src/version.c b/src/version.c index 0ca0f16e8d..1231556601 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 740, /**/ 739, /**/ From 37d85f5f1ad336fdc63e949c3b2db8ae7be618e4 Mon Sep 17 00:00:00 2001 From: glepnir Date: Sun, 28 Jun 2026 16:51:26 +0000 Subject: [PATCH 054/647] patch 9.2.0741: complete_check() does not return TRUE for mapped input Problem: Mapped typed keys didn't interrupt completion in complete_check() (Yikai Zhao) Solution: Also interrupt when in_compl_func and not replaying a register. (glepnir) closes: #5547 closes: #20643 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/insexpand.c | 7 ++++--- src/testdir/test_ins_complete.vim | 28 ++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/insexpand.c b/src/insexpand.c index 0361d9a6e7..75e55a60eb 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -6408,9 +6408,10 @@ ins_compl_check_keys(int frequency, int in_compl_func) c = safe_vgetc(); if (c != K_IGNORE) { - // Don't interrupt completion when the character wasn't typed, - // e.g., when doing @q to replay keys. - if (c != Ctrl_R && KeyTyped) + // Typed keys that get mapped lose KeyTyped. Still let + // complete_check() interrupt, except during @r replay. + if (c != Ctrl_R && (KeyTyped + || (in_compl_func && reg_executing == 0))) compl_interrupted = TRUE; vungetc(c); diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index d4298aeb96..00fcf4e44d 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6535,4 +6535,32 @@ func Test_call_complete_while_filtering() bwipe! endfunc +func Test_complete_check_mapped_typed_key() + func SlowComplete(findstart, base) + if a:findstart + return col('.') - 1 + endif + call complete_add('foobar') + let g:compl_iterations = 0 + while !complete_check() && g:compl_iterations < 100 + let g:compl_iterations += 1 + sleep 5m + endwhile + return [] + endfunc + + new + setlocal completefunc=SlowComplete + setlocal completeopt=menuone,noselect + inoremap + + let g:compl_iterations = -1 + call feedkeys("Sfoo\\ \", 'tx') + call assert_inrange(0, 99, g:compl_iterations) + + bwipe! + delfunc SlowComplete + unlet g:compl_iterations +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/version.c b/src/version.c index 1231556601..ebe7f97093 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 741, /**/ 740, /**/ From 06512b153cd8b432bb24087143299f082a353885 Mon Sep 17 00:00:00 2001 From: Jay Sitter Date: Sun, 28 Jun 2026 16:59:26 +0000 Subject: [PATCH 055/647] runtime(css): add more missing CSS properties This is defined in the 'CSS Overflow Module Level 3' spec[1] and supported by recent versions of all browsers reported by MDN[2], see the MDN page also for the available values. Link: https://drafts.csswg.org/css-overflow/#scrollbar-gutter-property [1] Link: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/scrollbar-gutter#browser_compatibility [2] related: #20639 closes: #20653 Co-Authored-by: Matthew Hughes Signed-off-by: Jay Sitter Signed-off-by: Christian Brabandt --- runtime/syntax/css.vim | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/runtime/syntax/css.vim b/runtime/syntax/css.vim index 3f28717959..b3510229e7 100644 --- a/runtime/syntax/css.vim +++ b/runtime/syntax/css.vim @@ -11,6 +11,7 @@ " Changelog: " 2025 Nov 11: improve support for cssBoxProperties #18717 " 2026 Feb 13: add missing numeric units (baseline 2015, 2020, 2022, 2023, 2026) #19325 +" 2026 Jun 28: add scrollbar-gutter properties " quit when a syntax file was already loaded if !exists("main_syntax") @@ -203,11 +204,28 @@ syn keyword cssBorderAttr contained clone slice syn match cssBoxProp contained "\" syn match cssBoxProp contained "\" syn match cssBoxProp contained "\<\%(margin\|padding\)\%(-\%(inline\|block\)\%(-\%(start\|end\)\)\=\)\=\>" -syn match cssBoxProp contained "\" syn match cssBoxProp contained "\" syn keyword cssBoxAttr contained visible hidden scroll auto syn match cssBoxAttr contained "\" +"------------------------------------------------ +" CSS Overflow Module Level 3 +" https://www.w3.org/TR/css-overflow-3/ +syn match cssOverflowProp contained "\" + +syn match cssOverflowProp contained "\" +syn keyword cssOverflowAttr contained clip ellipsis + +syn match cssOverflowProp contained "\" +syn keyword cssOverflowAttr contained visible hidden clip scroll auto + +syn match cssOverflowProp contained "\" +syn keyword cssOverflowAttr contained auto stable both-edges + +syn match cssOverflowProp contained "\" +syn keyword cssOverflowAttr contained auto smooth +"------------------------------------------------ + syn keyword cssCascadeProp contained all syn keyword cssCascadeAttr contained initial unset revert @@ -392,7 +410,6 @@ syn keyword cssUIAttr contained invert syn keyword cssUIProp contained icon resize syn keyword cssUIAttr contained both horizontal vertical -syn match cssUIProp contained "\" syn keyword cssUIAttr contained clip ellipsis syn match cssUIProp contained "\" @@ -435,7 +452,7 @@ syn match cssMobileTextProp contained "\" syn keyword cssMediaProp contained width height orientation scan syn keyword cssMediaProp contained any-hover any-pointer color-gamut grid hover -syn keyword cssMediaProp contained overflow-block overflow-inline pointer update +syn keyword cssMediaProp contained pointer update syn match cssMediaProp contained /\<\%(\%(max\|min\)-\)\=\%(\%(device\)-\)\=aspect-ratio\>/ syn match cssMediaProp contained /\<\%(\%(max\|min\)-\)\=device-pixel-ratio\>/ syn match cssMediaProp contained /\<\%(\%(max\|min\)-\)\=device-\%(height\|width\)\>/ @@ -569,6 +586,7 @@ hi def link cssMultiColumnProp cssProp hi def link cssPagedMediaProp cssProp hi def link cssPositioningProp cssProp hi def link cssObjectProp cssProp +hi def link cssOverflowProp cssProp hi def link cssPrintProp cssProp hi def link cssRubyProp cssProp hi def link cssSpeechProp cssProp From 6e66ebc0fdd7804db4baa076e62c78d208adaeaf Mon Sep 17 00:00:00 2001 From: Fionn Fitzmaurice Date: Sun, 28 Jun 2026 17:04:55 +0000 Subject: [PATCH 056/647] patch 9.2.0742: filetype: SSH keys and related filetypes not recognized Problem: filetype: SSH keys and related filetypes not recognized Solution: Detect sshpublickey, sshknownhosts sshauthorizedkeys and sshallowedsigners filetypes, add syntax scripts for those filetypes (Fionn Fitzmaurice) This adds syntax highlighting for SSH public keys, as well as related filetypes derived from this (SSH authorized keys, SSH known hosts and SSH allowed signers). Also add filetype detection based on the path and name. closes: #20635 Signed-off-by: Fionn Fitzmaurice Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 4 ++++ runtime/filetype.vim | 6 ++++++ runtime/syntax/sshallowedsigners.vim | 31 ++++++++++++++++++++++++++++ runtime/syntax/sshauthorizedkeys.vim | 25 ++++++++++++++++++++++ runtime/syntax/sshknownhosts.vim | 27 ++++++++++++++++++++++++ runtime/syntax/sshpublickey.vim | 30 +++++++++++++++++++++++++++ src/testdir/test_filetype.vim | 4 ++++ src/version.c | 2 ++ 8 files changed, 129 insertions(+) create mode 100644 runtime/syntax/sshallowedsigners.vim create mode 100644 runtime/syntax/sshauthorizedkeys.vim create mode 100644 runtime/syntax/sshknownhosts.vim create mode 100644 runtime/syntax/sshpublickey.vim diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index f2200c4ac6..0afec653f2 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -699,8 +699,12 @@ runtime/syntax/sqloracle.vim @chrisbra runtime/syntax/squirrel.vim @zenmatic runtime/syntax/srt.vim @ObserverOfTime runtime/syntax/ssa.vim @ObserverOfTime +runtime/syntax/sshallowedsigners.vim @fionn +runtime/syntax/sshauthorizedkeys.vim @fionn runtime/syntax/sshconfig.vim @Jakuje runtime/syntax/sshdconfig.vim @Jakuje +runtime/syntax/sshpublickey.vim @fionn +runtime/syntax/sshknownhosts.vim @fionn runtime/syntax/sudoers.vim @e-kwsm runtime/syntax/svn.vim @hdima runtime/syntax/swayconfig.vim @jamespeapen diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 7a39bdd8bf..d4baad6d8c 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1107,6 +1107,12 @@ au BufNewFile,BufRead */etc/ssh/ssh_config.d/*.conf setf sshconfig " OpenSSH server configuration au BufNewFile,BufRead */etc/ssh/sshd_config.d/*.conf setf sshdconfig +" OpenSSH public keys, authorized keys, signing keys, host keys +au BufNewFile,BufRead */.ssh/?*.pub,/etc/ssh/?*.pub setf sshpublickey +au BufNewFile,BufRead */.ssh/authorized_keys setf sshauthorizedkeys +au BufNewFile,BufRead */.ssh/known_hosts,/etc/ssh/ssh_known_hosts setf sshknownhosts +au BufNewFile,BufRead allowed_signers,*.allowed_signers setf sshallowedsigners + " OpenVPN configuration au BufNewFile,BufRead */openvpn/*/*.conf setf openvpn diff --git a/runtime/syntax/sshallowedsigners.vim b/runtime/syntax/sshallowedsigners.vim new file mode 100644 index 0000000000..8392747e8a --- /dev/null +++ b/runtime/syntax/sshallowedsigners.vim @@ -0,0 +1,31 @@ +" Vim syntax file +" Language: OpenSSH allowed signers file +" Author: Fionn Fitzmaurice (github.com/fionn) +" Maintainer: Fionn Fitzmaurice (github.com/fionn) +" License: Vim & Apache 2.0 + +if exists("b:current_syntax") + finish +endif + +syn match sshAllowedSignersPrincipal "!\?[a-zA-Z0-9.*?_+-]\+@[a-zA-Z0-9.*?-]\+" nextgroup=sshAllowedSignersPrincipalSeparator,sshAllowedSignersOptions,sshKeyType skipwhite +syn match sshAllowedSignersPrincipalSeparator "," contained nextgroup=sshAllowedSignersPrincipal + +syn region sshAllowedSignersOptions start="[a-z]" end="\s\@=" contains=@sshAllowedSignersOption nextgroup=sshKeyType skipwhite oneline contained +syn cluster sshAllowedSignersOption contains=sshAllowedSignersOptionKeyword,sshAllowedSignersOptionSeparator,sshAllowedSignersOptionAssignment,sshAllowedSignersOptionValue +syn keyword sshAllowedSignersOptionKeyword namespaces cert-authority valid-after valid-before contained +syn match sshAllowedSignersOptionSeparator "," contained +syn match sshAllowedSignersOptionAssignment "=" contained +syn match sshAllowedSignersOptionValue '"\(\\\"\|[^"]\)*"' contained + +runtime! syntax/sshpublickey.vim + +hi def link sshAllowedSignersPrincipal Identifier +hi def link sshAllowedSignersPrincipalSeparator Punctuation + +hi def link sshAllowedSignersOptionKeyword Keyword +hi def link sshAllowedSignersOptionSeparator Punctuation +hi def link sshAllowedSignersOptionAssignment Operator +hi def link sshAllowedSignersOptionValue String + +let b:current_syntax = "sshallowedsigners" diff --git a/runtime/syntax/sshauthorizedkeys.vim b/runtime/syntax/sshauthorizedkeys.vim new file mode 100644 index 0000000000..cf6b912fbc --- /dev/null +++ b/runtime/syntax/sshauthorizedkeys.vim @@ -0,0 +1,25 @@ +" Vim syntax file +" Language: OpenSSH authorized keys file +" Author: Fionn Fitzmaurice (github.com/fionn) +" Maintainer: Fionn Fitzmaurice (github.com/fionn) +" License: Vim & Apache 2.0 + +if exists("b:current_syntax") + finish +endif + +syn region sshAuthorizedKeyOptions start="^[a-z]" end="\s" contains=@sshAuthorizedKeyOption nextgroup=sshKeyType skipwhite oneline +syn cluster sshAuthorizedKeyOption contains=sshAuthorizedKeyOptionKeyword,sshAuthorizedKeyOptionSeparator,sshAuthorizedKeyOptionAssignment,sshAuthorizedKeyOptionValue +syn match sshAuthorizedKeyOptionKeyword "[a-z-]\+" contained +syn match sshAuthorizedKeyOptionSeparator "," contained +syn match sshAuthorizedKeyOptionAssignment "=" contained +syn match sshAuthorizedKeyOptionValue '"\(\\\"\|[^"]\)*"' contained + +runtime! syntax/sshpublickey.vim + +hi def link sshAuthorizedKeyOptionKeyword Keyword +hi def link sshAuthorizedKeyOptionSeparator Punctuation +hi def link sshAuthorizedKeyOptionAssignment Operator +hi def link sshAuthorizedKeyOptionValue String + +let b:current_syntax = "sshauthorizedkeys" diff --git a/runtime/syntax/sshknownhosts.vim b/runtime/syntax/sshknownhosts.vim new file mode 100644 index 0000000000..5d41deb79b --- /dev/null +++ b/runtime/syntax/sshknownhosts.vim @@ -0,0 +1,27 @@ +" Vim syntax file +" Language: OpenSSH known hosts file +" Author: Fionn Fitzmaurice (github.com/fionn) +" Maintainer: Fionn Fitzmaurice (github.com/fionn) +" License: Vim & Apache 2.0 + +if exists("b:current_syntax") + finish +endif + +runtime! syntax/sshpublickey.vim + +syn match sshKnownHostsMarker "^@cert-authority\>" nextgroup=sshKnownHostsHostname,sshKnownHostsHashedHostname skipwhite +syn match sshKnownHostsMarker "^@revoked\>" nextgroup=sshKnownHostsHostname,sshKnownHostsHashedHostname skipwhite + +syn match sshKnownHostsHostname "!\?[a-zA-Z0-9.*-]\+" nextgroup=sshKnownHostsHostnameSeparator,sshKeyType skipwhite +syn match sshKnownHostsHostname "!\?\[[a-zA-Z0-9.*-]\+\]:[0-9]\{1,5}" nextgroup=sshKnownHostsHostnameSeparator,sshKeyType skipwhite +syn match sshKnownHostsHostnameSeparator "," contained nextgroup=sshKnownHostsHostname + +syn match sshKnownHostsHashedHostname "|1|[a-zA-Z0-9/+]\+=\{,2}|[a-zA-Z0-9/+]\+=\{,2}" nextgroup=sshKeyType skipwhite + +hi def link sshKnownHostsMarker Statement +hi def link sshKnownHostsHostname Identifier +hi def link sshKnownHostsHostnameSeparator Punctuation +hi def link sshKnownHostsHashedHostname Identifier + +let b:current_syntax = "sshknownhosts" diff --git a/runtime/syntax/sshpublickey.vim b/runtime/syntax/sshpublickey.vim new file mode 100644 index 0000000000..200378ae0e --- /dev/null +++ b/runtime/syntax/sshpublickey.vim @@ -0,0 +1,30 @@ +" Vim syntax file +" Language: OpenSSH public key +" Author: Fionn Fitzmaurice (github.com/fionn) +" Maintainer: Fionn Fitzmaurice (github.com/fionn) +" License: Vim & Apache 2.0 + +if exists("b:current_syntax") + finish +endif + +setlocal iskeyword=_,.,@-@,-,a-z,A-Z,48-57 + +syn keyword sshKeyType ssh-ed25519 nextgroup=sshKeyBase64Encoded skipwhite +syn keyword sshKeyType sk-ssh-ed25519@openssh.com nextgroup=sshKeyBase64Encoded skipwhite +syn keyword sshKeyType ecdsa-sha2-nistp256 nextgroup=sshKeyBase64Encoded skipwhite +syn keyword sshKeyType ecdsa-sha2-nistp384 nextgroup=sshKeyBase64Encoded skipwhite +syn keyword sshKeyType ecdsa-sha2-nistp521 nextgroup=sshKeyBase64Encoded skipwhite +syn keyword sshKeyType sk-ecdsa-sha2-nistp256@openssh.com nextgroup=sshKeyBase64Encoded skipwhite +syn keyword sshKeyType ssh-rsa nextgroup=sshKeyBase64Encoded skipwhite + +syn match sshKeyBase64Encoded "AAAA[a-zA-Z0-9/+]\{64,8000}=\{,2}" contained nextgroup=sshKeyComment +syn match sshKeyComment ".*$" contained + +syn match sshKeyComment "#.*$" + +hi def link sshKeyType Type +hi def link sshKeyBase64Encoded String +hi def link sshKeyComment Comment + +let b:current_syntax = "sshpublickey" diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 10a1d07d28..87b640e02d 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -790,8 +790,12 @@ def s:GetFilenameChecks(): dict> srec: ['file.s19', 'file.s28', 'file.s37', 'file.mot', 'file.srec'], srt: ['file.srt'], ssa: ['file.ass', 'file.ssa'], + sshallowedsigners: ['any/allowed_signers', 'any/.allowed_signers', 'any/file.allowed_signers'], + sshauthorizedkeys: ['any/.ssh/authorized_keys'], sshconfig: ['ssh_config', '/.ssh/config', '/etc/ssh/ssh_config.d/file.conf', 'any/etc/ssh/ssh_config.d/file.conf', 'any/.ssh/config', 'any/.ssh/file.conf'], sshdconfig: ['sshd_config', '/etc/ssh/sshd_config.d/file.conf', 'any/etc/ssh/sshd_config.d/file.conf'], + sshpublickey: ['any/.ssh/file.pub', '/etc/ssh/file.pub'], + sshknownhosts: ['any/.ssh/known_hosts', '/etc/ssh/ssh_known_hosts'], st: ['file.st'], starlark: ['file.ipd', 'file.sky', 'file.star', 'file.starlark'], stata: ['file.ado', 'file.do', 'file.imata', 'file.mata'], diff --git a/src/version.c b/src/version.c index ebe7f97093..fe47a6e4e4 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 742, /**/ 741, /**/ From 9a899af7e8e74bb094cfdfda857580b2e8ddf840 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sun, 28 Jun 2026 17:22:16 +0000 Subject: [PATCH 057/647] runtime(vim): Fix heredoc triggering misidentifcation of Vim9 script The following let-heredoc can cause legacy scripts to be misidentified as Vim9 script if it appears early in the file. Only match :vim9script at the start of a line where it sensibly belongs. let x =<< trim LINES vim9script ... LINES fixes: #20647 (reported by Maxim Kim). closes: #20654 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/ftplugin/vim.vim | 4 ++-- runtime/syntax/generator/vim.vim.base | 4 ++-- runtime/syntax/vim.vim | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim index 21ca040fa6..b54cb48f02 100644 --- a/runtime/ftplugin/vim.vim +++ b/runtime/ftplugin/vim.vim @@ -6,7 +6,7 @@ " @Konfekt " @tpope (s:Help()) " @lacygoill -" Last Change: 2026 May 31 +" Last Change: 2026 Jun 27 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -107,7 +107,7 @@ command! -buffer -nargs=1 VimKeywordPrg :exe 'help' s:Help() setlocal keywordprg=:VimKeywordPrg " Comments starts with # in Vim9 script. We have to guess which one to use. -if "\n" .. getline(1, 32)->join("\n") =~# '\n\s*vim9\%[script]\>' +if "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' setlocal commentstring=#\ %s " Set 'comments' to format dashed lists in comments, for Vim9 script. setlocal com=sO:#\ -,mO:#\ \ ,eO:##,:#\\\ ,:# diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 309ef2a9ba..5b20d1ddff 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Jun 12 +" Last Change: 2026 Jun 27 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -19,7 +19,7 @@ set cpo&vim " Feature testing {{{1 " NOTE: vimsyn_force_vim9 for internal use only -let s:vim9script = get(b:, "vimsyn_force_vim9", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\n\s*vim9\%[script]\>' +let s:vim9script = get(b:, "vimsyn_force_vim9", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' function s:has(feature) return has(a:feature) || index(get(g:, "vimsyn_vim_features", []), a:feature) != -1 diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 08d2a2b85b..60e584dccb 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Jun 12 +" Last Change: 2026 Jun 27 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -19,7 +19,7 @@ set cpo&vim " Feature testing {{{1 " NOTE: vimsyn_force_vim9 for internal use only -let s:vim9script = get(b:, "vimsyn_force_vim9", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\n\s*vim9\%[script]\>' +let s:vim9script = get(b:, "vimsyn_force_vim9", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' function s:has(feature) return has(a:feature) || index(get(g:, "vimsyn_vim_features", []), a:feature) != -1 From 7f122f9effba51adc107909b8ca4d9b220c2bfaf Mon Sep 17 00:00:00 2001 From: Shane Harper Date: Sun, 28 Jun 2026 17:24:04 +0000 Subject: [PATCH 058/647] patch 9.2.0743: string macros silently accept a size of the wrong type Problem: Several string and memory wrapper macros cast their size argument to size_t although the wrapped function's prototype already declares that parameter size_t; such casts silence the warning a compiler would otherwise give when a value of the wrong type, such as a pointer, is passed as the size. Solution: Where the wrapped function's prototype already declares the parameter size_t, remove the cast so that a size argument of the wrong type can be reported at compile time (K.Takata, Shane Harper). From gcc 14 on, -Wint-conversion is an error by default. With gcc, passing a signed value where size_t is expected triggers -Wsign-conversion, but the check is off by default and the build already emits many such warnings. related: #20642 closes: #20656 Co-authored-by: Claude Opus 4.8 Signed-off-by: Shane Harper Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/vim.h | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/version.c b/src/version.c index fe47a6e4e4..b76dd5b23b 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 743, /**/ 742, /**/ diff --git a/src/vim.h b/src/vim.h index 0e1cc1d27a..c04e5f389c 100644 --- a/src/vim.h +++ b/src/vim.h @@ -1800,9 +1800,9 @@ void *vim_memset(void *, int, size_t); */ #define STRLEN(s) strlen((char *)(s)) #define STRCPY(d, s) strcpy((char *)(d), (char *)(s)) -#define STRNCPY(d, s, n) strncpy((char *)(d), (char *)(s), (size_t)(n)) +#define STRNCPY(d, s, n) strncpy((char *)(d), (char *)(s), (n)) #define STRCMP(d, s) strcmp((char *)(d), (char *)(s)) -#define STRNCMP(d, s, n) strncmp((char *)(d), (char *)(s), (size_t)(n)) +#define STRNCMP(d, s, n) strncmp((char *)(d), (char *)(s), (n)) #ifdef HAVE_STRCASECMP # define STRICMP(d, s) strcasecmp((char *)(d), (char *)(s)) #else @@ -1822,12 +1822,12 @@ void *vim_memset(void *, int, size_t); #define STRMOVE(d, s) mch_memmove((d), (s), STRLEN(s) + 1) #ifdef HAVE_STRNCASECMP -# define STRNICMP(d, s, n) strncasecmp((char *)(d), (char *)(s), (size_t)(n)) +# define STRNICMP(d, s, n) strncasecmp((char *)(d), (char *)(s), (n)) #else # ifdef HAVE_STRNICMP -# define STRNICMP(d, s, n) strnicmp((char *)(d), (char *)(s), (size_t)(n)) +# define STRNICMP(d, s, n) strnicmp((char *)(d), (char *)(s), (n)) # else -# define STRNICMP(d, s, n) vim_strnicmp((char *)(d), (char *)(s), (size_t)(n)) +# define STRNICMP(d, s, n) vim_strnicmp((char *)(d), (char *)(s), (n)) # endif #endif @@ -1842,7 +1842,7 @@ void *vim_memset(void *, int, size_t); #define MB_STRNICMP2(d, s, n1, n2) mb_strnicmp2((char_u *)(d), (char_u *)(s), (n1), (n2)) #define STRCAT(d, s) strcat((char *)(d), (char *)(s)) -#define STRNCAT(d, s, n) strncat((char *)(d), (char *)(s), (size_t)(n)) +#define STRNCAT(d, s, n) strncat((char *)(d), (char *)(s), (n)) #ifdef HAVE_STRPBRK # define vim_strpbrk(s, cs) (char_u *)strpbrk((char *)(s), (char *)(cs)) @@ -1922,7 +1922,7 @@ typedef unsigned short disptick_T; // display tick type typedef void *vim_acl_T; // dummy to pass an ACL to a function #ifndef mch_memmove -# define mch_memmove(to, from, len) memmove((char*)(to), (char*)(from), (size_t)(len)) +# define mch_memmove(to, from, len) memmove((char*)(to), (char*)(from), (len)) #endif /* @@ -1932,7 +1932,7 @@ typedef void *vim_acl_T; // dummy to pass an ACL to a function * thus it is not 100% accurate!) */ #define fnamecmp(x, y) vim_fnamecmp((char_u *)(x), (char_u *)(y)) -#define fnamencmp(x, y, n) vim_fnamencmp((char_u *)(x), (char_u *)(y), (size_t)(n)) +#define fnamencmp(x, y, n) vim_fnamencmp((char_u *)(x), (char_u *)(y), (n)) #if defined(UNIX) || defined(FEAT_GUI) || defined(VMS) \ || defined(FEAT_CLIENTSERVER) @@ -1950,8 +1950,8 @@ typedef void *vim_acl_T; // dummy to pass an ACL to a function # define vim_read(fd, buf, count) read((fd), (char *)(buf), (unsigned int)(count)) # define vim_write(fd, buf, count) write((fd), (char *)(buf), (unsigned int)(count)) #else -# define vim_read(fd, buf, count) read((fd), (char *)(buf), (size_t) (count)) -# define vim_write(fd, buf, count) write((fd), (char *)(buf), (size_t) (count)) +# define vim_read(fd, buf, count) read((fd), (char *)(buf), (count)) +# define vim_write(fd, buf, count) write((fd), (char *)(buf), (count)) #endif /* From c0fc51184c0374b74478611ce8f74ab7464ded0d Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Sun, 28 Jun 2026 17:28:17 +0000 Subject: [PATCH 059/647] CI: MS-Windows: Run gvim/vim tests in parallel https://github.blog/changelog/2026-06-25-actions-steps-can-now-be-run-in-parallel/ closes: #20655 Signed-off-by: K.Takata Signed-off-by: Christian Brabandt --- .github/workflows/ci-windows.yml | 74 ++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 25c7f1c075..e4b8cdecd2 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -193,6 +193,12 @@ jobs: ) goto :eof + - name: Copy src directory to src2 + if: matrix.GUI == 'no' || matrix.VIMDLL == 'yes' + shell: cmd + run: | + xcopy src src2\ /E > nul + - name: Build (MSVC) if: matrix.toolchain == 'msvc' shell: cmd @@ -306,40 +312,42 @@ jobs: # fi # fi - - name: Test and show the result of testing gVim - if: matrix.GUI == 'yes' || matrix.VIMDLL == 'yes' - shell: cmd - timeout-minutes: 15 - run: | - PATH %LUA_DIR%;C:\msys64\%MSYSTEM%\bin;%PYTHON3_DIR%;%PATH%;%SODIUM_LIB% - call "%VCVARSALL%" %VCARCH% - - echo %COL_GREEN%Test gVim:%COL_RESET% - cd src\testdir - if "${{ matrix.GUI }}"=="yes" ( - nmake -nologo -f Make_mvc.mak VIMPROG=..\gvim || exit 1 - ) else ( - @rem Run only tiny tests. - nmake -nologo -f Make_mvc.mak tiny VIMPROG=..\gvim || exit 1 - ) - - - name: Test and show the result of testing Vim - if: matrix.GUI == 'no' || matrix.VIMDLL == 'yes' - shell: cmd - timeout-minutes: 15 - run: | - PATH %LUA_DIR%;C:\msys64\%MSYSTEM%\bin;%PYTHON3_DIR%;%PATH%;%SODIUM_LIB% - call "%VCVARSALL%" %VCARCH% + - parallel: + # Run gvim tests and vim tests in parallel + + - name: Test and show the result of testing gVim + if: matrix.GUI == 'yes' || matrix.VIMDLL == 'yes' + shell: cmd + timeout-minutes: 15 + run: | + PATH %LUA_DIR%;C:\msys64\%MSYSTEM%\bin;%PYTHON3_DIR%;%PATH%;%SODIUM_LIB% + call "%VCVARSALL%" %VCARCH% + + echo %COL_GREEN%Test gVim:%COL_RESET% + cd src\testdir + if "${{ matrix.features }}"=="TINY" ( + @rem Run only tiny tests. + nmake -nologo -f Make_mvc.mak tiny VIMPROG=..\gvim || exit 1 + ) else ( + nmake -nologo -f Make_mvc.mak VIMPROG=..\gvim || exit 1 + ) - echo %COL_GREEN%Test Vim:%COL_RESET% - cd src\testdir - nmake -nologo -f Make_mvc.mak clean - if "${{ matrix.GUI }}"=="no" ( - nmake -nologo -f Make_mvc.mak VIMPROG=..\vim || exit 1 - ) else ( - @rem Run only tiny tests. - nmake -nologo -f Make_mvc.mak tiny VIMPROG=..\vim || exit 1 - ) + - name: Test and show the result of testing Vim + if: matrix.GUI == 'no' || matrix.VIMDLL == 'yes' + shell: cmd + timeout-minutes: 15 + run: | + PATH %LUA_DIR%;C:\msys64\%MSYSTEM%\bin;%PYTHON3_DIR%;%PATH%;%SODIUM_LIB% + call "%VCVARSALL%" %VCARCH% + + echo %COL_GREEN%Test Vim:%COL_RESET% + cd src2\testdir + if "${{ matrix.features }}"=="TINY" ( + @rem Run only tiny tests. + nmake -nologo -f Make_mvc.mak tiny VIMPROG=..\..\src\vim || exit 1 + ) else ( + nmake -nologo -f Make_mvc.mak VIMPROG=..\..\src\vim || exit 1 + ) - name: Upload failed test artifacts if: ${{ !cancelled() }} From 6eb5d1a9dc81e291a893ad0ff247a1afc665ab3c Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Sun, 28 Jun 2026 17:30:30 +0000 Subject: [PATCH 060/647] runtime(odin): Update indent script, add indent tests following odin code is incorrectly indented: ... fmt.println("Hellope") } // Fallthrough statement // fallthrough can be used to explicitly fall through into the next case block: closes: 20658 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/indent/odin.vim | 10 +- runtime/indent/testdir/odin.in | 2631 ++++++++++++++++++++++++++++++++ runtime/indent/testdir/odin.ok | 2631 ++++++++++++++++++++++++++++++++ 3 files changed, 5269 insertions(+), 3 deletions(-) create mode 100644 runtime/indent/testdir/odin.in create mode 100644 runtime/indent/testdir/odin.ok diff --git a/runtime/indent/odin.vim b/runtime/indent/odin.vim index cba45e9ddf..e7bc4b5417 100644 --- a/runtime/indent/odin.vim +++ b/runtime/indent/odin.vim @@ -4,7 +4,7 @@ vim9script # Language: Odin # Maintainer: Maxim Kim # Website: https://github.com/habamax/vim-odin -# Last Change: 2026-06-01 +# Last Change: 2026-06-28 if exists("b:did_indent") finish @@ -19,6 +19,10 @@ setlocal cinkeys=0{,0},0),0],!^F,:,o,O setlocal indentexpr=GetOdinIndent(v:lnum) +def IsCommentOrString(lnum: number, col: number): bool + return synIDattr(synID(lnum, col, 1), "name") =~? 'Comment\|String' +enddef + def PrevLine(lnum: number): number var plnum = lnum - 1 var pline: string @@ -41,7 +45,7 @@ def PrevLine(lnum: number): number break endif endwhile - return plnum + return max([plnum, 1]) enddef def GetOdinIndent(lnum: number): number @@ -86,7 +90,7 @@ def GetOdinIndent(lnum: number): number elseif pline =~ '^\s*}\s*$' if line !~ '^\s*}' && line !~ '\\s*.*:\s*$' indent = pindent - else + elseif !IsCommentOrString(lnum, col('$') - 1) indent = pindent - shiftwidth() endif elseif pline =~ '\S:\s*$' diff --git a/runtime/indent/testdir/odin.in b/runtime/indent/testdir/odin.in new file mode 100644 index 0000000000..22e358fa67 --- /dev/null +++ b/runtime/indent/testdir/odin.in @@ -0,0 +1,2631 @@ +// vim: set ft=odin sw=4 ts=8 et: + +// START_INDENT + +#+vet !using-stmt !using-param +#+feature dynamic-literals using-stmt +package main + +import "core:fmt" +import "core:mem" +import "core:os" +import "core:thread" +import "core:time" +import "core:reflect" +import "base:runtime" +import "base:intrinsics" +import "core:math/big" +import "core:math/rand" + +/* +Odin is a general-purpose programming language with distinct typing built +for high performance, modern systems and data-oriented programming. + +Odin is the C alternative for the Joy of Programming. + +# Installing Odin +Getting Started - https://odin-lang.org/docs/install/ +Instructions for downloading and install the Odin compiler and libraries. + +# Learning Odin +Getting Started - https://odin-lang.org/docs/install/ +Getting Started with Odin. Downloading, installing, and getting your +first program to compile and run. +Overview of Odin - https://odin-lang.org/docs/overview/ +An overview of the Odin programming language and its features. +Frequently Asked Questions (FAQ) - https://odin-lang.org/docs/faq/ +Answers to common questions about Odin. +Packages - https://pkg.odin-lang.org/ +Documentation for all the official packages part of the +core and vendor library collections. +Nightly Builds - https://odin-lang.org/docs/nightly/ +Get the latest nightly builds of Odin. +More Odin Examples - https://github.com/odin-lang/examples +This repository contains examples of how certain things can be accomplished +in idiomatic Odin, allowing you learn its semantics, as well as how to use +parts of the core and vendor package collections. +*/ + +the_basics :: proc() { +fmt.println("\n# the basics") + +{ // The Basics + +// os.args holds the path to the current executable and any arguments passed to it. +if len(os.args) == 1 { +fmt.printf("Hellope from %v.\n", os.args[0]) +} else if len(os.args) > 2 { +fmt.printf("%v, %v! from %v.\n", os.args[1], os.args[2], os.args[0]) +} + +// Lexical elements and literals +// A comment + +my_integer_variable: int // A comment for documentaton + +// Multi-line comments begin with /* and end with */. Multi-line comments can +// also be nested (unlike in C): +/* +You can have any text or code here and +have it be commented. +/* +NOTE: comments can be nested! +*/ +*/ + +// String literals are enclosed in double quotes and character literals in single quotes. +// Special characters are escaped with a backslash \ + +some_string := "This is a string" +_ = 'A' // unicode codepoint literal +_ = '\n' +_ = "C:\\Windows\\notepad.exe" +// Raw string literals are enclosed with single back ticks +_ = `C:\Windows\notepad.exe` + +// The length of a string in bytes can be found using the built-in `len` procedure: +_ = len("Foo") +_ = len(some_string) + + +// Numbers + +// Numerical literals are written similar to most other programming languages. +// A useful feature in Odin is that underscores are allowed for better +// readability: 1_000_000_000 (one billion). A number that contains a dot is a +// floating point literal: 1.0e9 (one billion). If a number literal is suffixed +// with i, is an imaginary number literal: 2i (2 multiply the square root of -1). + +// Binary literals are prefixed with 0b, octal literals with 0o, and hexadecimal +// literals 0x. A leading zero does not produce an octal constant (unlike C). + +// In Odin, if a numeric constant can be represented by a type without +// precision loss, it will automatically convert to that type. + +x: int = 1.0 // A float literal but it can be represented by an integer without precision loss +// Constant literals are “untyped” which means that they can implicitly convert to a type. + +y: int // `y` is typed of type `int` +y = 1 // `1` is an untyped integer literal which can implicitly convert to `int` + +z: f64 // `z` is typed of type `f64` (64-bit floating point number) +z = 1 // `1` is an untyped integer literal which can be implicitly converted to `f64` +// No need for any suffixes or decimal places like in other languages +// (with the exception of negative zero, which must be given as `-0.0`) +// CONSTANTS JUST WORK!!! + + +// Assignment statements +h: int = 123 // declares a new variable `h` with type `int` and assigns a value to it +h = 637 // assigns a new value to `h` + +// `=` is the assignment operator + +// You can assign multiple variables with it: +a, b := 1, "hello" // declares `a` and `b` and infers the types from the assignments +b, a = "byte", 0 + +// Note: `:=` is two tokens, `:` and `=`. The following are equivalent, +/* +i: int = 123 +i: = 123 +i := 123 +*/ + +// Constant declarations +// Constants are entities (symbols) which have an assigned value. +// The constant’s value cannot be changed. +// The constant’s value must be able to be evaluated at compile time: +X :: "what" // constant `X` has the untyped string value "what" + +// Constants can be explicitly typed like a variable declaration: +Y : int : 123 +Z :: Y + 7 // constant computations are possible + +_ = my_integer_variable +_ = x +} +} + +control_flow :: proc() { +fmt.println("\n# control flow") +{ // Control flow +// For loop +// Odin has only one loop statement, the `for` loop + +// Basic for loop +for i := 0; i < 10; i += 1 { +fmt.println(i) +} + +// NOTE: Unlike other languages like C, there are no parentheses `( )` surrounding the three components. +// Braces `{ }` or a `do` are always required +for i := 0; i < 10; i += 1 { } +// for i := 0; i < 10; i += 1 do fmt.print() + +// The initial and post statements are optional +i := 0 +for ; i < 10; { +i += 1 +} + +// These semicolons can be dropped. This `for` loop is equivalent to C's `while` loop +i = 0 +for i < 10 { +i += 1 +} + +// If the condition is omitted, an infinite loop is produced: +for { +break +} + +// Range-based for loop +// The basic for loop +for j := 0; j < 10; j += 1 { +fmt.println(j) +} +// can also be written +for j in 0..<10 { +fmt.println(j) +} +for j in 0..=9 { +fmt.println(j) +} + +// Certain built-in types can be iterated over +some_string := "Hello, 世界" +for character in some_string { // Strings are assumed to be UTF-8 +fmt.println(character) +} + +some_array := [3]int{1, 4, 9} +for value in some_array { +fmt.println(value) +} + +some_slice := []int{1, 4, 9} +for value in some_slice { +fmt.println(value) +} + +some_dynamic_array := [dynamic]int{1, 4, 9} +defer delete(some_dynamic_array) +for value in some_dynamic_array { +fmt.println(value) +} + + +some_map := map[string]int{"A" = 1, "C" = 9, "B" = 4} +defer delete(some_map) +for key in some_map { +fmt.println(key) +} + +// Alternatively a second index value can be added +for character, index in some_string { +fmt.println(index, character) +} +for value, index in some_array { +fmt.println(index, value) +} +for value, index in some_slice { +fmt.println(index, value) +} +for value, index in some_dynamic_array { +fmt.println(index, value) +} +for key, value in some_map { +fmt.println(key, value) +} + +// The iterated values are copies and cannot be written to. +// The following idiom is useful for iterating over a container in a by-reference manner: +for _, idx in some_slice { +some_slice[idx] = (idx+1)*(idx+1) +} + + +// If statements +x := 123 +if x >= 0 { +fmt.println("x is positive") +} + +if y := -34; y < 0 { +fmt.println("y is negative") +} + +if y := 123; y < 0 { +fmt.println("y is negative") +} else if y == 0 { +fmt.println("y is zero") +} else { +fmt.println("y is positive") +} + +// Switch statement +// A switch statement is another way to write a sequence of if-else statements. +// In Odin, the default case is denoted as a case without any expression. + +#partial switch arch := ODIN_ARCH; arch { +case .i386: +fmt.println("32-bit") +case .amd64: +fmt.println("64-bit") +case: // default +fmt.println("Unsupported architecture") +} + +// Odin’s `switch` is like one in C or C++, except that Odin only runs the selected case. +// This means that a `break` statement is not needed at the end of each case. +// Another important difference is that the case values need not be integers nor constants. + +// To achieve a C-like fall through into the next case block, the keyword `fallthrough` can be used. +one_angry_dwarf :: proc() -> int { +fmt.println("one_angry_dwarf was called") +return 1 +} + +switch j := 0; j { +case 0: +case one_angry_dwarf(): +} + +// A switch statement without a condition is the same as `switch true`. +// This can be used to write a clean and long if-else chain and have the +// ability to break if needed + +switch { +case x < 0: +fmt.println("x is negative") +case x == 0: +fmt.println("x is zero") +case: +fmt.println("x is positive") +} + +// A `switch` statement can also use ranges like a range-based loop: +switch c := 'j'; c { +case 'A'..='Z', 'a'..='z', '0'..='9': +fmt.println("c is alphanumeric") +} + +switch x { +case 0..<10: +fmt.println("units") +case 10..<13: +fmt.println("pre-teens") +case 13..<20: +fmt.println("teens") +case 20..<30: +fmt.println("twenties") +} +} + +{ // Defer statement +// A defer statement defers the execution of a statement until the end of +// the scope it is in. + +// The following will print 4 then 234: +{ +x := 123 +defer fmt.println(x) +{ +defer x = 4 +x = 2 +} +fmt.println(x) + +x = 234 +} + +// You can defer an entire block too: +{ +bar :: proc() {} + +defer { +fmt.println("1") +fmt.println("2") +} + +cond := false +defer if cond { +bar() +} +} + +// Defer statements are executed in the reverse order that they were declared: +{ +defer fmt.println("1") +defer fmt.println("2") +defer fmt.println("3") +} +// Will print 3, 2, and then 1. + +if false { +f, err := os.open("my_file.txt") +if err != nil { +// handle error +} +defer os.close(f) +// rest of code +} +} + +{ // When statement +/* +The when statement is almost identical to the if statement but with some differences: + +* Each condition must be a constant expression as a when +statement is evaluated at compile time. +* The statements within a branch do not create a new scope +* The compiler checks the semantics and code only for statements +that belong to the first condition that is true +* An initial statement is not allowed in a when statement +* when statements are allowed at file scope +*/ + +// Example +when ODIN_ARCH == .i386 { +fmt.println("32 bit") +} else when ODIN_ARCH == .amd64 { +fmt.println("64 bit") +} else { +fmt.println("Unknown architecture") +} +// The when statement is very useful for writing platform specific code. +// This is akin to the #if construct in C’s preprocessor however, in Odin, +// it is type checked. +} + +{ // Branch statements +cond, cond1, cond2 := false, false, false +one_step :: proc() { fmt.println("one_step") } +beyond :: proc() { fmt.println("beyond") } + +// Break statement +for cond { +switch { +case: +if cond { +break // break out of the `switch` statement +} +} + +break // break out of the `for` statement +} + +loop: for cond1 { +for cond2 { +break loop // leaves both loops +} +} + +// Continue statement +for cond { +if cond2 { +continue +} +fmt.println("Hellope") +} + +// Fallthrough statement + +// Odin’s switch is like one in C or C++, except that Odin only runs the selected +// case. This means that a break statement is not needed at the end of each case. +// Another important difference is that the case values need not be integers nor +// constants. + +// fallthrough can be used to explicitly fall through into the next case block: + +switch i := 0; i { +case 0: +one_step() +fallthrough +case 1: +beyond() +} +} +} + + +named_proc_return_parameters :: proc() { +fmt.println("\n# named proc return parameters") + +foo0 :: proc() -> int { +return 123 +} +foo1 :: proc() -> (a: int) { +a = 123 +return +} +foo2 :: proc() -> (a, b: int) { +// Named return values act like variables within the scope +a = 321 +b = 567 +return b, a +} +fmt.println("foo0 =", foo0()) // 123 +fmt.println("foo1 =", foo1()) // 123 +fmt.println("foo2 =", foo2()) // 567 321 +} + +variadic_procedures :: proc() { +fmt.println("\n# variadic procedures") +sum :: proc(nums: ..int, init_value:= 0) -> (result: int) { +result = init_value +for n in nums { +result += n +} +return +} +fmt.println("sum(()) =", sum()) +fmt.println("sum(1, 2) =", sum(1, 2)) +fmt.println("sum(1, 2, 3, 4, 5) =", sum(1, 2, 3, 4, 5)) +fmt.println("sum(1, 2, 3, 4, 5, init_value = 5) =", sum(1, 2, 3, 4, 5, init_value = 5)) + +// pass a slice as varargs +odds := []int{1, 3, 5} +fmt.println("odds =", odds) +fmt.println("sum(..odds) =", sum(..odds)) +fmt.println("sum(..odds, init_value = 5) =", sum(..odds, init_value = 5)) +} + + +explicit_procedure_overloading :: proc() { +fmt.println("\n# explicit procedure overloading") + +add_ints :: proc(a, b: int) -> int { +x := a + b +fmt.println("add_ints", x) +return x +} +add_floats :: proc(a, b: f32) -> f32 { +x := a + b +fmt.println("add_floats", x) +return x +} +add_numbers :: proc(a: int, b: f32, c: u8) -> int { +x := int(a) + int(b) + int(c) +fmt.println("add_numbers", x) +return x +} + +add :: proc{add_ints, add_floats, add_numbers} + +add(int(1), int(2)) +add(f32(1), f32(2)) +add(int(1), f32(2), u8(3)) + +add(1, 2) // untyped ints coerce to int tighter than f32 +add(1.0, 2.0) // untyped floats coerce to f32 tighter than int +add(1, 2, 3) // three parameters + +// Ambiguous answers +// add(1.0, 2) +// add(1, 2.0) +} + +struct_type :: proc() { +fmt.println("\n# struct type") +// A struct is a record type in Odin. It is a collection of fields. +// Struct fields are accessed by using a dot: +{ +Vector2 :: struct { +x: f32, +y: f32, +} +v := Vector2{1, 2} +v.x = 4 +fmt.println(v.x) + +// Struct fields can be accessed through a struct pointer: + +v = Vector2{1, 2} +p := &v +p.x = 1335 +fmt.println(v) + +// We could write p^.x, however, it is nice to abstract the ability +// to not explicitly dereference the pointer. This is very useful when +// refactoring code to use a pointer rather than a value, and vice versa. +} +{ +// A struct literal can be denoted by providing the struct’s type +// followed by {}. A struct literal must either provide all the +// arguments or none: +Vector3 :: struct { +x, y, z: f32, +} +v: Vector3 +v = Vector3{} // Zero value +v = Vector3{1, 4, 9} + +// You can list just a subset of the fields if you specify the +// field by name (the order of the named fields does not matter): +v = Vector3{z=1, y=2} +assert(v.x == 0) +assert(v.y == 2) +assert(v.z == 1) +} +{ +// Structs can tagged with different memory layout and alignment requirements: + +a :: struct #align(4) {} // align to 4 bytes +b :: struct #packed {} // remove padding between fields +c :: struct #raw_union {} // all fields share the same offset (0). This is the same as C's union +} + +} + + +union_type :: proc() { +fmt.println("\n# union type") +{ +val: union{int, bool} +val = 137 +if i, ok := val.(int); ok { +fmt.println(i) +} +val = true +fmt.println(val) + +val = nil + +switch v in val { +case int: fmt.println("int", v) +case bool: fmt.println("bool", v) +case: fmt.println("nil") +} +} +{ +// There is a duality between `any` and `union` +// An `any` has a pointer to the data and allows for any type (open) +// A `union` has as binary blob to store the data and allows only certain types (closed) +// The following code is with `any` but has the same syntax +val: any +val = 137 +if i, ok := val.(int); ok { +fmt.println(i) +} +val = true +fmt.println(val) + +val = nil + +switch v in val { +case int: fmt.println("int", v) +case bool: fmt.println("bool", v) +case: fmt.println("nil") +} +} + +Vector3 :: distinct [3]f32 +Quaternion :: distinct quaternion128 + +// More realistic examples +{ +// NOTE(bill): For the above basic examples, you may not have any +// particular use for it. However, my main use for them is not for these +// simple cases. My main use is for hierarchical types. Many prefer +// subtyping, embedding the base data into the derived types. Below is +// an example of this for a basic game Entity. + +Entity :: struct { +id: u64, +name: string, +position: Vector3, +orientation: Quaternion, + +derived: any, +} + +Frog :: struct { +using entity: Entity, +jump_height: f32, +} + +Monster :: struct { +using entity: Entity, +is_robot: bool, +is_zombie: bool, +} + +// See `parametric_polymorphism` procedure for details +new_entity :: proc($T: typeid) -> ^Entity { +t := new(T) +t.derived = t^ +return t +} + +entity := new_entity(Monster) + +switch e in entity.derived { +case Frog: +fmt.println("Ribbit") +case Monster: +if e.is_robot { fmt.println("Robotic") } +if e.is_zombie { fmt.println("Grrrr!") } +fmt.println("I'm a monster") +} +} + +{ +// NOTE(bill): A union can be used to achieve something similar. Instead +// of embedding the base data into the derived types, the derived data +// in embedded into the base type. Below is the same example of the +// basic game Entity but using an union. + +Entity :: struct { +id: u64, +name: string, +position: Vector3, +orientation: Quaternion, + +derived: union {Frog, Monster}, +} + +Frog :: struct { +using entity: ^Entity, +jump_height: f32, +} + +Monster :: struct { +using entity: ^Entity, +is_robot: bool, +is_zombie: bool, +} + +// See `parametric_polymorphism` procedure for details +new_entity :: proc($T: typeid) -> ^Entity { +t := new(Entity) +t.derived = T{entity = t} +return t +} + +entity := new_entity(Monster) + +switch e in entity.derived { +case Frog: +fmt.println("Ribbit") +case Monster: +if e.is_robot { fmt.println("Robotic") } +if e.is_zombie { fmt.println("Grrrr!") } +} + +// NOTE(bill): As you can see, the usage code has not changed, only its +// memory layout. Both approaches have their own advantages but they can +// be used together to achieve different results. The subtyping approach +// can allow for a greater control of the memory layout and memory +// allocation, e.g. storing the derivatives together. However, this is +// also its disadvantage. You must either preallocate arrays for each +// derivative separation (which can be easily missed) or preallocate a +// bunch of "raw" memory; determining the maximum size of the derived +// types would require the aid of metaprogramming. Unions solve this +// particular problem as the data is stored with the base data. +// Therefore, it is possible to preallocate, e.g. [100]Entity. + +// It should be noted that the union approach can have the same memory +// layout as the any and with the same type restrictions by using a +// pointer type for the derivatives. + +/* +Entity :: struct { +... +derived: union{^Frog, ^Monster}, +} + +Frog :: struct { +using entity: Entity, +... +} +Monster :: struct { +using entity: Entity, +... + +} +new_entity :: proc(T: type) -> ^Entity { +t := new(T) +t.derived = t +return t +} +*/ +} +} + +using_statement :: proc() { +// IMPORTANT NOTE: `using` as a statement is an opt-in feature which can be abled +// by adding `#+feature using-stmt` to be beginning of the file +// +// `using` as a struct field modifier remains available always + +fmt.println("\n# using statement") +// using can used to bring entities declared in a scope/namespace +// into the current scope. This can be applied to import names, struct +// fields, procedure fields, and struct values. + +Vector3 :: struct{x, y, z: f32} +{ +Entity :: struct { +position: Vector3, +orientation: quaternion128, +} + +// It can used like this: +foo0 :: proc(entity: ^Entity) { +fmt.println(entity.position.x, entity.position.y, entity.position.z) +} + +// The entity members can be brought into the procedure scope by using it: +foo1 :: proc(entity: ^Entity) { +using entity +fmt.println(position.x, position.y, position.z) +} + +// The using can be applied to the parameter directly: +foo2 :: proc(using entity: ^Entity) { +fmt.println(position.x, position.y, position.z) +} + +// It can also be applied to sub-fields: +foo3 :: proc(entity: ^Entity) { +using entity.position +fmt.println(x, y, z) +} +} +{ +// We can also apply the using statement to the struct fields directly, +// making all the fields of position appear as if they on Entity itself: +Entity :: struct { +using position: Vector3, +orientation: quaternion128, +} +foo :: proc(entity: ^Entity) { +fmt.println(entity.x, entity.y, entity.z) +} + + +// Subtype polymorphism +// It is possible to get subtype polymorphism, similar to inheritance-like +// functionality in C++, but without the requirement of vtables or unknown +// struct layout: + +Colour :: struct {r, g, b, a: u8} +Frog :: struct { +ribbit_volume: f32, +using entity: Entity, +colour: Colour, +} + +frog: Frog +// Both work +foo(&frog.entity) +foo(&frog) +frog.x = 123 + +// Note: using can be applied to arbitrarily many things, which allows +// the ability to have multiple subtype polymorphism (but also its issues). + +// Note: using’d fields can still be referred by name. +} +} + + +implicit_context_system :: proc() { +fmt.println("\n# implicit context system") +// In each scope, there is an implicit value named context. This +// context variable is local to each scope and is implicitly passed +// by pointer to any procedure call in that scope (if the procedure +// has the Odin calling convention). + +// The main purpose of the implicit context system is for the ability +// to intercept third-party code and libraries and modify their +// functionality. One such case is modifying how a library allocates +// something or logs something. In C, this was usually achieved with +// the library defining macros which could be overridden so that the +// user could define what he wanted. However, not many libraries +// supported this in many languages by default which meant intercepting +// third-party code to see what it does and to change how it does it is +// not possible. + +c := context // copy the current scope's context + +context.user_index = 456 +{ +context.allocator = my_custom_allocator() +context.user_index = 123 +what_a_fool_believes() // the `context` for this scope is implicitly passed to `what_a_fool_believes` +} + +// `context` value is local to the scope it is in +assert(context.user_index == 456) + +what_a_fool_believes :: proc() { +c := context // this `context` is the same as the parent procedure that it was called from +// From this example, context.user_index == 123 +// A context.allocator is assigned to the return value of `my_custom_allocator()` +assert(context.user_index == 123) + +// The memory management procedure use the `context.allocator` by +// default unless explicitly specified otherwise +china_grove := new(int) +free(china_grove) + +_ = c +} + +my_custom_allocator :: mem.nil_allocator +_ = c + +// By default, the context value has default values for its parameters which is +// decided in the package runtime. What the defaults are are compiler specific. + +// To see what the implicit context value contains, please see the following +// definition in package runtime. +} + +parametric_polymorphism :: proc() { +fmt.println("\n# parametric polymorphism") + +print_value :: proc(value: $T) { +fmt.printf("print_value: %T %v\n", value, value) +} + +v1: int = 1 +v2: f32 = 2.1 +v3: f64 = 3.14 +v4: string = "message" + +print_value(v1) +print_value(v2) +print_value(v3) +print_value(v4) + +fmt.println() + +add :: proc(p, q: $T) -> T { +x: T = p + q +return x +} + +a := add(3, 4) +fmt.printf("a: %T = %v\n", a, a) + +b := add(3.2, 4.3) +fmt.printf("b: %T = %v\n", b, b) + +// This is how `new` is implemented +alloc_type :: proc($T: typeid) -> ^T { +t := cast(^T)mem.alloc(size_of(T), align_of(T)) +t^ = T{} // Use default initialization value +return t +} + +copy_slice :: proc(dst, src: []$T) -> int { +n := min(len(dst), len(src)) +if n > 0 { +mem.copy(&dst[0], &src[0], n*size_of(T)) +} +return n +} + +double_params :: proc(a: $A, b: $B) -> A { +return a + A(b) +} + +fmt.println(double_params(12, 1.345)) + + + +{ // Polymorphic Types and Type Specialization +Table_Slot :: struct($Key, $Value: typeid) { +occupied: bool, +hash: u32, +key: Key, +value: Value, +} +TABLE_SIZE_MIN :: 32 +Table :: struct($Key, $Value: typeid) { +count: int, +allocator: mem.Allocator, +slots: []Table_Slot(Key, Value), +} + +// Only allow types that are specializations of a (polymorphic) slice +make_slice :: proc($T: typeid/[]$E, len: int) -> T { +return make(T, len) +} + +// Only allow types that are specializations of `Table` +allocate :: proc(table: ^$T/Table, capacity: int) { +c := context +if table.allocator.procedure != nil { +c.allocator = table.allocator +} +context = c + +table.slots = make_slice(type_of(table.slots), max(capacity, TABLE_SIZE_MIN)) +} + +expand :: proc(table: ^$T/Table) { +c := context +if table.allocator.procedure != nil { +c.allocator = table.allocator +} +context = c + +old_slots := table.slots +defer delete(old_slots) + +cap := max(2*len(table.slots), TABLE_SIZE_MIN) +allocate(table, cap) + +for s in old_slots { +if s.occupied { +put(table, s.key, s.value) +} +} +} + +// Polymorphic determination of a polymorphic struct +// put :: proc(table: ^$T/Table, key: T.Key, value: T.Value) { +put :: proc(table: ^Table($Key, $Value), key: Key, value: Value) { +hash := get_hash(key) // Ad-hoc method which would fail in a different scope +index := find_index(table, key, hash) +if index < 0 { +if f64(table.count) >= 0.75*f64(len(table.slots)) { +expand(table) +} +assert(table.count <= len(table.slots)) + +index = int(hash % u32(len(table.slots))) + +for table.slots[index].occupied { +if index += 1; index >= len(table.slots) { +index = 0 +} +} + +table.count += 1 +} + +slot := &table.slots[index] +slot.occupied = true +slot.hash = hash +slot.key = key +slot.value = value +} + + +// find :: proc(table: ^$T/Table, key: T.Key) -> (T.Value, bool) { +find :: proc(table: ^Table($Key, $Value), key: Key) -> (Value, bool) { +hash := get_hash(key) +index := find_index(table, key, hash) +if index < 0 { +return Value{}, false +} +return table.slots[index].value, true +} + +find_index :: proc(table: ^Table($Key, $Value), key: Key, hash: u32) -> int { +if len(table.slots) <= 0 { +return -1 +} + +index := int(hash % u32(len(table.slots))) +for table.slots[index].occupied { +if table.slots[index].hash == hash { +if table.slots[index].key == key { +return index +} +} + +if index += 1; index >= len(table.slots) { +index = 0 +} +} + +return -1 +} + +get_hash :: proc(s: string) -> u32 { // fnv32a +h: u32 = 0x811c9dc5 +for i in 0.. (res: [N]T) { +// `N` is the constant value passed +// `I` is the type of N +// `T` is the type passed +fmt.printf("Generating an array of type %v from the value %v of type %v\n", +typeid_of(type_of(res)), N, typeid_of(I)) +for i in 0.. (c: [M][P]T) { +for i in 0.. (acquired: bool) { +res, ok := intrinsics.atomic_compare_exchange_strong(m, false, true) +return ok && res == false +} + +{ // Basic Threads +fmt.println("\n## Basic Threads") +worker_proc :: proc(t: ^thread.Thread) { +for iteration in 1..=5 { +fmt.printf("Thread %d is on iteration %d\n", t.user_index, iteration) +fmt.printf("`%s`: iteration %d\n", prefix_table[t.user_index], iteration) +time.sleep(1 * time.Millisecond) +} +} + +threads := make([dynamic]^thread.Thread, 0, len(prefix_table)) +defer delete(threads) + +for _ in prefix_table { +if t := thread.create(worker_proc); t != nil { +t.init_context = context +t.user_index = len(threads) +append(&threads, t) +thread.start(t) +} +} + +for len(threads) > 0 { +for i := 0; i < len(threads); /**/ { +if t := threads[i]; thread.is_done(t) { +fmt.printf("Thread %d is done\n", t.user_index) +thread.destroy(t) + +ordered_remove(&threads, i) +} else { +i += 1 +} +} +} +} + +{ // Thread Pool +fmt.println("\n## Thread Pool") +task_proc :: proc(t: thread.Task) { +index := t.user_index % len(prefix_table) +for iteration in 1..=5 { +for !did_acquire(&print_mutex) { thread.yield() } // Allow one thread to print at a time. + +fmt.printf("Worker Task %d is on iteration %d\n", t.user_index, iteration) +fmt.printf("`%s`: iteration %d\n", prefix_table[index], iteration) + +print_mutex = false + +time.sleep(1 * time.Millisecond) +} +} + +N :: 3 + +pool: thread.Pool +thread.pool_init(&pool, allocator=context.allocator, thread_count=N) +defer thread.pool_destroy(&pool) + + +for i in 0..<30 { +// be mindful of the allocator used for tasks. The allocator needs to be thread safe, or be owned by the task for exclusive use +thread.pool_add_task(&pool, allocator=context.allocator, procedure=task_proc, data=nil, user_index=i) +} + +thread.pool_start(&pool) +thread.pool_finish(&pool) +} +} + + +array_programming :: proc() { +fmt.println("\n# array programming") +{ +a := [3]f32{1, 2, 3} +b := [3]f32{5, 6, 7} +c := a * b +d := a + b +e := 1 + (c - d) / 2 +fmt.printf("%.1f\n", e) // [0.5, 3.0, 6.5] +} + +{ +a := [3]f32{1, 2, 3} +b := swizzle(a, 2, 1, 0) +assert(b == [3]f32{3, 2, 1}) + +c := swizzle(a, 0, 0) +assert(c == [2]f32{1, 1}) +assert(c == 1) +} + +{ +Vector3 :: distinct [3]f32 +a := Vector3{1, 2, 3} +b := Vector3{5, 6, 7} +c := (a * b)/2 + 1 +d := c.x + c.y + c.z +fmt.printf("%.1f\n", d) // 22.0 + +cross :: proc(a, b: Vector3) -> Vector3 { +i := swizzle(a, 1, 2, 0) * swizzle(b, 2, 0, 1) +j := swizzle(a, 2, 0, 1) * swizzle(b, 1, 2, 0) +return i - j +} + +cross_shorter :: proc(a, b: Vector3) -> Vector3 { +i := a.yzx * b.zxy +j := a.zxy * b.yzx +return i - j +} + +blah :: proc(a: Vector3) -> f32 { +return a.x + a.y + a.z +} + +x := cross(a, b) +fmt.println(x) +fmt.println(blah(x)) +} +} + +map_type :: proc() { +fmt.println("\n# map type") + +m := make(map[string]int) +defer delete(m) + +m["Bob"] = 2 +m["Ted"] = 5 +fmt.println(m["Bob"]) + +delete_key(&m, "Ted") + +// If an element of a key does not exist, the zero value of the +// element will be returned. To check to see if an element exists +// can be done in two ways: +elem, ok := m["Bob"] +exists := "Bob" in m +_, _ = elem, ok +_ = exists +} + +implicit_selector_expression :: proc() { +fmt.println("\n# implicit selector expression") + +Foo :: enum {A, B, C} + +f: Foo +f = Foo.A +f = .A + +BAR :: bit_set[Foo]{.B, .C} + +switch f { +case .A: +fmt.println("HITHER") +case .B: +fmt.println("NEVER") +case .C: +fmt.println("FOREVER") +} + +my_map := make(map[Foo]int) +defer delete(my_map) + +my_map[.A] = 123 +my_map[Foo.B] = 345 + +fmt.println(my_map[.A] + my_map[Foo.B] + my_map[.C]) +} + + +partial_switch :: proc() { +fmt.println("\n# partial_switch") +{ // enum +Foo :: enum { +A, +B, +C, +D, +} + +f := Foo.A +switch f { +case .A: fmt.println("A") +case .B: fmt.println("B") +case .C: fmt.println("C") +case .D: fmt.println("D") +case: fmt.println("?") +} + +#partial switch f { +case .A: fmt.println("A") +case .D: fmt.println("D") +} +} +{ // union +Foo :: union {int, bool} +f: Foo = 123 +switch _ in f { +case int: fmt.println("int") +case bool: fmt.println("bool") +case: +} + +#partial switch _ in f { +case bool: fmt.println("bool") +} +} +} + +cstring_example :: proc() { +fmt.println("\n# cstring_example") + +W :: "Hellope" +X :: cstring(W) +Y :: string(X) + +w := W +_ = w +x: cstring = X +y: string = Y +z := string(x) +fmt.println(x, y, z) +fmt.println(len(x), len(y), len(z)) +fmt.println(len(W), len(X), len(Y)) +// IMPORTANT NOTE for cstring variables +// len(cstring) is O(N) +// cast(string)cstring is O(N) +} + +bit_set_type :: proc() { +fmt.println("\n# bit_set type") + +{ +Day :: enum { +Sunday, +Monday, +Tuesday, +Wednesday, +Thursday, +Friday, +Saturday, +} + +Days :: distinct bit_set[Day] +WEEKEND :: Days{.Sunday, .Saturday} + +d: Days +d = {.Sunday, .Monday} +e := d + WEEKEND +e += {.Monday} +fmt.println(d, e) + +ok := .Saturday in e // `in` is only allowed for `map` and `bit_set` types +fmt.println(ok) +if .Saturday in e { +fmt.println("Saturday in", e) +} +X :: .Saturday in WEEKEND // Constant evaluation +fmt.println(X) +fmt.println("Cardinality:", card(e)) +} +{ +x: bit_set['A'..='Z'] +#assert(size_of(x) == size_of(u32)) +y: bit_set[0..=8; u16] +fmt.println(typeid_of(type_of(x))) // bit_set[A..=Z] +fmt.println(typeid_of(type_of(y))) // bit_set[0..=8; u16] + +x += {'F'} +assert('F' in x) +x -= {'F'} +assert('F' not_in x) + +y += {1, 4, 2} +assert(2 in y) +} +{ +Letters :: bit_set['A'..='Z'] +a := Letters{'A', 'B'} +b := Letters{'A', 'B', 'C', 'D', 'F'} +c := Letters{'A', 'B'} + +assert(a <= b) // 'a' is a subset of 'b' +assert(b >= a) // 'b' is a superset of 'a' +assert(a < b) // 'a' is a strict subset of 'b' +assert(b > a) // 'b' is a strict superset of 'a' + +assert(!(a < c)) // 'a' is a not strict subset of 'c' +assert(!(c > a)) // 'c' is a not strict superset of 'a' +} +} + +deferred_procedure_associations :: proc() { +fmt.println("\n# deferred procedure associations") + +@(deferred_out=closure) +open :: proc(s: string) -> bool { +fmt.println(s) +return true +} + +closure :: proc(ok: bool) { +fmt.println("Goodbye?", ok) +} + +if open("Welcome") { +fmt.println("Something in the middle, mate.") +} +} + +reflection :: proc() { +fmt.println("\n# reflection") + +Foo :: struct { +x: int `tag1`, +y: string `json:"y_field"`, +z: bool, // no tag +} + +id := typeid_of(Foo) +names := reflect.struct_field_names(id) +types := reflect.struct_field_types(id) +tags := reflect.struct_field_tags(id) + +assert(len(names) == len(types) && len(names) == len(tags)) + +fmt.println("Foo :: struct {") +for tag, i in tags { +name, type := names[i], types[i] +if tag != "" { +fmt.printf("\t%s: %T `%s`,\n", name, type, tag) +} else { +fmt.printf("\t%s: %T,\n", name, type) +} +} +fmt.println("}") + + +for tag, i in tags { +if val, ok := reflect.struct_tag_lookup(tag, "json"); ok { +fmt.printf("json: %s -> %s\n", names[i], val) +} +} +} + +quaternions :: proc() { +// Not just an April Fool's Joke any more, but a fully working thing! +fmt.println("\n# quaternions") + +{ // Quaternion operations +q := 1 + 2i + 3j + 4k +r := quaternion(real=5, imag=6, jmag=7, kmag=8) +t := q * r +fmt.printf("(%v) * (%v) = %v\n", q, r, t) +v := q / r +fmt.printf("(%v) / (%v) = %v\n", q, r, v) +u := q + r +fmt.printf("(%v) + (%v) = %v\n", q, r, u) +s := q - r +fmt.printf("(%v) - (%v) = %v\n", q, r, s) +} +{ // The quaternion types +q128: quaternion128 // 4xf32 +q256: quaternion256 // 4xf64 +q128 = quaternion(w=1, x=0, y=0, z=0) +q256 = 1 // quaternion(x=0, y=0, z=0, w=1) + +// NOTE: The internal memory layout of a quaternion is xyzw +} +{ // Built-in procedures +q := 1 + 2i + 3j + 4k +fmt.println("q =", q) +fmt.println("real(q) =", real(q)) +fmt.println("imag(q) =", imag(q)) +fmt.println("jmag(q) =", jmag(q)) +fmt.println("kmag(q) =", kmag(q)) +fmt.println("conj(q) =", conj(q)) +fmt.println("abs(q) =", abs(q)) +} +{ // Conversion of a complex type to a quaternion type +c := 1 + 2i +q := quaternion256(c) +fmt.println(c) +fmt.println(q) +} +{ // Memory layout of Quaternions +q := 1 + 2i + 3j + 4k +a := transmute([4]f64)q +fmt.println("Quaternion memory layout: xyzw/(ijkr)") +fmt.println(q) // 1.000+2.000i+3.000j+4.000k +fmt.println(a) // [2.000, 3.000, 4.000, 1.000] +} +} + +unroll_for_statement :: proc() { +fmt.println("\n#'#unroll for' statements") + +// '#unroll for' works the same as if the 'inline' prefix did not +// exist but these ranged loops are explicitly unrolled which can +// be very very useful for certain optimizations + +fmt.println("Ranges") +#unroll for x, i in 1..<4 { +fmt.println(x, i) +} + +fmt.println("Strings") +#unroll for r, i in "Hello, 世界" { +fmt.println(r, i) +} + +fmt.println("Arrays") +#unroll for elem, idx in ([4]int{1, 4, 9, 16}) { +fmt.println(elem, idx) +} + + +Foo_Enum :: enum { +A = 1, +B, +C = 6, +D, +} +fmt.println("Enum types") +#unroll for elem, idx in Foo_Enum { +fmt.println(elem, idx) +} +} + +where_clauses :: proc() { +fmt.println("\n#procedure 'where' clauses") + +{ // Sanity checks +simple_sanity_check :: proc(x: [2]int) +where len(x) > 1, +type_of(x) == [2]int { +fmt.println(x) +} +} +{ // Parametric polymorphism checks +cross_2d :: proc(a, b: $T/[2]$E) -> E +where intrinsics.type_is_numeric(E) { +return a.x*b.y - a.y*b.x +} +cross_3d :: proc(a, b: $T/[3]$E) -> T +where intrinsics.type_is_numeric(E) { +x := a.y*b.z - a.z*b.y +y := a.z*b.x - a.x*b.z +z := a.x*b.y - a.y*b.x +return T{x, y, z} +} + +a := [2]int{1, 2} +b := [2]int{5, -3} +fmt.println(cross_2d(a, b)) + +x := [3]f32{1, 4, 9} +y := [3]f32{-5, 0, 3} +fmt.println(cross_3d(x, y)) + +// Failure case +// i := [2]bool{true, false} +// j := [2]bool{false, true} +// fmt.println(cross_2d(i, j)) + +} + +{ // Procedure groups usage +foo :: proc(x: [$N]int) -> bool +where N > 2 { +fmt.println(#procedure, "was called with the parameter", x) +return true +} + +bar :: proc(x: [$N]int) -> bool +where 0 < N, +N <= 2 { +fmt.println(#procedure, "was called with the parameter", x) +return false +} + +baz :: proc{foo, bar} + +x := [3]int{1, 2, 3} +y := [2]int{4, 9} +ok_x := baz(x) +ok_y := baz(y) +assert(ok_x == true) +assert(ok_y == false) +} + +{ // Record types +Foo :: struct($T: typeid, $N: int) +where intrinsics.type_is_integer(T), +N > 2 { +x: [N]T, +y: [N-2]T, +} + +T :: i32 +N :: 5 +f: Foo(T, N) +#assert(size_of(f) == (N+N-2)*size_of(T)) +} +} + + +when ODIN_OS == .Windows { +foreign import kernel32 "system:kernel32.lib" +} + +foreign_system :: proc() { +fmt.println("\n#foreign system") +when ODIN_OS == .Windows { +// It is sometimes necessarily to interface with foreign code, +// such as a C library. In Odin, this is achieved through the +// foreign system. You can “import” a library into the code +// using the same semantics as a normal import declaration. + +// This foreign import declaration will create a +// “foreign import name” which can then be used to associate +// entities within a foreign block. + +foreign kernel32 { +ExitProcess :: proc "stdcall" (exit_code: u32) --- +} + +// Foreign procedure declarations have the cdecl/c calling +// convention by default unless specified otherwise. Due to +// foreign procedures do not have a body declared within this +// code, you need append the --- symbol to the end to distinguish +// it as a procedure literal without a body and not a procedure type. + +// The attributes system can be used to change specific properties +// of entities declared within a block: + +@(default_calling_convention = "std") +foreign kernel32 { +@(link_name="GetLastError") get_last_error :: proc() -> i32 --- +} + +// Example using the link_prefix attribute +@(default_calling_convention = "std") +@(link_prefix = "Get") +foreign kernel32 { +LastError :: proc() -> i32 --- +} +} +} + +ranged_fields_for_array_compound_literals :: proc() { +fmt.println("\n#ranged fields for array compound literals") +{ // Normal Array Literal +foo := [?]int{1, 4, 9, 16} +fmt.println(foo) +} +{ // Indexed +foo := [?]int{ +3 = 16, +1 = 4, +2 = 9, +0 = 1, +} +fmt.println(foo) +} +{ // Ranges +i := 2 +foo := [?]int { +0 = 123, +5..=9 = 54, +10..<16 = i*3 + (i-1)*2, +} +#assert(len(foo) == 16) +fmt.println(foo) // [123, 0, 0, 0, 0, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8] +} +{ // Slice and Dynamic Array support +i := 2 +foo_slice := []int { +0 = 123, +5..=9 = 54, +10..<16 = i*3 + (i-1)*2, +} +assert(len(foo_slice) == 16) +fmt.println(foo_slice) // [123, 0, 0, 0, 0, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8] + +foo_dynamic_array := [dynamic]int { +0 = 123, +5..=9 = 54, +10..<16 = i*3 + (i-1)*2, +} +assert(len(foo_dynamic_array) == 16) +fmt.println(foo_dynamic_array) // [123, 0, 0, 0, 0, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8] +} +} + +deprecated_attribute :: proc() { +@(deprecated="Use foo_v2 instead") +foo_v1 :: proc(x: int) { +fmt.println("foo_v1") +} +foo_v2 :: proc(x: int) { +fmt.println("foo_v2") +} + +// NOTE: Uncomment to see the warning messages +// foo_v1(1) +} + +range_statements_with_multiple_return_values :: proc() { +fmt.println("\n#range statements with multiple return values") +My_Iterator :: struct { +index: int, +data: []i32, +} +make_my_iterator :: proc(data: []i32) -> My_Iterator { +return My_Iterator{data = data} +} +my_iterator :: proc(it: ^My_Iterator) -> (val: i32, idx: int, cond: bool) { +if cond = it.index < len(it.data); cond { +val = it.data[it.index] +idx = it.index +it.index += 1 +} +return +} + +data := make([]i32, 6) +for _, i in data { +data[i] = i32(i*i) +} + +{ // Manual Style +it := make_my_iterator(data) +for { +val, _, cond := my_iterator(&it) +if !cond { +break +} +fmt.println(val) +} +} +{ // or_break +it := make_my_iterator(data) +loop: for { +val, _ := my_iterator(&it) or_break loop +fmt.println(val) +} +} +{ // first value +it := make_my_iterator(data) +for val in my_iterator(&it) { +fmt.println(val) +} +} +{ // first and second value +it := make_my_iterator(data) +for val, idx in my_iterator(&it) { +fmt.println(val, idx) +} +} +} + + +soa_struct_layout :: proc() { +fmt.println("\n#SOA Struct Layout") + +{ +Vector3 :: struct {x, y, z: f32} + +N :: 2 +v_aos: [N]Vector3 +v_aos[0].x = 1 +v_aos[0].y = 4 +v_aos[0].z = 9 + +fmt.println(len(v_aos)) +fmt.println(v_aos[0]) +fmt.println(v_aos[0].x) +fmt.println(&v_aos[0].x) + +v_aos[1] = {0, 3, 4} +v_aos[1].x = 2 +fmt.println(v_aos[1]) +fmt.println(v_aos) + +v_soa: #soa[N]Vector3 + +v_soa[0].x = 1 +v_soa[0].y = 4 +v_soa[0].z = 9 + + +// Same syntax as AOS and treat as if it was an array +fmt.println(len(v_soa)) +fmt.println(v_soa[0]) +fmt.println(v_soa[0].x) +fmt.println(&v_soa[0].x) +v_soa[1] = {0, 3, 4} +v_soa[1].x = 2 +fmt.println(v_soa[1]) + +// Can use SOA syntax if necessary +v_soa.x[0] = 1 +v_soa.y[0] = 4 +v_soa.z[0] = 9 +fmt.println(v_soa.x[0]) + +// Same pointer addresses with both syntaxes +assert(&v_soa[0].x == &v_soa.x[0]) + + +// Same fmt printing +fmt.println(v_aos) +fmt.println(v_soa) +} +{ +// Works with arrays of length <= 4 which have the implicit fields xyzw/rgba +Vector3 :: distinct [3]f32 + +N :: 2 +v_aos: [N]Vector3 +v_aos[0].x = 1 +v_aos[0].y = 4 +v_aos[0].z = 9 + +v_soa: #soa[N]Vector3 + +v_soa[0].x = 1 +v_soa[0].y = 4 +v_soa[0].z = 9 +} +{ +// SOA Slices +// Vector3 :: struct {x, y, z: f32} +Vector3 :: struct {x: i8, y: i16, z: f32} + +N :: 3 +v: #soa[N]Vector3 +v[0].x = 1 +v[0].y = 4 +v[0].z = 9 + +s: #soa[]Vector3 +s = v[:] +assert(len(s) == N) +fmt.println(s) +fmt.println(s[0].x) + +a := s[1:2] +assert(len(a) == 1) +fmt.println(a) + +d: #soa[dynamic]Vector3 + +append_soa(&d, Vector3{1, 2, 3}, Vector3{4, 5, 9}, Vector3{-4, -4, 3}) +fmt.println(d) +fmt.println(len(d)) +fmt.println(cap(d)) +fmt.println(d[:]) +} +{ // soa_zip and soa_unzip +fmt.println("\nsoa_zip and soa_unzip") + +x := []i32{1, 3, 9} +y := []f32{2, 4, 16} +z := []b32{true, false, true} + +// produce an #soa slice the normal slices passed +s := soa_zip(a=x, b=y, c=z) + +// iterate over the #soa slice +for v, i in s { +fmt.println(v, i) // exactly the same as s[i] +// NOTE: 'v' is NOT a temporary value but has a specialized addressing mode +// which means that when accessing v.a etc, it does the correct transformation +// internally: +// s[i].a === s.a[i] +fmt.println(v.a, v.b, v.c) +} + +// Recover the slices from the #soa slice +a, b, c := soa_unzip(s) +fmt.println(a, b, c) +} +} + +constant_literal_expressions :: proc() { +fmt.println("\n#constant literal expressions") + +Bar :: struct {x, y: f32} +Foo :: struct {a, b: int, using c: Bar} + +FOO_CONST :: Foo{b = 2, a = 1, c = {3, 4}} + + +fmt.println(FOO_CONST.a) +fmt.println(FOO_CONST.b) +fmt.println(FOO_CONST.c) +fmt.println(FOO_CONST.c.x) +fmt.println(FOO_CONST.c.y) +fmt.println(FOO_CONST.x) // using works as expected +fmt.println(FOO_CONST.y) + +fmt.println("-------") + +ARRAY_CONST :: [3]int{1 = 4, 2 = 9, 0 = 1} + +fmt.println(ARRAY_CONST[0]) +fmt.println(ARRAY_CONST[1]) +fmt.println(ARRAY_CONST[2]) + +fmt.println("-------") + +FOO_ARRAY_DEFAULTS :: [3]Foo{{}, {}, {}} +fmt.println(FOO_ARRAY_DEFAULTS[2].x) + +fmt.println("-------") + +Baz :: enum{A=5, B, C, D} +ENUM_ARRAY_CONST :: [Baz]int{.A ..= .C = 1, .D = 16} + +fmt.println(ENUM_ARRAY_CONST[.A]) +fmt.println(ENUM_ARRAY_CONST[.B]) +fmt.println(ENUM_ARRAY_CONST[.C]) +fmt.println(ENUM_ARRAY_CONST[.D]) + +fmt.println("-------") + +Sparse_Baz :: enum{A=5, B, C, D=16} +#assert(len(Sparse_Baz) < len(#sparse[Sparse_Baz]int)) +SPARSE_ENUM_ARRAY_CONST :: #sparse[Sparse_Baz]int{.A ..= .C = 1, .D = 16} + +fmt.println(SPARSE_ENUM_ARRAY_CONST[.A]) +fmt.println(SPARSE_ENUM_ARRAY_CONST[.B]) +fmt.println(SPARSE_ENUM_ARRAY_CONST[.C]) +fmt.println(SPARSE_ENUM_ARRAY_CONST[.D]) + +fmt.println("-------") + + +STRING_CONST :: "Hellope!" + +fmt.println(STRING_CONST[0]) +fmt.println(STRING_CONST[2]) +fmt.println(STRING_CONST[3]) + +fmt.println(STRING_CONST[0:5]) +fmt.println(STRING_CONST[3:][:4]) +} + +union_maybe :: proc() { +fmt.println("\n#union based maybe") + +// NOTE: This is already built-in, and this is just a reimplementation to explain the behaviour +Maybe :: union($T: typeid) {T} + +i: Maybe(u8) +p: Maybe(^u8) // No tag is stored for pointers, nil is the sentinel value + +// Tag size will be as small as needed for the number of variants +#assert(size_of(i) == size_of(u8) + size_of(u8)) +// No need to store a tag here, the `nil` state is shared with the variant's `nil` +#assert(size_of(p) == size_of(^u8)) + +i = 123 +x := i.? +y, y_ok := p.? +p = &x +z, z_ok := p.? + +fmt.println(i, p) +fmt.println(x, &x) +fmt.println(y, y_ok) +fmt.println(z, z_ok) +} + +dummy_procedure :: proc() { +fmt.println("dummy_procedure") +} + +explicit_context_definition :: proc "c" () { +// Try commenting the following statement out below +context = runtime.default_context() + +fmt.println("\n#explicit context definition") +dummy_procedure() +} + +or_else_operator :: proc() { +fmt.println("\n#'or_else'") +{ +m: map[string]int +i: int +ok: bool + +if i, ok = m["hellope"]; !ok { +i = 123 +} +// The above can be mapped to 'or_else' +i = m["hellope"] or_else 123 + +assert(i == 123) +} +{ +// 'or_else' can be used with type assertions too, as they +// have optional ok semantics +v: union{int, f64} +i: int +i = v.(int) or_else 123 +i = v.? or_else 123 // Type inference magic +assert(i == 123) + +m: Maybe(int) +i = m.? or_else 456 +assert(i == 456) +} +} + +or_return_operator :: proc() { +fmt.println("\n#'or_return'") +// The concept of 'or_return' will work by popping off the end value in a multiple +// valued expression and checking whether it was not 'nil' or 'false', and if so, +// set the end return value to value if possible. If the procedure only has one +// return value, it will do a simple return. If the procedure had multiple return +// values, 'or_return' will require that all parameters be named so that the end +// value could be assigned to by name and then an empty return could be called. + +Error :: enum { +None, +Something_Bad, +Something_Worse, +The_Worst, +Your_Mum, +} + +caller_1 :: proc() -> Error { +return .None +} + +caller_2 :: proc() -> (int, Error) { +return 123, .None +} +caller_3 :: proc() -> (int, int, Error) { +return 123, 345, .None +} + +foo_1 :: proc() -> Error { +// This can be a common idiom in many code bases +n0, err := caller_2() +if err != nil { +return err +} + +// The above idiom can be transformed into the following +n1 := caller_2() or_return + + +// And if the expression is 1-valued, it can be used like this +caller_1() or_return +// which is functionally equivalent to +if err1 := caller_1(); err1 != nil { +return err1 +} + +// Multiple return values still work with 'or_return' as it only +// pops off the end value in the multi-valued expression +n0, n1 = caller_3() or_return + +return .None +} +foo_2 :: proc() -> (n: int, err: Error) { +// It is more common that your procedure returns multiple values +// If 'or_return' is used within a procedure multiple parameters (2+), +// then all the parameters must be named so that the remaining parameters +// so that a bare 'return' statement can be used + +// This can be a common idiom in many code bases +x: int +x, err = caller_2() +if err != nil { +return +} + +// The above idiom can be transformed into the following +y := caller_2() or_return +_ = y + +// And if the expression is 1-valued, it can be used like this +caller_1() or_return + +// which is functionally equivalent to +if err1 := caller_1(); err1 != nil { +err = err1 +return +} + +// If using a non-bare 'return' statement is required, setting the return values +// using the normal idiom is a better choice and clearer to read. +if z, zerr := caller_2(); zerr != nil { +return -345 * z, zerr +} + +defer if err != nil { +fmt.println("Error in", #procedure, ":" , err) +} + +n = 123 +return +} + +foo_1() +foo_2() +} + + +or_break_and_or_continue_operators :: proc() { +fmt.println("\n#'or_break' and 'or_continue'") +// The concept of 'or_break' and 'or_continue' is very similar to that of 'or_return'. +// The difference is that unlike 'or_return', the value does not get returned from +// the current procedure but rather discarded if it is 'false' or not 'nil', and then +// the specified branch (i.e. break or continue). +// The or branch expression can be labelled if a specific statement needs to be used. + +Error :: enum { +None, +Something_Bad, +Something_Worse, +The_Worst, +Your_Mum, +} + +caller_1 :: proc() -> Error { +return .Something_Bad +} + +caller_2 :: proc() -> (int, Error) { +return 123, .Something_Worse +} +caller_3 :: proc() -> (int, int, Error) { +return 123, 345, .None +} + +for { // common approach +err := caller_1() +if err != nil { +break +} +} +for { // or_break approach +caller_1() or_break +} + +for { // or_break approach with multiple values +n := caller_2() or_break +_ = n +} + +loop: for { // or_break approach with named label +n := caller_2() or_break loop +_ = n +} + +for { // or_continue +x, y := caller_3() or_continue +_, _ = x, y + +break +} + +continue_loop: for { // or_continue with named label +x, y := caller_3() or_continue continue_loop +_, _ = x, y + +break +} + +} + +arbitrary_precision_mathematics :: proc() { +fmt.println("\n# core:math/big") + +print_bigint :: proc(name: string, a: ^big.Int, base := i8(10), print_name := true, newline := true, print_extra_info := true) { +big.assert_if_nil(a) + +as, err := big.itoa(a, base) +defer delete(as) + +cb := big.internal_count_bits(a) +if print_name { +fmt.print(name) +} +if err != nil { +fmt.printf(" (Error: %v) ", err) +} +fmt.printf(as) +if print_extra_info { +fmt.printf(" (base: %v, bits: %v, digits: %v)", base, cb, a.used) +} +if newline { +fmt.println() +} +} + +a, b, c, d, e, f, res := &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{} +defer big.destroy(a, b, c, d, e, f, res) + +// Set the context RNG to something that does not require +// cryptographic entropy (not supported on all targets). +context.random_generator = rand.xoshiro256_random_generator() + +// How many bits should the random prime be? +bits := 64 +// Number of Rabin-Miller trials, -1 for automatic. +trials := -1 + +// Default prime generation flags +flags := big.Primality_Flags{} + +err := big.internal_random_prime(a, bits, trials, flags) +if err != nil { +fmt.printf("Error %v while generating random prime.\n", err) +} else { +print_bigint("Random Prime A: ", a, 10) +fmt.printf("Random number iterations until prime found: %v\n", big.RANDOM_PRIME_ITERATIONS_USED) +} + +// If we want to pack this Int into a buffer of u32, how many do we need? +count := big.internal_int_pack_count(a, u32) +buf := make([]u32, count) +defer delete(buf) + +written: int +written, err = big.internal_int_pack(a, buf) +fmt.printf("\nPacked into u32 buf: %v | err: %v | written: %v\n", buf, err, written) + +// If we want to pack this Int into a buffer of bytes of which only the bottom 6 bits are used, how many do we need? +nails := 2 + +count = big.internal_int_pack_count(a, u8, nails) +byte_buf := make([]u8, count) +defer delete(byte_buf) + +written, err = big.internal_int_pack(a, byte_buf, nails) +fmt.printf("\nPacked into buf of 6-bit bytes: %v | err: %v | written: %v\n", byte_buf, err, written) + + + +// Pick another random big Int, not necesssarily prime. +err = big.random(b, 2048) +print_bigint("\n2048 bit random number: ", b) + +// Calculate GCD + LCM in one fell swoop +big.gcd_lcm(c, d, a, b) + +print_bigint("\nGCD of random prime A and random number B: ", c) +print_bigint("\nLCM of random prime A and random number B (in base 36): ", d, 36) +} + +matrix_type :: proc() { +fmt.println("\n# matrix type") +// A matrix is a mathematical type built into Odin. It is a regular array of numbers, +// arranged in rows and columns + +{ +// The following represents a matrix that has 2 rows and 3 columns +m: matrix[2, 3]f32 + +m = matrix[2, 3]f32{ +1, 9, -13, +20, 5, -6, +} + +// Element types of integers, float, and complex numbers are supported by matrices. +// There is no support for booleans, quaternions, or any compound type. + +// Indexing a matrix can be used with the matrix indexing syntax +// This mirrors other type usages: type on the left, usage on the right + +elem := m[1, 2] // row 1, column 2 +assert(elem == -6) + + +// Scalars act as if they are scaled identity matrices +// and can be assigned to matrices as them +b := matrix[2, 2]f32{} +f := f32(3) +b = f + +fmt.println("b", b) +fmt.println("b == f", b == f) + +} + +{ // Matrices support multiplication between matrices +a := matrix[2, 3]f32{ +2, 3, 1, +4, 5, 0, +} + +b := matrix[3, 2]f32{ +1, 2, +3, 4, +5, 6, +} + +fmt.println("a", a) +fmt.println("b", b) + +c := a * b +#assert(type_of(c) == matrix[2, 2]f32) +fmt.println("c = a * b", c) +} + +{ // Matrices support multiplication between matrices and arrays +m := matrix[4, 4]f32{ +1, 2, 3, 4, +5, 5, 4, 2, +0, 1, 3, 0, +0, 1, 4, 1, +} + +v := [4]f32{1, 5, 4, 3} + +// treating 'v' as a column vector +fmt.println("m * v", m * v) + +// treating 'v' as a row vector +fmt.println("v * m", v * m) + +// Support with non-square matrices +s := matrix[2, 4]f32{ // [4][2]f32 +2, 4, 3, 1, +7, 8, 6, 5, +} + +w := [2]f32{1, 2} +r: [4]f32 = w * s +fmt.println("r", r) +} + +{ // Component-wise operations +// if the element type supports it +// Not support for '/', '%', or '%%' operations + +a := matrix[2, 2]i32{ +1, 2, +3, 4, +} + +b := matrix[2, 2]i32{ +-5, 1, +9, -7, +} + +c0 := a + b +c1 := a - b +c2 := a & b +c3 := a | b +c4 := a ~ b +c5 := a &~ b + +// component-wise multiplication +// since a * b would be a standard matrix multiplication +c6 := intrinsics.hadamard_product(a, b) + + +fmt.println("a + b", c0) +fmt.println("a - b", c1) +fmt.println("a & b", c2) +fmt.println("a | b", c3) +fmt.println("a ~ b", c4) +fmt.println("a &~ b", c5) +fmt.println("hadamard_product(a, b)", c6) +} + +{ // Submatrix casting square matrices +// Casting a square matrix to another square matrix with same element type +// is supported. +// If the cast is to a smaller matrix type, the top-left submatrix is taken. +// If the cast is to a larger matrix type, the matrix is extended with zeros +// everywhere and ones in the diagonal for the unfilled elements of the +// extended matrix. + +mat2 :: distinct matrix[2, 2]f32 +mat4 :: distinct matrix[4, 4]f32 + +m2 := mat2{ +1, 3, +2, 4, +} + +m4 := mat4(m2) +assert(m4[2, 2] == 1) +assert(m4[3, 3] == 1) +fmt.printf("m2 %#v\n", m2) +fmt.println("m4", m4) +fmt.println("mat2(m4)", mat2(m4)) +assert(mat2(m4) == m2) + +b4 := mat4{ +1, 2, 0, 0, +3, 4, 0, 0, +5, 0, 6, 0, +0, 7, 0, 8, +} +fmt.println("b4", intrinsics.matrix_flatten(b4)) +} + +{ // Casting non-square matrices +// Casting a matrix to another matrix is allowed as long as they share +// the same element type and the number of elements (rows*columns). +// Matrices in Odin are stored in column-major order, which means +// the casts will preserve this element order. + +mat2x4 :: distinct matrix[2, 4]f32 +mat4x2 :: distinct matrix[4, 2]f32 + +x := mat2x4{ +1, 3, 5, 7, +2, 4, 6, 8, +} + +y := mat4x2(x) +fmt.println("x", x) +fmt.println("y", y) +} + +// TECHNICAL INFORMATION: the internal representation of a matrix in Odin is stored +// in column-major format +// e.g. matrix[2, 3]f32 is internally [3][2]f32 (with different a alignment requirement) +// Column-major is used in order to utilize (SIMD) vector instructions effectively on +// modern hardware, if possible. +// +// Unlike normal arrays, matrices try to maximize alignment to allow for the (SIMD) vectorization +// properties whilst keeping zero padding (either between columns or at the end of the type). +// +// Zero padding is a compromise for use with third-party libraries, instead of optimizing for performance. +// Padding between columns was not taken even if that would have allowed each column to be loaded +// individually into a SIMD register with the correct alignment properties. +// +// Currently, matrices are limited to a maximum of 16 elements (rows*columns), and a minimum of 1 element. +// This is because matrices are stored as values (not a reference type), and thus operations on them will +// be stored on the stack. Restricting the maximum element count minimizing the possibility of stack overflows. + +// 'intrinsics' Procedures (Compiler Level) +// transpose(m) +// transposes a matrix +// outer_product(a, b) +// takes two array-like data types and returns the outer product +// of the values in a matrix +// hadamard_product(a, b) +// component-wise multiplication of two matrices of the same type +// matrix_flatten(m) +// converts the matrix into a flatten array of elements +// in column-major order +// Example: +// m := matrix[2, 2]f32{ +// x0, x1, +// y0, y1, +// } +// array: [4]f32 = matrix_flatten(m) +// assert(array == {x0, y0, x1, y1}) +// conj(x) +// conjugates the elements of a matrix for complex element types only + +// Procedures in "core:math/linalg" and related (Runtime Level) (all square matrix procedures) +// determinant(m) +// adjugate(m) +// inverse(m) +// inverse_transpose(m) +// hermitian_adjoint(m) +// trace(m) +// matrix_minor(m) +} + +bit_field_type :: proc() { +fmt.println("\n# bit_field type") +// A `bit_field` is a record type in Odin that is akin to a bit-packed struct. +// IMPORTNAT NOTE: `bit_field` is NOT equivalent to `bit_set` as it has different sematics and use cases. + +{ +// `bit_field` fields are accessed by using a dot: +Foo :: bit_field u16 { // backing type must be an integer or array of integers +x: i32 | 3, // signed integers will be signed extended on use +y: u16 | 2 + 3, // general expressions +z: My_Enum | SOME_CONSTANT, // ability to define the bit-width elsewhere +w: bool | 2 when SOME_CONSTANT > 10 else 1, +} + +v := Foo{} +v.x = 3 // truncates the value to fit into 3 bits +fmt.println(v.x) // accessing will convert `v.x` to an `i32` and do an appropriate sign extension + + +My_Enum :: enum u8 {A, B, C, D} +SOME_CONSTANT :: 7 +} + +{ +// A `bit_field` is different from a struct in that you must specify the backing type. +// This backing type must be an integer or a fixed-length array of integers. +// This is useful if there needs to be a specific alignment or access pattern for the record. + +Bar :: bit_field u32 {} +Baz :: bit_field [4]u8 {} +} + +// IMPORTANT NOTES: +// * If _all_ of the fields in a bit_field are 1-bit in size and they are all booleans, +// please consider using a `bit_set` instead. +// * Odin's `bit_field` and C's bit-fields might not be compatible +// * Odin's `bit_field`s have a well defined layout (Least-Significant-Bit) +// * C's bit-fields on `struct`s are undefined and are not portable across targets and compilers +// * A `bit_field`'s field type can only be one of the following: +// * Integer +// * Boolean +// * Enum +} + +main :: proc() { +/* +For More Odin Examples - https://github.com/odin-lang/examples +This repository contains examples of how certain things can be accomplished +in idiomatic Odin, allowing you learn its semantics, as well as how to use +parts of the core and vendor package collections. +*/ + +when true { +the_basics() +control_flow() +named_proc_return_parameters() +variadic_procedures() +explicit_procedure_overloading() +struct_type() +union_type() +using_statement() +implicit_context_system() +parametric_polymorphism() +threading_example() +array_programming() +map_type() +implicit_selector_expression() +partial_switch() +cstring_example() +bit_set_type() +deferred_procedure_associations() +reflection() +quaternions() +unroll_for_statement() +where_clauses() +foreign_system() +ranged_fields_for_array_compound_literals() +deprecated_attribute() +range_statements_with_multiple_return_values() +soa_struct_layout() +constant_literal_expressions() +union_maybe() +explicit_context_definition() +or_else_operator() +or_return_operator() +or_break_and_or_continue_operators() +arbitrary_precision_mathematics() +matrix_type() +bit_field_type() +} +} +// END_INDENT diff --git a/runtime/indent/testdir/odin.ok b/runtime/indent/testdir/odin.ok new file mode 100644 index 0000000000..2e0aba77a7 --- /dev/null +++ b/runtime/indent/testdir/odin.ok @@ -0,0 +1,2631 @@ +// vim: set ft=odin sw=4 ts=8 et: + +// START_INDENT + +#+vet !using-stmt !using-param +#+feature dynamic-literals using-stmt +package main + +import "core:fmt" +import "core:mem" +import "core:os" +import "core:thread" +import "core:time" +import "core:reflect" +import "base:runtime" +import "base:intrinsics" +import "core:math/big" +import "core:math/rand" + +/* + Odin is a general-purpose programming language with distinct typing built + for high performance, modern systems and data-oriented programming. + + Odin is the C alternative for the Joy of Programming. + + # Installing Odin + Getting Started - https://odin-lang.org/docs/install/ + Instructions for downloading and install the Odin compiler and libraries. + + # Learning Odin + Getting Started - https://odin-lang.org/docs/install/ + Getting Started with Odin. Downloading, installing, and getting your + first program to compile and run. + Overview of Odin - https://odin-lang.org/docs/overview/ + An overview of the Odin programming language and its features. + Frequently Asked Questions (FAQ) - https://odin-lang.org/docs/faq/ + Answers to common questions about Odin. + Packages - https://pkg.odin-lang.org/ + Documentation for all the official packages part of the + core and vendor library collections. + Nightly Builds - https://odin-lang.org/docs/nightly/ + Get the latest nightly builds of Odin. + More Odin Examples - https://github.com/odin-lang/examples + This repository contains examples of how certain things can be accomplished + in idiomatic Odin, allowing you learn its semantics, as well as how to use + parts of the core and vendor package collections. + */ + +the_basics :: proc() { + fmt.println("\n# the basics") + + { // The Basics + + // os.args holds the path to the current executable and any arguments passed to it. + if len(os.args) == 1 { + fmt.printf("Hellope from %v.\n", os.args[0]) + } else if len(os.args) > 2 { + fmt.printf("%v, %v! from %v.\n", os.args[1], os.args[2], os.args[0]) + } + + // Lexical elements and literals + // A comment + + my_integer_variable: int // A comment for documentaton + + // Multi-line comments begin with /* and end with */. Multi-line comments can + // also be nested (unlike in C): + /* + You can have any text or code here and + have it be commented. + /* + NOTE: comments can be nested! + */ + */ + + // String literals are enclosed in double quotes and character literals in single quotes. + // Special characters are escaped with a backslash \ + + some_string := "This is a string" + _ = 'A' // unicode codepoint literal + _ = '\n' + _ = "C:\\Windows\\notepad.exe" + // Raw string literals are enclosed with single back ticks + _ = `C:\Windows\notepad.exe` + + // The length of a string in bytes can be found using the built-in `len` procedure: + _ = len("Foo") + _ = len(some_string) + + + // Numbers + + // Numerical literals are written similar to most other programming languages. + // A useful feature in Odin is that underscores are allowed for better + // readability: 1_000_000_000 (one billion). A number that contains a dot is a + // floating point literal: 1.0e9 (one billion). If a number literal is suffixed + // with i, is an imaginary number literal: 2i (2 multiply the square root of -1). + + // Binary literals are prefixed with 0b, octal literals with 0o, and hexadecimal + // literals 0x. A leading zero does not produce an octal constant (unlike C). + + // In Odin, if a numeric constant can be represented by a type without + // precision loss, it will automatically convert to that type. + + x: int = 1.0 // A float literal but it can be represented by an integer without precision loss + // Constant literals are “untyped” which means that they can implicitly convert to a type. + + y: int // `y` is typed of type `int` + y = 1 // `1` is an untyped integer literal which can implicitly convert to `int` + + z: f64 // `z` is typed of type `f64` (64-bit floating point number) + z = 1 // `1` is an untyped integer literal which can be implicitly converted to `f64` + // No need for any suffixes or decimal places like in other languages + // (with the exception of negative zero, which must be given as `-0.0`) + // CONSTANTS JUST WORK!!! + + + // Assignment statements + h: int = 123 // declares a new variable `h` with type `int` and assigns a value to it + h = 637 // assigns a new value to `h` + + // `=` is the assignment operator + + // You can assign multiple variables with it: + a, b := 1, "hello" // declares `a` and `b` and infers the types from the assignments + b, a = "byte", 0 + + // Note: `:=` is two tokens, `:` and `=`. The following are equivalent, + /* + i: int = 123 + i: = 123 + i := 123 + */ + + // Constant declarations + // Constants are entities (symbols) which have an assigned value. + // The constant’s value cannot be changed. + // The constant’s value must be able to be evaluated at compile time: + X :: "what" // constant `X` has the untyped string value "what" + + // Constants can be explicitly typed like a variable declaration: + Y : int : 123 + Z :: Y + 7 // constant computations are possible + + _ = my_integer_variable + _ = x + } +} + +control_flow :: proc() { + fmt.println("\n# control flow") + { // Control flow + // For loop + // Odin has only one loop statement, the `for` loop + + // Basic for loop + for i := 0; i < 10; i += 1 { + fmt.println(i) + } + + // NOTE: Unlike other languages like C, there are no parentheses `( )` surrounding the three components. + // Braces `{ }` or a `do` are always required + for i := 0; i < 10; i += 1 { } + // for i := 0; i < 10; i += 1 do fmt.print() + + // The initial and post statements are optional + i := 0 + for ; i < 10; { + i += 1 + } + + // These semicolons can be dropped. This `for` loop is equivalent to C's `while` loop + i = 0 + for i < 10 { + i += 1 + } + + // If the condition is omitted, an infinite loop is produced: + for { + break + } + + // Range-based for loop + // The basic for loop + for j := 0; j < 10; j += 1 { + fmt.println(j) + } + // can also be written + for j in 0..<10 { + fmt.println(j) + } + for j in 0..=9 { + fmt.println(j) + } + + // Certain built-in types can be iterated over + some_string := "Hello, 世界" + for character in some_string { // Strings are assumed to be UTF-8 + fmt.println(character) + } + + some_array := [3]int{1, 4, 9} + for value in some_array { + fmt.println(value) + } + + some_slice := []int{1, 4, 9} + for value in some_slice { + fmt.println(value) + } + + some_dynamic_array := [dynamic]int{1, 4, 9} + defer delete(some_dynamic_array) + for value in some_dynamic_array { + fmt.println(value) + } + + + some_map := map[string]int{"A" = 1, "C" = 9, "B" = 4} + defer delete(some_map) + for key in some_map { + fmt.println(key) + } + + // Alternatively a second index value can be added + for character, index in some_string { + fmt.println(index, character) + } + for value, index in some_array { + fmt.println(index, value) + } + for value, index in some_slice { + fmt.println(index, value) + } + for value, index in some_dynamic_array { + fmt.println(index, value) + } + for key, value in some_map { + fmt.println(key, value) + } + + // The iterated values are copies and cannot be written to. + // The following idiom is useful for iterating over a container in a by-reference manner: + for _, idx in some_slice { + some_slice[idx] = (idx+1)*(idx+1) + } + + + // If statements + x := 123 + if x >= 0 { + fmt.println("x is positive") + } + + if y := -34; y < 0 { + fmt.println("y is negative") + } + + if y := 123; y < 0 { + fmt.println("y is negative") + } else if y == 0 { + fmt.println("y is zero") + } else { + fmt.println("y is positive") + } + + // Switch statement + // A switch statement is another way to write a sequence of if-else statements. + // In Odin, the default case is denoted as a case without any expression. + + #partial switch arch := ODIN_ARCH; arch { + case .i386: + fmt.println("32-bit") + case .amd64: + fmt.println("64-bit") + case: // default + fmt.println("Unsupported architecture") + } + + // Odin’s `switch` is like one in C or C++, except that Odin only runs the selected case. + // This means that a `break` statement is not needed at the end of each case. + // Another important difference is that the case values need not be integers nor constants. + + // To achieve a C-like fall through into the next case block, the keyword `fallthrough` can be used. + one_angry_dwarf :: proc() -> int { + fmt.println("one_angry_dwarf was called") + return 1 + } + + switch j := 0; j { + case 0: + case one_angry_dwarf(): + } + + // A switch statement without a condition is the same as `switch true`. + // This can be used to write a clean and long if-else chain and have the + // ability to break if needed + + switch { + case x < 0: + fmt.println("x is negative") + case x == 0: + fmt.println("x is zero") + case: + fmt.println("x is positive") + } + + // A `switch` statement can also use ranges like a range-based loop: + switch c := 'j'; c { + case 'A'..='Z', 'a'..='z', '0'..='9': + fmt.println("c is alphanumeric") + } + + switch x { + case 0..<10: + fmt.println("units") + case 10..<13: + fmt.println("pre-teens") + case 13..<20: + fmt.println("teens") + case 20..<30: + fmt.println("twenties") + } + } + + { // Defer statement + // A defer statement defers the execution of a statement until the end of + // the scope it is in. + + // The following will print 4 then 234: + { + x := 123 + defer fmt.println(x) + { + defer x = 4 + x = 2 + } + fmt.println(x) + + x = 234 + } + + // You can defer an entire block too: + { + bar :: proc() {} + + defer { + fmt.println("1") + fmt.println("2") + } + + cond := false + defer if cond { + bar() + } + } + + // Defer statements are executed in the reverse order that they were declared: + { + defer fmt.println("1") + defer fmt.println("2") + defer fmt.println("3") + } + // Will print 3, 2, and then 1. + + if false { + f, err := os.open("my_file.txt") + if err != nil { + // handle error + } + defer os.close(f) + // rest of code + } + } + + { // When statement + /* + The when statement is almost identical to the if statement but with some differences: + + * Each condition must be a constant expression as a when + statement is evaluated at compile time. + * The statements within a branch do not create a new scope + * The compiler checks the semantics and code only for statements + that belong to the first condition that is true + * An initial statement is not allowed in a when statement + * when statements are allowed at file scope + */ + + // Example + when ODIN_ARCH == .i386 { + fmt.println("32 bit") + } else when ODIN_ARCH == .amd64 { + fmt.println("64 bit") + } else { + fmt.println("Unknown architecture") + } + // The when statement is very useful for writing platform specific code. + // This is akin to the #if construct in C’s preprocessor however, in Odin, + // it is type checked. + } + + { // Branch statements + cond, cond1, cond2 := false, false, false + one_step :: proc() { fmt.println("one_step") } + beyond :: proc() { fmt.println("beyond") } + + // Break statement + for cond { + switch { + case: + if cond { + break // break out of the `switch` statement + } + } + + break // break out of the `for` statement + } + + loop: for cond1 { + for cond2 { + break loop // leaves both loops + } + } + + // Continue statement + for cond { + if cond2 { + continue + } + fmt.println("Hellope") + } + + // Fallthrough statement + + // Odin’s switch is like one in C or C++, except that Odin only runs the selected + // case. This means that a break statement is not needed at the end of each case. + // Another important difference is that the case values need not be integers nor + // constants. + + // fallthrough can be used to explicitly fall through into the next case block: + + switch i := 0; i { + case 0: + one_step() + fallthrough + case 1: + beyond() + } + } +} + + +named_proc_return_parameters :: proc() { + fmt.println("\n# named proc return parameters") + + foo0 :: proc() -> int { + return 123 + } + foo1 :: proc() -> (a: int) { + a = 123 + return + } + foo2 :: proc() -> (a, b: int) { + // Named return values act like variables within the scope + a = 321 + b = 567 + return b, a + } + fmt.println("foo0 =", foo0()) // 123 + fmt.println("foo1 =", foo1()) // 123 + fmt.println("foo2 =", foo2()) // 567 321 +} + +variadic_procedures :: proc() { + fmt.println("\n# variadic procedures") + sum :: proc(nums: ..int, init_value:= 0) -> (result: int) { + result = init_value + for n in nums { + result += n + } + return + } + fmt.println("sum(()) =", sum()) + fmt.println("sum(1, 2) =", sum(1, 2)) + fmt.println("sum(1, 2, 3, 4, 5) =", sum(1, 2, 3, 4, 5)) + fmt.println("sum(1, 2, 3, 4, 5, init_value = 5) =", sum(1, 2, 3, 4, 5, init_value = 5)) + + // pass a slice as varargs + odds := []int{1, 3, 5} + fmt.println("odds =", odds) + fmt.println("sum(..odds) =", sum(..odds)) + fmt.println("sum(..odds, init_value = 5) =", sum(..odds, init_value = 5)) +} + + +explicit_procedure_overloading :: proc() { + fmt.println("\n# explicit procedure overloading") + + add_ints :: proc(a, b: int) -> int { + x := a + b + fmt.println("add_ints", x) + return x + } + add_floats :: proc(a, b: f32) -> f32 { + x := a + b + fmt.println("add_floats", x) + return x + } + add_numbers :: proc(a: int, b: f32, c: u8) -> int { + x := int(a) + int(b) + int(c) + fmt.println("add_numbers", x) + return x + } + + add :: proc{add_ints, add_floats, add_numbers} + + add(int(1), int(2)) + add(f32(1), f32(2)) + add(int(1), f32(2), u8(3)) + + add(1, 2) // untyped ints coerce to int tighter than f32 + add(1.0, 2.0) // untyped floats coerce to f32 tighter than int + add(1, 2, 3) // three parameters + + // Ambiguous answers + // add(1.0, 2) + // add(1, 2.0) +} + +struct_type :: proc() { + fmt.println("\n# struct type") + // A struct is a record type in Odin. It is a collection of fields. + // Struct fields are accessed by using a dot: + { + Vector2 :: struct { + x: f32, + y: f32, + } + v := Vector2{1, 2} + v.x = 4 + fmt.println(v.x) + + // Struct fields can be accessed through a struct pointer: + + v = Vector2{1, 2} + p := &v + p.x = 1335 + fmt.println(v) + + // We could write p^.x, however, it is nice to abstract the ability + // to not explicitly dereference the pointer. This is very useful when + // refactoring code to use a pointer rather than a value, and vice versa. + } + { + // A struct literal can be denoted by providing the struct’s type + // followed by {}. A struct literal must either provide all the + // arguments or none: + Vector3 :: struct { + x, y, z: f32, + } + v: Vector3 + v = Vector3{} // Zero value + v = Vector3{1, 4, 9} + + // You can list just a subset of the fields if you specify the + // field by name (the order of the named fields does not matter): + v = Vector3{z=1, y=2} + assert(v.x == 0) + assert(v.y == 2) + assert(v.z == 1) + } + { + // Structs can tagged with different memory layout and alignment requirements: + + a :: struct #align(4) {} // align to 4 bytes + b :: struct #packed {} // remove padding between fields + c :: struct #raw_union {} // all fields share the same offset (0). This is the same as C's union + } + +} + + +union_type :: proc() { + fmt.println("\n# union type") + { + val: union{int, bool} + val = 137 + if i, ok := val.(int); ok { + fmt.println(i) + } + val = true + fmt.println(val) + + val = nil + + switch v in val { + case int: fmt.println("int", v) + case bool: fmt.println("bool", v) + case: fmt.println("nil") + } + } + { + // There is a duality between `any` and `union` + // An `any` has a pointer to the data and allows for any type (open) + // A `union` has as binary blob to store the data and allows only certain types (closed) + // The following code is with `any` but has the same syntax + val: any + val = 137 + if i, ok := val.(int); ok { + fmt.println(i) + } + val = true + fmt.println(val) + + val = nil + + switch v in val { + case int: fmt.println("int", v) + case bool: fmt.println("bool", v) + case: fmt.println("nil") + } + } + + Vector3 :: distinct [3]f32 + Quaternion :: distinct quaternion128 + + // More realistic examples + { + // NOTE(bill): For the above basic examples, you may not have any + // particular use for it. However, my main use for them is not for these + // simple cases. My main use is for hierarchical types. Many prefer + // subtyping, embedding the base data into the derived types. Below is + // an example of this for a basic game Entity. + + Entity :: struct { + id: u64, + name: string, + position: Vector3, + orientation: Quaternion, + + derived: any, + } + + Frog :: struct { + using entity: Entity, + jump_height: f32, + } + + Monster :: struct { + using entity: Entity, + is_robot: bool, + is_zombie: bool, + } + + // See `parametric_polymorphism` procedure for details + new_entity :: proc($T: typeid) -> ^Entity { + t := new(T) + t.derived = t^ + return t + } + + entity := new_entity(Monster) + + switch e in entity.derived { + case Frog: + fmt.println("Ribbit") + case Monster: + if e.is_robot { fmt.println("Robotic") } + if e.is_zombie { fmt.println("Grrrr!") } + fmt.println("I'm a monster") + } + } + + { + // NOTE(bill): A union can be used to achieve something similar. Instead + // of embedding the base data into the derived types, the derived data + // in embedded into the base type. Below is the same example of the + // basic game Entity but using an union. + + Entity :: struct { + id: u64, + name: string, + position: Vector3, + orientation: Quaternion, + + derived: union {Frog, Monster}, + } + + Frog :: struct { + using entity: ^Entity, + jump_height: f32, + } + + Monster :: struct { + using entity: ^Entity, + is_robot: bool, + is_zombie: bool, + } + + // See `parametric_polymorphism` procedure for details + new_entity :: proc($T: typeid) -> ^Entity { + t := new(Entity) + t.derived = T{entity = t} + return t + } + + entity := new_entity(Monster) + + switch e in entity.derived { + case Frog: + fmt.println("Ribbit") + case Monster: + if e.is_robot { fmt.println("Robotic") } + if e.is_zombie { fmt.println("Grrrr!") } + } + + // NOTE(bill): As you can see, the usage code has not changed, only its + // memory layout. Both approaches have their own advantages but they can + // be used together to achieve different results. The subtyping approach + // can allow for a greater control of the memory layout and memory + // allocation, e.g. storing the derivatives together. However, this is + // also its disadvantage. You must either preallocate arrays for each + // derivative separation (which can be easily missed) or preallocate a + // bunch of "raw" memory; determining the maximum size of the derived + // types would require the aid of metaprogramming. Unions solve this + // particular problem as the data is stored with the base data. + // Therefore, it is possible to preallocate, e.g. [100]Entity. + + // It should be noted that the union approach can have the same memory + // layout as the any and with the same type restrictions by using a + // pointer type for the derivatives. + + /* + Entity :: struct { + ... + derived: union{^Frog, ^Monster}, + } + + Frog :: struct { + using entity: Entity, + ... + } + Monster :: struct { + using entity: Entity, + ... + + } + new_entity :: proc(T: type) -> ^Entity { + t := new(T) + t.derived = t + return t + } + */ + } +} + +using_statement :: proc() { + // IMPORTANT NOTE: `using` as a statement is an opt-in feature which can be abled + // by adding `#+feature using-stmt` to be beginning of the file + // + // `using` as a struct field modifier remains available always + + fmt.println("\n# using statement") + // using can used to bring entities declared in a scope/namespace + // into the current scope. This can be applied to import names, struct + // fields, procedure fields, and struct values. + + Vector3 :: struct{x, y, z: f32} + { + Entity :: struct { + position: Vector3, + orientation: quaternion128, + } + + // It can used like this: + foo0 :: proc(entity: ^Entity) { + fmt.println(entity.position.x, entity.position.y, entity.position.z) + } + + // The entity members can be brought into the procedure scope by using it: + foo1 :: proc(entity: ^Entity) { + using entity + fmt.println(position.x, position.y, position.z) + } + + // The using can be applied to the parameter directly: + foo2 :: proc(using entity: ^Entity) { + fmt.println(position.x, position.y, position.z) + } + + // It can also be applied to sub-fields: + foo3 :: proc(entity: ^Entity) { + using entity.position + fmt.println(x, y, z) + } + } + { + // We can also apply the using statement to the struct fields directly, + // making all the fields of position appear as if they on Entity itself: + Entity :: struct { + using position: Vector3, + orientation: quaternion128, + } + foo :: proc(entity: ^Entity) { + fmt.println(entity.x, entity.y, entity.z) + } + + + // Subtype polymorphism + // It is possible to get subtype polymorphism, similar to inheritance-like + // functionality in C++, but without the requirement of vtables or unknown + // struct layout: + + Colour :: struct {r, g, b, a: u8} + Frog :: struct { + ribbit_volume: f32, + using entity: Entity, + colour: Colour, + } + + frog: Frog + // Both work + foo(&frog.entity) + foo(&frog) + frog.x = 123 + + // Note: using can be applied to arbitrarily many things, which allows + // the ability to have multiple subtype polymorphism (but also its issues). + + // Note: using’d fields can still be referred by name. + } +} + + +implicit_context_system :: proc() { + fmt.println("\n# implicit context system") + // In each scope, there is an implicit value named context. This + // context variable is local to each scope and is implicitly passed + // by pointer to any procedure call in that scope (if the procedure + // has the Odin calling convention). + + // The main purpose of the implicit context system is for the ability + // to intercept third-party code and libraries and modify their + // functionality. One such case is modifying how a library allocates + // something or logs something. In C, this was usually achieved with + // the library defining macros which could be overridden so that the + // user could define what he wanted. However, not many libraries + // supported this in many languages by default which meant intercepting + // third-party code to see what it does and to change how it does it is + // not possible. + + c := context // copy the current scope's context + + context.user_index = 456 + { + context.allocator = my_custom_allocator() + context.user_index = 123 + what_a_fool_believes() // the `context` for this scope is implicitly passed to `what_a_fool_believes` + } + + // `context` value is local to the scope it is in + assert(context.user_index == 456) + + what_a_fool_believes :: proc() { + c := context // this `context` is the same as the parent procedure that it was called from + // From this example, context.user_index == 123 + // A context.allocator is assigned to the return value of `my_custom_allocator()` + assert(context.user_index == 123) + + // The memory management procedure use the `context.allocator` by + // default unless explicitly specified otherwise + china_grove := new(int) + free(china_grove) + + _ = c + } + + my_custom_allocator :: mem.nil_allocator + _ = c + + // By default, the context value has default values for its parameters which is + // decided in the package runtime. What the defaults are are compiler specific. + + // To see what the implicit context value contains, please see the following + // definition in package runtime. +} + +parametric_polymorphism :: proc() { + fmt.println("\n# parametric polymorphism") + + print_value :: proc(value: $T) { + fmt.printf("print_value: %T %v\n", value, value) + } + + v1: int = 1 + v2: f32 = 2.1 + v3: f64 = 3.14 + v4: string = "message" + + print_value(v1) + print_value(v2) + print_value(v3) + print_value(v4) + + fmt.println() + + add :: proc(p, q: $T) -> T { + x: T = p + q + return x + } + + a := add(3, 4) + fmt.printf("a: %T = %v\n", a, a) + + b := add(3.2, 4.3) + fmt.printf("b: %T = %v\n", b, b) + + // This is how `new` is implemented + alloc_type :: proc($T: typeid) -> ^T { + t := cast(^T)mem.alloc(size_of(T), align_of(T)) + t^ = T{} // Use default initialization value + return t + } + + copy_slice :: proc(dst, src: []$T) -> int { + n := min(len(dst), len(src)) + if n > 0 { + mem.copy(&dst[0], &src[0], n*size_of(T)) + } + return n + } + + double_params :: proc(a: $A, b: $B) -> A { + return a + A(b) + } + + fmt.println(double_params(12, 1.345)) + + + + { // Polymorphic Types and Type Specialization + Table_Slot :: struct($Key, $Value: typeid) { + occupied: bool, + hash: u32, + key: Key, + value: Value, + } + TABLE_SIZE_MIN :: 32 + Table :: struct($Key, $Value: typeid) { + count: int, + allocator: mem.Allocator, + slots: []Table_Slot(Key, Value), + } + + // Only allow types that are specializations of a (polymorphic) slice + make_slice :: proc($T: typeid/[]$E, len: int) -> T { + return make(T, len) + } + + // Only allow types that are specializations of `Table` + allocate :: proc(table: ^$T/Table, capacity: int) { + c := context + if table.allocator.procedure != nil { + c.allocator = table.allocator + } + context = c + + table.slots = make_slice(type_of(table.slots), max(capacity, TABLE_SIZE_MIN)) + } + + expand :: proc(table: ^$T/Table) { + c := context + if table.allocator.procedure != nil { + c.allocator = table.allocator + } + context = c + + old_slots := table.slots + defer delete(old_slots) + + cap := max(2*len(table.slots), TABLE_SIZE_MIN) + allocate(table, cap) + + for s in old_slots { + if s.occupied { + put(table, s.key, s.value) + } + } + } + + // Polymorphic determination of a polymorphic struct + // put :: proc(table: ^$T/Table, key: T.Key, value: T.Value) { + put :: proc(table: ^Table($Key, $Value), key: Key, value: Value) { + hash := get_hash(key) // Ad-hoc method which would fail in a different scope + index := find_index(table, key, hash) + if index < 0 { + if f64(table.count) >= 0.75*f64(len(table.slots)) { + expand(table) + } + assert(table.count <= len(table.slots)) + + index = int(hash % u32(len(table.slots))) + + for table.slots[index].occupied { + if index += 1; index >= len(table.slots) { + index = 0 + } + } + + table.count += 1 + } + + slot := &table.slots[index] + slot.occupied = true + slot.hash = hash + slot.key = key + slot.value = value + } + + + // find :: proc(table: ^$T/Table, key: T.Key) -> (T.Value, bool) { + find :: proc(table: ^Table($Key, $Value), key: Key) -> (Value, bool) { + hash := get_hash(key) + index := find_index(table, key, hash) + if index < 0 { + return Value{}, false + } + return table.slots[index].value, true + } + + find_index :: proc(table: ^Table($Key, $Value), key: Key, hash: u32) -> int { + if len(table.slots) <= 0 { + return -1 + } + + index := int(hash % u32(len(table.slots))) + for table.slots[index].occupied { + if table.slots[index].hash == hash { + if table.slots[index].key == key { + return index + } + } + + if index += 1; index >= len(table.slots) { + index = 0 + } + } + + return -1 + } + + get_hash :: proc(s: string) -> u32 { // fnv32a + h: u32 = 0x811c9dc5 + for i in 0.. (res: [N]T) { + // `N` is the constant value passed + // `I` is the type of N + // `T` is the type passed + fmt.printf("Generating an array of type %v from the value %v of type %v\n", + typeid_of(type_of(res)), N, typeid_of(I)) + for i in 0.. (c: [M][P]T) { + for i in 0.. (acquired: bool) { + res, ok := intrinsics.atomic_compare_exchange_strong(m, false, true) + return ok && res == false + } + + { // Basic Threads + fmt.println("\n## Basic Threads") + worker_proc :: proc(t: ^thread.Thread) { + for iteration in 1..=5 { + fmt.printf("Thread %d is on iteration %d\n", t.user_index, iteration) + fmt.printf("`%s`: iteration %d\n", prefix_table[t.user_index], iteration) + time.sleep(1 * time.Millisecond) + } + } + + threads := make([dynamic]^thread.Thread, 0, len(prefix_table)) + defer delete(threads) + + for _ in prefix_table { + if t := thread.create(worker_proc); t != nil { + t.init_context = context + t.user_index = len(threads) + append(&threads, t) + thread.start(t) + } + } + + for len(threads) > 0 { + for i := 0; i < len(threads); /**/ { + if t := threads[i]; thread.is_done(t) { + fmt.printf("Thread %d is done\n", t.user_index) + thread.destroy(t) + + ordered_remove(&threads, i) + } else { + i += 1 + } + } + } + } + + { // Thread Pool + fmt.println("\n## Thread Pool") + task_proc :: proc(t: thread.Task) { + index := t.user_index % len(prefix_table) + for iteration in 1..=5 { + for !did_acquire(&print_mutex) { thread.yield() } // Allow one thread to print at a time. + + fmt.printf("Worker Task %d is on iteration %d\n", t.user_index, iteration) + fmt.printf("`%s`: iteration %d\n", prefix_table[index], iteration) + + print_mutex = false + + time.sleep(1 * time.Millisecond) + } + } + + N :: 3 + + pool: thread.Pool + thread.pool_init(&pool, allocator=context.allocator, thread_count=N) + defer thread.pool_destroy(&pool) + + + for i in 0..<30 { + // be mindful of the allocator used for tasks. The allocator needs to be thread safe, or be owned by the task for exclusive use + thread.pool_add_task(&pool, allocator=context.allocator, procedure=task_proc, data=nil, user_index=i) + } + + thread.pool_start(&pool) + thread.pool_finish(&pool) + } +} + + +array_programming :: proc() { + fmt.println("\n# array programming") + { + a := [3]f32{1, 2, 3} + b := [3]f32{5, 6, 7} + c := a * b + d := a + b + e := 1 + (c - d) / 2 + fmt.printf("%.1f\n", e) // [0.5, 3.0, 6.5] + } + + { + a := [3]f32{1, 2, 3} + b := swizzle(a, 2, 1, 0) + assert(b == [3]f32{3, 2, 1}) + + c := swizzle(a, 0, 0) + assert(c == [2]f32{1, 1}) + assert(c == 1) + } + + { + Vector3 :: distinct [3]f32 + a := Vector3{1, 2, 3} + b := Vector3{5, 6, 7} + c := (a * b)/2 + 1 + d := c.x + c.y + c.z + fmt.printf("%.1f\n", d) // 22.0 + + cross :: proc(a, b: Vector3) -> Vector3 { + i := swizzle(a, 1, 2, 0) * swizzle(b, 2, 0, 1) + j := swizzle(a, 2, 0, 1) * swizzle(b, 1, 2, 0) + return i - j + } + + cross_shorter :: proc(a, b: Vector3) -> Vector3 { + i := a.yzx * b.zxy + j := a.zxy * b.yzx + return i - j + } + + blah :: proc(a: Vector3) -> f32 { + return a.x + a.y + a.z + } + + x := cross(a, b) + fmt.println(x) + fmt.println(blah(x)) + } +} + +map_type :: proc() { + fmt.println("\n# map type") + + m := make(map[string]int) + defer delete(m) + + m["Bob"] = 2 + m["Ted"] = 5 + fmt.println(m["Bob"]) + + delete_key(&m, "Ted") + + // If an element of a key does not exist, the zero value of the + // element will be returned. To check to see if an element exists + // can be done in two ways: + elem, ok := m["Bob"] + exists := "Bob" in m + _, _ = elem, ok + _ = exists +} + +implicit_selector_expression :: proc() { + fmt.println("\n# implicit selector expression") + + Foo :: enum {A, B, C} + + f: Foo + f = Foo.A + f = .A + + BAR :: bit_set[Foo]{.B, .C} + + switch f { + case .A: + fmt.println("HITHER") + case .B: + fmt.println("NEVER") + case .C: + fmt.println("FOREVER") + } + + my_map := make(map[Foo]int) + defer delete(my_map) + + my_map[.A] = 123 + my_map[Foo.B] = 345 + + fmt.println(my_map[.A] + my_map[Foo.B] + my_map[.C]) +} + + +partial_switch :: proc() { + fmt.println("\n# partial_switch") + { // enum + Foo :: enum { + A, + B, + C, + D, + } + + f := Foo.A + switch f { + case .A: fmt.println("A") + case .B: fmt.println("B") + case .C: fmt.println("C") + case .D: fmt.println("D") + case: fmt.println("?") + } + + #partial switch f { + case .A: fmt.println("A") + case .D: fmt.println("D") + } + } + { // union + Foo :: union {int, bool} + f: Foo = 123 + switch _ in f { + case int: fmt.println("int") + case bool: fmt.println("bool") + case: + } + + #partial switch _ in f { + case bool: fmt.println("bool") + } + } +} + +cstring_example :: proc() { + fmt.println("\n# cstring_example") + + W :: "Hellope" + X :: cstring(W) + Y :: string(X) + + w := W + _ = w + x: cstring = X + y: string = Y + z := string(x) + fmt.println(x, y, z) + fmt.println(len(x), len(y), len(z)) + fmt.println(len(W), len(X), len(Y)) + // IMPORTANT NOTE for cstring variables + // len(cstring) is O(N) + // cast(string)cstring is O(N) +} + +bit_set_type :: proc() { + fmt.println("\n# bit_set type") + + { + Day :: enum { + Sunday, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + } + + Days :: distinct bit_set[Day] + WEEKEND :: Days{.Sunday, .Saturday} + + d: Days + d = {.Sunday, .Monday} + e := d + WEEKEND + e += {.Monday} + fmt.println(d, e) + + ok := .Saturday in e // `in` is only allowed for `map` and `bit_set` types + fmt.println(ok) + if .Saturday in e { + fmt.println("Saturday in", e) + } + X :: .Saturday in WEEKEND // Constant evaluation + fmt.println(X) + fmt.println("Cardinality:", card(e)) + } + { + x: bit_set['A'..='Z'] + #assert(size_of(x) == size_of(u32)) + y: bit_set[0..=8; u16] + fmt.println(typeid_of(type_of(x))) // bit_set[A..=Z] + fmt.println(typeid_of(type_of(y))) // bit_set[0..=8; u16] + + x += {'F'} + assert('F' in x) + x -= {'F'} + assert('F' not_in x) + + y += {1, 4, 2} + assert(2 in y) + } + { + Letters :: bit_set['A'..='Z'] + a := Letters{'A', 'B'} + b := Letters{'A', 'B', 'C', 'D', 'F'} + c := Letters{'A', 'B'} + + assert(a <= b) // 'a' is a subset of 'b' + assert(b >= a) // 'b' is a superset of 'a' + assert(a < b) // 'a' is a strict subset of 'b' + assert(b > a) // 'b' is a strict superset of 'a' + + assert(!(a < c)) // 'a' is a not strict subset of 'c' + assert(!(c > a)) // 'c' is a not strict superset of 'a' + } +} + +deferred_procedure_associations :: proc() { + fmt.println("\n# deferred procedure associations") + + @(deferred_out=closure) + open :: proc(s: string) -> bool { + fmt.println(s) + return true + } + + closure :: proc(ok: bool) { + fmt.println("Goodbye?", ok) + } + + if open("Welcome") { + fmt.println("Something in the middle, mate.") + } +} + +reflection :: proc() { + fmt.println("\n# reflection") + + Foo :: struct { + x: int `tag1`, + y: string `json:"y_field"`, + z: bool, // no tag + } + + id := typeid_of(Foo) + names := reflect.struct_field_names(id) + types := reflect.struct_field_types(id) + tags := reflect.struct_field_tags(id) + + assert(len(names) == len(types) && len(names) == len(tags)) + + fmt.println("Foo :: struct {") + for tag, i in tags { + name, type := names[i], types[i] + if tag != "" { + fmt.printf("\t%s: %T `%s`,\n", name, type, tag) + } else { + fmt.printf("\t%s: %T,\n", name, type) + } + } + fmt.println("}") + + + for tag, i in tags { + if val, ok := reflect.struct_tag_lookup(tag, "json"); ok { + fmt.printf("json: %s -> %s\n", names[i], val) + } + } +} + +quaternions :: proc() { + // Not just an April Fool's Joke any more, but a fully working thing! + fmt.println("\n# quaternions") + + { // Quaternion operations + q := 1 + 2i + 3j + 4k + r := quaternion(real=5, imag=6, jmag=7, kmag=8) + t := q * r + fmt.printf("(%v) * (%v) = %v\n", q, r, t) + v := q / r + fmt.printf("(%v) / (%v) = %v\n", q, r, v) + u := q + r + fmt.printf("(%v) + (%v) = %v\n", q, r, u) + s := q - r + fmt.printf("(%v) - (%v) = %v\n", q, r, s) + } + { // The quaternion types + q128: quaternion128 // 4xf32 + q256: quaternion256 // 4xf64 + q128 = quaternion(w=1, x=0, y=0, z=0) + q256 = 1 // quaternion(x=0, y=0, z=0, w=1) + + // NOTE: The internal memory layout of a quaternion is xyzw + } + { // Built-in procedures + q := 1 + 2i + 3j + 4k + fmt.println("q =", q) + fmt.println("real(q) =", real(q)) + fmt.println("imag(q) =", imag(q)) + fmt.println("jmag(q) =", jmag(q)) + fmt.println("kmag(q) =", kmag(q)) + fmt.println("conj(q) =", conj(q)) + fmt.println("abs(q) =", abs(q)) + } + { // Conversion of a complex type to a quaternion type + c := 1 + 2i + q := quaternion256(c) + fmt.println(c) + fmt.println(q) + } + { // Memory layout of Quaternions + q := 1 + 2i + 3j + 4k + a := transmute([4]f64)q + fmt.println("Quaternion memory layout: xyzw/(ijkr)") + fmt.println(q) // 1.000+2.000i+3.000j+4.000k + fmt.println(a) // [2.000, 3.000, 4.000, 1.000] + } +} + +unroll_for_statement :: proc() { + fmt.println("\n#'#unroll for' statements") + + // '#unroll for' works the same as if the 'inline' prefix did not + // exist but these ranged loops are explicitly unrolled which can + // be very very useful for certain optimizations + + fmt.println("Ranges") + #unroll for x, i in 1..<4 { + fmt.println(x, i) + } + + fmt.println("Strings") + #unroll for r, i in "Hello, 世界" { + fmt.println(r, i) + } + + fmt.println("Arrays") + #unroll for elem, idx in ([4]int{1, 4, 9, 16}) { + fmt.println(elem, idx) + } + + + Foo_Enum :: enum { + A = 1, + B, + C = 6, + D, + } + fmt.println("Enum types") + #unroll for elem, idx in Foo_Enum { + fmt.println(elem, idx) + } +} + +where_clauses :: proc() { + fmt.println("\n#procedure 'where' clauses") + + { // Sanity checks + simple_sanity_check :: proc(x: [2]int) + where len(x) > 1, + type_of(x) == [2]int { + fmt.println(x) + } + } + { // Parametric polymorphism checks + cross_2d :: proc(a, b: $T/[2]$E) -> E + where intrinsics.type_is_numeric(E) { + return a.x*b.y - a.y*b.x + } + cross_3d :: proc(a, b: $T/[3]$E) -> T + where intrinsics.type_is_numeric(E) { + x := a.y*b.z - a.z*b.y + y := a.z*b.x - a.x*b.z + z := a.x*b.y - a.y*b.x + return T{x, y, z} + } + + a := [2]int{1, 2} + b := [2]int{5, -3} + fmt.println(cross_2d(a, b)) + + x := [3]f32{1, 4, 9} + y := [3]f32{-5, 0, 3} + fmt.println(cross_3d(x, y)) + + // Failure case + // i := [2]bool{true, false} + // j := [2]bool{false, true} + // fmt.println(cross_2d(i, j)) + + } + + { // Procedure groups usage + foo :: proc(x: [$N]int) -> bool + where N > 2 { + fmt.println(#procedure, "was called with the parameter", x) + return true + } + + bar :: proc(x: [$N]int) -> bool + where 0 < N, + N <= 2 { + fmt.println(#procedure, "was called with the parameter", x) + return false + } + + baz :: proc{foo, bar} + + x := [3]int{1, 2, 3} + y := [2]int{4, 9} + ok_x := baz(x) + ok_y := baz(y) + assert(ok_x == true) + assert(ok_y == false) + } + + { // Record types + Foo :: struct($T: typeid, $N: int) + where intrinsics.type_is_integer(T), + N > 2 { + x: [N]T, + y: [N-2]T, + } + + T :: i32 + N :: 5 + f: Foo(T, N) + #assert(size_of(f) == (N+N-2)*size_of(T)) + } +} + + +when ODIN_OS == .Windows { + foreign import kernel32 "system:kernel32.lib" +} + +foreign_system :: proc() { + fmt.println("\n#foreign system") + when ODIN_OS == .Windows { + // It is sometimes necessarily to interface with foreign code, + // such as a C library. In Odin, this is achieved through the + // foreign system. You can “import” a library into the code + // using the same semantics as a normal import declaration. + + // This foreign import declaration will create a + // “foreign import name” which can then be used to associate + // entities within a foreign block. + + foreign kernel32 { + ExitProcess :: proc "stdcall" (exit_code: u32) --- + } + + // Foreign procedure declarations have the cdecl/c calling + // convention by default unless specified otherwise. Due to + // foreign procedures do not have a body declared within this + // code, you need append the --- symbol to the end to distinguish + // it as a procedure literal without a body and not a procedure type. + + // The attributes system can be used to change specific properties + // of entities declared within a block: + + @(default_calling_convention = "std") + foreign kernel32 { + @(link_name="GetLastError") get_last_error :: proc() -> i32 --- + } + + // Example using the link_prefix attribute + @(default_calling_convention = "std") + @(link_prefix = "Get") + foreign kernel32 { + LastError :: proc() -> i32 --- + } + } +} + +ranged_fields_for_array_compound_literals :: proc() { + fmt.println("\n#ranged fields for array compound literals") + { // Normal Array Literal + foo := [?]int{1, 4, 9, 16} + fmt.println(foo) + } + { // Indexed + foo := [?]int{ + 3 = 16, + 1 = 4, + 2 = 9, + 0 = 1, + } + fmt.println(foo) + } + { // Ranges + i := 2 + foo := [?]int { + 0 = 123, + 5..=9 = 54, + 10..<16 = i*3 + (i-1)*2, + } + #assert(len(foo) == 16) + fmt.println(foo) // [123, 0, 0, 0, 0, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8] + } + { // Slice and Dynamic Array support + i := 2 + foo_slice := []int { + 0 = 123, + 5..=9 = 54, + 10..<16 = i*3 + (i-1)*2, + } + assert(len(foo_slice) == 16) + fmt.println(foo_slice) // [123, 0, 0, 0, 0, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8] + + foo_dynamic_array := [dynamic]int { + 0 = 123, + 5..=9 = 54, + 10..<16 = i*3 + (i-1)*2, + } + assert(len(foo_dynamic_array) == 16) + fmt.println(foo_dynamic_array) // [123, 0, 0, 0, 0, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8] + } +} + +deprecated_attribute :: proc() { + @(deprecated="Use foo_v2 instead") + foo_v1 :: proc(x: int) { + fmt.println("foo_v1") + } + foo_v2 :: proc(x: int) { + fmt.println("foo_v2") + } + + // NOTE: Uncomment to see the warning messages + // foo_v1(1) +} + +range_statements_with_multiple_return_values :: proc() { + fmt.println("\n#range statements with multiple return values") + My_Iterator :: struct { + index: int, + data: []i32, + } + make_my_iterator :: proc(data: []i32) -> My_Iterator { + return My_Iterator{data = data} + } + my_iterator :: proc(it: ^My_Iterator) -> (val: i32, idx: int, cond: bool) { + if cond = it.index < len(it.data); cond { + val = it.data[it.index] + idx = it.index + it.index += 1 + } + return + } + + data := make([]i32, 6) + for _, i in data { + data[i] = i32(i*i) + } + + { // Manual Style + it := make_my_iterator(data) + for { + val, _, cond := my_iterator(&it) + if !cond { + break + } + fmt.println(val) + } + } + { // or_break + it := make_my_iterator(data) + loop: for { + val, _ := my_iterator(&it) or_break loop + fmt.println(val) + } + } + { // first value + it := make_my_iterator(data) + for val in my_iterator(&it) { + fmt.println(val) + } + } + { // first and second value + it := make_my_iterator(data) + for val, idx in my_iterator(&it) { + fmt.println(val, idx) + } + } +} + + +soa_struct_layout :: proc() { + fmt.println("\n#SOA Struct Layout") + + { + Vector3 :: struct {x, y, z: f32} + + N :: 2 + v_aos: [N]Vector3 + v_aos[0].x = 1 + v_aos[0].y = 4 + v_aos[0].z = 9 + + fmt.println(len(v_aos)) + fmt.println(v_aos[0]) + fmt.println(v_aos[0].x) + fmt.println(&v_aos[0].x) + + v_aos[1] = {0, 3, 4} + v_aos[1].x = 2 + fmt.println(v_aos[1]) + fmt.println(v_aos) + + v_soa: #soa[N]Vector3 + + v_soa[0].x = 1 + v_soa[0].y = 4 + v_soa[0].z = 9 + + + // Same syntax as AOS and treat as if it was an array + fmt.println(len(v_soa)) + fmt.println(v_soa[0]) + fmt.println(v_soa[0].x) + fmt.println(&v_soa[0].x) + v_soa[1] = {0, 3, 4} + v_soa[1].x = 2 + fmt.println(v_soa[1]) + + // Can use SOA syntax if necessary + v_soa.x[0] = 1 + v_soa.y[0] = 4 + v_soa.z[0] = 9 + fmt.println(v_soa.x[0]) + + // Same pointer addresses with both syntaxes + assert(&v_soa[0].x == &v_soa.x[0]) + + + // Same fmt printing + fmt.println(v_aos) + fmt.println(v_soa) + } + { + // Works with arrays of length <= 4 which have the implicit fields xyzw/rgba + Vector3 :: distinct [3]f32 + + N :: 2 + v_aos: [N]Vector3 + v_aos[0].x = 1 + v_aos[0].y = 4 + v_aos[0].z = 9 + + v_soa: #soa[N]Vector3 + + v_soa[0].x = 1 + v_soa[0].y = 4 + v_soa[0].z = 9 + } + { + // SOA Slices + // Vector3 :: struct {x, y, z: f32} + Vector3 :: struct {x: i8, y: i16, z: f32} + + N :: 3 + v: #soa[N]Vector3 + v[0].x = 1 + v[0].y = 4 + v[0].z = 9 + + s: #soa[]Vector3 + s = v[:] + assert(len(s) == N) + fmt.println(s) + fmt.println(s[0].x) + + a := s[1:2] + assert(len(a) == 1) + fmt.println(a) + + d: #soa[dynamic]Vector3 + + append_soa(&d, Vector3{1, 2, 3}, Vector3{4, 5, 9}, Vector3{-4, -4, 3}) + fmt.println(d) + fmt.println(len(d)) + fmt.println(cap(d)) + fmt.println(d[:]) + } + { // soa_zip and soa_unzip + fmt.println("\nsoa_zip and soa_unzip") + + x := []i32{1, 3, 9} + y := []f32{2, 4, 16} + z := []b32{true, false, true} + + // produce an #soa slice the normal slices passed + s := soa_zip(a=x, b=y, c=z) + + // iterate over the #soa slice + for v, i in s { + fmt.println(v, i) // exactly the same as s[i] + // NOTE: 'v' is NOT a temporary value but has a specialized addressing mode + // which means that when accessing v.a etc, it does the correct transformation + // internally: + // s[i].a === s.a[i] + fmt.println(v.a, v.b, v.c) + } + + // Recover the slices from the #soa slice + a, b, c := soa_unzip(s) + fmt.println(a, b, c) + } +} + +constant_literal_expressions :: proc() { + fmt.println("\n#constant literal expressions") + + Bar :: struct {x, y: f32} + Foo :: struct {a, b: int, using c: Bar} + + FOO_CONST :: Foo{b = 2, a = 1, c = {3, 4}} + + + fmt.println(FOO_CONST.a) + fmt.println(FOO_CONST.b) + fmt.println(FOO_CONST.c) + fmt.println(FOO_CONST.c.x) + fmt.println(FOO_CONST.c.y) + fmt.println(FOO_CONST.x) // using works as expected + fmt.println(FOO_CONST.y) + + fmt.println("-------") + + ARRAY_CONST :: [3]int{1 = 4, 2 = 9, 0 = 1} + + fmt.println(ARRAY_CONST[0]) + fmt.println(ARRAY_CONST[1]) + fmt.println(ARRAY_CONST[2]) + + fmt.println("-------") + + FOO_ARRAY_DEFAULTS :: [3]Foo{{}, {}, {}} + fmt.println(FOO_ARRAY_DEFAULTS[2].x) + + fmt.println("-------") + + Baz :: enum{A=5, B, C, D} + ENUM_ARRAY_CONST :: [Baz]int{.A ..= .C = 1, .D = 16} + + fmt.println(ENUM_ARRAY_CONST[.A]) + fmt.println(ENUM_ARRAY_CONST[.B]) + fmt.println(ENUM_ARRAY_CONST[.C]) + fmt.println(ENUM_ARRAY_CONST[.D]) + + fmt.println("-------") + + Sparse_Baz :: enum{A=5, B, C, D=16} + #assert(len(Sparse_Baz) < len(#sparse[Sparse_Baz]int)) + SPARSE_ENUM_ARRAY_CONST :: #sparse[Sparse_Baz]int{.A ..= .C = 1, .D = 16} + + fmt.println(SPARSE_ENUM_ARRAY_CONST[.A]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.B]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.C]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.D]) + + fmt.println("-------") + + + STRING_CONST :: "Hellope!" + + fmt.println(STRING_CONST[0]) + fmt.println(STRING_CONST[2]) + fmt.println(STRING_CONST[3]) + + fmt.println(STRING_CONST[0:5]) + fmt.println(STRING_CONST[3:][:4]) +} + +union_maybe :: proc() { + fmt.println("\n#union based maybe") + + // NOTE: This is already built-in, and this is just a reimplementation to explain the behaviour + Maybe :: union($T: typeid) {T} + + i: Maybe(u8) + p: Maybe(^u8) // No tag is stored for pointers, nil is the sentinel value + + // Tag size will be as small as needed for the number of variants + #assert(size_of(i) == size_of(u8) + size_of(u8)) + // No need to store a tag here, the `nil` state is shared with the variant's `nil` + #assert(size_of(p) == size_of(^u8)) + + i = 123 + x := i.? + y, y_ok := p.? + p = &x + z, z_ok := p.? + + fmt.println(i, p) + fmt.println(x, &x) + fmt.println(y, y_ok) + fmt.println(z, z_ok) +} + +dummy_procedure :: proc() { + fmt.println("dummy_procedure") +} + +explicit_context_definition :: proc "c" () { + // Try commenting the following statement out below + context = runtime.default_context() + + fmt.println("\n#explicit context definition") + dummy_procedure() +} + +or_else_operator :: proc() { + fmt.println("\n#'or_else'") + { + m: map[string]int + i: int + ok: bool + + if i, ok = m["hellope"]; !ok { + i = 123 + } + // The above can be mapped to 'or_else' + i = m["hellope"] or_else 123 + + assert(i == 123) + } + { + // 'or_else' can be used with type assertions too, as they + // have optional ok semantics + v: union{int, f64} + i: int + i = v.(int) or_else 123 + i = v.? or_else 123 // Type inference magic + assert(i == 123) + + m: Maybe(int) + i = m.? or_else 456 + assert(i == 456) + } +} + +or_return_operator :: proc() { + fmt.println("\n#'or_return'") + // The concept of 'or_return' will work by popping off the end value in a multiple + // valued expression and checking whether it was not 'nil' or 'false', and if so, + // set the end return value to value if possible. If the procedure only has one + // return value, it will do a simple return. If the procedure had multiple return + // values, 'or_return' will require that all parameters be named so that the end + // value could be assigned to by name and then an empty return could be called. + + Error :: enum { + None, + Something_Bad, + Something_Worse, + The_Worst, + Your_Mum, + } + + caller_1 :: proc() -> Error { + return .None + } + + caller_2 :: proc() -> (int, Error) { + return 123, .None + } + caller_3 :: proc() -> (int, int, Error) { + return 123, 345, .None + } + + foo_1 :: proc() -> Error { + // This can be a common idiom in many code bases + n0, err := caller_2() + if err != nil { + return err + } + + // The above idiom can be transformed into the following + n1 := caller_2() or_return + + + // And if the expression is 1-valued, it can be used like this + caller_1() or_return + // which is functionally equivalent to + if err1 := caller_1(); err1 != nil { + return err1 + } + + // Multiple return values still work with 'or_return' as it only + // pops off the end value in the multi-valued expression + n0, n1 = caller_3() or_return + + return .None + } + foo_2 :: proc() -> (n: int, err: Error) { + // It is more common that your procedure returns multiple values + // If 'or_return' is used within a procedure multiple parameters (2+), + // then all the parameters must be named so that the remaining parameters + // so that a bare 'return' statement can be used + + // This can be a common idiom in many code bases + x: int + x, err = caller_2() + if err != nil { + return + } + + // The above idiom can be transformed into the following + y := caller_2() or_return + _ = y + + // And if the expression is 1-valued, it can be used like this + caller_1() or_return + + // which is functionally equivalent to + if err1 := caller_1(); err1 != nil { + err = err1 + return + } + + // If using a non-bare 'return' statement is required, setting the return values + // using the normal idiom is a better choice and clearer to read. + if z, zerr := caller_2(); zerr != nil { + return -345 * z, zerr + } + + defer if err != nil { + fmt.println("Error in", #procedure, ":" , err) + } + + n = 123 + return + } + + foo_1() + foo_2() +} + + +or_break_and_or_continue_operators :: proc() { + fmt.println("\n#'or_break' and 'or_continue'") + // The concept of 'or_break' and 'or_continue' is very similar to that of 'or_return'. + // The difference is that unlike 'or_return', the value does not get returned from + // the current procedure but rather discarded if it is 'false' or not 'nil', and then + // the specified branch (i.e. break or continue). + // The or branch expression can be labelled if a specific statement needs to be used. + + Error :: enum { + None, + Something_Bad, + Something_Worse, + The_Worst, + Your_Mum, + } + + caller_1 :: proc() -> Error { + return .Something_Bad + } + + caller_2 :: proc() -> (int, Error) { + return 123, .Something_Worse + } + caller_3 :: proc() -> (int, int, Error) { + return 123, 345, .None + } + + for { // common approach + err := caller_1() + if err != nil { + break + } + } + for { // or_break approach + caller_1() or_break + } + + for { // or_break approach with multiple values + n := caller_2() or_break + _ = n + } + + loop: for { // or_break approach with named label + n := caller_2() or_break loop + _ = n + } + + for { // or_continue + x, y := caller_3() or_continue + _, _ = x, y + + break + } + + continue_loop: for { // or_continue with named label + x, y := caller_3() or_continue continue_loop + _, _ = x, y + + break + } + +} + +arbitrary_precision_mathematics :: proc() { + fmt.println("\n# core:math/big") + + print_bigint :: proc(name: string, a: ^big.Int, base := i8(10), print_name := true, newline := true, print_extra_info := true) { + big.assert_if_nil(a) + + as, err := big.itoa(a, base) + defer delete(as) + + cb := big.internal_count_bits(a) + if print_name { + fmt.print(name) + } + if err != nil { + fmt.printf(" (Error: %v) ", err) + } + fmt.printf(as) + if print_extra_info { + fmt.printf(" (base: %v, bits: %v, digits: %v)", base, cb, a.used) + } + if newline { + fmt.println() + } + } + + a, b, c, d, e, f, res := &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{}, &big.Int{} + defer big.destroy(a, b, c, d, e, f, res) + + // Set the context RNG to something that does not require + // cryptographic entropy (not supported on all targets). + context.random_generator = rand.xoshiro256_random_generator() + + // How many bits should the random prime be? + bits := 64 + // Number of Rabin-Miller trials, -1 for automatic. + trials := -1 + + // Default prime generation flags + flags := big.Primality_Flags{} + + err := big.internal_random_prime(a, bits, trials, flags) + if err != nil { + fmt.printf("Error %v while generating random prime.\n", err) + } else { + print_bigint("Random Prime A: ", a, 10) + fmt.printf("Random number iterations until prime found: %v\n", big.RANDOM_PRIME_ITERATIONS_USED) + } + + // If we want to pack this Int into a buffer of u32, how many do we need? + count := big.internal_int_pack_count(a, u32) + buf := make([]u32, count) + defer delete(buf) + + written: int + written, err = big.internal_int_pack(a, buf) + fmt.printf("\nPacked into u32 buf: %v | err: %v | written: %v\n", buf, err, written) + + // If we want to pack this Int into a buffer of bytes of which only the bottom 6 bits are used, how many do we need? + nails := 2 + + count = big.internal_int_pack_count(a, u8, nails) + byte_buf := make([]u8, count) + defer delete(byte_buf) + + written, err = big.internal_int_pack(a, byte_buf, nails) + fmt.printf("\nPacked into buf of 6-bit bytes: %v | err: %v | written: %v\n", byte_buf, err, written) + + + + // Pick another random big Int, not necesssarily prime. + err = big.random(b, 2048) + print_bigint("\n2048 bit random number: ", b) + + // Calculate GCD + LCM in one fell swoop + big.gcd_lcm(c, d, a, b) + + print_bigint("\nGCD of random prime A and random number B: ", c) + print_bigint("\nLCM of random prime A and random number B (in base 36): ", d, 36) +} + +matrix_type :: proc() { + fmt.println("\n# matrix type") + // A matrix is a mathematical type built into Odin. It is a regular array of numbers, + // arranged in rows and columns + + { + // The following represents a matrix that has 2 rows and 3 columns + m: matrix[2, 3]f32 + + m = matrix[2, 3]f32{ + 1, 9, -13, + 20, 5, -6, + } + + // Element types of integers, float, and complex numbers are supported by matrices. + // There is no support for booleans, quaternions, or any compound type. + + // Indexing a matrix can be used with the matrix indexing syntax + // This mirrors other type usages: type on the left, usage on the right + + elem := m[1, 2] // row 1, column 2 + assert(elem == -6) + + + // Scalars act as if they are scaled identity matrices + // and can be assigned to matrices as them + b := matrix[2, 2]f32{} + f := f32(3) + b = f + + fmt.println("b", b) + fmt.println("b == f", b == f) + + } + + { // Matrices support multiplication between matrices + a := matrix[2, 3]f32{ + 2, 3, 1, + 4, 5, 0, + } + + b := matrix[3, 2]f32{ + 1, 2, + 3, 4, + 5, 6, + } + + fmt.println("a", a) + fmt.println("b", b) + + c := a * b + #assert(type_of(c) == matrix[2, 2]f32) + fmt.println("c = a * b", c) + } + + { // Matrices support multiplication between matrices and arrays + m := matrix[4, 4]f32{ + 1, 2, 3, 4, + 5, 5, 4, 2, + 0, 1, 3, 0, + 0, 1, 4, 1, + } + + v := [4]f32{1, 5, 4, 3} + + // treating 'v' as a column vector + fmt.println("m * v", m * v) + + // treating 'v' as a row vector + fmt.println("v * m", v * m) + + // Support with non-square matrices + s := matrix[2, 4]f32{ // [4][2]f32 + 2, 4, 3, 1, + 7, 8, 6, 5, + } + + w := [2]f32{1, 2} + r: [4]f32 = w * s + fmt.println("r", r) + } + + { // Component-wise operations + // if the element type supports it + // Not support for '/', '%', or '%%' operations + + a := matrix[2, 2]i32{ + 1, 2, + 3, 4, + } + + b := matrix[2, 2]i32{ + -5, 1, + 9, -7, + } + + c0 := a + b + c1 := a - b + c2 := a & b + c3 := a | b + c4 := a ~ b + c5 := a &~ b + + // component-wise multiplication + // since a * b would be a standard matrix multiplication + c6 := intrinsics.hadamard_product(a, b) + + + fmt.println("a + b", c0) + fmt.println("a - b", c1) + fmt.println("a & b", c2) + fmt.println("a | b", c3) + fmt.println("a ~ b", c4) + fmt.println("a &~ b", c5) + fmt.println("hadamard_product(a, b)", c6) + } + + { // Submatrix casting square matrices + // Casting a square matrix to another square matrix with same element type + // is supported. + // If the cast is to a smaller matrix type, the top-left submatrix is taken. + // If the cast is to a larger matrix type, the matrix is extended with zeros + // everywhere and ones in the diagonal for the unfilled elements of the + // extended matrix. + + mat2 :: distinct matrix[2, 2]f32 + mat4 :: distinct matrix[4, 4]f32 + + m2 := mat2{ + 1, 3, + 2, 4, + } + + m4 := mat4(m2) + assert(m4[2, 2] == 1) + assert(m4[3, 3] == 1) + fmt.printf("m2 %#v\n", m2) + fmt.println("m4", m4) + fmt.println("mat2(m4)", mat2(m4)) + assert(mat2(m4) == m2) + + b4 := mat4{ + 1, 2, 0, 0, + 3, 4, 0, 0, + 5, 0, 6, 0, + 0, 7, 0, 8, + } + fmt.println("b4", intrinsics.matrix_flatten(b4)) + } + + { // Casting non-square matrices + // Casting a matrix to another matrix is allowed as long as they share + // the same element type and the number of elements (rows*columns). + // Matrices in Odin are stored in column-major order, which means + // the casts will preserve this element order. + + mat2x4 :: distinct matrix[2, 4]f32 + mat4x2 :: distinct matrix[4, 2]f32 + + x := mat2x4{ + 1, 3, 5, 7, + 2, 4, 6, 8, + } + + y := mat4x2(x) + fmt.println("x", x) + fmt.println("y", y) + } + + // TECHNICAL INFORMATION: the internal representation of a matrix in Odin is stored + // in column-major format + // e.g. matrix[2, 3]f32 is internally [3][2]f32 (with different a alignment requirement) + // Column-major is used in order to utilize (SIMD) vector instructions effectively on + // modern hardware, if possible. + // + // Unlike normal arrays, matrices try to maximize alignment to allow for the (SIMD) vectorization + // properties whilst keeping zero padding (either between columns or at the end of the type). + // + // Zero padding is a compromise for use with third-party libraries, instead of optimizing for performance. + // Padding between columns was not taken even if that would have allowed each column to be loaded + // individually into a SIMD register with the correct alignment properties. + // + // Currently, matrices are limited to a maximum of 16 elements (rows*columns), and a minimum of 1 element. + // This is because matrices are stored as values (not a reference type), and thus operations on them will + // be stored on the stack. Restricting the maximum element count minimizing the possibility of stack overflows. + + // 'intrinsics' Procedures (Compiler Level) + // transpose(m) + // transposes a matrix + // outer_product(a, b) + // takes two array-like data types and returns the outer product + // of the values in a matrix + // hadamard_product(a, b) + // component-wise multiplication of two matrices of the same type + // matrix_flatten(m) + // converts the matrix into a flatten array of elements + // in column-major order + // Example: + // m := matrix[2, 2]f32{ + // x0, x1, + // y0, y1, + // } + // array: [4]f32 = matrix_flatten(m) + // assert(array == {x0, y0, x1, y1}) + // conj(x) + // conjugates the elements of a matrix for complex element types only + + // Procedures in "core:math/linalg" and related (Runtime Level) (all square matrix procedures) + // determinant(m) + // adjugate(m) + // inverse(m) + // inverse_transpose(m) + // hermitian_adjoint(m) + // trace(m) + // matrix_minor(m) +} + +bit_field_type :: proc() { + fmt.println("\n# bit_field type") + // A `bit_field` is a record type in Odin that is akin to a bit-packed struct. + // IMPORTNAT NOTE: `bit_field` is NOT equivalent to `bit_set` as it has different sematics and use cases. + + { + // `bit_field` fields are accessed by using a dot: + Foo :: bit_field u16 { // backing type must be an integer or array of integers + x: i32 | 3, // signed integers will be signed extended on use + y: u16 | 2 + 3, // general expressions + z: My_Enum | SOME_CONSTANT, // ability to define the bit-width elsewhere + w: bool | 2 when SOME_CONSTANT > 10 else 1, + } + + v := Foo{} + v.x = 3 // truncates the value to fit into 3 bits + fmt.println(v.x) // accessing will convert `v.x` to an `i32` and do an appropriate sign extension + + + My_Enum :: enum u8 {A, B, C, D} + SOME_CONSTANT :: 7 + } + + { + // A `bit_field` is different from a struct in that you must specify the backing type. + // This backing type must be an integer or a fixed-length array of integers. + // This is useful if there needs to be a specific alignment or access pattern for the record. + + Bar :: bit_field u32 {} + Baz :: bit_field [4]u8 {} + } + + // IMPORTANT NOTES: + // * If _all_ of the fields in a bit_field are 1-bit in size and they are all booleans, + // please consider using a `bit_set` instead. + // * Odin's `bit_field` and C's bit-fields might not be compatible + // * Odin's `bit_field`s have a well defined layout (Least-Significant-Bit) + // * C's bit-fields on `struct`s are undefined and are not portable across targets and compilers + // * A `bit_field`'s field type can only be one of the following: + // * Integer + // * Boolean + // * Enum +} + +main :: proc() { + /* + For More Odin Examples - https://github.com/odin-lang/examples + This repository contains examples of how certain things can be accomplished + in idiomatic Odin, allowing you learn its semantics, as well as how to use + parts of the core and vendor package collections. + */ + + when true { + the_basics() + control_flow() + named_proc_return_parameters() + variadic_procedures() + explicit_procedure_overloading() + struct_type() + union_type() + using_statement() + implicit_context_system() + parametric_polymorphism() + threading_example() + array_programming() + map_type() + implicit_selector_expression() + partial_switch() + cstring_example() + bit_set_type() + deferred_procedure_associations() + reflection() + quaternions() + unroll_for_statement() + where_clauses() + foreign_system() + ranged_fields_for_array_compound_literals() + deprecated_attribute() + range_statements_with_multiple_return_values() + soa_struct_layout() + constant_literal_expressions() + union_maybe() + explicit_context_definition() + or_else_operator() + or_return_operator() + or_break_and_or_continue_operators() + arbitrary_precision_mathematics() + matrix_type() + bit_field_type() + } +} +// END_INDENT From 2c363111ecc03915372ca1ff1e2ccc1656532499 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sun, 28 Jun 2026 18:43:03 +0000 Subject: [PATCH 061/647] patch 9.2.0744: popup_atcursor() closes immediately on white space Problem: popup_atcursor() closes immediately on white space (Mao-Yining) Solution: Set w_popup_mincol and w_popup_maxcol to the cursor column (Yasuhiro Matsumoto) When the cursor is on white space find_ident_under_cursor() skips forward to the next word, so the moved range did not cover the cursor column and popup_check_cursor_pos() closed the popup right away. Keep the cursor column in that case. fixes: #20652 closes: #20659 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/popupwin.c | 17 +++++++++++++++-- src/testdir/test_popupwin.vim | 14 ++++++++++++++ src/version.c | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/popupwin.c b/src/popupwin.c index a497ea58ca..d30cc33e17 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -233,12 +233,25 @@ set_moved_columns(win_T *wp, int flags) { char_u *ptr; int len = find_ident_under_cursor(&ptr, flags | FIND_NOERROR); + int mincol; if (len <= 0) return; - wp->w_popup_mincol = (int)(ptr - ml_get_curline()); - wp->w_popup_maxcol = wp->w_popup_mincol + len - 1; + // When the cursor is on white space find_ident_under_cursor() skips + // forward to the next word, whose range does not cover the cursor column. + // Keep the cursor column then, otherwise popup_check_cursor_pos() would + // close the popup right away. + mincol = (int)(ptr - ml_get_curline()); + if (curwin->w_cursor.col < mincol) + { + wp->w_popup_mincol = curwin->w_cursor.col; + wp->w_popup_maxcol = curwin->w_cursor.col; + return; + } + + wp->w_popup_mincol = mincol; + wp->w_popup_maxcol = mincol + len - 1; } /* diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 5156584e4f..7e8fb6233d 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -2331,6 +2331,20 @@ func Test_popup_moved() call assert_equal({}, popup_getpos(winid)) call popup_clear() + " On white space find_ident_under_cursor() skips forward to the next word, + " whose range does not cover the cursor. The cursor column must be used so + " the popup is not closed right away. + exe "normal gg4|" + let winid = popup_atcursor('text', {}) + redraw + call assert_equal(1, popup_getpos(winid).visible) + call assert_equal([1, 3, 3], popup_getoptions(winid).moved) + call feedkeys("i\", 'xt') + call assert_equal(1, popup_getpos(winid).visible) + call feedkeys("$i\", 'xt') + call assert_equal({}, popup_getpos(winid)) + call popup_clear() + bwipe! call test_override('ALL', 0) endfunc diff --git a/src/version.c b/src/version.c index b76dd5b23b..6509e93096 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 744, /**/ 743, /**/ From 488a3eed12923684300a8feede7bc5320c58d844 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 28 Jun 2026 18:49:06 +0000 Subject: [PATCH 062/647] patch 9.2.0745: Crash with truncated spellfile Problem: Crash when reading truncated spellfile (MarkLee131) Solution: Set sl_sofo to TRUE in set_sofo() once sl_sal has been converted to the soundfold layout. Supported by AI. closes: #20660 Signed-off-by: Christian Brabandt --- src/spellfile.c | 4 ++-- src/testdir/test_spellfile.vim | 27 +++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/spellfile.c b/src/spellfile.c index 2e7f6a5398..8000cdb550 100644 --- a/src/spellfile.c +++ b/src/spellfile.c @@ -1178,8 +1178,6 @@ read_sofo_section(FILE *fd, slang_T *slang) char_u *from, *to; int res; - slang->sl_sofo = TRUE; - // from = read_cnt_string(fd, 2, &cnt); if (cnt < 0) @@ -1433,6 +1431,7 @@ set_sofo(slang_T *lp, char_u *from, char_u *to) return SP_OTHERERROR; vim_memset(gap->ga_data, 0, sizeof(int *) * 256); gap->ga_len = 256; + lp->sl_sofo = TRUE; // First count the number of items for each list. Temporarily use // sl_sal_first[] for this. @@ -1489,6 +1488,7 @@ set_sofo(slang_T *lp, char_u *from, char_u *to) for (i = 0; to[i] != NUL; ++i) lp->sl_sal_first[from[i]] = to[i]; lp->sl_sal.ga_len = 1; // indicates we have soundfolding + lp->sl_sofo = TRUE; } return 0; diff --git a/src/testdir/test_spellfile.vim b/src/testdir/test_spellfile.vim index 951538d514..fa3fb14fd8 100644 --- a/src/testdir/test_spellfile.vim +++ b/src/testdir/test_spellfile.vim @@ -1319,4 +1319,31 @@ func Test_soundfold_overflow() let &enc = _enc endfunc +func Test_spell_sal_sofo_truncated() + call mkdir('Xspelldir/spell', 'pR') + + " "VIMspell" + " SN_SAL(5) flags=0 len=7 : <0><1>a<1>a + " SN_SOFO(6) flags=0 len=0 : truncated, no body -> EOF in reader + " (28 bytes total) + let bytes = 0z56494d7370656c6c.3205000000000700.000101610161060000.000000 + call writefile(bytes, 'Xspelldir/spell/Xx.utf-8.spl', 'b') + + let save_rtp = &rtp + set rtp=./Xspelldir + try + set spelllang=Xx + silent! set spell + catch + " an error message is fine; a crash is not + endtry + + " Reaching this point means Vim did not crash on the crafted file. + call assert_true(v:true) + + set nospell + set spelllang& + let &rtp = save_rtp +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 6509e93096..c75668400b 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 745, /**/ 744, /**/ From 38210a5c79b2104b52a8c0e7241f8f346ab6e693 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 28 Jun 2026 18:53:06 +0000 Subject: [PATCH 063/647] patch 9.2.0746: NULL pointer dereference in gui_photon Problem: NULL pointer dereference in gui_photon (Ao Xijie) Solution: after realloc() validate the buffer is not NULL. closes: #20661 Signed-off-by: Christian Brabandt --- src/gui_photon.c | 6 +++++- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gui_photon.c b/src/gui_photon.c index 8cc31d59ad..096f6ac54c 100644 --- a/src/gui_photon.c +++ b/src/gui_photon.c @@ -2173,7 +2173,11 @@ gui_mch_draw_string(int row, int col, char_u *s, int len, int flags) // Use a static buffer to avoid large amounts of de/allocations if (utf8_len < len) { - utf8_buffer = realloc(utf8_buffer, len * MB_LEN_MAX); + char *new_buffer = realloc(utf8_buffer, len * MB_LEN_MAX); + + if (new_buffer == NULL) + return; + utf8_buffer = new_buffer; utf8_len = len; } diff --git a/src/version.c b/src/version.c index c75668400b..bb33fb77c0 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 746, /**/ 745, /**/ From f3026d9bd8b6ecf5b7b7ad1f31abe12704da9da6 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 28 Jun 2026 18:57:22 +0000 Subject: [PATCH 064/647] patch 9.2.0747: cscope: connection leak when growing the array fails Problem: In cs_insert_filelist() a failed vim_realloc() when growing the csinfo[] array frees the array and resets csinfo/csinfo_size, discarding the still-open existing connections: their fname, ppath and flags are leaked and the cscope child processes are orphaned, since cs_end()/cs_reset() can no longer reach them. (Ao Xijie) Solution: On realloc() failure keep the original array, which is still valid, and only fail to add the new database. closes: #20662 Supported by AI. Signed-off-by: Christian Brabandt --- src/if_cscope.c | 6 ++++-- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/if_cscope.c b/src/if_cscope.c index 54cae51f75..137faed426 100644 --- a/src/if_cscope.c +++ b/src/if_cscope.c @@ -1504,8 +1504,10 @@ cs_insert_filelist( csinfo = vim_realloc(csinfo, sizeof(csinfo_T)*csinfo_size); if (csinfo == NULL) { - vim_free(t_csinfo); - csinfo_size = 0; + // allocation failure, so keep the old infos + csinfo = t_csinfo; + csinfo_size = i; + return -1; } } if (csinfo == NULL) diff --git a/src/version.c b/src/version.c index bb33fb77c0..696a78c404 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 747, /**/ 746, /**/ From 48474e63704b6d5ae2f491ef320d33ef74e87357 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 28 Jun 2026 19:00:30 +0000 Subject: [PATCH 065/647] runtime(netrw): Use consistent forward slashes fixes: #20636 closes: #20663 Signed-off-by: Christian Brabandt --- .../pack/dist/opt/netrw/autoload/netrw.vim | 23 +++++++++++++------ src/testdir/test_plugin_netrw.vim | 9 ++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index 8006837cf0..1535644d27 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jun 16 +" Last Change: 2026 Jun 28 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -418,7 +418,7 @@ endif " == 6: Texplore function netrw#Explore(indx,dosplit,style,...) if !exists("b:netrw_curdir") - let b:netrw_curdir= getcwd() + let b:netrw_curdir= netrw#fs#Cwd(0) endif " record current file for Rexplore's benefit @@ -525,6 +525,10 @@ function netrw#Explore(indx,dosplit,style,...) call s:NetrwClearExplore() return endif + " Win32: Use forward slashes + if !g:netrw_cygwin && has("win32") + let dirname= substitute(dirname,'\','/','g') + endif if dirname =~ '\.\./\=$' let dirname= simplify(fnamemodify(dirname,':p:h')) @@ -568,14 +572,11 @@ function netrw#Explore(indx,dosplit,style,...) if starpat == 0 && a:indx >= 0 " [Explore Hexplore Vexplore Sexplore] [dirname] - if dirname == "" - let dirname= curfiledir - endif if dirname =~# '^scp://' || dirname =~ '^ftp://' call netrw#Nread(2,dirname) else if dirname == "" - let dirname= getcwd() + let dirname= netrw#fs#Cwd(0) elseif has("win32") && !g:netrw_cygwin " Windows : check for a drive specifier, or else for a remote share name ('\\Foo' or '//Foo', " depending on whether backslashes have been converted to forward slashes by earlier code). @@ -4983,7 +4984,7 @@ function s:NetrwMaps(islocal) nno NetrwSLeftmouse :exec "norm! \leftmouse>"call NetrwSLeftmouse(1) nno NetrwSLeftdrag :exec "norm! \leftmouse>"call NetrwSLeftdrag(1) nmap Netrw2Leftmouse - - exe 'nnoremap :exec "norm! \leftmouse>"call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'nnoremap :exec "norm! \leftmouse>"call NetrwLocalRm("'.mapsafecurdir.'")' exe 'vnoremap :exec "norm! \leftmouse>"call NetrwLocalRm("'.mapsafecurdir.'")' endif exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' @@ -8679,7 +8680,15 @@ function s:NetrwLocalRename(path) range endif NetrwKeepj norm! 0 + if exists('+shellslash') && !&ssl + let reset_ssl = 1 + set ssl + endif + " Consistently use / as directory separator let oldname= netrw#fs#ComposePath(a:path,curword) + if reset_ssl + set nossl + endif call inputsave() let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e')) diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index eee5f09841..ea3f33cece 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -869,4 +869,13 @@ func Test_netrw_local_rm_injection() endtry endfunc +func Test_netrw_forward_slashes() + Explore + call assert_notmatch('\\', b:netrw_curdir) + bw! + Explore . + call assert_notmatch('\\', b:netrw_curdir) + bw! +endfunc + " vim:ts=8 sts=2 sw=2 et From 9fb5b5d8765e39dafc88f178ad9fd1879c683daf Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sun, 28 Jun 2026 19:27:31 +0000 Subject: [PATCH 066/647] patch 9.2.0748: 'autocompletedelay' interferes with CTRL-G U Problem: 'autocompletedelay' interferes with CTRL-G U (after 9.2.0739). Solution: Restore the flag for CTRL-G U. related: #8937 related: #20666 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/edit.c | 3 +++ src/testdir/test_ins_complete.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 29 insertions(+) diff --git a/src/edit.c b/src/edit.c index 1860ba3716..93910de6b5 100644 --- a/src/edit.c +++ b/src/edit.c @@ -1171,6 +1171,9 @@ edit( break; case K_COMPLETE_DELAY: // 'autocompletedelay' expired + // If CTRL-G U was used apply it to the next typed key. + if (dont_sync_undo == TRUE) + dont_sync_undo = MAYBE; ins_compl_clear_autocomplete_delay(); if (!ins_compl_has_autocomplete() || char_avail() || curwin->w_cursor.col == 0) diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 00fcf4e44d..b178ad272b 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -5976,6 +5976,30 @@ func Test_autocompletedelay() call StopVimInTerminal(buf) endfunc +func Run_test_autocompletedelay_ctrl_g_U(delay1, delay2) + new + call setline(1, 'foo bar baz') + inoremap ( ()U + set autocomplete autocompletedelay=200 + + call timer_start(a:delay1, { -> feedkeys('(', 't') }) + call timer_start(a:delay2, { -> feedkeys("\a\", 't') }) + call feedkeys('ob', 'tx!') + call assert_equal(['foo bar baz', 'b(a)'], getline(1, '$')) + undo + call assert_equal(['foo bar baz'], getline(1, '$')) + + set autocomplete& autocompletedelay& + bwipe! +endfunc + +func Test_autocompletedelay_ctrl_g_U() + " '(' typed after 'autocompletedelay' expires + call Run_test_autocompletedelay_ctrl_g_U(250, 500) + " '(' typed before 'autocompletedelay' expires + call Run_test_autocompletedelay_ctrl_g_U(150, 500) +endfunc + " Preinsert longest prefix when autocomplete func Test_autocomplete_longest() func GetLine() diff --git a/src/version.c b/src/version.c index 696a78c404..784016772a 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 748, /**/ 747, /**/ From 0d292e20676cb399fa6bee8300d7ae3bebe97a8f Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sun, 28 Jun 2026 19:30:58 +0000 Subject: [PATCH 067/647] patch 9.2.0749: 'autocompletedelay' interferes with i_CTRL-K Problem: 'autocompletedelay' interferes with i_CTRL-K (after 9.2.0739). Solution: Clear the pending autocompltion from the previous key when a new key is typed. closes: #20666 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/edit.c | 3 +++ src/testdir/test_ins_complete.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 26 insertions(+) diff --git a/src/edit.c b/src/edit.c index 93910de6b5..bc8ce4128d 100644 --- a/src/edit.c +++ b/src/edit.c @@ -677,6 +677,9 @@ edit( // Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. did_cursorhold = TRUE; + if (c != K_CURSORHOLD && c != K_COMPLETE_DELAY) + // Don't want delayed autocompletion from the previous key either. + ins_compl_clear_autocomplete_delay(); #ifdef FEAT_RIGHTLEFT if (p_hkmap && KeyTyped) diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index b178ad272b..cdcdb217e3 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6000,6 +6000,27 @@ func Test_autocompletedelay_ctrl_g_U() call Run_test_autocompletedelay_ctrl_g_U(150, 500) endfunc +func Run_test_autocompletedelay_ctrl_k(delay1, delay2) + new + call setline(1, 'foo bar baz') + set autocomplete autocompletedelay=200 + + call timer_start(a:delay1, { -> feedkeys("\", 't') }) + call timer_start(a:delay2, { -> feedkeys(".,\", 't') }) + call feedkeys('ob', 'tx!') + call assert_equal(['foo bar baz', 'b…'], getline(1, '$')) + + set autocomplete& autocompletedelay& + bwipe! +endfunc + +func Test_autocompletedelay_ctrl_k() + " Ctrl-K typed after 'autocompletedelay' expires + call Run_test_autocompletedelay_ctrl_k(250, 500) + " Ctrl-K typed before 'autocompletedelay' expires + call Run_test_autocompletedelay_ctrl_k(150, 500) +endfunc + " Preinsert longest prefix when autocomplete func Test_autocomplete_longest() func GetLine() diff --git a/src/version.c b/src/version.c index 784016772a..a42f2bd839 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 749, /**/ 748, /**/ From 1f0f14bc2fbe278690c2b1510c9d0f3b5061020c Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 28 Jun 2026 19:48:02 +0000 Subject: [PATCH 068/647] patch 9.2.0750: completion: 'autocompletedelay' deferral leaks state Problem: After 'autocompletedelay' was made non-blocking, the deferred popup can misbehave: a pending autocomplete survives leaving Insert mode and then keeps waking the editor in Normal mode, the deferral is recorded into registers while recording a macro, the popup appears an extra 'updatetime' late when 'autocompletedelay' is larger and a CursorHoldI autocommand exists, CursorHoldI can fire twice without an intervening keypress, and an open balloon is dismissed (after v9.2.0739) Solution: Treat the deferral like CursorHold: only keep it pending in Insert mode and not while recording, with pending typeahead, or when completion is already active; drop it when Insert mode ends; measure the delay from when the user typed so a CursorHold in between does not push the popup back; and do not let the deferral re-enable CursorHoldI or dismiss the balloon. (Hirohito Higashi). closes: #20669 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/edit.c | 7 +++++-- src/getchar.c | 3 ++- src/insexpand.c | 17 ++++++++++++++++ src/proto/insexpand.pro | 1 + src/testdir/test_ins_complete.vim | 18 ++++++++++++++++ src/ui.c | 34 +++++++++++++++++++++++-------- src/version.c | 2 ++ 7 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/edit.c b/src/edit.c index bc8ce4128d..3b0cfcc882 100644 --- a/src/edit.c +++ b/src/edit.c @@ -901,6 +901,8 @@ edit( break; } doESCkey: + // Drop a pending autocomplete so it does not outlive Insert mode. + ins_compl_clear_autocomplete_delay(); /* * This is the ONLY return from edit()! */ @@ -1539,8 +1541,9 @@ edit( break; } // end of switch (c) - // If typed something may trigger CursorHoldI again. - if (c != K_CURSORHOLD + // If typed something may trigger CursorHoldI again; K_COMPLETE_DELAY is + // injected, not typed. + if (c != K_CURSORHOLD && c != K_COMPLETE_DELAY #ifdef FEAT_COMPL_FUNC // but not in CTRL-X mode, a script can't restore the state && ctrl_x_mode_normal() diff --git a/src/getchar.c b/src/getchar.c index 309c0d7c15..a192d14628 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -2175,7 +2175,8 @@ vgetc(void) #endif #ifdef FEAT_BEVAL_TERM - if (c != K_MOUSEMOVE && c != K_IGNORE && c != K_CURSORHOLD) + if (c != K_MOUSEMOVE && c != K_IGNORE && c != K_CURSORHOLD + && c != K_COMPLETE_DELAY) { // Don't trigger 'balloonexpr' unless only the mouse was moved. bevalexpr_due_set = FALSE; diff --git a/src/insexpand.c b/src/insexpand.c index 75e55a60eb..331a50011e 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -206,6 +206,9 @@ static buf_T *compl_curr_buf = NULL; // buf where completion is active // COMPL_FUNC_TIMEOUT_NON_KW_MS). - girish static int compl_autocomplete = FALSE; // whether autocompletion is active static bool compl_autocomplete_pending = false; +#ifdef ELAPSED_FUNC +static elapsed_T compl_autocomplete_start_tv; // when the delay was armed +#endif static int compl_timeout_ms = COMPL_INITIAL_TIMEOUT_MS; static int compl_time_slice_expired = FALSE; // time budget exceeded for current source static int compl_from_nonkeyword = FALSE; // completion started from non-keyword @@ -7398,6 +7401,7 @@ ins_compl_arm_autocomplete_delay(void) #ifdef ELAPSED_FUNC if (p_acl > 0) { + ELAPSED_INIT(compl_autocomplete_start_tv); compl_autocomplete_pending = true; return true; } @@ -7423,6 +7427,19 @@ ins_compl_autocomplete_pending(void) return compl_autocomplete_pending; } +/* + * Return the time in msec since the 'autocompletedelay' was armed. + */ + long +ins_compl_autocomplete_elapsed(void) +{ +#ifdef ELAPSED_FUNC + return ELAPSED_FUNC(compl_autocomplete_start_tv); +#else + return 0; +#endif +} + /* * Remove (if needed) and show the popup menu */ diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index b574652aaf..ebc8e25ac4 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -79,6 +79,7 @@ void ins_compl_enable_autocomplete(void); bool ins_compl_arm_autocomplete_delay(void); void ins_compl_clear_autocomplete_delay(void); bool ins_compl_autocomplete_pending(void); +long ins_compl_autocomplete_elapsed(void); void free_insexpand_stuff(void); void f_preinserted(typval_T *argvars, typval_T *rettv); /* vim: set ft=c : */ diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index cdcdb217e3..4165002cd8 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6021,6 +6021,24 @@ func Test_autocompletedelay_ctrl_k() call Run_test_autocompletedelay_ctrl_k(150, 500) endfunc +func Test_autocompletedelay_no_record() + " The K_COMPLETE_DELAY pseudo key must not be recorded into a register while + " recording a macro, like K_CURSORHOLD. + new + call setline(1, 'foobar') + set autocomplete autocompletedelay=100 + + let @a = '' + " Type a char that arms the delay, idle past 'autocompletedelay' so a + " K_COMPLETE_DELAY would be injected, then end Insert mode and stop recording. + call timer_start(200, { -> feedkeys("\q", 't') }) + call feedkeys("qaSf", 'tx!') + call assert_equal("Sf\", @a) + + set autocomplete& autocompletedelay& + bwipe! +endfunc + " Preinsert longest prefix when autocomplete func Test_autocomplete_longest() func GetLine() diff --git a/src/ui.c b/src/ui.c index 3ba656d3a5..ee6837d8d6 100644 --- a/src/ui.c +++ b/src/ui.c @@ -304,24 +304,40 @@ inchar_loop( // When an autocomplete is pending, wake at the sooner of // 'autocompletedelay' and 'updatetime' so the delay does not postpone // CursorHold. Once CursorHold has fired, only the delay is left. - bool delay_pending = ins_compl_autocomplete_pending() && p_acl > 0; + // Gate the injection like trigger_cursorhold() so the deferred key + // cannot fire while recording or outside Insert mode. + bool delay_pending = ins_compl_autocomplete_pending() && p_acl > 0 + && reg_recording == 0 + && typebuf.tb_len == 0 + && !ins_compl_active() + && (get_real_state() & MODE_INSERT) != 0; + // Measure the delay from when it was armed (the keystroke), so a + // CursorHold returning in between does not push the popup back. + long acl_elapsed = delay_pending ? ins_compl_autocomplete_elapsed() : 0; if (wtime < 0 && did_start_blocking && !delay_pending) // blocking and already waited for p_ut wait_time = -1; else { +# ifdef ELAPSED_FUNC + elapsed_time = ELAPSED_FUNC(start_tv); +# endif if (wtime >= 0) - wait_time = wtime; + wait_time = wtime - elapsed_time; else if (delay_pending) - wait_time = did_start_blocking ? p_acl : MIN(p_acl, p_ut); + { + long delay_left = p_acl - acl_elapsed; + long ut_left = p_ut - elapsed_time; + + if (did_start_blocking) + wait_time = delay_left; + else + wait_time = MIN(delay_left, ut_left); + } else // going to block after p_ut - wait_time = p_ut; -# ifdef ELAPSED_FUNC - elapsed_time = ELAPSED_FUNC(start_tv); -# endif - wait_time -= elapsed_time; + wait_time = p_ut - elapsed_time; // If the waiting time is now zero or less, we timed out. However, // loop at least once to check for characters and events. Matters @@ -334,7 +350,7 @@ inchar_loop( // The 'autocompletedelay' expired: trigger the popup. When // 'updatetime' is shorter, fall through to CursorHold instead. - if (delay_pending && elapsed_time >= p_acl && maxlen >= 3 + if (delay_pending && acl_elapsed >= p_acl && maxlen >= 3 && !typebuf_changed(tb_change_cnt)) { if (buf == NULL) diff --git a/src/version.c b/src/version.c index a42f2bd839..218fdc163a 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 750, /**/ 749, /**/ From 760365548b63526919adabf6bd59e5410259a29a Mon Sep 17 00:00:00 2001 From: RestorerZ Date: Mon, 29 Jun 2026 21:00:06 +0000 Subject: [PATCH 069/647] translation(ru): Updated message files closes: #20671 Signed-off-by: RestorerZ Signed-off-by: Christian Brabandt --- src/po/ru.cp1251.po | 144 ++++++++++++++++++++++++++++++-------------- src/po/ru.po | 144 ++++++++++++++++++++++++++++++-------------- 2 files changed, 196 insertions(+), 92 deletions(-) diff --git a/src/po/ru.cp1251.po b/src/po/ru.cp1251.po index a6157995d9..56bf8f6d27 100644 --- a/src/po/ru.cp1251.po +++ b/src/po/ru.cp1251.po @@ -22,10 +22,10 @@ # msgid "" msgstr "" -"Project-Id-Version: RuVim_0.9020262.280326\n" +"Project-Id-Version: RuVim_0.9020677.200626\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-03-28 14:52+0300\n" -"PO-Revision-Date: 2026-03-30 20:47+0300\n" +"POT-Creation-Date: 2026-06-20 13:01+0300\n" +"PO-Revision-Date: 2026-06-20 14:36+0300\n" "Last-Translator: Restorer, \n" "Language-Team: RuVim, https://github.com/RestorerZ/RuVim\n" "Language: ru_RU\n" @@ -221,26 +221,26 @@ msgstr "%d %%" msgid "%3s" msgstr "%3s" -# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå ïðè -# Restorer: ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ +# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå +# Restorer: ïðè ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ #, c-format msgid " (%d of %d)" msgstr " (%d èç %d)" -# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå ïðè -# Restorer: ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ +# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå +# Restorer: ïðè ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ #, c-format msgid " ((%d) of %d)" msgstr " ((%d) èç %d)" -# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå ïðè -# Restorer: ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ +# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå +# Restorer: ïðè ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ #, c-format msgid " (file %d of %d)" msgstr " (ôàéë %d èç %d)" -# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå ïðè -# Restorer: ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ +# Restorer: âûâîäèòñÿ â çàãîëîâêå îêíà, ñòðîêå ñîñòîÿíèÿ, êîìíäíîé ñòðîêå +# Restorer: ïðè ðåäàêòèðîâàíèè íåñêîëüêèõ ôàéëîâ #, c-format msgid " (file (%d) of %d)" msgstr " (ôàéë (%d) èç %d)" @@ -351,9 +351,6 @@ msgstr " msgid "%d of %d edited" msgstr "îòðåäàêòèðîâàíî %d èç %d" -msgid "Socket server not online:Send expression failed" -msgstr "Ñáîé ïðè îòïðàâêå âûðàæåíèÿ. Íå ïîäêëþ÷åí ñåðâåð ñîêåòîâ" - msgid "No display: Send expression failed.\n" msgstr "Ñáîé ïðè îòïðàâêå âûðàæåíèÿ. Îòñóòñòâóåò ïîäêëþ÷åíèå\n" @@ -1321,6 +1318,22 @@ msgstr " msgid "Vim: Main window unexpectedly destroyed\n" msgstr "Ïðîãðàììà Vim. Íåïðåäâèäåííîå çàêðûòèå îñíîâíîãî îêíà\n" +# Restorer: ïóíêò êîíòåêñòíîãî ìåíþ íà âêëàäêå è ïàíåëè âêëàäîê GTK4 +msgid "Close Tab" +msgstr "Çàêðûòü âêëàäêó" + +# Restorer: ïóíêò êîíòåêñòíîãî ìåíþ íà âêëàäêå è ïàíåëè âêëàäîê GTK4 +msgid "New Tab" +msgstr "Íîâàÿ âêëàäêà" + +# Restorer: çàãîëîâîê ãðóïïû â îêíå ïîèñêà è çàìåíû GTK4 +msgid "Direction:" +msgstr "Íàïðàâëåíèå" + +# Restorer: êíîïêà â îêíå ïîèñêà è çàìåíû GTK4 +msgid "Close" +msgstr "Çàêðûòü" + # Restorer: íàèìåíîâàíèå êíîïêè â îêíå âûáîðà ôàéëîâ # ~!: earlier msgid "&Filter" @@ -2220,8 +2233,10 @@ msgstr "-X\t\t\t msgid "-Y\t\t\tDo not connect to Wayland compositor" msgstr "-Y\t\t\tÇàïóñê ïðîãðàììû áåç ïîäêëþ÷åíèÿ ê Wayland Compositor" -msgid "--clientserver Backend for clientserver communication" -msgstr "--clientserver Òèï ïîäêëþ÷åíèå ìåæäó êëèåíòîì è ñåðâåðîì" +msgid "" +"--clientserver Backend for clientserver communication" +msgstr "" +"--clientserver Òèï ïîäêëþ÷åíèå ìåæäó êëèåíòîì è ñåðâåðîì" msgid "--remote \tEdit in a Vim server if possible" msgstr "" @@ -2537,6 +2552,9 @@ msgid "??? from here until ???END lines may be messed up" msgstr "" "Ñòðîêè, êîòîðûå, âîçìîæíî, èñïîð÷åíû, ïîìåùåíû ìåæäó ìåòêàìè ??? è ???END" +msgid "??? block header corrupted" +msgstr "??? áëîê çàãîëîâêà ïîâðåæä¸í" + msgid "??? from here until ???END lines may have been inserted/deleted" msgstr "" "Ñòðîêè, êîòîðûå áûëè âñòàâëåíû èëè óäàëåíû, ïîìåùåíû ìåæäó ìåòêàìè ??? è ???" @@ -2790,13 +2808,13 @@ msgstr " msgid "\" already exists!" msgstr "\"!" +msgid "Swap file already exists!" +msgstr "Îáíàðóæåí ôàéë ïîäêà÷êè!" + # Restorer: çàãîëîâîê îêíà msgid "VIM - ATTENTION" msgstr "Âíèìàíèå" -msgid "Swap file already exists!" -msgstr "Îáíàðóæåí ôàéë ïîäêà÷êè!" - # Restorer: êíîïêè îêíî äèàëîãà ïðè îáíàðóæåíèè ñóùåñòâóþùåãî ôàéëà ïîäêà÷êè msgid "" "&Open Read-Only\n" @@ -3272,10 +3290,6 @@ msgstr "" msgid "XSMP SmcOpenConnection failed: %s" msgstr "Ôóíêöèÿ SmcOpenConnection() âåðíóëà îøèáêó %s" -#, c-format -msgid "Failed creating socket directory: %s" -msgstr "Ïðîèçîø¸ë ñáîé ïðè ñîçäàíèè êàòàëîãà ñîêåòà %s" - # ~!: earlier msgid "At line" msgstr "íà ñòðîêå" @@ -3670,6 +3684,10 @@ msgstr " ( msgid " (not supported)" msgstr " (íå ïîääåðæèâàåòñÿ)" +#, c-format +msgid "Failed creating socket directory: %s" +msgstr "Ïðîèçîø¸ë ñáîé ïðè ñîçäàíèè êàòàëîãà ñîêåòà %s" + # Restorer: øàáëîíû %s çàìåíÿþòñÿ íà ÿçûê, êîäèðîâêà, ÿçûê, ñîîòâåòñòâåííî #, c-format msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" @@ -4523,6 +4541,12 @@ msgstr "" msgid "without GUI." msgstr "áåç ãðàôè÷åñêîãî èíòåðôåéñà." +msgid "with GTK4 GUI (hwaccel)." +msgstr "ñ ãðàôè÷åñêèì èíòåðôåéñîì GTK4 (hwaccel)." + +msgid "with GTK4 GUI." +msgstr "ñ ãðàôè÷åñêèì èíòåðôåéñîì GTK4." + msgid "with GTK3 GUI." msgstr "ñ ãðàôè÷åñêèì èíòåðôåéñîì GTK3." @@ -6546,11 +6570,6 @@ msgstr "E456: msgid "E457: Can't read PostScript resource file \"%s\"" msgstr "E457: Íå óäàëîñü ñ÷èòàòü ôàéë îïèñàíèé PostScript \"%s\"" -msgid "E458: Cannot allocate colormap entry, some colors may be incorrect" -msgstr "" -"E458: Íå óäàëîñü ñ÷èòàòü çàïèñü èç ïàëèòðû. Öâåòà ìîãóò îòîáðàæàòüñÿ " -"íåêîððåêòíî" - msgid "E459: Cannot go back to previous directory" msgstr "" "E459: Ó ïðîãðàììû Vim îòñóòñòâóþò ïðàâà íà èñïîëíåíèå â òåêóùåì êàòàëîãå" @@ -7264,6 +7283,9 @@ msgstr "E647: msgid "E648: Invalid buffer identifier in close" msgstr "E648: Íåäîïóñòèìûé èäåíòèôèêàòîð áóôåðà â êîìàíäå close" +msgid "E649: Invalid identifier name in defineAnnoType" +msgstr "E649: Íåäîïóñòèìûé èäåíòèôèêàòîð íàèìåíîâàíèÿ â êîìàíäå defineAnnoType" + msgid "E650: Invalid buffer identifier in defineAnnoType" msgstr "E650: Íåäîïóñòèìûé èäåíòèôèêàòîð áóôåðà â êîìàíäå defineAnnoType" @@ -8286,10 +8308,11 @@ msgstr "E910: msgid "E911: Using a Job as a Float" msgstr "E911: Îæèäàëñÿ òèï äàííûõ Float, à ïîëó÷åí Job" -msgid "E912: Cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" +msgid "" +"E912: Cannot use ch_evalexpr()/ch_sendexpr() with a raw, nl or blob channel" msgstr "" -"E912: Ôóíêöèè ch_evalexpr() è ch_sendexpr() íåïðèìåíèìû ê ñîåäèíåíèþ RAW èëè " -"NL" +"E912: Ôóíêöèè ch_evalexpr() è ch_sendexpr() íåïðèìåíèìû ê ñîåäèíåíèþ RAW, NL " +"èëè BLOB" msgid "E913: Using a Channel as a Number" msgstr "E913: Îæèäàëñÿ òèï äàííûõ Number, à ïîëó÷åí Channel" @@ -10148,6 +10171,11 @@ msgstr "E1404: msgid "E1405: Class \"%s\" cannot be used as a value" msgstr "E1405: Íå äîïóñêàåòñÿ â êà÷åñòâå çíà÷åíèÿ óêàçûâàòü êëàññ \"%s\"" +#, c-format +msgid "E1406: Public and protected member have the same name: %s and _%s" +msgstr "" +"E1406: Îáùèé è çàùèù¸ííûé ÷ëåí èìåþò îäíî è òîæå íàèìåíîâàíèå %s è _%s" + msgid "E1407: Cannot use a Typealias as a variable or value" msgstr "" "E1407: Íå äîïóñêàåòñÿ â êà÷åñòâå ïåðåìåííîé èëè çíà÷åíèÿ óêàçûâàòü ïñåâäîíèì " @@ -10463,7 +10491,7 @@ msgstr "E1545: msgid "E1546: Cannot switch to a closing buffer" msgstr "E1546: Íå äîïóñêàåòñÿ ïåðåêëþ÷åíèå â çàêðûòûé áóôåð" -msgid "E1547: This version of Vim does support :redrawtabpanel" +msgid "E1547: This version of Vim does not support :redrawtabpanel" msgstr "E1547: Äàííàÿ âåðñèÿ ïðîãðàììû íå ïîääåðæèâàåò êîìàíäó :redrawtabpanel" msgid "E1548: Wayland connection is unavailable" @@ -10526,24 +10554,25 @@ msgstr "" "E1562: Íå äîïóñêàåòñÿ èñïîëüçîâàòü ïðèâÿçêè ñðàâíåíèÿ ïðè íàëè÷èè ñêðûòûõ " "áóôåðîâ â ðåæèìå ñâåðêè ðàçëè÷èé" -msgid "E1563: Socket path is too big" -msgstr "E1563: Ìàðøðóò ê ñîêåòó ñëèøêîì äëèííûé" - -msgid "E1564: Socket name cannot have slashes in it without being a path" +#, c-format +msgid "E1564: Socket name '%s' cannot have slashes in it without being a path" msgstr "" -"E1564:  íàèìåíîâàíèè ñîêåòà íå äîëæíî áûòü êîñîé ÷åðòû, åñëè ýòî íå ìàðøðóò" +"E1564:  íàèìåíîâàíèè ñîêåòà '%s' íå äîëæíî áûòü êîñîé ÷åðòû, " +"åñëè ýòî íå ìàðøðóò" msgid "E1565: Socket server is not online, call remote_startserver() first" msgstr "" "E1565: Ñåðâåð ñîêåòîâ íå ïîäêëþ÷åí, âûçîâèòå ôóíêöèþ remote_startserver()" #, c-format -msgid "E1566: Failed connecting to socket %s: %s" -msgstr "E1566: Ïðîèçîø¸ë ñáîé ïðè ïîäêëþ÷åíèè ê ñîêåòó %s: %s" +msgid "E1566: Failed connecting to socket '%s'" +msgstr "E1566: Ïðîèçîø¸ë ñáîé ïðè ïîäêëþ÷åíèè ê ñîêåòó '%s'" -msgid "E1567: Cannot start socket server, socket path is unavailable" +msgid "" +"E1567: Socket server protocol version mismatch, check what Vim version you " +"are using" msgstr "" -"E1567: Íå óäàëîñü çàïóñòèòü ñåðâåð ñîêåòîâ, ìàðøðóò ê ñîêåòó íåäåéñòâèòåëåí" +"E1567: Íåñîîòâåòñòâèå âåðñèè ïðîòîêîëà Socket server, ïðîâåðüòå âåðñèþ Vim" #, c-format msgid "E1568: OSC command response timed out: %.*s" @@ -10577,6 +10606,22 @@ msgstr "" msgid "E1575: Cannot create pipes" msgstr "E1575: Íå óäàëîñü ñîçäàòü êîíâåéåð" +msgid "E1576: Tag file entry must not be a URL" +msgstr "E1576:  ýëåìåíòå èíäåêñíîãî ôàéëà íå äîëæíî áûòü URL" + +#, c-format +msgid "E1577: Invalid format string, only one \"%s\" is allowed" +msgstr "E1577: Íåäîïóñòèìûé ôîðìàò ñòðîêè. Ýòî äîïóñòèìî \"%s\"" + +msgid "E1578: Too many postponed prefixes and/or compound flags" +msgstr "" +"E1578: Áîëüøîå êîëè÷åñòâî êàê îòëîæåííûõ ïðåôèêñîâ, òàê è ïðèçíàêîâ " +"ñîñòàâíûõ ñëîâ" + +msgid "E1579: -completeopt=escape cannot be used with -nargs=_" +msgstr "" +"E1579: Êîìàíäà -completeopt=escape íå ìîæåò ïðèìåíÿòüñÿ ñ êîìàíäîé -nargs=_" + # Restorer: âûâîäèòñÿ, íàïðèìåð, ïî êîìàíäå `CTRL+g`, `g CTRL+g` è ò. ï. msgid "--No lines in buffer--" msgstr "-- Áóôåð íå ñîäåðæèò òåêñò --" @@ -11131,6 +11176,9 @@ msgstr "" msgid "file names in a tags file are relative to the tags file" msgstr "èíòåðïðåòèðîâàòü ðàñïîëîæåíèå ôàéëîâ îòíîñèòåëüíî ôàéëà èíäåêñîâ" +msgid "a :tag command cannot access remote files" +msgstr "êîìàíäà :tag íå ìîæåò ïîëó÷èòü äîñòóï ê óäàë¸ííûì ôàéëàì" + msgid "a :tag command will use the tagstack" msgstr "äëÿ êîìàíäû :tag èñïîëüçóåòñÿ ñòåê èíäåêñîâ" @@ -11179,6 +11227,9 @@ msgstr " msgid "number of screen lines to show around the cursor" msgstr "êîëè÷åñòâî êîíòåêñòíûõ ñòðîê äëÿ ñòðîêè ñ êàðåòêîé" +msgid "vertically center cursor even at end of file" +msgstr "öåíòðèðîâàòü êàðåòêó ïî âåðòèêàëè äàæå â êîíöå ôàéëà" + msgid "long lines wrap" msgstr "ðàçáèâêà äëèííûõ ñòðîê äëÿ îòîáðàæåíèÿ â ïðåäåëàõ îêíà" @@ -11793,11 +11844,6 @@ msgstr " msgid "Wayland seat to use" msgstr "Ìåñòîïîëîæåíèå, èñïîëüçóåìîå Wayland" -msgid "" -"Enable wayland focus stealing functionality in order to access the clipboard" -msgstr "" -"Âêëþ÷èò ôóíêöèàíàë Wayland ïî ïåðåõâàòó ôîêóñà äëÿ äîñòóïà ê áóôåðó îáìåíà" - msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" msgstr "" "äåéñòâèÿ, êîòîðûå ìîãóò âûïîëíÿòü ñïåöèàëüíûå êëàâèøè\n" @@ -11908,6 +11954,9 @@ msgstr " msgid "popup border style" msgstr "òèï ðàìêè âñïëûâàþùåãî îêíà" +msgid "additional options for the popup menu" +msgstr "íåîáÿçàòåëüíûå ïàðàìåòðû äëÿ âñïëûâàþùåãî îêíà" + msgid "user defined function for Insert mode completion" msgstr "ïîëüçîâàòåëüñêàÿ ôóíêöèÿ ïðè ïîäñòàíîâêå â ðåæèìå âñòàâêè" @@ -12148,6 +12197,9 @@ msgstr " msgid "allow setting expression options from a modeline" msgstr "ðàçðåøèòü âû÷èñëåíèå âûðàæåíèé â ðåæèìíîé ñòðîêå" +msgid "only allow safe options to be set from a modeline" +msgstr "ðàçðåøèòü óñòàíîâêó òîëüêî áåçîïàñíûõ ïàðàìåòðîâ â ðåæèìíîé ñòðîêå" + msgid "number of lines to check for modelines" msgstr "êîëè÷åñòâî ïðîâåðÿåìûõ â ôàéëå ñòðîê íà íàëè÷èå ðåæèìíîé ñòðîêè" diff --git a/src/po/ru.po b/src/po/ru.po index c077cb262f..c20b56dfdb 100644 --- a/src/po/ru.po +++ b/src/po/ru.po @@ -22,10 +22,10 @@ # msgid "" msgstr "" -"Project-Id-Version: RuVim_0.9020262.280326\n" +"Project-Id-Version: RuVim_0.9020677.200626\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-03-28 14:52+0300\n" -"PO-Revision-Date: 2026-03-30 20:47+0300\n" +"POT-Creation-Date: 2026-06-20 13:01+0300\n" +"PO-Revision-Date: 2026-06-20 14:36+0300\n" "Last-Translator: Restorer, \n" "Language-Team: RuVim, https://github.com/RestorerZ/RuVim\n" "Language: ru_RU\n" @@ -221,26 +221,26 @@ msgstr "%d %%" msgid "%3s" msgstr "%3s" -# Restorer: выводится в заголовке окна, строке состояния, комндной строке при -# Restorer: редактировании нескольких файлов +# Restorer: выводится в заголовке окна, строке состояния, комндной строке +# Restorer: при редактировании нескольких файлов #, c-format msgid " (%d of %d)" msgstr " (%d из %d)" -# Restorer: выводится в заголовке окна, строке состояния, комндной строке при -# Restorer: редактировании нескольких файлов +# Restorer: выводится в заголовке окна, строке состояния, комндной строке +# Restorer: при редактировании нескольких файлов #, c-format msgid " ((%d) of %d)" msgstr " ((%d) из %d)" -# Restorer: выводится в заголовке окна, строке состояния, комндной строке при -# Restorer: редактировании нескольких файлов +# Restorer: выводится в заголовке окна, строке состояния, комндной строке +# Restorer: при редактировании нескольких файлов #, c-format msgid " (file %d of %d)" msgstr " (файл %d из %d)" -# Restorer: выводится в заголовке окна, строке состояния, комндной строке при -# Restorer: редактировании нескольких файлов +# Restorer: выводится в заголовке окна, строке состояния, комндной строке +# Restorer: при редактировании нескольких файлов #, c-format msgid " (file (%d) of %d)" msgstr " (файл (%d) из %d)" @@ -351,9 +351,6 @@ msgstr " Сбой передачи. Попытка выполнить локал msgid "%d of %d edited" msgstr "отредактировано %d из %d" -msgid "Socket server not online:Send expression failed" -msgstr "Сбой при отправке выражения. Не подключен сервер сокетов" - msgid "No display: Send expression failed.\n" msgstr "Сбой при отправке выражения. Отсутствует подключение\n" @@ -1321,6 +1318,22 @@ msgstr "Открыть вкладку..." msgid "Vim: Main window unexpectedly destroyed\n" msgstr "Программа Vim. Непредвиденное закрытие основного окна\n" +# Restorer: пункт контекстного меню на вкладке и панели вкладок GTK4 +msgid "Close Tab" +msgstr "Закрыть вкладку" + +# Restorer: пункт контекстного меню на вкладке и панели вкладок GTK4 +msgid "New Tab" +msgstr "Новая вкладка" + +# Restorer: заголовок группы в окне поиска и замены GTK4 +msgid "Direction:" +msgstr "Направление" + +# Restorer: кнопка в окне поиска и замены GTK4 +msgid "Close" +msgstr "Закрыть" + # Restorer: наименование кнопки в окне выбора файлов # ~!: earlier msgid "&Filter" @@ -2220,8 +2233,10 @@ msgstr "-X\t\t\tЗапуск программы без подключения к msgid "-Y\t\t\tDo not connect to Wayland compositor" msgstr "-Y\t\t\tЗапуск программы без подключения к Wayland Compositor" -msgid "--clientserver Backend for clientserver communication" -msgstr "--clientserver Тип подключение между клиентом и сервером" +msgid "" +"--clientserver Backend for clientserver communication" +msgstr "" +"--clientserver Тип подключение между клиентом и сервером" msgid "--remote \tEdit in a Vim server if possible" msgstr "" @@ -2537,6 +2552,9 @@ msgid "??? from here until ???END lines may be messed up" msgstr "" "Строки, которые, возможно, испорчены, помещены между метками ??? и ???END" +msgid "??? block header corrupted" +msgstr "??? блок заголовка повреждён" + msgid "??? from here until ???END lines may have been inserted/deleted" msgstr "" "Строки, которые были вставлены или удалены, помещены между метками ??? и ???" @@ -2790,13 +2808,13 @@ msgstr "Обнаружен файл подкачки \"" msgid "\" already exists!" msgstr "\"!" +msgid "Swap file already exists!" +msgstr "Обнаружен файл подкачки!" + # Restorer: заголовок окна msgid "VIM - ATTENTION" msgstr "Внимание" -msgid "Swap file already exists!" -msgstr "Обнаружен файл подкачки!" - # Restorer: кнопки окно диалога при обнаружении существующего файла подкачки msgid "" "&Open Read-Only\n" @@ -3272,10 +3290,6 @@ msgstr "" msgid "XSMP SmcOpenConnection failed: %s" msgstr "Функция SmcOpenConnection() вернула ошибку %s" -#, c-format -msgid "Failed creating socket directory: %s" -msgstr "Произошёл сбой при создании каталога сокета %s" - # ~!: earlier msgid "At line" msgstr "на строке" @@ -3670,6 +3684,10 @@ msgstr " (не найдено)" msgid " (not supported)" msgstr " (не поддерживается)" +#, c-format +msgid "Failed creating socket directory: %s" +msgstr "Произошёл сбой при создании каталога сокета %s" + # Restorer: шаблоны %s заменяются на язык, кодировка, язык, соответственно #, c-format msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" @@ -4523,6 +4541,12 @@ msgstr "" msgid "without GUI." msgstr "без графического интерфейса." +msgid "with GTK4 GUI (hwaccel)." +msgstr "с графическим интерфейсом GTK4 (hwaccel)." + +msgid "with GTK4 GUI." +msgstr "с графическим интерфейсом GTK4." + msgid "with GTK3 GUI." msgstr "с графическим интерфейсом GTK3." @@ -6546,11 +6570,6 @@ msgstr "E456: Не найден файл описаний PostScript \"%s.ps\"" msgid "E457: Can't read PostScript resource file \"%s\"" msgstr "E457: Не удалось считать файл описаний PostScript \"%s\"" -msgid "E458: Cannot allocate colormap entry, some colors may be incorrect" -msgstr "" -"E458: Не удалось считать запись из палитры. Цвета могут отображаться " -"некорректно" - msgid "E459: Cannot go back to previous directory" msgstr "" "E459: У программы Vim отсутствуют права на исполнение в текущем каталоге" @@ -7264,6 +7283,9 @@ msgstr "E647: Недопустимый идентификатор буфера msgid "E648: Invalid buffer identifier in close" msgstr "E648: Недопустимый идентификатор буфера в команде close" +msgid "E649: Invalid identifier name in defineAnnoType" +msgstr "E649: Недопустимый идентификатор наименования в команде defineAnnoType" + msgid "E650: Invalid buffer identifier in defineAnnoType" msgstr "E650: Недопустимый идентификатор буфера в команде defineAnnoType" @@ -8286,10 +8308,11 @@ msgstr "E910: Ожидался тип данных Number, а получен Job msgid "E911: Using a Job as a Float" msgstr "E911: Ожидался тип данных Float, а получен Job" -msgid "E912: Cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" +msgid "" +"E912: Cannot use ch_evalexpr()/ch_sendexpr() with a raw, nl or blob channel" msgstr "" -"E912: Функции ch_evalexpr() и ch_sendexpr() неприменимы к соединению RAW или " -"NL" +"E912: Функции ch_evalexpr() и ch_sendexpr() неприменимы к соединению RAW, NL " +"или BLOB" msgid "E913: Using a Channel as a Number" msgstr "E913: Ожидался тип данных Number, а получен Channel" @@ -10148,6 +10171,11 @@ msgstr "E1404: Интерфейсы не поддерживают ключево msgid "E1405: Class \"%s\" cannot be used as a value" msgstr "E1405: Не допускается в качестве значения указывать класс \"%s\"" +#, c-format +msgid "E1406: Public and protected member have the same name: %s and _%s" +msgstr "" +"E1406: Общий и защищённый член имеют одно и тоже наименование %s и _%s" + msgid "E1407: Cannot use a Typealias as a variable or value" msgstr "" "E1407: Не допускается в качестве переменной или значения указывать псевдоним " @@ -10463,7 +10491,7 @@ msgstr "E1545: Недоступен журнал списка результат msgid "E1546: Cannot switch to a closing buffer" msgstr "E1546: Не допускается переключение в закрытый буфер" -msgid "E1547: This version of Vim does support :redrawtabpanel" +msgid "E1547: This version of Vim does not support :redrawtabpanel" msgstr "E1547: Данная версия программы не поддерживает команду :redrawtabpanel" msgid "E1548: Wayland connection is unavailable" @@ -10526,24 +10554,25 @@ msgstr "" "E1562: Не допускается использовать привязки сравнения при наличии скрытых " "буферов в режиме сверки различий" -msgid "E1563: Socket path is too big" -msgstr "E1563: Маршрут к сокету слишком длинный" - -msgid "E1564: Socket name cannot have slashes in it without being a path" +#, c-format +msgid "E1564: Socket name '%s' cannot have slashes in it without being a path" msgstr "" -"E1564: В наименовании сокета не должно быть косой черты, если это не маршрут" +"E1564: В наименовании сокета '%s' не должно быть косой черты, " +"если это не маршрут" msgid "E1565: Socket server is not online, call remote_startserver() first" msgstr "" "E1565: Сервер сокетов не подключен, вызовите функцию remote_startserver()" #, c-format -msgid "E1566: Failed connecting to socket %s: %s" -msgstr "E1566: Произошёл сбой при подключении к сокету %s: %s" +msgid "E1566: Failed connecting to socket '%s'" +msgstr "E1566: Произошёл сбой при подключении к сокету '%s'" -msgid "E1567: Cannot start socket server, socket path is unavailable" +msgid "" +"E1567: Socket server protocol version mismatch, check what Vim version you " +"are using" msgstr "" -"E1567: Не удалось запустить сервер сокетов, маршрут к сокету недействителен" +"E1567: Несоответствие версии протокола Socket server, проверьте версию Vim" #, c-format msgid "E1568: OSC command response timed out: %.*s" @@ -10577,6 +10606,22 @@ msgstr "" msgid "E1575: Cannot create pipes" msgstr "E1575: Не удалось создать конвейер" +msgid "E1576: Tag file entry must not be a URL" +msgstr "E1576: В элементе индексного файла не должно быть URL" + +#, c-format +msgid "E1577: Invalid format string, only one \"%s\" is allowed" +msgstr "E1577: Недопустимый формат строки. Это допустимо \"%s\"" + +msgid "E1578: Too many postponed prefixes and/or compound flags" +msgstr "" +"E1578: Большое количество как отложенных префиксов, так и признаков " +"составных слов" + +msgid "E1579: -completeopt=escape cannot be used with -nargs=_" +msgstr "" +"E1579: Команда -completeopt=escape не может применяться с командой -nargs=_" + # Restorer: выводится, например, по команде `CTRL+g`, `g CTRL+g` и т. п. msgid "--No lines in buffer--" msgstr "-- Буфер не содержит текст --" @@ -11131,6 +11176,9 @@ msgstr "" msgid "file names in a tags file are relative to the tags file" msgstr "интерпретировать расположение файлов относительно файла индексов" +msgid "a :tag command cannot access remote files" +msgstr "команда :tag не может получить доступ к удалённым файлам" + msgid "a :tag command will use the tagstack" msgstr "для команды :tag используется стек индексов" @@ -11179,6 +11227,9 @@ msgstr "прокрутка частично отображаемой строк msgid "number of screen lines to show around the cursor" msgstr "количество контекстных строк для строки с кареткой" +msgid "vertically center cursor even at end of file" +msgstr "центрировать каретку по вертикали даже в конце файла" + msgid "long lines wrap" msgstr "разбивка длинных строк для отображения в пределах окна" @@ -11793,11 +11844,6 @@ msgstr "Интервал опроса сервера Wayland для чтения msgid "Wayland seat to use" msgstr "Местоположение, используемое Wayland" -msgid "" -"Enable wayland focus stealing functionality in order to access the clipboard" -msgstr "" -"Включит функцианал Wayland по перехвату фокуса для доступа к буферу обмена" - msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" msgstr "" "действия, которые могут выполнять специальные клавиши\n" @@ -11908,6 +11954,9 @@ msgstr "максимальная ширина всплывающего меню msgid "popup border style" msgstr "тип рамки всплывающего окна" +msgid "additional options for the popup menu" +msgstr "необязательные параметры для всплывающего окна" + msgid "user defined function for Insert mode completion" msgstr "пользовательская функция при подстановке в режиме вставки" @@ -12148,6 +12197,9 @@ msgstr "при считывании файла использовать наст msgid "allow setting expression options from a modeline" msgstr "разрешить вычисление выражений в режимной строке" +msgid "only allow safe options to be set from a modeline" +msgstr "разрешить установку только безопасных параметров в режимной строке" + msgid "number of lines to check for modelines" msgstr "количество проверяемых в файле строк на наличие режимной строки" From 1f2f568f9147ca68d8772869fd6b6f56901847b3 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Mon, 29 Jun 2026 21:04:52 +0000 Subject: [PATCH 070/647] patch 9.2.0751: GTK3 GUI is slow under Wayland Problem: GTK3 GUI redraws are slow under Wayland because each draw operation queues its own draw area. Solution: Defer redraws under Wayland: coalesce dirty rectangles and flush them once in gui_mch_flush(), route draw calls through a queue_draw_area() wrapper (Christoffer Aasted) closes: #20528 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- runtime/doc/gui_x11.txt | 10 +++- src/gui_gtk_x11.c | 126 ++++++++++++++++++++++++++++++---------- src/version.c | 2 + 3 files changed, 105 insertions(+), 33 deletions(-) diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index 8a084505e8..d55f35aba7 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -1,4 +1,4 @@ -*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jun 24 +*gui_x11.txt* For Vim version 9.2. Last change: 2026 June 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -353,8 +353,12 @@ to the GTK documentation, however little there is, on how to do this. See https://www.manpagez.com/html/gtk2/gtk2-2.24.24/gtk2-Resource-Files.php for more information. *gtk3-slow* -If you are using GTK3 and Vim appears to be slow, try setting the environment -variable $GDK_RENDERING to "image". +If the GTK3 GUI is slow, try: > + + $ GDK_RENDERING=image gvim + +Small font, high resolution, many 'lines' (vertical screen) and UI scaling all +contribute to a slower redraw. *gtk4-slow* If the GTK4 GUI is slow, freezes, or does not accept keyboard input right diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index d28ccde863..d7ea36274f 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -3745,6 +3745,54 @@ gui_gtk_set_dnd_targets(void) GDK_ACTION_COPY | GDK_ACTION_MOVE); } +#ifdef GDK_WINDOWING_WAYLAND +static struct { + int left; + int top; + int right; + int bottom; + bool active; +} wl_dirty_rect = {0, 0, 0, 0, false}; + + static void +wl_queue_dirty_area(int x, int y, int width, int height) +{ + if (!wl_dirty_rect.active) + { + wl_dirty_rect.left = x; + wl_dirty_rect.top = y; + wl_dirty_rect.right = x + width; + wl_dirty_rect.bottom = y + height; + wl_dirty_rect.active = true; + } + else + { + // Expand to append further changes + if (x < wl_dirty_rect.left) wl_dirty_rect.left = x; + if (y < wl_dirty_rect.top) wl_dirty_rect.top = y; + if (x + width > wl_dirty_rect.right) wl_dirty_rect.right = x + width; + if (y + height > wl_dirty_rect.bottom) wl_dirty_rect.bottom = y + height; + } +} + + static void +wl_flush(void) +{ + if (!wl_dirty_rect.active) + return; + int draw_x = wl_dirty_rect.left; + int draw_y = wl_dirty_rect.top; + int draw_w = wl_dirty_rect.right - wl_dirty_rect.left; + int draw_h = wl_dirty_rect.bottom - wl_dirty_rect.top; + + if (draw_w > 0 && draw_h > 0) + { + gtk_widget_queue_draw_area(gui.drawarea, draw_x, draw_y, draw_w, draw_h); + } + wl_dirty_rect.active = false; +} +#endif + /* * Initialize the GUI. Create all the windows, set up all the callbacks etc. * Returns OK for success, FAIL when the GUI can't be started. @@ -4425,7 +4473,7 @@ form_configure_event(GtkWidget *widget UNUSED, // too small. Schedule a corrective resize (now that offsets are // known) so the window actually fits the geometry Vim has just set. if ((mch_csd_height > 0 || mch_csd_width > 0) && gtk_socket_id == 0) - g_idle_add(startup_resize_correction_cb, NULL); + g_idle_add_full(GTK_PRIORITY_RESIZE, startup_resize_correction_cb, NULL, NULL); } clear_resize_hists(); #endif @@ -6221,6 +6269,21 @@ gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) return len_sum; } + static void +queue_draw_area( + int x, + int y, + int width, + int height) +{ +#ifdef GDK_WINDOWING_WAYLAND + if (gui.is_wayland) + wl_queue_dirty_area(x, y, width, height); + else +#endif + gtk_widget_queue_draw_area(gui.drawarea, x, y, width, height); +} + int gui_gtk_draw_string_ext( int row, @@ -6473,7 +6536,7 @@ gui_gtk_draw_string_ext( #if GTK_CHECK_VERSION(3,0,0) cairo_destroy(cr); - gtk_widget_queue_draw_area(gui.drawarea, area.x, area.y, + queue_draw_area(area.x, area.y, area.width, area.height); #else gdk_gc_set_clip_rectangle(gui.text_gc, NULL); @@ -6617,7 +6680,7 @@ gui_mch_invert_rectangle(int r, int c, int nr, int nc) cairo_destroy(cr); - gtk_widget_queue_draw_area(gui.drawarea, rect.x, rect.y, + queue_draw_area(rect.x, rect.y, rect.width, rect.height); #else GdkGCValues values; @@ -6772,7 +6835,19 @@ gui_mch_update(void) int cnt = 0; // prevent endless loop while (g_main_context_pending(NULL) && !vim_is_input_buf_full() && ++cnt < 100) + { +#ifdef GDK_WINDOWING_WAYLAND + if (gui.is_wayland) + { + int prio = 0; + g_main_context_prepare(NULL, &prio); + // peek internal scheduling of redraw, honors 'lazyredraw' + if (prio == GDK_PRIORITY_REDRAW && redrawing()) + gui_may_flush(); // prepares redraw: g_main_context_iteration + } +#endif g_main_context_iteration(NULL, TRUE); + } } static timeout_cb_type @@ -6905,11 +6980,17 @@ gui_mch_wait_for_chars(long wtime) gui_mch_flush(void) { if (gui.mainwin != NULL && gtk_widget_get_realized(gui.mainwin)) + { +#ifdef GDK_WINDOWING_WAYLAND + if (gui.is_wayland) + return wl_flush(); +#endif #if GTK_CHECK_VERSION(2,4,0) gdk_display_flush(gtk_widget_get_display(gui.mainwin)); #else gdk_display_sync(gtk_widget_get_display(gui.mainwin)); #endif + } } /* @@ -6961,7 +7042,7 @@ gui_mch_clear_block(int row1arg, int col1arg, int row2arg, int col2arg) cairo_fill(cr); cairo_destroy(cr); - gtk_widget_queue_draw_area(gui.drawarea, + queue_draw_area( rect.x, rect.y, rect.width, rect.height); } #else // !GTK_CHECK_VERSION(3,0,0) @@ -6998,7 +7079,7 @@ gui_gtk_window_clear(GdkWindow *win) cairo_fill(cr); cairo_destroy(cr); - gtk_widget_queue_draw_area(gui.drawarea, + queue_draw_area( rect.x, rect.y, rect.width, rect.height); } #else @@ -7058,7 +7139,7 @@ gui_mch_draw_popup_image( cairo_popup_image_paint(wp, gui.surface, x, y, src_x, src_y, draw_w, draw_h); if (gui.drawarea != NULL) - gtk_widget_queue_draw_area(gui.drawarea, x, y, draw_w, draw_h); + queue_draw_area(x, y, draw_w, draw_h); # else cairo_popup_image_paint(wp, gui.drawarea->window, x, y, src_x, src_y, draw_w, draw_h); @@ -7114,49 +7195,35 @@ gui_gtk_surface_copy_rect(int dest_x, int dest_y, cairo_t * const cr = cairo_create(gui.surface); # ifdef GDK_WINDOWING_WAYLAND - /* - Following optimizations are temporary until all callers are refactored - to wayland deferred redraw; .. then it could be removed. - */ static cairo_surface_t *scroll_scratch = NULL; - static int scratch_w = 0; - static int scratch_h = 0; - int last_row = Rows - 1; - int last_row_y = last_row * gui.char_height; + static int scratch_w = 0, scratch_h = 0; + int last_row = Rows - 1, last_row_y = last_row * gui.char_height; bool last_row_overlap = (dest_y + height) > last_row_y; if (gui.is_wayland && ( !(State & MODE_CMDLINE) || !last_row_overlap) ) { - /* - scrolling up - */ - if (dest_y < src_y) + if (dest_y < src_y) // scroll up { cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_surface(cr, gui.surface, - src_x - dest_x, + cairo_set_source_surface(cr, gui.surface, src_x - dest_x, dest_y - src_y); cairo_rectangle(cr, dest_x, dest_y, width, height); cairo_clip(cr); cairo_paint(cr); } else - { - // reusing surface when scrolling, only realloc if larger + { // reuse surface when scrolling, only realloc if larger if (scroll_scratch == NULL || width > scratch_w || height > scratch_h) { cairo_surface_destroy(scroll_scratch); // safe even if NULL scroll_scratch = cairo_surface_create_similar(gui.surface, cairo_surface_get_content(gui.surface), width, height); - scratch_w = width; - scratch_h = height; + scratch_w = width, scratch_h = height; } - // capture scroll source region cairo_t *tcr = cairo_create(scroll_scratch); cairo_set_source_surface(tcr, gui.surface, -src_x, -src_y); cairo_paint(tcr); cairo_destroy(tcr); - // reuse scroll source region cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_rectangle(cr, dest_x, dest_y, width, height); @@ -7176,7 +7243,6 @@ gui_gtk_surface_copy_rect(int dest_x, int dest_y, cairo_pop_group_to_source(cr); cairo_paint(cr); } - cairo_destroy(cr); } #endif @@ -7200,7 +7266,7 @@ gui_mch_delete_lines(int row, int num_lines) gui_clear_block( gui.scroll_region_bot - num_lines + 1, gui.scroll_region_left, gui.scroll_region_bot, gui.scroll_region_right); - gtk_widget_queue_draw_area(gui.drawarea, + queue_draw_area( FILL_X(gui.scroll_region_left), FILL_Y(row), gui.char_width * ncols + 1, gui.char_height * nrows); #else @@ -7246,7 +7312,7 @@ gui_mch_insert_lines(int row, int num_lines) gui_clear_block( row, gui.scroll_region_left, row + num_lines - 1, gui.scroll_region_right); - gtk_widget_queue_draw_area(gui.drawarea, + queue_draw_area( FILL_X(gui.scroll_region_left), FILL_Y(row), gui.char_width * ncols + 1, gui.char_height * nrows); #else @@ -7739,7 +7805,7 @@ gui_mch_drawsign(int row, int col, int typenr) cairo_surface_destroy(bg_surf); cairo_destroy(cr); - gtk_widget_queue_draw_area(gui.drawarea, + queue_draw_area( FILL_X(col), FILL_Y(col), width, height); } diff --git a/src/version.c b/src/version.c index 218fdc163a..d4c08b3eb9 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 751, /**/ 750, /**/ From 1372aafa543215e9e7e91d88db4d02801433db2f Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 29 Jun 2026 21:11:23 +0000 Subject: [PATCH 071/647] patch 9.2.0752: GTK4: drag-and-drop does not support HTML Problem: In the GTK4 GUI drag-and-drop does not support HTML. Solution: Refactor GTK 4 drag-and-drop and clipboard handling. closes: #20637 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/clipboard.c | 13 +- src/gui.h | 4 + src/gui_gtk4.c | 486 ++++++++++++++++++++++++++++++++--------- src/proto/gui_gtk4.pro | 2 + src/version.c | 2 + 5 files changed, 396 insertions(+), 111 deletions(-) diff --git a/src/clipboard.c b/src/clipboard.c index 5ac185cb53..b96b245c31 100644 --- a/src/clipboard.c +++ b/src/clipboard.c @@ -3293,12 +3293,19 @@ did_set_clipboard(optset_T *args UNUSED) vim_regfree(clip_exclude_prog); clip_exclude_prog = new_exclude_prog; # endif -# if defined(FEAT_GUI_GTK) && !defined(USE_GTK4) +# if defined(FEAT_GUI_GTK) if (gui.in_use) { +# ifdef USE_GTK4 + gui_gtk_update_selection_formats(&clip_plus); + gui_gtk_update_selection_formats(&clip_star); +# else gui_gtk_set_selection_targets((GdkAtom)GDK_SELECTION_PRIMARY); gui_gtk_set_selection_targets((GdkAtom)clip_plus.gtk_sel_atom); +# endif +# ifdef FEAT_DND gui_gtk_set_dnd_targets(); +# endif } # endif } @@ -3730,7 +3737,9 @@ dec_clip_provider(void) * If "vim" is TRUE, then get the motion type. If "vimenc" is TRUE, then get the * motion type and also convert "*buf". "buf" and "len_store" will be updated to * reflect the actual contents, but should be set beforehand with the initial - * contents. Returns OK on success and FAIL on failure. + * contents. Note that if "*tofree" is not NULL, use vim_free() on "*buf", + * otherwise use the free func for which "*buf" was allocated with. In both + * cases use vim_free() on "*tofree". Returns OK on success and FAIL on failure. */ int clip_convert_data( diff --git a/src/gui.h b/src/gui.h index 56e86d7a7f..aa9f94ec9b 100644 --- a/src/gui.h +++ b/src/gui.h @@ -490,6 +490,10 @@ typedef struct Gui // Used for clipboard functionality in GTK4 GUI GdkContentProvider *regular_provider; GdkContentProvider *primary_provider; + +# ifdef FEAT_DND + GtkDropTargetAsync *drop_target; +# endif #endif } gui_T; diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 5a4e78481d..2bcb31ce9e 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -284,7 +284,7 @@ static gboolean scroll_event(GtkEventControllerScroll *controller, double dx, do static void focus_in_event(GtkEventControllerFocus *controller, gpointer data); static void focus_out_event(GtkEventControllerFocus *controller, gpointer data); #ifdef FEAT_DND -static gboolean drop_cb(GtkDropTarget *target, const GValue *value, double x, double y, gpointer data); +static gboolean drop_cb(GtkDropTargetAsync *target, GdkDrop *drop, double x, double y, void *data); #endif #ifdef FEAT_GUI_TABLINE static void tabline_enter_cb(GtkEventController *controller, double x, double y, void *udata); @@ -295,6 +295,7 @@ static void tabline_menu_press_event(GtkGestureClick *gesture, int n_press, doub #endif static void mainwin_destroy_cb(GObject *object, gpointer data); static gboolean delete_event_cb(GtkWindow *window, gpointer data); +static int query_pointer_pos(int *x, int *y, GdkModifierType *state); static void mainwin_fullscreened_cb(GObject *obj, GParamSpec *pspec, gpointer user_data); static void drawarea_realize_cb(GtkWidget *widget, gpointer data); static void drawarea_unrealize_cb(GtkWidget *widget, gpointer data); @@ -628,14 +629,17 @@ gui_mch_init(void) } #ifdef FEAT_DND - // Set up drag-and-drop target for files and text. + // Set up drag-and-drop target for files and text. We use async variant so + // we can handle html format. { - GtkDropTarget *drop = gtk_drop_target_new(G_TYPE_INVALID, GDK_ACTION_COPY); - GType types[] = { GDK_TYPE_FILE_LIST, G_TYPE_STRING }; - gtk_drop_target_set_gtypes(drop, types, 2); - g_signal_connect(drop, "drop", + gui.drop_target = gtk_drop_target_async_new(NULL, + GDK_ACTION_COPY | GDK_ACTION_MOVE); + + gui_gtk_set_dnd_targets(); + g_signal_connect(gui.drop_target, "drop", G_CALLBACK(drop_cb), NULL); - gtk_widget_add_controller(gui.drawarea, GTK_EVENT_CONTROLLER(drop)); + gtk_widget_add_controller(gui.drawarea, + GTK_EVENT_CONTROLLER(gui.drop_target)); } #endif @@ -647,13 +651,13 @@ gui_mch_init(void) { GdkDisplay *display = gtk_widget_get_display(gui.mainwin); GdkClipboard *primary = gdk_display_get_primary_clipboard(display); - GdkClipboard *board = gdk_display_get_clipboard(display); + GdkClipboard *regular = gdk_display_get_clipboard(display); if (primary != NULL) g_signal_connect(primary, "changed", G_CALLBACK(clipboard_changed_cb), &clip_star); - if (board != NULL) - g_signal_connect(board, "changed", + if (regular != NULL) + g_signal_connect(regular, "changed", G_CALLBACK(clipboard_changed_cb), &clip_plus); } @@ -2425,14 +2429,207 @@ drawarea_scale_factor_cb(GObject *object UNUSED, } #endif +typedef enum +{ + READ_DATA_CLIP, // Clipboard data + READ_DATA_DROP, // URI or text DND data + READ_DATA_DROP_DATA // HTML DND data +} ReadDataType; + +#define READDATA_BUFSIZE 4096 + +// Used for reading clipboard and DND data. +typedef struct +{ + ReadDataType type; + + GCancellable *cancel; + GByteArray *arr; // NULL when not needed + char *buf; // NULL when not needed +} ReadData; + +#ifdef FEAT_DND +typedef struct +{ + ReadData rd; + GdkDrop *drop; + int x; + int y; +} DropReadData; +#endif + +typedef struct +{ + ReadData rd; + Clipboard_T *cbd; + char *mime_type; +} ClipReadData; + + static ReadData * +read_data_new(ReadDataType type, size_t sz) +{ + ReadData *rd = g_malloc0(sz); + + rd->type = type; + rd->cancel = g_cancellable_new(); + + if (type == READ_DATA_CLIP || type == READ_DATA_DROP_DATA) + { + rd->arr = g_byte_array_new(); + rd->buf = g_malloc(READDATA_BUFSIZE); + } + + return rd; +} + + static void +read_data_free(ReadData *rd) +{ + g_cancellable_cancel(rd->cancel); + + if (rd->type == READ_DATA_CLIP) + g_free(((ClipReadData *)rd)->mime_type); + else if (rd->type == READ_DATA_DROP || rd->type == READ_DATA_DROP_DATA) + g_object_unref(((DropReadData *)rd)->drop); + g_object_unref(rd->cancel); + if (rd->arr != NULL) + g_byte_array_free(rd->arr, TRUE); + g_free(rd->buf); + g_free(rd); +} + #ifdef FEAT_DND +static void drop_read_text(GdkDrop *drop, char_u *text); +#endif + /* - * Drag-and-drop handler for files and text. + * General purpose callback for reading data from an input stream, either from + * clipboard or DND. */ - static gboolean -drop_cb(GtkDropTarget *target UNUSED, const GValue *value, - double x, double y, gpointer data UNUSED) + static void +read_data_input_cb( + GInputStream *stream, + GAsyncResult *result, + ReadData *rd) { + ssize_t r = g_input_stream_read_finish(stream, result, NULL); + + if (r == -1) + { + // Error occured + DropReadData *drd = (DropReadData *)rd; + + if (rd->type == READ_DATA_DROP_DATA) + gdk_drop_finish(drd->drop, 0); + } + else if (r == 0) + { + // EOF, don't need to check for READ_DATA_DROP because that uses GType. + if (rd->type == READ_DATA_CLIP) + { + ClipReadData *crd = (ClipReadData *)rd; + long len; + char_u *actual, *final; + int motion_type = MAUTO; + char_u *tofree = NULL; + + len = (long)rd->arr->len; + actual = final = g_byte_array_free(rd->arr, FALSE); + rd->arr = NULL; + + if (clip_convert_data(&final, &len, &motion_type, + STRCMP(crd->mime_type, VIM_MIMETYPE_NAME) == 0, + STRCMP(crd->mime_type, VIMENC_MIMETYPE_NAME) == 0, + &tofree) == OK) + clip_yank_selection(motion_type, final, len, crd->cbd); + g_free(actual); + vim_free(tofree); + } +#ifdef FEAT_DND + else if (rd->type == READ_DATA_DROP_DATA) + { + DropReadData *drd = (DropReadData *)rd; + char_u *str; + + // Append NUL + g_byte_array_append(rd->arr, (const uint8_t *)"", 1); + str = g_byte_array_free(rd->arr, FALSE); + rd->arr = NULL; + drop_read_text(drd->drop, str); + g_free(str); + gdk_drop_finish(drd->drop, gdk_drop_get_actions(drd->drop)); + } +#endif + } + else + { + // Continue reading + g_byte_array_append(rd->arr, (const uint8_t *)rd->buf, r); + g_input_stream_read_async(stream, rd->buf, READDATA_BUFSIZE, + G_PRIORITY_HIGH, + rd->cancel, (GAsyncReadyCallback)read_data_input_cb, rd); + return; + } + + read_data_free(rd); + g_object_unref(stream); +} + +#ifdef FEAT_DND +/* + * Set up for receiving DND items. + */ + void +gui_gtk_set_dnd_targets(void) +{ + GdkContentFormatsBuilder *builder = gdk_content_formats_builder_new(); + + gdk_content_formats_builder_add_gtype(builder, GDK_TYPE_FILE_LIST); + gdk_content_formats_builder_add_gtype(builder, G_TYPE_STRING); + if (clip_html) + gdk_content_formats_builder_add_mime_type(builder, "text/html"); + + gtk_drop_target_async_set_formats(gui.drop_target, + gdk_content_formats_builder_free_to_formats(builder)); +} + +/* + * Handle textual DND data. Note that this does not finish the drop. + */ + static void +drop_read_text(GdkDrop *drop, char_u *text) +{ + GdkModifierType state; + char_u dropkey[6] = { + CSI, + KS_MODIFIER, + 0, + CSI, + KS_EXTRA, + (char_u)KE_DROP + }; + + if (text == NULL || *text == NUL || !query_pointer_pos(NULL, NULL, &state)) + return; + + dnd_yank_drag_data((char_u *)text, (long)STRLEN(text)); + + dropkey[2] = modifiers_gdk2vim(state); + if (dropkey[2] != 0) + add_to_input_buf(dropkey, (int)sizeof(dropkey)); + else + add_to_input_buf(dropkey + 3, (int)(sizeof(dropkey) - 3)); +} + + static void +drop_read_value_cb(GdkDrop *drop, GAsyncResult *result, DropReadData *drd) +{ + const GValue *value = gdk_drop_read_value_finish(drop, result, NULL); + gboolean success = FALSE; + + if (value == NULL) + goto exit; + if (G_VALUE_HOLDS(value, GDK_TYPE_FILE_LIST)) { GSList *files = g_value_get_boxed(value); @@ -2441,11 +2638,11 @@ drop_cb(GtkDropTarget *target UNUSED, const GValue *value, int i; if (nfiles <= 0) - return FALSE; + goto exit; fnames = ALLOC_MULT(char_u *, nfiles); if (fnames == NULL) - return FALSE; + goto exit; i = 0; for (GSList *l = files; l != NULL; l = l->next) @@ -2459,27 +2656,122 @@ drop_cb(GtkDropTarget *target UNUSED, const GValue *value, nfiles = i; if (nfiles > 0) - gui_handle_drop((int)x, (int)y, 0, fnames, nfiles); + gui_handle_drop(drd->x, drd->y, 0, fnames, nfiles); else vim_free(fnames); - - return TRUE; + success = TRUE; } else if (G_VALUE_HOLDS(value, G_TYPE_STRING)) { - const char *text = g_value_get_string(value); - char_u dropkey[6] = {CSI, KS_MODIFIER, 0, - CSI, KS_EXTRA, (char_u)KE_DROP}; + const char *text = g_value_get_string(value); if (text == NULL || *text == NUL) - return FALSE; + goto exit; - dnd_yank_drag_data((char_u *)text, (long)STRLEN(text)); - add_to_input_buf(dropkey + 3, 3); + drop_read_text(drop, (char_u *)text); + success = TRUE; + } - return TRUE; +exit: + gdk_drop_finish(drop, success ? gdk_drop_get_actions(drop) : 0); + read_data_free(&drd->rd); +} + + static void +drop_read_cb(GdkDrop *drop, GAsyncResult *result, DropReadData *drd) +{ + GInputStream *in_stream; + const char *m; + + in_stream = gdk_drop_read_finish(drop, result, &m, NULL); + if (in_stream == NULL || STRCMP(m, "text/html") != 0) + { + read_data_free(&drd->rd); + gdk_drop_finish(drop, 0); + return; } + assert(STRCMP(m, "text/html") == 0); + + // GTK docs says not to use blocking read calls, so do it async. + g_input_stream_read_async(in_stream, drd->rd.buf, READDATA_BUFSIZE, + G_PRIORITY_HIGH, + drd->rd.cancel, (GAsyncReadyCallback)read_data_input_cb, drd); +} + +// GCancellable of current DND operation, else NULL. +static GCancellable *dnd_cancel = NULL; +static guint dnd_timeout_id = 0; + + static gboolean +drop_timeout_cb(void *udata UNUSED) +{ + g_cancellable_cancel(dnd_cancel); + g_clear_object(&dnd_cancel); + dnd_timeout_id = 0; + + return G_SOURCE_REMOVE; +} + +/* + * Drag-and-drop handler for files and text. + */ + static gboolean +drop_cb( + GtkDropTargetAsync *target UNUSED, + GdkDrop *drop, + double x, + double y, + void *udata UNUSED) +{ + GdkContentFormats *formats = gdk_drop_get_formats(drop); + DropReadData *drd = NULL; + + if (gdk_content_formats_contain_gtype(formats, GDK_TYPE_FILE_LIST)) + { + drd = (DropReadData *)read_data_new(READ_DATA_DROP, sizeof(*drd)); + gdk_drop_read_value_async(drop, GDK_TYPE_FILE_LIST, G_PRIORITY_HIGH, + drd->rd.cancel, (GAsyncReadyCallback)drop_read_value_cb, drd); + } + else if (clip_html + && gdk_content_formats_contain_mime_type(formats, "text/html")) + { + static const char *m[] = {"text/html", NULL}; + + drd = (DropReadData *)read_data_new(READ_DATA_DROP_DATA, sizeof(*drd)); + gdk_drop_read_async(drop, m, G_PRIORITY_HIGH, + drd->rd.cancel, (GAsyncReadyCallback)drop_read_cb, drd); + } + else if (gdk_content_formats_contain_gtype(formats, G_TYPE_STRING)) + { + drd = (DropReadData *)read_data_new(READ_DATA_DROP, sizeof(*drd)); + gdk_drop_read_value_async(drop, G_TYPE_STRING, G_PRIORITY_HIGH, + drd->rd.cancel, (GAsyncReadyCallback)drop_read_value_cb, drd); + } + + if (dnd_cancel != NULL) + g_cancellable_cancel(dnd_cancel); + g_clear_object(&dnd_cancel); + g_clear_handle_id(&dnd_timeout_id, timeout_remove); + + if (drd != NULL) + { + drd->drop = g_object_ref(drop); + drd->x = (int)x; + drd->y = (int)y; + dnd_cancel = g_object_ref(drd->rd.cancel); + + // Trying to spin the event loop here causes this GTK assertion error: + // Gtk:ERROR:../gtk/gtk/gtkdrop.c:70:gtk_drop_begin_event: assertion failed: (self->active == FALSE) + // + // This shouldn't be an issue, because Vim DND occurs asynchronously in + // the first place anyways. + + // Add a 3 second timeout + dnd_timeout_id = timeout_add(3000, drop_timeout_cb, NULL); + + return TRUE; + } return FALSE; } #endif @@ -2670,7 +2962,7 @@ gui_mch_set_foreground(void) } static int -query_pointer_pos(int *x, int *y) +query_pointer_pos(int *x, int *y, GdkModifierType *state) { GtkNative *native; GdkSurface *surface; @@ -2698,25 +2990,28 @@ query_pointer_pos(int *x, int *y) if (pointer == NULL) return FALSE; - if (!gdk_surface_get_device_position(surface, pointer, &sx, &sy, NULL)) + if (!gdk_surface_get_device_position(surface, pointer, &sx, &sy, state)) return FALSE; - gtk_native_get_surface_transform(native, &nx, &ny); - src.x = (float)(sx - nx); - src.y = (float)(sy - ny); - if (!gtk_widget_compute_point(GTK_WIDGET(native), gui.drawarea, - &src, &dst)) - return FALSE; + if (x != NULL && y != NULL) + { + gtk_native_get_surface_transform(native, &nx, &ny); + src.x = (float)(sx - nx); + src.y = (float)(sy - ny); + if (!gtk_widget_compute_point(GTK_WIDGET(native), gui.drawarea, + &src, &dst)) + return FALSE; - *x = (int)dst.x; - *y = (int)dst.y; + *x = (int)dst.x; + *y = (int)dst.y; + } return TRUE; } void gui_mch_getmouse(int *x, int *y) { - if (!query_pointer_pos(x, y)) + if (!query_pointer_pos(x, y, NULL)) { *x = 0; *y = 0; @@ -3994,6 +4289,20 @@ get_menu_tool_height(void) return height; } +/* + * Update selection targets for regular and primary selections. + */ + void +gui_gtk_update_selection_formats(Clipboard_T *cbd) +{ + // This will call the ref_formats() vfunc of the content provider, see + // gui_gtk4_cb.c + if (cbd == &clip_plus) + gdk_content_provider_content_changed(gui.regular_provider); + else + gdk_content_provider_content_changed(gui.primary_provider); +} + /* * Get the GdkClipboard and GdkContentProvider for the given Clipboard_T. * clip_star (*) uses PRIMARY, clip_plus (+) uses CLIPBOARD. @@ -4024,67 +4333,27 @@ gtk4_get_clipboard(Clipboard_T *cbd, GdkContentProvider **provider) } } -typedef struct { - Clipboard_T *cbd; - gboolean done; - gboolean abandoned; // requester timed out, callback owns "crd" -} ClipReadData; - /* * Callback for gdk_clipboard_read_async(). */ static void clip_read_cb(GdkClipboard *cb, GAsyncResult *result, ClipReadData *crd) { - Clipboard_T *cbd = crd->cbd; - GError *error = NULL; GInputStream *in_stream; const char *mime_type; - GByteArray *arr; - static char buf[512]; - ssize_t r; - char_u *actual, *final; - long len; - int motion_type = MAUTO; - char_u *tofree = NULL; - - in_stream = gdk_clipboard_read_finish(cb, result, &mime_type, &error); - if (in_stream == NULL) - { - g_error_free(error); - goto exit; - } - - arr = g_byte_array_new(); - while ((r = g_input_stream_read(in_stream, buf, 512, NULL, NULL)) > 0) - g_byte_array_append(arr, (uint8_t *)buf, r); - - if (r == -1) + in_stream = gdk_clipboard_read_finish(cb, result, &mime_type, NULL); + if (in_stream == NULL) { - g_byte_array_free(arr, TRUE); - goto exit; + read_data_free(&crd->rd); + return; } - assert(r == 0); - - len = (long)arr->len; - actual = final = g_byte_array_free(arr, FALSE); - if (!crd->abandoned && clip_convert_data(&final, &len, &motion_type, - STRCMP(mime_type, VIM_MIMETYPE_NAME) == 0, - STRCMP(mime_type, VIMENC_MIMETYPE_NAME) == 0, &tofree) == OK) - clip_yank_selection(motion_type, final, len, cbd); - g_free(actual); - vim_free(tofree); - -exit: - if (in_stream != NULL) - g_object_unref(in_stream); - // free "crd" if the requester gave up, else mark the read complete - if (crd->abandoned) - vim_free(crd); - else - crd->done = TRUE; + // Not sure if we need to copy the string, but do it anyways. + crd->mime_type = g_strdup(mime_type); + g_input_stream_read_async(in_stream, crd->rd.buf, READDATA_BUFSIZE, + G_PRIORITY_HIGH, + crd->rd.cancel, (GAsyncReadyCallback)read_data_input_cb, crd); } /* @@ -4093,45 +4362,45 @@ clip_read_cb(GdkClipboard *cb, GAsyncResult *result, ClipReadData *crd) void clip_mch_request_selection(Clipboard_T *cbd) { - static const char *mimes_no_html[] = { + static const char *mimes_no_html[] = { VIMENC_MIMETYPE_NAME, VIM_MIMETYPE_NAME, "text/plain;charset=utf-8", "text/plain", NULL }; - GdkClipboard *clipboard; - ClipReadData *crd; - time_t start; + + GdkClipboard *clipboard; + ClipReadData *crd; + GCancellable *cancel; clipboard = gtk4_get_clipboard(cbd, NULL); if (clipboard == NULL) return; - // Heap-allocate: on a timeout this returns before the read completes, - // so "crd" must outlive this stack frame. - crd = ALLOC_ONE(ClipReadData); - if (crd == NULL) - return; + crd = (ClipReadData *)read_data_new(READ_DATA_CLIP, sizeof(*crd)); crd->cbd = cbd; - crd->done = FALSE; - crd->abandoned = FALSE; + cancel = g_object_ref(crd->rd.cancel); gdk_clipboard_read_async( clipboard, clip_html ? supported_mimes : mimes_no_html, - G_PRIORITY_HIGH, NULL, (GAsyncReadyCallback)clip_read_cb, crd); + G_PRIORITY_HIGH, crd->rd.cancel, + (GAsyncReadyCallback)clip_read_cb, crd); - // Spin until the async callback fires, with a 3-second wall-clock - // timeout as a safety net. - start = time(NULL); - while (!crd->done && time(NULL) < start + 3) - g_main_context_iteration(NULL, TRUE); + { + time_t start; - if (crd->done) - vim_free(crd); - else - // timed out: hand ownership to the callback, which frees "crd" - crd->abandoned = TRUE; + // Spin until the done receiving data, with a 3-second wall-clock + // timeout as a safety net. Use the GCancellable as a way to signal if + // done (and also use it to cancel if timed out as well). + start = time(NULL); + while (!g_cancellable_is_cancelled(cancel) + && time(NULL) < start + 3) + g_main_context_iteration(NULL, TRUE); + + g_cancellable_cancel(cancel); + g_object_unref(cancel); + } } static int in_clipboard_set = FALSE; @@ -4468,7 +4737,6 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx) { if (menu_is_separator(menu->name)) { - // TODO menu->id = vim_toolbar_insert_separator(VIM_TOOLBAR(gui.toolbar), idx); } diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index a40b102260..fddaec21a4 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -53,6 +53,7 @@ void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_flash(int msec); void gui_mch_invert_rectangle(int r, int c, int nr, int nc); void gui_gtk4_resize(int width, int height); +void gui_gtk_set_dnd_targets(void); void gui_mch_update(void); int gui_mch_wait_for_chars(long wtime); void gui_mch_flush(void); @@ -83,6 +84,7 @@ void gui_gtk_set_mnemonics(int enable); void gui_make_popup(char_u *path_name, int mouse_pos); int get_menu_tool_width(void); int get_menu_tool_height(void); +void gui_gtk_update_selection_formats(Clipboard_T *cbd); void clip_mch_request_selection(Clipboard_T *cbd); void clip_mch_set_selection(Clipboard_T *cbd); int clip_mch_own_selection(Clipboard_T *cbd); diff --git a/src/version.c b/src/version.c index d4c08b3eb9..48ff1025c7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 752, /**/ 751, /**/ From 3fa4da4acb194660b7f44bba027af9f2120c27fe Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 29 Jun 2026 21:45:53 +0000 Subject: [PATCH 072/647] runtime: add missing fnameescape()/shellescape() in a few runtime files ping @jamessan for the debugchangelog change. Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- runtime/autoload/ada.vim | 12 +++++++----- runtime/autoload/vimball.vim | 16 ++++++++-------- runtime/ftplugin/debchangelog.vim | 4 ++-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/runtime/autoload/ada.vim b/runtime/autoload/ada.vim index 3f1b40398f..c4c572649e 100644 --- a/runtime/autoload/ada.vim +++ b/runtime/autoload/ada.vim @@ -25,6 +25,7 @@ " tweaking is done " 19.09.2007 NO still some mapleader problems " 31.01.2017 MB fix more mapleader problems +" 29.06.2026 Vim add fnameescpe/shellescape " Help Page: ft-ada-functions "------------------------------------------------------------------------------ @@ -423,14 +424,15 @@ endfunction ada#Completion_End " function ada#Create_Tags (option) if a:option == 'file' - let l:Filename = fnamemodify (bufname ('%'), ':p') + let l:Filename = shellescape (fnamemodify (bufname ('%'), ':p')) elseif a:option == 'dir' + let l:Dir = fnamemodify (bufname ('%'), ':p:h') let l:Filename = - \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " . - \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " . - \ fnamemodify (bufname ('%'), ':p:h') . "*.ads" + \ shellescape (l:Dir) . "*.ada " . + \ shellescape (l:Dir) . "*.adb " . + \ shellescape (l:Dir) . "*.ads" else - let l:Filename = a:option + let l:Filename = shellescape (a:option) endif execute '!ctags --excmd=number ' . l:Filename endfunction ada#Create_Tags diff --git a/runtime/autoload/vimball.vim b/runtime/autoload/vimball.vim index 352e94d02d..a1b2e7ffce 100644 --- a/runtime/autoload/vimball.vim +++ b/runtime/autoload/vimball.vim @@ -1,7 +1,7 @@ " vimball.vim : construct a file containing both paths and files " Maintainer: This runtime file is looking for a new maintainer. " Original Author: Charles E. Campbell -" Date: May 20, 2026 +" Date: Jun 29, 2026 " Version: 37 (with modifications from the Vim Project) " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim " Copyright: (c) 2004-2011 by Charles E. Campbell @@ -431,7 +431,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">") endif let fname= substitute(a:fname,'\.gz$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif elseif expand("%") =~ '.*\.gz' && executable("gzip") @@ -441,7 +441,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">") endif let fname= substitute(a:fname,'\.gz$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif elseif expand("%") =~ '.*\.bz2' && executable("bunzip2") @@ -451,7 +451,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">") endif let fname= substitute(a:fname,'\.bz2$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif elseif expand("%") =~ '.*\.bz2' && executable("bzip2") @@ -461,7 +461,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">") endif let fname= substitute(a:fname,'\.bz2$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif elseif expand("%") =~ '.*\.bz3' && executable("bunzip3") @@ -471,7 +471,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip3 may have failed with <".a:fname.">") endif let fname= substitute(a:fname,'\.bz3$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif elseif expand("%") =~ '.*\.bz3' && executable("bzip3") @@ -481,7 +481,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip3 -d" may have failed with <'.a:fname.">") endif let fname= substitute(a:fname,'\.bz3$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif elseif expand("%") =~ '.*\.zip' && executable("unzip") @@ -491,7 +491,7 @@ fun! vimball#Decompress(fname,...) call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">") endif let fname= substitute(a:fname,'\.zip$','','') - exe "e ".escape(fname,' \') + exe "e ".fnameescape(fname) if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif endif diff --git a/runtime/ftplugin/debchangelog.vim b/runtime/ftplugin/debchangelog.vim index aa657a9b97..f5bf432e3c 100644 --- a/runtime/ftplugin/debchangelog.vim +++ b/runtime/ftplugin/debchangelog.vim @@ -3,7 +3,7 @@ " Maintainer: Debian Vim Maintainers " Former Maintainers: Michael Piefel " Stefano Zacchiroli -" Last Change: 2023 Aug 18 +" Last Change: 2026 Jun 29 " License: Vim License " URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/debchangelog.vim @@ -363,7 +363,7 @@ EOF return endif let pkgsrc = DebGetPkgSrcName(line('.')) - let listbugs_output = system('/usr/sbin/apt-listbugs -s ' . g:debchangelog_listbugs_severities . ' list ' . pkgsrc . ' | grep "^ #" 2> /dev/null') + let listbugs_output = system('/usr/sbin/apt-listbugs -s ' . g:debchangelog_listbugs_severities . ' list ' . shellescape(pkgsrc) . ' | grep "^ #" 2> /dev/null') let bug_lines = split(listbugs_output, '\n') endif let completions = [] From 278b9347f76ade76bbdcaace7e827851665dc556 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Mon, 29 Jun 2026 22:28:52 +0000 Subject: [PATCH 073/647] patch 9.2.0753: GTK GUI deferred redraw skipped on 'lazyredraw' Problem: GTK GUI deferred redraw skipped on 'lazyredraw' Solution: Drop the redrawing() condition so a redraw is flushed regardless of 'lazyredraw' (Christoffer Aasted) related: #20528 closes: #20677 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 4 ++-- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index d7ea36274f..b12f4b22c3 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -6841,8 +6841,8 @@ gui_mch_update(void) { int prio = 0; g_main_context_prepare(NULL, &prio); - // peek internal scheduling of redraw, honors 'lazyredraw' - if (prio == GDK_PRIORITY_REDRAW && redrawing()) + // peek internal scheduling of redraw + if (prio == GDK_PRIORITY_REDRAW) gui_may_flush(); // prepares redraw: g_main_context_iteration } #endif diff --git a/src/version.c b/src/version.c index 48ff1025c7..2bc636bde2 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 753, /**/ 752, /**/ From ac443b992411d1df7bf58f0681627cf1e52077a8 Mon Sep 17 00:00:00 2001 From: glepnir Date: Mon, 29 Jun 2026 22:37:25 +0000 Subject: [PATCH 074/647] patch 9.2.0754: repeated completion length lookup in search_for_exact_line Problem: search_for_exact_line() repeatedly calls ins_compl_len() and relies on ternary operator precedence. Solution: Cache the completion length and parenthesize the ternary expression. closes: #20678 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/search.c | 9 +++++---- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/search.c b/src/search.c index 7db964f22b..bcf168be02 100644 --- a/src/search.c +++ b/src/search.c @@ -1788,6 +1788,7 @@ search_for_exact_line( linenr_T start = 0; char_u *ptr; char_u *p; + int compl_len = ins_compl_len(); if (buf->b_ml.ml_line_count == 0) return FAIL; @@ -1839,8 +1840,8 @@ search_for_exact_line( } else if (*p != NUL) // ignore empty lines { // expanding lines or words - if ((p_ic ? MB_STRNICMP(p, pat, ins_compl_len()) - : STRNCMP(p, pat, ins_compl_len())) == 0) + if ((p_ic ? MB_STRNICMP(p, pat, compl_len) + : STRNCMP(p, pat, compl_len)) == 0) return OK; } } @@ -3005,8 +3006,8 @@ is_zero_width( if (nmatched != 0) break; } while (regmatch.regprog != NULL - && direction == FORWARD ? regmatch.startpos[0].col < pos.col - : regmatch.startpos[0].col > pos.col); + && (direction == FORWARD ? regmatch.startpos[0].col < pos.col + : regmatch.startpos[0].col > pos.col)); if (called_emsg == called_emsg_before) { diff --git a/src/version.c b/src/version.c index 2bc636bde2..90ad6a7b5f 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 754, /**/ 753, /**/ From a658728918405294e134fbc81f13b50311924db5 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 30 Jun 2026 18:27:55 +0000 Subject: [PATCH 075/647] patch 9.2.0755: 'autocomplete' behaves inconsistently when recording Problem: If 'autocompletedelay' is non-zero, 'autocomplete' doesn't work when recording a register (after 9.2.0750). Solution: Still produce K_COMPLETE_DELAY when recording a register, and drop it in gotchars_add_byte() instead (zeertzjq). This patch only changes the behavior when recording a register. Replaying a register with 'autocomplete' still doesn't fully work regardless of 'autocompletedelay', as 'autocomplete' isn't triggered when there is pending input. closes: #20675 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/getchar.c | 6 +++--- src/testdir/test_ins_complete.vim | 12 +++++++++++- src/ui.c | 4 ++-- src/version.c | 2 ++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/getchar.c b/src/getchar.c index a192d14628..83e4be3ebb 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -1379,9 +1379,9 @@ gotchars_add_byte(gotchars_state_T *state, char_u byte) // When receiving a modifier, wait for the modified key. goto ret_false; c = TO_SPECIAL(state->prev_c, c); - if (c == K_FOCUSGAINED || c == K_FOCUSLOST) - // Drop K_FOCUSGAINED and K_FOCUSLOST, they are not useful - // in a recording. + // Drop K_FOCUSGAINED, K_FOCUSLOST and K_COMPLETE_DELAY, they are + // not useful in a recording. + if (c == K_FOCUSGAINED || c == K_FOCUSLOST || c == K_COMPLETE_DELAY) state->buflen = 0; } // When receiving a multibyte character, store it until we have all diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 4165002cd8..3d4c3fb305 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6031,10 +6031,20 @@ func Test_autocompletedelay_no_record() let @a = '' " Type a char that arms the delay, idle past 'autocompletedelay' so a " K_COMPLETE_DELAY would be injected, then end Insert mode and stop recording. - call timer_start(200, { -> feedkeys("\q", 't') }) + call timer_start(300, { -> feedkeys("\q", 't') }) call feedkeys("qaSf", 'tx!') call assert_equal("Sf\", @a) + " Delayed autocompletion still works when recording. + if !has('win32') " FIXME: does not work on Windows + call setline(1, 'foobar foofoo') + call timer_start(300, { -> feedkeys("\\\q", 't') }) + call feedkeys("qaof", 'tx!') + call assert_equal('foobar', getline('.')) + " XXX: This doesn't produce the same result when replaying. + call assert_equal("of\\\", @a) + endif + set autocomplete& autocompletedelay& bwipe! endfunc diff --git a/src/ui.c b/src/ui.c index ee6837d8d6..ea4dc64a2a 100644 --- a/src/ui.c +++ b/src/ui.c @@ -305,9 +305,9 @@ inchar_loop( // 'autocompletedelay' and 'updatetime' so the delay does not postpone // CursorHold. Once CursorHold has fired, only the delay is left. // Gate the injection like trigger_cursorhold() so the deferred key - // cannot fire while recording or outside Insert mode. + // cannot fire while outside Insert mode, but do still fire the key + // when recording a register (gotchars_add_byte() will ignore it). bool delay_pending = ins_compl_autocomplete_pending() && p_acl > 0 - && reg_recording == 0 && typebuf.tb_len == 0 && !ins_compl_active() && (get_real_state() & MODE_INSERT) != 0; diff --git a/src/version.c b/src/version.c index 90ad6a7b5f..3ce9aee7ed 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 755, /**/ 754, /**/ From 294dec827d5d6c183867bbea2971a407b297be80 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 30 Jun 2026 18:34:12 +0000 Subject: [PATCH 076/647] patch 9.2.0756: Session with multiple tabpages sets 'winminheight' to 0 Problem: Session with multiple tabpages sets 'winminheight' to 0. Solution: Only save 'winminheight' and 'winminwidth' once (zeertzjq). related: #8119 related: neovim/neovim#40493 closes: #20673 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/session.c | 8 +++++--- src/testdir/test_mksession.vim | 14 ++++++++++++-- src/version.c | 2 ++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/session.c b/src/session.c index 0fa03e556d..7c18321926 100644 --- a/src/session.c +++ b/src/session.c @@ -889,9 +889,11 @@ makeopens( // cursor can be set. This is done again below. // winminheight and winminwidth need to be set to avoid an error if // the user has set winheight or winwidth. - if (put_line(fd, "save_winminheight = &winminheight") == FAIL - || put_line(fd, "save_winminwidth = &winminwidth") - == FAIL) + if (!restore_height_width + && (put_line(fd, "save_winminheight = &winminheight") + == FAIL + || put_line(fd, "save_winminwidth = &winminwidth") + == FAIL)) goto fail; if (put_line(fd, "set winminheight=0") == FAIL || put_line(fd, "set winheight=1") == FAIL diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index b63f0edfc8..958c118015 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -1074,9 +1074,19 @@ func Test_mksession_winminheight() endif endfor call assert_equal(2, found_restore) + " Test with multiple tabpages + tab split | split | tab split | split + call assert_equal(3, tabpagenr('$')) + mksession! Xtest_mks.out + tabclose | tabclose | close + call assert_equal(1, tabpagenr('$')) + set winminheight=2 winminwidth=2 + source Xtest_mks.out + call assert_equal(3, tabpagenr('$')) + call assert_equal([2, 2], [&winminheight, &winminwidth]) + tabclose | tabclose | close call delete('Xtest_mks.out') - close - set sessionoptions& + set sessionoptions& winminheight& winminwidth& endfunc " Test for mksession with and without options restores shortmess diff --git a/src/version.c b/src/version.c index 3ce9aee7ed..6aa1d99a67 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 756, /**/ 755, /**/ From a1d5197141be0ab02872a7b763b9a64aaed97258 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 30 Jun 2026 18:38:14 +0000 Subject: [PATCH 077/647] patch 9.2.0757: tests: test_popupwin fails with zsh because of the prompt Problem: tests: test_popupwin fails with zsh: it asserts against screen cells next to the cursor, which break when zsh draws its own prompt. Solution: Pass an env dict to term_start() clearing $HOME and $PS1 and assert against term_getline() instead of screenstring(). While at it fix indentation. closes: #20664 Signed-off-by: Christian Brabandt --- src/testdir/test_popupwin.vim | 17 +++++++++-------- src/version.c | 2 ++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 7e8fb6233d..79f8dac39b 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -683,7 +683,7 @@ func Test_popup_drag_termwin() set shell=/bin/sh noruler unlet $PROMPT_COMMAND let $PS1 = 'vim> ' - terminal ++rows=4 + terminal ++rows=4 $wincmd w let winid = popup_create(['1111', '2222'], #{ \ drag: 1, @@ -3031,18 +3031,18 @@ func Test_popupwin_terminal_buffer() " open help window to test that :help below fails help - let termbuf = term_start(&shell, #{hidden: 1}) + let env = {'HOME': '/nonexisting', 'PS1':''} + let termbuf = term_start(&shell, #{hidden: 1, env: env}) let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []}) " Wait for shell to start call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))}) - " Wait for a prompt (see border char first, then space after prompt) - call WaitForAssert({ -> assert_equal(' ', screenstring(screenrow(), screencol() - 1))}) + call WaitForAssert({-> assert_equal('', term_getline(termbuf, '.'))}) " When typing a character, the cursor is after it. call feedkeys("x", 'xt') call term_wait(termbuf) redraw - call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))}) + call WaitForAssert({-> assert_equal('x', term_getline(termbuf, '.'))}) call feedkeys("\", 'xt') " Check this doesn't crash @@ -5321,18 +5321,19 @@ func Test_popup_opacity_terminal_no_freeze() let g:test_is_flaky = 1 let origwin = win_getid() - let termbuf = term_start(&shell, #{hidden: 1}) + let env = {'HOME': '/nonexisting', 'PS1':''} + let termbuf = term_start(&shell, #{hidden: 1, env: env}) let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, \ border: [1, 1, 1, 1], opacity: 10}) call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))}) - call WaitForAssert({-> assert_equal(' ', screenstring(screenrow(), screencol() - 1))}) + call WaitForAssert({-> assert_equal('', term_getline(termbuf, '.'))}) " Before the fix typing froze Vim: redraw under an opacity popup raised " must_redraw every cycle, trapping terminal_loop in its redraw loop. call feedkeys('x', 'xt') call term_wait(termbuf) redraw - call WaitForAssert({-> assert_equal('x', screenstring(screenrow(), screencol() - 1))}) + call WaitForAssert({-> assert_equal('x', term_getline(termbuf, '.'))}) call feedkeys("\", 'xt') call feedkeys("exit\", 'xt') diff --git a/src/version.c b/src/version.c index 6aa1d99a67..4dc958e2a1 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 757, /**/ 756, /**/ From 852cc912873a1c96f13a4aa1b4a3d6bb761b4b16 Mon Sep 17 00:00:00 2001 From: Shad Date: Tue, 30 Jun 2026 18:56:46 +0000 Subject: [PATCH 078/647] patch 9.2.0758: pum: No opacity when background not set for Popup menu group Problem: pum: When the Pmenu highlight group has no guibg/ctermbg the popup menu becomes fully transparent. Solution: Create an entry if no popup_attr exists (highlight group cleared for example), and test if popup_attr exists but without guibg/ctermbg attributes to fallback to normal bg color. Similar to patch 9.2.0602 for popup window (Shad). closes: #20638 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Shad Signed-off-by: Christian Brabandt --- src/highlight.c | 202 +++++++++++------- .../Test_pumopt_opacity_pmenu_cleared.dump | 20 ++ .../Test_pumopt_opacity_pmenu_cleared_2.dump | 20 ++ .../Test_pumopt_opacity_pmenu_cleared_3.dump | 20 ++ .../Test_pumopt_opacity_pmenu_cleared_4.dump | 20 ++ src/testdir/test_popup.vim | 56 +++++ src/version.c | 2 + 7 files changed, 262 insertions(+), 78 deletions(-) create mode 100644 src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared.dump create mode 100644 src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_2.dump create mode 100644 src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_3.dump create mode 100644 src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_4.dump diff --git a/src/highlight.c b/src/highlight.c index 717a8f5fb6..08c0bf7304 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -3683,6 +3683,7 @@ hl_pum_blend_attr(int char_attr, int popup_attr, int blend UNUSED) attrentry_T *char_aep = NULL; attrentry_T *popup_aep; attrentry_T new_en; + attrentry_T tmp_en; #ifdef FEAT_GUI if (gui.in_use) @@ -3700,33 +3701,49 @@ hl_pum_blend_attr(int char_attr, int popup_attr, int blend UNUSED) if (char_attr <= HL_ALL) new_en.ae_attr = char_attr; } - if (popup_attr > HL_ALL) + + // initialize an empty entry if no highlight set for popup + if (popup_attr <= HL_ALL) { + CLEAR_FIELD(tmp_en); + tmp_en.ae_u.gui.fg_color = INVALCOLOR; + tmp_en.ae_u.gui.bg_color = INVALCOLOR; + tmp_en.ae_u.gui.sp_color = INVALCOLOR; + // preserve attributes other than color + tmp_en.ae_attr = popup_attr; + popup_aep = &tmp_en; + + popup_aep->ae_u.gui.bg_color = fallback_bg_rgb; + } + else popup_aep = syn_gui_attr2entry(popup_attr); - if (popup_aep != NULL) + + if (popup_aep != NULL) + { + guicolor_T popup_bg_rgb = popup_aep->ae_u.gui.bg_color; + if (COLOR_INVALID(popup_bg_rgb)) + popup_bg_rgb = fallback_bg_rgb; + + // Blend fg: pum_bg toward underlying_fg. + // blend=0 (opaque): fg = pum_bg (text hidden) + // blend=100 (transparent): fg = underlying_fg (text visible) { - // Blend fg: pum_bg toward underlying_fg. - // blend=0 (opaque): fg = pum_bg (text hidden) - // blend=100 (transparent): fg = underlying_fg (text visible) - if (popup_aep->ae_u.gui.bg_color != INVALCOLOR) - { - int base_fg = fallback_fg_rgb; - if (char_aep != NULL - && char_aep->ae_u.gui.fg_color != INVALCOLOR) - base_fg = char_aep->ae_u.gui.fg_color; - new_en.ae_u.gui.fg_color = blend_colors( - popup_aep->ae_u.gui.bg_color, base_fg, blend); - } - // Blend bg: popup bg toward underlying bg. - if (popup_aep->ae_u.gui.bg_color != INVALCOLOR) - { - guicolor_T underlying_bg = fallback_bg_rgb; - if (char_aep != NULL) - underlying_bg = char_aep->ae_u.gui.bg_color; - new_en.ae_u.gui.bg_color = blend_colors( - popup_aep->ae_u.gui.bg_color, - underlying_bg, blend); - } + int base_fg = fallback_fg_rgb; + if (char_aep != NULL + && char_aep->ae_u.gui.fg_color != INVALCOLOR) + base_fg = char_aep->ae_u.gui.fg_color; + new_en.ae_u.gui.fg_color = blend_colors( + popup_bg_rgb, base_fg, blend); + } + // Blend background color: blend popup bg toward underlying bg + { + guicolor_T underlying_bg = fallback_bg_rgb; + if (char_aep != NULL + && !COLOR_INVALID(char_aep->ae_u.gui.bg_color)) + underlying_bg = char_aep->ae_u.gui.bg_color; + new_en.ae_u.gui.bg_color = blend_colors( + popup_bg_rgb, + underlying_bg, blend); } } return get_attr_entry(&gui_attr_table, &new_en); @@ -3750,70 +3767,98 @@ hl_pum_blend_attr(int char_attr, int popup_attr, int blend UNUSED) if (char_attr <= HL_ALL) new_en.ae_attr = char_attr; } - if (popup_attr > HL_ALL) + + // initialize an empty entry if no highlight set for popup + if (popup_attr <= HL_ALL) { + CLEAR_FIELD(tmp_en); +#ifdef FEAT_TERMGUICOLORS + tmp_en.ae_u.cterm.fg_rgb = INVALCOLOR; + tmp_en.ae_u.cterm.ul_rgb = INVALCOLOR; + // allow blending with termguicolors + tmp_en.ae_u.cterm.bg_rgb = fallback_bg_rgb; +#endif + // preserve attributes other than color + tmp_en.ae_attr = popup_attr; + popup_aep = &tmp_en; + + // allow blending with notermguicolors + popup_aep->ae_u.cterm.bg_color = cterm_normal_bg_color; + } + else popup_aep = syn_cterm_attr2entry(popup_attr); - if (popup_aep != NULL) + + if (popup_aep != NULL) + { + guicolor_T popup_bg_rgb = INVALCOLOR; +#ifdef FEAT_TERMGUICOLORS + // Fall back to cterm color converted to RGB when gui color is not set. + popup_bg_rgb = popup_aep->ae_u.cterm.bg_rgb; + if (COLOR_INVALID(popup_bg_rgb) + && popup_aep->ae_u.cterm.bg_color > 0) + popup_bg_rgb = cterm_color_to_rgb( + popup_aep->ae_u.cterm.bg_color); +#endif + // assign default color if guibg and ctermbg are not set for popup + if (COLOR_INVALID(popup_bg_rgb) + && popup_aep->ae_u.cterm.bg_color == 0) + popup_bg_rgb = fallback_bg_rgb; + + // Blend cterm fg: pum_bg toward underlying_fg in the + // 256-color palette (mirrors the fg_rgb blend below). { - // Blend cterm fg: pum_bg toward underlying_fg in the - // 256-color palette (mirrors the fg_rgb blend below). - { - int under_fg = (char_aep != NULL) - ? char_aep->ae_u.cterm.fg_color : 0; - guicolor_T under_fg_rgb = INVALCOLOR; - guicolor_T popup_bg_rgb = INVALCOLOR; + int under_fg = (char_aep != NULL) + ? char_aep->ae_u.cterm.fg_color : 0; + guicolor_T under_fg_rgb = INVALCOLOR; #ifdef FEAT_TERMGUICOLORS - if (char_aep != NULL) - under_fg_rgb = char_aep->ae_u.cterm.fg_rgb; - popup_bg_rgb = popup_aep->ae_u.cterm.bg_rgb; + if (char_aep != NULL) + under_fg_rgb = char_aep->ae_u.cterm.fg_rgb; #endif - new_en.ae_u.cterm.fg_color = blend_cterm_colors( - popup_aep->ae_u.cterm.fg_color, popup_bg_rgb, - under_fg, under_fg_rgb, fallback_fg_rgb, blend); - } - // Approximate cterm bg by blending with the underlying bg - // in the 256-color palette and mapping to the nearest entry. - { - int under_bg = (char_aep != NULL) - ? char_aep->ae_u.cterm.bg_color : 0; - guicolor_T under_bg_rgb = INVALCOLOR; - guicolor_T popup_bg_rgb = INVALCOLOR; + new_en.ae_u.cterm.fg_color = blend_cterm_colors( + popup_aep->ae_u.cterm.fg_color, popup_bg_rgb, + under_fg, under_fg_rgb, fallback_fg_rgb, blend); + } + // Approximate cterm bg by blending with the underlying bg + // in the 256-color palette and mapping to the nearest entry. + { + int under_bg = (char_aep != NULL) + ? char_aep->ae_u.cterm.bg_color : 0; + guicolor_T under_bg_rgb = INVALCOLOR; #ifdef FEAT_TERMGUICOLORS - if (char_aep != NULL) - under_bg_rgb = char_aep->ae_u.cterm.bg_rgb; - popup_bg_rgb = popup_aep->ae_u.cterm.bg_rgb; + if (char_aep != NULL) + under_bg_rgb = char_aep->ae_u.cterm.bg_rgb; #endif - new_en.ae_u.cterm.bg_color = blend_cterm_colors( - popup_aep->ae_u.cterm.bg_color, popup_bg_rgb, - under_bg, under_bg_rgb, fallback_bg_rgb, blend); - } + new_en.ae_u.cterm.bg_color = blend_cterm_colors( + popup_aep->ae_u.cterm.bg_color, popup_bg_rgb, + under_bg, under_bg_rgb, fallback_bg_rgb, blend); + } #ifdef FEAT_TERMGUICOLORS - // Blend fg_rgb: pum_bg toward underlying_fg. - // CTERMCOLOR is a sentinel meaning "use the cterm color"; - // treat it as no underlying color so it is not blended in - // as a real near-white pixel. - if (popup_aep->ae_u.cterm.bg_rgb != INVALCOLOR) - { - int base_fg = fallback_fg_rgb; - if (char_aep != NULL - && !COLOR_INVALID(char_aep->ae_u.cterm.fg_rgb)) - base_fg = char_aep->ae_u.cterm.fg_rgb; - new_en.ae_u.cterm.fg_rgb = blend_colors( - popup_aep->ae_u.cterm.bg_rgb, base_fg, blend); - } + // Blend fg_rgb: pum_bg toward underlying_fg. + // Fall back to cterm color converted to RGB when + // gui color is not set. + // CTERMCOLOR is a sentinel meaning "use the cterm color"; + // treat it as no underlying color so it is not blended in + // as a real near-white pixel. + if (popup_bg_rgb != INVALCOLOR) + { + int base_fg = fallback_fg_rgb; + if (char_aep != NULL + && !COLOR_INVALID(char_aep->ae_u.cterm.fg_rgb)) + base_fg = char_aep->ae_u.cterm.fg_rgb; + new_en.ae_u.cterm.fg_rgb = blend_colors( + popup_bg_rgb, base_fg, blend); + } + if (popup_bg_rgb != INVALCOLOR) + { // Blend bg_rgb. - if (popup_aep->ae_u.cterm.bg_rgb != INVALCOLOR) - { - guicolor_T underlying_bg = fallback_bg_rgb; - if (char_aep != NULL - && !COLOR_INVALID(char_aep->ae_u.cterm.bg_rgb)) - underlying_bg = char_aep->ae_u.cterm.bg_rgb; - new_en.ae_u.cterm.bg_rgb = blend_colors( - popup_aep->ae_u.cterm.bg_rgb, - underlying_bg, blend); - } -#endif + guicolor_T underlying_bg = fallback_bg_rgb; + if (char_aep != NULL + && !COLOR_INVALID(char_aep->ae_u.cterm.bg_rgb)) + underlying_bg = char_aep->ae_u.cterm.bg_rgb; + new_en.ae_u.cterm.bg_rgb = blend_colors( + popup_bg_rgb, underlying_bg, blend); } +#endif } return get_attr_entry(&cterm_attr_table, &new_en); } @@ -3829,6 +3874,7 @@ hl_pum_blend_attr(int char_attr, int popup_attr, int blend UNUSED) if (char_attr <= HL_ALL) new_en.ae_attr = char_attr; } + return get_attr_entry(&term_attr_table, &new_en); } diff --git a/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared.dump b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared.dump new file mode 100644 index 0000000000..5f58d621ca --- /dev/null +++ b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared.dump @@ -0,0 +1,20 @@ +|i+0&#ffffff0|t|e|m> @70 +|╭|─@15|╮| |X| |X| |X| |X| |X| @46 +|│| +0#0000001#ffffff255|i|t+0&#ff8787255|e|m| +0#0000000#ffffff0|Z+0#87ff87255#ffffff255@2| +0#0000000#ffffff0|X+0#818181255#ffffff255| +0#0000000#ffffff0|Y+0#818181255#ff8787255@2| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#0000001#ffffff255|a|n+0&#ff8787255|o|t|h+0&#ffffff255|e|r| |i|t|e|m+0&#ff8787255|Y+0#818181255&@1| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#0000001#ffffff255|a|n+0&#ff8787255|d| |a+0&#ffffff255| |l|a|s|t| |o+0&#ff8787255|n|e| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|╰|─@15|╯| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|5| @10|A|l@1| diff --git a/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_2.dump b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_2.dump new file mode 100644 index 0000000000..76834fd6bd --- /dev/null +++ b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_2.dump @@ -0,0 +1,20 @@ +|i+0&#ffffff0|t|e|m> @70 +|╭|─@15|╮| |X| |X| |X| |X| |X| @46 +|│| +0#000000255#ffffff255|i|t+0&#ff8080255|e|m| +0#0000000#ffffff0|Z+0#80ff80255#ffffff255@2| +0#0000000#ffffff0|X+0#808080255#ffffff255| +0#0000000#ffffff0|Y+0#808080255#ff8080255@2| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#000000255#ffffff255|a|n+0&#ff8080255|o|t|h+0&#ffffff255|e|r| |i|t|e|m+0&#ff8080255|Y+0#808080255&@1| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#000000255#ffffff255|a|n+0&#ff8080255|d| |a+0&#ffffff255| |l|a|s|t| |o+0&#ff8080255|n|e| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|╰|─@15|╯| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +|~+0#0000ff255&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|5| @10|A|l@1| diff --git a/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_3.dump b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_3.dump new file mode 100644 index 0000000000..8817b4e004 --- /dev/null +++ b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_3.dump @@ -0,0 +1,20 @@ +|i+0&#ffffff0|t|e|m> @70 +|╭|─@15|╮| |X| |X| |X| |X| |X| @46 +|│| +0#ffffff255#000000255|i|t+0f0000255|e|m| +0#0000000#ffffff0|Z+0#007f00255#000000255@2| +0#0000000#ffffff0|X+0#7f7f7f255#000000255| +0#0000000#ffffff0|Y+0#7f7f7f255#7f0000255@2| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#ffffff255#000000255|a|n+0f0000255|o|t|h+0ÿ|e|r| |i|t|e|m+0f0000255|Y+0#7f7f7f255&@1| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#ffffff255#000000255|a|n+0f0000255|d| |a+0ÿ| |l|a|s|t| |o+0f0000255|n|e| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|╰|─@15|╯| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff0000255@2| +0&#ffffff0|Z+0#00ff00255&@2| +0#0000000&|X| |Y+0&#ff0000255@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +|~+0#0000ff255&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|5| @10|A|l@1| diff --git a/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_4.dump b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_4.dump new file mode 100644 index 0000000000..64a2e631d1 --- /dev/null +++ b/src/testdir/dumps/Test_pumopt_opacity_pmenu_cleared_4.dump @@ -0,0 +1,20 @@ +|i+0&#ffffff0|t|e|m> @70 +|╭|─@15|╮| |X| |X| |X| |X| |X| @46 +|│| +0#ffffff16#000000255|i|t+0�|e|m| +0#0000000#ffffff0|Z+0#008700255#000000255@2| +0#0000000#ffffff0|X+0#818181255#000000255| +0#0000000#ffffff0|Y+0#818181255#870000255@2| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#ffffff16#000000255|a|n+0�|o|t|h+0ÿ|e|r| |i|t|e|m+0�|Y+0#818181255&@1| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|│| +0#ffffff16#000000255|a|n+0�|d| |a+0ÿ| |l|a|s|t| |o+0�|n|e| +0#0000000#ffffff0|│| |X| |X| |X| |X| |X| @46 +|╰|─@15|╯| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +@1|X| |Y+0&#ff404010@2| +0&#ffffff0|Z+0#40ff4011&@2| +0#0000000&|X| |Y+0&#ff404010@2| +0&#ffffff0|X| |X| |X| |X| |X| |X| @46 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|5| @10|A|l@1| diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index ac394dd2b6..e5d9094f78 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -2632,6 +2632,62 @@ func Test_popup_opacity_move_after_close() call StopVimInTerminal(buf) endfunc +" Test pumopt opacity when Pmenu highlight groups are cleared +func Test_pumopt_opacity_pmenu_cleared() + CheckScreendump + let lines =<< trim END + set pumopt=opacity:50,border:round + set completeopt=menu + highlight clear + highlight clear Pmenu + highlight clear PmenuSel + highlight Underbg ctermbg=red guibg=red + highlight Underfg ctermfg=green guifg=green + call setline(1, '') + for i in range(10) + call append(line('$'), ' X YYY ZZZ X YYY X X X X X X') + endfor + call matchadd('Underbg', 'YYY') + call matchadd('Underfg', 'ZZZ') + normal gg + inoremap call complete(col('.'), + \ ['item', 'another item', 'and a last one']) + END + call writefile(lines, 'Xpumopacitypmenucleared', 'D') + let buf = RunVimInTerminal('-S Xpumopacitypmenucleared', {}) + call TermWait(buf) + " light background + call term_sendkeys(buf, "i\") + call TermWait(buf, 100) + call VerifyScreenDump(buf, 'Test_pumopt_opacity_pmenu_cleared', {}) + call term_sendkeys(buf, "\\u") + call TermWait(buf) + " light termguicolors + call term_sendkeys(buf, ":set termguicolors\") + call term_sendkeys(buf, "i\") + call TermWait(buf, 100) + call VerifyScreenDump(buf, 'Test_pumopt_opacity_pmenu_cleared_2', {}) + call term_sendkeys(buf, "\\u") + call TermWait(buf) + " dark termguicolors + call term_sendkeys(buf, ":set background=dark\") + call term_sendkeys(buf, ":highlight clear Pmenu\") + call term_sendkeys(buf, ":highlight clear PmenuSel\") + call term_sendkeys(buf, "i\") + call TermWait(buf, 100) + call VerifyScreenDump(buf, 'Test_pumopt_opacity_pmenu_cleared_3', {}) + call term_sendkeys(buf, "\\u") + call TermWait(buf) + " dark background + call term_sendkeys(buf, ":set notermguicolors\") + call term_sendkeys(buf, "i\") + call TermWait(buf, 100) + call VerifyScreenDump(buf, 'Test_pumopt_opacity_pmenu_cleared_4', {}) + call term_sendkeys(buf, "\\u") + call TermWait(buf) + call StopVimInTerminal(buf) +endfunc + func Test_popup_sandbox() call assert_fails('sandbox call popup_create("hello", {})', 'E48:') call assert_fails('sandbox call popup_setoptions(1, {})', 'E48:') diff --git a/src/version.c b/src/version.c index 4dc958e2a1..25c38c40e3 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 758, /**/ 757, /**/ From c9e4b1e770f91cf5718f3d3fb9ed6e62e2b800ee Mon Sep 17 00:00:00 2001 From: Lifepillar Date: Wed, 1 Jul 2026 18:24:44 +0000 Subject: [PATCH 079/647] runtime(autoload/dist): gx may use xdg-open on macOS Problem: gx mapping: when macOS have xdg-open in PATH, that takes precedence over open. Solution: check for 'osx' feature instead of executables, and do it before checking for executables. closes: #20687 Signed-off-by: Lifepillar Signed-off-by: Christian Brabandt --- runtime/autoload/dist/vim9.vim | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/autoload/dist/vim9.vim b/runtime/autoload/dist/vim9.vim index a8bb4f95d0..cb90a955e1 100644 --- a/runtime/autoload/dist/vim9.vim +++ b/runtime/autoload/dist/vim9.vim @@ -3,7 +3,7 @@ vim9script # Vim runtime support library # # Maintainer: The Vim Project -# Last Change: 2026 May 30 +# Last Change: 2026 Jul 01 export def IsSafeExecutable(filetype: string, executable: string): bool if empty(exepath(executable)) @@ -89,15 +89,15 @@ if has('win32unix') # Windows elseif has('win32') os_viewer = '' # Use :!start +# MacOS +elseif has('osx') + os_viewer = 'open' # WSL elseif executable('explorer.exe') os_viewer = 'explorer.exe' # Linux / BSD elseif executable('xdg-open') os_viewer = 'xdg-open' -# MacOS -elseif executable('open') - os_viewer = 'open' endif def Viewer(): string From 0b86b97cc9de013483875d0fab14d9040bcbe279 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 1 Jul 2026 18:31:14 +0000 Subject: [PATCH 080/647] patch 9.2.0759: Some code for 'autocompletedelay' is no longer needed Problem: Some code for 'autocompletedelay' is no longer needed now that 'autocompletedelay' doesn't block redraw (after 9.2.0739). Solution: Remove unnecessary code. Also remove a duplicate screendump and an outdated comment in test (zeertzjq) closes: #20686 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/insexpand.c | 32 ++++++------------- .../dumps/Test_autocompletedelay_6.dump | 10 ------ src/testdir/test_ins_complete.vim | 4 +-- src/version.c | 2 ++ 4 files changed, 12 insertions(+), 36 deletions(-) delete mode 100644 src/testdir/dumps/Test_autocompletedelay_6.dump diff --git a/src/insexpand.c b/src/insexpand.c index 331a50011e..e566ee5044 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -2568,12 +2568,6 @@ ins_compl_new_leader(void) ins_compl_insert_bytes(compl_leader.string + get_compl_len(), -1); compl_used_match = FALSE; - if (p_acl > 0) - { - update_screen(UPD_VALID); // Show char (deletion) immediately - out_flush(); - } - if (compl_started) { ins_compl_set_original_text(compl_leader.string, compl_leader.length); @@ -6224,7 +6218,6 @@ ins_compl_next( int compl_no_insert = (cur_cot_flags & COT_NOINSERT) != 0 || (compl_autocomplete && !ins_compl_has_preinsert()); int compl_preinsert = ins_compl_has_preinsert(); - int has_autocomplete_delay = (compl_autocomplete && p_acl > 0); // When user complete function return -1 for findstart which is next // time of 'always', compl_shown_match become NULL. @@ -6268,11 +6261,7 @@ ins_compl_next( // Insert the text of the new completion, or the compl_leader. if (!started && ins_compl_preinsert_longest()) - { ins_compl_insert(TRUE, TRUE); - if (has_autocomplete_delay) - update_screen(0); // Show the inserted text right away - } else if (compl_no_insert && !started && !compl_preinsert) { ins_compl_insert_bytes(compl_orig_text.string + get_compl_len(), -1); @@ -6298,7 +6287,7 @@ ins_compl_next( // may undisplay the popup menu first ins_compl_upd_pum(); - if (pum_enough_matches() && !has_autocomplete_delay) + if (pum_enough_matches()) // Will display the popup menu, don't redraw yet to avoid flicker. pum_call_update_screen(); else @@ -6306,19 +6295,16 @@ ins_compl_next( // inserted. update_screen(0); - if (!has_autocomplete_delay) - { - // display the updated popup menu - ins_compl_show_pum(); + // display the updated popup menu + ins_compl_show_pum(); #ifdef FEAT_GUI - if (gui.in_use) - { - // Show the cursor after the match, not after the redrawn text. - setcursor(); - out_flush_cursor(FALSE, FALSE); - } -#endif + if (gui.in_use) + { + // Show the cursor after the match, not after the redrawn text. + setcursor(); + out_flush_cursor(FALSE, FALSE); } +#endif // Delete old text to be replaced, since we're still searching and // don't want to match ourselves! diff --git a/src/testdir/dumps/Test_autocompletedelay_6.dump b/src/testdir/dumps/Test_autocompletedelay_6.dump deleted file mode 100644 index c792e09ea9..0000000000 --- a/src/testdir/dumps/Test_autocompletedelay_6.dump +++ /dev/null @@ -1,10 +0,0 @@ -|f+0&#ffffff0|o@1| @71 -|f|o@1|b|a|r| @68 -|f|o@1|b|a|r|b|a|z| @65 -|f> @73 -|f+0#0000001#ffd7ff255|o@1|b|a|r|b|a|z| @5| +0#4040ff13#ffffff0@59 -|f+0#0000001#ffd7ff255|o@1|b|a|r| @8| +0#4040ff13#ffffff0@59 -|f+0#0000001#ffd7ff255|o@1| @11| +0#4040ff13#ffffff0@59 -|~| @73 -|~| @73 -|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|4|,|2| @10|A|l@1| diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 3d4c3fb305..5dd18ecf2f 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -5947,7 +5947,7 @@ func Test_autocompletedelay() call term_sendkeys(buf, "\") call VerifyScreenDump(buf, 'Test_autocompletedelay_5', {}) sleep 500m - call VerifyScreenDump(buf, 'Test_autocompletedelay_6', {}) + call VerifyScreenDump(buf, 'Test_autocompletedelay_5', {}) " During delay wait, user can open menu using CTRL_N completion call term_sendkeys(buf, "\:set completeopt=menuone\") @@ -6349,8 +6349,6 @@ func Test_autocompletedelay_longest_preinsert() " Preinsert call term_sendkeys(buf, "\:set completeopt& completeopt+=preinsert\") - - " Show preinserted text right away but display popup later call term_sendkeys(buf, "\Sau") sleep 100m call VerifyScreenDump(buf, 'Test_autocompletedelay_preinsert_1', {}) diff --git a/src/version.c b/src/version.c index 25c38c40e3..33942d5b92 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 759, /**/ 758, /**/ From 1e6a249d573e53f9899fe476b0570f62734517fc Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 1 Jul 2026 18:55:04 +0000 Subject: [PATCH 081/647] patch 9.2.0760: Compiler warning for using potentially uninitialized var Problem: Compiler warning for using potentially uninitialized var (John Marriott, after v9.2.0612) Solution: Initialize the variables at declaration related: #20136 Signed-off-by: Christian Brabandt --- src/popupwin.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/popupwin.c b/src/popupwin.c index d30cc33e17..849849f827 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -6846,7 +6846,7 @@ popup_image_gui_clip( popup_invalidate_prev_image_rect(win_T *wp, popup_clip_T *cl) { int old_row, old_col, old_cells_w, old_cells_h; - int new_row, new_col, new_cells_w, new_cells_h; + int new_row = 0, new_col = 0, new_cells_w = 0, new_cells_h = 0; int rr; # if !(defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY)) diff --git a/src/version.c b/src/version.c index 33942d5b92..724eda4251 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 760, /**/ 759, /**/ From 86d8af37ba90ced2236afcb3572c6cb2a1594788 Mon Sep 17 00:00:00 2001 From: Manoj Panda Date: Wed, 1 Jul 2026 19:46:47 +0000 Subject: [PATCH 082/647] patch 9.2.0761: runtime(netrw): Unix: unable to open '\' file Problem: runtime(netrw): Unix: unable to open '\' file Solution: Adjust directory pattern (Manoj Panda) closes: #20685 Signed-off-by: Manoj Panda Signed-off-by: Christian Brabandt --- .../pack/dist/opt/netrw/autoload/netrw.vim | 4 ++-- src/testdir/test_plugin_netrw.vim | 23 +++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index 1535644d27..4dc60eefa1 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jun 28 +" Last Change: 2026 Jul 01 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -3862,7 +3862,7 @@ function s:NetrwBrowseChgDir(islocal, newdir, cursor, ...) endif " set up o/s-dependent directory recognition pattern - let dirpat = has("amiga") ? '[\/:]$' : '[\/]$' + let dirpat = has("amiga") || has('win32') ? '[\/:]$' : '/$' if newdir !~ dirpat && !(a:islocal && isdirectory(s:NetrwFile(netrw#fs#ComposePath(dirname, newdir)))) " ------------------------------ diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index ea3f33cece..896e83ec46 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -878,4 +878,27 @@ func Test_netrw_forward_slashes() bw! endfunc +" Selecting a file whose name is a single backslash +func Test_netrw_open_backslash_file() + CheckUnix + + let dir = getcwd() . '/Xbslash' + let fname = dir . '/\' + call mkdir(dir, 'p') + call writefile(['backslash file content'], fname) + call assert_true(filereadable(fname)) + + " list the directory and move onto the '\' entry + exe 'Explore ' .. dir + call assert_true(search('^\\$', 'w') > 0) + + " open it + exe "normal \" + + call assert_equal('\', expand('%:t')) + call assert_equal(['backslash file content'], getline(1, '$')) + + bw! +endfunc + " vim:ts=8 sts=2 sw=2 et diff --git a/src/version.c b/src/version.c index 724eda4251..7546d03195 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 761, /**/ 760, /**/ From dd8975428bae4139d400df1ebac96aec65633089 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Wed, 1 Jul 2026 20:35:32 +0000 Subject: [PATCH 083/647] runtime(typst): Improve ftplugin, and syntax file - Move whitespace formatting settings from the indent to the filetype plugin behind a "typst_recommended_style" config option. - Set browsefilter - Improve syntax file Thanks to Maxim Kim for taking on maintainership of the typst runtime files. related: #20036 closes: #20077 Co-authored-by: Maxim Kim Signed-off-by: Maxim Kim Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 3 +- runtime/autoload/typst.vim | 100 +++--- runtime/doc/filetype.txt | 9 +- runtime/ftplugin/typst.vim | 48 ++- runtime/indent/typst.vim | 15 +- runtime/syntax/typst.vim | 714 +++++++++++++++---------------------- 6 files changed, 382 insertions(+), 507 deletions(-) diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 0afec653f2..86de71b234 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -350,6 +350,7 @@ runtime/ftplugin/tt2html.vim @petdance runtime/ftplugin/twig.vim @ribru17 runtime/ftplugin/typescript.vim @dkearns runtime/ftplugin/typescriptreact.vim @dkearns +runtime/ftplugin/typst.vim @habamax runtime/ftplugin/uc.vim @ribru17 runtime/ftplugin/unison.vim @chuwy runtime/ftplugin/v.vim @ribru17 @@ -726,7 +727,7 @@ runtime/syntax/tt2html.vim @petdance runtime/syntax/tt2js.vim @petdance runtime/syntax/typescript.vim @HerringtonDarkholme @rhysd runtime/syntax/typescriptreact.vim @HerringtonDarkholme @rhysd -runtime/syntax/typst.vim @gpanders +runtime/syntax/typst.vim @habamax runtime/syntax/shared/typescriptcommon.vim @HerringtonDarkholme @rhysd runtime/syntax/unison.vim @chuwy runtime/syntax/vdf.vim @ObserverOfTime diff --git a/runtime/autoload/typst.vim b/runtime/autoload/typst.vim index 7debd60423..cd8a4fefdf 100644 --- a/runtime/autoload/typst.vim +++ b/runtime/autoload/typst.vim @@ -1,79 +1,79 @@ -" Language: Typst +" Language: Typst +" Maintainer: Maxim Kim " Previous Maintainer: Luca Saccarola -" Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2025 Aug 05 -" Based on: https://github.com/kaarmu/typst.vim +" Last Change: 2026 Jun 29 +" Based on the plugin at https://github.com/kaarmu/typst.vim function! typst#indentexpr() abort - let l:lnum = v:lnum - let s:sw = shiftwidth() + let l:lnum = v:lnum + let s:sw = shiftwidth() - let [l:plnum, l:pline] = s:get_prev_nonblank(l:lnum - 1) - if l:plnum == 0 | return 0 | endif + let [l:plnum, l:pline] = s:get_prev_nonblank(l:lnum - 1) + if l:plnum == 0 | return 0 | endif - let l:line = getline(l:lnum) - let l:ind = indent(l:plnum) + let l:line = getline(l:lnum) + let l:ind = indent(l:plnum) - let l:synname = synIDattr(synID(l:lnum, 1, 1), 'name') + let l:synname = synIDattr(synID(l:lnum, 1, 1), 'name') - " Use last indent for block comments - if l:synname == 'typstCommentBlock' - return l:ind - " do not change the indents of bullet lists - elseif l:synname == 'typstMarkupBulletList' - return indent(a:lnum) - endif + " Use last indent for block comments + if l:synname == 'typstCommentBlock' + return l:ind + " do not change the indents of bullet lists + elseif l:synname == 'typstMarkupBulletList' + return indent(a:lnum) + endif - if l:pline =~ '\v[{[(]\s*$' - let l:ind += s:sw - endif + if l:pline =~ '\v[{[(]\s*$' + let l:ind += s:sw + endif - if l:line =~ '\v^\s*[}\])]' - let l:ind -= s:sw - endif + if l:line =~ '\v^\s*[}\])]' + let l:ind -= s:sw + endif - return l:ind + return l:ind endfunction -function typst#foldexpr() - let line = getline(v:lnum) +function! typst#foldexpr() + let line = getline(v:lnum) - " Whenever the user wants to fold nested headers under the parent - let nested = get(g:, "typst_foldnested", 1) + " Whenever the user wants to fold nested headers under the parent + let nested = get(g:, "typst_foldnested", 1) - " Regular headers - let depth = match(line, '\(^=\+\)\@<=\( .*$\)\@=') + " Regular headers + let depth = match(line, '\(^=\+\)\@<=\( .*$\)\@=') - " Do not fold nested regular headers - if depth > 1 && !nested - let depth = 1 - endif + " Do not fold nested regular headers + if depth > 1 && !nested + let depth = 1 + endif - if depth > 0 - " check syntax, it should be typstMarkupHeading - let syncode = synstack(v:lnum, 1) - if len(syncode) > 0 && synIDattr(syncode[0], 'name') ==# 'typstMarkupHeading' - return ">" . depth - endif + if depth > 0 + " check syntax, it should be typstMarkupHeading + let syncode = synstack(v:lnum, 1) + if len(syncode) > 0 && synIDattr(syncode[0], 'name') ==# 'typstMarkupHeading' + return ">" .. depth endif + endif - return "=" + return "=" endfunction " Gets the previous non-blank line that is not a comment. function! s:get_prev_nonblank(lnum) abort - let l:lnum = prevnonblank(a:lnum) - let l:line = getline(l:lnum) + let l:lnum = prevnonblank(a:lnum) + let l:line = getline(l:lnum) - while l:lnum > 0 && l:line =~ '^\s*//' - let l:lnum = prevnonblank(l:lnum - 1) - let l:line = getline(l:lnum) - endwhile + while l:lnum > 0 && l:line =~ '^\s*//' + let l:lnum = prevnonblank(l:lnum - 1) + let l:line = getline(l:lnum) + endwhile - return [l:lnum, s:remove_comments(l:line)] + return [l:lnum, s:remove_comments(l:line)] endfunction " Removes comments from the given line. function! s:remove_comments(line) abort - return substitute(a:line, '\s*//.*', '', '') + return substitute(a:line, '\s*//.*', '', '') endfunction diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt index 73ce826c19..f37865ee5f 100644 --- a/runtime/doc/filetype.txt +++ b/runtime/doc/filetype.txt @@ -1,4 +1,4 @@ -*filetype.txt* For Vim version 9.2. Last change: 2026 Jun 18 +*filetype.txt* For Vim version 9.2. Last change: 2026 Jul 01 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1134,6 +1134,13 @@ Currently no other formats are recognized. TYPST *ft-typst-plugin* + *g:typst_recommended_style* +By default, the Typst filetype plugin enables the following options: > + setlocal expandtab shiftwidth=2 softtabstop=2 + +To disable this, set the following variable: > + let g:typst_recommended_style = 0 +< *g:typst_conceal* When |TRUE| the Typst filetype plugin will set the 'conceallevel' option to 2. diff --git a/runtime/ftplugin/typst.vim b/runtime/ftplugin/typst.vim index 4ce9ed6788..c3125da479 100644 --- a/runtime/ftplugin/typst.vim +++ b/runtime/ftplugin/typst.vim @@ -1,12 +1,12 @@ " Vim filetype plugin file -" Language: Typst -" Previous Maintainer: Gregory Anders +" Language: Typst +" Maintainer: Maxim Kim +" Previous Maintainers: Gregory Anders " Luca Saccarola -" Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2025 Aug 05 -" Based on: https://github.com/kaarmu/typst.vim +" Last Change: 2026 Jun 29 +" Based on the ftplugin from https://github.com/kaarmu/typst.vim -if exists('b:did_ftplugin') +if exists("b:did_ftplugin") finish endif let b:did_ftplugin = 1 @@ -20,20 +20,38 @@ setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* setlocal formatlistpat+=\\\|^\\s*[-+/\]\\s\\+ setlocal suffixesadd=.typ -let b:undo_ftplugin = 'setl cms< com< fo< flp< sua<' +let b:undo_ftplugin = "setl cms< com< fo< flp< sua<" -if get(g:, 'typst_conceal', 0) +if get(g:, "typst_conceal", 0) setlocal conceallevel=2 - let b:undo_ftplugin .= ' cole<' + let b:undo_ftplugin ..= " cole<" endif -if has("folding") && get(g:, 'typst_folding', 0) - setlocal foldexpr=typst#foldexpr() - setlocal foldmethod=expr - let b:undo_ftplugin .= "|setl foldexpr< foldmethod<" +if get(g:, 'typst_recommended_style', + \ get(g:, 'filetype_recommended_style', 1)) + setlocal expandtab + setlocal softtabstop=2 + setlocal shiftwidth=2 + let b:undo_ftplugin ..= " | setl et< sts< sw<" endif -if !exists('current_compiler') +if has("folding") && get(g:, "typst_folding", 0) + setlocal foldexpr=typst#foldexpr() + setlocal foldmethod=expr + let b:undo_ftplugin ..= " | setl foldexpr< foldmethod<" +endif + +if !exists("current_compiler") compiler typst - let b:undo_ftplugin ..= "| compiler make" + let b:undo_ftplugin ..= " | compiler make" +endif + +if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") + let b:browsefilter = "Typst Markup file (*.typ)\t*.typ\n" + if has("win32") + let b:browsefilter ..= "All Files (*.*)\t*\n" + else + let b:browsefilter ..= "All Files (*)\t*\n" + endif + let b:undo_ftplugin ..= " | unlet! b:browsefilter" endif diff --git a/runtime/indent/typst.vim b/runtime/indent/typst.vim index 23165231f6..3ed78ad2d8 100644 --- a/runtime/indent/typst.vim +++ b/runtime/indent/typst.vim @@ -1,20 +1,17 @@ " Vim indent file -" Language: Typst +" Language: Typst +" Maintainer: Maxim Kim " Previous Maintainer: Gregory Anders " Luca Saccarola -" Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2025 Aug 05 -" Based on: https://github.com/kaarmu/typst.vim +" Last Change: 2026 Jun 29 +" Based on the indent plugin from https://github.com/kaarmu/typst.vim -if exists('b:did_indent') +if exists("b:did_indent") finish endif let b:did_indent = 1 -setlocal expandtab -setlocal softtabstop=2 -setlocal shiftwidth=2 setlocal autoindent setlocal indentexpr=typst#indentexpr() -let b:undo_indent = 'setl et< sts< sw< ai< inde<' +let b:undo_indent = "setl ai< inde<" diff --git a/runtime/syntax/typst.vim b/runtime/syntax/typst.vim index 8ed2f69c89..220544c059 100644 --- a/runtime/syntax/typst.vim +++ b/runtime/syntax/typst.vim @@ -1,9 +1,8 @@ " Vim syntax file -" Previous Maintainer: Luca Saccarola -" Maintainer: This runtime file is looking for a new maintainer. +" Maintainer: Maxim Kim " Language: Typst -" Based On: https://github.com/kaarmu/typst.vim -" Last Change: 2025 Aug 05 +" Last Change: 2026 Jun 30 +" Based on the syntax file from https://github.com/kaarmu/typst.vim if exists('b:current_syntax') finish @@ -12,293 +11,175 @@ endif let s:cpo_save = &cpo set cpo&vim -syntax sync fromstart syntax spell toplevel +syntax sync minlines=300 +syntax iskeyword @,48-57,192-255,_,- + +syntax cluster typstExpr + \ contains=typstExprCodeBlock + \ ,typstExprFunc + \ ,typstExprContentBlock + \ ,typstExprBraces + \ ,typstExprColon + \ ,typstExprDot + \ ,typstExprCommand + \ ,@typstExprConstants + \ ,typstExprVar + \ ,typstExprOpSym + \ ,typstExprOp + \ ,@typstComment + +syntax match typstExprStart /#/ nextgroup=@typstExpr,typstExprBareVar +syntax match typstExprDot /\./ + \ contained + \ nextgroup=@typstExpr + +syntax match typstExprColon /:/ + \ skipwhite + \ contained + \ nextgroup=@typstExpr + +syntax match typstExprVar /\k\+/ + \ skipwhite + \ contained + \ nextgroup=typstExprOp,typstExprOpSym,@typstExpr + +syntax region typstExprBraces + \ skipwhite + \ contained + \ contains=@typstExpr,typstMarkupMath + \ nextgroup=typstExprOp,typstExprOpSym,@typstExpr + \ start=/(/ + \ end=/)/ + +syntax match typstExprOpSym /\%(=[=>]\)\|\%([-+*/<>!=]=\)\|[<=>\-+*/]/ + \ skipwhite + \ contained + \ nextgroup=typstExprFunc,@typstExpr + +syntax match typstExprOp /in\>\|and\>\|or\>\|\%(not\%(\s\+in\>\)\?\)/ + \ skipwhite skipempty + \ contained + \ nextgroup=@typstExpr + +syntax match typstExprBareVar /\k\+/ skipwhite contained + +syntax match typstExprCommand + \ /let\|set\|while\|for\|if\|else\|show\|import\|include\|context\|return/ + \ skipwhite skipempty + \ contained + \ nextgroup=@typstExpr + +syntax region typstExprCodeBlock + \ skipwhite + \ contained + \ contains=@typstExpr + \ start=/{/ + \ end=/}/ + +syntax region typstExprContentBlock + \ skipwhite + \ contained + \ extend + \ contains=@typstMarkup,typstExprStart,typstMarkupMath + \ nextgroup=@typstExpr + \ matchgroup=NONE + \ start=/\[/ + \ end=/\]/ + +syntax match typstExprFunc + \ skipwhite + \ contained + \ contains=typstExprDot + \ nextgroup=typstExprBraces,typstExprContentBlock,@typstExpr + \ /\k\+\%(\.\k\+\)*[[(]\@=/ + +syntax cluster typstExprConstants + \ contains=typstExprConstant + \ ,typstExprNumber + \ ,typstExprString + \ ,typstExprLabel + +syntax match typstExprConstant + \ contained + \ /\v<%(none|auto|true|false)-@!>/ + +syntax region typstExprString + \ contained + \ start=/"/ skip=/\v\\\\|\\"/ end=/"/ + \ contains=@Spell +syntax match typstExprNumber + \ skipwhite + \ contained + \ nextgroup=typstExprNumberType,typstExprOp,typstExprOpSym,@typstExpr + \ /\v<\d+%(\.\d+)?/ +syntax match typstExprNumberType + \ contained + \ nextgroup=typstExprOp,typstExprOpSym,@typstExpr + \ /\v%(pt|mm|cm|in|em|deg|rad|\%|fr)>?/ + +syntax match typstExprLabel + \ contained + \ /\v\<\K%(\k*-*)*\>/ + +syntax region typstMarkupDollar + \ matchgroup=typstMarkupDollar start=/\\\@1 Comment {{{2 -syntax cluster typstComment - \ contains=typstCommentBlock,typstCommentLine -syntax region typstCommentBlock - \ start="/\*" end="\*/" keepend - \ contains=typstCommentTodo,@Spell -syntax match typstCommentLine - \ #//.*# - \ contains=typstCommentTodo,@Spell -syntax keyword typstCommentTodo - \ contained - \ TODO FIXME XXX TBD - - -" Code {{{1 -syntax cluster typstCode - \ contains=@typstCommon - \ ,@typstCodeKeywords - \ ,@typstCodeConstants - \ ,@typstCodeIdentifiers - \ ,@typstCodeFunctions - \ ,@typstCodeParens - -" Code > Keywords {{{2 -syntax cluster typstCodeKeywords - \ contains=typstCodeConditional - \ ,typstCodeRepeat - \ ,typstCodeKeyword - \ ,typstCodeStatement -syntax keyword typstCodeConditional - \ contained - \ if else -syntax keyword typstCodeRepeat - \ contained - \ while for -syntax keyword typstCodeKeyword - \ contained - \ not in and or return -syntax region typstCodeStatement - \ contained - \ matchgroup=typstCodeStatementWord start=/\v(let|set|import|include)>/ - \ matchgroup=Noise end=/\v%(;|$)/ - \ contains=@typstCode -syntax region typstCodeStatement - \ contained - \ matchgroup=typstCodeStatementWord start=/show/ - \ matchgroup=Noise end=/\v%(:|$)/ keepend - \ contains=@typstCode - \ skipwhite nextgroup=@typstCode,typstCodeShowRocket -syntax match typstCodeShowRocket - \ contained - \ /.*=>/ - \ contains=@typstCode - \ skipwhite nextgroup=@typstCode - -" Code > Identifiers {{{2 -syntax cluster typstCodeIdentifiers - \ contains=typstCodeIdentifier - \ ,typstCodeFieldAccess -syntax match typstCodeIdentifier - \ contained - \ /\v\w\k*>(<%(let|set|show|import|include))@(<%(let|set|show|import|include))@ Functions {{{2 -syntax cluster typstCodeFunctions - \ contains=typstCodeFunction -syntax match typstCodeFunction - \ contained - \ /\v\w\k*>(<%(let|set|show|import|include))@ Constants {{{2 -syntax cluster typstCodeConstants - \ contains=typstCodeConstant - \ ,typstCodeNumberInteger - \ ,typstCodeNumberFloat - \ ,typstCodeNumberLength - \ ,typstCodeNumberAngle - \ ,typstCodeNumberRatio - \ ,typstCodeNumberFraction - \ ,typstCodeString - \ ,typstCodeLabel -syntax match typstCodeConstant - \ contained - \ /\v<%(none|auto|true|false)-@!>/ -syntax match typstCodeNumberInteger - \ contained - \ /\v<\d+>/ - -syntax match typstCodeNumberFloat - \ contained - \ /\v<\d+\.\d*>/ -syntax match typstCodeNumberLength - \ contained - \ /\v<\d+(\.\d*)?(pt|mm|cm|in|em)>/ -syntax match typstCodeNumberAngle - \ contained - \ /\v<\d+(\.\d*)?(deg|rad)>/ -syntax match typstCodeNumberRatio - \ contained - \ /\v<\d+(\.\d*)?\%/ -syntax match typstCodeNumberFraction - \ contained - \ /\v<\d+(\.\d*)?fr>/ -syntax region typstCodeString - \ contained - \ start=/"/ skip=/\v\\\\|\\"/ end=/"/ - \ contains=@Spell -syntax match typstCodeLabel - \ contained - \ /\v\<\K%(\k*-*)*\>/ - -" Code > Parens {{{2 -syntax cluster typstCodeParens - \ contains=typstCodeParen - \ ,typstCodeBrace - \ ,typstCodeBracket - \ ,typstCodeDollar - \ ,typstMarkupRawInline - \ ,typstMarkupRawBlock -syntax region typstCodeParen - \ contained - \ matchgroup=Noise start=/(/ end=/)/ - \ contains=@typstCode -syntax region typstCodeBrace - \ contained - \ matchgroup=Noise start=/{/ end=/}/ - \ contains=@typstCode -syntax region typstCodeBracket - \ contained - \ matchgroup=Noise start=/\[/ end=/\]/ - \ contains=@typstMarkup -syntax region typstCodeDollar - \ contained - \ matchgroup=Number start=/\\\@ Keywords {{{2 -syntax cluster typstHashtagKeywords - \ contains=typstHashtagConditional - \ ,typstHashtagRepeat - \ ,typstHashtagKeywords - \ ,typstHashtagStatement - -" syntax match typstHashtagControlFlowError -" \ /\v#%(if|while|for)>-@!.{-}$\_.{-}%(\{|\[|\()/ -syntax match typstHashtagControlFlow - \ /\v#%(if|while|for)>.{-}\ze%(\{|\[|\()/ - \ contains=typstHashtagConditional,typstHashtagRepeat - \ nextgroup=@typstCode -syntax region typstHashtagConditional - \ contained - \ start=/\v#if>/ end=/\v\ze(\{|\[)/ - \ contains=@typstCode -syntax region typstHashtagRepeat - \ contained - \ start=/\v#(while|for)>/ end=/\v\ze(\{|\[)/ - \ contains=@typstCode -syntax match typstHashtagKeyword - \ /\v#(return)>/ - \ skipwhite nextgroup=@typstCode -syntax region typstHashtagStatement - \ matchgroup=typstHashtagStatementWord start=/\v#(let|set|import|include)>/ - \ matchgroup=Noise end=/\v%(;|$)/ - \ contains=@typstCode -syntax region typstHashtagStatement - \ matchgroup=typstHashtagStatementWord start=/#show/ - \ matchgroup=Noise end=/\v%(:|$)/ keepend - \ contains=@typstCode - \ skipwhite nextgroup=@typstCode,typstCodeShowRocket - -" Hashtag > Constants {{{2 -syntax cluster typstHashtagConstants - \ contains=typstHashtagConstant -syntax match typstHashtagConstant - \ /\v#(none|auto|true|false)>/ - -" Hashtag > Identifiers {{{2 -syntax cluster typstHashtagIdentifiers - \ contains=typstHashtagIdentifier - \ ,typstHashtagFieldAccess -syntax match typstHashtagIdentifier - \ /\v#\w\k*>(<%(let|set|show|import|include))@(<%(let|set|show|import|include))@ Functions {{{2 -syntax cluster typstHashtagFunctions - \ contains=typstHashtagFunction -syntax match typstHashtagFunction - \ /\v#\w\k*>(<%(let|set|show|import|include))@ Parens {{{2 -syntax cluster typstHashtagParens - \ contains=typstHashtagParen - \ ,typstHashtagBrace - \ ,typstHashtagBracket - \ ,typstHashtagDollar -syntax region typstHashtagParen - \ matchgroup=Noise start=/#(/ end=/)/ - \ contains=@typstCode -syntax region typstHashtagBrace - \ matchgroup=Noise start=/#{/ end=/}/ - \ contains=@typstCode -syntax region typstHashtagBracket - \ matchgroup=Noise start=/#\[/ end=/\]/ - \ contains=@typstMarkup -syntax region typstHashtagDollar - \ matchgroup=Noise start=/#\$/ end=/\\\@ Text {{{2 -syntax cluster typstMarkupText - \ contains=typstMarkupRawInline - \ ,typstMarkupRawBlock - \ ,typstMarkupLabel - \ ,typstMarkupReference - \ ,typstMarkupUrl - \ ,typstMarkupHeading - \ ,typstMarkupBulletList - \ ,typstMarkupEnumList - \ ,typstMarkupTermList - \ ,typstMarkupBold - \ ,typstMarkupItalic - \ ,typstMarkupLinebreak - \ ,typstMarkupNonbreakingSpace - \ ,typstMarkupShy - \ ,typstMarkupDash - \ ,typstMarkupEllipsis - -" Raw Text -syntax match typstMarkupRawInline - \ /`.\{-}`/ + \ contains=typstMarkupRawInline + \ ,typstMarkupRawBlock + \ ,typstMarkupLabel + \ ,typstMarkupReference + \ ,typstMarkupUrl + \ ,typstMarkupHeading + \ ,typstMarkupBulletList + \ ,typstMarkupEnumList + \ ,typstMarkupTermList + \ ,typstMarkupBold + \ ,typstMarkupItalic + \ ,typstMarkupBoldItalic + \ ,typstMarkupBackslash + \ ,typstMarkupLinebreak + \ ,typstMarkupNonbreakingSpace + \ ,@typstMarkupDollar + \ ,typstMarkupShy + \ ,typstMarkupDash + \ ,typstMarkupEllipsis + \ ,typstMarkupBackslash + \ ,typstMarkupEscape + +syntax region typstMarkupRawInline + \ matchgroup=typstMarkupRawDelimiter + \ start=+\%(^\|[[:space:]-:/]\)\@1<=`[^`]\@1=+ + \ skip=/\\`/ + \ end=+`+ + syntax region typstMarkupRawBlock - \ matchgroup=Macro start=/```\w*/ - \ matchgroup=Macro end=/```/ keepend + \ matchgroup=typstMarkupRawDelimiter + \ start=/```\w*/ + \ end=/```/ + \ keepend syntax region typstMarkupCodeBlockTypst - \ matchgroup=Macro start=/```typst/ - \ matchgroup=Macro end=/```/ contains=@typstCode keepend - \ concealends + \ matchgroup=typstMarkupRawDelimiter + \ start=/```typst/ + \ end=/```/ + \ contains=@typstCode + \ keepend for s:name in get(g:, 'typst_embedded_languages', []) let s:include = ['syntax include' \ ,'@typstEmbedded_'..s:name \ ,'syntax/'..s:name..'.vim'] let s:rule = ['syn region' - \,s:name - \,'matchgroup=Macro' - \,'start=/```'..s:name..'\>/ end=/```/' - \,'contains=@typstEmbedded_'..s:name - \,'keepend' - \,'concealends'] + \ ,"typstMarkupRawBlock_"..s:name + \ ,'matchgroup=typstMarkupRawDelimiter' + \ ,'start=/```'..s:name..'\>/ end=/```/' + \ ,'contains=@typstEmbedded_'..s:name + \ ,'keepend' + \ ,'concealends'] + execute 'silent! ' .. join(s:include, ' ') unlet! b:current_syntax execute join(s:rule, ' ') @@ -306,174 +187,145 @@ endfor " Label & Reference syntax match typstMarkupLabel - \ /\v\<\K%(\k*-*)*\>/ + \ /\v\<\K%(\k*-*)*\>/ syntax match typstMarkupReference - \ /\v\@\K%(\k*-*)*/ + \ /\v\@\K%(\k*-*)*/ -" URL syntax match typstMarkupUrl - \ #\v\w+://\S*# + \ #\v\w+://\S*# -" Heading -syntax match typstMarkupHeading - \ /^\s*\zs=\{1,6}\s.*$/ - \ contains=typstMarkupLabel,@Spell +syntax region typstMarkupHeading + \ matchgroup=typstMarkupHeadingDelimiter + \ start=/^\s*\zs=\{1,6}\s/ + \ end=/$/ keepend oneline + \ contains=typstMarkupLabel,@Spell -" Lists syntax match typstMarkupBulletList - \ /\v^\s*-\s+/ + \ /\v^\s*-\s+/ syntax match typstMarkupEnumList - \ /\v^\s*(\+|\d+\.)\s+/ + \ /\v^\s*(\+|\d+\.)\s+/ syntax region typstMarkupTermList - \ oneline start=/\v^\s*\/\s/ end=/:/ - \ contains=@typstMarkup - -" Bold & Italic -syntax match typstMarkupBold - \ /\v(\w|\\)@1 Parens {{{2 -syntax cluster typstMarkupParens - \ contains=typstMarkupBracket - \ ,typstMarkupDollar -syntax region typstMarkupBracket - \ matchgroup=Noise start=/\[/ end=/\]/ - \ contains=@typstMarkup -syntax region typstMarkupDollar - \ matchgroup=Special start=/\\\@)\]}]\)\@1=+ + \ concealends contains=typstMarkupLabel,@Spell +syn region typstMarkupItalic + \ start=+\%(^\|[\[[:space:]-:/]\)\@1<=_[^_]\@1=+ + \ skip=+\\_+ + \ end=+_\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ + \ concealends contains=typstMarkupLabel,@Spell +syn region typstMarkupBoldItalic + \ start=+\%(^\|[\[[:space:]-:/]\)\@1<=\*_[^*_]\@1=+ + \ skip=+\\\*_+ + \ end=+_\*\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ + \ concealends contains=typstMarkupLabel,@Spell +syn region typstMarkupBoldItalic + \ start=+\%(^\|[[:space:]-:/]\)\@1<=_\*[^*_]\@1=+ + \ skip=+\\_\*+ + \ end=+\*_\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ + \ concealends contains=typstMarkupLabel,@Spell + +syntax match typstMarkupBackslash /\\\\/ +syntax match typstMarkupLinebreak /\\\%(\s\|$\)/ +syntax match typstMarkupNonbreakingSpace /\~/ +syntax match typstMarkupShy /-?/ +syntax match typstMarkupDash /-\{2,3}/ +syntax match typstMarkupEllipsis /\.\.\./ +syntax match typstMarkupEscape /\\./ + +syntax region typstMarkupMath + \ matchgroup=typstMarkupDollar start=/\\\@1/ - \ contained + \ contained + \ /\v\d+%(\.\d+)?/ syntax region typstMathQuote - \ matchgroup=String start=/"/ skip=/\\"/ end=/"/ - \ contained - -" Math > Linked groups {{{2 -highlight default link typstMathIdentifier Identifier -highlight default link typstMathFunction Statement -highlight default link typstMathNumber Number -highlight default link typstMathSymbol Statement - -" Highlighting {{{1 - -" Highlighting > Linked groups {{{2 -highlight default link typstCommentBlock Comment -highlight default link typstCommentLine Comment -highlight default link typstCommentTodo Todo -highlight default link typstCodeConditional Conditional -highlight default link typstCodeRepeat Repeat -highlight default link typstCodeKeyword Keyword -highlight default link typstCodeConstant Constant -highlight default link typstCodeNumberInteger Number -highlight default link typstCodeNumberFloat Number -highlight default link typstCodeNumberLength Number -highlight default link typstCodeNumberAngle Number -highlight default link typstCodeNumberRatio Number -highlight default link typstCodeNumberFraction Number -highlight default link typstCodeString String -highlight default link typstCodeLabel Structure -highlight default link typstCodeStatementWord Statement -highlight default link typstCodeIdentifier Identifier -highlight default link typstCodeFieldAccess Identifier -highlight default link typstCodeFunction Function -highlight default link typstCodeParen Noise -highlight default link typstCodeBrace Noise -highlight default link typstCodeBracket Noise -highlight default link typstCodeDollar Noise -" highlight default link typstHashtagControlFlowError Error -highlight default link typstHashtagConditional Conditional -highlight default link typstHashtagRepeat Repeat -highlight default link typstHashtagKeyword Keyword -highlight default link typstHashtagConstant Constant -highlight default link typstHashtagStatementWord Statement -highlight default link typstHashtagIdentifier Identifier -highlight default link typstHashtagFieldAccess Identifier -highlight default link typstHashtagFunction Function -highlight default link typstHashtagParen Noise -highlight default link typstHashtagBrace Noise -highlight default link typstHashtagBracket Noise -highlight default link typstHashtagDollar Noise -highlight default link typstMarkupRawInline Macro -highlight default link typstMarkupRawBlock Macro -highlight default link typstMarkupLabel Structure -highlight default link typstMarkupReference Structure -highlight default link typstMarkupBulletList Structure -" highlight default link typstMarkupItalicError Error -" highlight default link typstMarkupBoldError Error -highlight default link typstMarkupEnumList Structure -highlight default link typstMarkupLinebreak Structure -highlight default link typstMarkupNonbreakingSpace Structure -highlight default link typstMarkupShy Structure -highlight default link typstMarkupDash Structure -highlight default link typstMarkupEllipsis Structure -highlight default link typstMarkupTermList Structure -highlight default link typstMarkupDollar Noise - -" Highlighting > Custom Styling {{{2 -highlight! Conceal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE - -highlight default typstMarkupHeading term=underline,bold cterm=underline,bold gui=underline,bold -highlight default typstMarkupUrl term=underline cterm=underline gui=underline -highlight default typstMarkupBold term=bold cterm=bold gui=bold -highlight default typstMarkupItalic term=italic cterm=italic gui=italic -highlight default typstMarkupBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic + \ matchgroup=String start=/"/ skip=/\\"/ end=/"/ + \ contained + + +syntax cluster typstComment + \ contains=typstCommentBlock,typstCommentLine +syntax region typstCommentBlock + \ start="/\*" end="\*/" keepend + \ contains=typstCommentTodo,@Spell +syntax match typstCommentLine + \ #//.*# + \ contains=typstCommentTodo,@Spell +syntax keyword typstCommentTodo + \ contained + \ TODO FIXME XXX TBD + +hi def link typstCommentBlock Comment +hi def link typstCommentLine Comment +hi def link typstCommentTodo Todo + +hi def link typstMathIdentifier Identifier +hi def link typstMathFunction Statement +hi def link typstMathNumber Number +hi def link typstMathSymbol Statement + +hi def link typstExprStart Special +hi def link typstExprOp Statement +hi def link typstExprBareVar Identifier +hi def link typstExprEmbeddedBareVar Identifier +hi def link typstExprFunc Function +hi def link typstExprCommand Statement +hi def link typstExprConstant Constant +hi def link typstExprNumber Number +hi def link typstExprNumberType Constant +hi def link typstExprString String +hi def link typstExprLabel Structure + +hi def link typstMarkupRawInline PreProc +hi def link typstMarkupRawDelimiter Special +hi def link typstMarkupRawBlock PreProc +hi def link typstMarkupDollar Special +hi def link typstMarkupLabel PreProc +hi def link typstMarkupReference Special +hi def link typstMarkupBulletList PreProc +hi def link typstMarkupEnumList PreProc +hi def link typstMarkupLinebreak Special +hi def link typstMarkupNonbreakingSpace Special +hi def link typstMarkupShy Special +hi def link typstMarkupDash Special +hi def link typstMarkupEllipsis Special +hi def link typstMarkupTermList Bold +hi def link typstMarkupTermListDelimiter PreProc +hi def link typstMarkupHeading Title +hi def link typstMarkupHeadingDelimiter Type +hi def link typstMarkupUrl Underlined +hi def link typstMarkupBold Bold +hi def link typstMarkupItalic Italic +hi def link typstMarkupBoldItalic BoldItalic let b:current_syntax = 'typst' let &cpo = s:cpo_save unlet s:cpo_save - -" }}}1 From a65741c8b38aa5d57f9e5e7f1a960a63a466efb5 Mon Sep 17 00:00:00 2001 From: Aliaksei Budavei <0x000c70@gmail.com> Date: Wed, 1 Jul 2026 20:38:10 +0000 Subject: [PATCH 084/647] runtime(screen): Bring the syntax up to version 5 * Match command names introduced in v.5.0.0 (August 2024): "auth", "multiinput", "status", "truecolor". * Match command names introduced in v.4.5.0 (January 2017): "defdynamictitle" and "dynamictitle". * Deprecate command names that have been retired thus far: "debug", "maxwin", "nethack", "password", "time". * Remove a spurious "defzombie" command name (this name is just lamented over in the documentation entry for the "zombie" command as being more fitting than "zombie" because its effects are not local to a window; no such name is entered in "comm.c"). * Separately group the Braille navigation commands, "bd_*", that may belong to another, superset program Dotscreen: (see doc/README.DOTSCREEN and commit 848af83f5 elsewhere). * Revise string escape characters: - Recognise more characters, "%[`<>=eEfFHOPSxX]". - Recognise undocumented characters, "%[gNpT]", and list relevant Screen commits in the comments. - Match optional qualifiers, "%\%([-+L]\|\d\+\).". * Match more items in double-quoted command arguments. * Match unquoted environment variable references. * Match octal numbers, e.g. "defmode 0622". * Match escaped octal numbers, e.g. "bind \077 help". Unless a Dotscreen program (c. 1995) or an older than v.4.3.1 (c. 2015) Screen program, that was compiled with "HAVE_BRAILLE" defined, is installed and needs configuring, add to ".vim/after/syntax/screen.vim": ----------------------------------------------------------- if hlexists('dotscreenCommands') syn clear dotscreenCommands endif ----------------------------------------------------------- To BACKPORT the updated syntax file to version 4 of Screen, add to ".vim/after/syntax/screen.vim": ----------------------------------------------------------- if hlexists('screenDeprecatedCommands') syn clear screenDeprecatedCommands endif if hlexists('screenVersion5Commands') syn clear screenVersion5Commands endif ----------------------------------------------------------- References: https://lists.gnu.org/archive/html/info-gnu/2024-08/msg00004.html https://lists.gnu.org/archive/html/info-gnu/2017-01/msg00007.html https://git.savannah.gnu.org/git/screen.git closes: #20550 Co-authored-by: Dmitri Vereshchagin Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/syntax/screen.vim | 97 ++++++++++++++------ runtime/syntax/testdir/dumps/screen_00.dump | 20 ++++ runtime/syntax/testdir/dumps/screen_01.dump | 20 ++++ runtime/syntax/testdir/dumps/screen_02.dump | 20 ++++ runtime/syntax/testdir/input/screen.screenrc | 32 +++++++ 6 files changed, 160 insertions(+), 30 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/screen_00.dump create mode 100644 runtime/syntax/testdir/dumps/screen_01.dump create mode 100644 runtime/syntax/testdir/dumps/screen_02.dump create mode 100644 runtime/syntax/testdir/input/screen.screenrc diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 86de71b234..072f69aeb6 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -686,6 +686,7 @@ runtime/syntax/salt.vim @gpanders runtime/syntax/sass.vim @tpope runtime/syntax/scala.vim @derekwyatt runtime/syntax/scheme.vim @evhan +runtime/syntax/screen.vim @zzzyxwvut runtime/syntax/scss.vim @tpope runtime/syntax/sed.vim @dkearns runtime/syntax/sgf.vim @lykahb diff --git a/runtime/syntax/screen.vim b/runtime/syntax/screen.vim index d576d29b7a..11ebc981d5 100644 --- a/runtime/syntax/screen.vim +++ b/runtime/syntax/screen.vim @@ -1,8 +1,9 @@ " Vim syntax file " Language: screen(1) configuration file -" Maintainer: Dmitri Vereshchagin -" Previous Maintainer: Nikolai Weibull -" Latest Revision: 2015-09-24 +" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com> +" Previous Maintainers: Dmitri Vereshchagin +" Nikolai Weibull +" Latest Revision: 2026 Jun 29 if exists("b:current_syntax") finish @@ -11,7 +12,7 @@ endif let s:cpo_save = &cpo set cpo&vim -syn match screenEscape '\\.' +syn match screenEscape '\\.' contains=screenOctalNumber syn keyword screenTodo contained TODO FIXME XXX NOTE @@ -19,18 +20,29 @@ syn region screenComment display oneline start='#' end='$' \ contains=screenTodo,@Spell syn region screenString display oneline start=+"+ skip=+\\"+ end=+"+ - \ contains=screenVariable,screenSpecial + \ contains=screenVariable,screenSpecials,screenEscape syn region screenLiteral display oneline start=+'+ skip=+\\'+ end=+'+ -syn match screenVariable contained display '$\%(\h\w*\|{\h\w*}\)' +syn match screenVariable display '$\%(\h\w*\|{\h\w*}\)' syn keyword screenBoolean on off -syn match screenNumbers display '\<\d\+\>' +syn match screenDecimalNumber display '\<\d\+\>' +syn match screenOctalNumber display '\<0\o\+\>' -syn match screenSpecials contained - \ '%\%([%aAdDhlmMstuwWyY?:{]\|[0-9]*n\|0?cC\)' +" FIXME: Undocumented escape characters (winmsg.h): "g" (see commit +" 945ad5414), "N" (49f592e21), "p" (6ead6f557), "T" (60893c465). +syn region screenSpecials contained start=+%{+ end=+}+ +syn match screenSpecials contained '%[%aAdeEfFghHlmNPsStTuxXyY?:]' +syn match screenSpecials contained '%\d*[n`=<>]' contains=screenSpecialsQualifier +syn match screenSpecials contained '%0\?[cC]' contains=screenSpecialsQualifier +syn match screenSpecials contained '%L\?[DMW]' contains=screenSpecialsQualifier +syn match screenSpecials contained '%-\?O' contains=screenSpecialsQualifier +syn match screenSpecials contained '%+\?p' contains=screenSpecialsQualifier +syn match screenSpecials contained '%[-+]\?L\?[w=<>]' contains=screenSpecialsQualifier +syn match screenSpecialsQualifier contained '\d\+' +syn match screenSpecialsQualifier contained '[-+L]' syn keyword screenCommands \ acladd @@ -48,26 +60,6 @@ syn keyword screenCommands \ autonuke \ backtick \ bce - \ bd_bc_down - \ bd_bc_left - \ bd_bc_right - \ bd_bc_up - \ bd_bell - \ bd_braille_table - \ bd_eightdot - \ bd_info - \ bd_link - \ bd_lower_left - \ bd_lower_right - \ bd_ncrc - \ bd_port - \ bd_scroll - \ bd_skip - \ bd_start_braille - \ bd_type - \ bd_upper_left - \ bd_upper_right - \ bd_width \ bell \ bell_msg \ bind @@ -99,6 +91,7 @@ syn keyword screenCommands \ defbreaktype \ defc1 \ defcharset + \ defdynamictitle \ defencoding \ defescape \ defflow @@ -119,12 +112,12 @@ syn keyword screenCommands \ defutf8 \ defwrap \ defwritelock - \ defzombie \ detach \ digraph \ dinfo \ displays \ dumptermcap + \ dynamictitle \ echo \ encoding \ escape @@ -243,6 +236,43 @@ syn keyword screenCommands \ zombie \ zombie_timeout +syn keyword screenVersion5Commands + \ auth + \ multiinput + \ status + \ truecolor + +" Braille navigation commands from a superset program Dotscreen (see some +" descriptions in doc/README.DOTSCREEN). +syn keyword dotscreenCommands + \ bd_bc_down + \ bd_bc_left + \ bd_bc_right + \ bd_bc_up + \ bd_bell + \ bd_braille_table + \ bd_eightdot + \ bd_info + \ bd_link + \ bd_lower_left + \ bd_lower_right + \ bd_ncrc + \ bd_port + \ bd_scroll + \ bd_skip + \ bd_start_braille + \ bd_type + \ bd_upper_left + \ bd_upper_right + \ bd_width + +syn keyword screenDeprecatedCommands + \ debug + \ maxwin + \ nethack + \ password + \ time + hi def link screenEscape Special hi def link screenComment Comment hi def link screenTodo Todo @@ -251,10 +281,17 @@ hi def link screenLiteral String hi def link screenVariable Identifier hi def link screenBoolean Boolean hi def link screenNumbers Number +hi def link screenDecimalNumber screenNumbers +hi def link screenOctalNumber screenNumbers hi def link screenSpecials Special hi def link screenCommands Keyword +hi def link screenSpecialsQualifier Underlined +hi def link screenVersion5Commands screenCommands +hi def link dotscreenCommands screenCommands let b:current_syntax = "screen" let &cpo = s:cpo_save unlet s:cpo_save + +" vim: sw=2 et diff --git a/runtime/syntax/testdir/dumps/screen_00.dump b/runtime/syntax/testdir/dumps/screen_00.dump new file mode 100644 index 0000000000..d26efc5478 --- /dev/null +++ b/runtime/syntax/testdir/dumps/screen_00.dump @@ -0,0 +1,20 @@ +>#+0#0000e05#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |c|a|l@1| |D|e|f|e|r|R|e|n|a|m|i|n|g|T|e|s|t|F|i|l|e|T|o|(|'|s|c|r|e@1|n|r|c|'|)| +0#0000000&@17 +|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |s|c|r|e@1|n|L|i|t|e|r|a|l| |V|i|s|u|a|l| +0#0000000&@29 +@75 +@75 +@75 +@75 +@75 +@75 +|a+0#af5f00255&|l|t|s|c|r|e@1|n| +0#0000000&@6|o+0#e000002&|n| +0#0000000&@56 +|b+0#af5f00255&|a|c|k|t|i|c|k| +0#0000000&|0+0#e000002&| +0#0000000&@1|5+0#e000002&| +0#0000000&@1|5+0#e000002&| +0#0000000&|/|u|s|r|/|b|i|n|/|t|r|u|e| |f|o@1| |b|a|r| |b|a|z| @32 +|b+0#af5f00255&|a|c|k|t|i|c|k| +0#0000000&|1+0#e000002&| +0#0000000&|6+0#e000002&|0| +0#0000000&|6+0#e000002&|0| +0#0000000&|/|u|s|r|/|b|i|n|/|m|a|w|k| |'+0#0000001#a8a8a8255|{|p|r|i|n|t| |$|1|,| |$|2|,| |$|3|,| |$|4|}|'| +0#0000000#ffffff0|/|d|e|v|/|n|u|l@1| @9 +|b+0#af5f00255&|a|c|k|t|i|c|k| +0#0000000&|2+0#e000002&| +0#0000000&|6+0#e000002&|0| +0#0000000&|6+0#e000002&|0| +0#0000000&|/|u|s|r|/|b|i|n|/|m|a|w|k| |'+0#0000001#a8a8a8255|{|p|r|i|n|t| |$|1|,| |$|2|,| |$|3|,| |$|4|}|'| +0#0000000#ffffff0|/|d|e|v|/|n|u|l@1| @9 +|#+0#0000e05&| |N+0#0000001#ffff4012|O|T|E|:+0#0000e05#ffffff0| |s|e@1| |`|l|i|n|u|x|-|s|o|u|r|c|e|/|f|s|/|p|r|o|c|/|p|r|o|c|_|m|i|s|c|.|c|'| |f|o|r| |d|e|t|a|i|l|s|.| +0#0000000&@15 +|b+0#af5f00255&|a|c|k|t|i|c|k| +0#0000000&|3+0#e000002&| +0#0000000&|6+0#e000002&|0| +0#0000000&|6+0#e000002&|0| +0#0000000&|/|u|s|r|/|b|i|n|/|m|a|w|k| |'+0#0000001#a8a8a8255|{|i|f|(|$|1|=@1|"|M|e|m|T|o|t|a|l|:|"|)| |m|t|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|M|e +|m|F|r|e@1|:|"|)| |m|f|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|B|u|f@1|e|r|s|:|"|)| |m|b|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|C|a|c|h|e|d|:|"|)| |m|c|=|$|2 +|;| |e|l|s|e| |i|f|(|$|1|=@1|"|S|w|a|p|T|o|t|a|l|:|"|)| |s|t|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|S|w|a|p|F|r|e@1|:|"|)| |{|s|f|=|$|2|;| |e|x|i|t| |0|} +@1|E|N|D|{|p|=|1|0@1|/|m|t|;| |p|r|i|n|t|f|(|"|%|.|1|f|%@1|U| |%|.|1|f|%@1|F| |%|.|1|f|%@1|B| |%|.|1|f|%@1|C| |%|.|1|f|%@1|S|"|,| |(|m|t|-|(|m|f|+|m|b +|+|m|c|)@1|*|p|,| |m|f|*|p|,| |m|b|*|p|,| |m|c|*|p|,| |(|s|t|-|s|f|)|*|1|0@1|/|s|t|)|}|'| +0#0000000#ffffff0|/|p|r|o|c|/|m|e|m|i|n|f|o| @16 +|b+0#af5f00255&|i|n|d| +0#0000000&@11|\+0#e000e06&|0+0#e000002&|4|1| +0#0000000&@3|h+0#af5f00255&|e|l|p| +0#0000000&@46 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/screen_01.dump b/runtime/syntax/testdir/dumps/screen_01.dump new file mode 100644 index 0000000000..4d2c0886fe --- /dev/null +++ b/runtime/syntax/testdir/dumps/screen_01.dump @@ -0,0 +1,20 @@ +|b+0#af5f00255#ffffff0|a|c|k|t|i|c|k| +0#0000000&|3+0#e000002&| +0#0000000&|6+0#e000002&|0| +0#0000000&|6+0#e000002&|0| +0#0000000&|/|u|s|r|/|b|i|n|/|m|a|w|k| |'+0#0000001#a8a8a8255|{|i|f|(|$|1|=@1|"|M|e|m|T|o|t|a|l|:|"|)| |m|t|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|M|e +|m|F|r|e@1|:|"|)| |m|f|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|B|u|f@1|e|r|s|:|"|)| |m|b|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|C|a|c|h|e|d|:|"|)| |m|c|=|$|2 +|;| |e|l|s|e| |i|f|(|$|1|=@1|"|S|w|a|p|T|o|t|a|l|:|"|)| |s|t|=|$|2|;| |e|l|s|e| |i|f|(|$|1|=@1|"|S|w|a|p|F|r|e@1|:|"|)| |{|s|f|=|$|2|;| |e|x|i|t| |0|} +@1|E|N|D|{|p|=|1|0@1|/|m|t|;| |p|r|i|n|t|f|(|"|%|.|1|f|%@1|U| |%|.|1|f|%@1|F| |%|.|1|f|%@1|B| |%|.|1|f|%@1|C| |%|.|1|f|%@1|S|"|,| |(|m|t|-|(|m|f|+|m|b +|+|m|c|)@1|*|p|,| |m|f|*|p|,| |m|b|*|p|,| |m|c|*|p|,| |(|s|t|-|s|f|)|*|1|0@1|/|s|t|)|}|'| +0#0000000#ffffff0|/|p|r|o|c|/|m|e|m|i|n|f|o| @16 +>b+0#af5f00255&|i|n|d| +0#0000000&@11|\+0#e000e06&|0+0#e000002&|4|1| +0#0000000&@3|h+0#af5f00255&|e|l|p| +0#0000000&@46 +|c+0#af5f00255&|a|p|t|i|o|n| +0#0000000&|a|l|w|a|y|s| @1|"+0#e000002&|%+0#e000e06&|{|=| |3|}|%|?|%|0+8&&|`+0&&|%|L+8&&|>+0&&|%|1+8&&|0@1|=+0&&|%|?| +0#e000002&|%+0#e000e06&|-+8&&|w+0&&|%|{|i|2|}|%|n| +0#e000002&|%+0#e000e06&|t|%|{|-|}|%|++8&&|w+0&&|%|{|0|}|"+0#e000002&| +0#0000000&@10 +|d+0#af5f00255&|e|f|u|t|f|8| +0#0000000&@8|o+0#e000002&|n| +0#0000000&@56 +|e+0#af5f00255&|s|c|a|p|e| +0#0000000&@9|`@1| @56 +|h+0#af5f00255&|a|r|d|s|t|a|t|u|s| +0#0000000&@5|o+0#e000002&|n| +0#0000000&@56 +|h+0#af5f00255&|a|r|d|s|t|a|t|u|s| +0#0000000&@5|a|l|w|a|y|s|l|a|s|t|l|i|n|e| |"+0#e000002&|%+0#e000e06&|=|%|{|x|F@5|}|%|{|#|f@1|0@3|}||+0#e000002&|%+0#e000e06&|{|#|0@1|f@3|}|%|5+8&&|`+0&&|%|{|-|}||+0#e000002&|%+0#e000e06&|{ +|x|F@5|}|%|4+8&&|`+0&&|%|{|-|}||+0#e000002&|%+0#e000e06&|{|#|0@1|f@3|}|%|l|%|{|-|}||+0#e000002&|%+0#e000e06&|{|x|8@5|;|#|0@5|}|%|3+8&&|`+0&&|%|{|-|}||+0#e000002&|%+0#e000e06&|{|#|0@1|f@3|}|%|1+8&&|`+0&&||+0#e000002&|%+0#e000e06&|2+8&& +|`+0&&|%|{|-|}||+0#e000002&|%+0#e000e06&|{|#|0@1|8|0@2|}|%|0+8&&|c+0&&|"+0#e000002&| +0#0000000&@54 +|s+0#af5f00255&|e|t|e|n|v| +0#0000000&@9|C|O|L|U|M|N|S| |$+0#00e0e07&|{|C|O|L|U|M|N|S|}| +0#0000000&@40 +|s+0#af5f00255&|h|e|l@1|t|i|t|l|e| +0#0000000&@5|"+0#e000002&|$| |||b|a|s|h|:|"| +0#0000000&@48 +|s+0#af5f00255&|i|l|e|n|c|e|w|a|i|t| +0#0000000&@4|3+0#e000002&|0@1| +0#0000000&@55 +|s+0#af5f00255&|t|a|r|t|u|p|_|m|e|s@1|a|g|e| +0#0000000&|o+0#e000002&|f@1| +0#0000000&@55 +|v+0#af5f00255&|b|e|l@1| +0#0000000&@10|o+0#e000002&|f@1| +0#0000000&@55 +|s+0#af5f00255&|c|r|e@1|n| +0#0000000&|-|h| |0+0#e000002&| +0#0000000&|-|t| @1|v|i|m| @4|0+0#e000002&| +0#0000000&|/|u|s|r|/|b|i|n|/|v|i|m| @36 +@57|1|5|,|1| @9|6|8|%| diff --git a/runtime/syntax/testdir/dumps/screen_02.dump b/runtime/syntax/testdir/dumps/screen_02.dump new file mode 100644 index 0000000000..0925ab2278 --- /dev/null +++ b/runtime/syntax/testdir/dumps/screen_02.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|c|r|e@1|n| +0#0000000&|-|h| |0+0#e000002&| +0#0000000&|-|t| @1|v|i|m| @4|0+0#e000002&| +0#0000000&|/|u|s|r|/|b|i|n|/|v|i|m| @36 +|s+0#af5f00255&|c|r|e@1|n| +0#0000000&@9|1+0#e000002&| +0#0000000&@57 +|s+0#af5f00255&|c|r|e@1|n| +0#0000000&@9|2+0#e000002&| +0#0000000&@57 +|s+0#af5f00255&|c|r|e@1|n| +0#0000000&@9|3+0#e000002&| +0#0000000&@57 +|s+0#af5f00255&|c|r|o|l@1|b|a|c|k| +0#0000000&@5|2+0#e000002&|0|4|8| +0#0000000&@54 +>s+0#af5f00255&|e|l|e|c|t| +0#0000000&@9|4+0#e000002&| +0#0000000&@57 +|t+0#af5f00255&|r|u|e|c|o|l|o|r| +0#0000000&@6|o+0#e000002&|n| +0#0000000&@56 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|1|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/screen.screenrc b/runtime/syntax/testdir/input/screen.screenrc new file mode 100644 index 0000000000..0025d4c424 --- /dev/null +++ b/runtime/syntax/testdir/input/screen.screenrc @@ -0,0 +1,32 @@ +# VIM_TEST_SETUP call DeferRenamingTestFileTo('screenrc') +# VIM_TEST_SETUP hi link screenLiteral Visual + + + + + + +altscreen on +backtick 0 5 5 /usr/bin/true foo bar baz +backtick 1 60 60 /usr/bin/mawk '{print $1, $2, $3, $4}' /dev/null +backtick 2 60 60 /usr/bin/mawk '{print $1, $2, $3, $4}' /dev/null +# NOTE: see `linux-source/fs/proc/proc_misc.c' for details. +backtick 3 60 60 /usr/bin/mawk '{if($1=="MemTotal:") mt=$2; else if($1=="MemFree:") mf=$2; else if($1=="Buffers:") mb=$2; else if($1=="Cached:") mc=$2; else if($1=="SwapTotal:") st=$2; else if($1=="SwapFree:") {sf=$2; exit 0}}END{p=100/mt; printf("%.1f%%U %.1f%%F %.1f%%B %.1f%%C %.1f%%S", (mt-(mf+mb+mc))*p, mf*p, mb*p, mc*p, (st-sf)*100/st)}' /proc/meminfo +bind \041 help +caption always "%{= 3}%?%0`%L>%100=%? %-w%{i2}%n %t%{-}%+w%{0}" +defutf8 on +escape `` +hardstatus on +hardstatus alwayslastline "%=%{xFFFFFF}%{#ff0000}|%{#00ffff}%5`%{-}|%{xFFFFFF}%4`%{-}|%{#00ffff}%l%{-}|%{x888888;#000000}%3`%{-}|%{#00ffff}%1`|%2`%{-}|%{#008000}%0c" +setenv COLUMNS ${COLUMNS} +shelltitle "$ |bash:" +silencewait 300 +startup_message off +vbell off +screen -h 0 -t vim 0 /usr/bin/vim +screen 1 +screen 2 +screen 3 +scrollback 2048 +select 4 +truecolor on From 979602fd89da678590e722a815e6177fbc15d684 Mon Sep 17 00:00:00 2001 From: Shane Harper Date: Wed, 1 Jul 2026 20:40:51 +0000 Subject: [PATCH 085/647] patch 9.2.0762: duplicated sub-option name check in :set completion Problem: The same sub-option name check appears ten times. Solution: Extract the check into new completing_value_for_subopt() function (Shane Harper). No functional change. Previously is_borderhighlight in expand_set_popupoption() was always false: STRNCMP was given "highlight:" instead of "borderhighlight:" as its second argument. There was no user-visible problem with this: is_highlight was already true for "borderhighlight:" (it ends in "highlight:") and the completions for both "borderhighlight:" and "highlight:" are the same. closes: #20676 Co-authored-by: Claude Opus 4.8 Signed-off-by: Shane Harper Signed-off-by: Christian Brabandt --- src/optionstr.c | 60 +++++++++++++++++-------------------------------- src/version.c | 2 ++ 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/src/optionstr.c b/src/optionstr.c index b187dc3192..d2ce36e76f 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -1131,6 +1131,16 @@ did_set_ambiwidth(optset_T *args UNUSED) return check_chars_options(); } + static bool +completing_value_for_subopt(optexpand_T *args, char *name_suffix) +{ + char_u *colon = args->oe_xp->xp_pattern - 1; + int len = (int)STRLEN(name_suffix); + + return colon - args->oe_set_arg >= len + && STRNCMP(colon - len, name_suffix, len) == 0; +} + int expand_set_ambiwidth(optexpand_T *args, int *numMatches, char_u ***matches) { @@ -2204,10 +2214,7 @@ expand_set_diffopt(optexpand_T *args, int *numMatches, char_u ***matches) if (xp->xp_pattern > args->oe_set_arg && *(xp->xp_pattern-1) == ':') { - // Within "algorithm:", we have a subgroup of possible options. - int algo_len = (int)STRLEN("algorithm:"); - if (xp->xp_pattern - args->oe_set_arg >= algo_len && - STRNCMP(xp->xp_pattern - algo_len, "algorithm:", algo_len) == 0) + if (completing_value_for_subopt(args, "algorithm")) { return expand_set_opt_string( args, @@ -2216,10 +2223,7 @@ expand_set_diffopt(optexpand_T *args, int *numMatches, char_u ***matches) numMatches, matches); } - // Within "inline:", we have a subgroup of possible options. - int inline_len = (int)STRLEN("inline:"); - if (xp->xp_pattern - args->oe_set_arg >= inline_len && - STRNCMP(xp->xp_pattern - inline_len, "inline:", inline_len) == 0) + if (completing_value_for_subopt(args, "inline")) { return expand_set_opt_string( args, @@ -3508,20 +3512,9 @@ expand_set_popupoption(optexpand_T *args, int *numMatches, char_u ***matches, if (xp->xp_pattern > args->oe_set_arg && *(xp->xp_pattern-1) == ':') { - // Within "highlight:"/"border:"/"align:", we have a subgroup of possible options. - int border_len = (int)STRLEN("border:"); - int close_len = (int)STRLEN("close:"); - int resize_len = (int)STRLEN("resize:"); - int shadow_len = (int)STRLEN("shadow:"); - int is_border = xp->xp_pattern - args->oe_set_arg >= border_len && - STRNCMP(xp->xp_pattern - border_len, "border:", border_len) == 0; - int is_close = xp->xp_pattern - args->oe_set_arg >= close_len && - STRNCMP(xp->xp_pattern - close_len, "close:", close_len) == 0; - int is_resize = xp->xp_pattern - args->oe_set_arg >= resize_len && - STRNCMP(xp->xp_pattern - resize_len, "resize:", resize_len) == 0; - int is_shadow = xp->xp_pattern - args->oe_set_arg >= shadow_len && - STRNCMP(xp->xp_pattern - shadow_len, "shadow:", shadow_len) == 0; - if (is_close || is_resize || is_shadow) + if (completing_value_for_subopt(args, "close") + || completing_value_for_subopt(args, "resize") + || completing_value_for_subopt(args, "shadow")) { return expand_set_opt_string( args, @@ -3530,7 +3523,7 @@ expand_set_popupoption(optexpand_T *args, int *numMatches, char_u ***matches, numMatches, matches); } - if (is_border) + if (completing_value_for_subopt(args, "border")) { return expand_set_opt_string( args, @@ -3541,9 +3534,7 @@ expand_set_popupoption(optexpand_T *args, int *numMatches, char_u ***matches, numMatches, matches); } - int align_len = (int)STRLEN("align:"); - if (xp->xp_pattern - args->oe_set_arg >= align_len && - STRNCMP(xp->xp_pattern - align_len, "align:", align_len) == 0) + if (completing_value_for_subopt(args, "align")) { return expand_set_opt_string( args, @@ -3552,16 +3543,8 @@ expand_set_popupoption(optexpand_T *args, int *numMatches, char_u ***matches, numMatches, matches); } - int highlight_len = (int)STRLEN("highlight:"); - int borderhighlight_len = (int)STRLEN("borderhighlight:"); - int is_highlight = xp->xp_pattern - args->oe_set_arg >= highlight_len - && STRNCMP(xp->xp_pattern - highlight_len, "highlight:", - highlight_len) == 0; - int is_borderhighlight - = xp->xp_pattern - args->oe_set_arg >= borderhighlight_len - && STRNCMP(xp->xp_pattern - borderhighlight_len, "highlight:", - borderhighlight_len) == 0; - if (is_highlight || is_borderhighlight) + if (completing_value_for_subopt(args, "highlight") + || completing_value_for_subopt(args, "borderhighlight")) { // Return the list of all highlight names return expand_set_opt_generic( @@ -4042,10 +4025,7 @@ expand_set_tabpanelopt(optexpand_T *args, int *numMatches, char_u ***matches) if (xp->xp_pattern > args->oe_set_arg && *(xp->xp_pattern-1) == ':') { - // Within "align:", we have a subgroup of possible options. - int align_len = (int)STRLEN("align:"); - if (xp->xp_pattern - args->oe_set_arg >= align_len && - STRNCMP(xp->xp_pattern - align_len, "align:", align_len) == 0) + if (completing_value_for_subopt(args, "align")) { return expand_set_opt_string( args, diff --git a/src/version.c b/src/version.c index 7546d03195..89cd188cb5 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 762, /**/ 761, /**/ From a55316012ecc9a3e1df68ed8bac6fc682db10c02 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 1 Jul 2026 20:44:37 +0000 Subject: [PATCH 086/647] runtime(doc): regenerate help tags forgotten from dd8975428bae4139d400df1ebac Signed-off-by: Christian Brabandt --- runtime/doc/tags | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/doc/tags b/runtime/doc/tags index 1e06d460b4..b01ae42046 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -8055,6 +8055,7 @@ g:typst_conceal filetype.txt /*g:typst_conceal* g:typst_embedded_languages syntax.txt /*g:typst_embedded_languages* g:typst_folding filetype.txt /*g:typst_folding* g:typst_foldnested filetype.txt /*g:typst_foldnested* +g:typst_recommended_style filetype.txt /*g:typst_recommended_style* g:var eval.txt /*g:var* g:vim_indent indent.txt /*g:vim_indent* g:vim_indent_cont indent.txt /*g:vim_indent_cont* From d859e128a8c8d563d9f4f90d15361bce260f0962 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 1 Jul 2026 20:53:52 +0000 Subject: [PATCH 087/647] runtime(xml): Update xml syntax file Improve performance related: chrisbra/vim-xml-runtime#36 Co-Authored-by: Dmytro Meleshko Signed-off-by: Christian Brabandt --- runtime/syntax/xml.vim | 151 +++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 88 deletions(-) diff --git a/runtime/syntax/xml.vim b/runtime/syntax/xml.vim index d99f8b467a..9b97c4fd7f 100644 --- a/runtime/syntax/xml.vim +++ b/runtime/syntax/xml.vim @@ -4,13 +4,14 @@ " Repository: https://github.com/chrisbra/vim-xml-ftplugin " Previous Maintainer: Johannes Zellner " Author: Paul Siegmann -" Last Changed: Nov 03, 2019 +" Last Changed: 30 Jun 2026 " Filenames: *.xml " Last Change: " 20190923 - Fix xmlEndTag to match xmlTag (vim/vim#884) " 20190924 - Fix xmlAttribute property (amadeus/vim-xml@d8ce1c946) " 20191103 - Enable spell checking globally " 20210428 - Improve syntax synchronizing +" 20260630 - Improve performance " CONFIGURATION: " syntax folding can be turned on by @@ -61,7 +62,8 @@ syn case match syn spell toplevel " mark illegal characters -syn match xmlError "[<&]" +syn match xmlError "<" +syn match xmlError "&" " strings (inside tags) aka VALUES " @@ -92,12 +94,18 @@ syn match xmlEqual +=+ display " ^^^^^^^^^^^^^ " syn match xmlAttrib - \ +[-'"<]\@1\%(['"]\@!\|$\)+ + \ +\%#=1[-/!?<>"']\@1['"]\@!+ \ contained \ contains=xmlAttribPunct,@xmlAttribHook \ display +if exists("g:xml_namespace_transparent") + command! -nargs=+ XmlTransparent transparent +else + command! -nargs=+ XmlTransparent +endif + " namespace spec " " PROVIDES: @xmlNamespaceHook @@ -107,20 +115,18 @@ syn match xmlAttrib " " ^^^ " -if exists("g:xml_namespace_transparent") -syn match xmlNamespace - \ +\(<\|"':]\+[:]\@=+ +XmlTransparent syn match xmlNamespace + \ +<[^ /!?<>"':]\+\ze:+lc=1 \ contained \ contains=@xmlNamespaceHook - \ transparent \ display -else -syn match xmlNamespace - \ +\(<\|"':]\+[:]\@=+ +XmlTransparent syn match xmlNamespace + \ +"':]\+\ze:+lc=2 \ contained \ contains=@xmlNamespaceHook \ display -endif + +delcommand XmlTransparent " tag name @@ -133,47 +139,60 @@ endif " ^^^ " syn match xmlTagName - \ +\%(<\|"']\++ + \ +<[^ /!?<>"']\++lc=1 + \ contained + \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook + \ display +syn match xmlTagName + \ +"']\++lc=2 \ contained \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook \ display if exists('g:xml_syntax_folding') + command! -nargs=+ XmlContained contained + command! -nargs=+ XmlFold fold +else + command! -nargs=+ XmlContained + command! -nargs=+ XmlFold +endif - " start tag - " use matchgroup=xmlTag to skip over the leading '<' - " - " PROVIDES: @xmlStartTagHook - " - " EXAMPLE: - " - " - " s^^^^^^^^^^^^^^^e - " - syn region xmlTag - \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+ +" start tag +" use matchgroup=xmlTag to skip over the leading '<' +" +" PROVIDES: @xmlStartTagHook +" +" EXAMPLE: +" +" +" s^^^^^^^^^^^^^^^e +" +XmlContained syn region xmlTag + \ matchgroup=xmlTag start=+<\ze[^ /!?<>"']+ \ matchgroup=xmlTag end=+>+ - \ contained \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook - " highlight the end tag - " - " PROVIDES: @xmlTagHook - " (should we provide a separate @xmlEndTagHook ?) - " - " EXAMPLE: - " - " - " ^^^^^^ - " - syn region xmlEndTag - \ matchgroup=xmlTag start=+"']\@=+ +" highlight the end tag +" +" PROVIDES: @xmlTagHook +" (should we provide a separate @xmlEndTagHook ?) +" +" EXAMPLE: +" +" +" ^^^^^^ +" +XmlContained syn region xmlEndTag + \ matchgroup=xmlTag start=+"']+ \ matchgroup=xmlTag end=+>+ - \ contained \ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook +delcommand XmlContained + + +if exists('g:xml_syntax_folding') " tag elements with syntax-folding. " NOTE: NO HIGHLIGHTING -- highlighting is done by contained elements " @@ -197,23 +216,6 @@ if exists('g:xml_syntax_folding') \ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook,@Spell \ keepend \ extend - -else - - " no syntax folding: - " - contained attribute removed - " - xmlRegion not defined - " - syn region xmlTag - \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+ - \ matchgroup=xmlTag end=+>+ - \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook - - syn region xmlEndTag - \ matchgroup=xmlTag start=+"']\@=+ - \ matchgroup=xmlTag end=+>+ - \ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook - endif @@ -221,30 +223,14 @@ endif syn match xmlEntity "&[^; \t]*;" contains=xmlEntityPunct syn match xmlEntityPunct contained "[&.;]" -if exists('g:xml_syntax_folding') - - " The real comments (this implements the comments as defined by xml, - " but not all xml pages actually conform to it. Errors are flagged. - syn region xmlComment - \ start=++ - \ contains=xmlCommentStart,xmlCommentError - \ extend - \ fold - -else - - " no syntax folding: - " - fold attribute removed - " - syn region xmlComment +" The real comments (this implements the comments as defined by xml, +" but not all xml pages actually conform to it. Errors are flagged. +XmlFold syn region xmlComment \ start=++ \ contains=xmlCommentStart,xmlCommentError \ extend -endif - syn match xmlCommentStart contained "+ contained syn region xmlProcessing matchgroup=xmlProcessingDelim start="" contains=xmlAttrib,xmlEqual,xmlString -if exists('g:xml_syntax_folding') - - " DTD -- we use dtd.vim here - syn region xmlDocType matchgroup=xmlDocTypeDecl +" DTD -- we use dtd.vim here +XmlFold syn region xmlDocType matchgroup=xmlDocTypeDecl \ start="" - \ fold \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString -else - " no syntax folding: - " - fold attribute removed - " - syn region xmlDocType matchgroup=xmlDocTypeDecl - \ start="" - \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString - -endif +delcommand XmlFold syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM syn region xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD From 1ebd2fdb78ead0f46dd049f39c3d4cfef951dad8 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 08:12:32 +0200 Subject: [PATCH 088/647] patch 9.2.0763: tests: style issue in test_plugin_netrw Problem: tests: style issue in test_plugin_netrw (after v9.2.0761) Solution: Clean-up newly created directory, use consistent concat operator Signed-off-by: Christian Brabandt --- src/testdir/test_plugin_netrw.vim | 4 ++-- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index 896e83ec46..a6dcf33e04 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -884,12 +884,12 @@ func Test_netrw_open_backslash_file() let dir = getcwd() . '/Xbslash' let fname = dir . '/\' - call mkdir(dir, 'p') + call mkdir(dir, 'pR') call writefile(['backslash file content'], fname) call assert_true(filereadable(fname)) " list the directory and move onto the '\' entry - exe 'Explore ' .. dir + exe 'Explore ' . dir call assert_true(search('^\\$', 'w') > 0) " open it diff --git a/src/version.c b/src/version.c index 89cd188cb5..910a5b3910 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 763, /**/ 762, /**/ From 700accf149f671a20cc20319921f23d1ae8c5a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Pe=C5=A1i=C4=87?= <27575106+eevan78@users.noreply.github.com> Date: Wed, 1 Jul 2026 21:06:10 +0000 Subject: [PATCH 089/647] translation(sr): Update Serbian translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes: #20689 Signed-off-by: Ivan Pešić <27575106+eevan78@users.noreply.github.com> Signed-off-by: Christian Brabandt --- src/po/sr.po | 129 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 45 deletions(-) diff --git a/src/po/sr.po b/src/po/sr.po index 5187a3f3f0..b56adc4fe3 100644 --- a/src/po/sr.po +++ b/src/po/sr.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Vim(Serbian)\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-04-29 19:49+0000\n" -"PO-Revision-Date: 2026-05-01 10:09+0400\n" +"POT-Creation-Date: 2026-06-27 08:41+0000\n" +"PO-Revision-Date: 2026-07-02 15:14+0400\n" "Last-Translator: Ivan Pešić \n" "Language-Team: Serbian\n" "Language: sr\n" @@ -262,9 +262,6 @@ msgstr ": Слање није успело. Покушава се локално msgid "%d of %d edited" msgstr "%d од %d уређено" -msgid "Socket server not online:Send expression failed" -msgstr "Сокет сервер није на мрежи: Није успело слање израза" - msgid "No display: Send expression failed.\n" msgstr "Нема приказа: Није успело слање израза.\n" @@ -979,6 +976,21 @@ msgstr "Замени све" msgid "_Close" msgstr "_Затвори" +msgid "Close Tab" +msgstr "Затвори картицу" + +msgid "New Tab" +msgstr "Нова картица" + +msgid "Open Tab..." +msgstr "Отвори картицу..." + +msgid "Direction:" +msgstr "Смер:" + +msgid "Close" +msgstr "Затвори" + msgid "Vim: Received \"die\" request from session manager\n" msgstr "Vim: Примљен је „die” захтев од менаџера сесије\n" @@ -988,9 +1000,6 @@ msgstr "Затвори картицу" msgid "New tab" msgstr "Нова картица" -msgid "Open Tab..." -msgstr "Отвори картицу..." - msgid "Vim: Main window unexpectedly destroyed\n" msgstr "Vim: Главни прозор је неочекивано уништен\n" @@ -1760,9 +1769,10 @@ msgstr "-X\t\t\tНе повезуј се на X сервер" msgid "-Y\t\t\tDo not connect to Wayland compositor" msgstr "-X\t\t\tНе повезуј се на Wayland композитор" -msgid "--clientserver Backend for clientserver communication" +msgid "" +"--clientserver Backend for clientserver communication" msgstr "" -"--clientserver Позадински механизам за clientserver комуникацију" +"--clientserver Позадински механизам за clientserver комуникацију" msgid "--remote \tEdit in a Vim server if possible" msgstr "--remote <фајлови>\tУређуј <фајлови> у Vim серверу ако је могуће" @@ -2044,9 +2054,15 @@ msgstr "???НЕИСПРАВАН БРОЈ БЛОКА" msgid "???BLOCK MISSING" msgstr "???НЕДОСТАЈЕ БЛОК" +msgid "??? BLOCK PAGE COUNT MISMATCH" +msgstr "??? НЕ ПОДУДАРА СЕ БРОЈ СТРАНИЦА БЛОКА" + msgid "??? from here until ???END lines may be messed up" msgstr "??? одавде па до ???КРАЈ линије су можда забрљане" +msgid "??? block header corrupted" +msgstr "??? заглавље блока је покварено" + msgid "??? from here until ???END lines may have been inserted/deleted" msgstr "??? одавде па до ???КРАЈ линије су можда уметане/брисане" @@ -2259,12 +2275,12 @@ msgstr "Привремени фајл „" msgid "\" already exists!" msgstr "” већ постоји!" -msgid "VIM - ATTENTION" -msgstr "VIM - ПАЖЊА" - msgid "Swap file already exists!" msgstr "Привремени фајл већ постоји!" +msgid "VIM - ATTENTION" +msgstr "VIM - ПАЖЊА" + msgid "" "&Open Read-Only\n" "&Edit anyway\n" @@ -2671,10 +2687,6 @@ msgstr "XSMP ICE надгледање везе није успело" msgid "XSMP SmcOpenConnection failed: %s" msgstr "XSMP SmcOpenConnection није успело: %s" -#, c-format -msgid "Failed creating socket directory: %s" -msgstr "Не може да се креира сокет директоријум: %s" - msgid "At line" msgstr "На линији" @@ -2955,6 +2967,10 @@ msgstr " (НИЈЕ ПРОНАЂЕНО)" msgid " (not supported)" msgstr " (није подржано)" +#, c-format +msgid "Failed creating socket directory: %s" +msgstr "Не може да се креира сокет директоријум: %s" + #, c-format msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" msgstr "" @@ -3256,18 +3272,6 @@ msgstr "синтаксна iskeyword није постављена" msgid "syncing on C-style comments" msgstr "синхронизација на коментарима C-стила" -msgid "no syncing" -msgstr "без синхронизације" - -msgid "syncing starts at the first line" -msgstr "синхронизација почиње од прве линије" - -msgid "syncing starts " -msgstr "синхронизација почиње " - -msgid " lines before top line" -msgstr " линија пре линије на врху" - msgid "" "\n" "--- Syntax sync items ---" @@ -3282,6 +3286,18 @@ msgstr "" "\n" "синхро на ставкама" +msgid "no syncing" +msgstr "без синхронизације" + +msgid "syncing starts at the first line" +msgstr "синхронизација почиње од прве линије" + +msgid "syncing starts " +msgstr "синхронизација почиње " + +msgid " lines before top line" +msgstr " линија пре линије на врху" + msgid "" "\n" "--- Syntax items ---" @@ -3656,6 +3672,12 @@ msgstr "" msgid "without GUI." msgstr "без ГКИ." +msgid "with GTK4 GUI (hwaccel)." +msgstr "са GTK4 ГКИ (хдвубрз)." + +msgid "with GTK4 GUI." +msgstr "са GTK4 ГКИ." + msgid "with GTK3 GUI." msgstr "са GTK3 ГКИ." @@ -6937,12 +6959,9 @@ msgstr "E881: Број линија се неочекивано променио msgid "E882: Uniq compare function failed" msgstr "E882: Uniq функција поређења није успела" -msgid "" -"E883: Search pattern and expression register may not contain two or more " -"lines" -msgstr "" -"E883: Шаблон претраге и регистар за израз не смеју да садрже две или више " -"линија" +#, c-format +msgid "E883: Register '%c' cannot contain multiple lines" +msgstr "E883: Регистар ’%c’ не може да садржи више линија" #, c-format msgid "E884: Function name cannot contain a colon: %s" @@ -8801,6 +8820,10 @@ msgstr "E1404: Abstract не може да се користи у интерфе msgid "E1405: Class \"%s\" cannot be used as a value" msgstr "E1405: Класа „%s” не може да се користи као вредност" +#, c-format +msgid "E1406: Public and protected member have the same name: %s and _%s" +msgstr "E1406: Јавни и заштићени члан имају исто име: %s и _%s" + msgid "E1407: Cannot use a Typealias as a variable or value" msgstr "E1407: Алијас типа не може да се користи као променљива или вредност" @@ -9157,22 +9180,24 @@ msgstr "E1561: Дуплирано име променљиве типа: %s" msgid "E1562: Diff anchors cannot be used with hidden diff windows" msgstr "E1562: Diff не могу да се користе са скривеним diff прозорима" -msgid "E1563: Socket path is too big" -msgstr "E1563: Путања до сокета је сувише дугачка" - -msgid "E1564: Socket name cannot have slashes in it without being a path" -msgstr "E1564: Име сокета не сме да са садржи косе црте осим ако није путања" +#, c-format +msgid "E1564: Socket name '%s' cannot have slashes in it without being a path" +msgstr "E1564: Име сокета ’%s’ не сме да са садржи косе црте осим ако није путања" msgid "E1565: Socket server is not online, call remote_startserver() first" msgstr "" "E1565: Сокет сервер није на мрежи, најпре позовите remote_startserver()" #, c-format -msgid "E1566: Failed connecting to socket %s: %s" -msgstr "E1566: Није успело повезивање на сокет: %s: %s" +msgid "E1566: Failed connecting to socket '%s'" +msgstr "E1566: Није успело повезивање на сокет ’%s’" -msgid "E1567: Cannot start socket server, socket path is unavailable" -msgstr "E1567: Не може да се покрене сокет сервер, није доступна путања сокета" +msgid "" +"E1567: Socket server protocol version mismatch, check what Vim version you " +"are using" +msgstr "" +"E1567: Не подудара се верзија протокола сокет сервера, проверите коју Vim " +"верзију користите" #, c-format msgid "E1568: OSC command response timed out: %.*s" @@ -9198,7 +9223,8 @@ msgid "E1573: Cannot listen on port" msgstr "E1573: Не може да се слуша на порту" msgid "E1574: gethostbyname(): cannot resolve hostname in channel_listen()" -msgstr "E1574: gethostbyname(): не може да се разреши име хоста у channel_listen()" +msgstr "" +"E1574: gethostbyname(): не може да се разреши име хоста у channel_listen()" msgid "E1575: Cannot create pipes" msgstr "E1575: Не могу да се креирају токови података" @@ -9206,6 +9232,16 @@ msgstr "E1575: Не могу да се креирају токови подат msgid "E1576: Tag file entry must not be a URL" msgstr "E1576: Ставка у фајлу ознака не сме да буде URL" +#, c-format +msgid "E1577: Invalid format string, only one \"%s\" is allowed" +msgstr "E1577: Неисправан стринг формата, дозвољено је само једно „%s”" + +msgid "E1578: Too many postponed prefixes and/or compound flags" +msgstr "E1578: Превише закашњених префикса и/или индикатора сложеница" + +msgid "E1579: -completeopt=escape cannot be used with -nargs=_" +msgstr "E1579: -completeopt=escape не може да се користи са -nargs=_" + msgid "--No lines in buffer--" msgstr "--У баферу нема линија--" @@ -9721,6 +9757,9 @@ msgstr "" msgid "file names in a tags file are relative to the tags file" msgstr "имена фајлова у фајлу ознака су релативна у односу на фајл ознака" +msgid "a :tag command cannot access remote files" +msgstr ":tag не може да приступи удаљеним фајловима" + msgid "a :tag command will use the tagstack" msgstr "Команда :tag ће да користи стек ознака" From 1a43d123f4b42d16726cf81a75ed16b7a5412525 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 17:52:00 +0000 Subject: [PATCH 090/647] patch 9.2.0764: Compiler warning about unused function Problem: Compiler warning about unused function (Tony Mechelynck, after v9.2.0762) Solution: Add ifdefs Signed-off-by: Christian Brabandt --- src/optionstr.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/optionstr.c b/src/optionstr.c index d2ce36e76f..b656288cb5 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -1131,6 +1131,7 @@ did_set_ambiwidth(optset_T *args UNUSED) return check_chars_options(); } +#if defined(FEAT_TABPANEL) || defined(FEAT_DIFF) || defined(FEAT_PROP_POPUP) static bool completing_value_for_subopt(optexpand_T *args, char *name_suffix) { @@ -1140,6 +1141,7 @@ completing_value_for_subopt(optexpand_T *args, char *name_suffix) return colon - args->oe_set_arg >= len && STRNCMP(colon - len, name_suffix, len) == 0; } +#endif int expand_set_ambiwidth(optexpand_T *args, int *numMatches, char_u ***matches) diff --git a/src/version.c b/src/version.c index 910a5b3910..09f4dc2c47 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 764, /**/ 763, /**/ From 8819c1514003dbe9488d8526d5517860f0be9a1d Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 2 Jul 2026 17:59:24 +0000 Subject: [PATCH 091/647] patch 9.2.0765: popup: opacity popup over a terminal is not cleared when moved Problem: A semi-transparent (opacity) popup shown over a terminal window leaves its old cells on screen when it is moved or its text changes, and typing in the terminal makes them accumulate. Only a full redraw (CTRL-L) clears them. Solution: When redrawing the background under an opacity popup, force a full repaint of an underlying terminal window so the blend uses the terminal's true background instead of stale, already-blended cells. fixes: #20679 closes: #20688 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 21 ++++++++--- .../Test_popupwin_opacity_term_move_1.dump | 12 ++++++ .../Test_popupwin_opacity_term_move_2.dump | 12 ++++++ src/testdir/test_popupwin.vim | 37 +++++++++++++++++++ src/version.c | 2 + 5 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/testdir/dumps/Test_popupwin_opacity_term_move_1.dump create mode 100644 src/testdir/dumps/Test_popupwin_opacity_term_move_2.dump diff --git a/src/popupwin.c b/src/popupwin.c index 849849f827..96fa7895a1 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -6132,7 +6132,7 @@ redraw_win_under_opacity_popup(win_T *wp) // Check across the full width of the popup to find all underlying // windows (e.g., when the popup spans a vertical split). for (col = wp->w_wincol; - col < wp->w_wincol + width && col < screen_Columns; ++col) + col < wp->w_wincol + width && col < screen_Columns; ++col) { int line_cp = r; int col_cp = col; @@ -6146,10 +6146,21 @@ redraw_win_under_opacity_popup(win_T *wp) { linenr_T lnum; - (void)mouse_comp_pos(twp, &line_cp, &col_cp, &lnum, NULL); - // Called from inside update_screen(); raising must_redraw - // would loop the outer redraw indefinitely. - redraw_win_range_now(twp, lnum, lnum); +#ifdef FEAT_TERMINAL + // A terminal only repaints vterm-damaged rows; force a + // full repaint so the opacity blend sees the true + // background, not stale blended cells. + if (term_do_update_window(twp)) + twp->w_redr_type = UPD_NOT_VALID; + else +#endif + { + (void)mouse_comp_pos(twp, &line_cp, &col_cp, &lnum, + NULL); + // Called from inside update_screen(); raising + // must_redraw would loop the outer redraw indefinitely. + redraw_win_range_now(twp, lnum, lnum); + } } else if (line_cp == twp->w_height) // Status bar line: mark for redraw to prevent diff --git a/src/testdir/dumps/Test_popupwin_opacity_term_move_1.dump b/src/testdir/dumps/Test_popupwin_opacity_term_move_1.dump new file mode 100644 index 0000000000..46714d08b0 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_opacity_term_move_1.dump @@ -0,0 +1,12 @@ +|v+0&#ffffff0|i|m|>| > @69 +@75 +@75 +@75 +@9|A+0#0000001#ffffff255|B|C| +0#0000000#ffffff0@62 +@75 +@75 +@75 +@75 +@75 +@75 +@75 diff --git a/src/testdir/dumps/Test_popupwin_opacity_term_move_2.dump b/src/testdir/dumps/Test_popupwin_opacity_term_move_2.dump new file mode 100644 index 0000000000..9a9b0f5b25 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_opacity_term_move_2.dump @@ -0,0 +1,12 @@ +|v+0&#ffffff0|i|m|>| > @69 +@75 +@75 +@75 +@12|X+0#0000001#ffffff255|Y|Z| +0#0000000#ffffff0@59 +@75 +@75 +@75 +@75 +@75 +@75 +|:|c|a|l@1| |M|o|v|e|I|t|(|)| @60 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 79f8dac39b..5e4bc5221f 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -5315,6 +5315,43 @@ func Test_popup_opacity_settext_no_leftover() call StopVimInTerminal(buf) endfunc +func Test_popup_opacity_terminal_move_no_leftover() + CheckScreendump + CheckFeature terminal + CheckUnix + + " A semi-transparent popup over a terminal used to leave the old popup + " cells behind when it moved. + let lines =<< trim END + set shell=/bin/sh noruler + unlet $PROMPT_COMMAND + let $PS1 = 'vim> ' + terminal ++curwin + call popup_create('ABC', + \ #{line: 5, col: 10, highlight: 'None', opacity: 30}) + func MoveIt() + let id = popup_list()[0] + call popup_settext(id, 'XYZ') + call popup_setoptions(id, #{col: popup_getpos(id).col + 3}) + endfunc + END + call writefile(lines, 'XtestPopupOpacityTermMove', 'D') + let buf = RunVimInTerminal('-S XtestPopupOpacityTermMove', + \ #{rows: 12, wait_for_ruler: 0}) + call WaitForAssert({-> assert_match('ABC', term_getline(buf, 5))}) + call VerifyScreenDump(buf, 'Test_popupwin_opacity_term_move_1', {}) + + " Move the popup and change its text: the old "ABC" cells must be cleared. + call term_sendkeys(buf, "\:call MoveIt()\") + call WaitForAssert({-> assert_match('XYZ', term_getline(buf, 5))}) + call VerifyScreenDump(buf, 'Test_popupwin_opacity_term_move_2', {}) + + " clean up + call term_sendkeys(buf, "\:qa!\") + call WaitForAssert({-> assert_equal("finished", term_getstatus(buf))}) + exe buf .. 'bwipe!' +endfunc + func Test_popup_opacity_terminal_no_freeze() CheckFeature terminal CheckUnix diff --git a/src/version.c b/src/version.c index 09f4dc2c47..dd14dedba2 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 765, /**/ 764, /**/ From e068a12f9fde92079b1770dd8bc2df6867dec7ef Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Thu, 2 Jul 2026 18:28:59 +0000 Subject: [PATCH 092/647] patch 9.2.0766: quick_tab entries for empty letters point to the wrong index Problem: Letters with no options (like "y" and "z") have their quick_tab entry left at 0, so lookups for those letters start scanning at options[0] instead of failing fast. Solution: Set entries for letters with no option names to the last-option index, so such lookups stop immediately (Illia Bobyr) closes: #20684 Signed-off-by: Illia Bobyr Signed-off-by: Christian Brabandt --- src/option.c | 12 +++++++++++- src/version.c | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/option.c b/src/option.c index d15cc3f3c5..9d291d1809 100644 --- a/src/option.c +++ b/src/option.c @@ -5587,9 +5587,19 @@ findoption(char_u *arg) // letter. There are 26 letters, plus the first "t_" option. if (quick_tab[1] == 0) { + // Make sure we do not leave any entries uninitialized, even if we have + // no options that start with a particular letter. + int last_opt_idx; + for (last_opt_idx = 0; options[last_opt_idx].fullname != NULL; + last_opt_idx++) + ; + for (int tab_idx = 1; tab_idx < 27; tab_idx++) + quick_tab[tab_idx] = last_opt_idx; + p = options[0].fullname; - for (opt_idx = 1; (s = options[opt_idx].fullname) != NULL; opt_idx++) + for (opt_idx = 1; opt_idx < last_opt_idx; opt_idx++) { + s = options[opt_idx].fullname; if (s[0] != p[0]) { if (s[0] == 't' && s[1] == '_') diff --git a/src/version.c b/src/version.c index dd14dedba2..2c531eb5bc 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 766, /**/ 765, /**/ From 02f2745e2757f8353e2e76db130682ed966f5544 Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Thu, 2 Jul 2026 18:40:03 +0000 Subject: [PATCH 093/647] patch 9.2.0767: legacy/vim9cmd modifiers do not set script version for options values Problem: legacy/vim9cmd modifiers do not set script version for options values Solution: Set the correct script version depending on command modifier flags (Illia Bobyr) When remembering script context for an option value we should consider flags "CMOD_LEGACY" and "CMOD_VIM9CMD" set in "cmdmod.cmd_flags" by the ":legacy" and ":vim9cmd" command prefixes. Otherwise, if an option value is an expression, it might be evaluated in an incorrect context. closes: #20683 Signed-off-by: Illia Bobyr Signed-off-by: Christian Brabandt --- src/option.c | 8 ++++++++ src/testdir/test_vim9_cmd.vim | 37 +++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 47 insertions(+) diff --git a/src/option.c b/src/option.c index 9d291d1809..9a869fdb9b 100644 --- a/src/option.c +++ b/src/option.c @@ -3498,6 +3498,14 @@ set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx) if (!(opt_flags & OPT_MODELINE)) new_script_ctx.sc_lnum += SOURCING_LNUM; + // ":legacy" and ":vim9cmd" change the execution context of an option. + if (cmdmod.cmod_flags & CMOD_VIM9CMD) + new_script_ctx.sc_version = SCRIPT_VERSION_VIM9; + if (cmdmod.cmod_flags & CMOD_LEGACY) + // It is a bit confusing, but "MAX" is actually the legacy Vim script + // version before Vim9. + new_script_ctx.sc_version = SCRIPT_VERSION_MAX; + // Remember where the option was set. For local options need to do that // in the buffer or window structure. if (both || (opt_flags & OPT_GLOBAL) || (indir & (PV_BUF|PV_WIN)) == 0) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index cec81f3ed6..1f421e2a4c 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -97,6 +97,43 @@ def Test_vim9cmd() v9.CheckScriptFailure(lines, 'E1017:') enddef +def Test_legacy_vim9cmd_preserved_by_options() + # Make sure that "legacy" and "vim9cmd" prefix affects value of an option that + # is a script expression. + + var lines: list + + lines =<< trim END + vim9script + try + legacy set indentexpr='a'.'b'=='ab' + set debug=throw + normal O + finally + set debug& indentexpr& + endtry + END + # "'a'.'b'=='ab'" evaluated as a Vim9 expression produces: + # + # > E1030: Using a String as a Number: "a" + v9.CheckScriptSuccess(lines) + + lines =<< trim END + try + vim9cmd set indentexpr=type((x)\ =>\ x)\ ==\ v:t_func\ ?\ 1\ :\ 0 + set debug=throw + normal O + finally + set debug& indentexpr& + endtry + END + # "type((x) => x) == v:t_func ? 1 : 0" evaluated as a legacy expression + # produces: + # + # > E121: Undefined variable: x + v9.CheckScriptSuccess(lines) +enddef + def Test_defcompile_fails() assert_fails('defcompile NotExists', 'E1061:') assert_fails('defcompile debug debug Test_defcompile_fails', 'E488:') diff --git a/src/version.c b/src/version.c index 2c531eb5bc..da6de93048 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 767, /**/ 766, /**/ From a9b46d323b16673d6b26360ef7907afb1b19cd0f Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Thu, 2 Jul 2026 18:51:04 +0000 Subject: [PATCH 094/647] patch 9.2.0768: legacy/vim9cmd modifiers are not exclusive Problem: legacy/vim9cmd modifiers are not exclusive Solution: when parsing command modifiers clear the other flag (Illia Bobyr) When one of the ":legacy" or ":vim9cmd" prefixes is used, it sets a flag. As the rest of the code might check either of the flags, setting both could produce confusing results. It does not make a lot of sense to use both prefixes in the same command. But just in case it is used, selecting the last prefix seems reasonable. closes: #20682 Signed-off-by: Illia Bobyr Signed-off-by: Christian Brabandt --- src/ex_docmd.c | 6 ++++++ src/testdir/test_vim9_cmd.vim | 17 +++++++++++++++++ src/version.c | 2 ++ 3 files changed, 25 insertions(+) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index e716613ec2..55db2d8d4d 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -3092,6 +3092,9 @@ parse_command_modifiers( _(e_legacy_must_be_followed_by_command); return FAIL; } + // Make sure we do not have both legacy and Vim9 + // flags set at the same time. + cmod->cmod_flags &= ~CMOD_VIM9CMD; cmod->cmod_flags |= CMOD_LEGACY; continue; } @@ -3177,6 +3180,9 @@ parse_command_modifiers( _(e_vim9cmd_must_be_followed_by_command); return FAIL; } + // Make sure we do not have both legacy and Vim9 + // flags set at the same time. + cmod->cmod_flags &= ~CMOD_LEGACY; cmod->cmod_flags |= CMOD_VIM9CMD; continue; } diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index 1f421e2a4c..8eaa2a875a 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -134,6 +134,23 @@ def Test_legacy_vim9cmd_preserved_by_options() v9.CheckScriptSuccess(lines) enddef +def Test_legacy_vim9cmd_exclusive() + # Make sure that only one of the "legacy" or "vim9cmd" prefixes is applied. + + # Invalid as vim9syntax. + call assert_fails("legacy vim9cmd echo 'a' . 'b'", 'E15:') + call assert_fails("legacy vim9cmd legacy vim9cmd echo 'a' . 'b'", 'E15:') + + # Invalid legacy syntax. + call assert_fails("vim9cmd legacy echo (x) => x", 'E121:') + call assert_fails("vim9cmd legacy vim9cmd legacy echo (x) => x", 'E121:') + + # Validate legacy/vim9 syntax being used. + call assert_equal('ab', trim(execute("vim9cmd legacy echo 'a' . 'b'"))) + call assert_equal('true', + execute('legacy vim9cmd echo type((x) => x) == v:t_func')->trim()) +enddef + def Test_defcompile_fails() assert_fails('defcompile NotExists', 'E1061:') assert_fails('defcompile debug debug Test_defcompile_fails', 'E488:') diff --git a/src/version.c b/src/version.c index da6de93048..d9a2c33100 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 768, /**/ 767, /**/ From 2a63f748f33a15f861b530af6e320c34ab810399 Mon Sep 17 00:00:00 2001 From: Manoj Panda Date: Thu, 2 Jul 2026 19:10:36 +0000 Subject: [PATCH 095/647] patch 9.2.0769: conversion to utf-16be using iconv is inconsistent Problem: enc_canonize function changes utf-16be to utf-16 but in linux type utf-16 defaults to utf-16le. Solution: Creating a separate entry for utf-16be in enc_canon_table. Note: the effect is only visible on iconv implementations that treat "utf-16" and "utf-16be" differently, so the test does not necessarily fail on an unpatched Vim (Manoj Panda) closes: #20681 Signed-off-by: Manoj Panda Signed-off-by: Christian Brabandt --- src/mbyte.c | 88 ++++++++++++++++++++------------------- src/testdir/test_blob.vim | 26 ++++++++++++ src/version.c | 2 + 3 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/mbyte.c b/src/mbyte.c index 8370c3fa21..db58ad5d3c 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -218,95 +218,97 @@ enc_canon_table[] = {"ucs-2le", ENC_UNICODE + ENC_ENDIAN_L + ENC_2BYTE, 0}, #define IDX_UTF16 19 {"utf-16", ENC_UNICODE + ENC_ENDIAN_B + ENC_2WORD, 0}, -#define IDX_UTF16LE 20 +#define IDX_UTF16BE 20 + {"utf-16be", ENC_UNICODE + ENC_ENDIAN_B + ENC_2WORD, 0}, +#define IDX_UTF16LE 21 {"utf-16le", ENC_UNICODE + ENC_ENDIAN_L + ENC_2WORD, 0}, -#define IDX_UCS4 21 +#define IDX_UCS4 22 {"ucs-4", ENC_UNICODE + ENC_ENDIAN_B + ENC_4BYTE, 0}, -#define IDX_UCS4LE 22 +#define IDX_UCS4LE 23 {"ucs-4le", ENC_UNICODE + ENC_ENDIAN_L + ENC_4BYTE, 0}, // For debugging DBCS encoding on Unix. -#define IDX_DEBUG 23 +#define IDX_DEBUG 24 {"debug", ENC_DBCS, DBCS_DEBUG}, -#define IDX_EUC_JP 24 +#define IDX_EUC_JP 25 {"euc-jp", ENC_DBCS, DBCS_JPNU}, -#define IDX_SJIS 25 +#define IDX_SJIS 26 {"sjis", ENC_DBCS, DBCS_JPN}, -#define IDX_EUC_KR 26 +#define IDX_EUC_KR 27 {"euc-kr", ENC_DBCS, DBCS_KORU}, -#define IDX_EUC_CN 27 +#define IDX_EUC_CN 28 {"euc-cn", ENC_DBCS, DBCS_CHSU}, -#define IDX_EUC_TW 28 +#define IDX_EUC_TW 29 {"euc-tw", ENC_DBCS, DBCS_CHTU}, -#define IDX_BIG5 29 +#define IDX_BIG5 30 {"big5", ENC_DBCS, DBCS_CHT}, // MS-DOS and MS-Windows codepages are included here, so that they can be // used on Unix too. Most of them are similar to ISO-8859 encodings, but // not exactly the same. -#define IDX_CP437 30 +#define IDX_CP437 31 {"cp437", ENC_8BIT, 437}, // like iso-8859-1 -#define IDX_CP737 31 +#define IDX_CP737 32 {"cp737", ENC_8BIT, 737}, // like iso-8859-7 -#define IDX_CP775 32 +#define IDX_CP775 33 {"cp775", ENC_8BIT, 775}, // Baltic -#define IDX_CP850 33 +#define IDX_CP850 34 {"cp850", ENC_8BIT, 850}, // like iso-8859-4 -#define IDX_CP852 34 +#define IDX_CP852 35 {"cp852", ENC_8BIT, 852}, // like iso-8859-1 -#define IDX_CP855 35 +#define IDX_CP855 36 {"cp855", ENC_8BIT, 855}, // like iso-8859-2 -#define IDX_CP857 36 +#define IDX_CP857 37 {"cp857", ENC_8BIT, 857}, // like iso-8859-5 -#define IDX_CP860 37 +#define IDX_CP860 38 {"cp860", ENC_8BIT, 860}, // like iso-8859-9 -#define IDX_CP861 38 +#define IDX_CP861 39 {"cp861", ENC_8BIT, 861}, // like iso-8859-1 -#define IDX_CP862 39 +#define IDX_CP862 40 {"cp862", ENC_8BIT, 862}, // like iso-8859-1 -#define IDX_CP863 40 +#define IDX_CP863 41 {"cp863", ENC_8BIT, 863}, // like iso-8859-8 -#define IDX_CP865 41 +#define IDX_CP865 42 {"cp865", ENC_8BIT, 865}, // like iso-8859-1 -#define IDX_CP866 42 +#define IDX_CP866 43 {"cp866", ENC_8BIT, 866}, // like iso-8859-5 -#define IDX_CP869 43 +#define IDX_CP869 44 {"cp869", ENC_8BIT, 869}, // like iso-8859-7 -#define IDX_CP874 44 +#define IDX_CP874 45 {"cp874", ENC_8BIT, 874}, // Thai -#define IDX_CP932 45 +#define IDX_CP932 46 {"cp932", ENC_DBCS, DBCS_JPN}, -#define IDX_CP936 46 +#define IDX_CP936 47 {"cp936", ENC_DBCS, DBCS_CHS}, -#define IDX_CP949 47 +#define IDX_CP949 48 {"cp949", ENC_DBCS, DBCS_KOR}, -#define IDX_CP950 48 +#define IDX_CP950 49 {"cp950", ENC_DBCS, DBCS_CHT}, -#define IDX_CP1250 49 +#define IDX_CP1250 50 {"cp1250", ENC_8BIT, 1250}, // Czech, Polish, etc. -#define IDX_CP1251 50 +#define IDX_CP1251 51 {"cp1251", ENC_8BIT, 1251}, // Cyrillic // cp1252 is considered to be equal to latin1 -#define IDX_CP1253 51 +#define IDX_CP1253 52 {"cp1253", ENC_8BIT, 1253}, // Greek -#define IDX_CP1254 52 +#define IDX_CP1254 53 {"cp1254", ENC_8BIT, 1254}, // Turkish -#define IDX_CP1255 53 +#define IDX_CP1255 54 {"cp1255", ENC_8BIT, 1255}, // Hebrew -#define IDX_CP1256 54 +#define IDX_CP1256 55 {"cp1256", ENC_8BIT, 1256}, // Arabic -#define IDX_CP1257 55 +#define IDX_CP1257 56 {"cp1257", ENC_8BIT, 1257}, // Baltic -#define IDX_CP1258 56 +#define IDX_CP1258 57 {"cp1258", ENC_8BIT, 1258}, // Vietnamese -#define IDX_MACROMAN 57 +#define IDX_MACROMAN 58 {"macroman", ENC_8BIT + ENC_MACROMAN, 0}, // Mac OS -#define IDX_DECMCS 58 +#define IDX_DECMCS 59 {"dec-mcs", ENC_8BIT, 0}, // DEC MCS -#define IDX_HPROMAN8 59 +#define IDX_HPROMAN8 60 {"hp-roman8", ENC_8BIT, 0}, // HP Roman8 -#define IDX_COUNT 60 +#define IDX_COUNT 61 }; /* @@ -345,8 +347,8 @@ enc_alias_table[] = {"ucs-2be", IDX_UCS2}, {"ucs2le", IDX_UCS2LE}, {"utf16", IDX_UTF16}, - {"utf16be", IDX_UTF16}, - {"utf-16be", IDX_UTF16}, + {"utf16be", IDX_UTF16BE}, + {"utf-16be", IDX_UTF16BE}, {"utf16le", IDX_UTF16LE}, {"ucs4", IDX_UCS4}, {"ucs4be", IDX_UCS4}, diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim index 34a5cb7509..c9917e53b4 100644 --- a/src/testdir/test_blob.vim +++ b/src/testdir/test_blob.vim @@ -938,4 +938,30 @@ func Test_blob2str_multi_byte_encodings() call assert_equal(['A', 'B'], blob2str(0z41000000.0A000000.42000000, {'encoding': 'utf-32le'})) endfunc +func Test_blob_utf16be_encoding() + CheckFeature iconv + + " Write utf-16be + new + setl nobomb + call setline(1, "A\u3042") + write ++enc=utf-16be ++ff=unix Xutf16be + defer delete('Xutf16be') + bwipe! + + let bytes = readblob('Xutf16be') + " 'A' = U+0041 -> 00 41 (BE), U+3042 -> 30 42 (BE) + call assert_equal(0z0041.3042, bytes[0:3]) + + " iconv + let s = "A\u3042Z" + let be = iconv(s, 'utf-8', 'utf-16be') + if be == s + " iconv lacks utf-16be support + return + endif + call assert_equal(s, iconv(be, 'utf-16be', 'utf-8')) + call assert_notequal(be, iconv(s, 'utf-8', 'utf-16le')) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index d9a2c33100..0b3f91193a 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 769, /**/ 768, /**/ From 7f6fd6be897485130a595536f095370e48e4c6f2 Mon Sep 17 00:00:00 2001 From: Mao-Yining Date: Thu, 2 Jul 2026 19:24:19 +0000 Subject: [PATCH 096/647] translation(zh_CN): Add Chinese man pages Problem: No Simplified Chinese man pages. Solution: Add Simplified Chinese translations of man pages. closes: #19464 Co-Authored-By: yianwillis Signed-off-by: Mao-Yining Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 5 + Filelist | 1 + runtime/doc/evim-zh_CN.UTF-8.1 | 53 +++ runtime/doc/vim-zh_CN.UTF-8.1 | 570 +++++++++++++++++++++++++++++ runtime/doc/vimdiff-zh_CN.UTF-8.1 | 44 +++ runtime/doc/vimtutor-zh_CN.UTF-8.1 | 104 ++++++ runtime/doc/xxd-zh_CN.UTF-8.1 | 417 +++++++++++++++++++++ 7 files changed, 1194 insertions(+) create mode 100644 runtime/doc/evim-zh_CN.UTF-8.1 create mode 100644 runtime/doc/vim-zh_CN.UTF-8.1 create mode 100644 runtime/doc/vimdiff-zh_CN.UTF-8.1 create mode 100644 runtime/doc/vimtutor-zh_CN.UTF-8.1 create mode 100644 runtime/doc/xxd-zh_CN.UTF-8.1 diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 072f69aeb6..6fdafa0945 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -134,6 +134,11 @@ runtime/doc/vimtutor-ru.1 @RestorerZ runtime/doc/vimtutor-ru.UTF-8.1 @RestorerZ runtime/doc/xxd-ru.1 @RestorerZ runtime/doc/xxd-ru.UTF-8.1 @RestorerZ +runtime/doc/evim-zh_CN.UTF-8.1 @mao-yining +runtime/doc/vim-zh_CN.UTF-8.1 @mao-yining +runtime/doc/vimdiff-zh_CN.UTF-8.1 @mao-yining +runtime/doc/vimtutor-zh_CN.UTF-8.1 @mao-yining +runtime/doc/xxd-zh_CN.UTF-8.1 @mao-yining runtime/ftplugin/abaqus.vim @costerwi runtime/ftplugin/abnf.vim @A4-Tacks runtime/ftplugin/algol68.vim @dkearns diff --git a/Filelist b/Filelist index c073e1ad6d..aedb16a7ff 100644 --- a/Filelist +++ b/Filelist @@ -1133,6 +1133,7 @@ LANG_GEN = \ runtime/doc/*-sv.UTF-8.1 \ runtime/doc/*-tr.1 \ runtime/doc/*-tr.UTF-8.1 \ + runtime/doc/*-zh_CN.UTF-8.1 \ runtime/lang/README.txt \ runtime/lang/Makefile \ runtime/lang/Make_all.mak \ diff --git a/runtime/doc/evim-zh_CN.UTF-8.1 b/runtime/doc/evim-zh_CN.UTF-8.1 new file mode 100644 index 0000000000..d91c337b1e --- /dev/null +++ b/runtime/doc/evim-zh_CN.UTF-8.1 @@ -0,0 +1,53 @@ +.TH EVIM 1 "2024 August 12" +.SH 名称 +evim \- 简易 Vim ,使用 Vim 编辑文件并设置为无模式编辑 +.SH 概述 +.br +.B evim +[选项] [文件 ..] +.br +.B eview +.SH 描述 +.B eVim +启动 +.B Vim +并设置选项,使其行为类似于无模式编辑器。 +这仍然是 Vim ,但作为点击式编辑器使用。 +体验很像在 MS-Windows 上使用记事本。 +.B eVim +将始终在 GUI 中运行,以启用菜单和工具栏。 +.PP +仅适用于那些确实无法以正常方式使用 Vim 的人。 +编辑效率会低得多。 +.PP +.B eview +功能相同,但以只读模式启动。其工作方式与 evim \-R 相同。 +.PP +有关 Vim 、选项等的详细信息,请参见 vim(1)。 +.PP +选项 'insertmode' 被开启,以便能够直接输入文本。 +.br +设置相应映射,使复制和粘贴使用类似 MS-Windows 的快捷键。 +CTRL-X 剪切文本,CTRL-C 复制文本,CTRL-V 粘贴文本。 +使用 CTRL-Q 可用于执行 CTRL-V 的原生功能。 +.SH 选项 +参见 vim(1)。 +.SH 文件 +.TP 15 +/usr/local/share/vim/vim??/evim.vim +用于初始化 eVim 的脚本。 +.br +.I vim?? +是短版本号,如 vim91 代表 +.B Vim 9.1 +.SH 别名 +也被称为 “傻瓜版Vim”。 +使用 evim 时,你应该拿一块手帕, +在每个角上打一个结,然后戴在头上。 +.SH 另见 +vim(1) +.SH 作者 +绝大多数 +.B Vim +代码由 Bram Moolenaar 完成,并得到了众多人士的大力协助。 +参见 “帮助” 菜单中的 “致谢”。 diff --git a/runtime/doc/vim-zh_CN.UTF-8.1 b/runtime/doc/vim-zh_CN.UTF-8.1 new file mode 100644 index 0000000000..86514eec2a --- /dev/null +++ b/runtime/doc/vim-zh_CN.UTF-8.1 @@ -0,0 +1,570 @@ +.TH VIM 1 "2025 Jun 27" +.SH 名称 +vim \- Vi 改进版 (Vi IMproved),一个面向程序员的文本编辑器 +.SH 概述 +.br +.B vim +[options] [file ..] +.br +.B vim +[options] \- +.br +.B vim +[options] \-t tag +.br +.B vim +[options] \-q [errorfile] +.PP +.br +.B ex +.br +.B view +.br +.B gvim +.B gview +.B evim +.B eview +.br +.B rvim +.B rview +.B rgvim +.B rgview +.SH 描述 +.B Vim +是一个向上兼容 Vi 的文本编辑器。 +它可用于编辑各种纯文本文件。 +它在编辑程序方面尤为有用。 +.PP +相较于 Vi,它有许多增强功能: 多级撤销、多窗口与多缓冲区、语法高亮、命令行编辑、文件名补全、在线帮助、可视化选择等。 +关于 +.B Vim +与 Vi 之间差异的概要,请参见 ":help vi_diff.txt"。 +.PP +在运行 +.B Vim +时,可以通过 ":help" 命令从在线帮助系统中获取大量帮助信息。 +请参见下文的 "在线帮助" 章节。 +.PP +通常, +.B Vim +用于编辑单个文件,可通过以下命令启动: +.PP + vim file +.PP +更一般地, +.B Vim +可通过以下方式启动: +.PP + vim [options] [filelist] +.PP +如果未提供 filelist,编辑器将以一个空缓冲区启动。 +否则,可使用下列四种方式之一来选择一个或多个要编辑的文件。 +.TP 12 +file .. +文件名列表。 +第一个文件将作为当前文件,并被读入缓冲区。 +光标将定位在缓冲区的第一行。 +可使用 ":next" 命令切换到其他文件。 +如果要编辑以连字符开头的文件,请在文件列表前加 "\-\-"。 +.TP +\- +要编辑的文件从标准输入 (stdin) 读取。命令从标准错误 (stderr) 读取,该设备应为终端 (tty)。 +.TP +\-t {tag} +根据指定 "tag" 来选择要编辑的文件以及初始光标位置,相当于标签跳转。 +会在 tags 文件中查找 {tag},关联的文件会成为当前文件,并执行关联的命令。 +这通常用于 C 程序,此时 {tag} 可以是函数名。 +效果是包含该函数的文件成为当前文件,光标会定位到该函数的起始处。 +参见 ":help tag\-commands"。 +.TP +\-q [errorfile] +以快速修复模式启动。 +读取 [errorfile] 文件并显示第一个错误。 +省略 [errorfile] 时,从 "errorfile" 选项获取文件名 (在 Amiga 上缺省为"AztecC.Err",在其他系统上默认为 "errors.err")。 +可使用 ":cn" 命令跳转到后续错误。 +参见 "help quickfix"。 +.PP +.B Vim +的行为会因命令名称而异 (实际可执行文件可能仍是同一个)。 +.TP 10 +vim +"正常" 方式,全部使用缺省设置。 +.TP +ex +以 Ex 模式启动。 +使用 ":vi" 命令进入普通模式。 +也可使用 "\-e" 参数实现。 +.TP +view +以只读模式启动,防止对文件进行写入。 +也可使用 "\-R" 参数实现。 +.TP +gvim gview +图形界面版本。 +启动一个新窗口。 +也可使用 "\-g" 参数实现。 +.TP +evim eview +图形界面版本的简易模式。 +启动一个新窗口。 +也可使用 "\-y" 参数实现。 +.TP +rvim rview rgvim rgview +与以上类似,但带有限制。不能启动外壳命令,也不能挂起 +.B Vim +。也可使用 "\-Z" 参数实现。 +.SH 选项 +选项可以以任意顺序给出,位于文件名之前或之后。 +无参数的选项可在一个短横后合并 (例如 "\-abc")。 +.TP 12 ++[num] +对于第一个文件,光标将定位到第 "num" 行。 +"num" 省略时,光标将定位到最后一行。 +.TP ++/{pat} +对于第一个文件,光标将定位到首次出现 {pat} 的那一行。 +可用的搜索模式参见 ":help search\-pattern"。 +.TP ++{command} +.TP +\-c {command} +在读取第一个文件后执行 {command}。 +{command} 被解释为 Ex 命令。 +{command} 含有空格时,必须用双引号括起来 (具体取决于所用的外壳)。 +示例: vim "+set si" main.c +.br +注意: 最多可使用 10 个 "+" 或 "\-c" 命令。 +.TP +\-A +如果 +.B Vim +编译时加入 ARABIC 支持 (用于编辑从右到左的文件并提供阿拉伯键盘映射), +此选项将以阿拉伯模式启动 +.B +Vim +,即置位 'arabic'。否则会给出错误信息并且 +.B Vim +退出。 +.TP +\-b +二进制模式。 +将设置一些选项,以便编辑二进制或可执行文件。 +.TP +\-C +兼容模式。置位 'compatible' 选项。 +这将使 +.B Vim +大体表现得像 Vi,即使存在 .vimrc 文件也是如此。 +.TP +\-d +以比较模式启动。 +应提供两到八个文件名参数。 +.B Vim +会打开所有文件并显示它们之间的差异。 +作用与 vimdiff(1) 类似。 +.TP +\-d {device}, \-dev {device} +打开 {device} 作为终端使用。 +仅在 Amiga 上可用。 +示例: +"\-d con:20/30/600/150"。 +.TP +\-D +调试。在执行脚本的第一条命令时进入调试模式。 +.TP +\-e +以 +.B Vim +的 Ex 模式启动,就像可执行文件名为 "ex" 一样。 +.TP +\-E +以 +.B Vim +的增强 Ex 模式启动,就像可执行文件名为 "exim" 一样。 +.TP +\-f +前台。对于 GUI 版本, +.B Vim +不会分叉 (fork) 并从启动时的外壳分离。 +在 Amiga 上, +.B Vim +不会重启以打开新窗口。 +当 +.B Vim +由会等待编辑会话结束的程序 (例如邮件程序) 执行时,应使用此选项。 +在 Amiga 上,无法使用 ":sh" 和 ":!" 命令。 +.TP +\-F +如果 +.B Vim +编译时加入 FKMAP 支持 (用于编辑从右到左的文件并提供波斯语键盘映射), +此选项将以波斯语模式启动 +.B Vim +,即置位 'fkmap' 和 'rightleft'。 +否则会给出错误信息并且 +.B Vim +退出。 +.br +注意: 波斯语支持已在补丁 8.1.0932 中移除。 +.TP +\-g +如果 +.B Vim +编译时加入 GUI 支持,此选项会启用 GUI。 +如果未编译 GUI 支持,会给出错误信息并且 +.B Vim +退出。 +.TP +\-H +如果 +.B Vim +编译时加入 RIGHTLEFT 支持 (用于编辑从右到左的文件并提供希伯来语键盘映射), +此选项将以希伯来模式启动 +.B Vim +,即置位 'hkmap' 和 'rightleft'。 +否则会给出错误信息并且 +.B Vim +退出。 +.TP +\-i {viminfo} +指定读取或写入 viminfo 文件时使用的文件名,替代默认的 "~/.viminfo"。 +也可通过指定名称 "NONE" 来跳过使用 .viminfo 文件。 +.TP +\-l +Lisp 模式。 +开启 'lisp' 和 'showmatch' 选项。 +.TP +\-L +等同于 \-r。 +.TP +\-m +禁用文件修改。 +复位 'write' 选项。 +仍可修改缓冲区,但无法写入文件。 +.TP +\-M +不允许修改。将复位 'modifiable' 和 'write' 选项,以禁止更改并防止写入文件。 +注意这些选项之后可以被重新置位,以再次允许进行修改。 +.TP +\-n +不使用交换文件。 +发生崩溃后无法恢复。 +适用于在非常慢的介质 (例如软盘) 上编辑文件。 +也可通过 ":set uc=0" 实现。 +可通过 ":set uc=200" 撤销。 +.TP +\-N +非兼容模式。复位 'compatible' 选项。 +这会使 +.B Vim +表现得更好,但与 Vi 的兼容性稍差,即使不存在 .vimrc 文件也会如此。 +.TP +\-nb +成为 NetBeans 的编辑器服务器。详见文档。 +.TP +\-o[N] +打开 N 个垂直堆叠的窗口。 +N 省略时,为每个文件打开一个窗口。 +.TP +\-O[N] +打开 N 个并排窗口。 +N 省略时,为每个文件打开一个窗口。 +.TP +\-p[N] +] 打开 N 个标签页。 +N 省略时,为每个文件打开一个标签页。 +.TP +\-P {parent-title} +仅限 Win32 GUI: 指定父应用程序的标题。若可能,Vim 将在该应用程序内的 MDI 窗口 +中运行。{parent-title} 必须出现在父应用窗口标题中,且需足够具体。 +注意实现仍较为原始;并非所有应用都可用,菜单也不可用。 +.TP +\-r +列出交换文件,并提供关于恢复时使用它们的信息。 +.TP +\-r {file} +恢复模式。 +使用交换文件恢复崩溃的编辑会话。 +交换文件与文本文件同名,但附加后缀为 ".swp"。 +参见 ":help recovery"。 +.TP +\-R +只读模式。 +将置位 'readonly' 选项。 +仍可编辑缓冲区,但会防止意外覆盖文件。 +如果确需覆盖文件,请在 Ex 命令后添加感叹号,例如 ":w!"。 +\-R 选项也隐含 \-n 选项 (见上文)。 +可用 ":set noro" 来复位 'readonly' 选项。 +参见 ":help 'readonly'"。 +.TP +\-s +静默模式。仅当以 "Ex" 启动或在 "\-e" 选项之后给出 "\-s" 选项时有效。 +.TP +\-s {scriptin} +读取脚本文件 {scriptin}。 +文件中的字符将会以键盘输入的方式进行解释。 +同样效果也可通过命令 ":source! {scriptin}" 实现。 +如果在编辑器退出前到达文件末尾,将继续从键盘读取字符。 +.TP +\-S {file} +在读取第一个文件后执行 {file}。 +等同于 \-c "source {file}"。 +{file} 不能以 '\-' 开头。 +{file} 省略时,将使用 "Session.vim" (仅当 \-S 为最后一个参数时生效)。 +.TP +\-T {terminal} +告知 +.B Vim +正在使用的终端名称。 +仅当自动检测失败时需要。 +应为 +.B Vim +已知 (内置) 或在 termcap/terminfo 文件中定义的终端。 +.TP +\-u {vimrc} +使用 {vimrc} 文件中的命令进行初始化。 +其他所有初始化将被跳过。 +用于编辑特定类型的文件。 +也可通过指定名称 "NONE" 跳过所有初始化。 +详见 Vim 内的 ":help initialization"。 +.TP +\-U {gvimrc} +使用 {gvimrc} 文件中的命令进行 GUI 初始化。 +其他所有 GUI 初始化将被跳过。 +也可通过指定名称 "NONE" 跳过所有 GUI 初始化。 +详见 Vim 内的 ":help gui\-init"。 +.TP +\-v +以 +.B Vim +的 Vi 模式启动,就像可执行文件名为 "vi" 一样。仅当可执行文件名为 "ex" 时有效。 +.TP +\-V[N] +详细模式。输出关于哪些文件被执行以及读取/写入 viminfo 文件的消息。可选数值 N +为 'verbose' 的值,缺省值为 10。 +.TP +\-V[N]{filename} +和 \-V 类似,但同时设置 'verbosefile' 为 {filename}。此时消息不显示,而写入 +{filename} 文件。{filename} 不能以数位开头。 +.TP +\-w{number} +将 'window' 选项设置为 {number}。 +.TP +\-w {scriptout} +用户输入的所有字符将被记录到文件 {scriptout},直到退出 +.B Vim +为止。如果要创建用于 "vim \-s" 或 ":source!" 的脚本文件,这很有用。 +如果 {scriptout} 文件已存在,新内容将追加到该文件末尾。 +.TP +\-W {scriptout} +和 \-w 类似,但会覆盖已存在的文件。 +.TP +\-x +如果 +.B Vim +编译时加入加密支持,写入文件时使用加密。 +会提示输入加密密钥。 +.TP +\-X +不连接到 X 服务器。在终端中可缩短启动时间,但无法使用窗口标题和剪贴板。 +.TP +\-Y +不连接到 wayland 合成器。 +.TP +\-y +以 +.B Vim +的简易模式启动,就像可执行文件名为 "evim" 或 "eview" 一样。 +使 +.B Vim +表现为点击输入式的编辑器。 +.TP +\-Z +受限模式。就像可执行文件以 "r" 开头一样。 +.TP +\-\- +标记选项结束。 +其后的参数将作为文件名处理。 +这可用于编辑以 '\-' 开头的文件名。 +.TP +\-\-clean +不使用任何个人配置 (vimrc、插件等)。用于在干净 Vim 环境下检查问题是否可复现。 +.TP +\-\-cmd {command} +和 "\-c" 类似,但在处理任何 vimrc 文件之前先执行命令。 +最多可使用 10 个此类命令,与 "\-c" 命令互不影响。 +.TP +\-\-echo\-wid +仅限 GTK GUI: 在标准输出上回显窗口 ID。 +.TP +\-\-gui\-dialog\-file {name} +使用 GUI 时,不显示对话框,而是将对话框的标题和消息写入文件 {name}。 +该文件会被创建或追加写入。仅用于测试,以避免测试卡在不可见的对话框上。 +未使用 GUI 时忽略此参数。 +.TP +\-\-help, \-h, \-? +提供关于命令行参数和选项的简要帮助。 +之后 +.B Vim +退出。 +.TP +\-\-literal +按本义处理文件名参数,不展开通配符。在 Unix 上无效,因为外壳总会展开通配符。 +.TP +\-\-log {filename} +如果 +.B Vim +编译时加入 eval 和 channel 特性,启动日志记录并将条目写入 {filename}。 +其效果类似在启动早期调用 +.I ch_logfile({filename}, 'ao')。 +.TP +\-\-nofork +前台。对于 GUI 版本, +.B Vim +不会分叉 (fork) 并从启动时的外壳分离。 +.TP +\-\-noplugin +跳过插件的加载。\-u NONE 会隐含本选项。 +.TP +\-\-not\-a\-term +告知 +.B Vim +用户知道输入和/或输出未连接到终端。这将避免出现警告及随后的两秒延迟。 +.TP +\-\-remote +连接到一个 Vim 服务器,并让其编辑后续参数中给出的文件。若未找到服务器,将给出警告并在当前 Vim 中编辑这些文件。 +.TP +\-\-remote\-expr {expr} +连接到 Vim 服务器,在其中计算 {expr} 并将结果打印到标准输出。 +.TP +\-\-remote\-send {keys} +连接到 Vim 服务器并发送 {keys}。 +.TP +\-\-remote\-silent +同 \-\-remote,但在未找到服务器时不显示警告。 +.TP +\-\-remote\-wait +同 \-\-remote,但 Vim 在文件编辑完成之前不会退出。 +.TP +\-\-remote\-wait\-silent +同 \-\-remote\-wait,但在未找到服务器时不显示警告。 +.TP +\-\-serverlist +列出可发现的所有 Vim 服务器的名称。 +.TP +\-\-servername {name} +将 {name} 用作服务器名称。用于当前 Vim,除非与 +\-\-remote 参数一起使用,此时它是要连接的服务器名称。 +若使用 socketserver 后端,且名称以 "/"、"./" 或 "../"开头,则视为指向该套接字的绝对、相对或相对路径。 +.TP +\-\-clientserver {backend} +将 {backend} 用作 clientserver 功能的后端,分别为 "socket" 或 "x11"。 +仅在编译时同时加入 socketserver 和 X11 特性时可用。 +.TP +\-\-socketid {id} +仅限 GTK GUI: 使用 GtkPlug 机制在另一个窗口中运行 gVim。 +.TP +\-\-startuptime {file} +在启动期间将计时消息写入文件 {fname}。 +.TP +\-\-ttyfail +当 stdin 或 stdout 不是终端 (tty)时,立即退出。 +.TP +\-\-version +打印版本信息并退出。 +.TP +\-\-windowid {id} +仅限 Win32 GUI: 使 gVim 尝试使用窗口 {id} 作为父窗口,从而在该窗口内运行。 +.SH 在线帮助 +在 +.B Vim +中输入 ":help" 即可开始使用帮助系统。 +输入 ":help 主题" 可以查看某个特定主题的帮助。 +例如: 输入 ":help ZZ" 可查看 "ZZ" 命令的帮助。 +使用 和 CTRL-D 可以补全主题名称 (参见 ":help cmdline-completion")。 +文档中包含标签,可在不同位置之间跳转 (类似于超文本链接,参见 ":help")。 +所有文档文件都可以通过这种方式查看,例如: +":help syntax.txt"。 +.SH 文件 +.TP 15 +/usr/local/share/vim/vim??/doc/*.txt +.B Vim +文档文件。 +可用 ":help doc\-file\-list" 获取完整文档列表。 +.br +其中, +.I vim?? +为短版本名,例如 vim91 代表 +.B Vim 9.1 +。 +.TP +/usr/local/share/vim/vim??/doc/tags +用于在文档文件中查找信息的标签文件。 +.TP +/usr/local/share/vim/vim??/syntax/syntax.vim +系统范围的语法初始化代码。 +.TP +/usr/local/share/vim/vim??/syntax/*.vim +不同语言的语法文件。 +.TP +/usr/local/share/vim/vimrc +系统范围的 +.B Vim +初始化代码。 +.TP +~/.vimrc, ~/.vim/vimrc, $XDG_CONFIG_HOME/vim/vimrc +用户个人的 +.B Vim +初始化代码 (使用首个找到的文件)。 +.TP +/usr/local/share/vim/gvimrc +系统范围的 gvim 初始化代码。 +.TP +~/.gvimrc, ~/.vim/gvimrc, $XDG_CONFIG_HOME/vim/gvimrc +用户个人的 +.B gVim +初始化代码 (使用首个找到的文件)。 +.TP +/usr/local/share/vim/vim??/optwin.vim +用于 ":options" 命令的脚本,这是一个用于查看和设置选项的便捷方式。 +.TP +/usr/local/share/vim/vim??/menu.vim +系统范围用于 +.B gVim +的菜单初始化代码。 +.TP +/usr/local/share/vim/vim??/bugreport.vim +用于生成漏洞报告的脚本。参见 ":help bugs"。 +.TP +/usr/local/share/vim/vim??/filetype.vim +用于根据文件名检测文件类型的脚本。参见 ":help 'filetype'"。 +.TP +/usr/local/share/vim/vim??/scripts.vim +用于根据文件内容检测文件类型的脚本。参见 ":help 'filetype'"。 +.TP +/usr/local/share/vim/vim??/print/*.ps +用于 PostScript 打印的文件。 +.PP +如需获取最新信息,请阅读 VIM 官方主页: +.br + +.SH 另见 +vimtutor(1) +.SH 作者 +绝大多数 +.B Vim +代码由 Bram Moolenaar 完成,同时得到许多其他人士的帮助。 +参见 +.B Vim +中的 ":help credits"。 +.br +.B Vim +基于由 Tim Thompson、Tony Andrews 和 G.R. (Fred) Walter 编写的 Stevie。 +不过,绝大多数原始代码已被重写。 +.SH 漏洞 +有可能。 +已知问题的列表可参见 ":help todo"。 +.PP +请注意,某些被认为是漏洞的现象,实际上源于对 Vi 行为的高度忠实复制。 +如果仅因为 Vi 的表现不同而认为某些行为是漏洞,请参阅 vi_diff.txt 文件 (或在Vim 中执行 :help vi_diff.txt)。 +同时请查阅 'compatible' 与 'cpoptions' 选项。 diff --git a/runtime/doc/vimdiff-zh_CN.UTF-8.1 b/runtime/doc/vimdiff-zh_CN.UTF-8.1 new file mode 100644 index 0000000000..1adf197acb --- /dev/null +++ b/runtime/doc/vimdiff-zh_CN.UTF-8.1 @@ -0,0 +1,44 @@ +.TH VIMDIFF 1 "2021 June 13" +.SH 名称 +vimdiff \- 使用 Vim 同时编辑二至八个版本的文件并显示差异 +.SH 概述 +.br +.B vimdiff +[选项] 文件1 文件2 [文件3 [文件4 [文件5 [文件6 [文件7 [文件8]]]]]] +.PP +.B gvimdiff +.SH 描述 +.B Vimdiff +会启动 +.B Vim +并同时打开二到八个文件。 +每个文件各占一个窗口。 +文件之间的差异会被高亮显示。 +这可以很方便的检查变更以及在不同版本间同步修改。 +.PP +关于 Vim 本身的详细信息,请参见 vim(1)。 +.PP +若以 +.B gvimdiff +方式启动,则会启用图形界面(如果可用)。 +.PP +每个窗口都会开启 'diff' 选项,用以高亮显示差异。 +.br +选项 'wrap' 和 'scrollbind' 也会被开启,确保文本显示效果良好。 +.br +选项 'foldmethod' 被设为 "diff",这样未发生变更的行段会被自动折叠起来。 +同时 'foldcolumn' 设为 2,方便用户发现、展开和关闭折叠。 +.SH 选项 +默认使用纵向分割窗口来对齐行,效果等同于指定了 "\-O" 参数。 +若要改为横向分割,可使用 "\-o" 参数。 +.PP +其他选项请参见 vim(1)。 +.SH 另见 +vim(1) +.SH 作者 +绝大多数 +.B Vim +代码由 Bram Moolenaar 完成,并得到了众多人士的大力协助。 +参见 +.B Vim +中的 ":help credits"。 diff --git a/runtime/doc/vimtutor-zh_CN.UTF-8.1 b/runtime/doc/vimtutor-zh_CN.UTF-8.1 new file mode 100644 index 0000000000..5b7f9729af --- /dev/null +++ b/runtime/doc/vimtutor-zh_CN.UTF-8.1 @@ -0,0 +1,104 @@ +.TH VIMTUTOR 1 "2024 December 03" +.SH 名称 +vimtutor \- Vim 教程 +.SH 概述 +.br +.B vimtutor [\-l | \-\-language ISO639] [\-c | \-\-chapter 数字] [\-g | \-\-gui] [ISO639] +.br +.B vimtutor [\-h | \-\-help] +.br +.B vimtutor [\-\-list] +.SH 描述 +.B Vimtutor +会启动 +.B Vim +教程。 +.PP +.B Vimtutor +适合想要学习 +.B Vim +基本命令的初学者。 +可选的 [ISO639] 参数是语言的两个或三个字母代码, +例如 "it"(意大利语)或 "es"(西班牙语)。 +.PP +.B Vimtutor +仅打开原始教程文件的临时副本,不会覆盖课程内容。 +.PP +.B Vim +始终以 +.B Vi +不兼容模式启动。 +.SH 选项 +.TP +.BR \-l ", " \-\-language\ \fIISO639\fR +设置两个或三个字母的语言代码,例如 'it'、'es'、'bar'。 +默认使用当前区域设置对应的语言(若可用),否则使用英语。 +.TP +.BR \-c ", " \-\-chapter\ \fI数字\fR +设置章节编号,默认为第一章。 +.TP +.BR \-g ", " \-\-gui +以图形界面版本的 Vim 启动 +.B vimtutor +(若可用),否则回退到控制台版本的 Vim。 +.TP +.BR \-h ", " \-\-help +显示用法信息。 +.TP +.BR \-\-list +显示所有可用的章节和语言列表。 +.SH 示例 +以德语启动 +.B vimtutor +并进入第一章: +.PP +.nf +.RS +vimtutor de +.RE +.fi +.PP +以英语启动并进入第二章: +.PP +.nf +.RS +vimtutor -c2 +.RE +.fi +.PP +以巴伐利亚语在图形界面下启动并进入第一章(长选项格式): +.PP +.nf +.RS +vimtutor --language bar --chapter 1 --gui +.RE +.fi +.SH 文件 +.TP 15 +/usr/local/share/vim/vim??/tutor/tutor1[.language] +.B Vimtutor +第一章的文本文件。 +.TP 15 +/usr/local/share/vim/vim??/tutor/tutor2[.language] +.B Vimtutor +第二章的文本文件。 +.TP 15 +/usr/local/share/vim/vim??/tutor/tutor.vim +用于复制 +.B Vimtutor +文本文件的 +.B Vim +脚本。 +.SH 作者 +.B 《Vi 教程》 +最初由科罗拉多矿业学院的 Michael C. Pierce 和 Robert K. Ware 为 Vi 编写, +并采用了科罗拉多州立大学 Charles Smith 提供的构思。 +.B 电子邮件:bware@mines.colorado.edu(现已失效)。 +.PP +后由 Bram Moolenaar 修改为适用于 +.B Vim +的版本。 +.PP +各翻译版本的贡献者列于教程文件中。 +.SH 参见 +vim(1) diff --git a/runtime/doc/xxd-zh_CN.UTF-8.1 b/runtime/doc/xxd-zh_CN.UTF-8.1 new file mode 100644 index 0000000000..2ce5949820 --- /dev/null +++ b/runtime/doc/xxd-zh_CN.UTF-8.1 @@ -0,0 +1,417 @@ +.TH XXD 1 "Mar 2026" "Manual page for xxd" +.\" +.\" 21st May 1996 +.\" 手册页作者: +.\" Tony Nugent +.\" 由 Bram Moolenaar 修改 +.SH 名称 +.I xxd +\- 生成十六进制转储或执行反向操作 +.SH 概述 +.B xxd +\-h[elp] +.br +.B xxd +[options] [infile [outfile]] +.br +.B xxd +\-r[evert] [options] [infile [outfile]] +.SH 描述 +.I xxd +可以生成给定文件或标准输入的十六进制转储。 +它也可以将十六进制转储还原回原始的二进制形式。 +与 +.BR uuencode (1) +和 +.BR uudecode (1) +类似,它允许以"邮件安全"的 ASCII 表示形式传输二进制数据, +但其优点是可以解码到标准输出。 +此外,它还可用于执行二进制文件修补。 +.SH 选项 +如果未指定 +.I infile +,则读取标准输入。 +如果 +.I infile +指定为 +.RB \` \- ' +字符,则从标准输入读取输入。 +如果未指定 +.I outfile +(或其位置是 +.RB \` \- ' +字符),则结果发送到标准输出。 +.PP +注意:程序使用"懒惰"解析器,除非选项后跟有参数,否则不会检查超过第一个选项字母。 +单个选项字母与其参数之间的空格是可选的。 +选项参数可以用十进制、十六进制或八进制表示法指定。 +因此 +.BR \-c8 、 +.BR "\-c 8" 、 +.B \-c 010 +和 +.B \-cols 8 +都是等效的。 +.PP +.TP +.IR \-a " | " \-autoskip +切换自动跳过:单个 '*' 替换全零行。默认关闭。 +.TP +.IR \-b " | " \-bits +切换到比特(二进制数字)转储,而非十六进制转储。 +此选项将每个字节写为八个"1"和"0"数字,而不是普通的十六进制转储。 +每行前面有十六进制的行号,后面跟着 ASCII(或 EBCDIC)表示形式。 +命令行开关 \-p 在此模式下无效。可与 \-i 结合使用。 +.TP +.IR "\-c cols " | " \-cols cols" +每行格式化 +.RI < cols > +个字节。默认 16(\-i 模式: 12,\-ps 模式: 30,\-b 模式: 6)。最大 256。 +\-ps 模式无最大值。在 \-ps 模式下,值为 0 时输出为单行。 +.TP +.IR \-C " | " \-capitalize +使用 \-i 选项时,按 C 语言头文件(include file)的风格将变量名大写。 +.TP +.I \-d +以十进制而非十六进制显示偏移量。 +.TP +.IR \-E " | " \-EBCDIC +将右侧列的字符编码从 ASCII 更改为 EBCDIC。 +这不会改变十六进制表示。此选项与 \-r、\-p 或 \-i 组合使用时无效。 +.TP +.IR \-e +切换到小端序十六进制转储。 +此选项将字节组视为小端字节序的字。 +默认的 4 字节分组可通过 +.RI "" \-g +更改。 +此选项仅适用于十六进制转储,保持 ASCII(或 EBCDIC)表示不变。 +命令行开关 \-r、\-p、\-i 在此模式下无效。 +.TP +.IR "\-g bytes " | " \-groupsize bytes" +每隔 +.RI < bytes > +个字节(每个字节对应两位十六进制字符或八位比特数字)用空格分隔输出。 +指定 +.I \-g 0 +可取消分组。 +.RI < Bytes > +在普通模式下默认为 \fI2\fP,在小端模式下为 \fI4\fP,在比特模式下为 \fI1\fP。 +分组不适用于 PostScript 或 C 语言头文件(include)样式。 +.TP +.IR \-h " | " \-help +打印可用命令摘要并退出。不执行十六进制转储。 +.TP +.IR \-i " | " \-include +按 C 语言头文件(include file)的风格输出。 +通常写入完整的静态数组定义(以输入文件命名),从 stdin 读取时除外。 +可与 -b 共用。 +.TP +.IR "\-l len " | " \-len len" +写入 +.RI < len > +个字节后停止。 +.TP +.I "\-n name " | " \-name name" +当使用 \-i 时覆盖输出的变量名。数组命名为 +\fIname\fP,长度命名为 \fIname\fP_len。 +.TP +.I \-o offset +将 +.RI < offset > +添加到显示的文件位置。 +.TP +.IR \-p " | " \-ps " | " \-postscript " | " \-plain +以 PostScript 连续十六进制转储样式输出。也称为纯十六进制转储样式。 +.TP +.IR \-r " | " \-revert +反向操作:将十六进制转储转换(或修补)为二进制。 +如果不写入标准输出,xxd 写入输出文件时不截断文件。 +使用 +.I \-r \-p +组合可以读取没有行号信息且无特定列布局的纯十六进制转储。 +允许任意位置的额外空格和换行符。 +使用 +.I \-r \-b +组合可以读取比特转储而非十六进制转储。 +.TP +.IR \-R " " when +在输出中,十六进制值和 ASCII 值根据十六进制值使用相同颜色着色。 +主要用于帮助区分可打印字符和不可打印字符。 +.I \fIwhen\fP +可以是 +.BR never 、 always 或 auto (默认: auto)。 +当设置了 +.BR $NO_COLOR +环境变量时,将禁用着色。 +.TP +.I \-seek offset +当在 +.IR \-r +之后使用时:还原时在十六进制转储中找到的文件位置上添加 +.RI < offset >。 +.TP +.I \-s [+][\-]seek +从 +.RI < seek > +字节的绝对(或相对)输入文件偏移量处开始。 +\fI+ \fR 表示偏移量相对于当前标准输入文件位置(不从标准输入读取时无效)。 +\fI\- \fR 表示偏移量应从输入末尾向前计数多少字符(或与 \fI+\fR 组合时:在当前标准输入文件位置之前)。 +如果不带 \-s 选项,xxd 从当前文件位置开始。 +.TP +.I \-t +当使用 \-i 以 C 语言头文件(include file)的风格输出时,包含结尾的零字节。 +.TP +.I \-u +使用大写十六进制字母。默认为小写。 +.TP +.IR \-v " | " \-version +显示版本字符串。 +.SH 注意事项 +.PP +.I xxd \-r +在解析行号信息时具有一些内置的智能处理。 +如果输出文件可寻址,则每个十六进制转储行开头的行号可能乱序、行可能缺失或重叠。 +在这些情况下,xxd 会使用 lseek(2) 跳转到下一个位置。如果输出文件不可寻址,则只允许间隙,这些间隙将由空字节填充。 +.PP +.I xxd \-r +从不生成解析错误。垃圾数据会被静默跳过。 +.PP +编辑十六进制转储时,请注意 +.I xxd \-r +在读取足够列数的十六进制数据后(参见 \-c 选项),会跳过输入行上的所有其他内容。 +这也意味着对可打印 ASCII(或 EBCDIC)列的更改总是被忽略。 +使用 xxd \-r \-p 还原纯十六进制转储(或 PostScript)样式时,不依赖于正确的列数。 +在这种情况下,任何看起来像一对十六进制数字的内容都会被解释。 +.PP +注意以下两者的区别: +.br +\fI% xxd \-i file\fR +.br +和 +.br +\fI% xxd \-i < file\fR +.PP +.I xxd \-s +seek +可能与 +.IR "xxd \-s seek" +不同,因为 lseek(2) 用于"回退"输入。 +如果输入源是标准输入,并且在 xxd 启动并接收输入时标准输入的文件位置不在文件开头,那么 '+' 就会产生影响。 +以下示例可能有助于澄清(或进一步混淆!): +.PP +在读取前回退标准输入;因为 `cat` 已经读到了标准输入的末尾。 +.br +\fI% sh \-c "cat > plain_copy; xxd \-s 0 > hex_copy" < file\fR +.PP +从文件位置 0x480(=1024+128)开始生成十六进制转储。 +`+` 号表示"相对于当前位置",因此 `128` 加到了 dd 停止的 1k 位置之后。 +.br +\fI% sh \-c "dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet" < file\fR +.PP +从文件位置 0x100(=1024\-768)开始生成十六进制转储。 +.br +\fI% sh \-c "dd of=plain_snippet bs=1k count=1; xxd \-s +\-768 > hex_snippet" < file\fR +.PP +然而,这种情况很少见,`+` 的使用通常并不需要。 +作者建议在使用 \-s 时,用 strace(1) 或 truss(1) 监控 xxd 的效果。 +.SH 示例 +.PP +.br +打印 +.BR file +除前三行(十六进制 0x30 字节)之外的所有内容。 +.br +\fI% xxd \-s 0x30 file\fR +.PP +.br +从 +.BR file +末尾开始打印 3 行(十六进制 0x30 字节)。 +.br +\fI% xxd \-s \-0x30 file\fR +.PP +注意:以下示例的结果基于 2026 年 3 月的 xxd.1 手册页。 +.PP +.br +打印 120 字节,以连续十六进制转储格式,每行 20 个字节。 +.br +\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR +.br +2e544820585844203120224d6172203230323622 +.br +20224d616e75616c207061676520666f72207878 +.br +64220a2e5c220a2e5c222032317374204d617920 +.br +313939360a2e5c22204d616e2070616765206175 +.br +74686f723a0a2e5c2220202020546f6e79204e75 +.br +67656e74203c746f6e79407363746e7567656e2e +.br + +.br +将此手册页的前 120 字节以每行 12 个字节进行十六进制转储。 +.br +\fI% xxd \-l 120 \-c 12 xxd.1\fR +.br +00000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M +.br +0000000c: 6172 2032 3032 3622 2022 4d61 ar 2026" "Ma +.br +00000018: 6e75 616c 2070 6167 6520 666f nual page fo +.br +00000024: 7220 7878 6422 0a2e 5c22 0a2e r xxd"..\\".. +.br +00000030: 5c22 2032 3173 7420 4d61 7920 \\" 21st May +.br +0000003c: 3139 3936 0a2e 5c22 204d 616e 1996..\\" Man +.br +00000048: 2070 6167 6520 6175 7468 6f72 page author +.br +00000054: 3a0a 2e5c 2220 2020 2054 6f6e :..\\" Ton +.br +00000060: 7920 4e75 6765 6e74 203c 746f y Nugent output_file\fR +.br + +.br +修补文件 xxd.1 中的日期。 +.br +\fI% echo "0000034: 3574 68" | xxd \-r \- xxd.1\fR +.br +\fI% xxd \-s 0x33 \-l 13 \-c 13 xxd.1\fR +.br +00000033: 3235 7468 204d 6179 2031 3939 36 25th May 1996 +.PP +.br +创建一个 65537 字节的文件,所有字节均为 0x00, +除了最后一个字节是 'A'(十六进制 0x41)。 +.br +\fI% echo "010000: 41" | xxd \-r > file\fR +.PP +.br +使用自动跳过模式对此文件进行十六进制转储。 +.br +\fI% xxd \-a \-c 12 file\fR +.br +00000000: 0000 0000 0000 0000 0000 0000 ............ +.br +* +.br +0000fffc: 0000 0000 41 ....A +.PP +创建一个 1 字节的文件,包含单个字符 'A'。 +在 '\-r \-s' 后面的数字会加到文件中找到的行号上; +实际效果是抵制了开头的字节。 +.br +\fI% echo "010000: 41" | xxd \-r \-s \-0x10000 > file\fR +.PP +在编辑器(如 +.B vim(1) +)中将 xxd 用作过滤器,对 `a` 和 `z` 之间的标记区域进行十六进制转储。 +.br +\fI:'a,'z!xxd\fR +.PP +在编辑器(如 +.B vim(1) +)中将 xxd 用作过滤器,恢复标记在 `a` 和 `z` 之间的二进制十六进制转储。 +.br +\fI:'a,'z!xxd \-r\fR +.PP +在编辑器(如 +.B vim(1) +)中将 xxd 用作过滤器,恢复一行十六进制转储。将光标移动到该行并键入: +.br +\fI!!xxd \-r\fR +.PP +从串行线读取单个字符。 +.br +\fI% xxd \-c1 < /dev/term/b &\fR +.br +\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR +.br +\fI% echo \-n foo > /dev/term/b\fR +.PP +以 C 语言头文件(include)的风格输出,并包含结尾的零字节。 +.br +\fI% echo -n \&"0123456789\&" > digits\fR +.br +\fI% xxd -i -t digits\fR +.br +unsigned char digits[] = { +.br + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00 +.br +}; +.br +unsigned int digits_len = 10; +.PP +.SH "返回值" +返回以下错误值: +.TP +0 +未遇到错误。 +.TP +\-1 +不支持的操作 +\%(\c +.I \%xxd \-r \-i +仍不可用)。 +.TP +1 +解析选项时出错。 +.TP +2 +输入文件问题。 +.TP +3 +输出文件问题。 +.TP +4,5 +无法到达所需的查找位置。 +.SH 另见 +uuencode(1), uudecode(1), patch(1) +.br +.SH 警告 +此工具的各种古怪特性与其创建者的大脑如出一辙。 +使用风险完全自负。切记复制文件。梳理结构。终成大师。 +.br +.SH 版本 +此手册页记录的是 2024 年 5 月的 xxd 版本 1.7。 +.SH 作者 +.br +(c) 1990-1997 由 Juergen Weigert 编写 +.br + +.LP +自由分发并保留我的署名, +.br +赚钱了请与我分享, +.br +亏钱了别来找我。 +.PP +手册页由 Tony Nugent 创建 +.br + +.br +Bram Moolenaar 做了少量修改。 +由 Juergen Weigert 编辑。 +.PP From 12dbe788d461f7f01a908e9e9ecc844f85d71cb4 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:30:45 +0000 Subject: [PATCH 097/647] patch 9.2.0770: dict_add_dict() has inconsistent ownership on failure Problem: dict_add_dict() frees the passed dict on one failure path (when dict_add() fails) but not on the other (when dictitem_alloc() fails), so a caller cannot tell whether it still owns the dict after a failure. Callers that unref the dict on failure (e.g. in window.c) then double-free it when dict_add() fails. Solution: Make the failure contract consistent: on failure leave the passed dict untouched and owned by the caller; only take a reference on success. related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/dict.c | 5 ++++- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dict.c b/src/dict.c index aea40b3389..c34ce29814 100644 --- a/src/dict.c +++ b/src/dict.c @@ -621,12 +621,15 @@ dict_add_dict(dict_T *d, char *key, dict_T *dict) return FAIL; item->di_tv.v_type = VAR_DICT; item->di_tv.vval.v_dict = dict; - ++dict->dv_refcount; if (dict_add(d, item) == FAIL) { + // Detach "dict" so dictitem_free() does not unref it: on failure + // ownership stays with the caller. + item->di_tv.vval.v_dict = NULL; dictitem_free(item); return FAIL; } + ++dict->dv_refcount; return OK; } diff --git a/src/version.c b/src/version.c index 0b3f91193a..c50ea41624 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 770, /**/ 769, /**/ From 3ae1443d10da03019d4b37c090daee38926da215 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:33:45 +0000 Subject: [PATCH 098/647] patch 9.2.0771: dict_add_list() has inconsistent ownership on failure Problem: dict_add_list() frees the passed list on failure path (when dict_add() fails) but not on the other (when dictitem_alloc() fails), so a caller cannot tell whether it still owns the list after a failure. Solution: On failure leave the passed list untouched and owned by the caller; only take a reference on success. related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/dict.c | 5 ++++- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dict.c b/src/dict.c index c34ce29814..1106395085 100644 --- a/src/dict.c +++ b/src/dict.c @@ -484,12 +484,15 @@ dict_add_list(dict_T *d, char *key, list_T *list) return FAIL; item->di_tv.v_type = VAR_LIST; item->di_tv.vval.v_list = list; - ++list->lv_refcount; if (dict_add(d, item) == FAIL) { + // Detach "list" so dictitem_free() does not unref it: on failure + // ownership stays with the caller. + item->di_tv.vval.v_list = NULL; dictitem_free(item); return FAIL; } + ++list->lv_refcount; return OK; } diff --git a/src/version.c b/src/version.c index c50ea41624..7fa823e7dc 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 771, /**/ 770, /**/ From d5ec9f2e2c8694f12ba16eef1ce0fe002445bd37 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:36:42 +0000 Subject: [PATCH 099/647] patch 9.2.0772: Vim9: Null dereference inside alloc_type() Problem: Vim9: Null dereference inside alloc_type(), Missing NULL check after ALLOC_ONE() (Ao Xijie) Solution: Check that the returned value from ALLOC_ONE() is not NULL related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/vim9type.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/version.c b/src/version.c index 7fa823e7dc..2c4e9cf24c 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 772, /**/ 771, /**/ diff --git a/src/vim9type.c b/src/vim9type.c index 1bd94a60cb..ab34d2535c 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -147,6 +147,8 @@ alloc_type(type_T *type) return type; ret = ALLOC_ONE(type_T); + if (ret == NULL) + return NULL; *ret = *type; if (ret->tt_member != NULL) From 9dc4e0cbddb91009927bab762eb629a137c74632 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:38:26 +0000 Subject: [PATCH 100/647] patch 9.2.0773: Memory leak in evalfunc.c on alloc failure Problem: Memory leak in evalfunc.c on alloc failure Solution: Call dict_unref() when list_append_dict() fails before returning. related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/evalfunc.c | 12 ++++++++++++ src/version.c | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/evalfunc.c b/src/evalfunc.c index 3aeda7e11b..15b1eee873 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -5840,7 +5840,10 @@ f_getchangelist(typval_T *argvars, typval_T *rettv) if ((d = dict_alloc()) == NULL) return; if (list_append_dict(l, d) == FAIL) + { + dict_unref(d); return; + } dict_add_number(d, "lnum", (long)buf->b_changelist[i].lnum); dict_add_number(d, "col", (long)buf->b_changelist[i].col); dict_add_number(d, "coladd", (long)buf->b_changelist[i].coladd); @@ -6058,7 +6061,10 @@ f_getjumplist(typval_T *argvars, typval_T *rettv) if ((d = dict_alloc()) == NULL) return; if (list_append_dict(l, d) == FAIL) + { + dict_unref(d); return; + } dict_add_number(d, "lnum", (long)wp->w_jumplist[i].fmark.mark.lnum); dict_add_number(d, "col", (long)wp->w_jumplist[i].fmark.mark.col); dict_add_number(d, "coladd", (long)wp->w_jumplist[i].fmark.mark.coladd); @@ -9498,7 +9504,10 @@ get_matches_in_str( if (d == NULL) return FAIL; if (list_append_dict(mlist, d) == FAIL) + { + dict_unref(d); return FAIL; + } if (dict_add_number(d, matchbuf ? "lnum" : "idx", idx) == FAIL) return FAIL; @@ -9518,7 +9527,10 @@ get_matches_in_str( return FAIL; if (dict_add_list(d, "submatches", sml) == FAIL) + { + list_unref(sml); return FAIL; + } // return a list with the submatches for (int i = 1; i < NSUBEXP; ++i) diff --git a/src/version.c b/src/version.c index 2c4e9cf24c..7e0fe91360 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 773, /**/ 772, /**/ From 9082201cc218a787e794f74a432c72e70e898542 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:42:36 +0000 Subject: [PATCH 101/647] patch 9.2.0774: Memory leak in f_getscriptinfo() on alloc failure Problem: Memory leak in the script info code on allocation failure Solution: Route the failures through the existing cleanup with "goto theend", and unref var_dict and the functions list when dict_add_dict()/dict_add_list() fail. related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/scriptfile.c | 31 +++++++++++++++++++++++-------- src/version.c | 2 ++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/scriptfile.c b/src/scriptfile.c index a9b2574934..c32c73ec03 100644 --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -2342,31 +2342,46 @@ f_getscriptinfo(typval_T *argvars, typval_T *rettv) continue; if ((d = dict_alloc()) == NULL - || list_append_dict(l, d) == FAIL - || dict_add_string(d, "name", si->sn_name) == FAIL + || list_append_dict(l, d) == FAIL) + { + dict_unref(d); + goto theend; + } + if (dict_add_string(d, "name", si->sn_name) == FAIL || dict_add_number(d, "sid", i) == FAIL || dict_add_number(d, "sourced", si->sn_sourced_sid) == FAIL || dict_add_number(d, "version", si->sn_version) == FAIL || dict_add_bool(d, "autoload", si->sn_state == SN_STATE_NOT_LOADED) == FAIL) - return; + goto theend; // When a script ID is specified, return information about only the // specified script, and add the script-local variables and functions. if (sid > 0) { dict_T *var_dict; + list_T *fn_list; var_dict = dict_copy(&si->sn_vars->sv_dict, TRUE, TRUE, get_copyID()); - if (var_dict == NULL - || dict_add_dict(d, "variables", var_dict) == FAIL - || dict_add_list(d, "functions", - get_script_local_funcs(sid)) == FAIL) - return; + if (var_dict == NULL) + goto theend; + if (dict_add_dict(d, "variables", var_dict) == FAIL) + { + dict_unref(var_dict); + goto theend; + } + --var_dict->dv_refcount; + fn_list = get_script_local_funcs(sid); + if (fn_list == NULL || dict_add_list(d, "functions", fn_list) == FAIL) + { + list_unref(fn_list); + goto theend; + } } } +theend: vim_regfree(regmatch.regprog); vim_free(pat); } diff --git a/src/version.c b/src/version.c index 7e0fe91360..a8b8c103dc 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 774, /**/ 773, /**/ From a424f9846eaf1934d8ae9a9b30d99401970a9bc2 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:46:18 +0000 Subject: [PATCH 102/647] patch 9.2.0775: Memory Leak in highlight_get_info() on alloc failure Problem: Memory Leak in highlight_get_info() on alloc failure (Ao Xijie) Solution: Free attr_dict, on failure using dict_unref() and not vim_free() related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/highlight.c | 14 ++++++++++++-- src/version.c | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/highlight.c b/src/highlight.c index 08c0bf7304..f2982bacaa 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -5605,7 +5605,7 @@ highlight_get_info(int hl_idx, int resolve_link) { dict_T *dict; hl_group_T *sgp; - dict_T *attr_dict; + dict_T *attr_dict = NULL; int hlgid; dict = dict_alloc(); @@ -5635,8 +5635,11 @@ highlight_get_info(int hl_idx, int resolve_link) { attr_dict = highlight_get_attr_dict(sgp->sg_term); if (attr_dict != NULL) + { if (dict_add_dict(dict, "term", attr_dict) == FAIL) goto error; + attr_dict = NULL; + } } if (sgp->sg_start != NULL) if (dict_add_string(dict, "start", sgp->sg_start) == FAIL) @@ -5648,8 +5651,11 @@ highlight_get_info(int hl_idx, int resolve_link) { attr_dict = highlight_get_attr_dict(sgp->sg_cterm); if (attr_dict != NULL) + { if (dict_add_dict(dict, "cterm", attr_dict) == FAIL) goto error; + attr_dict = NULL; + } } if (sgp->sg_cterm_fg != 0) if (dict_add_string(dict, "ctermfg", @@ -5671,8 +5677,11 @@ highlight_get_info(int hl_idx, int resolve_link) { attr_dict = highlight_get_attr_dict(sgp->sg_gui); if (attr_dict != NULL) + { if (dict_add_dict(dict, "gui", attr_dict) == FAIL) goto error; + attr_dict = NULL; + } } if (sgp->sg_gui_fg_name != NULL) if (dict_add_string(dict, "guifg", @@ -5709,7 +5718,8 @@ highlight_get_info(int hl_idx, int resolve_link) return dict; error: - vim_free(dict); + dict_unref(attr_dict); + dict_unref(dict); return NULL; } diff --git a/src/version.c b/src/version.c index a8b8c103dc..7d9eb060fa 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 775, /**/ 774, /**/ From fe132bb249e79d03a47e85cb5112f5b2070f206a Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:51:00 +0000 Subject: [PATCH 103/647] patch 9.2.0776: Memory leak in sign_getlist() on alloc failure Problem: Memory leak in sign_getlist() on allocation failure (Ao Xijie) Solution: Call dict_unref() on failure to free the previously allocated dict. related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/sign.c | 3 +++ src/version.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/sign.c b/src/sign.c index a8dfd05eee..1d735de001 100644 --- a/src/sign.c +++ b/src/sign.c @@ -1838,7 +1838,10 @@ sign_getlist(char_u *name, list_T *retlist) return; if (list_append_dict(retlist, dict) == FAIL) + { + dict_unref(dict); return; + } sign_getinfo(sp, dict); diff --git a/src/version.c b/src/version.c index 7d9eb060fa..1e7eba70af 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 776, /**/ 775, /**/ From e43064830d1b69fe1bac1653e070b13b1c2fef00 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:54:49 +0000 Subject: [PATCH 104/647] patch 9.2.0777: Memory leak in add_defer() on alloc failure Problem: Memory leak in add_defer() on allocation failure (Ao Xijie) Solution: Free saved_name when ga_grow() fails, propagate failure from add_defer_function() to the caller, add a test for alloc failure related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/alloc.h | 1 + src/testdir/test_user_func.vim | 25 +++++++++++++++++++++++++ src/userfunc.c | 10 ++++++++-- src/version.c | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/alloc.h b/src/alloc.h index 651e01f241..f3a27f6212 100644 --- a/src/alloc.h +++ b/src/alloc.h @@ -45,5 +45,6 @@ typedef enum { aid_newtabpage_tvars, aid_blob_alloc, aid_get_func, + aid_defer, aid_last } alloc_id_T; diff --git a/src/testdir/test_user_func.vim b/src/testdir/test_user_func.vim index 56b21a481b..c7e58e9e1e 100644 --- a/src/testdir/test_user_func.vim +++ b/src/testdir/test_user_func.vim @@ -1087,4 +1087,29 @@ func Test_func_return_in_try_verbose() delfunc TryReturnOverlongString endfunc +" Memory allocation failure when registering a deferred function: the ga_grow() +" in add_defer() fails, so the deferred function must not be registered and +" "saved_name" must not leak +func Test_defer_alloc_fail() + let g:defer_log = [] + func DeferLogTarget() + call add(g:defer_log, 'ran') + endfunc + func CallWithDefer() + defer DeferLogTarget() + endfunc + + call test_alloc_fail(GetAllocId('defer'), 0, 0) + call assert_fails('call CallWithDefer()', 'E342:') + call assert_equal([], g:defer_log) + + " Without the injected failure it registers and runs at function exit. + call CallWithDefer() + call assert_equal(['ran'], g:defer_log) + + delfunc DeferLogTarget + delfunc CallWithDefer + unlet g:defer_log +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/userfunc.c b/src/userfunc.c index 66b55449e3..de1a8e84e0 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -6684,14 +6684,20 @@ add_defer(char_u *name, int argcount_arg, typval_T *argvars) if (in_def_function()) { if (add_defer_function(saved_name, argcount, argvars) == OK) + { argcount = 0; + ret = OK; + } } else { if (current_funccal->fc_defer.ga_itemsize == 0) ga_init2(¤t_funccal->fc_defer, sizeof(defer_T), 10); - if (ga_grow(¤t_funccal->fc_defer, 1) == FAIL) + if (ga_grow_id(¤t_funccal->fc_defer, 1, aid_defer) == FAIL) + { + vim_free(saved_name); goto theend; + } dr = ((defer_T *)current_funccal->fc_defer.ga_data) + current_funccal->fc_defer.ga_len++; dr->dr_name = saved_name; @@ -6701,8 +6707,8 @@ add_defer(char_u *name, int argcount_arg, typval_T *argvars) --argcount; dr->dr_argvars[argcount] = argvars[argcount]; } + ret = OK; } - ret = OK; theend: while (--argcount >= 0) diff --git a/src/version.c b/src/version.c index 1e7eba70af..70c83e88ae 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 777, /**/ 776, /**/ From 8bd30e8cb8507ed51f8a15470d601ebb284fe13b Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 19:58:13 +0000 Subject: [PATCH 105/647] patch 9.2.0778: Memory Leak in compile_dict() on alloc failure Problem: Memory Leak in compile_dict() on allocation failure (Ao Xijie) Solution: Use goto failret consistently related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/vim9expr.c | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/version.c b/src/version.c index 70c83e88ae..05249bea79 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 778, /**/ 777, /**/ diff --git a/src/vim9expr.c b/src/vim9expr.c index a041a3e70a..4331d3f5b0 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -1930,7 +1930,7 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) // {[expr]: value} uses an evaluated key. *arg = skipwhite(*arg + 1); if (compile_expr0(arg, cctx) == FAIL) - return FAIL; + goto failret; isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1; if (isn->isn_type == ISN_PUSHNR) { @@ -1944,12 +1944,12 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) if (isn->isn_type == ISN_PUSHS) key = isn->isn_arg.string; else if (may_generate_2STRING(-1, TOSTRING_NONE, cctx) == FAIL) - return FAIL; + goto failret; *arg = skipwhite(*arg); if (**arg != ']') { emsg(_(e_missing_matching_bracket_after_dict_key)); - return FAIL; + goto failret; } ++*arg; } @@ -1960,9 +1960,9 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) // {name: value} use "name" as a literal key key = get_literal_key(arg); if (key == NULL) - return FAIL; + goto failret; if (generate_PUSHS(cctx, &key) == FAIL) - return FAIL; + goto failret; } // Check for duplicate keys, if using string keys. @@ -1990,13 +1990,13 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) semsg(_(e_no_white_space_allowed_before_str_str), ":", *arg); else semsg(_(e_missing_colon_in_dictionary_str), *arg); - return FAIL; + goto failret; } whitep = *arg + 1; if (!IS_WHITE_OR_NUL(*whitep)) { semsg(_(e_white_space_required_after_str_str), ":", *arg); - return FAIL; + goto failret; } if (may_get_next_line(whitep, arg, cctx) == FAIL) @@ -2006,7 +2006,7 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) } if (compile_expr0_ext(arg, cctx, &is_const) == FAIL) - return FAIL; + goto failret; if (!is_const) is_all_const = FALSE; ++count; @@ -2027,13 +2027,13 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) if (IS_WHITE_OR_NUL(*whitep)) { semsg(_(e_no_white_space_allowed_before_str_str), ",", whitep); - return FAIL; + goto failret; } whitep = *arg + 1; if (!IS_WHITE_OR_NUL(*whitep)) { semsg(_(e_white_space_required_after_str_str), ",", *arg); - return FAIL; + goto failret; } *arg = skipwhite(whitep); } From eeeed2b294da499e63e331f40302ffe9dbf96baa Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 20:01:50 +0000 Subject: [PATCH 106/647] patch 9.2.0779: Memory leak in type_name_func() on alloc failure Problem: Memory leak in type_name_func() on alloc failure (Ao Xijie) Solution: Free ret_free variable on failure related: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/vim9type.c | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/version.c b/src/version.c index 05249bea79..1d6c351a70 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 779, /**/ 778, /**/ diff --git a/src/vim9type.c b/src/vim9type.c index ab34d2535c..dfa6686a98 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -2722,13 +2722,16 @@ type_name_func(type_T *type, char **tofree) STRCPY((char *)ga.ga_data + ga.ga_len, ")"); else { - char *ret_free; + char *ret_free = NULL; char *ret_name = type_name(type->tt_member, &ret_free); int len; len = (int)STRLEN(ret_name) + 4; if (ga_grow(&ga, len) == FAIL) + { + vim_free(ret_free); goto failed; + } STRCPY((char *)ga.ga_data + ga.ga_len, "): "); STRCPY((char *)ga.ga_data + ga.ga_len + 3, ret_name); vim_free(ret_free); From f2156161c52548af2a502858b59f48ea2fb33bb2 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 2 Jul 2026 20:06:33 +0000 Subject: [PATCH 107/647] patch 9.2.0780: Memory leak in evalvars.c on alloc failure Problem: Memory leak in evalvars.c on alloc failure (Ao Xijie) Solution: free new_tuple when tuple_append_tv() fails and clear typeval, add a test. closes: #20668 Supported by AI. Signed-off-by: Christian Brabandt --- src/alloc.h | 1 + src/evalvars.c | 4 ++++ src/testdir/test_tuple.vim | 8 ++++++++ src/tuple.c | 2 +- src/version.c | 2 ++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/alloc.h b/src/alloc.h index f3a27f6212..3d740bca3e 100644 --- a/src/alloc.h +++ b/src/alloc.h @@ -46,5 +46,6 @@ typedef enum { aid_blob_alloc, aid_get_func, aid_defer, + aid_tuple_append, aid_last } alloc_id_T; diff --git a/src/evalvars.c b/src/evalvars.c index 9b98ae7310..f74b1c76ad 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1363,7 +1363,11 @@ ex_let_vars( copy_tv(TUPLE_ITEM(tuple, idx), &new_tv); if (tuple_append_tv(new_tuple, &new_tv) == FAIL) + { + clear_tv(&new_tv); + tuple_unref(new_tuple); return FAIL; + } idx++; } diff --git a/src/testdir/test_tuple.vim b/src/testdir/test_tuple.vim index 26609a20fe..68bdca08c2 100644 --- a/src/testdir/test_tuple.vim +++ b/src/testdir/test_tuple.vim @@ -2463,4 +2463,12 @@ func Test_tuple_multi_assign_in_for_loop_from_import() call v9.CheckSourceScriptSuccess(lines) endfunc +" Memory allocation failure while collecting the rest of a tuple in an unpack +func Test_tuple_unpack_memory_fail() + let t = ('1', '2', '3') + call test_alloc_fail(GetAllocId('tuple_append'), 0, 0) + call assert_fails('let [a; rest] = t', 'E342:') + unlet t +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/tuple.c b/src/tuple.c index b7a420e941..8e5a9fcfad 100644 --- a/src/tuple.c +++ b/src/tuple.c @@ -291,7 +291,7 @@ tuple_find(tuple_T *tuple, long n) int tuple_append_tv(tuple_T *tuple, typval_T *tv) { - if (ga_grow(&tuple->tv_items, 1) == FAIL) + if (ga_grow_id(&tuple->tv_items, 1, aid_tuple_append) == FAIL) return FAIL; tuple_set_item(tuple, TUPLE_LEN(tuple), tv); diff --git a/src/version.c b/src/version.c index 1d6c351a70..27c2bfe527 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 780, /**/ 779, /**/ From 98efa502798d09d828d5b6f48854145549ab060e Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 2 Jul 2026 20:35:25 +0000 Subject: [PATCH 108/647] patch 9.2.0781: tests: Test_fuzzy_completion_bufname_fullpath() creates unnecessary dir Problem: tests: Test_fuzzy_completion_bufname_fullpath() creates an unnecessary directory with the name of a file. Solution: Only create the parent directory of the file (zeertzjq). closes: #20695 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/testdir/test_cmdline.vim | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 9c34e81499..ef1cd7adcd 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -3601,7 +3601,7 @@ endfunc func Test_fuzzy_completion_bufname_fullpath() CheckUnix set wildoptions& - call mkdir('Xcmd/Xstate/Xfile.js', 'pR') + call mkdir('Xcmd/Xstate', 'pR') edit Xcmd/Xstate/Xfile.js cd Xcmd/Xstate enew diff --git a/src/version.c b/src/version.c index 27c2bfe527..7306ff970e 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 781, /**/ 780, /**/ From d94bb14047c6c02eb155e92eb102f431950c64be Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Fri, 3 Jul 2026 16:15:35 +0000 Subject: [PATCH 109/647] runtime(syntax-tests): add typst syntax tests closes: #20694 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- .../testdir/dumps/typst_bolditalic_00.dump | 20 +++++ .../testdir/dumps/typst_codeblocks_00.dump | 20 +++++ .../syntax/testdir/dumps/typst_lists_00.dump | 20 +++++ .../testdir/dumps/typst_script_base_00.dump | 20 +++++ .../dumps/typst_script_extended_00.dump | 20 +++++ .../dumps/typst_script_extended_01.dump | 20 +++++ .../dumps/typst_script_extended_02.dump | 20 +++++ .../dumps/typst_script_extended_03.dump | 20 +++++ .../syntax/testdir/dumps/typst_tables_00.dump | 20 +++++ .../syntax/testdir/dumps/typst_tables_01.dump | 20 +++++ .../syntax/testdir/dumps/typst_tables_02.dump | 20 +++++ .../syntax/testdir/dumps/typst_tables_03.dump | 20 +++++ .../syntax/testdir/dumps/typst_tables_04.dump | 20 +++++ .../syntax/testdir/input/typst_bolditalic.typ | 7 ++ .../syntax/testdir/input/typst_codeblocks.typ | 16 ++++ runtime/syntax/testdir/input/typst_lists.typ | 18 ++++ .../testdir/input/typst_script_base.typ | 15 ++++ .../testdir/input/typst_script_extended.typ | 55 +++++++++++++ runtime/syntax/testdir/input/typst_tables.typ | 82 +++++++++++++++++++ 19 files changed, 453 insertions(+) create mode 100644 runtime/syntax/testdir/dumps/typst_bolditalic_00.dump create mode 100644 runtime/syntax/testdir/dumps/typst_codeblocks_00.dump create mode 100644 runtime/syntax/testdir/dumps/typst_lists_00.dump create mode 100644 runtime/syntax/testdir/dumps/typst_script_base_00.dump create mode 100644 runtime/syntax/testdir/dumps/typst_script_extended_00.dump create mode 100644 runtime/syntax/testdir/dumps/typst_script_extended_01.dump create mode 100644 runtime/syntax/testdir/dumps/typst_script_extended_02.dump create mode 100644 runtime/syntax/testdir/dumps/typst_script_extended_03.dump create mode 100644 runtime/syntax/testdir/dumps/typst_tables_00.dump create mode 100644 runtime/syntax/testdir/dumps/typst_tables_01.dump create mode 100644 runtime/syntax/testdir/dumps/typst_tables_02.dump create mode 100644 runtime/syntax/testdir/dumps/typst_tables_03.dump create mode 100644 runtime/syntax/testdir/dumps/typst_tables_04.dump create mode 100644 runtime/syntax/testdir/input/typst_bolditalic.typ create mode 100644 runtime/syntax/testdir/input/typst_codeblocks.typ create mode 100644 runtime/syntax/testdir/input/typst_lists.typ create mode 100644 runtime/syntax/testdir/input/typst_script_base.typ create mode 100644 runtime/syntax/testdir/input/typst_script_extended.typ create mode 100644 runtime/syntax/testdir/input/typst_tables.typ diff --git a/runtime/syntax/testdir/dumps/typst_bolditalic_00.dump b/runtime/syntax/testdir/dumps/typst_bolditalic_00.dump new file mode 100644 index 0000000000..a3fcd1f4d2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_bolditalic_00.dump @@ -0,0 +1,20 @@ +>-+0#e000e06#ffffff0| |t+0#0000000&|*|h|e|*|r|e| @65 +|-+0#e000e06&| |*+2#0000000&| |t|h|e|r|e| |m|i|g|h|t| |*| +0&&|*+2&&| |b|e|*| +0&&|*+2&&|s|p|a|c|e|s| |b|o|l|d| |*| +0&&@36 +|-+0#e000e06&| |_+0#0000000&| |t|h|e|r|e| |m|i|g|h|t| |_| |_| |b|e|_| |_|s|p|a|c|e|s| |i|n| |i|t|a|l|i|c| |_| @31 +|-+0#e000e06&| |T+0#0000000&|h|i|s| |s|h|o|u|l|d|n|'|t| |*@1|b|e| |b|o|l|d| |a|n|d| |i|t|a|l|i|c|*@1|.| @34 +|-+0#e000e06&| |T+0#0000000&|h|i|s| |s|h|o|u|l|d| |*+2&&|_|b|e| |b|o|l|d| |a|n|d| |i|t|a|l|i|c|_|*|.+0&&| @37 +|-+0#e000e06&| |T+0#0000000&|h|i|s| |s|h|o|u|l|d| |_+2&&|*|b|e| |b|o|l|d| |a|n|d| |i|t|a|l|i|c| |t|o@1| |*|_|.+0&&| @32 +|-+0#e000e06&| |T+0#0000000&|h|i|s| |s|h|o|u|l|d|n|'|t| |_@1|b|e| |i|t|a|l|i|c|_@1| @44 +|~+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/typst_codeblocks_00.dump b/runtime/syntax/testdir/dumps/typst_codeblocks_00.dump new file mode 100644 index 0000000000..80fbbe795a --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_codeblocks_00.dump @@ -0,0 +1,20 @@ +>/+0#0000e05#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |g|:|t|y|p|s|t|_|e|m|b|e|d@1|e|d|_|l|a|n|g|u|a|g|e|s| |=| |[|'|p|y|t|h|o|n|'|,| |'|s|q|l|'|]| +0#0000000&@6 +@75 +|=+0#00e0003&| |C+0#e000e06&|o|d|e| |B|l|o|c|k|s| +0#0000000&@61 +@75 +|=+0#00e0003&@1| |P+0#e000e06&|y|t|h|o|n| +0#0000000&@65 +@75 +|`+0#e000e06&@2|p|y|t|h|o|n| +0#0000000&@65 +|d+0#af5f00255&|e|f| +0#0000000&|h+0#00e0e07&|e|l@1|o|(+0#0000000&|w|o|r|l|d|)|:| @57 +@4|p+0#00e0e07&|r|i|n|t|(+0#0000000&|"+0#e000002&|h|e|l@1|o| |{|}|"| +0#0000000&|%| |w|o|r|l|d|)| @45 +|`+0#e000e06&@2| +0#0000000&@71 +@75 +|=+0#00e0003&@1| |S+0#e000e06&|Q|L| +0#0000000&@68 +@75 +|`+0#e000e06&@2|s|q|l| +0#0000000&@68 +|s+0#af5f00255&|e|l|e|c|t| +0#0000000&|*| |f+0#e000e06&|r|o|m| +0#0000000&|m|y|_|t|a|b|l|e| @52 +|`+0#e000e06&@2| +0#0000000&@71 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/dumps/typst_lists_00.dump b/runtime/syntax/testdir/dumps/typst_lists_00.dump new file mode 100644 index 0000000000..0eedd9e48d --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_lists_00.dump @@ -0,0 +1,20 @@ +>=+0#00e0003#ffffff0| |L+0#e000e06&|i|s|t|s| +0#0000000&@67 +@75 +|++0#e000e06&| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|1+0#e000002&|0|)+0#0000000&| @62 +|++0#e000e06&| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|2+0#e000002&|0|)+0#0000000&| @62 +| +0#e000e06&@1|-| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|1+0#e000002&|5|)+0#0000000&| @60 +| +0#e000e06&@3|-| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|1+0#e000002&|5|)+0#0000000&| @58 +| +0#e000e06&@3|-| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|1+0#e000002&|5|)+0#0000000&| @58 +| +0#e000e06&@1|-| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|1+0#e000002&|5|)+0#0000000&| @60 +|++0#e000e06&| |#|l+0#00e0e07&|o|r|e|m|(+0#0000000&|3+0#e000002&|0|)+0#0000000&| @62 +@75 +|/+0#e000e06&| |T+2#0000000&|e|r|m| |1|\+0&&|:|:+0#e000e06&| +0#0000000&@63 +| +0#e000e06&@3|+| |D+0#0000000&|e|f|i|n|i|t|i|o|n| |1| @56 +| +0#e000e06&@3|+| |D+0#0000000&|e|f|i|n|i|t|i|o|n| |2| @56 +@75 +|/+0#e000e06&| |T+2#0000000&|e|r|m| |2|\+0&&|:|:+0#e000e06&|\| +0#0000000&@62 +@2|#+0#e000e06&|l+0#00e0e07&|o|r|e|m|(+0#0000000&|2+0#e000002&|5|)+0#0000000&| @62 +@75 +|/+0#e000e06&| |S+2#0000000&|o|m|e| |L|o|r|e|m|:+0#e000e06&| +0#0000000&|#+0#e000e06&|l+0#00e0e07&|o|r|e|m|(+0#0000000&|5+0#e000002&|0|)+0#0000000&| @50 +|~+0#4040ff13&| @73 +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/dumps/typst_script_base_00.dump b/runtime/syntax/testdir/dumps/typst_script_base_00.dump new file mode 100644 index 0000000000..d5db7950b6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_script_base_00.dump @@ -0,0 +1,20 @@ +>#+0#e000e06#ffffff0|s+0#af5f00255&|e|t| +0#0000000&|d+0#00e0e07&|o|c|u|m|e|n|t|(+0#0000000&|t|i|t|l|e|:| |"+0#e000002&|S|a|m|p|l|e| |D|o|c|u|m|e|n|t|"|)+0#0000000&| @35 +|#+0#e000e06&|i+0#af5f00255&|m|p|o|r|t| +0#0000000&|"+0#e000002&|/|t|y|p|s|t|/|h|a|b|a|m|a|x|.|t|y|p|"|:+0#0000000&| |*| @43 +|#+0#e000e06&|s+0#af5f00255&|h|o|w|:+0#0000000&| |h+0#00e0e07&|a|b|a|m|a|x|.+0#0000000&|w+0#00e0e07&|i|t|h|(+0#0000000&|n|a|m|e|:| |"+0#e000002&|M|a|x|i|m| |K|i|m|"|,+0#0000000&| |e|m|a|i|l|:| |"+0#e000002&|t|e|s|t|@|g|m|a|i|l|.|c|o|m|"|)+0#0000000&| @11 +|#+0#e000e06&|s+0#af5f00255&|e|t| +0#0000000&|h+0#00e0e07&|e|a|d|i|n|g|(+0#0000000&|n|u|m|b|e|r|i|n|g|:| |"+0#e000002&|(|I|)|"|)+0#0000000&| @44 +|#+0#e000e06&|s+0#af5f00255&|h|o|w| +0#0000000&|h|e|a|d|i|n|g|:| |s+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|l|i|g|n|(+0#0000000&|c|e|n|t|e|r|)| @42 +|#+0#e000e06&|s+0#af5f00255&|h|o|w| +0#0000000&|h|e|a|d|i|n|g|:| |s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|e|x|t|(+0#0000000&|f|o|n|t|:| |"+0#e000002&|A|r|i|a|l|"|)+0#0000000&| @36 +@75 +|#+0#e000e06&|s+0#af5f00255&|h|o|w| +0#0000000&|"+0#e000002&|o|n|c|e|?|"|:+0#0000000&| |i|t| |=|>| |[|#+0#e000e06&|i+0#00e0e07&|t| +0#0000000&|#+0#e000e06&|i+0#00e0e07&|t|]+0#0000000&| @44 +@75 +|#+0#e000e06&|s+0#af5f00255&|h|o|w| +0#0000000&|h|e|a|d|i|n|g|:| |i|t| |=|>| |b+0#00e0e07&|l|o|c|k|[+0#0000000&| @47 +@2|\|~| @70 +@2|#+0#e000e06&|e+0#00e0e07&|m|p|h|(+0#0000000&|i|t|.|b|o|d|y|)| |/+0#0000e05&@1| |c|o|m@1|e|n|t| |1| +0#0000000&@45 +@2|#+0#e000e06&|c+0#00e0e07&|o|u|n|t|e|r|(+0#0000000&|h|e|a|d|i|n|g|)|.|d+0#00e0e07&|i|s|p|l|a|y|(+0#0000000&|)| |/+0#0000e05&@1| |c|o|m@1|e|n|t| |2| +0#0000000&@32 +@2|\|~| @70 +|]| @73 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/dumps/typst_script_extended_00.dump b/runtime/syntax/testdir/dumps/typst_script_extended_00.dump new file mode 100644 index 0000000000..5843bce53c --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_script_extended_00.dump @@ -0,0 +1,20 @@ +>#+0#e000e06#ffffff0|l+0#af5f00255&|e|t| +0#0000000&|h+0#00e0e07&|a|b|a|m|a|x|(+0#0000000&|n|a|m|e|:| |"+0#e000002&@1|,+0#0000000&| |e|m|a|i|l|:| |"+0#e000002&@1|,+0#0000000&| |t|e|x|t|_|s|i|z|e|:| |1+0#e000002&|4|p|t|,+0#0000000&| |d|o|c|)| |=| |{| @15 +@2|i+0#af5f00255&|m|p|o|r|t| +0#0000000&|"+0#e000002&|@|p|r|e|v|i|e|w|/|c|h|e|q|:|0|.|3|.|0|"|:+0#0000000&| |c|h|e|c|k|l|i|s|t| @33 +@2|s+0#af5f00255&|h|o|w|:+0#0000000&| |c|h|e|c|k|l|i|s|t| @57 +@75 +@2|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|e|x|t|(+0#0000000&|s|i|z|e|:| |t|e|x|t|_|s|i|z|e|,| |l|a|n|g|:| |"+0#e000002&|e|n|"|)+0#0000000&| @35 +@75 +@2|s+0#af5f00255&|e|t| +0#0000000&|p+0#00e0e07&|a|g|e|(+0#0000000&| @63 +@4|h|e|a|d|e|r|:| |c+0#af5f00255&|o|n|t|e|x|t| +0#0000000&|{| @53 +@6|i+0#af5f00255&|f| +0#0000000&|c+0#00e0e07&|o|u|n|t|e|r|(+0#0000000&|p|a|g|e|)|.|g+0#00e0e07&|e|t|(+0#0000000&|)|.|f+0#00e0e07&|i|r|s|t|(+0#0000000&|)| |>| |1+0#e000002&| +0#0000000&|{| @32 +@8|s+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|l|i|g|n|(+0#0000000&|r|i|g|h|t|)| @50 +@8|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|e|x|t|(+0#0000000&|8+0#e000002&|p|t|)+0#0000000&| @53 +@8|s+0#00e0e07&|m|a|l@1|c|a|p|s|(+0#0000000&|d|o|c|u|m|e|n|t|.|t|i|t|l|e|)| @41 +@6|}| @67 +@4|}|,| @68 +@4|f|o@1|t|e|r|:| |c+0#af5f00255&|o|n|t|e|x|t| +0#0000000&|{| @53 +@6|i+0#af5f00255&|f| +0#0000000&|c+0#00e0e07&|o|u|n|t|e|r|(+0#0000000&|p|a|g|e|)|.|f+0#00e0e07&|i|n|a|l|(+0#0000000&|)|.|f+0#00e0e07&|i|r|s|t|(+0#0000000&|)| |>| |1+0#e000002&| +0#0000000&|{| @30 +@8|s+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|l|i|g|n|(+0#0000000&|r|i|g|h|t|)| @50 +@8|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|e|x|t|(+0#0000000&|8+0#e000002&|p|t|)+0#0000000&| @53 +@8|c+0#00e0e07&|o|u|n|t|e|r|(+0#0000000&|p|a|g|e|)|.|d+0#00e0e07&|i|s|p|l|a|y|(+0#0000000&|"+0#e000002&|1| |/| |1|"|,+0#0000000&| |b|o|t|h|:| |t+0#e000002&|r|u|e|)+0#0000000&| @24 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/typst_script_extended_01.dump b/runtime/syntax/testdir/dumps/typst_script_extended_01.dump new file mode 100644 index 0000000000..ee4a8f286e --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_script_extended_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@3|}|,| @68 +@4|f|o@1|t|e|r|:| |c+0#af5f00255&|o|n|t|e|x|t| +0#0000000&|{| @53 +@6|i+0#af5f00255&|f| +0#0000000&|c+0#00e0e07&|o|u|n|t|e|r|(+0#0000000&|p|a|g|e|)|.|f+0#00e0e07&|i|n|a|l|(+0#0000000&|)|.|f+0#00e0e07&|i|r|s|t|(+0#0000000&|)| |>| |1+0#e000002&| +0#0000000&|{| @30 +@8|s+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|l|i|g|n|(+0#0000000&|r|i|g|h|t|)| @50 +@8|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|e|x|t|(+0#0000000&|8+0#e000002&|p|t|)+0#0000000&| @53 +@8>c+0#00e0e07&|o|u|n|t|e|r|(+0#0000000&|p|a|g|e|)|.|d+0#00e0e07&|i|s|p|l|a|y|(+0#0000000&|"+0#e000002&|1| |/| |1|"|,+0#0000000&| |b|o|t|h|:| |t+0#e000002&|r|u|e|)+0#0000000&| @24 +@6|}| @67 +@4|}|,| @68 +@2|)| @71 +@2|/+0#0000e05&@1| |s|e|t| |p|a|r|(| +0#0000000&@61 +@2|/+0#0000e05&@1| @2|j|u|s|t|i|f|y|:| |t|r|u|e|,| +0#0000000&@53 +@2|/+0#0000e05&@1| @2|f|i|r|s|t|-|l|i|n|e|-|i|n|d|e|n|t|:| |2|e|m|,| +0#0000000&@44 +@2|/+0#0000e05&@1| @2|s|p|a|c|i|n|g|:| |0|.|6|5|e|m|)| +0#0000000&@51 +@2|s+0#af5f00255&|e|t| +0#0000000&|p+0#00e0e07&|a|r|(+0#0000000&|j|u|s|t|i|f|y|:| |t+0#e000002&|r|u|e|)+0#0000000&| @50 +@2|s+0#af5f00255&|e|t| +0#0000000&|h+0#00e0e07&|e|a|d|i|n|g|(+0#0000000&|n|u|m|b|e|r|i|n|g|:| |"+0#e000002&|1|.|"|)+0#0000000&| @44 +@2|s+0#af5f00255&|h|o|w| +0#0000000&|t|i|t|l|e|:| |s+0#af5f00255&|e|t| +0#0000000&|a+0#00e0e07&|l|i|g|n|(+0#0000000&|c|e|n|t|e|r|)| @43 +@2|s+0#af5f00255&|h|o|w| +0#0000000&|t|i|t|l|e|:| |s|m|a|l@1|c|a|p|s| @51 +@2|i+0#af5f00255&|f| +0#0000000&|n|a|m|e| |=@1| |"+0#e000002&@1| +0#0000000&|{| @57 +@4|s+0#af5f00255&|h|o|w| +0#0000000&|t|i|t|l|e|:| |s+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|l|o|c|k|(+0#0000000&|b|e|l|o|w|:| |2+0#e000002&|e|m|)+0#0000000&| @37 +@57|1|9|,|9| @9|3|6|%| diff --git a/runtime/syntax/testdir/dumps/typst_script_extended_02.dump b/runtime/syntax/testdir/dumps/typst_script_extended_02.dump new file mode 100644 index 0000000000..a5ddff1bca --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_script_extended_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@3|s+0#af5f00255&|h|o|w| +0#0000000&|t|i|t|l|e|:| |s+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|l|o|c|k|(+0#0000000&|b|e|l|o|w|:| |2+0#e000002&|e|m|)+0#0000000&| @37 +@4|t+0#00e0e07&|i|t|l|e|(+0#0000000&|)| @63 +@2|}| |e+0#af5f00255&|l|s|e| +0#0000000&|{| @64 +@4|t+0#00e0e07&|i|t|l|e|(+0#0000000&|)| @63 +@4|p+0#00e0e07&|a|d|(+0#0000000&|b|o|t@1|o|m|:| |2+0#e000002&|e|m|,+0#0000000&| @54 +@4>a+0#00e0e07&|l|i|g|n|(+0#0000000&|c|e|n|t|e|r|)|[| @56 +@6|#+0#e000e06&|n+0#00e0e07&|a|m|e| +0#0000000&@63 +@6|#+0#e000e06&|h+0#00e0e07&|(+0#0000000&|5+0#e000002&|p|t|)+0#0000000&| @61 +@6|#+0#e000e06&|i+0#af5f00255&|f| +0#0000000&|e|m|a|i|l| |!|=| |"+0#e000002&@1| +0#0000000&|{| @51 +@8|[|(| |#+0#e000e06&|l+0#00e0e07&|i|n|k|(+0#0000000&|"+0#e000002&|m|a|i|l|t|o|:|"| +0#0000000&|+| |e|m|a|i|l|)| |)|]| @36 +@6|}| @67 +@4|]|)| @68 +@2|}| @71 +@75 +@2|s+0#af5f00255&|h|o|w| +0#0000000&|r+0#00e0e07&|a|w|.+0#0000000&|w+0#00e0e07&|h|e|r|e|(+0#0000000&|b|l|o|c|k|:| |t+0#e000002&|r|u|e|)+0#0000000&|:| |i|t| |=|>| |b+0#00e0e07&|l|o|c|k|(+0#0000000&| @31 +@4|s|t|r|o|k|e|:| |(|l|e|f|t|:| |1+0#e000002&|.|5|p|t| +0#0000000&|+| |l+0#00e0e07&|u|m|a|(+0#0000000&|2+0#e000002&@1|0|)+0#0000000&@1|,| @36 +@4|i|n|s|e|t|:| |1+0#e000002&|0|p|t|,+0#0000000&| @58 +@4|r|a|d|i|u|s|:| |6+0#e000002&|p|t|,+0#0000000&| @58 +@4|w|i|d|t|h|:| |1+0#e000002&|0@1|%|,+0#0000000&| @58 +@57|3|7|,|5| @9|8|6|%| diff --git a/runtime/syntax/testdir/dumps/typst_script_extended_03.dump b/runtime/syntax/testdir/dumps/typst_script_extended_03.dump new file mode 100644 index 0000000000..bc948c00cf --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_script_extended_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@3|w|i|d|t|h|:| |1+0#e000002&|0@1|%|,+0#0000000&| @58 +@4|i|t|,| @67 +@2|)| @71 +@75 +@2|d|o|c| @69 +>}| @73 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|5@1|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/typst_tables_00.dump b/runtime/syntax/testdir/dumps/typst_tables_00.dump new file mode 100644 index 0000000000..08f44c1393 --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_tables_00.dump @@ -0,0 +1,20 @@ +>=+0#00e0003#ffffff0| |T+0#e000e06&|a|b|l|e|s| +0#0000000&@66 +@75 +|#+0#e000e06&|t+0#00e0e07&|a|b|l|e|(+0#0000000&| @67 +@2|c|o|l|u|m|n|s|:| |(|1+0#e000002&|f|r|,+0#0000000&| |a+0#e000002&|u|t|o|,+0#0000000&| |a+0#e000002&|u|t|o|)+0#0000000&|,| @45 +@2|i|n|s|e|t|:| |1+0#e000002&|0|p|t|,+0#0000000&| @60 +@2|a|l|i|g|n|:| |h|o|r|i|z|o|n|,| @57 +@2|t+0#00e0e07&|a|b|l|e|.+0#0000000&|h+0#00e0e07&|e|a|d|e|r|(+0#0000000&| @59 +@4|[|]|,| |[|*+2&&|V|o|l|u|m|e|*|]+0&&|,| |[|*+2&&|P|a|r|a|m|e|t|e|r|s|*|]+0&&|,| @39 +@2|)|,| @70 +@2|[|c|y|l|i|n|d|e|r|]|,| @61 +@2|$+0#e000e06&| +0#0000000&|p+0#00e0e07&|i| +0#0000000&|h| |(|D|^|2+0#e000002&| +0#0000000&|-| |d|^|2+0#e000002&|)+0#0000000&| |/| |4+0#e000002&| +0#0000000&|$+0#e000e06&|,+0#0000000&| @47 +@2|[| @71 +@4|$+0#e000e06&|h+0#0000000&|$+0#e000e06&|:+0#0000000&| |h|e|i|g|h|t| |\+0#e000e06&| +0#0000000&@57 +@4|$+0#e000e06&|D+0#0000000&|$+0#e000e06&|:+0#0000000&| |o|u|t|e|r| |r|a|d|i|u|s| |\+0#e000e06&| +0#0000000&@51 +@4|$+0#e000e06&|d+0#0000000&|$+0#e000e06&|:+0#0000000&| |i|n@1|e|r| |r|a|d|i|u|s| @53 +@2|]|,| @70 +@2|[|t|e|t|r|a|h|e|d|r|o|n|]|,| @58 +@2|$+0#e000e06&| +0#0000000&|s+0#af5f00255&|q|r|t|(+0#0000000&|2+0#e000002&|)+0#0000000&| |/| |1+0#e000002&|2| +0#0000000&|a|^|3+0#e000002&| +0#0000000&|$+0#e000e06&|,+0#0000000&| @51 +@2|[|$+0#e000e06&|a+0#0000000&|$+0#e000e06&|:+0#0000000&| |e|d|g|e| |l|e|n|g|t|h|]| @54 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/typst_tables_01.dump b/runtime/syntax/testdir/dumps/typst_tables_01.dump new file mode 100644 index 0000000000..e9dcb4fc56 --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_tables_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@3|$+0#e000e06&|D+0#0000000&|$+0#e000e06&|:+0#0000000&| |o|u|t|e|r| |r|a|d|i|u|s| |\+0#e000e06&| +0#0000000&@51 +@4|$+0#e000e06&|d+0#0000000&|$+0#e000e06&|:+0#0000000&| |i|n@1|e|r| |r|a|d|i|u|s| @53 +@2|]|,| @70 +@2|[|t|e|t|r|a|h|e|d|r|o|n|]|,| @58 +@2|$+0#e000e06&| +0#0000000&|s+0#af5f00255&|q|r|t|(+0#0000000&|2+0#e000002&|)+0#0000000&| |/| |1+0#e000002&|2| +0#0000000&|a|^|3+0#e000002&| +0#0000000&|$+0#e000e06&|,+0#0000000&| @51 +@2>[|$+0#e000e06&|a+0#0000000&|$+0#e000e06&|:+0#0000000&| |e|d|g|e| |l|e|n|g|t|h|]| @54 +|)| @73 +@75 +|#+0#e000e06&|s+0#af5f00255&|h|o|w| +0#0000000&|t+0#00e0e07&|a|b|l|e|.+0#0000000&|c+0#00e0e07&|e|l@1|.+0#0000000&|w+0#00e0e07&|h|e|r|e|(+0#0000000&|y|:| |0+0#e000002&|)+0#0000000&|:| |s|t|r|o|n|g| @38 +|#+0#e000e06&|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|a|b|l|e|(+0#0000000&| @63 +@2|s|t|r|o|k|e|:| |(|x|,| |y|)| |=|>| |i+0#af5f00255&|f| +0#0000000&|y| |=@1| |0+0#e000002&| +0#0000000&|{| @43 +@4|(|b|o|t@1|o|m|:| |0+0#e000002&|.|7|p|t| +0#0000000&|+| |b|l|a|c|k|)| @47 +@2|}|,| @70 +@2|a|l|i|g|n|:| |(|x|,| |y|)| |=|>| |(| @54 +@4|i+0#af5f00255&|f| +0#0000000&|x| |>| |0+0#e000002&| +0#0000000&|{| |c|e|n|t|e|r| |}| @51 +@4|e+0#af5f00255&|l|s|e| +0#0000000&|{| |l|e|f|t| |}| @57 +@2|)| @71 +|)| @73 +@75 +@57|1|9|,|3| @9|2|0|%| diff --git a/runtime/syntax/testdir/dumps/typst_tables_02.dump b/runtime/syntax/testdir/dumps/typst_tables_02.dump new file mode 100644 index 0000000000..fc0a2ad20a --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_tables_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|#+0#e000e06&|t+0#00e0e07&|a|b|l|e|(+0#0000000&| @67 +@2|c|o|l|u|m|n|s|:| |3+0#e000002&|,+0#0000000&| @61 +@2|t+0#00e0e07&|a|b|l|e|.+0#0000000&|h+0#00e0e07&|e|a|d|e|r|(+0#0000000&| @59 +@4|[|*+2&&|S|u|b|s|t|a|n|c|e|*|]+0&&|,| @56 +@4>[|_|S|u|b|c|r|i|t|i|c|a|l|_| |°|C|]|,| @51 +@4|[|S|u|p|e|r|c|r|i|t|i|c|a|l| |°|C|]|,| @51 +@2|)|,| @70 +@2|[|H|y|d|r|o|c|h|l|o|r|i|c| |A|c|i|d|]|,| @52 +@2|[|1|2|.|0|]|,| |[|9|2|.|1|]|,| @57 +@2|[|S|o|d|i|u|m| |_|M|y|r|e|t|h|_| |*+2&&|_|S|u|l|f|a|t|e|_|*|]+0&&|,| @42 +@2|[|1|6|.|6|]|,| |[|1|0|4|]|,| @58 +@2|[|P|o|t|a|s@1|i|u|m| |H|y|d|r|o|x|i|d|e|]|,| @50 +@2|t+0#00e0e07&|a|b|l|e|.+0#0000000&|c+0#00e0e07&|e|l@1|(+0#0000000&|c|o|l|s|p|a|n|:| |2+0#e000002&|)+0#0000000&|[|2|4|.|7|]|,| @43 +|)| @73 +@75 +|#+0#e000e06&|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|a|b|l|e|(+0#0000000&| @63 +@2|s|t|r|o|k|e|:| |n+0#e000002&|o|n|e|,+0#0000000&| @59 +@2|g|u|t@1|e|r|:| |0+0#e000002&|.|2|e|m|,+0#0000000&| @58 +@57|3|7|,|5| @9|4|9|%| diff --git a/runtime/syntax/testdir/dumps/typst_tables_03.dump b/runtime/syntax/testdir/dumps/typst_tables_03.dump new file mode 100644 index 0000000000..58921fcaec --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_tables_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|g|u|t@1|e|r|:| |0+0#e000002&|.|2|e|m|,+0#0000000&| @58 +@2|f|i|l@1|:| |(|x|,| |y|)| |=|>| @57 +@4|i+0#af5f00255&|f| +0#0000000&|x| |=@1| |0+0#e000002&| +0#0000000&|o+0#af5f00255&|r| +0#0000000&|y| |=@1| |0+0#e000002&| +0#0000000&|{| |g|r|a|y| |}|,| @41 +@2|i|n|s|e|t|:| |(|r|i|g|h|t|:| |1+0#e000002&|.|5|e|m|)+0#0000000&|,| @50 +|)| @73 +> @74 +|#+0#e000e06&|s+0#af5f00255&|h|o|w| +0#0000000&|t|a|b|l|e|.|c|e|l@1|:| |i|t| |=|>| |{| @49 +@2|i+0#af5f00255&|f| +0#0000000&|i|t|.|x| |=@1| |0+0#e000002&| +0#0000000&|o+0#af5f00255&|r| +0#0000000&|i|t|.|y| |=@1| |0+0#e000002&| +0#0000000&|{| @45 +@4|s+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|e|x|t|(+0#0000000&|w|h|i|t|e|)| @55 +@4|s+0#00e0e07&|t|r|o|n|g|(+0#0000000&|i|t|)| @60 +@2|}| |e+0#af5f00255&|l|s|e| +0#0000000&|i+0#af5f00255&|f| +0#0000000&|i|t|.|b|o|d|y| |=@1| |[|]| |{| @47 +@4|/+0#0000e05&@1| |R|e|p|l|a|c|e| |e|m|p|t|y| |c|e|l@1|s| |w|i|t|h| |'|N|/|A|'| +0#0000000&@37 +@4|p+0#00e0e07&|a|d|(+0#0000000&|.@1|i|t|.|i|n|s|e|t|)|[|_|N|/|A|_|]| @48 +@2|}| |e+0#af5f00255&|l|s|e| +0#0000000&|{| @64 +@4|i|t| @68 +@2|}| @71 +|}| @73 +@75 +|#+0#e000e06&|l+0#af5f00255&|e|t| +0#0000000&|a| |=| |t+0#00e0e07&|a|b|l|e|.+0#0000000&|c+0#00e0e07&|e|l@1|(+0#0000000&| @54 +@57|5@1|,|0|-|1| @7|7@1|%| diff --git a/runtime/syntax/testdir/dumps/typst_tables_04.dump b/runtime/syntax/testdir/dumps/typst_tables_04.dump new file mode 100644 index 0000000000..d401cfb962 --- /dev/null +++ b/runtime/syntax/testdir/dumps/typst_tables_04.dump @@ -0,0 +1,20 @@ +|#+0#e000e06#ffffff0|l+0#af5f00255&|e|t| +0#0000000&|a| |=| |t+0#00e0e07&|a|b|l|e|.+0#0000000&|c+0#00e0e07&|e|l@1|(+0#0000000&| @54 +@2|f|i|l@1|:| |g+0#00e0e07&|r|e@1|n|.+0#0000000&|l+0#00e0e07&|i|g|h|t|e|n|(+0#0000000&|6+0#e000002&|0|%|)+0#0000000&|,| @47 +|)|[|A|]| @70 +|#+0#e000e06&|l+0#af5f00255&|e|t| +0#0000000&|b| |=| |t+0#00e0e07&|a|b|l|e|.+0#0000000&|c+0#00e0e07&|e|l@1|(+0#0000000&| @54 +@2|f|i|l@1|:| |a+0#00e0e07&|q|u|a|.+0#0000000&|l+0#00e0e07&|i|g|h|t|e|n|(+0#0000000&|6+0#e000002&|0|%|)+0#0000000&|,| @48 +>)|[|B|]| @70 +@75 +|#+0#e000e06&|t+0#00e0e07&|a|b|l|e|(+0#0000000&| @67 +@2|c|o|l|u|m|n|s|:| |4+0#e000002&|,+0#0000000&| @61 +@2|[|]|,| |[|E|x|a|m| |1|]|,| |[|E|x|a|m| |2|]|,| |[|E|x|a|m| |3|]|,| @39 +@75 +@2|[|J|o|h|n|]|,| |[|]|,| |a|,| |[|]|,| @54 +@2|[|M|a|r|y|]|,| |[|]|,| |a|,| |a|,| @55 +@2|[|R|o|b|e|r|t|]|,| |b|,| |a|,| |b|,| @54 +|)| @73 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|7|3|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/typst_bolditalic.typ b/runtime/syntax/testdir/input/typst_bolditalic.typ new file mode 100644 index 0000000000..bfe8aa6452 --- /dev/null +++ b/runtime/syntax/testdir/input/typst_bolditalic.typ @@ -0,0 +1,7 @@ +- t*he*re +- * there might * * be* *spaces bold * +- _ there might _ _ be_ _spaces in italic _ +- This shouldn't **be bold and italic**. +- This should *_be bold and italic_*. +- This should _*be bold and italic too *_. +- This shouldn't __be italic__ diff --git a/runtime/syntax/testdir/input/typst_codeblocks.typ b/runtime/syntax/testdir/input/typst_codeblocks.typ new file mode 100644 index 0000000000..81c80c606b --- /dev/null +++ b/runtime/syntax/testdir/input/typst_codeblocks.typ @@ -0,0 +1,16 @@ +// VIM_TEST_SETUP let g:typst_embedded_languages = ['python', 'sql'] + += Code Blocks + +== Python + +```python +def hello(world): + print("hello {}" % world) +``` + +== SQL + +```sql +select * from my_table +``` diff --git a/runtime/syntax/testdir/input/typst_lists.typ b/runtime/syntax/testdir/input/typst_lists.typ new file mode 100644 index 0000000000..68dbc76cc4 --- /dev/null +++ b/runtime/syntax/testdir/input/typst_lists.typ @@ -0,0 +1,18 @@ += Lists + ++ #lorem(10) ++ #lorem(20) + - #lorem(15) + - #lorem(15) + - #lorem(15) + - #lorem(15) ++ #lorem(30) + +/ Term 1\:: + + Definition 1 + + Definition 2 + +/ Term 2\::\ + #lorem(25) + +/ Some Lorem: #lorem(50) diff --git a/runtime/syntax/testdir/input/typst_script_base.typ b/runtime/syntax/testdir/input/typst_script_base.typ new file mode 100644 index 0000000000..b8ea883ba6 --- /dev/null +++ b/runtime/syntax/testdir/input/typst_script_base.typ @@ -0,0 +1,15 @@ +#set document(title: "Sample Document") +#import "/typst/habamax.typ": * +#show: habamax.with(name: "Maxim Kim", email: "test@gmail.com") +#set heading(numbering: "(I)") +#show heading: set align(center) +#show heading: set text(font: "Arial") + +#show "once?": it => [#it #it] + +#show heading: it => block[ + \~ + #emph(it.body) // comment 1 + #counter(heading).display() // comment 2 + \~ +] diff --git a/runtime/syntax/testdir/input/typst_script_extended.typ b/runtime/syntax/testdir/input/typst_script_extended.typ new file mode 100644 index 0000000000..69127c381c --- /dev/null +++ b/runtime/syntax/testdir/input/typst_script_extended.typ @@ -0,0 +1,55 @@ +#let habamax(name: "", email: "", text_size: 14pt, doc) = { + import "@preview/cheq:0.3.0": checklist + show: checklist + + set text(size: text_size, lang: "en") + + set page( + header: context { + if counter(page).get().first() > 1 { + set align(right) + set text(8pt) + smallcaps(document.title) + } + }, + footer: context { + if counter(page).final().first() > 1 { + set align(right) + set text(8pt) + counter(page).display("1 / 1", both: true) + } + }, + ) + // set par( + // justify: true, + // first-line-indent: 2em, + // spacing: 0.65em) + set par(justify: true) + set heading(numbering: "1.") + show title: set align(center) + show title: smallcaps + if name == "" { + show title: set block(below: 2em) + title() + } else { + title() + pad(bottom: 2em, + align(center)[ + #name + #h(5pt) + #if email != "" { + [( #link("mailto:" + email) )] + } + ]) + } + + show raw.where(block: true): it => block( + stroke: (left: 1.5pt + luma(220)), + inset: 10pt, + radius: 6pt, + width: 100%, + it, + ) + + doc +} diff --git a/runtime/syntax/testdir/input/typst_tables.typ b/runtime/syntax/testdir/input/typst_tables.typ new file mode 100644 index 0000000000..7cf1089efb --- /dev/null +++ b/runtime/syntax/testdir/input/typst_tables.typ @@ -0,0 +1,82 @@ += Tables + +#table( + columns: (1fr, auto, auto), + inset: 10pt, + align: horizon, + table.header( + [], [*Volume*], [*Parameters*], + ), + [cylinder], + $ pi h (D^2 - d^2) / 4 $, + [ + $h$: height \ + $D$: outer radius \ + $d$: inner radius + ], + [tetrahedron], + $ sqrt(2) / 12 a^3 $, + [$a$: edge length] +) + +#show table.cell.where(y: 0): strong +#set table( + stroke: (x, y) => if y == 0 { + (bottom: 0.7pt + black) + }, + align: (x, y) => ( + if x > 0 { center } + else { left } + ) +) + +#table( + columns: 3, + table.header( + [*Substance*], + [_Subcritical_ °C], + [Supercritical °C], + ), + [Hydrochloric Acid], + [12.0], [92.1], + [Sodium _Myreth_ *_Sulfate_*], + [16.6], [104], + [Potassium Hydroxide], + table.cell(colspan: 2)[24.7], +) + +#set table( + stroke: none, + gutter: 0.2em, + fill: (x, y) => + if x == 0 or y == 0 { gray }, + inset: (right: 1.5em), +) + +#show table.cell: it => { + if it.x == 0 or it.y == 0 { + set text(white) + strong(it) + } else if it.body == [] { + // Replace empty cells with 'N/A' + pad(..it.inset)[_N/A_] + } else { + it + } +} + +#let a = table.cell( + fill: green.lighten(60%), +)[A] +#let b = table.cell( + fill: aqua.lighten(60%), +)[B] + +#table( + columns: 4, + [], [Exam 1], [Exam 2], [Exam 3], + + [John], [], a, [], + [Mary], [], a, a, + [Robert], b, a, b, +) From 5680e3b2946666e237f433756c1a54bcc7814475 Mon Sep 17 00:00:00 2001 From: Celelibi Date: Fri, 3 Jul 2026 16:22:04 +0000 Subject: [PATCH 110/647] runtime(doc): clarify behaviour of 'title' and 'iconstring' Document that some terminals sets the 'icon' as window title. Just like 'title' would. Which can be confusing and need to be documented for both options. closes: #20553 Signed-off-by: Celelibi Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 7339133c6d..7b3713b0d4 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Jun 23 +*options.txt* For Vim version 9.2. Last change: 2026 Jul 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4948,6 +4948,9 @@ A jump table for the options with a short description can be found at |Q_op|. restored if possible |X11|. See |X11-icon| for changing the icon on X11. For MS-Windows the icon can be changed, see |windows-icon|. + NOTE: Some terminals treat the icon text as an alias for the window + title. On those, setting the icon text may also change the terminal + window title; see 'title'. *'iconstring'* 'iconstring' string (default "") @@ -9635,6 +9638,9 @@ A jump table for the options with a short description can be found at |Q_op|. then the WINDOWID environment variable should be inherited and the title of the window should change back to what it should be after exiting Vim. + NOTE: Some terminals treat the icon text as an alias for the window + title (see 'icon'). On those, the interaction between 'title' and + 'icon' depend on the specific behavior of the terminal. *'titlelen'* 'titlelen' number (default 85) From 834b8d218f1db92e587ecd449e5ce88b41fbe256 Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Fri, 3 Jul 2026 16:24:57 +0000 Subject: [PATCH 111/647] patch 9.2.0782: tests: missing cleanup in test_mksession.vim Problem: Some test_mksession tests do not cleanup all the state Solution: Add commands to clean up state introduced by the test (Illia Bobyr) Before this change the following 4 tests were failing when executed individually: Test_mksession_arglocal_localdir Test_mksession_buffer_count Test_mksession_one_buffer_two_windows Test_mksession_winminheight As in ``` TEST_FILTER=winminheight make test_mksession ``` Yet, when ran as part of the whole test suite they succeeded. This was due to some state leaking from one test into another. I think this is bad, as it can confuse someone making changes in the relevant area. `Test_mksession_winminheight` is actually still broken a bit, and requires `winheight` and `winwidth` set at the beginning of the test, rather than later, when it actually matters. This exposes a subtle bug in the session restore script. I have a patch in a separate commit. closes: #20691 Signed-off-by: Illia Bobyr Signed-off-by: Christian Brabandt --- src/testdir/test_mksession.vim | 89 +++++++++++++++++++++++----------- src/version.c | 2 + 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 958c118015..8f35518244 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -29,6 +29,9 @@ func Test__mksession_arglocal() endfunc func Test_mksession_arglocal_localdir() + argglobal + %argdelete + call mkdir('Xa', 'R') call writefile(['This is Xb'], 'Xa/Xb.txt', 'D') let olddir = getcwd() @@ -68,6 +71,7 @@ func Test_mksession() tabnew let wrap_save = &wrap set sessionoptions=buffers splitbelow fileencoding=latin1 + defer execute('set sessionoptions& splitbelow&') call setline(1, [ \ 'start:', \ 'no multibyte chAracter', @@ -160,7 +164,6 @@ func Test_mksession() call delete('Xtest_mks.out') call delete(tmpfile) let &wrap = wrap_save - set sessionoptions& endfunc def Test_mksession_skiprtp() @@ -196,7 +199,9 @@ enddef func Test_mksession_winheight() new set winheight=10 + defer execute('set winheight&') set winminheight=2 + defer execute('set winminheight&') mksession! Xtest_mks.out source Xtest_mks.out @@ -205,6 +210,7 @@ endfunc func Test_mksession_large_winheight() set winheight=999 + defer execute('set winheight&') mksession! Xtest_mks_winheight.out set winheight& source Xtest_mks_winheight.out @@ -213,6 +219,7 @@ endfunc func Test_mksession_zero_winheight() set winminheight=0 + defer execute('set winminheight&') edit SomeFile split wincmd _ @@ -269,6 +276,9 @@ func Test_mksession_arglist() endfunc func Test_mksession_one_buffer_two_windows() + set splitbelow + defer execute('set splitbelow&') + edit Xtest1 new Xtest2 split @@ -377,6 +387,9 @@ func Test_mksession_blank_tabs() endfunc func Test_mksession_buffer_count() + argglobal + %argdelete + set hidden " Edit exactly three files in the current session. @@ -1063,9 +1076,13 @@ endfunc " Test for mksession without options restores winminheight func Test_mksession_winminheight() + set winheight=10 winwidth=10 winminheight& winminwidth& + defer execute('set winheight& winwidth&') set sessionoptions-=options + defer execute('set sessionoptions&') split mksession! Xtest_mks.out + defer delete('Xtest_mks.out') let found_restore = 0 let lines = readfile('Xtest_mks.out') for line in lines @@ -1081,12 +1098,11 @@ func Test_mksession_winminheight() tabclose | tabclose | close call assert_equal(1, tabpagenr('$')) set winminheight=2 winminwidth=2 + defer execute('set winminheight& winminwidth&') source Xtest_mks.out call assert_equal(3, tabpagenr('$')) call assert_equal([2, 2], [&winminheight, &winminwidth]) tabclose | tabclose | close - call delete('Xtest_mks.out') - set sessionoptions& winminheight& winminwidth& endfunc " Test for mksession with and without options restores shortmess @@ -1376,8 +1392,12 @@ func Test_mksession_vim9_expr_mappings() " Load and check the plugin const ref_txt = 'Hello from vim9 dummy plugin!' + let orig_packpath = &packpath let &packpath .= ',' . base + let orig_runtimepath = &runtimepath packadd dummy9 + defer execute('let &packpath = orig_runtimepath') + defer execute('let &runtimepath = orig_runtimepath') messages clear normal dummy-test @@ -1442,8 +1462,12 @@ func Test_mksession_legacy_expr_mappings() " Load and check the plugin const ref_txt = 'Hello from good old dummy plugin!' + let orig_packpath = &packpath let &packpath .= ',' . base + let orig_runtimepath = &runtimepath packadd dummy + defer execute('let &packpath = orig_runtimepath') + defer execute('let &runtimepath = orig_runtimepath') messages clear normal dummy-test @@ -1518,6 +1542,8 @@ func Test_mksession_cursor_position() for file in files call delete(file) endfor + + %bwipe endfunc " Test sessions global and local mappings @@ -1534,32 +1560,37 @@ func Test_mksession_localmappings() for option in ["&", "=options", "=localoptions"] for global in [0, 1] - " select options - exe "set sessionoptions" .. option - - " mapping - exe "nnoremap" . (global ? " " : " ") - \ . "dummy-test silent write XDummyOutput" - let case = $"mapping_{global ? "global" : "local"}_{option}" - - " test mapping - normal dummy-test - call assert_true(filereadable("XDummyOutput"), $"Output file was not created by {case}") - call delete("XDummyOutput") - - " session - let sessionfile = "XSession_" . case - exe $"mksession {sessionfile}" - - if global && option =~ "localoptions" - let invalid_sessions += [sessionfile] - else - let valid_sessions += [sessionfile] - endif - - " clear mappings - nmapclear - nmapclear + try + " select options + exe "set sessionoptions" .. option + + " mapping + exe "nnoremap" . (global ? " " : " ") + \ . "dummy-test silent write XDummyOutput" + let case = $"mapping_{global ? "global" : "local"}_{option}" + + " test mapping + normal dummy-test + call assert_true(filereadable("XDummyOutput"), $"Output file was not created by {case}") + + " session + let sessionfile = "XSession_" . case + exe $"mksession {sessionfile}" + + if global && option =~ "localoptions" + let invalid_sessions += [sessionfile] + else + let valid_sessions += [sessionfile] + endif + + finally + call delete("XDummyOutput") + + " clear mappings + nmapclear + nmapclear + set sessionoptions& + endtry endfor endfor diff --git a/src/version.c b/src/version.c index 7306ff970e..4277e31e30 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 782, /**/ 781, /**/ From f16e30e19d60b0e2dec2b32ba445cd081e2f670e Mon Sep 17 00:00:00 2001 From: coyaSONG <66289470+coyaSONG@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:13:53 +0000 Subject: [PATCH 112/647] patch 9.2.0783: tests: personal spell files leak into later tests Problem: Test_spelldump_prefixtree_overflow() resets 'runtimepath' to defaults, which can expose personal spell files to later tests (Jun-ichi Takimoto, after v9.2.0662) Solution: Save and restore the test runner's 'runtimepath' value (coyaSONG). fixes: #20765 closes: #20766 Co-Authored-By: OpenAI Codex Signed-off-by: coyaSONG <66289470+coyaSONG@users.noreply.github.com> Signed-off-by: Christian Brabandt --- src/testdir/test_spell.vim | 4 +++- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim index b524cf60fc..bd8185a09c 100644 --- a/src/testdir/test_spell.vim +++ b/src/testdir/test_spell.vim @@ -1591,6 +1591,7 @@ endfunc " tree_count_words() fix (9.2.0653). func Test_spelldump_prefixtree_overflow() CheckUnix + let save_rtp = &runtimepath call mkdir('Xrtp/spell', 'pR') " VIMspell + v50, SN_PREFCOND(prefixcnt=1), SN_END, " LWORDTREE word "a" with affixID=1 (so dump_prefixes runs), @@ -1606,7 +1607,8 @@ func Test_spelldump_prefixtree_overflow() spelldump call assert_true(line('$') > 1) - set spell& spelllang& runtimepath& + set spell& spelllang& + let &runtimepath = save_rtp bwipe! bwipe! endfunc diff --git a/src/version.c b/src/version.c index 4277e31e30..e3b6bdf836 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 783, /**/ 782, /**/ From 528adbd7579e37f685072460acdd00b0887acc49 Mon Sep 17 00:00:00 2001 From: yasuda Date: Fri, 17 Jul 2026 14:31:48 +0000 Subject: [PATCH 113/647] runtime(netrw): Fix `reset_ssl` reference error on file rename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes: #20710 closes: #20777 closes: #20698 Co-Authored-by: Doruk Özer Signed-off-by: yasuda Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/netrw/autoload/netrw.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index 4dc60eefa1..d82dd90768 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jul 01 +" Last Change: 2026 Jul 17 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -8680,6 +8680,7 @@ function s:NetrwLocalRename(path) range endif NetrwKeepj norm! 0 + let reset_ssl = 0 if exists('+shellslash') && !&ssl let reset_ssl = 1 set ssl From b212f440aeee5767421de2ebf7b186ca942519d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:38:04 +0000 Subject: [PATCH 114/647] CI: Bump the github-actions group across 1 directory with 2 updates Bumps the github-actions group with 2 updates in the / directory: [actions/cache](https://github.com/actions/cache) and [github/codeql-action](https://github.com/github/codeql-action). Updates `actions/cache` from 5.0.5 to 6.1.0 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v5.0.5...v6.1.0) Updates `github/codeql-action` from 4.36.2 to 4.36.3 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.36.2...v4.36.3) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: github/codeql-action dependency-version: 4.36.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... closes: #20749 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/ci-windows.yml | 2 +- .github/workflows/codeql-analysis.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index e4b8cdecd2..fb964cb783 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -141,7 +141,7 @@ jobs: echo %GETTEXT64_URL%>> urls.txt - name: Cache downloaded files - uses: actions/cache@v5.0.5 + uses: actions/cache@v6.1.0 with: path: downloads key: ${{ runner.os }}-${{ matrix.arch }}-${{ hashFiles('urls.txt') }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8a5c8f2dd5..af3e4eabb3 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.36.2 + uses: github/codeql-action/init@v4.36.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.36.2 + uses: github/codeql-action/autobuild@v4.36.3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.36.2 + uses: github/codeql-action/analyze@v4.36.3 From 27e560c68ccb6174805a358db55e1eaf555c1dd1 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 17 Jul 2026 14:52:07 +0000 Subject: [PATCH 115/647] patch 9.2.0784: crash when borrowing statusline highlight in silent Ex mode Problem: Vim crashes with a NULL pointer dereference when a status line is redrawn next to a vertical separator in silent Ex mode, where the screen cell arrays are not allocated (tdjackey). Solution: Skip borrowing the vertical separator highlight when the screen is not allocated (Hirohito Higashi). closes: #20776 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/drawscreen.c | 4 +++- src/testdir/crash/poc_borrow_stl_vsep_hl | 2 ++ src/testdir/test_crash.vim | 6 ++++++ src/version.c | 2 ++ 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/testdir/crash/poc_borrow_stl_vsep_hl diff --git a/src/drawscreen.c b/src/drawscreen.c index be5f77a538..65d6a88d31 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -657,7 +657,9 @@ borrow_stl_vsep_hl(void) win_T *left = NULL; win_T *right = NULL; - if (!redrawing()) + // In silent Ex mode the screen is not allocated, so LineOffset and + // ScreenAttrs are NULL; there is nothing to borrow. + if (!redrawing() || ScreenLines == NULL) return; FOR_ALL_WINDOWS(left) diff --git a/src/testdir/crash/poc_borrow_stl_vsep_hl b/src/testdir/crash/poc_borrow_stl_vsep_hl new file mode 100644 index 0000000000..136b700c9f --- /dev/null +++ b/src/testdir/crash/poc_borrow_stl_vsep_hl @@ -0,0 +1,2 @@ +vnew +o x diff --git a/src/testdir/test_crash.vim b/src/testdir/test_crash.vim index 9b673e4e2a..2a970a3c31 100644 --- a/src/testdir/test_crash.vim +++ b/src/testdir/test_crash.vim @@ -83,6 +83,11 @@ func Test_crash1() call delete('Xerr') call delete('@') + let file = 'crash/poc_borrow_stl_vsep_hl' + let args = printf(cmn_args, vim, file) + call s:RunCommandAndWait(buf, args .. + \ ' && echo "crash 11: [OK]" >> X_crash1_result.txt') + " clean up exe buf .. "bw!" @@ -99,6 +104,7 @@ func Test_crash1() \ 'crash 8: [OK]', \ 'crash 9: [OK]', \ 'crash 10: [OK]', + \ 'crash 11: [OK]', \ ] call assert_equal(expected, getline(1, '$')) diff --git a/src/version.c b/src/version.c index e3b6bdf836..5d0425b3f7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 784, /**/ 783, /**/ From dc8a7195e5b58dc0050b340aa7e7844ca5901200 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 17 Jul 2026 15:03:10 +0000 Subject: [PATCH 116/647] patch 9.2.0785: WinResized not triggered when the whole Vim is resized Problem: When the whole Vim (terminal or GUI) is resized, VimResized fires right away but WinResized does not: it only triggers on the next typed command, even though the windows already changed size (Mao-Yining). Solution: Trigger the WinResized (and WinScrolled) check right after firing VimResized on a shell resize, so window size changes are reported immediately instead of waiting for the next command (Hirohito Higashi). fixes: #20774 closes: #20775 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/screen.c | 3 +++ src/testdir/test_autocmd.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 26 insertions(+) diff --git a/src/screen.c b/src/screen.c index de2def9e0f..7d75af0226 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3531,6 +3531,9 @@ screenalloc(int doclear) if (starting == 0 && ++retry_count <= 3) { apply_autocmds(EVENT_VIMRESIZED, NULL, NULL, FALSE, curbuf); + // A shell resize also changes window sizes; trigger WinResized (and + // WinScrolled) now instead of waiting for the next command. + may_trigger_win_scrolled_resized(); // In rare cases, autocommands may have altered Rows or Columns, // jump back to check if we need to allocate the screen again. goto retry; diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index b2a3dea149..7e36eec53e 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -5872,6 +5872,27 @@ func Test_VimResized_and_window_width_not_equalized() call StopVimInTerminal(buf) endfunc +func Test_WinResized_on_shell_resize() + CheckRunVimInTerminal + + " A shell (terminal/GUI) resize changes window sizes, so WinResized must + " trigger from the resize alone, not only on the next typed command. + let lines =<< trim END + autocmd WinResized * call writefile(['x'], 'XwinResized', 'a') + END + call writefile(lines, 'XTest_WinResized_shell', 'D') + let buf = RunVimInTerminal('-S XTest_WinResized_shell', {'rows': 10, 'cols': 30}) + call TermWait(buf) + call delete('XwinResized') + + " Resize the terminal (SIGWINCH); do not send any key to the inner Vim. + call term_setsize(buf, 15, 40) + call WaitForAssert({-> assert_true(filereadable('XwinResized'))}) + + call StopVimInTerminal(buf) + call delete('XwinResized') +endfunc + func Test_win_tabclose_autocmd() defer CleanUpTestAuGroup() diff --git a/src/version.c b/src/version.c index 5d0425b3f7..17f67c4328 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 785, /**/ 784, /**/ From 467fe6581431608e7086900b638e11ba1b458c99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 03:41:27 +0000 Subject: [PATCH 117/647] CI: Bump the github-actions group across 1 directory with 2 updates Bumps the github-actions group with 2 updates in the / directory: [github/codeql-action](https://github.com/github/codeql-action) and [actions/labeler](https://github.com/actions/labeler). Updates `github/codeql-action` from 4.36.3 to 4.37.0 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.36.3...v4.37.0) Updates `actions/labeler` from 6.1.0 to 6.2.0 - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/labeler dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... closes: #20784 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/label.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index af3e4eabb3..eaa78b1936 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.36.3 + uses: github/codeql-action/init@v4.37.0 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.36.3 + uses: github/codeql-action/autobuild@v4.37.0 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.36.3 + uses: github/codeql-action/analyze@v4.37.0 diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 4172d28e0d..f12b48feff 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -17,6 +17,6 @@ jobs: pull-requests: write steps: - - uses: actions/labeler@v6.1.0 + - uses: actions/labeler@v6.2.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From 6b62ae68c6df250019085fea2992399f1477ad4f Mon Sep 17 00:00:00 2001 From: Omer Tuchfeld Date: Sat, 18 Jul 2026 03:47:31 +0000 Subject: [PATCH 118/647] patch 9.2.0786: filetype: Containerfile is not recognized Problem: filetype: Containerfile is not recognized Solution: Detect *.[Cc]ontainerfiles as dockerfile filetype (Omer Tuchfeld) closes: #20783 Supported by AI. Signed-off-by: Omer Tuchfeld Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 7 ++++++- runtime/filetype.vim | 4 ++-- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 8de0176216..18fcfbb641 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jun 14 +# Last Change: 2026 Jul 18 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -1860,6 +1860,11 @@ const ft_from_ext = { "cairo": "cairo", # Cap'n Proto "capnp": "capnp", + # Dockerfile + "containerfile": "dockerfile", + "Containerfile": "dockerfile", + "dockerfile": "dockerfile", + "Dockerfile": "dockerfile", # Common Package Specification "cps": "json", # C# diff --git a/runtime/filetype.vim b/runtime/filetype.vim index d4baad6d8c..01a5130227 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: The Vim Project -" Last Change: 2026 Jun 03 +" Last Change: 2026 Jul 18 " Former Maintainer: Bram Moolenaar " If the filetype can be detected from extension or file name(the final path component), @@ -281,7 +281,7 @@ au BufNewFile,BufRead *.cpy " Dockerfile; Podman uses the same syntax with name Containerfile " Also see Dockerfile.* below. -au BufNewFile,BufRead Containerfile,Dockerfile,dockerfile,*.[dD]ockerfile setf dockerfile +au BufNewFile,BufRead Containerfile,Dockerfile,dockerfile setf dockerfile " Enlightenment configuration files au BufNewFile,BufRead *enlightenment/*.cfg setf c diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 87b640e02d..13c5770d72 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -246,7 +246,7 @@ def s:GetFilenameChecks(): dict> dircolors: ['.dir_colors', '.dircolors', '/etc/DIR_COLORS', 'any/etc/DIR_COLORS'], djot: ['file.dj', 'file.djot'], dnsmasq: ['/etc/dnsmasq.conf', '/etc/dnsmasq.d/file', 'any/etc/dnsmasq.conf', 'any/etc/dnsmasq.d/file'], - dockerfile: ['Containerfile', 'Dockerfile', 'dockerfile', 'file.Dockerfile', 'file.dockerfile', 'Dockerfile.debian', 'Containerfile.something'], + dockerfile: ['Containerfile', 'Dockerfile', 'dockerfile', 'file.Dockerfile', 'file.dockerfile', 'file.Containerfile', 'file.containerfile', 'Dockerfile.debian', 'Containerfile.something'], dosbatch: ['file.bat'], dosini: ['/etc/yum.conf', '/etc/nfs.conf', '/etc/nfsmount.conf', 'file.ini', 'npmrc', '.npmrc', 'php.ini', 'php.ini-5', 'php.ini-file', 'php-fpm.conf', 'php-fpm.conf.default', 'www.conf', 'www.conf.default', diff --git a/src/version.c b/src/version.c index 17f67c4328..597a4f71b4 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 786, /**/ 785, /**/ From c7feefe170e39a272148824af0c4b648532220d7 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sat, 18 Jul 2026 03:53:47 +0000 Subject: [PATCH 119/647] patch 9.2.0787: regexp: code 0x1ecb duplicated for equivalence class Problem: regexp: code 0x1ecb duplicated for equivalence class (Sami Farin) Solution: Remove it fixes: #8029#issuecomment-4998990223 closes: #20782 Signed-off-by: Christian Brabandt --- src/regexp_nfa.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index 4bd588b4e4..d52ea4034d 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -1105,7 +1105,7 @@ nfa_emit_equi_class(int c) EMIT2(0x12f) EMIT2(0x1d0) EMIT2(0x209) EMIT2(0x20b) EMIT2(0x268) EMIT2(0x1d96) EMIT2(0x1e2d) EMIT2(0x1e2f) EMIT2(0x1ec9) - EMIT2(0x1ecb) EMIT2(0x1ecb) + EMIT2(0x1ecb) return OK; case 'j': case 0x135: case 0x1f0: case 0x249: diff --git a/src/version.c b/src/version.c index 597a4f71b4..f13a89b811 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 787, /**/ 786, /**/ From b3ad239038ff1d3e1708b0027454b2ef6a86a8a2 Mon Sep 17 00:00:00 2001 From: Young Date: Sat, 18 Jul 2026 09:39:58 +0000 Subject: [PATCH 120/647] patch 9.2.0788: filetype: hip files are not recognized Problem: filetype: hip files are not recognized Solution: Detect *.hip files as hip filetype, include filetype, syntax and indent plugins, update makemenu.vim and synmenu.vim (Young) Round out HIP (Heterogeneous-compute Interface for Portability) support to mirror the existing CUDA files: - autoload/dist/ft.vim: detect the ".hip" extension as filetype "hip" - ftplugin/hip.vim: behave like C++ by sourcing ftplugin/cpp.vim - indent/hip.vim: use cindent, like indent/cuda.vim - makemenu.vim / synmenu.vim: add a Syntax menu entry The syntax/hip.vim file already sources syntax/cpp.vim and adds the HIP-specific keywords, matching syntax/cuda.vim. closes: #20773 Co-Authored-By: Claude Opus 4.8 Signed-off-by: Young Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/autoload/dist/ft.vim | 2 ++ runtime/ftplugin/hip.vim | 11 ++++++++ runtime/indent/hip.vim | 15 ++++++++++ runtime/makemenu.vim | 1 + runtime/synmenu.vim | 1 + runtime/syntax/hip.vim | 52 +++++++++++++++++++++++++++++++++++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 ++ 9 files changed, 86 insertions(+) create mode 100644 runtime/ftplugin/hip.vim create mode 100644 runtime/indent/hip.vim create mode 100644 runtime/syntax/hip.vim diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 6fdafa0945..81bf38d68a 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -584,6 +584,7 @@ runtime/syntax/hcl.vim @gpanders runtime/syntax/help.vim @dkearns runtime/syntax/help_ru.vim @RestorerZ runtime/syntax/hgcommit.vim @k-takata +runtime/syntax/hip.vim @Young-TW runtime/syntax/hitest.vim @lacygoill runtime/syntax/hog.vim @wtfbbqhax runtime/syntax/hollywood.vim @sodero diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 18fcfbb641..a72e91e3ea 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -1969,6 +1969,8 @@ const ft_from_ext = { # CUDA Compute Unified Device Architecture "cu": "cuda", "cuh": "cuda", + # HIP Heterogeneous-compute Interface for Portability + "hip": "hip", # Cue "cue": "cue", # DAX diff --git a/runtime/ftplugin/hip.vim b/runtime/ftplugin/hip.vim new file mode 100644 index 0000000000..c57fa2112a --- /dev/null +++ b/runtime/ftplugin/hip.vim @@ -0,0 +1,11 @@ +" Vim filetype plugin +" Language: HIP (Heterogeneous-compute Interface for Portability) +" Maintainer: The Vim Project +" Last Change: 2026 Jul 15 + +if exists('b:did_ftplugin') + finish +endif + +" Behaves mostly just like C++ +runtime! ftplugin/cpp.vim diff --git a/runtime/indent/hip.vim b/runtime/indent/hip.vim new file mode 100644 index 0000000000..680fc8b4d9 --- /dev/null +++ b/runtime/indent/hip.vim @@ -0,0 +1,15 @@ +" Vim indent file +" Language: HIP (Heterogeneous-compute Interface for Portability) +" Maintainer: The Vim Project +" Last Change: 2026 Jul 15 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" It's just like C indenting +setlocal cindent + +let b:undo_indent = "setl cin<" diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 3cff23db2a..6611f737cd 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -276,6 +276,7 @@ SynMenu HIJK.Hercules:hercules SynMenu HIJK.Hex\ dump.XXD:xxd SynMenu HIJK.Hex\ dump.Intel\ MCS51:hex SynMenu HIJK.Hg\ commit:hgcommit +SynMenu HIJK.HIP:hip SynMenu HIJK.Hollywood:hollywood SynMenu HIJK.HTML.HTML:html SynMenu HIJK.HTML.HTML\ with\ M4:htmlm4 diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index 5d3321585e..c26c128b3c 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -257,6 +257,7 @@ an 50.50.170 &Syntax.HIJK.Hercules :cal SetSyn("hercules") an 50.50.180 &Syntax.HIJK.Hex\ dump.XXD :cal SetSyn("xxd") an 50.50.190 &Syntax.HIJK.Hex\ dump.Intel\ MCS51 :cal SetSyn("hex") an 50.50.200 &Syntax.HIJK.Hg\ commit :cal SetSyn("hgcommit") +an 50.50.205 &Syntax.HIJK.HIP :cal SetSyn("hip") an 50.50.210 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") an 50.50.220 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") an 50.50.230 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") diff --git a/runtime/syntax/hip.vim b/runtime/syntax/hip.vim new file mode 100644 index 0000000000..f3bec3f49c --- /dev/null +++ b/runtime/syntax/hip.vim @@ -0,0 +1,52 @@ +" Vim syntax file +" Language: HIP (Heterogeneous-compute Interface for Portability) +" Maintainer: Young +" Last Change: 2026 Jul 15 +" Based On: syntax/cuda.vim by Timothy B. Terriberry + +" quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +" Read the C++ syntax to start with +runtime! syntax/cpp.vim + +" HIP extensions. +" Reference: https://docs.amd.com/en/latest/develop-perf-tips/hip-programming-guide/ +syn keyword hipStorageClass __device__ __global__ __host__ __managed__ +syn keyword hipStorageClass __constant__ __grid_constant__ __shared__ +syn keyword hipStorageClass __inline__ __noinline__ __forceinline__ __inline_hint__ +syn keyword hipStorageClass __align__ __thread__ __restrict__ +syn keyword hipType char1 char2 char3 char4 +syn keyword hipType uchar1 uchar2 uchar3 uchar4 +syn keyword hipType short1 short2 short3 short4 +syn keyword hipType ushort1 ushort2 ushort3 ushort4 +syn keyword hipType int1 int2 int3 int4 +syn keyword hipType uint1 uint2 uint3 uint4 +syn keyword hipType long1 long2 long3 long4 +syn keyword hipType ulong1 ulong2 ulong3 ulong4 +syn keyword hipType longlong1 longlong2 longlong3 longlong4 +syn keyword hipType ulonglong1 ulonglong2 ulonglong3 ulonglong4 +syn keyword hipType float1 float2 float3 float4 +syn keyword hipType double1 double2 double3 double4 +syn keyword hipType dim3 texture textureReference +syn keyword hipType hipError_t hipDeviceProp hipMemcpyKind +syn keyword hipType hipArray hipChannelFormatKind +syn keyword hipType hipChannelFormatDesc hipTextureAddressMode +syn keyword hipType hipTextureFilterMode hipTextureReadMode +syn keyword hipVariable gridDim blockIdx blockDim threadIdx warpSize +syn keyword hipConstant __HIP_ARCH__ +syn keyword hipConstant __DEVICE_EMULATION__ +" There are too many HIP enumeration constants. We only define a subset of commonly used constants. +" Reference: https://docs.amd.com/en/latest/develop-perf-tips/hip-programming-guide/ +syn keyword hipConstant hipSuccess + +hi def link hipStorageClass StorageClass +hi def link hipType Type +hi def link hipVariable Identifier +hi def link hipConstant Constant + +let b:current_syntax = "hip" + +" vim: ts=8 diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 13c5770d72..bc377440a9 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -377,6 +377,7 @@ def s:GetFilenameChecks(): dict> hercules: ['file.vc', 'file.ev', 'file.sum', 'file.errsum'], hex: ['file.hex', 'file.ihex', 'file.ihe', 'file.ihx', 'file.int', 'file.mcs', 'file.h32', 'file.h80', 'file.h86', 'file.a43', 'file.a90'], hgcommit: ['hg-editor-file.txt'], + hip: ['file.hip'], hjson: ['file.hjson'], hlsplaylist: ['file.m3u', 'file.m3u8'], hog: ['file.hog', 'snort.conf', 'vision.conf'], diff --git a/src/version.c b/src/version.c index f13a89b811..93e38b8a00 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 788, /**/ 787, /**/ From 922d991f77eb54b2f1e3cb28edcce6487f81f8cc Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sat, 18 Jul 2026 09:43:15 +0000 Subject: [PATCH 121/647] runtime(cuda): Fix typo in cuda syntax file related: #20773 Signed-off-by: Christian Brabandt --- runtime/syntax/cuda.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/syntax/cuda.vim b/runtime/syntax/cuda.vim index 8306d096a0..dc9b3c6dbb 100644 --- a/runtime/syntax/cuda.vim +++ b/runtime/syntax/cuda.vim @@ -12,7 +12,7 @@ endif " Read the C++ syntax to start with runtime! syntax/cpp.vim -" CUDA extentions. +" CUDA extensions. " Reference: https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions syn keyword cudaStorageClass __device__ __global__ __host__ __managed__ syn keyword cudaStorageClass __constant__ __grid_constant__ __shared__ From 34616d918d12c5fdeed6fbab76999c1d8c387c9b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 18 Jul 2026 09:46:33 +0000 Subject: [PATCH 122/647] patch 9.2.0789: 'statuslineopt' status line too high after a window is minimized Problem: With a global 'statuslineopt' maxheight, the status line height is not reduced to what every window can afford. After a window is put at its minimum height (e.g. CTRL-W_), setting 'statuslineopt' still gives a status line taller than the small window can display, instead of the best-effort height that fits all windows. Solution: Let every window using the global 'statuslineopt' constrain the best-effort height, including windows at their minimum height. Correct a misleading test comment and add a test (Hirohito Higashi). closes: #20772 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- ...slineopt_wincmd_underscore_besteff_01.dump | 14 +++++++++++ src/testdir/test_statuslineopt.vim | 25 +++++++++++++++++-- src/version.c | 2 ++ src/window.c | 7 +++--- 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/testdir/dumps/Test_statuslineopt_wincmd_underscore_besteff_01.dump diff --git a/src/testdir/dumps/Test_statuslineopt_wincmd_underscore_besteff_01.dump b/src/testdir/dumps/Test_statuslineopt_wincmd_underscore_besteff_01.dump new file mode 100644 index 0000000000..47fd4e2b84 --- /dev/null +++ b/src/testdir/dumps/Test_statuslineopt_wincmd_underscore_besteff_01.dump @@ -0,0 +1,14 @@ +> +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|G+3#0000000&|A| @72 +| +0&&@74 +|G+1&&|A| @72 +| +0&&@74 diff --git a/src/testdir/test_statuslineopt.vim b/src/testdir/test_statuslineopt.vim index 653529e356..c5519aa8b8 100644 --- a/src/testdir/test_statuslineopt.vim +++ b/src/testdir/test_statuslineopt.vim @@ -391,8 +391,8 @@ func Test_statuslineopt_wincmd_underscore() CheckScreendump " Test CTRL-W__ with global stlo maxheight:3 and multi-line statusline. - " After maximizing, the large window should keep stlh=3, not collapse to 1 - " because the minimized other window constrained global_stlh. + " The height is computed when 'stlo' is set (a single window here, so 3). + " Splitting and maximizing do not recompute it, so both status lines stay 3. let lines =<< trim END set laststatus=2 set statuslineopt=maxheight:3 @@ -408,6 +408,27 @@ func Test_statuslineopt_wincmd_underscore() call StopVimInTerminal(buf) endfunc +func Test_statuslineopt_wincmd_underscore_besteff() + CheckScreendump + + " Best effort when global 'stlo' is set after CTRL-W__ has minimized the + " other window. That window only fits a 1-row status line, so the global + " height is reduced to 1 even though maxheight is 3. + let lines =<< trim END + set laststatus=2 + set statusline=GA%@GB%@GC + new + wincmd _ + END + call writefile(lines, 'XTest_statuslineopt_wincmd_underscore_besteff', 'D') + + let buf = g:RunVimInTerminal('-S XTest_statuslineopt_wincmd_underscore_besteff', {'rows': 14}) + call term_sendkeys(buf, ":set statuslineopt=maxheight:3\\") + call VerifyScreenDump(buf, 'Test_statuslineopt_wincmd_underscore_besteff_01', {}) + + call StopVimInTerminal(buf) +endfunc + def Test_statuslineopt_besteff_order() # Test the best-effort option update: keyword order is preserved and # duplicate maxheight: removed. diff --git a/src/version.c b/src/version.c index 93e38b8a00..86904555a2 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 789, /**/ 788, /**/ diff --git a/src/window.c b/src/window.c index 89c890f0f4..3933f4e884 100644 --- a/src/window.c +++ b/src/window.c @@ -7830,10 +7830,9 @@ frame_find_global_stlh_rec(frame_T *frp, int h) win_T *wp = frp->fr_win; // Only consider windows with a status line that use global stlo. - // Exclude windows at minimum height (w_height <= p_wmh): they can - // only afford 1 status line row anyway, and should not constrain - // the global stlh for larger windows (e.g. after CTRL-W__). - if (wp->w_height > p_wmh && wp->w_status_height > 0 + // Every such window constrains the global height (best effort): the + // result is the largest height that still fits every window. + if (wp->w_height > 0 && wp->w_status_height > 0 && *wp->w_p_stlo == NUL) { int win_free_height = frp->fr_height - WINBAR_HEIGHT(wp); From 475690d794ef2bc3643f53835abcc792581b85da Mon Sep 17 00:00:00 2001 From: glepnir Date: Sat, 18 Jul 2026 09:50:11 +0000 Subject: [PATCH 123/647] patch 9.2.0790: 'completeslash' breaks :find completion with 'findfunc' Problem: On MS-Windows with 'completeslash' set, an item completed by 'findfunc' cannot be opened with :find, E345 is given (Mao-Yining) Solution: Do not apply 'completeslash' to matches returned by 'findfunc', they are opaque strings that are passed back to the function unchanged (glepnir) fixes: #20770 closes: #20771 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/cmdexpand.c | 4 +++- src/testdir/test_findfile.vim | 25 +++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index bedcfdf368..9782993758 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -3346,7 +3346,9 @@ expand_files_and_dirs( if (free_pat) vim_free(pat); #ifdef BACKSLASH_IN_FILENAME - if (p_csl[0] != NUL && (options & WILD_IGNORE_COMPLETESLASH) == 0) + if (p_csl[0] != NUL + && (options & WILD_IGNORE_COMPLETESLASH) == 0 + && xp->xp_context != EXPAND_FINDFUNC) { int j; diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim index a5f1f6fdd4..3de2463feb 100644 --- a/src/testdir/test_findfile.vim +++ b/src/testdir/test_findfile.vim @@ -898,4 +898,29 @@ func Test_path_env_variable_with_whitespaces() enew endfunc +func Test_findfunc_completeslash() + CheckMSWindows + + func FindBsl(pat, cmdarg) + return ['Xdir\foo.c']->matchfuzzy(a:pat) + endfunc + func FindFwd(pat, cmdarg) + return ['Xdir/foo.c']->matchfuzzy(a:pat) + endfunc + + set findfunc=FindBsl + set completeslash=slash + call feedkeys(":find Xdir\\\"\", 'tx') + call assert_equal('"find Xdir\foo.c', @:) + + set findfunc=FindFwd + set completeslash=backslash + call feedkeys(":find Xdir\\\"\", 'tx') + call assert_equal('"find Xdir/foo.c', @:) + + set completeslash& findfunc& + delfunc FindBsl + delfunc FindFwd +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 86904555a2..f9abe4fa15 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 790, /**/ 789, /**/ From 7b11d840c00d3807a7ac88e131fefd886fe2cfa4 Mon Sep 17 00:00:00 2001 From: Mao-Yining Date: Sat, 18 Jul 2026 12:48:23 +0000 Subject: [PATCH 124/647] runtime(doc): Improve fuzzy file picker doc 1. Only reset cache after used. 2. Use `expand('**', 1, 1)` than `globpath('.', '**', 1, 1)`. | Environment | expand (s) | globpath (s) | expand faster | | --------------- | ---------- | ------------ | ------------- | | WSL (small) | 0.0491 | 0.0537 | 9.4% | | Windows (large) | 1.6606 | 2.3565 | 41.9% | 3. fnamemodify() is useless here. closes: #20767 Signed-off-by: Mao-Yining Signed-off-by: Christian Brabandt --- runtime/doc/cmdline.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt index 6427507d7e..0f1fa50dbd 100644 --- a/runtime/doc/cmdline.txt +++ b/runtime/doc/cmdline.txt @@ -1,4 +1,4 @@ -*cmdline.txt* For Vim version 9.2. Last change: 2026 May 20 +*cmdline.txt* For Vim version 9.2. Last change: 2026 Jul 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1428,16 +1428,15 @@ For example, you can turn the native |:find| command into a fuzzy, interactive file picker: > set findfunc=Find + let s:filescache = [] func Find(arg, _) if empty(s:filescache) - let s:filescache = globpath('.', '**', 1, 1) + autocmd CmdlineLeave : ++once let s:filescache = [] + let s:filescache = expand('**', 1, 1) call filter(s:filescache, '!isdirectory(v:val)') - call map(s:filescache, "fnamemodify(v:val, ':.')") endif - return a:arg == '' ? s:filescache : matchfuzzy(s:filescache, a:arg) + return empty(a:arg) ? s:filescache : matchfuzzy(s:filescache, a:arg) endfunc - let s:filescache = [] - autocmd CmdlineEnter : let s:filescache = [] The `:Grep` command searches for lines matching a pattern and updates the results dynamically as you type (triggered after two characters; note: needs From 95a1932e87bbb9c90842a4341d5c6f0efa99fe7a Mon Sep 17 00:00:00 2001 From: Sergey Vlasov Date: Sat, 18 Jul 2026 13:11:06 +0000 Subject: [PATCH 125/647] patch 9.2.0791: wincol() counts from right side for 'rightleft' Problem: wincol() counts cells from right side of the window if 'rightleft' is enabled. Solution: Fix wincol() to count from left side of the window as documented (Sergey Vlasov). closes: #20763 Signed-off-by: Sergey Vlasov Signed-off-by: Christian Brabandt --- src/evalwindow.c | 7 ++++++- src/testdir/test_functions.vim | 37 ++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/evalwindow.c b/src/evalwindow.c index c93979e08c..23cd92b677 100644 --- a/src/evalwindow.c +++ b/src/evalwindow.c @@ -1126,7 +1126,12 @@ f_winbufnr(typval_T *argvars, typval_T *rettv) f_wincol(typval_T *argvars UNUSED, typval_T *rettv) { validate_cursor(); - rettv->vval.v_number = curwin->w_wcol + 1; + int col = curwin->w_wcol + 1; +# ifdef FEAT_RIGHTLEFT + if (curwin->w_p_rl) + col = curwin->w_width - col + 1; +# endif + rettv->vval.v_number = col; } /* diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index d2e5f6e21a..9882183429 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -1,6 +1,7 @@ " Tests for various functions. source util/screendump.vim +source util/view_util.vim import './util/vim9.vim' as v9 " Must be done first, since the alternate buffer must be unset. @@ -4705,4 +4706,40 @@ func Test_vim9_def_defer_fc_sandbox() delfunction g:BadDefer endfunc +" Test wincol() counts in screen cells from left side of the window +func Test_wincol() + enew! + set ff=unix mouse=a + + let win_width = 30 + call NewWindow(20, win_width) + + call setline(1, "the quick brown fox jump") + + norm! 0 + call assert_equal([1, 1], [winline(), wincol()]) + + call test_setmouse(1, 10) + call feedkeys("\\", "xt") + call assert_equal([1, 10], [winline(), wincol()]) + + if has('rightleft') + norm! 0 + call assert_equal([1, 1], [winline(), wincol()]) + + set rightleft + " cursor is still at column 1, but in screen cells it is at the distance of window width: + call assert_equal([1, win_width], [winline(), wincol()]) + + " test_setmouse() works in screen coordinates, which is not affected by 'rightleft': + call test_setmouse(1, 10) + call feedkeys("\\", "xt") + call assert_equal([1, 10], [winline(), wincol()]) + set rightleft& + endif + + set ff& mouse& + bw! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index f9abe4fa15..77d596c04e 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 791, /**/ 790, /**/ From 3c463a97c4f60d9af008f18af37cb622d4296820 Mon Sep 17 00:00:00 2001 From: Gagik Hakobyan Date: Sat, 18 Jul 2026 13:16:22 +0000 Subject: [PATCH 126/647] translation(hy): Update Armenian language translation Supported by AI. closes: #20762 Signed-off-by: Gagik Hakobyan Signed-off-by: Christian Brabandt --- src/po/hy.po | 1044 +++++++++++++++++++++++++++----------------------- 1 file changed, 575 insertions(+), 469 deletions(-) diff --git a/src/po/hy.po b/src/po/hy.po index 88906f76cf..bf733851a3 100644 --- a/src/po/hy.po +++ b/src/po/hy.po @@ -3,16 +3,16 @@ # Do ":help uganda" in Vim to read copying and usage conditions. # Do ":help credits" in Vim to see a list of people who contributed. # -# Gagik Hakobyan 2015 +# Gagik Hakobyan 2015 # option - ընտրանք # unload - բեռնաթափել # load - բեռնել # loop - շրջակցում -# range - միջակայք -# Color - երկկետ +# range - տիրույթ +# Colon - երկկետ # prefix - նախածանց # nested - ներդրված -# flag - դրոշմանիշ +# flag - դրոշ # compound - պարփակ # region - ռեգիոն # include - կցաֆայլ @@ -29,10 +29,10 @@ # ignore - անտեսել # replace - փոխարինում # pattern - նմուշ -# delimiter - բաժանիչ +# delimiter - բացատանիշ # equal - համարժեք -# settings - կարգաբերում -# duplicate - կրկնակի +# settings - կարգավորումներ +# duplicate - կրկնվող # found - հայտնաբերված # support - աջակցում # class - դաս @@ -40,7 +40,7 @@ # soundfold - ձայնափաթաթ # swap - փոխատեղում # menu - մենյու/ընտրացանկ -# undo - չեղարկում +# undo - հետարկել # overwrite - վերագրել # skip - # owner - օգտատեր @@ -51,7 +51,7 @@ # mark - նշակ # key - բանալի # keyword - հիմնաբառ -# character - նշան/տառ +# character - նիշ # demage - վնասված # abort - ընդհատում # event - իրադարձություն @@ -61,17 +61,20 @@ # spell - ուղղագրում # directory - թղթապանակ # swapfile - սվեփ ֆայլ -# Insert mode -> Ներդիր ռեժիմ +# Insert mode -> զետեղման ռեժիմ # Popup - Սահապատ # Custom - Անհատականացված -# Completion - Ավտոլրացում +# completion - լրացում +# autocompletion - ավտոլրացում # Clipboard - Սեղմատախտակ +# Typeset - շարվածք +# optional - կամընտիր msgid "" msgstr "" "Project-Id-Version: vim_9.1_am\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-03-30 11:05+0900\n" -"PO-Revision-Date: 2025-12-21 15:32+0400\n" +"POT-Creation-Date: 2026-06-27 08:41+0000\n" +"PO-Revision-Date: 2026-07-15 22:13+0400\n" "Last-Translator: Gagik Hakobyan \n" "Language-Team: Armenian\n" "Language: hy\n" @@ -79,10 +82,10 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.9\n" +"X-Loco-Parser: loco_parse_po\n" "X-Loco-Source-Locale: en_AM\n" -"X-Generator: Poedit 3.8\n" "X-Poedit-KeywordsList: փաթաթ;միջակայք\n" -"X-Loco-Parser: loco_parse_po\n" msgid "ERROR: " msgstr "ՍԽԱԼ: " @@ -125,7 +128,7 @@ msgstr "" #, c-format msgid "No matching autocommands: %s" -msgstr "Չկան համապատասխան ինքնահրամաններ: %s" +msgstr "Համընկնող ինքնահրամաններ չկան: %s" #, c-format msgid "%s Autocommands for \"%s\"" @@ -306,10 +309,10 @@ msgstr "" "Զգուշացում: նախնական ֆայլը հնարավոր է վնասված է\n" msgid "don't quit the editor until the file is successfully written!" -msgstr "մի փակեք խմբագիրը քանի դեռ ֆայլը հաջողությամբ կգրվի!" +msgstr "մի փակեք խմբագիրը քանի դեռ ֆայլը հաջողությամբ չի գրվել!" msgid "W10: Warning: Changing a readonly file" -msgstr "W10: Զգուշացում: Փոփոխվում է կարդալու թուլտվությամբ ֆայլ" +msgstr "W10: Զգուշացում: Փոփոխվում է միայն կարդալու թուլտվությամբ ֆայլ" msgid "No display" msgstr "Էկրան չկա" @@ -324,9 +327,6 @@ msgstr ": Հնարավոր չեղավ ուղարկել. Լոկալ կատարմ msgid "%d of %d edited" msgstr "%d֊ը %d֊ից խմբագրվել է" -msgid "Socket server not online:Send expression failed" -msgstr "Էկրան չկա: Հնարավոր չեղավ ուղարկել արտահայտությունը" - msgid "No display: Send expression failed.\n" msgstr "Էկրան չկա: Հնարավոր չեղավ ուղարկել արտահայտությունը.\n" @@ -360,13 +360,13 @@ msgstr "" "Նշում․ սվեփ ֆայլի կոդավորումը չի աջակցվում, ապաակտիվացվում է սվեփ ֆայլը" msgid "Enter encryption key: " -msgstr "Կոդավորման համար մուտթագրեք գաղտնաբառը: " +msgstr "Մուտqագրեք կոդավորման բանալին: " msgid "Enter same key again: " -msgstr "Կրկնեք գաղտնաբառը: " +msgstr "Կրկնեք նույն բանալին: " msgid "Keys don't match!" -msgstr "Բանալիները տարբեր են!" +msgstr "Բանալիները չեն համընկնում!" msgid "[crypted]" msgstr "[կոդավորված]" @@ -425,7 +425,7 @@ msgid "cmd: %s" msgstr "հրաման: %s" msgid "frame is zero" -msgstr "շրջանակը զրո է" +msgstr "կադրը զրո է" #, c-format msgid "frame at highest level: %d" @@ -433,10 +433,10 @@ msgstr "շրջանակ ամենաբարձր մակարդակում՝ %d" #, c-format msgid "Breakpoint in \"%s%s\" line %ld" -msgstr "Վերադարձի կետը՝ \"%s%s\" տող %ld" +msgstr "Ընդհատման կետը՝ \"%s%s\" տող %ld" msgid "No breakpoints defined" -msgstr "Վերադարձի կետեր չեն սահամանվել" +msgstr "Վերադարձի կետեր չեն սահմանվել" #, c-format msgid "%3d %s %s line %ld" @@ -498,7 +498,7 @@ msgid "Roman numbers" msgstr "Հռոմեական թվեր" msgid "Arrows" -msgstr "Ռադիո" +msgstr "Սլաքներ" msgid "Mathematical operators" msgstr "Մաթեմատիկական օպերատորներ" @@ -507,7 +507,7 @@ msgid "Technical" msgstr "Տեխնիկական" msgid "Box drawing" -msgstr "Տուփի նկարչություն" +msgstr "Շրջանակների նկարչություն" msgid "Block elements" msgstr "Արգելափակման տարրեր" @@ -645,7 +645,7 @@ msgstr[1] "%ld համընկնումներ %ld տողում" #, c-format msgid "%ld substitution on %ld line" msgid_plural "%ld substitutions on %ld line" -msgstr[0] "%ld հատ փոխարինումներ %ld տողում" +msgstr[0] "%ld հատ փոխարինում %ld տողում" msgstr[1] "%ld հատ փոխարինումներ %ld տողում" #, c-format @@ -662,7 +662,7 @@ msgstr[1] "%ld հատ փոխարինումներ %ld տեղերում" #, c-format msgid "Pattern found in every line: %s" -msgstr "Ամեն տողում համապատասխանեցում է հայտնաբերվել: %s" +msgstr "Նմուշը հայտնաբերվել է բոլոր տողերում: %s" #, c-format msgid "Pattern not found: %s" @@ -678,7 +678,7 @@ msgstr "Պահպանե՞լ փոփոխությունները \"%s\"?" msgid "Warning: Entered other buffer unexpectedly (check autocommands)" msgstr "" "Զգուշացում: Անսպասելի անցում է կատարվել դեպի այլ բուֆեր (ստուգեք " -"ինքնահրամանննրը)" +"ինքնահրամանները)" #, c-format msgid "W20: Required python version 2.x not supported, ignoring file: %s" @@ -704,7 +704,7 @@ msgid "End of function" msgstr "Ֆունկցիայի վերջը" msgid "Backwards range given, OK to swap" -msgstr "Տրված է հակադարձ միջակայք, անցնել սվեփ" +msgstr "Տրված է հակադարձ տիրույթ, անցնել սվեփ" #, c-format msgid "%d more file to edit. Quit anyway?" @@ -804,7 +804,7 @@ msgid "is a device (disabled with 'opendevice' option)" msgstr "սարք է ('opendevice' ընտրանքը անջատված է)" msgid "[New DIRECTORY]" -msgstr "[Նոր ցանկ]" +msgstr "[Նոր թղթապանակ]" msgid "[File too big]" msgstr "[ֆայլը շատ մեծ է]" @@ -825,7 +825,7 @@ msgid "[socket]" msgstr "[վարդակ]" msgid "[character special]" -msgstr "[նշանին հատուկ]" +msgstr "[նիշային հատուկ]" msgid "[CR missing]" msgstr "[Բացակայող CR]" @@ -857,19 +857,19 @@ msgid "[dos]" msgstr "[դոս]" msgid "[dos format]" -msgstr "[format dos]" +msgstr "[dos ձևաչափ]" msgid "[mac]" msgstr "[mac]" msgid "[mac format]" -msgstr "[format mac]" +msgstr "[mac ձևաչափ]" msgid "[unix]" msgstr "[յունիքս]" msgid "[unix format]" -msgstr "[format unix]" +msgstr "[unix ձևաչափ]" #, c-format msgid "%s%ldL, %lldB" @@ -878,8 +878,8 @@ msgstr "%s%ldL, %lldB" #, c-format msgid "%s%ld line, " msgid_plural "%s%ld lines, " -msgstr[0] "տող: %s%ld, " -msgstr[1] "տողեր: %s%ld " +msgstr[0] "տող %s%ld, " +msgstr[1] "տողեր %s%ld " #, c-format msgid "%lld byte" @@ -938,7 +938,7 @@ msgid "" msgstr "<դատարկ>" msgid "writefile() first argument must be a List or a Blob" -msgstr "writefile()-ի առաջին պարամետրը պետք է լինի Cանկ" +msgstr "writefile()-ի առաջին արգումենտը պետք է լինի List կամ Blob" msgid "Select Directory dialog" msgstr "Նշել թղթապանակը" @@ -1021,7 +1021,7 @@ msgid "Replace with:" msgstr "Փոխարինել:" msgid "Match whole word only" -msgstr "Համապատասխանեցնել միայն ամբողջ բառը" +msgstr "Համընկնեցնել միայն ամբողջական բառերը" msgid "Match case" msgstr "Համընկնման դեպք" @@ -1047,6 +1047,21 @@ msgstr "Փոխարինել բոլորը" msgid "_Close" msgstr "_Փակել" +msgid "Close Tab" +msgstr "Փակել Թաբը" + +msgid "New Tab" +msgstr "Նոր Թաբ" + +msgid "Open Tab..." +msgstr "Բացել թաբ..." + +msgid "Direction:" +msgstr "Ուղղություն:" + +msgid "Close" +msgstr "Փակել" + msgid "Vim: Received \"die\" request from session manager\n" msgstr "Vim: Սեսսիայի զեկավարությունից ստացվել է մահվան պահանջ\n" @@ -1056,9 +1071,6 @@ msgstr "Փակել թաբը" msgid "New tab" msgstr "Նոր թաբ" -msgid "Open Tab..." -msgstr "Բացել թաբ..." - msgid "Vim: Main window unexpectedly destroyed\n" msgstr "Vim: Գլխավոր պատուհանն անսպասելի ավերվել է\n" @@ -1099,7 +1111,7 @@ msgid "Replace &All" msgstr "Փոխարինել &բոլորը" msgid "&Undo" -msgstr "Չեղարկել" +msgstr "Հետարկել" msgid "Open tab..." msgstr "Բացել թաբը..." @@ -1199,7 +1211,7 @@ msgid "Sorry, help file \"%s\" not found" msgstr "Ներողություն, '%s' օգնության էջը չի հայտնաբերվել" msgid "W18: Invalid character in group name" -msgstr "W18: Անվավեր նշան՝ խմբի անվանման մեջ" +msgstr "W18: Անվավեր նիշ՝ խմբի անվանման մեջ" msgid "Add a new database" msgstr "Ավելացնել նոր տվյալների բազա" @@ -1298,7 +1310,7 @@ msgid "Lua library cannot be loaded." msgstr "Հնարավոր չէ բեռնել Lua գրադարանը." msgid "cannot save undo information" -msgstr "հնարավոր չէ պահպանել չեղարկման տեղեկատվությոանը" +msgstr "հնարավոր չէ պահպանել հետարկման տեղեկատվությունը" msgid "invalid expression" msgstr "անվավեր արտահայտություն" @@ -1313,7 +1325,7 @@ msgid "unknown option" msgstr "անծանոթ ընտրանք" msgid "window index is out of range" -msgstr "պատուհանի համարն միջակայքից դուրս է եկել" +msgstr "պատուհանի համարն տիրույթից դուրս է եկել" msgid "couldn't open buffer" msgstr "հնարավոր չէ բացել բուֆերը" @@ -1346,7 +1358,7 @@ msgid "window is invalid" msgstr "պատուհանն անվավեր է" msgid "linenr out of range" -msgstr "տողի համարը միջակայքից դուրս է եկել" +msgstr "տողի համարը տիրույթից դուրս է եկել" msgid "not allowed in the Vim sandbox" msgstr "չի թույլատրվում Vim sandbox" @@ -1361,7 +1373,7 @@ msgid "cannot set line(s)" msgstr "հնարավոր չէ նշանակել տողը(երը)" msgid "invalid mark name" -msgstr "անվավեր նշակման անուն" +msgstr "անվավեր նշակի անուն" msgid "mark not set" msgstr "նշակումը սահմանած չէ" @@ -1374,7 +1386,7 @@ msgid "cannot insert/append line" msgstr "հնարավոր չէ զետեղել/կցել տողը" msgid "line number out of range" -msgstr "տողի համարը միջակայքից անցել է" +msgstr "տողի համարը տիրույթից անցել է" msgid "unknown flag: " msgstr "անծանոթ դրոշմանիշ: " @@ -1414,49 +1426,49 @@ msgstr[0] "%ld տող խորացվել է " msgstr[1] "%ld տողեր խորացվել են " msgid " Keyword completion (^N^P)" -msgstr " Հիմնաբառերի ավտոլրացում (^N^P)" +msgstr " Հիմնաբառերի լրացում (^N^P)" msgid " ^X mode (^]^D^E^F^I^K^L^N^O^P^Rs^U^V^Y)" msgstr " ^X ավտոլրացման ռեժիմ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" msgid " Whole line completion (^L^N^P)" -msgstr " Տողի ավտոլրացում (^L^N^P)" +msgstr " Տողի լրացում (^L^N^P)" msgid " File name completion (^F^N^P)" -msgstr " Ֆայլի անունի ավտոլրացում (^F^N^P)" +msgstr " Ֆայլի անունի լրացում (^F^N^P)" msgid " Tag completion (^]^N^P)" -msgstr " Պիտակի ավտոլրացում (^]^N^P)" +msgstr " Պիտակի լրացում (^]^N^P)" msgid " Path pattern completion (^N^P)" -msgstr " Ճանապարհի ավտոլրացում (^N^P)" +msgstr " Ճանապարհի նմուշի լրացում (^N^P)" msgid " Definition completion (^D^N^P)" -msgstr " Սահմանման ավտոլրացում (^D^N^P)" +msgstr " Սահմանման լրացում (^D^N^P)" msgid " Dictionary completion (^K^N^P)" -msgstr " Բառարանի ավտոլրացում (^K^N^P)" +msgstr " Բառարանի լրացում (^K^N^P)" msgid " Thesaurus completion (^T^N^P)" -msgstr " Հոմանիշների ավտոլրացում (^T^N^P)" +msgstr " Հոմանիշների լրացում (^T^N^P)" msgid " Command-line completion (^V^N^P)" -msgstr " Հրամանի տողի ավտոլրացում (^V^N^P)" +msgstr " Հրամանի տողի լրացում (^V^N^P)" msgid " User defined completion (^U^N^P)" -msgstr " Օգտագործողի սահմանած ավտոլրացում (^U^N^P)" +msgstr " Օգտագործողի սահմանած լրացում (^U^N^P)" msgid " Omni completion (^O^N^P)" -msgstr " Omni ավտոլրացում (^O^N^P)" +msgstr " Omni լրացում (^O^N^P)" msgid " Spelling suggestion (^S^N^P)" msgstr " Ուղղագրական ճշգրտում (^S^N^P)" msgid " Keyword Local completion (^N^P)" -msgstr " Տեղային հիմնաբառերի ավտոլրացում (^N^P)" +msgstr " Տեղային հիմնաբառերի լրացում (^N^P)" msgid " Register completion (^N^P)" -msgstr " Ռեգիստրերի ավտոլրացում (^N^P)" +msgstr " Ռեգիստրերի լրացում (^N^P)" msgid "'dictionary' option is empty" msgstr "'dictionary' ընտրանքը դատարկ է" @@ -1648,7 +1660,7 @@ msgid "" "case." msgstr "" "\n" -"Where դեպքն անտեսվել է, ավելացրեք ՛/՛՝ դրոշմանիշը մեծատառ դարձնելու համար." +"Where դեպքն անտեսվել է, ավելացրեք ՛/՛՝ դրոշը մեծատառ դարձնելու համար." msgid "" "\n" @@ -1729,7 +1741,7 @@ msgstr "-N\t\t\tVi մասնակի համապատասխանեցված: 'nocompati msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]" msgstr "" -"-V[N][ֆայլ]\t\tԱրտածել լրացուցիչ հաղորդագրություններ\n" +"-V[N][ֆայլ]\t\tԱրտածել լրացուցիչ հհաղորդագրություններ\n" "\t\t\t\t[կարգ N] [արտածել ֆայլում]" msgid "-D\t\t\tDebugging mode" @@ -1802,7 +1814,7 @@ msgstr "+\t\t-ի տողից սկսում" msgid "--cmd \tExecute before loading any vimrc file" msgstr "" -"--cmd <հրաման>\tԿատարել <հրաման>֊ը նախքան ցանկացախ vimrc ֆայլի բեռնումը" +"--cmd <հրաման>\tԿատարել <հրաման>֊ը նախքան ցանկացած vimrc ֆայլի բեռնումը" msgid "-c \t\tExecute after loading the first file" msgstr "-c <հրաման>\t\tԿատարել <հրաման>֊ը առաջին ֆայլի բեռնումից հետո" @@ -1831,8 +1843,9 @@ msgstr "-X\t\t\tՉկպցնել X-server֊ին" msgid "-Y\t\t\tDo not connect to Wayland compositor" msgstr "-Y\t\t\tՉկպցնել X-server֊ին" -msgid "--clientserver Backend for clientserver communication" -msgstr "--clientserver clientserver հաղորդակցության backend" +msgid "" +"--clientserver Backend for clientserver communication" +msgstr "--clientserver clientserver հաղորդակցության backend" msgid "--remote \tEdit in a Vim server if possible" msgstr "--remote <ֆայլեր>\tԽմբագրել <ֆայլեր>֊ը Vim server֊ում, եթե հնարավոր է" @@ -1870,8 +1883,7 @@ msgid "--servername \tSend to/become the Vim server " msgstr "--servername <անուն>\tՈւղարկել/լինել <անուն>֊ով Vim server" msgid "--startuptime \tWrite startup timing messages to " -msgstr "" -"--startuptime <ֆայլ>\tԳրել սկսման ժամանակային հաղորդագրությունները <ֆայլ>֊ում" +msgstr "--startuptime <ֆայլ>\tԳրել սկսման ժամանակային հհաղորդագրությունները <ֆայլ> ում" msgid "--log \t\tStart logging to early" msgstr "--log Սկսեք մուտք գործել վաղ" @@ -1911,8 +1923,8 @@ msgstr "" msgid "-font \t\tUse for normal text (also: -fn)" msgstr "" -"-font <տառատեսակ>\t\tՕգտագործել <տառատեսակ>֊ը նորմալ տեքստերի համար (նաև: " -"-fn)" +"-font <տառատեսակ>\t\tՕգտագործել <տառատեսակ>֊ը նորմալ տեքստերի համար (նաև: -" +"fn)" msgid "-boldfont \tUse for bold text" msgstr "-boldfont <տառատեսակ>\tՕգտագործել <տառատեսակ>֊ը չաղ տեքստերի համար" @@ -2005,7 +2017,7 @@ msgid "" "mark line col file/text" msgstr "" "\n" -"նշում տող սյուն ֆայլ/տեքստ" +"նշակ տող սյուն ֆայլ/տեքստ" msgid "" "\n" @@ -2044,7 +2056,7 @@ msgid " cannot be used on this computer.\n" msgstr " հնարավոր չէ օգտագործել այս համակարգչում.\n" msgid "The file was created on " -msgstr "Ֆայլը ստեղծվել է " +msgstr "Ֆայլը ստեղծվել է " msgid "" ",\n" @@ -2087,7 +2099,7 @@ msgid "" "If you wrote the text file after changing the crypt key press enter" msgstr "" "\n" -"Եթե գրում եք ֆայլում կոդավորման բանալու փոփոխումից հետ, ապա սեղմեք նոր տող" +"Եթե գրում եք ֆայլում կոդավորման բանալու փոփոխումից հետո, ապա սեղմեք նոր տող" msgid "" "\n" @@ -2108,12 +2120,21 @@ msgstr "???ԴԱՏԱՐԿ ԲԼՈԿ" msgid "???LINES MISSING" msgstr "???ՏՈՂԵՐ ԵՆ ԲԱՑԱԿԱՅՈՒՄ" +msgid "???ILLEGAL BLOCK NUMBER" +msgstr "???ԱՆԹՈՒՅԼԱՏՐԵԼԻ ԲԼՈԿԻ ՀԱՄԱՐ" + msgid "???BLOCK MISSING" msgstr "???ԲԱՑԱԿԱՅՈՂ ԲԼՈԿ" +msgid "??? BLOCK PAGE COUNT MISMATCH" +msgstr "??? ԲԼՈԿԻ ԷՋԵՐԻ ՔԱՆԱԿԻ ԱՆՀԱՄԱՊԱՏԱՍԽԱՆՈՒԹՅՈՒՆ" + msgid "??? from here until ???END lines may be messed up" msgstr "???այստեղից մինչև վերջ??? տողեր են պակասում" +msgid "??? block header corrupted" +msgstr "??? բլոկի վերնագիրը վնասված է" + msgid "??? from here until ???END lines may have been inserted/deleted" msgstr "???այստեղից մինչև վերջ??? տողեր են ավելացվել/ջնջվել" @@ -2137,7 +2158,7 @@ msgstr "" "(Կարող եք ֆայլն ամրագրել այլ անունով\n" msgid "and run diff with the original file to check for changes)" -msgstr "կատարել diff֊ը սկզբնական ֆայլի հետ՝ փոփխությունները ստուգելու համար)" +msgstr "կատարել diff֊ը սկզբնական ֆայլի հետ՝ փոփոխությունները ստուգելու համար)" msgid "Recovery completed. Buffer contents equals file contents." msgstr "" @@ -2161,7 +2182,7 @@ msgid "Using crypt key from swap file for the text file.\n" msgstr "Տեքստ ֆայլի համար օգտագործվում է կոդավորման բանալի սվեփ ֆայլից.\n" msgid "Swap files found:" -msgstr "Հայտնավերված սվեփ ֆայլեր:" +msgstr "Հայտնաբերված սվեփ ֆայլեր:" msgid " In current directory:\n" msgstr " Այս թղթապանակում:\n" @@ -2328,12 +2349,12 @@ msgstr "Սվեփ ֆայլ \"" msgid "\" already exists!" msgstr "\" արդեն գոյություն ունի!" -msgid "VIM - ATTENTION" -msgstr "VIM - ՈՒՇԱԴՐՈՒԹՅՈՒՆ" - msgid "Swap file already exists!" msgstr "Սվեփ ֆայլն արդեն գոյություն ունի!" +msgid "VIM - ATTENTION" +msgstr "VIM - ՈՒՇԱԴՐՈՒԹՅՈՒՆ" + msgid "" "&Open Read-Only\n" "&Edit anyway\n" @@ -2458,6 +2479,10 @@ msgstr " (Ընդհատված)" msgid "Beep!" msgstr "Ազդանշան!" +#, c-format +msgid "Executing directly: \"%s\"" +msgstr "Կատարվում է։ \"%s\"" + #, c-format msgid "Calling shell to execute: \"%s\"" msgstr "Հրամանի կատարման համար կանչվում է տերմինալը: \"%s\"" @@ -2552,7 +2577,7 @@ msgid "" "--- Local option values ---" msgstr "" "\n" -"--- Լոկալ ընտրանքների արժեքները ---" +"--- Լոկալ ընտրանքների արժեքները ---" msgid "" "\n" @@ -2645,14 +2670,14 @@ msgid "" "Could not get security context for " msgstr "" "\n" -"Հնարավոր չէ ստանալ գաղտնի կոտնտեքստ " +"Հնարավոր չէ ստանալ գաղտնի կոնտեքստ " msgid "" "\n" "Could not set security context for " msgstr "" "\n" -"Հնարավոր չէ կարգավորել գաղտնի կոտնտեքստ " +"Հնարավոր չէ կարգավորել գաղտնի կոնտեքստ " #, c-format msgid "Could not set security context %s for %s" @@ -2732,16 +2757,12 @@ msgstr "XSMP ICE կապակցման դիտարկումն անհաջող է ավ msgid "XSMP SmcOpenConnection failed: %s" msgstr "XSMP SmcOpenConnection անհաջող է ավարտվել: %s" -#, c-format -msgid "Failed creating socket directory: %s" -msgstr "Չհաջողվեց ստեղծել socket-ի թղթապանակը: %s" - msgid "At line" msgstr "Տողում" #, c-format msgid "Vim: Caught %s event\n" -msgstr "Vim: Բռնվել է %s բացառումը\n" +msgstr "Vim: Բռնվել է %s իրադարձությունը\n" msgid "close" msgstr "փակել" @@ -2793,7 +2814,7 @@ msgid "cannot have both a list and a \"what\" argument" msgstr "չի կարող ունենալ և՛ ցուցակ, և՛ \"what\" փաստարկ" msgid "Switching to backtracking RE engine for pattern: " -msgstr "Նախշի համար անցում կատարվող RE շարժիչին. " +msgstr "Նմուշի համար անցում backtracking RE շարժիչին. " msgid "External submatches:\n" msgstr "Արտաքին ենթահամընկնում:\n" @@ -2966,7 +2987,7 @@ msgstr " ՀԱՅՏՆԱԲԵՐՎԱԾ ՉԷ" #, c-format msgid "Scanning included file: %s" -msgstr "Կցվաֆայլերի ցուցադրում: %s" +msgstr "Կցաֆայլի սկանավորում: %s" #, c-format msgid "Searching included file %s" @@ -3015,6 +3036,10 @@ msgstr " (ՉԻ ՀԱՅՏՆԱԲԵՐՎԵԼ)" msgid " (not supported)" msgstr " (չի աջակցվում)" +#, c-format +msgid "Failed creating socket directory: %s" +msgstr "Չհաջողվեց ստեղծել socket-ի թղթապանակը: %s" + #, c-format msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" msgstr "" @@ -3059,11 +3084,11 @@ msgstr "Փոխակերպումը %s-ում չի աջակցվում՝ %s-ից %s" #, c-format msgid "Invalid value for FLAG in %s line %d: %s" -msgstr "ԴՐՈՇՄԱՆԻՇԻ անվավեր արժեք %s֊ում, տող %d: %s" +msgstr "ԴՐՈՇԻ անվավեր արժեք %s֊ում, տող %d: %s" #, c-format msgid "FLAG after using flags in %s line %d: %s" -msgstr "ԴՐՈՇՄԱՆԻՇ դրոշմանիշի օգտագործումից հետո, %s, տող %d: %s" +msgstr "ԴՐՈՇ դրոշի օգտագործումից հետո, %s, տող %d: %s" #, c-format msgid "" @@ -3108,7 +3133,7 @@ msgstr "" #, c-format msgid "Duplicate affix in %s line %d: %s" -msgstr "Կրկնակի affix %s֊ում, տող %d: %s" +msgstr "Կրկնվող affix %s֊ում, տող %d: %s" #, c-format msgid "" @@ -3136,11 +3161,11 @@ msgstr "Սպասվող ՔԱՐՏԵԶԻ հաշվարկ %s տողում %d" #, c-format msgid "Duplicate character in MAP in %s line %d" -msgstr "Կրկնակի տառ MAP֊ում, %s, տող %d" +msgstr "Կրկնվող նիշ MAP֊ում, %s, տող %d" #, c-format msgid "Unrecognized or duplicate item in %s line %d: %s" -msgstr "Անծանոթ կամ կրկնակի էլեմենտ %s֊ում, տող %d: %s" +msgstr "Անծանոթ կամ կրկնվող էլեմենտ %s֊ում, տող %d: %s" #, c-format msgid "Missing FOL/LOW/UPP line in %s" @@ -3168,7 +3193,7 @@ msgstr "SAL և SOFO գծերը %s-ում" #, c-format msgid "Flag is not a number in %s line %d: %s" -msgstr "Դրոշմանիշը թիվ չէ, %s, տող %d: %s" +msgstr "Դրոշը թիվ չէ, %s, տող %d: %s" #, c-format msgid "Illegal flag in %s line %d: %s" @@ -3176,7 +3201,7 @@ msgstr "Չթույլատրված դրոշմանիշ, %s տող %d: %s" #, c-format msgid "%s value differs from what is used in another .aff file" -msgstr "%s արժեքը տարբերէ այլ .aff ֆայլում օգտագործված արժեքից" +msgstr "%s արժեքը տարբեր է այլ .aff ֆայլում օգտագործված արժեքից" #, c-format msgid "Reading dictionary file %s..." @@ -3188,11 +3213,11 @@ msgstr "տող %6d, բառ %6ld - %s" #, c-format msgid "Duplicate word in %s line %d: %s" -msgstr "Կրկնակի բառ %s֊ում, տող %d: %s" +msgstr "Կրկնվող բառ %s֊ում, տող %d: %s" #, c-format msgid "First duplicate word in %s line %d: %s" -msgstr "Առաջին կրկնված բառը %s֊ում, տող %d: %s" +msgstr "Առաջին կրկնվող բառը %s֊ում, տող %d: %s" #, c-format msgid "%d duplicate word(s) in %s" @@ -3200,7 +3225,7 @@ msgstr "%d կրկնվող բառեր՝ %s֊ում" #, c-format msgid "Ignored %d word(s) with non-ASCII characters in %s" -msgstr "Անտեսված %d բառեր՝ ոչ ASCII նշաններով, %s" +msgstr "Անտեսված %d բառեր՝ ոչ ASCII նիշերով, %s" #, c-format msgid "Reading word file %s..." @@ -3220,7 +3245,7 @@ msgstr "/encoding= տողն անտեսված է %s֊ում, տող %ld: %s" #, c-format msgid "Duplicate /regions= line ignored in %s line %ld: %s" -msgstr "Կրկնակի /regions= տողն անտեսված է %s֊ում, տող %ld: %s" +msgstr "Կրկնվող /regions= տողն անտեսված է %s֊ում, տող %ld: %s" #, c-format msgid "Too many regions in %s line %ld: %s" @@ -3240,7 +3265,7 @@ msgstr "Անծանոթ դրոշմանիշ, %s, տող %ld: %s" #, c-format msgid "Ignored %d words with non-ASCII characters" -msgstr "Անտեսված %d բառեր՝ ոչ ASCII նշաններով" +msgstr "Անտեսված %d բառեր՝ ոչ ASCII նիշերով" #, c-format msgid "Compressed %s: %ld of %ld nodes; %ld (%ld%%) remaining" @@ -3283,7 +3308,7 @@ msgid "Word '%.*s' removed from %s" msgstr "'%.*s' բառը հեռացվել է %s-ից" msgid "Seek error in spellfile" -msgstr "Սխալ փնտրեք spellfile-ում" +msgstr "Ցուցչի տեղափոխման սխալ spellfile-ում" #, c-format msgid "Word '%.*s' added to %s" @@ -3316,18 +3341,6 @@ msgstr "ուղղագրական iskeyword-ը սահմանված չէ" msgid "syncing on C-style comments" msgstr "C-style մեկնաբանությունների համաժամանակեցում" -msgid "no syncing" -msgstr "առանց սինխրոնիզացման" - -msgid "syncing starts at the first line" -msgstr "համաժամացումը սկսվում է առաջին տողից" - -msgid "syncing starts " -msgstr "համաժամանակեցումն սկսվում է " - -msgid " lines before top line" -msgstr " տողեր՝ վերևի տողից առաջ" - msgid "" "\n" "--- Syntax sync items ---" @@ -3342,6 +3355,18 @@ msgstr "" "\n" "էլեմենտների համաժամանակեցում" +msgid "no syncing" +msgstr "առանց համաժամացման" + +msgid "syncing starts at the first line" +msgstr "համաժամացումը սկսվում է առաջին տողից" + +msgid "syncing starts " +msgstr "համաժամացումն սկսվում է " + +msgid " lines before top line" +msgstr " տողեր՝ վերևի տողից առաջ" + msgid "" "\n" "--- Syntax items ---" @@ -3359,7 +3384,7 @@ msgid "maximal " msgstr "առավելագույնը " msgid "; match " -msgstr "; համընկնում " +msgstr "; համընկնում " msgid " line breaks" msgstr " տողի ընդհատում" @@ -3368,7 +3393,7 @@ msgid "" " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN" msgstr "" " ԱՄԲՈՂՋ ՔԱՆԱԿ ՀԱՄԸՆԿՆՈՒՄ ՄՆԱՑՅԱԼ ՄԻՋԻՆ ԱՆՈՒՆ " -"ՕՐԻՆԱԿ" +"ՆՄՈՒՇ" #, c-format msgid "File \"%s\" does not exist" @@ -3410,7 +3435,7 @@ msgstr "Որոնում %s պիտակների ֆայլում" #, c-format msgid "Duplicate field name: %s" -msgstr "Կրկնակի դաշտի անուն: %s" +msgstr "Կրկնվող դաշտի անուն: %s" msgid "' not known. Available builtin terminals are:" msgstr "' անծանոթ է. Գոյություն ունեցող ներդրված տերմինալներն հետևյալն են:" @@ -3464,43 +3489,43 @@ msgid "Vim: Error reading input, exiting...\n" msgstr "Vim: Մուտքի ընթերցման սխալ, ավարտում...\n" msgid "No undo possible; continue anyway" -msgstr "Չեղարկումն անհնար է; այնուամենայնիվ շարունակել" +msgstr "Հետարկումն անհնար է; այնուամենայնիվ շարունակել" msgid "Cannot write undo file in any directory in 'undodir'" msgstr "" -"Հնարավոր չէ ամրագրել չեղարկման ֆայլը՝ 'undodir'-ի որևէ ենթաթղթապանակում" +"Հնարավոր չէ ամրագրել հետարկման ֆայլը՝ 'undodir'-ի որևէ ենթաթղթապանակում" #, c-format msgid "Will not overwrite with undo file, cannot read: %s" -msgstr "Չեղարկման ֆայլը չի պահպանվելու, անհնար է ընթերցել: %s" +msgstr "Հետարկման ֆայլը չի պահպանվելու, անհնար է ընթերցել: %s" #, c-format msgid "Will not overwrite, this is not an undo file: %s" -msgstr "Չի պահպանվելու, սա չեղարկման ֆայլ չէ: %s" +msgstr "Չի պահպանվելու, սա հետարկման ֆայլ չէ: %s" msgid "Skipping undo file write, nothing to undo" -msgstr "Չեղարկման ֆայլի ամրագրումն անտեսվում է, չեղարկումներ չկան" +msgstr "Հետարկման ֆայլի ամրագրումն անտեսվում է, հետարկումներ չկան" #, c-format msgid "Writing undo file: %s" -msgstr "Չեղարկման ֆայլի պահպանում: %s" +msgstr "Հետարկման ֆայլի պահպանում: %s" #, c-format msgid "Not reading undo file, owner differs: %s" -msgstr "Չեղարկման ֆայլը չի ընթերցվելու, այն պատկանում է մեկ այլ օգտատիրոջը: %s" +msgstr "Հետարկման ֆայլը չի ընթերցվելու, այն պատկանում է մեկ այլ օգտատիրոջը: %s" #, c-format msgid "Reading undo file: %s" -msgstr "Չեղարկման ֆայլի ընթերցում: %s" +msgstr "Հետարկման ֆայլի ընթերցում: %s" msgid "File contents changed, cannot use undo info" msgstr "" -"Ֆայլի պարունակությունը փոփոխվել է, հնարավոր չէ օգտագործել չեղարկման " +"Ֆայլի պարունակությունը փոփոխվել է, հնարավոր չէ օգտագործել հետարկման " "տեղեկատվությունը" #, c-format msgid "Finished reading undo file %s" -msgstr "Չեղարկման ֆայլի ընթերցումն ավարտվել է: %s" +msgstr "Հետարկման ֆայլի ընթերցումն ավարտվել է: %s" msgid "Already at oldest change" msgstr "Արդեն հին փոփոխությունն է" @@ -3537,7 +3562,7 @@ msgid "after" msgstr "հետո" msgid "Nothing to undo" -msgstr "Չեղարկում չկա" +msgstr "Հետարկում չկա" msgid "number changes when saved" msgstr "թվերը փոփոխվում են երբ պահպանված է" @@ -3718,29 +3743,35 @@ msgstr "" msgid "without GUI." msgstr "առանց գրաֆիկական ինտերֆեյսի." +msgid "with GTK4 GUI (hwaccel)." +msgstr "GTK4 GUI (hwaccel)-ով." + +msgid "with GTK4 GUI." +msgstr "GTK4 GUI-ով." + msgid "with GTK3 GUI." -msgstr "GTK3 GUI-ով:" +msgstr "GTK3 GUI-ով." msgid "with GTK2-GNOME GUI." -msgstr "GTK2-GNOME GUI-ով:" +msgstr "GTK2-GNOME GUI-ով." msgid "with GTK2 GUI." -msgstr "GTK2 GUI-ով:" +msgstr "GTK2 GUI-ով." msgid "with X11-Motif GUI." -msgstr "X11-Motif GUI-ով:" +msgstr "X11-Motif GUI-ով," msgid "with Haiku GUI." -msgstr "Haiku GUI-ի հետ:" +msgstr "Haiku GUI-ով." msgid "with Photon GUI." -msgstr "Photon GUI-ով:" +msgstr "Photon GUI-ով." msgid "with GUI." -msgstr "GUI-ով:" +msgstr "GUI-ով." msgid " Features included (+) or not (-):\n" -msgstr " Առանձնահատկությունների միացում (+) և անջաատում (-):\n" +msgstr " Առանձնահատկությունների միացում (+) և անջատում (-):\n" msgid " system vimrc file: \"" msgstr " համակարգային vimrc: \"" @@ -3749,10 +3780,10 @@ msgid " user vimrc file: \"" msgstr " օգտատիրոջ ֆայլ vimrc: \"" msgid " 2nd user vimrc file: \"" -msgstr " օգտատիրոջ երկրորդ ֆայլ vimrc: \"" +msgstr " օգտատիրոջ երկրորդ ֆայլ vimrc: \"" msgid " 3rd user vimrc file: \"" -msgstr " օգտատիրոջ երրորդ ֆայլ vimrc: \"" +msgstr " օգտատիրոջ երրորդ ֆայլ vimrc: \"" msgid " 4th user vimrc file: \"" msgstr " օգտատիրոջ 4-րդ vimrc ֆայլ : \"" @@ -3770,10 +3801,10 @@ msgid " user gvimrc file: \"" msgstr " օգտատիրոջ ֆայլ gvimrc: \"" msgid "2nd user gvimrc file: \"" -msgstr "օգտատիրոջ երկրորդ ֆայլ gvimrc: \"" +msgstr "օգտատիրոջ երկրորդ ֆայլ gvimrc: \"" msgid "3rd user gvimrc file: \"" -msgstr "օգտատիրոջ երրորդ ֆայլ gvimrc: \"" +msgstr "օգտատիրոջ երրորդ ֆայլ gvimrc: \"" msgid " defaults file: \"" msgstr " լռելյայն ֆայլ." @@ -3785,10 +3816,10 @@ msgid " fall-back for $VIM: \"" msgstr " վերադարձ $VIM֊ին: \"" msgid " f-b for $VIMRUNTIME: \"" -msgstr " $VIMRUNTIME՝ ըստ լռելիության: \"" +msgstr " $VIMRUNTIME՝ ըստ լռելիության: \"" msgid "Compilation: " -msgstr "Կառուցման պարամետրեր: " +msgstr "Կառուցում : " msgid "Compiler: " msgstr "Կառուցող: " @@ -3843,7 +3874,7 @@ msgid "Running modeless, typed text is inserted" msgstr "Անռեժիմ վիճակ, հավաքած տեքստի զետեղում" msgid "menu Edit->Global Settings->Toggle Insert Mode " -msgstr "մենյու Խմբագրել->Գլոբալ կարգավորումներ->Փոխարկել Տեղադրման ռեժիմը " +msgstr "մենյու Խմբագրել->Գլոբալ կարգավորումներ->Փոխարկել զետեղման ռեժիմը " msgid " for two modes " msgstr " երկակի ռեժիմների համար " @@ -4012,7 +4043,7 @@ msgid "Writing viminfo file \"%s\"" msgstr "Viminfo ֆայլի փոփոխում \"%s\"" msgid "wayland protocol error -> " -msgstr "wayland պրոտոկոլի սխալ-> " +msgstr "wayland պրոտոկոլի սխալ-> " #, c-format msgid "restoring Wayland display %s" @@ -4075,30 +4106,30 @@ msgstr "" "որոնման ժամանակ" msgid "E13: File exists (add ! to override)" -msgstr "E13: Ֆայլը գոյություն ունի (ամրագրելու համար ավելացրեք !)" +msgstr "E13: Ֆայլը գոյություն ունի (ամրագրելու համար ավելացնել !)" #, c-format msgid "E15: Invalid expression: \"%s\"" msgstr "E15: Անվավեր արտահայտություն: %s" msgid "E16: Invalid range" -msgstr "E16: Անվավեր միջակայք" +msgstr "E16: Անվավեր տիրույթ" #, c-format msgid "E17: \"%s\" is a directory" -msgstr "E17: \"%s\" թղթապանակ է" +msgstr "E17: \"%s\"-ը թղթապանակ է" msgid "E18: Unexpected characters in :let" -msgstr "E18: Չսպասված տառ :let հրամանում" +msgstr "E18: Չսպասված նիշեր :let հրամանում" msgid "E18: Unexpected characters in assignment" -msgstr "E18: Չսպասված տառ վերագրման ժամանակ" +msgstr "E18: Չսպասված նիշեր վերագրման ժամանակ" msgid "E19: Mark has invalid line number" -msgstr "E19: Նշումն ունի անվավեր տողի համար" +msgstr "E19: Նշակն ունի անվավեր տողի համար" msgid "E20: Mark not set" -msgstr "E20: Նշումը սահմանված չէ" +msgstr "E20: Նշակը սահմանված չէ" msgid "E21: Cannot make changes, 'modifiable' is off" msgstr "E21: Հնարավոր չէ փոփոխել, 'modifiable' հատկությունն անջատված է" @@ -4154,7 +4185,7 @@ msgid "E37: No write since last change" msgstr "E37: Պահված չէ վերջին փոփոխությունից հետո" msgid "E37: No write since last change (add ! to override)" -msgstr "E37: Փոփոխությունները պահպանված չեն (ամրագրելու համար ավելացրեք !)" +msgstr "E37: Փոփոխությունները պահպանված չեն (ամրագրելու համար ավելացնել !)" msgid "E39: Number expected" msgstr "E39: Սպասվում է թիվ" @@ -4170,7 +4201,7 @@ msgid "E42: No Errors" msgstr "E42: Սխալներ չկան" msgid "E45: 'readonly' option is set (add ! to override)" -msgstr "E45: 'readonly' ընտրանքը միացված է (անցման համար ավելացնել !)" +msgstr "E45: 'readonly' ընտրանքը միացված է (ամրագրելու համար ավելացնել !)" msgid "E46: Cannot change read-only variable" msgstr "E46: Հնարավոր չէ փոփոխել չխմբագրվող փոփոխականը" @@ -4212,7 +4243,7 @@ msgstr "E55: Չհամընկնող %s)" #, c-format msgid "E59: Invalid character after %s@" -msgstr "E59: Անվավեր նշան՝ %s@-ից հետո" +msgstr "E59: Անվավեր նիշ՝ %s@-ից հետո" #, c-format msgid "E60: Too many complex %s{...}s" @@ -4243,11 +4274,11 @@ msgid "E67: \\z1 - \\z9 not allowed here" msgstr "E67: \\z1 - \\z9 աստեղ չեն թույլատրվում" msgid "E68: Invalid character after \\z" -msgstr "E68: Անվավեր նշան \\z֊ից հետո" +msgstr "E68: Անվավեր նիշ \\z֊ից հետո" #, c-format msgid "E69: Missing ] after %s%%[" -msgstr "E69: Բացակայող ] %s%%[֊ից հետո" +msgstr "E69: Բացակայող ] %s%%[֊ից հետո" #, c-format msgid "E70: Empty %s%%[]" @@ -4255,7 +4286,7 @@ msgstr "E70: Դատարկ %s%%[]" #, c-format msgid "E71: Invalid character after %s%%" -msgstr "E71: Անվավեր նշան %s%%֊ից հետո" +msgstr "E71: Անվավեր նիշ %s%%֊ից հետո" msgid "E72: Close error on swap file" msgstr "E72: Սվեփ ֆայլի փակման սխալ" @@ -4276,13 +4307,13 @@ msgid "E77: Too many file names" msgstr "E77: Աննախադեպ շատ ֆայլերի անուններ" msgid "E78: Unknown mark" -msgstr "E78: Անծանոթ նշում" +msgstr "E78: Անծանոթ նշակ" msgid "E79: Cannot expand wildcards" msgstr "E79: Հնարավոր չէ արտածել" msgid "E80: Error while writing" -msgstr "E80: Սխալ գրելու ընթացում" +msgstr "E80: Սխալ գրելու ընթացքում" msgid "E81: Using not in a script context" msgstr "E81: -ն օգտագործվել է սկրիպտային կոնտեքստից դուրս" @@ -4315,7 +4346,7 @@ msgstr "E88: Սա առաջին բուֆերն է" msgid "E89: No write since last change for buffer %d (add ! to override)" msgstr "" "E89: %d բուֆերի փոփոխությունները չեն ամրագրվել, (ամրագրելու համար " -"ավելացրեք !)" +"ավելացնել !)" msgid "E90: Cannot unload last buffer" msgstr "E90: Հնարավոր չէ բեռնաթափել վերջին բուֆերը" @@ -4333,7 +4364,7 @@ msgstr "E93: Մի քանի համընկնումներ %s-ի համար" #, c-format msgid "E94: No matching buffer for %s" -msgstr "E94: Չկա համապատասխան բուֆեր %s-ի համար" +msgstr "E94: Չկա համընկնող բուֆեր %s-ի համար" msgid "E95: Buffer with this name already exists" msgstr "E95: Նմանատիպ անունով բուֆեր արդեն գոյություն ունի" @@ -4352,7 +4383,7 @@ msgid "E99: Current buffer is not in diff mode" msgstr "E99: Տվյալ բուֆերը չի գտվում համեմատման կարգավիճակում" msgid "E100: No other buffer in diff mode" -msgstr "E100: Համեմատման բուֆերներ այլևս չկան" +msgstr "E100: Համեմատման բուֆերներ այլևս չկան" msgid "E101: More than two buffers in diff mode, don't know which one to use" msgstr "E101: Տրված են մի քանի համեմատման բուֆերներ, չգիտեմ որն օգտագործել" @@ -4462,8 +4493,7 @@ msgstr "E127: Հնարավոր չէ վերասահմանել %s ֆունկցիա #, c-format msgid "E128: Function name must start with a capital or \"s:\": %s" -msgstr "" -"E128: Ֆունկցիայի անունը պետք է սկսվի մեծատառով կամ պարունակի \"s:\": %s" +msgstr "E128: Ֆունկցիայի անունը պետք է սկսվի մեծատառով կամ \"s:\"-ով: %s" msgid "E129: Function name required" msgstr "E129: Ֆունկցիայի անունը պարտադիր է" @@ -4479,7 +4509,7 @@ msgid "E133: :return not inside a function" msgstr "E133: :return ոչ ֆունկցիայի ներսից" msgid "E134: Cannot move a range of lines into itself" -msgstr "E134: Հնարավոր չէ տեղափոխել մի շարք տողեր իր մեջ" +msgstr "E134: Հնարավոր չէ տեղափոխել տողերի տիրույթն իր մեջ" msgid "E135: *Filter* Autocommands must not change current buffer" msgstr "E135: *Filter* Ինքնահրամանները չպետք է փոխեն տվյալ բուֆերը" @@ -4524,7 +4554,7 @@ msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Ռեգուլյար արտահայտությունները չեն կարող բաժանված լինել տառերով" msgid "E147: Cannot do :global recursive with a range" -msgstr "E147: global հրամանը չի կարող լինել ռեկուրսիվ" +msgstr "E147: :global հրամանը չի կարող ռեկուրսիվ լինել տիրույթի հետ" msgid "E148: Regular expression missing from :global" msgstr "E148: Ռեգույլար արտահայտությունը բացակայում է :global-ից" @@ -4551,7 +4581,7 @@ msgstr "E153: Հնարավոր չէ բացել %s֊ը կարդալու համա #, c-format msgid "E154: Duplicate tag \"%s\" in file %s/%s" -msgstr "E154: Կրկնված պիտակ \"%s\" %s/%s֊ֆայլում" +msgstr "E154: Կրկնվող պիտակ \"%s\" %s/%s֊ֆայլում" #, c-format msgid "E155: Unknown sign: %s" @@ -4672,14 +4702,14 @@ msgid "E186: No previous directory" msgstr "E186: Չկա նախկին թղթապանակ" msgid "E187: Directory unknown" -msgstr "E187: Անծանոթ բառարան" +msgstr "E187: Անծանոթ թղթապանակ" msgid "E188: Obtaining window position not implemented for this platform" msgstr "E188: Պատուհանի չափեր վերցնելն իրականացված չէ այս պլատֆորմի համար" #, c-format msgid "E189: \"%s\" exists (add ! to override)" -msgstr "E189: \"%s\" արդեն գոյություն ունի (անցման համար ավելացնել !)" +msgstr "E189: \"%s\" արդեն գոյություն ունի (ամրագրելու համար ավելացնել !)" #, c-format msgid "E190: Cannot open \"%s\" for writing" @@ -4709,13 +4739,13 @@ msgid "E197: Cannot set language to \"%s\"" msgstr "E197: Հնարավոր չէ փոխել լեզուն \"%s\"" msgid "E199: Active window or buffer changed or deleted" -msgstr "E199: Ակտիվ պատուհանը կամ բուֆերը ջնջնվել կամ փոփոխվել է" +msgstr "E199: Ակտիվ պատուհանը կամ բուֆերը ջնջվել կամ փոփոխվել է" msgid "E200: *ReadPre autocommands made the file unreadable" msgstr "E200: *ReadPre ինքնահրամանները ֆայլը դարձրել են անընթեռնելի" msgid "E201: *ReadPre autocommands must not change current buffer" -msgstr "E201: ReadPre ինքնահրամանները չեն կարող փոխել տվյալ բուֆերը" +msgstr "E201: *ReadPre ինքնահրամանները չեն կարող փոխել տվյալ բուֆերը" msgid "E202: Conversion made file unreadable!" msgstr "E202: Փոխակերպումը ֆայլը դարձրել է անընթեռնելի!" @@ -4737,7 +4767,7 @@ msgstr "E207: Հնարավոր չէ ջնջել պահպանման ֆայլը" #, c-format msgid "E208: Error writing to \"%s\"" -msgstr "E208: Սխալ \"%s\" գրոլու ընթացքում" +msgstr "E208: Սխալ \"%s\" գրելու ընթացքում" #, c-format msgid "E209: Error closing \"%s\"" @@ -4749,7 +4779,7 @@ msgstr "E210: Սխալ \"%s\" կարդալու ընթացքում" #, c-format msgid "E211: File \"%s\" no longer available" -msgstr "E211: \"%s\" ֆայլն արդեն հասնելի չէ" +msgstr "E211: \"%s\" ֆայլն արդեն հասանելի չէ" msgid "E212: Can't open file for writing" msgstr "E212: Գրելու համար հնարավոր չէ բացել ֆայլը" @@ -4762,7 +4792,7 @@ msgstr "E214: Ժամանակավոր ֆայլը չի գտնվել՝ գրելու #, c-format msgid "E215: Illegal character after *: %s" -msgstr "E215: Չթույլատրված նշան * նշանից հետո: %s" +msgstr "E215: Չթույլատրված նիշ * նշանից հետո: %s" #, c-format msgid "E216: No such event: %s" @@ -4808,7 +4838,7 @@ msgid "E227: Mapping already exists for %s" msgstr "E227: Համապատասխանեցումն արդեն գոյություն ունի %s-ի համար" msgid "E229: Cannot start the GUI" -msgstr "E229: Հնարավոր չէ սկսել գրաֆիկական ինտերֆեյսը" +msgstr "E229: Հնարավոր չէ սկսել գրաֆիկական ինտերֆեյսը" #, c-format msgid "E230: Cannot read from \"%s\"" @@ -4855,7 +4885,7 @@ msgstr "E242: Չի կարելի պատուհանը բաժանել մյուսը #, c-format msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." -msgstr "E243: Արգումենտն իրականցաված չէ: \"-%s\"; Օգտագործել OLE տարբերակը." +msgstr "E243: Արգումենտը չի աջակցվում: \"-%s\"; Օգտագործել OLE տարբերակը." #, c-format msgid "E244: Illegal %s name \"%s\" in font name \"%s\"" @@ -4863,7 +4893,7 @@ msgstr "E244: %s չթույլատրված անուն \"%s\"՝ \"%s\" տառատ #, c-format msgid "E245: Illegal char '%c' in font name \"%s\"" -msgstr "E245: Չթույլատրված '%c' նշան՝ \"%s\" տառատեսակի անվանման մեջ" +msgstr "E245: Չթույլատրված '%c' նշան՝ \"%s\" տառատեսակի անվանման մեջ" msgid "E246: FileChangedShell autocommand deleted buffer" msgstr "" @@ -4996,7 +5026,7 @@ msgid "E285: Failed to create input context" msgstr "E285: Հնարավոր չէ ստեղծել մուտքային կոնտեքստ" msgid "E286: Failed to open input method" -msgstr "E286: Հնարավոր չէ բացել մուտքային մեթոսը" +msgstr "E286: Հնարավոր չէ բացել մուտքային մեթոդը" msgid "E287: Warning: Could not set destroy callback to IM" msgstr "E287: Զգուշացում: հնարավոր չէ վերագրել IM֊ի ջնջման կանչըввода" @@ -5059,7 +5089,7 @@ msgstr "E309: Հնարավոր չե կարդալ 1֊ին բլոկը %s֊ից" #, c-format msgid "E310: Block 1 ID wrong (%s not a .swp file?)" -msgstr "E310: Սխալ բլոկի համար, 1, (%s֊ը .swp սվեփ ֆայլ չի՞)" +msgstr "E310: Սխալ բլոկի համար, 1, (%s֊ը .swp սվեփ ֆայլ չի՞)" msgid "E311: Recovery Interrupted" msgstr "E311: Վերականգնումն ընդհատված է" @@ -5112,7 +5142,7 @@ msgid "E332: Separator cannot be part of a menu path" msgstr "E332: Բաժանիչը չի կարող լինել մենյուի ճանապարհի մաս" msgid "E333: Menu path must lead to a menu item" -msgstr "E333: Մենյուի ճանապարհը պետք է ներկայացնի մենյուի էլէմենտ" +msgstr "E333: Մենյուի ճանապարհը պետք է ներկայացնի մենյուի էլեմենտ" #, c-format msgid "E334: Menu not found: %s" @@ -5195,11 +5225,11 @@ msgstr "E355: Անծանոթ ընտրանք: %s" #, c-format msgid "E357: 'langmap': Matching character missing for %s" -msgstr "E357: 'langmap': %s-ի համար չկա համընկնման նշան" +msgstr "E357: 'langmap': %s-ի համար չկա համընկնման նիշ" #, c-format msgid "E358: 'langmap': Extra characters after semicolon: %s" -msgstr "E358: 'langmap': Ստորակետից հետո տրված են հավելյալ նշաններ: %s" +msgstr "E358: 'langmap': Ստորակետից հետո տրված են հավելյալ նիշեր: %s" msgid "E359: Screen mode setting not supported" msgstr "E359: Տրված էկրանի ռեժիմն աջակցված չէ" @@ -5212,7 +5242,7 @@ msgstr "E362: բուլյան արժեքի օգտագործումը որպես Fl msgid "E363: Pattern uses more memory than 'maxmempattern'" msgstr "" -"E363: Օրինակն օգտագործում է ավելի շատ հիշողություն քան տրված է " +"E363: Նմուշն օգտագործում է ավելի շատ հիշողություն, քան տրված է " "'maxmempattern'-ով" #, c-format @@ -5265,7 +5295,7 @@ msgstr "E376: Անվավեր %%%c տողային ֆորմատի նախածանց #, c-format msgid "E377: Invalid %%%c in format string" -msgstr "E377: Անվավեր %%%c" +msgstr "E377: Անվավեր %%%c" msgid "E378: 'errorformat' contains no pattern" msgstr "E378: 'errorformat'-ը չի պարունակում նմուշներ" @@ -5277,7 +5307,7 @@ msgid "E380: At bottom of quickfix stack" msgstr "E380: quickfix ստեկի ներքևում" msgid "E381: At top of quickfix stack" -msgstr "E381: quickfix ստեկի վերևում" +msgstr "E381: quickfix ստեկի վերևում" msgid "E382: Cannot write, 'buftype' option is set" msgstr "E382: Պահպանումն անհնար է, 'buftype' ընտրանքը միացված է" @@ -5288,11 +5318,11 @@ msgstr "E383: Անվավեր որոնման բառ: %s" #, c-format msgid "E384: Search hit TOP without match for: %s" -msgstr "E384: Որոնումն ավարտված է ֆայլի սկզբում; %s-ը չի գտնվել" +msgstr "E384: Որոնումն ավարտված է ֆայլի սկզբում; %s-ի համընկնում չի գտնվել" #, c-format msgid "E385: Search hit BOTTOM without match for: %s" -msgstr "E385: Որոնումն ավարտված է ֆայլի վերջում; %s-ը չի գտնվել" +msgstr "E385: Որոնումն ավարտված է ֆայլի վերջում; %s-ի համընկնում չի գտնվել" msgid "E386: Expected '?' or '/' after ';'" msgstr "E386: ';'-ից հետո սպասվում '?' կամ '/'" @@ -5337,7 +5367,7 @@ msgstr "E398: Բացակայող '=': %s" #, c-format msgid "E399: Not enough arguments: syntax region %s" -msgstr "E399: Անբավարար քանակությամբ արգումենտներ։ syntax region %s" +msgstr "E399: Անբավարար քանակությամբ արգումենտներ։ syntax region %s" msgid "E400: No cluster specified" msgstr "E400: Համակարգը տրված չէ" @@ -5356,7 +5386,7 @@ msgstr "" #, c-format msgid "E404: Illegal arguments: %s" -msgstr "E404: Չթույլատրված պարամետրեր: %s" +msgstr "E404: Չթույլատրված արգումենտներ: %s" #, c-format msgid "E405: Missing equal sign: %s" @@ -5364,7 +5394,7 @@ msgstr "E405: Բացակայող վերագրման նշան: %s" #, c-format msgid "E406: Empty argument: %s" -msgstr "E406: Դատարկ պարամետեր: %s" +msgstr "E406: Դատարկ արգումենտ: %s" #, c-format msgid "E407: %s not allowed here" @@ -5388,14 +5418,14 @@ msgstr "E411: %s գունանշման խումբը չի հայտնաբերվել #, c-format msgid "E412: Not enough arguments: \":highlight link %s\"" -msgstr "E412: Անբավարար քանակությամբ պարամետրեր: \":highlight link %s\"" +msgstr "E412: Անբավարար քանակությամբ արգումենտներ: \":highlight link %s\"" #, c-format msgid "E413: Too many arguments: \":highlight link %s\"" -msgstr "E413: Շատ քանակությամ պարամետրեր: \":highlight link %s\"" +msgstr "E413: Շատ քանակությամբ արգումենտներ: \":highlight link %s\"" msgid "E414: Group has settings, highlight link ignored" -msgstr "E414: Խումբն ունի կարգաբերումներ, գունանշման հղումն անտեսված է" +msgstr "E414: Խումբն ունի կարգավորումներ, գունանշման հղումն անտեսված է" #, c-format msgid "E415: Unexpected equal sign: %s" @@ -5414,7 +5444,7 @@ msgid "E418: Illegal value: %s" msgstr "E418: Չթույլատրված արժեք: %s" msgid "E418: I'm a teapot" -msgstr "E418: Ես թեյնիկ եմ" +msgstr "E418: Ես թեյնիկ եմ :)" msgid "E419: FG color unknown" msgstr "E419: Տողի անծանոթ գույն" @@ -5432,7 +5462,7 @@ msgstr "E422: Տերմինալի կոդը չափազանց երկար է՝ %s" #, c-format msgid "E423: Illegal argument: %s" -msgstr "E423: Չթույլատրված պարամետեր: %s" +msgstr "E423: Չթույլատրված արգումենտ: %s" msgid "E424: Too many different highlighting attributes in use" msgstr "E424: Աննախադեպ շատ գունանշման բնորոշիչներ են օգտագործվում" @@ -5477,7 +5507,7 @@ msgstr "E435: Պիտակը չի գտնվել, փորձում եմ գուշակե #, c-format msgid "E436: No \"%s\" entry in termcap" -msgstr "E436: \"%s\"֊ը termcap֊ում չկա" +msgstr "E436: \"%s\"֊ը termcap֊ում չկա" msgid "E437: Terminal capability \"cm\" required" msgstr "E437: Պահանջվում է \"cm\" տերմինալի առկայություն" @@ -5542,11 +5572,6 @@ msgstr "E456: PostScript֊ի \"%s.ps\" ռեսուրսային ֆայլը չի գ msgid "E457: Can't read PostScript resource file \"%s\"" msgstr "E457: Հնարավոր չէ կարդալ \"%s\" PostScript֊ի ռեսուրս ֆայլը" -msgid "E458: Cannot allocate colormap entry, some colors may be incorrect" -msgstr "" -"E458: Հնարավոր չէ ստեղծել colormap տիպի էլեմենտ, որոշ գույներ հնարավոր է " -"սխալ լինեն" - msgid "E459: Cannot go back to previous directory" msgstr "E459: Հնարավոր չէ վերադառնալ նախկին թղթապանակ" @@ -5555,7 +5580,7 @@ msgstr "E460: Mapset()-ում բացակայում են գրառումները d #, c-format msgid "E461: Illegal variable name: %s" -msgstr "E461: Չթույլատրված արժեք: %s" +msgstr "E461: Փոփոխականի անթույլատրելի անուն: %s" #, c-format msgid "E462: Could not prepare for reloading \"%s\"" @@ -5565,7 +5590,7 @@ msgid "E463: Region is guarded, cannot modify" msgstr "E463: Ռեգիոնը պահպանվում է, հնարավոր չէ փոփոխել" msgid "E464: Ambiguous use of user-defined command" -msgstr "E464: Օգտատիրոջ սահմանած հրամաի սխալ օգտագործում" +msgstr "E464: Օգտատիրոջ սահմանած հրամանի սխալ օգտագործում" #, c-format msgid "E464: Ambiguous use of user-defined command: %s" @@ -5578,12 +5603,12 @@ msgid "E466: :winpos requires two number arguments" msgstr "E466: :winpos հրամանը պահանջում է երկու թվային արգումենտներ" msgid "E467: Custom completion requires a function argument" -msgstr "E467: անհատականացված ավտոլրացումը պահանջում է ֆունկցիայի արգումենտ" +msgstr "E467: անհատականացված լրացումը պահանջում է ֆունկցիայի արգումենտ" msgid "E468: Completion argument only allowed for custom completion" msgstr "" -"E468: Ավտոլրացման արգումենտ թույլատրվում է միայն անհատականացված " -"ավտոլրացումների համար" +"E468: Ավտոլրացման արգումենտ թույլատրվում է միայն անհատականացված լրացումների " +"համար" #, c-format msgid "E469: Invalid cscopequickfix flag %c for %c" @@ -5599,19 +5624,19 @@ msgid "E472: Command failed" msgstr "E472: Հրամանը ձախողվել է" msgid "E474: Invalid argument" -msgstr "E474: Անվավեր պարամետր" +msgstr "E474: Անվավեր արգումենտ" #, c-format msgid "E475: Invalid argument: %s" -msgstr "E475: Անվավեր պարամետր: %s" +msgstr "E475: Անվավեր արգումենտ: %s" #, c-format msgid "E475: Invalid value for argument %s" -msgstr "E475: Անվավեր պարամետրի արժեք: %s" +msgstr "E475: Անվավեր արգումենտի արժեք: %s" #, c-format msgid "E475: Invalid value for argument %s: %s" -msgstr "E475: Անվավեր պարամետրի արժեք: %s: %s" +msgstr "E475: Անվավեր արգումենտի արժեք: %s: %s" msgid "E476: Invalid command" msgstr "E476: Անվավեր հրաման" @@ -5638,7 +5663,7 @@ msgid "E480: No match: %s" msgstr "E480: Համընկնում չկա: %s" msgid "E481: No range allowed" -msgstr "E481: Չթույլատրված միջակայք" +msgstr "E481: Չթույլատրված տիրույթ" #, c-format msgid "E482: Can't create file %s" @@ -5670,11 +5695,11 @@ msgid "E487: Argument must be positive: %s" msgstr "E487: Արգումենտը պետք է լինի դրական ամբողջաթիվ։ %s" msgid "E488: Trailing characters" -msgstr "E488: Ավելորդ նշաններ" +msgstr "E488: Ավելորդ նիշեր" #, c-format msgid "E488: Trailing characters: %s" -msgstr "E488: Ավելորդ նշաններ։ %s" +msgstr "E488: Ավելորդ նիշեր։ %s" msgid "E489: No call stack to substitute for \"\"" msgstr "E489: Կանչերի կույտ չկա \"\"-ի համար" @@ -5690,7 +5715,7 @@ msgid "E492: Not an editor command" msgstr "E492: Անծանոթ հրաման" msgid "E493: Backwards range given" -msgstr "E493: Տրված է հակադարձ միջակայք" +msgstr "E493: Տրված է հակադարձ տիրույթ" msgid "E494: Use w or w>>" msgstr "E494: Օգտագործել w կամ w>>" @@ -5732,15 +5757,15 @@ msgid "is read-only (cannot override: \"W\" in 'cpoptions')" msgstr "չխմբագրվող է (\"W\" in 'cpoptions')" msgid "is read-only (add ! to override)" -msgstr "չխմբագրվող է (անցնելու համար ավելացրեք !)" +msgstr "չխմբագրվող է (ամրագրելու համար ավելացնել !)" #, c-format msgid "E505: \"%s\" is read-only (add ! to override)" -msgstr "E505: \"%s\" չխմբագրվող է (ավելացնել !)" +msgstr "E505: \"%s\" չխմբագրվող է (ամրագրելու համար ավելացնել !)" msgid "E506: Can't write to backup file (add ! to override)" msgstr "" -"E506: Հնարավոր չէ ամրագրել պահպանման ֆայլում (ամրագրելու համար ավելացրեք !)" +"E506: Հնարավոր չէ ամրագրել պահպանման ֆայլում (ամրագրելու համար ավելացնել !)" msgid "E507: Close error for backup file (add ! to write anyway)" msgstr "E507: Պահպանման ֆայլի փակման սխալ (ամրագրելու համար ավելացրեք !)" @@ -5751,7 +5776,7 @@ msgstr "" msgid "E509: Cannot create backup file (add ! to override)" msgstr "" -"E509: Հնարավոր չէ ստեղծել պահպանման ֆայլը (ամրագրելու համար ավելացրեք !)" +"E509: Հնարավոր չէ ստեղծել պահպանման ֆայլ (ամրագրելու համար ավելացնել !)" msgid "E510: Can't make backup file (add ! to write anyway)" msgstr "" @@ -5803,13 +5828,13 @@ msgid "E521: Number required: &%s = '%s'" msgstr "E521: Պահանջվում է թիվ: &%s = '%s'" msgid "E522: Not found in termcap" -msgstr "E522: termcap֊ում չի հայտնաբերվել" +msgstr "E522: termcap֊ում չի հայտնաբերվել" msgid "E523: Not allowed here" msgstr "E523: Այստեղ չի թույլատրվում" msgid "E524: Missing colon" -msgstr "E524: Բացակայող վերջակետ" +msgstr "E524: Բացակայող երկկետ" msgid "E525: Zero length string" msgstr "E525: Դատարկ տող" @@ -5822,7 +5847,7 @@ msgid "E527: Missing comma" msgstr "E527: Բացակայող ստորակետ" msgid "E528: Must specify a ' value" -msgstr "E528: Անհրաժեշտ է '-ի համար տալ արժեք" +msgstr "E528: Անհրաժեշտ է '-ի համար տալ արժեք" msgid "E529: Cannot set 'term' to empty string" msgstr "E529: Հնարավոր չէ 'term'-ին վերագրել դատարկ արժեք" @@ -5844,14 +5869,14 @@ msgstr "E534: Անվավեր երկարությամբ տառատեսակ" #, c-format msgid "E535: Illegal character after <%c>" -msgstr "E535: Սխալ նշան <%c>֊ից հետո" +msgstr "E535: Սխալ նիշ <%c>֊ից հետո" msgid "E536: Comma required" msgstr "E536: Անհրաժեշտ է ստորակետ" #, c-format msgid "E537: 'commentstring' must be empty or contain %s" -msgstr "E537: 'commentstring'֊ը պետք լինի դատարկ կամ պարունակի %s" +msgstr "E537: 'commentstring'֊ը պետք է լինի դատարկ կամ պարունակի %s" #, c-format msgid "E538: Pattern found in every line: %s" @@ -5859,7 +5884,7 @@ msgstr "E538: Ամեն տողում նմուշ է հայտնաբերվել: %s" #, c-format msgid "E539: Illegal character <%s>" -msgstr "E539: Չթույլատրված նշան <%s>" +msgstr "E539: Չթույլատրված նիշ <%s>" msgid "E540: Unclosed expression sequence" msgstr "E540: Չփակված արտահայտությունների հաջորդականություն" @@ -5874,7 +5899,7 @@ msgid "E544: Keymap file not found" msgstr "E544: Բանալիային համապատասխանեցման ֆայլը չի հայտնաբերվել" msgid "E545: Missing colon" -msgstr "E545: Բացակայող վերջակետ" +msgstr "E545: Բացակայող երկկետ" msgid "E546: Illegal mode" msgstr "E546: Անծանոթ ռեժիմ" @@ -5883,13 +5908,13 @@ msgid "E547: Illegal mouseshape" msgstr "E547: Կուրսորի անծանոթ տեսք" msgid "E548: Digit expected" -msgstr "E548: Սպասվում է թիվ" +msgstr "E548: Սպասվում է թվանշան" msgid "E549: Illegal percentage" msgstr "E549: Տոկոսի անսպասելի արժեք" msgid "E550: Missing colon" -msgstr "E550: Բացակայող չակերտ" +msgstr "E550: Բացակայող երկկետ" msgid "E551: Illegal component" msgstr "E551: Սխալ բաղադրիչ" @@ -5947,7 +5972,7 @@ msgid "E567: No cscope connections" msgstr "E567: cscope կապեր չկան" msgid "E568: Duplicate cscope database not added" -msgstr "E568: Գոյություն ունեցող cscope տվյալների բազան չի ավելացվել" +msgstr "E568: Կրկնվող cscope տվյալների բազան չի ավելացվել" msgid "" "E571: Sorry, this command is disabled: the Tcl library could not be loaded." @@ -6024,7 +6049,7 @@ msgstr "" msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" msgstr "" -"E592: 'winwidth'-ի արժեքը չի կարող լինել ավելի փոքր քան 'winminwidth'-ի " +"E592: 'winwidth'-ի արժեքը չի կարող լինել ավելի փոքր քան 'winminwidth'-ի " "արժեքը" #, c-format @@ -6036,7 +6061,7 @@ msgid "E594: Need at least %d columns" msgstr "E594: Անհրաժեշտ են գոնե %d սյուններ" msgid "E595: 'showbreak' contains unprintable or wide character" -msgstr "E595: 'showbreak'-ը պարունակում է չտպագրվող կամ երկար տառեր" +msgstr "E595: 'showbreak'-ը պարունակում է չտպագրվող կամ լայն նիշ" msgid "E596: Invalid font(s)" msgstr "E596: Անվավեր տառատեսակներ" @@ -6045,7 +6070,7 @@ msgid "E597: Can't select fontset" msgstr "E597: Հնարավոր չէ նշել տառատեսակների խումբը" msgid "E598: Invalid fontset" -msgstr "E598: Անվավեր տառատեսակների խումբ" +msgstr "E598: Անվավեր տառատեսակների խումբ" msgid "E599: Value of 'imactivatekey' is invalid" msgstr "E599: 'imactivatekey'-ի արժեքն անվավեր է" @@ -6137,7 +6162,7 @@ msgstr "E626: Անհնար է ստանալ cscope տվյալների բազայ #, c-format msgid "E627: Missing colon: %s" -msgstr "E627: Բացակայող վերջակետ։ %s" +msgstr "E627: Բացակայող երկկետ։ %s" #, c-format msgid "E628: Missing ! or / in: %s" @@ -6203,6 +6228,9 @@ msgstr "E647: Անվավեր բուֆերի անուն setDot-ում" msgid "E648: Invalid buffer identifier in close" msgstr "E648: Անվավեր բուֆերի անուն close-ում" +msgid "E649: Invalid identifier name in defineAnnoType" +msgstr "E649: Անվավեր նույնացուցիչ defineAnnoType-ում" + msgid "E650: Invalid buffer identifier in defineAnnoType" msgstr "E650: Անվավեր բուֆերի նույնացուցիչ defineAnnoType-ում" @@ -6214,7 +6242,7 @@ msgstr "E652: Անվավեր բուֆերի անուն getAnno-ում" #, c-format msgid "E654: Missing delimiter after search pattern: %s" -msgstr "E654: Բացակայող բացատանիշ %s-ից հետո" +msgstr "E654: Բացակայող բացատանիշ որոնման նմուշից հետո՝ %s" msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: Աննախադեպ շատ խորհրդանշական հղումներ (ցի՞կլ)" @@ -6262,7 +6290,7 @@ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\"" msgstr "E668: NetBeans կապակցման տեղեկատվական ֆայլի սխալ ռեժիմ: \"%s\"" msgid "E669: Unprintable character in group name" -msgstr "E669: Չտպագրելի նշան՝ խմբի անվան մեջ" +msgstr "E669: Չտպագրելի նիշ՝ խմբի անվան մեջ" #, c-format msgid "E670: Mix of help file encodings within a language: %s" @@ -6277,7 +6305,7 @@ msgid "E672: Unable to open window inside MDI application" msgstr "E672: Հնարավոր չէ բացել պատուհանը MDI ծրագրում" msgid "E673: Incompatible multi-byte encoding and character set" -msgstr "E673: Անհամապատասխան բազմաբայթ կոդավորում և տառատեսակների բազմություն" +msgstr "E673: Անհամապատասխան բազմաբայթ կոդավորում և նիշերի բազմություն" msgid "E674: printmbcharset cannot be empty with multi-byte encoding." msgstr "E674: printmbcharset֊ը չի կարող դատարկ լինել բազմաբայթ կոդավորման հետ." @@ -6288,14 +6316,14 @@ msgstr "" #, c-format msgid "E676: No matching autocommands for buftype=%s buffer" -msgstr "E676: Buftype=%s բուֆերի համար համապատասխան ինքնահրամաններ չկան" +msgstr "E676: Buftype=%s բուֆերի համար համընկնող ինքնահրամաններ չկան" msgid "E677: Error writing temp file" msgstr "E677: Սխալ է տեղի ունեցել ժամանակավոր ֆայլում գրելու ընթացքում" #, c-format msgid "E678: Invalid character after %s%%[dxouU]" -msgstr "E678: Անվավեր նշան՝ %s%%[dxouU]-ից հետո" +msgstr "E678: Անվավեր նիշ՝ %s%%[dxouU]-ից հետո" msgid "E679: Recursive loop loading syncolor.vim" msgstr "E679: Ռեկուրսիվ շրջակցային բեռնում syncolor.vim" @@ -6315,15 +6343,15 @@ msgstr "E683: Ֆայլի անունը տրված չէ կամ տրված է ան #, c-format msgid "E684: List index out of range: %ld" -msgstr "E684: Ցանկի ինդեքսն անցել է թույլատրելի միջակայքը: %ld" +msgstr "E684: Ցանկի ինդեքսն անցել է թույլատրելի տիրույթը: %ld" #, c-format msgid "E685: Internal error: %s" -msgstr "E685: Ներքին համակարգային սխալ: %s" +msgstr "E685: Ներքին համակարգային սխալ: %s" #, c-format msgid "E686: Argument of %s must be a List" -msgstr "E686: %s պարամետրը պետք է լինի ցանկ" +msgstr "E686: %s արգումենտը պետք է լինի List" msgid "E687: Less targets than List items" msgstr "E687: Ավելի քիչ նշաններ քան ցանկի էլեմենտները" @@ -6437,11 +6465,11 @@ msgstr "E719: Հնարավոր չէ կտրատել բառարանը" #, c-format msgid "E720: Missing colon in Dictionary: %s" -msgstr "E720: Բառարանում բաց թողնված չակերտ: %s" +msgstr "E720: Բառարանում բացակայող երկկետ: %s" #, c-format msgid "E721: Duplicate key in Dictionary: \"%s\"" -msgstr "E721: Բառարանի բանալու կրկնություն: \"%s\"" +msgstr "E721: Կրկնվող բանալի բառարանում: \"%s\"" #, c-format msgid "E722: Missing comma in Dictionary: %s" @@ -6506,7 +6534,7 @@ msgstr "E739: Հնարավոր չէ ստեղծել թղթապանակ: %s" #, c-format msgid "E740: Too many arguments for function %s" -msgstr "E740: %s֊ին տրված են աննախադեպ շատ Ֆունկցիայի արգումենտներ" +msgstr "E740: %s֊ին տրված են աննախադեպ շատ Ֆունկցիայի արգումենտներ" msgid "E741: Value is locked" msgstr "E741: Արժեքը բլոկավորված է" @@ -6537,11 +6565,11 @@ msgstr "E746: Ֆունկցիայի անունը չի համընկնում սկր msgid "E747: Cannot change directory, buffer is modified (add ! to override)" msgstr "" -"E747: Հնարավոր չէ փոխել թղթապանակը, կա փոփոխված buffer (անցման համար " -"ավելցանել !)" +"E747: Հնարավոր չէ փոխել թղթապանակը, կա փոփոխված buffer (ամրագրելու համար " +"ավելացնել !)" msgid "E748: No previously used register" -msgstr "E748: Չկան նախկինում օգտագորխված ռեգիստրներ" +msgstr "E748: Չկան նախկինում օգտագործված ռեգիստրներ" msgid "E749: Empty buffer" msgstr "E749: Դատարկ բուֆեր" @@ -6587,12 +6615,10 @@ msgid "E761: Format error in affix file FOL, LOW or UPP" msgstr "E761: Ֆորմատի սխալ FOL, LOW կամ UPP ֆայլերում" msgid "E762: Character in FOL, LOW or UPP is out of range" -msgstr "E762: FOL, LOW կամ UPP ֆայլերում տրված տառը դուրս է եկել դիապազոնցի" +msgstr "E762: FOL, LOW կամ UPP ֆայլերում տրված նիշը դուրս է եկել տիրույթից" msgid "E763: Word characters differ between spell files" -msgstr "" -"E763: Տառերի քանակությունը չի համընկնում ուղղագրման ֆայլում սահմանված բառի " -"տառերի քանակությանը" +msgstr "E763: Բառի նիշերը տարբերվում են ուղղագրման ֆայլերում" #, c-format msgid "E764: Option '%s' is not set" @@ -6656,14 +6682,14 @@ msgstr "E780: .sug ֆայլը նախատեսված է ավելի թարմ Vim-ի #, c-format msgid "E781: .sug file doesn't match .spl file: %s" -msgstr "E781: .sug ֆայլը չի համապատասխանում .spl: ֆայլի հետ %s" +msgstr "E781: .sug ֆայլը չի համընկնում .spl ֆայլի հետ: %s" #, c-format msgid "E782: Error while reading .sug file: %s" msgstr "E782: .sug ֆայլի ընթերցման սխալ: %s" msgid "E783: Duplicate char in MAP entry" -msgstr "E783: Կրկնակի տառ MAP-ի էլեմենտում" +msgstr "E783: Կրկնվող տառ MAP-ի էլեմենտում" msgid "E784: Cannot close last tab page" msgstr "E784: Հնարավոր չէ փակել վերջին բացված թաբը" @@ -6672,7 +6698,7 @@ msgid "E785: complete() can only be used in Insert mode" msgstr "E785: complete() կարող է օգտագործվել միայն զետեղման ռեժիմում" msgid "E786: Range not allowed" -msgstr "E786: Միջակայք թույլատրված չէ" +msgstr "E786: Տիրույթ թույլատրված չէ" msgid "E787: Buffer changed unexpectedly" msgstr "E787: Բուֆֆերն անսպասելի փոփոխվել է" @@ -6685,7 +6711,7 @@ msgid "E789: Missing ']': %s" msgstr "E789: Բացակայող ']': %s" msgid "E790: undojoin is not allowed after undo" -msgstr "E790: չեղարկման միավորումն անհնար է չեղարկումից հետո" +msgstr "E790: հետարկման միավորումն անհնար է հետարկումից հետո" msgid "E791: Empty keymap entry" msgstr "E791: Դատարկ բանալիային համապատասխանեցում" @@ -6726,7 +6752,7 @@ msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" msgstr "E799: Անվավեր համար։ %d (համարը պետք է լինի 1-ից մեծ կամ հավասար)" msgid "E800: Arabic cannot be used: Not enabled at compile time\n" -msgstr "E800: Արաբերենը հնարավոր չէ օգտագործել, միացված չէ կառուղման ժամանակ\n" +msgstr "E800: Արաբերենը հնարավոր չէ օգտագործել, միացված չէ կառուցման ժամանակ\n" #, c-format msgid "E801: ID already taken: %d" @@ -6763,7 +6789,7 @@ msgid "E810: Cannot read or write temp files" msgstr "E810: Հնարավոր չէ գրել կամ կարդալ ժամանակավոր ֆայլերում" msgid "E811: Not allowed to change buffer information now" -msgstr "E811: Հնարավոր չէ փոփոխել բուֆորի ինֆորմացիան" +msgstr "E811: Հնարավոր չէ փոփոխել բուֆերի ինֆորմացիան" msgid "E812: Autocommands changed buffer or buffer name" msgstr "E812: Ինքնահրամանները փոփոխել են բուֆերը կամ բուֆերի անունը" @@ -6803,43 +6829,43 @@ msgstr "E821: Ֆայլը կոդավորված է անծանոթ մեթոդներ #, c-format msgid "E822: Cannot open undo file for reading: %s" -msgstr "E822: Հնարավոր չէ բացել չեղարկման ֆայլն ընթերցման համար: %s" +msgstr "E822: Հնարավոր չէ բացել հետարկման ֆայլն ընթերցման համար: %s" #, c-format msgid "E823: Not an undo file: %s" -msgstr "E823: Չեղարկման ֆայլ չէ: %s" +msgstr "E823: Հետարկման ֆայլ չէ: %s" #, c-format msgid "E824: Incompatible undo file: %s" -msgstr "E824: Անհամապատասխան չեղարկման ֆայլ: %s" +msgstr "E824: Անհամապատասխան հետարկման ֆայլ: %s" #, c-format msgid "E825: Corrupted undo file (%s): %s" -msgstr "E825: Վնասված չեղարկման ֆայլ (%s): %s" +msgstr "E825: Վնասված հետարկման ֆայլ (%s): %s" #, c-format msgid "E826: Undo file decryption failed: %s" -msgstr "E826: Չեղարկման ֆայլի դեկոդավորումն ավարտվել է անհաջողությամբ: %s" +msgstr "E826: Հետարկման ֆայլի դեկոդավորումն ավարտվել է անհաջողությամբ: %s" #, c-format msgid "E827: Undo file is encrypted: %s" -msgstr "E827: Չեղարկման ֆայլը կոդավորված է: %s" +msgstr "E827: Հետարկման ֆայլը կոդավորված է: %s" #, c-format msgid "E828: Cannot open undo file for writing: %s" -msgstr "E828: Պահպանման համար հնարավոր չէ բացել չեղարկման ֆայլը: %s" +msgstr "E828: Պահպանման համար հնարավոր չէ բացել հետարկման ֆայլը: %s" #, c-format msgid "E829: Write error in undo file: %s" -msgstr "E829: Չեղարկման ֆայլի ամրագրման սխալ: %s" +msgstr "E829: Հետարկման ֆայլի ամրագրման սխալ: %s" #, c-format msgid "E830: Undo number %ld not found" -msgstr "E830: Չեղարկման %ld համարը չի հայտնաբերվել" +msgstr "E830: Հետարկման %ld համարը չի հայտնաբերվել" #, c-format msgid "E832: Non-encrypted file has encrypted undo file: %s" -msgstr "E832: Չկոդավորված ֆայլն ունի կոդավորված չեղարկման ֆայլ: %s" +msgstr "E832: Չկոդավորված ֆայլն ունի կոդավորված հետարկման ֆայլ: %s" #, c-format msgid "" @@ -6903,17 +6929,17 @@ msgid "E851: Failed to create a new process for the GUI" msgstr "E851: Հնարավոր չէ ստեղծել նոր պրոցես գրաֆիկական ինտերֆեյսի համար" msgid "E852: The child process failed to start the GUI" -msgstr "E852: Ճուտ պրոցեսին չի հաջողվել սկսել գրաֆիկական ինտերֆեյսը" +msgstr "E852: Ճուտ պրոցեսին չի հաջողվել սկսել գրաֆիկական ինտերֆեյսը" #, c-format msgid "E853: Duplicate argument name: %s" -msgstr "E853: Կրկնված արգումենտի անուն: %s" +msgstr "E853: Կրկնվող արգումենտի անուն: %s" msgid "E854: Path too long for completion" -msgstr "E854: Ճանապարհն անսպասելի երկար է ավտոլրացման համար" +msgstr "E854: Ճանապարհն անսպասելի երկար է լրացման համար" msgid "E855: Autocommands caused command to abort" -msgstr "E855: Ինքնահրամմանները ստիպել են հրամանին անհաջող ավարտվել" +msgstr "E855: Ինքնահրամանները հանգեցրել են հրամանի ընդհատմանը" msgid "" "E856: \"assert_fails()\" second argument must be a string or a list with one " @@ -6967,7 +6993,7 @@ msgid "E867: (NFA regexp) Unknown operator '\\%%%c'" msgstr "E867: (NFA regexp) անծանոթ հրաման '\\%%%c'" msgid "E868: Error building NFA with equivalence class!" -msgstr "E868: Սխալ՝ NFA կառուցման ընթացքում !" +msgstr "E868: Սխալ NFA-ի կառուցման ընթացքում համարժեքության դասով!" #, c-format msgid "E869: (NFA regexp) Unknown operator '\\@%c'" @@ -6983,7 +7009,7 @@ msgid "E872: (NFA regexp) Too many '('" msgstr "E872: (NFA regexp) աննախադեպ շատ '('" msgid "E873: (NFA regexp) proper termination error" -msgstr "E873: (NFA regexp) ավարտման սխալ" +msgstr "E873: (NFA regexp) ավարտման սխալ" msgid "E874: (NFA regexp) Could not pop the stack!" msgstr "E874: (NFA regexp) Հնարավոր չէ ընթերցել ստեկից!" @@ -7000,7 +7026,7 @@ msgstr "E876: (NFA regexp) Հիշողությունն անբավարար է՝ NF #, c-format msgid "E877: (NFA regexp) Invalid character class: %d" -msgstr "E877: (NFA regexp) Անվավեր դաս : %d" +msgstr "E877: (NFA regexp) Անվավեր նիշերի դաս՝ %d" msgid "E878: (NFA regexp) Could not allocate memory for branch traversal!" msgstr "" @@ -7019,16 +7045,13 @@ msgstr "E881: Տողերի քանակն անսպասելիորեն փոփոխվ msgid "E882: Uniq compare function failed" msgstr "E882: Անհաջող համեմատում դասավորման կանչի համար" -msgid "" -"E883: Search pattern and expression register may not contain two or more " -"lines" -msgstr "" -"E883: Որոնման օրինակը և արտահայտությունների ռեգիստրը չեն կարող պարունակել " -"երկու կամ ավելի տող" +#, c-format +msgid "E883: Register '%c' cannot contain multiple lines" +msgstr "E883: Register '%c' չի կարող պարունակել մի քանի տողեր" #, c-format msgid "E884: Function name cannot contain a colon: %s" -msgstr "E884: Ֆունկցիայի անունը չի կարող պարունակել ստորակետ: %s" +msgstr "E884: Ֆունկցիայի անունը չի կարող պարունակել երկկետ: %s" #, c-format msgid "E885: Not possible to change sign %s" @@ -7087,7 +7110,7 @@ msgstr "E898: socket() channel_connect()-ում" #, c-format msgid "E899: Argument of %s must be a List or Blob" -msgstr "E899: %s պարամետրը պետք է լինի ցանկ" +msgstr "E899: %s արգումենտը պետք է լինի List կամ Blob" msgid "E900: maxdepth must be non-negative number" msgstr "E900: առավելագույն խորությունը պետք է լինի ոչ բացասական թիվ" @@ -7134,9 +7157,11 @@ msgstr "E910: Աշխատանքի օգտագործումը որպես համար" msgid "E911: Using a Job as a Float" msgstr "E911: Աշխատանքի օգտագործումը որպես բոց" -msgid "E912: Cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" +msgid "" +"E912: Cannot use ch_evalexpr()/ch_sendexpr() with a raw, nl or blob channel" msgstr "" -"E912: Հնարավոր չէ օգտագործել ch_evalexpr()/ch_sendexpr() հումքի կամ nl ալիքով" +"E912: Հնարավոր չէ օգտագործել ch_evalexpr()/ch_sendexpr() raw, nl կամ blob " +"ալիքով" msgid "E913: Using a Channel as a Number" msgstr "E913: ալիքի օգտագործումը որպես համար" @@ -7156,7 +7181,7 @@ msgstr "E917: Հնարավոր չէ օգտագործել հետզանգ %s()-ո #, c-format msgid "E918: Buffer must be loaded: %s" -msgstr "E918: Բուֆերը չի բեռնվել: %s" +msgstr "E918: Բուֆերը չի բեռնվել: %s" #, c-format msgid "E919: Directory not found in '%s': \"%s\"" @@ -7221,7 +7246,7 @@ msgstr "E937: Փորձեք ջնջել օգտագործվող բուֆերը՝ %s #, c-format msgid "E938: Duplicate key in JSON: \"%s\"" -msgstr "E938: Բանալու կրկնություն: \"%s\"" +msgstr "E938: Կրկնվող բանալի JSON-ում: \"%s\"" msgid "E939: Positive count required" msgstr "E939: Պահանջվում է դրական քանակ" @@ -7237,10 +7262,10 @@ msgid "E942: +clientserver feature not available" msgstr "E942: +clientserver առանձնահատկությունը հասանելի չէ" msgid "E944: Reverse range in character class" -msgstr "E944: Հակադարձ միջակայքը նիշերի դասում" +msgstr "E944: Հակադարձ տիրույթը նիշերի դասում" msgid "E945: Range too large in character class" -msgstr "E945: Նիշերի դասի միջակայքը չափազանց մեծ է" +msgstr "E945: Նիշերի դասի տիրույթը չափազանց մեծ է" msgid "E946: Cannot make a terminal with running job modifiable" msgstr "E946: Հնարավոր չէ կատարել տերմինալ՝ փոփոխվող գործող աշխատանքով" @@ -7272,10 +7297,10 @@ msgstr "E952: Ինքնահրամանն առաջացրել է ռեկուրսիվ #, c-format msgid "E953: File exists: %s" -msgstr "E953: Ֆայլն արդեն գոյություն ունի: %s" +msgstr "E953: Ֆայլն արդեն գոյություն ունի: %s" msgid "E954: 24-bit colors are not supported on this environment" -msgstr "E954: 24-բիթանոց գույները չեն ապահովվում այս միջավայրում" +msgstr "E954: 24-բիթանոց գույները չեն աջակցվում այս միջավայրում" msgid "E955: Not a terminal buffer" msgstr "E955: Տերմինալային բուֆեր չէ" @@ -7358,7 +7383,7 @@ msgid "E979: Blob index out of range: %ld" msgstr "E979: Blob ինդեքսը դուրս է տիրույթից՝ %ld" msgid "E980: Lowlevel input not supported" -msgstr "E980: Ցածր մակարդակի մուտքագրումը չի ապահովվում" +msgstr "E980: Ցածր մակարդակի մուտքագրումը չի աջակցվում" msgid "E981: Command not allowed in rvim" msgstr "E981: rvim֊ում չեն թույլատրվում վահանակի հրամաններ" @@ -7368,7 +7393,7 @@ msgstr "E982: ConPTY հասանելի չէ" #, c-format msgid "E983: Duplicate argument: %s" -msgstr "E983: Կրկնված արգումենտ: %s" +msgstr "E983: Կրկնվող արգումենտ: %s" msgid "E984: :scriptversion used outside of a sourced file" msgstr "E984: :scriptversion հրամանը օգտագործվում է կցվող ֆայլից դուրս" @@ -7409,10 +7434,10 @@ msgid "E995: Cannot modify existing variable" msgstr "E995: Հնարավոր չէ փոփոխել գոյություն ունեցող փոփոխականը" msgid "E996: Cannot lock a range" -msgstr "E996: Հնարավոր չէ կողպել միջակայքը" +msgstr "E996: Հնարավոր չէ կողպել տիրույթը" msgid "E996: Cannot lock an option" -msgstr "E996: Հնարավոր չէ արգելափակել տարբերակը" +msgstr "E996: Հնարավոր չէ արգելափակել ընտրանքը" msgid "E996: Cannot lock a list or dict" msgstr "E996: Հնարավոր չէ կողպել ցուցակը կամ թելադրանքը" @@ -7437,7 +7462,7 @@ msgstr "E999: սցենարի տարբերակը չի աջակցվում՝ %d" #, c-format msgid "E1001: Variable not found: %s" -msgstr "E1001: փոփոխականը չի գտնվել՝ %s" +msgstr "E1001: Փոփոխականը չի գտնվել՝ %s" #, c-format msgid "E1002: Syntax error at %s" @@ -7478,24 +7503,25 @@ msgstr "E1011: Անունը մի քիչ երկար է: %s" #, c-format msgid "E1012: Type mismatch; expected %s but got %s" -msgstr "E1012: Տիպի անհամապատասխանություն; սպասվում էր %s, բայց ստացավ %s" +msgstr "" +"E1012: Տիպերի անհամապատասխանություն; սպասվում էր %s, բայց սստացվել է %s" #, c-format msgid "E1012: Type mismatch; expected %s but got %s in %s" msgstr "" -"E1012: Տիպի անհամապատասխանություն; սպասվում էր %s, բայց ստացավ %s %s-ում" +"E1012: Տիպի անհամապատասխանություն; սպասվում էր %s, բայց ստացվել է %s %s-ում" #, c-format msgid "E1013: Argument %d: type mismatch, expected %s but got %s" msgstr "" -"E1013: արգումենտ %d. տեսակի անհամապատասխանություն, սպասվում էր %s, բայց " -"ստացավ %s" +"E1013: Արգումենտ %d: տեսակի անհամապատասխանություն, սպասվում էր %s, բայց " +"սստացվել է %s" #, c-format msgid "E1013: Argument %d: type mismatch, expected %s but got %s in %s" msgstr "" -"E1013: Փաստարկ %d. տիպի անհամապատասխանություն, սպասվում էր %s, բայց ստացավ " -"%s %s-ում" +"E1013: Փաստարկ %d. տիպի անհամապատասխանություն, սպասվում էր %s, բայց սստացվել " +"է %s %s-ում" #, c-format msgid "E1014: Invalid key: %s" @@ -7622,7 +7648,7 @@ msgstr "E1049: Տարրը չի արտահանվել սկրիպտով՝ %s" #, c-format msgid "E1050: Colon required before a range: %s" -msgstr "E1050: երկու կետ պահանջվում է ընդգրկույթից առաջ՝ %s" +msgstr "E1050: Երկկետ է պահանջվում տիրույթից առաջ՝ %s" msgid "E1051: Wrong argument type for +" msgstr "E1051: +-ի համար սխալ արգումենտի տեսակ" @@ -7654,7 +7680,7 @@ msgstr "E1058: Ֆունկցիայի կանչը շատ է ներդրված" #, c-format msgid "E1059: No white space allowed before colon: %s" -msgstr "E1059: երկու կետից առաջ սպիտակ տարածություն չի թույլատրվում՝ %s" +msgstr "E1059: երկկետից առաջ սպիտակ տարածություն չի թույլատրվում՝ %s" #, c-format msgid "E1060: Expected dot after name: %s" @@ -7829,7 +7855,7 @@ msgstr "E1110: Ցանկի %d տարրը չի պարունակում 3 թվեր" #, c-format msgid "E1111: List item %d range invalid" -msgstr "E1111: Ցանկի տարրի %d միջակայքն անվավեր է" +msgstr "E1111: Ցանկի տարրի %d տիրույթն անվավեր է" #, c-format msgid "E1112: List item %d cell width invalid" @@ -7837,7 +7863,7 @@ msgstr "E1112: Ցանկի տարր %d բջիջի լայնությունը անվ #, c-format msgid "E1113: Overlapping ranges for 0x%lx" -msgstr "E1113: համընկնող միջակայքեր 0x%lx-ի համար" +msgstr "E1113: համընկնող տիրույթներ 0x%lx-ի համար" msgid "E1114: Only values of 0x80 and higher supported" msgstr "E1114: Աջակցվում են միայն 0x80 և ավելի բարձր արժեքները" @@ -7917,7 +7943,7 @@ msgid "E1138: Using a Bool as a Number" msgstr "E1138: Bool-ի օգտագործումը որպես թիվ" msgid "E1139: Missing matching bracket after dict key" -msgstr "E1139: Դիկտիվ ստեղնից հետո բացակայում է համապատասխան փակագիծը" +msgstr "E1139: Dict բանալիից հետո բացակայում է համընկնող փակագիծը" msgid "E1140: :for argument must be a sequence of lists or tuples" msgstr "" @@ -7945,7 +7971,7 @@ msgstr "E1145: heredoc վերջի նշիչը բացակայում է՝ %s" #, c-format msgid "E1146: Command not recognized: %s" -msgstr "E1146: Անծանոթ հրաման։ %s" +msgstr "E1146: Անծանոթ հրաման։ %s" msgid "E1147: List not set" msgstr "E1147: Ցանկը սահմանված չէ" @@ -7972,7 +7998,7 @@ msgid "E1153: Invalid operation for %s" msgstr "E1153: Չթույլատրված գործողություն %s" msgid "E1154: Divide by zero" -msgstr "E1154: Բաժանել զրոյի" +msgstr "E1154: Զրոյի վրա բաժանում" msgid "E1155: Cannot define autocommands for ALL events" msgstr "" @@ -8012,18 +8038,18 @@ msgstr "" #, c-format msgid "E1163: Variable %d: type mismatch, expected %s but got %s in %s" msgstr "" -"E1163: փոփոխական %d. տիպի անհամապատասխանություն, սպասվում էր %s, բայց ստացավ " -"%s %s-ում" +"E1163: փոփոխական %d. տիպի անհամապատասխանություն, սպասվում էր %s, բայց " +"սստացվել է %s %s-ում" msgid "E1164: vim9cmd must be followed by a command" msgstr "E1164: vim9cmd-ին պետք է հետևի հրաման" #, c-format msgid "E1165: Cannot use a range with an assignment: %s" -msgstr "E1165: Հնարավոր չէ օգտագործել ընդգրկույթ հանձնարարությամբ՝ %s" +msgstr "E1165: Հնարավոր չէ օգտագործել տիրույթ հանձնարարությամբ՝ %s" msgid "E1166: Cannot use a range with a dictionary" -msgstr "E1166: Հնարավոր չէ օգտագործել ընդգրկույթ բառարանով" +msgstr "E1166: Հնարավոր չէ օգտագործել տիրույթ բառարանով" #, c-format msgid "E1167: Argument name shadows existing variable: %s" @@ -8089,7 +8115,7 @@ msgstr "E1182: Vim9 սկրիպտում հնարավոր չէ դիկտի ֆուն #, c-format msgid "E1183: Cannot use a range with an assignment operator: %s" -msgstr "E1183: Հնարավոր չէ օգտագործել ընդգրկույթ նշանակման օպերատորի հետ՝ %s" +msgstr "E1183: Հնարավոր չէ օգտագործել տիրույթ նշանակման օպերատորի հետ՝ %s" msgid "E1184: Blob not set" msgstr "E1184: Բլոբը կարգավորված չէ" @@ -8122,7 +8148,7 @@ msgid "E1191: Call to function that failed to compile: %s" msgstr "E1191: Ֆունկցիայի կանչ, որը չի հաջողվել կոմպիլացնել՝ %s" msgid "E1192: Empty function name" -msgstr "E1192: Դատարկ ֆունկցիայի անուն" +msgstr "E1192: Դատարկ ֆունկցիայի անուն" msgid "E1193: cryptmethod xchacha20 not built into this Vim" msgstr "E1193: cryptmethod xchacha20-ը ներկառուցված չէ այս Vim-ում" @@ -8164,7 +8190,7 @@ msgid "E1204: No Number allowed after .: '\\%%%c'" msgstr "E1204: '\\%%%c' հետո համարը չի թույլատրվում" msgid "E1205: No white space allowed between option and" -msgstr "E1205: Չի թույլատրվում սպիտակ տարածություն տարբերակի և" +msgstr "E1205: Չի թույլատրվում սպիտակ տարածություն ընտրանքի և" #, c-format msgid "E1206: Dictionary required for argument %d" @@ -8263,7 +8289,8 @@ msgstr "E1228: արգումենտի համար պահանջվում է ցուց #, c-format msgid "E1229: Expected dictionary for using key \"%s\", but got %s" msgstr "" -"E1229: Բանալի \"%s\" օգտագործելու համար սպասվում էր բառարան, բայց ստացավ %s" +"E1229: Բանալի \"%s\" օգտագործելու համար սպասվում էր բառարան, բայց սստացվել է " +"%s" msgid "E1230: Encryption: sodium_mlock() failed" msgstr "E1230: Կոդավորումը՝ sodium_mlock() ձախողվեց" @@ -8315,7 +8342,7 @@ msgid "E1242: No white space allowed before separator: %s" msgstr "E1242: Չի թույլատրվում սպիտակ տարածություն բաժանարարից առաջ՝ %s" msgid "E1243: ASCII code not in 32-127 range" -msgstr "E1243: ASCII կոդը 32-127 միջակայքում չէ" +msgstr "E1243: ASCII կոդը 32-127 տիրույթում չէ" #, c-format msgid "E1244: Bad color string: %s" @@ -8329,7 +8356,7 @@ msgid "E1246: Cannot find variable to (un)lock: %s" msgstr "E1246: Հնարավոր չէ գտնել փոփոխական (ապ)կողպելու համար՝ %s" msgid "E1247: Line number out of range" -msgstr "E1247: Տողի համարը միջակայքից անցել է" +msgstr "E1247: Տողի համարը տիրույթից անցել է" msgid "E1248: Closure called from invalid context" msgstr "E1248: Փակումը կանչվել է անվավեր համատեքստից" @@ -8450,14 +8477,14 @@ msgstr "E1277: Հունի և աշխատանքի առանձնահատկությո #, c-format msgid "E1278: Stray '}' without a matching '{': %s" -msgstr "E1278: Ձևավոր '}' առանց համապատասխան '{': %s" +msgstr "E1278: Ավելորդ '}' առանց համընկնող '{'՝ %s" #, c-format msgid "E1279: Missing '}': %s" msgstr "E1279: Բացակայող '}': %s" msgid "E1280: Illegal character in word" -msgstr "E1280: Չթույլատրված նշան" +msgstr "E1280: Չթույլատրված նիշ բառում" #, c-format msgid "E1281: Atom '\\%%#=%c' must be at the start of the pattern" @@ -8503,9 +8530,8 @@ msgstr "E1291: Անվավեր արգումենտ: %ld" msgid "E1292: Command-line window is already open" msgstr "E1292: հրամանի տողի պատուհանն արդեն բաց է" -msgid "E1293: Cannot use a negative id after adding a textprop with text" -msgstr "" -"E1293: Չի կարող օգտագործել բացասական ID՝ տեքստով տեքստ ավելացնելուց հետո" +msgid "E1293: Cannot use a negative id for a text property" +msgstr "E1293: Հնարավոր չէ օգտագործել բացասական ինդեքս text property-ի համար" msgid "E1294: Can only use text_align when column is zero" msgstr "E1294: Կարող է օգտագործվել միայն text_align, երբ սյունակը զրո է" @@ -8618,7 +8644,7 @@ msgstr "E1326: \"%s\" փոփոխականը չի գտնվել \"%s\" օբյեկտ #, c-format msgid "E1327: Object required, found %s" -msgstr "E1327: Պահանջվում է օբյեկտ, գտնվել է %s" +msgstr "E1327: Պահանջվում է օբյեկտ, ստացվել է %s" #, c-format msgid "E1328: Constructor default value must be v:none: %s" @@ -8656,13 +8682,6 @@ msgstr "E1335: \"%s\" փոփոխականը \"%s\" դասի գրառելի չէ" msgid "E1337: Class variable \"%s\" not found in class \"%s\"" msgstr "E1337: \"%s\" դասի փոփոխականը \"%s\" դասում չի գտնվել" -msgid "" -"E1339: Cannot add a textprop with text after using a textprop with a " -"negative id" -msgstr "" -"E1339: Բացասական ID-ով տեքստային պրոպ օգտագործելուց հետո հնարավոր չէ " -"ավելացնել տեքստային պրոպ" - #, c-format msgid "E1340: Argument already declared in the class: %s" msgstr "E1340: արգումենտ արդեն հայտարարված է դասարանում՝ %s" @@ -8702,14 +8721,14 @@ msgid "E1349: Method \"%s\" of interface \"%s\" is not implemented" msgstr "E1349: \"%s\" ինտերֆեյսի \"%s\" մեթոդը իրականացված չէ" msgid "E1350: Duplicate \"implements\"" -msgstr "E1350: Կրկնված \"implements\"" +msgstr "E1350: Կրկնվող \"implements\"" #, c-format msgid "E1351: Duplicate interface after \"implements\": %s" -msgstr "E1351: Կրկնված ինտերֆեյս \"implements\" ից հետո: %s" +msgstr "E1351: Կրկնվող ինտերֆեյս \"implements\" ից հետո: %s" msgid "E1352: Duplicate \"extends\"" -msgstr "E1352: Կրկնված \"extends\"" +msgstr "E1352: Կրկնվող \"extends\"" #, c-format msgid "E1353: Class name not found: %s" @@ -8721,10 +8740,10 @@ msgstr "E1354: Հնարավոր չէ լրացնել %s֊ը" #, c-format msgid "E1355: Duplicate function: %s" -msgstr "E1355: Կրկնված ֆունկցիա: %s" +msgstr "E1355: Կրկնվող ֆունկցիա: %s" msgid "E1356: \"super\" must be followed by a dot" -msgstr "E1356: \"super\" պետք լինի ․-ից հետո" +msgstr "E1356: \"super\" պետք է լինի ․-ից հետո" msgid "E1357: Using \"super\" not in a class method" msgstr "E1357: \"super\"-ի օգտագործումը դասի մեթոդից դուրս" @@ -8739,8 +8758,7 @@ msgid "E1360: Using a null object" msgstr "E1360: Օգտագործելով զրոյական օբյեկտ" msgid "E1361: Cannot use color \"none\", did you mean \"NONE\"?" -msgstr "" -"E1361: Չի կարելի օգտագործել \"none\" գույնի փոխարեն, նկատի ունեիք \"NONE\"՞" +msgstr "E1361: Չի կարելի օգտագործել \"none\" գույն, նկատի ունեիք \"NONE\"?" msgid "E1362: Cannot use a non-null object" msgstr "E1362: Հնարավոր չէ օգտագործել non-null օբյեկտը" @@ -8772,7 +8790,7 @@ msgstr "" #, c-format msgid "E1369: Duplicate variable: %s" -msgstr "E1369: Կրկնված փոփոխական : %s" +msgstr "E1369: Կրկնվող փոփոխական : %s" msgid "E1370: Cannot define a \"new\" method as static" msgstr "E1370: Հնարավոր չէ սահմանել \"new\" մեթոդը որպես ստատիկ" @@ -8826,8 +8844,8 @@ msgstr "" #, c-format msgid "E1383: Method \"%s\": type mismatch, expected %s but got %s" msgstr "" -"E1383: \"%s\" մեթոդ. տիպի անհամապատասխանություն, սպասվում էր %s, բայց ստացավ " -"%s" +"E1383: \"%s\" մեթոդ. տիպի անհամապատասխանություն, սպասվում էր %s, բայց " +"սստացվել է %s" #, c-format msgid "E1384: Class method \"%s\" accessible only inside class \"%s\"" @@ -8902,6 +8920,10 @@ msgstr "E1404: Abstract հնարավոր չէ օգտագործել ինտերֆ msgid "E1405: Class \"%s\" cannot be used as a value" msgstr "E1405: \"%s\" դասը չի կարող օգտագործվել որպես արժեք" +#, c-format +msgid "E1406: Public and protected member have the same name: %s and _%s" +msgstr "E1406: Public և protected անդամներն ունեն նույն անունը: %s և _%s" + msgid "E1407: Cannot use a Typealias as a variable or value" msgstr "E1407: Հնարավոր չէ օգտագործել Typealias-ը որպես փոփոխական կամ արժեք" @@ -8952,15 +8974,15 @@ msgstr "E1420: Բացակայող :endenum" #, c-format msgid "E1421: Enum \"%s\" cannot be used as a value" -msgstr "E1421: \"%s\" թիվը չի կարող օգտագործվել որպես արժեք" +msgstr "E1421: \"%s\" թվարկումը չի կարող օգտագործվել որպես արժեք" #, c-format msgid "E1422: Enum value \"%s\" not found in enum \"%s\"" -msgstr "E1422: \"%s\" թվային արժեքը \"%s\"-ում չի գտնվել" +msgstr "E1422: \"%s\" թվարկման արժեքը չի գտնվել \"%s\"-ում" #, c-format msgid "E1423: Enum value \"%s.%s\" cannot be modified" -msgstr "E1423: \"%s.%s\" թվային արժեքը չի կարող փոփոխվել" +msgstr "E1423: \"%s.%s\" թվարկման արժեքը չի կարող փոփոխվել" #, c-format msgid "E1424: Using an Enum \"%s\" as a Number" @@ -8972,15 +8994,15 @@ msgstr "E1425: \"%s\" Թվարկում է օգտագործվել տողի փոխ #, c-format msgid "E1426: Enum \"%s\" ordinal value cannot be modified" -msgstr "E1426: \"%s\" թվի հերթական արժեքը հնարավոր չէ փոփոխել" +msgstr "E1426: \"%s\" թվարկման դասական արժեքը հնարավոր չէ փոփոխել" #, c-format msgid "E1427: Enum \"%s\" name cannot be modified" -msgstr "E1427: \"%s\" թվի անունը չի կարող փոփոխվել" +msgstr "E1427: \"%s\" թվարկման անունը չի կարող փոփոխվել" #, c-format msgid "E1428: Duplicate enum value: %s" -msgstr "E1428: Կրկնված արգումենտի անուն թվարկման մեջ: %s" +msgstr "E1428: Կրկնվող թվարկման արժեք: %s" msgid "E1429: Class can only be used in a script" msgstr "E1429: Դասը կարող է օգտագործվել միայն սցենարով" @@ -9018,7 +9040,7 @@ msgstr "" "անհամապատասխանություն" msgid "E1435: Enum can only be used in a script" -msgstr "E1435: Թվարկումը հնարավոր է օգտագործել միայն սցենարում" +msgstr "E1435: Թվարկումը հնարավոր է օգտագործել միայն սկրիպտում" msgid "E1436: Interface can only be used in a script" msgstr "E1436: Ինտերֆեյսը հնարավոր է օգտագործել միայն սցենարում" @@ -9063,11 +9085,11 @@ msgid "" "E1508: Size of the extended attribute value is larger than the maximum size " "allowed" msgstr "" -"E1508: Ընդլայնված հատկանիշի արժեքի չափն ավելի մեծ է, քան թույլատրելի " +"E1508: Ընդլայնված բնորոշիչի արժեքի չափն ավելի մեծ է, քան թույլատրելի " "առավելագույն չափը" msgid "E1509: Error occurred when reading or writing extended attribute" -msgstr "E1509: Սխալ է տեղի ունեցել ընդլայնված հատկանիշը կարդալիս կամ գրելիս" +msgstr "E1509: Սխալ է տեղի ունեցել ընդլայնված բնորոշիչը կարդալիս կամ գրելիս" #, c-format msgid "E1510: Value too large: %s" @@ -9196,13 +9218,13 @@ msgid "E1544: Failed resizing the quickfix/location list stack" msgstr "E1544: Չհաջողվեց փոխել quickfix/location ցուցակների stack-ի չափը" msgid "E1545: Quickfix list stack unavailable" -msgstr "E1545: Quickfix ցուցակների stack-ը հասանելի չէ։" +msgstr "E1545: Quickfix ցուցակների stack-ը հասանելի չէ" msgid "E1546: Cannot switch to a closing buffer" msgstr "E1546: Չի կարելի անցնել փակվող բուֆերի վրա" -msgid "E1547: This version of Vim does support :redrawtabpanel" -msgstr "E1547: Այս Vim-ի տարբերակը չի աջակցում :redrawtabpanel հրամանին" +msgid "E1547: This version of Vim does not support :redrawtabpanel" +msgstr "E1547: Vim-ի այս տարբերակը չի աջակցում :redrawtabpanel" msgid "E1548: Wayland connection is unavailable" msgstr "E1548: Wayland կապը հասանելի չէ" @@ -9261,22 +9283,25 @@ msgstr "E1561: Տիպային փոփոխականի կրկնվող անուն: %s msgid "E1562: Diff anchors cannot be used with hidden diff windows" msgstr "E1562: Diff anchor-ները կիրառելի չեն թաքնված diff պատուհանների համար" -msgid "E1563: Socket path is too big" -msgstr "E1563: Սոքետի ճանապարհը գերազանցում է թույլատրելի երկարությունը" - -msgid "E1564: Socket name cannot have slashes in it without being a path" -msgstr "E1564: Սոքետի անունը չի կարող պարունակել '/' նշաններ, եթե այն ուղի չէ" +#, c-format +msgid "E1564: Socket name '%s' cannot have slashes in it without being a path" +msgstr "" +"E1564: '%s' սոկետի անունը չի կարող պարունակել շեղ գծեր, եթե այն ուղի չէ" msgid "E1565: Socket server is not online, call remote_startserver() first" msgstr "" "E1565: Սոքետ սերվերն ակտիվ չէ, նախ պետք է գործարկել remote_startserver()" #, c-format -msgid "E1566: Failed connecting to socket %s: %s" -msgstr "E1566: Չհաջողվեց միանալ սոկետին (%s)․ %s" +msgid "E1566: Failed connecting to socket '%s'" +msgstr "E1566: Չհաջողվեց հաղորդակցվել '%s' socket-ին" -msgid "E1567: Cannot start socket server, socket path is unavailable" -msgstr "E1567: Չի հաջողվում սկսել socket սերվերը, socket-ի ուղին հասանելի չէ" +msgid "" +"E1567: Socket server protocol version mismatch, check what Vim version you " +"are using" +msgstr "" +"E1567: Սոկետ սերվերի արձանագրության տարբերակի անհամապատասխանություն, " +"ստուգեք, թե Vim-ի որ տարբերակն եք օգտագործում" #, c-format msgid "E1568: OSC command response timed out: %.*s" @@ -9293,6 +9318,34 @@ msgstr "" msgid "E1571: Must specify at least one callback for redraw_listener_add" msgstr "E1571: redraud_listener_add-ը պահանջում է առնվազն մեկ callback" +msgid "E1572: 'listchars' field \"leadtab\" requires \"tab\" to be specified" +msgstr "" +"E1572: 'listchars' դաշտի \"leadtab\"-ը պահանջում է, որ \"tab\"-ը նշված լինի" + +msgid "E1573: Cannot listen on port" +msgstr "E1573: Չի հաջողվում բացել պորտը" + +msgid "E1574: gethostbyname(): cannot resolve hostname in channel_listen()" +msgstr "" +"E1574: gethostbyname()։ չի հաջողվում պարզել հոսթի անունը channel_listen() " +"ֆունկցիայում" + +msgid "E1575: Cannot create pipes" +msgstr "E1575: Հնարավոր չէ ստեղծէլ սրնգափողեր" + +msgid "E1576: Tag file entry must not be a URL" +msgstr "E1576: Թեգերի ֆայլի գրառումը չպետք է URL լինի" + +#, c-format +msgid "E1577: Invalid format string, only one \"%s\" is allowed" +msgstr "E1577: Անվավեր ֆորմատի տող, միայն մեկ \"%s\" է թույլատրվում" + +msgid "E1578: Too many postponed prefixes and/or compound flags" +msgstr "E1578: Աննախադեպ շատ հետաձգված նախածանցներ կամ պարփակման դրոշմանիշեր" + +msgid "E1579: -completeopt=escape cannot be used with -nargs=_" +msgstr "E1579: -completeopt=escape-ը չի կարող օգտագործվել -nargs=_-ի հետ" + msgid "--No lines in buffer--" msgstr "-- Բուֆերում տողեր չկան --" @@ -9337,11 +9390,11 @@ msgstr "ինդեքսը պետք է լինի int կամ slice, ոչ թե %s" #, c-format msgid "expected str() or unicode() instance, but got %s" -msgstr "սպասվում էր str() կամ unicode() օրինակ, բայց ստացավ %s" +msgstr "սպասվում էր str() կամ unicode() օրինակ, բայց սստացվել է %s" #, c-format msgid "expected bytes() or str() instance, but got %s" -msgstr "սպասվում էր բայթ() կամ str() օրինակ, բայց ստացավ %s" +msgstr "սպասվում էր բայթ() կամ str() օրինակ, բայց սստացվել է %s" #, c-format msgid "" @@ -9353,7 +9406,7 @@ msgstr "" #, c-format msgid "expected int() or something supporting coercing to int(), but got %s" msgstr "" -"սպասվում էր int() կամ ինչ-որ բան, որն աջակցում է int(-ին), բայց ստացավ %s" +"սպասվում էր int() կամ ինչ-որ բան, որն աջակցում է int(-ին), բայց սստացվել է %s" msgid "value is too large to fit into C int type" msgstr "արժեքը չափազանց մեծ է C int տեսակի մեջ տեղավորվելու համար" @@ -9365,7 +9418,7 @@ msgid "number must be greater than zero" msgstr "թիվը պետք է լինի զրոյից մեծ" msgid "number must be greater or equal to zero" -msgstr "թիվը պետք լինի 0-ից մեծ կամ հավասար" +msgstr "թիվը պետք է լինի 0-ից մեծ կամ հավասար" msgid "can't delete OutputObject attributes" msgstr "հնարավոր չէ ջնջել OutputObject բնորոշիչները" @@ -9414,7 +9467,7 @@ msgid "list constructor does not accept keyword arguments" msgstr "ցուցակի կառուցողը չի ընդունում հիմնաբառերի փաստարկները" msgid "list index out of range" -msgstr "ցանկի ինդեքսը անցել է թույլատրելի միջակայքը" +msgstr "ցանկի ինդեքսը անցել է թույլատրելի տիրույթը" #, c-format msgid "internal error: failed to get Vim list item %d" @@ -9429,10 +9482,10 @@ msgstr "փորձեք նշանակել %d-ից մեծ չափի հաջորդակա #, c-format msgid "internal error: no Vim list item %d" -msgstr "ներքին համակարգային սխալ: չկա %d ցանկի էլէմենտը" +msgstr "ներքին համակարգային սխալ: չկա %d ցանկի էլեմենտը" msgid "internal error: not enough list items" -msgstr "ներքին համակարգային սխալ: չկան բավարար ցանկի էլէմենտներ" +msgstr "ներքին համակարգային սխալ: չկան բավարար ցանկի էլեմենտներ" msgid "internal error: failed to add item to list" msgstr "ներքին համակարգային սխալ: հնարավոր չէ ցանկին էլեմենտ ավելացնել" @@ -9454,10 +9507,10 @@ msgid "tuple constructor does not accept keyword arguments" msgstr "tuple կոնստրուկտորը չի ընդունում հիմնաբառ արգումենտներ" msgid "tuple index out of range" -msgstr "tuple-ի ինդեքսը դուրս է թույլատրելի միջակայքից" +msgstr "tuple-ի ինդեքսը դուրս է թույլատրելի տիրույթից" msgid "cannot delete vim.Tuple attributes" -msgstr "vim.Tuple-ի հատկությունները հնարավոր չէ ջնջել" +msgstr "vim.Tuple-ի բնորոշիչները հնարավոր չէ ջնջել" msgid "cannot modify fixed tuple" msgstr "չի կարելի փոփոխել ֆիքսված Tuple" @@ -9516,11 +9569,11 @@ msgid "failed to rename buffer" msgstr "չհաջողվեց վերանվանել բուֆերը" msgid "mark name must be a single character" -msgstr "նշանի անունը պետք է լինի մեկ նիշ" +msgstr "նշակի անունը պետք է լինի մեկ նիշ" #, c-format msgid "expected vim.Buffer object, but got %s" -msgstr "սպասվում էր vim.Buffer օբյեկտ, բայց ստացավ %s" +msgstr "սպասվում էր vim.Buffer օբյեկտ, բայց սստացվել է %s" #, c-format msgid "failed to switch to buffer %d" @@ -9528,7 +9581,7 @@ msgstr "չհաջողվեց անցնել բուֆեր %d-ին" #, c-format msgid "expected vim.Window object, but got %s" -msgstr "սպասվում էր vim.Window օբյեկտ, բայց ստացավ %s" +msgstr "սպասվում էր vim.Window օբյեկտ, բայց սստացվել է %s" msgid "failed to find window in the current tab page" msgstr "չհաջողվեց գտնել պատուհան ընթացիկ ներդիրի էջում" @@ -9538,7 +9591,7 @@ msgstr "չի անցել նշված պատուհանին" #, c-format msgid "expected vim.TabPage object, but got %s" -msgstr "սպասվում էր vim.TabPage օբյեկտ, բայց ստացավ %s" +msgstr "սպասվում էր vim.TabPage օբյեկտ, բայց սստացվել է %s" msgid "did not switch to the specified tab page" msgstr "չի անցել նշված ներդիրի էջին" @@ -9653,26 +9706,26 @@ msgstr "(գլոբալ կամ տեղական բուֆերային)" msgid "" "\" Each \"set\" line shows the current value of an option (on the left)." msgstr "" -"\" Յուրաքանչյուր \"set\" տող ցույց է տալիս որևէ տարբերակի ընթացիկ արժեքը " -"(ձախ կողմում):" +"\" Յուրաքանչյուր \"set\" տող ցույց է տալիս որևէ ընտրանքի ընթացիկ արժեքը (ձախ " +"կողմում):" msgid "\" Hit on a \"set\" line to execute it." msgstr "\" Հպել \"set\" տողի վրա՝ այն կատարելու համար:" msgid "\" A boolean option will be toggled." -msgstr "\" Բուլյան տարբերակը կփոխանցվի:" +msgstr "\" Բուլյան ընտրանքը կփոխանցվի:" msgid "" "\" For other options you can edit the value before hitting " "." msgstr "" -"\" Մյուս տարբերակների համար կարող եք փոխել արժեքը նախքան " +"\" Մյուս ընտրանքների համար կարող եք փոխել արժեքը նախքան " "հպելը ." msgid "\" Hit on a help line to open a help window on this option." msgstr "" -"\" Հպել օգնության տողում՝ այս տարբերակի վրա օգնության պատուհան " -"բացելու համար:" +"\" Հպել օգնության տողում՝ այս ընտրանքի վրա օգնության պատուհան բացելու " +"համար:" msgid "\" Hit on an index line to jump there." msgstr "\" Հպել ինդեքսի գծի վրա՝ այնտեղ ցատկելու համար:" @@ -9690,7 +9743,7 @@ msgid "list of flags to specify Vi compatibility" msgstr "դրոշների ցուցակ՝ Vi-ի համատեղելիությունը նշելու համար" msgid "use Insert mode as the default mode" -msgstr "օգտագործեք Տեղադրման ռեժիմը որպես լռելյայն ռեժիմ" +msgstr "օգտագործեք զետեղման ռեժիմը որպես լռելյայն ռեժիմ" msgid "paste mode, insert typed text literally" msgstr "տեղադրեք ռեժիմ, մուտքագրված տեքստը բառացիորեն տեղադրեք" @@ -9699,10 +9752,10 @@ msgid "key sequence to toggle paste mode" msgstr "ստեղների հաջորդականությունը՝ տեղադրելու ռեժիմը փոխելու համար" msgid "list of directories used for runtime files and plugins" -msgstr "գործարկման ֆայլերի և պլագինների համար օգտագործվող դիրեկտորիաների ցանկը" +msgstr "գործարկման ֆայլերի և պլագինների համար օգտագործվող թղթապանակների ցանկը" msgid "list of directories used for plugin packages" -msgstr "plugin փաթեթների համար օգտագործվող դիրեկտորիաների ցանկը" +msgstr "plugin փաթեթների համար օգտագործվող թղթապանակների ցանկը" msgid "name of the main help file" msgstr "հիմնական օգնության ֆայլի անվանումը" @@ -9712,14 +9765,14 @@ msgstr "շարժվել, որոնումներ և նմուշներ" msgid "list of flags specifying which commands wrap to another line" msgstr "" -"դրոշակների ցանկ, որը նշում է, թե որ հրամանները փոխվում են մեկ այլ տողի վրա" +"դրոշների ցանկ, որը նշում է, թե որ հրամանները փոխվում են մեկ այլ տողի վրա" msgid "" "many jump commands move the cursor to the first non-blank\n" "character of a line" msgstr "" "շատ jump հրամաններ կուրսորը տեղափոխում են տողի առաջին ոչ դատարկ\n" -"նշանի մոտ" +"նիշի մոտ" msgid "nroff macro names that separate paragraphs" msgstr "nroff մակրո անվանումներ, որոնք առանձնացնում են պարբերությունները" @@ -9749,17 +9802,16 @@ msgid "show match for partly typed search command" msgstr "ցույց տալ համընկնումը մասամբ մուտքագրված որոնման հրամանի համար" msgid "change the way backslashes are used in search patterns" -msgstr "" -"փոխել հետադարձ շեղերի օգտագործման եղանակը որոնման օրինաչափություններում" +msgstr "փոխել հետադարձ շեղերի օգտագործման եղանակը որոնման նմուշներում" msgid "select the default regexp engine used" msgstr "ընտրեք օգտագործված լռելյայն regexp շարժիչը" msgid "ignore case when using a search pattern" -msgstr "անտեսել գործը որոնման օրինաչափություն օգտագործելիս" +msgstr "անտեսել մեծատառ/փոքրատառ տարբերությունը որոնման նմուշ օգտագործելիս" msgid "override 'ignorecase' when pattern has upper case characters" -msgstr "անտեսել 'ignorecase', երբ նախշն ունի մեծատառ նիշեր" +msgstr "անտեսել 'ignorecase', երբ նմուշն ունի մեծատառ նիշեր" msgid "maximum number for the search count feature" msgstr "փնտրման քանակի ֆունկցիայի առավելագույն թույլատրելի արժեքը" @@ -9769,8 +9821,8 @@ msgstr "ինչ մեթոդ օգտագործել տառերը փոխելու հա msgid "maximum amount of memory in Kbyte used for pattern matching" msgstr "" -"Kbyte հիշողության առավելագույն քանակը, որն օգտագործվում է " -"օրինաչափությունների համապատասխանեցման համար" +"Kbyte հիշողության առավելագույն քանակը, որն օգտագործվում է նմուշների " +"համընկնեցման համար" msgid "pattern for a macro definition line" msgstr "մակրո սահմանման գծի համար նմուշ" @@ -9805,12 +9857,15 @@ msgstr "" msgid "file names in a tags file are relative to the tags file" msgstr "պիտակ ֆայլում ֆայլերի անունները հարաբերական են պիտակների ֆայլին" +msgid "a :tag command cannot access remote files" +msgstr ":tag հրամանը չի կարող հասանելիություն ունենալ հեռավոր ֆայլերին" + msgid "a :tag command will use the tagstack" msgstr "a :tag հրամանը կօգտագործի tagstack-ը" msgid "when completing tags in Insert mode show more info" msgstr "" -"ցուցադրել ավելի շատ տեղեկություններ, երբ տեղադրման ռեժիմում լրացվում են " +"ցուցադրել ավելի շատ տեղեկություններ, երբ զետեղման ռեժիմում լրացվում են " "պիտակները" msgid "a function to be used to perform tag searches" @@ -9826,7 +9881,7 @@ msgid "0 or 1; the order in which \":cstag\" performs a search" msgstr "0 կամ 1; հերթականությունը, որով \":cstag\"-ը կատարում է որոնում" msgid "give messages when adding a cscope database" -msgstr "cscope տվյալների բազա ավելացնելիս հաղորդագրություններ տվեք" +msgstr "cscope տվյալների բազա ավելացնելիս հհաղորդագրություններ տվեք" msgid "how many components of the path to show" msgstr "ճանապարհի քանի բաղադրիչ ցույց տալ" @@ -9849,11 +9904,14 @@ msgstr "ոլորել ըստ էկրանի տողով" msgid "number of screen lines to show around the cursor" msgstr "էկրանի գծերի քանակը՝ կուրսորի շուրջը ցուցադրելու համար" +msgid "vertically center cursor even at end of file" +msgstr "ուղղահայաց կենտրոնացնել կուրսորը նույնիսկ ֆայլի վերջում" + msgid "long lines wrap" msgstr "երկար տողերի ծանում" msgid "wrap long lines at a character in 'breakat'" -msgstr "երկար տողեր փաթաթել կերպարի վրա 'breakat'-ում" +msgstr "երկար տողեր փաթաթել նիշի վրա 'breakat'-ում" msgid "preserve indentation in wrapped text" msgstr "պահպանել ներքևը փաթաթված տեքստում" @@ -9885,9 +9943,9 @@ msgid "" "characters to use for the status line, folds, diffs,\n" "buffer text, filler lines and truncation in the completion menu" msgstr "" -"թվանշաններ, որոնք օգտագործվում են՝ status line-ի, folds-ի, diffs-ի, buffer-ի " +"նիշեր, որոնք օգտագործվում են՝ status line-ի, փաթաթների, diffs-ի, buffer-ի " "տեքստի, \n" -"լրացման (filler) տողերի և ավտոլրացման մենյուում կրճատման համար" +"լրացման (filler) տողերի և լրացման մենյուում կրճատման համար" msgid "number of lines used for the command-line" msgstr "հրամանի տողի համար օգտագործվող տողերի քանակը" @@ -9904,6 +9962,12 @@ msgstr "ոլորման համար տողերի քանակը՝ CTRL-F և CTRL-B msgid "don't redraw while executing macros" msgstr "մի վերագծեք մակրոները կատարելիս" +msgid "configure method of receiving terminal size changes" +msgstr "Կարգավորել տերմինալի չափի փոփոխությունները ստանալու մեթոդը" + +msgid "enable terminal sync mode" +msgstr "ակտիվացնել տերմինալի համաժամացման ռեժիմը" + msgid "timeout for 'hlsearch' and :match highlighting in msec" msgstr "'hlsearch'-ի և msec-ում ընդգծված :match-ի ժամանակի դադարեցում" @@ -9957,7 +10021,7 @@ msgid "maximum column to look for syntax items" msgstr "առավելագույն սյունակ՝ ուղղագրման տարրեր փնտրելու համար" msgid "which highlighting to use for various occasions" -msgstr "որը կարևորում է օգտագործել տարբեր առիթների համար" +msgstr "թե որ գունանշումն օգտագործել տարբեր դեպքերում" msgid "highlight all matches for the last used search pattern" msgstr "գունանշել բոլոր համընկնումները վերջին օգտագործված որոնման նմուշի համար" @@ -9965,6 +10029,9 @@ msgstr "գունանշել բոլոր համընկնումները վերջին msgid "highlight group to use for the window" msgstr "պատուհանում օգտագործվելու համար գունանշել խումբը" +msgid "highlight group mappings for the window" +msgstr "գունանշման խմբի համապատասխանեցում պատուհանում օգտագործվելու համար" + msgid "use GUI colors for the terminal" msgstr "օգտագործեք GUI գույները տերմինալի համար" @@ -10011,6 +10078,9 @@ msgstr "0, 1 կամ 2; երբ օգտագործել կարգավիճակի տող msgid "alternate format to be used for a status line" msgstr "կարգավիճակի տողի համար օգտագործվող այլընտրանքային ձևաչափ" +msgid "optional settings for the status line" +msgstr "կարգագծի (status line) կամընտիր կարգավորումներ" + msgid "make all windows the same size when adding/removing windows" msgstr "" "պատուհաններ ավելացնելիս/հեռացնելիս բոլոր պատուհանները դարձրեք նույն չափի" @@ -10073,7 +10143,7 @@ msgid "this window scrolls together with other bound windows" msgstr "այս պատուհանը պտտվում է այլ կապված պատուհանների հետ միասին" msgid "\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'" -msgstr "\"ver\", \"hor\" և/կամ \"jump\"; 'scrollbind'-ի տարբերակների ցանկը" +msgstr "\"ver\", \"hor\" և/կամ \"jump\"; 'scrollbind'-ի ընտրանքների ցանկը" msgid "this window's cursor moves together with other bound windows" msgstr "այս պատուհանի կուրսորը շարժվում է մյուս փակ պատուհանների հետ միասին" @@ -10139,7 +10209,7 @@ msgid "what keyboard protocol to use for which terminal" msgstr "ստեղնաշարի ինչ արձանագրություն, որ տերմինալի համար օգտագործել" msgid "recognize keys that start with in Insert mode" -msgstr "ճանաչել ստեղները, որոնք սկսվում են Ներդիր ռեժիմում" +msgstr "ճանաչել ստեղները, որոնք սկսվում են զետեղման ռեժիմում" msgid "minimal number of lines to scroll at a time" msgstr "միևնույն ժամանակ ոլորելու համար տողերի նվազագույն քանակը" @@ -10198,8 +10268,8 @@ msgid "" "\"extend\", \"popup\" or \"popup_setpos\"; what the right\n" "mouse button is used for" msgstr "" -"\"extend\", \"popup\" կամ \"popup_setpos\"; ինչ իրավունք\n" -"մկնիկի կոճակը օգտագործում է" +"\"extend\", \"popup\" կամ \"popup_setpos\"; ինչի համար է\n" +"օգտագործվում մկնիկի աջ կոճակը" msgid "maximum time in msec to recognize a double-click" msgstr "առավելագույն ժամանակը msec-ում կրկնակի սեղմումը ճանաչելու համար" @@ -10240,11 +10310,10 @@ msgstr "սենյակ (պիքսելներով) պատուհանից վերևու msgid "" "list of ASCII characters that can be combined into complex\n" "shapes" -msgstr "" -"ASCII թվանշանների ցանկ, որոնք կարող են համակցվել բարդ ձևերի ստեղծման համար" +msgstr "ASCII նիշերի ցանկ, որոնք կարող են համակցվել բարդ ձևերի ստեղծման համար" msgid "options for text rendering" -msgstr "տեքստի մատուցման տարբերակներ" +msgstr "տեքստի մատուցման ընտրանքներ" msgid "use a pseudo-tty for I/O to external commands" msgstr "օգտագործել կեղծ-tty արտաքին հրամանների մուտքի/ելքի համար" @@ -10314,22 +10383,20 @@ msgstr "" "CJK նիշերի հավաքածուն, որը պետք է օգտագործվի CJK ելքի համար :hardcopy-ից" msgid "list of font names to be used for CJK output from :hardcopy" -msgstr "" -"տառատեսակների անունների ցանկը, որոնք պետք է օգտագործվեն CJK-ի ելքի " -"համար :hardcopy-ից" +msgstr "տառատեսակների անունների ցանկը, որոնք պետք է օգտագործվեն CJK-ի ելքի համար :hardcopy" msgid "messages and info" -msgstr "հաղորդագրություններ և տեղեկատվություն" +msgstr "հհաղորդագրություններ և տեղեկատվություն" msgid "add 's' flag in 'shortmess' (don't show search message)" msgstr "" "ավելացնել 's' դրոշը 'shortmess'-ում (որոնման հաղորդագրություն չցուցադրել)" msgid "list of flags to make messages shorter" -msgstr "դրոշների ցուցակ՝ հաղորդագրություններն ավելի կարճ դարձնելու համար" +msgstr "դրոշների ցուցակ՝ հհաղորդագրություններն ավելի կարճ դարձնելու համար" msgid "options for outputting messages" -msgstr "hաղորդագրություններ արտածելու ընտրանքներ" +msgstr "hհաղորդագրություններ արտածելու ընտրանքներ" msgid "show (partial) command keys in location given by 'showcmdloc'" msgstr "" @@ -10351,10 +10418,10 @@ msgid "threshold for reporting number of changed lines" msgstr "փոփոխված տողերի քանակի հաշվետվության շեմը" msgid "the higher the more messages are given" -msgstr "որքան բարձր է, այնքան շատ հաղորդագրություններ են տրվում" +msgstr "որքան բարձր է, այնքան շատ հհաղորդագրություններ են տրվում" msgid "file to write messages in" -msgstr "ֆայլ՝ հաղորդագրություններ գրելու համար" +msgstr "ֆայլ՝ հհաղորդագրություններ գրելու համար" msgid "pause listings when the screen is full" msgstr "դադարեցնել ցանկերը, երբ էկրանը լիքն է" @@ -10363,7 +10430,7 @@ msgid "start a dialog when a command fails" msgstr "սկսել երկխոսություն, երբ հրամանը ձախողվում է" msgid "ring the bell for error messages" -msgstr "զանգահարեք սխալի հաղորդագրությունների համար" +msgstr "զանգահարեք սխալի հհաղորդագրությունների համար" msgid "use a visual bell instead of beeping" msgstr "ձայնային ազդանշանի փոխարեն օգտագործեք տեսողական զանգ" @@ -10404,12 +10471,6 @@ msgstr "Wayland-ում տվյալներ կարդալու կամ գրելու ս msgid "Wayland seat to use" msgstr "Wayland seat ընտրելու համար" -msgid "" -"Enable wayland focus stealing functionality in order to access the clipboard" -msgstr "" -"Սեղմատախտակին հասանելիություն ունենալու համար միացնել Wayland-ի focus " -"stealing ֆունկցիոնալությունը" - msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" msgstr "\"startsel\" և/կամ \"stopsel\"; ինչ կարող են անել հատուկ ստեղները" @@ -10423,12 +10484,12 @@ msgid "automatically save and restore undo history" msgstr "ինքնաբերաբար պահպանել և վերականգնել հետարկման պատմությունը" msgid "list of directories for undo files" -msgstr "ֆայլերի հետարկման դիրեկտորիաների ցանկ" +msgstr "ֆայլերի հետարկման թղթապանակների ցանկ" msgid "maximum number lines to save for undo on a buffer reload" msgstr "" "առավելագույն թվով տողեր, որոնք պահվում են բուֆերի վերաբեռնման ժամանակ " -"չեղարկելու համար" +"հետարկելու համար" msgid "changes have been made and not written to a file" msgstr "փոփոխություններ են կատարվել և չեն գրվել ֆայլում" @@ -10447,7 +10508,7 @@ msgstr "լուսանցք աջից, որտեղ կարելի է գիծ կտրել" msgid "specifies what , CTRL-W, etc. can do in Insert mode" msgstr "" -"հստակեցնում է, թե ինչ , CTRL-W և այլն կարող են անել Insert ռեժիմում" +"հստակեցնում է, թե ինչ , CTRL-W և այլն կարող են անել զետեղման ռեժիմում" msgid "definition of what comment lines look like" msgstr "սահմանում, թե ինչ տեսք ունեն մեկնաբանությունների տողերը" @@ -10457,7 +10518,7 @@ msgstr "մեկնաբանությունների ձևանմուշ; օգտագոր msgid "list of flags that tell how automatic formatting works" msgstr "" -"դրոշակների ցանկ, որոնք պատմում են, թե ինչպես է աշխատում ավտոմատ ձևաչափումը" +"դրոշների ցանկ, որոնք պատմում են, թե ինչպես է աշխատում ավտոմատ ձևաչափումը" msgid "pattern to recognize a numbered list" msgstr "նմուշ՝ համարակալված ցուցակը ճանաչելու համար" @@ -10468,11 +10529,11 @@ msgstr "" msgid "specifies how Insert mode completion works for CTRL-N and CTRL-P" msgstr "" -"նշում է, թե ինչպես է աշխատում Ներդիր ռեժիմի ավտոլրացումը CTRL-N-ի և CTRL-P-ի " +"նշում է, թե ինչպես է աշխատում զետեղման ռեժիմի լրացումը CTRL-N-ի և CTRL-P-ի " "համար" msgid "automatic completion in insert mode" -msgstr "ավտոլրացում ներմուծման ռեժիմում" +msgstr "ավտոլրացում զետեղման ռեժիմում" msgid "" " \n" @@ -10496,7 +10557,7 @@ msgstr "" "տառ մուտքագրելուց հետո մենյուի հայտնվելու ուշացում (միլիվայրկյաններով)" msgid "whether to use a popup menu for Insert mode completion" -msgstr "արդյոք օգտագործել սահապատ ընտրացանկը Ներդիր ռեժիմի ավտոլրացման համար" +msgstr "արդյոք օգտագործել սահապատ ընտրացանկը զետեղման ռեժիմի լրացման համար" msgid "" " \n" @@ -10506,7 +10567,7 @@ msgstr "" "սահապատի տարրերի ուղղման կարգ" msgid "options for the Insert mode completion info popup" -msgstr "ընտրանքներ Ներդիր ռեժիմի ավտոլրացման սահապատ պատուհանի համար" +msgstr "ընտրանքներ զետեղման ռեժիմի լրացման սահապատ պատուհանի համար" msgid "maximum height of the popup menu" msgstr "սահապատ ընտրացանկի առավելագույն բարձրությունը" @@ -10520,23 +10581,26 @@ msgstr "սահապատ ընտրացանկի առավելագույն լայնո msgid "popup border style" msgstr "սահապատի եզրագծի ոճ" +msgid "additional options for the popup menu" +msgstr "սահապատի լրացուցիչ ընտրանքներ" + msgid "user defined function for Insert mode completion" -msgstr "օգտատիրոջ կողմից սահմանված ֆունկցիա՝ Ներդիր ռեժիմի ավտոլրացման համար" +msgstr "օգտատիրոջ կողմից սահմանված ֆունկցիա՝ զետեղման ռեժիմի լրացման համար" msgid "function for filetype-specific Insert mode completion" -msgstr "ֆայլին հատուկ ֆունկցիա՝ Ներդիր ռեժիմի ավտոլրացման համար" +msgstr "ֆայլին հատուկ ֆունկցիա՝ զետեղման ռեժիմի լրացման համար" msgid "list of dictionary files for keyword completion" -msgstr "բառարանի ֆայլերի ցանկ՝ հիմնաբառի ավտոլրացման համար" +msgstr "բառարանի ֆայլերի ցանկ՝ հիմնաբառի լրացման համար" msgid "list of thesaurus files for keyword completion" -msgstr "թեզաուրուսի ֆայլերի ցանկ՝ հիմնաբառի ավտոլրացման համար" +msgstr "thesaurus ֆայլերի ցանկ՝ հիմնաբառի լրացման համար" msgid "function used for thesaurus completion" -msgstr "ֆունկցիա, որն օգտագործվում է թեզաուրուսի ավտոլրացման համար" +msgstr "ֆունկցիա, որն օգտագործվում է թեզաուրուսի լրացման համար" msgid "adjust case of a keyword completion match" -msgstr "հարմարեցնել հիմնաբառի ավտոլրացման համընկնման գրության տեսակը" +msgstr "հարմարեցնել հիմնաբառի լրացման համընկնման գրության տեսակը" msgid "enable entering digraphs with c1 c2" msgstr "միացնել c1-ով դիգրաֆներ մուտքագրելը գ2" @@ -10551,10 +10615,10 @@ msgid "when inserting a bracket, briefly jump to its match" msgstr "փակագիծ տեղադրելիս համառոտ անցեք դրա համընկնումին" msgid "tenth of a second to show a match for 'showmatch'" -msgstr "վայրկյանի տասներորդը՝ 'showmatch' համար խաղ ցուցադրելու համար" +msgstr "վայրկյանի տասներորդներ՝ 'showmatch'-ի համընկնումը ցուցադրելու համար" msgid "list of pairs that match for the \"%\" command" -msgstr "\"%\" հրամանին համապատասխանող զույգերի ցանկը" +msgstr "\"%\" հրամանի համար համընկնող զույգերի ցանկը" msgid "use two spaces after '.' when joining a line" msgstr "օգտագործել երկու բացատ '.'-ից հետո: տողին միանալիս" @@ -10591,7 +10655,7 @@ msgid "round to 'shiftwidth' for \"<<\" and \">>\"" msgstr "կլոր դեպի 'shiftwidth' \"<<\" և \">>\"-ի համար" msgid "expand to spaces in Insert mode" -msgstr "ընդլայնել Տեղադրել ռեժիմում գտնվող բացատներին" +msgstr "զետեղման ռեժիմում -ը վերածել բացատների" msgid "automatically set the indent of a new line" msgstr "ինքնաբերաբար սահմանել նոր տողի նահանջը" @@ -10603,10 +10667,10 @@ msgid "enable specific indenting for C code" msgstr "միացնել հատուկ նահանջը C կոդի համար" msgid "options for C-indenting" -msgstr "տարբերակներ C-ի ներքևման համար" +msgstr "ընտրանքներ C-ի ներքևման համար" msgid "keys that trigger C-indenting in Insert mode" -msgstr "ստեղներ, որոնք գործարկում են C-indenting-ը Ներդիր ռեժիմում" +msgstr "ստեղներ, որոնք գործարկում են C-indenting-ը զետեղման ռեժիմում" msgid "list of words that cause more C-indent" msgstr "բառերի ցանկ, որոնք ավելի շատ C-indent են առաջացնում" @@ -10618,7 +10682,7 @@ msgid "expression used to obtain the indent of a line" msgstr "արտահայտություն, որն օգտագործվում է տողի նահանջը ստանալու համար" msgid "keys that trigger indenting with 'indentexpr' in Insert mode" -msgstr "ստեղներ, որոնք 'indentexpr' հետ մղում են Insert ռեժիմում" +msgstr "ստեղներ, որոնք 'indentexpr'-ով նահանջ են գործարկում զետեղման ռեժիմում" msgid "copy whitespace for indenting from previous line" msgstr "պատճենեք բաց տարածությունը նախորդ տողից նահանջելու համար" @@ -10639,7 +10703,7 @@ msgid "folding" msgstr "փաթաթում" msgid "unset to display all folds open" -msgstr "unset՝ բոլոր ծալքերը բաց ցուցադրելու համար" +msgstr "unset՝ բոլոր փաթաթները բաց ցուցադրելու համար" msgid "folds with a level higher than this number will be closed" msgstr "այս թվից բարձր մակարդակ ունեցող փաթաթները կփակվեն" @@ -10648,16 +10712,17 @@ msgid "value for 'foldlevel' when starting to edit a file" msgstr "արժեքը 'foldlevel'-ի համար, երբ սկսում եք խմբագրել ֆայլը" msgid "width of the column used to indicate folds" -msgstr "սյունակի լայնությունը, որն օգտագործվում է ծալքերը նշելու համար" +msgstr "սյունակի լայնությունը, որն օգտագործվում է փաթաթները նշելու համար" msgid "expression used to display the text of a closed fold" -msgstr "արտահայտություն, որն օգտագործվում է փակ ծալքի տեքստը ցուցադրելու համար" +msgstr "" +"արտահայտություն, որն օգտագործվում է փակ փաթաթի տեքստը ցուցադրելու համար" msgid "set to \"all\" to close a fold when the cursor leaves it" msgstr "սահմանել \"all\"՝ փաթաթը փակելու համար, երբ կուրսորը թողնում է այն" msgid "specifies for which commands a fold will be opened" -msgstr "նշում է, թե որ հրամանների համար կբացվի fold-ը" +msgstr "նշում է, թե որ հրամանների համար կբացվի փաթաթը" msgid "minimum number of screen lines for a fold to be closed" msgstr "էկրանի գծերի նվազագույն քանակը փաթաթի փակման համար" @@ -10666,7 +10731,7 @@ msgid "" "folding type: \"manual\", \"indent\", \"expr\", \"marker\",\n" "\"syntax\" or \"diff\"" msgstr "" -"փաթաթի տեսակը` \"manual\", \"indent\", \"expr\", \"marker\",\n" +"փաթաթի տեսակը` \"manual\", \"indent\", \"expr\", \"marker\",\n" "\"syntax\" կամ \"diff\"" msgid "expression used when 'foldmethod' is \"expr\"" @@ -10690,7 +10755,7 @@ msgid "use diff mode for the current window" msgstr "օգտագործեք տարբեր ռեժիմը ընթացիկ պատուհանի համար" msgid "options for using diff mode" -msgstr "համեմատման ռեժիմ օգտագործելու տարբերակներ" +msgstr "համեմատման ռեժիմ օգտագործելու ընտրանքներ" msgid "expression used to obtain a diff file" msgstr "արտահայտոթյունն օգտագործվել է ֆայլի տարբերություններն ստեղծելու համար" @@ -10729,7 +10794,10 @@ msgid "enable using settings from modelines when reading a file" msgstr "միացնել ֆայլը կարդալիս մոդելների կարգավորումների օգտագործումը" msgid "allow setting expression options from a modeline" -msgstr "թույլ է տալիս սահմանել արտահայտման տարբերակները մոդելից" +msgstr "թույլ է տալիս սահմանել արտահայտման ընտրանքները մոդելից" + +msgid "only allow safe options to be set from a modeline" +msgstr "թույլատրել միայն անվտանգ ընտրանքներ modeline-ից" msgid "number of lines to check for modelines" msgstr "գծերի քանակը՝ մոդելների առկայությունը ստուգելու համար" @@ -10779,7 +10847,7 @@ msgstr "" "ֆայլը" msgid "list of directories to put backup files in" -msgstr "պահուստային ֆայլեր տեղադրելու դիրեկտորիաների ցանկը" +msgstr "պահուստային ֆայլեր տեղադրելու թղթապանակների ցանկը" msgid "file name extension for the backup file" msgstr "ֆայլի անվան ընդլայնում պահուստային ֆայլի համար" @@ -10812,13 +10880,13 @@ msgid "the swap file" msgstr "սվեփ ֆայլը" msgid "list of directories for the swap file" -msgstr "սվեփ ֆայլի դիրեկտորիաների ցանկը" +msgstr "սվեփ ֆայլի թղթապանակների ցանկը" msgid "use a swap file for this buffer" msgstr "օգտագործեք սվեփ ֆայլ այս բուֆերի համար" msgid "\"sync\", \"fsync\" or empty; how to flush a swap file to disk" -msgstr "\"sync\", \"fsync\" կամ դատարկ; ինչպես փոխանակել ֆայլը սկավառակի վրա" +msgstr "\"sync\", \"fsync\" կամ դատարկ; ինչպես գրել սվեփ ֆայլը սկավառակի վրա" msgid "number of characters typed to cause a swap file update" msgstr "սվեփ ֆայլի թարմացում առաջացնելու համար մուտքագրված նիշերի քանակը" @@ -10849,12 +10917,11 @@ msgid "like 'wildchar' but can also be used in a mapping" msgstr "ինչպես 'wildchar'-ը, բայց կարող է օգտագործվել նաև քարտեզագրման մեջ" msgid "specifies how command line completion works" -msgstr "նկարագրում է, թե ինչպես է հրամանային տողում աշխատում ավտոլրացումը" +msgstr "նկարագրում է, թե ինչպես է հրամանային տողում աշխատում լրացումը" msgid "empty or \"tagfile\" to list file name of matching tags" msgstr "" -"դատարկ կամ \"tagfile\"՝ համապատասխան պիտակների ֆայլի անունը ցուցակագրելու " -"համար" +"դատարկ կամ \"tagfile\"՝ համընկնող պիտակների ֆայլի անունը ցուցակագրելու համար" msgid "list of file name extensions that have a lower priority" msgstr "ավելի ցածր առաջնահերթություն ունեցող ֆայլային ընդարձակումների ցուցակ" @@ -10863,7 +10930,7 @@ msgid "list of file name extensions added when searching for a file" msgstr "ֆայլ որոնելիս ավելացվող ֆայլային ընդարձակումների ցանկը" msgid "list of patterns to ignore files for file name completion" -msgstr "ֆայլային անվան ավտոլրացման համար անտեսվելիք նմուշների ցանկ" +msgstr "ֆայլային անվան լրացման համար անտեսվելիք նմուշների ցանկ" msgid "ignore case when using file names" msgstr "ֆայլերի անուններ օգտագործելիս անտեսել գործը" @@ -10872,7 +10939,7 @@ msgid "ignore case when completing file names" msgstr "անտեսել գրության տեսակը ֆայլերի անունների ավտոլրացման ժամանակ" msgid "command-line completion shows a list of matches" -msgstr "հրամանի տողի ավտոլրացումը ցուցադրում է համընկնումների ցանկը" +msgstr "հրամանի տողի լրացումը ցուցադրում է համընկնումների ցանկը" msgid "key used to open the command-line window" msgstr "բանալին, որն օգտագործվում է հրամանի տողի պատուհանը բացելու համար" @@ -10896,7 +10963,7 @@ msgid "like 'shellquote' but include the redirection" msgstr "նման է \"shellquote\"-ին, բայց ներառում է վերահղումը" msgid "characters to escape when 'shellxquote' is (" -msgstr "նշաններ, որոնք պետք է արտաքսվեն (escape) երբ 'shellxquote' = \"(\"" +msgstr "նիշեր, որոնք պետք է արտաքսվեն (escape) երբ 'shellxquote' = \"(\"" msgid "argument for 'shell' to execute a command" msgstr "'shell' փաստարկ՝ հրամանը կատարելու համար" @@ -10923,13 +10990,13 @@ msgstr "" "զգուշացնել, երբ օգտագործում եք shell հրամանը, և բուֆերը փոփոխություններ ունի" msgid "running make and jumping to errors (quickfix)" -msgstr "վազում և ցատկում դեպի սխալներ (արագ ուղղում)" +msgstr "make-ի գործարկում և սխալներին անցում (quickfix)" msgid "name of the file that contains error messages" -msgstr "ֆայլի անունը, որը պարունակում է սխալի հաղորդագրություններ" +msgstr "ֆայլի անունը, որը պարունակում է սխալի հհաղորդագրություններ" msgid "list of formats for error messages" -msgstr "սխալների հաղորդագրությունների ձևաչափերի ցանկ" +msgstr "սխալների հհաղորդագրությունների ձևաչափերի ցանկ" msgid "program used for the \":make\" command" msgstr "ծրագիր, որն օգտագործվում է \":make\" հրամանի համար" @@ -10965,13 +11032,13 @@ msgstr "" "ֆայլերի անուններում օգտագործել առաջ շեղեր; Unix-ի նման պատյանների համար" msgid "specifies slash/backslash used for completion" -msgstr "նշում է ավտոլրացման մեջ օգտագործվող շեղ/հետին շեղ գծերը" +msgstr "նշում է լրացման մեջ օգտագործվող շեղ/հետին շեղ գծերը" msgid "language specific" msgstr "լեզվի հատուկ" msgid "specifies the characters in a file name" -msgstr "ֆայլի անվան մեջ պարունակում է նշաններ" +msgstr "ֆայլի անվան մեջ պարունակում է նիշեր" msgid "specifies the characters in an identifier" msgstr "նշում է նույնացուցիչի նիշերը" @@ -10980,7 +11047,7 @@ msgid "specifies the characters in a keyword" msgstr "սահմանում է հիմնաբառի նիշերը" msgid "specifies printable characters" -msgstr "պարունակում է տպագրվող տառեր" +msgstr "պարունակում է տպագրվող նիշեր" msgid "specifies escape characters in a string" msgstr "նշում է փախուստի նիշերը տողի մեջ" @@ -11027,7 +11094,7 @@ msgstr "կիրառել 'langmap' քարտեզագրված նիշերի վրա" msgid "when set never use IM; overrules following IM options" msgstr "" -"երբ սահմանված է, երբեք մի օգտագործեք IM; Չեղարկում է հետևյալ IM տարբերակները" +"երբ սահմանված է, երբեք մի օգտագործեք IM; Չեղարկում է հետևյալ IM ընտրանքները" msgid "in Insert mode: 1: use :lmap; 2: use IM; 0: neither" msgstr "զետեղման ռեժիմում՝ 1: օգտագործել :lmap; 2: օգտագործել IM; 0: ոչ մեկը" @@ -11049,7 +11116,7 @@ msgid "function to enable/disable IME" msgstr "IME-ը միացնելու/անջատելու ֆունկցիա" msgid "multi-byte characters" -msgstr "բազմաբայթ նշաններ" +msgstr "բազմաբայթ նիշեր" msgid "" "character encoding used in Vim: \"latin1\", \"utf-8\",\n" @@ -11100,7 +11167,7 @@ msgid "list of autocommand events which are to be ignored" msgstr "ինքնահրամանի իրադարձությունների ցանկը, որոնք պետք է անտեսվեն" msgid "list of autocommand events which are to be ignored in a window" -msgstr "ինքնահրաման events՝ անտեսվող պատուհանում" +msgstr "պատուհանում անտեսվող ինքնահրամանի իրադարձությունների ցանկ" msgid "load plugin scripts when starting up" msgstr "բեռնել plugin-ի սկրիպտները գործարկման ժամանակ" @@ -11148,14 +11215,14 @@ msgid "whether the buffer shows up in the buffer list" msgstr "արդյոք բուֆերը հայտնվում է բուֆերային ցուցակում" msgid "set to \"msg\" to see all error messages" -msgstr "սահմանել \"msg\"՝ բոլոր սխալ հաղորդագրությունները տեսնելու համար" +msgstr "սահմանել \"msg\"՝ բոլոր սխալ հհաղորդագրությունները տեսնելու համար" msgid "whether to show the signcolumn" msgstr "ցույց տալ նշանի սյունակը" msgid "interval in milliseconds between polls for MzScheme threads" msgstr "" -"MzScheme շղթաների հարցումների միջև ընկած ժամանակահատվածը միլիվայրկյաններով" +"MzScheme հոսքերի հարցումների միջև ընկած ժամանակահատվածը միլիվայրկյաններով" msgid "name of the Lua dynamic library" msgstr "Lua դինամիկ գրադարանի անվանումը" @@ -11203,5 +11270,44 @@ msgstr "անհատականացված ներդիրների էջեր ներդիր msgid "options for using tabpanel" msgstr "tabpanel օգտագործելու ընտրանքներ" +msgid "Notice" +msgstr "Ծանուցում" + +msgid "Quickfix list not found, stopping the job" +msgstr "Quickfix ցանկը չի գտնվել, առաջադրանքը դադարեցվում է" + +msgid "Success!" +msgstr "Հաջողվեց!" + +msgid "Job terminated" +msgstr "Առաջադրանքն ընդհատված է" + +msgid "There are errors." +msgstr "Սխալներ կան." + +msgid "Could not create quickfix list" +msgstr "Հնարավոր չէ ստեղծել quickfix ցանկ" + +msgid "File not readable:" +msgstr "Ֆայլն ընթեռնելի չէ:" + +msgid "Failed to start job" +msgstr "Հնարավոր չեղավ սկսել առաջադրանքը" + +msgid "Typesetting..." +msgstr "Շարվածք..." + +msgid "Jobs still running:" +msgstr "Առաջադրանքները դեռևս կատարվում են:" + +msgid "Done." +msgstr "Ավարտված է." + +msgid "Typeset" +msgstr "Շարվածք" + +msgid "Please save the buffer first." +msgstr "Խնդրում ենք նախ պահպանել բուֆերը." + msgid "You discovered the command-line window! You can close it with \":q\"." msgstr "Դուք հայտնաբերեցիք հրամանի տողի պատուհանը: Կարող եք փակել \":q\"-ով։" From 1eede2bf020035cf9617ade4b313a4cbef08b9ad Mon Sep 17 00:00:00 2001 From: Mark Woods Date: Sat, 18 Jul 2026 13:25:17 +0000 Subject: [PATCH 127/647] patch 9.2.0792: runtime(netrw): Explore without optional dir broken Problem: runtime(netrw): Explore without optional [dir] argument should open directory of the current file Solution: Make it work as documented (Mark Woods) Broken by fix for #20636 in PR #20663 related: #20663 closes: #20761 Signed-off-by: Mark Woods Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/netrw/autoload/netrw.vim | 5 ++++- src/testdir/test_plugin_netrw.vim | 11 +++++++++++ src/version.c | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index d82dd90768..bbb2deb00f 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jul 17 +" Last Change: 2026 Jul 18 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -571,6 +571,9 @@ function netrw#Explore(indx,dosplit,style,...) endif if starpat == 0 && a:indx >= 0 + if dirname == "" + let dirname= curfiledir + endif " [Explore Hexplore Vexplore Sexplore] [dirname] if dirname =~# '^scp://' || dirname =~ '^ftp://' call netrw#Nread(2,dirname) diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index a6dcf33e04..2530b0a70f 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -901,4 +901,15 @@ func Test_netrw_open_backslash_file() bw! endfunc +" :Explore without a [dir] argument should open the dir of the current file +func Test_netrw_open_no_dir_arg() + let dir = tempname() + call mkdir(dir, 'pR') + call writefile([], dir . '/foo') + exe 'edit ' . dir . '/foo' + Explore + call assert_equal(fnamemodify(dir, ':p'), fnamemodify(b:netrw_curdir, ':p')) + bw! +endfunc + " vim:ts=8 sts=2 sw=2 et diff --git a/src/version.c b/src/version.c index 77d596c04e..9118c769d8 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 792, /**/ 791, /**/ From e6f47839a8a8b4790a037bfec32b784b308e4133 Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Sat, 18 Jul 2026 13:52:22 +0000 Subject: [PATCH 128/647] patch 9.2.0793: If session restored a tiny window, restore fails Problem: If session restored a tiny window, restore fails Solution: Extend window sizes to be at least the minimum size during session restore (Illia Bobyr) If session contains a window that is shorter/narrower than the current `&winminheight` and `&winminwidth`, respectively, Vim will fail when assigning original values to the `&winminheight`/`&winminwidth` and the session restore will be slightly incomplete. It seems reasonable to assume that if the user have selected certain values for these minimum size settings, it is safe to just make the restored windows big enough to match the minimums and continue without producing an error. This fix allows `Test_mksession_winminheight()` to start with the default values of `&winheight`/`&winwidth` and only change them after the session restore. closes: #20692 Supported by AI. Signed-off-by: Illia Bobyr Signed-off-by: Christian Brabandt --- src/session.c | 9 ++++++--- src/testdir/test_mksession.vim | 22 ++++++++++++++++++---- src/version.c | 2 ++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/session.c b/src/session.c index 7c18321926..87019919de 100644 --- a/src/session.c +++ b/src/session.c @@ -975,9 +975,12 @@ makeopens( if (put_line(fd, "endif") == FAIL) goto fail; - // Re-apply 'winheight' and 'winwidth'. - if (fprintf(fd, "set winheight=%ld winwidth=%ld", - p_wh, p_wiw) < 0 || put_eol(fd) == FAIL) + // Re-apply 'winheight' and 'winwidth', but honor 'winminheight' and + // 'winminwidth' settings we saved from the original user context. + if (fprintf(fd, "&winheight = max([%ld, save_winminheight])", p_wh) < 0 + || put_eol(fd) == FAIL + || fprintf(fd, "&winwidth = max([%ld, save_winminwidth])", p_wiw) < 0 + || put_eol(fd) == FAIL) goto fail; // Restore 'shortmess'. diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 8f35518244..179cbd3242 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -1076,8 +1076,7 @@ endfunc " Test for mksession without options restores winminheight func Test_mksession_winminheight() - set winheight=10 winwidth=10 winminheight& winminwidth& - defer execute('set winheight& winwidth&') + set winheight& winwidth& winminheight& winminwidth& set sessionoptions-=options defer execute('set sessionoptions&') split @@ -1097,8 +1096,8 @@ func Test_mksession_winminheight() mksession! Xtest_mks.out tabclose | tabclose | close call assert_equal(1, tabpagenr('$')) - set winminheight=2 winminwidth=2 - defer execute('set winminheight& winminwidth&') + set winheight=2 winminheight=2 winwidth=2 winminwidth=2 + defer execute('set winheight& winwidth& winminheight& winminwidth&') source Xtest_mks.out call assert_equal(3, tabpagenr('$')) call assert_equal([2, 2], [&winminheight, &winminwidth]) @@ -1763,4 +1762,19 @@ func Test_mksession_vim9_duplicate_import() endfunc +" 'winminwidth' restore must not fail when the session's saved 'winwidth' is +" smaller than the sourcing context's 'winminwidth'. +func Test_mksession_winminwidth() + set winminheight& winminwidth& winheight=2 winwidth=1 sessionoptions-=options + split + mksession! Xtest_mks.out + defer delete('Xtest_mks.out') + only + set winheight=2 winminheight=2 winwidth=2 winminwidth=2 + defer execute('set winheight& winwidth& winminheight& winminwidth& sessionoptions&') + source Xtest_mks.out + call assert_equal([2, 2], [&winminheight, &winminwidth]) + only +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 9118c769d8..4e3ca0b5e7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 793, /**/ 792, /**/ From e397c82a04fc86ef9266e494a8c2ccc199159a93 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 18 Jul 2026 13:57:04 +0000 Subject: [PATCH 129/647] patch 9.2.0794: extend() and extendnew() don't handle NULL expr2 properly Problem: extend() and extendnew() don't handle NULL expr2 properly (Mao-Yining) Solution: Still set the return value when expr2 is NULL (zeertzjq). fixes: #20758 closes: #20759 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/dict.c | 8 +++++--- src/list.c | 9 ++++++--- src/testdir/test_listdict.vim | 22 +++++++++++++++++++++- src/version.c | 2 ++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/dict.c b/src/dict.c index 1106395085..ac1fb3841b 100644 --- a/src/dict.c +++ b/src/dict.c @@ -1335,9 +1335,6 @@ dict_extend_func( emsg(_(e_cannot_extend_null_dict)); return; } - d2 = argvars[1].vval.v_dict; - if (d2 == NULL) - return; if (!is_new && value_check_lock(d1->dv_lock, arg_errmsg, TRUE)) return; @@ -1349,6 +1346,10 @@ dict_extend_func( return; } + d2 = argvars[1].vval.v_dict; + if (d2 == NULL) + goto theend; + // Check the third argument. if (argvars[2].v_type != VAR_UNKNOWN) { @@ -1384,6 +1385,7 @@ dict_extend_func( } dict_extend(d1, d2, action, func_name); +theend: if (is_new) { rettv->v_type = VAR_DICT; diff --git a/src/list.c b/src/list.c index 3074bb93f2..e400cb096f 100644 --- a/src/list.c +++ b/src/list.c @@ -3014,9 +3014,7 @@ list_extend_func( emsg(_(e_cannot_extend_null_list)); return; } - l2 = argvars[1].vval.v_list; - if ((is_new || !value_check_lock(l1->lv_lock, arg_errmsg, TRUE)) - && l2 != NULL) + if (is_new || !value_check_lock(l1->lv_lock, arg_errmsg, TRUE)) { if (is_new) { @@ -3025,6 +3023,10 @@ list_extend_func( return; } + l2 = argvars[1].vval.v_list; + if (l2 == NULL) + goto theend; + if (argvars[2].v_type != VAR_UNKNOWN) { before = (long)tv_get_number_chk(&argvars[2], &error); @@ -3049,6 +3051,7 @@ list_extend_func( goto cleanup; list_extend(l1, l2, item); +theend: if (is_new) { rettv->v_type = VAR_LIST; diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim index 316e3614fc..31b5f268d7 100644 --- a/src/testdir/test_listdict.vim +++ b/src/testdir/test_listdict.vim @@ -1217,7 +1217,12 @@ func Test_listdict_extend() LET l = [1, 2, 3] call extend(l, [4, 5, 6], -3) - call assert_equal([4, 5, 6, 1, 2, 3], l) + call assert_equal([4, 5, 6, 1, 2, 3], l) + + LET l = [1, 2, 3] + call assert_equal([1, 2, 3], l->extend([])) + call assert_equal([1, 2, 3], l->extend(test_null_list())) + call assert_equal([1, 2, 3], l) END call v9.CheckLegacyAndVim9Success(lines) @@ -1245,6 +1250,11 @@ func Test_listdict_extend() LET d = {'a': 'A', 'b': 9} call extend(d, {'b': 0, 'c': 'C'}, "keep") call assert_equal({'a': 'A', 'b': 9, 'c': 'C'}, d) + + LET d = {'a': 'A', 'b': 9} + call assert_equal({'a': 'A', 'b': 9}, d->extend({})) + call assert_equal({'a': 'A', 'b': 9}, d->extend(test_null_dict())) + call assert_equal({'a': 'A', 'b': 9}, d) END call v9.CheckLegacyAndVim9Success(lines) @@ -1286,6 +1296,11 @@ func Test_listdict_extendnew() call assert_equal([1, 2, 3], l) lockvar l call assert_equal([1, 2, 3, 4, 5], extendnew(l, [4, 5])) + let l2 = extendnew(l, test_null_list()) + call assert_equal([1, 2, 3], l2) + let l2 += [4] + call assert_equal([1, 2, 3, 4], l2) + call assert_equal([1, 2, 3], l) " Test extendnew() with dictionaries. let d = {'a': {'b': 'B'}} @@ -1293,6 +1308,11 @@ func Test_listdict_extendnew() call assert_equal({'a': {'b': 'B'}}, d) lockvar d call assert_equal({'a': {'b': 'B'}, 'c': 'cc'}, extendnew(d, {'c': 'cc'})) + let d2 = extendnew(d, test_null_dict()) + call assert_equal({'a': {'b': 'B'}}, d2) + let d2['c'] = 'C' + call assert_equal({'a': {'b': 'B'}, 'c': 'C'}, d2) + call assert_equal({'a': {'b': 'B'}}, d) endfunc func s:check_scope_dict(x, fixed) diff --git a/src/version.c b/src/version.c index 4e3ca0b5e7..d2d3c45dcc 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 794, /**/ 793, /**/ From ac1bb93421593e8661017a015966fba43b580d1e Mon Sep 17 00:00:00 2001 From: "Wu, Zhenyu" Date: Sat, 18 Jul 2026 14:06:57 +0000 Subject: [PATCH 130/647] runtime(jinja): Include ftplugin for jinja filetype closes: #20778 Co-Authored-by: Alejandro Sanchez Signed-off-by: Wu, Zhenyu Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/ftplugin/jinja.vim | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 runtime/ftplugin/jinja.vim diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 81bf38d68a..880414e299 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -235,6 +235,7 @@ runtime/ftplugin/java.vim @zzzyxwvut runtime/ftplugin/javacc.vim @ribru17 runtime/ftplugin/javascript.vim @dkearns runtime/ftplugin/javascriptreact.vim @dkearns +runtime/ftplugin/jinja.vim @HiPhish runtime/ftplugin/jjdescription.vim @gpanders runtime/ftplugin/jq.vim @vito-c runtime/ftplugin/json.vim @dbarnett diff --git a/runtime/ftplugin/jinja.vim b/runtime/ftplugin/jinja.vim new file mode 100644 index 0000000000..db6779fcf9 --- /dev/null +++ b/runtime/ftplugin/jinja.vim @@ -0,0 +1,11 @@ +" Vim ftplugin file +" Language: Jinja +" Maintainer: Alejandro Sanchez +" Upstream: https://gitlab.com/HiPhish/jinja.vim + +if exists("b:did_jinjaplugin") + finish +endif + +setlocal commentstring={#\ %s\ #} +let b:undo_ftplugin = "setlocal com<" From 6b9af206227eac03bfaf7b3b19774a14c145efa2 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 18 Jul 2026 14:10:41 +0000 Subject: [PATCH 131/647] patch 9.2.0795: popup menu shadow is not cleared when the menu shrinks Problem: When the popup menu shrinks its shadow is not cleared: a stale shadow cell is left on the empty (~) lines near the menu, and when the menu also gets narrower the border and text of the larger menu show through the shadow (Maxim Kim) Solution: Exclude the shadow corner cells that are never drawn, and when the menu is redrawn redraw the background under the shadow first, so content left by a larger menu is cleared instead of showing through (Hirohito Higashi). fixes: #20740 closes: #20750 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupmenu.c | 38 +++++++-- .../dumps/Test_wildmenu_pum_shadow_1.dump | 12 +++ .../dumps/Test_wildmenu_pum_shadow_2.dump | 12 +++ .../Test_wildmenu_pum_shadow_border_1.dump | 12 +++ .../Test_wildmenu_pum_shadow_border_2.dump | 12 +++ src/testdir/test_cmdline.vim | 79 +++++++++++++++++++ src/version.c | 2 + 7 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 src/testdir/dumps/Test_wildmenu_pum_shadow_1.dump create mode 100644 src/testdir/dumps/Test_wildmenu_pum_shadow_2.dump create mode 100644 src/testdir/dumps/Test_wildmenu_pum_shadow_border_1.dump create mode 100644 src/testdir/dumps/Test_wildmenu_pum_shadow_border_2.dump diff --git a/src/popupmenu.c b/src/popupmenu.c index 08aa442865..36000d9bf0 100644 --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -425,12 +425,40 @@ pum_under_menu(int row, int col, int only_redrawing) + (pum_shadow ? 2 : 0); int extra_above = pum_border; int extra_below = pum_border + (pum_shadow ? 1 : 0); + int top = pum_row - extra_above; + int bot = pum_row + pum_height + extra_below; + int left = pum_col - 1 - extra_left; + int right = pum_col + pum_width + pum_scrollbar + extra_right; - return (!only_redrawing || pum_will_redraw) - && row >= pum_row - extra_above - && row < pum_row + pum_height + extra_below - && col >= pum_col - 1 - extra_left - && col < pum_col + pum_width + pum_scrollbar + extra_right; + if (!((!only_redrawing || pum_will_redraw) + && row >= top && row < bot && col >= left && col < right)) + return FALSE; + + if (pum_shadow) + { + // The shadow recolors the cells underneath. When the menu will be + // redrawn, leave the shadow cells unprotected so the window refreshes + // them first, clearing stale content left by a larger menu. + if (only_redrawing) + { + if (col >= right - 2 || row == bot - 1) + return FALSE; + } + else + { + // Menu stays as-is: exclude only the corner cells the shadow never + // draws. + int right_margin, left_margin, left_padding; + + compute_margins(&right_margin, &left_margin, &left_padding); + if (row == top && col >= right - 2) + return FALSE; + if (row == bot - 1 && col < pum_col + 2 - left_padding - pum_border + - left_margin) + return FALSE; + } + } + return TRUE; } /* diff --git a/src/testdir/dumps/Test_wildmenu_pum_shadow_1.dump b/src/testdir/dumps/Test_wildmenu_pum_shadow_1.dump new file mode 100644 index 0000000000..fe19d510b8 --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_shadow_1.dump @@ -0,0 +1,12 @@ +| +0#0000001#a8a8a8255@39 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @4| +0#0000001#ffd7ff255|a|x@8| @4| +0#4040ff13#a8a8a8255@17 +|~| @4| +0#0000001#ffd7ff255|a|b| @12| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@15 +|~| @4| +0#0000001#ffd7ff255|a|c| @12| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@15 +|~| @6| +0#ffffff16#e000002@15| +0#4040ff13#a8a8a8255@15 +|:+0#0000001&|M|y|C|m|d| |a> @31 diff --git a/src/testdir/dumps/Test_wildmenu_pum_shadow_2.dump b/src/testdir/dumps/Test_wildmenu_pum_shadow_2.dump new file mode 100644 index 0000000000..d7370a954c --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_shadow_2.dump @@ -0,0 +1,12 @@ +| +0#0000001#a8a8a8255@39 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @4| +0#0000001#ffd7ff255|a|b| @12| +0#4040ff13#a8a8a8255@17 +|~| @6| +0#ffffff16#e000002@15| +0#4040ff13#a8a8a8255@15 +|:+0#0000001&|M|y|C|m|d| |a|b> @30 diff --git a/src/testdir/dumps/Test_wildmenu_pum_shadow_border_1.dump b/src/testdir/dumps/Test_wildmenu_pum_shadow_border_1.dump new file mode 100644 index 0000000000..49316c7269 --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_shadow_border_1.dump @@ -0,0 +1,12 @@ +| +0#0000001#a8a8a8255@39 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @3|┌+0#0000001#ffd7ff255|─@18|┐| +0#4040ff13#a8a8a8255@13 +|~| @3|│+0#0000001#ffd7ff255| |a|V|e|r|y|L|o|n|g|I|t|e|m|N|a|m|e| |│| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@11 +|~| @3|│+0#0000001#ffd7ff255| |a|b| @15|│| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@11 +|~| @3|│+0#0000001#ffd7ff255| |a|c| @15|│| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@11 +|~| @3|└+0#0000001#ffd7ff255|─@18|┘| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@11 +|~| @5| +0#ffffff16#e000002@20| +0#4040ff13#a8a8a8255@11 +|:+0#0000001&|M|y|C|m|d| |a> @31 diff --git a/src/testdir/dumps/Test_wildmenu_pum_shadow_border_2.dump b/src/testdir/dumps/Test_wildmenu_pum_shadow_border_2.dump new file mode 100644 index 0000000000..8b9d745312 --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_shadow_border_2.dump @@ -0,0 +1,12 @@ +| +0#0000001#a8a8a8255@39 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @3|┌+0#0000001#ffd7ff255|─@15|┐| +0#4040ff13#a8a8a8255@16 +|~| @3|│+0#0000001#ffd7ff255| |a|b| @12|│| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@14 +|~| @3|└+0#0000001#ffd7ff255|─@15|┘| +0#ffffff16#e000002@1| +0#4040ff13#a8a8a8255@14 +|~| @5| +0#ffffff16#e000002@17| +0#4040ff13#a8a8a8255@14 +|:+0#0000001&|M|y|C|m|d| |a|b> @30 diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index ef1cd7adcd..ef036d2b03 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -226,6 +226,85 @@ func Test_wildmenu_screendump() call StopVimInTerminal(buf) endfunc +" When the wildmenu popup menu shrinks, its shadow must be cleared, also on the +" empty (~) lines above the menu. See issue #20740. +func Test_wildmenu_pum_shadow() + CheckScreendump + + let lines =<< trim [SCRIPT] + func MyCompl(a, l, p) + return filter(['axxxxxxxxx', 'ab', 'ac'], 'stridx(v:val, a:a) == 0') + endfunc + command! -nargs=1 -complete=customlist,MyCompl MyCmd echo + set wildmode=noselect:lastused,full + set wildoptions=pum,fuzzy + set pumopt=shadow + set shortmess+=I + " Give the shadow a distinct color so it is easy to tell apart from the + " background in the screen dump. + hi Normal ctermbg=grey ctermfg=black guibg=grey guifg=black + hi PmenuShadow ctermbg=darkred ctermfg=white guibg=darkred guifg=white + autocmd CmdlineChanged : call wildtrigger() + [SCRIPT] + call writefile(lines, 'XTest_wildshadow', 'D') + + let buf = RunVimInTerminal('-S XTest_wildshadow', {'rows': 12, 'cols': 40}) + + " Wide popup with a shadow drawn over the ~ lines. + call term_sendkeys(buf, ":MyCmd a") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_shadow_1', {}) + + " Narrow the matches: the popup shrinks and the wider shadow must be cleared. + call term_sendkeys(buf, "b") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_shadow_2', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + +" Same as above but with a border, and the menu also gets narrower. When the +" menu shrinks the stale content of the wider menu must be cleared before the +" shadow is drawn over it, otherwise the old border and text show through the +" shadow. See issue #20740. +func Test_wildmenu_pum_shadow_border() + CheckScreendump + + let lines =<< trim [SCRIPT] + func MyCompl(a, l, p) + return filter(['aVeryLongItemName', 'ab', 'ac'], 'stridx(v:val, a:a) == 0') + endfunc + command! -nargs=1 -complete=customlist,MyCompl MyCmd echo + set wildmode=noselect:lastused,full + set wildoptions=pum,fuzzy + set pumopt=shadow,border:single + set shortmess+=I + " Give the shadow a distinct color so it is easy to tell apart from the + " background in the screen dump. + hi Normal ctermbg=grey ctermfg=black guibg=grey guifg=black + hi PmenuShadow ctermbg=darkred ctermfg=white guibg=darkred guifg=white + autocmd CmdlineChanged : call wildtrigger() + [SCRIPT] + call writefile(lines, 'XTest_wildshadowborder', 'D') + + let buf = RunVimInTerminal('-S XTest_wildshadowborder', {'rows': 12, 'cols': 40}) + + " Wide popup with a border and a shadow drawn over the ~ lines. + call term_sendkeys(buf, ":MyCmd a") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_shadow_border_1', {}) + + " Narrow the matches: the popup shrinks in both width and height, the wider + " menu's border and text must be cleared next to and under the shadow. + call term_sendkeys(buf, "b") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_shadow_border_2', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + func Test_wildmenu_with_input_func() CheckScreendump diff --git a/src/version.c b/src/version.c index d2d3c45dcc..e0861aa389 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 795, /**/ 794, /**/ From 8cddbfe468299fc7fe8bf669f43ca3a4a40b40b2 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 18 Jul 2026 14:14:12 +0000 Subject: [PATCH 132/647] patch 9.2.0796: Visual block reselection wrong with 'virtualedit' Problem: Visual block reselection wrong with 'virtualedit' when line lengths are different (Alex Yang, after 8.2.3494). Solution: Set the entire cursor position to old position when computing target curswant, since the check_cursor() added in 8.2.3494 may change cursor column as well (zeertzjq). fixes: #20746 closes: #20748 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/normal.c | 9 ++++----- src/testdir/test_visual.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/normal.c b/src/normal.c index b803b88f6b..08b9e9f0cf 100644 --- a/src/normal.c +++ b/src/normal.c @@ -5579,13 +5579,12 @@ nv_visual(cmdarg_T *cap) } else if (VIsual_mode == Ctrl_V) { - // Update curswant on the original line, that is where "col" is - // valid. - linenr_T lnum = curwin->w_cursor.lnum; - curwin->w_cursor.lnum = VIsual.lnum; + // Update curswant at the original cursor position. + pos_T tmp_cursor = curwin->w_cursor; + curwin->w_cursor = VIsual; update_curswant_force(); curwin->w_curswant += resel_VIsual_vcol * cap->count0 - 1; - curwin->w_cursor.lnum = lnum; + curwin->w_cursor = tmp_cursor; if (*p_sel == 'e') ++curwin->w_curswant; coladvance(curwin->w_curswant); diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim index d92f651d9a..beea4c431b 100644 --- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -1004,6 +1004,28 @@ func Test_virtualedit_visual_block() bwipe! endfunc +func Test_virtualedit_visual_block_reselect() + set ve=all + new + call append(0, ['###', '###', '###', '#####']) + call cursor(1, 1) + exe "norm! \lljj" + call assert_equal([0, 3, 3, 0], getpos('.')) + call assert_equal([0, 1, 1, 0], getpos('v')) + norm! y + call assert_equal(['###', '###', '###'], getreg('"', v:true, v:true)) + call cursor(2, 6) + call assert_equal([0, 2, 4, 2], getpos('.')) + norm! 1v + call assert_equal([0, 4, 6, 2], getpos('.')) + call assert_equal([0, 2, 4, 2], getpos('v')) + norm! r! + call assert_equal(['### !!!', '### !!!', '#####!!!'], getline(2, 4)) + + bwipe! + set ve& +endfunc + " Test for changing case func Test_visual_change_case() new diff --git a/src/version.c b/src/version.c index e0861aa389..9a22bfa519 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 796, /**/ 795, /**/ From 67304a7e10a007b84654129fb4640f03c4d9ac7d Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:22:31 +0000 Subject: [PATCH 133/647] patch 9.2.0797: Memory leak in get_qfline_items() on alloc failure Problem: Memory leak in get_qfline_items() on alloc failure Solution: Call dict_unref() with the dict (Yasuhiro Matsumoto). related: #20668 related: #20745 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/quickfix.c | 3 +++ src/version.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/quickfix.c b/src/quickfix.c index 0c7a9c9a52..039d37dffa 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -7222,7 +7222,10 @@ get_qfline_items(qfline_T *qfp, list_T *list) if ((dict = dict_alloc()) == NULL) return FAIL; if (list_append_dict(list, dict) == FAIL) + { + dict_unref(dict); return FAIL; + } buf[0] = qfp->qf_type; buf[1] = NUL; diff --git a/src/version.c b/src/version.c index 9a22bfa519..a234bad44f 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 797, /**/ 796, /**/ From 4607659b1291d5a7b1a0a94cb4bb02fec33b2902 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:25:10 +0000 Subject: [PATCH 134/647] patch 9.2.0798: Memory leak in compile_expr6() on alloc failure Problem: Memory leak in compile_expr6() on alloc failure Solution: Free left string when constant string concat alloc fails (Yasuhiro Matsumoto). compile_expr6() overwrote tv1's string pointer before allocating the concatenation buffer, leaking the original left-hand string on failure. related: #20668 related: #20745 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/vim9expr.c | 1 + 2 files changed, 3 insertions(+) diff --git a/src/version.c b/src/version.c index a234bad44f..b3d1e6aed7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 798, /**/ 797, /**/ diff --git a/src/vim9expr.c b/src/vim9expr.c index 4331d3f5b0..f69488d5bd 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -3377,6 +3377,7 @@ compile_expr6(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) tv1->vval.v_string = alloc(len1 + STRLEN(s2) + 1); if (tv1->vval.v_string == NULL) { + vim_free(s1); clear_ppconst(ppconst); return FAIL; } From 304ccd74a502322ab8a01f8e62a595b93d6b9e6b Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:27:24 +0000 Subject: [PATCH 135/647] patch 9.2.0799: Memory leak in compile_def_function_body() on alloc failure Problem: Memory leak in compile_def_function_body() on alloc failure Solution: Call vim_free with the line var (Yasuhiro Matsumoto). related: #20668 related: #20745 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/vim9compile.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/version.c b/src/version.c index b3d1e6aed7..0c85088f49 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 799, /**/ 798, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 3b1b9e9ef8..65d7580f90 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4319,7 +4319,10 @@ compile_def_function_body( { line = vim_strsave(line); if (ga_add_string(lines_to_free, line) == FAIL) + { + vim_free(line); return FAIL; + } } } From 59271381f3a12e988aa1603eb3013f171db1594c Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:30:50 +0000 Subject: [PATCH 136/647] patch 9.2.0800: Memory leak in call_func() on alloc failure Problem: Memory leak in call_func() on alloc failure Solution: goto theend for the cleanup (Yasuhiro Matsumoto). The early return bypassed the theend cleanup, leaking the parsed generic function type arguments. Use goto theend. related: #20668 related: #20745 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/userfunc.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/userfunc.c b/src/userfunc.c index de1a8e84e0..4dddf621d5 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -3997,7 +3997,7 @@ call_func( // could be changed or deleted in the called function. name = len > 0 ? vim_strnsave(funcname, len) : vim_strsave(funcname); if (name == NULL) - return ret; + goto theend; fname = fname_trans_sid(name, fname_buf, &tofree, &error); } diff --git a/src/version.c b/src/version.c index 0c85088f49..801fd41797 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 800, /**/ 799, /**/ From 8e54a347396fad8137afcf3a27e4f5e187d8513d Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:35:21 +0000 Subject: [PATCH 137/647] patch 9.2.0801: Memory leak in f_getreginfo() on alloc failure Problem: Memory leak in f_getreginfo() on alloc failure Solution: Call list_unref() with list var (Yasuhiro Matsumoto). Since dict_add_list() leaves ownership with the caller on failure, the freshly built list must be freed when the add fails. related: #20668 related: #20745 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/evalfunc.c | 3 ++- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index 15b1eee873..de52668e5b 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -10569,7 +10569,8 @@ f_getreginfo(typval_T *argvars, typval_T *rettv) list = (list_T *)get_reg_contents(regname, GREG_EXPR_SRC | GREG_LIST); if (list == NULL) return; - (void)dict_add_list(dict, "regcontents", list); + if (dict_add_list(dict, "regcontents", list) == FAIL) + list_unref(list); switch (get_reg_type(regname, ®len)) { diff --git a/src/version.c b/src/version.c index 801fd41797..e5eaed8d96 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 801, /**/ 800, /**/ From 74ddc96d412c5248a7bbfbf0a347143e7a44551f Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:37:14 +0000 Subject: [PATCH 138/647] patch 9.2.0802: Memory leak with list_append_dict/dict_add_list on alloc failure Problem: Memory leak with list_append_dict()/dict_add_list() on alloc failure Solution: Free the list/dict when dict_add_list()/list_append_dict() failed (Yasuhiro Matsumoto) Various getinfo-style builtins ignored the return of list_append_dict()/ dict_add_list() and leaked the freshly allocated, GC-linked dict or list on allocation failure. Check the return and unref on failure. Affects getreginfo/setreg event (register.c), hlget (highlight.c), prop_list (textprop.c), getmatches (match.c), menu_getinfo (menu.c), popup_getoptions (popupwin.c), sign_getplaced (sign.c), job_info (job.c), term_getcursor/term_scrape (terminal.c), diff() (diff.c), complete_info (insexpand.c), cmdcomplete_info (cmdexpand.c). related: #20668 related: #20745 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/cmdexpand.c | 2 ++ src/diff.c | 3 ++- src/highlight.c | 4 ++-- src/insexpand.c | 7 +++++++ src/job.c | 6 +++++- src/match.c | 6 ++++-- src/menu.c | 12 ++++++++++-- src/popupwin.c | 36 ++++++++++++++++++++++++++++-------- src/register.c | 6 ++++-- src/sign.c | 20 ++++++++++++++------ src/terminal.c | 9 +++++++-- src/textprop.c | 3 ++- src/version.c | 2 ++ 13 files changed, 89 insertions(+), 27 deletions(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 9782993758..34edf25ef0 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -5042,6 +5042,8 @@ f_cmdcomplete_info(typval_T *argvars UNUSED, typval_T *rettv) if (li == NULL) return; ret = dict_add_list(retdict, "matches", li); + if (ret == FAIL) + list_unref(li); for (idx = 0; ret == OK && idx < ccline->xpc->xp_numfiles; idx++) list_append_string(li, ccline->xpc->xp_files[idx], -1); } diff --git a/src/diff.c b/src/diff.c index a29c434110..b38513693e 100644 --- a/src/diff.c +++ b/src/diff.c @@ -5140,7 +5140,8 @@ f_diff(typval_T *argvars UNUSED, typval_T *rettv UNUSED) if (hunk_dict == NULL) goto done; - list_append_dict(l, hunk_dict); + if (list_append_dict(l, hunk_dict) == FAIL) + dict_unref(hunk_dict); } } else diff --git a/src/highlight.c b/src/highlight.c index f2982bacaa..cfed85de33 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -5768,8 +5768,8 @@ f_hlget(typval_T *argvars, typval_T *rettv) if (hlarg == NULL || STRICMP(hlarg, HL_TABLE()[i].sg_name) == 0) { dict = highlight_get_info(i, resolve_link); - if (dict != NULL) - list_append_dict(list, dict); + if (dict != NULL && list_append_dict(list, dict) == FAIL) + dict_unref(dict); } } } diff --git a/src/insexpand.c b/src/insexpand.c index e566ee5044..0833340c70 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -4176,6 +4176,8 @@ get_complete_info(list_T *what_list, dict_T *retdict) return; ret = dict_add_list(retdict, (has_matches && !has_items) ? "matches" : "items", li); + if (ret == FAIL) + list_unref(li); } if (ret == OK && what_flag & CI_WHAT_SELECTED) if (compl_curr_match != NULL && compl_curr_match->cp_number == -1) @@ -4196,7 +4198,10 @@ get_complete_info(list_T *what_list, dict_T *retdict) return; ret = list_append_dict(li, di); if (ret != OK) + { + dict_unref(di); return; + } fill_complete_info_dict(di, match, has_matches && has_items); } if (compl_curr_match != NULL @@ -4219,6 +4224,8 @@ get_complete_info(list_T *what_list, dict_T *retdict) return; fill_complete_info_dict(di, compl_curr_match, FALSE); ret = dict_add_dict(retdict, "completed", di); + if (ret == FAIL) + dict_unref(di); } } } diff --git a/src/job.c b/src/job.c index c7c546aa38..7ab7884246 100644 --- a/src/job.c +++ b/src/job.c @@ -1870,7 +1870,11 @@ job_info(job_T *job, dict_T *dict) if (l == NULL) return; - dict_add_list(dict, "cmd", l); + if (dict_add_list(dict, "cmd", l) == FAIL) + { + list_unref(l); + return; + } if (job->jv_argv != NULL) for (i = 0; job->jv_argv[i] != NULL; i++) list_append_string(l, (char_u *)job->jv_argv[i], -1); diff --git a/src/match.c b/src/match.c index 709ac30495..6bd5ff8d90 100644 --- a/src/match.c +++ b/src/match.c @@ -1035,7 +1035,8 @@ f_getmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED) list_append_number(l, (varnumber_T)llpos->len); } sprintf(buf, "pos%d", i + 1); - dict_add_list(dict, buf, l); + if (dict_add_list(dict, buf, l) == FAIL) + list_unref(l); } } else @@ -1056,7 +1057,8 @@ f_getmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED) dict_add_string_len(dict, "conceal", (char_u *)&buf, buflen); } # endif - list_append_dict(rettv->vval.v_list, dict); + if (list_append_dict(rettv->vval.v_list, dict) == FAIL) + dict_unref(dict); cur = cur->mit_next; } # endif diff --git a/src/menu.c b/src/menu.c index 861d787112..ddb381c62a 100644 --- a/src/menu.c +++ b/src/menu.c @@ -2862,7 +2862,11 @@ menuitem_getinfo(char_u *menu_name, vimmenu_T *menu, int modes, dict_T *dict) if (l == NULL) return FAIL; - dict_add_list(dict, "submenus", l); + if (dict_add_list(dict, "submenus", l) == FAIL) + { + list_unref(l); + return FAIL; + } // get all the children. Skip PopUp[nvoci]. for (topmenu = menu; topmenu != NULL; topmenu = topmenu->next) if (!menu_is_hidden(topmenu->dname)) @@ -2950,7 +2954,11 @@ menuitem_getinfo(char_u *menu_name, vimmenu_T *menu, int modes, dict_T *dict) if (l == NULL) return FAIL; - dict_add_list(dict, "submenus", l); + if (dict_add_list(dict, "submenus", l) == FAIL) + { + list_unref(l); + return FAIL; + } child = menu->children; while (child) { diff --git a/src/popupwin.c b/src/popupwin.c index 96fa7895a1..cd3fe80dab 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -5344,7 +5344,11 @@ get_padding_border(dict_T *dict, int *array, char *name) if (list == NULL) return; - dict_add_list(dict, name, list); + if (dict_add_list(dict, name, list) == FAIL) + { + list_unref(list); + return; + } if (array[0] != 1 || array[1] != 1 || array[2] != 1 || array[3] != 1) for (i = 0; i < 4; ++i) list_append_number(list, array[i]); @@ -5371,7 +5375,11 @@ get_borderhighlight(dict_T *dict, win_T *wp) if (list == NULL) return; - dict_add_list(dict, "borderhighlight", list); + if (dict_add_list(dict, "borderhighlight", list) == FAIL) + { + list_unref(list); + return; + } // When all highlights are NULL (cleared to empty list), return empty list. if (i == 4) return; @@ -5400,7 +5408,11 @@ get_borderchars(dict_T *dict, win_T *wp) if (list == NULL) return; - dict_add_list(dict, "borderchars", list); + if (dict_add_list(dict, "borderchars", list) == FAIL) + { + list_unref(list); + return; + } for (i = 0; i < 8; ++i) { len = mb_char2bytes(wp->w_border_char[i], buf); @@ -5419,16 +5431,24 @@ get_moved_list(dict_T *dict, win_T *wp) list = list_alloc(); if (list != NULL) { - dict_add_list(dict, "moved", list); - list_append_number(list, wp->w_popup_lnum); - list_append_number(list, wp->w_popup_mincol); - list_append_number(list, wp->w_popup_maxcol); + if (dict_add_list(dict, "moved", list) == FAIL) + list_unref(list); + else + { + list_append_number(list, wp->w_popup_lnum); + list_append_number(list, wp->w_popup_mincol); + list_append_number(list, wp->w_popup_maxcol); + } } list = list_alloc(); if (list == NULL) return; - dict_add_list(dict, "mousemoved", list); + if (dict_add_list(dict, "mousemoved", list) == FAIL) + { + list_unref(list); + return; + } list_append_number(list, wp->w_popup_mouse_row); list_append_number(list, wp->w_popup_mouse_mincol); list_append_number(list, wp->w_popup_mouse_maxcol); diff --git a/src/register.c b/src/register.c index 5d22dc34a8..4ccb68b826 100644 --- a/src/register.c +++ b/src/register.c @@ -1134,7 +1134,8 @@ yank_do_autocmd(oparg_T *oap, yankreg_T *reg) for (n = 0; n < reg->y_size; n++) list_append_string(list, reg->y_array[n].string, (int)reg->y_array[n].length); list->lv_lock = VAR_FIXED; - (void)dict_add_list(v_event, "regcontents", list); + if (dict_add_list(v_event, "regcontents", list) == FAIL) + list_unref(list); // register name or empty string for unnamed operation buf[0] = (char_u)oap->regname; @@ -1229,7 +1230,8 @@ put_do_autocmd( } list->lv_lock = VAR_FIXED; - (void)dict_add_list(v_event, "regcontents", list); + if (dict_add_list(v_event, "regcontents", list) == FAIL) + list_unref(list); // register name or empty string for unnamed operation buf[0] = (char_u)regname; diff --git a/src/sign.c b/src/sign.c index 1d735de001..fc701d1ed6 100644 --- a/src/sign.c +++ b/src/sign.c @@ -1860,8 +1860,8 @@ get_buffer_signs(buf_T *buf, list_T *l) FOR_ALL_SIGNS_IN_BUF(buf, sign) { dict_T *d = sign_get_info(sign); - if (d != NULL) - list_append_dict(l, d); + if (d != NULL && list_append_dict(l, d) == FAIL) + dict_unref(d); } } @@ -1879,7 +1879,11 @@ sign_get_placed_in_buf(buf_T *buf, if (d == NULL) return; - list_append_dict(retlist, d); + if (list_append_dict(retlist, d) == FAIL) + { + dict_unref(d); + return; + } dict_add_number(d, "bufnr", (long)buf->b_fnum); @@ -1887,7 +1891,11 @@ sign_get_placed_in_buf(buf_T *buf, if (l == NULL) return; - dict_add_list(d, "signs", l); + if (dict_add_list(d, "signs", l) == FAIL) + { + list_unref(l); + return; + } sign_entry_T *sign = NULL; FOR_ALL_SIGNS_IN_BUF(buf, sign) @@ -1901,8 +1909,8 @@ sign_get_placed_in_buf(buf_T *buf, (lnum == sign->se_lnum && sign_id == sign->se_id)) { dict_T *sdict = sign_get_info(sign); - if (sdict != NULL) - list_append_dict(l, sdict); + if (sdict != NULL && list_append_dict(l, sdict) == FAIL) + dict_unref(sdict); } } } diff --git a/src/terminal.c b/src/terminal.c index 5ec9b71a65..2a2932a884 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -6435,7 +6435,8 @@ f_term_getcursor(typval_T *argvars, typval_T *rettv) ? !term->tl_cursor_blink : term->tl_cursor_blink); dict_add_number(d, "shape", term->tl_cursor_shape); dict_add_string(d, "color", cursor_color_get(term->tl_cursor_color)); - list_append_dict(l, d); + if (list_append_dict(l, d) == FAIL) + dict_unref(d); } /* @@ -6846,7 +6847,11 @@ f_term_scrape(typval_T *argvars, typval_T *rettv) dcell = dict_alloc(); if (dcell == NULL) break; - list_append_dict(l, dcell); + if (list_append_dict(l, dcell) == FAIL) + { + dict_unref(dcell); + break; + } dict_add_string_len(dcell, "chars", mbs, (int)mbslen); diff --git a/src/textprop.c b/src/textprop.c index 6d5a108631..4d3c8d2d71 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -2153,7 +2153,8 @@ get_props_in_line( prop_fill_dict(d, &prop, buf); if (add_lnum) dict_add_number(d, "lnum", lnum); - list_append_dict(retlist, d); + if (list_append_dict(retlist, d) == FAIL) + dict_unref(d); } } } diff --git a/src/version.c b/src/version.c index e5eaed8d96..c64e48f083 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 802, /**/ 801, /**/ From aa8c663deb870464ee0da8de6d5a65c613038a1c Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sat, 18 Jul 2026 14:41:24 +0000 Subject: [PATCH 139/647] patch 9.2.0803: Memory leak on alloc failure with taglist/gettagstack() Problem: Memory leak on alloc failure with taglist/gettagstack() Solution: Free the dict on list_append_dict() failure (Yasuhiro Matsumoto). taglist() and gettagstack() ignored the append failure and leaked the dict, and continued populating an orphaned dict. Free it and stop. closes: #20745 related: #20668 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/tag.c | 11 ++++++++++- src/version.c | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/tag.c b/src/tag.c index 0e9d9344bf..cd068043d4 100644 --- a/src/tag.c +++ b/src/tag.c @@ -4450,7 +4450,12 @@ get_tags(list_T *list, char_u *pat, char_u *buf_fname) break; } if (list_append_dict(list, dict) == FAIL) + { ret = FAIL; + dict_unref(dict); + vim_free(matches[i]); + continue; + } full_fname = tag_full_fname(&tp); if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL @@ -4564,7 +4569,11 @@ get_tagstack(win_T *wp, dict_T *retdict) { if ((d = dict_alloc_id(aid_tagstack_details)) == NULL) return; - list_append_dict(l, d); + if (list_append_dict(l, d) == FAIL) + { + dict_unref(d); + return; + } get_tag_details(&wp->w_tagstack[i], d); } diff --git a/src/version.c b/src/version.c index c64e48f083..29624fe211 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 803, /**/ 802, /**/ From 6f02e5cd7c27fc098d0b8dfec99542c7663a807e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 18 Jul 2026 16:57:57 +0000 Subject: [PATCH 140/647] patch 9.2.0804: wincol() is wrong for a double-wide character with 'rightleft' Problem: With 'rightleft' set and the cursor on a double-wide character, wincol() returns the column one to the right of where the cursor actually is (after v9.2.0791) Solution: Take the width of the character under the cursor into account, like the cursor positioning already does. related: #20763 closes: #20785 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/evalwindow.c | 2 +- src/proto/screen.pro | 1 + src/screen.c | 17 ++++++++++++++--- src/testdir/test_functions.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/evalwindow.c b/src/evalwindow.c index 23cd92b677..f913980404 100644 --- a/src/evalwindow.c +++ b/src/evalwindow.c @@ -1129,7 +1129,7 @@ f_wincol(typval_T *argvars UNUSED, typval_T *rettv) int col = curwin->w_wcol + 1; # ifdef FEAT_RIGHTLEFT if (curwin->w_p_rl) - col = curwin->w_width - col + 1; + col = curwin->w_width - curwin->w_wcol - cursor_screen_cells() + 1; # endif rettv->vval.v_number = col; } diff --git a/src/proto/screen.pro b/src/proto/screen.pro index a1d5714d8f..4a10729e21 100644 --- a/src/proto/screen.pro +++ b/src/proto/screen.pro @@ -36,6 +36,7 @@ int can_clear(char_u *p); void screen_start(void); void windgoto(int row, int col); void setcursor(void); +int cursor_screen_cells(void); void setcursor_mayforce(int force); int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear); int win_del_lines(win_T *wp, int row, int line_count, int invalid, int mayclear, int clear_attr); diff --git a/src/screen.c b/src/screen.c index 7d75af0226..17d4c1563c 100644 --- a/src/screen.c +++ b/src/screen.c @@ -4038,6 +4038,19 @@ setcursor(void) setcursor_mayforce(FALSE); } +#ifdef FEAT_RIGHTLEFT +/* + * Return the number of screen cells used by the character under the cursor + * in the current window. + */ + int +cursor_screen_cells(void) +{ + return has_mbyte && (*mb_ptr2cells)(ml_get_cursor()) == 2 + && vim_isprintc(gchar_cursor()) ? 2 : 1; +} +#endif + /* * Set cursor to its position in the current window. * When "force" is TRUE also when not redrawing. @@ -4054,9 +4067,7 @@ setcursor_mayforce(int force) // With 'rightleft' set and the cursor on a double-wide // character, position it on the leftmost column. curwin->w_p_rl ? ((int)curwin->w_width - curwin->w_wcol - - ((has_mbyte - && (*mb_ptr2cells)(ml_get_cursor()) == 2 - && vim_isprintc(gchar_cursor())) ? 2 : 1)) : + - cursor_screen_cells()) : #endif curwin->w_wcol)); } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 9882183429..645ff531ed 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -4738,6 +4738,24 @@ func Test_wincol() set rightleft& endif + " With 'rightleft' the cursor is on the leftmost cell of a double-wide + " character, so wincol() is one less than where the character starts. + call setline(1, "あいうえお") + + norm! 0 + call assert_equal([1, 1], [winline(), wincol()]) + norm! l + call assert_equal([1, 3], [winline(), wincol()]) + + if has('rightleft') + set rightleft + norm! 0 + call assert_equal([1, win_width - 1], [winline(), wincol()]) + norm! l + call assert_equal([1, win_width - 3], [winline(), wincol()]) + set rightleft& + endif + set ff& mouse& bw! endfunc diff --git a/src/version.c b/src/version.c index 29624fe211..349057f289 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 804, /**/ 803, /**/ From dcd5b5fed9cbc4f2c8d3fd0718c12ec74a197914 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 18 Jul 2026 17:36:43 +0000 Subject: [PATCH 141/647] patch 9.2.0805: screenpos() "curscol" is wrong with 'rightleft' Problem: With 'rightleft' set, the "curscol" value of screenpos() does not point to the screen column where the cursor is placed. Solution: Count "curscol" from the left side of the window, leaving "col" and "endcol" as reading-order columns (Hirohito Higashi) related: #20763 closes: #20786 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 6 ++++- src/move.c | 10 +++++++++ src/testdir/test_cursor_func.vim | 38 ++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 47d320a73d..43b19c488a 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Jun 24 +*builtin.txt* For Vim version 9.2. Last change: 2026 Jul 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -9416,6 +9416,10 @@ screenpos({winid}, {lnum}, {col}) *screenpos()* The "curscol" value is where the cursor would be placed. For a Tab it would be the same as "endcol", while for a double width character it would be the same as "col". + With 'rightleft' set, "col" and "endcol" are still counted + from the start of the line, while "curscol" is the actual + screen column, thus counted from the left side of the + window. The |conceal| feature is ignored here, the column numbers are as if 'conceallevel' is zero. You can set the cursor to the right position and use |screencol()| to get the value with diff --git a/src/move.c b/src/move.c index ec5936b489..49bcfb7cc5 100644 --- a/src/move.c +++ b/src/move.c @@ -1560,6 +1560,16 @@ textpos2screenpos( *scolp = scol + coloff; *ccolp = ccol + coloff; *ecolp = ecol + coloff; +# ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl && row > 0) + { + // With 'rightleft' the cursor is on the leftmost cell of the + // character, which comes last in reading order. + int endoff = *ecolp - wp->w_wincol - 1; + + *ccolp = wp->w_wincol + wp->w_width - endoff; + } +# endif } #endif diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim index 9aaeb5d47d..0557009652 100644 --- a/src/testdir/test_cursor_func.vim +++ b/src/testdir/test_cursor_func.vim @@ -216,6 +216,44 @@ func Test_screenpos() call assert_equal(#{col: 1, row: 1, endcol: 1, curscol: 1}, screenpos(0, 1, -v:maxcol)) endfunc +func Test_screenpos_rightleft() + CheckFeature rightleft + + rightbelow new + call setline(1, ["aあb", "\tx"]) + setlocal rightleft + redraw + let winid = win_getid() + let [winrow, wincol] = win_screenpos(winid) + let width = winwidth(winid) + + " "col" and "endcol" stay reading-order columns, while "curscol" is the + " screen column where the cursor lands, counted from the left. + call assert_equal({'row': winrow, + \ 'col': wincol + 0, + \ 'curscol': wincol + width - 1, + \ 'endcol': wincol + 0}, screenpos(winid, 1, 1)) + + " A double-wide character: the cursor is on its leftmost cell. + call assert_equal({'row': winrow, + \ 'col': wincol + 1, + \ 'curscol': wincol + width - 3, + \ 'endcol': wincol + 2}, screenpos(winid, 1, 2)) + + call assert_equal({'row': winrow, + \ 'col': wincol + 3, + \ 'curscol': wincol + width - 4, + \ 'endcol': wincol + 3}, screenpos(winid, 1, 5)) + + " A Tab: the cursor is on its last cell in reading order. + call assert_equal({'row': winrow + 1, + \ 'col': wincol + 0, + \ 'curscol': wincol + width - 8, + \ 'endcol': wincol + 7}, screenpos(winid, 2, 1)) + + bwipe! +endfunc + func Test_screenpos_fold() CheckFeature folding diff --git a/src/version.c b/src/version.c index 349057f289..4b9c6318d6 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 805, /**/ 804, /**/ From bd730293dccaa166cd99321be674cb059d498b73 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sun, 19 Jul 2026 14:53:55 +0000 Subject: [PATCH 142/647] patch 9.2.0806: 'showcmd' may show internal command keys Problem: The `showcmd` statusline item may show internal command keys when a `` or `` mapping redraws the statusline, and may leave stale text behind when `%S` is rendered directly. Solution: Do not add these internal mapping dispatch keys to the `showcmd` buffer, and keep the clear state in sync when `%S` renders it (Barrett Ruth) closes: #20769 Co-authored-by: zeertzjq <35768171+zeertzjq@users.noreply.github.com> Signed-off-by: Barrett Ruth Signed-off-by: Christian Brabandt --- src/drawscreen.c | 1 + src/normal.c | 10 ++++++-- src/proto/normal.pro | 1 + src/screen.c | 4 ++++ src/testdir/test_statusline.vim | 41 +++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 6 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/drawscreen.c b/src/drawscreen.c index 65d6a88d31..2c932d4ba7 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -620,6 +620,7 @@ win_redr_status(win_T *wp, int ignore_pum UNUSED) if (width > 0) screen_puts_len(showcmd_buf, width, row, wp->w_wincol + this_ru_col - width - 1, attr); + showcmd_update_clear_state(); } } diff --git a/src/normal.c b/src/normal.c index 08b9e9f0cf..d5de6abe51 100644 --- a/src/normal.c +++ b/src/normal.c @@ -1739,7 +1739,7 @@ add_to_showcmd(int c) K_RIGHTMOUSE, K_RIGHTDRAG, K_RIGHTRELEASE, K_MOUSEDOWN, K_MOUSEUP, K_MOUSELEFT, K_MOUSERIGHT, K_X1MOUSE, K_X1DRAG, K_X1RELEASE, K_X2MOUSE, K_X2DRAG, K_X2RELEASE, - K_CURSORHOLD, + K_CURSORHOLD, K_COMMAND, K_SCRIPT_COMMAND, 0 }; @@ -1834,12 +1834,18 @@ pop_showcmd(void) display_showcmd(); } + void +showcmd_update_clear_state(void) +{ + showcmd_is_clear = (showcmd_buf[0] == NUL); +} + static void display_showcmd(void) { int len = vim_strsize(showcmd_buf); - showcmd_is_clear = (len == 0); + showcmd_update_clear_state(); cursor_off(); if (*p_sloc == 's') diff --git a/src/proto/normal.pro b/src/proto/normal.pro index cf873f20bb..6f45b1a3ad 100644 --- a/src/proto/normal.pro +++ b/src/proto/normal.pro @@ -19,6 +19,7 @@ int add_to_showcmd(int c); void add_to_showcmd_c(int c); void push_showcmd(void); void pop_showcmd(void); +void showcmd_update_clear_state(void); void do_check_scrollbind(int check); void check_scrollbind(linenr_T topline_diff, long leftcol_diff); int find_decl(char_u *ptr, int len, int locally, int thisblock, int flags_arg); diff --git a/src/screen.c b/src/screen.c index 17d4c1563c..07a237b0c6 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1676,6 +1676,9 @@ win_redr_custom( } ewp->w_p_crb = p_crb_save; + if (p_sc && STRCMP(opt_name, p_sloc) == 0) + showcmd_update_clear_state(); + // Note: In the loop, build_stl_str_hl_mline() may replace stl_tmp with // a newly allocated buffer (when "%!" evaluation occurs), freeing the // original "stl" internally. After the loop, stl_tmp must be freed @@ -5317,6 +5320,7 @@ draw_tabline(void) if (width > 0) screen_puts_len(showcmd_buf, width, 0, (int)Columns - width - (tabcount > 1) * 2, attr_nosel); + showcmd_update_clear_state(); } // Put an "X" for closing the current tab if there are several. diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim index c00582d5fd..69699a2d4d 100644 --- a/src/testdir/test_statusline.vim +++ b/src/testdir/test_statusline.vim @@ -657,6 +657,47 @@ func Test_statusline_showcmd() call StopVimInTerminal(buf) endfunc +func Test_statusline_showcmd_redraw_tabline() + CheckRunVimInTerminal + + let lines =<< trim END + set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0 + nnoremap g :redraw + nnoremap gc + END + call writefile(lines, 'XTest_statusline_showcmd_redraw', 'D') + + let buf = RunVimInTerminal('-S XTest_statusline_showcmd_redraw', #{rows: 6, cols: 40}) + call term_sendkeys(buf, 'g') + call WaitForAssert({-> assert_match(':redraw', term_getline(buf, 6))}) + call WaitForAssert({-> assert_notmatch('^:', term_getline(buf, 1))}) + call StopVimInTerminal(buf) +endfunc + +func Test_statusline_showcmd_cmd_mapping() + set showcmd + set statusline=AAA%SBBB + set showcmdloc=statusline + try + let g:showcmd_statusline = '' + nnoremap let g:showcmd_statusline = get_statusline() + call feedkeys("\", 'xt') + call assert_equal('AAABBB', trim(g:showcmd_statusline)) + let g:showcmd_statusline = '' + nunmap + + nnoremap let g:showcmd_statusline = get_statusline() + call feedkeys("\", 'xt') + call assert_equal('AAABBB', trim(g:showcmd_statusline)) + finally + silent! nunmap + unlet! g:showcmd_statusline + set showcmd& + set statusline& + set showcmdloc& + endtry +endfunc + func Test_statusline_highlight_group_cleared() CheckScreendump diff --git a/src/version.c b/src/version.c index 4b9c6318d6..712e652ee9 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 806, /**/ 805, /**/ From 56a5df283fc6224d97f8c2313983a3aa9d10bd2f Mon Sep 17 00:00:00 2001 From: Sergey Vlasov Date: Sun, 19 Jul 2026 15:14:02 +0000 Subject: [PATCH 143/647] patch 9.2.0807: MS-Windows: ellipsis character is garbled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Source code is not treated as utf-8 by MSVC, so '…' character in string literal is interpreted wrong. Solution: Set utf-8 for both source and execution charsets. closes: #20755 Co-Authored-by: K.Takata Signed-off-by: Sergey Vlasov Signed-off-by: Christian Brabandt --- src/Make_mvc.mak | 2 +- src/testdir/test_textprop.vim | 36 +++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index c646f8ec3a..8d3bb1861f 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -531,7 +531,7 @@ CFLAGS = -c /W3 /GF /nologo -I. -Iproto -DHAVE_PATHDEF -DWIN32 -DHAVE_STDINT_H \ $(CSCOPE_DEFS) $(TERM_DEFS) $(SOUND_DEFS) $(NETBEANS_DEFS) \ $(NBDEBUG_DEFS) $(XPM_DEFS) $(SOD_DEFS) $(SOD_INC) $(CHANNEL_DEFS) \ $(DEFINES) $(CI_CFLAGS) -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \ - /source-charset:utf-8 + /utf-8 RCFLAGS = -DVIM_VERSION_PATCHLEVEL=$(PATCHLEVEL) diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim index 7d868ec064..66f9edc816 100644 --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -3,6 +3,7 @@ CheckFeature textprop +source util/view_util.vim source util/screendump.vim import './util/vim9.vim' as v9 @@ -4991,4 +4992,39 @@ func Test_prop_find_floating_vtext() call prop_type_delete(tn) endfor endfunc + +func Test_textprop_below_truncated_with_ellipsis() + enew! + set ff=unix + + let visible_width = 20 + call NewWindow(5, visible_width) + + call setline(1, ['foo']) + + call prop_type_add('virtual_text_prop', #{highlight: 'ErrorMsg', bufnr: bufnr()}) + + let virtual_text = 'some long virtual text' + call prop_add(1, 0, #{ + \ type: 'virtual_text_prop', + \ text: virtual_text, + \ text_align: 'below', + \}) + + " virtual text should be trimmed with '…': + let expected_lines = [ + \'foo ', + \'some long virtual t…', + \'~ ', + \] + let actual_lines = ScreenLines([1, expected_lines->len()], visible_width) + call assert_equal(expected_lines, actual_lines) + + call prop_clear(1) + call prop_type_delete('virtual_text_prop', #{bufnr: bufnr()}) + only! + enew! + set ff& +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 712e652ee9..84792148b3 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 807, /**/ 806, /**/ From bf1e87597900d35e131fdcd045462343b712960f Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sun, 19 Jul 2026 16:02:10 +0000 Subject: [PATCH 144/647] patch 9.2.0808: getregionpos: double-free on alloc failure Problem: getregionpos: double-free on alloc failure Solution: Only free lists that were not appended (Yasuhiro Matsumoto). add_regionpos_range() freed lists already linked into the result tree when a later list_alloc()/list_append_list() failed, causing a double-free and use-after-free. Only free lists that were not appended, and free them with list_free() so they are unlinked from the garbage-collection chain. related: #20668 closes: #20744 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/evalfunc.c | 16 +++------------- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index de52668e5b..bad28de7cc 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -6395,37 +6395,27 @@ add_regionpos_range(typval_T *rettv, pos_T p1, pos_T p2) if (list_append_list(rettv->vval.v_list, l1) == FAIL) { - vim_free(l1); + list_free(l1); return; } l2 = list_alloc(); if (l2 == NULL) - { - vim_free(l1); return; - } if (list_append_list(l1, l2) == FAIL) { - vim_free(l1); - vim_free(l2); + list_free(l2); return; } l3 = list_alloc(); if (l3 == NULL) - { - vim_free(l1); - vim_free(l2); return; - } if (list_append_list(l1, l3) == FAIL) { - vim_free(l1); - vim_free(l2); - vim_free(l3); + list_free(l3); return; } diff --git a/src/version.c b/src/version.c index 84792148b3..3196d57cb9 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 808, /**/ 807, /**/ From 75efa96ab3c8d1717c3f817eceae9471b1d54c8b Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sun, 19 Jul 2026 16:13:29 +0000 Subject: [PATCH 145/647] patch 9.2.0809: getframelayout() uses wrong function to free lists Problem: getframelayout() uses wrong function to free lists on alloc failure. Solution: Use list_free() on alloc failure (Yasuhiro Matsumoto). get_framelayout() released a list_alloc()'d list with vim_free() when list_append_list() failed, leaving a dangling pointer in the list garbage-collection chain. Use list_free() so it is unlinked. related: #20668 related: #20743 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/evalwindow.c | 4 ++-- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/evalwindow.c b/src/evalwindow.c index f913980404..9c56954b8b 100644 --- a/src/evalwindow.c +++ b/src/evalwindow.c @@ -284,7 +284,7 @@ get_framelayout(frame_T *fr, list_T *l, int outer) return; if (list_append_list(l, fr_list) == FAIL) { - vim_free(fr_list); + list_free(fr_list); return; } } @@ -309,7 +309,7 @@ get_framelayout(frame_T *fr, list_T *l, int outer) return; if (list_append_list(fr_list, win_list) == FAIL) { - vim_free(win_list); + list_free(win_list); return; } diff --git a/src/version.c b/src/version.c index 3196d57cb9..aa3f5b3fbd 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 809, /**/ 808, /**/ From 760317f234ea227a014d00aeb5d3eeb5b4556d9c Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Sun, 19 Jul 2026 16:17:11 +0000 Subject: [PATCH 146/647] patch 9.2.0810: add_llist_tags() uses wrong function to free dict Problem: add_llist_tags() uses wrong function to free dict on alloc failure Solution: Use dict_unref() (Yasuhiro Matsumoto). add_llist_tags() released a dict_alloc()'d dict with vim_free() when list_append_dict() failed, leaving a dangling pointer in the dict garbage-collection chain. Use dict_unref(). related: #20668 closes: #20743 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/tag.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tag.c b/src/tag.c index cd068043d4..96afc699b4 100644 --- a/src/tag.c +++ b/src/tag.c @@ -1270,7 +1270,7 @@ add_llist_tags( continue; if (list_append_dict(list, dict) == FAIL) { - vim_free(dict); + dict_unref(dict); continue; } diff --git a/src/version.c b/src/version.c index aa3f5b3fbd..cf0d47a529 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 810, /**/ 809, /**/ From 9fa3a02c6f519a5541e7bd5acd2b2ac11831aaa5 Mon Sep 17 00:00:00 2001 From: Arkissa Date: Sun, 19 Jul 2026 18:30:01 +0000 Subject: [PATCH 147/647] patch 9.2.0811: mksession writes terminal command unquoted Problem: mksession writes terminal command unquoted (after v9.2.0732) Solution: Quote the terminal command (Arkissa) fixes: #20788 closes: #20789 Signed-off-by: Arkissa Signed-off-by: Christian Brabandt --- src/terminal.c | 14 ++++++++-- src/testdir/test_mksession.vim | 48 ++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/terminal.c b/src/terminal.c index 2a2932a884..f136e1efbd 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1126,8 +1126,18 @@ term_write_session(FILE *fd, win_T *wp, hashtab_T *terminal_bufs) if (fprintf(fd, ".. ' ++type=%s' ", term->tl_job->jv_tty_type) < 0) return FAIL; # endif - if (term->tl_command != NULL && fputs((char *)term->tl_command, fd) < 0) - return FAIL; + if (term->tl_command != NULL) + { + char_u *quoted_command = string_quote(term->tl_command, FALSE); + if (quoted_command == NULL) + return FAIL; + + int ret = fputs(".. ' ' .. ", fd) < 0 + || fputs((char *)quoted_command, fd) < 0; + vim_free(quoted_command); + if (ret) + return FAIL; + } if (put_eol(fd) != OK) return FAIL; diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 179cbd3242..f7384f601e 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -613,6 +613,54 @@ func Test_mksession_terminal_shared_windows() call delete('Xtest_mks.out') endfunc +func Test_mksession_terminal_shell_command() + CheckFeature terminal + + set sessionoptions+=terminal + terminal + let term_buf = bufnr() + eval term_buf->term_setrestore('echo HELLO_WORLD') + mksession! Xtest_mks.out + + call StopShellInTerminal(term_buf) + + source Xtest_mks.out + + let restored_buf = bufnr() + call assert_equal('terminal', getbufvar(restored_buf, '&buftype')) + call WaitForAssert({-> assert_match( + \ 'HELLO_WORLD', + \ term_getline(restored_buf, 1))}) + call WaitForAssert({-> assert_match( + \ 'finished', + \ term_getstatus(restored_buf))}) + + bwipe! + call delete('Xtest_mks.out') +endfunc + +" Plain :terminal stores no command (tl_command == NULL), so nothing is +" written after the ':terminal ++curwin ...' line. Restoring must still +" produce a running shell terminal. +func Test_mksession_terminal_default_restore() + CheckFeature terminal + + terminal + let term_buf = bufnr() + mksession! Xtest_mks.out + call StopShellInTerminal(term_buf) + %bwipe! + + source Xtest_mks.out + let restored = bufnr() + call assert_equal('terminal', getbufvar(restored, '&buftype')) + call WaitForAssert({-> assert_match('running', term_getstatus(restored))}) + call StopShellInTerminal(restored) + + %bwipe! + call delete('Xtest_mks.out') +endfunc + func Test_mkview_terminal_windows() CheckFeature terminal diff --git a/src/version.c b/src/version.c index cf0d47a529..e523f6dad4 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 811, /**/ 810, /**/ From 3b40a14a46c2e4f2a29dbf0b2fe48260ce2166ab Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 20 Jul 2026 15:19:20 +0000 Subject: [PATCH 148/647] patch 9.2.0812: :argdelete with pattern leads to wrong argidx() Problem: :argdelete with pattern leads to wrong argidx(). Solution: Correct argidx() in both branches of ex_argdelete(). Also use ARGCOUNT macro in two more places (zeertzjq). related: patch 7.4.1119 related: neovim/neovim#40564 closes: #20697 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/arglist.c | 40 ++++++++++++++++++++---------------- src/testdir/test_arglist.vim | 27 +++++++++++++++++++++++- src/version.c | 2 ++ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/arglist.c b/src/arglist.c index 84de912f01..80e91475a9 100644 --- a/src/arglist.c +++ b/src/arglist.c @@ -429,7 +429,7 @@ arglist_del_files(garray_T *alist_ga) vim_free(ARGLIST[match].ae_fname); mch_memmove(ARGLIST + match, ARGLIST + match + 1, (ARGCOUNT - match - 1) * sizeof(aentry_T)); - --ALIST(curwin)->al_ga.ga_len; + --ARGCOUNT; if (curwin->w_arg_idx > match) --curwin->w_arg_idx; --match; @@ -900,33 +900,37 @@ ex_argdelete(exarg_T *eap) eap->line2 = ARGCOUNT; n = eap->line2 - eap->line1 + 1; if (*eap->arg != NUL) + { // Can't have both a range and an argument. emsg(_(e_invalid_argument)); - else if (n <= 0) + return; + } + if (n <= 0) { // Don't give an error for ":%argdel" if the list is empty. if (eap->line1 != 1 || eap->line2 != 0) emsg(_(e_invalid_range)); + return; } - else - { - for (i = eap->line1; i <= eap->line2; ++i) - vim_free(ARGLIST[i - 1].ae_fname); - mch_memmove(ARGLIST + eap->line1 - 1, ARGLIST + eap->line2, - (size_t)((ARGCOUNT - eap->line2) * sizeof(aentry_T))); - ALIST(curwin)->al_ga.ga_len -= n; - if (curwin->w_arg_idx >= eap->line2) - curwin->w_arg_idx -= n; - else if (curwin->w_arg_idx > eap->line1) - curwin->w_arg_idx = eap->line1; - if (ARGCOUNT == 0) - curwin->w_arg_idx = 0; - else if (curwin->w_arg_idx >= ARGCOUNT) - curwin->w_arg_idx = ARGCOUNT - 1; - } + + for (i = eap->line1; i <= eap->line2; ++i) + vim_free(ARGLIST[i - 1].ae_fname); + mch_memmove(ARGLIST + eap->line1 - 1, ARGLIST + eap->line2, + (size_t)((ARGCOUNT - eap->line2) * sizeof(aentry_T))); + ARGCOUNT -= n; + if (curwin->w_arg_idx >= eap->line2) + curwin->w_arg_idx -= n; + else if (curwin->w_arg_idx > eap->line1) + curwin->w_arg_idx = eap->line1; } else do_arglist(eap->arg, AL_DEL, 0, FALSE); + + if (ARGCOUNT == 0) + curwin->w_arg_idx = 0; + else if (curwin->w_arg_idx >= ARGCOUNT) + curwin->w_arg_idx = ARGCOUNT - 1; + maketitle(); } diff --git a/src/testdir/test_arglist.vim b/src/testdir/test_arglist.vim index f62d2cfabf..9df54a19dd 100644 --- a/src/testdir/test_arglist.vim +++ b/src/testdir/test_arglist.vim @@ -457,15 +457,40 @@ func Test_argdelete() args aa a aaa b bb argdelete a* call assert_equal(['b', 'bb'], argv()) + call assert_equal(0, argidx()) call assert_equal('aa', expand('%:t')) last + call assert_equal(1, argidx()) + call assert_equal('bb', expand('%:t')) argdelete % call assert_equal(['b'], argv()) - call assert_fails('argdelete', 'E610:') + call assert_equal(0, argidx()) + call assert_equal('bb', expand('%:t')) + call assert_fails('1,100argdelete', 'E16:') call assert_fails('argdel /\)/', 'E55:') call assert_fails('1argdel 1', 'E474:') + call Reset_arglist() + args aa a aaa b bb + 4argument + call assert_equal(3, argidx()) + call assert_equal('b', expand('%:t')) + argdelete aa* + call assert_equal(['a', 'b', 'bb'], argv()) + call assert_equal(1, argidx()) + call assert_equal('b', expand('%:t')) + 2argdelete + call assert_equal(['a', 'bb'], argv()) + call assert_equal(1, argidx()) + call assert_equal('b', expand('%:t')) + %argdelete + call assert_equal([], argv()) + call assert_equal(0, argidx()) + call assert_equal('b', expand('%:t')) + " :%argdelete when the arglist is already empty should not error + %argdelete + call Reset_arglist() args a b c d next diff --git a/src/version.c b/src/version.c index e523f6dad4..333bbc87d8 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 812, /**/ 811, /**/ From 4a403b48c653461f3c2fa331664d68585f59ea4c Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 20 Jul 2026 16:02:56 +0000 Subject: [PATCH 149/647] patch 9.2.0813: dict_add_func() may corrupt funcref count on failure Problem: dict_add_func() references the function only after a successful dict_add(), on failure dictitem_free() calls func_unref() without a matching func_ref(), corrupting the reference count of a lambda or numbered function. Solution: Take the reference before dict_add() so the unref on the failure path is balanced (Yasuhiro Matsumoto). related: #20668 closes: #20742 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/dict.c | 3 ++- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dict.c b/src/dict.c index ac1fb3841b..5531cc72a0 100644 --- a/src/dict.c +++ b/src/dict.c @@ -552,12 +552,13 @@ dict_add_func(dict_T *d, char *key, ufunc_T *fp) return FAIL; item->di_tv.v_type = VAR_FUNC; item->di_tv.vval.v_string = vim_strnsave(fp->uf_name, fp->uf_namelen); + // Reference before dict_add() so dictitem_free()'s unref stays balanced on failure. + func_ref(item->di_tv.vval.v_string); if (dict_add(d, item) == FAIL) { dictitem_free(item); return FAIL; } - func_ref(item->di_tv.vval.v_string); return OK; } diff --git a/src/version.c b/src/version.c index 333bbc87d8..178090f6b1 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 813, /**/ 812, /**/ From cf80f134e95ead988b875e8c21813104f2575390 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 20 Jul 2026 16:47:57 +0000 Subject: [PATCH 150/647] patch 9.2.0814: Vim9: E1041 when reloading an autoload script with exported variables Problem: Sourcing a Vim9 autoload script more than once fails with E1041 for its exported variables and constants, while exported functions reload without error (ubaldot) Solution: Give exported variables and constants the same clean slate as functions on reload by removing them from the global namespace, so the script body can define them again. Keep classes and enums: objects created from the previous definition still refer to it, so they are not redefined this way (Hirohito Higashi) fixes: #19205 closes: #20726 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/vim9.txt | 9 +++- src/evalvars.c | 29 ++++++++++++ src/proto/evalvars.pro | 1 + src/testdir/test_vim9_import.vim | 79 ++++++++++++++++++++++++++++++++ src/version.c | 2 + src/vim9script.c | 3 ++ 6 files changed, 122 insertions(+), 1 deletion(-) diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index 84502f19cf..a0357ce94b 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.2. Last change: 2026 May 21 +*vim9.txt* For Vim version 9.2. Last change: 2026 Jul 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -404,6 +404,13 @@ and variables are deleted, thus you start with a clean slate. This is useful if you are developing a plugin and want to try a new version. If you renamed something you don't have to worry about the old name still hanging around. +The exported functions and variables of an autoload script live in the global +namespace with the autoload prefix. When such a script is sourced again they +are likewise given a clean slate, so an autoload script can be sourced more +than once. A class or enum is an exception: it cannot be redefined this way +and |E1041| is given, because objects created from the previous definition +would keep referring to it. Restart Vim to load a changed class or enum. + If you do want to keep items, use: > vim9script noclear diff --git a/src/evalvars.c b/src/evalvars.c index f74b1c76ad..854cb1fc00 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -3910,6 +3910,35 @@ delete_var(hashtab_T *ht, hashitem_T *hi) vim_free(di); } +/* + * Delete the exported variables of a reloaded Vim9 autoload script. They live + * in the global namespace with the autoload prefix (e.g. "foo#bar") and are + * recreated when the script body runs again. + */ + void +delete_autoload_export_vars(char_u *prefix) +{ + if (prefix == NULL) + return; + size_t prefixlen = STRLEN(prefix); + + hash_lock(&globvarht); + int todo = (int)globvarht.ht_used; + + for (hashitem_T *hi = globvarht.ht_array; todo > 0; ++hi) + if (!HASHITEM_EMPTY(hi)) + { + dictitem_T *di = HI2DI(hi); + + --todo; + // Keep a class or enum: existing objects still refer to it. + if (di->di_tv.v_type != VAR_CLASS + && STRNCMP(di->di_key, prefix, prefixlen) == 0) + delete_var(&globvarht, hi); + } + hash_unlock(&globvarht); +} + /* * List the value of one internal variable. */ diff --git a/src/proto/evalvars.pro b/src/proto/evalvars.pro index 4c62286d39..e8840d1e26 100644 --- a/src/proto/evalvars.pro +++ b/src/proto/evalvars.pro @@ -77,6 +77,7 @@ void unref_var_dict(dict_T *dict); void vars_clear(hashtab_T *ht); void vars_clear_ext(hashtab_T *ht, int free_val); void delete_var(hashtab_T *ht, hashitem_T *hi); +void delete_autoload_export_vars(char_u *prefix); int before_set_vvar(char_u *varname, dictitem_T *di, typval_T *tv, int copy, int *type_error); void set_var(char_u *name, typval_T *tv, int copy); int set_var_const(char_u *name, scid_T sid, type_T *type_arg, typval_T *tv_arg, int copy, int flags_arg, int var_idx); diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index a3bb60ccb1..54bbd3f2aa 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -3719,4 +3719,83 @@ def Test_import_name_conflict_with_local_variable() v9.CheckScriptSuccess(lines) enddef +" Directly sourcing an autoload script more than once must not fail on its +" exported variables: like functions, they get a clean slate on reload. +def Test_autoload_reload_export_var() + mkdir('Xreloaddir/autoload', 'pR') + var save_rtp = &rtp + exe 'set rtp^=' .. getcwd() .. '/Xreloaddir' + + var lines =<< trim END + vim9script + export var nr = 1 + export const cnr = 2 + export def GetNr(): number + return 3 + enddef + END + writefile(lines, 'Xreloaddir/autoload/Xreload.vim') + source Xreloaddir/autoload/Xreload.vim + assert_equal(1, g:Xreload#nr) + assert_equal(2, g:Xreload#cnr) + assert_equal(3, g:Xreload#GetNr()) + + # Sourcing again with changed values updates them, no E1041. + lines =<< trim END + vim9script + export var nr = 11 + export const cnr = 22 + export def GetNr(): number + return 33 + enddef + END + writefile(lines, 'Xreloaddir/autoload/Xreload.vim') + source Xreloaddir/autoload/Xreload.vim + assert_equal(11, g:Xreload#nr) + assert_equal(22, g:Xreload#cnr) + assert_equal(33, g:Xreload#GetNr()) + + # The type may also change on reload. + lines =<< trim END + vim9script + export var nr = 'text' + END + writefile(lines, 'Xreloaddir/autoload/Xreload.vim') + source Xreloaddir/autoload/Xreload.vim + assert_equal('text', g:Xreload#nr) + + &rtp = save_rtp +enddef + +" A class or enum cannot be redefined by sourcing the script again: existing +" instances would keep the old definition, so E1041 is given instead. +def Test_autoload_reload_export_class() + mkdir('Xreloadcldir/autoload', 'pR') + var save_rtp = &rtp + exe 'set rtp^=' .. getcwd() .. '/Xreloadcldir' + + var lines =<< trim END + vim9script + export class Cls + var v = 1 + endclass + END + writefile(lines, 'Xreloadcldir/autoload/Xcls.vim') + source Xreloadcldir/autoload/Xcls.vim + assert_fails('source Xreloadcldir/autoload/Xcls.vim', 'E1041:') + + lines =<< trim END + vim9script + export enum Color + Red, + Blue + endenum + END + writefile(lines, 'Xreloadcldir/autoload/Xenum.vim') + source Xreloadcldir/autoload/Xenum.vim + assert_fails('source Xreloadcldir/autoload/Xenum.vim', 'E1041:') + + &rtp = save_rtp +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 178090f6b1..90b5ad6dc0 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 814, /**/ 813, /**/ diff --git a/src/vim9script.c b/src/vim9script.c index 4babbeea2a..4719f49f31 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -67,6 +67,9 @@ clear_vim9_scriptlocal_vars(int sid) hash_init(ht); delete_script_functions(sid); + // also the exported variables of an autoload script + delete_autoload_export_vars(SCRIPT_ITEM(sid)->sn_autoload_prefix); + // old imports and script variables are no longer valid free_imports_and_script_vars(sid); } From a79cd6bfc3e85e1d9f1ec48eda76c7385b44bf69 Mon Sep 17 00:00:00 2001 From: lipengyu Date: Mon, 20 Jul 2026 16:55:55 +0000 Subject: [PATCH 151/647] patch 9.2.0815: deeply nested regexp patterns may cause stack overflow Problem: Deeply nested regexp groups can cause uncontrolled recursion in the regexp compiler and exhaust the C stack. Solution: Limit recursive regexp parsing depth in both the backtracking and NFA compilers (lipengyu) closes: #20731 Signed-off-by: lipengyu Signed-off-by: Christian Brabandt --- src/regexp.c | 3 ++ src/regexp_bt.c | 60 ++++++++++++++++++++++++++----- src/regexp_nfa.c | 33 ++++++++++++----- src/testdir/test_regexp_latin.vim | 6 ++++ src/version.c | 2 ++ 5 files changed, 87 insertions(+), 17 deletions(-) diff --git a/src/regexp.c b/src/regexp.c index 54fadc899e..7f52f9a955 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -408,6 +408,9 @@ static int nextchr; // used for ungetchr() #define REG_ZPAREN 2 // \z(\) #define REG_NPAREN 3 // \%(\) +// Limit recursive parsing of nested regexp atoms to avoid using up the C stack. +#define REG_MAX_PAREN_DEPTH 1000 + typedef struct { char_u *regparse; diff --git a/src/regexp_bt.c b/src/regexp_bt.c index 1fa80f5c72..1dd6b066d6 100644 --- a/src/regexp_bt.c +++ b/src/regexp_bt.c @@ -245,6 +245,7 @@ static int num_complex_braces; // Complex \{...} count static char_u *regcode; // Code-emit pointer, or JUST_CALC_SIZE static long regsize; // Code size. static int reg_toolong; // TRUE when offset out of range +static int bt_reg_parse_depth; // nesting depth in reg() static char_u had_endbrace[NSUBEXP]; // flags, TRUE if end of () found static long brace_min[10]; // Minimums for complex brace repeats static long brace_max[10]; // Maximums for complex brace repeats @@ -477,6 +478,7 @@ regcomp_start( #endif regsize = 0L; reg_toolong = FALSE; + bt_reg_parse_depth = 0; regflags = 0; #if defined(FEAT_SYN_HL) had_eol = FALSE; @@ -2383,10 +2385,17 @@ reg( else ret = NULL; + if (bt_reg_parse_depth >= REG_MAX_PAREN_DEPTH) + EMSG_RET_NULL(_(e_command_too_complex)); + ++bt_reg_parse_depth; + // Pick up the branches, linking them together. br = regbranch(&flags); if (br == NULL) - return NULL; + { + ret = NULL; + goto theend; + } if (ret != NULL) regtail(ret, br); // [MZ]OPEN -> first. else @@ -2402,7 +2411,10 @@ reg( skipchr(); br = regbranch(&flags); if (br == NULL || reg_toolong) - return NULL; + { + ret = NULL; + goto theend; + } regtail(ret, br); // BRANCH -> BRANCH. if (!(flags & HASWIDTH)) *flagp &= ~HASWIDTH; @@ -2427,26 +2439,56 @@ reg( { #ifdef FEAT_SYN_HL if (paren == REG_ZPAREN) - EMSG_RET_NULL(_(e_unmatched_z)); + { + emsg(_(e_unmatched_z)); + rc_did_emsg = TRUE; + ret = NULL; + goto theend; + } else #endif - if (paren == REG_NPAREN) - EMSG2_RET_NULL(_(e_unmatched_str_percent_open), reg_magic == MAGIC_ALL); + if (paren == REG_NPAREN) + { + semsg(_(e_unmatched_str_percent_open), + reg_magic == MAGIC_ALL ? "" : "\\"); + rc_did_emsg = TRUE; + ret = NULL; + goto theend; + } else - EMSG2_RET_NULL(_(e_unmatched_str_open), reg_magic == MAGIC_ALL); + { + semsg(_(e_unmatched_str_open), + reg_magic == MAGIC_ALL ? "" : "\\"); + rc_did_emsg = TRUE; + ret = NULL; + goto theend; + } } else if (paren == REG_NOPAREN && peekchr() != NUL) { if (curchr == Magic(')')) - EMSG2_RET_NULL(_(e_unmatched_str_close), reg_magic == MAGIC_ALL); + { + semsg(_(e_unmatched_str_close), + reg_magic == MAGIC_ALL ? "" : "\\"); + rc_did_emsg = TRUE; + ret = NULL; + goto theend; + } else - EMSG_RET_NULL(_(e_trailing_characters)); // "Can't happen". - // NOTREACHED + { + emsg(_(e_trailing_characters)); // "Can't happen". + rc_did_emsg = TRUE; + ret = NULL; + goto theend; + } } // Here we set the flag allowing back references to this set of // parentheses. if (paren == REG_PAREN) had_endbrace[parno] = TRUE; // have seen the close paren + +theend: + --bt_reg_parse_depth; return ret; } diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index d52ea4034d..f47d0c8344 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -248,6 +248,7 @@ static int nfa_re_flags; // re_flags passed to nfa_regcomp() static int *post_start; // holds the postfix form of r.e. static int *post_end; static int *post_ptr; +static int nfa_reg_parse_depth; // nesting depth in nfa_reg() // Set when the pattern should use the NFA engine. // E.g. [[:upper:]] only allows 8bit characters for BT engine, @@ -310,6 +311,7 @@ nfa_regcomp_start( wants_nfa = FALSE; rex.nfa_has_zend = FALSE; rex.nfa_has_backref = FALSE; + nfa_reg_parse_depth = 0; // shared with BT engine regcomp_start(expr, re_flags); @@ -2516,6 +2518,7 @@ nfa_reg( int paren) // REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN { int parno = 0; + int status = FAIL; if (paren == REG_PAREN) { @@ -2533,14 +2536,18 @@ nfa_reg( } #endif + if (nfa_reg_parse_depth >= REG_MAX_PAREN_DEPTH) + EMSG_RET_FAIL(_(e_command_too_complex)); + ++nfa_reg_parse_depth; + if (nfa_regbranch() == FAIL) - return FAIL; // cascaded error + goto theend; // cascaded error while (peekchr() == Magic('|')) { skipchr(); if (nfa_regbranch() == FAIL) - return FAIL; // cascaded error + goto theend; // cascaded error EMIT(NFA_OR); } @@ -2548,17 +2555,23 @@ nfa_reg( if (paren != REG_NOPAREN && getchr() != Magic(')')) { if (paren == REG_NPAREN) - EMSG2_RET_FAIL(_(e_unmatched_str_percent_open), - reg_magic == MAGIC_ALL); + semsg(_(e_unmatched_str_percent_open), + reg_magic == MAGIC_ALL ? "" : "\\"); else - EMSG2_RET_FAIL(_(e_unmatched_str_open), reg_magic == MAGIC_ALL); + semsg(_(e_unmatched_str_open), + reg_magic == MAGIC_ALL ? "" : "\\"); + rc_did_emsg = TRUE; + goto theend; } else if (paren == REG_NOPAREN && peekchr() != NUL) { if (peekchr() == Magic(')')) - EMSG2_RET_FAIL(_(e_unmatched_str_close), reg_magic == MAGIC_ALL); + semsg(_(e_unmatched_str_close), + reg_magic == MAGIC_ALL ? "" : "\\"); else - EMSG_RET_FAIL(_(e_nfa_regexp_proper_termination_error)); + emsg(_(e_nfa_regexp_proper_termination_error)); + rc_did_emsg = TRUE; + goto theend; } /* * Here we set the flag allowing back references to this set of @@ -2574,7 +2587,11 @@ nfa_reg( EMIT(NFA_ZOPEN + parno); #endif - return OK; + status = OK; + +theend: + --nfa_reg_parse_depth; + return status; } #ifdef DEBUG diff --git a/src/testdir/test_regexp_latin.vim b/src/testdir/test_regexp_latin.vim index 573cf139ba..c169525fb9 100644 --- a/src/testdir/test_regexp_latin.vim +++ b/src/testdir/test_regexp_latin.vim @@ -981,6 +981,12 @@ func Test_regexp_error() call assert_equal('', matchstr('abcd', '\%o181\%o142')) endfunc +func Test_regexp_recursion_limit() + let nested = repeat('\%(', 20000) .. 'x' .. repeat('\)', 20000) + call assert_fails("call matchstr('x', '\%#=2' .. nested)", 'E74:') + call assert_fails("call matchstr('x', '\%#=1' .. nested)", 'E74:') +endfunc + " Test for using the last substitute string pattern (~) func Test_regexp_last_subst_string() new diff --git a/src/version.c b/src/version.c index 90b5ad6dc0..28726e3739 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 815, /**/ 814, /**/ From dd326ec1e8c8a7f734be79abed973871a298697b Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 20 Jul 2026 17:00:22 +0000 Subject: [PATCH 152/647] patch 9.2.0816: GTK4: Memory leak in gui_gtk_set_dnd_targets() Problem: GTK4: Memory leak in gui_gtk_set_dnd_targets() Solution: Unref formats (Foxe Chen) closes: #20729 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 8 +++++--- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 2bcb31ce9e..fbe4ec5535 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -2582,15 +2582,17 @@ read_data_input_cb( void gui_gtk_set_dnd_targets(void) { - GdkContentFormatsBuilder *builder = gdk_content_formats_builder_new(); + GdkContentFormatsBuilder *builder = gdk_content_formats_builder_new(); + GdkContentFormats *formats; gdk_content_formats_builder_add_gtype(builder, GDK_TYPE_FILE_LIST); gdk_content_formats_builder_add_gtype(builder, G_TYPE_STRING); if (clip_html) gdk_content_formats_builder_add_mime_type(builder, "text/html"); - gtk_drop_target_async_set_formats(gui.drop_target, - gdk_content_formats_builder_free_to_formats(builder)); + formats = gdk_content_formats_builder_free_to_formats(builder); + gtk_drop_target_async_set_formats(gui.drop_target, formats); + gdk_content_formats_unref(formats); } /* diff --git a/src/version.c b/src/version.c index 28726e3739..bb8df567b7 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 816, /**/ 815, /**/ From 203210e48b75e8af501c4f40f91671c4a8556f28 Mon Sep 17 00:00:00 2001 From: Jian-Shuo Huang Date: Mon, 20 Jul 2026 17:09:39 +0000 Subject: [PATCH 153/647] runtime(zathurarc): sync options with latest zathura master closes: #20733 Signed-off-by: Jian-Shuo Huang Signed-off-by: Christian Brabandt --- runtime/syntax/zathurarc.vim | 38 +++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/runtime/syntax/zathurarc.vim b/runtime/syntax/zathurarc.vim index 3e35522e96..bfd331834b 100644 --- a/runtime/syntax/zathurarc.vim +++ b/runtime/syntax/zathurarc.vim @@ -5,6 +5,7 @@ " Upstream: https://github.com/Freed-Wu/zathurarc.vim " Latest Revision: 2024-09-16 " 2026 Apr 04 by Vim project: add page-v-padding and page-h-padding +" 2026 Jul 20 by Vim project: syn options with latest zathura upstream repo if exists('b:current_syntax') finish @@ -30,26 +31,31 @@ syntax keyword zathurarcOption completion-highlight-fg continuous-hist-save data syntax keyword zathurarcOption dbus-raise-window dbus-service default-bg default-fg syntax keyword zathurarcOption double-click-follow exec-command filemonitor syntax keyword zathurarcOption first-page-column font guioptions highlight-active-color -syntax keyword zathurarcOption highlight-color highlight-fg highlight-transparency +syntax keyword zathurarcOption highlight-color highlighter-modifier highlight-fg syntax keyword zathurarcOption incremental-search index-active-bg index-active-fg index-bg -syntax keyword zathurarcOption index-fg inputbar-bg inputbar-fg link-hadjust link-zoom -syntax keyword zathurarcOption n-completion-items notification-bg notification-error-bg -syntax keyword zathurarcOption notification-error-fg notification-fg +syntax keyword zathurarcOption index-fg inputbar-bg inputbar-fg jumplist-size link-hadjust +syntax keyword zathurarcOption link-zoom n-completion-items nohlsearch notification-bg +syntax keyword zathurarcOption notification-error-bg notification-error-fg notification-fg syntax keyword zathurarcOption notification-warning-bg notification-warning-fg -syntax keyword zathurarcOption page-cache-size page-h-padding page-v-padding -syntax keyword zathurarcOption page-right-to-left page-thumbnail-size pages-per-row recolor -syntax keyword zathurarcOption recolor-darkcolor recolor-keephue recolor-lightcolor -syntax keyword zathurarcOption recolor-reverse-video render-loading render-loading-bg -syntax keyword zathurarcOption render-loading-fg sandbox scroll-full-overlap scroll-hstep +syntax keyword zathurarcOption open-first-page open-link-confirm page-cache-size +syntax keyword zathurarcOption page-h-padding page-mode page-right-to-left pages-per-row +syntax keyword zathurarcOption page-thumbnail-size page-v-padding recolor +syntax keyword zathurarcOption recolor-adjust-lightness recolor-darkcolor recolor-keephue +syntax keyword zathurarcOption recolor-lightcolor recolor-reverse-video render-loading +syntax keyword zathurarcOption render-loading-bg render-loading-fg scrollbar-bg +syntax keyword zathurarcOption scrollbar-fg scroll-full-overlap scroll-hstep syntax keyword zathurarcOption scroll-page-aware scroll-step scroll-wrap search-hadjust -syntax keyword zathurarcOption selection-clipboard selection-notification show-directories -syntax keyword zathurarcOption show-hidden show-recent statusbar-basename statusbar-bg -syntax keyword zathurarcOption statusbar-fg statusbar-h-padding statusbar-home-tilde +syntax keyword zathurarcOption selection-clipboard selection-keep-highlight +syntax keyword zathurarcOption selection-notification show-directories show-hidden +syntax keyword zathurarcOption show-recent show-signature-information signature-error-color +syntax keyword zathurarcOption signature-success-color signature-warning-color +syntax keyword zathurarcOption single-page-mode statusbar-basename statusbar-bg +syntax keyword zathurarcOption statusbar-fg statusbar-home-tilde statusbar-h-padding syntax keyword zathurarcOption statusbar-page-percent statusbar-v-padding synctex -syntax keyword zathurarcOption synctex-editor-command vertical-center window-height -syntax keyword zathurarcOption window-icon window-icon-document window-title-basename -syntax keyword zathurarcOption window-title-home-tilde window-title-page window-width -syntax keyword zathurarcOption zoom-center zoom-max zoom-min zoom-step +syntax keyword zathurarcOption synctex-edit-modifier synctex-editor-command vertical-center +syntax keyword zathurarcOption window-height window-title-basename window-title-home-tilde +syntax keyword zathurarcOption window-title-page window-width word-separator zoom-center +syntax keyword zathurarcOption zoom-max zoom-min zoom-step highlight default link zathurarcComment Comment highlight default link zathurarcNumber Number From 16f562b4e54ed13e54fac9a7bf27feff6beca345 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 20 Jul 2026 17:11:43 +0000 Subject: [PATCH 154/647] patch 9.2.0817: crash when building a stacktrace during an autocommand Problem: Vim can crash while building a stack trace when an autocommand is being triggered but has not matched a pattern yet, for example at the more prompt with 'verbose' set (stefanos82). Solution: Handle the autocommand entry on the execution stack that does not have a script context yet (Hirohito Higashi). fixes: #20730 closes: #20732 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/scriptfile.c | 21 ++++++++----- src/testdir/test_stacktrace.vim | 55 ++++++++++++++++++++++++++++++--- src/version.c | 2 ++ 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/scriptfile.c b/src/scriptfile.c index c32c73ec03..c5f807562d 100644 --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -166,10 +166,11 @@ estack_sfile(estack_arg_T which UNUSED) if (entry->es_type == ETYPE_UFUNC || entry->es_type == ETYPE_AUCMD) { sctx_T *def_ctx = entry->es_type == ETYPE_UFUNC - ? &entry->es_info.ufunc->uf_script_ctx - : acp_script_ctx(entry->es_info.aucmd); + ? &entry->es_info.ufunc->uf_script_ctx + : entry->es_info.aucmd != NULL + ? acp_script_ctx(entry->es_info.aucmd) : NULL; - return def_ctx->sc_sid > 0 + return def_ctx != NULL && def_ctx->sc_sid > 0 ? vim_strsave(SCRIPT_ITEM(def_ctx->sc_sid)->sn_name) : NULL; } @@ -322,11 +323,15 @@ stacktrace_create(void) } else if (entry->es_type == ETYPE_AUCMD) { - sctx_T sctx = *acp_script_ctx(entry->es_info.aucmd); - char_u *filepath = sctx.sc_sid > 0 ? - get_scriptname(sctx.sc_sid) : (char_u *)""; - - lnum += sctx.sc_lnum; + // The autocmd may not have a matching pattern yet, in which case + // es_info.aucmd is still NULL. + sctx_T *sctx = entry->es_info.aucmd != NULL + ? acp_script_ctx(entry->es_info.aucmd) : NULL; + char_u *filepath = sctx != NULL && sctx->sc_sid > 0 ? + get_scriptname(sctx->sc_sid) : (char_u *)""; + + if (sctx != NULL) + lnum += sctx->sc_lnum; stacktrace_push_item(l, NULL, entry->es_name, lnum, filepath); } } diff --git a/src/testdir/test_stacktrace.vim b/src/testdir/test_stacktrace.vim index 77ea28f94f..25750cc346 100644 --- a/src/testdir/test_stacktrace.vim +++ b/src/testdir/test_stacktrace.vim @@ -1,5 +1,6 @@ " Test for getstacktrace() and v:stacktrace +source util/screendump.vim import './util/vim9.vim' as v9 let s:thisfile = expand('%:p') @@ -36,7 +37,7 @@ func Test_getstacktrace() source Xscript1 call Xfunc1() call AssertStacktrace([ - \ #{funcref: funcref('Test_getstacktrace'), lnum: 37, filepath: s:thisfile}, + \ #{funcref: funcref('Test_getstacktrace'), lnum: 38, filepath: s:thisfile}, \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, \ ], g:stacktrace) @@ -63,7 +64,7 @@ func Test_getstacktrace_event() source Xscript1 source Xscript2 call AssertStacktrace([ - \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 64, filepath: s:thisfile}, + \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 65, filepath: s:thisfile}, \ #{event: 'SourcePre Autocommands for "*"', lnum: 7, filepath: Filepath('Xscript1')}, \ #{funcref: funcref('Xfunc'), lnum: 4, filepath: Filepath('Xscript1')}, \ ], g:stacktrace) @@ -106,12 +107,12 @@ func Test_vstacktrace() endtry call assert_equal([], v:stacktrace) call AssertStacktrace([ - \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile}, + \ #{funcref: funcref('Test_vstacktrace'), lnum: 98, filepath: s:thisfile}, \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, \ ], stacktrace) call AssertStacktrace([ - \ #{funcref: funcref('Test_vstacktrace'), lnum: 101, filepath: s:thisfile}, + \ #{funcref: funcref('Test_vstacktrace'), lnum: 102, filepath: s:thisfile}, \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, \ ], stacktrace_inner) @@ -139,4 +140,50 @@ func Test_stacktrace_vim9() call v9.CheckDefSuccess(lines) endfunc +" Building a stacktrace at the "Executing autocommands" more prompt, before the +" autocommand has matched a pattern, must not crash. +func Test_getstacktrace_during_autocmd_prompt() + CheckRunVimInTerminal + + let lines =<< trim [SCRIPT] + func Cb(timer) + " The not-yet-matched autocmd entry has no funcref, no event and an empty + " filepath; only then does this hit the crash. + for d in getstacktrace() + if !has_key(d, 'funcref') && !has_key(d, 'event') + \ && get(d, 'filepath', '') == '' + call writefile(['ok'], 'Xstacktracedone') + endif + endfor + endfunc + augroup Test + autocmd! + autocmd User Foo echo 'autocmd body' + augroup END + func Go() + " verbose=8 prints the "Executing autocommands" message; redraw! fixes the + " screen origin so the fill lines make the more prompt land on it. + set more verbose=8 + redraw! + call timer_start(20, function('Cb'), #{repeat: -1}) + for i in range(&lines - 1) + echom 'fill' .. i + endfor + doautocmd User Foo + endfunc + [SCRIPT] + call writefile(lines, 'Xstacktracescript', 'D') + + let buf = RunVimInTerminal('-S Xstacktracescript', #{rows: 6}) + " Not from a timer: a nested timer callback would not fire at the more prompt. + call term_sendkeys(buf, ":call Go()\") + call WaitForAssert({-> assert_true(filereadable('Xstacktracedone'))}) + call assert_equal('run', job_status(term_getjob(buf))) + + " The more prompt makes a clean :qall unreliable, so stop the job. + call job_stop(term_getjob(buf)) + call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))}) + call delete('Xstacktracedone') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index bb8df567b7..91cfa5b70d 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 817, /**/ 816, /**/ From 3cfdb634b1db2ed51d1147b720e0d9d67b7f5252 Mon Sep 17 00:00:00 2001 From: Muraoka Taro Date: Mon, 20 Jul 2026 17:31:59 +0000 Subject: [PATCH 155/647] patch 9.2.0818: tests: client-server test fails without X11 server Problem: When unable to connect to X11, serverlist({'list':1}) returns a string instead of a list. This causes Test_remote_serverlist() in test_vim9_builtin.vim to fail. Solution: Raise E240 (No connection to the X server) Additionally, This fix `Test_clientserver_env_method()` keeping `VIM_CLIENTSERVER` environment variable instead of deleting it. This allows certain `+clientserver` tests to pass, even in environments where the X11 server is unavailable, provided that `VIM_CLIENTSERVER=socket` is set. closes: #20716 Co-Authored-By: James McCoy Signed-off-by: Muraoka Taro Signed-off-by: Christian Brabandt --- src/clientserver.c | 10 ++++-- src/testdir/test_clientserver.vim | 51 ++++++++++++++++++++++++++++++- src/testdir/test_vim9_builtin.vim | 12 +++++--- src/version.c | 2 ++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/clientserver.c b/src/clientserver.c index 13f3fafcb2..30aab970fe 100644 --- a/src/clientserver.c +++ b/src/clientserver.c @@ -1284,9 +1284,13 @@ f_serverlist(typval_T *argvars UNUSED, typval_T *rettv) # ifdef FEAT_X11 if (clientserver_method == CLIENTSERVER_METHOD_X11) { - make_connection(); - if (X_DISPLAY != NULL) - list = serverGetVimNames(X_DISPLAY); + // This function fails if there is no X11 connection. + if (check_connection() == FAIL) + return; + // If the check_connection() function returns OK, it has already been + // confirmed within that function that make_connection() was called and + // that X_DISPLAY is not NULL. + list = serverGetVimNames(X_DISPLAY); } # endif # endif diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index 18877a9d8b..4a7763ffab 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -512,6 +512,7 @@ func Test_clientserver_env_method() " Don't use channel:2000, because previous tests use that and it may take a " while for the channel to fully close. let actual = cmd .. ' --servername channel:4000' + let save_vim_clientserver = $VIM_CLIENTSERVER let $VIM_CLIENTSERVER = 'socket' let job = job_start(actual, {'stoponexit': 'kill', 'out_io': 'null'}) @@ -528,7 +529,11 @@ func Test_clientserver_env_method() else call system(actual .. " --remote-expr 'execute(\"qa!\")'") endif - unlet $VIM_CLIENTSERVER + if save_vim_clientserver == '' + unlet $VIM_CLIENTSERVER + else + let $VIM_CLIENTSERVER = save_vim_clientserver + endif try call WaitForAssert({-> assert_equal("dead", job_status(job))}) @@ -577,6 +582,50 @@ func Test_clientserver_serverlist_list() endtry endfunc +func Test_clientserver_serverlist_without_x11() + CheckNotGui + CheckFeature x11 + + let cmd = GetVimCommand() + if cmd == '' + throw 'GetVimCommand() failed' + endif + + " This test verifies that serverlist() fails with error E240 when a + " connection to X11 cannot be established. It must be executed with the + " CLIENTSERVER backend set to x11 and in a state where the X11 server is + " unreachable. + " + " To achieve this, the `VIM_CLIENTSERVER` and `DISPLAY` environment + " variables must be unset before running Vim as a child process. Within the + " child process, `assert_fails()` and `v:errors` are used to confirm that + " E240 occurred; if E240 is raised as expected, `v:errors` remains empty, + " whereas if the call succeeds or a different error occurs, `v:errors` will + " contain one or more errors. + + call writefile([ + \ "call assert_fails('let x = serverlist()', 'E240:')", + \ "execute 'cq! ' .. len(v:errors)" + \ ], 'Xtest', 'D') + + let save_vim_clientserver = $VIM_CLIENTSERVER + unlet $VIM_CLIENTSERVER + let save_display = $DISPLAY + unlet $DISPLAY + + try + call system(cmd .. ' -S Xtest') + call assert_equal(0, v:shell_error) + finally + if save_display != '' + let $DISPLAY = save_display + endif + if save_vim_clientserver != '' + let $VIM_CLIENTSERVER = save_vim_clientserver + endif + endtry +endfunc + " Uncomment this line to get a debugging log " call ch_logfile('channellog', 'w') diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 9b5abba5ce..7df789657a 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -3605,10 +3605,14 @@ def Test_remote_serverlist() v9.CheckSourceDefAndScriptFailure(['serverlist("")'], ['E1013: Argument 1: type mismatch, expected dict but got string', 'E1206: Dictionary required for argument 1']) v9.CheckSourceScriptFailure(['vim9script', 'serverlist({list: ""})'], 'E1135: Using a String as a Bool: ""') - var l: any = serverlist() - assert_equal(v:t_string, type(l)) - l = serverlist({'list': true}) - assert_equal(v:t_list, type(l)) + try + var l: any = serverlist() + assert_equal(v:t_string, type(l)) + l = serverlist({'list': true}) + assert_equal(v:t_list, type(l)) + catch /E240:/ + # ignore no connection to the X server + endtry enddef def Test_remove_literal_list() diff --git a/src/version.c b/src/version.c index 91cfa5b70d..a1318f49ad 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 818, /**/ 817, /**/ From 5af893b2cd43c5ccf8eea60bfca4198b28536e1b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 20 Jul 2026 17:44:27 +0000 Subject: [PATCH 156/647] patch 9.2.0819: MS-Windows: sixel image shown as raw text in the console Problem: On the MS-Windows console a popup image is displayed as the raw sixel escape sequence instead of the image, unless 'termguicolors' is set (Bakudankun). Solution: Write a DCS sequence with the console API that lets the console parse it, no matter which write path the current colors select. Keep track of the terminator across writes, since a long sequence is split up (Hirohito Higashi). fixes: #20795 closes: #20797 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/os_win32.c | 72 +++++++++++++++++++++++++++++++++++ src/testdir/test_popupwin.vim | 34 +++++++++++++++++ src/version.c | 2 + 3 files changed, 108 insertions(+) diff --git a/src/os_win32.c b/src/os_win32.c index 5e11de231c..4797eed426 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -7645,6 +7645,52 @@ sgrn2cn( return p && p[0] == 0x0a && p[1] == '\033' ? ++p : NULL; } +static bool in_dcs = false; // inside a DCS (sixel) sequence +static bool dcs_esc = false; // last DCS byte written was ESC + +/* + * Write "len" bytes at "s" with WriteConsoleW, so that the console's own VT + * parser processes them. Needed for DCS sequences when USE_VTP is off. + */ + static void +write_vt(char_u *s, int len) +{ + int wlen; + WCHAR *ws; + DWORD written; + + wlen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)s, len, NULL, 0); + if (wlen <= 0) + return; + ws = ALLOC_MULT(WCHAR, wlen); + if (ws == NULL) + return; + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)s, len, ws, wlen); + WriteConsoleW(g_hConOut, ws, wlen, &written, NULL); + vim_free(ws); +} + +/* + * Return the pointer just after the ST (ESC '\') that ends a DCS sequence. + * Returns "end" when the ST is not in this chunk; "in_dcs" then stays set so + * that the next mch_write() call continues the scan. + */ + static char_u * +skip_dcs(char_u *s, char_u *end) +{ + for (char_u *p = s; p < end; ++p) + { + if (dcs_esc && *p == '\\') + { + dcs_esc = false; + in_dcs = false; + return p + 1; + } + dcs_esc = *p == ESC; + } + return end; +} + /* * mch_write(): write the output buffer to the screen, translating ESC * sequences into calls to console output routines. @@ -7681,6 +7727,18 @@ mch_write( return; } + if (in_dcs) + { + // Continuation of a DCS sequence split over several writes. + int l = (int)(skip_dcs(s, end) - s); + + if (vtp_working) + write_vt(s, l); + len -= l - 1; + s += l; + continue; + } + while (s + ++prefix < end) { ch = s[prefix]; @@ -7985,6 +8043,20 @@ mch_write( len -= l - 1; s += l; } + else if (s[0] == ESC && len >= 2-1 && s[1] == 'P') + { + // DCS (e.g. sixel image): write_chars() would print it as raw text + // when USE_VTP is off, so let the console's VT parser handle it. + int l; + + in_dcs = true; + dcs_esc = false; + l = (int)(skip_dcs(s + 2, end) - s); + if (vtp_working) + write_vt(s, l); + len -= l - 1; + s += l; + } else { // Write a single character diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 5e4bc5221f..67babab1b2 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -5887,6 +5887,40 @@ func Test_popup_image_clear_with_empty_dict() call popup_close(winid) endfunc +" A popup image is emitted as a DCS (sixel) escape sequence. On the Windows +" console it has to go through the VT path, otherwise the escape sequence ends +" up on the screen as raw text when 'termguicolors' is off. Send the sequence +" with echoraw() so that only the console write is under test. See #20795. +func Test_dcs_not_written_as_text_windows_cui() + CheckFeature terminal + if !has('win32') || has('gui_running') + throw 'Skipped: only for the Windows CUI' + endif + + " Draw the text first, so nothing repairs the cells afterwards in case the + " sequence does land on the screen as text. + let lines =<< trim END + call setline(1, 'READY') + redraw + call echoraw("\P0;1;8q\"1;1;8;8#1;2;100;0;0#1~~~~~~~~-\\\") + END + call writefile(lines, 'XpopupDcs', 'D') + + let buf = term_start(GetVimCommandCleanTerm() .. '-S XpopupDcs', + \ #{term_rows: 12, term_cols: 40}) + call WaitForAssert({-> assert_equal('READY', + \ term_scrape(buf, 1)[:4]->map({_, v -> v['chars']})->join(''))}) + call TermWait(buf, 50) + + let screen = '' + for row in range(1, 12) + let screen ..= term_scrape(buf, row)->map({_, v -> v['chars']})->join('') + endfor + call assert_notmatch('0;1;8q', screen) + + call StopVimInTerminal(buf) +endfunc + func Test_popup_image_set_and_getoptions() CheckFeature image diff --git a/src/version.c b/src/version.c index a1318f49ad..ae605f2431 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 819, /**/ 818, /**/ From 011108797f86d1eaebdbe107b5e9c222662636c3 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 20 Jul 2026 17:50:06 +0000 Subject: [PATCH 157/647] patch 9.2.0820: GUI: hidden popup image is displayed and not erased Problem: In the GUI a popup image is drawn even when the popup is hidden, and hiding a popup leaves part of the image on the screen (Bakudankun). Solution: Skip hidden popups when repainting images after the cursor is undrawn or the window is exposed. Redraw the area the image covered when the popup is hidden or closed, also for the GDI backend (Hirohito Higashi). fixes: #20796 closes: #20798 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 37 +++++++++++++++++++++++-------------- src/version.c | 2 ++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/popupwin.c b/src/popupwin.c index cd3fe80dab..0acb7453df 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -120,11 +120,20 @@ static void redraw_overlapped_opacity_popups(int winrow, int wincol, #ifdef FEAT_IMAGE_KITTY static void popup_image_clear_kitty(win_T *wp); #endif +// GDI and cairo paint the image straight into the window, so the area has to +// be redrawn when the popup goes away. GTK4 keeps a list of images to render +// instead, there gui_gtk4_remove_image() does the job. +#ifdef FEAT_IMAGE_GDI +# define POPUP_IMAGE_CLEAR_GUI +#endif #if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) # if !GTK_CHECK_VERSION(4,0,0) -static void popup_image_clear_cairo(win_T *wp); +# define POPUP_IMAGE_CLEAR_GUI # endif #endif +#ifdef POPUP_IMAGE_CLEAR_GUI +static void popup_image_clear_gui(win_T *wp); +#endif #ifdef FEAT_IMAGE static bool popup_image_composites_frames(void); #endif @@ -4314,10 +4323,8 @@ popup_hide(win_T *wp) wp->w_popup_flags |= POPF_HIDDEN; -#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) -# if !GTK_CHECK_VERSION(4,0,0) - popup_image_clear_cairo(wp); -# endif +#ifdef POPUP_IMAGE_CLEAR_GUI + popup_image_clear_gui(wp); #endif // Do not decrement b_nwindows, we still reference the buffer. @@ -4523,10 +4530,8 @@ popup_free(win_T *wp) if (gui.in_use) gui_gtk4_remove_image(wp); #endif -#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) -# if !GTK_CHECK_VERSION(4,0,0) - popup_image_clear_cairo(wp); -# endif +#ifdef POPUP_IMAGE_CLEAR_GUI + popup_image_clear_gui(wp); #endif sign_undefine_by_name(popup_get_sign_name(wp), FALSE); wp->w_buffer->b_locked = FALSE; @@ -7162,10 +7167,12 @@ popup_image_clear_kitty(win_T *wp) } # endif -# if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE_CAIRO) -# if !GTK_CHECK_VERSION(4,0,0) +# ifdef POPUP_IMAGE_CLEAR_GUI +/* + * Redraw the area the image of "wp" was drawn in, the popup goes away. + */ static void -popup_image_clear_cairo(win_T *wp) +popup_image_clear_gui(win_T *wp) { if (!gui.in_use || wp->w_popup_image_emit_cells_w <= 0 @@ -7181,7 +7188,6 @@ popup_image_clear_cairo(win_T *wp) wp->w_popup_image_emit_cells_w = 0; wp->w_popup_image_emit_cells_h = 0; } -# endif # endif # if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) @@ -7245,7 +7251,10 @@ popup_maybe_emit_image_rect( int img_left, img_top, img_right, img_bottom; int src_x, src_y, draw_w, draw_h; - if (!gui.in_use || wp->w_popup_image_data == NULL + // This is called for every popup, also the hidden ones: the cursor undraw + // and WM_PAINT paths do not go through find_next_popup(). + if (!gui.in_use || (wp->w_popup_flags & POPF_HIDDEN) + || wp->w_popup_image_data == NULL || wp->w_popup_image_w <= 0 || wp->w_popup_image_h <= 0) return; diff --git a/src/version.c b/src/version.c index ae605f2431..4031cd24ca 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 820, /**/ 819, /**/ From 88440f9a3460bf54e4017340e764788dcf6cb3d7 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Tue, 21 Jul 2026 16:15:48 +0000 Subject: [PATCH 158/647] patch 9.2.0821: filetype: msmtp system-wide rc file not detected Problem: filetype: msmtp system-wide rc file not detected (chdiza). Solution: Detect 'msmtprc' as filetype msmtp, like '.msmtprc' (Doug Kearns). fixes: #20751 closes: #20752 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 3 ++- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index a72e91e3ea..7473896b06 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 18 +# Last Change: 2026 Jul 21 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -3345,6 +3345,7 @@ const ft_from_name = { "meson.options": "meson", "meson_options.txt": "meson", # msmtp + "msmtprc": "msmtp", ".msmtprc": "msmtp", # Mrxvtrc "mrxvtrc": "mrxvtrc", diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index bc377440a9..79ce8ff9c4 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -560,7 +560,7 @@ def s:GetFilenameChecks(): dict> mplayerconf: ['mplayer.conf', '/.mplayer/config', 'any/.mplayer/config'], mrxvtrc: ['mrxvtrc', '.mrxvtrc'], msidl: ['file.odl', 'file.mof'], - msmtp: ['.msmtprc'], + msmtp: ['msmtprc', '.msmtprc'], msql: ['file.msql'], mss: ['file.mss'], mupad: ['file.mu'], diff --git a/src/version.c b/src/version.c index 4031cd24ca..5d8f6e9aa2 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 821, /**/ 820, /**/ From dbbd6f99e8fb0371a7b15c0cec4810b1918a6b10 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Tue, 21 Jul 2026 16:23:32 +0000 Subject: [PATCH 159/647] patch 9.2.0822: GTK4: crash menu id is null in gui_mch_destroy_menu() Problem: GTK4: crash menu id is null in gui_mch_destroy_menu() Solution: Check that menu->id is not null before calling vim_menu_remove() (Foxe Chen). closes: #20724 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 3 ++- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index fbe4ec5535..a194edd760 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -4844,7 +4844,8 @@ gui_mch_destroy_menu(vimmenu_T *menu) else if (menu->parent == NULL) // Remove from menubar vim_menu_bar_remove(VIM_MENU_BAR(gui.menubar), menu->id); - else + // "menu->id" is NULL for window toolbar + else if (menu->id != NULL) // Remove from parent menu vim_menu_remove(VIM_MENU(menu->parent->submenu_id), menu->id); diff --git a/src/version.c b/src/version.c index 5d8f6e9aa2..267d273de1 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 822, /**/ 821, /**/ From bb00e0ffb2ab2806e9df53e72a4fab40791d356e Mon Sep 17 00:00:00 2001 From: James McCoy Date: Tue, 21 Jul 2026 16:28:59 +0000 Subject: [PATCH 160/647] patch 9.2.0823: tests: Test_clientserver_servlist_list may fail Problem: tests: Test_clientserver_servlist_list may fail Solution: Skip Test_clientserver_serverlist_list for non-gvim GUI builds (James McCoy) Running a GUI build that cannot access the GUI clientserver will fail like below command line..script /build/package/src/testdir/runtest.vim[636]..function RunTheTest[63]..Test_clientserver_serverlist_list[16]..WaitForAssert[2]..4_WaitForCommon[11]..23 line 1: Pattern 'XVIMTEST' does not match '' command line..script /build/package/src/testdir/runtest.vim[636]..function RunTheTest[63]..Test_clientserver_serverlist_list line 18: Expected 'list' but got 'string' Caught exception in Test_clientserver_serverlist_list(): Vim(call):E897: List or Blob required @ command line..script /build/package/src/testdir/runtest.vim[636]..function RunTheTest[63]..Test_clientserver_serverlist_list, line 19 closes: #20719 Signed-off-by: James McCoy Signed-off-by: Christian Brabandt --- src/testdir/test_clientserver.vim | 8 +++++++- src/version.c | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index 4a7763ffab..3c39d01c24 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -549,6 +549,12 @@ endfunc func Test_clientserver_serverlist_list() CheckNotGui + " CheckNotGui has already confirmed gvim is not being used to run this test. + " However, if this is a GUI _build_ of vim, then the running Vim process + " will already have selected _not_ to use socket clientserver. Therefore, we + " either need the ability to use the GUI clientserver or to skip the test. + call Check_X11_Connection() + let g:test_is_flaky = 1 let cmd = GetVimCommand() @@ -567,7 +573,7 @@ func Test_clientserver_serverlist_list() call assert_equal('list', typename(serverlist(#{list: v:true}))) call assert_true(serverlist(#{list: v:true})->index('XVIMTEST') != -1) - if has('win32') || has('gui_running') + if has('win32') call job_stop(job, 'kill') else call system(actual .. " --remote-expr 'execute(\"qa!\")'") diff --git a/src/version.c b/src/version.c index 267d273de1..bdf8cac8c4 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 823, /**/ 822, /**/ From 2262053f3225ae0f78f6d475155bab9f096ead97 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Wed, 22 Jul 2026 08:42:59 +0000 Subject: [PATCH 161/647] patch 9.2.0824: Makefile: Make tags depends on configure Problem: Makefile: Make tags depends on configure Solution: Separate the make tags into a separate makefile (Christoffer Aasted) closes: #20707 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- Filelist | 1 + Makefile | 5 ++++- src/Make_all.mak | 2 +- src/Make_tags.mak | 16 ++++++++++++++++ src/Makefile | 6 +++--- src/version.c | 2 ++ 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 src/Make_tags.mak diff --git a/Filelist b/Filelist index aedb16a7ff..07853f4c69 100644 --- a/Filelist +++ b/Filelist @@ -34,6 +34,7 @@ SRC_ALL = \ ci/ddebs.list \ ci/pinned-pkgs \ src/Make_all.mak \ + src/Make_tags.mak \ src/README.md \ src/alloc.c \ src/alloc.h \ diff --git a/Makefile b/Makefile index 2552083a51..47c41a2bb4 100644 --- a/Makefile +++ b/Makefile @@ -30,9 +30,12 @@ first: @echo "If there are problems, cd to the src directory and run make there" cd src && $(MAKE) $@ +tags notags: + $(MAKE) -C src/ -f Make_tags.mak $@ + # Some make programs use the last target for the $@ default; put the other # targets separately to always let $@ expand to "first" by default. -all install uninstall tools config configure reconfig proto depend lint tags types test scripttests testtiny test_libvterm unittests testclean clean distclean: +all install uninstall tools config configure reconfig proto depend lint types test scripttests testtiny test_libvterm unittests testclean clean distclean: @if test ! -f src/auto/config.mk; then \ cp src/config.mk.dist src/auto/config.mk; \ fi diff --git a/src/Make_all.mak b/src/Make_all.mak index 6a6d2fe14e..4f1b1255fd 100644 --- a/src/Make_all.mak +++ b/src/Make_all.mak @@ -1,5 +1,5 @@ # -# Common Makefile, defines the list of tests to run and other things. +# Common Makefile - shared platform independent # # Argument for running ctags. diff --git a/src/Make_tags.mak b/src/Make_tags.mak new file mode 100644 index 0000000000..9a17b0955b --- /dev/null +++ b/src/Make_tags.mak @@ -0,0 +1,16 @@ +# +# tags +# + +include Make_all.mak +-include auto/config.mk + +# Override with `make TAGPRG='...' tags` +TAGPRG ?= ctags -I INIT+,INIT2+,INIT3+,INIT4+,INIT5+ --fields=+S -f tags + +notags: + -rm -f tags + +# You can ignore error messages for missing files. +tags TAGS: notags + $(TAGPRG) $(TAGS_FILES) diff --git a/src/Makefile b/src/Makefile index e0f7057b83..a3878d0c85 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2201,12 +2201,12 @@ proto/gui_gtk_gresources.pro: auto/gui_gtk_gresources.c fi notags: - -rm -f tags + $(MAKE) -f Make_tags.mak notags -# Note: tags is made for the currently configured version. +# Configure sets portable TAGPRG, else modern ctags is used. # You can ignore error messages for missing files. tags TAGS: notags - $(TAGPRG) $(TAGS_FILES) + $(MAKE) -f Make_tags.mak tags # Build the cscope database. # This may search more files than necessary. diff --git a/src/version.c b/src/version.c index bdf8cac8c4..80eae1f884 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 824, /**/ 823, /**/ From ade577e4dc2a9f34d2d592cbe1c80b9fc89753bf Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 22 Jul 2026 08:49:26 +0000 Subject: [PATCH 162/647] patch 9.2.0825: regexp: submatch in a look-behind is empty with the NFA engine Problem: With the NFA engine a sub-expression inside a variable width look-behind, e.g. "\v(.)@<=", is empty for the first match on every line except the first one. The old engine is correct (Mukundan) Solution: The look-behind is retried from the previous line, because the width of "." is over-estimated. While scanning that line the start state is added at the end of the line, where it gets the position of the line break as its start position, even though the match actually starts on the next line. Use the position of the start of the next line in that case (Hirohito Higashi). fixes: #20802 closes: #20805 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/regexp_nfa.c | 27 ++++++++++++++++++++++++++- src/testdir/test_regexp_utf8.vim | 25 +++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index f47d0c8344..b224f9fd58 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -7269,7 +7269,32 @@ nfa_regmatch( } else { - if (addstate(nextlist, start, m, NULL, clen) == NULL) + char_u *save_line = rex.line; + char_u *save_input = rex.input; + linenr_T save_lnum = rex.lnum; + + // At the end of a line the match can only start on the next + // line, use that position instead of the line break. + if (REG_MULTI && clen == 0 && nfa_endp != NULL + && rex.lnum < nfa_endp->se_u.pos.lnum) + { + char_u *next_line = reg_getline(rex.lnum + 1); + + if (next_line != NULL) + { + rex.line = next_line; + rex.input = rex.line; + ++rex.lnum; + } + } + + r = addstate(nextlist, start, m, NULL, clen); + + rex.line = save_line; + rex.input = save_input; + rex.lnum = save_lnum; + + if (r == NULL) { nfa_match = NFA_TOO_EXPENSIVE; goto theend; diff --git a/src/testdir/test_regexp_utf8.vim b/src/testdir/test_regexp_utf8.vim index d33c03c421..6dea55668a 100644 --- a/src/testdir/test_regexp_utf8.vim +++ b/src/testdir/test_regexp_utf8.vim @@ -651,4 +651,29 @@ func Test_regex_collection_range_with_composing_crash() bwipe! endfunc +" A submatch in a look-behind must not start on the previous line. See +" issue #20802. +func Test_lookbehind_submatch_on_second_line() + new + for re in range(0, 2) + exe "set re=" .. re + call setline(1, ['testing', 'testing']) + %s/\v(.)@<=/[\1]/g + call assert_equal(['t[t]e[e]s[s]t[t]i[i]n[n]g', + \ 't[t]e[e]s[s]t[t]i[i]n[n]g'], getline(1, '$'), 're=' .. re) + %d _ + + " With "\_." the look-behind can match the line break, then the submatch + " does start on the previous line. + call setline(1, ['abc', 'def']) + %s/\v(\_.)@<=/[\1]/g + call assert_equal(['a[a]b[b]c[c]', '[]d[d]e[e]f[f]'], + \ getline(1, '$'), 're=' .. re) + %d _ + endfor + + set re& + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 80eae1f884..4195d04c79 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 825, /**/ 824, /**/ From 38f27d01b541fbff8cd5e07fbb63ffb8f93fc799 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Wed, 22 Jul 2026 09:16:53 +0000 Subject: [PATCH 163/647] patch 9.2.0826: highlighting for broken terminals can be improved Problem: highlighting for broken terminals can be improved (Maxim Kim) Solution: Make the highlighting work better when the terminal does not support colors (Maxim Kim) In a colorless or broken terminal emulator current syntax highlighting is too intense with using bold and underline for various syntax elements. In this scenario, when the colors are not available at all, the most important part of the syntax is the comments, something that is not executed or compiled. - Comments are highlighted as bold - All other syntax elements are set to NONE - LineNr is not highlighted (was underline) - SpecialKey is not highlighted (was bold) fixes: #20712 closes: #20799 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/doc/version9.txt | 3 ++- runtime/syntax/syncolor.vim | 30 +++++++++++++++--------------- src/highlight.c | 20 ++++++++++---------- src/version.c | 2 ++ 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index dc4f28d91c..440c616a46 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Jun 26 +*version9.txt* For Vim version 9.2. Last change: 2026 Jul 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52697,6 +52697,7 @@ Changed ~ to insert-mode mappings. - It is possible to clear the alternate file register |quote#|. - |serverlist()| can return a list of all available server names. +- Improve visual appearance when the terminal does not support colors. *added-9.3* diff --git a/runtime/syntax/syncolor.vim b/runtime/syntax/syncolor.vim index 8b0beb88d9..28324ebe29 100644 --- a/runtime/syntax/syncolor.vim +++ b/runtime/syntax/syncolor.vim @@ -1,6 +1,6 @@ " Vim syntax support file " Maintainer: The Vim Project -" Last Change: 2023 Aug 10 +" Last Change: 2026 Jul 22 " Former Maintainer: Bram Moolenaar " This file sets up the default methods for highlighting. @@ -33,28 +33,28 @@ endif " There are two sets of defaults: for a dark and a light background. if &background == "dark" SynColor Comment term=bold cterm=NONE ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#80a0ff guibg=NONE - SynColor Constant term=underline cterm=NONE ctermfg=Magenta ctermbg=NONE gui=NONE guifg=#ffa0a0 guibg=NONE - SynColor Special term=bold cterm=NONE ctermfg=LightRed ctermbg=NONE gui=NONE guifg=Orange guibg=NONE - SynColor Identifier term=underline cterm=bold ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#40ffff guibg=NONE - SynColor Statement term=bold cterm=NONE ctermfg=Yellow ctermbg=NONE gui=bold guifg=#ffff60 guibg=NONE - SynColor PreProc term=underline cterm=NONE ctermfg=LightBlue ctermbg=NONE gui=NONE guifg=#ff80ff guibg=NONE - SynColor Type term=underline cterm=NONE ctermfg=LightGreen ctermbg=NONE gui=bold guifg=#60ff60 guibg=NONE - SynColor Underlined term=underline cterm=underline ctermfg=LightBlue gui=underline guifg=#80a0ff + SynColor Constant term=NONE cterm=NONE ctermfg=Magenta ctermbg=NONE gui=NONE guifg=#ffa0a0 guibg=NONE + SynColor Special term=NONE cterm=NONE ctermfg=LightRed ctermbg=NONE gui=NONE guifg=Orange guibg=NONE + SynColor Identifier term=NONE cterm=bold ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#40ffff guibg=NONE + SynColor Statement term=NONE cterm=NONE ctermfg=Yellow ctermbg=NONE gui=bold guifg=#ffff60 guibg=NONE + SynColor PreProc term=NONE cterm=NONE ctermfg=LightBlue ctermbg=NONE gui=NONE guifg=#ff80ff guibg=NONE + SynColor Type term=NONE cterm=NONE ctermfg=LightGreen ctermbg=NONE gui=bold guifg=#60ff60 guibg=NONE + SynColor Underlined term=NONE cterm=underline ctermfg=LightBlue gui=underline guifg=#80a0ff SynColor Ignore term=NONE cterm=NONE ctermfg=black ctermbg=NONE gui=NONE guifg=bg guibg=NONE SynColor Added term=NONE cterm=NONE ctermfg=Green ctermbg=NONE gui=NONE guifg=LimeGreen guibg=NONE SynColor Changed term=NONE cterm=NONE ctermfg=Blue ctermbg=NONE gui=NONE guifg=DodgerBlue guibg=NONE SynColor Removed term=NONE cterm=NONE ctermfg=Red ctermbg=NONE gui=NONE guifg=Red guibg=NONE else SynColor Comment term=bold cterm=NONE ctermfg=DarkBlue ctermbg=NONE gui=NONE guifg=Blue guibg=NONE - SynColor Constant term=underline cterm=NONE ctermfg=DarkRed ctermbg=NONE gui=NONE guifg=Magenta guibg=NONE + SynColor Constant term=NONE cterm=NONE ctermfg=DarkRed ctermbg=NONE gui=NONE guifg=Magenta guibg=NONE " #6a5acd is SlateBlue - SynColor Special term=bold cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=#6a5acd guibg=NONE - SynColor Identifier term=underline cterm=NONE ctermfg=DarkCyan ctermbg=NONE gui=NONE guifg=DarkCyan guibg=NONE - SynColor Statement term=bold cterm=NONE ctermfg=Brown ctermbg=NONE gui=bold guifg=Brown guibg=NONE + SynColor Special term=NONE cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=#6a5acd guibg=NONE + SynColor Identifier term=NONE cterm=NONE ctermfg=DarkCyan ctermbg=NONE gui=NONE guifg=DarkCyan guibg=NONE + SynColor Statement term=NONE cterm=NONE ctermfg=Brown ctermbg=NONE gui=bold guifg=Brown guibg=NONE " #6a0dad is Purple - SynColor PreProc term=underline cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=#6a0dad guibg=NONE - SynColor Type term=underline cterm=NONE ctermfg=DarkGreen ctermbg=NONE gui=bold guifg=SeaGreen guibg=NONE - SynColor Underlined term=underline cterm=underline ctermfg=DarkMagenta gui=underline guifg=SlateBlue + SynColor PreProc term=NONE cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=#6a0dad guibg=NONE + SynColor Type term=NONE cterm=NONE ctermfg=DarkGreen ctermbg=NONE gui=bold guifg=SeaGreen guibg=NONE + SynColor Underlined term=NONE cterm=underline ctermfg=DarkMagenta gui=underline guifg=SlateBlue SynColor Ignore term=NONE cterm=NONE ctermfg=white ctermbg=NONE gui=NONE guifg=bg guibg=NONE SynColor Added term=NONE cterm=NONE ctermfg=DarkGreen ctermbg=NONE gui=NONE guifg=SeaGreen guibg=NONE SynColor Changed term=NONE cterm=NONE ctermfg=Blue ctermbg=NONE gui=NONE guifg=DodgerBlue guibg=NONE diff --git a/src/highlight.c b/src/highlight.c index cfed85de33..efe21455f2 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -260,8 +260,8 @@ static void hl_do_font(int idx, char_u *arg, int do_normal, int do_menu, int do_ static char *(highlight_init_both[]) = { CENT("ErrorMsg term=standout ctermbg=DarkRed ctermfg=White", "ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White"), - CENT("IncSearch term=reverse cterm=reverse", - "IncSearch term=reverse cterm=reverse gui=reverse"), + CENT("IncSearch term=reverse,bold,underline cterm=reverse", + "IncSearch term=reverse,bold,underline cterm=reverse gui=reverse"), CENT("ModeMsg term=bold cterm=bold", "ModeMsg term=bold cterm=bold gui=bold"), CENT("NonText term=bold ctermfg=Blue", @@ -326,8 +326,8 @@ static char *(highlight_init_both[]) = { static char *(highlight_init_light[]) = { CENT("Directory term=bold ctermfg=DarkBlue", "Directory term=bold ctermfg=DarkBlue guifg=Blue"), - CENT("LineNr term=underline ctermfg=Brown", - "LineNr term=underline ctermfg=Brown guifg=Brown"), + CENT("LineNr term=NONE ctermfg=Brown", + "LineNr term=NONE ctermfg=Brown guifg=Brown"), CENT("CursorLineNr term=bold cterm=underline ctermfg=Brown", "CursorLineNr term=bold cterm=underline ctermfg=Brown gui=bold guifg=Brown"), CENT("MoreMsg term=bold ctermfg=DarkGreen", @@ -354,8 +354,8 @@ static char *(highlight_init_light[]) = { "Pmenu ctermbg=LightMagenta ctermfg=Black guibg=LightMagenta"), CENT("PmenuSel ctermbg=LightGrey ctermfg=Black", "PmenuSel ctermbg=LightGrey ctermfg=Black guibg=Grey"), - CENT("SpecialKey term=bold ctermfg=DarkBlue", - "SpecialKey term=bold ctermfg=DarkBlue guifg=Blue"), + CENT("SpecialKey term=NONE ctermfg=DarkBlue", + "SpecialKey term=NONE ctermfg=DarkBlue guifg=Blue"), CENT("Title term=bold ctermfg=DarkMagenta", "Title term=bold ctermfg=DarkMagenta gui=bold guifg=Magenta"), CENT("WarningMsg term=standout ctermfg=DarkRed", @@ -417,8 +417,8 @@ static char *(highlight_init_light[]) = { static char *(highlight_init_dark[]) = { CENT("Directory term=bold ctermfg=LightCyan", "Directory term=bold ctermfg=LightCyan guifg=Cyan"), - CENT("LineNr term=underline ctermfg=Yellow", - "LineNr term=underline ctermfg=Yellow guifg=Yellow"), + CENT("LineNr term=NONE ctermfg=Yellow", + "LineNr term=NONE ctermfg=Yellow guifg=Yellow"), CENT("CursorLineNr term=bold cterm=underline ctermfg=Yellow", "CursorLineNr term=bold cterm=underline ctermfg=Yellow gui=bold guifg=Yellow"), CENT("MoreMsg term=bold ctermfg=LightGreen", @@ -427,8 +427,8 @@ static char *(highlight_init_dark[]) = { "Question term=standout ctermfg=LightGreen gui=bold guifg=Green"), CENT("Search term=reverse ctermbg=Yellow ctermfg=Black", "Search term=reverse ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), - CENT("SpecialKey term=bold ctermfg=LightBlue", - "SpecialKey term=bold ctermfg=LightBlue guifg=Cyan"), + CENT("SpecialKey term=NONE ctermfg=LightBlue", + "SpecialKey term=NONE ctermfg=LightBlue guifg=Cyan"), #ifdef FEAT_SPELL CENT("SpellBad term=reverse ctermbg=Red", "SpellBad term=reverse ctermbg=Red guisp=Red gui=undercurl"), diff --git a/src/version.c b/src/version.c index 4195d04c79..0d42fff436 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 826, /**/ 825, /**/ From 6ab1976e49135c0d03b06e3cddd26dc86edff085 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 22 Jul 2026 09:23:31 +0000 Subject: [PATCH 164/647] patch 9.2.0827: :startinsert enters Insert mode in a non-modifiable buffer Problem: ":startinsert" enters Insert mode in a buffer where 'modifiable' is off, the error only appears when a character is typed. Typing "i" gives the error right away (Barrett Ruth) Solution: Give the error when the buffer is not modifiable, like "i" does. Keep ignoring the command in a terminal window, where ":startinsert" is documented to be ineffective, and keep accepting it when 'insertmode' is set, like "i" does (Hirohito Higashi). fixes: #20804 closes: #20806 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/ex_docmd.c | 16 ++++++++---- src/testdir/test_edit.vim | 53 +++++++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 55db2d8d4d..b23504a85b 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -9372,6 +9372,17 @@ ex_normal(exarg_T *eap) static void ex_startinsert(exarg_T *eap) { +#ifdef FEAT_TERMINAL + // Ignore this when running in an active terminal. + if (term_job_running(curbuf->b_term)) + return; +#endif + if (!curbuf->b_p_ma && !p_im) + { + // Only give this error when 'insertmode' is off. + emsg(_(e_cannot_make_changes_modifiable_is_off)); + return; + } if (eap->forceit) { // cursor line can be zero on startup @@ -9379,11 +9390,6 @@ ex_startinsert(exarg_T *eap) curwin->w_cursor.lnum = 1; set_cursor_for_append_to_line(); } -#ifdef FEAT_TERMINAL - // Ignore this when running in an active terminal. - if (term_job_running(curbuf->b_term)) - return; -#endif // Ignore the command when already in Insert mode. Inserting an // expression register that invokes a function can do this. diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index f76b9196fe..ef68d66336 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -1766,10 +1766,50 @@ func Test_edit_startinsert() call feedkeys(":startinsert!\\\", 'xt') call assert_equal('', getline(1)) + call setline(1, 'foobar') + setl nomodifiable + call assert_fails('startinsert', 'E21:') + + call cursor(1, 1) + call assert_fails('startinsert!', 'E21:') + call assert_equal(1, col('.')) + set backspace& bwipe! endfunc +" ":startinsert" is ineffective in a terminal window: it must not give an +" error and with "!" it must not move the cursor. +func Test_edit_startinsert_in_terminal() + CheckFeature terminal + + let buf = Run_shell_in_terminal({}) + + " Fill the terminal with text. + if has('win32') + call feedkeys("dir\", 'xt') + else + call feedkeys("ls\", 'xt') + endif + call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) + + " Go to Terminal-Normal mode and put the cursor on a line with text. + call feedkeys("\N", 'xt') + call assert_notequal(0, search('\S', 'w')) + call cursor(line('.'), 1) + + startinsert + startinsert! + call assert_equal(1, col('.')) + + " Clear "restart_edit" in case the commands were not ignored. + stopinsert + + call feedkeys("i", 'xt') + call StopShellInTerminal(buf) + bwipe! +endfunc + " Test for :startreplace and :startgreplace func Test_edit_startreplace() new @@ -1783,6 +1823,19 @@ func Test_edit_startreplace() call assert_equal("axyz\tb", getline(1)) call feedkeys("0i\=execute('startreplace')\12\e", 'xt') call assert_equal("12axyz\tb", getline(1)) + + call setline(1, 'abc') + setl nomodifiable + call assert_fails('startreplace', 'E21:') + call assert_fails('startgreplace', 'E21:') + + call cursor(1, 1) + call assert_fails('startreplace!', 'E21:') + call assert_equal(1, col('.')) + call cursor(1, 1) + call assert_fails('startgreplace!', 'E21:') + call assert_equal(1, col('.')) + bw! endfunc diff --git a/src/version.c b/src/version.c index 0d42fff436..9c342a6419 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 827, /**/ 826, /**/ From 79a2e3403c70bbe5613bfc9b6554152c3c3e9cdb Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 22 Jul 2026 09:31:53 +0000 Subject: [PATCH 165/647] patch 9.2.0828: GTK4: hardware rendering can be improved Problem: GTK4: hardware rendering can be improved Solution: Refactor code (Foxe Chen) This change does the following: - Make each cell have its own array of glyphs, that represent it. Before glyphs were stored per span of drawn text. - Background color, invert blend is now stored as a single row pixel buffer, that is scaled up to size when rendering. No need to have logic for merging visual attributes together. - Underlines, undercurls, and strikethroughs use a mask outline, and a pixel buffer (similar to the above) that is opaque at parts where there are under decorations. This means having 100 individual undercurls that are all separated by spaces in a row will only result in a single mask node. - Render nodes are cached per row, because creating render nodes are cheap. The actual heavy stuff would be shaping text into glyphs, which are cached per cell. - Use PangoAttrFontFeatures to handle guiligatures option, instead of manually splitting draw calls, which is buggy and complex (some complex unicode characters are not rendered correctly). - Render block cursor separately, this prevents a full redraw of the text for the row the cursor is on (only if glyphs in cell underneath cursor did not change). Complex unicode characters that bleed outside of the cell should look better, since the background is always rendered before all glyphs, meaning they are not clipped off. fixes: #13435 closes: #20674 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.c | 29 +- src/gui_gtk4.c | 103 +- src/gui_gtk4_da.c | 2362 ++++++++++++++++++++++++---------------- src/gui_gtk4_da.h | 15 +- src/netbeans.c | 19 +- src/proto/gui_gtk4.pro | 3 +- src/version.c | 2 + 7 files changed, 1497 insertions(+), 1036 deletions(-) diff --git a/src/gui.c b/src/gui.c index 7b08f786ff..3457c88f13 100644 --- a/src/gui.c +++ b/src/gui.c @@ -24,7 +24,9 @@ static void set_guifontwide(char_u *font_name); static void gui_check_pos(void); static void gui_reset_scroll_region(void); static void gui_outstr(char_u *, int); +#ifndef USE_GTK4_SNAPSHOT static int gui_screenchar(int off, int flags, guicolor_T fg, guicolor_T bg, int back); +#endif static int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T bg, int back); static void gui_delete_lines(int row, int count); static void gui_insert_lines(int row, int count); @@ -1354,13 +1356,28 @@ gui_update_cursor( */ if (!gui.in_focus) { +#ifdef USE_GTK4_SNAPSHOT + gui_gtk4_draw_cursor(cbg, cfg, -1, -1); +#else gui_mch_draw_hollow_cursor(cbg); +#endif return; } +#ifdef USE_GTK4_SNAPSHOT + // Make sure that character underneath is drawn again in case it is part of + // a ligature. + gui_redraw_block(gui.row, gui.col, gui.row, gui.col, GUI_MON_NOCLEAR); + // gui_redraw_block() will invalidate the cursor + gui.cursor_is_valid = true; +#endif + old_hl_mask = gui.highlight_mask; if (shape->shape == SHAPE_BLOCK) { +#ifdef USE_GTK4_SNAPSHOT + gui_gtk4_draw_cursor(cbg, cfg, 0, 0); +#else /* * Draw the text character with the cursor colors. Use the * character attributes plus the cursor attributes. @@ -1368,6 +1385,7 @@ gui_update_cursor( gui.highlight_mask = (cattr | attr); (void)gui_screenchar(LineOffset[gui.row] + gui.col, GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, cfg, cbg, 0); +#endif } else { @@ -1406,15 +1424,18 @@ gui_update_cursor( } #endif } +#ifdef USE_GTK4_SNAPSHOT + gui_gtk4_draw_cursor(cbg, cfg, cur_width, cur_height); +#else gui_mch_draw_part_cursor(cur_width, cur_height, cbg); +#endif #if defined(FEAT_RIGHTLEFT) if (col_off) --gui.col; #endif - // Doesn't seem to work for MSWindows. Not necessary when using - // GtkSnapshot, because everything is drawn in order in the snapshot - // vfunc. + // Doesn't seem to work for MSWindows. We call gui_redraw_block() above + // for GtkSnapshot. #if !defined(FEAT_GUI_MSWIN) && !defined(USE_GTK4_SNAPSHOT) gui.highlight_mask = ScreenAttrs[LineOffset[gui.row] + gui.col]; (void)gui_screenchar(LineOffset[gui.row] + gui.col, @@ -2212,6 +2233,7 @@ gui_outstr(char_u *s, int len) } } +#ifndef USE_GTK4_SNAPSHOT /* * Output one character (may be one or two display cells). * Caller must check for valid "off". @@ -2248,6 +2270,7 @@ gui_screenchar( enc_dbcs ? (*mb_ptr2len)(ScreenLines + off) : 1, flags, fg, bg, back); } +#endif #ifdef FEAT_GUI_GTK /* diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index a194edd760..b29b180d63 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -1439,11 +1439,16 @@ gui_gtk4_update_size(void) } # ifdef FEAT_NETBEANS_INTG - cairo_t * -gui_gtk4_get_multisign_context(int x, int y, int w, int h) + void +gui_gtk4_add_multisign( + cairo_surface_t *surf, + int row, + int col, + int width, + int height) { - return vim_draw_area_get_multisign_cairo( - VIM_DRAW_AREA(gui.drawarea), x, y, w, h); + vim_draw_area_add_multisign(VIM_DRAW_AREA(gui.drawarea), surf, row, col, + width, height); } # endif #else // USE_GTK4_SNAPSHOT @@ -1762,13 +1767,24 @@ gui_mch_insert_lines(int row, int num_lines) gtk_widget_queue_draw(gui.drawarea); } +#if defined(USE_GTK4_SNAPSHOT) || defined(PROTO) +/* + * See vim_draw_area_set_cursor() for more information + */ + void +gui_gtk4_draw_cursor(guicolor_T bg, guicolor_T fg, int w, int h) +{ + gui_mch_set_bg_color(bg); + gui_mch_set_fg_color(fg); + vim_draw_area_set_cursor(VIM_DRAW_AREA(gui.drawarea), w, h); + gtk_widget_queue_draw(gui.drawarea); +} +#endif + +#if !defined(USE_GTK4_SNAPSHOT) || defined(PROTO) void gui_mch_draw_hollow_cursor(guicolor_T color) { -#ifdef USE_GTK4_SNAPSHOT - gui_mch_set_fg_color(color); - vim_draw_area_set_hollow_cursor(VIM_DRAW_AREA(gui.drawarea)); -#else cairo_t *cr; int i = 1; @@ -1788,7 +1804,6 @@ gui_mch_draw_hollow_cursor(guicolor_T color) i * gui.char_width - 1, gui.char_height - 1); cairo_stroke(cr); cairo_destroy(cr); -#endif gtk_widget_queue_draw(gui.drawarea); } @@ -1796,10 +1811,6 @@ gui_mch_draw_hollow_cursor(guicolor_T color) void gui_mch_draw_part_cursor(int w, int h, guicolor_T color) { -#ifdef USE_GTK4_SNAPSHOT - gui_mch_set_fg_color(color); - vim_draw_area_set_part_cursor(VIM_DRAW_AREA(gui.drawarea), w, h); -#else cairo_t *cr; if (gui.surface == NULL) @@ -1818,10 +1829,10 @@ gui_mch_draw_part_cursor(int w, int h, guicolor_T color) w, h); cairo_fill(cr); cairo_destroy(cr); -#endif gtk_widget_queue_draw(gui.drawarea); } +#endif void gui_mch_flash(int msec) @@ -3517,12 +3528,13 @@ gui_mch_destroy_sign(void *sign) * ============================================================ */ +#ifndef USE_GTK4_SNAPSHOT /* * Ligature and text drawing support. * Ported from gui_gtk_x11.c (GTK3) to support 'guiligatures' in GTK4. */ -#define INSERT_PANGO_ATTR(Attribute, AttrList, Start, End) \ +# define INSERT_PANGO_ATTR(Attribute, AttrList, Start, End) \ G_STMT_START{ \ PangoAttribute *tmp_attr_; \ tmp_attr_ = (Attribute); \ @@ -3651,7 +3663,6 @@ setup_zero_width_cluster(PangoItem *item, PangoGlyphInfo *glyph, glyph->geometry.x_offset = -width + MAX(0, width - ink_rect.width) / 2; } -#ifndef USE_GTK4_SNAPSHOT /* * Draw a single glyph string segment: background, foreground, and fake bold. */ @@ -3737,7 +3748,6 @@ draw_under(int flags, int row, int col, int cells, cairo_t *cr) cairo_stroke(cr); } } -#endif /* * Draw a string of characters on the screen. @@ -3757,21 +3767,12 @@ gui_gtk_draw_string_ext( PangoGlyphString *glyphs; int column_offset = 0; int i; -#ifdef USE_GTK4_SNAPSHOT - gboolean s_alloced = FALSE; -#else GdkRectangle area; cairo_t *cr; -#endif - if (gui.text_context == NULL -#ifndef USE_GTK4_SNAPSHOT - || gui.surface == NULL -#endif - ) + if (gui.text_context == NULL || gui.surface == NULL) return len; -#ifndef USE_GTK4_SNAPSHOT // Restrict all drawing to the current screen line. area.x = gui.border_offset; area.y = FILL_Y(row); @@ -3781,7 +3782,6 @@ gui_gtk_draw_string_ext( cr = cairo_create(gui.surface); cairo_rectangle(cr, area.x, area.y, area.width, area.height); cairo_clip(cr); -#endif glyphs = pango_glyph_string_new(); @@ -3806,12 +3806,7 @@ gui_gtk_draw_string_ext( glyphs->log_clusters[i] = i; } -#ifdef USE_GTK4_SNAPSHOT - vim_draw_area_add_glyphs(VIM_DRAW_AREA(gui.drawarea), row, col, len, - flags, gui.ascii_font, glyphs); -#else draw_glyph_string(row, col, len, flags, gui.ascii_font, glyphs, cr); -#endif column_offset = len; } @@ -3827,17 +3822,8 @@ not_ascii:; // Safety check: pango crashes with invalid utf-8. if (!utf_valid_string(s, s + len)) { -#ifdef USE_GTK4_SNAPSHOT - // vim_draw_area_add_glyphs() also handles under decorations. Make - // "str" a string of spaces so that under decorations are still - // applied. - s = g_malloc(len); - memset(s, ' ', len); - s_alloced = TRUE; -#else column_offset = len; goto skipitall; -#endif } cluster_width = PANGO_SCALE * gui.char_width; @@ -3929,14 +3915,8 @@ not_ascii:; } } -#ifdef USE_GTK4_SNAPSHOT - vim_draw_area_add_glyphs(VIM_DRAW_AREA(gui.drawarea), - row, col + column_offset, item_cells, - flags, item->analysis.font, glyphs); -#else draw_glyph_string(row, col + column_offset, item_cells, - flags, item->analysis.font, glyphs, cr); -#endif + flags, item->analysis.font, glyphs, cr); pango_item_free(item); @@ -3946,23 +3926,18 @@ not_ascii:; pango_attr_list_unref(attr_list); } -#ifdef USE_GTK4_SNAPSHOT - if (s_alloced) - g_free(s); -#else skipitall: draw_under(flags, row, col, column_offset, cr); cairo_destroy(cr); -#endif pango_glyph_string_free(glyphs); - if (gui.drawarea != NULL) gtk_widget_queue_draw(gui.drawarea); return column_offset; } +#endif // !USE_GTK4_SNAPSHOT /* * Draw a string of characters on the screen using the current font and colors. @@ -3974,6 +3949,17 @@ not_ascii:; int gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) { +#ifdef USE_GTK4_SNAPSHOT + int cells; + + cells = vim_draw_area_draw_string(VIM_DRAW_AREA(gui.drawarea), + row, col, s, len, flags); + + if (gui.drawarea != NULL) + gtk_widget_queue_draw(gui.drawarea); + + return cells; +#else char_u *conv_buf = NULL; int convlen; int len_sum; @@ -3986,11 +3972,7 @@ gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) int is_utf8; char_u backup_ch; - if (gui.text_context == NULL -#ifndef USE_GTK4_SNAPSHOT - || gui.surface == NULL -#endif - ) + if (gui.text_context == NULL || gui.surface == NULL) return len; if (output_conv.vc_type != CONV_NONE) @@ -4090,6 +4072,7 @@ gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) } vim_free(conv_buf); return len_sum; +#endif } int diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 8db224ea67..4a7211fd70 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -14,83 +14,148 @@ #include #include "gui_gtk4_da.h" -#define DRAW_NODE_DIRTY 1 // Draw node is dirty -#define DRAW_NODE_NOBG 2 // Don't create background node -#define DRAW_NODE_NOINK 4 // Draw node has no ink -#define DRAW_NODE_UNDER 8 // Has under decorations (for convenience) -#define DRAW_NODE_CLIP 16 // Text node should be clipped to draw node bounds. +#ifdef FEAT_IMAGE_GDK +/* + * Struct containing information about an image. This is designed to map well + * with how Vim handles the kitty graphics protocol. + */ typedef struct { - int refcount; - - PangoGlyphInfo *glyphs; - int n_glyphs; - char_u dnode_flags; // DRAW_NODE_* flags - GskRenderNode *node; // This is either a text node, or a container node - // (if there is more than one node). - - PangoFont *font; - GdkRGBA fg_color; - GdkRGBA bg_color; - GdkRGBA sp_color; - int flags; // DRAW_* flags + int id; + int zindex; + GskRenderNode *node; // Cached clip node, which has the texture node as its + // child. May be NULL +} DrawImage; +#endif - int start_col; - int n_cells; -} DrawNode; +#if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SIGN_ICONS) +/* + * Used for sign icons and netbeans multisign indicator. It is in a DrawGlyphs + * so that it can move/be manipulated with the text. + */ +typedef struct +{ + GdkTexture *texture; + int width; + int height; +} DrawSign; +#endif -#define END_COL(dn) ((dn)->start_col + (dn)->n_cells - 1) -#define HAS_INK(r) ((r)->width != 0 || (r)->height != 0) +/* + * Temporary struct when drawing string representing visual attributes of a cell + */ +typedef struct +{ + uint32_t bg_color; + uint32_t fg_color; // Only used for underlines + uint32_t sp_color; + int draw_flags; // DRAW_* flags, only DRAW_UNDERL, DRAW_UNDERC, and + // DRAW_STRIKE are used. +} DrawAttr; /* - * Each cell holds its own reference to a draw node if any. A draw node may span - * multiple cells, which represents how many cells it takes up on screen. + * Represents the glyphs of a single cell. */ typedef struct { - DrawNode *dnode; // May be NULL - gboolean invert; // If this cell is inverted + int refcount; + + uint32_t fg_color; + PangoFont *font; + // If "font" is NULL, "dsign" is used, otherwise "glyphs" is used. + union + { + PangoGlyphInfo *glyphs; // May be NULL +#if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SIGN_ICONS) + DrawSign *dsign; +#endif + }; + int n_glyphs; +} DrawGlyphs; + +typedef struct +{ + DrawGlyphs *dglyphs; } DrawCell; -#ifdef FEAT_IMAGE_GDK +typedef enum +{ + DRAW_LAYER_BACKGROUND, // Background color, buf stores bg color + DRAW_LAYER_TEXT, // Text glyphs + underline, buf stores fg color (for + // underline) + DRAW_LAYER_SPECIAL, // Undercurls and strikethrough, buf store special + // color + DRAW_LAYER_OVERLAY, // Invert blend, buf stores white color + N_DRAW_LAYERS +} DrawLayerType; + +typedef struct +{ + GskRenderNode *node; + gboolean dirty; + + // RGBA buffer, pixel size is number of cells in the row. Note that for the + // special layer, it is twice the size, first part is for undercurl, second + // part for strikethrough. + uint32_t *buf; +} DrawLayer; + +#define UNDERC_OFFSET(n_cols) (0) +#define STRIKE_OFFSET(n_cols) (n_cols) + +typedef struct +{ + DrawLayer dlayers[N_DRAW_LAYERS]; + DrawCell *cells; + int n_cells; // For convenience + int row; // For convenience + + // Pre generated mask of of under decorations + GskRenderNode *underl_mask; + GskRenderNode *underc_mask; + GskRenderNode *strike_mask; +} DrawRow; + +#define INSERT_PANGO_ATTR(Attribute, AttrList, Start, End) \ + do { \ + PangoAttribute *tmp_attr_; \ + tmp_attr_ = (Attribute); \ + tmp_attr_->start_index = (Start); \ + tmp_attr_->end_index = (End); \ + pango_attr_list_insert((AttrList), tmp_attr_); \ + } while (FALSE) +#define CELLS2PANGO(c) ((c) * gui.char_width * PANGO_SCALE) + /* - * Struct containing information about an image. This is designed to map well - * with how Vim handles the kitty graphics protocol. + * Attributes of cursor */ typedef struct { - int id; - int zindex; - GskRenderNode *node; // Cached clip node, which has the texture node as its - // child. May be NULL -} DrawImage; -#endif + gboolean draw; // If cursor should be drawn + int width; + int height; + GdkRGBA bg_color; + GdkRGBA fg_color; +} DrawCursor; struct _VimDrawArea { GtkWidget parent; - DrawCell *cells; // May be NULL, always check! - int n_rows; - int n_cols; + DrawRow *rows; - int bleed_right; + int n_rows; + int n_cols; - // Used for hollow and part style cursors. For the block cursor, that is - // simply rendered as a cell using vim_draw_area_add_glyphs(). May be NULL. - GskRenderNode *cursor_node; + int bleed_right; -#if defined(FEAT_SIGN_ICONS) - // Queue of sign icon render nodes. Icons at the end of the queue are drawn - // ontop of earlier ones. - GQueue *signs; -#endif + // Used for snapshot vfunc call when rendering text, kept around so there is + // no need to allocate a new one each time. + GArray *glyph_buf; + GPtrArray *node_buf; -#ifdef FEAT_NETBEANS_INTG - // Cairo render node for multi sign indicator for Netbeans. May be NULL - GskRenderNode *multisign_node; -#endif + DrawCursor cursor; #ifdef FEAT_IMAGE_GDK // Queue of DrawImage structs. Sorted in ascending order of zindex, so that @@ -99,30 +164,29 @@ struct _VimDrawArea #endif }; -#define GET_ROW(da, n) ((da)->cells + (da)->n_cols * (n)) - -G_DEFINE_TYPE(VimDrawArea, vim_draw_area, GTK_TYPE_WIDGET) - -#ifdef FEAT_IMAGE_GDK static void draw_image_free(DrawImage *dimg); -#endif +static void draw_row_init(DrawRow *drow, int row, int cols); +static void draw_row_clear(DrawRow *drow); +static void draw_row_dirty_layer(DrawRow *drow, DrawLayerType dlayer_t); static void vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot); +static GdkRGBA white_rgba = {1, 1, 1, 1}; + +G_DEFINE_TYPE(VimDrawArea, vim_draw_area, GTK_TYPE_WIDGET) + static void vim_draw_area_finalize(GObject *obj) { VimDrawArea *self = VIM_DRAW_AREA(obj); - // "multisign_node" and "cursor_node" will be freed in - // vim_draw_area_clear_block(). vim_draw_area_clear(self); + for (int r = 0; r < self->n_rows; r++) + draw_row_clear(self->rows + r); + g_free(self->rows); + + g_array_free(self->glyph_buf, TRUE); + g_ptr_array_free(self->node_buf, TRUE); - g_free(self->cells); -#ifdef FEAT_SIGN_ICONS - // vim_draw_area_clear_block() should have removed all the sign icons - assert(g_queue_is_empty(self->signs)); - g_queue_free(self->signs); -#endif #ifdef FEAT_IMAGE_GDK g_queue_free_full(self->images, (GDestroyNotify)draw_image_free); #endif @@ -142,18 +206,19 @@ vim_draw_area_class_init(VimDrawAreaClass *class) // Add a layout manager so it can handle child popovers gtk_widget_class_set_layout_manager_type(widget_class, GTK_TYPE_BIN_LAYOUT); - } static void vim_draw_area_init(VimDrawArea *self) { -#ifdef FEAT_SIGN_ICONS - self->signs = g_queue_new(); -#endif + self->bleed_right = -1; #ifdef FEAT_IMAGE_GDK self->images = g_queue_new(); #endif + self->glyph_buf = g_array_new(FALSE, FALSE, sizeof(PangoGlyphInfo)); + self->node_buf = g_ptr_array_new_with_free_func( + (GDestroyNotify)gsk_render_node_unref); + } GtkWidget * @@ -168,179 +233,730 @@ vim_draw_area_new(void) void vim_draw_area_set_size(VimDrawArea *self, int rows, int cols) { - if (self->cells != NULL && self->n_rows == rows && self->n_cols == cols) + if (self->rows != NULL && self->n_rows == rows && self->n_cols == cols) return; if (rows == 0 || cols == 0) return; vim_draw_area_clear(self); + for (int r = 0; r < self->n_rows; r++) + draw_row_clear(self->rows + r); + self->rows = g_realloc_n(self->rows, rows, sizeof(DrawRow)); + for (int r = 0; r < rows; r++) + draw_row_init(self->rows + r, r, cols); + self->n_rows = rows; self->n_cols = cols; - self->cells = g_realloc_n(self->cells, rows * cols, sizeof(DrawCell)); - memset(self->cells, 0, rows * (sizeof(DrawCell) * cols)); } - static void -node_unref(GskRenderNode *node) +/* + * Convert the GdkRGBA to a packed uint32_t. + */ + static uint32_t +rgba_to_u32(const GdkRGBA *rgba) { - if (node != NULL) - gsk_render_node_unref(node); + union { uint32_t val; uint8_t bytes[4]; } color; + + color.bytes[0] = (uint8_t)(CLAMP(rgba->red, 0.0, 1.0) * 255.0 + 0.5); + color.bytes[1] = (uint8_t)(CLAMP(rgba->green, 0.0, 1.0) * 255.0 + 0.5); + color.bytes[2] = (uint8_t)(CLAMP(rgba->blue, 0.0, 1.0) * 255.0 + 0.5); + color.bytes[3] = (uint8_t)(CLAMP(rgba->alpha, 0.0, 1.0) * 255.0 + 0.5); + + return color.val; +} + +/* + * Convert the 32 bit RGBA value to a GdkRGBA + */ + static GdkRGBA +u32_to_rgba(uint32_t val) +{ + union { uint32_t val; uint8_t bytes[4]; } packed; + GdkRGBA color; + + packed.val = val; + color.red = packed.bytes[0] / 255.0; + color.green = packed.bytes[1] / 255.0; + color.blue = packed.bytes[2] / 255.0; + color.alpha = packed.bytes[3] / 255.0; + return color; } /* - * Return TRUE if "glyphs" take up space (not entirely whitespace). + * Return TRUE if "rgb" equals "rgba", ignoring the alpha channel. */ static gboolean -glyphs_has_ink(PangoFont *font, const PangoGlyphInfo *glyphs, int n_glyphs) +color_equal_u32(guicolor_T rgb, uint32_t rgba) { - for (int i = 0; i < n_glyphs; i++) + union { uint32_t val; uint8_t bytes[4]; } packed; + guicolor_T res; + + packed.val = rgba; + res = ((guicolor_T)packed.bytes[0] << 16) | + ((guicolor_T)packed.bytes[1] << 8) | + packed.bytes[2]; + return res == rgb; +} + +/* + * Checks if a RGBA pixel buffer is fully transparent. + */ + static inline gboolean +rgba_is_transparent(const uint32_t *buf, int n_pixels) +{ + // Could also compare 2 pixels at once using a 64 bit integer, but not sure + // if that might cause alignment issues... + for (int i = 0; i < n_pixels; i++) + if (buf[i] != 0) + return FALSE; + return TRUE; +} + +/* + * Return TRUE if "glyph" has ink (not whitespace). + */ + static gboolean +glyph_has_ink(PangoFont *font, PangoGlyphInfo glyph) +{ + PangoRectangle ink; + + pango_font_get_glyph_extents (font, glyph.glyph, &ink, NULL); + + return ink.width > 0 && ink.height > 0; +} + +/* + * Apply the 'guifontwide' font to double-width characters in the string. + */ + static void +apply_wide_font_attr(char_u *s, int len, PangoAttrList *attr_list) +{ + char_u *start = NULL; + char_u *p; + int uc; + + for (p = s; p < s + len; p += utf_byte2len(*p)) { - PangoRectangle glyph_ink; + uc = utf_ptr2char(p); - pango_font_get_glyph_extents (font, glyphs[i].glyph, &glyph_ink, NULL); + if (start == NULL) + { + if (uc >= 0x80 && utf_char2cells(uc) == 2) + start = p; + } + else if (uc < 0x80 + || (utf_char2cells(uc) != 2 && !utf_iscomposing(uc))) + { + INSERT_PANGO_ATTR(pango_attr_font_desc_new(gui.wide_font), + attr_list, start - s, p - s); + start = NULL; + } + } - if (HAS_INK(&glyph_ink)) - return TRUE; + if (start != NULL) + INSERT_PANGO_ATTR(pango_attr_font_desc_new(gui.wide_font), + attr_list, start - s, len); +} + +/* + * Count the number of display cells occupied by a glyph cluster. + */ + static int +count_cluster_cells( + char_u *s, + PangoItem *item, + PangoGlyphString *glyphs, + int i, + int *cluster_width, + int *last_glyph_rbearing) +{ + char_u *p; + int next; + int start, end; + int width; + int uc; + int cellcount = 0; + + width = glyphs->glyphs[i].geometry.width; + + for (next = i + 1; next < glyphs->num_glyphs; ++next) + { + if (glyphs->glyphs[next].attr.is_cluster_start) + break; + else if (glyphs->glyphs[next].geometry.width > width) + width = glyphs->glyphs[next].geometry.width; } - return FALSE; + + start = item->offset + glyphs->log_clusters[i]; + end = item->offset + ((next < glyphs->num_glyphs) ? + glyphs->log_clusters[next] : item->length); + + for (p = s + start; p < s + end; p += utf_byte2len(*p)) + { + uc = utf_ptr2char(p); + if (uc < 0x80) + ++cellcount; + else if (!utf_iscomposing(uc)) + cellcount += utf_char2cells(uc); + } + + if (last_glyph_rbearing != NULL + && cellcount > 0 && next == glyphs->num_glyphs) + { + PangoRectangle ink_rect; + + pango_font_get_glyph_extents(item->analysis.font, + glyphs->glyphs[i].glyph, + &ink_rect, NULL); + + if (PANGO_RBEARING(ink_rect) > 0) + *last_glyph_rbearing = PANGO_RBEARING(ink_rect); + } + + if (cellcount > 0) + *cluster_width = width; + + return cellcount; } /* - * Realloc "glyphs" to "n_glyphs" and return the new reallocated pointer. + * Handle combining characters that form a zero-width cluster. */ - static PangoGlyphInfo * -glyphs_resize(PangoGlyphInfo *glyphs, int n_glyphs) + static void +setup_zero_width_cluster( + PangoItem *item, + PangoGlyphInfo *glyph, + int last_cellcount, + int last_cluster_width, + int last_glyph_rbearing) { - return g_realloc_n(glyphs, n_glyphs, sizeof(PangoGlyphInfo)); + PangoRectangle ink_rect; + PangoRectangle logical_rect; + int width; + + width = last_cellcount * gui.char_width * PANGO_SCALE; + glyph->geometry.x_offset = -width + MAX(0, width - last_cluster_width) / 2; + glyph->geometry.width = 0; + + pango_font_get_glyph_extents(item->analysis.font, + glyph->glyph, + &ink_rect, &logical_rect); + if (ink_rect.x < 0) + { + glyph->geometry.x_offset += last_glyph_rbearing; + glyph->geometry.y_offset = logical_rect.height + - (gui.char_height - p_linespace) * PANGO_SCALE; + } + else + glyph->geometry.x_offset = -width + MAX(0, width - ink_rect.width) / 2; +} + +#ifdef FEAT_IMAGE_GDK + static void +draw_image_free(DrawImage *dimg) +{ + gsk_render_node_unref(dimg->node); + g_free(dimg); } +#endif + +#if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SIGN_ICONS) /* - * Return TRUE if "bg" is the same as the default background color. + * Create a new draw sign icon with the given texture. */ - static gboolean -color_is_default_bg(const GdkRGBA *bg) + static DrawSign * +draw_sign_new(GdkTexture *texture, int width, int height) { - guicolor_T bgc = ((guicolor_T)(bg->red * 255) << 16) - | ((guicolor_T)(bg->green * 255) << 8) - | (guicolor_T)(bg->blue * 255); - return bgc == gui.back_pixel; + DrawSign *dsign = g_new0(DrawSign, 1); + + dsign->texture = g_object_ref(texture); + dsign->width = width; + dsign->height = height; + + return dsign; +} + + static void +draw_sign_free(DrawSign *dsign) +{ + g_object_unref(dsign->texture); + g_free(dsign); +} +#endif + + static void +draw_attr_init( + DrawAttr *dattr, + const GdkRGBA *bg_color, + const GdkRGBA *fg_color, + const GdkRGBA *sp_color, + int draw_flags) +{ + dattr->bg_color = rgba_to_u32(bg_color); + dattr->fg_color = rgba_to_u32(fg_color); + dattr->sp_color = rgba_to_u32(sp_color); + dattr->draw_flags = draw_flags & (DRAW_UNDERL | DRAW_UNDERC | DRAW_STRIKE); } /* - * Convert the given cell offset into an index in the "glyphs" array. + * Apply the draw attr to the row for the given col/cell. Only dirty layers that + * have actually changed. */ - static int -cell_offset_to_glyph(const PangoGlyphInfo *glyphs, int n_glyphs, int cell_offset) + static void +draw_attr_apply(DrawAttr *dattr, int col, DrawRow *drow) { - int cells_seen = 0; + uint32_t *bg_cell = drow->dlayers[DRAW_LAYER_BACKGROUND].buf + col; + uint32_t *text_cell = drow->dlayers[DRAW_LAYER_TEXT].buf + col; + uint32_t *underc_cell; + uint32_t *strike_cell; + uint32_t fg_color = 0, bg_color = 0, sp_color = 0; + int draw_flags = 0; + gboolean bg_is_default = TRUE; + + underc_cell = drow->dlayers[DRAW_LAYER_SPECIAL].buf + + col + UNDERC_OFFSET(drow->n_cells); + strike_cell = drow->dlayers[DRAW_LAYER_SPECIAL].buf + + col + STRIKE_OFFSET(drow->n_cells); + + // If "dattr" is NULL, then make the pixels transparent. + if (dattr != NULL) + { + fg_color = dattr->fg_color; + bg_color = dattr->bg_color; + sp_color = dattr->sp_color; + draw_flags = dattr->draw_flags; + bg_is_default = color_equal_u32(gui.back_pixel, bg_color); + } - for (int i = 0; i < n_glyphs; i++) + if (*bg_cell != bg_color && !(*bg_cell == 0 && bg_is_default)) { - const PangoGlyphInfo *glyph = glyphs + i; + draw_row_dirty_layer(drow, DRAW_LAYER_BACKGROUND); - if (cells_seen >= cell_offset) - return i; + // If "bg_color" is same as global background color, then use + // transparent color. + if (bg_is_default) + *bg_cell = 0; + else + *bg_cell = bg_color; + } + if ((draw_flags & DRAW_UNDERL && *text_cell != fg_color) + || (!(draw_flags & DRAW_UNDERL) && *text_cell != 0)) + { + draw_row_dirty_layer(drow, DRAW_LAYER_TEXT); + if (draw_flags & DRAW_UNDERL) + *text_cell = fg_color; + else + *text_cell = 0; + } + if ((draw_flags & DRAW_UNDERC && *underc_cell != sp_color) + || (!(draw_flags & DRAW_UNDERC) && *underc_cell != 0)) + { + draw_row_dirty_layer(drow, DRAW_LAYER_SPECIAL); + if (draw_flags & DRAW_UNDERC) + *underc_cell = sp_color; + else + *underc_cell = 0; + } + if ((draw_flags & DRAW_STRIKE && *strike_cell != sp_color) + || (!(draw_flags & DRAW_STRIKE) && *strike_cell != 0)) + { + draw_row_dirty_layer(drow, DRAW_LAYER_SPECIAL); + if (draw_flags & DRAW_STRIKE) + *strike_cell = sp_color; + else + *strike_cell = 0; + } +} - cells_seen += glyph->geometry.width / (gui.char_width * PANGO_SCALE); + static DrawGlyphs * +draw_glyphs_new( + PangoFont *font, + PangoGlyphInfo *glyphs, + int n_glyphs, + uint32_t fg_color) +{ + DrawGlyphs *dglyphs = g_new0(DrawGlyphs, 1); + + dglyphs->refcount = 1; + dglyphs->font = g_object_ref(font); + dglyphs->glyphs = g_memdup2(glyphs, sizeof(*glyphs) * n_glyphs); + dglyphs->n_glyphs = n_glyphs; + dglyphs->fg_color = fg_color; + + return dglyphs; +} + +#if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SIGN_ICONS) +/* + * Create a new draw glyphs that shows the given sign. Note that ownership of + * "dsign" is taken. + */ + static DrawGlyphs * +draw_glyphs_new_sign(DrawSign *dsign) +{ + DrawGlyphs *dglyphs = g_new0(DrawGlyphs, 1); + + dglyphs->refcount = 1; + dglyphs->dsign = dsign; + + return dglyphs; +} +#endif + + static DrawGlyphs * +draw_glyphs_ref(DrawGlyphs *dglyphs) +{ + dglyphs->refcount++; + return dglyphs; +} + + static void +draw_glyphs_unref(DrawGlyphs *dglyphs) +{ + if (--dglyphs->refcount <= 0) + { +#if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SIGN_ICONS) + if (dglyphs->font == NULL) + draw_sign_free(dglyphs->dsign); + else +#endif + { + g_free(dglyphs->glyphs); + g_object_unref(dglyphs->font); + } + g_free(dglyphs); } - return n_glyphs; } /* - * Create a new under decoration node with the given flags. Returns NULL if no - * under decorations are needed. + * Return TRUE if "a" and "b" are same. If either are NULL, return FALSE, if + * both are NULL, return TRUE. + */ + static gboolean +draw_glyphs_same(DrawGlyphs *a, DrawGlyphs *b) +{ + if (a == NULL && b == NULL) + return TRUE; + if (a == NULL || b == NULL) + return FALSE; + if (a->fg_color != b->fg_color) + return FALSE; + if (a->n_glyphs != b->n_glyphs || a->font != b->font) + return FALSE; + for (int i = 0; i < a->n_glyphs; i++) + if (a->glyphs[i].glyph != b->glyphs[i].glyph + || a->glyphs[i].geometry.width != b->glyphs[i].geometry.width + || a->glyphs[i].geometry.x_offset != b->glyphs[i].geometry.x_offset + || a->glyphs[i].geometry.y_offset != b->glyphs[i].geometry.y_offset + || a->glyphs[i].attr.is_cluster_start != b->glyphs[i].attr.is_cluster_start) + return FALSE; + return TRUE; +} + +/* + * Convert the buffer for the given layer to a texture node, scaled up to the + * correct size. "off" is the pixel offset in the buffer to start from, and + * "bleed" is TRUE, then expand the buffer by 1 cell (clipped by draw area + * width), using the color of the rightmost cell. */ static GskRenderNode * -create_under_decor_node( - int row, - int start_col, - int n_cells, - int flags, - const GdkRGBA *fg_color, - const GdkRGBA *sp_color) +draw_layer_get_texture( + DrawLayer *dlayer, + int row, + VimDrawArea *da, + int off, + gboolean bleed) { - GskRenderNode *nodes[3]; - int n_nodes = 0; - GskRenderNode *container; + GBytes *bytes; + GdkTexture *texture; + GskRenderNode *node; + + if (bleed) + { + GByteArray *arr = g_byte_array_new(); + + g_byte_array_append(arr, (uint8_t *)(dlayer->buf + off), + sizeof(uint32_t) * da->n_cols); + g_byte_array_append(arr, + (uint8_t *)(dlayer->buf + off + (da->n_cols - 1)), + sizeof(uint32_t)); // Add bleed using last pixel of buffer + bytes = g_byte_array_free_to_bytes(arr); + } + else + bytes = g_bytes_new(dlayer->buf + off, sizeof(uint32_t) * da->n_cols); + + texture = gdk_memory_texture_new(da->n_cols + bleed, 1, + GDK_MEMORY_R8G8B8A8, bytes, (da->n_cols + bleed) * 4); + g_bytes_unref(bytes); + + // Scale texture to actual size + node = gsk_texture_scale_node_new(texture, + &GRAPHENE_RECT_INIT(FILL_X(0), FILL_Y(row), + (da->n_cols + bleed) * gui.char_width, gui.char_height), + GSK_SCALING_FILTER_NEAREST); + if (bleed) + { + GskRenderNode *new; + + new = gsk_clip_node_new(node, + &GRAPHENE_RECT_INIT(FILL_X(0), FILL_Y(row), + da->n_cols * gui.char_width + da->bleed_right, + gui.char_height)); + gsk_render_node_unref(node); + node = new; + } + g_object_unref(texture); + return node; +} + + static void +draw_row_init(DrawRow *drow, int row, int cols) +{ + drow->cells = g_malloc0_n(cols, sizeof(DrawCell)); + drow->n_cells = cols; + drow->row = row; + drow->underl_mask = drow->underc_mask = drow->strike_mask = NULL; + + memset(drow->dlayers, 0, sizeof(DrawLayer) * N_DRAW_LAYERS); + for (int l = 0; l < N_DRAW_LAYERS; l++) + { + DrawLayer *dlayer = drow->dlayers + l; + + // Make the buffer transparent initially + if (l == DRAW_LAYER_SPECIAL) + dlayer->buf = g_malloc0_n(cols * 2, 4); + else + dlayer->buf = g_malloc0_n(cols, 4); + } +} + + static void +draw_row_clear(DrawRow *drow) +{ + g_free(drow->cells); + for (int l = 0; l < N_DRAW_LAYERS; l++) + { + DrawLayer *dlayer = drow->dlayers + l; + + if (dlayer->node != NULL) + gsk_render_node_unref(dlayer->node); + g_free(dlayer->buf); + } + g_clear_pointer(&drow->underl_mask, gsk_render_node_unref); + g_clear_pointer(&drow->underc_mask, gsk_render_node_unref); + g_clear_pointer(&drow->strike_mask, gsk_render_node_unref); +} + +/* + * Dirty the given layer for the row so it is rendered again. + */ + static void +draw_row_dirty_layer(DrawRow *drow, DrawLayerType dlayer_t) +{ + DrawLayer *dlayer = drow->dlayers + dlayer_t; + + dlayer->dirty = TRUE; + g_clear_pointer(&dlayer->node, gsk_render_node_unref); +} + +/* + * If the cell at "col" is inverted, then uninvert and set the layer as dirty. + * Otherwise do nothing. + */ + static void +draw_row_uninvert_cell(DrawRow *drow, int col) +{ + uint32_t *buf = drow->dlayers[DRAW_LAYER_OVERLAY].buf; + + // If pixel is white, then it is inverted. + if (buf[col] == 0xffffffff) + { + draw_row_dirty_layer(drow, DRAW_LAYER_OVERLAY); + buf[col] = 0; + } +} + +/* + * Set the cell in the row to the glyphs and attrs (that represents the cell). + * This will dirty the changed layers of the row. + */ + static void +draw_row_set_cell(DrawRow *drow, int col, DrawGlyphs *dglyphs, DrawAttr *dattr) +{ + DrawCell *dcell = drow->cells + col; + + if (!draw_glyphs_same(dglyphs, dcell->dglyphs)) + draw_row_dirty_layer(drow, DRAW_LAYER_TEXT); + + // When drawing double width characters in the snapshot vfunc, pointer + // equality of the DrawGlyphs is used. Must make sure to always keep the + // pointer in sync, even if glyphs are technically the "same". + if (dcell->dglyphs != dglyphs) + { + if (dcell->dglyphs != NULL) + draw_glyphs_unref(dcell->dglyphs); + dcell->dglyphs = dglyphs == NULL ? NULL : draw_glyphs_ref(dglyphs); + } + + draw_attr_apply(dattr, col, drow); + draw_row_uninvert_cell(drow, col); +} + +/* + * Same as draw_row_set_cell(), but fills in the cells between "col1" and "col2" + * (inclusive). + */ + static void +draw_row_fill( + DrawRow *drow, + int col1, + int col2, + DrawGlyphs *dglyphs, + DrawAttr *dattr, + DrawCursor *cursor) +{ + for (int c = col1; c <= col2; c++) + draw_row_set_cell(drow, c, dglyphs, dattr); + + // Clear cursor if its in the region + if (gui.cursor_row == drow->row && gui.cursor_col >= col1 + && gui.cursor_col <= col2) + cursor->draw = FALSE; +} - if (flags & DRAW_UNDERL) - nodes[n_nodes++] = gsk_color_node_new(fg_color, - &GRAPHENE_RECT_INIT(FILL_X(start_col), - FILL_Y(row + 1) - 1, - FILL_X(start_col + n_cells) - FILL_X(start_col), 1)); +/* + * Move the cells between "col1" and "col2" from "src" to "dest", overwriting + * the existing cells. This will clear the source cells. + */ + static void +draw_row_move_to( + DrawRow *dest_row, + DrawRow *src_row, + int col1, + int col2, + VimDrawArea *da) +{ + int move_size = (col2 - col1 + 1) * sizeof(DrawCell); - if (flags & DRAW_STRIKE) - nodes[n_nodes++] = gsk_color_node_new(fg_color, - &GRAPHENE_RECT_INIT(FILL_X(start_col), - FILL_Y(row) + (int)(gui.char_height / 2), - FILL_X(start_col + n_cells) - FILL_X(start_col), 1)); + draw_row_fill(dest_row, col1, col2, NULL, NULL, &da->cursor); + memmove(dest_row->cells + col1, src_row->cells + col1, move_size); + // NULL the draw cells so we don't double unreference. + memset(src_row->cells + col1, 0, move_size); + draw_row_dirty_layer(src_row, DRAW_LAYER_TEXT); - if (flags & DRAW_UNDERC) + // Move the layer buffers + move_size = (col2 - col1 + 1) * 4; + for (int l = 0; l < N_DRAW_LAYERS; l++) + { + uint32_t *src = src_row->dlayers[l].buf; + uint32_t *dest = dest_row->dlayers[l].buf; + + if (l == DRAW_LAYER_SPECIAL) + { + memmove(dest + col1 + UNDERC_OFFSET(dest_row->n_cells), + src + col1 + UNDERC_OFFSET(src_row->n_cells), move_size); + memmove(dest + col1 + STRIKE_OFFSET(dest_row->n_cells), + src + col1 + STRIKE_OFFSET(src_row->n_cells), move_size); + } + else + memmove(dest + col1, src + col1, move_size); + draw_row_dirty_layer(dest_row, l); + } +} + +/* + * If background layer is dirty, then render it. + */ + static void +draw_row_render_background(DrawRow *drow, VimDrawArea *da) +{ + DrawLayer *dlayer = drow->dlayers + DRAW_LAYER_BACKGROUND; + + if (!dlayer->dirty) + return; + + dlayer->dirty = FALSE; + + // If background is transparent, don't add a render node. + if (rgba_is_transparent(dlayer->buf, da->n_cols)) + return; + + // Add a 1 cell bleed, then use a clip node to clip it to the draw area + // width. This just makes things like status bars look a bit nicer when draw + // area size is not an exact multiple of the cell size. + dlayer->node = draw_layer_get_texture(dlayer, drow->row, da, 0, TRUE); +} + +/* + * Ensure the given under decorations are generated. + */ + static void +draw_row_ensure_decor(DrawRow *drow, int flags) +{ + if (flags & DRAW_UNDERL && drow->underl_mask == NULL) + drow->underl_mask = gsk_color_node_new(&white_rgba, + &GRAPHENE_RECT_INIT(FILL_X(0), FILL_Y(drow->row + 1) - 1, + FILL_X(drow->n_cells), 1)); + + if (flags & DRAW_STRIKE && drow->strike_mask == NULL) + drow->strike_mask = gsk_color_node_new(&white_rgba, + &GRAPHENE_RECT_INIT(FILL_X(0), + FILL_Y(drow->row) + (int)(gui.char_height / 2), + FILL_X(drow->n_cells), 1)); + + if (flags & DRAW_UNDERC && drow->underc_mask == NULL) { - int y = FILL_Y(row + 1) - 1; // Top of underneath line, - // upwards by one pixel. - int x_start = FILL_X(start_col); - int x_end = FILL_X(start_col + n_cells); + static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2}; + + int y = FILL_Y(drow->row + 1) - 1; + int x_start = FILL_X(0); + int x_end = FILL_X(drow->n_cells); // GskPath was added in GSK 4.14, otherwise use cairo #if GTK_CHECK_VERSION(4, 14, 0) GskPathBuilder *builder; GskPath *path; - GskStroke *stroke; + GskStroke *stroke; GskRenderNode *color_node; graphene_rect_t bounds; - const int half_wave = 4; // Half-cycle width (e.g., 4px up, 4px - // down) - const int amplitude = 2; // Peak height from baseline - int toggle = -1; // Start by pulling up (-Y is up in GTK) - builder = gsk_path_builder_new(); - gsk_path_builder_move_to(builder, x_start, y); - // Each cycle contains two quadratic bezier curves, one going up and one - // going down. - for (int x = x_start; x < x_end; x += half_wave) - { - int current_half = half_wave; - if (x + current_half > x_end) - { - current_half = x_end - x; - } - - // The control point sits exactly halfway horizontally through the arc - int cp_x = x + (current_half / 2); - int cp_y = y + (toggle * amplitude); - int end_x = x + current_half; + gsk_path_builder_move_to(builder, + x_start + 1, + y - 2 + 0.5); - gsk_path_builder_quad_to(builder, cp_x, cp_y, end_x, y); + for (int i = x_start + 1; i < x_end; i++) + { + int offset = val[i % 8]; - toggle = -toggle; // Flip direction for the next half-wave + gsk_path_builder_line_to(builder, + i, y - offset + 0.5); } path = gsk_path_builder_free_to_path(builder); - stroke = gsk_stroke_new(1.0f); + + stroke = gsk_stroke_new(1.0); gsk_path_get_stroke_bounds (path, stroke, &bounds); - color_node = gsk_color_node_new(sp_color, &bounds); + color_node = gsk_color_node_new(&white_rgba, &bounds); - nodes[n_nodes++] = gsk_stroke_node_new(color_node, path, stroke); + drow->underc_mask = gsk_stroke_node_new(color_node, path, stroke); gsk_stroke_free(stroke); gsk_path_unref(path); gsk_render_node_unref(color_node); #else - static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2}; - cairo_t *cr; - GskRenderNode *node; + cairo_t *cr; + GskRenderNode *node; node = gsk_cairo_node_new( &GRAPHENE_RECT_INIT(x_start, y - 3, x_end - x_start, 5)); cr = gsk_cairo_node_get_draw_context(node); cairo_set_line_width(cr, 1.0); - cairo_set_source_rgba(cr, sp_color->red, sp_color->green, - sp_color->blue, sp_color->alpha); + cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); cairo_move_to(cr, x_start + 1, y - 2 + 0.5); @@ -352,656 +968,533 @@ create_under_decor_node( cairo_stroke(cr); cairo_destroy(cr); - nodes[n_nodes++] = node; + drow->underc_mask = node; #endif } - - if (n_nodes == 0) - return NULL; - if (n_nodes == 1) - return nodes[0]; - - container = gsk_container_node_new(nodes, n_nodes); - for (int i = 0; i < n_nodes; i++) - // Container node takes its own reference to each. - gsk_render_node_unref(nodes[i]); - return container; } /* - * Create a new draw node with a reference count of 1. Note that this may be - * NULL if creating a new draw node is not necessary. + * If the text layer of the draw row is dirty, then render it and set the render + * node. Note that the render node may still be NULL if there is nothing to + * display. */ - static DrawNode * -draw_node_new( - PangoFont *font, - const PangoGlyphInfo *glyphs, - int n_glyphs, - const GdkRGBA *bg_color, - const GdkRGBA *fg_color, - const GdkRGBA *sp_color, - int flags, - int start_col, - int n_cells) -{ - DrawNode *dnode; - gboolean has_ink = glyphs_has_ink(font, glyphs, n_glyphs); - gboolean is_def_bg = color_is_default_bg(bg_color); - gboolean has_under = flags & (DRAW_UNDERL | DRAW_UNDERC | DRAW_STRIKE); - - // If there is no ink to be displayed, and the background color is the same - // as the default background color (the color that will be displayed behind - // everything), then there is no point in creating a new draw node. - if (!has_ink && !has_under && (flags & DRAW_TRANSP || is_def_bg)) - return NULL; - - dnode = g_new0(DrawNode, 1); - - dnode->refcount = 1; - - dnode->glyphs = g_memdup2(glyphs, sizeof(PangoGlyphInfo) * n_glyphs); - dnode->n_glyphs = n_glyphs; - dnode->dnode_flags |= DRAW_NODE_DIRTY; - if (is_def_bg || flags & DRAW_TRANSP) - dnode->dnode_flags |= DRAW_NODE_NOBG; - if (!has_ink) - dnode->dnode_flags |= DRAW_NODE_NOINK; - if (has_under) - dnode->dnode_flags |= DRAW_NODE_UNDER; - - dnode->font = g_object_ref(font); - dnode->bg_color = *bg_color; - dnode->fg_color = *fg_color; - dnode->sp_color = *sp_color; - dnode->flags = flags; - - dnode->start_col = start_col; - dnode->n_cells = n_cells; - - return dnode; -} - - static DrawNode * -draw_node_ref(DrawNode *dnode) -{ - dnode->refcount++; - return dnode; -} - static void -draw_node_unref(DrawNode *dnode) +draw_row_render_text(DrawRow *drow, VimDrawArea *da) { - if (dnode != NULL && --dnode->refcount <= 0) - { - g_free(dnode->glyphs); - node_unref(dnode->node); - g_object_unref(dnode->font); - g_free(dnode); - } -} - -/* - * Dirty the draw node. This will remove the render node if any, and mark it to - * have a new render node created for it on the next snapshot vfunc call. - * Returns TRUE if draw node is not necessary anymore. - */ - static gboolean -draw_node_make_dirty(DrawNode *dnode) -{ - int flags = dnode->dnode_flags; - - g_clear_pointer(&dnode->node, gsk_render_node_unref); - dnode->dnode_flags |= DRAW_NODE_DIRTY; - - return (flags & DRAW_NODE_NOINK) && !(flags & (DRAW_NODE_UNDER)) - && flags & DRAW_NODE_NOBG; -} - - static DrawNode * -draw_node_copy(DrawNode *dnode) -{ - DrawNode *copy = draw_node_new( - dnode->font, dnode->glyphs, dnode->n_glyphs, - &dnode->bg_color, &dnode->fg_color, &dnode->sp_color, - dnode->flags, dnode->start_col, dnode->n_cells - ); + DrawLayer *dlayer = drow->dlayers + DRAW_LAYER_TEXT; + GArray *glyph_buf; + GPtrArray *nodes; + PangoFont *cur_font = NULL; + int start_col = 0; + int empty_cells = 0; + uint32_t cur_fg = 0; + int c; + + if (!dlayer->dirty) + return; - // "copy" should never be NULL, so we don't need to check for NULL. - if (unlikely(dnode->dnode_flags & DRAW_NODE_CLIP)) - copy->dnode_flags |= DRAW_NODE_CLIP; + glyph_buf = da->glyph_buf; + nodes = da->node_buf; + + g_array_set_size(glyph_buf, 0); + g_ptr_array_set_size(nodes, 0); + + // GskTextNode does not use the "log_clusters" array of PangoGlyphString, so + // we don't need to set it. +#define FLUSH_NODE() \ + do { \ + if (cur_font != NULL) \ + { \ + PangoGlyphString glyph_str; \ + GskRenderNode *node; \ + GdkRGBA fg_color = u32_to_rgba(cur_fg); \ + glyph_str.glyphs = (PangoGlyphInfo *)glyph_buf->data; \ + glyph_str.num_glyphs = glyph_buf->len; \ + node = gsk_text_node_new(cur_font, &glyph_str, &fg_color, \ + &GRAPHENE_POINT_INIT(TEXT_X(start_col), \ + TEXT_Y(drow->row))); \ + if (node != NULL) \ + g_ptr_array_add(nodes, node); \ + g_array_set_size(glyph_buf, 0); \ + cur_font = NULL; \ + } \ + } while (FALSE) + + for (c = 0; c < da->n_cols; c++) + { + DrawCell *dcell = drow->cells + c; + DrawGlyphs *dglyphs = dcell->dglyphs; + int prev_len; - return copy; -} + if (dglyphs == NULL) + { + empty_cells++; + continue; + } + else if (dglyphs->font == NULL) + { + // Add sign icon + GskRenderNode *snode; + int w; + + FLUSH_NODE(); + + snode = gsk_texture_scale_node_new(dglyphs->dsign->texture, + &GRAPHENE_RECT_INIT(FILL_X(c), FILL_Y(drow->row), + dglyphs->dsign->width, dglyphs->dsign->height), + GSK_SCALING_FILTER_TRILINEAR); + w = (dglyphs->dsign->width + gui.char_width - 1) / gui.char_width; + + if (snode != NULL) + g_ptr_array_add(nodes, snode); + // Skip the cells the draw sign covers. + c += w - 1; // Subtract one because we increment by one in the for + // loop + continue; + } + else if (dglyphs->font != cur_font || cur_fg != dglyphs->fg_color) + { + FLUSH_NODE(); + cur_font = dglyphs->font; + start_col = c; + cur_fg = dglyphs->fg_color; + } -/* - * Split the draw node at the given cell offset in place (exclusive). If - * "keep_left" is TRUE, then keep the left halve (discard right halve), and vice - * versa. This will dirty the draw node. - * - * Returns TRUE if the new split draw node is not necessary anymore (see - * draw_node_new()), otherwise FALSE. - */ - static gboolean -draw_node_split(DrawNode *dnode, int cell_offset, gboolean keep_left) -{ - int glyph_offset; - gboolean split = TRUE; - gboolean clip = FALSE; - - glyph_offset = cell_offset_to_glyph(dnode->glyphs, - dnode->n_glyphs, cell_offset); - - // Some fonts emulate ligatures by having spacer glyphs followed by a glyph - // that contains all the ink. If we tried splitting this type of ligature, - // then one side will incorrectly be empty. - // - // To handle this case, always clip the draw node so that the extra ink does - // not bleed out. If we are keeping the left side, then do not split, - // because we want to keep the glyph with all the ink. If we are keeping the - // right side, then we can split because the glyph with the ink will be on - // the right side always anyways. - for (int i = glyph_offset; i < dnode->n_glyphs; i++) - { - PangoRectangle ink; + // Don't want to render double width characters twice. + if (c > 0 && drow->cells[c - 1].dglyphs == dglyphs) + continue; - pango_font_get_glyph_extents(dnode->font, dnode->glyphs[i].glyph, - &ink, NULL); + prev_len = glyph_buf->len; + g_array_append_vals(glyph_buf, dglyphs->glyphs, dglyphs->n_glyphs); - if (HAS_INK(&ink)) + // Inject the accumulated space width into the glyphs that + // have ink. + if (empty_cells > 0) { - if (ink.x < 0) + if (prev_len > 0) { - split = !keep_left; - clip = TRUE; + // Spaces occurred between valid text: extend + // previous character's advance + PangoGlyphInfo *last = &g_array_index( + glyph_buf, PangoGlyphInfo, + prev_len - 1); + last->geometry.width += CELLS2PANGO(empty_cells); } - break; + empty_cells = 0; // Width consumed } } - if (unlikely(clip)) - dnode->dnode_flags |= DRAW_NODE_CLIP; + FLUSH_NODE(); - if (keep_left) - { - if (likely(split)) - dnode->n_glyphs = glyph_offset; - dnode->n_cells = cell_offset; - } - else +#undef FLUSH_NODE + + if (nodes->len > 0) { - if (likely(split)) + // Add underline mask (if needed). + GskRenderNode *source; + GskRenderNode *node; + + draw_row_ensure_decor(drow, DRAW_UNDERL); + if (!rgba_is_transparent(dlayer->buf, drow->n_cells)) { - // If this results in zero, then glyphs_has_ink() will return FALSE - // so it is fine. - dnode->n_glyphs -= glyph_offset; - // Shift glyphs after offset to beginning - memmove(dnode->glyphs, dnode->glyphs + glyph_offset, - sizeof(PangoGlyphInfo) * dnode->n_glyphs); + source = draw_layer_get_texture(dlayer, drow->row, da, 0, FALSE); + node = gsk_mask_node_new(source, drow->underl_mask, + GSK_MASK_MODE_ALPHA); + gsk_render_node_unref(source); + g_ptr_array_add(nodes, node); } - dnode->n_cells -= cell_offset; - dnode->start_col += cell_offset; - } - - if (likely(split)) - { - dnode->glyphs = glyphs_resize(dnode->glyphs, dnode->n_glyphs); - - // Recheck if new split glyphs has ink - if (glyphs_has_ink(dnode->font, dnode->glyphs, dnode->n_glyphs)) - dnode->dnode_flags &= ~DRAW_NODE_NOINK; - else - dnode->dnode_flags |= DRAW_NODE_NOINK; + dlayer->node = gsk_container_node_new( + (GskRenderNode **)nodes->pdata, nodes->len); } - - return draw_node_make_dirty(dnode); + dlayer->dirty = FALSE; } /* - * If "dnode" is dirty, create a new render node for it at the given row and - * store it, then undirty it. + * Render undercurl and strikethough, which use the special colour. */ static void -draw_node_render(DrawNode *dnode, int row, VimDrawArea *da) +draw_row_render_special(DrawRow *drow, VimDrawArea *da) { - GskRenderNode *nodes[3]; - int n_nodes = 0; - GskRenderNode *decor_node; + DrawLayer *dlayer = drow->dlayers + DRAW_LAYER_SPECIAL; + GskRenderNode *source; + GskRenderNode *nodes[2]; + int n_nodes = 0; - if (!(dnode->dnode_flags & DRAW_NODE_DIRTY)) + if (!dlayer->dirty) return; - if (!(dnode->dnode_flags & DRAW_NODE_NOBG)) - { - int width = dnode->n_cells * gui.char_width; + draw_row_ensure_decor(drow, DRAW_UNDERC | DRAW_STRIKE); - // If this draw node touches the end of the draw area. Bleed its - // background to the right if the space the draw area covers is slightly - // bigger than its actual visible area (that all cells cover). This just - // makes things like status bars look a bit nicer - // - // Don't do this for the bottom, because that will make the cursor in - // the cmdline look weird. Instead only bleed downwards when drawing the - // global background color (see vim_draw_area_snapshot()) - if (END_COL(dnode) == da->n_cols - 1) - width += gui.bleed_right; - - nodes[n_nodes++] = gsk_color_node_new(&dnode->bg_color, - &GRAPHENE_RECT_INIT(FILL_X(dnode->start_col), FILL_Y(row), - width, gui.char_height)); + if (!rgba_is_transparent(dlayer->buf + UNDERC_OFFSET(drow->n_cells), + drow->n_cells)) + { + source = draw_layer_get_texture(dlayer, drow->row, da, + UNDERC_OFFSET(drow->n_cells), FALSE); + nodes[n_nodes++] = gsk_mask_node_new(source, drow->underc_mask, + GSK_MASK_MODE_ALPHA); + gsk_render_node_unref(source); } - if (!(dnode->dnode_flags & DRAW_NODE_NOINK)) + if (!rgba_is_transparent(dlayer->buf + STRIKE_OFFSET(drow->n_cells), + drow->n_cells)) { - GskRenderNode *text_node; - PangoGlyphString glyphs_str; - - // gsk_text_node_new() only uses the "glyphs" field, don't need to worry - // about the "log_clusters" array. - glyphs_str.glyphs = dnode->glyphs; - glyphs_str.num_glyphs = dnode->n_glyphs; - text_node = gsk_text_node_new(dnode->font, &glyphs_str, &dnode->fg_color, - &GRAPHENE_POINT_INIT(TEXT_X(dnode->start_col), TEXT_Y(row))); - // Should never be NULL since we check beforehand if there is ink. - assert(text_node != NULL); - - if (dnode->dnode_flags & DRAW_NODE_CLIP) - { - GskRenderNode *old = text_node; - - text_node = gsk_clip_node_new(text_node, - &GRAPHENE_RECT_INIT(FILL_X(dnode->start_col), FILL_Y(row), - dnode->n_cells * gui.char_width, gui.char_height)); - gsk_render_node_unref(old); - assert(text_node != NULL); - } - - nodes[n_nodes++] = text_node; + source = draw_layer_get_texture(dlayer, drow->row, da, + STRIKE_OFFSET(drow->n_cells), FALSE); + nodes[n_nodes++] = gsk_mask_node_new(source, drow->strike_mask, + GSK_MASK_MODE_ALPHA); + gsk_render_node_unref(source); } - decor_node = create_under_decor_node(row, dnode->start_col, dnode->n_cells, - dnode->flags, &dnode->fg_color, &dnode->sp_color); - if (decor_node != NULL) - nodes[n_nodes++] = decor_node; - - // Should never be zero - assert(n_nodes > 0); - - if (likely(n_nodes == 1)) - dnode->node = nodes[0]; - else + if (n_nodes == 1) + { + dlayer->node = nodes[0]; + } + else if (n_nodes > 0) { - dnode->node = gsk_container_node_new(nodes, n_nodes); - // gsk_container_node_new() takes its own reference - for (int i = 0; i < n_nodes; i++) + dlayer->node = gsk_container_node_new(nodes, 2); + // gsk_container_node_new() takes its own ref + for (int i = 0; i < ARRAY_LENGTH(nodes); i++) gsk_render_node_unref(nodes[i]); } - dnode->dnode_flags &= ~DRAW_NODE_DIRTY; + dlayer->dirty = FALSE; } /* - * Returns true if "dnode" matches "font" + "flags" in terms of - * color/visual attributes. + * Render white color blocks used for blend to invert cells. */ - static gboolean -draw_node_match(DrawNode *dnode, PangoFont *font, int flags) + static void +draw_row_render_overlay(DrawRow *drow, VimDrawArea *da) { - if (dnode->flags != flags) - return FALSE; + DrawLayer *dlayer = drow->dlayers + DRAW_LAYER_OVERLAY; - if (!(flags & DRAW_TRANSP) - && !gdk_rgba_equal(&dnode->bg_color, gui.bgcolor)) - return FALSE; + if (!dlayer->dirty) + return; - if (!gdk_rgba_equal(&dnode->fg_color, gui.fgcolor)) - return FALSE; + dlayer->dirty = FALSE; - // Special color is only used for undercurls - if (flags & DRAW_UNDERC && !gdk_rgba_equal(&dnode->sp_color, gui.spcolor)) - return FALSE; + // If no invert regions, don't do anything. + if (rgba_is_transparent(dlayer->buf, da->n_cols)) + return; - // This may not work all the time, but creating two PangoFontDescription - // each time to compare equality seems slow... - return dnode->font == font; + dlayer->node = draw_layer_get_texture(dlayer, drow->row, da, 0, TRUE); } /* - * Append or prepend the given glyphs to the draw node. If "start" is TRUE, then - * prepend, otherwise append. This will invalidate the draw node. Note that - * prepending does not update "start_col" or "n_cells". + * Add the glyph cluster to the raw area with given attributes and font. */ static void -draw_node_extend( - DrawNode *dnode, - const PangoGlyphInfo *glyphs, - int n_glyphs, - bool start) +draw_row_add_cluster( + DrawRow *drow, + DrawAttr *dattr, + int col, + int n_cells, + PangoFont *font, + PangoGlyphInfo *glyphs, + int n_glyphs, + VimDrawArea *da) { - dnode->glyphs = glyphs_resize(dnode->glyphs, dnode->n_glyphs + n_glyphs); - - if (start) - { - // Move the existing glyphs forward first - memmove(dnode->glyphs + n_glyphs, dnode->glyphs, - dnode->n_glyphs * sizeof(PangoGlyphInfo)); - memcpy(dnode->glyphs, glyphs, n_glyphs * sizeof(PangoGlyphInfo)); - } - else - memcpy(dnode->glyphs + dnode->n_glyphs, glyphs, - n_glyphs * sizeof(PangoGlyphInfo)); + DrawGlyphs *dglyphs = NULL; - dnode->n_glyphs += n_glyphs; + if (col + n_cells > da->n_cols) + return; - if (glyphs_has_ink(dnode->font, dnode->glyphs, dnode->n_glyphs)) - dnode->dnode_flags &= ~DRAW_NODE_NOINK; - else - dnode->dnode_flags |= DRAW_NODE_NOINK; - (void)draw_node_make_dirty(dnode); -} + // If there is no ink ("glyphs" is NULL), then just set the "dglyphs" of + // each cell to NULL. + if (glyphs != NULL) + dglyphs = draw_glyphs_new(font, glyphs, n_glyphs, dattr->fg_color); -/* - * Set the given cell to the draw node (which may be NULL), adding a new - * reference to it. - */ - static void -draw_cell_set(DrawCell *dcell, DrawNode *dnode) -{ - draw_node_unref(dcell->dnode); - dcell->dnode = dnode == NULL ? NULL : draw_node_ref(dnode); - dcell->invert = FALSE; -} + draw_row_fill(drow, col, col + n_cells - 1, dglyphs, dattr, &da->cursor); -/* - * Set the cells between "col1" and "col2" (inclusive) to "dnode" (which may be - * NULL). - */ - static void -draw_row_fill(DrawCell *drow, int col1, int col2, DrawNode *dnode) -{ - for (int c = col1; c <= col2; c++) - draw_cell_set(drow + c, dnode); + if (dglyphs != NULL) + draw_glyphs_unref(dglyphs); } /* - * Same as draw_row_fill(), but also handle truncating/splitting any draw nodes - * that overlap onto the set region. If "split" is TRUE, then only - * truncating/splitting is done. - * - * If "copy" is TRUE, then "dnode" is ignored and instead any draw nodes in the - * region that overlap outside of it are copied and clipped in addition to - * truncating draw nodes outside the region. + * Add the string to the draw area. This will handle the 'guiligatures' option. */ - static void -draw_row_set( - DrawCell *drow, - int col1, - int col2, - DrawNode *dnode, - gboolean copy, - gboolean split) + static int +vim_draw_area_add_string( + VimDrawArea *self, + DrawRow *drow, + DrawAttr *dattr, + int col, + char_u *s, + int len, + int draw_flags) { - DrawNode *ldnode = drow[col1].dnode; - DrawNode *rdnode = drow[col2].dnode; - DrawNode *new_dnode = NULL; - - if (ldnode != NULL && ldnode == rdnode - && (ldnode->start_col != col1 || END_COL(ldnode) > col2)) + PangoGlyphString *glyphs; + PangoAttrList *attr_list = NULL; + int start_idx = -1; + GList *item_list; + int column_offset = 0; + int cluster_width; + int last_glyph_rbearing; + int cells = 0; + int i = 0; + gboolean has_unicode = FALSE; + gboolean needs_shaping = FALSE; + + // Scan the string, and find spans where ligatures should not happen. We + // must ensure that attribute boundaries do not split a base character from + // its combining marks, as Pango breaks items at attribute boundaries. + while (i < len) { - // Region in completely inside a single draw node. Truncate the existing - // draw node, and create a new draw node to be used as the right split. - if (END_COL(ldnode) > col2) + int clen = 1; + int is_composing = 0; + bool want_disable; + + if (s[i] >= 0x80) { - rdnode = draw_node_copy(ldnode); - draw_row_fill(drow, col2 + 1, END_COL(rdnode), rdnode); - draw_node_unref(rdnode); + clen = utf_ptr2len(s + i); + is_composing = utf_iscomposing(utf_ptr2char(s + i)); + has_unicode = TRUE; } - else - // "ldnode" does not extend past "col2", no point in creating a new - // draw node on the right. - rdnode = NULL; - - if (copy) - // Make another copy for the new draw node inside the set region. - // Must fill it in the row after, since "ldnode" may be unreferenced - // fully. - new_dnode = draw_node_copy(ldnode); - } - if (ldnode != NULL && ldnode->start_col != col1) - { - if (copy && new_dnode == NULL) + if (is_composing) + // Do not change state mid-cluster. Inherit the previous character's + // state. + want_disable = (start_idx != -1); + else + // Base character: disable ligatures if it's an ASCII non-ligature + // char. + want_disable = (s[i] < 0x80 && !gui.ligatures_map[s[i]]); + + // If any base character actually wants ligature/contextual shaping, + // the string must go through Pango's shaping engine -- the ASCII + // fast path below draws cached glyphs one-by-one and can never + // produce a ligature, regardless of 'guiligatures'. + if (!is_composing && !want_disable) + needs_shaping = TRUE; + + if (want_disable) { - // Make a copy for the right halve. - DrawNode *new_right = draw_node_copy(ldnode); - - if (draw_node_split(new_right, col1 - ldnode->start_col, FALSE)) - g_clear_pointer(&new_right, draw_node_unref); - draw_row_fill(drow, col1, END_COL(ldnode), new_right); - draw_node_unref(new_right); + if (start_idx == -1) + start_idx = i; } - - // Leftmost draw node overlaps onto region, split it and discard right - // halve. - if (draw_node_split(ldnode, col1 - ldnode->start_col, TRUE)) - // Draw node is not necessary anymore, clear it from the row. - draw_row_fill(drow, ldnode->start_col, col1 - 1, NULL); - } - if (rdnode != NULL && END_COL(rdnode) > col2) - { - if (copy && new_dnode == NULL) + else if (start_idx != -1) { - // Make a copy for the left halve. - DrawNode *new_left = draw_node_copy(rdnode); - - if (draw_node_split(new_left, col2 - rdnode->start_col + 1, TRUE)) - g_clear_pointer(&new_left, draw_node_unref); - draw_row_fill(drow, rdnode->start_col, col2, new_left); - draw_node_unref(new_left); + if (attr_list == NULL) + attr_list = pango_attr_list_new(); + INSERT_PANGO_ATTR(pango_attr_font_features_new("liga 0, calt 0"), + attr_list, start_idx, i); + start_idx = -1; } - - // Rightmost draw node overlaps onto region, split it and discard left - // halve. - if (draw_node_split(rdnode, col2 - rdnode->start_col + 1, FALSE)) - draw_row_fill(drow, col2 + 1, END_COL(rdnode), NULL); + i += clen; } - if (copy) + // Fast path for pure ASCII: use cached glyph table. Skip this path when + // there are non-ascii characters in the string, font attributes, or if + // theres a possible ligature. + if (!(draw_flags & DRAW_ITALIC) + && !((draw_flags & DRAW_BOLD) && gui.font_can_bold) + && gui.ascii_glyphs != NULL + && !has_unicode + && !needs_shaping) { - if (new_dnode != NULL) + for (i = 0; i < len; ++i) { - if (draw_node_split(new_dnode, col1 - new_dnode->start_col, FALSE) - || draw_node_split(new_dnode, - col2 - new_dnode->start_col + 1, TRUE)) - g_clear_pointer(&new_dnode, draw_node_unref); + PangoGlyphInfo glyph = gui.ascii_glyphs->glyphs[2 * s[i]]; + gboolean has_ink; + + has_ink = glyph_has_ink(gui.ascii_font, glyph); - draw_row_fill(drow, col1, col2, new_dnode); - draw_node_unref(new_dnode); + draw_row_add_cluster(drow, dattr, col + i, 1, + gui.ascii_font, has_ink ? &glyph : NULL, 1, self); } + + column_offset = len; + goto exit; } - else if (!split) - draw_row_fill(drow, col1, col2, dnode); -} -/* - * Move the cells between "col1" and "col2" from "src" to "dest", overwriting - * the existing cells. This will handle clipping any draw nodes. - */ - static void -draw_row_move_to(DrawCell *dest_row, DrawCell *src_row, int col1, int col2) -{ - int move_size = (col2 - col1 + 1) * sizeof(DrawCell); + glyphs = pango_glyph_string_new(); - // Make sure that we free/truncate any draw nodes before we overwrite - // them. - draw_row_set(dest_row, col1, col2, NULL, FALSE, FALSE); + if (attr_list == NULL) + attr_list = pango_attr_list_new(); - // Make sure that draw nodes at the "col1" and "col2" of "src_row" are - // clipped so that they all fit in the region being moved. - draw_row_set(src_row, col1, col2, NULL, TRUE, FALSE); + if (start_idx != -1) + INSERT_PANGO_ATTR(pango_attr_font_features_new("liga 0, calt 0"), + attr_list, start_idx, len); - memmove(dest_row + col1, src_row + col1, move_size); + cluster_width = PANGO_SCALE * gui.char_width; + last_glyph_rbearing = PANGO_SCALE * gui.char_width; - // Dirty the moved cells - for (int c = col1; c <= col2;) - if (dest_row[c].dnode != NULL) - { - (void)draw_node_make_dirty(dest_row[c].dnode); - c += dest_row[c].dnode->n_cells; - } - else - c++; + // If 'guifontwide' is set then use that for double-width characters. + if (gui.wide_font != NULL) + apply_wide_font_attr(s, len, attr_list); - // NULL the draw nodes so we don't double unreference. - memset(src_row + col1, 0, (col2 - col1 + 1) * sizeof(DrawCell)); -} + if ((draw_flags & DRAW_BOLD) && gui.font_can_bold) + INSERT_PANGO_ATTR(pango_attr_weight_new(PANGO_WEIGHT_BOLD), + attr_list, 0, len); + if (draw_flags & DRAW_ITALIC) + INSERT_PANGO_ATTR(pango_attr_style_new(PANGO_STYLE_ITALIC), + attr_list, 0, len); -/* - * Should be called after modifying draw nodes within the given region. - */ -static void -vim_draw_area_check_bounds( - VimDrawArea *self, - int row1, - int row2, - int col1, - int col2) -{ -#if defined(FEAT_SIGN_ICONS) || defined(FEAT_NETBEANS_INTG) - graphene_rect_t bounds = GRAPHENE_RECT_INIT( - FILL_X(col1), FILL_Y(row1), - gui.char_width * (col2 - col1 + 1), - gui.char_height * (row2 - row1 + 1)); -#endif + item_list = pango_itemize(gui.text_context, + (const char *)s, 0, len, attr_list, NULL); - if (self->cursor_node != NULL) - // Check if cursor node is within the the updated region. If so, then - // remove the render node. This only applies to the part and hollow - // cursor, the block cursor will be cleared in draw_row_make_space(). - if (gui.row >= row1 && gui.row <= row2 - && gui.col >= col1 && gui.col <= col2) - g_clear_pointer(&self->cursor_node, gsk_render_node_unref); - -#ifdef FEAT_SIGN_ICONS - // Clear any sign icons within the modified block if any - for (GList *s = self->signs->head; s != NULL;) + while (item_list != NULL) { - GList *next = s->next; - graphene_rect_t rect; + PangoItem *item = item_list->data; + int item_cells = 0; + int cluster_start_idx = 0; + int current_cluster_col = col + column_offset; + int current_cluster_cells = 0; + gboolean current_cluster_ink = FALSE; + + item_list = g_list_delete_link(item_list, item_list); - gsk_render_node_get_bounds(s->data, &rect); + // Force LTR direction; Vim handles bidi on its own. + item->analysis.level = (item->analysis.level + 1) & (~1U); - if (graphene_rect_contains_rect(&bounds, &rect)) + pango_shape_full((const char *)s + item->offset, item->length, + (const char *)s, len, &item->analysis, glyphs); + + // Fixed-width hack: assign a fixed width to each glyph based on the + // number of cells it occupies, handling composing characters and + // cluster boundaries properly. + // + // At the end of each cluster, add it to the draw area. + for (i = 0; i < glyphs->num_glyphs; ++i) { - // Keep going in case there are multiple sign icons within this - // block. - gsk_render_node_unref(s->data); - g_queue_delete_link(self->signs, s); + PangoGlyphInfo *glyph; + + glyph = &glyphs->glyphs[i]; + + if (glyph->attr.is_cluster_start) + { + int cellcount; + + cellcount = count_cluster_cells( + s, item, glyphs, i, &cluster_width, + (item_list != NULL) ? &last_glyph_rbearing : NULL); + + if (i > 0 && cellcount > 0) + { + draw_row_add_cluster(drow, dattr, + current_cluster_col, current_cluster_cells, + item->analysis.font, + current_cluster_ink ? + glyphs->glyphs + cluster_start_idx : NULL, + i - cluster_start_idx, self); + + current_cluster_col += current_cluster_cells; + cluster_start_idx = i; + current_cluster_ink = FALSE; + current_cluster_cells = 0; + } + + if (cellcount > 0) + { + int width; + + width = cellcount * gui.char_width * PANGO_SCALE; + glyph->geometry.x_offset += + MAX(0, width - cluster_width) / 2; + glyph->geometry.width = width; + } + else + setup_zero_width_cluster(item, glyph, cells, + cluster_width, + last_glyph_rbearing); + + item_cells += cellcount; + cells = cellcount; + current_cluster_cells += cellcount; + } + else if (i > 0) + { + int width; + + if (glyph->geometry.x_offset >= 0) + { + glyphs->glyphs[i].geometry.width = + glyphs->glyphs[i - 1].geometry.width; + glyphs->glyphs[i - 1].geometry.width = 0; + } + width = cells * gui.char_width * PANGO_SCALE; + glyph->geometry.x_offset += + MAX(0, width - cluster_width) / 2; + } + else + glyph->geometry.width = 0; + + + if (!current_cluster_ink) + current_cluster_ink = glyph_has_ink( + item->analysis.font, *glyph); } - s = next; + if (glyphs->num_glyphs > 0) + draw_row_add_cluster(drow, dattr, + current_cluster_col, current_cluster_cells, + item->analysis.font, + current_cluster_ink ? + glyphs->glyphs + cluster_start_idx : NULL, + glyphs->num_glyphs - cluster_start_idx, self); + + pango_item_free(item); + column_offset += item_cells; } -#endif -#ifdef FEAT_NETBEANS_INTG - // Remove multi sign indicator if it is within the modified region. - if (self->multisign_node != NULL) - { - graphene_rect_t rect; - gsk_render_node_get_bounds(self->multisign_node, &rect); - if (graphene_rect_contains_rect(&bounds, &rect)) - g_clear_pointer(&self->multisign_node, gsk_render_node_unref); - } -#endif + pango_glyph_string_free(glyphs); + +exit: + if (attr_list != NULL) + pango_attr_list_unref(attr_list); + + return column_offset; } /* - * Add the glyph string starting at column "col" in row "row". This will handle - * any background colours, fake bold, and under decorations. This does not queue - * a redraw for the widget. + * Draw the given string at position (col, row) on the draw area. */ - void -vim_draw_area_add_glyphs( + int +vim_draw_area_draw_string( VimDrawArea *self, - int row, - int col, - int num_cells, - int flags, - PangoFont *font, - PangoGlyphString *glyphs) + int row, + int col, + char_u *s, + int len, + int flags) { - DrawCell *drow; - DrawNode *dnode = NULL; - int end_col = col + num_cells - 1; + DrawRow *drow; + DrawAttr dattr; + char_u *conv_buf = NULL; + int convlen; + int n_cells ; - if (unlikely(self->cells == NULL + if (unlikely(self->rows == NULL || row >= self->n_rows - || col >= self->n_cols - || col + num_cells > self->n_cols)) - return; - - drow = GET_ROW(self, row); - - draw_row_set(drow, col, end_col, NULL, FALSE, TRUE); + || col >= self->n_cols)) + return len; - // Check if leftmost draw node (if any) has the same visual - // attributes/colours as the glyph string being added. If so, then just - // extend that draw node with the new glyphs. - if (col > 0) + if (output_conv.vc_type != CONV_NONE) { - DrawNode *ldnode = drow[col - 1].dnode; - - // Don't want to try merging draw nodes that are clipped, because the - // glyphs in them may not match one to one with the actual bounds of the - // draw node. - if (ldnode != NULL && !(ldnode->dnode_flags & DRAW_NODE_CLIP) - && draw_node_match(ldnode, font, flags)) + convlen = len; + conv_buf = string_convert(&output_conv, s, &convlen); + if (conv_buf != NULL) { - draw_node_extend(ldnode, glyphs->glyphs, glyphs->num_glyphs, FALSE); - draw_row_fill(drow, col, end_col, ldnode); - ldnode->n_cells += num_cells; - dnode = ldnode; + s = conv_buf; + len = convlen; } } - // Check if we can use the existing draw node on the right. If so, then shift - // "rdnode" to the "col", and extend it. If we merged the left draw node, then - // instead extend it normally and unreference the right draw node. - if (col + num_cells < self->n_cols) + // Safety check: pango crashes with invalid utf-8. + if (!utf_valid_string(s, s + len)) { - DrawNode *rdnode = drow[col + num_cells].dnode; - - if (rdnode != NULL && !(rdnode->dnode_flags & DRAW_NODE_CLIP) - && draw_node_match(rdnode, font, flags)) - { - if (dnode != NULL) - { - assert(rdnode->start_col == col + num_cells); - draw_node_extend(dnode, rdnode->glyphs, rdnode->n_glyphs, FALSE); - dnode->n_cells += rdnode->n_cells; - draw_row_fill(drow, rdnode->start_col, END_COL(rdnode), dnode); - } - else - { - draw_node_extend(rdnode, glyphs->glyphs, glyphs->num_glyphs, TRUE); - draw_row_fill(drow, col, end_col, rdnode); - rdnode->start_col = col; - rdnode->n_cells += num_cells; - dnode = rdnode; - } - } + vim_free(conv_buf); + return len; } - if (dnode != NULL) - return; + drow = self->rows + row; + draw_attr_init(&dattr, gui.bgcolor, gui.fgcolor, gui.spcolor, flags); - dnode = draw_node_new( - font, glyphs->glyphs, glyphs->num_glyphs, gui.bgcolor, - gui.fgcolor, gui.spcolor, flags, col, num_cells - ); - draw_row_fill(drow, col, end_col, dnode); - draw_node_unref(dnode); + n_cells = vim_draw_area_add_string(self, drow, &dattr, col, s, len, flags); - vim_draw_area_check_bounds(self, row, row, col, col + num_cells - 1); + vim_free(conv_buf); + + return n_cells; } /* @@ -1015,7 +1508,7 @@ vim_draw_area_clear_block( int row2, int col2) { - if (unlikely(self->cells == NULL + if (unlikely(self->rows == NULL || row1 >= self->n_rows || col1 >= self->n_cols || row2 >= self->n_rows @@ -1023,9 +1516,7 @@ vim_draw_area_clear_block( return; for (int r = row1; r <= row2; r++) - draw_row_set(GET_ROW(self, r), col1, col2, NULL, FALSE, FALSE); - - vim_draw_area_check_bounds(self, row1, row2, col1, col2); + draw_row_fill(self->rows + r, col1, col2, NULL, NULL, &self->cursor); } /* @@ -1051,17 +1542,9 @@ vim_draw_area_move_block( int col1, int col2) { + int offset = row2 - row1; - int offset = row2 - row1; -#if defined(FEAT_SIGN_ICONS) || defined(FEAT_NETBEANS_INTG) - graphene_rect_t bounds = GRAPHENE_RECT_INIT( - FILL_X(col1), FILL_Y(row1), - gui.char_width * (col2 - col1 + 1), - gui.char_height * (row2 - row1 + 1)); - graphene_rect_t clear_rect; -#endif - - if (unlikely(self->cells == NULL + if (unlikely(self->rows == NULL || row1 >= self->n_rows || row2 >= self->n_rows || to >= self->n_rows @@ -1078,8 +1561,8 @@ vim_draw_area_move_block( // "row1" is below "to", start moving rows starting at "row1". Rows are // being shifted upwards. for (int o = 0; o <= offset; o++) - draw_row_move_to(GET_ROW(self, to + o), GET_ROW(self, row1 + o), - col1, col2); + draw_row_move_to(self->rows + to + o, self->rows + row1 + o, + col1, col2, self); } else { @@ -1089,158 +1572,27 @@ vim_draw_area_move_block( if (to + o >= self->n_rows) // "src_row" is being "moved" off the screen, no need to move // it physically. - gui_clear_block(row1 + o, col1, row1 + o, col2); - else - draw_row_move_to(GET_ROW(self, to + o), GET_ROW(self, row1 + o), - col1, col2); - } - - // Do not call vim_draw_area_check_bounds(), because we moved cells, not - // modified them. - -#if defined(FEAT_SIGN_ICONS) || defined(FEAT_NETBEANS_INTG) - if (row1 > to) - clear_rect = GRAPHENE_RECT_INIT( - FILL_X(col1), FILL_Y(to), - gui.char_width * (col2 - col1 + 1), - gui.char_height * (row1 - to)); - else - clear_rect = GRAPHENE_RECT_INIT( - FILL_X(col1), FILL_Y(row2 + 1), - gui.char_width * (col2 - col1 + 1), - gui.char_height * (to - row1)); -#endif - -#ifdef FEAT_SIGN_ICONS - // Move sign icons if they are in the moved region - for (GList *s = self->signs->head; s != NULL;) - { - GList *next = s->next; - GskRenderNode *node = s->data; - graphene_rect_t rect; - - gsk_render_node_get_bounds(node, &rect); - - // Check if icon moved off screen, if so then remove it. - if (graphene_rect_contains_rect(&clear_rect, &rect)) - { - gsk_render_node_unref(s->data); - g_queue_delete_link(self->signs, s); - s = next; - continue; - } - - if (graphene_rect_contains_rect(&bounds, &rect)) - { - GdkTexture *texture; - GskRenderNode *new; - float new_y; - - texture = gsk_texture_scale_node_get_texture(node); - new_y = graphene_rect_get_y(&rect) - graphene_rect_get_y(&bounds); - new_y += FILL_Y(to); - - if (new_y >= 0 && new_y < gtk_widget_get_height(GTK_WIDGET(self))) - { - rect.origin.y = new_y; - new = gsk_texture_scale_node_new(texture, &rect, - GSK_SCALING_FILTER_TRILINEAR); - gsk_render_node_unref(node); - s->data = new; - } - else - { - gsk_render_node_unref(s->data); - g_queue_delete_link(self->signs, s); - } - } - s = next; - } -#endif -#ifdef FEAT_NETBEANS_INTG - // Move multisign indicator node if needed - if (self->multisign_node != NULL) - { - graphene_rect_t rect; - - gsk_render_node_get_bounds(self->multisign_node, &rect); - - if (graphene_rect_contains_rect(&clear_rect, &rect)) - g_clear_pointer(&self->multisign_node, gsk_render_node_unref); - else if (graphene_rect_contains_rect(&bounds, &rect)) - { - float new_y = - graphene_rect_get_y(&rect) - graphene_rect_get_y(&bounds); - - new_y += FILL_Y(to); - - if (new_y >= 0 && new_y < gtk_widget_get_height(GTK_WIDGET(self))) - { - cairo_surface_t *surface; - GskRenderNode *new; - cairo_t *cr; - - surface = gsk_cairo_node_get_surface(self->multisign_node); - rect.origin.y = new_y; - new = gsk_cairo_node_new(&rect); - cr = gsk_cairo_node_get_draw_context(new); - cairo_set_source_surface(cr, surface, 0, 0); - cairo_paint(cr); - cairo_destroy(cr); - - gsk_render_node_unref(self->multisign_node); - self->multisign_node = new; - } + vim_draw_area_clear_block(self, row1 + o, col1, row1 + o, col2); else - g_clear_pointer(&self->multisign_node, gsk_render_node_unref); - } + draw_row_move_to(self->rows + to + o, self->rows + row1 + o, + col1, col2, self); } -#endif -} - -/* - * Draw a hollow cursor at the cursor position using the current foreground - * color. Note that this does not queue a redraw - */ - void -vim_draw_area_set_hollow_cursor(VimDrawArea *self) -{ - GskRoundedRect outline; - int i = 1; - static const float border[4] = {1.0f, 1.0f, 1.0f, 1.0f}; - const GdkRGBA color[4] = { - *gui.fgcolor, *gui.fgcolor, - *gui.fgcolor, *gui.fgcolor - } ; - - // Double cursor width if double width character - if (mb_lefthalve(gui.row, gui.col)) - i = 2; - - gsk_rounded_rect_init_from_rect(&outline, - &GRAPHENE_RECT_INIT(FILL_X(gui.col), FILL_Y(gui.row), - i * gui.char_width, gui.char_height), - 0.0f); - - node_unref(self->cursor_node); - self->cursor_node = gsk_border_node_new(&outline, border, color); } /* - * Draw a part cursor with width "w" and height "h". Note that this does not - * queue a redraw + * Set the cursor to the given width and height, use "gui.bgcolor" and + * "gui.fgcolor" for the colors as well. If "w" and "h" is zero, then a full + * block cursor is used, if "w" and "h" is -1 then a hollow cursor is used, + * otherwise a part cursor with dimensions "w" and "h" is used. */ void -vim_draw_area_set_part_cursor(VimDrawArea *self, int w, int h) +vim_draw_area_set_cursor(VimDrawArea *self, int w, int h) { - node_unref(self->cursor_node); - self->cursor_node = gsk_color_node_new(gui.fgcolor, - &GRAPHENE_RECT_INIT( -#ifdef FEAT_RIGHTLEFT - CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w : -#endif - FILL_X(gui.col), FILL_Y(gui.row) + gui.char_height - h, - w, h)); + self->cursor.draw = TRUE; + self->cursor.width = w; + self->cursor.height = h; + self->cursor.bg_color = *gui.bgcolor; + self->cursor.fg_color = *gui.fgcolor; } /* @@ -1254,7 +1606,7 @@ vim_draw_area_invert_block( int nrows, int ncols) { - if (unlikely(self->cells == NULL + if (unlikely(self->rows == NULL || row >= self->n_rows || col >= self->n_cols || row + nrows - 1 >= self->n_rows @@ -1263,14 +1615,12 @@ vim_draw_area_invert_block( for (int r = row; r < row + nrows; r++) { - DrawCell *drow = GET_ROW(self, r); - - for (int c = col; c < col + ncols; c++) - { - DrawCell *dcell = drow + c; + DrawRow *drow = self->rows + r; + DrawLayer *dlayer = drow->dlayers + DRAW_LAYER_OVERLAY; - dcell->invert = !dcell->invert; - } + for (int c = 0; c < ncols; c++) + dlayer->buf[c + col] = ~dlayer->buf[c + col]; + draw_row_dirty_layer(drow, DRAW_LAYER_OVERLAY); } } @@ -1282,41 +1632,83 @@ vim_draw_area_invert_block( void vim_draw_area_add_sign( VimDrawArea *self, - GdkTexture *sign, - int row, - int col, - int width, - int height) + GdkTexture *sign, + int row, + int col, + int width, + int height) { - GskRenderNode *node; + DrawRow *drow; + DrawSign *dsign; + DrawGlyphs *dglyphs; + int cells; - if (unlikely(self->cells == NULL + if (unlikely(self->rows == NULL || row >= self->n_rows || col >= self->n_cols)) return; - node = gsk_texture_scale_node_new(sign, - &GRAPHENE_RECT_INIT(FILL_X(col), FILL_Y(row), width, height), - GSK_SCALING_FILTER_TRILINEAR); - if (node == NULL) - return; - g_queue_push_tail(self->signs, node); + drow = self->rows + row; + dsign = draw_sign_new(sign, width, height); + dglyphs = draw_glyphs_new_sign(dsign); + cells = (width + gui.char_width - 1) / gui.char_width; + + draw_row_fill(drow, col, col + cells - 1, dglyphs, NULL, &self->cursor); + draw_glyphs_unref(dglyphs); } #endif #ifdef FEAT_NETBEANS_INTG - cairo_t * -vim_draw_area_get_multisign_cairo(VimDrawArea *self, int x, int y, int w, int h) +/* + * Add a multi sign indicator at the given position. "surf" should be in ARGB + * format. + */ + void +vim_draw_area_add_multisign( + VimDrawArea *self, + cairo_surface_t *surf, + int row, + int col, + int width, + int height) { - node_unref(self->multisign_node); - self->multisign_node = gsk_cairo_node_new( - &GRAPHENE_RECT_INIT( x, y, w, h)); - return gsk_cairo_node_get_draw_context(self->multisign_node); + DrawRow *drow; + DrawSign *dsign; + DrawGlyphs *dglyphs; + int cells; + GdkTexture *texture; + GBytes *bytes; + + if (unlikely(self->rows == NULL + || row >= self->n_rows + || col >= self->n_cols)) + return; + + cairo_surface_flush(surf); + bytes = g_bytes_new_with_free_func(cairo_image_surface_get_data(surf), + cairo_image_surface_get_height(surf) + * cairo_image_surface_get_stride(surf), + (GDestroyNotify)cairo_surface_destroy, + cairo_surface_reference(surf)); + + texture = gdk_memory_texture_new(cairo_image_surface_get_width(surf), + cairo_image_surface_get_height(surf), + GDK_MEMORY_A8R8G8B8_PREMULTIPLIED, + bytes, cairo_image_surface_get_stride(surf)); + g_bytes_unref(bytes); + + drow = self->rows + row; + dsign = draw_sign_new(texture, width, height); + g_object_unref(texture); + dglyphs = draw_glyphs_new_sign(dsign); + cells = (width + gui.char_width - 1) / gui.char_width; + + draw_row_fill(drow, col, col + cells - 1, dglyphs, NULL, &self->cursor); + draw_glyphs_unref(dglyphs); } #endif #ifdef FEAT_IMAGE_GDK - /* * Get the draw image with the given id, return NULL if not exists. */ @@ -1381,7 +1773,7 @@ vim_draw_area_add_image( GList *link; DrawImage *dimg; - if (unlikely(self->cells == NULL + if (unlikely(self->rows == NULL || row >= self->n_rows || col >= self->n_cols)) return; @@ -1433,13 +1825,6 @@ vim_draw_area_add_image( vim_draw_area_queue_image(self, link); } - static void -draw_image_free(DrawImage *dimg) -{ - gsk_render_node_unref(dimg->node); - g_free(dimg); -} - /* * Remove the image with the given id if it exists */ @@ -1456,122 +1841,167 @@ vim_draw_area_remove_image(VimDrawArea *self, int id) } #endif +/* + * Add the cursor to the snapshot. + */ static void -flush_invert_ga(garray_T *invert_ga, int row, int start, int len) +vim_draw_area_snapshot_cursor( + VimDrawArea *self, + GskRenderNode *text_node, // May be NULL + GskRenderNode *special_node, // May be NULL + GtkSnapshot *snapshot) { - if (ga_grow(invert_ga, 1) == OK) + DrawCursor *cursor = &self->cursor; + int w = cursor->width; + int h = cursor->height; + graphene_rect_t rect; + + if (!cursor->draw) + return; + + if (cursor->width <= 0 && cursor->height <= 0) + { + // Double width if double width character + w += gui.char_width * (1 + mb_lefthalve(gui.row, gui.col)); + h = gui.char_height; + } + + graphene_rect_init(&rect, +#ifdef FEAT_RIGHTLEFT + CURSOR_BAR_RIGHT ? FILL_X(gui.cursor_col + 1) - w : +#endif + FILL_X(gui.cursor_col), + FILL_Y(gui.cursor_row) + gui.char_height - h, w, h); + + + if (cursor->width == -1 && cursor->height == -1) + { + // Create hollow cursor + GskRoundedRect outline; + static const float border[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + const GdkRGBA color[4] = { + cursor->bg_color, cursor->bg_color, + cursor->bg_color, cursor->bg_color + } ; + + gsk_rounded_rect_init_from_rect(&outline, &rect, 0.0f); + gtk_snapshot_append_border(snapshot, &outline, border, color); + } + else { - graphene_rect_t *arr = (graphene_rect_t *)invert_ga->ga_data; + // Create block style cursor, by masking the text + under decorations + // with the fg color. + gtk_snapshot_append_color(snapshot, &cursor->bg_color, &rect); - graphene_rect_init(arr + invert_ga->ga_len++, - FILL_X(start), FILL_Y(row), - len * gui.char_width, gui.char_height); + gtk_snapshot_push_mask(snapshot, GSK_MASK_MODE_ALPHA); + + // Used as an "outline" for the fg color. + if (text_node != NULL) + gtk_snapshot_append_node(snapshot, text_node); + if (special_node != NULL) + gtk_snapshot_append_node(snapshot, special_node); + + gtk_snapshot_pop(snapshot); + + gtk_snapshot_append_color(snapshot, &cursor->fg_color, &rect); + gtk_snapshot_pop(snapshot); } } static void vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) { - VimDrawArea *self = VIM_DRAW_AREA(widget); - int height, width; - static const GdkRGBA white = {1, 1, 1, 1}; - garray_T invert_ga; + VimDrawArea *self = VIM_DRAW_AREA(widget); + int height, width; + GtkSnapshot *body_snapshot; + GtkSnapshot *invert_snapshot = NULL; + GskRenderNode *body_node; + GskRenderNode *invert_node = NULL; gui_mch_set_bg_color(gui.back_pixel); height = gtk_widget_get_height(widget) + gui.bleed_bot; width = gtk_widget_get_width(widget) + gui.bleed_right; - if (self->cells == NULL) + if (self->rows == NULL) { gtk_snapshot_append_color(snapshot, gui.bgcolor, &GRAPHENE_RECT_INIT(0, 0, width, height)); return; } - // If number of pixels to bleed has changed, then dirty the nodes at the - // right edge of the draw area. - if (self->bleed_right != gui.bleed_right) + // If number of pixels to bleed has changed, then dirty the background and + // overlay layers of all rows. + if (self->bleed_right == -1 || self->bleed_right != gui.bleed_right) { self->bleed_right = gui.bleed_right; for (int r = 0; r < self->n_rows; r++) { - DrawCell *dcell = &GET_ROW(self, r)[self->n_cols - 1]; - - if (dcell->dnode != NULL) - { - (void)draw_node_make_dirty(dcell->dnode); - draw_node_render(dcell->dnode, r, self); - } + draw_row_dirty_layer(self->rows + r, DRAW_LAYER_BACKGROUND); + draw_row_dirty_layer(self->rows + r, DRAW_LAYER_OVERLAY); } } - // For inverted cells, we first build an array of bounds that represent - // blocks of inverted cells. Then we apply a white color to each of those - // bounds and then finish the blend. - gtk_snapshot_push_blend(snapshot, GSK_BLEND_MODE_DIFFERENCE); - ga_init2(&invert_ga, sizeof(graphene_rect_t), 8); - - gtk_snapshot_append_color(snapshot, gui.bgcolor, - &GRAPHENE_RECT_INIT(0, 0, width, height)); + // First append everything that should be inverted to another snapshot, then + // free that snapshot into a node so it can be blended (if needed). + body_snapshot = gtk_snapshot_new(); for (int r = 0; r < self->n_rows; r++) { - DrawCell *drow = GET_ROW(self, r); - int inv_len = 0; - int inv_start; - - for (int c = 0; c < self->n_cols; c++) - { - DrawCell *dcell = drow + c; - DrawNode *dnode = dcell->dnode; + DrawRow *drow = self->rows + r; - // Batch inverted cells as single row rectangles. - if (dcell->invert) - { - if (inv_len == 0) - inv_start = c; - inv_len++; - } - else if (!dcell->invert && inv_len > 0) - { - flush_invert_ga(&invert_ga, r, inv_start, inv_len); - inv_len = 0; - } + draw_row_render_background(drow, self); + draw_row_render_text(drow, self); + draw_row_render_special(drow, self); + draw_row_render_overlay(drow, self); - if (dnode == NULL) - continue; + for (int l = 0; l < N_DRAW_LAYERS; l++) + { + DrawLayer *dlayer = drow->dlayers + l; - if (dnode->start_col == c) + if (dlayer->node != NULL) { - draw_node_render(dnode, r, self); - assert(dnode->node != NULL); - gtk_snapshot_append_node(snapshot, dnode->node); + if (l == DRAW_LAYER_OVERLAY) + { + if (invert_snapshot == NULL) + invert_snapshot = gtk_snapshot_new(); + gtk_snapshot_append_node(invert_snapshot, dlayer->node); + } + else + gtk_snapshot_append_node(body_snapshot, dlayer->node); } } - // Flush trailing inverted blocks at end of row loop - if (inv_len > 0) - flush_invert_ga(&invert_ga, r, inv_start, inv_len); + + if (r == gui.cursor_row) + vim_draw_area_snapshot_cursor(self, + drow->dlayers[DRAW_LAYER_TEXT].node, + drow->dlayers[DRAW_LAYER_SPECIAL].node, + body_snapshot); } -#ifdef FEAT_SIGN_ICONS - // Order of where the sign icon should be placed shouldn't matter, - // since caller will add whitespace padding in the region it covers. - // Probably should put it behind cursor though. - for (GList *s = self->signs->head; s != NULL; s = s->next) - gtk_snapshot_append_node(snapshot, s->data); -#endif + if (invert_snapshot != NULL) + gtk_snapshot_push_blend(snapshot, GSK_BLEND_MODE_DIFFERENCE); - if (self->cursor_node != NULL) - gtk_snapshot_append_node(snapshot, self->cursor_node); + gtk_snapshot_append_color(snapshot, gui.bgcolor, + &GRAPHENE_RECT_INIT(0, 0, width, height)); + body_node = gtk_snapshot_free_to_node(body_snapshot); + if (body_node != NULL) + { + gtk_snapshot_append_node(snapshot, body_node); + gsk_render_node_unref(body_node); + } - gtk_snapshot_pop(snapshot); - for (int i = 0; i < invert_ga.ga_len; i++) + if (invert_snapshot != NULL) { - graphene_rect_t *rect = &((graphene_rect_t *)invert_ga.ga_data)[i]; - gtk_snapshot_append_color(snapshot, &white, rect); + gtk_snapshot_pop(snapshot); + invert_node = gtk_snapshot_free_to_node(invert_snapshot); + // Not sure if it can be NULL but still check + if (invert_node != NULL) + { + gtk_snapshot_append_node(snapshot, invert_node); + gsk_render_node_unref(invert_node); + } + gtk_snapshot_pop(snapshot); } - gtk_snapshot_pop(snapshot); - ga_clear(&invert_ga); #ifdef FEAT_IMAGE_GDK // Draw images after any possible inversions diff --git a/src/gui_gtk4_da.h b/src/gui_gtk4_da.h index 100d1dba06..5cd1cdc552 100644 --- a/src/gui_gtk4_da.h +++ b/src/gui_gtk4_da.h @@ -21,17 +21,22 @@ G_DECLARE_FINAL_TYPE(VimDrawArea, vim_draw_area, VIM, DRAW_AREA, GtkWidget) GtkWidget *vim_draw_area_new(void); void vim_draw_area_set_size(VimDrawArea *self, int rows, int cols); -void vim_draw_area_add_glyphs(VimDrawArea *self, int row, int col, int num_cells, int flags, PangoFont *font, PangoGlyphString *glyphs); +int vim_draw_area_draw_string(VimDrawArea *self, int row, int col, char_u *s, int len, int flags); void vim_draw_area_clear_block(VimDrawArea *self, int row1, int col1, int row2, int col2); void vim_draw_area_clear(VimDrawArea *self); void vim_draw_area_move_block(VimDrawArea *self, int to, int row1, int row2, int col1, int col2); -void vim_draw_area_set_hollow_cursor(VimDrawArea *self); -void vim_draw_area_set_part_cursor(VimDrawArea *self, int w, int h); +void vim_draw_area_set_cursor(VimDrawArea *self, int w, int h); void vim_draw_area_invert_block(VimDrawArea *self, int row, int col, int nrows, int ncols); +# if defined(FEAT_SIGN_ICONS) void vim_draw_area_add_sign(VimDrawArea *self, GdkTexture *sign, int row, int col, int width, int height); -cairo_t *vim_draw_area_get_multisign_cairo(VimDrawArea *self, int x, int y, int w, int h); -void vim_draw_area_add_image(VimDrawArea *self, GdkTexture *image, int row, int col, int src_x, int src_y, int draw_w, int draw_h, int zindex, int id); +# endif +# ifdef FEAT_NETBEANS_INTG +void vim_draw_area_add_multisign(VimDrawArea *self, cairo_surface_t *surf, int row, int col, int width, int height); +# endif +# ifdef FEAT_IMAGE_GDK +void vim_draw_area_add_image(VimDrawArea *self, GdkTexture *image, int row, int col, int src_x, int src_y, int draw_w, int draw_h, int zindex, int id); void vim_draw_area_remove_image(VimDrawArea *self, int id); +# endif #endif diff --git a/src/netbeans.c b/src/netbeans.c index 99fa9549c2..abe5d11bc5 100644 --- a/src/netbeans.c +++ b/src/netbeans.c @@ -3100,16 +3100,25 @@ netbeans_draw_multisign_indicator(int row) # else GdkDrawable *drawable = gui.drawarea->window; # endif +# ifdef USE_GTK4_SNAPSHOT + cairo_surface_t *surf; +# endif if (!NETBEANS_OPEN) return; x = 0; +# ifdef USE_GTK4_SNAPSHOT + y = 2; +# else y = row * gui.char_height + 2; +# endif # if GTK_CHECK_VERSION(3,0,0) # ifdef USE_GTK4_SNAPSHOT - cr = gui_gtk4_get_multisign_context(x, y, 5, gui.char_height); + surf = cairo_image_surface_create( + CAIRO_FORMAT_ARGB32, 5, gui.char_height); + cr = cairo_create(surf); # else cr = cairo_create(gui.surface); # endif @@ -3143,9 +3152,17 @@ netbeans_draw_multisign_indicator(int row) gdk_draw_point(drawable, gui.text_gc, x+2, y); # endif +# ifdef USE_GTK4_SNAPSHOT + cairo_fill(cr); + gui_gtk4_add_multisign(surf, row, 0, 5, gui.char_height); +# endif + # if GTK_CHECK_VERSION(3,0,0) cairo_destroy(cr); # endif +# ifdef USE_GTK4_SNAPSHOT + cairo_surface_destroy(surf); +# endif } #endif // FEAT_GUI_GTK diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index fddaec21a4..af55b50fcf 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -39,7 +39,7 @@ void gui_mch_set_bg_color(guicolor_T color); void gui_mch_set_sp_color(guicolor_T color); guicolor_T gui_mch_get_rgb(guicolor_T pixel); void gui_gtk4_update_size(void); -cairo_t *gui_gtk4_get_multisign_context(int x, int y, int w, int h); +void gui_gtk4_add_multisign(cairo_surface_t *surf, int row, int col, int width, int height); void gui_mch_clear_block(int row1, int col1, int row2, int col2); void gui_mch_clear_all(void); void gui_gtk4_remove_image(win_T *wp); @@ -48,6 +48,7 @@ bool gui_mch_update_popup_image_pixels(win_T *wp); void gui_mch_draw_popup_image(win_T *wp, int row, int col, int src_x, int src_y, int draw_w, int draw_h); void gui_mch_delete_lines(int row, int num_lines); void gui_mch_insert_lines(int row, int num_lines); +void gui_gtk4_draw_cursor(guicolor_T bg, guicolor_T fg, int w, int h); void gui_mch_draw_hollow_cursor(guicolor_T color); void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_flash(int msec); diff --git a/src/version.c b/src/version.c index 9c342a6419..182dd1d240 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 828, /**/ 827, /**/ From 648d16e4ca659fdcddd3c7855d54ac7e3416ae19 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Wed, 22 Jul 2026 09:39:02 +0000 Subject: [PATCH 166/647] runtime(doc): clarify 'icon' and 'title' interaction for screen 5 related: #20553 related: #20604 closes: #20703 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 7b3713b0d4..549b22a853 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Jul 03 +*options.txt* For Vim version 9.2. Last change: 2026 Jul 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4948,9 +4948,8 @@ A jump table for the options with a short description can be found at |Q_op|. restored if possible |X11|. See |X11-icon| for changing the icon on X11. For MS-Windows the icon can be changed, see |windows-icon|. - NOTE: Some terminals treat the icon text as an alias for the window - title. On those, setting the icon text may also change the terminal - window title; see 'title'. + NOTE: GNU screen is not consistent in handling icon-title and title escape + sequences between versions. See 'title'. *'iconstring'* 'iconstring' string (default "") @@ -9638,9 +9637,9 @@ A jump table for the options with a short description can be found at |Q_op|. then the WINDOWID environment variable should be inherited and the title of the window should change back to what it should be after exiting Vim. - NOTE: Some terminals treat the icon text as an alias for the window - title (see 'icon'). On those, the interaction between 'title' and - 'icon' depend on the specific behavior of the terminal. + NOTE: GNU screen is not consistent in handling icon-title and title escape + sequences between versions. In particular, screen 5 may swap title and + icon-title. *'titlelen'* 'titlelen' number (default 85) From 726ce3094d12d683a95476b17ef39a91f5134351 Mon Sep 17 00:00:00 2001 From: Mao-Yining Date: Wed, 22 Jul 2026 09:44:53 +0000 Subject: [PATCH 167/647] runtime(doc): improve suggested detection method for WSL Current method can't work in Windows Terminal as far as I know. This is a way that already had been adopted in `dist/vim9.vim`. closes: #20714 Signed-off-by: Mao-Yining Signed-off-by: Christian Brabandt --- runtime/doc/os_win32.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/os_win32.txt b/runtime/doc/os_win32.txt index 694e0fe75c..666f265ec9 100644 --- a/runtime/doc/os_win32.txt +++ b/runtime/doc/os_win32.txt @@ -1,4 +1,4 @@ -*os_win32.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*os_win32.txt* For Vim version 9.2. Last change: 2026 Jul 22 VIM REFERENCE MANUAL by George Reilly @@ -48,7 +48,7 @@ For compiling see "src/INSTALLpc.txt". *win32-compiling* *WSL* When using Vim on WSL (Windows Subsystem for Linux) the remarks here do not apply, `has('win32')` will return false then. In case you need to know -whether Vim is running on WSL you can use `exists('$WSLENV')`. +whether Vim is running on WSL you can use `exists('$WSL_DISTRO_NAME')`. ============================================================================== 1. Known problems *win32-problems* From 4b767b99951a9f9c193dc4d45ad89803f2e82add Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Wed, 22 Jul 2026 09:48:19 +0000 Subject: [PATCH 168/647] patch 9.2.0829: Sessions do not preserve script version for expression options Problem: Sessions do not preserve script version for option holding expressions Solution: Remember script version for string options, and add a ":legacy" prefix for ":set"/":setlocal" calls when necessary Since patch v9.2.0579 (":mksession, :mkview and :mkvimrc emit legacy Vim script") session files are marked as Vim9 script. A few options have Vim expressions as their values. When inserted their values literally into a Vim9 script, these expressions are now evaluated as Vim9 expressions. But the original value might have been set by a legacy script. In order to be backward compatible and not break most of the existing file type plugin scripts, we need to consider the script version of the option value. If an option was set in a legacy script, or via "legacy set"/"legacy setlocal", we need to restore it using the "legacy" prefix as well. Options are not marked as expression options, vs string options, vs bool options. We only know if an option is a bool, number or a string option. It seems safe to set bool and number options using Vim9 semantics. But for string options we do not know if an option value is a Vim expression. And so, if it was set by a legacy script we just use a conservative approach and prefix the "set" or "setlocal" command with "legacy" for all string options set in a legacy context. related: #20152 closes: #20696 Signed-off-by: Illia Bobyr Signed-off-by: Christian Brabandt --- src/option.c | 71 ++++++++++++++-- src/proto/option.pro | 1 + src/testdir/test_mksession.vim | 144 +++++++++++++++++++++++++++++++-- src/version.c | 2 + 4 files changed, 206 insertions(+), 12 deletions(-) diff --git a/src/option.c b/src/option.c index 9a869fdb9b..d4f63203dd 100644 --- a/src/option.c +++ b/src/option.c @@ -56,7 +56,7 @@ static int find_key_option(char_u *arg_arg, int has_lt); static void showoptions(int all, int opt_flags); static int optval_default(struct vimoption *, char_u *varp, int compatible); static void showoneopt(struct vimoption *, int opt_flags); -static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, long_u flags); +static int put_setstring(FILE *fd, bool legacy, char *cmd, char *name, char_u **valuep, long_u flags); static int put_setnum(FILE *fd, char *cmd, char *name, long *valuep); static int put_setbool(FILE *fd, char *cmd, char *name, int value); static int istermoption(struct vimoption *p); @@ -3525,6 +3525,36 @@ set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx) } } +/* + * Returns true if an option value will be evaluated as a Vim9 script. + * Checks stored script context for the option. For options that have values in + * multiple contexts, opt_flags selects the desired context with OPT_GLOBAL, or + * OPT_LOCAL, selecting global or buffer/window context, respectively. + */ + bool +is_option_value_vim9(int opt_idx, int opt_flags) +{ + int indir = (int)options[opt_idx].indir; + sctx_T *sctx = NULL; + + if ((opt_flags & OPT_GLOBAL) || (indir & (PV_BUF|PV_WIN)) == 0) + sctx = &options[opt_idx].script_ctx; + + if ((opt_flags & OPT_LOCAL) || (indir & (PV_BUF|PV_WIN))) + { + if (indir & PV_BUF) + sctx = &curbuf->b_p_script_ctx[indir & PV_MASK]; + else if (indir & PV_WIN) + sctx = &curwin->w_p_script_ctx[indir & PV_MASK]; + } + + // If "sc_sid" is not set, it means the option value was not modified from + // the default yet. As we move towards Vim9 all the default values should + // be valid Vim9. + return !SCRIPT_ID_VALID(sctx->sc_sid) || + sctx->sc_version >= SCRIPT_VERSION_VIM9; +} + /* * Get the script context of global option "name". * @@ -6507,6 +6537,19 @@ makeset(FILE *fd, int opt_flags, int local_only) else // P_STRING { int do_endif = FALSE; + bool legacy; + +#ifdef FEAT_EVAL + legacy = !is_option_value_vim9(p - &options[0], + round == 1 ? opt_flags | OPT_GLOBAL : OPT_LOCAL); +#else + // I think none of the options that require expression + // evaluation will be present if expression evaluation is + // disabled. For example, 'includeexpr' is set to NULL if + // FEAT_EVAL is not present. So it should be safe to use + // normal "set" and "setlocal" in the session file. + legacy = false; +#endif // Don't set 'syntax' and 'filetype' again if the value is // already right, avoids reloading the syntax file. @@ -6522,8 +6565,8 @@ makeset(FILE *fd, int opt_flags, int local_only) return FAIL; do_endif = TRUE; } - if (put_setstring(fd, cmd, p->fullname, (char_u **)varp, - p->flags) == FAIL) + if (put_setstring(fd, legacy, cmd, p->fullname, + (char_u **)varp, p->flags) == FAIL) return FAIL; if (do_endif) { @@ -6545,14 +6588,23 @@ makeset(FILE *fd, int opt_flags, int local_only) int makefoldset(FILE *fd) { - if (put_setstring(fd, "setlocal", "fdm", &curwin->w_p_fdm, 0) == FAIL # ifdef FEAT_EVAL - || put_setstring(fd, "setlocal", "fde", &curwin->w_p_fde, 0) + sctx_T *fde_script_ctx = &curwin->w_p_script_ctx[WV_FDE]; + // Similarly to the check in is_option_value_vim9(), if "sc_id" is not set + // we have a default value, so it is safe to avoid the ":legacy" prefix. + bool fde_is_legacy = SCRIPT_ID_VALID(fde_script_ctx->sc_sid) + && fde_script_ctx->sc_version < SCRIPT_VERSION_VIM9; +# endif + + if (put_setstring(fd, false, "setlocal", "fdm", &curwin->w_p_fdm, 0) == FAIL +# ifdef FEAT_EVAL + || put_setstring(fd, fde_is_legacy, "setlocal", "fde", + &curwin->w_p_fde, 0) == FAIL # endif - || put_setstring(fd, "setlocal", "fmr", &curwin->w_p_fmr, 0) + || put_setstring(fd, false, "setlocal", "fmr", &curwin->w_p_fmr, 0) == FAIL - || put_setstring(fd, "setlocal", "fdi", &curwin->w_p_fdi, 0) + || put_setstring(fd, false, "setlocal", "fdi", &curwin->w_p_fdi, 0) == FAIL || put_setnum(fd, "setlocal", "fdl", &curwin->w_p_fdl) == FAIL || put_setnum(fd, "setlocal", "fml", &curwin->w_p_fml) == FAIL @@ -6568,6 +6620,7 @@ makefoldset(FILE *fd) static int put_setstring( FILE *fd, + bool legacy, char *cmd, char *name, char_u **valuep, @@ -6578,6 +6631,8 @@ put_setstring( char_u *part = NULL; char_u *p; + if (legacy && fprintf(fd, "legacy ") < 0) + return FAIL; if (fprintf(fd, "%s %s=", cmd, name) < 0) return FAIL; if (*valuep != NULL) @@ -6620,6 +6675,8 @@ put_setstring( p = buf; while (*p != NUL) { + if (legacy && fprintf(fd, "legacy ") < 0) + return FAIL; // for each comma separated option part, append value to // the option, :set rtp+=value if (fprintf(fd, "%s %s+=", cmd, name) < 0) diff --git a/src/proto/option.pro b/src/proto/option.pro index ae586ea978..c6945d80fe 100644 --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -22,6 +22,7 @@ int was_set_insecurely(win_T *wp, char_u *opt, int opt_flags); void redraw_titles(void); int valid_name(char_u *val, char *allowed); void set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx); +bool is_option_value_vim9(int opt_idx, int opt_flags); sctx_T *get_option_sctx(char *name); void set_term_option_sctx_idx(char *name, int opt_idx); char *did_set_arabic(optset_T *args); diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index f7384f601e..c11e8b849c 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -246,8 +246,8 @@ func Test_mksession_rtp() " determine expected value let expected=split(&rtp, ',') - let expected = map(expected, '"set runtimepath+=".v:val') - let expected = ['set runtimepath='] + expected + let expected = map(expected, '"legacy set runtimepath+=".v:val') + let expected = ['legacy set runtimepath='] + expected let expected = map(expected, {v,w -> substitute(w, $HOME, "~", "g")}) mksession! Xtest_mks.out @@ -1297,9 +1297,10 @@ func Test_mkvimrc() set wildcharm= call assert_fails('mkvimrc Xtestvimrc', 'E189: "Xtestvimrc" exists') mkvimrc! Xtestvimrc - call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set pastetoggle=')) - call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set wildchar=')) - call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set wildcharm=')) + let content = readfile('Xtestvimrc') + call assert_notequal(-1, index(content, 'legacy set pastetoggle=')) + call assert_notequal(-1, index(content, 'set wildchar=')) + call assert_notequal(-1, index(content, 'set wildcharm=')) set pastetoggle& wildchar& wildcharm& call delete('Xtestvimrc') @@ -1810,6 +1811,139 @@ func Test_mksession_vim9_duplicate_import() endfunc +" Make sure options are marked as legacy in the session file when they are set +" by the user from the command execution interface. Only applies to string +" options. +func Test_mksession_preserve_option_script_version_set_manually() + + let orig_includeexpr = &includeexpr + defer execute('let &includeexpr = orig_includeexpr') + + " Using "execute()" to simulate input from the user, rather than the option + " being set directly by the test script itself. + execute('set includeexpr=FooDefault(v:fname)') + + " Try a few options, to make sure they all work correctly. + new + execute('legacy set includeexpr=FooLegacy(v:fname)') + + new + execute('vim9 set includeexpr=FooVim9(v:fname)') + + mksession! XDummySession.vim + defer delete('XDummySession.vim') + + let session_content = readfile('XDummySession.vim') + " We expect that without an explicit script version specification the command + " line input is treated as legacy input. + call assert_notequal(-1, index(session_content, + \ 'legacy setlocal includeexpr=FooDefault(v:fname)')) + call assert_notequal(-1, index(session_content, + \ 'legacy setlocal includeexpr=FooLegacy(v:fname)')) + call assert_notequal(-1, index(session_content, + \ 'setlocal includeexpr=FooVim9(v:fname)')) +endfunc + +" Make sure options preserve legacy/Vim9 script version when written into the +" session file based on the original script that set those options. Only +" applies to string options. +func Test_mksession_preserve_option_script_version_set_from_script() + + CheckFeature packages + + const base = getcwd() . '/rtdir' + " clean up later + defer delete(base, 'rf') + let orig_packpath = &packpath + let &packpath .= ',' . base + defer execute('let &packpath = orig_packpath') + + " Is used to disable file type plugins. + let g:Global_run_ftplugins = 1 + defer execute('unlet g:Global_run_ftplugins') + + " We are going to create two simple file type plugins - one Vim9 and one + " legacy. Each will just set the "includeexpr" locally in the buffer to some + " value. + const root = base . '/pack/test/opt/test_option_script_version' + call mkdir(root . '/ftplugin', 'p') + + let vim9_ftplugin_sources =<< trim END + vim9script + + if !get(g:, 'Global_run_ftplugins') + finish + endif + + &l:include = 'vim9include' + &l:includeexpr = 'vim9fn(v:fname, 1)' + END + call writefile(vim9_ftplugin_sources, root . '/ftplugin/vim9test_lang.vim') + + let legacy_ftplugin_sources =<< trim END + if !get(g:, 'Global_run_ftplugins') + finish + endif + + setlocal include=legacyimport + setlocal includeexpr=legacyfn(v:fname,\".\") + END + call writefile(legacy_ftplugin_sources, root . '/ftplugin/legacytest_lang.vim') + + let orig_runtimepath = &runtimepath + packadd test_option_script_version + defer execute('let &runtimepath = orig_runtimepath') + + " Next we will create two buffers, and set "filetype" in each to match our two + " file type plugin names. The expectation is that "includeexpr" will be set + " to the correct value and a ":legacy" prefix will be used only when the + " original value was set by a legacy script. + filetype plugin on + set filetype=vim9test_lang + + new + set filetype=legacytest_lang + + mksession! XDummySession1.vim + defer delete('XDummySession1.vim') + + " Check that the session file indeed contains correctly set "includeexpr" + " values. + let session1_content = readfile('XDummySession1.vim') + call assert_notequal(-1, index(session1_content, + \ 'setlocal include=vim9include')) + call assert_notequal(-1, index(session1_content, + \ 'setlocal includeexpr=vim9fn(v:fname,\ 1)')) + call assert_notequal(-1, index(session1_content, + \ 'legacy setlocal include=legacyimport')) + call assert_notequal(-1, index(session1_content, + \ 'legacy setlocal includeexpr=legacyfn(v:fname,\".\")')) + + " Now disable our filetype plugins, restore the session file, save session + " again, and make sure that the options are still stored with correct Vim + " script version prefixes. + + let g:Global_run_ftplugins = 0 + %bwipe! + + source XDummySession1.vim + + mksession! XDummySession2.vim + defer delete('XDummySession2.vim') + + " Check that the session file indeed contains correctly set "includeexpr" + " values. + let session2_content = readfile('XDummySession2.vim') + call assert_notequal(-1, index(session2_content, + \ 'setlocal include=vim9include')) + call assert_notequal(-1, index(session2_content, + \ 'setlocal includeexpr=vim9fn(v:fname,\ 1)')) + call assert_notequal(-1, index(session2_content, + \ 'legacy setlocal include=legacyimport')) + call assert_notequal(-1, index(session2_content, + \ 'legacy setlocal includeexpr=legacyfn(v:fname,\".\")')) +endfunc + " 'winminwidth' restore must not fail when the session's saved 'winwidth' is " smaller than the sourcing context's 'winminwidth'. func Test_mksession_winminwidth() diff --git a/src/version.c b/src/version.c index 182dd1d240..7efb39e2a5 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 829, /**/ 828, /**/ From c86c70091df77697a75d3a1a644a1b09a0275e5a Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Wed, 22 Jul 2026 09:54:31 +0000 Subject: [PATCH 169/647] runtime(colors): update colorschemes 1. new colorscheme `novum` port of nvim dev_theme 2. minor updates to - catppuccin - habamax - lunaperche - retrobox - ron - shine - wildcharm closes: #20723 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/colors/catppuccin.vim | 41 ++- runtime/colors/habamax.vim | 42 ++- runtime/colors/lunaperche.vim | 38 +-- runtime/colors/novum.vim | 539 ++++++++++++++++++++++++++++++++++ runtime/colors/retrobox.vim | 4 +- runtime/colors/ron.vim | 11 +- runtime/colors/shine.vim | 4 +- runtime/colors/wildcharm.vim | 22 +- 8 files changed, 629 insertions(+), 72 deletions(-) create mode 100644 runtime/colors/novum.vim diff --git a/runtime/colors/catppuccin.vim b/runtime/colors/catppuccin.vim index b144332276..94a0a7c06c 100644 --- a/runtime/colors/catppuccin.vim +++ b/runtime/colors/catppuccin.vim @@ -3,9 +3,9 @@ " Author: The Catppuccin Community " Maintainer: Mao-Yining " URL: https://github.com/vim/colorschemes -" Last Change: 2026 May 04 +" Last Change: 2026 Jun 12 -" Generated by Colortemplate v3.0.0-rc1 +" Generated by Colortemplate v3.0.0-rc2 hi clear let g:colors_name = 'catppuccin' @@ -24,6 +24,7 @@ hi! link IncSearch CurSearch hi! link LineNrAbove LineNr hi! link LineNrBelow LineNr hi! link Number Constant +hi! link PopupBorder PmenuBorder hi! link PopupNotification WarningMsg hi! link PreCondit PreProc hi! link SpecialChar Special @@ -77,6 +78,7 @@ if &background == 'dark' hi NonText guifg=#6c7086 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=NONE hi Operator guifg=#89dceb guibg=NONE guisp=NONE gui=NONE ctermfg=116 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#9399b2 guibg=#181825 guisp=NONE gui=NONE ctermfg=103 ctermbg=232 cterm=NONE term=reverse + hi PmenuBorder guifg=#89b4fa guibg=#181825 guisp=NONE gui=NONE ctermfg=111 ctermbg=232 cterm=NONE term=NONE hi PmenuExtra guifg=#6c7086 guibg=#181825 guisp=NONE gui=NONE ctermfg=59 ctermbg=232 cterm=NONE term=NONE hi PmenuExtraSel guifg=#6c7086 guibg=#313244 guisp=NONE gui=bold ctermfg=59 ctermbg=236 cterm=bold term=bold hi PmenuMatch guifg=#cdd6f4 guibg=NONE guisp=NONE gui=bold ctermfg=189 ctermbg=NONE cterm=bold term=bold @@ -84,6 +86,8 @@ if &background == 'dark' hi PmenuSbar guifg=NONE guibg=#313244 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=reverse hi PmenuSel guifg=NONE guibg=#313244 guisp=NONE gui=bold ctermfg=NONE ctermbg=236 cterm=bold term=bold hi PmenuThumb guifg=NONE guibg=#6c7086 guisp=NONE gui=NONE ctermfg=NONE ctermbg=59 cterm=NONE term=NONE + hi Popup guifg=#cdd6f4 guibg=#181825 guisp=NONE gui=NONE ctermfg=189 ctermbg=232 cterm=NONE term=NONE + hi PopupTitle guifg=#a6adc8 guibg=#181825 guisp=NONE gui=NONE ctermfg=146 ctermbg=232 cterm=NONE term=NONE hi PreInsert guifg=#9399b2 guibg=NONE guisp=NONE gui=NONE ctermfg=103 ctermbg=NONE cterm=NONE term=NONE hi PreProc guifg=#f5c2e7 guibg=NONE guisp=NONE gui=NONE ctermfg=225 ctermbg=NONE cterm=NONE term=NONE hi Question guifg=#89b4fa guibg=NONE guisp=NONE gui=NONE ctermfg=111 ctermbg=NONE cterm=NONE term=standout @@ -115,7 +119,8 @@ if &background == 'dark' hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#f9e2af guibg=NONE guisp=NONE gui=NONE ctermfg=222 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline - hi VertSplit guifg=#11111b guibg=NONE guisp=NONE gui=NONE ctermfg=16 ctermbg=NONE cterm=NONE term=NONE + hi VertSplit guifg=#89b4fa guibg=NONE guisp=NONE gui=NONE ctermfg=111 ctermbg=NONE cterm=NONE term=NONE + hi VertSplitNC guifg=#11111b guibg=NONE guisp=NONE gui=NONE ctermfg=16 ctermbg=NONE cterm=NONE term=NONE hi Visual guifg=NONE guibg=#45475a guisp=NONE gui=NONE ctermfg=240 ctermbg=189 cterm=reverse term=reverse hi VisualNOS guifg=NONE guibg=#45475a guisp=NONE gui=bold ctermfg=NONE ctermbg=240 cterm=bold term=NONE hi WarningMsg guifg=#f9e2af guibg=NONE guisp=NONE gui=NONE ctermfg=222 ctermbg=NONE cterm=NONE term=standout @@ -204,6 +209,7 @@ if &background == 'dark' hi NonText ctermfg=Grey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Grey ctermbg=DarkGrey cterm=NONE + hi PmenuBorder ctermfg=Blue ctermbg=DarkGrey cterm=NONE hi PmenuExtra ctermfg=Grey ctermbg=DarkGrey cterm=NONE hi PmenuExtraSel ctermfg=Grey ctermbg=DarkYellow cterm=bold hi PmenuMatch ctermfg=White ctermbg=NONE cterm=bold @@ -211,6 +217,8 @@ if &background == 'dark' hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuSel ctermfg=NONE ctermbg=DarkYellow cterm=bold hi PmenuThumb ctermfg=NONE ctermbg=Grey cterm=NONE + hi Popup ctermfg=White ctermbg=DarkGrey cterm=NONE + hi PopupTitle ctermfg=White ctermbg=DarkGrey cterm=NONE hi PreInsert ctermfg=Grey ctermbg=NONE cterm=NONE hi PreProc ctermfg=Magenta ctermbg=NONE cterm=NONE hi Question ctermfg=Blue ctermbg=NONE cterm=NONE @@ -242,7 +250,8 @@ if &background == 'dark' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=Grey ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplitNC ctermfg=Grey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=Black cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=Black cterm=bold hi WarningMsg ctermfg=Yellow ctermbg=NONE cterm=NONE @@ -325,6 +334,7 @@ if &background == 'dark' hi NonText ctermfg=Grey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Grey ctermbg=DarkGrey cterm=NONE + hi PmenuBorder ctermfg=Blue ctermbg=DarkGrey cterm=NONE hi PmenuExtra ctermfg=Grey ctermbg=DarkGrey cterm=NONE hi PmenuExtraSel ctermfg=Grey ctermbg=DarkYellow cterm=bold hi PmenuMatch ctermfg=White ctermbg=NONE cterm=bold @@ -332,6 +342,8 @@ if &background == 'dark' hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuSel ctermfg=NONE ctermbg=DarkYellow cterm=bold hi PmenuThumb ctermfg=NONE ctermbg=Grey cterm=NONE + hi Popup ctermfg=White ctermbg=DarkGrey cterm=NONE + hi PopupTitle ctermfg=White ctermbg=DarkGrey cterm=NONE hi PreInsert ctermfg=Grey ctermbg=NONE cterm=NONE hi PreProc ctermfg=Magenta ctermbg=NONE cterm=NONE hi Question ctermfg=Blue ctermbg=NONE cterm=NONE @@ -363,7 +375,8 @@ if &background == 'dark' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=Grey ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplitNC ctermfg=Grey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=Black cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=Black cterm=bold hi WarningMsg ctermfg=Yellow ctermbg=NONE cterm=NONE @@ -463,6 +476,7 @@ if &background == 'light' hi NonText guifg=#9ca0b0 guibg=NONE guisp=NONE gui=NONE ctermfg=247 ctermbg=NONE cterm=NONE term=NONE hi Operator guifg=#04a5e5 guibg=NONE guisp=NONE gui=NONE ctermfg=39 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#7c7f93 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=103 ctermbg=255 cterm=NONE term=reverse + hi PmenuBorder guifg=#1e66f5 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=27 ctermbg=255 cterm=NONE term=NONE hi PmenuExtra guifg=#9ca0b0 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=247 ctermbg=255 cterm=NONE term=NONE hi PmenuExtraSel guifg=#9ca0b0 guibg=#ccd0da guisp=NONE gui=bold ctermfg=247 ctermbg=253 cterm=bold term=bold hi PmenuMatch guifg=#4c4f69 guibg=NONE guisp=NONE gui=bold ctermfg=236 ctermbg=NONE cterm=bold term=bold @@ -470,6 +484,8 @@ if &background == 'light' hi PmenuSbar guifg=NONE guibg=#ccd0da guisp=NONE gui=NONE ctermfg=NONE ctermbg=253 cterm=NONE term=reverse hi PmenuSel guifg=NONE guibg=#ccd0da guisp=NONE gui=bold ctermfg=NONE ctermbg=253 cterm=bold term=bold hi PmenuThumb guifg=NONE guibg=#9ca0b0 guisp=NONE gui=NONE ctermfg=NONE ctermbg=247 cterm=NONE term=NONE + hi Popup guifg=#4c4f69 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=236 ctermbg=255 cterm=NONE term=NONE + hi PopupTitle guifg=#6c6f85 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=60 ctermbg=255 cterm=NONE term=NONE hi PreInsert guifg=#7c7f93 guibg=NONE guisp=NONE gui=NONE ctermfg=103 ctermbg=NONE cterm=NONE term=NONE hi PreProc guifg=#ea76cb guibg=NONE guisp=NONE gui=NONE ctermfg=206 ctermbg=NONE cterm=NONE term=NONE hi Question guifg=#1e66f5 guibg=NONE guisp=NONE gui=NONE ctermfg=27 ctermbg=NONE cterm=NONE term=standout @@ -501,7 +517,8 @@ if &background == 'light' hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#df8e1d guibg=NONE guisp=NONE gui=NONE ctermfg=172 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline - hi VertSplit guifg=#dce0e8 guibg=NONE guisp=NONE gui=NONE ctermfg=254 ctermbg=NONE cterm=NONE term=NONE + hi VertSplit guifg=#1e66f5 guibg=NONE guisp=NONE gui=NONE ctermfg=27 ctermbg=NONE cterm=NONE term=NONE + hi VertSplitNC guifg=#dce0e8 guibg=NONE guisp=NONE gui=NONE ctermfg=254 ctermbg=NONE cterm=NONE term=NONE hi Visual guifg=NONE guibg=#bcc0cc guisp=NONE gui=NONE ctermfg=250 ctermbg=236 cterm=reverse term=reverse hi VisualNOS guifg=NONE guibg=#bcc0cc guisp=NONE gui=bold ctermfg=NONE ctermbg=250 cterm=bold term=NONE hi WarningMsg guifg=#df8e1d guibg=NONE guisp=NONE gui=NONE ctermfg=172 ctermbg=NONE cterm=NONE term=standout @@ -590,6 +607,7 @@ if &background == 'light' hi NonText ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Black ctermbg=Grey cterm=NONE + hi PmenuBorder ctermfg=Blue ctermbg=Grey cterm=NONE hi PmenuExtra ctermfg=DarkGrey ctermbg=Grey cterm=NONE hi PmenuExtraSel ctermfg=DarkGrey ctermbg=Grey cterm=bold hi PmenuMatch ctermfg=Black ctermbg=NONE cterm=bold @@ -597,6 +615,8 @@ if &background == 'light' hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuSel ctermfg=NONE ctermbg=Grey cterm=bold hi PmenuThumb ctermfg=NONE ctermbg=DarkGrey cterm=NONE + hi Popup ctermfg=Black ctermbg=Grey cterm=NONE + hi PopupTitle ctermfg=Black ctermbg=Grey cterm=NONE hi PreInsert ctermfg=Black ctermbg=NONE cterm=NONE hi PreProc ctermfg=Magenta ctermbg=NONE cterm=NONE hi Question ctermfg=Blue ctermbg=NONE cterm=NONE @@ -628,7 +648,8 @@ if &background == 'light' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=DarkGrey ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplitNC ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=White cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=White cterm=bold hi WarningMsg ctermfg=Yellow ctermbg=NONE cterm=NONE @@ -711,6 +732,7 @@ if &background == 'light' hi NonText ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Black ctermbg=Grey cterm=NONE + hi PmenuBorder ctermfg=Blue ctermbg=Grey cterm=NONE hi PmenuExtra ctermfg=DarkGrey ctermbg=Grey cterm=NONE hi PmenuExtraSel ctermfg=DarkGrey ctermbg=Grey cterm=bold hi PmenuMatch ctermfg=Black ctermbg=NONE cterm=bold @@ -718,6 +740,8 @@ if &background == 'light' hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuSel ctermfg=NONE ctermbg=Grey cterm=bold hi PmenuThumb ctermfg=NONE ctermbg=DarkGrey cterm=NONE + hi Popup ctermfg=Black ctermbg=Grey cterm=NONE + hi PopupTitle ctermfg=Black ctermbg=Grey cterm=NONE hi PreInsert ctermfg=Black ctermbg=NONE cterm=NONE hi PreProc ctermfg=Magenta ctermbg=NONE cterm=NONE hi Question ctermfg=Blue ctermbg=NONE cterm=NONE @@ -749,7 +773,8 @@ if &background == 'light' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=DarkGrey ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplitNC ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=White cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=White cterm=bold hi WarningMsg ctermfg=Yellow ctermbg=NONE cterm=NONE diff --git a/runtime/colors/habamax.vim b/runtime/colors/habamax.vim index 4958ccdb7d..ccc99278c2 100644 --- a/runtime/colors/habamax.vim +++ b/runtime/colors/habamax.vim @@ -3,7 +3,7 @@ " Author: Maxim Kim " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 May 28 +" Last Change: 2026 Jun 10 " Generated by Colortemplate v3.0.0-rc1 @@ -50,16 +50,10 @@ hi! link asciidoctorSetextHeaderDelimiter Statement hi! link asciidoctorTitle htmlH1 hi! link javaScriptFunction Statement hi! link javaScriptIdentifier Statement -hi! link lspDiagSignErrorText Removed -hi! link lspDiagSignHintText Added -hi! link lspDiagSignInfoText Question -hi! link lspDiagSignWarningText Changed hi! link lspDiagVirtualTextError Removed -hi! link lspDiagVirtualTextHint Added -hi! link lspDiagVirtualTextInfo Question -hi! link lspDiagVirtualTextWarning Changed hi! link markdownHeadingRule Special -hi! link markdownUrl String +hi! link markdownLinkText String +hi! link markdownUrl Underlined hi! link rstSection htmlH1 hi! link rubyDefine Statement hi! link rubyMacro Statement @@ -204,16 +198,16 @@ if s:t_Co >= 16 hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuBorder ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuExtra ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuExtraSel ctermfg=NONE ctermbg=NONE cterm=bold - hi PmenuKind ctermfg=NONE ctermbg=NONE cterm=bold,reverse - hi PmenuKindSel ctermfg=NONE ctermbg=NONE cterm=bold - hi PmenuMatch ctermfg=NONE ctermbg=darkred cterm=reverse - hi PmenuMatchSel ctermfg=darkred ctermbg=NONE cterm=bold + hi Pmenu ctermfg=black ctermbg=gray cterm=NONE + hi PmenuBorder ctermfg=black ctermbg=gray cterm=NONE + hi PmenuExtra ctermfg=black ctermbg=gray cterm=NONE + hi PmenuExtraSel ctermfg=gray ctermbg=black cterm=NONE + hi PmenuKind ctermfg=gray ctermbg=black cterm=NONE + hi PmenuKindSel ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuMatch ctermfg=black ctermbg=gray cterm=bold + hi PmenuMatchSel ctermfg=gray ctermbg=black cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuSel ctermfg=gray ctermbg=black cterm=NONE hi PmenuShadow ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=NONE hi Popup ctermfg=NONE ctermbg=NONE cterm=reverse @@ -294,13 +288,13 @@ if s:t_Co >= 8 hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse hi PmenuBorder ctermfg=NONE ctermbg=NONE cterm=reverse hi PmenuExtra ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuExtraSel ctermfg=NONE ctermbg=NONE cterm=bold - hi PmenuKind ctermfg=NONE ctermbg=NONE cterm=bold,reverse - hi PmenuKindSel ctermfg=NONE ctermbg=NONE cterm=bold - hi PmenuMatch ctermfg=NONE ctermbg=darkred cterm=reverse - hi PmenuMatchSel ctermfg=darkred ctermbg=NONE cterm=bold + hi PmenuExtraSel ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuKind ctermfg=NONE ctermbg=NONE cterm=reverse + hi PmenuKindSel ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuMatch ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuMatchSel ctermfg=black ctermbg=NONE cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuSel ctermfg=black ctermbg=NONE cterm=NONE hi PmenuShadow ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=NONE hi Popup ctermfg=NONE ctermbg=NONE cterm=reverse diff --git a/runtime/colors/lunaperche.vim b/runtime/colors/lunaperche.vim index 15cd28c3ec..a069587b3e 100644 --- a/runtime/colors/lunaperche.vim +++ b/runtime/colors/lunaperche.vim @@ -2,7 +2,7 @@ " Description: White(perchè il sole)/Black(la luna perchè?) background colorscheme. " Author: Maxim Kim " URL: https://www.github.com/vim/colorschemes -" Last Change: 2026 Apr 30 +" Last Change: 2026 Jun 10 " Generated by Colortemplate v3.0.0-rc1 @@ -58,7 +58,8 @@ hi! link javaScriptIdentifier Statement hi! link javaStorageClass Statement hi! link javaType Statement hi! link markdownHeadingDelimiter Special -hi! link markdownUrl String +hi! link markdownLinkText String +hi! link markdownUrl Underlined hi! link phpComparison Normal hi! link phpDefine Statement hi! link phpDocCustomTags phpDocTags @@ -179,15 +180,6 @@ if &background == 'dark' hi WildMenu guifg=#000000 guibg=#ffd787 guisp=NONE gui=bold ctermfg=16 ctermbg=222 cterm=bold term=bold hi debugBreakpoint guifg=#5fafaf guibg=NONE guisp=NONE gui=reverse ctermfg=73 ctermbg=NONE cterm=reverse term=reverse hi debugPC guifg=#5f87af guibg=NONE guisp=NONE gui=reverse ctermfg=67 ctermbg=NONE cterm=reverse term=reverse - hi dirGroup guifg=#767676 guibg=NONE guisp=NONE gui=NONE ctermfg=243 ctermbg=NONE cterm=NONE term=NONE - hi dirOwner guifg=#767676 guibg=NONE guisp=NONE gui=NONE ctermfg=243 ctermbg=NONE cterm=NONE term=NONE - hi dirPermissionGroup guifg=#af875f guibg=NONE guisp=NONE gui=NONE ctermfg=137 ctermbg=NONE cterm=NONE term=NONE - hi dirPermissionOther guifg=#5fafaf guibg=NONE guisp=NONE gui=NONE ctermfg=73 ctermbg=NONE cterm=NONE term=NONE - hi dirPermissionUser guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE cterm=NONE term=NONE - hi dirSize guifg=#ffd787 guibg=NONE guisp=NONE gui=NONE ctermfg=222 ctermbg=NONE cterm=NONE term=NONE - hi dirSizeMod guifg=#d787d7 guibg=NONE guisp=NONE gui=NONE ctermfg=176 ctermbg=NONE cterm=NONE term=NONE - hi dirTime guifg=#767676 guibg=NONE guisp=NONE gui=NONE ctermfg=243 ctermbg=NONE cterm=NONE term=NONE - hi dirType guifg=#d787d7 guibg=NONE guisp=NONE gui=NONE ctermfg=176 ctermbg=NONE cterm=NONE term=NONE if s:tgc || s:t_Co >= 256 if s:tgc @@ -229,7 +221,7 @@ if &background == 'dark' hi MoreMsg ctermfg=green ctermbg=NONE cterm=NONE hi NonText ctermfg=grey ctermbg=NONE cterm=NONE hi Pmenu ctermfg=black ctermbg=grey cterm=NONE - hi PmenuBorder ctermfg=NONE ctermbg=grey cterm=NONE + hi PmenuBorder ctermfg=darkgrey ctermbg=grey cterm=NONE hi PmenuExtra ctermfg=black ctermbg=grey cterm=NONE hi PmenuExtraSel ctermfg=black ctermbg=darkcyan cterm=NONE hi PmenuKind ctermfg=darkred ctermbg=grey cterm=NONE @@ -275,15 +267,6 @@ if &background == 'dark' hi WildMenu ctermfg=black ctermbg=yellow cterm=bold hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse - hi dirGroup ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi dirOwner ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi dirPermissionGroup ctermfg=darkyellow ctermbg=NONE cterm=NONE - hi dirPermissionOther ctermfg=darkcyan ctermbg=NONE cterm=NONE - hi dirPermissionUser ctermfg=darkgreen ctermbg=NONE cterm=NONE - hi dirSize ctermfg=yellow ctermbg=NONE cterm=NONE - hi dirSizeMod ctermfg=darkmagenta ctermbg=NONE cterm=NONE - hi dirTime ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi dirType ctermfg=darkmagenta ctermbg=NONE cterm=NONE finish endif @@ -317,7 +300,7 @@ if &background == 'dark' hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE hi NonText ctermfg=grey ctermbg=NONE cterm=NONE hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuBorder ctermfg=darkgrey ctermbg=darkgrey cterm=NONE + hi PmenuBorder ctermfg=black ctermbg=grey cterm=NONE hi PmenuExtra ctermfg=NONE ctermbg=NONE cterm=reverse hi PmenuExtraSel ctermfg=NONE ctermbg=NONE cterm=bold hi PmenuKind ctermfg=NONE ctermbg=NONE cterm=bold,reverse @@ -363,15 +346,6 @@ if &background == 'dark' hi WildMenu ctermfg=black ctermbg=darkyellow cterm=bold hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse - hi dirGroup ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi dirOwner ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi dirPermissionGroup ctermfg=darkyellow ctermbg=NONE cterm=NONE - hi dirPermissionOther ctermfg=darkcyan ctermbg=NONE cterm=NONE - hi dirPermissionUser ctermfg=darkgreen ctermbg=NONE cterm=NONE - hi dirSize ctermfg=yellow ctermbg=NONE cterm=NONE - hi dirSizeMod ctermfg=darkmagenta ctermbg=NONE cterm=NONE - hi dirTime ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi dirType ctermfg=darkmagenta ctermbg=NONE cterm=NONE finish endif @@ -614,7 +588,7 @@ if &background == 'light' hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE hi NonText ctermfg=black ctermbg=NONE cterm=NONE hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse - hi PmenuBorder ctermfg=darkgrey ctermbg=grey cterm=NONE + hi PmenuBorder ctermfg=grey ctermbg=black cterm=NONE hi PmenuExtra ctermfg=NONE ctermbg=NONE cterm=reverse hi PmenuExtraSel ctermfg=NONE ctermbg=NONE cterm=bold hi PmenuKind ctermfg=NONE ctermbg=NONE cterm=bold,reverse diff --git a/runtime/colors/novum.vim b/runtime/colors/novum.vim new file mode 100644 index 0000000000..d1b92e0e46 --- /dev/null +++ b/runtime/colors/novum.vim @@ -0,0 +1,539 @@ +" Name: novum +" Description: port of nvim dev_theme +" Author: Charan Mandati +" License: Vim License (see `:help license`)` +" Last Change: 2026 Jun 17 + +" Generated by Colortemplate v3.0.0-rc1 + +hi clear +let g:colors_name = 'novum' + +let s:t_Co = has('gui_running') ? 16777216 : str2nr(&t_Co) +let s:tgc = has('termguicolors') && &termguicolors + +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Statement +hi! link CursorIM Cursor +hi! link CursorLineFold SignColumn +hi! link CursorLineSign SignColumn +hi! link Debug Special +hi! link Define PreProc +hi! link EndOfBuffer NonText +hi! link Exception Statement +hi! link Float Constant +hi! link FoldColumn SignColumn +hi! link Ignore Normal +hi! link IncSearch CurSearch +hi! link Include PreProc +hi! link Keyword Statement +hi! link Label Statement +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link Macro PreProc +hi! link Number Constant +hi! link PmenuExtra Pmenu +hi! link PmenuExtraSel PmenuSel +hi! link PmenuKind Pmenu +hi! link PmenuKindSel PmenuSel +hi! link PmenuSbar Pmenu +hi! link PopupNotification Normal +hi! link PreCondit PreProc +hi! link PreInsert Added +hi! link Repeat Statement +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link StorageClass Type +hi! link Structure Type +hi! link TabLine StatusLineNC +hi! link TabLineFill StatusLineNC +hi! link Tag Special +hi! link Terminal Normal +hi! link Typedef Type +hi! link VertSplit Normal +hi! link VisualNOS Visual +hi! link WildMenu PmenuSel + +if &background == 'dark' + let g:terminal_ansi_colors = ['#eef1f8', '#ffc0b9', '#b3f6c0', '#fce094', '#a6dbff', '#ff0000', '#8cf8f7', '#9b9ea4', '#2c2e33', '#590008', '#005523', '#6b5300', '#007373', '#4f5258', '#07080d', '#14161b'] + + hi Normal guifg=#e0e2ea guibg=#14161b guisp=NONE gui=NONE ctermfg=188 ctermbg=233 cterm=NONE term=NONE + hi Added guifg=#b3f6c0 guibg=NONE guisp=NONE gui=NONE ctermfg=157 ctermbg=NONE cterm=NONE term=NONE + hi Changed guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE + hi ColorColumn guifg=NONE guibg=#4f5258 guisp=NONE gui=NONE ctermfg=NONE ctermbg=59 cterm=NONE term=reverse + hi Comment guifg=#9b9ea4 guibg=NONE guisp=NONE gui=NONE ctermfg=145 ctermbg=NONE cterm=NONE term=bold + hi Conceal guifg=#4f5258 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=NONE + hi Constant guifg=#e0e2ea guibg=NONE guisp=NONE gui=NONE ctermfg=188 ctermbg=NONE cterm=NONE term=NONE + hi CurSearch guifg=#07080d guibg=#fce094 guisp=NONE gui=NONE ctermfg=232 ctermbg=222 cterm=NONE term=reverse + hi Cursor guifg=bg guibg=fg guisp=NONE gui=NONE ctermfg=bg ctermbg=fg cterm=NONE term=reverse + hi CursorColumn guifg=NONE guibg=#2c2e33 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=NONE + hi CursorLine guifg=NONE guibg=#37393f guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=underline + hi CursorLineNr guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold + hi Delimiter guifg=#e0e2ea guibg=NONE guisp=NONE gui=NONE ctermfg=188 ctermbg=NONE cterm=NONE term=NONE + hi DiffAdd guifg=#eef1f8 guibg=#005523 guisp=NONE gui=NONE ctermfg=231 ctermbg=22 cterm=NONE term=reverse + hi DiffChange guifg=#eef1f8 guibg=#384851 guisp=NONE gui=NONE ctermfg=231 ctermbg=239 cterm=NONE term=NONE + hi DiffDelete guifg=#ffc0b9 guibg=NONE guisp=NONE gui=bold ctermfg=217 ctermbg=NONE cterm=bold term=reverse + hi DiffText guifg=#eef1f8 guibg=#007373 guisp=NONE gui=NONE ctermfg=231 ctermbg=30 cterm=NONE term=reverse + hi Directory guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE + hi Error guifg=#eef1f8 guibg=#590008 guisp=NONE gui=NONE ctermfg=231 ctermbg=52 cterm=NONE term=bold,reverse + hi ErrorMsg guifg=#ffc0b9 guibg=NONE guisp=NONE gui=NONE ctermfg=217 ctermbg=NONE cterm=NONE term=bold,reverse + hi Folded guifg=#9b9ea4 guibg=#07080d guisp=NONE gui=NONE ctermfg=145 ctermbg=232 cterm=NONE term=NONE + hi Function guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE + hi Identifier guifg=#a6dbff guibg=NONE guisp=NONE gui=NONE ctermfg=153 ctermbg=NONE cterm=NONE term=NONE + hi LineNr guifg=#4f5258 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=NONE + hi MatchParen guifg=#ff0000 guibg=NONE guisp=NONE gui=bold ctermfg=196 ctermbg=NONE cterm=bold term=bold,underline + hi ModeMsg guifg=#b3f6c0 guibg=NONE guisp=NONE gui=NONE ctermfg=157 ctermbg=NONE cterm=NONE term=bold + hi MoreMsg guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE + hi NonText guifg=#4f5258 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=NONE + hi Operator guifg=#e0e2ea guibg=NONE guisp=NONE gui=NONE ctermfg=188 ctermbg=NONE cterm=NONE term=NONE + hi Pmenu guifg=#e0e2ea guibg=#2c2e33 guisp=NONE gui=NONE ctermfg=188 ctermbg=236 cterm=NONE term=reverse + hi PmenuMatch guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold + hi PmenuMatchSel guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold + hi PmenuSel guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse term=bold + hi PmenuThumb guifg=#e0e2ea guibg=#4f5258 guisp=NONE gui=NONE ctermfg=188 ctermbg=59 cterm=NONE term=NONE + hi PopupTitle guifg=#e0e2ea guibg=#2c2e33 guisp=NONE gui=bold ctermfg=188 ctermbg=236 cterm=bold term=bold + hi PreProc guifg=#e0e2ea guibg=NONE guisp=NONE gui=NONE ctermfg=188 ctermbg=NONE cterm=NONE term=NONE + hi Question guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=standout + hi QuickFixLine guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE + hi Removed guifg=#ffc0b9 guibg=NONE guisp=NONE gui=NONE ctermfg=217 ctermbg=NONE cterm=NONE term=NONE + hi Search guifg=#eef1f8 guibg=#6b5300 guisp=NONE gui=NONE ctermfg=231 ctermbg=58 cterm=NONE term=reverse + hi SignColumn guifg=#4f5258 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=reverse + hi Special guifg=#8cf8f7 guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE + hi SpecialKey guifg=#4f5258 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=bold + hi SpellBad guifg=NONE guibg=NONE guisp=#ffc0b9 gui=undercurl ctermfg=217 ctermbg=NONE cterm=underline term=underline + hi SpellCap guifg=NONE guibg=NONE guisp=#fce094 gui=undercurl ctermfg=222 ctermbg=NONE cterm=underline term=underline + hi SpellLocal guifg=NONE guibg=NONE guisp=#b3f6c0 gui=undercurl ctermfg=157 ctermbg=NONE cterm=underline term=underline + hi SpellRare guifg=NONE guibg=NONE guisp=#8cf8f7 gui=undercurl ctermfg=123 ctermbg=NONE cterm=underline term=underline + hi Statement guifg=#e0e2ea guibg=NONE guisp=NONE gui=bold ctermfg=188 ctermbg=NONE cterm=bold term=NONE + hi StatusLine guifg=#e0e2ea guibg=#4f5258 guisp=NONE gui=NONE ctermfg=188 ctermbg=59 cterm=NONE term=bold,reverse + hi StatusLineNC guifg=#c4c6cd guibg=#2c2e33 guisp=NONE gui=NONE ctermfg=251 ctermbg=236 cterm=NONE term=bold,underline + hi String guifg=#b3f6c0 guibg=NONE guisp=NONE gui=NONE ctermfg=157 ctermbg=NONE cterm=NONE term=NONE + hi TabLineSel guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold,reverse + hi Title guifg=#e0e2ea guibg=NONE guisp=NONE gui=bold ctermfg=188 ctermbg=NONE cterm=bold term=NONE + hi TitleBar guifg=#eef1f8 guibg=#4f5258 guisp=NONE gui=NONE ctermfg=231 ctermbg=59 cterm=NONE term=NONE + hi TitleBarNC guifg=#c4c6cd guibg=#07080d guisp=NONE gui=NONE ctermfg=251 ctermbg=232 cterm=NONE term=NONE + hi Todo guifg=#e0e2ea guibg=NONE guisp=NONE gui=bold ctermfg=188 ctermbg=NONE cterm=bold term=bold,reverse + hi ToolbarButton guifg=#9b9ea4 guibg=#07080d guisp=NONE gui=bold ctermfg=145 ctermbg=232 cterm=bold term=bold,reverse + hi ToolbarLine guifg=NONE guibg=#07080d guisp=NONE gui=NONE ctermfg=NONE ctermbg=232 cterm=NONE term=reverse + hi Type guifg=#e0e2ea guibg=NONE guisp=NONE gui=NONE ctermfg=188 ctermbg=NONE cterm=NONE term=NONE + hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline + hi VertSplitNC guifg=#2c2e33 guibg=NONE guisp=NONE gui=NONE ctermfg=236 ctermbg=NONE cterm=NONE term=NONE + hi Visual guifg=NONE guibg=#4f5258 guisp=NONE gui=NONE ctermfg=NONE ctermbg=59 cterm=NONE term=reverse + hi WarningMsg guifg=#fce094 guibg=NONE guisp=NONE gui=NONE ctermfg=222 ctermbg=NONE cterm=NONE term=standout + hi debugBreakpoint guifg=#eef1f8 guibg=#590008 guisp=NONE gui=NONE ctermfg=231 ctermbg=52 cterm=NONE term=NONE + hi debugPC guifg=#eef1f8 guibg=#007373 guisp=NONE gui=NONE ctermfg=231 ctermbg=30 cterm=NONE term=NONE + hi lCursor guifg=bg guibg=fg guisp=NONE gui=NONE ctermfg=bg ctermbg=fg cterm=NONE term=NONE + + if s:tgc || s:t_Co >= 256 + finish + endif + + if s:t_Co >= 16 + hi Normal ctermfg=LightGray ctermbg=Black cterm=NONE + hi Added ctermfg=LightGreen ctermbg=NONE cterm=NONE + hi Changed ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=DarkGray cterm=NONE + hi Comment ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Conceal ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Constant ctermfg=LightGray ctermbg=NONE cterm=NONE + hi CurSearch ctermfg=Black ctermbg=Yellow cterm=bold,reverse + hi Cursor ctermfg=bg ctermbg=fg cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=DarkGray cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=DarkGray cterm=underline + hi CursorLineNr ctermfg=Yellow ctermbg=NONE cterm=NONE + hi Delimiter ctermfg=LightGray ctermbg=NONE cterm=NONE + hi DiffAdd ctermfg=White ctermbg=DarkGreen cterm=NONE + hi DiffChange ctermfg=White ctermbg=LightBlue cterm=NONE + hi DiffDelete ctermfg=Red ctermbg=NONE cterm=bold + hi DiffText ctermfg=White ctermbg=DarkCyan cterm=NONE + hi Directory ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi Error ctermfg=White ctermbg=DarkRed cterm=NONE + hi ErrorMsg ctermfg=Red ctermbg=NONE cterm=NONE + hi Folded ctermfg=Black ctermbg=Brown cterm=NONE + hi Function ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=LightBlue ctermbg=NONE cterm=NONE + hi LineNr ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=Red ctermbg=NONE cterm=bold + hi ModeMsg ctermfg=LightGreen ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi NonText ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Operator ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=LightGray ctermbg=DarkGray cterm=NONE + hi PmenuMatch ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuMatchSel ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=reverse + hi PmenuThumb ctermfg=LightGray ctermbg=DarkGray cterm=NONE + hi PopupTitle ctermfg=LightGray ctermbg=DarkGray cterm=bold + hi PreProc ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Question ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi Removed ctermfg=Red ctermbg=NONE cterm=NONE + hi Search ctermfg=White ctermbg=DarkRed cterm=NONE + hi SignColumn ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Special ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=Red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=Yellow ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=LightGreen ctermbg=NONE cterm=underline + hi SpellRare ctermfg=LightCyan ctermbg=NONE cterm=underline + hi Statement ctermfg=LightGray ctermbg=NONE cterm=bold + hi StatusLine ctermfg=LightGray ctermbg=DarkGray cterm=NONE + hi StatusLineNC ctermfg=LightGray ctermbg=DarkGray cterm=NONE + hi String ctermfg=LightGreen ctermbg=NONE cterm=NONE + hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold + hi Title ctermfg=LightGray ctermbg=NONE cterm=bold + hi TitleBar ctermfg=White ctermbg=DarkGray cterm=NONE + hi TitleBarNC ctermfg=LightGray ctermbg=Black cterm=NONE + hi Todo ctermfg=LightGray ctermbg=NONE cterm=bold + hi ToolbarButton ctermfg=DarkGray ctermbg=Black cterm=bold + hi ToolbarLine ctermfg=NONE ctermbg=Black cterm=NONE + hi Type ctermfg=LightGray ctermbg=NONE cterm=bold + hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline + hi VertSplitNC ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=DarkGray cterm=NONE + hi WarningMsg ctermfg=Yellow ctermbg=NONE cterm=NONE + hi debugBreakpoint ctermfg=White ctermbg=DarkRed cterm=NONE + hi debugPC ctermfg=White ctermbg=DarkCyan cterm=NONE + hi lCursor ctermfg=bg ctermbg=fg cterm=NONE + finish + endif + + if s:t_Co >= 8 + hi Normal ctermfg=LightGray ctermbg=Black cterm=NONE + hi Added ctermfg=LightGreen ctermbg=NONE cterm=NONE + hi Changed ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=Black cterm=NONE + hi Comment ctermfg=Brown ctermbg=NONE cterm=bold + hi Conceal ctermfg=Brown ctermbg=NONE cterm=NONE + hi Constant ctermfg=LightGray ctermbg=NONE cterm=NONE + hi CurSearch ctermfg=Black ctermbg=Yellow cterm=NONE + hi Cursor ctermfg=bg ctermbg=fg cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold + hi Delimiter ctermfg=LightGray ctermbg=NONE cterm=NONE + hi DiffAdd ctermfg=White ctermbg=DarkGreen cterm=NONE + hi DiffChange ctermfg=White ctermbg=LightBlue cterm=NONE + hi DiffDelete ctermfg=Red ctermbg=NONE cterm=bold + hi DiffText ctermfg=White ctermbg=DarkCyan cterm=NONE + hi Directory ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi Error ctermfg=White ctermbg=DarkRed cterm=NONE + hi ErrorMsg ctermfg=Red ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=Brown ctermbg=NONE cterm=NONE + hi Folded ctermfg=Brown ctermbg=NONE cterm=NONE + hi Function ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=LightBlue ctermbg=NONE cterm=NONE + hi LineNr ctermfg=Brown ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=Yellow ctermbg=NONE cterm=bold + hi ModeMsg ctermfg=LightGreen ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi NonText ctermfg=Brown ctermbg=NONE cterm=NONE + hi Operator ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=LightGray ctermbg=DarkGray cterm=NONE + hi PmenuMatch ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuMatchSel ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=reverse + hi PmenuThumb ctermfg=LightGray ctermbg=DarkGray cterm=NONE + hi PopupTitle ctermfg=LightGray ctermbg=DarkGray cterm=bold + hi PreProc ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Question ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi Removed ctermfg=Red ctermbg=NONE cterm=NONE + hi Search ctermfg=White ctermbg=Brown cterm=NONE + hi SignColumn ctermfg=Brown ctermbg=NONE cterm=NONE + hi Special ctermfg=LightCyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=Brown ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=Red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=Yellow ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=LightGreen ctermbg=NONE cterm=underline + hi SpellRare ctermfg=LightCyan ctermbg=NONE cterm=underline + hi Statement ctermfg=LightGray ctermbg=NONE cterm=bold + hi StatusLine ctermfg=NONE ctermbg=NONE cterm=bold,reverse + hi StatusLineNC ctermfg=NONE ctermbg=NONE cterm=reverse + hi String ctermfg=LightGreen ctermbg=NONE cterm=NONE + hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold + hi Title ctermfg=LightGray ctermbg=NONE cterm=bold + hi TitleBar ctermfg=White ctermbg=DarkGray cterm=NONE + hi TitleBarNC ctermfg=LightGray ctermbg=Black cterm=NONE + hi Todo ctermfg=LightGray ctermbg=NONE cterm=bold + hi ToolbarButton ctermfg=DarkGray ctermbg=Black cterm=bold + hi ToolbarLine ctermfg=NONE ctermbg=Black cterm=NONE + hi Type ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline + hi VertSplitNC ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse + hi WarningMsg ctermfg=Yellow ctermbg=NONE cterm=NONE + hi debugBreakpoint ctermfg=White ctermbg=DarkRed cterm=NONE + hi debugPC ctermfg=White ctermbg=DarkCyan cterm=NONE + hi lCursor ctermfg=bg ctermbg=fg cterm=NONE + finish + endif + + if s:t_Co >= 0 + hi CursorIM term=NONE + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi EndOfBuffer term=NONE + hi Float term=NONE + hi FoldColumn term=NONE + hi Ignore term=NONE + hi IncSearch term=bold,reverse,underline + hi Number term=NONE + hi PmenuSbar term=reverse + hi StatusLineTerm term=bold,reverse + hi StatusLineTermNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi VertSplit term=NONE + hi VisualNOS term=NONE + hi WildMenu term=bold + finish + endif + + finish +endif + +if &background == 'light' + let g:terminal_ansi_colors = ['#07080d', '#590008', '#005523', '#6b5300', '#004c73', '#ff0000', '#007373', '#4f5258', '#c4c6cd', '#ffc0b9', '#b3f6c0', '#fce094', '#8cf8f7', '#9b9ea4', '#eef1f8', '#e0e2ea'] + + hi Normal guifg=#14161b guibg=#e0e2ea guisp=NONE gui=NONE ctermfg=233 ctermbg=188 cterm=NONE term=NONE + hi Added guifg=#005523 guibg=NONE guisp=NONE gui=NONE ctermfg=22 ctermbg=NONE cterm=NONE term=NONE + hi Changed guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=NONE + hi ColorColumn guifg=NONE guibg=#9b9ea4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=145 cterm=NONE term=reverse + hi Comment guifg=#4f5258 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=bold + hi Conceal guifg=#9b9ea4 guibg=NONE guisp=NONE gui=NONE ctermfg=145 ctermbg=NONE cterm=NONE term=NONE + hi Constant guifg=#14161b guibg=NONE guisp=NONE gui=NONE ctermfg=233 ctermbg=NONE cterm=NONE term=NONE + hi CurSearch guifg=#eef1f8 guibg=#6b5300 guisp=NONE gui=NONE ctermfg=231 ctermbg=58 cterm=NONE term=reverse + hi Cursor guifg=bg guibg=fg guisp=NONE gui=NONE ctermfg=bg ctermbg=fg cterm=NONE term=reverse + hi CursorColumn guifg=NONE guibg=#c4c6cd guisp=NONE gui=NONE ctermfg=NONE ctermbg=251 cterm=NONE term=NONE + hi CursorLine guifg=NONE guibg=#d4d6dd guisp=NONE gui=NONE ctermfg=NONE ctermbg=254 cterm=NONE term=underline + hi CursorLineNr guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold + hi Delimiter guifg=#14161b guibg=NONE guisp=NONE gui=NONE ctermfg=233 ctermbg=NONE cterm=NONE term=NONE + hi DiffAdd guifg=#07080d guibg=#b3f6c0 guisp=NONE gui=NONE ctermfg=232 ctermbg=157 cterm=NONE term=reverse + hi DiffChange guifg=#07080d guibg=#b8cfc7 guisp=NONE gui=NONE ctermfg=232 ctermbg=152 cterm=NONE term=NONE + hi DiffDelete guifg=#590008 guibg=NONE guisp=NONE gui=bold ctermfg=52 ctermbg=NONE cterm=bold term=reverse + hi DiffText guifg=#07080d guibg=#8cf8f7 guisp=NONE gui=NONE ctermfg=232 ctermbg=30 cterm=NONE term=reverse + hi Directory guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=NONE + hi Error guifg=#07080d guibg=#ffc0b9 guisp=NONE gui=NONE ctermfg=232 ctermbg=217 cterm=NONE term=bold,reverse + hi ErrorMsg guifg=#590008 guibg=NONE guisp=NONE gui=NONE ctermfg=52 ctermbg=NONE cterm=NONE term=bold,reverse + hi Folded guifg=#4f5258 guibg=#eef1f8 guisp=NONE gui=NONE ctermfg=59 ctermbg=231 cterm=NONE term=NONE + hi Function guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=NONE + hi Identifier guifg=#004c73 guibg=NONE guisp=NONE gui=NONE ctermfg=24 ctermbg=NONE cterm=NONE term=NONE + hi LineNr guifg=#9b9ea4 guibg=NONE guisp=NONE gui=NONE ctermfg=145 ctermbg=NONE cterm=NONE term=NONE + hi MatchParen guifg=#ff0000 guibg=NONE guisp=NONE gui=bold ctermfg=196 ctermbg=NONE cterm=bold term=bold,underline + hi ModeMsg guifg=#005523 guibg=NONE guisp=NONE gui=NONE ctermfg=22 ctermbg=NONE cterm=NONE term=bold + hi MoreMsg guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=NONE + hi NonText guifg=#9b9ea4 guibg=NONE guisp=NONE gui=NONE ctermfg=145 ctermbg=NONE cterm=NONE term=NONE + hi Operator guifg=#14161b guibg=NONE guisp=NONE gui=NONE ctermfg=233 ctermbg=NONE cterm=NONE term=NONE + hi Pmenu guifg=#14161b guibg=#c4c6cd guisp=NONE gui=NONE ctermfg=233 ctermbg=251 cterm=NONE term=reverse + hi PmenuMatch guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold + hi PmenuMatchSel guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold + hi PmenuSel guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse term=bold + hi PmenuThumb guifg=#14161b guibg=#9b9ea4 guisp=NONE gui=NONE ctermfg=233 ctermbg=145 cterm=NONE term=NONE + hi PopupTitle guifg=#14161b guibg=#c4c6cd guisp=NONE gui=bold ctermfg=233 ctermbg=251 cterm=bold term=bold + hi PreProc guifg=#14161b guibg=NONE guisp=NONE gui=NONE ctermfg=233 ctermbg=NONE cterm=NONE term=NONE + hi Question guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=standout + hi QuickFixLine guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=NONE + hi Removed guifg=#590008 guibg=NONE guisp=NONE gui=NONE ctermfg=52 ctermbg=NONE cterm=NONE term=NONE + hi Search guifg=#07080d guibg=#fce094 guisp=NONE gui=NONE ctermfg=232 ctermbg=222 cterm=NONE term=reverse + hi SignColumn guifg=#9b9ea4 guibg=NONE guisp=NONE gui=NONE ctermfg=145 ctermbg=NONE cterm=NONE term=reverse + hi Special guifg=#007373 guibg=NONE guisp=NONE gui=NONE ctermfg=23 ctermbg=NONE cterm=NONE term=NONE + hi SpecialKey guifg=#9b9ea4 guibg=NONE guisp=NONE gui=NONE ctermfg=145 ctermbg=NONE cterm=NONE term=bold + hi SpellBad guifg=NONE guibg=NONE guisp=#590008 gui=undercurl ctermfg=52 ctermbg=NONE cterm=underline term=underline + hi SpellCap guifg=NONE guibg=NONE guisp=#6b5300 gui=undercurl ctermfg=58 ctermbg=NONE cterm=underline term=underline + hi SpellLocal guifg=NONE guibg=NONE guisp=#005523 gui=undercurl ctermfg=22 ctermbg=NONE cterm=underline term=underline + hi SpellRare guifg=NONE guibg=NONE guisp=#007373 gui=undercurl ctermfg=23 ctermbg=NONE cterm=underline term=underline + hi Statement guifg=#14161b guibg=NONE guisp=NONE gui=bold ctermfg=233 ctermbg=NONE cterm=bold term=NONE + hi StatusLine guifg=#14161b guibg=#9b9ea4 guisp=NONE gui=NONE ctermfg=233 ctermbg=145 cterm=NONE term=bold,reverse + hi StatusLineNC guifg=#2c2e33 guibg=#c4c6cd guisp=NONE gui=NONE ctermfg=236 ctermbg=251 cterm=NONE term=bold,underline + hi String guifg=#005523 guibg=NONE guisp=NONE gui=NONE ctermfg=22 ctermbg=NONE cterm=NONE term=NONE + hi TabLineSel guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold,reverse + hi Title guifg=#14161b guibg=NONE guisp=NONE gui=bold ctermfg=233 ctermbg=NONE cterm=bold term=NONE + hi TitleBar guifg=#2c2e33 guibg=#eef1f8 guisp=NONE gui=NONE ctermfg=236 ctermbg=231 cterm=NONE term=NONE + hi TitleBarNC guifg=#07080d guibg=#9b9ea4 guisp=NONE gui=NONE ctermfg=232 ctermbg=145 cterm=NONE term=NONE + hi Todo guifg=#14161b guibg=NONE guisp=NONE gui=bold ctermfg=233 ctermbg=NONE cterm=bold term=bold,reverse + hi ToolbarButton guifg=#4f5258 guibg=#eef1f8 guisp=NONE gui=bold ctermfg=59 ctermbg=231 cterm=bold term=bold,reverse + hi ToolbarLine guifg=NONE guibg=#eef1f8 guisp=NONE gui=NONE ctermfg=NONE ctermbg=231 cterm=NONE term=reverse + hi Type guifg=#14161b guibg=NONE guisp=NONE gui=NONE ctermfg=233 ctermbg=NONE cterm=NONE term=NONE + hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline + hi VertSplitNC guifg=#c4c6cd guibg=NONE guisp=NONE gui=NONE ctermfg=251 ctermbg=NONE cterm=NONE term=NONE + hi Visual guifg=NONE guibg=#9b9ea4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=145 cterm=NONE term=reverse + hi WarningMsg guifg=#6b5300 guibg=NONE guisp=NONE gui=NONE ctermfg=58 ctermbg=NONE cterm=NONE term=standout + hi debugBreakpoint guifg=#07080d guibg=#ffc0b9 guisp=NONE gui=NONE ctermfg=232 ctermbg=217 cterm=NONE term=NONE + hi debugPC guifg=#07080d guibg=#8cf8f7 guisp=NONE gui=NONE ctermfg=232 ctermbg=30 cterm=NONE term=NONE + hi lCursor guifg=bg guibg=fg guisp=NONE gui=NONE ctermfg=bg ctermbg=fg cterm=NONE term=NONE + + if s:tgc || s:t_Co >= 256 + finish + endif + + if s:t_Co >= 16 + hi Normal ctermfg=Black ctermbg=LightGray cterm=NONE + hi Added ctermfg=DarkGreen ctermbg=NONE cterm=NONE + hi Changed ctermfg=Cyan ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=DarkGray cterm=NONE + hi Comment ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Conceal ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Constant ctermfg=Black ctermbg=NONE cterm=NONE + hi CurSearch ctermfg=White ctermbg=Brown cterm=bold,reverse + hi Cursor ctermfg=bg ctermbg=fg cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=LightGray cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=LightGray cterm=underline + hi CursorLineNr ctermfg=Brown ctermbg=NONE cterm=NONE + hi Delimiter ctermfg=Black ctermbg=NONE cterm=NONE + hi DiffAdd ctermfg=Black ctermbg=LightGreen cterm=NONE + hi DiffChange ctermfg=Black ctermbg=LightGreen cterm=NONE + hi DiffDelete ctermfg=DarkRed ctermbg=NONE cterm=bold + hi DiffText ctermfg=Black ctermbg=LightCyan cterm=NONE + hi Directory ctermfg=Cyan ctermbg=NONE cterm=NONE + hi Error ctermfg=Black ctermbg=LightRed cterm=NONE + hi ErrorMsg ctermfg=DarkRed ctermbg=NONE cterm=NONE + hi Folded ctermfg=White ctermbg=Yellow cterm=NONE + hi Function ctermfg=Cyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=DarkBlue ctermbg=NONE cterm=NONE + hi LineNr ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=Red ctermbg=NONE cterm=bold + hi ModeMsg ctermfg=DarkGreen ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=Cyan ctermbg=NONE cterm=NONE + hi NonText ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Operator ctermfg=Black ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=Black ctermbg=LightGray cterm=NONE + hi PmenuMatch ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuMatchSel ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=reverse + hi PmenuThumb ctermfg=Black ctermbg=DarkGray cterm=NONE + hi PopupTitle ctermfg=Black ctermbg=LightGray cterm=bold + hi PreProc ctermfg=Black ctermbg=NONE cterm=NONE + hi Question ctermfg=Cyan ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=Cyan ctermbg=NONE cterm=NONE + hi Removed ctermfg=DarkRed ctermbg=NONE cterm=NONE + hi Search ctermfg=Black ctermbg=LightRed cterm=NONE + hi SignColumn ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi Special ctermfg=Cyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=DarkGray ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=DarkRed ctermbg=NONE cterm=underline + hi SpellCap ctermfg=Brown ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=DarkGreen ctermbg=NONE cterm=underline + hi SpellRare ctermfg=Cyan ctermbg=NONE cterm=underline + hi Statement ctermfg=Black ctermbg=NONE cterm=bold + hi StatusLine ctermfg=Black ctermbg=DarkGray cterm=NONE + hi StatusLineNC ctermfg=DarkGray ctermbg=LightGray cterm=NONE + hi String ctermfg=DarkGreen ctermbg=NONE cterm=NONE + hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold + hi Title ctermfg=Black ctermbg=NONE cterm=bold + hi TitleBar ctermfg=DarkGray ctermbg=White cterm=NONE + hi TitleBarNC ctermfg=Black ctermbg=DarkGray cterm=NONE + hi Todo ctermfg=Black ctermbg=NONE cterm=bold + hi ToolbarButton ctermfg=DarkGray ctermbg=White cterm=bold + hi ToolbarLine ctermfg=NONE ctermbg=White cterm=NONE + hi Type ctermfg=Black ctermbg=NONE cterm=bold + hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline + hi VertSplitNC ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=DarkGray cterm=NONE + hi WarningMsg ctermfg=Brown ctermbg=NONE cterm=NONE + hi debugBreakpoint ctermfg=Black ctermbg=LightRed cterm=NONE + hi debugPC ctermfg=Black ctermbg=LightCyan cterm=NONE + hi lCursor ctermfg=bg ctermbg=fg cterm=NONE + finish + endif + + if s:t_Co >= 8 + hi Normal ctermfg=Black ctermbg=LightGray cterm=NONE + hi Added ctermfg=DarkGreen ctermbg=NONE cterm=NONE + hi Changed ctermfg=Cyan ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=LightGray cterm=NONE + hi Comment ctermfg=Yellow ctermbg=NONE cterm=bold + hi Conceal ctermfg=Yellow ctermbg=NONE cterm=NONE + hi Constant ctermfg=Black ctermbg=NONE cterm=NONE + hi CurSearch ctermfg=White ctermbg=Brown cterm=NONE + hi Cursor ctermfg=bg ctermbg=fg cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold + hi Delimiter ctermfg=Black ctermbg=NONE cterm=NONE + hi DiffAdd ctermfg=Black ctermbg=LightGreen cterm=NONE + hi DiffChange ctermfg=Black ctermbg=LightGreen cterm=NONE + hi DiffDelete ctermfg=DarkRed ctermbg=NONE cterm=bold + hi DiffText ctermfg=Black ctermbg=LightCyan cterm=NONE + hi Directory ctermfg=Cyan ctermbg=NONE cterm=NONE + hi Error ctermfg=Black ctermbg=LightRed cterm=NONE + hi ErrorMsg ctermfg=DarkRed ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=Yellow ctermbg=NONE cterm=NONE + hi Folded ctermfg=Yellow ctermbg=NONE cterm=NONE + hi Function ctermfg=Cyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=DarkBlue ctermbg=NONE cterm=NONE + hi LineNr ctermfg=Yellow ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=Brown ctermbg=NONE cterm=bold + hi ModeMsg ctermfg=DarkGreen ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=Cyan ctermbg=NONE cterm=NONE + hi NonText ctermfg=Yellow ctermbg=NONE cterm=NONE + hi Operator ctermfg=Black ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=Black ctermbg=LightGray cterm=NONE + hi PmenuMatch ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuMatchSel ctermfg=NONE ctermbg=NONE cterm=bold + hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=reverse + hi PmenuThumb ctermfg=Black ctermbg=DarkGray cterm=NONE + hi PopupTitle ctermfg=Black ctermbg=LightGray cterm=bold + hi PreProc ctermfg=Black ctermbg=NONE cterm=NONE + hi Question ctermfg=Cyan ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=Cyan ctermbg=NONE cterm=NONE + hi Removed ctermfg=DarkRed ctermbg=NONE cterm=NONE + hi Search ctermfg=Black ctermbg=Yellow cterm=NONE + hi SignColumn ctermfg=Yellow ctermbg=NONE cterm=NONE + hi Special ctermfg=Cyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=Yellow ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=DarkRed ctermbg=NONE cterm=underline + hi SpellCap ctermfg=Brown ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=DarkGreen ctermbg=NONE cterm=underline + hi SpellRare ctermfg=Cyan ctermbg=NONE cterm=underline + hi Statement ctermfg=Black ctermbg=NONE cterm=bold + hi StatusLine ctermfg=NONE ctermbg=NONE cterm=bold,reverse + hi StatusLineNC ctermfg=NONE ctermbg=NONE cterm=reverse + hi String ctermfg=DarkGreen ctermbg=NONE cterm=NONE + hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold + hi Title ctermfg=Black ctermbg=NONE cterm=bold + hi TitleBar ctermfg=DarkGray ctermbg=White cterm=NONE + hi TitleBarNC ctermfg=Black ctermbg=DarkGray cterm=NONE + hi Todo ctermfg=Black ctermbg=NONE cterm=bold + hi ToolbarButton ctermfg=DarkGray ctermbg=White cterm=bold + hi ToolbarLine ctermfg=NONE ctermbg=White cterm=NONE + hi Type ctermfg=Black ctermbg=NONE cterm=NONE + hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline + hi VertSplitNC ctermfg=LightGray ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse + hi WarningMsg ctermfg=Brown ctermbg=NONE cterm=NONE + hi debugBreakpoint ctermfg=Black ctermbg=LightRed cterm=NONE + hi debugPC ctermfg=Black ctermbg=LightCyan cterm=NONE + hi lCursor ctermfg=bg ctermbg=fg cterm=NONE + finish + endif + + if s:t_Co >= 0 + hi CursorIM term=NONE + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi EndOfBuffer term=NONE + hi Float term=NONE + hi FoldColumn term=NONE + hi Ignore term=NONE + hi IncSearch term=bold,reverse,underline + hi Number term=NONE + hi PmenuSbar term=reverse + hi StatusLineTerm term=bold,reverse + hi StatusLineTermNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi VertSplit term=NONE + hi VisualNOS term=NONE + hi WildMenu term=bold + finish + endif + +endif + +" vim: et ts=8 sw=2 sts=2 diff --git a/runtime/colors/retrobox.vim b/runtime/colors/retrobox.vim index 59c06855a6..e904210df8 100644 --- a/runtime/colors/retrobox.vim +++ b/runtime/colors/retrobox.vim @@ -2,7 +2,7 @@ " Description: Retro groove color scheme similar to gruvbox originally designed by morhetz " Author: Maxim Kim , ported from gruvbox8 of Lifepillar " URL: https://www.github.com/vim/colorschemes -" Last Change: 2026 Apr 30 +" Last Change: 2026 Jun 10 " Generated by Colortemplate v3.0.0-rc1 @@ -27,6 +27,8 @@ hi! link Tag Special hi! link Terminal Normal hi! link VisualNOS Visual hi! link lCursor Cursor +hi! link markdownLinkText String +hi! link markdownUrl Underlined if &background == 'dark' let g:terminal_ansi_colors = ['#1c1c1c', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb5944', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2'] diff --git a/runtime/colors/ron.vim b/runtime/colors/ron.vim index 139c5e68f1..8ca10c500d 100644 --- a/runtime/colors/ron.vim +++ b/runtime/colors/ron.vim @@ -3,9 +3,9 @@ " Maintainer: original maintainer Ron Aaron " URL: https://www.github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2025 Oct 08 +" Last Change: 2026 May 30 -" Generated by Colortemplate v3.0.0-beta10 +" Generated by Colortemplate v3.0.0-rc1 set background=dark @@ -115,7 +115,8 @@ hi ToolbarButton guifg=#000000 guibg=#e5e5e5 guisp=NONE gui=bold ctermfg=16 cter hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#2e8b57 guibg=NONE guisp=NONE gui=bold ctermfg=29 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=#80a0ff guibg=NONE guisp=NONE gui=underline ctermfg=111 ctermbg=NONE cterm=underline term=underline -hi VertSplit guifg=#add8e6 guibg=#00008b guisp=NONE gui=NONE ctermfg=152 ctermbg=20 cterm=NONE term=NONE +hi VertSplit guifg=#00ffff guibg=#0000ff guisp=NONE gui=NONE ctermfg=51 ctermbg=21 cterm=NONE term=NONE +hi VertSplitNC guifg=#add8e6 guibg=#00008b guisp=NONE gui=NONE ctermfg=152 ctermbg=20 cterm=NONE term=NONE hi Visual guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse term=reverse hi VisualNOS guifg=NONE guibg=#000000 guisp=NONE gui=bold,underline ctermfg=NONE ctermbg=16 cterm=underline term=NONE hi WarningMsg guifg=#ffff00 guibg=NONE guisp=NONE gui=NONE ctermfg=226 ctermbg=NONE cterm=NONE term=standout @@ -188,7 +189,8 @@ if s:t_Co >= 16 hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE hi Underlined ctermfg=blue ctermbg=NONE cterm=underline - hi VertSplit ctermfg=darkcyan ctermbg=darkblue cterm=NONE + hi VertSplit ctermfg=cyan ctermbg=darkblue cterm=NONE + hi VertSplitNC ctermfg=darkcyan ctermbg=darkblue cterm=NONE hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline hi WarningMsg ctermfg=yellow ctermbg=NONE cterm=NONE @@ -260,6 +262,7 @@ if s:t_Co >= 8 hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline hi VertSplit ctermfg=darkblue ctermbg=darkblue cterm=NONE + hi VertSplitNC ctermfg=darkblue ctermbg=darkblue cterm=NONE hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline hi WarningMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE diff --git a/runtime/colors/shine.vim b/runtime/colors/shine.vim index bbd3c9c27a..5626661086 100644 --- a/runtime/colors/shine.vim +++ b/runtime/colors/shine.vim @@ -1,7 +1,7 @@ " Name: shine " Description: Light colorscheme inspired by normal text editors. -" Author: Original author is Yasuhiro Matsumoto -" Maintainer: Original maintainer is Yasuhiro Matsumoto +" Author: Original author is Yasuhiro Matsumoto +" Maintainer: Original maintainer is Yasuhiro Matsumoto " URL: https://github.com/vim/colorschemes " License: Same as Vim " Last Change: 2026 Apr 27 diff --git a/runtime/colors/wildcharm.vim b/runtime/colors/wildcharm.vim index 4009437288..ce217b49b0 100644 --- a/runtime/colors/wildcharm.vim +++ b/runtime/colors/wildcharm.vim @@ -3,7 +3,7 @@ " Author: Maxim Kim " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Apr 30 +" Last Change: 2026 Jun 24 " Generated by Colortemplate v3.0.0-rc1 @@ -29,6 +29,8 @@ hi! link StatusLineTermNC StatuslineNC hi! link TabPanel Normal hi! link TabPanelFill Normal hi! link Terminal Normal +hi! link markdownLinkText String +hi! link markdownUrl Underlined if &background == 'dark' let g:terminal_ansi_colors = ['#000000', '#d7005f', '#00af5f', '#d78700', '#0087d7', '#d787d7', '#00afaf', '#d0d0d0', '#767676', '#ff5f87', '#00d75f', '#ffaf00', '#00afff', '#ff87ff', '#00d7d7', '#ffffff'] @@ -73,6 +75,9 @@ if &background == 'dark' hi PmenuSel guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=bold hi PmenuShadow guifg=#767676 guibg=#121212 guisp=NONE gui=NONE ctermfg=243 ctermbg=233 cterm=NONE term=NONE hi PmenuThumb guifg=NONE guibg=#d0d0d0 guisp=NONE gui=NONE ctermfg=NONE ctermbg=252 cterm=NONE term=NONE + hi Popup guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=NONE + hi PopupBorder guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE + hi PopupTitle guifg=#9e9e9e guibg=#303030 guisp=NONE gui=bold ctermfg=247 ctermbg=236 cterm=bold term=bold hi PreProc guifg=#00d7d7 guibg=NONE guisp=NONE gui=NONE ctermfg=44 ctermbg=NONE cterm=NONE term=NONE hi Question guifg=#ff87ff guibg=NONE guisp=NONE gui=NONE ctermfg=213 ctermbg=NONE cterm=NONE term=standout hi QuickFixLine guifg=NONE guibg=#4f2f4f guisp=NONE gui=NONE ctermfg=252 ctermbg=53 cterm=NONE term=NONE @@ -165,6 +170,9 @@ if &background == 'dark' hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE hi PmenuShadow ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=reverse + hi Popup ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupBorder ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupTitle ctermfg=NONE ctermbg=NONE cterm=bold,reverse hi PreProc ctermfg=cyan ctermbg=NONE cterm=NONE hi Question ctermfg=magenta ctermbg=NONE cterm=NONE hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE @@ -244,6 +252,9 @@ if &background == 'dark' hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold hi PmenuShadow ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=reverse + hi Popup ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupBorder ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupTitle ctermfg=NONE ctermbg=NONE cterm=bold,reverse hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE hi Question ctermfg=darkmagenta ctermbg=NONE cterm=NONE hi QuickFixLine ctermfg=black ctermbg=darkmagenta cterm=NONE @@ -343,6 +354,9 @@ if &background == 'light' hi PmenuSel guifg=NONE guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=NONE ctermbg=251 cterm=NONE term=bold hi PmenuShadow guifg=#808080 guibg=#303030 guisp=NONE gui=NONE ctermfg=240 ctermbg=236 cterm=NONE term=NONE hi PmenuThumb guifg=NONE guibg=#808080 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=NONE + hi Popup guifg=NONE guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=254 cterm=NONE term=NONE + hi PopupBorder guifg=#8a8a8a guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=245 ctermbg=254 cterm=NONE term=NONE + hi PopupTitle guifg=#808080 guibg=#e4e4e4 guisp=NONE gui=bold ctermfg=240 ctermbg=254 cterm=bold term=bold hi PreProc guifg=#008787 guibg=NONE guisp=NONE gui=NONE ctermfg=30 ctermbg=NONE cterm=NONE term=NONE hi Question guifg=#870087 guibg=NONE guisp=NONE gui=NONE ctermfg=90 ctermbg=NONE cterm=NONE term=standout hi QuickFixLine guifg=NONE guibg=#e7cfe7 guisp=NONE gui=NONE ctermfg=16 ctermbg=182 cterm=NONE term=NONE @@ -435,6 +449,9 @@ if &background == 'light' hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE hi PmenuShadow ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuThumb ctermfg=NONE ctermbg=darkgreen cterm=NONE + hi Popup ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupBorder ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupTitle ctermfg=NONE ctermbg=NONE cterm=bold,reverse hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE hi Question ctermfg=darkmagenta ctermbg=NONE cterm=NONE hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE @@ -514,6 +531,9 @@ if &background == 'light' hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold hi PmenuShadow ctermfg=NONE ctermbg=NONE cterm=NONE hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=reverse + hi Popup ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupBorder ctermfg=NONE ctermbg=NONE cterm=reverse + hi PopupTitle ctermfg=NONE ctermbg=NONE cterm=bold,reverse hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE hi Question ctermfg=darkmagenta ctermbg=NONE cterm=NONE hi QuickFixLine ctermfg=black ctermbg=darkmagenta cterm=NONE From 52485e0d24ade45e02ecba9aeadaec66500d15fe Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 22 Jul 2026 10:03:11 +0000 Subject: [PATCH 170/647] patch 9.2.0830: the completion menu is not used on terminals without colors Problem: When the terminal reports no colors ("t_Co" is 0 or 1) the insert mode completion popup menu is not shown at all, while the command line completion popup menu ('wildoptions' contains "pum") is shown. In 'wildmenu' completion the current match cannot be told apart from the other matches (Maxim Kim) Solution: Show the insert mode completion popup menu regardless of the number of colors and add "term" attributes to the default highlighting of Pmenu, PmenuSel and PmenuThumb. The wildmenu is drawn with the attributes of the status line, which is reversed, and on most terminals the standout mode is the same as the reverse mode, thus use the underline mode for the default highlighting of WildMenu (Hirohito Higashi). fixes: #20800 closes: #20803 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/insert.txt | 3 +-- runtime/doc/options.txt | 4 ++-- src/highlight.c | 44 +++++++++++++++++++------------------- src/insexpand.c | 12 +---------- src/testdir/test_popup.vim | 18 ++++++++++++++++ src/version.c | 2 ++ 6 files changed, 46 insertions(+), 37 deletions(-) diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt index 688d65fb3f..f581d50cf8 100644 --- a/runtime/doc/insert.txt +++ b/runtime/doc/insert.txt @@ -1,4 +1,4 @@ -*insert.txt* For Vim version 9.2. Last change: 2026 Jun 13 +*insert.txt* For Vim version 9.2. Last change: 2026 Jul 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1389,7 +1389,6 @@ Vim can display the matches in a simplistic popup menu. The menu is used when: - The 'completeopt' option contains "menu" or "menuone". -- The terminal supports at least 8 colors. - There are at least two matches. One if "menuone" is used. The 'pumheight' option can be used to set a maximum height. The default is to diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 549b22a853..15e26e4484 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -2302,8 +2302,8 @@ A jump table for the options with a short description can be found at |Q_op|. See also |preinserted()|. menu Use a popup menu to show the possible completions. The - menu is only shown when there is more than one match and - sufficient colors are available. |ins-completion-menu| + menu is only shown when there is more than one match. + |ins-completion-menu| menuone Use the popup menu also when there is only one match. Useful when there is additional information about the diff --git a/src/highlight.c b/src/highlight.c index efe21455f2..5925ead6b0 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -283,8 +283,8 @@ static char *(highlight_init_both[]) = { "DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red"), "default link DiffTextAdd DiffText", #endif - CENT("PmenuSbar ctermbg=Grey", - "PmenuSbar ctermbg=Grey guibg=Grey"), + CENT("PmenuSbar term=NONE ctermbg=Grey", + "PmenuSbar term=NONE ctermbg=Grey guibg=Grey"), CENT("TabLineSel term=bold cterm=bold", "TabLineSel term=bold cterm=bold gui=bold"), CENT("TabLineFill term=reverse cterm=reverse", @@ -346,22 +346,22 @@ static char *(highlight_init_light[]) = { CENT("SpellLocal term=underline ctermbg=Cyan", "SpellLocal term=underline ctermbg=Cyan guisp=DarkCyan gui=undercurl"), #endif - CENT("PmenuThumb ctermbg=Black", - "PmenuThumb ctermbg=Black guibg=Black"), - CENT("PmenuShadow ctermbg=Black ctermfg=DarkGrey", - "PmenuShadow ctermbg=Black ctermfg=DarkGrey guibg=Black guifg=DarkGrey"), - CENT("Pmenu ctermbg=LightMagenta ctermfg=Black", - "Pmenu ctermbg=LightMagenta ctermfg=Black guibg=LightMagenta"), - CENT("PmenuSel ctermbg=LightGrey ctermfg=Black", - "PmenuSel ctermbg=LightGrey ctermfg=Black guibg=Grey"), + CENT("PmenuThumb term=reverse ctermbg=Black", + "PmenuThumb term=reverse ctermbg=Black guibg=Black"), + CENT("PmenuShadow term=NONE ctermbg=Black ctermfg=DarkGrey", + "PmenuShadow term=NONE ctermbg=Black ctermfg=DarkGrey guibg=Black guifg=DarkGrey"), + CENT("Pmenu term=reverse ctermbg=LightMagenta ctermfg=Black", + "Pmenu term=reverse ctermbg=LightMagenta ctermfg=Black guibg=LightMagenta"), + CENT("PmenuSel term=underline ctermbg=LightGrey ctermfg=Black", + "PmenuSel term=underline ctermbg=LightGrey ctermfg=Black guibg=Grey"), CENT("SpecialKey term=NONE ctermfg=DarkBlue", "SpecialKey term=NONE ctermfg=DarkBlue guifg=Blue"), CENT("Title term=bold ctermfg=DarkMagenta", "Title term=bold ctermfg=DarkMagenta gui=bold guifg=Magenta"), CENT("WarningMsg term=standout ctermfg=DarkRed", "WarningMsg term=standout ctermfg=DarkRed guifg=Red"), - CENT("WildMenu term=standout ctermbg=Yellow ctermfg=Black", - "WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), + CENT("WildMenu term=underline ctermbg=Yellow ctermfg=Black", + "WildMenu term=underline ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), #ifdef FEAT_FOLDING CENT("Folded term=standout ctermbg=Grey ctermfg=DarkBlue", "Folded term=standout ctermbg=Grey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue"), @@ -439,20 +439,20 @@ static char *(highlight_init_dark[]) = { CENT("SpellLocal term=underline ctermbg=Cyan", "SpellLocal term=underline ctermbg=Cyan guisp=Cyan gui=undercurl"), #endif - CENT("PmenuThumb ctermbg=White", - "PmenuThumb ctermbg=White guibg=White"), - CENT("PmenuShadow ctermbg=Black ctermfg=DarkGrey", - "PmenuShadow ctermbg=Black ctermfg=DarkGrey guibg=Black guifg=DarkGrey"), - CENT("Pmenu ctermbg=Magenta ctermfg=Black", - "Pmenu ctermbg=Magenta ctermfg=Black guibg=Magenta"), - CENT("PmenuSel ctermbg=Black ctermfg=DarkGrey", - "PmenuSel ctermbg=Black ctermfg=DarkGrey guibg=DarkGrey"), + CENT("PmenuThumb term=reverse ctermbg=White", + "PmenuThumb term=reverse ctermbg=White guibg=White"), + CENT("PmenuShadow term=NONE ctermbg=Black ctermfg=DarkGrey", + "PmenuShadow term=NONE ctermbg=Black ctermfg=DarkGrey guibg=Black guifg=DarkGrey"), + CENT("Pmenu term=reverse ctermbg=Magenta ctermfg=Black", + "Pmenu term=reverse ctermbg=Magenta ctermfg=Black guibg=Magenta"), + CENT("PmenuSel term=underline ctermbg=Black ctermfg=DarkGrey", + "PmenuSel term=underline ctermbg=Black ctermfg=DarkGrey guibg=DarkGrey"), CENT("Title term=bold ctermfg=LightMagenta", "Title term=bold ctermfg=LightMagenta gui=bold guifg=Magenta"), CENT("WarningMsg term=standout ctermfg=LightRed", "WarningMsg term=standout ctermfg=LightRed guifg=Red"), - CENT("WildMenu term=standout ctermbg=Yellow ctermfg=Black", - "WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), + CENT("WildMenu term=underline ctermbg=Yellow ctermfg=Black", + "WildMenu term=underline ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), #ifdef FEAT_FOLDING CENT("Folded term=standout ctermbg=DarkGrey ctermfg=Cyan", "Folded term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=DarkGrey guifg=Cyan"), diff --git a/src/insexpand.c b/src/insexpand.c index 0833340c70..16b2e7b52b 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -1364,17 +1364,7 @@ ins_compl_del_pum(void) pum_wanted(void) { // 'completeopt' must contain "menu" or "menuone" - if ((get_cot_flags() & COT_ANY_MENU) == 0 && !compl_autocomplete) - return FALSE; - - // The display looks bad on a B&W display. - if (t_colors < 8 -#ifdef FEAT_GUI - && !gui.in_use -#endif - ) - return FALSE; - return TRUE; + return (get_cot_flags() & COT_ANY_MENU) != 0 || compl_autocomplete; } /* diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index e5d9094f78..fd25e93ebe 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -1286,6 +1286,24 @@ func Test_pum_getpos() unlet g:pum_pos endfunc +" The popup menu is also used on a terminal without colors (issue #20800) +func Test_pum_without_colors() + CheckNotGui + + new + let save_t_Co = &t_Co + set t_Co=0 + inoremap =GetPumPosition() + call setline(1, ['hello', 'help', '']) + call cursor(3, 1) + call feedkeys("ih\\\", 'tx') + call assert_equal(2, g:pum_pos.size) + + let &t_Co = save_t_Co + bw! + unlet g:pum_pos +endfunc + " Test for the popup menu with the 'rightleft' option set func Test_pum_rightleft() CheckFeature rightleft diff --git a/src/version.c b/src/version.c index 7efb39e2a5..77223f6664 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 830, /**/ 829, /**/ From 2f0178afe0a863a9de5d44c44d2f71b933afaaa6 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 22 Jul 2026 17:15:59 +0000 Subject: [PATCH 171/647] Update .gitignore and .hgignore files Ignore everything below auto/ except for configure fixes: #20814 Signed-off-by: Christian Brabandt --- .gitignore | 15 +++------------ .hgignore | 21 ++++++--------------- 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 12559ef20d..0f0a701c9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Unixen: object and executable files. +# Unix: object and executable files. *.o src/vim src/xxd/xxd @@ -14,17 +14,8 @@ src/types.vim src/tmp_make # We do need src/auto/configure. -src/auto/config.cache -src/auto/config.h -src/auto/config.log -src/auto/config.mk -src/auto/config.status -src/auto/osdef.h -src/auto/link.log -src/auto/link.sed -src/auto/pathdef.c -src/auto/wayland/*.c -src/auto/wayland/*.h +src/auto/* +!src/auto/configure # Windows *.exe diff --git a/.hgignore b/.hgignore index 80e59634db..6bed3242e2 100644 --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,10 @@ -syntax: glob +# We do need src/auto/configure. +# ignore everything except for auto/configure +syntax: regexp +^src/auto/(?!configure$) -# Unixen: object and executable files. +syntax: glob +# Unix: object and executable files. *.o src/vim src/xxd/xxd @@ -14,19 +18,6 @@ src/po/big5corr src/po/sjiscorr src/types.vim -# We do need src/auto/configure. -src/auto/config.cache -src/auto/config.h -src/auto/config.log -src/auto/config.mk -src/auto/config.status -src/auto/osdef.h -src/auto/link.log -src/auto/link.sed -src/auto/pathdef.c -src/auto/wayland/*.c -src/auto/wayland/*.h - # Windows *.exe *.idb From e10bba88c22c6734c4a3a085ecc9e09d3062a217 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Wed, 22 Jul 2026 17:22:44 +0000 Subject: [PATCH 172/647] patch 9.2.0831: diff highlighting hard to read with syntax enabled Problem: diff highlighting hard to read with syntax enabled and terminals having 256 or less colors (Andrey Butirsky) Solution: Set a cterm foreground color (Maxim Kim) fixes: #4071 closes: #20711 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/doc/version9.txt | 1 + .../dumps/vim_ex_set_backslash_00.dump | 12 +++---- .../dumps/vim_ex_set_backslash_01.dump | 16 ++++----- .../dumps/vim_ex_set_backslash_02.dump | 16 ++++----- .../dumps/vim_ex_set_backslash_03.dump | 16 ++++----- .../dumps/vim_ex_set_backslash_04.dump | 10 +++--- src/highlight.c | 12 +++---- src/testdir/dumps/Test_diff_01.dump | 2 +- src/testdir/dumps/Test_diff_02.dump | 2 +- src/testdir/dumps/Test_diff_03.dump | 2 +- src/testdir/dumps/Test_diff_04.dump | 2 +- src/testdir/dumps/Test_diff_05.dump | 4 +-- src/testdir/dumps/Test_diff_06.0.dump | 4 +-- src/testdir/dumps/Test_diff_06.1.dump | 4 +-- src/testdir/dumps/Test_diff_06.2.dump | 4 +-- src/testdir/dumps/Test_diff_06.dump | 4 +-- src/testdir/dumps/Test_diff_07.dump | 22 ++++++------ src/testdir/dumps/Test_diff_08.dump | 20 +++++------ src/testdir/dumps/Test_diff_09.dump | 20 +++++------ src/testdir/dumps/Test_diff_10.dump | 8 ++--- src/testdir/dumps/Test_diff_11.dump | 8 ++--- src/testdir/dumps/Test_diff_14.dump | 2 +- src/testdir/dumps/Test_diff_15.dump | 6 ++-- src/testdir/dumps/Test_diff_16.dump | 6 ++-- src/testdir/dumps/Test_diff_17.dump | 6 ++-- src/testdir/dumps/Test_diff_18.dump | 2 +- src/testdir/dumps/Test_diff_19.dump | 8 ++--- src/testdir/dumps/Test_diff_20.dump | 2 +- src/testdir/dumps/Test_diff_21.dump | 2 +- src/testdir/dumps/Test_diff_22.dump | 2 +- src/testdir/dumps/Test_diff_23.dump | 6 ++-- src/testdir/dumps/Test_diff_24.dump | 18 +++++----- .../Test_diff_add_prop_in_autocmd_01.dump | 6 ++-- src/testdir/dumps/Test_diff_anchors_00.dump | 24 ++++++------- src/testdir/dumps/Test_diff_anchors_01.dump | 30 ++++++++-------- src/testdir/dumps/Test_diff_anchors_02.dump | 28 +++++++-------- src/testdir/dumps/Test_diff_anchors_03.dump | 28 +++++++-------- src/testdir/dumps/Test_diff_anchors_04.dump | 30 ++++++++-------- src/testdir/dumps/Test_diff_anchors_05.dump | 24 ++++++------- src/testdir/dumps/Test_diff_anchors_06.dump | 34 +++++++++---------- src/testdir/dumps/Test_diff_anchors_07.dump | 34 +++++++++---------- ...st_diff_anchors_scrollbind_topline_01.dump | 4 +-- ...st_diff_anchors_scrollbind_topline_02.dump | 4 +-- ...st_diff_anchors_scrollbind_topline_03.dump | 2 +- ...st_diff_anchors_scrollbind_topline_05.dump | 2 +- ...st_diff_anchors_scrollbind_topline_06.dump | 2 +- ...st_diff_anchors_scrollbind_topline_08.dump | 12 +++---- ...st_diff_anchors_scrollbind_topline_09.dump | 10 +++--- ...st_diff_anchors_scrollbind_topline_10.dump | 8 ++--- ...st_diff_anchors_scrollbind_topline_11.dump | 6 ++-- ...st_diff_anchors_scrollbind_topline_12.dump | 4 +-- ...st_diff_anchors_scrollbind_topline_13.dump | 10 +++--- ...st_diff_anchors_scrollbind_topline_14.dump | 8 ++--- ...st_diff_anchors_scrollbind_topline_15.dump | 6 ++-- ...st_diff_anchors_scrollbind_topline_16.dump | 4 +-- ...st_diff_anchors_scrollbind_topline_17.dump | 2 +- src/testdir/dumps/Test_diff_bin_01.dump | 6 ++-- src/testdir/dumps/Test_diff_bin_02.dump | 2 +- src/testdir/dumps/Test_diff_bin_03.dump | 6 ++-- src/testdir/dumps/Test_diff_bin_04.dump | 2 +- .../Test_diff_breakindent_after_filler.dump | 2 +- src/testdir/dumps/Test_diff_cuc_01.dump | 4 +-- src/testdir/dumps/Test_diff_cuc_02.dump | 4 +-- src/testdir/dumps/Test_diff_cuc_03.dump | 4 +-- src/testdir/dumps/Test_diff_cuc_04.dump | 4 +-- .../dumps/Test_diff_get_put_linematch_1.dump | 18 +++++----- .../dumps/Test_diff_get_put_linematch_10.dump | 16 ++++----- .../dumps/Test_diff_get_put_linematch_11.dump | 16 ++++----- .../dumps/Test_diff_get_put_linematch_12.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_13.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_14.dump | 16 ++++----- .../dumps/Test_diff_get_put_linematch_15.dump | 16 ++++----- .../dumps/Test_diff_get_put_linematch_16.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_17.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_18.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_19.dump | 16 ++++----- .../dumps/Test_diff_get_put_linematch_2.dump | 4 +-- .../dumps/Test_diff_get_put_linematch_3.dump | 6 ++-- .../dumps/Test_diff_get_put_linematch_6.dump | 16 ++++----- .../dumps/Test_diff_get_put_linematch_7.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_8.dump | 12 +++---- .../dumps/Test_diff_get_put_linematch_9.dump | 16 ++++----- src/testdir/dumps/Test_diff_inline_01.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_02.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_03.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_04.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_05.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_06.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_07.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_08.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_09.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_10.dump | 2 +- src/testdir/dumps/Test_diff_inline_11.dump | 2 +- src/testdir/dumps/Test_diff_inline_12.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_13.dump | 6 ++-- src/testdir/dumps/Test_diff_inline_14.dump | 4 +-- src/testdir/dumps/Test_diff_inline_15.dump | 4 +-- .../dumps/Test_diff_inline_char_01.dump | 2 +- .../dumps/Test_diff_inline_char_02.dump | 10 +++--- .../Test_diff_inline_multibuffer_01.dump | 10 +++--- .../Test_diff_inline_multibuffer_02.dump | 12 +++---- .../Test_diff_inline_multibuffer_03.dump | 12 +++---- .../Test_diff_inline_multibuffer_04.dump | 2 +- .../Test_diff_inline_multibuffer_05.dump | 2 +- .../Test_diff_inline_multibuffer_06.dump | 2 +- .../Test_diff_inline_multibuffer_07.dump | 2 +- ...iff_inline_multibuffer_empty_block_01.dump | 2 +- .../dumps/Test_diff_inline_multiline_01.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_02.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_03.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_04.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_05.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_06.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_07.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_08.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_09.dump | 12 +++---- .../dumps/Test_diff_inline_multiline_10.dump | 12 +++---- .../dumps/Test_diff_inline_word_01.dump | 2 +- .../dumps/Test_diff_inline_word_02.dump | 2 +- .../dumps/Test_diff_inline_word_03.dump | 2 +- src/testdir/dumps/Test_diff_of_diff_01.dump | 8 ++--- src/testdir/dumps/Test_diff_of_diff_02.dump | 8 ++--- .../dumps/Test_diff_overlapped_2.01.dump | 4 +-- .../dumps/Test_diff_overlapped_2.02.dump | 4 +-- .../dumps/Test_diff_overlapped_2.03.dump | 4 +-- .../dumps/Test_diff_overlapped_3.01.dump | 4 +-- .../dumps/Test_diff_overlapped_3.02.dump | 2 +- .../dumps/Test_diff_overlapped_3.03.dump | 4 +-- .../dumps/Test_diff_overlapped_3.04.dump | 4 +-- .../dumps/Test_diff_overlapped_3.05.dump | 4 +-- .../dumps/Test_diff_overlapped_3.06.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.07.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.08.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.09.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.10.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.11.dump | 10 +++--- .../dumps/Test_diff_overlapped_3.12.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.13.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.14.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.15.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.16.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.17.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.18.dump | 4 +-- .../dumps/Test_diff_overlapped_3.19.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.20.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.21.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.22.dump | 4 +-- .../dumps/Test_diff_overlapped_3.23.dump | 4 +-- .../dumps/Test_diff_overlapped_3.24.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.25.dump | 2 +- .../dumps/Test_diff_overlapped_3.26.dump | 4 +-- .../dumps/Test_diff_overlapped_3.27.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.28.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.29.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.30.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.31.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.32.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.33.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.34.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.35.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.36.dump | 4 +-- .../dumps/Test_diff_overlapped_3.37.dump | 4 +-- .../dumps/Test_diff_overlapped_3.38.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.39.dump | 6 ++-- .../dumps/Test_diff_overlapped_3.40.dump | 8 ++--- .../dumps/Test_diff_overlapped_3.41.dump | 10 +++--- .../dumps/Test_diff_overlapped_3.42.dump | 14 ++++---- .../dumps/Test_diff_overlapped_3.43.dump | 4 +-- .../dumps/Test_diff_overlapped_3.44.dump | 12 +++---- src/testdir/dumps/Test_diff_rnu_01.dump | 6 ++-- src/testdir/dumps/Test_diff_rnu_02.dump | 6 ++-- src/testdir/dumps/Test_diff_rnu_03.dump | 6 ++-- src/testdir/dumps/Test_diff_scroll_1.dump | 12 +++---- src/testdir/dumps/Test_diff_scroll_2.dump | 12 +++---- .../dumps/Test_diff_scroll_change_01.dump | 6 ++-- .../dumps/Test_diff_scroll_change_02.dump | 8 ++--- .../dumps/Test_diff_scroll_change_03.dump | 8 ++--- src/testdir/dumps/Test_diff_syntax_1.dump | 8 ++--- src/testdir/dumps/Test_diff_topline_1.dump | 34 +++++++++---------- src/testdir/dumps/Test_diff_topline_2.dump | 34 +++++++++---------- src/testdir/dumps/Test_diff_topline_3.dump | 24 ++++++------- src/testdir/dumps/Test_diff_topline_4.dump | 24 ++++++------- .../dumps/Test_diff_with_cul_bri_01.dump | 22 ++++++------ .../dumps/Test_diff_with_cul_bri_02.dump | 22 ++++++------ .../dumps/Test_diff_with_cul_bri_03.dump | 22 ++++++------ .../dumps/Test_diff_with_cul_bri_04.dump | 22 ++++++------ .../dumps/Test_diff_with_cursorline_01.dump | 4 +-- .../dumps/Test_diff_with_cursorline_02.dump | 6 ++-- .../dumps/Test_diff_with_cursorline_03.dump | 4 +-- .../Test_diff_with_cursorline_number_01.dump | 2 +- .../Test_diff_with_cursorline_number_02.dump | 2 +- .../dumps/Test_difffunc_diffexpr_1.dump | 6 ++-- .../dumps/Test_diffput_to_empty_buf_01.dump | 6 ++-- src/testdir/dumps/Test_linematch_3diffs1.dump | 18 +++++----- src/testdir/dumps/Test_linematch_3diffs2.dump | 10 +++--- src/testdir/dumps/Test_linematch_diff1.dump | 8 ++--- .../dumps/Test_linematch_diff_grouping1.dump | 16 ++++----- .../dumps/Test_linematch_diff_grouping2.dump | 16 ++++----- .../Test_linematch_diff_grouping_scroll0.dump | 16 ++++----- .../Test_linematch_diff_grouping_scroll1.dump | 10 +++--- .../Test_linematch_diff_grouping_scroll2.dump | 4 +-- .../dumps/Test_linematch_diff_iwhite1.dump | 8 ++--- .../dumps/Test_linematch_diff_iwhite2.dump | 8 ++--- .../Test_linematch_line_limit_exceeded1.dump | 26 +++++++------- .../Test_linematch_line_limit_exceeded2.dump | 26 +++++++------- .../dumps/Test_long_text_with_padding_1.dump | 6 ++-- .../dumps/Test_long_text_with_padding_2.dump | 6 ++-- .../dumps/Test_modify_text_before_prop_1.dump | 4 +-- .../dumps/Test_modify_text_before_prop_2.dump | 4 +-- src/testdir/dumps/Test_popup_textprop_01.dump | 2 +- src/testdir/dumps/Test_popup_textprop_02.dump | 2 +- src/testdir/dumps/Test_popup_textprop_03.dump | 2 +- src/testdir/dumps/Test_popup_textprop_04.dump | 2 +- src/testdir/dumps/Test_popup_textprop_05.dump | 2 +- src/testdir/dumps/Test_popup_textprop_06.dump | 2 +- .../dumps/Test_popup_textprop_corn_1.dump | 2 +- .../dumps/Test_popup_textprop_corn_2.dump | 2 +- .../dumps/Test_popup_textprop_corn_3.dump | 2 +- .../dumps/Test_popup_textprop_corn_4.dump | 2 +- .../dumps/Test_popup_textprop_corn_5.dump | 2 +- .../dumps/Test_popup_textprop_off_1.dump | 2 +- .../Test_prop_above_below_smoothscroll_1.dump | 4 +-- ...Test_prop_above_below_smoothscroll_10.dump | 6 ++-- ...Test_prop_above_below_smoothscroll_11.dump | 6 ++-- ...Test_prop_above_below_smoothscroll_12.dump | 4 +-- ...Test_prop_above_below_smoothscroll_13.dump | 4 +-- ...Test_prop_above_below_smoothscroll_14.dump | 4 +-- ...Test_prop_above_below_smoothscroll_15.dump | 2 +- .../Test_prop_above_below_smoothscroll_2.dump | 6 ++-- .../Test_prop_above_below_smoothscroll_3.dump | 6 ++-- .../Test_prop_above_below_smoothscroll_4.dump | 4 +-- .../Test_prop_above_below_smoothscroll_5.dump | 6 ++-- .../Test_prop_above_below_smoothscroll_6.dump | 6 ++-- .../Test_prop_above_below_smoothscroll_7.dump | 4 +-- .../Test_prop_above_below_smoothscroll_8.dump | 2 +- .../Test_prop_above_below_smoothscroll_9.dump | 6 ++-- .../dumps/Test_prop_above_number_1.dump | 2 +- .../dumps/Test_prop_above_number_2.dump | 4 +-- .../dumps/Test_prop_above_number_3.dump | 4 +-- src/testdir/dumps/Test_prop_at_same_pos.dump | 2 +- .../dumps/Test_prop_below_after_empty_1.dump | 2 +- .../dumps/Test_prop_below_after_empty_2.dump | 2 +- .../dumps/Test_prop_below_after_empty_3.dump | 2 +- .../dumps/Test_prop_delete_updates_1.dump | 4 +-- src/testdir/dumps/Test_prop_diff_mode_1.dump | 14 ++++---- src/testdir/dumps/Test_prop_diff_mode_2.dump | 14 ++++---- .../dumps/Test_prop_insert_start_incl_1.dump | 2 +- .../dumps/Test_prop_insert_start_incl_2.dump | 2 +- .../dumps/Test_prop_insert_start_incl_3.dump | 2 +- .../dumps/Test_prop_insert_start_incl_4.dump | 2 +- .../dumps/Test_prop_insert_start_incl_5.dump | 2 +- .../dumps/Test_prop_insert_start_incl_6.dump | 2 +- .../dumps/Test_prop_insert_start_incl_7.dump | 2 +- .../dumps/Test_prop_insert_start_incl_8.dump | 2 +- .../dumps/Test_prop_inserts_text_1.dump | 2 +- .../dumps/Test_prop_inserts_text_2.dump | 2 +- .../dumps/Test_prop_inserts_text_3.dump | 2 +- .../dumps/Test_prop_inserts_text_4.dump | 2 +- .../dumps/Test_prop_inserts_text_5.dump | 2 +- .../dumps/Test_prop_inserts_text_6.dump | 2 +- .../dumps/Test_prop_inserts_text_hi_1.dump | 2 +- .../dumps/Test_prop_inserts_text_hi_2.dump | 2 +- .../dumps/Test_prop_inserts_text_hi_4.dump | 2 +- .../dumps/Test_prop_inserts_text_hi_5.dump | 2 +- .../dumps/Test_prop_right_align_twice_1.dump | 2 +- .../dumps/Test_prop_right_align_twice_2.dump | 2 +- .../dumps/Test_prop_right_align_twice_3.dump | 2 +- src/testdir/dumps/Test_prop_sign_tab_1.dump | 6 ++-- src/testdir/dumps/Test_prop_sign_tab_2.dump | 6 ++-- .../dumps/Test_prop_text_change_arg_1.dump | 2 +- .../dumps/Test_prop_text_change_arg_2.dump | 2 +- .../dumps/Test_prop_text_with_padding_1.dump | 6 ++-- .../dumps/Test_prop_text_with_padding_2.dump | 6 ++-- .../dumps/Test_prop_text_with_padding_3.dump | 8 ++--- .../dumps/Test_prop_text_with_padding_4.dump | 10 +++--- src/testdir/dumps/Test_prop_wincolor_1.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_2.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_3.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_4.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_5.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_6.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_7.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_8.dump | 2 +- src/testdir/dumps/Test_prop_wincolor_9.dump | 2 +- .../dumps/Test_prop_with_text_above_1.dump | 2 +- .../dumps/Test_prop_with_text_above_1a.dump | 2 +- .../dumps/Test_prop_with_text_above_1b.dump | 2 +- .../dumps/Test_prop_with_text_above_1c.dump | 2 +- .../dumps/Test_prop_with_text_above_2.dump | 2 +- .../dumps/Test_prop_with_text_above_3.dump | 2 +- .../dumps/Test_prop_with_text_above_4.dump | 2 +- .../dumps/Test_prop_with_text_above_5.dump | 2 +- .../dumps/Test_prop_with_text_above_6.dump | 4 +-- .../dumps/Test_prop_with_text_above_7.dump | 4 +-- .../dumps/Test_prop_with_text_above_8.dump | 4 +-- .../dumps/Test_prop_with_text_above_9.dump | 4 +-- .../dumps/Test_prop_with_text_after_1.dump | 4 +-- ...st_prop_with_text_after_below_trunc_1.dump | 2 +- ...st_prop_with_text_after_below_trunc_2.dump | 2 +- ...st_prop_with_text_after_below_trunc_3.dump | 2 +- .../Test_prop_with_text_after_nowrap_1.dump | 2 +- .../Test_prop_with_text_after_nowrap_2.dump | 2 +- .../Test_prop_with_text_after_nowrap_3.dump | 2 +- .../Test_prop_with_text_below_cul_1.dump | 2 +- .../dumps/Test_smooth_diff_change_line_1.dump | 2 +- .../dumps/Test_smooth_diff_change_line_2.dump | 2 +- .../dumps/Test_smooth_diff_change_line_3.dump | 4 +-- .../Test_smooth_diff_change_line_3a.dump | 4 +-- .../dumps/Test_smooth_diff_change_line_4.dump | 4 +-- .../dumps/Test_text_after_nowrap_1.dump | 4 +-- .../dumps/Test_text_after_nowrap_2.dump | 4 +-- .../dumps/Test_text_after_nowrap_3.dump | 2 +- .../dumps/Test_text_after_nowrap_5.dump | 4 +-- .../dumps/Test_text_after_nowrap_list_1.dump | 2 +- .../dumps/Test_text_below_nowrap_1.dump | 4 +-- src/testdir/test_highlight.vim | 4 +-- src/version.c | 2 ++ 317 files changed, 1115 insertions(+), 1112 deletions(-) diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 440c616a46..a5d3e0034d 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -52698,6 +52698,7 @@ Changed ~ - It is possible to clear the alternate file register |quote#|. - |serverlist()| can return a list of all available server names. - Improve visual appearance when the terminal does not support colors. +- Improve diff highlighting for terminals with 256 or less colors. *added-9.3* diff --git a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_00.dump b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_00.dump index 9b7370db86..bc33d4352e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_00.dump @@ -6,15 +6,15 @@ @75 @75 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|-@1| |1| |-@1|"| +0#0000000&@60 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255|a|f+0&#ffd7ff255|o@1|\+0fd7ff255|a|b+0&#ffd7ff255|a|r|\+0fd7ff255|a| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255|a|f+0&#ffd7ff255|o@1|\+0fd7ff255|a|b+0&#ffd7ff255|a|r|\+0fd7ff255|a| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255|a|f+0&#ffd7ff255|o@1|\+0fd7ff255|a|b+0&#ffd7ff255|a|r|\+0fd7ff255|a| +0&#ffffff0@46 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255|a|f+0&#ffd7ff255|o@1|\+0fd7ff255|a|b+0&#ffd7ff255|a|r|\+0fd7ff255|a| +0#0000000#ffffff0@46 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255| |f+0&#ffd7ff255|o@1|\+0fd7ff255| |b+0&#ffd7ff255|a|r|\+0fd7ff255| | +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255| |f+0&#ffd7ff255|o@1|\+0fd7ff255| |b+0&#ffd7ff255|a|r|\+0fd7ff255| | +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255| |f+0&#ffd7ff255|o@1|\+0fd7ff255| |b+0&#ffd7ff255|a|r|\+0fd7ff255| | +0&#ffffff0@46 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255| |f+0&#ffd7ff255|o@1|\+0fd7ff255| |b+0&#ffd7ff255|a|r|\+0fd7ff255| | +0#0000000#ffffff0@46 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000000#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000000#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000001#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000001#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000000#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000000#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0@46 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000001#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000001#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0@46 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_01.dump b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_01.dump index c99a3a6f4e..8ea5a25872 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_01.dump @@ -1,20 +1,20 @@ |e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255| |f+0&#ffd7ff255|o@1|\+0fd7ff255| |b+0&#ffd7ff255|a|r|\+0fd7ff255| | +0&#ffffff0@46 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255| |f+0&#ffd7ff255|o@1|\+0fd7ff255| |b+0&#ffd7ff255|a|r|\+0fd7ff255| | +0#0000000#ffffff0@46 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000000#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000000#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000001#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000001#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 ->s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000000#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000000#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0@46 +>s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|||f+0#0000001#ffd7ff255|o@1|\+0#4040ff13#afffff255|||b+0#0000001#ffd7ff255|a|r|\+0#4040ff13#afffff255||| +0#0000000#ffffff0@46 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|"|f+0#0000000#ffd7ff255|o@1|\+0#4040ff13#afffff255|"|b+0#0000000#ffd7ff255|a|r|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|"|f+0#0000001#ffd7ff255|o@1|\+0#4040ff13#afffff255|"|b+0#0000001#ffd7ff255|a|r|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@36 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|"|f+0#0000000#ffd7ff255|o@1|\+0#4040ff13#afffff255|"|b+0#0000000#ffd7ff255|a|r|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0@46 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#4040ff13#afffff255|"|f+0#0000001#ffd7ff255|o@1|\+0#4040ff13#afffff255|"|b+0#0000001#ffd7ff255|a|r|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0@46 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @75 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|-@1| |2| |-@1|"| +0#0000000&@60 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@1|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@1|a+0&#ffd7ff255| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@1|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@1|a+0&#ffd7ff255| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@1|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@1|a+0&#ffd7ff255| +0&#ffffff0@43 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@1|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@1|a+0&#ffd7ff255| +0#0000000#ffffff0@43 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1| +0&#ffffff0|f|o@1|\@1| |b|a|r|\@1| @1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1| +0#0000000#ffffff0|f|o@1|\@1| |b|a|r|\@1| @1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @57|1|9|,|1| @9|2|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_02.dump b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_02.dump index 4250195d6c..61a09c110d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_02.dump @@ -1,20 +1,20 @@ |e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1| +0&#ffffff0|f|o@1|\@1| |b|a|r|\@1| @44 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1| +0#0000000#ffffff0|f|o@1|\@1| |b|a|r|\@1| @44 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|||f+0&#ffd7ff255|o@1|\+0fd7ff255@1|||b+0&#ffd7ff255|a|r|\+0fd7ff255@1||| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|||f+0&#ffd7ff255|o@1|\+0fd7ff255@1|||b+0&#ffd7ff255|a|r|\+0fd7ff255@1||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 ->s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|||f+0&#ffd7ff255|o@1|\+0fd7ff255@1|||b+0&#ffd7ff255|a|r|\+0fd7ff255@1||| +0&#ffffff0@43 +>s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|||f+0&#ffd7ff255|o@1|\+0fd7ff255@1|||b+0&#ffd7ff255|a|r|\+0fd7ff255@1||| +0#0000000#ffffff0@43 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|"|f+0&#ffd7ff255|o@1|\+0fd7ff255@1|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@1|"| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|"|f+0&#ffd7ff255|o@1|\+0fd7ff255@1|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@1|"| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@33 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|"|f+0&#ffd7ff255|o@1|\+0fd7ff255@1|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@1|"| +0&#ffffff0@43 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|"|f+0&#ffd7ff255|o@1|\+0fd7ff255@1|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@1|"| +0#0000000#ffffff0@43 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @75 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|-@1| |3| |-@1|"| +0#0000000&@60 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@2|a|f+0&#ffd7ff255|o@1|\+0fd7ff255@2|a|b+0&#ffd7ff255|a|r|\+0fd7ff255@2|a| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@2|a|f+0&#ffd7ff255|o@1|\+0fd7ff255@2|a|b+0&#ffd7ff255|a|r|\+0fd7ff255@2|a| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@2|a|f+0&#ffd7ff255|o@1|\+0fd7ff255@2|a|b+0&#ffd7ff255|a|r|\+0fd7ff255@2|a| +0&#ffffff0@40 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@2|a|f+0&#ffd7ff255|o@1|\+0fd7ff255@2|a|b+0&#ffd7ff255|a|r|\+0fd7ff255@2|a| +0#0000000#ffffff0@40 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@2| |f+0&#ffd7ff255|o@1|\+0fd7ff255@2| |b+0&#ffd7ff255|a|r|\+0fd7ff255@2| | +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@2| |f+0&#ffd7ff255|o@1|\+0fd7ff255@2| |b+0&#ffd7ff255|a|r|\+0fd7ff255@2| | +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @57|3|7|,|1| @9|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_03.dump b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_03.dump index f0f1662db0..17f1c1daed 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_03.dump @@ -1,20 +1,20 @@ |e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@2| |f+0&#ffd7ff255|o@1|\+0fd7ff255@2| |b+0&#ffd7ff255|a|r|\+0fd7ff255@2| | +0&#ffffff0@40 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@2| |f+0&#ffd7ff255|o@1|\+0fd7ff255@2| |b+0&#ffd7ff255|a|r|\+0fd7ff255@2| | +0#0000000#ffffff0@40 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|\+0#4040ff13#afffff255|||f+0#0000000#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|||b+0#0000000#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|\+0#4040ff13#afffff255|||f+0#0000001#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|||b+0#0000001#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 ->s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|\+0#4040ff13#afffff255|||f+0#0000000#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|||b+0#0000000#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255||| +0#0000000#ffffff0@40 +>s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|\+0#4040ff13#afffff255|||f+0#0000001#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|||b+0#0000001#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255||| +0#0000000#ffffff0@40 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|\+0#4040ff13#afffff255|"|f+0#0000000#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|"|b+0#0000000#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|\+0#4040ff13#afffff255|"|f+0#0000001#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|"|b+0#0000001#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@30 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@1|\+0#4040ff13#afffff255|"|f+0#0000000#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|"|b+0#0000000#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0@40 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@1|\+0#4040ff13#afffff255|"|f+0#0000001#ffd7ff255|o@1|\+0fd7ff255@1|\+0#4040ff13#afffff255|"|b+0#0000001#ffd7ff255|a|r|\+0fd7ff255@1|\+0#4040ff13#afffff255|"| +0#0000000#ffffff0@40 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @75 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|-@1| |4| |-@1|"| +0#0000000&@60 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@3|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@3|a+0&#ffd7ff255| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@3|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@3|a+0&#ffd7ff255| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@3|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@3|a+0&#ffd7ff255| +0&#ffffff0@37 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3|a+0&#ffd7ff255|f|o@1|\+0fd7ff255@3|a+0&#ffd7ff255|b|a|r|\+0fd7ff255@3|a+0&#ffd7ff255| +0#0000000#ffffff0@37 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3| +0&#ffffff0|f|o@1|\@3| |b|a|r|\@3| @1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3| +0#0000000#ffffff0|f|o@1|\@3| |b|a|r|\@3| @1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @57|5@1|,|1| @9|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_04.dump b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_04.dump index 04e6eadc5d..4eabe7c244 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_set_backslash_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_set_backslash_04.dump @@ -1,13 +1,13 @@ |e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3| +0&#ffffff0|f|o@1|\@3| |b|a|r|\@3| @38 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3| +0#0000000#ffffff0|f|o@1|\@3| |b|a|r|\@3| @38 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3|||f+0&#ffd7ff255|o@1|\+0fd7ff255@3|||b+0&#ffd7ff255|a|r|\+0fd7ff255@3||| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3|||f+0&#ffd7ff255|o@1|\+0fd7ff255@3|||b+0&#ffd7ff255|a|r|\+0fd7ff255@3||| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 ->s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3|||f+0&#ffd7ff255|o@1|\+0fd7ff255@3|||b+0&#ffd7ff255|a|r|\+0fd7ff255@3||| +0&#ffffff0@37 +>s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3|||f+0&#ffd7ff255|o@1|\+0fd7ff255@3|||b+0&#ffd7ff255|a|r|\+0fd7ff255@3||| +0#0000000#ffffff0@37 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000000#5fd7ff255@3|"|f+0&#ffd7ff255|o@1|\+0fd7ff255@3|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@3|"| +0&#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|\+0#0000001#5fd7ff255@3|"|f+0&#ffd7ff255|o@1|\+0fd7ff255@3|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@3|"| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@27 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 -|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|f+0#0000000#ffd7ff255|o@1|\+0fd7ff255@3|"|\@3|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@3|"| +0&#ffffff0@37 +|s+0#af5f00255&|e|t| +0#0000000&|t+0#e000e06&|i|t|l|e|s|t|r|i|n|g|=+0#af5f00255&|f+0#0000001#ffd7ff255|o@1|\+0fd7ff255@3|"|\@3|"|b+0&#ffd7ff255|a|r|\+0fd7ff255@3|"| +0#0000000#ffffff0@37 |e+0#af5f00255&|c|h|o| +0#0000000&|&+0#00e0e07&|t|i|t|l|e|s|t|r|i|n|g| +0#0000000&@57 @75 |~+0#4040ff13&| @73 diff --git a/src/highlight.c b/src/highlight.c index 5925ead6b0..2e1b343291 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -279,8 +279,8 @@ static char *(highlight_init_both[]) = { "VisualNOS term=underline,bold cterm=underline,bold gui=underline,bold"), #endif #ifdef FEAT_DIFF - CENT("DiffText term=reverse cterm=bold ctermbg=Red", - "DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red"), + CENT("DiffText term=reverse cterm=bold ctermbg=Red ctermfg=Black", + "DiffText term=reverse cterm=bold ctermbg=Red ctermfg=Black gui=bold guibg=Red"), "default link DiffTextAdd DiffText", #endif CENT("PmenuSbar term=NONE ctermbg=Grey", @@ -375,10 +375,10 @@ static char *(highlight_init_light[]) = { CENT("Visual ctermbg=Grey ctermfg=Black", "Visual ctermbg=Grey ctermfg=Black guibg=LightGrey guifg=Black"), #ifdef FEAT_DIFF - CENT("DiffAdd term=bold ctermbg=LightBlue", - "DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue"), - CENT("DiffChange term=bold ctermbg=LightMagenta", - "DiffChange term=bold ctermbg=LightMagenta guibg=LightMagenta"), + CENT("DiffAdd term=bold ctermbg=LightBlue ctermfg=Black", + "DiffAdd term=bold ctermbg=LightBlue ctermfg=Black guibg=LightBlue"), + CENT("DiffChange term=bold ctermbg=LightMagenta ctermfg=Black", + "DiffChange term=bold ctermbg=LightMagenta ctermfg=Black guibg=LightMagenta"), CENT("DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan", "DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan gui=bold guifg=Blue guibg=LightCyan"), #endif diff --git a/src/testdir/dumps/Test_diff_01.dump b/src/testdir/dumps/Test_diff_01.dump index 125c391b0f..0c0a87c8c5 100644 --- a/src/testdir/dumps/Test_diff_01.dump +++ b/src/testdir/dumps/Test_diff_01.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|0+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|0+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33 diff --git a/src/testdir/dumps/Test_diff_02.dump b/src/testdir/dumps/Test_diff_02.dump index a2a185265e..77c4693b02 100644 --- a/src/testdir/dumps/Test_diff_02.dump +++ b/src/testdir/dumps/Test_diff_02.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|0+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|0+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33 diff --git a/src/testdir/dumps/Test_diff_03.dump b/src/testdir/dumps/Test_diff_03.dump index 5832eece09..786d03cc64 100644 --- a/src/testdir/dumps/Test_diff_03.dump +++ b/src/testdir/dumps/Test_diff_03.dump @@ -5,7 +5,7 @@ | +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_04.dump b/src/testdir/dumps/Test_diff_04.dump index 84fa6f77d9..06b970957c 100644 --- a/src/testdir/dumps/Test_diff_04.dump +++ b/src/testdir/dumps/Test_diff_04.dump @@ -5,7 +5,7 @@ | +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_05.dump b/src/testdir/dumps/Test_diff_05.dump index 7bffa1afbf..6ff286ad5b 100644 --- a/src/testdir/dumps/Test_diff_05.dump +++ b/src/testdir/dumps/Test_diff_05.dump @@ -2,14 +2,14 @@ | +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|4+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|4+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_06.0.dump b/src/testdir/dumps/Test_diff_06.0.dump index 458295b003..d0218db8fc 100644 --- a/src/testdir/dumps/Test_diff_06.0.dump +++ b/src/testdir/dumps/Test_diff_06.0.dump @@ -1,10 +1,10 @@ |++0#0000e05#a8a8a8255| >+|-@1| @1|3| |l|i|n|e|s|:| |1|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|3| |l|i|n|e|s|:| |1|-@19 | @1|4+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|4+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|4+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33 |++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| |6|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| |6|-@19 | @1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_06.1.dump b/src/testdir/dumps/Test_diff_06.1.dump index 8f2d4fbbdf..4924de6388 100644 --- a/src/testdir/dumps/Test_diff_06.1.dump +++ b/src/testdir/dumps/Test_diff_06.1.dump @@ -1,10 +1,10 @@ |++0#0000e05#a8a8a8255| >+|-@1| @1|3| |l|i|n|e|s|:| |1|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|3| |l|i|n|e|s|:| |1|-@19 | @1|4+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|4+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|4+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33 |++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| |6|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| |6|-@19 | @1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_06.2.dump b/src/testdir/dumps/Test_diff_06.2.dump index c7722706e1..0273560215 100644 --- a/src/testdir/dumps/Test_diff_06.2.dump +++ b/src/testdir/dumps/Test_diff_06.2.dump @@ -1,13 +1,13 @@ |++0#0000e05#a8a8a8255| >+|-@1| @1|2| |l|i|n|e|s|:| |1|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|2| |l|i|n|e|s|:| |1|-@19 | @1|3+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|4+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|4+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33 |++0#0000e05#a8a8a8255| |+|-@1| @1|2| |l|i|n|e|s|:| |7|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|2| |l|i|n|e|s|:| |7|-@19 | @1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_06.dump b/src/testdir/dumps/Test_diff_06.dump index a5e6348a81..1c75fc4323 100644 --- a/src/testdir/dumps/Test_diff_06.dump +++ b/src/testdir/dumps/Test_diff_06.dump @@ -2,14 +2,14 @@ | +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|4+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|4+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_07.dump b/src/testdir/dumps/Test_diff_07.dump index c8f2aa67fc..0816443340 100644 --- a/src/testdir/dumps/Test_diff_07.dump +++ b/src/testdir/dumps/Test_diff_07.dump @@ -1,20 +1,20 @@ | +0#0000e05#a8a8a8255@1>#+0#0000000#ffffff0|i|n|c|l|u|d|e| |<|s|t|d|i|o|.|h|>| @16||+1&&| +0#0000e05#a8a8a8255@1|#+0#0000000#ffffff0|i|n|c|l|u|d|e| |<|s|t|d|i|o|.|h|>| @16 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|/+2#0000000#ff404010@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|i+2#0000000#ff404010|n|t| |f|i|b|(|i|n|t| |n|)| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|i+0#0000000#5fd7ff255|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|/+2#0000001#ff404010@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| +0&#ffd7ff255@13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+2#0000001#ff404010|n|t| |f|i|b|(|i|n|t| |n|)| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|i+0#0000001#5fd7ff255|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@3|i|n+2&#ff404010|t| |i|;| +0&#ffd7ff255@24||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@3|i|f+2&#ff404010|(|n| |>| |2|)| +0&#ffd7ff255@21 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|f|o|r|(|i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| @7||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@3|i|n+2&#ff404010|t| |i|;| +0&#ffd7ff255@24||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@3|i|f+2&#ff404010|(|n| |>| |2|)| +0&#ffd7ff255@21 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|f|o|r|(|i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| @7||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|{| @29||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|{| @29 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@7|p+2&#ff404010|r|i|n|t|f|(|"|Y|o|u|r| |a|n|s|w|e|r| |i|s|:| |"|)+0&#ffd7ff255|;||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@7|r+2&#ff404010|e|t|u|r|n| |f|i|b|(|n|-|1|)| |+| |f|i|b|(|n|-|2|)+0&#ffd7ff255|; -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@7|p|r|i|n|t|f|(|"|%|d|\|n|"|,| |f|o@1|)|;| @6||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@7|p+2&#ff404010|r|i|n|t|f|(|"|Y|o|u|r| |a|n|s|w|e|r| |i|s|:| |"|)+0&#ffd7ff255|;||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@7|r+2&#ff404010|e|t|u|r|n| |f|i|b|(|n|-|1|)| |+| |f|i|b|(|n|-|2|)+0&#ffd7ff255|; +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@7|p|r|i|n|t|f|(|"|%|d|\|n|"|,| |f|o@1|)|;| @6||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|}| @29||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|}| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|r|e|t|u|r|n| |1|;| @21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|r|e|t|u|r|n| |1|;| @21 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|i+2#0000000#ff404010|n|t| |f|a|c|t|(|i|n|t| |n|)| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|/+2#0000000#ff404010@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000000#5fd7ff255|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13 +| +0#0000e05#a8a8a8255@1|i+2#0000001#ff404010|n|t| |f|a|c|t|(|i|n|t| |n|)| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|/+2#0000001#ff404010@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000001#5fd7ff255|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13 | +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@3|i|f+2&#ff404010|(|n| |>| |1|)| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@3|i|n+2&#ff404010|t| |i|;| +0&#ffd7ff255@24 -|X+3&#ffffff0|d|i|f|i|l|e|1| @10|1|,|1| @11|T|o|p| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|T|o|p +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@3|i|f+2&#ff404010|(|n| |>| |1|)| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@3|i|n+2&#ff404010|t| |i|;| +0&#ffd7ff255@24 +|X+3#0000000#ffffff0|d|i|f|i|l|e|1| @10|1|,|1| @11|T|o|p| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|T|o|p |:+0&&|s|e|t| |d|i|f@1|o|p|t|+|=|i|n|t|e|r|n|a|l| @52 diff --git a/src/testdir/dumps/Test_diff_08.dump b/src/testdir/dumps/Test_diff_08.dump index a8392df423..dd15530297 100644 --- a/src/testdir/dumps/Test_diff_08.dump +++ b/src/testdir/dumps/Test_diff_08.dump @@ -1,20 +1,20 @@ | +0#0000e05#a8a8a8255@1>#+0#0000000#ffffff0|i|n|c|l|u|d|e| |<|s|t|d|i|o|.|h|>| @16||+1&&| +0#0000e05#a8a8a8255@1|#+0#0000000#ffffff0|i|n|c|l|u|d|e| |<|s|t|d|i|o|.|h|>| @16 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000000#5fd7ff255|n|t| |f|i|b|(|i|n|t| |n|)| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|{+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|i|f|(|n| |>| |2|)| @21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|{| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@7|r|e|t|u|r|n| |f|i|b|(|n|-|1|)| |+| |f|i|b|(|n|-|2|)|; -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|}| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|r|e|t|u|r|n| |1|;| @21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|}+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000001#5fd7ff255|n|t| |f|i|b|(|i|n|t| |n|)| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|{+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|i|f|(|n| |>| |2|)| @21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|{| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@7|r|e|t|u|r|n| |f|i|b|(|n|-|1|)| |+| |f|i|b|(|n|-|2|)|; +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|}| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|r|e|t|u|r|n| |1|;| @21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|}+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34 | +0#0000e05#a8a8a8255@1|/+0#0000000#ffffff0@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| @13||+1&&| +0#0000e05#a8a8a8255@1|/+0#0000000#ffffff0@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| @13 | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13||+1&&| +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13 | +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|i|n|t| |i|;| @24||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|i|n|t| |i|;| @24 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f|o|r|(|i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| @7||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f|o|r|(|i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| @7 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|{| @29||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|{| @29 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@7|p|r|i|n|t|f|(|"|Y|o|u|r| |a|n|s|w|e|r| |i|s|:| |"|)|;||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@7|p|r|i|n|t|f|(|"|Y|o|u|r| |a|n|s|w|e|r| |i|s|:| |"|)|;||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |X+3#0000000#ffffff0|d|i|f|i|l|e|1| @10|1|,|1| @11|T|o|p| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|T|o|p |:+0&&|s|e|t| |d|i|f@1|o|p|t|+|=|a|l|g|o|r|i|t|h|m|:|p|a|t|i|e|n|c|e| @42 diff --git a/src/testdir/dumps/Test_diff_09.dump b/src/testdir/dumps/Test_diff_09.dump index 700d30c2e4..1f895c0c22 100644 --- a/src/testdir/dumps/Test_diff_09.dump +++ b/src/testdir/dumps/Test_diff_09.dump @@ -1,20 +1,20 @@ | +0#0000e05#a8a8a8255@1>#+0#0000000#ffffff0|i|n|c|l|u|d|e| |<|s|t|d|i|o|.|h|>| @16||+1&&| +0#0000e05#a8a8a8255@1|#+0#0000000#ffffff0|i|n|c|l|u|d|e| |<|s|t|d|i|o|.|h|>| @16 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000000#5fd7ff255|n|t| |f|i|b|(|i|n|t| |n|)| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|{+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|i|f|(|n| |>| |2|)| @21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|{| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@7|r|e|t|u|r|n| |f|i|b|(|n|-|1|)| |+| |f|i|b|(|n|-|2|)|; -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|}| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|r|e|t|u|r|n| |1|;| @21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|}+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000001#5fd7ff255|n|t| |f|i|b|(|i|n|t| |n|)| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|{+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|i|f|(|n| |>| |2|)| @21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|{| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@7|r|e|t|u|r|n| |f|i|b|(|n|-|1|)| |+| |f|i|b|(|n|-|2|)|; +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|}| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|r|e|t|u|r|n| |1|;| @21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|}+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34 | +0#0000e05#a8a8a8255@1|/+0#0000000#ffffff0@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| @13||+1&&| +0#0000e05#a8a8a8255@1|/+0#0000000#ffffff0@1| |F|r|o|b|s| |f|o@1| |h|e|a|r|t|i|l|y| @13 | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13||+1&&| +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|t| |f|r|o|b|n|i|t|z|(|i|n|t| |f|o@1|)| @13 | +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|i|n|t| |i|;| @24||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|i|n|t| |i|;| @24 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f|o|r|(|i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| @7||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f|o|r|(|i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| @7 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|{| @29||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|{| @29 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@7|p|r|i|n|t|f|(|"|Y|o|u|r| |a|n|s|w|e|r| |i|s|:| |"|)|;||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@7|p|r|i|n|t|f|(|"|Y|o|u|r| |a|n|s|w|e|r| |i|s|:| |"|)|;||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |X+3#0000000#ffffff0|d|i|f|i|l|e|1| @10|1|,|1| @11|T|o|p| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|T|o|p |:+0&&|s|e|t| |d|i|f@1|o|p|t|+|=|a|l|g|o|r|i|t|h|m|:|h|i|s|t|o|g|r|a|m| @41 diff --git a/src/testdir/dumps/Test_diff_10.dump b/src/testdir/dumps/Test_diff_10.dump index 6942f9354b..74d7d5d0dc 100644 --- a/src/testdir/dumps/Test_diff_10.dump +++ b/src/testdir/dumps/Test_diff_10.dump @@ -2,10 +2,10 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|d|e|f| |f|i|n|a|l|i|z|e|(|v|a|l|u|e|s|)| @12||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|d|e|f| |f|i|n|a|l|i|z|e|(|v|a|l|u|e|s|)| @12 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|v|.|p|r|e|p|a|r|e| @19 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|e|n|d| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|v|.|p|r|e|p|a|r|e| @19 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|e|n|d| @27 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|v|.|f|i|n|a|l|i|z|e| @18||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|v|.|f|i|n|a|l|i|z|e| @18 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e|n|d| @27||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e|n|d| @27 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_11.dump b/src/testdir/dumps/Test_diff_11.dump index 216c66b51c..19c0bc20d3 100644 --- a/src/testdir/dumps/Test_diff_11.dump +++ b/src/testdir/dumps/Test_diff_11.dump @@ -1,10 +1,10 @@ | +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|d|e|f| |f|i|n|a|l|i|z|e|(|v|a|l|u|e|s|)| @12||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|d|e|f| |f|i|n|a|l|i|z|e|(|v|a|l|u|e|s|)| @12 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|v|.|p|r|e|p|a|r|e| @19 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@3|e|n|d| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|v|.|p|r|e|p|a|r|e| @19 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@3|e|n|d| @27 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|v|a|l|u|e|s|.|e|a|c|h| |d|o| |||v||| @12 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|v|.|f|i|n|a|l|i|z|e| @18||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|v|.|f|i|n|a|l|i|z|e| @18 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e|n|d| @27||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e|n|d| @27 diff --git a/src/testdir/dumps/Test_diff_14.dump b/src/testdir/dumps/Test_diff_14.dump index c2418982cd..a660554078 100644 --- a/src/testdir/dumps/Test_diff_14.dump +++ b/src/testdir/dumps/Test_diff_14.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|d| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|D|e+2&#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|d| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|D|e+2&#ff404010| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_15.dump b/src/testdir/dumps/Test_diff_15.dump index 6a65c2d4e8..e743aee717 100644 --- a/src/testdir/dumps/Test_diff_15.dump +++ b/src/testdir/dumps/Test_diff_15.dump @@ -1,10 +1,10 @@ | +0#0000e05#a8a8a8255@1>i+0#0000000#ffffff0|n|t| |m|a|i|n|(|)| @24||+1&&| +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|t| |m|a|i|n|(|)| @24 | +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@2|i|f| |(|0|)| @25 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@2|{| @30 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@2|i|f| |(|0|)| @25 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@2|{| @30 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|p|r|i|n|t|f|(|"|H|e|l@1|o|,| |W|o|r|l|d|!|"|)|;| @7||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|p|r|i|n|t|f|(|"|H|e|l@1|o|,| |W|o|r|l|d|!|"|)|;| @4 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|r|e|t|u|r|n| |0|;| @22||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|r|e|t|u|r|n| |0|;| @19 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@2|}| @30 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@2|}| @30 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_16.dump b/src/testdir/dumps/Test_diff_16.dump index 5121bc98fb..91cee8f246 100644 --- a/src/testdir/dumps/Test_diff_16.dump +++ b/src/testdir/dumps/Test_diff_16.dump @@ -1,10 +1,10 @@ | +0#0000e05#a8a8a8255@1>i+0#0000000#ffffff0|n|t| |m|a|i|n|(|)| @24||+1&&| +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|t| |m|a|i|n|(|)| @24 | +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@2|i|f| |(|0|)| @25 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@2|{| @30 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@2|i|f| |(|0|)| @25 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@2|{| @30 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|p|r|i|n|t|f|(|"|H|e|l@1|o|,| |W|o|r|l|d|!|"|)|;| @7||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|p|r|i|n|t|f|(|"|H|e|l@1|o|,| |W|o|r|l|d|!|"|)|;| @4 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|r|e|t|u|r|n| |0|;| @22||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|r|e|t|u|r|n| |0|;| @19 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@2|}| @30 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@2|}| @30 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_17.dump b/src/testdir/dumps/Test_diff_17.dump index f1cd41f0b7..b9947a54b8 100644 --- a/src/testdir/dumps/Test_diff_17.dump +++ b/src/testdir/dumps/Test_diff_17.dump @@ -1,9 +1,9 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|d| @32||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|d| @32 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0|f| @32||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010@2| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0|f| @32 -|~+0#4040ff13&| @35||+1#0000000&| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010@2| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010@2| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0|f| @32 +|~+0#4040ff13&| @35||+1#0000000&| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010@2| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_18.dump b/src/testdir/dumps/Test_diff_18.dump index 5fd231c694..5489e7f47b 100644 --- a/src/testdir/dumps/Test_diff_18.dump +++ b/src/testdir/dumps/Test_diff_18.dump @@ -2,7 +2,7 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|d| @32 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|d| @32||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0|f| @32||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0|f| @32 -| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010@2| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010@2| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010@2| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010@2| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_19.dump b/src/testdir/dumps/Test_diff_19.dump index 82543dfa72..0aeed2474d 100644 --- a/src/testdir/dumps/Test_diff_19.dump +++ b/src/testdir/dumps/Test_diff_19.dump @@ -1,10 +1,10 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|d| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| +2&#ff404010|d+0&#ffd7ff255| @31 -| +0#0000e05#a8a8a8255@1|e+0#0000000#ffd7ff255|f| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010|e+0&#ffd7ff255|f| @31 -| +0#0000e05#a8a8a8255@1|x+0#0000000#ffd7ff255@1| | +2&#ff404010|x+0&#ffd7ff255@1| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#ffd7ff255@1| |x@1| @29 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|d| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| +2&#ff404010|d+0&#ffd7ff255| @31 +| +0#0000e05#a8a8a8255@1|e+0#0000001#ffd7ff255|f| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010|e+0&#ffd7ff255|f| @31 +| +0#0000e05#a8a8a8255@1|x+0#0000001#ffd7ff255@1| | +2&#ff404010|x+0&#ffd7ff255@1| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#ffd7ff255@1| |x@1| @29 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @31||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @31 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_20.dump b/src/testdir/dumps/Test_diff_20.dump index 1180de6650..c6853f54e1 100644 --- a/src/testdir/dumps/Test_diff_20.dump +++ b/src/testdir/dumps/Test_diff_20.dump @@ -4,7 +4,7 @@ | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0|f| @32||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|e|f| @31 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0@1| @1|x@1| @28||+1&&| +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0@1| |x@1| @29 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@34 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @31||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @31 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_21.dump b/src/testdir/dumps/Test_diff_21.dump index 8fc8c6c08b..29fde46d93 100644 --- a/src/testdir/dumps/Test_diff_21.dump +++ b/src/testdir/dumps/Test_diff_21.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|0+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|0+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_22.dump b/src/testdir/dumps/Test_diff_22.dump index 5ab9ae2bbd..5798931e62 100644 --- a/src/testdir/dumps/Test_diff_22.dump +++ b/src/testdir/dumps/Test_diff_22.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|0+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|0+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_23.dump b/src/testdir/dumps/Test_diff_23.dump index 25e1750b14..967abe4935 100644 --- a/src/testdir/dumps/Test_diff_23.dump +++ b/src/testdir/dumps/Test_diff_23.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|a| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|b+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|b+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|c| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|a| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|b+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|b+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|c| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_24.dump b/src/testdir/dumps/Test_diff_24.dump index 71004bdce0..5e307f79b2 100644 --- a/src/testdir/dumps/Test_diff_24.dump +++ b/src/testdir/dumps/Test_diff_24.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| @10|1|,|0|-|1| @9|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|0|-|1| @9|A|l@1 diff --git a/src/testdir/dumps/Test_diff_add_prop_in_autocmd_01.dump b/src/testdir/dumps/Test_diff_add_prop_in_autocmd_01.dump index 88aa421c10..9e49e74c56 100644 --- a/src/testdir/dumps/Test_diff_add_prop_in_autocmd_01.dump +++ b/src/testdir/dumps/Test_diff_add_prop_in_autocmd_01.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1>f+0#0000000#ffff4012|o@1| @69 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|a|r| @69 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|a|z| @69 +| +0#0000e05#a8a8a8255@1>f+0#0000001#ffff4012|o@1| @69 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|a|r| @69 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|a|z| @69 |~+0#4040ff13#ffffff0| @73 |~| @73 |~| @73 diff --git a/src/testdir/dumps/Test_diff_anchors_00.dump b/src/testdir/dumps/Test_diff_anchors_00.dump index 3e9a45fca1..0e4bce3086 100644 --- a/src/testdir/dumps/Test_diff_anchors_00.dump +++ b/src/testdir/dumps/Test_diff_anchors_00.dump @@ -1,18 +1,18 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|A|1| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_01.dump b/src/testdir/dumps/Test_diff_anchors_01.dump index 0e07236cac..28d743b943 100644 --- a/src/testdir/dumps/Test_diff_anchors_01.dump +++ b/src/testdir/dumps/Test_diff_anchors_01.dump @@ -1,20 +1,20 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3+2&#ff404010| +0&#ffd7ff255@18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|1+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|2+2&#ff404010| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|3+2&#ff404010| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0@1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0@1| @18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|1| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|3+2&#ff404010| +0&#ffd7ff255@18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|B| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|3| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|4| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|5| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A|1+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A|2+2&#ff404010| +0&#ffd7ff255@13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A|3+2&#ff404010| +0&#ffd7ff255@13 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20 | +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20 | +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0@1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|B| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|3| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|4| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|5| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |X+3#0000000#ffffff0|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1 |:+0&&> @73 diff --git a/src/testdir/dumps/Test_diff_anchors_02.dump b/src/testdir/dumps/Test_diff_anchors_02.dump index 590be2f6e5..867ade7be4 100644 --- a/src/testdir/dumps/Test_diff_anchors_02.dump +++ b/src/testdir/dumps/Test_diff_anchors_02.dump @@ -1,17 +1,17 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|1| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18 -| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|2| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|3| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0@1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0@1| @18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A+2&#ff404010|1| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18 +| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|5| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0@1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A+2&#ff404010|2| +0&#ffd7ff255@13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A+2&#ff404010|3| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|5| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_03.dump b/src/testdir/dumps/Test_diff_anchors_03.dump index 8b1fa8386b..2e2b81f173 100644 --- a/src/testdir/dumps/Test_diff_anchors_03.dump +++ b/src/testdir/dumps/Test_diff_anchors_03.dump @@ -1,18 +1,18 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|A|1| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3+2&#ff404010| +0&#ffd7ff255@18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|2| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|3| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|1| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|1| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|3+2&#ff404010| +0&#ffd7ff255@18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|B| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|3| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|4| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|5| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A+2&#ff404010|2| +0&#ffd7ff255@13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A+2&#ff404010|3| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|5| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_04.dump b/src/testdir/dumps/Test_diff_anchors_04.dump index 4a67729c24..849ede16ec 100644 --- a/src/testdir/dumps/Test_diff_anchors_04.dump +++ b/src/testdir/dumps/Test_diff_anchors_04.dump @@ -1,20 +1,20 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|1+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|2+2&#ff404010| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|3+2&#ff404010| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0@1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0@1| @18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B| @14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|3| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|3| @18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|4| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|5| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A|1+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A|2+2&#ff404010| +0&#ffd7ff255@13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|A|3+2&#ff404010| +0&#ffd7ff255@13 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20 | +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20 | +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0@1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|B| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|3| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|4| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|5| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |X+3#0000000#ffffff0|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1 |:+0&&> @73 diff --git a/src/testdir/dumps/Test_diff_anchors_05.dump b/src/testdir/dumps/Test_diff_anchors_05.dump index 3e9a45fca1..0e4bce3086 100644 --- a/src/testdir/dumps/Test_diff_anchors_05.dump +++ b/src/testdir/dumps/Test_diff_anchors_05.dump @@ -1,18 +1,18 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|A|1| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_06.dump b/src/testdir/dumps/Test_diff_anchors_06.dump index d36006d0f3..ab9853fc11 100644 --- a/src/testdir/dumps/Test_diff_anchors_06.dump +++ b/src/testdir/dumps/Test_diff_anchors_06.dump @@ -1,20 +1,20 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|A|1| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|1| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|2| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|B| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|3| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|4| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|5| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|B| @14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|3| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0|3| @18 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |X+3#0000000#ffffff0|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|T|o|p| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1 |:+0&&> @73 diff --git a/src/testdir/dumps/Test_diff_anchors_07.dump b/src/testdir/dumps/Test_diff_anchors_07.dump index eda58e9fd7..d4462053de 100644 --- a/src/testdir/dumps/Test_diff_anchors_07.dump +++ b/src/testdir/dumps/Test_diff_anchors_07.dump @@ -1,20 +1,20 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|1| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0@1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0@1| +0&#ffd7ff255@18 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|2| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|3| +0&#ffd7ff255@18 -| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|1| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0@1| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0@1| +0&#ffd7ff255@18 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|1| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0@1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|1| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|2| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|2| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|3| +0&#ffd7ff255@18 +| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|0|3| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|4| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010|0|5| +0&#ffd7ff255@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|n|c|h|o|r|A|2| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000001#5fd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| +3&&|X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1 |:+0&&> @73 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_01.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_01.dump index 5616d5f371..74dd97186d 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_01.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_01.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28 -| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|a| @28 +| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|1|a| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_02.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_02.dump index 3d66db8d6e..2ab53c8f45 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_02.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_02.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28 -| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|a| @28 +| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|1|a| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_03.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_03.dump index fdab541440..cd97327607 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_03.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_03.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|1|a| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_05.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_05.dump index 5daf6573d3..3c4e7dc625 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_05.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_05.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27 -| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28 +| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|1|a| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|a| @28 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_06.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_06.dump index 6cae25e1d4..d749330062 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_06.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_06.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28 +| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|1|a| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|a| @28 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_08.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_08.dump index a2ade506e4..4cb31a9583 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_08.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_08.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|a+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|a+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|b| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|a+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|a+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|b| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_09.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_09.dump index 050b522847..ad128ce7b6 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_09.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_09.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|b| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|b| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1>a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_10.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_10.dump index 8d786f3039..29577f9eb4 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_10.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_10.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1>a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_11.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_11.dump index 78bc6796d4..43a0c6600f 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_11.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_11.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +| +0#0000e05#a8a8a8255@1>a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_12.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_12.dump index 5f14a8f541..bc3bcbf92a 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_12.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_12.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1>a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_13.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_13.dump index af99924276..969740697b 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_13.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_13.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|a+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|a+0&#ffd7ff255| @15 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|b| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|a+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|a+0&#ffd7ff255| @15 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|2|b| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_14.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_14.dump index c6a418a4b4..96512d95b8 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_14.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_14.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_15.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_15.dump index cf6bce8d0d..7cf1574168 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_15.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_15.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_16.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_16.dump index 4bff316f42..5e1b0ed363 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_16.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_16.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 -|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14 +|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_17.dump b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_17.dump index 9496933153..0866206ab1 100644 --- a/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_17.dump +++ b/src/testdir/dumps/Test_diff_anchors_scrollbind_topline_17.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>d+0#0000001#5fd7ff255|i|f@1|3|e| @15 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_bin_01.dump b/src/testdir/dumps/Test_diff_bin_01.dump index a7d4cce513..a631f0fb6e 100644 --- a/src/testdir/dumps/Test_diff_bin_01.dump +++ b/src/testdir/dumps/Test_diff_bin_01.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1>A+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1>A+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@33 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000000#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000001#ffd7ff255@31 | +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|E+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1|E+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@33 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|g+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|g+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_bin_02.dump b/src/testdir/dumps/Test_diff_bin_02.dump index 64ee1aca29..9f97d3d91b 100644 --- a/src/testdir/dumps/Test_diff_bin_02.dump +++ b/src/testdir/dumps/Test_diff_bin_02.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1>A+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000000#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000001#ffd7ff255@31 | +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|E+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33 diff --git a/src/testdir/dumps/Test_diff_bin_03.dump b/src/testdir/dumps/Test_diff_bin_03.dump index a7d4cce513..a631f0fb6e 100644 --- a/src/testdir/dumps/Test_diff_bin_03.dump +++ b/src/testdir/dumps/Test_diff_bin_03.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1>A+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1>A+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@33 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000000#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000001#ffd7ff255@31 | +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|E+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1|E+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@33 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|g+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|g+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_bin_04.dump b/src/testdir/dumps/Test_diff_bin_04.dump index 64ee1aca29..9f97d3d91b 100644 --- a/src/testdir/dumps/Test_diff_bin_04.dump +++ b/src/testdir/dumps/Test_diff_bin_04.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1>A+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000000#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255|^+2#0000e05#ff404010|@| +0#0000001#ffd7ff255@31 | +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|E+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0| @33 diff --git a/src/testdir/dumps/Test_diff_breakindent_after_filler.dump b/src/testdir/dumps/Test_diff_breakindent_after_filler.dump index d9c48733e9..1d410f9fec 100644 --- a/src/testdir/dumps/Test_diff_breakindent_after_filler.dump +++ b/src/testdir/dumps/Test_diff_breakindent_after_filler.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @18||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @18 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@19 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255| @18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@19 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c@17||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c@17 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c@17||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c@17 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c@13| @3||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c@12>c| @3 diff --git a/src/testdir/dumps/Test_diff_cuc_01.dump b/src/testdir/dumps/Test_diff_cuc_01.dump index 19c42f4e57..97d69fe75d 100644 --- a/src/testdir/dumps/Test_diff_cuc_01.dump +++ b/src/testdir/dumps/Test_diff_cuc_01.dump @@ -1,6 +1,6 @@ >a+0&#ffffff0@1| @34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 -|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 -|c+0&#e0e0e08|c+0&#ffffff0| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255@1| @32 +|c+0#0000000#e0e0e08|c+0&#ffffff0| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_cuc_02.dump b/src/testdir/dumps/Test_diff_cuc_02.dump index 80a296cf5d..641fa68c64 100644 --- a/src/testdir/dumps/Test_diff_cuc_02.dump +++ b/src/testdir/dumps/Test_diff_cuc_02.dump @@ -1,6 +1,6 @@ |a+0&#ffffff0>a| @34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 -|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 -|c+0&#ffffff0|c+0&#e0e0e08| +0&#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255@1| @32 +|c+0#0000000#ffffff0|c+0&#e0e0e08| +0&#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_cuc_03.dump b/src/testdir/dumps/Test_diff_cuc_03.dump index 19a3c1f8e2..e768efa427 100644 --- a/src/testdir/dumps/Test_diff_cuc_03.dump +++ b/src/testdir/dumps/Test_diff_cuc_03.dump @@ -1,6 +1,6 @@ |a+0&#e0e0e08|a+0&#ffffff0| @34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 -|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 ->c+0&#ffffff0@1| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255@1| @32 +>c+0#0000000#ffffff0@1| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_cuc_04.dump b/src/testdir/dumps/Test_diff_cuc_04.dump index ba29893ae0..06a0a312a3 100644 --- a/src/testdir/dumps/Test_diff_cuc_04.dump +++ b/src/testdir/dumps/Test_diff_cuc_04.dump @@ -1,6 +1,6 @@ |a+0&#ffffff0|a+0&#e0e0e08| +0&#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 -|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 -|c+0&#ffffff0>c| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255@1| @32 +|c+0#0000000#ffffff0>c| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_1.dump b/src/testdir/dumps/Test_diff_get_put_linematch_1.dump index 056c4be759..ce9a2104d5 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_1.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_1.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| @10|1|,|0|-|1| @9|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|0|-|1| @9|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_10.dump b/src/testdir/dumps/Test_diff_get_put_linematch_10.dump index f163146928..fe3fe62f14 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_10.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_10.dump @@ -2,16 +2,16 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F| @31||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F| @31 | +0#0000e05#a8a8a8255@1>s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_11.dump b/src/testdir/dumps/Test_diff_get_put_linematch_11.dump index 7e78bafa4f..d1eb34eb84 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_11.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_11.dump @@ -3,17 +3,17 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 | +0#0000e05#a8a8a8255@1>A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| @10|5|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| |[|+|]| @6|5|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_12.dump b/src/testdir/dumps/Test_diff_get_put_linematch_12.dump index 8e9e0c6684..eccd68a1c8 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_12.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_12.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 | +0#0000e05#a8a8a8255@1>A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| @10|6|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| |[|+|]| @6|9|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_13.dump b/src/testdir/dumps/Test_diff_get_put_linematch_13.dump index 1601c5d53d..8a515fbbd4 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_13.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_13.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1>A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| @10|7|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| |[|+|]| @6|1|0|,|1| @10|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_14.dump b/src/testdir/dumps/Test_diff_get_put_linematch_14.dump index 9c7d17bf76..acd3909026 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_14.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_14.dump @@ -2,17 +2,17 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1>c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_15.dump b/src/testdir/dumps/Test_diff_get_put_linematch_15.dump index d9b72ade33..ac501e62e1 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_15.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_15.dump @@ -2,16 +2,16 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1>s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_16.dump b/src/testdir/dumps/Test_diff_get_put_linematch_16.dump index eeb984d682..999d968832 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_16.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_16.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31||+1&&| +0#0000e05#a8a8a8255@1>x+0#0000000#ffffff0|y|z| @31 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31||+1&&| +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31||+1&&| +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+1#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|9|,|1| @11|A|l@1| +3&&|X|d|i|f|i|l|e|2| @10|6|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_17.dump b/src/testdir/dumps/Test_diff_get_put_linematch_17.dump index b8426a39a4..062f6bc04c 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_17.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_17.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31||+1&&| +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31||+1&&| +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31 | +0#0000e05#a8a8a8255@1|x+0#0000000#ffffff0|y|z| @31||+1&&| +0#0000e05#a8a8a8255@1>x+0#0000000#ffffff0|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+1#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|9|,|1| @11|A|l@1| +3&&|X|d|i|f|i|l|e|2| @10|8|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_18.dump b/src/testdir/dumps/Test_diff_get_put_linematch_18.dump index 2b94da9551..4a0eb8f3d3 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_18.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_18.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1>D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+1#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|6|,|1| @11|A|l@1| +3&&|X|d|i|f|i|l|e|2| @10|9|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_19.dump b/src/testdir/dumps/Test_diff_get_put_linematch_19.dump index 8fdd9f608a..87c0716242 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_19.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_19.dump @@ -2,16 +2,16 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F| @31||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1>s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_2.dump b/src/testdir/dumps/Test_diff_get_put_linematch_2.dump index df249ab17c..c3bc9ed466 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_2.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_2.dump @@ -5,9 +5,9 @@ | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_3.dump b/src/testdir/dumps/Test_diff_get_put_linematch_3.dump index ce905130e9..7bf15ede0b 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_3.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_3.dump @@ -5,12 +5,12 @@ | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1>A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 | +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|A+0#0000000#ffffff0|B|C|a|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_6.dump b/src/testdir/dumps/Test_diff_get_put_linematch_6.dump index b2ca4d1c2a..581dfb0979 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_6.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_6.dump @@ -3,17 +3,17 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 | +0#0000e05#a8a8a8255@1>D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|5|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|5|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_7.dump b/src/testdir/dumps/Test_diff_get_put_linematch_7.dump index fa8529988d..ffe4651967 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_7.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_7.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 | +0#0000e05#a8a8a8255@1>D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|6|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|9|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_8.dump b/src/testdir/dumps/Test_diff_get_put_linematch_8.dump index d99744ece6..f0c5c26036 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_8.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_8.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1>D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F|a|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|7|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|0|,|1| @10|A|l@1 diff --git a/src/testdir/dumps/Test_diff_get_put_linematch_9.dump b/src/testdir/dumps/Test_diff_get_put_linematch_9.dump index 3c1674f339..37f032309f 100644 --- a/src/testdir/dumps/Test_diff_get_put_linematch_9.dump +++ b/src/testdir/dumps/Test_diff_get_put_linematch_9.dump @@ -2,18 +2,18 @@ | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 -| +0#0000e05#a8a8a8255@1|A+2#0000000#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000000#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 +| +0#0000e05#a8a8a8255@1|A+2#0000001#ff404010|B|C|a+0&#ffd7ff255|b|c| @28||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+2#0000001#ff404010|E|F|a+0&#ffd7ff255|b|c| @28 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F| @31||+1&&| +0#0000e05#a8a8a8255@1|D+0#0000000#ffffff0|E|F| @31 | +0#0000e05#a8a8a8255@1>c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |X+3#0000000&|d|i|f|i|l|e|1| |[|+|]| @6|1|2|,|1| @10|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|5|,|1| @10|A|l@1 diff --git a/src/testdir/dumps/Test_diff_inline_01.dump b/src/testdir/dumps/Test_diff_inline_01.dump index 9f342575e1..609eb62f00 100644 --- a/src/testdir/dumps/Test_diff_inline_01.dump +++ b/src/testdir/dumps/Test_diff_inline_01.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c|d|e|f| |g|h|i| |j|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|B+2&#ff404010|c|e|f| |g|H|i| |l|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c|d|e|f| |g|h|i| |j|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|B+2&#ff404010|c|e|f| |g|H|i| |l|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_02.dump b/src/testdir/dumps/Test_diff_inline_02.dump index 2fb78a7dff..67b0ed3684 100644 --- a/src/testdir/dumps/Test_diff_inline_02.dump +++ b/src/testdir/dumps/Test_diff_inline_02.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b|c|d|e|f| |g|h|i| |j|k| |n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|B|c|e|f| |g|H|i| |l|m| |n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b|c|d|e|f| |g|h|i| |j|k| |n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|B|c|e|f| |g|H|i| |l|m| |n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_03.dump b/src/testdir/dumps/Test_diff_inline_03.dump index 7e6cf2a241..c7e4aca6a5 100644 --- a/src/testdir/dumps/Test_diff_inline_03.dump +++ b/src/testdir/dumps/Test_diff_inline_03.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c+0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |g|h+2&#ff404010|i+0&#ffd7ff255| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|B+2&#ff404010|c+0&#ffd7ff255|e|f| |g|H+2&#ff404010|i+0&#ffd7ff255| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c+0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |g|h+2&#ff404010|i+0&#ffd7ff255| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|B+2&#ff404010|c+0&#ffd7ff255|e|f| |g|H+2&#ff404010|i+0&#ffd7ff255| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_04.dump b/src/testdir/dumps/Test_diff_inline_04.dump index e009998b8a..c8ffde0498 100644 --- a/src/testdir/dumps/Test_diff_inline_04.dump +++ b/src/testdir/dumps/Test_diff_inline_04.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|b|c|d|e|f| |g|h|i| |j|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|B|c|e|f| |g|H|i| |l|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|b|c|d|e|f| |g|h|i| |j|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|B|c|e|f| |g|H|i| |l|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_05.dump b/src/testdir/dumps/Test_diff_inline_05.dump index f2d0c7cc18..1de5e4f208 100644 --- a/src/testdir/dumps/Test_diff_inline_05.dump +++ b/src/testdir/dumps/Test_diff_inline_05.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c+0&#ffd7ff255|d+0࿈ff13|e+0&#ffd7ff255|f| |g|h+2&#ff404010|i+0&#ffd7ff255| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|B+2&#ff404010|c+0&#ffd7ff255|e|f| |g|H+2&#ff404010|i+0&#ffd7ff255| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c+0&#ffd7ff255|d+0#0000000#4040ff13|e+0#0000001#ffd7ff255|f| |g|h+2&#ff404010|i+0&#ffd7ff255| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|B+2&#ff404010|c+0&#ffd7ff255|e|f| |g|H+2&#ff404010|i+0&#ffd7ff255| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_06.dump b/src/testdir/dumps/Test_diff_inline_06.dump index 67f4b5b023..eddd478946 100644 --- a/src/testdir/dumps/Test_diff_inline_06.dump +++ b/src/testdir/dumps/Test_diff_inline_06.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|s+2#0000000#ff404010|o|m|e|t|e|x|t>a|b|c|d|e+0&#ffd7ff255|f| |g|h+2&#ff404010|i+0&#ffd7ff255| |j+2&#ff404010|k| +0&#ffd7ff255|n| @11||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|B|c|e+0&#ffd7ff255|f| |g|H+2&#ff404010|i+0&#ffd7ff255| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|s+2#0000001#ff404010|o|m|e|t|e|x|t>a|b|c|d|e+0&#ffd7ff255|f| |g|h+2&#ff404010|i+0&#ffd7ff255| |j+2&#ff404010|k| +0&#ffd7ff255|n| @11||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|B|c|e+0&#ffd7ff255|f| |g|H+2&#ff404010|i+0&#ffd7ff255| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_07.dump b/src/testdir/dumps/Test_diff_inline_07.dump index 3129968bf5..d4cd1c31c9 100644 --- a/src/testdir/dumps/Test_diff_inline_07.dump +++ b/src/testdir/dumps/Test_diff_inline_07.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b|c|d+2&#ff404010|e|f| |g|h|i| |j|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|B|c|e+2&#ff404010|f| |g|H|i| |l|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b|c|d+2&#ff404010|e|f| |g|h|i| |j|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|B|c|e+2&#ff404010|f| |g|H|i| |l|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_08.dump b/src/testdir/dumps/Test_diff_inline_08.dump index baf74b5725..85679588b2 100644 --- a/src/testdir/dumps/Test_diff_inline_08.dump +++ b/src/testdir/dumps/Test_diff_inline_08.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b|c|d+0࿈ff13|e+0&#ffd7ff255|f| |g|h|i| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|B|c|e|f| |g|H|i| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b|c|d+0#0000000#4040ff13|e+0#0000001#ffd7ff255|f| |g|h|i| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|B|c|e|f| |g|H|i| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_09.dump b/src/testdir/dumps/Test_diff_inline_09.dump index b8dcad6e11..b3f895fd6e 100644 --- a/src/testdir/dumps/Test_diff_inline_09.dump +++ b/src/testdir/dumps/Test_diff_inline_09.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|b|c|d|e|f| +0&#ffd7ff255|g|h|i| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|B|c|e|f| +0&#ffd7ff255|g|H|i| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|b|c|d|e|f| +0&#ffd7ff255|g|h|i| |j+2&#ff404010|k| +0&#ffd7ff255|n| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|B|c|e|f| +0&#ffd7ff255|g|H|i| |l+2&#ff404010|m| +0&#ffd7ff255|n| @20 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|y+0#0000000#ffffff0| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_10.dump b/src/testdir/dumps/Test_diff_inline_10.dump index 27095fbdef..cbcbb9f0b9 100644 --- a/src/testdir/dumps/Test_diff_inline_10.dump +++ b/src/testdir/dumps/Test_diff_inline_10.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|p@1|l|e+0&#ffd7ff255|s| |a|n|d| |o+2&#ff404010|r|a|n|g|e+0&#ffd7ff255|s| @16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|r|a|n|g|e+0&#ffd7ff255|s| |a|n|d| |a+2&#ff404010|p@1|l|e+0&#ffd7ff255|s| @16 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|p@1|l|e+0&#ffd7ff255|s| |a|n|d| |o+2&#ff404010|r|a|n|g|e+0&#ffd7ff255|s| @16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|r|a|n|g|e+0&#ffd7ff255|s| |a|n|d| |a+2&#ff404010|p@1|l|e+0&#ffd7ff255|s| @16 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_11.dump b/src/testdir/dumps/Test_diff_inline_11.dump index a485a9a50b..3807dfc95f 100644 --- a/src/testdir/dumps/Test_diff_inline_11.dump +++ b/src/testdir/dumps/Test_diff_inline_11.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#4040ff13|p@1|l|e|s| |a|n|d| |o+0&#ffd7ff255|r|a|n|g|e|s| @16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|r|a|n|g|e|s| +0࿈ff13|a|n|d| |a|p@1|l|e|s| +0&#ffd7ff255@16 +| +0#0000e05#a8a8a8255@1|a+0#0000000#4040ff13|p@1|l|e|s| |a|n|d| |o+0#0000001#ffd7ff255|r|a|n|g|e|s| @16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|r|a|n|g|e|s| +0#0000000#4040ff13|a|n|d| |a|p@1|l|e|s| +0#0000001#ffd7ff255@16 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_12.dump b/src/testdir/dumps/Test_diff_inline_12.dump index b6894f344d..ec3783bdaf 100644 --- a/src/testdir/dumps/Test_diff_inline_12.dump +++ b/src/testdir/dumps/Test_diff_inline_12.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255|-| |s+2&#ff404010|i+0&#ffd7ff255|g|m|a| |i|n| |6|σ+2&#ff404010| +0&#ffd7ff255|a|n|d| |Ὀ|δ+2&#ff404010|υ|σ@1|ε|ύ|ς| +0&#ffd7ff255@6||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255|-| |S+2&#ff404010|i+0&#ffd7ff255|g|m|a| |i|n| |6|Σ+2&#ff404010| +0&#ffd7ff255|a|n|d| |Ὀ|Δ+2&#ff404010|Υ|Σ@1|Ε|Ύ|Σ| +0&#ffd7ff255@6 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255|-| |a+2&#ff404010|n+0&#ffd7ff255|g|s|t|r|o|m| |i|n| |å+2&#ff404010@1| +0&#ffd7ff255@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255|-| |A+2&#ff404010|n+0&#ffd7ff255|g|s|t|r|o|m| |i|n| |Å+2&#ff404010|Å| +0&#ffd7ff255@16 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255|-| |c+2&#ff404010|o+0&#ffd7ff255|m|p|o|s|i|n|g|:| |i+0࿈ff13|i⃗+0&#ffd7ff255|I⃗| @16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255|-| |C+2&#ff404010|o+0&#ffd7ff255|m|p|o|s|i|n|g|:| |i⃗|I⃗|I⃗+0࿈ff13| +0&#ffd7ff255@16 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255|-| |s+2&#ff404010|i+0&#ffd7ff255|g|m|a| |i|n| |6|σ+2&#ff404010| +0&#ffd7ff255|a|n|d| |Ὀ|δ+2&#ff404010|υ|σ@1|ε|ύ|ς| +0&#ffd7ff255@6||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255|-| |S+2&#ff404010|i+0&#ffd7ff255|g|m|a| |i|n| |6|Σ+2&#ff404010| +0&#ffd7ff255|a|n|d| |Ὀ|Δ+2&#ff404010|Υ|Σ@1|Ε|Ύ|Σ| +0&#ffd7ff255@6 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255|-| |a+2&#ff404010|n+0&#ffd7ff255|g|s|t|r|o|m| |i|n| |å+2&#ff404010@1| +0&#ffd7ff255@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255|-| |A+2&#ff404010|n+0&#ffd7ff255|g|s|t|r|o|m| |i|n| |Å+2&#ff404010|Å| +0&#ffd7ff255@16 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255|-| |c+2&#ff404010|o+0&#ffd7ff255|m|p|o|s|i|n|g|:| |i+0#0000000#4040ff13|i⃗+0#0000001#ffd7ff255|I⃗| @16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255|-| |C+2&#ff404010|o+0&#ffd7ff255|m|p|o|s|i|n|g|:| |i⃗|I⃗|I⃗+0#0000000#4040ff13| +0#0000001#ffd7ff255@16 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_13.dump b/src/testdir/dumps/Test_diff_inline_13.dump index a3ddf8c4ec..3c72db1eb3 100644 --- a/src/testdir/dumps/Test_diff_inline_13.dump +++ b/src/testdir/dumps/Test_diff_inline_13.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255|-| |s|i|g|m|a| |i|n| |6|σ| |a|n|d| |Ὀ|δ|υ|σ@1|ε|ύ|ς| @6||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255|-| |S|i|g|m|a| |i|n| |6|Σ| |a|n|d| |Ὀ|Δ|Υ|Σ@1|Ε|Ύ|Σ| @6 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255|-| |a|n|g|s|t|r|o|m| |i|n| |å@1| @16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255|-| |A|n|g|s|t|r|o|m| |i|n| |Å|Å| @16 -| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255|-| |c|o|m|p|o|s|i|n|g|:| |i+2&#ff404010|i⃗+0&#ffd7ff255|I⃗| @16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255|-| |C|o|m|p|o|s|i|n|g|:| |i⃗+2&#ff404010|I⃗+0&#ffd7ff255@1| @16 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255|-| |s|i|g|m|a| |i|n| |6|σ| |a|n|d| |Ὀ|δ|υ|σ@1|ε|ύ|ς| @6||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255|-| |S|i|g|m|a| |i|n| |6|Σ| |a|n|d| |Ὀ|Δ|Υ|Σ@1|Ε|Ύ|Σ| @6 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255|-| |a|n|g|s|t|r|o|m| |i|n| |å@1| @16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255|-| |A|n|g|s|t|r|o|m| |i|n| |Å|Å| @16 +| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255|-| |c|o|m|p|o|s|i|n|g|:| |i+2&#ff404010|i⃗+0&#ffd7ff255|I⃗| @16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255|-| |C|o|m|p|o|s|i|n|g|:| |i⃗+2&#ff404010|I⃗+0&#ffd7ff255@1| @16 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_14.dump b/src/testdir/dumps/Test_diff_inline_14.dump index 9946527b4d..6ab65d605d 100644 --- a/src/testdir/dumps/Test_diff_inline_14.dump +++ b/src/testdir/dumps/Test_diff_inline_14.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b|c|😅*2&#ff404010|x+&|d+0&#ffd7ff255|e|一*0࿈ff13| +0&#ffd7ff255@24||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b|c|y+2&#ff404010|😢*&|d+0&#ffd7ff255|e| @26 -| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|🚀*&|g+&| @30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|二*0#0000000#4040ff13|f+0&#ffd7ff255|🚀*&|g+&| @28 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b|c|😅*2&#ff404010|x+&|d+0&#ffd7ff255|e|一*0#0000000#4040ff13| +0#0000001#ffd7ff255@24||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b|c|y+2&#ff404010|😢*&|d+0&#ffd7ff255|e| @26 +| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|🚀*&|g+&| @30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|二*0#0000000#4040ff13|f+0#0000001#ffd7ff255|🚀*&|g+&| @28 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_15.dump b/src/testdir/dumps/Test_diff_inline_15.dump index 91ac04bc5f..745072cac0 100644 --- a/src/testdir/dumps/Test_diff_inline_15.dump +++ b/src/testdir/dumps/Test_diff_inline_15.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|^+2#0000e05#ff404010|@|3+0#0000000#ffd7ff255|4|^+0#0000e05&|@|5+0#0000000&|^+2#0000e05#ff404010|@|6+0#0000000#ffd7ff255| @23||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|2+2&#ff404010|3+0&#ffd7ff255|4|^+0#0000e05&|@|5+0#0000000&| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000000#ffd7ff255| @33 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|^+2#0000e05#ff404010|@|3+0#0000001#ffd7ff255|4|^+0#0000e05&|@|5+0#0000001&|^+2#0000e05#ff404010|@|6+0#0000001#ffd7ff255| @23||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|2+2&#ff404010|3+0&#ffd7ff255|4|^+0#0000e05&|@|5+0#0000001&| @27 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000001#ffd7ff255| @33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_char_01.dump b/src/testdir/dumps/Test_diff_inline_char_01.dump index ce703ea304..f5e1aa9145 100644 --- a/src/testdir/dumps/Test_diff_inline_char_01.dump +++ b/src/testdir/dumps/Test_diff_inline_char_01.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|p+0#0000000#ffd7ff255|r|e|f|i|x|F|o@1|,| |p|r|e|f|i|x|E|n|d| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|p+0#0000000#ffd7ff255|r|e|f|i|x|F|o@1|,| |p+0࿈ff13|r|e|f|i|x|B|a|r|,| |p+0&#ffd7ff255|r|e|f|i|x|E|n|d| @3 +| +0#0000e05#a8a8a8255@1|p+0#0000001#ffd7ff255|r|e|f|i|x|F|o@1|,| |p|r|e|f|i|x|E|n|d| @14||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|p+0#0000001#ffd7ff255|r|e|f|i|x|F|o@1|,| |p+0#0000000#4040ff13|r|e|f|i|x|B|a|r|,| |p+0#0000001#ffd7ff255|r|e|f|i|x|E|n|d| @3 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_char_02.dump b/src/testdir/dumps/Test_diff_inline_char_02.dump index b7072003de..c554ebb368 100644 --- a/src/testdir/dumps/Test_diff_inline_char_02.dump +++ b/src/testdir/dumps/Test_diff_inline_char_02.dump @@ -1,11 +1,11 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c+0&#ffd7ff255|d+2&#ff404010|e|f|g|h|i|j|k|l|m|n|o+0&#ffd7ff255| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|?+2&#ff404010|c+0&#ffd7ff255|?+2&#ff404010|e|?|g|?|i|?|k|?@2|o+0&#ffd7ff255| @19 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c+0&#ffd7ff255|d+2&#ff404010|e|f|g|h|i|j|k|l|m|n|o+0&#ffd7ff255| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|?+2&#ff404010|c+0&#ffd7ff255|?+2&#ff404010|e|?|g|?|i|?|k|?@2|o+0&#ffd7ff255| @19 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c|d+0&#ffd7ff255|e|f+2&#ff404010|g|h|i|j|k+0&#ffd7ff255|l|m|n|o| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|?+2&#ff404010@1|d+0&#ffd7ff255|e|?+2&#ff404010@4|k+0&#ffd7ff255|l|m|n|o| @19 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c|d+0&#ffd7ff255|e|f+2&#ff404010|g|h|i|j|k+0&#ffd7ff255|l|m|n|o| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|?+2&#ff404010@1|d+0&#ffd7ff255|e|?+2&#ff404010@4|k+0&#ffd7ff255|l|m|n|o| @19 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c|d|e|f|g|h|i|j|k|l+0&#ffd7ff255|m|n|o| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|?+2&#ff404010@1|d|e|?@5|l+0&#ffd7ff255|m|n|o| @19 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c|d|e|f|g|h|i|j|k|l+0&#ffd7ff255|m|n|o| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|?+2&#ff404010@1|d|e|?@5|l+0&#ffd7ff255|m|n|o| @19 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|3| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|3| @27 -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e+2&#ff404010|s+0&#ffd7ff255|t+2&#ff404010| +0&#ffd7ff255@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|?+2&#ff404010|s+0&#ffd7ff255|?+2&#ff404010| +0&#ffd7ff255@30 -| +0#0000e05#a8a8a8255@1|m+2#0000000#ff404010|u|l|t|i|l|i|n|e+0&#ffd7ff255| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010@5|i|?|e+0&#ffd7ff255| @25 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e+2&#ff404010|s+0&#ffd7ff255|t+2&#ff404010| +0&#ffd7ff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|?+2&#ff404010|s+0&#ffd7ff255|?+2&#ff404010| +0&#ffd7ff255@30 +| +0#0000e05#a8a8a8255@1|m+2#0000001#ff404010|u|l|t|i|l|i|n|e+0&#ffd7ff255| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010@5|i|?|e+0&#ffd7ff255| @25 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_01.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_01.dump index 8b402579da..4250cf517d 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_01.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_01.dump @@ -1,10 +1,10 @@ -| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|a+2&#ff404010|t| +0&#ffd7ff255|i|s| |b|u|f@1|e|r|1+2&#ff404010|.+0&#ffd7ff255| @6||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|i+2&#ff404010|s| +0&#ffd7ff255|i|s| |b|u|f@1|e|r|2+2&#ff404010|.+0&#ffd7ff255| @5||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|i+2&#ff404010|s| +0&#ffd7ff255|i|s| |b|u|f@1|e|r|3+2&#ff404010|.| |L|a|s|t|.+0&#ffd7ff255 +| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|a+2&#ff404010|t| +0&#ffd7ff255|i|s| |b|u|f@1|e|r|1+2&#ff404010|.+0&#ffd7ff255| @6||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|i+2&#ff404010|s| +0&#ffd7ff255|i|s| |b|u|f@1|e|r|2+2&#ff404010|.+0&#ffd7ff255| @5||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|i+2&#ff404010|s| +0&#ffd7ff255|i|s| |b|u|f@1|e|r|3+2&#ff404010|.| |L|a|s|t|.+0&#ffd7ff255 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @16||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 -| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |r+2&#ff404010|a|n|d|o|m| |t+0&#ffd7ff255|e|x|t| @6||+1&#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |t|e|x|t| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |m+2&#ff404010|o|r|e| +0&#ffd7ff255@12 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t| +0࿈ff13|h|e|r|e|.| +0&#ffd7ff255@11 +| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |r+2&#ff404010|a|n|d|o|m| |t+0&#ffd7ff255|e|x|t| @6||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |m+2&#ff404010|o|r|e| +0&#ffd7ff255@12 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t| +0#0000000#4040ff13|h|e|r|e|.| +0#0000001#ffd7ff255@11 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @16||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|u|f@1|e|r|2|/|3| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#4040ff13|n|l|y| |i|n| |b+0&#ffd7ff255|u|f@1|e|r|2|/|3| @4 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000000#5fd7ff255|o|t| |i|n| |b|u|f@1|e|r|1| @7 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|u|f@1|e|r|2|/|3| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#4040ff13|n|l|y| |i|n| |b+0#0000001#ffd7ff255|u|f@1|e|r|2|/|3| @4 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000001#5fd7ff255|o|t| |i|n| |b|u|f@1|e|r|1| @7 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_02.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_02.dump index d6358d4f77..000ae2c61b 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_02.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_02.dump @@ -1,10 +1,10 @@ -|T+0&#ffffff0|h|a|t| |i|s| |b|u|f@1|e|r|1|.| @8||+1&&| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|2+2&#ff404010|.+0&#ffd7ff255| @5||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|3+2&#ff404010|.| |L|a|s|t|.+0&#ffd7ff255 -|a+0&#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 -|S|o|m|e| |r|a|n|d|o|m| |t|e|x|t| @8||+1&&| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |t|e|x|t| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |m+0࿈ff13|o|r|e| +0&#ffd7ff255@12 -|a+0&#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t| +0࿈ff13|h|e|r|e|.| +0&#ffd7ff255@11 +|T+0&#ffffff0|h|a|t| |i|s| |b|u|f@1|e|r|1|.| @8||+1&&| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|2+2&#ff404010|.+0&#ffd7ff255| @5||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|3+2&#ff404010|.| |L|a|s|t|.+0&#ffd7ff255 +|a+0#0000000#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 +|S|o|m|e| |r|a|n|d|o|m| |t|e|x|t| @8||+1&&| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |m+0#0000000#4040ff13|o|r|e| +0#0000001#ffd7ff255@12 +|a+0#0000000#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t| +0#0000000#4040ff13|h|e|r|e|.| +0#0000001#ffd7ff255@11 |~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 -|~+0#4040ff13&| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|u|f@1|e|r|2|/|3| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#4040ff13|n|l|y| |i|n| |b+0&#ffd7ff255|u|f@1|e|r|2|/|3| @4 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000000#5fd7ff255|o|t| |i|n| |b|u|f@1|e|r|1| @7 +|~+0#4040ff13&| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|u|f@1|e|r|2|/|3| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#4040ff13|n|l|y| |i|n| |b+0#0000001#ffd7ff255|u|f@1|e|r|2|/|3| @4 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000001#5fd7ff255|o|t| |i|n| |b|u|f@1|e|r|1| @7 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_03.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_03.dump index 21bbfba82f..66fcc9b5fa 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_03.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_03.dump @@ -1,10 +1,10 @@ -|s+0&#ffffff0|o|m|e|t|e|x|t>T|h|a|t| |i|s| |b|u|f@1|e|r|1|.| ||+1&&| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|2+2&#ff404010|.+0&#ffd7ff255| @5||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000000#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|3+2&#ff404010|.| |L|a|s|t|.+0&#ffd7ff255 -|a+0&#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 -|S|o|m|e| |r|a|n|d|o|m| |t|e|x|t| @8||+1&&| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |t|e|x|t| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000000#ffd7ff255|o|m|e| |m+0࿈ff13|o|r|e| +0&#ffd7ff255@12 -|a+0&#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t| +0࿈ff13|h|e|r|e|.| +0&#ffd7ff255@11 +|s+0&#ffffff0|o|m|e|t|e|x|t>T|h|a|t| |i|s| |b|u|f@1|e|r|1|.| ||+1&&| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|2+2&#ff404010|.+0&#ffd7ff255| @5||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+0#0000001#ffd7ff255|h|i|s| |i|s| |b|u|f@1|e|r|3+2&#ff404010|.| |L|a|s|t|.+0&#ffd7ff255 +|a+0#0000000#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 +|S|o|m|e| |r|a|n|d|o|m| |t|e|x|t| @8||+1&&| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|S+0#0000001#ffd7ff255|o|m|e| |m+0#0000000#4040ff13|o|r|e| +0#0000001#ffd7ff255@12 +|a+0#0000000#ffffff0|n|c|h|o|r| @18||+1&&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t| +0#0000000#4040ff13|h|e|r|e|.| +0#0000001#ffd7ff255@11 |~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r| @15 -|~+0#4040ff13&| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|u|f@1|e|r|2|/|3| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#4040ff13|n|l|y| |i|n| |b+0&#ffd7ff255|u|f@1|e|r|2|/|3| @4 -|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000000#5fd7ff255|o|t| |i|n| |b|u|f@1|e|r|1| @7 +|~+0#4040ff13&| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|u|f@1|e|r|2|/|3| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#4040ff13|n|l|y| |i|n| |b+0#0000001#ffd7ff255|u|f@1|e|r|2|/|3| @4 +|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000001#5fd7ff255|o|t| |i|n| |b|u|f@1|e|r|1| @7 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_04.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_04.dump index da6ee8415c..1843831abd 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_04.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_04.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|T+2#0000000#ff404010|h|i|s|+|i|s|=|a|-+0&#ffd7ff255|s|e|t|e|n|c|e| @5||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+2#0000000#ff404010|h|i|s|+|i|s|=|a|n|o|t|h|e|r|-+0&#ffd7ff255|s|e|t|e|n|c||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+2#0000000#ff404010|h|a|t|+|i|s|=|a|-+0&#ffd7ff255|s|e|t|e|n|c|e| @4 +| +0#0000e05#a8a8a8255@1|T+2#0000001#ff404010|h|i|s|+|i|s|=|a|-+0&#ffd7ff255|s|e|t|e|n|c|e| @5||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+2#0000001#ff404010|h|i|s|+|i|s|=|a|n|o|t|h|e|r|-+0&#ffd7ff255|s|e|t|e|n|c||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+2#0000001#ff404010|h|a|t|+|i|s|=|a|-+0&#ffd7ff255|s|e|t|e|n|c|e| @4 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_05.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_05.dump index 0f5ef736e9..bad3722890 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_05.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_05.dump @@ -1,4 +1,4 @@ -|T+0&#ffffff0|h|i|s|+|i|s|=|a|-|s|e|t|e|n|c|e| @7||+1&&| +0#0000e05#a8a8a8255@1|T+2#0000000#ff404010|h|i|s|++0&#ffd7ff255|i|s|=|a+2&#ff404010|n|o|t|h|e|r|-|s|e|t|e|n|c||+1&#ffffff0| +0#0000e05#a8a8a8255@1|T+2#0000000#ff404010|h|a|t|++0&#ffd7ff255|i|s|=|a+2&#ff404010|-|s|e|t|e|n|c|e| +0&#ffd7ff255@4 +|T+0&#ffffff0|h|i|s|+|i|s|=|a|-|s|e|t|e|n|c|e| @7||+1&&| +0#0000e05#a8a8a8255@1|T+2#0000001#ff404010|h|i|s|++0&#ffd7ff255|i|s|=|a+2&#ff404010|n|o|t|h|e|r|-|s|e|t|e|n|c||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|T+2#0000001#ff404010|h|a|t|++0&#ffd7ff255|i|s|=|a+2&#ff404010|-|s|e|t|e|n|c|e| +0&#ffd7ff255@4 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_06.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_06.dump index 8c37b1384e..f06c57b40c 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_06.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_06.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c|d|e|f|g+0&#ffd7ff255|h|i|j|k|Y+2&#ff404010|m|Y@2| +0&#ffd7ff255@6||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|X+2&#ff404010@1|d|X@1|g+0&#ffd7ff255|h|i|j|k|l+2&#ff404010|m|n|o|p| +0&#ffd7ff255@5||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c|d|e|f|g+0&#ffd7ff255|h|i|j|k|Y+2&#ff404010|m|Y|o|p| +0&#ffd7ff255@5 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c|d|e|f|g+0&#ffd7ff255|h|i|j|k|Y+2&#ff404010|m|Y@2| +0&#ffd7ff255@6||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|X+2&#ff404010@1|d|X@1|g+0&#ffd7ff255|h|i|j|k|l+2&#ff404010|m|n|o|p| +0&#ffd7ff255@5||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c|d|e|f|g+0&#ffd7ff255|h|i|j|k|Y+2&#ff404010|m|Y|o|p| +0&#ffd7ff255@5 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_07.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_07.dump index 0db4f77e4a..6839d752e6 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_07.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_07.dump @@ -1,4 +1,4 @@ -|a+0&#ffffff0|b|c|d|e|f|g|h|i|j|k|Y|m|Y@2| @8||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|X+2&#ff404010@1|d|X@1|g+0&#ffd7ff255|h|i|j|k|l+2&#ff404010|m+0&#ffd7ff255|n+2&#ff404010|o+0&#ffd7ff255|p| @5||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|b+2&#ff404010|c|d|e|f|g+0&#ffd7ff255|h|i|j|k|Y+2&#ff404010|m+0&#ffd7ff255|Y+2&#ff404010|o+0&#ffd7ff255|p| @5 +|a+0&#ffffff0|b|c|d|e|f|g|h|i|j|k|Y|m|Y@2| @8||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|X+2&#ff404010@1|d|X@1|g+0&#ffd7ff255|h|i|j|k|l+2&#ff404010|m+0&#ffd7ff255|n+2&#ff404010|o+0&#ffd7ff255|p| @5||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|b+2&#ff404010|c|d|e|f|g+0&#ffd7ff255|h|i|j|k|Y+2&#ff404010|m+0&#ffd7ff255|Y+2&#ff404010|o+0&#ffd7ff255|p| @5 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_inline_multibuffer_empty_block_01.dump b/src/testdir/dumps/Test_diff_inline_multibuffer_empty_block_01.dump index fad9aac399..0e6dfc9b8f 100644 --- a/src/testdir/dumps/Test_diff_inline_multibuffer_empty_block_01.dump +++ b/src/testdir/dumps/Test_diff_inline_multibuffer_empty_block_01.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @10||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @7||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @8||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @7 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|2+2&#ff404010|3|4|5|6|7|8|9|0+0&#ffd7ff255|a|b|c|d+2&#ff404010|e| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|2+2&#ff404010|3|4|5|6|7|-@1|0+0&#ffd7ff255|a|b|c|-+2&#ff404010|e||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|?+2&#ff404010@6|9|0+0&#ffd7ff255|a|b|c|d+2&#ff404010|? +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|2+2&#ff404010|3|4|5|6|7|8|9|0+0&#ffd7ff255|a|b|c|d+2&#ff404010|e| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|2+2&#ff404010|3|4|5|6|7|-@1|0+0&#ffd7ff255|a|b|c|-+2&#ff404010|e||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@15||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|?+2&#ff404010@6|9|0+0&#ffd7ff255|a|b|c|d+2&#ff404010|? | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @10||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @7||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @8||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @7 |~+0#4040ff13&| @18||+1#0000000&|~+0#4040ff13&| @15||+1#0000000&|~+0#4040ff13&| @16||+1#0000000&|~+0#4040ff13&| @15 |~| @18||+1#0000000&|~+0#4040ff13&| @15||+1#0000000&|~+0#4040ff13&| @16||+1#0000000&|~+0#4040ff13&| @15 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_01.dump b/src/testdir/dumps/Test_diff_inline_multiline_01.dump index 53d6139ee1..bee69115c6 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_01.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_01.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| @2|i|s| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0࿈ff13|t+0&#ffd7ff255|e|s|t| @17 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+0࿈ff13| +0&#ffd7ff255@29 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| @23||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @19 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @14 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| @2|i|s| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0#0000000#4040ff13|t+0#0000001#ffd7ff255|e|s|t| @17 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+0#0000000#4040ff13| +0#0000001#ffd7ff255@29 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| @23||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @19 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @14 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_02.dump b/src/testdir/dumps/Test_diff_inline_multiline_02.dump index 9a0893842b..ccb7e545cc 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_02.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_02.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| @2|i|s| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s+2&#ff404010|o|m|e| |t|e|s|t| +0&#ffd7ff255@17 -| +0#0000e05#a8a8a8255@1|s+2#0000000#ff404010|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| +0&#ffd7ff255@17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+2#0000000#ff404010|e|x|t|s| +0&#ffd7ff255@29 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010|a|z| |a|b|c| |d|e|f| +0&#ffd7ff255@23||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1| |b|a|r| |a|b|X| +0&#ffd7ff255|Y+2&#ff404010|e|f| +0&#ffd7ff255@19 -| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|n|e| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|n|e|w|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @14 -| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| @2|i|s| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s+2&#ff404010|o|m|e| |t|e|s|t| +0&#ffd7ff255@17 +| +0#0000e05#a8a8a8255@1|s+2#0000001#ff404010|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| +0&#ffd7ff255@17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+2#0000001#ff404010|e|x|t|s| +0&#ffd7ff255@29 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010|a|z| |a|b|c| |d|e|f| +0&#ffd7ff255@23||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1| |b|a|r| |a|b|X| +0&#ffd7ff255|Y+2&#ff404010|e|f| +0&#ffd7ff255@19 +| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|n|e| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|n|e|w|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @14 +| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_03.dump b/src/testdir/dumps/Test_diff_inline_multiline_03.dump index 3cc0dbe360..d08fc4c0a5 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_03.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_03.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| | +0࿈ff13@1|i+0&#ffd7ff255|s| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0࿈ff13|t+0&#ffd7ff255|e|s|t| @17 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+0࿈ff13| +0&#ffd7ff255@29 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| @23||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @19 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @14 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| | +0#0000000#4040ff13@1|i+0#0000001#ffd7ff255|s| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0#0000000#4040ff13|t+0#0000001#ffd7ff255|e|s|t| @17 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+0#0000000#4040ff13| +0#0000001#ffd7ff255@29 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| @23||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @19 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @14 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_04.dump b/src/testdir/dumps/Test_diff_inline_multiline_04.dump index 3ab991a53d..5130a97484 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_04.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_04.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| | +0࿈ff13@1|i+0&#ffd7ff255|s| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s+2&#ff404010|o|m|e| |t|e|s|t| +0&#ffd7ff255@17 -| +0#0000e05#a8a8a8255@1|s+2#0000000#ff404010|o|m|e|t|e|s|t| |t|e|x|t| +0&#ffd7ff255|f|o@1| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+2#0000000#ff404010|e|x|t|s| +0&#ffd7ff255@29 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010|a|z| |a|b|c| |d|e|f| +0&#ffd7ff255@23||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b+2&#ff404010|a|r| |a|b|X| |Y|e|f| +0&#ffd7ff255@19 -| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|n|e| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|n|e|w|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @14 -| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| | +0#0000000#4040ff13@1|i+0#0000001#ffd7ff255|s| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s+2&#ff404010|o|m|e| |t|e|s|t| +0&#ffd7ff255@17 +| +0#0000e05#a8a8a8255@1|s+2#0000001#ff404010|o|m|e|t|e|s|t| |t|e|x|t| +0&#ffd7ff255|f|o@1| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+2#0000001#ff404010|e|x|t|s| +0&#ffd7ff255@29 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010|a|z| |a|b|c| |d|e|f| +0&#ffd7ff255@23||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b+2&#ff404010|a|r| |a|b|X| |Y|e|f| +0&#ffd7ff255@19 +| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|n|e| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|n|e|w|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @14 +| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_05.dump b/src/testdir/dumps/Test_diff_inline_multiline_05.dump index 7ff92f736c..34d1dc4f9d 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_05.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_05.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| @2|i|s| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| |t|e|s|t| @17 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+0࿈ff13| +0&#ffd7ff255@29 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| |d|e+0&#ffd7ff255|f| @23||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| |Y|e+0&#ffd7ff255|f| @19 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @14 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| @2|i|s| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| |t|e|s|t| @17 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+0#0000000#4040ff13| +0#0000001#ffd7ff255@29 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| |d|e+0&#ffd7ff255|f| @23||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| |Y|e+0&#ffd7ff255|f| @19 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @14 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_06.dump b/src/testdir/dumps/Test_diff_inline_multiline_06.dump index 9a756670d8..b06470485e 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_06.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_06.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| @2|i|s| @25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s+2&#ff404010|o|m|e| |t|e|s|t| +0&#ffd7ff255@17 -| +0#0000e05#a8a8a8255@1|s+2#0000000#ff404010|o|m|e|t|e|s|t| |t|e|x|t| +0&#ffd7ff255|f|o@1| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+2#0000000#ff404010|e|x|t|s| +0&#ffd7ff255@29 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010|a|z| |a|b|c| |d|e|f| | +0&#ffd7ff255@22||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b+2&#ff404010|a|r| |a|b|X| |Y|e|f| @4| +0&#ffd7ff255@14 -| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|n|e| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000000#ff404010|n|e|w|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @14 -| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| @2|i|s| @25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s+2&#ff404010|o|m|e| |t|e|s|t| +0&#ffd7ff255@17 +| +0#0000e05#a8a8a8255@1|s+2#0000001#ff404010|o|m|e|t|e|s|t| |t|e|x|t| +0&#ffd7ff255|f|o@1| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+2#0000001#ff404010|e|x|t|s| +0&#ffd7ff255@29 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010|a|z| |a|b|c| |d|e|f| | +0&#ffd7ff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b+2&#ff404010|a|r| |a|b|X| |Y|e|f| @4| +0&#ffd7ff255@14 +| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|n|e| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+2#0000001#ff404010|n|e|w|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @14 +| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010|o|r|d| +0&#ffd7ff255|a|n|o|t|h|e|r| |w|o|r|d| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_07.dump b/src/testdir/dumps/Test_diff_inline_multiline_07.dump index b76d549b27..a2e9c55042 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_07.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_07.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| | +0࿈ff13@1|i+0&#ffd7ff255|s| | +0࿈ff13@1|$+0#4040ff13&| +0#0000000#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0࿈ff13|t+0&#ffd7ff255|e|s|t|$+2#4040ff13#ff404010| +0#0000000#ffd7ff255@16 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| +2&#ff404010|t+0&#ffd7ff255|e|x|t| +2&#ff404010|f+0&#ffd7ff255|o@1|$+2#4040ff13#ff404010| +0#0000000#ffd7ff255@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+2&#ff404010|$+2#4040ff13&| +0#0000000#ffd7ff255@28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| +2&#ff404010|b+0&#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| | +0࿈ff13@3|$+0#4040ff13#ffd7ff255| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|$+0#4040ff13#4040ff13| +0#0000000#ffd7ff255@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000000&@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| | +0#0000000#4040ff13@1|i+0#0000001#ffd7ff255|s| | +0#0000000#4040ff13@1|$+0#4040ff13&| +0#0000001#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0#0000000#4040ff13|t+0#0000001#ffd7ff255|e|s|t|$+2#4040ff13#ff404010| +0#0000001#ffd7ff255@16 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| +2&#ff404010|t+0&#ffd7ff255|e|x|t| +2&#ff404010|f+0&#ffd7ff255|o@1|$+2#4040ff13#ff404010| +0#0000001#ffd7ff255@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+2&#ff404010|$+2#4040ff13&| +0#0000001#ffd7ff255@28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| +2&#ff404010|b+0&#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| | +0#0000000#4040ff13@3|$+0#4040ff13#ffd7ff255| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|$+0#4040ff13#4040ff13| +0#0000001#ffd7ff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000001&@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_08.dump b/src/testdir/dumps/Test_diff_inline_multiline_08.dump index 51c35f5afd..c78ab78596 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_08.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_08.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| @2|i|s| @2|$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0࿈ff13|t+0&#ffd7ff255|e|s|t|$+0#4040ff13&| +0#0000000&@16 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+0࿈ff13|$+0#4040ff13#ffd7ff255| +0#0000000&@28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @4|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|$+0#4040ff13#4040ff13| +0#0000000#ffd7ff255@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000000&@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| @2|i|s| @2|$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0#0000000#4040ff13|t+0#0000001#ffd7ff255|e|s|t|$+0#4040ff13&| +0#0000001&@16 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+0#0000000#4040ff13|$+0#4040ff13#ffd7ff255| +0#0000001&@28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @4|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|$+0#4040ff13#4040ff13| +0#0000001#ffd7ff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000001&@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_09.dump b/src/testdir/dumps/Test_diff_inline_multiline_09.dump index dc36ed8ffc..e113d3ae99 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_09.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_09.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| | +0࿈ff13@1|i+0&#ffd7ff255|s| @2|$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0࿈ff13|t+0&#ffd7ff255|e|s|t|$+0#4040ff13&| +0#0000000&@16 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+0࿈ff13|$+0#4040ff13#ffd7ff255| +0#0000000&@28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @4|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|$+0#4040ff13#4040ff13| +0#0000000#ffd7ff255@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000000&@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| | +0#0000000#4040ff13@1|i+0#0000001#ffd7ff255|s| @2|$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| +0#0000000#4040ff13|t+0#0000001#ffd7ff255|e|s|t|$+0#4040ff13&| +0#0000001&@16 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+0#0000000#4040ff13|$+0#4040ff13#ffd7ff255| +0#0000001&@28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| +0&#ffd7ff255|d+2&#ff404010|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| +0&#ffd7ff255|Y+2&#ff404010|e+0&#ffd7ff255|f| @4|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|$+0#4040ff13#4040ff13| +0#0000001#ffd7ff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000001&@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_multiline_10.dump b/src/testdir/dumps/Test_diff_inline_multiline_10.dump index ad86c4684d..34172df059 100644 --- a/src/testdir/dumps/Test_diff_inline_multiline_10.dump +++ b/src/testdir/dumps/Test_diff_inline_multiline_10.dump @@ -1,9 +1,9 @@ -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| @2|i|s| @2|$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|h|i|s| |i|s| |s|o|m|e| |t|e|s|t|$+0#4040ff13&| +0#0000000&@16 -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|e|x|t|s+0࿈ff13|$+0#4040ff13#ffd7ff255| +0#0000000&@28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| |d|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000000&@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| |Y|e+0&#ffd7ff255|f| @4|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|$+0#4040ff13&| +0#0000000&@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000000#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@13 -| +0#0000e05#a8a8a8255@1|w+0#0000000#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000000&@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000000&@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| @2|i|s| @2|$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|h|i|s| |i|s| |s|o|m|e| |t|e|s|t|$+0#4040ff13&| +0#0000001&@16 +| +0#0000e05#a8a8a8255@1|s+0#0000001#ffd7ff255|o|m|e|t|e|s|t| |t|e|x|t| |f|o@1|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|e|x|t|s+0#0000000#4040ff13|$+0#4040ff13#ffd7ff255| +0#0000001&@28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255|a|b|c+2&#ff404010| |d|e+0&#ffd7ff255|f| |$+0#4040ff13&| +0#0000001&@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1| |b|a|r+2&#ff404010| +0&#ffd7ff255|a|b|X+2&#ff404010| |Y|e+0&#ffd7ff255|f| @4|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|$+0#4040ff13&| +0#0000001&@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|o+0#0000001#ffd7ff255|n|e|w|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@13 +| +0#0000e05#a8a8a8255@1|w+0#0000001#ffd7ff255|o|r|d| |a|n|o|t|h|e|r| |w|o|r|d|$+0#4040ff13&| +0#0000001&@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|d@1|i|t|i|o|n|a|l| |l|i|n|e|$+0#4040ff13&| +0#0000001&@18||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_word_01.dump b/src/testdir/dumps/Test_diff_inline_word_01.dump index c7b7bdb48d..ffd26f1825 100644 --- a/src/testdir/dumps/Test_diff_inline_word_01.dump +++ b/src/testdir/dumps/Test_diff_inline_word_01.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1|+|b+2&#ff404010|a|r| +0&#ffd7ff255|t|e|s|t| @22||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#ffd7ff255|o@1|+|b+2&#ff404010|a|z| +0&#ffd7ff255|t|e|s|t| @22 +| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1|+|b+2&#ff404010|a|r| +0&#ffd7ff255|t|e|s|t| @22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#ffd7ff255|o@1|+|b+2&#ff404010|a|z| +0&#ffd7ff255|t|e|s|t| @22 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_word_02.dump b/src/testdir/dumps/Test_diff_inline_word_02.dump index db6865d14a..d7fa7af001 100644 --- a/src/testdir/dumps/Test_diff_inline_word_02.dump +++ b/src/testdir/dumps/Test_diff_inline_word_02.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1|+|b|a|r| +0&#ffd7ff255|t|e|s|t| @22||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1|+|b|a|z| +0&#ffd7ff255|t|e|s|t| @22 +| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1|+|b|a|r| +0&#ffd7ff255|t|e|s|t| @22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1|+|b|a|z| +0&#ffd7ff255|t|e|s|t| @22 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_inline_word_03.dump b/src/testdir/dumps/Test_diff_inline_word_03.dump index a04cf50fab..131ab07d04 100644 --- a/src/testdir/dumps/Test_diff_inline_word_03.dump +++ b/src/testdir/dumps/Test_diff_inline_word_03.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|🚀*0#0000000#ffd7ff255|⛵️*2&#ff404010|一*0&#ffd7ff255|二|三*2&#ff404010|ひ*0&#ffd7ff255|ら|が*2&#ff404010|な|Δ+&|έ|λ|τ|α| |Δ|e|l|t|a| +0&#ffd7ff255|f|o@1|b|a||+1&#ffffff0| +0#0000e05#a8a8a8255@1|🚀*0#0000000#ffd7ff255|🛸*2&#ff404010|一*0&#ffd7ff255|二|四*2&#ff404010|ひ*0&#ffd7ff255|ら|な*2&#ff404010|δ+&|έ|λ|τ|α| |δ|e|l|t|a| +0&#ffd7ff255|f|o@1|b|a|r| +| +0#0000e05#a8a8a8255@1|🚀*0#0000001#ffd7ff255|⛵️*2&#ff404010|一*0&#ffd7ff255|二|三*2&#ff404010|ひ*0&#ffd7ff255|ら|が*2&#ff404010|な|Δ+&|έ|λ|τ|α| |Δ|e|l|t|a| +0&#ffd7ff255|f|o@1|b|a||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|🚀*0#0000001#ffd7ff255|🛸*2&#ff404010|一*0&#ffd7ff255|二|四*2&#ff404010|ひ*0&#ffd7ff255|ら|な*2&#ff404010|δ+&|έ|λ|τ|α| |δ|e|l|t|a| +0&#ffd7ff255|f|o@1|b|a|r| |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_of_diff_01.dump b/src/testdir/dumps/Test_diff_of_diff_01.dump index 2213bf32e0..e0ddf7c1d3 100644 --- a/src/testdir/dumps/Test_diff_of_diff_01.dump +++ b/src/testdir/dumps/Test_diff_of_diff_01.dump @@ -1,10 +1,10 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| >a+0#0000000&@1| @28||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |b+0#0000000&@1| @28||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0@1| @32 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |c+0#0000000&@1| @28||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|@+0#0000000#5fd7ff255@1| |-|3|,|2| |+|5|,|7| |@@1| @19 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|@+0#0000001#5fd7ff255@1| |-|3|,|2| |+|5|,|7| |@@1| @19 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#5fd7ff255@1| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_of_diff_02.dump b/src/testdir/dumps/Test_diff_of_diff_02.dump index 86c06f5555..cfd7e10536 100644 --- a/src/testdir/dumps/Test_diff_of_diff_02.dump +++ b/src/testdir/dumps/Test_diff_of_diff_02.dump @@ -1,10 +1,10 @@ | +0&#ffffff0@28|a>a| +0#af5f00255&|1| @1| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 @29|b@1| +0#af5f00255&|2| @1| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0@1| @32 @29|c@1| +0#af5f00255&|3| @1| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 -|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|@+0#0000000#5fd7ff255@1| |-|3|,|2| |+|5|,|7| |@@1| @19 -|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255@1| @32 -|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000000#5fd7ff255@1| @32 -|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255@1| @32 +|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|@+0#0000001#5fd7ff255@1| |-|3|,|2| |+|5|,|7| |@@1| @19 +|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255@1| @32 +|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000001#5fd7ff255@1| @32 +|-+0#4040ff13#afffff255@30| +0#af5f00255#ffffff0@3| +0#0000e05#a8a8a8255@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#5fd7ff255@1| @32 | +0#4040ff13#ffffff0@35|~||+1#0000000&|~+0#4040ff13&| @35 @36|~||+1#0000000&|~+0#4040ff13&| @35 @36|~||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_overlapped_2.01.dump b/src/testdir/dumps/Test_diff_overlapped_2.01.dump index b5ed36e010..312608c7a0 100644 --- a/src/testdir/dumps/Test_diff_overlapped_2.01.dump +++ b/src/testdir/dumps/Test_diff_overlapped_2.01.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_overlapped_2.02.dump b/src/testdir/dumps/Test_diff_overlapped_2.02.dump index a20c33a5cd..a9f225f0b1 100644 --- a/src/testdir/dumps/Test_diff_overlapped_2.02.dump +++ b/src/testdir/dumps/Test_diff_overlapped_2.02.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_overlapped_2.03.dump b/src/testdir/dumps/Test_diff_overlapped_2.03.dump index d3be5a1f47..7f0070308a 100644 --- a/src/testdir/dumps/Test_diff_overlapped_2.03.dump +++ b/src/testdir/dumps/Test_diff_overlapped_2.03.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.01.dump b/src/testdir/dumps/Test_diff_overlapped_3.01.dump index c7d69c0e19..032bee98cc 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.01.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.01.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.02.dump b/src/testdir/dumps/Test_diff_overlapped_3.02.dump index 70fde31247..83aae3ae7d 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.02.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.02.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.03.dump b/src/testdir/dumps/Test_diff_overlapped_3.03.dump index 6c88b3e706..ce62471dcf 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.03.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.03.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.04.dump b/src/testdir/dumps/Test_diff_overlapped_3.04.dump index 4c20e25137..dcdc528292 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.04.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.04.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.05.dump b/src/testdir/dumps/Test_diff_overlapped_3.05.dump index b1c48a38c1..1e85a7fc63 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.05.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.05.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.06.dump b/src/testdir/dumps/Test_diff_overlapped_3.06.dump index f863517c49..85cb017453 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.06.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.06.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.07.dump b/src/testdir/dumps/Test_diff_overlapped_3.07.dump index bb339ae2f6..dc86e20eff 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.07.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.07.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.08.dump b/src/testdir/dumps/Test_diff_overlapped_3.08.dump index b50ceb6e53..b00715f981 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.08.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.08.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.09.dump b/src/testdir/dumps/Test_diff_overlapped_3.09.dump index d981dc1268..0595c8290b 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.09.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.09.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.10.dump b/src/testdir/dumps/Test_diff_overlapped_3.10.dump index 29ed9dc00c..9aad3dd102 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.10.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.10.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.11.dump b/src/testdir/dumps/Test_diff_overlapped_3.11.dump index 100724f8f0..4210134230 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.11.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.11.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.12.dump b/src/testdir/dumps/Test_diff_overlapped_3.12.dump index ac954911da..5d2589078c 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.12.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.12.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.13.dump b/src/testdir/dumps/Test_diff_overlapped_3.13.dump index 20319c4f5c..ec95992ccb 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.13.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.13.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.14.dump b/src/testdir/dumps/Test_diff_overlapped_3.14.dump index 8cfb94868a..6f2bac6d0c 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.14.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.14.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.15.dump b/src/testdir/dumps/Test_diff_overlapped_3.15.dump index ecd536ece4..6356f3124b 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.15.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.15.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.16.dump b/src/testdir/dumps/Test_diff_overlapped_3.16.dump index 5f2a259c7e..8f105232c7 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.16.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.16.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.17.dump b/src/testdir/dumps/Test_diff_overlapped_3.17.dump index b72eea2e41..0b9fe6f652 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.17.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.17.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.18.dump b/src/testdir/dumps/Test_diff_overlapped_3.18.dump index 7b6beb981d..c1dae35ef4 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.18.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.18.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.19.dump b/src/testdir/dumps/Test_diff_overlapped_3.19.dump index 07543075d0..50afcba95d 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.19.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.19.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.20.dump b/src/testdir/dumps/Test_diff_overlapped_3.20.dump index cccb3637b3..a477bfb875 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.20.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.20.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.21.dump b/src/testdir/dumps/Test_diff_overlapped_3.21.dump index 26d8232666..b0c3f57148 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.21.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.21.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.22.dump b/src/testdir/dumps/Test_diff_overlapped_3.22.dump index 3e917dd2fe..3e04a728fb 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.22.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.22.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.23.dump b/src/testdir/dumps/Test_diff_overlapped_3.23.dump index 34bc41c0c2..fbc9de9c1c 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.23.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.23.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.24.dump b/src/testdir/dumps/Test_diff_overlapped_3.24.dump index 9034e127d5..5cb6083028 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.24.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.24.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@21 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.25.dump b/src/testdir/dumps/Test_diff_overlapped_3.25.dump index 4e0015454f..f2c5417566 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.25.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.25.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.26.dump b/src/testdir/dumps/Test_diff_overlapped_3.26.dump index efdb1fc4b7..ff58451e3e 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.26.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.26.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.27.dump b/src/testdir/dumps/Test_diff_overlapped_3.27.dump index 381a8231ef..c9b52dd437 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.27.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.27.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.28.dump b/src/testdir/dumps/Test_diff_overlapped_3.28.dump index adb40057d4..26d7c422ba 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.28.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.28.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.29.dump b/src/testdir/dumps/Test_diff_overlapped_3.29.dump index eb36fde044..2cd582e75a 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.29.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.29.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.30.dump b/src/testdir/dumps/Test_diff_overlapped_3.30.dump index 8b73090b8b..481521f3bf 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.30.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.30.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.31.dump b/src/testdir/dumps/Test_diff_overlapped_3.31.dump index 198c3f6202..74ba099cfc 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.31.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.31.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.32.dump b/src/testdir/dumps/Test_diff_overlapped_3.32.dump index de7db88bc8..37b451abd8 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.32.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.32.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|e+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|e+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.33.dump b/src/testdir/dumps/Test_diff_overlapped_3.33.dump index 4e7cd08160..df405f7ae7 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.33.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.33.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.34.dump b/src/testdir/dumps/Test_diff_overlapped_3.34.dump index 6eec9fc7b7..51c833e578 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.34.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.34.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 | +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|e+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.35.dump b/src/testdir/dumps/Test_diff_overlapped_3.35.dump index 202f873e5d..b1c9d0aa3d 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.35.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.35.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|e+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|c+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|e+0#0000001#ffd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+0#0000001#ffd7ff255| @20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.36.dump b/src/testdir/dumps/Test_diff_overlapped_3.36.dump index b52690354f..881f7e8abc 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.36.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.36.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255| @20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255| @20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.37.dump b/src/testdir/dumps/Test_diff_overlapped_3.37.dump index 9c3a0ccf47..5b39d41870 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.37.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.37.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+0#0000000#5fd7ff255| @20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+0#0000001#5fd7ff255| @20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| @20 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.38.dump b/src/testdir/dumps/Test_diff_overlapped_3.38.dump index 6271815e99..3c40dd96e5 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.38.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.38.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.39.dump b/src/testdir/dumps/Test_diff_overlapped_3.39.dump index 9f1a5cdc6c..bddc8cf911 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.39.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.39.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|c+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|c+0#0000001#5fd7ff255| @21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.40.dump b/src/testdir/dumps/Test_diff_overlapped_3.40.dump index 4307cfb1c7..ec69a1f934 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.40.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.40.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @19||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @19||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.41.dump b/src/testdir/dumps/Test_diff_overlapped_3.41.dump index 658c09f2a6..0d01d5b674 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.41.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.41.dump @@ -1,9 +1,9 @@ | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @19||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|u+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|u+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @19||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.42.dump b/src/testdir/dumps/Test_diff_overlapped_3.42.dump index 2e9357027e..f503a34080 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.42.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.42.dump @@ -1,11 +1,11 @@ | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @19||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|u+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|4+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255| @20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|e+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|u+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|4+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+0#0000001#5fd7ff255| @20 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @19||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.43.dump b/src/testdir/dumps/Test_diff_overlapped_3.43.dump index f9f75e84e9..7d09c3543e 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.43.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.43.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @19||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @19||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_overlapped_3.44.dump b/src/testdir/dumps/Test_diff_overlapped_3.44.dump index 64780a4977..1bb61d655f 100644 --- a/src/testdir/dumps/Test_diff_overlapped_3.44.dump +++ b/src/testdir/dumps/Test_diff_overlapped_3.44.dump @@ -1,10 +1,10 @@ | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @19||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @18 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|c+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|u+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|4+2#0000000#ff404010| +0&#ffd7ff255@20 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255| @20 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|w+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|c+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|y+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010| +0&#ffd7ff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|u+2#0000001#ff404010| +0&#ffd7ff255@20||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|4+2#0000001#ff404010| +0&#ffd7ff255@20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255| @20 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @19||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @18 |~+0#4040ff13&| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_rnu_01.dump b/src/testdir/dumps/Test_diff_rnu_01.dump index d51d66674c..b8b1c106e7 100644 --- a/src/testdir/dumps/Test_diff_rnu_01.dump +++ b/src/testdir/dumps/Test_diff_rnu_01.dump @@ -1,9 +1,9 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&|1+0#af5f00255&| @2>a+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|1| |a+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|2| |a+0#0000000&| @31 -| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#af5f00255&@1|3| |y+2#0000000#ff404010| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 +| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#af5f00255&@1|3| |y+2#0000001#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|4| |b+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|5| |b+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|6| |b+0#0000000&| @31 diff --git a/src/testdir/dumps/Test_diff_rnu_02.dump b/src/testdir/dumps/Test_diff_rnu_02.dump index d33a2ee0ab..6de21486da 100644 --- a/src/testdir/dumps/Test_diff_rnu_02.dump +++ b/src/testdir/dumps/Test_diff_rnu_02.dump @@ -1,9 +1,9 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|1| |a+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&|2+0#af5f00255&| @2>a+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|1| |a+0#0000000&| @31 -| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#af5f00255&@1|2| |y+2#0000000#ff404010| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 +| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#af5f00255&@1|2| |y+2#0000001#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|3| |b+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|4| |b+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|5| |b+0#0000000&| @31 diff --git a/src/testdir/dumps/Test_diff_rnu_03.dump b/src/testdir/dumps/Test_diff_rnu_03.dump index 0d29b84081..abb5143598 100644 --- a/src/testdir/dumps/Test_diff_rnu_03.dump +++ b/src/testdir/dumps/Test_diff_rnu_03.dump @@ -1,9 +1,9 @@ | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|2| |a+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|1| |a+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0| @33||+1&&|3+0#af5f00255&| @2>a+0#0000000&| @31 -| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010| +0&#ffd7ff255@33||+1&#ffffff0| +0#af5f00255&@1|1| |y+2#0000000#ff404010| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 -| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 +| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010| +0&#ffd7ff255@33||+1#0000000#ffffff0| +0#af5f00255&@1|1| |y+2#0000001#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 +| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255| @33||+1#0000000#ffffff0| +0#af5f00255&@3|-+0#4040ff13#afffff255@32 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|2| |b+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|3| |b+0#0000000&| @31 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0| @33||+1&&| +0#af5f00255&@1|4| |b+0#0000000&| @31 diff --git a/src/testdir/dumps/Test_diff_scroll_1.dump b/src/testdir/dumps/Test_diff_scroll_1.dump index 9713461012..17019204b7 100644 --- a/src/testdir/dumps/Test_diff_scroll_1.dump +++ b/src/testdir/dumps/Test_diff_scroll_1.dump @@ -3,10 +3,10 @@ | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |3| @28||+1&&| +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |3| @28 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |4| @28||+1&&| +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |4| @28 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|L+0#0000000#5fd7ff255|o|r|e|m| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000000#5fd7ff255|p|s|u|m| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|o|l|o|r| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000000#5fd7ff255|i|t| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|m|e|t|,| @29 -|X+1&#ffffff0|l|e|f|t| @13|5|,|0|-|1| @9|T|o|p| +3&&|X|r|i|g|h|t| @12|5|,|0|-|1| @9|T|o|p +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|L+0#0000001#5fd7ff255|o|r|e|m| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000001#5fd7ff255|p|s|u|m| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|o|l|o|r| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000001#5fd7ff255|i|t| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|m|e|t|,| @29 +|X+1#0000000#ffffff0|l|e|f|t| @13|5|,|0|-|1| @9|T|o|p| +3&&|X|r|i|g|h|t| @12|5|,|0|-|1| @9|T|o|p |"+0&&|X|r|i|g|h|t|"| |3@1|L|,| |2|6|3|B| @56 diff --git a/src/testdir/dumps/Test_diff_scroll_2.dump b/src/testdir/dumps/Test_diff_scroll_2.dump index d6cd1b9c99..f6eee1bd3f 100644 --- a/src/testdir/dumps/Test_diff_scroll_2.dump +++ b/src/testdir/dumps/Test_diff_scroll_2.dump @@ -3,10 +3,10 @@ | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |3| @28||+1&&| +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |3| @28 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |4| @28||+1&&| +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |4| @28 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>L+0#0000000#5fd7ff255|o|r|e|m| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000000#5fd7ff255|p|s|u|m| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|o|l|o|r| @29 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000000#5fd7ff255|i|t| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|m|e|t|,| @29 -|X+1&#ffffff0|l|e|f|t| @13|6|,|1| @11|T|o|p| +3&&|X|r|i|g|h|t| @12|6|,|1| @11|T|o|p +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>L+0#0000001#5fd7ff255|o|r|e|m| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|i+0#0000001#5fd7ff255|p|s|u|m| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#5fd7ff255|o|l|o|r| @29 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000001#5fd7ff255|i|t| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|m|e|t|,| @29 +|X+1#0000000#ffffff0|l|e|f|t| @13|6|,|1| @11|T|o|p| +3&&|X|r|i|g|h|t| @12|6|,|1| @11|T|o|p |"+0&&|X|r|i|g|h|t|"| |3@1|L|,| |2|6|3|B| @56 diff --git a/src/testdir/dumps/Test_diff_scroll_change_01.dump b/src/testdir/dumps/Test_diff_scroll_change_01.dump index 886fe60884..d3d660549a 100644 --- a/src/testdir/dumps/Test_diff_scroll_change_01.dump +++ b/src/testdir/dumps/Test_diff_scroll_change_01.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|7+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|8+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|7+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|8+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0@1| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0@1| @32 diff --git a/src/testdir/dumps/Test_diff_scroll_change_02.dump b/src/testdir/dumps/Test_diff_scroll_change_02.dump index d699ded1f0..bc6388a0e5 100644 --- a/src/testdir/dumps/Test_diff_scroll_change_02.dump +++ b/src/testdir/dumps/Test_diff_scroll_change_02.dump @@ -1,13 +1,13 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|7+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|8+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|7+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|8+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0@1| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0@1| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|2| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|2| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|3| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|3| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|4| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|4| @32 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|5>x+2&#ff404010| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|5>x+2&#ff404010| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|5| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_scroll_change_03.dump b/src/testdir/dumps/Test_diff_scroll_change_03.dump index 5a4088975b..36029b86a4 100644 --- a/src/testdir/dumps/Test_diff_scroll_change_03.dump +++ b/src/testdir/dumps/Test_diff_scroll_change_03.dump @@ -1,13 +1,13 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|7+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|8+0#0000000#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|6+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|7+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|8+0#0000001#5fd7ff255| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0@1| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0@1| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|2| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|2| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|3| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|3| @32 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|4| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|4| @32 -| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|5|x+2&#ff404010| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|5>y+2&#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|5|x+2&#ff404010| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#ffd7ff255|5>y+2&#ff404010| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_syntax_1.dump b/src/testdir/dumps/Test_diff_syntax_1.dump index c96793afa6..5b2c2bc18e 100644 --- a/src/testdir/dumps/Test_diff_syntax_1.dump +++ b/src/testdir/dumps/Test_diff_syntax_1.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1>v+0#00e0003#ffd7ff255|o|i|d| +0#0000000&|d|o|S+2&#ff404010|o|m|e|t+0&#ffd7ff255|h|i|n|g|(|)| |{| @52 +| +0#0000e05#a8a8a8255@1>v+0#0000001#ffd7ff255|o|i|d| |d|o|S+2&#ff404010|o|m|e|t+0&#ffd7ff255|h|i|n|g|(|)| |{| @52 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|i+0#00e0003&|n|t| +0#0000000&|x| |=| |0+0#e000002&|;+0#0000000&| @59 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@2|c+0#00e0003&|h|a|r| +0#0000000&|*|s| |=| |"+0#e000002&|t+2&#ff404010|h|e|r|e|"+0&#ffd7ff255|;+0#0000000&| @51 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@2|c|h|a|r| |*|s| |=| |"|t+2&#ff404010|h|e|r|e|"+0&#ffd7ff255|;| @51 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|5+0#e000002&|;+0#0000000&| @60 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71 |~+0#4040ff13&| @73 @@ -8,9 +8,9 @@ |~| @73 |~| @73 |X+3#0000000&|p|r|o|g|r|a|m|2|.|c| @45|1|,|1| @11|A|l@1 -| +0#0000e05#a8a8a8255@1|v+0#00e0003#ffd7ff255|o|i|d| +0#0000000&|d|o|N+2&#ff404010|o|t+0&#ffd7ff255|h|i|n|g|(|)| |{| @54 +| +0#0000e05#a8a8a8255@1|v+0#0000001#ffd7ff255|o|i|d| |d|o|N+2&#ff404010|o|t+0&#ffd7ff255|h|i|n|g|(|)| |{| @54 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|i+0#00e0003&|n|t| +0#0000000&|x| |=| |0+0#e000002&|;+0#0000000&| @59 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@2|c+0#00e0003&|h|a|r| +0#0000000&|*|s| |=| |"+0#e000002&|h+2&#ff404010|e|l@1|o|"+0&#ffd7ff255|;+0#0000000&| @51 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@2|c|h|a|r| |*|s| |=| |"|h+2&#ff404010|e|l@1|o|"+0&#ffd7ff255|;| @51 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@2|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|5+0#e000002&|;+0#0000000&| @60 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71 |~+0#4040ff13&| @73 diff --git a/src/testdir/dumps/Test_diff_topline_1.dump b/src/testdir/dumps/Test_diff_topline_1.dump index 5b5122621c..84129d2648 100644 --- a/src/testdir/dumps/Test_diff_topline_1.dump +++ b/src/testdir/dumps/Test_diff_topline_1.dump @@ -1,20 +1,20 @@ | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>2+0#0000000#5fd7ff255|1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|3| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|4| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|5| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|6| @32 -|[+1&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|4|2|%| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @5|2|1|,|1| @10|1|9|% +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|2| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|3| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|4| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|6| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|7| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|8| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|9| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|0| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>2+0#0000001#5fd7ff255|1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|3| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|4| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|6| @32 +|[+1#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|4|2|%| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @5|2|1|,|1| @10|1|9|% | +0&&@74 diff --git a/src/testdir/dumps/Test_diff_topline_2.dump b/src/testdir/dumps/Test_diff_topline_2.dump index a0f3db79c0..602e09f707 100644 --- a/src/testdir/dumps/Test_diff_topline_2.dump +++ b/src/testdir/dumps/Test_diff_topline_2.dump @@ -1,20 +1,20 @@ | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>2+0#0000000#5fd7ff255|1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|3| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|4| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|5| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|6| @32 -|[+1&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|4|2|%| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @5|2|1|,|1| @10|1|9|% +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|2| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|3| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|4| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|6| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|7| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|8| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|9| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|0| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>2+0#0000001#5fd7ff255|1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|3| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|4| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|6| @32 +|[+1#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|4|2|%| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @5|2|1|,|1| @10|1|9|% |9+0&&| @73 diff --git a/src/testdir/dumps/Test_diff_topline_3.dump b/src/testdir/dumps/Test_diff_topline_3.dump index 3c0c2c9c87..ddf456f457 100644 --- a/src/testdir/dumps/Test_diff_topline_3.dump +++ b/src/testdir/dumps/Test_diff_topline_3.dump @@ -5,16 +5,16 @@ | +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1>1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|1| @32 -|[+3&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|2| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|3| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|4| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|6| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|7| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|8| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|9| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|0| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|1| @32 +|[+3#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p | +0&&@74 diff --git a/src/testdir/dumps/Test_diff_topline_4.dump b/src/testdir/dumps/Test_diff_topline_4.dump index 94414b1e79..c7f7a48827 100644 --- a/src/testdir/dumps/Test_diff_topline_4.dump +++ b/src/testdir/dumps/Test_diff_topline_4.dump @@ -5,16 +5,16 @@ | +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33 | +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| +0#0000e05#a8a8a8255@1>1+0#0000000#ffffff0|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|1| @32 -|[+1&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255@1| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|2| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|3| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|4| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|5| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|6| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|7| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|8| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000001#5fd7ff255|9| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|0| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000001#5fd7ff255|1| @32 +|[+1#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p | +0&&@74 diff --git a/src/testdir/dumps/Test_diff_with_cul_bri_01.dump b/src/testdir/dumps/Test_diff_with_cul_bri_01.dump index 3855fa17c5..8df58b0c27 100644 --- a/src/testdir/dumps/Test_diff_with_cul_bri_01.dump +++ b/src/testdir/dumps/Test_diff_with_cul_bri_01.dump @@ -1,15 +1,15 @@ | +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@1|b+10&&|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1> +8#ffffff16#ff404010@1|f+10&&|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b+10#ffffff16&|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o+10#ffffff16&|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b+10#ffffff16&|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +8&&@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o+10#ffffff16&@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b|a|z+2&#ff404010|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b|a|r+2&#ff404010|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1&#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b+10#ffffff16&|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o+10#ffffff16&|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b+10#ffffff16&|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +8&&@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o+10#ffffff16&@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b|a|z+2&#ff404010|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b|a|r+2&#ff404010|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1#0000000#ffffff0|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_with_cul_bri_02.dump b/src/testdir/dumps/Test_diff_with_cul_bri_02.dump index c1ae50d6d4..2abacc91ed 100644 --- a/src/testdir/dumps/Test_diff_with_cul_bri_02.dump +++ b/src/testdir/dumps/Test_diff_with_cul_bri_02.dump @@ -1,15 +1,15 @@ -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b+2&#ff404010|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+2&#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b+2&#ff404010|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+2&#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 | +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1> +8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o+8#ffffff16#ff404010|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o+8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b|a|z+2&#ff404010|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b|a|r+2&#ff404010|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1&#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o+8#ffffff16#ff404010|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o+8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b|a|z+2&#ff404010|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b|a|r+2&#ff404010|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1#0000000#ffffff0|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_with_cul_bri_03.dump b/src/testdir/dumps/Test_diff_with_cul_bri_03.dump index bdf8be065e..f67af999b6 100644 --- a/src/testdir/dumps/Test_diff_with_cul_bri_03.dump +++ b/src/testdir/dumps/Test_diff_with_cul_bri_03.dump @@ -1,15 +1,15 @@ -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b+2&#ff404010|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+2&#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b+2&#ff404010|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+2&#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 | +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1> +8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o+8#ffffff16#ff404010|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o+8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b|a|z+2&#ff404010|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b|a|r+2&#ff404010|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1&#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o+8#ffffff16#ff404010|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+8#ffffff16#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o+8#ffffff16#ff404010@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b|a|z+2&#ff404010|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b|a|r+2&#ff404010|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1#0000000#ffffff0|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_with_cul_bri_04.dump b/src/testdir/dumps/Test_diff_with_cul_bri_04.dump index aa3ce8e5d4..6d7f2d642b 100644 --- a/src/testdir/dumps/Test_diff_with_cul_bri_04.dump +++ b/src/testdir/dumps/Test_diff_with_cul_bri_04.dump @@ -1,15 +1,15 @@ -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|b+2&#ff404010|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f+2&#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +0&#ffd7ff255@2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1&#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1&#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|b+2&#ff404010|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f+2&#ff404010|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@21 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1|b|e@1| +0&#ffd7ff255@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1|f|o@1||+1#0000000#ffffff0|~+0#4040ff13&| @22 | +0#0000e05#a8a8a8255@1| +8#ffffff16#ff404010@1|b|a|z+10&&|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1> +8#ffffff16#ff404010@1|b|a|r+10&&|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b+10#ffffff16&|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|r+10#ffffff16&|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1#0000000#ffffff0|~+0#4040ff13&| @22 -| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|b+10#ffffff16&|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +8&&@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000000#ff404010@1|a+10#ffffff16&|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b+10#ffffff16&|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|r+10#ffffff16&|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b||+1#0000000#ffffff0|~+0#4040ff13&| @22 +| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|b+10#ffffff16&|a|z|b|a|z|b|a|z|b|a|z|b|a|z|b|a|z| +8&&@2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +2#0000001#ff404010@1|a+10#ffffff16&|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r|b|a|r||+1#0000000#ffffff0|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_diff_with_cursorline_01.dump b/src/testdir/dumps/Test_diff_with_cursorline_01.dump index 0b9bcb9bda..0c6ddef8c0 100644 --- a/src/testdir/dumps/Test_diff_with_cursorline_01.dump +++ b/src/testdir/dumps/Test_diff_with_cursorline_01.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1|b+8#ffffff16#ff404010|e@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1>f+8#ffffff16#ff404010|o@1| @31 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_with_cursorline_02.dump b/src/testdir/dumps/Test_diff_with_cursorline_02.dump index 68014acb2c..bba165f7a9 100644 --- a/src/testdir/dumps/Test_diff_with_cursorline_02.dump +++ b/src/testdir/dumps/Test_diff_with_cursorline_02.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|e@1| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|e@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31 | +0#0000e05#a8a8a8255@1|f+8#ffffff16#ff404010|o@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>f+8#ffffff16#ff404010|o@1| @31 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|z+2&#ff404010| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_with_cursorline_03.dump b/src/testdir/dumps/Test_diff_with_cursorline_03.dump index 595de46ce1..8a6abf5d6b 100644 --- a/src/testdir/dumps/Test_diff_with_cursorline_03.dump +++ b/src/testdir/dumps/Test_diff_with_cursorline_03.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|e@1| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|e@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31||+1&&| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @31 | +0#0000e05#a8a8a8255@1|b+8#ffffff16#ff404010|a|z+10&&| +8&&@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>f+10#ffffff16#ff404010|o@1| +8&&@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|r+2&#ff404010| +0&#ffd7ff255@31 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diff_with_cursorline_number_01.dump b/src/testdir/dumps/Test_diff_with_cursorline_number_01.dump index 82892105e2..85393fb312 100644 --- a/src/testdir/dumps/Test_diff_with_cursorline_number_01.dump +++ b/src/testdir/dumps/Test_diff_with_cursorline_number_01.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |b+0#0000000#5fd7ff255|a|z| @27 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |b+0#0000001#5fd7ff255|a|z| @27 | +0#0000e05#a8a8a8255@1| +8#0000001#ffffff16@1|1| >f+8#ffffff16#ff404010|o@1| @27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +8#0000001#ffffff16@1|2| |f+8#ffffff16#ff404010|o@1| @27 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |f+0#0000000&|o@1| @27||+1&&| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |f+0#0000000&|o@1| @27 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |b+0#0000000&|a|r| @27||+1&&| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|4| |b+0#0000000&|a|r| @27 diff --git a/src/testdir/dumps/Test_diff_with_cursorline_number_02.dump b/src/testdir/dumps/Test_diff_with_cursorline_number_02.dump index 028441c5ed..bb7c9bfcf4 100644 --- a/src/testdir/dumps/Test_diff_with_cursorline_number_02.dump +++ b/src/testdir/dumps/Test_diff_with_cursorline_number_02.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |b+0#0000000#5fd7ff255|a|z| @27 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|-+0#4040ff13#afffff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |b+0#0000001#5fd7ff255|a|z| @27 | +0#0000e05#a8a8a8255@1| +8#0000001#ffffff16@1|1| >f+0#0000000#ffffff0|o@1| @27||+1&&| +0#0000e05#a8a8a8255@1| +8#0000001#ffffff16@1|2| |f+8#ffffff16#ff404010|o@1| @27 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |f+0#0000000&|o@1| @27||+1&&| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |f+0#0000000&|o@1| @27 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |b+0#0000000&|a|r| @27||+1&&| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|4| |b+0#0000000&|a|r| @27 diff --git a/src/testdir/dumps/Test_difffunc_diffexpr_1.dump b/src/testdir/dumps/Test_difffunc_diffexpr_1.dump index b103cc8d29..62b87ae6e4 100644 --- a/src/testdir/dumps/Test_difffunc_diffexpr_1.dump +++ b/src/testdir/dumps/Test_difffunc_diffexpr_1.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255|e|r|o| @30 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000001#5fd7ff255|e|r|o| @30 | +0#0000e05#a8a8a8255@1>o+0#0000000#ffffff0|n|e| @31||+1&&| +0#0000e05#a8a8a8255@1|o+0#0000000#ffffff0|n|e| @31 -| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|w|o|x+2&#ff404010| +0&#ffd7ff255@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|w|o| @31 +| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|w|o|x+2&#ff404010| +0&#ffd7ff255@30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000001#ffd7ff255|w|o| @31 | +0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|r|e@1| @29||+1&&| +0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|r|e@1| @29 -| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255|o|u|r| @30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|f+0#0000001#5fd7ff255|o|u|r| @30||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_diffput_to_empty_buf_01.dump b/src/testdir/dumps/Test_diffput_to_empty_buf_01.dump index 8fbd7a5399..dfa87b12e9 100644 --- a/src/testdir/dumps/Test_diffput_to_empty_buf_01.dump +++ b/src/testdir/dumps/Test_diffput_to_empty_buf_01.dump @@ -1,6 +1,6 @@ -| +0#0000e05#a8a8a8255@1>f+8#0000000#5fd7ff255|o@1| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|a|r| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|a|z| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1>f+8#0000001#5fd7ff255|o@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|a|r| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|a|z| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&| +0#0000e05#a8a8a8255@1| +8#0000000#ffffff0@34 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_3diffs1.dump b/src/testdir/dumps/Test_linematch_3diffs1.dump index a010d27617..ffddb99d4c 100644 --- a/src/testdir/dumps/Test_linematch_3diffs1.dump +++ b/src/testdir/dumps/Test_linematch_3diffs1.dump @@ -1,14 +1,14 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@22||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@21||+1&&| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@21 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c|o|m@1|o|n| |l|i|n|e| @9||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c|o|m@1|o|n| |l|i|n|e| @8||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c|o|m@1|o|n| |l|i|n|e| @8 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|<@6| |H|E|A|D| @7||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|=@6| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|>@6| |b|r|a|n|c|h|1| @4||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|<@6| |H|E|A|D| @7||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|A@2| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|A@2| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|A@2| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|A@2| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|A@2| @13||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|A@2| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|=@6| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|B@2| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|B@2| @12 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|B@2| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|B@2| @12 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|B@2| @12||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@5|B@2| @12 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|>@6| |b|r|a|n|c|h|1| @4||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 |~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_linematch_3diffs2.dump b/src/testdir/dumps/Test_linematch_3diffs2.dump index 3a333e6438..584463a18b 100644 --- a/src/testdir/dumps/Test_linematch_3diffs2.dump +++ b/src/testdir/dumps/Test_linematch_3diffs2.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|b|c|d|q| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|e|f| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|e|f|q+2&#ff404010| +0&#ffd7ff255@17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 -| +0#0000e05#a8a8a8255@1|h+0#0000000#ffd7ff255|i|j|k|l+2&#ff404010|m| +0&#ffd7ff255@16||+1&#ffffff0| +0#0000e05#a8a8a8255@1|h+0#0000000#ffd7ff255|i|j|k| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|h+0#0000000#ffd7ff255|i|j|k|l+2&#ff404010|m| +0&#ffd7ff255@15 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000000#ffd7ff255|o|p|q| @17||+1&#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000000#ffd7ff255|o|p|q|r+2&#ff404010| +0&#ffd7ff255@16 -| +0#0000e05#a8a8a8255@1> +0#0000000#ffd7ff255@22||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+2#0000000#ff404010|t|u|v| +0&#ffd7ff255@17 +| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|b|c|d|q| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|e|f| @19||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000001#ffd7ff255|e|f|q+2&#ff404010| +0&#ffd7ff255@17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21 +| +0#0000e05#a8a8a8255@1|h+0#0000001#ffd7ff255|i|j|k|l+2&#ff404010|m| +0&#ffd7ff255@16||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|h+0#0000001#ffd7ff255|i|j|k| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|h+0#0000001#ffd7ff255|i|j|k|l+2&#ff404010|m| +0&#ffd7ff255@15 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000001#ffd7ff255|o|p|q| @17||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|n+0#0000001#ffd7ff255|o|p|q|r+2&#ff404010| +0&#ffd7ff255@16 +| +0#0000e05#a8a8a8255@1> +0#0000001#ffd7ff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+2#0000001#ff404010|t|u|v| +0&#ffd7ff255@17 |~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 |~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22 diff --git a/src/testdir/dumps/Test_linematch_diff1.dump b/src/testdir/dumps/Test_linematch_diff1.dump index 7e6776acc8..3559dd563e 100644 --- a/src/testdir/dumps/Test_linematch_diff1.dump +++ b/src/testdir/dumps/Test_linematch_diff1.dump @@ -1,7 +1,7 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|!+0#0000000#5fd7ff255| @33 -| +0#0000e05#a8a8a8255@1>/+2#0000000#ff404010@1| |a|b|c| |d|?| +0&#ffd7ff255@25||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|b|c| |d|!| +0&#ffd7ff255@28 -| +0#0000e05#a8a8a8255@1|/+2#0000000#ff404010@1| |d|?| +0&#ffd7ff255@29||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000000#ff404010|!| +0&#ffd7ff255@32 -| +0#0000e05#a8a8a8255@1|/+0#0000000#5fd7ff255@1| |d|?| @29||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|!+0#0000001#5fd7ff255| @33 +| +0#0000e05#a8a8a8255@1>/+2#0000001#ff404010@1| |a|b|c| |d|?| +0&#ffd7ff255@25||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|b|c| |d|!| +0&#ffd7ff255@28 +| +0#0000e05#a8a8a8255@1|/+2#0000001#ff404010@1| |d|?| +0&#ffd7ff255@29||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+2#0000001#ff404010|!| +0&#ffd7ff255@32 +| +0#0000e05#a8a8a8255@1|/+0#0000001#5fd7ff255@1| |d|?| @29||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 |~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_grouping1.dump b/src/testdir/dumps/Test_linematch_diff_grouping1.dump index 19c907390e..1c523d955c 100644 --- a/src/testdir/dumps/Test_linematch_diff_grouping1.dump +++ b/src/testdir/dumps/Test_linematch_diff_grouping1.dump @@ -1,11 +1,11 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|Z| @32 -| +0#0000e05#a8a8a8255@1>!+2#0000000#ff404010|A+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|A+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|B+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|B+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|C+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|C+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|A| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|B| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|B| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|Z| @32 +| +0#0000e05#a8a8a8255@1>!+2#0000001#ff404010|A+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|A+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|B+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|B+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|C+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|C+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|A| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|B| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|B| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_grouping2.dump b/src/testdir/dumps/Test_linematch_diff_grouping2.dump index 35cf575c4e..c97c253bce 100644 --- a/src/testdir/dumps/Test_linematch_diff_grouping2.dump +++ b/src/testdir/dumps/Test_linematch_diff_grouping2.dump @@ -1,11 +1,11 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|A| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|Z| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|B| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 -| +0#0000e05#a8a8a8255@1>!+2#0000000#ff404010|A+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|A+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|B+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|B+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|C+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|C+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|A| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|Z| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|B| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1>!+2#0000001#ff404010|A+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|A+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|B+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|B+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|C+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|C+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_grouping_scroll0.dump b/src/testdir/dumps/Test_linematch_diff_grouping_scroll0.dump index 35cf575c4e..c97c253bce 100644 --- a/src/testdir/dumps/Test_linematch_diff_grouping_scroll0.dump +++ b/src/testdir/dumps/Test_linematch_diff_grouping_scroll0.dump @@ -1,11 +1,11 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|A| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|Z| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|B| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 -| +0#0000e05#a8a8a8255@1>!+2#0000000#ff404010|A+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|A+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|B+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|B+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|C+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|C+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|A| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|Z| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|B| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1>!+2#0000001#ff404010|A+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|A+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|B+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|B+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|C+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|C+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_grouping_scroll1.dump b/src/testdir/dumps/Test_linematch_diff_grouping_scroll1.dump index 673b9094c8..4a8f0db56f 100644 --- a/src/testdir/dumps/Test_linematch_diff_grouping_scroll1.dump +++ b/src/testdir/dumps/Test_linematch_diff_grouping_scroll1.dump @@ -1,8 +1,8 @@ -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 -| +0#0000e05#a8a8a8255@1>!+2#0000000#ff404010|A+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|A+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|B+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|B+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|!+2#0000000#ff404010|C+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|C+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1>!+2#0000001#ff404010|A+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|A+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|B+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|B+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|!+2#0000001#ff404010|C+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|C+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_grouping_scroll2.dump b/src/testdir/dumps/Test_linematch_diff_grouping_scroll2.dump index 0d91732f6b..8733f7d096 100644 --- a/src/testdir/dumps/Test_linematch_diff_grouping_scroll2.dump +++ b/src/testdir/dumps/Test_linematch_diff_grouping_scroll2.dump @@ -1,5 +1,5 @@ -| +0#0000e05#a8a8a8255@1>!+2#0000000#ff404010|C+0&#ffd7ff255| @32||+1&#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000000#ff404010|C+0&#ffd7ff255| @32 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000000#5fd7ff255|C| @32 +| +0#0000e05#a8a8a8255@1>!+2#0000001#ff404010|C+0&#ffd7ff255| @32||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+2#0000001#ff404010|C+0&#ffd7ff255| @32 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|?+0#0000001#5fd7ff255|C| @32 |~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_iwhite1.dump b/src/testdir/dumps/Test_linematch_diff_iwhite1.dump index 50803a3175..45e6964fa4 100644 --- a/src/testdir/dumps/Test_linematch_diff_iwhite1.dump +++ b/src/testdir/dumps/Test_linematch_diff_iwhite1.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1>v+0#0000000#ffffff0|o|i|d| |t|e|s|t|F|u|n|c|t|i|o|n| |(|)| |{| @12||+1&&| +0#0000e05#a8a8a8255@1|v+0#0000000#ffffff0|o|i|d| |t|e|s|t|F|u|n|c|t|i|o|n| |(|)| |{| @12 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|f|o|r| |(|i|n|t| |i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| |{| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1| +2&#ff404010@1|f|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |j|++0&#ffd7ff255@1|)| |{| ||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|/+2&#ff404010@1| |f|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |i|++0&#ffd7ff255@1|)| |{ -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1| +2&#ff404010| +0&#ffd7ff255|}| @29||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|/+2&#ff404010@1| +0&#ffd7ff255|}| @28 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|}| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|f|o|r| |(|i|n|t| |i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| |{| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1| +2&#ff404010@1|f|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |j|++0&#ffd7ff255@1|)| |{| ||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|/+2&#ff404010@1| |f|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |i|++0&#ffd7ff255@1|)| |{ +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1| +2&#ff404010| +0&#ffd7ff255|}| @29||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|/+2&#ff404010@1| +0&#ffd7ff255|}| @28 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|}| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_diff_iwhite2.dump b/src/testdir/dumps/Test_linematch_diff_iwhite2.dump index 11a489a57d..d455365b24 100644 --- a/src/testdir/dumps/Test_linematch_diff_iwhite2.dump +++ b/src/testdir/dumps/Test_linematch_diff_iwhite2.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1>v+0#0000000#ffffff0|o|i|d| |t|e|s|t|F|u|n|c|t|i|o|n| |(|)| |{| @12||+1&&| +0#0000e05#a8a8a8255@1|v+0#0000000#ffffff0|o|i|d| |t|e|s|t|F|u|n|c|t|i|o|n| |(|)| |{| @12 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|f|o|r| |(|i|n|t| |i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| |{| @2||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@3|f+2&#ff404010|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |j|++0&#ffd7ff255@1|)| |{| ||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|/+2&#ff404010@1| |f|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |i|++0&#ffd7ff255@1|)| |{ -| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@3|}| @29||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@1|/+2&#ff404010@1| |}+0&#ffd7ff255| @28 -| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|}| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|f|o|r| |(|i|n|t| |i| |=| |0|;| |i| |<| |1|0|;| |i|+@1|)| |{| @2||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@3|f+2&#ff404010|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |j|++0&#ffd7ff255@1|)| |{| ||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|/+2&#ff404010@1| |f|o|r| |(|i|n|t| |j| |=| |0|;| |j| |<| |1|0|;| |i|++0&#ffd7ff255@1|)| |{ +| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@3|}| @29||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000001#ffd7ff255@1|/+2&#ff404010@1| |}+0&#ffd7ff255| @28 +| +0#0000e05#a8a8a8255@1| +0#0000001#5fd7ff255@1|}| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33||+1&&| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @33 |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 |~| @35||+1#0000000&|~+0#4040ff13&| @35 diff --git a/src/testdir/dumps/Test_linematch_line_limit_exceeded1.dump b/src/testdir/dumps/Test_linematch_line_limit_exceeded1.dump index 71b0848765..ef37c8ba09 100644 --- a/src/testdir/dumps/Test_linematch_line_limit_exceeded1.dump +++ b/src/testdir/dumps/Test_linematch_line_limit_exceeded1.dump @@ -1,19 +1,19 @@ | +0#0000e05#a8a8a8255@1>c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 -| +0#0000e05#a8a8a8255@1|H+2#0000000#ff404010|I|L| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000000#ff404010|H|I| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000000#5fd7ff255|o|m|e|t|h|i|n|g| @25 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|H+2#0000001#ff404010|I|L| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000001#ff404010|H|I| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000001#5fd7ff255|o|m|e|t|h|i|n|g| @25 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|A|B|C|a|b|c| +0&#ffd7ff255@27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010|y|z| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|A|B|C|a|b|c| +0&#ffd7ff255@27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010|y|z| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|A|B|C|a|b|c| +0&#ffd7ff255@27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000000#ff404010|y|z| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|D|E|F|a|b|c| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|D|E|F|a|b|c| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|D|E|F|a|b|c| @27 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|A|B|C|a|b|c| +0&#ffd7ff255@27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010|y|z| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|A|B|C|a|b|c| +0&#ffd7ff255@27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010|y|z| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|a+2#0000001#ff404010|A|B|C|a|b|c| +0&#ffd7ff255@27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+2#0000001#ff404010|y|z| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|D|E|F|a|b|c| @27 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|D|E|F|a|b|c| @27 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#5fd7ff255|D|E|F|a|b|c| @27 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 -| +0#0000e05#a8a8a8255@1|H+2#0000000#ff404010|I|L| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000000#ff404010|H|I| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000000#5fd7ff255|o|m|e|t|h|i|n|g| |e|l|s|e| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|H+2#0000001#ff404010|I|L| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000001#ff404010|H|I| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000001#5fd7ff255|o|m|e|t|h|i|n|g| |e|l|s|e| @20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |X+3&&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_linematch_line_limit_exceeded2.dump b/src/testdir/dumps/Test_linematch_line_limit_exceeded2.dump index b88b407732..f40e6f67ef 100644 --- a/src/testdir/dumps/Test_linematch_line_limit_exceeded2.dump +++ b/src/testdir/dumps/Test_linematch_line_limit_exceeded2.dump @@ -1,19 +1,19 @@ | +0#0000e05#a8a8a8255@1>c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 -| +0#0000e05#a8a8a8255@1|H+2#0000000#ff404010|I|L| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000000#ff404010|H|I| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000000#5fd7ff255|o|m|e|t|h|i|n|g| @25 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|H+2#0000001#ff404010|I|L| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000001#ff404010|H|I| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000001#5fd7ff255|o|m|e|t|h|i|n|g| @25 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000000#5fd7ff255|y|z| @31 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 -| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|x+0#0000001#5fd7ff255|y|z| @31 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 +| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|A+2&#ff404010|B|C|a+0&#ffd7ff255|b|c| @27||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000001#ffd7ff255|D+2&#ff404010|E|F|a+0&#ffd7ff255|b|c| @27 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000000#5fd7ff255|E|F| @31 -| +0#0000e05#a8a8a8255@1|H+2#0000000#ff404010|I|L| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000000#ff404010|H|I| +0&#ffd7ff255@31 -| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000000#5fd7ff255|o|m|e|t|h|i|n|g| |e|l|s|e| @20 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|D+0#0000001#5fd7ff255|E|F| @31 +| +0#0000e05#a8a8a8255@1|H+2#0000001#ff404010|I|L| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|G+2#0000001#ff404010|H|I| +0&#ffd7ff255@31 +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|s+0#0000001#5fd7ff255|o|m|e|t|h|i|n|g| |e|l|s|e| @20 | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0|o|m@1|o|n| |l|i|n|e| @23 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25||+1&&| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e|t|h|i|n|g| @25 |X+3&&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1 diff --git a/src/testdir/dumps/Test_long_text_with_padding_1.dump b/src/testdir/dumps/Test_long_text_with_padding_1.dump index 18ca00cfc4..4482f7d187 100644 --- a/src/testdir/dumps/Test_long_text_with_padding_1.dump +++ b/src/testdir/dumps/Test_long_text_with_padding_1.dump @@ -1,7 +1,7 @@ |f+0&#ffffff0|i|r|s|t| |l|i|n|e| @49 -@3|a+0&#ffd7ff255|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|… -| +0&#ffffff0@29|m+0&#ffd7ff255|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e|… -|s+0&#ffffff0|e|c|o|n|d| >l|i|n|e| @48 +@3|a+0#0000001#ffd7ff255|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|… +| +0#0000000#ffffff0@29|m+0#0000001#ffd7ff255|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e|… +|s+0#0000000#ffffff0|e|c|o|n|d| >l|i|n|e| @48 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_long_text_with_padding_2.dump b/src/testdir/dumps/Test_long_text_with_padding_2.dump index 981613fc8a..c53e47efdc 100644 --- a/src/testdir/dumps/Test_long_text_with_padding_2.dump +++ b/src/testdir/dumps/Test_long_text_with_padding_2.dump @@ -1,7 +1,7 @@ |f+0&#ffffff0|i|r|s|t| |l|i|n|e|$+0#4040ff13&| +0#0000000&@48 -@3|a+0&#ffd7ff255|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|… -| +0&#ffffff0@29|m+0&#ffd7ff255|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e|… -|s+0&#ffffff0|e|c|o|n|d| >l|i|n|e|$+0#4040ff13&| +0#0000000&@47 +@3|a+0#0000001#ffd7ff255|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|t|e|r| |a|f|… +| +0#0000000#ffffff0@29|m+0#0000001#ffd7ff255|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e| |m|o|r|e|… +|s+0#0000000#ffffff0|e|c|o|n|d| >l|i|n|e|$+0#4040ff13&| +0#0000000&@47 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_modify_text_before_prop_1.dump b/src/testdir/dumps/Test_modify_text_before_prop_1.dump index 87305d434f..c40a895b84 100644 --- a/src/testdir/dumps/Test_modify_text_before_prop_1.dump +++ b/src/testdir/dumps/Test_modify_text_before_prop_1.dump @@ -1,5 +1,5 @@ -| +0#af5f00255#ffffff0@1|1| >t+0#0000000&|e|s|t|_|w|o|r|d|s|a+0&#ffd7ff255@45 -| +0#af5f00255#ffffff0@3|a+0#0000000#ffd7ff255@18| +0&#ffffff0@36 +| +0#af5f00255#ffffff0@1|1| >t+0#0000000&|e|s|t|_|w|o|r|d|s|a+0#0000001#ffd7ff255@45 +| +0#af5f00255#ffffff0@3|a+0#0000001#ffd7ff255@18| +0#0000000#ffffff0@36 | +0#af5f00255&@3|a+0#4040ff13&@54|… | +0#af5f00255&@1|2| |s+0#0000000&|e|c|o|n|d| |l|i|n|e| @44 @42|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_modify_text_before_prop_2.dump b/src/testdir/dumps/Test_modify_text_before_prop_2.dump index 9dc87a4f0a..a53bd8b4c7 100644 --- a/src/testdir/dumps/Test_modify_text_before_prop_2.dump +++ b/src/testdir/dumps/Test_modify_text_before_prop_2.dump @@ -1,5 +1,5 @@ -| +0#af5f00255#ffffff0@1|1| >a+0#0000000&|s|t|_|w|o|r|d|s|a+0&#ffd7ff255@46 -| +0#af5f00255#ffffff0@3|a+0#0000000#ffd7ff255@17| +0&#ffffff0@37 +| +0#af5f00255#ffffff0@1|1| >a+0#0000000&|s|t|_|w|o|r|d|s|a+0#0000001#ffd7ff255@46 +| +0#af5f00255#ffffff0@3|a+0#0000001#ffd7ff255@17| +0#0000000#ffffff0@37 | +0#af5f00255&@3|a+0#4040ff13&@54|… | +0#af5f00255&@1|2| |s+0#0000000&|e|c|o|n|d| |l|i|n|e| @44 @42|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_popup_textprop_01.dump b/src/testdir/dumps/Test_popup_textprop_01.dump index e85ea7e8eb..91aa8dcc55 100644 --- a/src/testdir/dumps/Test_popup_textprop_01.dump +++ b/src/testdir/dumps/Test_popup_textprop_01.dump @@ -2,7 +2,7 @@ |4|7| @14|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@45 |4|8| @14|║+0#0000001#ffd7ff255| |t|h|e| |t|e|x|t| |║| +0#0000000#ffffff0@45 |4|9| @14|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@45 ->s|o|m|e| |t|e|x|t| |t+0fd7ff255|o| |w|o|r|k| +0&#ffffff0|w|i|t|h| @52 +>s|o|m|e| |t|e|x|t| |t+0#0000001#5fd7ff255|o| |w|o|r|k| +0#0000000#ffffff0|w|i|t|h| @52 |5|1| @72 |5|2| @72 |5|3| @72 diff --git a/src/testdir/dumps/Test_popup_textprop_02.dump b/src/testdir/dumps/Test_popup_textprop_02.dump index 58fdc28578..db261369da 100644 --- a/src/testdir/dumps/Test_popup_textprop_02.dump +++ b/src/testdir/dumps/Test_popup_textprop_02.dump @@ -1,4 +1,4 @@ ->s+0&#ffffff0|o|m|e| |t|e|x|t| |t+0fd7ff255|o| |w|o|r|k| +0&#ffffff0|w|i|t|h| @52 +>s+0&#ffffff0|o|m|e| |t|e|x|t| |t+0#0000001#5fd7ff255|o| |w|o|r|k| +0#0000000#ffffff0|w|i|t|h| @52 |5|1| @14|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@45 |5|2| @14|║+0#0000001#ffd7ff255| |t|h|e| |t|e|x|t| |║| +0#0000000#ffffff0@45 |5|3| @14|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@45 diff --git a/src/testdir/dumps/Test_popup_textprop_03.dump b/src/testdir/dumps/Test_popup_textprop_03.dump index efc685395e..4d69faadce 100644 --- a/src/testdir/dumps/Test_popup_textprop_03.dump +++ b/src/testdir/dumps/Test_popup_textprop_03.dump @@ -2,7 +2,7 @@ |4|7| @17|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@42 |4|8| @17|║+0#0000001#ffd7ff255| |t|h|e| |t|e|x|t| |║| +0#0000000#ffffff0@42 |4|9| @17|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@42 -|a|w>e|s|o|m|e| |t|e|x|t| |t+0fd7ff255|o| |w|o|r|k| +0&#ffffff0|w|i|t|h| @49 +|a|w>e|s|o|m|e| |t|e|x|t| |t+0#0000001#5fd7ff255|o| |w|o|r|k| +0#0000000#ffffff0|w|i|t|h| @49 |5|1| @72 |5|2| @72 |5|3| @72 diff --git a/src/testdir/dumps/Test_popup_textprop_04.dump b/src/testdir/dumps/Test_popup_textprop_04.dump index b8179c6864..54ef4cf073 100644 --- a/src/testdir/dumps/Test_popup_textprop_04.dump +++ b/src/testdir/dumps/Test_popup_textprop_04.dump @@ -2,7 +2,7 @@ |4|7| @9|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@50 |4|8| @9|║+0#0000001#ffd7ff255| |t|h|e| |t|e|x|t| |║| +0#0000000#ffffff0@50 |4|9| @9|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@50 ->t|e|x|t| |t+0fd7ff255|o| |w|o|r|k| +0&#ffffff0|w|i|t|h| @57 +>t|e|x|t| |t+0#0000001#5fd7ff255|o| |w|o|r|k| +0#0000000#ffffff0|w|i|t|h| @57 |5|1| @72 |5|2| @72 |5|3| @72 diff --git a/src/testdir/dumps/Test_popup_textprop_05.dump b/src/testdir/dumps/Test_popup_textprop_05.dump index 78ae14227c..f40472983c 100644 --- a/src/testdir/dumps/Test_popup_textprop_05.dump +++ b/src/testdir/dumps/Test_popup_textprop_05.dump @@ -3,7 +3,7 @@ |4|8| @9|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@50 |4|9| @9|║+0#0000001#ffd7ff255| |t|h|e| |t|e|x|t| |║| +0#0000000#ffffff0@50 |i|n|s|e|r|t|e>d| @3|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@50 -|t|e|x|t| |t+0fd7ff255|o| |w|o|r|k| +0&#ffffff0|w|i|t|h| @57 +|t|e|x|t| |t+0#0000001#5fd7ff255|o| |w|o|r|k| +0#0000000#ffffff0|w|i|t|h| @57 |5|1| @72 |5|2| @72 |5|3| @72 diff --git a/src/testdir/dumps/Test_popup_textprop_06.dump b/src/testdir/dumps/Test_popup_textprop_06.dump index 2327998396..b1955552ff 100644 --- a/src/testdir/dumps/Test_popup_textprop_06.dump +++ b/src/testdir/dumps/Test_popup_textprop_06.dump @@ -1,7 +1,7 @@ |4+0&#ffffff0|6| @9|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@50 |4|7| @9|║+0#0000001#ffd7ff255| |t|h|e| |t|e|x|t| |║| +0#0000000#ffffff0@50 |4|8| @9|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@50 ->t|e|x|t| |t+0fd7ff255|o| |w|o|r|k| +0&#ffffff0|w|i|t|h| @57 +>t|e|x|t| |t+0#0000001#5fd7ff255|o| |w|o|r|k| +0#0000000#ffffff0|w|i|t|h| @57 |5|1| @72 |5|2| @72 |5|3| @72 diff --git a/src/testdir/dumps/Test_popup_textprop_corn_1.dump b/src/testdir/dumps/Test_popup_textprop_corn_1.dump index ac18c999f2..e0171ffc1a 100644 --- a/src/testdir/dumps/Test_popup_textprop_corn_1.dump +++ b/src/testdir/dumps/Test_popup_textprop_corn_1.dump @@ -3,7 +3,7 @@ |4|7| @3|╔+0#0000001#ffd7ff255|═@13|╗| +0#0000000#ffffff0@52 |4|8| @3|║+0#0000001#ffd7ff255| |b|o|t@1|o|m| |r|i|g|h|t| |║| +0#0000000#ffffff0@52 |4|9| @3|╚+0#0000001#ffd7ff255|═@13|╝| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|b|o|t@1|o|m| |l|e|f|t| | +0#0000000#ffffff0@33 ->n|o|w| |w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0fd7ff255|o|n|g|e|r| +0&#ffffff0|t|e|x|t| |h|e|r|e| @36 +>n|o|w| |w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0#0000001#5fd7ff255|o|n|g|e|r| +0#0000000#ffffff0|t|e|x|t| |h|e|r|e| @36 |5|1| @8| +0#0000001#ffd7ff255|t|o|p| |r|i|g|h|t| | +0#0000000#ffffff0@5|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@34 |5|2| @25|║+0#0000001#ffd7ff255| |t|o|p| |l|e|f|t| |║| +0#0000000#ffffff0@34 |5|3| @25|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@34 diff --git a/src/testdir/dumps/Test_popup_textprop_corn_2.dump b/src/testdir/dumps/Test_popup_textprop_corn_2.dump index b7be5dd8c4..72943865fd 100644 --- a/src/testdir/dumps/Test_popup_textprop_corn_2.dump +++ b/src/testdir/dumps/Test_popup_textprop_corn_2.dump @@ -3,7 +3,7 @@ |4|7|╔+0#0000001#ffd7ff255|═@13|╗| +0#0000000#ffffff0@56 |4|8|║+0#0000001#ffd7ff255| |b|o|t@1|o|m| |r|i|g|h|t| |║| +0#0000000#ffffff0@56 |4|9|╚+0#0000001#ffd7ff255|═@13|╝| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|b|o|t@1|o|m| |l|e|f|t| | +0#0000000#ffffff0@37 ->w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0fd7ff255|o|n|g|e|r| +0&#ffffff0|t|e|x|t| |h|e|r|e| @40 +>w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0#0000001#5fd7ff255|o|n|g|e|r| +0#0000000#ffffff0|t|e|x|t| |h|e|r|e| @40 |5|1| @4| +0#0000001#ffd7ff255|t|o|p| |r|i|g|h|t| | +0#0000000#ffffff0@5|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@38 |5|2| @21|║+0#0000001#ffd7ff255| |t|o|p| |l|e|f|t| |║| +0#0000000#ffffff0@38 |5|3| @21|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@38 diff --git a/src/testdir/dumps/Test_popup_textprop_corn_3.dump b/src/testdir/dumps/Test_popup_textprop_corn_3.dump index bd77c0784f..1079d84e2f 100644 --- a/src/testdir/dumps/Test_popup_textprop_corn_3.dump +++ b/src/testdir/dumps/Test_popup_textprop_corn_3.dump @@ -4,7 +4,7 @@ |4|7|╔+0#0000001#ffd7ff255|═@13|╗| +0#0000000#ffffff0@56 |4|8|║+0#0000001#ffd7ff255| |b|o|t@1|o|m| |r|i|g|h|t| |║| +0#0000000#ffffff0@56 |4|9|╚+0#0000001#ffd7ff255|═@13|╝| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|b|o|t@1|o|m| |l|e|f|t| | +0#0000000#ffffff0@37 -|w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0fd7ff255|o|n|g|e|r| +0&#ffffff0|t|e|x|t| |h|e|r|e| @40 +|w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0#0000001#5fd7ff255|o|n|g|e|r| +0#0000000#ffffff0|t|e|x|t| |h|e|r|e| @40 |5|1| @4| +0#0000001#ffd7ff255|t|o|p| |r|i|g|h|t| | +0#0000000#ffffff0@5|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@38 |5|2| @21|║+0#0000001#ffd7ff255| |t|o|p| |l|e|f|t| |║| +0#0000000#ffffff0@38 |5|3| @21|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@38 diff --git a/src/testdir/dumps/Test_popup_textprop_corn_4.dump b/src/testdir/dumps/Test_popup_textprop_corn_4.dump index 6db9eee8c0..db400c2cff 100644 --- a/src/testdir/dumps/Test_popup_textprop_corn_4.dump +++ b/src/testdir/dumps/Test_popup_textprop_corn_4.dump @@ -3,7 +3,7 @@ |4|7|╔+0#0000001#ffd7ff255|═@13|╗| +0#0000000#ffffff0@56 |4|8|║+0#0000001#ffd7ff255| |b|o|t@1|o|m| |r|i|g|h|t| |║| +0#0000000#ffffff0@56 |4|9|╚+0#0000001#ffd7ff255|═@13|╝| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|b|o|t@1|o|m| |l|e|f|t| | +0#0000000#ffffff0@37 -|w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0fd7ff255|o|n|g|e|r| +0&#ffffff0|t|e|x|t| |h|e|r|e| @40 +|w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0#0000001#5fd7ff255|o|n|g|e|r| +0#0000000#ffffff0|t|e|x|t| |h|e|r|e| @40 |5|1| @4| +0#0000001#ffd7ff255|t|o|p| |r|i|g|h|t| | +0#0000000#ffffff0@5|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@38 |5|2| @21|║+0#0000001#ffd7ff255| |t|o|p| |l|e|f|t| |║| +0#0000000#ffffff0@38 |5|3| @21|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0@38 diff --git a/src/testdir/dumps/Test_popup_textprop_corn_5.dump b/src/testdir/dumps/Test_popup_textprop_corn_5.dump index 59bae7845f..6c06bacf17 100644 --- a/src/testdir/dumps/Test_popup_textprop_corn_5.dump +++ b/src/testdir/dumps/Test_popup_textprop_corn_5.dump @@ -3,7 +3,7 @@ |~+0#4040ff13&| @35||+1#0000000&|4+0&&|7|╔+0#0000001#ffd7ff255|═@13|╗| +0#0000000#ffffff0@18 |~+0#4040ff13&| @35||+1#0000000&|4+0&&|8|║+0#0000001#ffd7ff255| |b|o|t@1|o|m| |r|i|g|h|t| |║| +0#0000000#ffffff0@18 |~+0#4040ff13&| @35||+1#0000000&|4+0&&|9|╚+0#0000001#ffd7ff255|═@13|╝| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|b|o|t@1|o|m| |l|e|f|t| -|~+0#4040ff13#ffffff0| @35||+1#0000000&|w+0&&|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0fd7ff255|o|n|g|e|r| +0&#ffffff0|t|e|x|t| |h|e|r|e| @2 +|~+0#4040ff13#ffffff0| @35||+1#0000000&|w+0&&|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0#0000001#5fd7ff255|o|n|g|e|r| +0#0000000#ffffff0|t|e|x|t| |h|e|r|e| @2 |~+0#4040ff13&| @35||+1#0000000&|5+0&&|1| @4| +0#0000001#ffd7ff255|t|o|p| |r|i|g|h|t| | +0#0000000#ffffff0@5|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0 |~+0#4040ff13&| @35||+1#0000000&|5+0&&|2| @21|║+0#0000001#ffd7ff255| |t|o|p| |l|e|f|t| |║| +0#0000000#ffffff0 |~+0#4040ff13&| @35||+1#0000000&|5+0&&|3| @21|╚+0#0000001#ffd7ff255|═@9|╝| +0#0000000#ffffff0 diff --git a/src/testdir/dumps/Test_popup_textprop_off_1.dump b/src/testdir/dumps/Test_popup_textprop_off_1.dump index 33f2978223..81541e6d27 100644 --- a/src/testdir/dumps/Test_popup_textprop_off_1.dump +++ b/src/testdir/dumps/Test_popup_textprop_off_1.dump @@ -3,7 +3,7 @@ |4|7| @1|║+0#0000001#ffd7ff255| |b|o|t@1|o|m| |r|i|g|h|t| |║| +0#0000000#ffffff0@54 |4|8| @1|╚+0#0000001#ffd7ff255|═@13|╝| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255|b|o|t@1|o|m| |l|e|f|t| | +0#0000000#ffffff0@31 |4|9| @72 ->n|o|w| |w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0fd7ff255|o|n|g|e|r| +0&#ffffff0|t|e|x|t| |h|e|r|e| @36 +>n|o|w| |w|o|r|k|i|n|g| |w|i|t|h| |s|o|m|e| |l+0#0000001#5fd7ff255|o|n|g|e|r| +0#0000000#ffffff0|t|e|x|t| |h|e|r|e| @36 |5|1| @72 |5|2| @6| +0#0000001#ffd7ff255|t|o|p| |r|i|g|h|t| | +0#0000000#ffffff0@9|╔+0#0000001#ffd7ff255|═@9|╗| +0#0000000#ffffff0@32 |5|3| @27|║+0#0000001#ffd7ff255| |t|o|p| |l|e|f|t| |║| +0#0000000#ffffff0@32 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_1.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_1.dump index d6ac04ec91..0a4641d58e 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_1.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_1.dump @@ -1,8 +1,8 @@ >"+0&#ffffff0| |l|i|n|e| |1| @51 |"| |l|i|n|e| |2| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| +0#0000000#ffffff0@47 |"| |l|i|n|e| |3| @51 |"| |l|i|n|e| |4| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0#0000000#ffffff0@45 |@+0#4040ff13&@2| @56 | +0#0000000&@41|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_10.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_10.dump index de1ee5c458..06576b5c40 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_10.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_10.dump @@ -1,8 +1,8 @@ |"+0&#ffffff0| |l|i|n|e| |7| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 |"| |l|i|n|e| |8| @51 >"| |l|i|n|e| |9| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |1|0| @50 @42|9|,|1| @10|B|o|t| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_11.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_11.dump index 2368ecf3de..778c08f685 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_11.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_11.dump @@ -1,8 +1,8 @@ -|<+0#4040ff13#ffffff0@2|e+0#0000000#ffd7ff255|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|<+0#4040ff13#ffffff0@2|e+0#0000001#ffd7ff255|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 |"| |l|i|n|e| |8| @51 >"| |l|i|n|e| |9| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |1|0| @50 |~+0#4040ff13&| @58 | +0#0000000&@41|9|,|1| @10|B|o|t| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_12.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_12.dump index de222166df..cc8d575cc6 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_12.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_12.dump @@ -1,7 +1,7 @@ |"+0&#ffffff0| |l|i|n|e| |8| @51 |"| |l|i|n|e| |9| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@45 >"| |l|i|n|e| |1|0| @50 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_13.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_13.dump index 6c9db8b876..3f7300d1a9 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_13.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_13.dump @@ -1,6 +1,6 @@ |"+0&#ffffff0| |l|i|n|e| |9| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@45 >"| |l|i|n|e| |1|0| @50 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_14.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_14.dump index 341707e454..958e17766d 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_14.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_14.dump @@ -1,5 +1,5 @@ -|<+0#4040ff13#ffffff0@2|e+0#0000000#ffd7ff255|r|t| |b|e|l|o|w| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@45 +|<+0#4040ff13#ffffff0@2|e+0#0000001#ffd7ff255|r|t| |b|e|l|o|w| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@45 >"| |l|i|n|e| |1|0| @50 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_15.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_15.dump index 4110a1916e..53ea043883 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_15.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_15.dump @@ -1,4 +1,4 @@ -|<+0#4040ff13#ffffff0@2| +0#0000000&@2|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@39 +|<+0#4040ff13#ffffff0@2| +0#0000000&@2|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@39 >"| |l|i|n|e| |1|0| @50 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_2.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_2.dump index 8e8569b7bf..1b9b95cb6e 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_2.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_2.dump @@ -1,8 +1,8 @@ |"+0&#ffffff0| |l|i|n|e| |2| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| +0#0000000#ffffff0@47 |"| |l|i|n|e| |3| @51 >"| |l|i|n|e| |4| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |5| @51 @42|4|,|1| @10|1|6|%| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_3.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_3.dump index f4e9d92726..bd8d212d14 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_3.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_3.dump @@ -1,8 +1,8 @@ -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| +0#0000000#ffffff0@47 |"| |l|i|n|e| |3| @51 >"| |l|i|n|e| |4| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |5| @51 |"| |l|i|n|e| |6| @51 @42|4|,|1| @10|3@1|%| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_4.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_4.dump index 3ca1c6ee9e..43a31ab2a7 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_4.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_4.dump @@ -1,7 +1,7 @@ |<+0#4040ff13#ffffff0@2|i+0#0000000&|n|e| |3| @51 >"| |l|i|n|e| |4| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |5| @51 |"| |l|i|n|e| |6| @51 |@+0#4040ff13&@2| @56 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_5.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_5.dump index 3b28dbb6f2..8eb2a505d1 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_5.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_5.dump @@ -1,8 +1,8 @@ |"+0&#ffffff0| |l|i|n|e| |4| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |5| @51 >"| |l|i|n|e| |6| @51 |"| |l|i|n|e| |7| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 @42|6|,|1| @10|5|0|%| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_6.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_6.dump index 768109093d..0969ff980c 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_6.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_6.dump @@ -1,8 +1,8 @@ -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |a|b|o|v|e| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |5| @51 >"| |l|i|n|e| |6| @51 |"| |l|i|n|e| |7| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 |"| |l|i|n|e| |8| @51 @42|6|,|1| @10|6@1|%| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_7.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_7.dump index bf9c0f9128..f300d47add 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_7.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_7.dump @@ -1,8 +1,8 @@ -|<+0#4040ff13#ffffff0@2|e+0#0000000#ffd7ff255|r|t| |a|b|o|v|e| |2| +0&#ffffff0@45 +|<+0#4040ff13#ffffff0@2|e+0#0000001#ffd7ff255|r|t| |a|b|o|v|e| |2| +0#0000000#ffffff0@45 |"| |l|i|n|e| |5| @51 >"| |l|i|n|e| |6| @51 |"| |l|i|n|e| |7| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 |"| |l|i|n|e| |8| @51 |@+0#4040ff13&@2| @56 | +0#0000000&@41|6|,|1| @10|6@1|%| diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_8.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_8.dump index 06d9e09a27..7438999d9b 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_8.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_8.dump @@ -1,7 +1,7 @@ |<+0#4040ff13#ffffff0@2|i+0#0000000&|n|e| |5| @51 >"| |l|i|n|e| |6| @51 |"| |l|i|n|e| |7| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 |"| |l|i|n|e| |8| @51 |"| |l|i|n|e| |9| @51 |@+0#4040ff13&@2| @56 diff --git a/src/testdir/dumps/Test_prop_above_below_smoothscroll_9.dump b/src/testdir/dumps/Test_prop_above_below_smoothscroll_9.dump index cac3b28949..d84cf87b4e 100644 --- a/src/testdir/dumps/Test_prop_above_below_smoothscroll_9.dump +++ b/src/testdir/dumps/Test_prop_above_below_smoothscroll_9.dump @@ -1,8 +1,8 @@ |"+0&#ffffff0| |l|i|n|e| |6| @51 |"| |l|i|n|e| |7| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0&#ffffff0@47 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| +0#0000000#ffffff0@47 >"| |l|i|n|e| |8| @51 |"| |l|i|n|e| |9| @51 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0&#ffffff0@45 -|i+0&#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0&#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |1| +0#0000000#ffffff0@45 +|i+0#0000001#ffd7ff255|n|s|e|r|t| |b|e|l|o|w| |2| +0#0000000#ffffff0@45 @42|8|,|1| @10|8|3|%| diff --git a/src/testdir/dumps/Test_prop_above_number_1.dump b/src/testdir/dumps/Test_prop_above_number_1.dump index d986a46209..5efbe8e5f2 100644 --- a/src/testdir/dumps/Test_prop_above_number_1.dump +++ b/src/testdir/dumps/Test_prop_above_number_1.dump @@ -1,5 +1,5 @@ | +0#af5f00255#ffffff0@1|1| >o+0#0000000&|n|e| |o|n|e| |o|n|e| @59 -| +0#af5f00255&@3|a+0#0000000#ffd7ff255|b|o|v|e| |t|h|e| |t|e|x|t| +0&#ffffff0@56 +| +0#af5f00255&@3|a+0#0000001#ffd7ff255|b|o|v|e| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@56 | +0#af5f00255&@1|2| |t+0#0000000&|w|o| |t|w|o| |t|w|o| @59 | +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| |t|h|r|e@1| |t|h|r|e@1| @53 |~+0#4040ff13&| @73 diff --git a/src/testdir/dumps/Test_prop_above_number_2.dump b/src/testdir/dumps/Test_prop_above_number_2.dump index e1e5ba59e4..5f1f830e24 100644 --- a/src/testdir/dumps/Test_prop_above_number_2.dump +++ b/src/testdir/dumps/Test_prop_above_number_2.dump @@ -1,6 +1,6 @@ | +0#af5f00255#ffffff0@1|1| >o+0#0000000&|n|e| |o|n|e| |o|n|e| @59 -| +0#af5f00255&@3|a+0#0000000#ffd7ff255|b|o|v|e| |t|h|e| |t|e|x|t| +0&#ffffff0@56 -| +0#af5f00255&@3|a+0#0000000#ffd7ff255|l|s|o| |a|b|o|v|e| |t|h|e| |t|e|x|t| +0&#ffffff0@51 +| +0#af5f00255&@3|a+0#0000001#ffd7ff255|b|o|v|e| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@56 +| +0#af5f00255&@3|a+0#0000001#ffd7ff255|l|s|o| |a|b|o|v|e| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@51 | +0#af5f00255&@1|2| |t+0#0000000&|w|o| |t|w|o| |t|w|o| @59 | +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| |t|h|r|e@1| |t|h|r|e@1| @53 |~+0#4040ff13&| @73 diff --git a/src/testdir/dumps/Test_prop_above_number_3.dump b/src/testdir/dumps/Test_prop_above_number_3.dump index 56ce6620ab..f19c2dcb0c 100644 --- a/src/testdir/dumps/Test_prop_above_number_3.dump +++ b/src/testdir/dumps/Test_prop_above_number_3.dump @@ -1,6 +1,6 @@ | +0#af5f00255#ffffff0@1|1| |o+0#0000000&|n|e| |o|n|e| |o|n|e| @59 -| +0#af5f00255&@3|a+0#0000000#ffd7ff255|b|o|v|e| |t|h|e| |t|e|x|t| +0&#ffffff0@56 -| +0#af5f00255&@3|a+0#0000000#ffd7ff255|l|s|o| |a|b|o|v|e| |t|h|e| |t|e|x|t| +0&#ffffff0@47> @3 +| +0#af5f00255&@3|a+0#0000001#ffd7ff255|b|o|v|e| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@56 +| +0#af5f00255&@3|a+0#0000001#ffd7ff255|l|s|o| |a|b|o|v|e| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@47> @3 | +8#af5f00255&@1|2| |t+0#0000000&|w|o| |t|w|o| |t|w|o| @59 | +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| |t|h|r|e@1| |t|h|r|e@1| @53 |~+0#4040ff13&| @73 diff --git a/src/testdir/dumps/Test_prop_at_same_pos.dump b/src/testdir/dumps/Test_prop_at_same_pos.dump index 95f01faffe..a5ec76589b 100644 --- a/src/testdir/dumps/Test_prop_at_same_pos.dump +++ b/src/testdir/dumps/Test_prop_at_same_pos.dump @@ -1,4 +1,4 @@ ->f+0&#ffffff0|u|n|c|t|i|o|n|(| |o+0#ffffff16#ff404010|n|e|:| |c+0#0000000#ffff4012|a|l@1|,+0&#ffffff0| |t+0#00e0e07&|w|o|:| |a+0#0000000#ffff4012|r|g|u|m|e|n|t|,+0&#ffffff0| |t+0&#ffd7ff255|h|r|e@1|:| |h+0&#ffff4012|e|r|e| +0&#ffffff0|)| @25 +>f+0&#ffffff0|u|n|c|t|i|o|n|(| |o+0#ffffff16#ff404010|n|e|:| |c+0#0000000#ffff4012|a|l@1|,+0&#ffffff0| |t+0#00e0e07&|w|o|:| |a+0#0000000#ffff4012|r|g|u|m|e|n|t|,+0&#ffffff0| |t+0#0000001#ffd7ff255|h|r|e@1|:| |h+0#0000000#ffff4012|e|r|e| +0&#ffffff0|)| @25 |~+0#4040ff13&| @73 |~| @73 |~| @73 diff --git a/src/testdir/dumps/Test_prop_below_after_empty_1.dump b/src/testdir/dumps/Test_prop_below_after_empty_1.dump index b6773df428..b49e1caa10 100644 --- a/src/testdir/dumps/Test_prop_below_after_empty_1.dump +++ b/src/testdir/dumps/Test_prop_below_after_empty_1.dump @@ -3,6 +3,6 @@ @1|T+0#ffffff16#e000002|h|e| |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#ffffff0@15 |t|h|r|e@1| @54 @60 -|T+0&#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0&#ffffff0@23 +|T+0#0000001#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0#0000000#ffffff0@23 |~+0#4040ff13&| @58 | +0#0000000&@41|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_below_after_empty_2.dump b/src/testdir/dumps/Test_prop_below_after_empty_2.dump index e4c9ad2ee1..8ab73594bd 100644 --- a/src/testdir/dumps/Test_prop_below_after_empty_2.dump +++ b/src/testdir/dumps/Test_prop_below_after_empty_2.dump @@ -3,6 +3,6 @@ | +0#af5f00255&@3| +0#0000000&|T+0#ffffff16#e000002|h|e| |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#ffffff0@11 | +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| @50 | +0#af5f00255&@1|4| | +0#0000000&@55 -| +0#af5f00255&@3|T+0#0000000#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0&#ffffff0@19 +| +0#af5f00255&@3|T+0#0000001#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0#0000000#ffffff0@19 |~+0#4040ff13&| @58 |:+0#0000000&|s|e|t| |n|u|m|b|e|r| @30|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_below_after_empty_3.dump b/src/testdir/dumps/Test_prop_below_after_empty_3.dump index 8658af0bf9..b5a9d90c03 100644 --- a/src/testdir/dumps/Test_prop_below_after_empty_3.dump +++ b/src/testdir/dumps/Test_prop_below_after_empty_3.dump @@ -3,6 +3,6 @@ | +0#af5f00255&@3| +0#0000000&|T+0#ffffff16#e000002|h|e| |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#ffffff0@11 | +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| @50 | +0#af5f00255&@1|4| | +0#0000000&@55 -| +0#af5f00255&@3|T+0#0000000#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0&#ffffff0@19 +| +0#af5f00255&@3|T+0#0000001#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0#0000000#ffffff0@19 |~+0#4040ff13&| @58 |:+0#0000000&|s|e|t| |n|o|w|r|a|p| @30|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_delete_updates_1.dump b/src/testdir/dumps/Test_prop_delete_updates_1.dump index 400824f586..0c6a7a62b5 100644 --- a/src/testdir/dumps/Test_prop_delete_updates_1.dump +++ b/src/testdir/dumps/Test_prop_delete_updates_1.dump @@ -1,6 +1,6 @@ |s+0&#ffffff0|o|m|e| |t|e|x|t| @50 -@3|T+0&#ffd7ff255|h|e| |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&#ffffff0@13 -@5|T+0&#ffd7ff255|h|e| |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&#ffffff0@11 +@3|T+0#0000001#ffd7ff255|h|e| |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#ffffff0@13 +@5|T+0#0000001#ffd7ff255|h|e| |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#ffffff0@11 |m|o|r|e| |t|e|x|t| @50 >t|h|e| |e|n|d| @52 |~+0#4040ff13&| @58 diff --git a/src/testdir/dumps/Test_prop_diff_mode_1.dump b/src/testdir/dumps/Test_prop_diff_mode_1.dump index 069c08d79c..4f2616d5af 100644 --- a/src/testdir/dumps/Test_prop_diff_mode_1.dump +++ b/src/testdir/dumps/Test_prop_diff_mode_1.dump @@ -1,10 +1,10 @@ ->0+0&#ffd7ff255@2| @26||+1&#ffffff0|<+0&#ffd7ff255|t|e|x|t|>|9+2&#ff404010|0+0&#ffd7ff255@2| @18 -|0@2| @26||+1&#ffffff0|0+0&#ffd7ff255@2|9+2&#ff404010|<+0&#ffd7ff255|t|e|x|t|>| @18 -|0@2| @26||+1&#ffffff0|0+0&#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@18|<|t|e|x|t|> -|0@2| @26||+1&#ffffff0|<+0&#ffd7ff255|t|e|x|t|>| @22 -|0@2| @26||+1&#ffffff0|9+2&#ff404010|0+0&#ffd7ff255@2| @24 -|~+0#4040ff13#ffffff0| @28||+1#0000000&|0+0&#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@24 -|~+0#4040ff13#ffffff0| @28||+1#0000000&|<+0&#ffd7ff255|t|e|x|t|>| @22 +>0+0#0000001#ffd7ff255@2| @26||+1#0000000#ffffff0|<+0#0000001#ffd7ff255|t|e|x|t|>|9+2&#ff404010|0+0&#ffd7ff255@2| @18 +|0@2| @26||+1#0000000#ffffff0|0+0#0000001#ffd7ff255@2|9+2&#ff404010|<+0&#ffd7ff255|t|e|x|t|>| @18 +|0@2| @26||+1#0000000#ffffff0|0+0#0000001#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@18|<|t|e|x|t|> +|0@2| @26||+1#0000000#ffffff0|<+0#0000001#ffd7ff255|t|e|x|t|>| @22 +|0@2| @26||+1#0000000#ffffff0|9+2#0000001#ff404010|0+0&#ffd7ff255@2| @24 +|~+0#4040ff13#ffffff0| @28||+1#0000000&|0+0#0000001#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@24 +|~+0#4040ff13#ffffff0| @28||+1#0000000&|<+0#0000001#ffd7ff255|t|e|x|t|>| @22 |~+0#4040ff13#ffffff0| @28||+1#0000000&|~+0#4040ff13&| @27 |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @1|1|,|1| @8|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @1|1|,|1|-|7| @5|A|l@1 | +0&&@59 diff --git a/src/testdir/dumps/Test_prop_diff_mode_2.dump b/src/testdir/dumps/Test_prop_diff_mode_2.dump index 453665d998..0a88b7e9ea 100644 --- a/src/testdir/dumps/Test_prop_diff_mode_2.dump +++ b/src/testdir/dumps/Test_prop_diff_mode_2.dump @@ -1,10 +1,10 @@ -| +0#af5f00255#ffffff0@1|1| |0+0#0000000#ffd7ff255@2| @22||+1&#ffffff0| +0#af5f00255&@1|1| |<+0#0000000#ffd7ff255|t|e|x|t|>>9+2&#ff404010|0+0&#ffd7ff255@2| @14 -| +0#af5f00255#ffffff0@1|2| |0+0#0000000#ffd7ff255@2| @22||+1&#ffffff0| +0#af5f00255&@1|2| |0+0#0000000#ffd7ff255@2|9+2&#ff404010|<+0&#ffd7ff255|t|e|x|t|>| @14 -| +0#af5f00255#ffffff0@1|3| |0+0#0000000#ffd7ff255@2| @22||+1&#ffffff0| +0#af5f00255&@1|3| |0+0#0000000#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@14|<|t|e|x|t|> -| +0#af5f00255#ffffff0@1|4| |0+0#0000000#ffd7ff255@2| @22||+1&#ffffff0| +0#af5f00255&@3|<+0#0000000#ffd7ff255|t|e|x|t|>| @18 -| +0#af5f00255#ffffff0@1|5| |0+0#0000000#ffd7ff255@2| @22||+1&#ffffff0| +0#af5f00255&@1|4| |9+2#0000000#ff404010|0+0&#ffd7ff255@2| @20 -|~+0#4040ff13#ffffff0| @28||+1#0000000&| +0#af5f00255&@1|5| |0+0#0000000#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@20 -|~+0#4040ff13#ffffff0| @28||+1#0000000&| +0#af5f00255&@3|<+0#0000000#ffd7ff255|t|e|x|t|>| @18 +| +0#af5f00255#ffffff0@1|1| |0+0#0000001#ffd7ff255@2| @22||+1#0000000#ffffff0| +0#af5f00255&@1|1| |<+0#0000001#ffd7ff255|t|e|x|t|>>9+2&#ff404010|0+0&#ffd7ff255@2| @14 +| +0#af5f00255#ffffff0@1|2| |0+0#0000001#ffd7ff255@2| @22||+1#0000000#ffffff0| +0#af5f00255&@1|2| |0+0#0000001#ffd7ff255@2|9+2&#ff404010|<+0&#ffd7ff255|t|e|x|t|>| @14 +| +0#af5f00255#ffffff0@1|3| |0+0#0000001#ffd7ff255@2| @22||+1#0000000#ffffff0| +0#af5f00255&@1|3| |0+0#0000001#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@14|<|t|e|x|t|> +| +0#af5f00255#ffffff0@1|4| |0+0#0000001#ffd7ff255@2| @22||+1#0000000#ffffff0| +0#af5f00255&@3|<+0#0000001#ffd7ff255|t|e|x|t|>| @18 +| +0#af5f00255#ffffff0@1|5| |0+0#0000001#ffd7ff255@2| @22||+1#0000000#ffffff0| +0#af5f00255&@1|4| |9+2#0000001#ff404010|0+0&#ffd7ff255@2| @20 +|~+0#4040ff13#ffffff0| @28||+1#0000000&| +0#af5f00255&@1|5| |0+0#0000001#ffd7ff255@2|9+2&#ff404010| +0&#ffd7ff255@20 +|~+0#4040ff13#ffffff0| @28||+1#0000000&| +0#af5f00255&@3|<+0#0000001#ffd7ff255|t|e|x|t|>| @18 |~+0#4040ff13#ffffff0| @28||+1#0000000&|~+0#4040ff13&| @27 |[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @1|1|,|1| @8|A|l@1| +3&&|[|N|o| |N|a|m|e|]| |[|+|]| @1|1|,|1|-|7| @5|A|l@1 |:+0&&|w|i|n|d|o| |s|e|t| |n|u|m|b|e|r| @42 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_1.dump b/src/testdir/dumps/Test_prop_insert_start_incl_1.dump index de1f3d4797..d08b7a329e 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_1.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_1.dump @@ -1,6 +1,6 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| >o+0#0000000&|n|e| |t|e|x|t| |b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @29 @60 -|f|u|n|c|t|i|o|n|(|a+0&#ffd7ff255|r|g|:| |a+0&#ffffff0|r|g|)| @41 +|f|u|n|c|t|i|o|n|(|a+0#0000001#ffd7ff255|r|g|:| |a+0#0000000#ffffff0|r|g|)| @41 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_2.dump b/src/testdir/dumps/Test_prop_insert_start_incl_2.dump index f0c9ac0768..f5f9c70337 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_2.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_2.dump @@ -1,6 +1,6 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| >o+0#0000000&|n|e| |t|e|x|t| |b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @29 @60 -|f|u|n|c|t|i|o|n|(|a+0&#ffd7ff255|r|g|:| |a+0&#ffffff0|r|g|)| @41 +|f|u|n|c|t|i|o|n|(|a+0#0000001#ffd7ff255|r|g|:| |a+0#0000000#ffffff0|r|g|)| @41 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_3.dump b/src/testdir/dumps/Test_prop_insert_start_incl_3.dump index 5a8578b49b..ae70cd413c 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_3.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_3.dump @@ -1,6 +1,6 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| |x+0#0000000&>x|o|n|e| |t|e|x|t| |b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @27 @60 -|f|u|n|c|t|i|o|n|(|a+0&#ffd7ff255|r|g|:| |a+0&#ffffff0|r|g|)| @41 +|f|u|n|c|t|i|o|n|(|a+0#0000001#ffd7ff255|r|g|:| |a+0#0000000#ffffff0|r|g|)| @41 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_4.dump b/src/testdir/dumps/Test_prop_insert_start_incl_4.dump index bf67a1e08c..72756b0a90 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_4.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_4.dump @@ -1,6 +1,6 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| |x+0#0000000&@1|o|n|e| |t|e|x|t| >b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @27 @60 -|f|u|n|c|t|i|o|n|(|a+0&#ffd7ff255|r|g|:| |a+0&#ffffff0|r|g|)| @41 +|f|u|n|c|t|i|o|n|(|a+0#0000001#ffd7ff255|r|g|:| |a+0#0000000#ffffff0|r|g|)| @41 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_5.dump b/src/testdir/dumps/Test_prop_insert_start_incl_5.dump index 270c8a085c..18ab4c33a0 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_5.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_5.dump @@ -1,6 +1,6 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| |x+0#0000000&@1|o|n|e| |t|e|x|t| |y>y|b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @25 @60 -|f|u|n|c|t|i|o|n|(|a+0&#ffd7ff255|r|g|:| |a+0&#ffffff0|r|g|)| @41 +|f|u|n|c|t|i|o|n|(|a+0#0000001#ffd7ff255|r|g|:| |a+0#0000000#ffffff0|r|g|)| @41 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_6.dump b/src/testdir/dumps/Test_prop_insert_start_incl_6.dump index 96156a81ef..7881682e2a 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_6.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_6.dump @@ -1,7 +1,7 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| |x+0#0000000&@1|o|n|e| |t|e|x|t| |y@1|b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @25 @60 |f|u|n|c|t|i|o|n|(| @50 -@7> |a+0&#ffd7ff255|r|g|:| |a+0&#ffffff0|r|g|)| @42 +@7> |a+0#0000001#ffd7ff255|r|g|:| |a+0#0000000#ffffff0|r|g|)| @42 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_7.dump b/src/testdir/dumps/Test_prop_insert_start_incl_7.dump index 43545a8a5f..ace033c6be 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_7.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_7.dump @@ -1,7 +1,7 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| |x+0#0000000&@1|o|n|e| |t|e|x|t| |y@1|b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @25 @60 |f|u|n|c|t|i|o|n|(| @50 -@12|a+0&#ffd7ff255|r|g|:| >a+0&#ffffff0|r|g|)| @38 +@12|a+0#0000001#ffd7ff255|r|g|:| >a+0#0000000#ffffff0|r|g|)| @38 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_insert_start_incl_8.dump b/src/testdir/dumps/Test_prop_insert_start_incl_8.dump index 9d46839a84..fbdf7abe06 100644 --- a/src/testdir/dumps/Test_prop_insert_start_incl_8.dump +++ b/src/testdir/dumps/Test_prop_insert_start_incl_8.dump @@ -1,7 +1,7 @@ |t+0&#ffffff0|e|x|t| |a+0#4040ff13&|f|t|e|r| |x+0#0000000&@1|o|n|e| |t|e|x|t| |y@1|b+0#4040ff13&|e|f|o|r|e| |t+0#0000000&|w|o| @25 @60 |f|u|n|c|t|i|o|n|(| @50 -@4|a+0&#ffd7ff255|r|g|:| >a+0&#ffffff0|r|g|)| @46 +@4|a+0#0000001#ffd7ff255|r|g|:| >a+0#0000000#ffffff0|r|g|)| @46 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_inserts_text_1.dump b/src/testdir/dumps/Test_prop_inserts_text_1.dump index 7a51c12569..84e1adc79d 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_1.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_1.dump @@ -1,5 +1,5 @@ |i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| |s|o -|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n>g| @27 +|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0#0000001#5fd7ff255|O|R|E| |w+0#0000000#ffffff0|r|a|p@1|i|n>g| @27 |p|r|e|s+0#0000001#a8a8a8255|ö|m|e|和*&|平|t+&|é|x|t|p+0#0000000#ffffff0|o|s|t| @40 |F|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @34 |e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@49 diff --git a/src/testdir/dumps/Test_prop_inserts_text_2.dump b/src/testdir/dumps/Test_prop_inserts_text_2.dump index aa3fc6f285..0f04dd7563 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_2.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_2.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n>g| @23 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0#0000001#5fd7ff255|O|R|E| |w+0#0000000#ffffff0|r|a|p@1|i|n>g| @23 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0#0000001#a8a8a8255|ö|m|e|和*&|平|t+&|é|x|t|p+0#0000000#ffffff0|o|s|t| @38 | +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32 | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_inserts_text_3.dump b/src/testdir/dumps/Test_prop_inserts_text_3.dump index 2866105f2e..75d5de960f 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_3.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_3.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0#0000001#5fd7ff255|O|R|E| |w+0#0000000#ffffff0|r|a|p@1|i|n|g| @23 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0#0000001#a8a8a8255|ö|m|e|和*&|平|t+&|é|x|t|p+0#0000000#ffffff0|o|s>t| @38 | +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32 | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_inserts_text_4.dump b/src/testdir/dumps/Test_prop_inserts_text_4.dump index d42bc833ec..aa9e5b88ed 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_4.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_4.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0#0000001#5fd7ff255|O|R|E| |w+0#0000000#ffffff0|r|a|p@1|i|n|g| @23 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0#0000001#a8a8a8255|ö|m|e|和*&|平|t+&|é|x|t|p+0#0000000#ffffff0|o|s|t| @38 | +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=>1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32 | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_inserts_text_5.dump b/src/testdir/dumps/Test_prop_inserts_text_5.dump index bf2203d58d..99a356f79c 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_5.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_5.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0#0000001#5fd7ff255|O|R|E| |w+0#0000000#ffffff0|r|a|p@1|i|n|g| @23 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0#0000001#a8a8a8255|ö|m|e|和*&|平|t+&|é|x|t|p+0#0000000#ffffff0|o|s|t| @38 | +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=>2+0#0000000&| |}|;| @32 | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_inserts_text_6.dump b/src/testdir/dumps/Test_prop_inserts_text_6.dump index 9b4bfa1cfc..f3f70e99b5 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_6.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_6.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0#0000001#5fd7ff255|O|R|E| |w+0#0000000#ffffff0|r|a|p@1|i|n|g| @23 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0#0000001#a8a8a8255|ö|m|e|和*&|平|t+&|é|x|t|p+0#0000000#ffffff0|o|s|t| @38 | +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32 | +0#0000e05#a8a8a8255@1>e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_1.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_1.dump index 863ded3a4c..5c70cb784d 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_hi_1.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_hi_1.dump @@ -1,4 +1,4 @@ ->i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000000#5fd7ff255|h+0&#ffffff0|e|r|e|)| |a|n|d| |t|h|e|r|e| @20 +>i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000001#5fd7ff255|h+0#0000000#ffffff0|e|r|e|)| |a|n|d| |t|h|e|r|e| @20 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_2.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_2.dump index 1d9d11a264..61a09a346d 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_hi_2.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_hi_2.dump @@ -1,4 +1,4 @@ -|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000000#5fd7ff255|h+0&#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @20 +|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000001#5fd7ff255|h+0#0000000#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @20 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_4.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_4.dump index a5592acfeb..cbdf0071c7 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_hi_4.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_hi_4.dump @@ -1,4 +1,4 @@ -|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t|e|x|t| |(+0fd7ff255|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffffff0|e|r|e|)| |a|n|d| |t|h|e|r|e| @21 +|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t|e|x|t| |(+0#0000001#5fd7ff255|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffffff0|e|r|e|)| |a|n|d| |t|h|e|r|e| @21 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_5.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_5.dump index 0002aa844e..2569bdf3f8 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_hi_5.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_hi_5.dump @@ -1,4 +1,4 @@ -|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |(+0fd7ff255|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @21 +|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |(+0#0000001#5fd7ff255|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @21 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_right_align_twice_1.dump b/src/testdir/dumps/Test_prop_right_align_twice_1.dump index f3f1afca74..a9b9955991 100644 --- a/src/testdir/dumps/Test_prop_right_align_twice_1.dump +++ b/src/testdir/dumps/Test_prop_right_align_twice_1.dump @@ -1,4 +1,4 @@ -|s+0&#ffffff0|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0&#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0&#ffffff0@12|S+0#ffffff16#e000002|o|m|e| |e|r@1|o|r +|s+0&#ffffff0|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0#0000001#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0#0000000#ffffff0@12|S+0#ffffff16#e000002|o|m|e| |e|r@1|o|r | +0#0000000#ffffff0@61|A+0#ffffff16#e000002|n|o|t|h|e|r| |e|r@1|o|r |l+0#0000000#ffffff0|i|n|e| |t|w>o| @66 |~+0#4040ff13&| @73 diff --git a/src/testdir/dumps/Test_prop_right_align_twice_2.dump b/src/testdir/dumps/Test_prop_right_align_twice_2.dump index c4cd617f08..03c6fc9167 100644 --- a/src/testdir/dumps/Test_prop_right_align_twice_2.dump +++ b/src/testdir/dumps/Test_prop_right_align_twice_2.dump @@ -1,4 +1,4 @@ -|s+0&#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t|s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0&#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0&#ffffff0@8 +|s+0&#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t|s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0#0000001#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0#0000000#ffffff0@8 @65|S+0#ffffff16#e000002|o|m|e| |e|r@1|o|r | +0#0000000#ffffff0@61|A+0#ffffff16#e000002|n|o|t|h|e|r| |e|r@1|o|r |l+0#0000000#ffffff0|i|n|e| |t|w>o| @66 diff --git a/src/testdir/dumps/Test_prop_right_align_twice_3.dump b/src/testdir/dumps/Test_prop_right_align_twice_3.dump index 23839bc58a..d76b8b5445 100644 --- a/src/testdir/dumps/Test_prop_right_align_twice_3.dump +++ b/src/testdir/dumps/Test_prop_right_align_twice_3.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t|s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0&#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0&#ffffff0@6 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t|s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0#0000001#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0#0000000#ffffff0@6 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@62|S+0#ffffff16#e000002|o|m|e| |e|r@1|o|r | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@59|A+0#ffffff16#e000002|n|o|t|h|e|r| |e|r@1|o|r | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |t|w>o| @64 diff --git a/src/testdir/dumps/Test_prop_sign_tab_1.dump b/src/testdir/dumps/Test_prop_sign_tab_1.dump index 4d033ce4db..f0af56b82f 100644 --- a/src/testdir/dumps/Test_prop_sign_tab_1.dump +++ b/src/testdir/dumps/Test_prop_sign_tab_1.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1>o+0#0000000#ffff4012|n|e| +0&#ffffff0@54 -|>@1| +0&#ffff4012@7|t|a|b| +0fd7ff255@46 -|>+0&#ffffff0@1| +0&#ffff4012@7|s|p|a|c|e| +0fd7ff255@44 -|X+3&#ffffff0|b|u|f@1|e|r| |[|+|]| @30|1|,|1| @11|T|o|p +|>@1| +0#0000001#ffff4012@7|t|a|b| +0fd7ff255@46 +|>+0#0000000#ffffff0@1| +0#0000001#ffff4012@7|s|p|a|c|e| +0fd7ff255@44 +|X+3#0000000#ffffff0|b|u|f@1|e|r| |[|+|]| @30|1|,|1| @11|T|o|p | +0&&@59 |~+0#4040ff13&| @58 |[+1#0000000&|N|o| |N|a|m|e|]| @32|0|,|0|-|1| @9|A|l@1 diff --git a/src/testdir/dumps/Test_prop_sign_tab_2.dump b/src/testdir/dumps/Test_prop_sign_tab_2.dump index d567a5d756..048ab63e02 100644 --- a/src/testdir/dumps/Test_prop_sign_tab_2.dump +++ b/src/testdir/dumps/Test_prop_sign_tab_2.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1>o+0#0000000#ffff4012|n|e|¶+0#4040ff13#ffffff0| +0#0000000&@53 -|>@1|>+0#0000e05#5fd7ff255|-@6|t+0#0000000#ffff4012|a|b|¶+0#4040ff13#5fd7ff255| +0#0000000&@45 -|>+0&#ffffff0@1| +0&#ffff4012@7|s|p|a|c|e|¶+0#4040ff13#5fd7ff255| +0#0000000&@43 -|X+3&#ffffff0|b|u|f@1|e|r| |[|+|]| @30|1|,|1| @11|T|o|p +|>@1|>+0#0000e05#5fd7ff255|-@6|t+0#0000001#ffff4012|a|b|¶+0#4040ff13#5fd7ff255| +0#0000001&@45 +|>+0#0000000#ffffff0@1| +0#0000001#ffff4012@7|s|p|a|c|e|¶+0#4040ff13#5fd7ff255| +0#0000001&@43 +|X+3#0000000#ffffff0|b|u|f@1|e|r| |[|+|]| @30|1|,|1| @11|T|o|p | +0&&@59 |~+0#4040ff13&| @58 |[+1#0000000&|N|o| |N|a|m|e|]| @32|0|,|0|-|1| @9|A|l@1 diff --git a/src/testdir/dumps/Test_prop_text_change_arg_1.dump b/src/testdir/dumps/Test_prop_text_change_arg_1.dump index 174af07861..932333fb45 100644 --- a/src/testdir/dumps/Test_prop_text_change_arg_1.dump +++ b/src/testdir/dumps/Test_prop_text_change_arg_1.dump @@ -1,4 +1,4 @@ ->S+0&#ffffff0|e|t|E|r@1|o|r|C|o|d|e|(| |i+0&#ffd7ff255|d|:|-+0#4040ff13#ffffff0|1+0#0000000&|0|,| |i+0&#ffd7ff255|d|:|-+0#4040ff13#ffffff0|2+0#0000000&|0| |)| @29 +>S+0&#ffffff0|e|t|E|r@1|o|r|C|o|d|e|(| |i+0#0000001#ffd7ff255|d|:|-+0#4040ff13#ffffff0|1+0#0000000&|0|,| |i+0#0000001#ffd7ff255|d|:|-+0#4040ff13#ffffff0|2+0#0000000&|0| |)| @29 |s|e|c|o|n|d| |l|i|n|e| @48 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_text_change_arg_2.dump b/src/testdir/dumps/Test_prop_text_change_arg_2.dump index 57e9a465d9..de80a68175 100644 --- a/src/testdir/dumps/Test_prop_text_change_arg_2.dump +++ b/src/testdir/dumps/Test_prop_text_change_arg_2.dump @@ -1,4 +1,4 @@ -|S+0&#ffffff0|e|t|E|r@1|o|r|C|o|d|e|(| |i+0&#ffd7ff255|d|:|-+0#4040ff13#ffffff0|1+0#0000000&|2|3>4|,| |i+0&#ffd7ff255|d|:|-+0#4040ff13#ffffff0|2+0#0000000&|0| |)| @27 +|S+0&#ffffff0|e|t|E|r@1|o|r|C|o|d|e|(| |i+0#0000001#ffd7ff255|d|:|-+0#4040ff13#ffffff0|1+0#0000000&|2|3>4|,| |i+0#0000001#ffd7ff255|d|:|-+0#4040ff13#ffffff0|2+0#0000000&|0| |)| @27 |s|e|c|o|n|d| |l|i|n|e| @48 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_text_with_padding_1.dump b/src/testdir/dumps/Test_prop_text_with_padding_1.dump index 1fde5e991b..992cffa41a 100644 --- a/src/testdir/dumps/Test_prop_text_with_padding_1.dump +++ b/src/testdir/dumps/Test_prop_text_with_padding_1.dump @@ -1,7 +1,7 @@ ->S+0&#ffffff0|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.| @2|a+0&#ffd7ff255|f|t|e|r| +0&#ffffff0@5|r+0&#ffd7ff255|i|g|h|t| |a|l|i|g|n|e|d -| +0&#ffffff0@3|b+0&#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0&#ffffff0@41 +>S+0&#ffffff0|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.| @2|a+0#0000001#ffd7ff255|f|t|e|r| +0#0000000#ffffff0@5|r+0#0000001#ffd7ff255|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000000#ffffff0@3|b+0#0000001#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0#0000000#ffffff0@41 |s|e|c|o|n|d| |l|i|n|e| @48 -|A|n|o|t|h|e|r| |l|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |t|o| |m|a|k|e| |t|h|e| |w|r|a|p|.| @5|r+0&#ffd7ff255|i|g|h|t|m|o|s|t +|A|n|o|t|h|e|r| |l|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |t|o| |m|a|k|e| |t|h|e| |w|r|a|p|.| @5|r+0#0000001#ffd7ff255|i|g|h|t|m|o|s|t |~+0#4040ff13#ffffff0| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_text_with_padding_2.dump b/src/testdir/dumps/Test_prop_text_with_padding_2.dump index abedaae6ad..0f326a0442 100644 --- a/src/testdir/dumps/Test_prop_text_with_padding_2.dump +++ b/src/testdir/dumps/Test_prop_text_with_padding_2.dump @@ -1,8 +1,8 @@ -|x+0&#ffffff0@9|S|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.| @2|a+0&#ffd7ff255|f|t|e|r| +0&#ffffff0@4|r+0&#ffd7ff255|i|g|… -| +0&#ffffff0@3|b+0&#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0&#ffffff0@41 +|x+0&#ffffff0@9|S|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.| @2|a+0#0000001#ffd7ff255|f|t|e|r| +0#0000000#ffffff0@4|r+0#0000001#ffd7ff255|i|g|… +| +0#0000000#ffffff0@3|b+0#0000001#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0#0000000#ffffff0@41 |s|e|c|o|n|d| |l|i|n|e| @48 >x|A|n|o|t|h|e|r| |l|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |t|o| |m|a|k|e| |t|h|e| |w|r|a|p|.| @13 -@51|r+0&#ffd7ff255|i|g|h|t|m|o|s|t +@51|r+0#0000001#ffd7ff255|i|g|h|t|m|o|s|t |~+0#4040ff13#ffffff0| @58 |~| @58 | +0#0000000&@41|3|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_text_with_padding_3.dump b/src/testdir/dumps/Test_prop_text_with_padding_3.dump index 2911162dc6..25d280ed97 100644 --- a/src/testdir/dumps/Test_prop_text_with_padding_3.dump +++ b/src/testdir/dumps/Test_prop_text_with_padding_3.dump @@ -1,8 +1,8 @@ ->x+0&#ffffff0@10|S|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.| @2|a+0&#ffd7ff255|f|t|e|r| +0&#ffffff0@7 -@47|r+0&#ffd7ff255|i|g|h|t| |a|l|i|g|n|e|d -| +0&#ffffff0@3|b+0&#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0&#ffffff0@41 +>x+0&#ffffff0@10|S|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.| @2|a+0#0000001#ffd7ff255|f|t|e|r| +0#0000000#ffffff0@7 +@47|r+0#0000001#ffd7ff255|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000000#ffffff0@3|b+0#0000001#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0#0000000#ffffff0@41 |s|e|c|o|n|d| |l|i|n|e| @48 |x|A|n|o|t|h|e|r| |l|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |t|o| |m|a|k|e| |t|h|e| |w|r|a|p|.| @13 -@51|r+0&#ffd7ff255|i|g|h|t|m|o|s|t +@51|r+0#0000001#ffd7ff255|i|g|h|t|m|o|s|t |~+0#4040ff13#ffffff0| @58 | +0#0000000&@41|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_text_with_padding_4.dump b/src/testdir/dumps/Test_prop_text_with_padding_4.dump index b0b01562da..8e19451816 100644 --- a/src/testdir/dumps/Test_prop_text_with_padding_4.dump +++ b/src/testdir/dumps/Test_prop_text_with_padding_4.dump @@ -1,8 +1,8 @@ ->x+0&#ffffff0@10|S|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.|$+0#4040ff13&| +0#0000000&@2|a+0&#ffd7ff255|f|t|e|r| +0&#ffffff0@6 -@47|r+0&#ffd7ff255|i|g|h|t| |a|l|i|g|n|e|d -| +0&#ffffff0@3|b+0&#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0&#ffffff0@41 +>x+0&#ffffff0@10|S|o|m|e| |t|e|x|t| |t|o| |a|d@1| |v|i|r|t|u|a|l| |t|e|x|t| |t|o|.|$+0#4040ff13&| +0#0000000&@2|a+0#0000001#ffd7ff255|f|t|e|r| +0#0000000#ffffff0@6 +@47|r+0#0000001#ffd7ff255|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000000#ffffff0@3|b+0#0000001#ffd7ff255|e|l|o|w| |t|h|e| |l|i|n|e| +0#0000000#ffffff0@41 |s|e|c|o|n|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@47 |x|A|n|o|t|h|e|r| |l|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |t|o| |m|a|k|e| |t|h|e| |w|r|a|p|.|$+0#4040ff13&| +0#0000000&@12 -@51|r+0&#ffd7ff255|i|g|h|t|m|o|s|t -| +0&#ffffff0@59 +@51|r+0#0000001#ffd7ff255|i|g|h|t|m|o|s|t +| +0#0000000#ffffff0@59 |:|s|e|t| |l|i|s|t| @32|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_wincolor_1.dump b/src/testdir/dumps/Test_prop_wincolor_1.dump index d8a6226359..01ee125d2c 100644 --- a/src/testdir/dumps/Test_prop_wincolor_1.dump +++ b/src/testdir/dumps/Test_prop_wincolor_1.dump @@ -1,4 +1,4 @@ ->s+0&#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @45 +>s+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @45 @3|B+0fd7ff255|E|L|O|W| +0&#ffd7ff255@51 |s|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r|e| @33 |m|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@37 diff --git a/src/testdir/dumps/Test_prop_wincolor_2.dump b/src/testdir/dumps/Test_prop_wincolor_2.dump index 6e5126c476..fbd0172c3d 100644 --- a/src/testdir/dumps/Test_prop_wincolor_2.dump +++ b/src/testdir/dumps/Test_prop_wincolor_2.dump @@ -1,4 +1,4 @@ ->s+8&#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @45 +>s+8#0000001#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @45 @3|B+8fd7ff255|E|L|O|W| +8&#ffd7ff255@51 |s+0&&|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r|e| @33 |m|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@37 diff --git a/src/testdir/dumps/Test_prop_wincolor_3.dump b/src/testdir/dumps/Test_prop_wincolor_3.dump index f77c27422e..fb920c2b5f 100644 --- a/src/testdir/dumps/Test_prop_wincolor_3.dump +++ b/src/testdir/dumps/Test_prop_wincolor_3.dump @@ -1,4 +1,4 @@ ->s+8&#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @14| +8&#ffd7d7255| +8&#ffd7ff255@29 +>s+8#0000001#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @14| +8&#ffd7d7255| +8&#ffd7ff255@29 @3|B+8fd7ff255|E|L|O|W| +8&#ffd7ff255@51 |s+0&&|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r|e| @2| +0&#ffd7d7255| +0&#ffd7ff255@29 |m|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@6| +0&#ffd7d7255| +0&#ffd7ff255@29 diff --git a/src/testdir/dumps/Test_prop_wincolor_4.dump b/src/testdir/dumps/Test_prop_wincolor_4.dump index 06d6b0f41d..505c82b9cf 100644 --- a/src/testdir/dumps/Test_prop_wincolor_4.dump +++ b/src/testdir/dumps/Test_prop_wincolor_4.dump @@ -1,4 +1,4 @@ ->s+8&#af5f00255|o|m|e| |t|e|x|t| |h|e|r|e| @14| +8&#ffd7d7255| +8&#af5f00255@29 +>s+8#0000001#af5f00255|o|m|e| |t|e|x|t| |h|e|r|e| @14| +8&#ffd7d7255| +8&#af5f00255@29 @3|B+8fd7ff255|E|L|O|W| +8&#af5f00255@51 |s+0&#ffd7ff255|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r|e| @2| +0&#ffd7d7255| +0&#ffd7ff255@29 |m|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@6| +0&#ffd7d7255| +0&#ffd7ff255@29 diff --git a/src/testdir/dumps/Test_prop_wincolor_5.dump b/src/testdir/dumps/Test_prop_wincolor_5.dump index 0c062b4452..2fc3e23a52 100644 --- a/src/testdir/dumps/Test_prop_wincolor_5.dump +++ b/src/testdir/dumps/Test_prop_wincolor_5.dump @@ -1,4 +1,4 @@ -|s+8&#af5f00255|o|m|e| |t|e|x|t| |h|e|r>e| @14| +8&#ffd7d7255| +8&#af5f00255@29 +|s+8#0000001#af5f00255|o|m|e| |t|e|x|t| |h|e|r>e| @14| +8&#ffd7d7255| +8&#af5f00255@29 @3|B+8fd7ff255|E|L|O|W| +8&#af5f00255@51 |s+0&#ffd7ff255|o|m|e| |m|u|c|h| |l|o|n|g+0&#e0e0e08|e+0&#ffd7ff255|r| |t|e|x|t| |h|e|r|e| @2| +0&#ffd7d7255| +0&#ffd7ff255@29 |m|o|r|e| |t|e|x|t| |h|e|r|e+0&#e0e0e08| +0&#ffd7ff255@2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@6| +0&#ffd7d7255| +0&#ffd7ff255@29 diff --git a/src/testdir/dumps/Test_prop_wincolor_6.dump b/src/testdir/dumps/Test_prop_wincolor_6.dump index e07b3e6f79..29afeca65e 100644 --- a/src/testdir/dumps/Test_prop_wincolor_6.dump +++ b/src/testdir/dumps/Test_prop_wincolor_6.dump @@ -1,4 +1,4 @@ -|s+0&#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @10| +0&#e0e0e08| +0&#ffd7ff255@2| +0&#ffd7d7255| +0&#ffd7ff255@29 +|s+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @10| +0&#e0e0e08| +0&#ffd7ff255@2| +0&#ffd7d7255| +0&#ffd7ff255@29 @3|B+0fd7ff255|E|L|O|W| +0&#ffd7ff255@51 |s+8&#af5f00255|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r>e| @2| +8&#ffd7d7255| +8&#af5f00255@29 |m+0&#ffd7ff255|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@2| +0&#e0e0e08| +0&#ffd7ff255@2| +0&#ffd7d7255| +0&#ffd7ff255@29 diff --git a/src/testdir/dumps/Test_prop_wincolor_7.dump b/src/testdir/dumps/Test_prop_wincolor_7.dump index 941281104a..2ec3113977 100644 --- a/src/testdir/dumps/Test_prop_wincolor_7.dump +++ b/src/testdir/dumps/Test_prop_wincolor_7.dump @@ -1,4 +1,4 @@ -|s+0&#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @11| +0&#e0e0e08| +0&#ffd7ff255@1| +0&#ffd7d7255| +0&#ffd7ff255@29 +|s+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| |h|e|r|e| @11| +0&#e0e0e08| +0&#ffd7ff255@1| +0&#ffd7d7255| +0&#ffd7ff255@29 @3|B+0fd7ff255|E|L|O|W| +0&#ffd7ff255@51 |s+8&#af5f00255|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r|e> @2| +8&#ffd7d7255| +8&#af5f00255@29 |m+0&#ffd7ff255|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@3| +0&#e0e0e08| +0&#ffd7ff255@1| +0&#ffd7d7255| +0&#ffd7ff255@29 diff --git a/src/testdir/dumps/Test_prop_wincolor_8.dump b/src/testdir/dumps/Test_prop_wincolor_8.dump index 9df69ec9e7..a5ee2e6620 100644 --- a/src/testdir/dumps/Test_prop_wincolor_8.dump +++ b/src/testdir/dumps/Test_prop_wincolor_8.dump @@ -1,4 +1,4 @@ -|s+8&#af5f00255|o|m|e| |t|e|x|t| |h|e|r|e| @11> @2| +8&#ffd7d7255| +8&#af5f00255@29 +|s+8#0000001#af5f00255|o|m|e| |t|e|x|t| |h|e|r|e| @11> @2| +8&#ffd7d7255| +8&#af5f00255@29 @3|B+8fd7ff255|E|L|O|W| +8&#af5f00255@51 |s+0&#ffd7ff255|o|m|e| |m|u|c|h| |l|o|n|g|e|r| |t|e|x|t| |h|e|r|e| +0&#e0e0e08| +0&#ffd7ff255@1| +0&#ffd7d7255| +0&#ffd7ff255@29 |m|o|r|e| |t|e|x|t| |h|e|r|e| @2|A+0&#ffff4012|F|T|E|R| +0&#ffd7ff255@3| +0&#e0e0e08| +0&#ffd7ff255@1| +0&#ffd7d7255| +0&#ffd7ff255@29 diff --git a/src/testdir/dumps/Test_prop_wincolor_9.dump b/src/testdir/dumps/Test_prop_wincolor_9.dump index 7b26974ac3..84a2b76d6b 100644 --- a/src/testdir/dumps/Test_prop_wincolor_9.dump +++ b/src/testdir/dumps/Test_prop_wincolor_9.dump @@ -1,4 +1,4 @@ -| +8&#af5f00255@29| +8&#ffd7d7255| +8&#af5f00255@1> @12|e|r|e|h| |t|x|e|t| |e|m|o|s +| +8#0000001#af5f00255@29| +8&#ffd7d7255| +8&#af5f00255@1> @12|e|r|e|h| |t|x|e|t| |e|m|o|s | @51|W+8fd7ff255|O|L|E|B| +8&#af5f00255@2 | +0&#ffd7ff255@29| +0&#ffd7d7255| +0&#ffd7ff255@1| +0&#e0e0e08|e+0&#ffd7ff255|r|e|h| |t|x|e|t| |r|e|g|n|o|l| |h|c|u|m| |e|m|o|s | @29| +0&#ffd7d7255| +0&#ffd7ff255@1| +0&#e0e0e08| +0&#ffd7ff255@3|R+0&#ffff4012|E|T|F|A| +0&#ffd7ff255@2|e|r|e|h| |t|x|e|t| |e|r|o|m diff --git a/src/testdir/dumps/Test_prop_with_text_above_1.dump b/src/testdir/dumps/Test_prop_with_text_above_1.dump index 1a478f17d1..54988d6a17 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_1.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_1.dump @@ -1,5 +1,5 @@ |f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@42 -|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@41 +|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@41 |o|n|e| |t|w|o| @52 |t|h|r>e@1| |f|o|u|r| @49 @3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@43 diff --git a/src/testdir/dumps/Test_prop_with_text_above_1a.dump b/src/testdir/dumps/Test_prop_with_text_above_1a.dump index 67d7a6ba01..30a84c605e 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_1a.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_1a.dump @@ -1,5 +1,5 @@ |f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@42 -|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@41 +|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@41 |o|n|e| |t|w>o| @52 |t|h|r|e@1| |f|o|u|r| @49 @3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@43 diff --git a/src/testdir/dumps/Test_prop_with_text_above_1b.dump b/src/testdir/dumps/Test_prop_with_text_above_1b.dump index 24fffb5d87..e290f18ffe 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_1b.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_1b.dump @@ -1,5 +1,5 @@ |f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@42 -|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@41 +|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@41 >o|n|e| |t|w|o| @52 |t|h|r|e@1| |f|o|u|r| @49 @3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@43 diff --git a/src/testdir/dumps/Test_prop_with_text_above_1c.dump b/src/testdir/dumps/Test_prop_with_text_above_1c.dump index bdf8811137..7f600da136 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_1c.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_1c.dump @@ -1,5 +1,5 @@ |f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@42 -|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@41 +|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@41 |o|n>e| |t|w|o| @52 |t|h|r|e@1| |f|o|u|r| @49 @3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@43 diff --git a/src/testdir/dumps/Test_prop_with_text_above_2.dump b/src/testdir/dumps/Test_prop_with_text_above_2.dump index 3df096750d..c8673d61d3 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_2.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_2.dump @@ -1,5 +1,5 @@ |f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@42 -|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@41 +|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@41 >o|n|e| |t|w|o| @52 |t|h|r|e@1| |f|o|u|r| @49 @3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@43 diff --git a/src/testdir/dumps/Test_prop_with_text_above_3.dump b/src/testdir/dumps/Test_prop_with_text_above_3.dump index f58a95b3bb..8a94e649b7 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_3.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_3.dump @@ -1,5 +1,5 @@ |f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@42 -|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@41 +|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@41 |i|n|s|e|r|t|e|d> |o|n|e| |t|w|o| @43 |t|h|r|e@1| |f|o|u|r| @49 @3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@43 diff --git a/src/testdir/dumps/Test_prop_with_text_above_4.dump b/src/testdir/dumps/Test_prop_with_text_above_4.dump index 06040a8d5a..1e94b54ee8 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_4.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_4.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@35 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000000&|n|s|e|r|t|e|d> |o|n|e| |t|w|o| @37 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u|r| @43 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37 diff --git a/src/testdir/dumps/Test_prop_with_text_above_5.dump b/src/testdir/dumps/Test_prop_with_text_above_5.dump index 8494bb12ef..003b8d2f2f 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_5.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_5.dump @@ -1,5 +1,5 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@35 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000000&|n|s|e|r|t|e|d| |o|n|e| |t|w|o| @37 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u>r| @43 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37 diff --git a/src/testdir/dumps/Test_prop_with_text_above_6.dump b/src/testdir/dumps/Test_prop_with_text_above_6.dump index 0aa04b5567..ae4b1b1c66 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_6.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_6.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@35 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000001#a8a8a8255|n|s|e|r|t|e>d+0#0000000#ffffff0| |o|n|e| |t|w|o| @37 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000000#5fd7ff255|e|l|o|w| +0&#ffffff0@48 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000001#5fd7ff255|e|l|o|w| +0#0000000#ffffff0@48 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u|r| @43 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |f+0#0000000&|i|v|e| |s|i|x| @45 diff --git a/src/testdir/dumps/Test_prop_with_text_above_7.dump b/src/testdir/dumps/Test_prop_with_text_above_7.dump index b675ed971b..3d8dd5e3c9 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_7.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_7.dump @@ -1,7 +1,7 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@35 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000001#a8a8a8255|n|s|e|r|t|e>d+0#0000000#ffffff0| +0#0000001#a8a8a8255|o|n|e| |t|w|o| +0#0000000#ffffff0@37 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000000#5fd7ff255|e|l|o|w| +0#4040ff13#ffffff0| +0#0000000&@47 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000001#5fd7ff255|e|l|o|w| +0#4040ff13#ffffff0| +0#0000000&@47 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u|r| @43 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |f+0#0000000&|i|v|e| |s|i|x| @45 diff --git a/src/testdir/dumps/Test_prop_with_text_above_8.dump b/src/testdir/dumps/Test_prop_with_text_above_8.dump index b807db56a7..cc6c131b86 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_8.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_8.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@35 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000000&|n|s|e|r|t|e|d| @45 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| >o+0#0000000&|n|e| |t|w|o| @46 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000000#5fd7ff255|e|l|o|w| +0&#ffffff0@48 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000001#5fd7ff255|e|l|o|w| +0#0000000#ffffff0@48 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |t+0#0000000&|h|r|e@1| |f|o|u|r| @43 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|4| |f+0#0000000&|i|v|e| |s|i|x| @45 diff --git a/src/testdir/dumps/Test_prop_with_text_above_9.dump b/src/testdir/dumps/Test_prop_with_text_above_9.dump index 727f859b43..902f16d30e 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_9.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_9.dump @@ -1,9 +1,9 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@35 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@1|0+0&#ffff4012| |1| |2| |3| |4| |5| |6| |7| |8| |9| |1|0| |1@1| |1|2| |1|3| |1|4| |1|5| |1|6| |1|7| |1|8| |1|9| |2|… | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000000&|n|s|e|r|t|e|d| @45 | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| >o+0#0000000&|n|e| |t|w|o| @46 -| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000000#5fd7ff255|e|l|o|w| +0&#ffffff0@48 +| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000001#5fd7ff255|e|l|o|w| +0#0000000#ffffff0@48 |~+0#4040ff13&| @58 |~| @58 |:+0#0000000&|c|a|l@1| |A|d@1|L|o|n|g|P|r|o|p|A|b|o|v|e|(|)| @17|2|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_with_text_after_1.dump b/src/testdir/dumps/Test_prop_with_text_after_1.dump index 159e394619..dc2c411ea5 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_1.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_1.dump @@ -1,6 +1,6 @@ | +0&#ffffff0@2|s|o|m|e| |t|e|x|t| |h|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |t|h|e|r|e| +0&#ffff4012|A|F|T|E|R| | +0&#ffffff0@7| +0#ffffff16#e000002|R|I|G|H|T| -| +0#0000000#5fd7ff255|B|E|L|O|W| | +0&#ffffff0@52 -| +0fd7ff255|A|L|S|O| |B|E|L|O|W| | +0&#ffffff0@47 +| +0#0000001#5fd7ff255|B|E|L|O|W| | +0#0000000#ffffff0@52 +| +0#0000001#5fd7ff255|A|L|S|O| |B|E|L|O|W| | +0#0000000#ffffff0@47 |L|a|s|t| |l|i|n|e>.| +0&#ffff4012|A|f|t|e|r| |L|a|s|t| | +0&#ffffff0@37 |r|i|g|h|t| |h|e|r|e| @37|s+0#ffffff16#e000002|ö|m|e|和*&|平|t+&|é|x|t |~+0#4040ff13#ffffff0| @58 diff --git a/src/testdir/dumps/Test_prop_with_text_after_below_trunc_1.dump b/src/testdir/dumps/Test_prop_with_text_after_below_trunc_1.dump index 8481c9c743..251b730b51 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_below_trunc_1.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_below_trunc_1.dump @@ -1,5 +1,5 @@ |o+0&#ffffff0|n|a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d| |f|a|s| |d|f|t+0#e000e06&|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| |o|… -| +0#0000000&@3|t+0&#ffd7ff255|h|e| |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&#ffffff0@12 +| +0#0000000&@3|t+0#0000001#ffd7ff255|h|e| |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#ffffff0@12 |t|w>o| @56 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_with_text_after_below_trunc_2.dump b/src/testdir/dumps/Test_prop_with_text_after_below_trunc_2.dump index afa1a3624f..752772b8af 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_below_trunc_2.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_below_trunc_2.dump @@ -1,5 +1,5 @@ | +0#af5f00255#ffffff0@1|1| |o+0#0000000&|n|a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d| |f|a|s| |d|f|t+0#e000e06&|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|… -| +0#af5f00255&@3| +0#0000000&@3|t+0&#ffd7ff255|h|e| |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&#ffffff0@8 +| +0#af5f00255&@3| +0#0000000&@3|t+0#0000001#ffd7ff255|h|e| |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#ffffff0@8 | +0#af5f00255&@1|2| |t+0#0000000&|w>o| @52 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_with_text_after_below_trunc_3.dump b/src/testdir/dumps/Test_prop_with_text_after_below_trunc_3.dump index 7b93c7f62a..a3626cbb2a 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_below_trunc_3.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_below_trunc_3.dump @@ -1,5 +1,5 @@ | +8#af5f00255#ffffff0@1|1| >o+8#0000000&|n|a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d| |f|a|s| |d|f|t+8#e000e06&|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|… -| +8#af5f00255&@3| +8#0000000&@3|t+8&#ffd7ff255|h|e| |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| +8&#ffffff0@8 +| +8#af5f00255&@3| +8#0000000&@3|t+8#0000001#ffd7ff255|h|e| |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| +8#0000000#ffffff0@8 | +0#af5f00255&@1|2| |t+0#0000000&|w|o| @52 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump index 610f14f786..b07bf5e707 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump @@ -1,4 +1,4 @@ -|o+0&#ffffff0|n|e| +0&#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0&#ffffff0@31|r+0&#ffd7ff255|i|g|h|t| |h|e|r|e +|o+0&#ffffff0|n|e| +0#0000001#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@31|r+0#0000001#ffd7ff255|i|g|h|t| |h|e|r|e | +0#ffffff16#e000002|B|e|l|o|w| |t|h|e| |l|i|n|e| | +0#0000000#ffffff0@43 |t|w|o| @56 |a+0&#ffff4012|n|o|t|h|e|r| +0&#ffffff0@52 diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump index 1d5c534834..de4d380608 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@4|o+0#0000000#ffffff0|n|e| +0&#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0&#ffffff0@26|r+0&#ffd7ff255|i|g|h|t| |h|e|r|e +| +0#0000e05#a8a8a8255@4|o+0#0000000#ffffff0|n|e| +0#0000001#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@26|r+0#0000001#ffd7ff255|i|g|h|t| |h|e|r|e | +0#0000e05#a8a8a8255@4| +0#ffffff16#e000002|B|e|l|o|w| |t|h|e| |l|i|n|e| | +0#0000000#ffffff0@38 | +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|w|o| @51 | +0#0000e05#a8a8a8255@4|a+0#0000000#ffff4012|n|o|t|h|e|r| +0&#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump index ca849123a5..ed41327540 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump @@ -1,4 +1,4 @@ -| +0#0000e05#a8a8a8255@4|o+0#0000000#ffffff0|n|e| +0&#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0&#ffffff0@26|r+0&#ffd7ff255|i|g|h|t| |h|e|r|e +| +0#0000e05#a8a8a8255@4|o+0#0000000#ffffff0|n|e| +0#0000001#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0#0000000#ffffff0@26|r+0#0000001#ffd7ff255|i|g|h|t| |h|e|r|e | +0#0000e05#a8a8a8255@4| +0#ffffff16#e000002|B|e|l|o|w| |t|h|e| |l|i|n|e| | +0#0000000#ffffff0@38 | +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|w|o| @51 | +0#0000e05#a8a8a8255@4|a+0#0000000#ffff4012|n|o|t|h|e|r| +0&#ffffff0@47 diff --git a/src/testdir/dumps/Test_prop_with_text_below_cul_1.dump b/src/testdir/dumps/Test_prop_with_text_below_cul_1.dump index 0bfd304a42..59302f9fde 100644 --- a/src/testdir/dumps/Test_prop_with_text_below_cul_1.dump +++ b/src/testdir/dumps/Test_prop_with_text_below_cul_1.dump @@ -1,5 +1,5 @@ >s+8&#ffffff0|o|m|e| |t|e|x|t| @50 -@4|T+8&#ffd7ff255|h|e| |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| +8&#ffffff0@12 +@4|T+8#0000001#ffd7ff255|h|e| |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| +8#0000000#ffffff0@12 |l+0&&|a|s|t| |l|i|n|e| @50 |~+0#4040ff13&| @58 |~| @58 diff --git a/src/testdir/dumps/Test_smooth_diff_change_line_1.dump b/src/testdir/dumps/Test_smooth_diff_change_line_1.dump index 28f2e1d995..d108a926e6 100644 --- a/src/testdir/dumps/Test_smooth_diff_change_line_1.dump +++ b/src/testdir/dumps/Test_smooth_diff_change_line_1.dump @@ -2,7 +2,7 @@ | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14 -| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255|o@1| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|f+0#0000001#5fd7ff255|o@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @31||+1&&| +0#0000e05#a8a8a8255@1>b+0#0000000#ffffff0|a|r| @31 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a diff --git a/src/testdir/dumps/Test_smooth_diff_change_line_2.dump b/src/testdir/dumps/Test_smooth_diff_change_line_2.dump index 4c2d28d0e6..71768a7196 100644 --- a/src/testdir/dumps/Test_smooth_diff_change_line_2.dump +++ b/src/testdir/dumps/Test_smooth_diff_change_line_2.dump @@ -2,7 +2,7 @@ | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14 -| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255|o@1| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|f+0#0000001#5fd7ff255|o@1| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r| @31||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|a|r|b|a|r> @28 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a diff --git a/src/testdir/dumps/Test_smooth_diff_change_line_3.dump b/src/testdir/dumps/Test_smooth_diff_change_line_3.dump index e47fb5d34b..5956403032 100644 --- a/src/testdir/dumps/Test_smooth_diff_change_line_3.dump +++ b/src/testdir/dumps/Test_smooth_diff_change_line_3.dump @@ -2,8 +2,8 @@ | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14 -| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010|a|r|b|a>r| +0&#ffd7ff255@28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255|a|r| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010|a|r|b|a>r| +0&#ffd7ff255@28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#5fd7ff255|a|r| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| diff --git a/src/testdir/dumps/Test_smooth_diff_change_line_3a.dump b/src/testdir/dumps/Test_smooth_diff_change_line_3a.dump index 0c7e70c273..105e946e08 100644 --- a/src/testdir/dumps/Test_smooth_diff_change_line_3a.dump +++ b/src/testdir/dumps/Test_smooth_diff_change_line_3a.dump @@ -2,8 +2,8 @@ | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14 -| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010|a|r|b+0&#ffd7ff255|a>r| @28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|r| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010|a|r|b+0&#ffd7ff255|a>r| @28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|r| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| diff --git a/src/testdir/dumps/Test_smooth_diff_change_line_4.dump b/src/testdir/dumps/Test_smooth_diff_change_line_4.dump index 37ce70a758..a53466709a 100644 --- a/src/testdir/dumps/Test_smooth_diff_change_line_4.dump +++ b/src/testdir/dumps/Test_smooth_diff_change_line_4.dump @@ -2,8 +2,8 @@ | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| | +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| @14 -| +0#0000e05#a8a8a8255@1|f+2#0000000#ff404010|o@1| +0&#ffd7ff255@31||+1&#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000000#ff404010|a|r|b|a|r| +0&#ffd7ff255@28 -| +0#0000e05#a8a8a8255@1|b+0#0000000#ffd7ff255|a|r| @31||+1&#ffffff0| +0#0000e05#a8a8a8255@1>b+0#0000000#ffd7ff255|a|r|b+2&#ff404010|a|r| +0&#ffd7ff255@28 +| +0#0000e05#a8a8a8255@1|f+2#0000001#ff404010|o@1| +0&#ffd7ff255@31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+2#0000001#ff404010|a|r|b|a|r| +0&#ffd7ff255@28 +| +0#0000e05#a8a8a8255@1|b+0#0000001#ffd7ff255|a|r| @31||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1>b+0#0000001#ffd7ff255|a|r|b+2&#ff404010|a|r| +0&#ffd7ff255@28 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0|a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b | +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a | +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| ||+1&&| +0#0000e05#a8a8a8255@1|b+0#0000000#ffffff0|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| |a|b|c| diff --git a/src/testdir/dumps/Test_text_after_nowrap_1.dump b/src/testdir/dumps/Test_text_after_nowrap_1.dump index 0781e6cde0..ced7128a53 100644 --- a/src/testdir/dumps/Test_text_after_nowrap_1.dump +++ b/src/testdir/dumps/Test_text_after_nowrap_1.dump @@ -1,5 +1,5 @@ -|f+0&#ffffff0|i|r|s|t| |l|i|n|e| @1|r+0&#ffd7ff255|i|g|h|t| |a|f|t|e|r| |t|h|e| |t|e|x|t| |r|i|g|h|t| |a|f|t|e|r| |t|h|e| |t|e|x|t| |r|i|g|h|t| -|0+0&#ffffff0| >1| |2| |3| |4| |5| |6| |7| |8| |9| |1|0| |1@1| |1|2| |1|3| |1|4| |1|5| |1|6| |1|7| |1|8| |1|9| |2|0| |2|1| |2@1| |2 +|f+0&#ffffff0|i|r|s|t| |l|i|n|e| @1|r+0#0000001#ffd7ff255|i|g|h|t| |a|f|t|e|r| |t|h|e| |t|e|x|t| |r|i|g|h|t| |a|f|t|e|r| |t|h|e| |t|e|x|t| |r|i|g|h|t| +|0+0#0000000#ffffff0| >1| |2| |3| |4| |5| |6| |7| |8| |9| |1|0| |1@1| |1|2| |1|3| |1|4| |1|5| |1|6| |1|7| |1|8| |1|9| |2|0| |2|1| |2@1| |2 |t|h|i|r|d| @54 |f|o|u|r|t|h| @53 |~+0#4040ff13&| @58 diff --git a/src/testdir/dumps/Test_text_after_nowrap_2.dump b/src/testdir/dumps/Test_text_after_nowrap_2.dump index 28a45f3255..3e0f38dc25 100644 --- a/src/testdir/dumps/Test_text_after_nowrap_2.dump +++ b/src/testdir/dumps/Test_text_after_nowrap_2.dump @@ -1,5 +1,5 @@ -| +0&#ffd7ff255|r|i|g|h|t| |a|f|t|e|r| |t|h|e| | +0&#ffffff0@2|i+0&#ffd7ff255|n| |t|h|e| |m|i|d@1|l|e| |i|n| |t|h|e| |m|i|d@1|l|e| |i|n| |t|h|e| |m|i|d@1|l -|2+0&#ffffff0|1| |2@1| |2|3| |2|4| |2|5| |2|6| |2|7| |2|8| |2|9| |3|0| >3|1| |3|2| |3@1| |3|4| |3|5| |3|6| |3|7| |3|8| |3|9| |4|0| +| +0#0000001#ffd7ff255|r|i|g|h|t| |a|f|t|e|r| |t|h|e| | +0#0000000#ffffff0@2|i+0#0000001#ffd7ff255|n| |t|h|e| |m|i|d@1|l|e| |i|n| |t|h|e| |m|i|d@1|l|e| |i|n| |t|h|e| |m|i|d@1|l +|2+0#0000000#ffffff0|1| |2@1| |2|3| |2|4| |2|5| |2|6| |2|7| |2|8| |2|9| |3|0| >3|1| |3|2| |3@1| |3|4| |3|5| |3|6| |3|7| |3|8| |3|9| |4|0| @60 @60 |~+0#4040ff13&| @58 diff --git a/src/testdir/dumps/Test_text_after_nowrap_3.dump b/src/testdir/dumps/Test_text_after_nowrap_3.dump index 0a7cb3b01e..34c7d44a44 100644 --- a/src/testdir/dumps/Test_text_after_nowrap_3.dump +++ b/src/testdir/dumps/Test_text_after_nowrap_3.dump @@ -1,4 +1,4 @@ -|h+0&#ffd7ff255|e| |m|i|d@1|l|e| | +0&#ffffff0|t+0&#ffd7ff255|h|e| |l|a|s|t| |o|n|e| |t|h|e| |l|a|s|t| |o|n|e| |t|h|e| |l|a|s|t| |o|n|e| | +0&#ffffff0@9 +|h+0#0000001#ffd7ff255|e| |m|i|d@1|l|e| | +0#0000000#ffffff0|t+0#0000001#ffd7ff255|h|e| |l|a|s|t| |o|n|e| |t|h|e| |l|a|s|t| |o|n|e| |t|h|e| |l|a|s|t| |o|n|e| | +0#0000000#ffffff0@9 |4|3| |4@1| |4|5| |4|6| |4|7| |4|8| |4|9| |5|0| |5|1| |5|2| >5|3| |5|4| |5@1| |5|6| |5|7| |5|8| |5|9| |6|0| |6|1| |6|2| @60 @60 diff --git a/src/testdir/dumps/Test_text_after_nowrap_5.dump b/src/testdir/dumps/Test_text_after_nowrap_5.dump index ffd57084b0..55f98b737a 100644 --- a/src/testdir/dumps/Test_text_after_nowrap_5.dump +++ b/src/testdir/dumps/Test_text_after_nowrap_5.dump @@ -1,5 +1,5 @@ -|f+0&#ffffff0|i|r|s|t| |l|i|n|e|$+0#4040ff13&| +0#0000000&@1|j+0&#ffd7ff255|u|s|t| |a|f|t|e|r| |t|x|t| |j|u|s|t| |a|f|t|e|r| |t|x|t| |j|u|s|t| |a|f|t|e|r| |t|x|t| | +0&#ffffff0|i+0&#ffd7ff255 ->0+0&#ffffff0| |1| |2| |3| |4| |5| |6| |7| |8| |9| |1|0| |1@1| |1|2| |1|3| |1|4| |1|5| |1|6| |1|7| |1|8| |1|9| |2|0| |2|1| |2@1| |2 +|f+0&#ffffff0|i|r|s|t| |l|i|n|e|$+0#4040ff13&| +0#0000000&@1|j+0#0000001#ffd7ff255|u|s|t| |a|f|t|e|r| |t|x|t| |j|u|s|t| |a|f|t|e|r| |t|x|t| |j|u|s|t| |a|f|t|e|r| |t|x|t| | +0#0000000#ffffff0|i+0#0000001#ffd7ff255 +>0+0#0000000#ffffff0| |1| |2| |3| |4| |5| |6| |7| |8| |9| |1|0| |1@1| |1|2| |1|3| |1|4| |1|5| |1|6| |1|7| |1|8| |1|9| |2|0| |2|1| |2@1| |2 |t|h|i|r|d|$+0#4040ff13&| +0#0000000&@53 |f|o|u|r|t|h|$+0#4040ff13&| +0#0000000&@52 |~+0#4040ff13&| @58 diff --git a/src/testdir/dumps/Test_text_after_nowrap_list_1.dump b/src/testdir/dumps/Test_text_after_nowrap_list_1.dump index bbbbe289f6..89e48e6afa 100644 --- a/src/testdir/dumps/Test_text_after_nowrap_list_1.dump +++ b/src/testdir/dumps/Test_text_after_nowrap_list_1.dump @@ -1,4 +1,4 @@ -|s+0&#ffffff0|o|m|e| |t|e|x|t| |h|e|r|e|$+0#4040ff13&| +0#0000000&@1|T+0&#ffd7ff255|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s|.| +0&#ffffff0@1|■+0&#ffd7ff255| |T|h|e| |f|o|x| |j|u|m|p|>+0#4040ff13#ffffff0 +|s+0&#ffffff0|o|m|e| |t|e|x|t| |h|e|r|e|$+0#4040ff13&| +0#0000000&@1|T+0#0000001#ffd7ff255|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s|.| +0#0000000#ffffff0@1|■+0#0000001#ffd7ff255| |T|h|e| |f|o|x| |j|u|m|p|>+0#4040ff13#ffffff0 |$| +0#0000000&@58 |l|a|s|t| |l|i|n>e|$+0#4040ff13&| +0#0000000&@49 |~+0#4040ff13&| @58 diff --git a/src/testdir/dumps/Test_text_below_nowrap_1.dump b/src/testdir/dumps/Test_text_below_nowrap_1.dump index 3325411591..98bbcea3cc 100644 --- a/src/testdir/dumps/Test_text_below_nowrap_1.dump +++ b/src/testdir/dumps/Test_text_below_nowrap_1.dump @@ -1,6 +1,6 @@ | +0#af5f00255#ffffff0@1|1| |f+0#0000000&|i|r|s|t| |l|i|n|e| @45 -| +0#af5f00255&@3| +0#0000000&@1|o+0&#ffd7ff255|n|e| |b|e|l|o|w| |t|h|e| |t|e|x|t| |o|n|e| |b|e|l|o|w| |t|h|e| |t|e|x|t| |o|n|e| |b|e|l|o|w| |t|h|e| |t|e -| +0#af5f00255#ffffff0@3| +0#0000000&@1|t+0&#ffd7ff255|w|o| |b|e|l|o|w| |t|h|e| |t|e|x|t| |t|w|o| |b|e|l|o|w| |t|h|e| |t|e|x|t| |t|w|o| |b|e|l|o|w| |t|h|e| |t|e +| +0#af5f00255&@3| +0#0000000&@1|o+0#0000001#ffd7ff255|n|e| |b|e|l|o|w| |t|h|e| |t|e|x|t| |o|n|e| |b|e|l|o|w| |t|h|e| |t|e|x|t| |o|n|e| |b|e|l|o|w| |t|h|e| |t|e +| +0#af5f00255#ffffff0@3| +0#0000000&@1|t+0#0000001#ffd7ff255|w|o| |b|e|l|o|w| |t|h|e| |t|e|x|t| |t|w|o| |b|e|l|o|w| |t|h|e| |t|e|x|t| |t|w|o| |b|e|l|o|w| |t|h|e| |t|e | +0#af5f00255#ffffff0@1|2| |s+0#0000000&|e|c|o|n|d| >l|i|n|e| |s|e|c|o|n|d| |l|i|n|e| |s|e|c|o|n|d| |l|i|n|e| |s|e|c|o|n|d| |l|i|n|e| |s|e|c|o|n|d| |l | +0#af5f00255&@1|3| |t+0#0000000&|h|i|r|d| @50 | +0#af5f00255&@1|4| |f+0#0000000&|o|u|r|t|h| @49 diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim index 36aee04f9d..081eff43c5 100644 --- a/src/testdir/test_highlight.vim +++ b/src/testdir/test_highlight.vim @@ -493,7 +493,7 @@ endfunc func Test_highlight_eol_on_diff() call setline(1, ['abcd', '']) - call matchadd('Search', '\n') + call matchadd('ErrorMsg', '\n') let attrs0 = ScreenAttrs(1, 10)[0] diffthis @@ -504,7 +504,7 @@ func Test_highlight_eol_on_diff() " ' abcd ' " ^^ sign " ^^^^ ^^^ 'DiffAdd' highlight - " ^ 'Search' highlight + " ^ 'ErrorMsg' highlight let attrs = ScreenAttrs(1, 10)[0] call assert_equal(repeat([attrs[0]], 2), attrs[0:1]) call assert_equal(repeat([attrs[2]], 4), attrs[2:5]) diff --git a/src/version.c b/src/version.c index 77223f6664..e15321420a 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 831, /**/ 830, /**/ From ce5ca2e6346deb59628207601a9a0d2602c64aed Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 22 Jul 2026 18:15:02 +0000 Subject: [PATCH 173/647] patch 9.2.0832: socketserver: remote commands can be processed in reverse order Problem: When several clients send a command in quick succession, e.g. ":drop" from repeated "--remote-tab", the commands can be processed in reverse order, so the files open in the wrong order. Solution: The server inserts a newly accepted client at the head of the client list, so pending clients are handled newest-first. Append the client to the end of the list instead, so they are handled in the order they were accepted (Hirohito Higashi). closes: #20813 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/socketserver.c | 22 +++++++++++++++++----- src/version.c | 2 ++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/socketserver.c b/src/socketserver.c index d109a21750..44107bd4a3 100644 --- a/src/socketserver.c +++ b/src/socketserver.c @@ -551,11 +551,23 @@ socketserver_accept(channel_T *channel) channel->ch_socketserver = true; channel->ch_ss_close_cb = socketserver_client_close; - channel->ch_ss_next = client_channels; - channel->ch_ss_prev = NULL; - if (client_channels != NULL) - client_channels->ch_ss_prev = channel; - client_channels = channel; + // Append the client, so that commands are processed in the order the + // clients were accepted, not reversed. + channel->ch_ss_next = NULL; + if (client_channels == NULL) + { + channel->ch_ss_prev = NULL; + client_channels = channel; + } + else + { + channel_T *last = client_channels; + + while (last->ch_ss_next != NULL) + last = last->ch_ss_next; + last->ch_ss_next = channel; + channel->ch_ss_prev = last; + } // We will read the command from the client later in the input loop. ch_log(NULL, "socketserver: accepted new client"); diff --git a/src/version.c b/src/version.c index e15321420a..6f05376f5b 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 832, /**/ 831, /**/ From 6e468299914a81b54dea7988fc2760df16691cbb Mon Sep 17 00:00:00 2001 From: erdivartanovich Date: Wed, 22 Jul 2026 18:22:15 +0000 Subject: [PATCH 174/647] runtime(netrw): fix E471 in Neovim when g:netrw_chgwin is one past the last window Problem: Opening a file from a netrw listing throws "E471: Argument required: keepj keepalt 2wincmd 1" when g:netrw_chgwin equals winnr('$')+1, e.g. after opening :Lexplore (which sets g:netrw_chgwin=2) and closing the sidebar, then browsing with :Explore in the remaining window. s:NetrwBrowseChgDir builds the window jump as "g:netrw_chgwin wincmd curwin", passing the saved window NUMBER where wincmd expects its single-letter argument. Solution: Jump back to the saved window with "curwin wincmd w", as the surrounding comment intends; the following statement then performs the actual jump to g:netrw_chgwin. The faulty line dates back to at least Vim 9.0 (runtime/autoload/netrw.vim:4976 at v9.0.0000). Reported (against the since-archived netrw repo) in saccarosium/netrw.vim#98 and neovim/neovim#34169. Note: no test, because the error reproduces only in Neovim. closes: #20741 Signed-off-by: erdivartanovich Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/netrw/autoload/netrw.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index bbb2deb00f..64b5ce3aaf 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jul 18 +" Last Change: 2026 Jul 22 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -3939,7 +3939,7 @@ function s:NetrwBrowseChgDir(islocal, newdir, cursor, ...) let curwin= winnr() exe "NetrwKeepj keepalt ".winnr("$")."wincmd w" vs - exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd ".curwin + exe "NetrwKeepj keepalt ".curwin."wincmd w" endif exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w" endif From 3d640468babac697553956bd3cd41beb8acad88c Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 22 Jul 2026 18:29:31 +0000 Subject: [PATCH 175/647] patch 9.2.0833: GTK4: menu mnemonics do not work properly Problem: GTK4: menu mnemonics do not work properly Solution: Force "mnemonics-visible" back on via a notify handler and set the active item on "mnemonic-activate" (Foxe Chen). closes: #20722 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4_menu.c | 27 +++++++++++++++++++++++++++ src/version.c | 2 ++ 2 files changed, 29 insertions(+) diff --git a/src/gui_gtk4_menu.c b/src/gui_gtk4_menu.c index 174f2f772b..4abb38624c 100644 --- a/src/gui_gtk4_menu.c +++ b/src/gui_gtk4_menu.c @@ -805,6 +805,15 @@ vim_menu_focus_cb(GtkEventController *controller UNUSED, VimMenu *self) gtk_popover_set_mnemonics_visible(GTK_POPOVER(self), TRUE); } + static void +vim_menu_notify_mnemonics_cb( + VimMenu *self, + GParamSpec *pspec UNUSED, + void *udata UNUSED) +{ + gtk_popover_set_mnemonics_visible(GTK_POPOVER(self), TRUE); +} + static void vim_menu_init(VimMenu *self) { @@ -881,6 +890,10 @@ vim_menu_init(VimMenu *self) } g_object_unref(controllers); + // Force enable mnemonics underline + g_signal_connect(self, "notify::mnemonics-visible", + G_CALLBACK(vim_menu_notify_mnemonics_cb), NULL); + self->prev_x = self->prev_y = -1; } @@ -932,6 +945,17 @@ vim_menu_item_clicked_cb(VimMenuItem *self, VimMenu *menu) self->func(self, VIM_MENU_ITEM_CLICKED, self->func_udata); } + static gboolean +vim_menu_item_mnemonic_activate_cb( + VimMenuItem *self, + gboolean group UNUSED, + VimMenu *menu) +{ + vim_menu_set_active_item(menu, self, FALSE); + // Return FALSE so that menu item emits "clicked" signal + return FALSE; +} + static void vim_menu_item_enter_cb( GtkEventController *controller, @@ -984,6 +1008,9 @@ vim_menu_insert_item(VimMenu *self, VimMenuItem *item, int idx) g_signal_connect_object(item, "clicked", G_CALLBACK(vim_menu_item_clicked_cb), self, G_CONNECT_DEFAULT); + g_signal_connect_object(item, "mnemonic-activate", + G_CALLBACK(vim_menu_item_mnemonic_activate_cb), + self, G_CONNECT_DEFAULT); } /* diff --git a/src/version.c b/src/version.c index 6f05376f5b..6b32cb3094 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 833, /**/ 832, /**/ From fbe6397ab0c2d0beca87c5c54acf5a801956631f Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 22 Jul 2026 18:48:47 +0000 Subject: [PATCH 176/647] patch 9.2.0834: cleared last search pattern is restored from viminfo Problem: cleared last search pattern is restored from viminfo Solution: Do not apply the search pattern and 'hlsearch' state read from viminfo while writing (Barrett Ruth). fixes: #20718 closes: #20720 Signed-off-by: Barrett Ruth Signed-off-by: Christian Brabandt --- src/testdir/test_viminfo.vim | 13 +++++++++++++ src/version.c | 2 ++ src/viminfo.c | 23 +++++++++++++---------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim index de987ef278..d95250a9ea 100644 --- a/src/testdir/test_viminfo.vim +++ b/src/testdir/test_viminfo.vim @@ -38,6 +38,19 @@ func Test_viminfo_read_and_write() call assert_equal(3, done) endfunc +func Test_viminfo_clear_search_pattern() + let save = @/ + let @/ = 'foobar' + defer delete('Xviminfo') + wviminfo Xviminfo + call assert_notequal(-1, match(readfile('Xviminfo'), 'foobar')) + + let @/ = '' + wviminfo Xviminfo + call assert_equal(-1, match(readfile('Xviminfo'), 'foobar')) + call setreg('/', save) +endfunc + func Test_global_vars() let g:MY_GLOBAL_STRING = "Vim Editor" let g:MY_GLOBAL_NUM = 345 diff --git a/src/version.c b/src/version.c index 6b32cb3094..3a7cc8698f 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 834, /**/ 833, /**/ diff --git a/src/viminfo.c b/src/viminfo.c index 95ec55ebb3..f8292dee50 100644 --- a/src/viminfo.c +++ b/src/viminfo.c @@ -1476,7 +1476,7 @@ write_viminfo_sub_string(FILE *fp) */ static int -read_viminfo_search_pattern(vir_T *virp, int force) +read_viminfo_search_pattern(vir_T *virp, int force, int writing) { char_u *lp; int idx = -1; @@ -1543,16 +1543,19 @@ read_viminfo_search_pattern(vir_T *virp, int force) TRUE); if (val != NULL) { - set_last_search_pat(val, idx, magic, setlast); - vim_free(val); - spat->no_scs = no_scs; - spat->off.line = off_line; - spat->off.end = off_end; - spat->off.off = off; + if (!writing) + { + set_last_search_pat(val, idx, magic, setlast); + spat->no_scs = no_scs; + spat->off.line = off_line; + spat->off.end = off_end; + spat->off.off = off; #ifdef FEAT_SEARCH_EXTRA - if (setlast) - set_no_hlsearch(!hlsearch_on); + if (setlast) + set_no_hlsearch(!hlsearch_on); #endif + } + vim_free(val); } } } @@ -2914,7 +2917,7 @@ read_viminfo_up_to_marks( case '/': // Search string case '&': // Substitute search string case '~': // Last search string, followed by '/' or '&' - eof = read_viminfo_search_pattern(virp, forceit); + eof = read_viminfo_search_pattern(virp, forceit, writing); break; case '$': eof = read_viminfo_sub_string(virp, forceit); From 34fad27b552e90df5555d8b3b17fd40153259679 Mon Sep 17 00:00:00 2001 From: Muraoka Taro Date: Wed, 22 Jul 2026 19:18:03 +0000 Subject: [PATCH 177/647] patch 9.2.0835: features in version.c are not sorted Problem: features in version.c are not sorted Solution: Sort features case-insensitively (Taro Muraoka) closes: #20717 Signed-off-by: Muraoka Taro Signed-off-by: Christian Brabandt --- src/testdir/test_version.vim | 27 +++++++++++ src/version.c | 91 ++++++++++++++++++------------------ 2 files changed, 73 insertions(+), 45 deletions(-) diff --git a/src/testdir/test_version.vim b/src/testdir/test_version.vim index 40e5192b63..ce9db1f070 100644 --- a/src/testdir/test_version.vim +++ b/src/testdir/test_version.vim @@ -20,4 +20,31 @@ func Test_version_redirect() call delete('Xversion') endfunc +" The features[] array in version.c must stay sorted. +func Test_features_sorted() + let lines = readfile('../version.c') + let start = match(lines, '^static char \*(features\[\]) =') + call assert_notequal(-1, start) + let end = match(lines, '^};', start) + call assert_notequal(-1, end) + + " Alternatives for a single slot (#if/#elif/#else chains): only one of + " each group is ever compiled, so they are not separate list positions. + let ignore = ['dialog_con', 'dialog_gui', 'dialog', 'multi_byte', 'xpm', 'xsmp'] + + let names = [] + for line in lines[start : end] + let name = matchstr(line, '"[+-]\zs[A-Za-z_0-9]\+\ze\%(/dyn\)\=",') + if name == '' || index(ignore, name) >= 0 + continue + endif + if empty(names) || names[-1] !=# name + call add(names, name) + endif + endfor + + call assert_true(len(names) > 100) + call assert_equal(sort(copy(names), 'i'), names) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 3a7cc8698f..ac615f9b9a 100644 --- a/src/version.c +++ b/src/version.c @@ -96,6 +96,11 @@ static char *(features[]) = #else "-acl", #endif +#ifdef FEAT_ARABIC + "+arabic", +#else + "-arabic", +#endif #ifdef AMIGA // only for Amiga systems # ifdef FEAT_ARP "+ARP", @@ -103,17 +108,12 @@ static char *(features[]) = "-ARP", # endif #endif -#ifdef FEAT_ARABIC - "+arabic", -#else - "-arabic", -#endif - "+autocmd", #ifdef FEAT_AUTOCHDIR - "+autochdir", + "+autochdir", #else - "-autochdir", + "-autochdir", #endif + "+autocmd", #ifdef FEAT_AUTOSERVERNAME "+autoservername", #else @@ -274,6 +274,36 @@ static char *(features[]) = # endif #else "-iconv", +#endif +#ifdef FEAT_IMAGE + "+image", +#else + "-image", +#endif +#ifdef FEAT_IMAGE_CAIRO + "+image_cairo", +#else + "-image_cairo", +#endif +#ifdef FEAT_IMAGE_GDI + "+image_gdi", +#else + "-image_gdi", +#endif +#ifdef FEAT_IMAGE_GDK + "+image_gdk", +#else + "-image_gdk", +#endif +#ifdef FEAT_IMAGE_KITTY + "+image_kitty", +#else + "-image_kitty", +#endif +#ifdef FEAT_IMAGE_SIXEL + "+image_sixel", +#else + "-image_sixel", #endif "+insert_expand", #ifdef FEAT_IPV6 @@ -336,12 +366,6 @@ static char *(features[]) = #endif "+modify_fname", "+mouse", -#ifdef FEAT_MOUSESHAPE - "+mouseshape", -#else - "-mouseshape", -#endif - #if defined(UNIX) || defined(VMS) # ifdef FEAT_MOUSE_DEC "+mouse_dec", @@ -391,6 +415,11 @@ static char *(features[]) = # endif "+mouse_xterm", #endif +#ifdef FEAT_MOUSESHAPE + "+mouseshape", +#else + "-mouseshape", +#endif #ifdef FEAT_MBYTE_IME # ifdef DYNAMIC_IME @@ -535,36 +564,6 @@ static char *(features[]) = #else "-sodium", #endif -#ifdef FEAT_IMAGE - "+image", -#else - "-image", -#endif -#ifdef FEAT_IMAGE_SIXEL - "+image_sixel", -#else - "-image_sixel", -#endif -#ifdef FEAT_IMAGE_KITTY - "+image_kitty", -#else - "-image_kitty", -#endif -#ifdef FEAT_IMAGE_GDI - "+image_gdi", -#else - "-image_gdi", -#endif -#ifdef FEAT_IMAGE_CAIRO - "+image_cairo", -#else - "-image_cairo", -#endif -#ifdef FEAT_IMAGE_GDK - "+image_gdk", -#else - "-image_gdk", -#endif #ifdef FEAT_SOUND "+sound", #else @@ -600,9 +599,9 @@ static char *(features[]) = #else "-tabpanel", #endif + "-tag_any_white", "+tag_binary", "-tag_old_static", - "-tag_any_white", #ifdef FEAT_TCL # ifdef DYNAMIC_TCL "+tcl/dyn", @@ -759,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 835, /**/ 834, /**/ From a8d5be92845df7fc0e9e4399545bd5c01bba536a Mon Sep 17 00:00:00 2001 From: Fionn Fitzmaurice Date: Wed, 22 Jul 2026 19:49:58 +0000 Subject: [PATCH 178/647] patch 9.2.0836: filetype: .git-blame-ignore-revs file is not recognized Problem: filetype: .git-blame-ignore-revs file is not recognized Solution: Detect .git-blame-ignore-revs file as gitrevlist filetype, include syntax and filetype plugins (Fionn Fitzmaurice) A Git revision list is > a list of object names (i.e. one unabbreviated SHA-1 per line)..., > comments (#), empty lines, and any leading and trailing whitespace are > ignored. (from Git's fsck.skipList documentation). The default output of git rev-list will match this. It is also suitable as input to git blame --ignore-revs-file. This adds filetype detection matching .git-blame-ignore-revs files, syntax highlighting and basic filetype settings. closes: #20702 Signed-off-by: Fionn Fitzmaurice Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/autoload/dist/ft.vim | 4 +++- runtime/ftplugin/gitrevlist.vim | 16 ++++++++++++++++ runtime/syntax/gitrevlist.vim | 17 +++++++++++++++++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 ++ 6 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 runtime/ftplugin/gitrevlist.vim create mode 100644 runtime/syntax/gitrevlist.vim diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 880414e299..ea76824880 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -206,6 +206,7 @@ runtime/ftplugin/gitcommit.vim @tpope runtime/ftplugin/gitconfig.vim @tpope runtime/ftplugin/gitignore.vim @ObserverOfTime runtime/ftplugin/gitrebase.vim @tpope +runtime/ftplugin/gitrevlist.vim @fionn runtime/ftplugin/gitsendemail.vim @tpope runtime/ftplugin/gleam.vim @kirillmorozov runtime/ftplugin/go.vim @dbarnett diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 7473896b06..25414c490c 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 21 +# Last Change: 2026 Jul 22 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -3271,6 +3271,8 @@ const ft_from_name = { "TAG_EDITMSG": "gitcommit", "NOTES_EDITMSG": "gitcommit", "EDIT_DESCRIPTION": "gitcommit", + # Git revision list + ".git-blame-ignore-revs": "gitrevlist", # gnash(1) configuration files "gnashrc": "gnash", ".gnashrc": "gnash", diff --git a/runtime/ftplugin/gitrevlist.vim b/runtime/ftplugin/gitrevlist.vim new file mode 100644 index 0000000000..6282203556 --- /dev/null +++ b/runtime/ftplugin/gitrevlist.vim @@ -0,0 +1,16 @@ +" Vim filetype plugin file +" Language: Git revision list +" Author: Fionn Fitzmaurice (github.com/fionn) +" Maintainer: Fionn Fitzmaurice (github.com/fionn) +" License: Vim & Apache 2.0 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +setlocal comments=:# +setlocal commentstring=#\ %s +setlocal keywordprg=git\ show + +let b:undo_ftplugin = "setl comments< commentstring< keywordprg<" diff --git a/runtime/syntax/gitrevlist.vim b/runtime/syntax/gitrevlist.vim new file mode 100644 index 0000000000..11b4b0a9cc --- /dev/null +++ b/runtime/syntax/gitrevlist.vim @@ -0,0 +1,17 @@ +" Vim syntax file +" Language: Git revision list +" Author: Fionn Fitzmaurice (github.com/fionn) +" Maintainer: Fionn Fitzmaurice (github.com/fionn) +" License: Vim & Apache 2.0 + +if exists("b:current_syntax") + finish +endif + +syn match gitrevlistHash "\<\x\{40}\>\|\<\x\{64}\>" contains=@NoSpell nextgroup=gitrevlistComment skipwhite +syn match gitrevlistComment "#.*$" + +hi def link gitrevlistHash Identifier +hi def link gitrevlistComment Comment + +let b:current_syntax = "gitrevlist" diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 79ce8ff9c4..4c03d5f508 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -337,6 +337,7 @@ def s:GetFilenameChecks(): dict> gitignore: ['file.git/info/exclude', '.gitignore', '/.config/git/ignore', 'some.git/info/exclude'] + WhenConfigHome('$XDG_CONFIG_HOME/git/ignore') + ['.prettierignore', '.fdignore', '/.config/fd/ignore', '.ignore', '.rgignore', '.dockerignore', '.containerignore', '.npmignore', '.vscodeignore'], gitolite: ['gitolite.conf', '/gitolite-admin/conf/file', 'any/gitolite-admin/conf/file'], gitrebase: ['git-rebase-todo'], + gitrevlist: ['.git-blame-ignore-revs'], gitsendemail: ['.gitsendemail.msg.xxxxxx'], gkrellmrc: ['gkrellmrc', 'gkrellmrc_x'], gleam: ['file.gleam'], diff --git a/src/version.c b/src/version.c index ac615f9b9a..d814250994 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 836, /**/ 835, /**/ From 77eed379cce8fd85a1a92c5e587da7cd103751ac Mon Sep 17 00:00:00 2001 From: Shad Date: Wed, 22 Jul 2026 20:01:09 +0000 Subject: [PATCH 179/647] patch 9.2.0837: Using wrong colors in hl_blend_attr() Problem: Using wrong colors in hl_blend_attr() (after v9.2.0715) Solution: Use the correct background color (Shad) related: #20624 closes: #20704 Signed-off-by: Shad Signed-off-by: Christian Brabandt --- src/highlight.c | 4 ++-- .../dumps/Test_popup_opacity_lowcolor.dump | 12 ++++++++++ .../dumps/Test_popupwin_opacity_hl_80.dump | 4 ++-- .../dumps/Test_pum_opacity_lowcolor.dump | 12 ++++++++++ src/testdir/test_popup.vim | 23 +++++++++++++++++++ src/testdir/test_popupwin.vim | 21 +++++++++++++++++ src/testdir/util/term_util.vim | 8 +++++-- src/version.c | 2 ++ 8 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/testdir/dumps/Test_popup_opacity_lowcolor.dump create mode 100644 src/testdir/dumps/Test_pum_opacity_lowcolor.dump diff --git a/src/highlight.c b/src/highlight.c index 2e1b343291..1b9cbed7c2 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -3581,7 +3581,7 @@ hl_blend_attr(int char_attr, int popup_attr, int blend, int blend_fg UNUSED) under_fg_rgb = char_aep->ae_u.cterm.fg_rgb; #endif new_en.ae_u.cterm.fg_color = blend_cterm_colors( - popup_aep->ae_u.cterm.fg_color, popup_bg_rgb, + popup_aep->ae_u.cterm.bg_color, popup_bg_rgb, under_fg, under_fg_rgb, fallback_fg_rgb, blend); } // Approximate cterm bg by blending with the underlying bg @@ -3815,7 +3815,7 @@ hl_pum_blend_attr(int char_attr, int popup_attr, int blend UNUSED) under_fg_rgb = char_aep->ae_u.cterm.fg_rgb; #endif new_en.ae_u.cterm.fg_color = blend_cterm_colors( - popup_aep->ae_u.cterm.fg_color, popup_bg_rgb, + popup_aep->ae_u.cterm.bg_color, popup_bg_rgb, under_fg, under_fg_rgb, fallback_fg_rgb, blend); } // Approximate cterm bg by blending with the underlying bg diff --git a/src/testdir/dumps/Test_popup_opacity_lowcolor.dump b/src/testdir/dumps/Test_popup_opacity_lowcolor.dump new file mode 100644 index 0000000000..530b0cbc43 --- /dev/null +++ b/src/testdir/dumps/Test_popup_opacity_lowcolor.dump @@ -0,0 +1,12 @@ +>u+0&#ffffff0|n|d|e|r| |u|n|d|e|r| |u|n|d|e|r| @42 +|u|n|╔+0#0000001#ff40ff14|═@21|╗| +0#0000000#ffffff0@33 +|u|n|║+0#0000001#ff40ff14|e+0#ff40ff14&|r| |u|n|d|e|r| |u|n|d|e|r| @7|║+0#0000001&| +0#0000000#ffffff0@33 +|u|n|║+0#0000001#ff40ff14|e+0#ff40ff14&|P+0#0000001&|o|p|u|p|e+0#ff40ff14&|P+0#0000001&|o|p|u|p|e+0#ff40ff14&|r| @7|║+0#0000001&| +0#0000000#ffffff0@33 +|u|n|║+0#0000001#ff40ff14|e+0#ff40ff14&|r| |u|n|d|e|r| |u|n|d|e|r| @7|║+0#0000001&| +0#0000000#ffffff0@33 +|u|n|║+0#0000001#ff40ff14|e+0#ff40ff14&|r| |u|n|d|e|r| |u|n|d|e|r| @7|║+0#0000001&| +0#0000000#ffffff0@33 +|u|n|╚+0#0000001#ff40ff14|═@21|╝| +0#0000000#ffffff0@33 +|u|n|d|e|r| |u|n|d|e|r| |u|n|d|e|r| @42 +|u|n|d|e|r| |u|n|d|e|r| |u|n|d|e|r| @42 +|u|n|d|e|r| |u|n|d|e|r| |u|n|d|e|r| @42 +|~+0#4040ff13&| @58 +| +0#0000000&@41|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump b/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump index 78d3115450..c57365eaae 100644 --- a/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump +++ b/src/testdir/dumps/Test_popupwin_opacity_hl_80.dump @@ -1,7 +1,7 @@ >1+0&#ffffff0| @73 |2| @73 -|3| @7|f+0#ff404010#87d7ff255|o@1| +0#d75f5f255&@1|b+0#0000001&|a|r| +0#0000000#ffffff0@57 -|4| @7|b+0#0000001#87d7ff255|a|z| +0#0000000&@4| +0&#ffffff0@57 +|3| @7|f+0#ff404010#87d7ff255|o@1| +0#5fafd7255&@1|b+0#0000001&|a|r| +0#0000000#ffffff0@57 +|4| @7|b+0#0000001#87d7ff255|a|z| +0#5fafd7255&@4| +0#0000000#ffffff0@57 |5| @73 |6| @73 |7| @73 diff --git a/src/testdir/dumps/Test_pum_opacity_lowcolor.dump b/src/testdir/dumps/Test_pum_opacity_lowcolor.dump new file mode 100644 index 0000000000..6c585e0a87 --- /dev/null +++ b/src/testdir/dumps/Test_pum_opacity_lowcolor.dump @@ -0,0 +1,12 @@ +|i+0&#ffffff0|t|e|m> @55 +|i+0#0000001#e0e0e08|t|e|m|r+0#e0e0e08&| |u|n|d|e|r| |u|n|d|e+0#0000000#ffffff0|r| @42 +|a+0#0000001#ff40ff14|n|o|t|h|e|r| |i|t|e|m|u+0#ff40ff14&|n|d|e+0#0000000#ffffff0|r| @42 +|a+0#0000001#ff40ff14|n|d| |a| |l|a|s|t| |o|n|e|d+0#ff40ff14&|e+0#0000000#ffffff0|r| @42 +|u|n|d|e|r| |u|n|d|e|r| |u|n|d|e|r| @42 +|u|n|d|e|r| |u|n|d|e|r| |u|n|d|e|r| @42 +|~+0#4040ff13&| @58 +|~| @58 +|~| @58 +|~| @58 +|~| @58 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@29|1|,|5| @10|A|l@1| diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index fd25e93ebe..a4bba3f310 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -2706,6 +2706,29 @@ func Test_pumopt_opacity_pmenu_cleared() call StopVimInTerminal(buf) endfunc +func Test_pum_opacity_lowcolor() + CheckScreendump + + let lines =<< trim END + set pumopt=opacity:50 + call setline(1, '') + for i in range(5) + call append(line('$'), 'under under under') + endfor + normal gg + inoremap call complete(col('.'), + \ ['item', 'another item', 'and a last one']) + END + call writefile(lines, 'XtestPumOpacityLowcolor', 'D') + let buf = RunVimInTerminal('-S XtestPumOpacityLowcolor', #{rows: 12, cols: 60, tcolors: 16}) + + call term_sendkeys(buf, "i\") + call TermWait(buf, 100) + call VerifyScreenDump(buf, 'Test_pum_opacity_lowcolor', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_popup_sandbox() call assert_fails('sandbox call popup_create("hello", {})', 'E48:') call assert_fails('sandbox call popup_setoptions(1, {})', 'E48:') diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 67babab1b2..364a50fe02 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -5831,6 +5831,27 @@ func Test_popup_opacity_attr() call StopVimInTerminal(buf) endfunc +func Test_popup_opacity_lowcolor() + CheckScreendump + + let lines =<< trim END + call setline(1, repeat(['under under under'], 10)) + call popup_create('Popup Popup', #{ + \ line: 2, col: 3, + \ border: [1, 1, 1, 1], + \ padding: [1, 1, 1 ,1], + \ minwidth: 20, + \ minheight: 2, + \ opacity: 70, + \ }) + END + call writefile(lines, 'XtestPopupOpacityLowcolor', 'D') + let buf = RunVimInTerminal('-S XtestPopupOpacityLowcolor', #{rows: 12, cols: 60, tcolors: 16}) + call VerifyScreenDump(buf, 'Test_popup_opacity_lowcolor', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_popup_image_update() CheckFeature image diff --git a/src/testdir/util/term_util.vim b/src/testdir/util/term_util.vim index 61ff9ce1b8..afb44c8dbb 100644 --- a/src/testdir/util/term_util.vim +++ b/src/testdir/util/term_util.vim @@ -58,6 +58,7 @@ endfunc " "no_clean" - if non-zero then remove "--clean" from the command " "cmd" - run any other command, e.g. "xxd" (used in xxd test) " "env" - additional environment variables, e.g. $TERM variable +" "tcolor" - terminal color number (256 by default) func RunVimInTerminal(arguments, options) " If Vim doesn't exit a swap file remains, causing other tests to fail. " Remove it here. @@ -76,8 +77,11 @@ func RunVimInTerminal(arguments, options) split vsplit - " Always do this with 256 colors and a light background. - set t_Co=256 background=light + " Always do this with light background. + set background=light + " and 256 colors by default + let tcolors = get(a:options, 'tcolors', 256) + let &t_Co=tcolors hi Normal ctermfg=NONE ctermbg=NONE " Make the window 20 lines high and 75 columns, unless told otherwise or diff --git a/src/version.c b/src/version.c index d814250994..d463a17d81 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 837, /**/ 836, /**/ From 4352dc6ab0ca60d3a44fc90a26275d722ce7b86c Mon Sep 17 00:00:00 2001 From: glepnir Date: Wed, 22 Jul 2026 20:08:06 +0000 Subject: [PATCH 180/647] patch 9.2.0838: searchcount() returns wrong cached maxcount Problem: Cached searchcount() returns 'maxsearchcount' instead of the requested maxcount. Solution: return the remembered last_maxcount (glepnir) closes: #20701 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/search.c | 2 +- src/testdir/test_search.vim | 13 +++++++++++++ src/version.c | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/search.c b/src/search.c index bcf168be02..4f3a5dd9ef 100644 --- a/src/search.c +++ b/src/search.c @@ -3309,7 +3309,7 @@ update_search_stat( stat->cnt = cnt; stat->exact_match = exact_match; stat->incomplete = incomplete; - stat->last_maxcount = p_msc; + stat->last_maxcount = last_maxcount; return; } last_maxcount = maxcount; diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index be0a460b71..82c706132f 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -2457,4 +2457,17 @@ func Test_incsearch_delimiter_ctrlg() call StopVimInTerminal(buf) endfunc +func Test_searchcount_maxcount_cached() + new + call setline(1, repeat(['foo'], 5)) + set maxsearchcount=99 + let @/ = 'foo' + call cursor(1, 1) + call searchcount(#{recompute: v:true, maxcount: 3}) + let r = searchcount(#{recompute: v:false, maxcount: 3}) + call assert_equal(3, r.maxcount) + set maxsearchcount& + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index d463a17d81..07772b03f5 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 838, /**/ 837, /**/ From bb86a1866b7fab4ffdf730c452385f6a8afd36da Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 22 Jul 2026 21:18:31 +0000 Subject: [PATCH 181/647] runtime(doc): clarify re-sourcing of Vim9 script behaviour related: #19205 Signed-off-by: Christian Brabandt --- runtime/doc/vim9.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index a0357ce94b..897246b5b0 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.2. Last change: 2026 Jul 20 +*vim9.txt* For Vim version 9.2. Last change: 2026 Jul 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -407,9 +407,11 @@ something you don't have to worry about the old name still hanging around. The exported functions and variables of an autoload script live in the global namespace with the autoload prefix. When such a script is sourced again they are likewise given a clean slate, so an autoload script can be sourced more -than once. A class or enum is an exception: it cannot be redefined this way -and |E1041| is given, because objects created from the previous definition -would keep referring to it. Restart Vim to load a changed class or enum. +than once. A class or enum in an autoload script is an exception: it cannot +be redefined this way and |E1041| is given, because objects created from the +previous definition would keep referring to it. Restart Vim to load a changed +class or enum in an autoload script. In other scripts a class or enum is +cleared like everything else, so it can be redefined. If you do want to keep items, use: > vim9script noclear From 27cfd1cf476d355060cd46bf7655ea547461ee0e Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 22 Jul 2026 21:49:18 +0000 Subject: [PATCH 182/647] runtime(spellfile): xdg: Do not assume $HOME/.vim directory fixes: #20794 Signed-off-by: Christian Brabandt --- runtime/autoload/spellfile.vim | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/runtime/autoload/spellfile.vim b/runtime/autoload/spellfile.vim index 43f7dffa1a..2061676e21 100644 --- a/runtime/autoload/spellfile.vim +++ b/runtime/autoload/spellfile.vim @@ -1,6 +1,6 @@ " Vim script to download a missing spell file " Maintainer: The Vim Project -" Last Change: 2023 Aug 10 +" Last Change: 2026 Jul 22 " Former Maintainer: Bram Moolenaar if !exists('g:spellfile_URL') @@ -194,10 +194,6 @@ function! spellfile#GetDirChoices() endfunc function! spellfile#WritableSpellDir() - if has("unix") - " For Unix always use the $HOME/.vim directory - return $HOME . "/.vim/spell" - endif for dir in split(&rtp, ',') if filewritable(dir) == 2 return dir . "/spell" From c5a82fe013e73c98004ad7cd4f906b1ad1ed610e Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Thu, 23 Jul 2026 19:13:15 +0000 Subject: [PATCH 183/647] patch 9.2.0839: [security]: arbitrary code execution via keyword lookup Problem: [security]: arbitrary code execution via keyword lookup in sh.vim, zsh.vim and ps1.vim filetype plugin (manus-use) Solution: For powershell, quote the commands using single quotes, for sh/zsh pass the argument as a separate list item to term_start()/system() (Yasuhiro Matsumoto). Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-r5v6-q6j8-8qw2 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- runtime/ftplugin/ps1.vim | 5 +++-- runtime/ftplugin/sh.vim | 5 +++-- runtime/ftplugin/zsh.vim | 8 ++++---- src/version.c | 2 ++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/runtime/ftplugin/ps1.vim b/runtime/ftplugin/ps1.vim index f1fe78df4c..9ff764a282 100644 --- a/runtime/ftplugin/ps1.vim +++ b/runtime/ftplugin/ps1.vim @@ -6,6 +6,7 @@ " 2024 May 23 by Riley Bruins ('commentstring') " 2024 Sep 19 by Konfekt (simplify keywordprg #15696) " 2025 Jul 22 by phanium (use :hor term #17822) +" 2026 Jul 10 by Vim Project (quote K argument, prevent command injection) " Only do this when not done yet for this buffer if exists("b:did_ftplugin") | finish | endif @@ -52,9 +53,9 @@ endif if exists('s:pwsh_cmd') if exists(':terminal') == 2 - command! -buffer -nargs=1 GetHelp silent exe 'hor term ' . s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full ""' . (executable('less') ? ' | less' : '') + command! -buffer -nargs=1 GetHelp call term_start([s:pwsh_cmd, '-NoLogo', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'RemoteSigned', '-Command', "Get-Help -Full '" . substitute(, "'", "''", 'g') . "'" . (executable('less') ? ' | less' : '')]) else - command! -buffer -nargs=1 GetHelp echo system(s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full ') + command! -buffer -nargs=1 GetHelp echo system([s:pwsh_cmd, '-NoLogo', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'RemoteSigned', '-Command', "Get-Help -Full '" . substitute(, "'", "''", 'g') . "'"]) endif setlocal keywordprg=:GetHelp let b:undo_ftplugin ..= " | setl kp< | sil! delc -buffer GetHelp" diff --git a/runtime/ftplugin/sh.vim b/runtime/ftplugin/sh.vim index 18cd219cdc..45e6f44fcf 100644 --- a/runtime/ftplugin/sh.vim +++ b/runtime/ftplugin/sh.vim @@ -8,6 +8,7 @@ " 2024 Dec 29 by Vim Project (improve setting shellcheck compiler) " 2025 Mar 09 by Vim Project (set b:match_skip) " 2025 Jul 22 by phanium (use :hor term #17822) +" 2026 Jul 10 by Vim Project (pass K argument as a list, prevent shell injection) if exists("b:did_ftplugin") finish @@ -54,9 +55,9 @@ let s:is_kornshell = get(b:, "is_kornshell", get(g:, "is_kornshell", 0)) if s:is_bash if exists(':terminal') == 2 - command! -buffer -nargs=1 ShKeywordPrg silent exe ':hor term bash -c "help "" 2>/dev/null || man """' + command! -buffer -nargs=1 ShKeywordPrg call term_start(['bash', '-c', 'help "$1" 2>/dev/null || man "$1"', '--', ]) else - command! -buffer -nargs=1 ShKeywordPrg echo system('bash -c "help " 2>/dev/null || MANPAGER= man ""') + command! -buffer -nargs=1 ShKeywordPrg echo system(['bash', '-c', 'help "$1" 2>/dev/null || MANPAGER= man "$1"', '--', ]) endif setlocal keywordprg=:ShKeywordPrg let b:undo_ftplugin ..= " | setl kp< | sil! delc -buffer ShKeywordPrg" diff --git a/runtime/ftplugin/zsh.vim b/runtime/ftplugin/zsh.vim index 850bef055c..8163585939 100644 --- a/runtime/ftplugin/zsh.vim +++ b/runtime/ftplugin/zsh.vim @@ -2,7 +2,7 @@ " Language: Zsh shell script " Maintainer: Christian Brabandt " Previous Maintainer: Nikolai Weibull -" Latest Revision: 2025 Jul 23 +" Latest Revision: 2026 Jul 23 " License: Vim (see :h license) " Repository: https://github.com/chrisbra/vim-zsh @@ -25,9 +25,9 @@ endif if executable('zsh') && &shell !~# '/\%(nologin\|false\)$' if exists(':terminal') == 2 - command! -buffer -nargs=1 ZshKeywordPrg silent exe ':hor :term zsh -c "autoload -Uz run-help; run-help "' - else - command! -buffer -nargs=1 ZshKeywordPrg echo system('MANPAGER= zsh -c "autoload -Uz run-help; run-help 2>/dev/null"') + command! -buffer -nargs=1 ZshKeywordPrg call term_start(['zsh', '-c', 'autoload -Uz run-help; run-help "$1"', '--', ]) + elseif has("patch-9.2.0250") + command! -buffer -nargs=1 ZshKeywordPrg echo system(['zsh', '-c', 'autoload -Uz run-help; MANPAGER= run-help "$1" 2>/dev/null', '--', ]) endif setlocal keywordprg=:ZshKeywordPrg let b:undo_ftplugin .= '| setl keywordprg< | sil! delc -buffer ZshKeywordPrg' diff --git a/src/version.c b/src/version.c index 07772b03f5..9d3c95b005 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 839, /**/ 838, /**/ From 29c6fd090d4520592f8be7d9ec81190edf25ef69 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 6 Jul 2026 13:54:03 +0900 Subject: [PATCH 184/647] patch 9.2.0840: [security]: code injection in netrw via bookmarks Problem: [security]: code injection in netrw via bookmarks and history (David Carliez) Solution: Escape the '|' explicitly (Yasuhiro Matsumoto) The bookmark and history menu builders interpolate paths into :execute'd :menu commands using g:netrw_menu_escape, which did not escape the Ex command separator '|'. A crafted path could break out of the :menu command and run arbitrary Ex/shell commands when the menu was built or triggered. Add '|' to g:netrw_menu_escape for the menu names, escape the :e right-hand side with fnameescape(), and quote the netrw#MakeTgt() argument with string() instead of raw single-quote interpolation. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-rcr7-f3wr-22r2 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/netrw/autoload/netrw.vim | 18 ++++++++++-------- src/version.c | 2 ++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index 64b5ce3aaf..d745fd36fa 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jul 22 +" Last Change: 2026 Jul 23 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -375,7 +375,7 @@ if has("win32") else call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\') endif -call s:NetrwInit("g:netrw_menu_escape",'.&? \') +call s:NetrwInit("g:netrw_menu_escape",'.&? \|') call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\\"") if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4') let s:treedepthstring= "│ " @@ -3777,13 +3777,14 @@ function s:NetrwBookmarkMenu() if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0 let cnt= 1 for bmd in g:netrw_bookmarklist - let bmd= escape(bmd,g:netrw_menu_escape) + let ebmd= escape(bmd,g:netrw_menu_escape) + let fbmd= escape(fnameescape(bmd),'|') " show bookmarks for goto menu - exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\" + exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.ebmd.' :e '.fbmd."\" " show bookmarks for deletion menu - exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.' '.cnt."mB" + exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.ebmd.' '.cnt."mB" let cnt= cnt + 1 endfor @@ -3799,7 +3800,8 @@ function s:NetrwBookmarkMenu() let priority = g:netrw_dirhistcnt + histcnt if exists("g:netrw_dirhist_{cnt}") let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape) - exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\" + let ehistdir= escape(fnameescape(g:netrw_dirhist_{cnt}),'|') + exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.ehistdir."\" endif let first = 0 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax @@ -7152,7 +7154,7 @@ function s:NetrwTgtMenu() let tgtdict[bmd]= cnt let ebmd= escape(bmd,g:netrw_menu_escape) " show bookmarks for goto menu - exe 'sil! menu '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#MakeTgt('".bmd."')\" + exe 'sil! menu '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#MakeTgt(".escape(string(bmd),'|').")\" let cnt= cnt + 1 endfor endif @@ -7170,7 +7172,7 @@ function s:NetrwTgtMenu() endif let tgtdict[histentry] = histcnt let ehistentry = escape(histentry,g:netrw_menu_escape) - exe 'sil! menu '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#MakeTgt('".histentry."')\" + exe 'sil! menu '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#MakeTgt(".escape(string(histentry),'|').")\" endif let histcnt = histcnt + 1 endwhile diff --git a/src/version.c b/src/version.c index 9d3c95b005..75110ae0ab 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 840, /**/ 839, /**/ From a9336b476fd1a182e3f79b5f83c0ffb04f8a922b Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Thu, 23 Jul 2026 20:14:13 +0000 Subject: [PATCH 185/647] patch 9.2.0841: [security]: heap overflow when adding > 65535 text properties Problem: [security]: heap overflow when adding > 65535 text properties (Wang1rrr). Solution: Verify that the number of text properties falls within the limit (Yasuhiro Matsumoto). Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-hm4g-pjfx-m27j Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/errors.h | 4 ++++ src/po/vim.pot | 5 ++++- src/testdir/test_textprop.vim | 18 ++++++++++++++++++ src/textprop.c | 7 +++++++ src/version.c | 2 ++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/errors.h b/src/errors.h index e1e7ada84d..143e7d7e6c 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3818,3 +3818,7 @@ EXTERN char e_too_many_postponed_prefixes_spell[] #endif EXTERN char e_completeopt_escape_cannot_be_used_with_nargs_underscore[] INIT(= N_("E1579: -completeopt=escape cannot be used with -nargs=_")); +#ifdef FEAT_PROP_POPUP +EXTERN char e_too_many_text_properties_on_a_single_line[] + INIT(= N_("E1580: Too many text properties on a single line")); +#endif diff --git a/src/po/vim.pot b/src/po/vim.pot index 4996b205ff..358f4bb614 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-06-27 08:41+0000\n" +"POT-Creation-Date: 2026-07-23 20:13+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -8897,6 +8897,9 @@ msgstr "" msgid "E1579: -completeopt=escape cannot be used with -nargs=_" msgstr "" +msgid "E1580: Too many text properties on a single line" +msgstr "" + #. type of cmdline window or 0 #. result of cmdline window or 0 #. buffer of cmdline window or NULL diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim index 66f9edc816..a566a47af8 100644 --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -5027,4 +5027,22 @@ func Test_textprop_below_truncated_with_ellipsis() set ff& endfunc +" Adding more than 65535 text properties to one line must be rejected instead +" of wrapping the uint16_t property count and overflowing the allocation. +func Test_prop_add_over_uint16_max() + CheckNotAsan + CheckNotValgrind + new + call setline(1, 'x') + call prop_type_add('overflow', {}) + for _ in range(0xffff) + call prop_add(1, 1, {'type': 'overflow', 'length': 0}) + endfor + call assert_equal(0xffff, prop_list(1)->len()) + call assert_fails("call prop_add(1, 1, {'type': 'overflow', 'length': 0})", 'E1580:') + call assert_equal(0xffff, prop_list(1)->len()) + call prop_type_delete('overflow') + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/textprop.c b/src/textprop.c index 4d3c8d2d71..02f9876184 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -758,6 +758,13 @@ prop_add_one( proplen = get_text_props(buf, lnum, &props, TRUE); textlen = ml_get_buf_len(buf, lnum) + 1; + // prop_count is a uint16_t; stop before proplen + 1 wraps to zero. + if (proplen >= 0xffff) + { + emsg(_(e_too_many_text_properties_on_a_single_line)); + goto theend; + } + if (lnum == start_lnum) col = start_col; else diff --git a/src/version.c b/src/version.c index 75110ae0ab..9afff74b32 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 841, /**/ 840, /**/ From 5598618b2daf8e36b3bf0251caaefcf0bf8e85e4 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Thu, 23 Jul 2026 20:50:10 +0000 Subject: [PATCH 186/647] patch 9.2.0842: [security]: stack buffer overflow in socket server Problem: [security]: stack buffer overflow in socket server (tdjackey) Solution: Cap accepted socketserver clients (Yasuhiro Matsumoto) Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-49m8-wwxj-mr69 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/channel.c | 20 ++++++++++-- src/os_unix.c | 2 +- src/socketserver.c | 25 ++++++++++++-- src/testdir/test_clientserver.vim | 54 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ src/vim.h | 9 ++++++ 6 files changed, 107 insertions(+), 5 deletions(-) diff --git a/src/channel.c b/src/channel.c index d7fa3bd2c7..0519a157be 100644 --- a/src/channel.c +++ b/src/channel.c @@ -4028,6 +4028,9 @@ channel_fill_wfds(int maxfd_arg, fd_set *wfds) chanpart_T *in_part = &ch->ch_part[PART_IN]; if (in_part->ch_fd != INVALID_FD +# ifdef FD_SETSIZE + && (int)in_part->ch_fd < FD_SETSIZE +# endif && is_channel_write_remaining(in_part)) { FD_SET((int)in_part->ch_fd, wfds); @@ -4165,7 +4168,7 @@ channel_wait(channel_T *channel, sock_T fd, int timeout) #else for (;;) { - struct pollfd fds[MAX_OPEN_CHANNELS + 1]; + struct pollfd fds[MAX_OPEN_CHANNELS + 1 + MAX_CLIENT_CHANNELS]; int nfd = 1; fds[0].fd = fd; @@ -5415,6 +5418,12 @@ channel_select_setup( } else { +# ifdef FD_SETSIZE + // An fd that does not fit in the fd_set cannot be watched + // with select(); skip it rather than overflow the set. + if ((int)fd >= FD_SETSIZE) + continue; +# endif FD_SET((int)fd, rfds); if (maxfd < (int)fd) maxfd = (int)fd; @@ -5447,7 +5456,11 @@ channel_select_check(int ret_in, void *rfds_in, void *wfds_in) { sock_T fd = channel->ch_part[part].ch_fd; - if (ret > 0 && fd != INVALID_FD && FD_ISSET(fd, rfds)) + if (ret > 0 && fd != INVALID_FD +# ifdef FD_SETSIZE + && (int)fd < FD_SETSIZE +# endif + && FD_ISSET(fd, rfds)) { channel_read(channel, part, "channel_select_check"); FD_CLR(fd, rfds); @@ -5462,6 +5475,9 @@ channel_select_check(int ret_in, void *rfds_in, void *wfds_in) in_part = &channel->ch_part[PART_IN]; if (ret > 0 && in_part->ch_fd != INVALID_FD +# ifdef FD_SETSIZE + && (int)in_part->ch_fd < FD_SETSIZE +# endif && FD_ISSET(in_part->ch_fd, wfds)) { // Clear the flag first, ch_fd may change in channel_write_input(). diff --git a/src/os_unix.c b/src/os_unix.c index 904421772e..85b4353c43 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6798,7 +6798,7 @@ RealWaitForChar(int fd, long msec, int *check_for_gpm UNUSED, int *interrupted) # endif # ifndef HAVE_SELECT // each channel may use in, out and err - struct pollfd fds[7 + 3 * MAX_OPEN_CHANNELS]; + struct pollfd fds[7 + 3 * MAX_OPEN_CHANNELS + 2 * MAX_CLIENT_CHANNELS]; int nfd; # ifdef FEAT_WAYLAND_CLIPBOARD int wayland_idx = -1; diff --git a/src/socketserver.c b/src/socketserver.c index 44107bd4a3..e693123e13 100644 --- a/src/socketserver.c +++ b/src/socketserver.c @@ -57,6 +57,7 @@ static char_u *server_addr_cwd = NULL; // CWD when server was started, used static garray_T server_replies; static channel_T *client_channels = NULL; +static int client_channel_count = 0; # define FOR_ALL_CLIENTS(ch) \ for (ch = client_channels; ch != NULL; ch = ch->ch_ss_next) @@ -538,6 +539,8 @@ socketserver_client_close(channel_T *channel) channel->ch_ss_prev->ch_ss_next = channel->ch_ss_next; if (channel->ch_ss_next != NULL) channel->ch_ss_next->ch_ss_prev = channel->ch_ss_prev; + if (client_channel_count > 0) + --client_channel_count; ch_log(NULL, "socketserver: client channel closed"); } @@ -548,6 +551,16 @@ socketserver_client_close(channel_T *channel) static void socketserver_accept(channel_T *channel) { + if (client_channel_count >= MAX_CLIENT_CHANNELS) + { + // Too many client connections: refuse this one instead of letting the + // channel's file descriptor overflow the select()/poll() sets. + ch_log(NULL, "socketserver: too many clients, refusing connection"); + channel_close(channel, FALSE); + channel_unref(channel); + return; + } + channel->ch_socketserver = true; channel->ch_ss_close_cb = socketserver_client_close; @@ -568,6 +581,7 @@ socketserver_accept(channel_T *channel) last->ch_ss_next = channel; channel->ch_ss_prev = last; } + ++client_channel_count; // We will read the command from the client later in the input loop. ch_log(NULL, "socketserver: accepted new client"); @@ -872,7 +886,11 @@ socketserver_wait(channel_T *channel, int timeout) FOR_ALL_CLIENTS(ch) { - if (ch->CH_SOCK_FD != INVALID_FD) + if (ch->CH_SOCK_FD != INVALID_FD +# ifdef FD_SETSIZE + && (int)ch->CH_SOCK_FD < FD_SETSIZE +# endif + ) { FD_SET(ch->CH_SOCK_FD, &rfds); if (maxfd < (int)ch->CH_SOCK_FD) @@ -903,6 +921,9 @@ socketserver_wait(channel_T *channel, int timeout) FOR_ALL_CLIENTS(ch) if (ch->CH_SOCK_FD != INVALID_FD +# ifdef FD_SETSIZE + && (int)ch->CH_SOCK_FD < FD_SETSIZE +# endif && FD_ISSET(ch->CH_SOCK_FD, &rfds)) channel_check(ch, PART_SOCK); @@ -920,7 +941,7 @@ socketserver_wait(channel_T *channel, int timeout) continue; } # else - struct pollfd fds[MAX_OPEN_CHANNELS + 1]; + struct pollfd fds[MAX_OPEN_CHANNELS + 1 + MAX_CLIENT_CHANNELS]; int nfd = 0; int channel_idx = -1; int server_idx = -1; diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index 3c39d01c24..d5c243fda6 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -373,6 +373,60 @@ func Test_client_server_socketserver_address() endtry endfunc +" A flood of client connections must not crash the socketserver: connections +" beyond the accept cap are refused instead of overflowing the fd_set / pollfd +" sets, and the server keeps working once they are closed again. +func Test_client_server_socketserver_connection_flood() + CheckFeature socketserver + CheckNotMSWindows + + let g:test_is_flaky = 1 + let cmd = GetVimCommand() + if cmd == '' + throw 'GetVimCommand() failed' + endif + + let actual = cmd .. ' --clientserver socket --servername channel:2001' + let job = job_start(actual, {'stoponexit': 'kill', 'out_io': 'null'}) + call WaitForAssert({-> assert_equal("run", job_status(job))}) + call WaitForAssert({-> assert_match('channel:2001', + \ system(actual .. ' --remote-expr "v:servername"'))}) + + " Open many more connections than the server accepts. + let channels = [] + for i in range(150) + let ch = ch_open('localhost:2001', {'mode': 'raw', 'waittime': 100}) + if ch_status(ch) == 'open' + call add(channels, ch) + endif + endfor + + " The server must survive, and must have refused the excess connections. + call assert_equal("run", job_status(job)) + call WaitForAssert({-> assert_inrange(1, 100, + \ len(filter(copy(channels), {_, c -> ch_status(c) == 'open'})))}) + + " Close them again. Afterwards the server must accept connections once + " more, which also verifies the client count is decremented. + for ch in channels + if ch_status(ch) == 'open' + call ch_close(ch) + endif + endfor + call WaitForAssert({-> assert_match('channel:2001', + \ system(actual .. ' --remote-expr "v:servername"'))}) + + call system(actual .. " --remote-expr 'execute(\"qa!\")'") + try + call WaitForAssert({-> assert_equal("dead", job_status(job))}) + finally + if job_status(job) != 'dead' + call assert_report('Server did not exit') + call job_stop(job, 'kill') + endif + endtry +endfunc + " Test if --remote-wait works properly with multiple files func Test_client_server_multiple_remote_wait() CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index 9afff74b32..a5cca3061b 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 842, /**/ 841, /**/ diff --git a/src/vim.h b/src/vim.h index c04e5f389c..408cf711d1 100644 --- a/src/vim.h +++ b/src/vim.h @@ -2904,6 +2904,15 @@ typedef int (*opt_expand_cb_T)(optexpand_T *args, int *numMatches, char_u ***mat # define MAX_OPEN_CHANNELS 0 #endif +// Maximum number of simultaneously accepted socketserver client channels. +// Bounds the channels (and file descriptors) added to the select()/poll() +// sets so a connection flood cannot overflow the fd_set / pollfd arrays. +#ifdef FEAT_SOCKETSERVER +# define MAX_CLIENT_CHANNELS 100 +#else +# define MAX_CLIENT_CHANNELS 0 +#endif + #if defined(MSWIN) # define MAX_NAMED_PIPE_SIZE 65535 #endif From 975e191dc817d8d00abca7197c4529a417c2f805 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 22 Jul 2026 14:51:00 +0900 Subject: [PATCH 187/647] patch 9.2.0843: [security]: popup: opacity mask indexed out of bounds Problem: [security]: A "clipwindow" popup with "opacity" anchored to a text property can keep a negative window row when the anchor scrolls above the top of the host window. The opacity mask loop then indexes the screen array before its start, causing an out-of-bounds read and a conditional out-of-bounds write (tdjackey). Solution: Keep the popup window row at the first visible row and record the clipped-off top rows only in the top offset, so no consumer has to clamp the row and the opacity mask loop stays in bounds (Hirohito Higashi). Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-pmvp-6rcj-98p4 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 30 +++++++++++++----------------- src/testdir/test_popupwin.vim | 31 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/popupwin.c b/src/popupwin.c index 0acb7453df..293305ed92 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -2313,10 +2313,8 @@ popup_apply_winupdate_clip(win_T *wp, popup_clip_T *cl) if (wp->w_height < 0) wp->w_height = 0; if (cl->clip_top_content > 0) - { + // w_winrow already points at the first visible row. wp->w_topline += cl->clip_top_content; - wp->w_winrow += cl->clip_top_content; - } } if (wp->w_popup_leftclip > 0 || wp->w_popup_rightclip > 0) { @@ -2982,6 +2980,10 @@ popup_adjust_position(win_T *wp) return; } + // Make w_winrow the first visible screen row (>= 0); the clipped-off top + // rows are recorded in w_popup_topoff. + wp->w_winrow += wp->w_popup_topoff; + #ifdef FEAT_IMAGE_SIXEL // Final winrow is now known: encode (or re-encode) the sixel image so it // fits within the screen and does not trigger sixel-scroll on terminals. @@ -6120,8 +6122,11 @@ popup_mark_opacity_zindex(win_T *wp) width = popup_width(wp); height = popup_height(wp); + // w_winrow/w_wincol are visible cells (>= 0); w_popup_topoff rows are + // clipped off the top. for (r = wp->w_winrow; - r < wp->w_winrow + height && r < screen_Rows; ++r) + r < wp->w_winrow + height - wp->w_popup_topoff + && r < screen_Rows; ++r) for (c = wp->w_wincol; c < wp->w_wincol + width - wp->w_popup_leftoff && c < screen_Columns; ++c) @@ -6417,7 +6422,7 @@ may_update_popup_mask(int type) continue; { - int mask_start = wp->w_winrow + wp->w_popup_topoff; + int mask_start = wp->w_winrow; int mask_end = mask_start + height; int mask_col_start = wp->w_wincol + wp->w_popup_leftclip; int mask_col_end = wp->w_wincol + width - wp->w_popup_leftoff @@ -7453,7 +7458,8 @@ update_popups(void (*win_update)(win_T *wp)) - wp->w_popup_leftoff; if (wp->w_wincol + left_extra < 0) left_extra = -wp->w_wincol; - wp->w_winrow += top_off; + // Move to the content top, skipping any clipped top border/padding. + wp->w_winrow += MAX(top_off - wp->w_popup_topoff, 0); wp->w_wincol += left_extra; // Draw the popup text, unless it's off screen. @@ -7486,15 +7492,9 @@ update_popups(void (*win_update)(win_T *wp)) wp->w_cursor.lnum = wp->w_botline - 1; } - wp->w_winrow -= top_off; + wp->w_winrow -= MAX(top_off - wp->w_popup_topoff, 0); wp->w_wincol -= left_extra; - // "clipwindow" with top-clip shifts all popup decorations down so the - // first visible row of the popup lands at the host window's top edge. - // Apply the shift before drawing borders/padding/etc. and restore at - // the end of this popup's iteration. - wp->w_winrow += wp->w_popup_topoff; - // Add offset for border and padding if not done already. if ((wp->w_flags & WFLAG_WCOL_OFF_ADDED) == 0) { @@ -7896,10 +7896,6 @@ update_popups(void (*win_update)(win_T *wp)) if (override_success) pop_highlight_overrides(); - // Undo the topoff shift applied before drawing the borders so the - // next iteration sees the popup's logical winrow. - wp->w_winrow -= wp->w_popup_topoff; - #ifdef FEAT_IMAGE // Emit the popup image right after this popup's decorations land in // ScreenLines. Popups are walked in zindex order, so a higher diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 364a50fe02..6aed7be3ec 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -4685,6 +4685,37 @@ func Test_popup_clipwindow_hide_when_prop_off_screen() call prop_type_delete('clipprop') endfunc +func Test_popup_clipwindow_opacity_negative_winrow() + " A "clipwindow" popup with "opacity" whose textprop anchor scrolls above + " the window top must not index the opacity mask out of bounds. + call prop_type_add('clipprop', {}) + new + call setline(1, range(1, 200)->mapnew({_, v -> 'line ' .. v})) + call prop_add(5, 1, #{type: 'clipprop', length: 5}) + let host = win_getid() + + let id = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], #{ + \ textprop: 'clipprop', + \ textpropwin: host, + \ wrap: v:false, + \ fixed: v:true, + \ clipwindow: v:true, + \ opacity: 50, + \ }) + call assert_true(id > 0) + redraw + + " Scroll so the prop (line 5) sits a couple of lines above the top, so the + " popup is clipped at the host window's top edge. + call win_execute(host, 'normal! 8Gzt') + redraw + redraw + + call popup_close(id) + bwipe! + call prop_type_delete('clipprop') +endfunc + func Test_popup_clipwindow_top_clip() CheckScreendump diff --git a/src/version.c b/src/version.c index a5cca3061b..a9bcdc88ec 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 843, /**/ 842, /**/ From f8126294a526aa80c5123eb3079e325daee9ec75 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Thu, 16 Jul 2026 18:39:24 +0900 Subject: [PATCH 188/647] patch 9.2.0844: [security]: use-after-free on json decode error Problem: [security]: use-after-free on json decode error (@tdjackey) Solution: Report the position from the current reader (Matsumoto Yasuhiro) json_decode_item() caches "p" into js_buf, but json_decode_string() can refill via channel_fill(), which frees the old js_buf. When the string parse then fails (e.g. an invalid \u escape), the shared error path passed the now-dangling "p" to semsg(), a heap use-after-free read reachable pre-auth through the socketserver. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-69ch-22ch-r887 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/json.c | 4 ++- src/testdir/test_clientserver.vim | 53 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/json.c b/src/json.c index b9cbc0d594..fb7755d0fb 100644 --- a/src/json.c +++ b/src/json.c @@ -1431,7 +1431,9 @@ json_decode_item(js_read_T *reader, typval_T *res, int options) res->v_type = VAR_SPECIAL; res->vval.v_number = VVAL_NONE; } - semsg(_(e_json_decode_error_at_str), p); + // "p" may dangle into a buffer freed by a js_fill() refill in + // json_decode_string(); report the position from the current reader. + semsg(_(e_json_decode_error_at_str), reader->js_buf + reader->js_used); theend: for (i = 0; i < stack.ga_len; i++) diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index d5c243fda6..8fa204ea5f 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -427,6 +427,59 @@ func Test_client_server_socketserver_connection_flood() endtry endfunc +" An invalid JSON message that spans two socketserver read buffers must not +" crash the server: the parse buffer is refilled (and freed) mid-string, and +" the error path must not report the position from the stale, freed cursor. +func Test_client_server_socketserver_json_refill() + CheckFeature socketserver + CheckNotMSWindows + + let g:test_is_flaky = 1 + let cmd = GetVimCommand() + if cmd == '' + throw 'GetVimCommand() failed' + endif + + let actual = cmd .. ' --clientserver socket --servername channel:2002' + let job = job_start(actual, {'stoponexit': 'kill', 'out_io': 'null'}) + call WaitForAssert({-> assert_equal("run", job_status(job))}) + call WaitForAssert({-> assert_match('channel:2002', + \ system(actual .. ' --remote-expr "v:servername"'))}) + + let ch = test_null_channel() + for _ in range(50) + let ch = ch_open('127.0.0.1:2002', {'mode': 'raw', 'waittime': 100}) + if ch_status(ch) == 'open' + break + endif + sleep 100m + endfor + call assert_equal('open', ch_status(ch)) + + " The server reads at most MAXMSGSIZE (4096) bytes per read, so a single + " message longer than that is split across two read buffers. Keep the JSON + " string open past the split to force a refill (which frees the first + " buffer), then end in an invalid \u escape so the parse fails. + call ch_sendraw(ch, '{"k":"' .. repeat('A', 4200) .. '\uZZZZ') + sleep 500m + + " The server must survive the invalid message and stay responsive. + call assert_equal("run", job_status(job)) + call assert_match('channel:2002', + \ system(actual .. ' --remote-expr "v:servername"')) + + call ch_close(ch) + call system(actual .. " --remote-expr 'execute(\"qa!\")'") + try + call WaitForAssert({-> assert_equal("dead", job_status(job))}) + finally + if job_status(job) != 'dead' + call assert_report('Server did not exit') + call job_stop(job, 'kill') + endif + endtry +endfunc + " Test if --remote-wait works properly with multiple files func Test_client_server_multiple_remote_wait() CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index a9bcdc88ec..4bd76c0f50 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 844, /**/ 843, /**/ From 2f628d8104958fa7421664f792ca6d4f7a39a10f Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Fri, 17 Jul 2026 09:11:42 +0900 Subject: [PATCH 189/647] patch 9.2.0845: [security]: arbitrary Ex command execution during C omni-completion Problem: [security]: arbitrary Ex command execution during C omni-completion (Threonine) Solution: Match tags typeref literally to block Ex command injection (Yasuhiro Matsumoto). Escaping only "/" and "\" left the typeref able to break out of the :vimgrep pattern without a "/": an unclosed "[" makes vimgrep's pattern skipping fail, and the parser then treats a following "|" as a command separator, so the tag value runs as Ex commands during C omni-completion. Match the field literally with \V so no regex metacharacter can affect pattern parsing. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-cx73-phcg-3j5g Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- runtime/autoload/ccomplete.vim | 5 ++++- src/testdir/test_plugin_ccomplete.vim | 26 ++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim index dc3388b524..593789a84f 100644 --- a/runtime/autoload/ccomplete.vim +++ b/runtime/autoload/ccomplete.vim @@ -599,8 +599,11 @@ def StructMembers( # {{{1 if complete_check() return [] endif + # Match "typename" literally (\V): escaping alone is not enough, as e.g. + # an unclosed "[" makes vimgrep's pattern skipping fail and the rest of + # the tag value is then parsed as Ex commands. execute 'silent! keepjumps noautocmd ' - .. n .. 'vimgrep ' .. '/\t' .. escape(typename, '/\') .. '\(\t\|$\)/j ' + .. n .. 'vimgrep ' .. '/\t\V' .. escape(typename, '/\') .. '\m\(\t\|$\)/j ' .. fnames qflist = getqflist() diff --git a/src/testdir/test_plugin_ccomplete.vim b/src/testdir/test_plugin_ccomplete.vim index a635bd50bd..c1754d17c1 100644 --- a/src/testdir/test_plugin_ccomplete.vim +++ b/src/testdir/test_plugin_ccomplete.vim @@ -31,6 +31,32 @@ func Test_ccomplete_no_exec_via_typeref() unlet! g:ccomplete_injected endfunc +" Escaping "/" and "\" is not enough: with no "/" in the payload, an unclosed +" "[" makes vimgrep's pattern skipping fail, and the command parser then treats +" the first "|" as a command separator. The typeref must be matched literally. +func Test_ccomplete_no_exec_via_typeref_bracket() + CheckUnix + let sentinel = tempname() + call delete(sentinel) + let tagsfile = s:WriteTags([ + \ "myvar\tmain.c\t/^x$/;\"\tv\ttyperef:struct:[|call system('touch " .. sentinel .. "')|####", + \ ]) + + let save_tags = &tags + let &tags = tagsfile + + new + call ccomplete#Complete(1, '') + call ccomplete#Complete(0, 'myvar.x') + + call assert_false(filereadable(sentinel), + \ 'typeref field was executed as an Ex command during omni-completion') + + bwipe! + let &tags = save_tags + call delete(sentinel) +endfunc + " A legitimate typeref must still drive struct-member completion: escaping the " field value must not break the normal path. func Test_ccomplete_typeref_completion_still_works() diff --git a/src/version.c b/src/version.c index 4bd76c0f50..a93ef03842 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 845, /**/ 844, /**/ From 05c41c922309c7a11b6ec2f124be66551c90d66a Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Fri, 24 Jul 2026 00:58:37 +0900 Subject: [PATCH 190/647] patch 9.2.0846: [security]: heap buffer overflow in set_sofo() Problem: [security]: heap buffer overflow in set_sofo() (Yazan Balawneh) Solution: Reset sl_sal_first (Yasuhiro Matsumoto). A crafted spell file with an empty SN_SAL section before an SN_SOFO section reaches set_sofo() with sl_sal_first[] already set to -1 by set_sal_first(). The counting loop then under-counts colliding multi-byte "from" characters, allocates an undersized list and writes past its end. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-9jqx-hgpr-6v64 Signed-off-by: Yasuhiro Matsumoto Signed-off-by: Christian Brabandt --- src/spellfile.c | 4 +++- src/testdir/test_spellfile.vim | 5 +++++ src/version.c | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/spellfile.c b/src/spellfile.c index 8000cdb550..e90c89b73d 100644 --- a/src/spellfile.c +++ b/src/spellfile.c @@ -1434,7 +1434,9 @@ set_sofo(slang_T *lp, char_u *from, char_u *to) lp->sl_sofo = TRUE; // First count the number of items for each list. Temporarily use - // sl_sal_first[] for this. + // sl_sal_first[] for this. Reset it first: a preceding SN_SAL section + // may have set the entries to -1 via set_sal_first(). + vim_memset(lp->sl_sal_first, 0, sizeof(salfirst_T) * 256); for (p = from, s = to; *p != NUL && *s != NUL; ) { c = mb_cptr2char_adv(&p); diff --git a/src/testdir/test_spellfile.vim b/src/testdir/test_spellfile.vim index fa3fb14fd8..b8e710eb64 100644 --- a/src/testdir/test_spellfile.vim +++ b/src/testdir/test_spellfile.vim @@ -319,6 +319,11 @@ func Test_spellfile_format_error() " SN_SOFO: multi-byte characters in sofofrom and sofoto call Spellfile_Test(0z0600000000080002CF810002CF82FF000000000000000000000000, '') + " SN_SAL (empty) followed by SN_SOFO with two multi-byte 'from' characters + " sharing the same low byte. A preceding SN_SAL poisons sl_sal_first[], so + " without a reset set_sofo() under-counts and writes out of bounds. + call Spellfile_Test(0z05000000000300000006000000000A0004CAABCEAB00024142FF000000000000000000000000, '') + " SN_COMPOUND: compmax is less than 2 call Spellfile_Test(0z08000000000101, 'E759:') diff --git a/src/version.c b/src/version.c index a93ef03842..5547cf4d52 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 846, /**/ 845, /**/ From 581a2f3ac9c6f96a26324f6b2c8c11415fd0d452 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 24 Jul 2026 17:43:51 +0200 Subject: [PATCH 191/647] patch 9.2.0847: [security]: vimball: code execution via .VimballRecord file Problem: [security]: vimball: code execution via .VimballRecord file (tdjackey) Solution: Forbid arbitrary commands, fix broken directory deletion code, refactor code Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-r22p-fhw4-84p2 Signed-off-by: Christian Brabandt --- runtime/autoload/vimball.vim | 52 ++++++++++++++++++++--------- src/testdir/test_plugin_vimball.vim | 16 ++++++++- src/version.c | 2 ++ 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/runtime/autoload/vimball.vim b/runtime/autoload/vimball.vim index a1b2e7ffce..d4ea66cd1e 100644 --- a/runtime/autoload/vimball.vim +++ b/runtime/autoload/vimball.vim @@ -1,7 +1,7 @@ " vimball.vim : construct a file containing both paths and files " Maintainer: This runtime file is looking for a new maintainer. " Original Author: Charles E. Campbell -" Date: Jun 29, 2026 +" Date: Jul 23, 2026 " Version: 37 (with modifications from the Vim Project) " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim " Copyright: (c) 2004-2011 by Charles E. Campbell @@ -16,9 +16,9 @@ if &cp || exists("g:loaded_vimball") finish endif let g:loaded_vimball = "v37" -if v:version < 704 +if v:version < 900 echohl WarningMsg - echo "***warning*** this version of vimball needs vim 7.4" + echo "***warning*** this version of vimball needs vim 9.0" echohl Normal finish endif @@ -245,6 +245,12 @@ fun! vimball#Vimball(really,...) bw! Vimball call s:ChgDir(curdir) return + elseif fname =~? '\%(^\|/\)\.VimballRecord$' + echomsg "(Vimball) Forbidding .VimballRecord filename, aborting..." + exe "tabn ".curtabnr + bw! Vimball + call s:ChgDir(curdir) + return endif if a:really @@ -272,7 +278,7 @@ fun! vimball#Vimball(really,...) let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','') if !isdirectory(dirname) call mkdir(dirname) - call s:RecordInVar(home,"rmdir('".dirname."')") + call s:RecordDirInVar(dirname) endif endwhile endif @@ -303,7 +309,7 @@ fun! vimball#Vimball(really,...) exe "silent w! ".fnameescape(fnamepath) endif echo "wrote ".fnameescape(fnamepath) - call s:RecordInVar(home,"call delete('".escape(fnamepath, '"''|')."')") + call s:RecordInVar(fnamepath) endif " return to tab with vimball @@ -402,10 +408,17 @@ fun! vimball#RmVimball(...) endif let s:VBRstring= substitute(exestring,'call delete(','','g') let s:VBRstring= substitute(s:VBRstring,"[')]",'','g') - sil! keepalt keepjumps exe exestring + let nr_files= 0 + for line in split(exestring, '|') + if line !~ '^call delete(''[^'']\{-}''\(,"d"\)\?)$' + echomsg "ignoring .VimballRecord entry: " line + else + sil! keepalt keepjumps exe line + let nr_files+= 1 + endif + endfor sil! keepalt keepjumps d - let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g")) - echomsg "removed ".exestring." files" + echomsg "removed ".nr_files." files" else let s:VBRstring= '' let curfile = substitute(curfile,'\.vmb','','') @@ -547,13 +560,20 @@ fun! s:ChgDir(newdir) endfun " --------------------------------------------------------------------- -" s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2 -fun! s:RecordInVar(home,cmd) +" s:RecordInVar: record a un-vimball file deletion in the .VimballRecord file {{{2 +fun! s:RecordInVar(file) if !exists("s:recordfile") - let s:recordfile= a:cmd - else - let s:recordfile= s:recordfile."|".a:cmd + let s:recordfile=[] + endif + call add(s:recordfile, $'call delete({string(a:file)})') +endfun + +" s:RecordDirInVar: record a un-vimball dir deletion in the .VimballRecord file {{{2 +fun! s:RecordDirInVar(dir) + if !exists("s:recorddir") + let s:recorddir = [] endif + call add(s:recorddir, $'call delete({string(a:dir)},"d")') endfun " --------------------------------------------------------------------- @@ -574,11 +594,11 @@ fun! s:RecordInFile(home) setlocal ma $ if exists("s:recordfile") && exists("s:recorddir") - let cmd= cmd.s:recordfile."|".s:recorddir + let cmd= cmd.join(s:recordfile, '|')."|".join(s:recorddir, '|') elseif exists("s:recorddir") - let cmd= cmd.s:recorddir + let cmd= cmd.join(s:recorddir, '|') elseif exists("s:recordfile") - let cmd= cmd.s:recordfile + let cmd= cmd.join(s:recordfile, '|') else return endif diff --git a/src/testdir/test_plugin_vimball.vim b/src/testdir/test_plugin_vimball.vim index 30093ef719..156b4c8433 100644 --- a/src/testdir/test_plugin_vimball.vim +++ b/src/testdir/test_plugin_vimball.vim @@ -65,7 +65,7 @@ func Test_vimball_basic() call assert_true(filereadable('.VimballRecord')) let record = readfile('.VimballRecord') call assert_equal(1, record->len()) - call assert_match('^Xtest.vmb: rmdir.*call delete(', record[0]) + call assert_match('^Xtest.vmb: call delete(''.\{-}'')|call delete(''.\{-}'',"d")$', record[0]) call s:teardown() endfunc @@ -110,3 +110,17 @@ func Test_vimball_evil_filenames() call assert_match('(Vimball) Forbidding strange filename:.* aborting\.\.\.', mess) call s:teardown() endfunc + +func Test_vimball_VimballRecord_filenames() + call s:Mkvimball() + call delete('XVimball', 'rf') + sp Xtest.vmb + 4s#.*\ze\t#.VimballRecord# + so % + call feedkeys("\", "it") + + let mess = execute(':mess')->split('\n')[-1] + call assert_match('(Vimball) Forbidding .VimballRecord filename.* aborting\.\.\.', mess) + call assert_false(filereadable('.VimballRecord')) + call s:teardown() +endfunc diff --git a/src/version.c b/src/version.c index 5547cf4d52..a0b96e2ebb 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 847, /**/ 846, /**/ From e9234b9b4ae658d1de4a3f785a2aac531d77f903 Mon Sep 17 00:00:00 2001 From: Billie Cleek Date: Fri, 24 Jul 2026 19:43:04 +0000 Subject: [PATCH 192/647] runtime(go): update Go syntax file Update the Go syntax file with some recent changes made to vim-go to correctly highlight the second and later lines of concatenated strings in var or const blocks. closes: #20835 Signed-off-by: Billie Cleek Signed-off-by: Christian Brabandt --- runtime/syntax/go.vim | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/runtime/syntax/go.vim b/runtime/syntax/go.vim index feed9646fb..35d0cfd754 100644 --- a/runtime/syntax/go.vim +++ b/runtime/syntax/go.vim @@ -5,8 +5,7 @@ " go.vim: Vim syntax file for Go. " Language: Go " Maintainer: Billie Cleek -" Latest Revision: 2024-04-13 -" 2024-03-17: - fix goPackageComment highlight (by Vim Project) +" Latest Revision: 2026-07-24 " License: BSD-style. See LICENSE file in source repository. " Repository: https://github.com/fatih/vim-go @@ -191,7 +190,7 @@ else syn region goRawString start=+`+ end=+`+ endif -syn match goImportString /^\%(\s\+\|import \)\(\h\w* \)\?\zs"[^"]\+"/ contained containedin=goImport +syn match goImportString /^\%(\s\+\|import \)\(\h\w* \)\?\zs"[^"\\]\+"/ contained containedin=goImport if s:HighlightFormatStrings() " [n] notation is valid for specifying explicit argument indexes @@ -240,20 +239,20 @@ 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,goImport,goImportString,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,goImport,goImportString,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,goImport,goImportString,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,goImport,goImportString,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator syn match goConst /const ()/ transparent \ contains=goConst endif From e298a5735310bfa976bc0f10fae358f1d07408fd Mon Sep 17 00:00:00 2001 From: Andrey Starodoubtsev Date: Fri, 24 Jul 2026 20:00:13 +0000 Subject: [PATCH 193/647] runtime(iar): Add iar compiler plugin closes: #20830 Signed-off-by: Andrey Starodoubtsev Signed-off-by: Christian Brabandt --- runtime/compiler/iar.vim | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 runtime/compiler/iar.vim diff --git a/runtime/compiler/iar.vim b/runtime/compiler/iar.vim new file mode 100644 index 0000000000..cd479b1038 --- /dev/null +++ b/runtime/compiler/iar.vim @@ -0,0 +1,32 @@ +" Vim compiler file +" Compiler: IAR Systems C/C++ Compiler + +if exists("current_compiler") + finish +endif +let current_compiler = "iar" + +let s:cpo_save = &cpo +set cpo&vim + +" abc; +" ^ +" "/tmp/test.c",3 Error[Pe077]: this +" declaration has no storage class or type specifier + +" Error[Li005]: no definition for "Foo::Foo(unsigned shor +" t, unsigned short, unsigned int, char const *)" +" [referenced from Bar.o(libBar.a)] + +CompilerSet errorformat= + \%A\ \ %p^, + \%C\"%f\"\\\,%l\ \ Remark[%*[^]]]:\ %m, + \%C\"%f\"\\\,%l\ \ %tarning[%*[^]]]:\ %m, + \%C\"%f\"\\\,%l\ \ %trror[%*[^]]]:\ %m, + \%C\"%f\"\\\,%l\ \ Fatal\ %trror[%*[^]]]:\ %m, + \%EInternal\ error:\ %m, + \%EError[%*[^]]]:\ %m, + \%C%\\s%\\+%m, + +let &cpo = s:cpo_save +unlet s:cpo_save From 86adef19fc2f1d59a38f3ba978ce33f0b4329c0f Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 24 Jul 2026 20:04:21 +0000 Subject: [PATCH 194/647] patch 9.2.0848: tagfunc "cmd" with a generic Ex command corrupts the tag entry Problem: When a tagfunc returns a "cmd" that is neither a line number nor a search pattern, the tag entry is corrupted: the "kind" field is lost and taglist() returns a mangled "cmd". Solution: Accept any Ex command in "cmd" as in a tags file, terminate a generic command with a bar so the trailing fields are preserved, and reject a value that cannot be stored in a tag line with E987 (Hirohito Higashi). fixes: #20781 related: #20790 closes: #20828 Co-Authored-By: Claude Opus 4.8 (1M context) Co-Authored-By: Mao-Yining Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/tagsrch.txt | 8 +++- src/tag.c | 53 +++++++++++++++++++++++- src/testdir/test_tagfunc.vim | 80 ++++++++++++++++++++++++++++++++++++ src/version.c | 2 + 4 files changed, 139 insertions(+), 4 deletions(-) diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt index e381d5fc08..2615cef9e2 100644 --- a/runtime/doc/tagsrch.txt +++ b/runtime/doc/tagsrch.txt @@ -1,4 +1,4 @@ -*tagsrch.txt* For Vim version 9.2. Last change: 2026 May 31 +*tagsrch.txt* For Vim version 9.2. Last change: 2026 Jul 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -936,7 +936,11 @@ include the following entries and each value must be a string: either relative to the current directory or a full path. cmd Ex command used to locate the tag in the file. This - can be either an Ex search pattern or a line number. + can be a line number, a search pattern or any other + Ex command, like in a tags file (see + |tags-file-format|). A search pattern must start and + end with "/" or "?". An invalid value results in + |E987|. Note that the format is similar to that of |taglist()|, which makes it possible to use its output to generate the result. The following fields are optional: diff --git a/src/tag.c b/src/tag.c index 96afc699b4..98b98897fc 100644 --- a/src/tag.c +++ b/src/tag.c @@ -1425,6 +1425,38 @@ prepare_pats(pat_T *pats, int has_re) } #ifdef FEAT_EVAL +// Classification of a "cmd" value returned by a tagfunc. +typedef enum { + TAGCMD_INVALID, // cannot be stored in a tag line + TAGCMD_ADDRESS, // line number or /pat/ or ?pat? (no "|" needed) + TAGCMD_GENERIC // any other Ex command: needs a "|" terminator +} tagcmd_T; + +/* + * Classify "cmd" from a tagfunc result (see tagcmd_T), like a tags file + * address, to decide whether a "|" terminator must be appended before storing + * it in a tag line. + */ + static tagcmd_T +tagfunc_cmd_kind(char_u *cmd) +{ + if (VIM_ISDIGIT(*cmd)) + return *skipdigits(cmd) == NUL ? TAGCMD_ADDRESS : TAGCMD_INVALID; + if (*cmd == '/' || *cmd == '?') + { + // A Tab inside the pattern is fine (Universal Ctags emits one for a + // tab-indented line); only trailing content after the closing + // delimiter, which would break the tag line fields, is rejected. + char_u *end = skip_regexp(cmd + 1, *cmd, FALSE); + + return (*end == *cmd && end[1] == NUL) + ? TAGCMD_ADDRESS : TAGCMD_INVALID; + } + if (vim_strpbrk(cmd, (char_u *)"\t\r\n") != NULL) + return TAGCMD_INVALID; + return TAGCMD_GENERIC; +} + /* * Call the user-defined function to generate a list of tags used by * find_tags(). @@ -1570,6 +1602,15 @@ find_tagfunc_tags( break; } + tagcmd_T cmdkind = tagfunc_cmd_kind(res_cmd); + if (cmdkind == TAGCMD_INVALID) + { + emsg(_(e_invalid_return_value_from_tagfunc)); + break; + } + if (cmdkind == TAGCMD_GENERIC) + len += 3; // need space for "|;\"" + if (name_only) mfp = vim_strsave(res_name); else @@ -1599,7 +1640,10 @@ find_tagfunc_tags( STRCPY(p, res_cmd); p += STRLEN(p); - if (has_extra) + if (cmdkind == TAGCMD_GENERIC) + *p++ = '|'; // terminate the command + + if (cmdkind == TAGCMD_GENERIC || has_extra) { STRCPY(p, ";\""); p += STRLEN(p); @@ -3781,7 +3825,12 @@ jumpto_tag( str++; if (find_extra(&str) == OK) { - pbuf_end = str; + // Drop a trailing "|" that terminates a generic Ex command, so it + // is not executed as an empty command separator. + if (str > pbuf && str[-1] == '|') + pbuf_end = str - 1; + else + pbuf_end = str; *pbuf_end = NUL; } } diff --git a/src/testdir/test_tagfunc.vim b/src/testdir/test_tagfunc.vim index 4ce9d2164b..4427839be8 100644 --- a/src/testdir/test_tagfunc.vim +++ b/src/testdir/test_tagfunc.vim @@ -456,4 +456,84 @@ func Test_tagfunc_deletes_lines() set tagfunc= endfunc +" The 'cmd' field can be a line number, a search pattern or any other Ex +" command, like in a tags file. A value that would break the tag line (an +" unterminated pattern, trailing junk, or a outside a pattern) is +" rejected with E987 instead of silently corrupting the result. +func Test_tagfunc_invalid_cmd() + func InvalidCmd(pat, flags, info) + return [{'name': 'a', 'filename': 'Xtest', 'cmd': a:pat, 'kind': 'f'}] + endfunc + set tagfunc=InvalidCmd + + " unterminated search pattern + call assert_fails("call taglist('/foo')", 'E987:') + " trailing content after the closing delimiter of a pattern + call assert_fails('call taglist("/foo/\tbar")', 'E987:') + " a line number with trailing junk + call assert_fails("call taglist('3G5')", 'E987:') + " a in a generic command would break the tag line fields + call assert_fails('call taglist("call\tcursor(3, 5)")', 'E987:') + + " valid forms are accepted and returned unchanged: line number, delimited + " patterns, and a Tab inside a pattern (Universal Ctags emits one like this + " for a tab-indented line) + call assert_equal('42', taglist('42')[0].cmd) + call assert_equal('/foo/', taglist('/foo/')[0].cmd) + call assert_equal('?foo?', taglist('?foo?')[0].cmd) + call assert_equal("/^\tint foo$/", taglist("/^\tint foo$/")[0].cmd) + + " a generic command round-trips with its kind field intact: before the fix + " it swallowed the ';"kind' part, so kind came back empty (#20781) + let t = taglist('call cursor(3, 5)')[0] + call assert_equal('call cursor(3, 5)', t.cmd) + call assert_equal('f', t.kind) + + set tagfunc& + delfunc InvalidCmd +endfunc + +" A tagfunc 'cmd' is executed on a tag jump. A search pattern must reach the +" matched column (no regression from the do_search() path), and a line number +" or a generic Ex command must position the cursor as written. +func Test_tagfunc_cmd_jump() + call writefile(['line one', 'line two', 'foo bar baz'], 'Xtagcmd', 'D') + func JumpCmd(pat, flags, info) + return [{'name': 'a', 'filename': 'Xtagcmd', 'cmd': s:cmd, 'kind': 'f'}] + endfunc + set tagfunc=JumpCmd + + " '5|' / cursor col 5 / the 'b' of 'bar' all land on [3, 5] + for cmd in ['/bar/', 'call cursor(3, 5)', 'normal! 3G5|'] + let s:cmd = cmd + enew + tag a + call assert_equal([3, 5], [line('.'), col('.')], 'cmd: ' .. cmd) + bw! + endfor + + set tagfunc& + delfunc JumpCmd +endfunc + +" A generic Ex command from a tagfunc runs under 'secure' and the sandbox, just +" like one from a tags file, so it cannot delete a file or run a shell. +func Test_tagfunc_cmd_secure() + call writefile(['one', 'two', 'three'], 'Xtagcmd', 'D') + call writefile(['keep me'], 'Xvictim', 'D') + func EvilTagFunc(pat, flags, info) + return [{'name': 'a', 'filename': 'Xtagcmd', + \ 'cmd': "call delete('Xvictim')", 'kind': 'f'}] + endfunc + set tagfunc=EvilTagFunc + + enew + call assert_fails('tag a', 'E12:') + call assert_true(filereadable('Xvictim')) + + bw! + set tagfunc& + delfunc EvilTagFunc +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a0b96e2ebb..2cf1ab9425 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 848, /**/ 847, /**/ From ea183ce4e5fb82d389e71f5de8f7564ee399d49c Mon Sep 17 00:00:00 2001 From: Fionn Fitzmaurice Date: Fri, 24 Jul 2026 20:11:25 +0000 Subject: [PATCH 195/647] patch 9.2.0849: filetype: osquery config files are not recognized Problem: filetype: osquery config files are not recognized. Solution: Detect osquery.conf as jsonc filetype (Fionn Fitzmaurice). Reference: https://osquery.readthedocs.io/en/stable/deployment/configuration/#configuration-components closes: #20826 Signed-off-by: Fionn Fitzmaurice Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 4 +++- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 25414c490c..5b4264aeb4 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 22 +# Last Change: 2026 Jul 24 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -3315,6 +3315,8 @@ const ft_from_name = { ".swcrc": "json", "composer.lock": "json", "symfony.lock": "json", + # osquery configuration + "osquery.conf": "jsonc", # Kconfig "Kconfig": "kconfig", "Kconfig.debug": "kconfig", diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 4c03d5f508..075430ae54 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -429,7 +429,7 @@ def s:GetFilenameChecks(): dict> '.prettierrc', '.firebaserc', '.stylelintrc', '.lintstagedrc', 'file.slnf', 'file.sublime-project', 'file.sublime-settings', 'file.sublime-workspace', 'file.bd', 'file.bda', 'file.xci', 'flake.lock', 'pack.mcmeta', 'deno.lock', '.swcrc', 'composer.lock', 'symfony.lock'], json5: ['file.json5'], - jsonc: ['file.jsonc', '.babelrc', '.eslintrc', '.jsfmtrc', '.jshintrc', '.jscsrc', '.vsconfig', '.hintrc', '.swrc', 'jsconfig.json', 'tsconfig.json', 'tsconfig.test.json', 'tsconfig-test.json', '.luaurc', 'bun.lock', expand("$HOME/.config/VSCodium/User/settings.json"), '/home/user/.config/waybar/config' ], + jsonc: ['file.jsonc', '.babelrc', '.eslintrc', '.jsfmtrc', '.jshintrc', '.jscsrc', '.vsconfig', '.hintrc', '.swrc', 'jsconfig.json', 'osquery.conf', 'tsconfig.json', 'tsconfig.test.json', 'tsconfig-test.json', '.luaurc', 'bun.lock', expand("$HOME/.config/VSCodium/User/settings.json"), '/home/user/.config/waybar/config' ], jsonl: ['file.jsonl'], jsonnet: ['file.jsonnet', 'file.libsonnet'], jsp: ['file.jsp'], diff --git a/src/version.c b/src/version.c index 2cf1ab9425..296346f33f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 849, /**/ 848, /**/ From bf3547849ff1d554dcd58d0f8ec7a3debb6b8427 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 24 Jul 2026 20:20:54 +0000 Subject: [PATCH 196/647] patch 9.2.0850: MS-Windows: commands from a client can be lost Problem: On MS-Windows commands sent by a client in quick succession, e.g. repeated "--remote-tab", can be lost: the files are not all opened (eight) Solution: In the GUI the client message is handled re-entrantly, e.g. while a command line is being read during a redraw. Inserting the received keys into the typeahead buffer then corrupts it. Postpone inserting the keys until a safe point where the typeahead buffer is empty (Hirohito Higashi). fixes: #20810 closes: #20816 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_w32.c | 44 +++++++++++++++++++++++++++++++++++++++++++ src/os_mswin.c | 11 ++++++++--- src/proto/gui_w32.pro | 1 + src/version.c | 2 ++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/gui_w32.c b/src/gui_w32.c index 077ca9c1f7..d9dbe65aca 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -2597,6 +2597,46 @@ remove_any_timer(void) } } +#ifdef FEAT_CLIENTSERVER +// A client message may be handled re-entrantly, e.g. during a redraw while a +// command line is being read; inserting the keys into the typeahead buffer +// then corrupts it. Store them here until a safe point. +static garray_T server_pending_ga = {0, 0, 0, 0, NULL}; + +/* + * Store keys received from a client, to be inserted into the typeahead buffer + * later by server_flush_input(). + */ + void +server_add_input(char_u *str) +{ + if (server_pending_ga.ga_data == NULL) + ga_init2(&server_pending_ga, 1, 200); + ga_concat(&server_pending_ga, str); +} + +/* + * Insert postponed keys received from a client, but only when the typeahead + * buffer is empty, so that they are not mixed into a command that is currently + * being read. + */ + static void +server_flush_input(void) +{ + char_u *str; + + if (server_pending_ga.ga_len == 0 || typebuf.tb_len != 0) + return; + str = vim_strnsave(server_pending_ga.ga_data, server_pending_ga.ga_len); + server_pending_ga.ga_len = 0; + if (str != NULL) + { + server_to_input_buf(str); + vim_free(str); + } +} +#endif + /* * GUI input routine called by gui_wait_for_chars(). Waits for a character * from the keyboard. @@ -2655,6 +2695,10 @@ gui_mch_wait_for_chars(int wtime) MSG msg; parse_queued_messages(); +# ifdef FEAT_CLIENTSERVER + // Insert keys from a client that were postponed to this safe point. + server_flush_input(); +# endif # ifdef FEAT_TIMERS if (did_add_timer) break; diff --git a/src/os_mswin.c b/src/os_mswin.c index 6831171cf7..ac26dbc1be 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -2053,10 +2053,15 @@ Messaging_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) // Remember who sent this, for clientWindow = sender; - // Add the received keys to the input buffer. The loop waiting - // for the user to do something should check the input buffer. + // Add the received keys to the input buffer. str = serverConvert(client_enc, (char_u *)data->lpData, &tofree); - server_to_input_buf(str); +# ifdef FEAT_GUI + if (gui.in_use) + // The GUI may get here re-entrantly, so insert the keys later. + server_add_input(str); + else +# endif + server_to_input_buf(str); vim_free(tofree); # ifdef FEAT_GUI diff --git a/src/proto/gui_w32.pro b/src/proto/gui_w32.pro index e6319e90cf..0a1628df30 100644 --- a/src/proto/gui_w32.pro +++ b/src/proto/gui_w32.pro @@ -30,6 +30,7 @@ void gui_mch_iconify(void); void gui_mch_draw_hollow_cursor(guicolor_T color); void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_update(void); +void server_add_input(char_u *str); int gui_mch_wait_for_chars(int wtime); void gui_mch_clear_block(int row1, int col1, int row2, int col2); void gui_mch_free_popup_image(win_T *wp); diff --git a/src/version.c b/src/version.c index 296346f33f..028ab88800 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 850, /**/ 849, /**/ From b0e6baab8e7a1f679d2455c1d7c77e40741bf295 Mon Sep 17 00:00:00 2001 From: qeatzy Date: Fri, 24 Jul 2026 20:28:03 +0000 Subject: [PATCH 197/647] Update .gitignore and .hgignore files Ignore everything below auto/ except for configure fixes: #20814 closes: #20815 Signed-off-by: qeatzy Signed-off-by: Christian Brabandt --- .gitignore | 4 ---- .hgignore | 4 ---- 2 files changed, 8 deletions(-) diff --git a/.gitignore b/.gitignore index 0f0a701c9f..1f16393456 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,6 @@ *.o src/vim src/xxd/xxd -src/auto/if_perl.c -src/auto/gui_gtk_gresources.c -src/auto/gui_gtk_gresources.h -src/auto/os_haiku.rdef src/objects/.dirstamp src/objects src/po/big5corr diff --git a/.hgignore b/.hgignore index 6bed3242e2..5a46897eed 100644 --- a/.hgignore +++ b/.hgignore @@ -8,10 +8,6 @@ syntax: glob *.o src/vim src/xxd/xxd -src/auto/if_perl.c -src/auto/gui_gtk_gresources.c -src/auto/gui_gtk_gresources.h -src/auto/os_haiku.rdef src/objects/.dirstamp src/objects src/po/big5corr From 729c10990ddfe736af2cc04ed7721dd64d4a5a49 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Fri, 24 Jul 2026 20:31:48 +0000 Subject: [PATCH 198/647] patch 9.2.0851: Focus autocommands triggered inconsistently Problem: Focus autocommands triggered inconsistently Solution: Suppress dialog-generated focus events while a dialog is active and on X11 ignore the restoring focus_in_event() from closing a dialog (Christoffer Aasted). closes: #20780 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui.c | 11 ++++++++++- src/gui.h | 8 ++++++++ src/gui_gtk.c | 5 +++++ src/gui_gtk_x11.c | 8 +++++++- src/version.c | 2 ++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/gui.c b/src/gui.c index 3457c88f13..0e1306c868 100644 --- a/src/gui.c +++ b/src/gui.c @@ -485,6 +485,11 @@ gui_init_check(void) result = OK; #else # ifdef FEAT_GUI_GTK + gui.is_x11 = false; +# ifdef FEAT_GUI_DIALOG + gui.dialogs_active = 0; + gui.dialog_focus_pending = 0; +# endif # ifdef GDK_WINDOWING_WAYLAND gui.is_wayland = false; # endif @@ -4905,7 +4910,11 @@ gui_focus_change(int in_focus) // Put events in the input queue only when allowed. // ui_focus_change() isn't called directly, because it invokes // autocommands and that must not happen asynchronously. - if (!hold_gui_events) + if (!hold_gui_events +# if defined(FEAT_GUI_GTK) && defined(FEAT_GUI_DIALOG) + && gui.dialogs_active == 0 +# endif + ) { char_u bytes[3]; diff --git a/src/gui.h b/src/gui.h index aa9f94ec9b..1fadca0f01 100644 --- a/src/gui.h +++ b/src/gui.h @@ -412,6 +412,14 @@ typedef struct Gui char_u *browse_fname; // file name from filedlg guint32 event_time; +# ifdef FEAT_GUI_DIALOG + // Multiple dialogs not allowed, just tracked for future use. + int dialogs_active; // number of active GUI dialogs + + // X11 focus_in_event() by dialogs, ignored to match wayland. + int dialog_focus_pending; +# endif + bool is_x11; // active gdk backend in gtk is x11 # ifdef GDK_WINDOWING_WAYLAND bool is_wayland; // active gdk backend in gtk is wayland # endif diff --git a/src/gui_gtk.c b/src/gui_gtk.c index 13eaf70a73..620480289b 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -1709,6 +1709,10 @@ gui_mch_dialog(int type, // type of dialog int response; DialogInfo dialoginfo; + ++gui.dialogs_active; + if (gui.is_x11) + ++gui.dialog_focus_pending; + dialog = create_message_dialog(type, title, message); dialoginfo.dialog = GTK_DIALOG(dialog); dialog_add_buttons(GTK_DIALOG(dialog), buttons); @@ -1796,6 +1800,7 @@ gui_mch_dialog(int type, // type of dialog gtk_widget_destroy(dialog); } + --gui.dialogs_active; return response > 0 ? response : 0; } diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index b12f4b22c3..098892d5c1 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -1080,7 +1080,12 @@ focus_in_event(GtkWidget *widget, GdkEventFocus *event UNUSED, gpointer data UNUSED) { - gui_focus_change(TRUE); +#ifdef FEAT_GUI_DIALOG + if (gui.is_x11 && gui.dialog_focus_pending > 0) + --gui.dialog_focus_pending; + else +#endif + gui_focus_change(TRUE); if (blink_state == BLINK_NONE) gui_mch_start_blink(); @@ -4136,6 +4141,7 @@ gui_mch_init(void) #if GTK_CHECK_VERSION(3,4,0) if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) { + gui.is_x11 = true; // for X11, if we were using smooth scroll events, we // would get an scroll without deltas on the very first user scroll* and // get both "unsmooth" scroll and smooth scroll events after diff --git a/src/version.c b/src/version.c index 028ab88800..422af5fda4 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 851, /**/ 850, /**/ From e6ea6752b02a9e96436cdc732307840b88b2a1c9 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Fri, 24 Jul 2026 20:51:52 +0000 Subject: [PATCH 199/647] patch 9.2.0852: GTK: ligatures not correctly displayed Problem: GTK: ligatures not correctly displayed (thunderbird-1990) Solution: Split ligatures at cursor location (Foxe Chen). fixes: #12901 closes: #20708 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 2 files changed, 54 insertions(+) diff --git a/src/gui.c b/src/gui.c index 0e1306c868..f3ba3705a9 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1196,6 +1196,9 @@ gui_update_cursor( int cattr; // cursor attributes int attr; attrentry_T *aep = NULL; +#if (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN)) && !defined(USE_GTK4_SNAPSHOT) + bool lig_left = false, lig_right = false; +#endif // Don't update the cursor when halfway busy scrolling or the screen size // doesn't match 'columns' and 'lines. ScreenLines[] isn't valid then. @@ -1375,6 +1378,55 @@ gui_update_cursor( gui_redraw_block(gui.row, gui.col, gui.row, gui.col, GUI_MON_NOCLEAR); // gui_redraw_block() will invalidate the cursor gui.cursor_is_valid = true; +#endif +#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) + // If cursor is in the middle of a ligature, then split the ligature at + // the cursor boundaries by redrawing those cells again. + for (int c = gui.col - 1; c >= 0; c--) + if (!gui.ligatures_map[ScreenLines[LineOffset[gui.row] + c]]) + { + if (c < gui.col - 1) + { + gui_redraw_block(gui.row, c + 1, gui.row, gui.col - 1, + GUI_MON_NOCLEAR); +# ifndef USE_GTK4_SNAPSHOT + lig_left = true; +# endif + } + break; + } + + for (int c = gui.col + 1; c < screen_Columns - 1; c++) + if (!gui.ligatures_map[ScreenLines[LineOffset[gui.row] + c]]) + { + if (c > gui.col + 1) + { + gui_redraw_block(gui.row, gui.col + 1, gui.row, c - 1, + GUI_MON_NOCLEAR); +# ifndef USE_GTK4_SNAPSHOT + lig_right = true; +# endif + } + break; + } + // gui_redraw_block() may invalidate the cursor, make sure to validate + // it again. + gui.cursor_is_valid = true; + +# ifndef USE_GTK4_SNAPSHOT + if ((lig_left || lig_right) && shape->shape != SHAPE_BLOCK) + { + // Because the cursor is not drawn with gui_screenchar(), must blit the + // cell again (with its background), so that old ligature does not + // remain on screen. Not needed for GtkSnapshot, because char beneath is + // always rerendered (see above ifdef). + int old = gui.col; + gui.highlight_mask = ScreenAttrs[LineOffset[gui.row] + gui.col]; + (void)gui_screenchar(LineOffset[gui.row] + gui.col, + GUI_MON_NOCLEAR, (guicolor_T)0, (guicolor_T)0, 0); + gui.col = old; + } +# endif #endif old_hl_mask = gui.highlight_mask; diff --git a/src/version.c b/src/version.c index 422af5fda4..c857374a93 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 852, /**/ 851, /**/ From 2e2747ad5fa3b151884112be51264c20fa19abd7 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Fri, 24 Jul 2026 21:56:37 +0000 Subject: [PATCH 200/647] patch 9.2.0853: popup: popup images do not support scaling Problem: popup: popup images do not support scaling Solution: Add popup scaling support for GTK4 UI (Foxe Chen). closes: #20611 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/cairo.c | 16 ++++++++---- src/gui.c | 3 +++ src/gui.h | 12 +++++++++ src/gui_gtk4.c | 36 ++++++++++++++++++-------- src/gui_gtk4_da.c | 25 ++++++++++-------- src/gui_gtk4_da.h | 2 +- src/gui_gtk_x11.c | 12 +++++++++ src/popupwin.c | 57 +++++++++++++++++++++++++++++++++++++----- src/proto/cairo.pro | 2 +- src/proto/popupwin.pro | 1 + src/version.c | 2 ++ 11 files changed, 135 insertions(+), 33 deletions(-) diff --git a/src/cairo.c b/src/cairo.c index 7543a33d9b..7f1df2b2d0 100644 --- a/src/cairo.c +++ b/src/cairo.c @@ -122,6 +122,7 @@ cairo_popup_image_ensure(win_T *wp) cairo_surface_destroy(surf); return false; } + cairo_surface_set_device_scale(surf, gui.scale, gui.scale); cairo_popup_image_fill_surface(wp, surf); wp->w_popup_image_surface = surf; return true; @@ -163,7 +164,8 @@ cairo_popup_image_free(win_T *wp) * non-zero offsets to crop the portion that falls outside the host window. * Builds the cache on first call. Caller is responsible for scheduling a * redraw of the target's owning widget if needed (e.g. - * gtk_widget_queue_draw_area on GTK). + * gtk_widget_queue_draw_area on GTK). "x" and "y" are assumed to be in logical + * pixels, the rest are in physical pixels. */ void cairo_popup_image_paint( @@ -171,10 +173,10 @@ cairo_popup_image_paint( void *target, int x, int y, - int src_x, - int src_y, - int draw_w, - int draw_h) + double src_x, + double src_y, + double draw_w, + double draw_h) { cairo_t *cr; @@ -184,6 +186,10 @@ cairo_popup_image_paint( return; cairo_surface_t *surface = (cairo_surface_t *)wp->w_popup_image_surface; + src_x = PHY2LOG(src_x); + src_y = PHY2LOG(src_y); + draw_w = PHY2LOG(draw_w); + draw_h = PHY2LOG(draw_h); # if !GTK_CHECK_VERSION(3,0,0) cr = gdk_cairo_create((GdkDrawable *)target); diff --git a/src/gui.c b/src/gui.c index f3ba3705a9..0c7b39be0b 100644 --- a/src/gui.c +++ b/src/gui.c @@ -680,6 +680,9 @@ gui_init(void) * Create the GUI shell. */ gui.in_use = true; // Must be set after menus have been set up +#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE) + gui.scale = 1.0; // Default value +#endif if (gui_mch_init() == FAIL) goto error; diff --git a/src/gui.h b/src/gui.h index 1fadca0f01..16f13e4772 100644 --- a/src/gui.h +++ b/src/gui.h @@ -103,6 +103,15 @@ typedef GdkEvent GdkEventKey; // GTK4: GdkEventKey merged into GdkEvent # define FILL_Y(row) ((row) * gui.char_height + gui.border_offset) # define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height) #endif +#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE) +// Logical pixels to physical pixels +# define LOG2PHY(l) (gui.in_use ? (double)(l) * gui.scale : (l)) + // Physical pixels to logical pixels +# define PHY2LOG(p) (gui.in_use ? (double)(p) / gui.scale : (p)) +#else +# define LOG2PHY(l) (l) +# define PHY2LOG(p) (p) +#endif // Indices for arrays of scrollbars #define SBAR_NONE (-1) @@ -423,6 +432,9 @@ typedef struct Gui # ifdef GDK_WINDOWING_WAYLAND bool is_wayland; // active gdk backend in gtk is wayland # endif +# ifdef FEAT_IMAGE + double scale; // Current scaling (may be fractional) +# endif #endif // FEAT_GUI_GTK #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index b29b180d63..486ed38a0e 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -300,9 +300,9 @@ static void mainwin_fullscreened_cb(GObject *obj, GParamSpec *pspec, gpointer us static void drawarea_realize_cb(GtkWidget *widget, gpointer data); static void drawarea_unrealize_cb(GtkWidget *widget, gpointer data); #ifndef USE_GTK4_SNAPSHOT -static void drawarea_scale_factor_cb(GObject *object, GParamSpec *pspec, gpointer data); static cairo_surface_t *create_backing_surface(int width, int height); #endif +static void scale_factor_cb(GdkSurface *surface, GParamSpec *pspec, void *udata); static void clipboard_changed_cb(GdkClipboard *clipboard, gpointer user_data); #ifdef FEAT_MENU static void show_menubar_popover(void); @@ -569,9 +569,6 @@ gui_mch_init(void) // Set up drawing. gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(gui.drawarea), (GtkDrawingAreaDrawFunc)draw_event, NULL, NULL); - - g_signal_connect(G_OBJECT(gui.drawarea), "notify::scale-factor", - G_CALLBACK(drawarea_scale_factor_cb), NULL); #endif g_signal_connect(G_OBJECT(gui.drawarea), "realize", G_CALLBACK(drawarea_realize_cb), NULL); @@ -2343,6 +2340,17 @@ drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) cairo_surface_destroy(gui.surface); gui.surface = create_backing_surface(w, h); #endif + { + // Use GdkSurface, as that handles fractional scale values. + GdkSurface *surface = gtk_native_get_surface( + gtk_widget_get_native(gui.drawarea)); + double old = gui.scale; + + gui.scale = gdk_surface_get_scale(surface); + popup_update_scale(old); + g_signal_connect(G_OBJECT(surface), "notify::scale", + G_CALLBACK(scale_factor_cb), NULL); + } gui_mch_new_colors(); } @@ -2408,16 +2416,16 @@ gui_gtk4_resize(int width, int height) } } } +#endif static void -drawarea_scale_factor_cb(GObject *object UNUSED, - GParamSpec *pspec UNUSED, gpointer data UNUSED) +scale_factor_cb(GdkSurface *surface, + GParamSpec *pspec UNUSED, + void *udata UNUSED) { +#ifndef USE_GTK4_SNAPSHOT int w, h; - if (gui.drawarea == NULL) - return; - w = gtk_widget_get_width(gui.drawarea); h = gtk_widget_get_height(gui.drawarea); if (w <= 0 || h <= 0) @@ -2437,8 +2445,16 @@ drawarea_scale_factor_cb(GObject *object UNUSED, gtk_widget_queue_draw(gui.drawarea); if (gui.in_use) redraw_all_later(UPD_CLEAR); -} #endif +#if defined(FEAT_IMAGE) + { + double old = gui.scale; + + gui.scale = gdk_surface_get_scale(surface); + popup_update_scale(old); + } +#endif +} typedef enum { diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 4a7211fd70..739f2e0aed 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -1752,7 +1752,8 @@ vim_draw_area_queue_image(VimDrawArea *self, GList *link) * (src_x, src_y, draw_w, draw_h) describe which pixel sub-rect of the source * texture should be drawn. If there is an image that has the same id, then it * is re-rendered with the new texture. If zindex of an image changed, then the - * queue will be updated accordingly. + * queue will be updated accordingly. Note that the dimensions/positions are to + * be in physical pixels!!! */ void vim_draw_area_add_image( @@ -1760,15 +1761,15 @@ vim_draw_area_add_image( GdkTexture *image, int row, int col, - int src_x, - int src_y, - int draw_w, - int draw_h, + double src_x, + double src_y, + double draw_w, + double draw_h, int zindex, int id) { GskRenderNode *node, *old; - int w, h; + double w, h; graphene_rect_t clip; GList *link; DrawImage *dimg; @@ -1778,12 +1779,16 @@ vim_draw_area_add_image( || col >= self->n_cols)) return; - w = gdk_texture_get_width(image); - h = gdk_texture_get_height(image); + w = PHY2LOG(gdk_texture_get_width(image)); + h = PHY2LOG(gdk_texture_get_height(image)); + src_x = PHY2LOG(src_x); + src_y = PHY2LOG(src_y); + draw_w = PHY2LOG(draw_w); + draw_h = PHY2LOG(draw_h); - node = gsk_texture_node_new(image, + node = gsk_texture_scale_node_new(image, &GRAPHENE_RECT_INIT(FILL_X(col) - src_x, FILL_Y(row) - src_y, - w, h)); + w, h), GSK_SCALING_FILTER_TRILINEAR); if (node != NULL) { diff --git a/src/gui_gtk4_da.h b/src/gui_gtk4_da.h index 5cd1cdc552..a214729a87 100644 --- a/src/gui_gtk4_da.h +++ b/src/gui_gtk4_da.h @@ -34,7 +34,7 @@ void vim_draw_area_add_sign(VimDrawArea *self, GdkTexture *sign, int row, int co void vim_draw_area_add_multisign(VimDrawArea *self, cairo_surface_t *surf, int row, int col, int width, int height); # endif # ifdef FEAT_IMAGE_GDK -void vim_draw_area_add_image(VimDrawArea *self, GdkTexture *image, int row, int col, int src_x, int src_y, int draw_w, int draw_h, int zindex, int id); +void vim_draw_area_add_image(VimDrawArea *self, GdkTexture *image, int row, int col, double src_x, double src_y, double draw_w, double draw_h, int zindex, int id); void vim_draw_area_remove_image(VimDrawArea *self, int id); # endif diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 098892d5c1..1291919b29 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -836,6 +836,14 @@ scale_factor_event(GtkWidget *widget, gui.force_redraw = 1; gui_resize_shell(w, usable_height); gui_gtk_form_thaw(GTK_FORM(gui.formwin)); +# ifdef FEAT_IMAGE + { + double old = gui.scale; + + gui.scale = gtk_widget_get_scale_factor(widget); + popup_update_scale(old); + } +# endif return TRUE; } @@ -4291,6 +4299,10 @@ gui_mch_init(void) G_CALLBACK(gtk_settings_xft_dpi_changed_cb), NULL); } +#ifdef FEAT_IMAGE + gui.scale = gtk_widget_get_scale_factor(gui.formwin); +#endif + return OK; } diff --git a/src/popupwin.c b/src/popupwin.c index 293305ed92..bbbfa300c6 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1110,9 +1110,9 @@ apply_general_options(win_T *wp, dict_T *dict) if (gui.in_use) { if (gui.char_width > 0) - cx = gui.char_width; + cx = LOG2PHY(gui.char_width); if (gui.char_height > 0) - cy = gui.char_height; + cy = LOG2PHY(gui.char_height); } else # endif @@ -3013,6 +3013,35 @@ popup_adjust_position(win_T *wp) } } +#if defined(FEAT_GUI_GTK) && defined(FEAT_IMAGE) +/* + * Should be called when scale factor changes. + */ + void +popup_update_scale(double old_scale) +{ + win_T *wp; + double ratio = old_scale / gui.scale; + + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) + { + // If the popup has an image, recalculate its bounding box in cells + if (wp->w_popup_image_data != NULL) + { + // Add +0.5 so that it rounds to nearest whole value + wp->w_minwidth = wp->w_minwidth * ratio + 0.5; + wp->w_maxwidth = wp->w_maxwidth * ratio + 0.5; + wp->w_minheight = wp->w_minheight * ratio + 0.5; + wp->w_maxheight = wp->w_maxheight * ratio + 0.5; + } + + // Reflow the popup layout with the newly calculated limits + popup_adjust_position(wp); + } + redraw_later(UPD_CLEAR); +} +#endif + typedef enum { TYPE_NORMAL, @@ -6825,9 +6854,13 @@ popup_image_gui_clip( int *draw_h) { popup_clip_T cl; - int cell_x = gui.char_width > 0 ? gui.char_width : 8; - int cell_y = gui.char_height > 0 ? gui.char_height : 16; + // "gui.char_*" are in logical pixels, must convert to physical first, + // because all the other dimensions are in physical pixels. + int cell_x = LOG2PHY(gui.char_width > 0 ? gui.char_width : 8); + int cell_y = LOG2PHY(gui.char_height > 0 ? gui.char_height : 16); win_T *cw; + int visible_w; + int visible_h; popup_compute_clip(wp, &cl); *row += cl.clip_top_content; @@ -6857,6 +6890,18 @@ popup_image_gui_clip( *draw_w = 0; if (*draw_h < 0) *draw_h = 0; + + // If image is larger than the actual screen size, then clip it. Maybe best + // solution would be to somehow make popup win bigger than the screen size + // (as if 'nowrap' is on). However that would require a lot of changes so + // just clip the image for now. + visible_w = wp->w_width - cl.clip_left_content - cl.clip_right_content; + visible_h = wp->w_height - cl.clip_top_content - cl.clip_bot_content; + + if (visible_w > 0) + *draw_w = MIN(*draw_w, visible_w * cell_x); + if (visible_h > 0) + *draw_h = MIN(*draw_h, visible_h * cell_y); } # endif @@ -7085,12 +7130,12 @@ popup_emit_image(win_T *wp) // vim still thinks it is at the image origin, so the relative-move // optimisation would otherwise place the cursor on the line just // after the image. - out_str((char_u *)"\033[?25l"); + cursor_off(); term_windgoto(row, col); out_str(wp->w_popup_image_seq); screen_start(); setcursor_mayforce(TRUE); - out_str((char_u *)"\033[?25h"); + cursor_on(); out_flush(); // The sixel bytes just painted over every cell of the emitted rectangle, diff --git a/src/proto/cairo.pro b/src/proto/cairo.pro index a297371042..1aad52c2bd 100644 --- a/src/proto/cairo.pro +++ b/src/proto/cairo.pro @@ -2,5 +2,5 @@ bool cairo_popup_image_ensure(win_T *wp); bool cairo_popup_image_update(win_T *wp); void cairo_popup_image_free(win_T *wp); -void cairo_popup_image_paint(win_T *wp, void *target, int x, int y, int src_x, int src_y, int draw_w, int draw_h); +void cairo_popup_image_paint(win_T *wp, void *target, int x, int y, double src_x, double src_y, double draw_w, double draw_h); /* vim: set ft=c : */ diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro index 98e3a5f592..758695c35f 100644 --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -11,6 +11,7 @@ int popup_left_extra(win_T *wp); int popup_height(win_T *wp); int popup_width(win_T *wp); int popup_extra_width(win_T *wp); +void popup_update_scale(double old_scale); int parse_previewpopup(win_T *wp); int parse_completepopup(win_T *wp); void popup_set_wantpos_cursor(win_T *wp, int width, dict_T *d); diff --git a/src/version.c b/src/version.c index c857374a93..7601e516d0 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 853, /**/ 852, /**/ From 0c1a214497400a950f1e25f4163215ec930a4659 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 24 Jul 2026 22:23:34 +0000 Subject: [PATCH 201/647] runtime(doc): Fix truncated sentence in :h map() fixes: #20725 Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 43b19c488a..dc668c3a91 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Jul 19 +*builtin.txt* For Vim version 9.2. Last change: 2026 Jul 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7023,7 +7023,7 @@ map({expr1}, {expr2}) *map()* Note that {expr2} is the result of an expression and is then used as an expression again. Often it is good to use a |literal-string| to avoid having to double backslashes. You - still have to double ' quotes + still have to double single (') quotes, though. If {expr2} is a |Funcref| it is called with two arguments: 1. The key or the index of the current item. From 5a7ce2733a2d9d9fccad4dd48047546000d9994d Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 24 Jul 2026 22:51:53 +0000 Subject: [PATCH 202/647] patch 9.2.0854: memory leak when reading a spell file with SN_SAL and SN_SOFO Problem: Memory leak when a spell file has an SN_SAL section before an SN_SOFO section: set_sofo() reuses sl_sal without freeing the salitem_T entries left by read_sal_section() (after v9.2.0846). Solution: Factor the SAL free loop into free_sal_items() and call it before set_sofo() reuses sl_sal. closes: #20836 Supported by AI. Signed-off-by: Christian Brabandt --- src/proto/spell.pro | 1 + src/spell.c | 39 ++++++++++++++++++++++++++------------- src/spellfile.c | 2 ++ src/version.c | 2 ++ 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/proto/spell.pro b/src/proto/spell.pro index a68de8f1d8..a7e547bf40 100644 --- a/src/proto/spell.pro +++ b/src/proto/spell.pro @@ -11,6 +11,7 @@ void spell_cat_line(char_u *buf, char_u *line, int maxlen); char_u *spell_enc(void); slang_T *slang_alloc(char_u *lang); void slang_free(slang_T *lp); +void free_sal_items(garray_T *gap); void slang_clear(slang_T *lp); void slang_clear_sug(slang_T *lp); void count_common_word(slang_T *lp, char_u *word, int len, int count); diff --git a/src/spell.c b/src/spell.c index 1276604251..de807d9053 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1752,6 +1752,30 @@ slang_free(slang_T *lp) vim_free(lp); } + +/* + * Free the salitem_T entries in a "sl_sal" garray (the SN_SAL form) and + * clear the garray. Used by slang_clear() and when set_sofo() reuses + * sl_sal for the SN_SOFO form. + */ + void +free_sal_items(garray_T *gap) +{ + salitem_T *smp; + + while (gap->ga_len > 0) + { + smp = &((salitem_T *)gap->ga_data)[--gap->ga_len]; + vim_free(smp->sm_lead); + // Don't free sm_oneof and sm_rules, they point into sm_lead. + vim_free(smp->sm_to); + vim_free(smp->sm_lead_w); + vim_free(smp->sm_oneof_w); + vim_free(smp->sm_to_w); + } + ga_clear(gap); +} + /* * Clear an slang_T so that the file can be reloaded. */ @@ -1760,7 +1784,6 @@ slang_clear(slang_T *lp) { garray_T *gap; fromto_T *ftp; - salitem_T *smp; int i; int round; @@ -1792,20 +1815,10 @@ slang_clear(slang_T *lp) // SOFOFROM and SOFOTO items: free lists of wide characters. for (i = 0; i < gap->ga_len; ++i) vim_free(((int **)gap->ga_data)[i]); + ga_clear(gap); } else - // SAL items: free salitem_T items - while (gap->ga_len > 0) - { - smp = &((salitem_T *)gap->ga_data)[--gap->ga_len]; - vim_free(smp->sm_lead); - // Don't free sm_oneof and sm_rules, they point into sm_lead. - vim_free(smp->sm_to); - vim_free(smp->sm_lead_w); - vim_free(smp->sm_oneof_w); - vim_free(smp->sm_to_w); - } - ga_clear(gap); + free_sal_items(gap); for (i = 0; i < lp->sl_prefixcnt; ++i) vim_regfree(lp->sl_prefprog[i]); diff --git a/src/spellfile.c b/src/spellfile.c index e90c89b73d..67fe17502e 100644 --- a/src/spellfile.c +++ b/src/spellfile.c @@ -1421,6 +1421,8 @@ set_sofo(slang_T *lp, char_u *from, char_u *to) if (has_mbyte) { + free_sal_items(&lp->sl_sal); + // Use "sl_sal" as an array with 256 pointers to a list of wide // characters. The index is the low byte of the character. // The list contains from-to pairs with a terminating NUL. diff --git a/src/version.c b/src/version.c index 7601e516d0..4808dfa6d0 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 854, /**/ 853, /**/ From 02c0a90404f534f0ba1fc5754002f8f9f014c061 Mon Sep 17 00:00:00 2001 From: Shay Hill Date: Sat, 25 Jul 2026 16:08:14 +0000 Subject: [PATCH 203/647] runtime(doc): document &t_8u as &t_8f and &t_8b fixes: #20413 closes: #20837 Signed-off-by: Shay Hill Signed-off-by: Christian Brabandt --- runtime/doc/term.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt index 7d7466f1df..a20143efa8 100644 --- a/runtime/doc/term.txt +++ b/runtime/doc/term.txt @@ -1,4 +1,4 @@ -*term.txt* For Vim version 9.2. Last change: 2026 Mar 04 +*term.txt* For Vim version 9.2. Last change: 2026 Jul 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -690,18 +690,20 @@ work the 'termguicolors' option needs to be set. See https://github.com/termstandard/colors for a list of terminals that support true colors. -For telling the terminal what RGB color to use the |t_8f| and |t_8b| termcap -entries are used. These are set by default to values that work for most -terminals. If that does not work for your terminal you can set them manually. -The default values are set like this: > +For telling the terminal what RGB color to use the |t_8f|, |t_8b|, and |t_8u| +termcap entries are used. These are set by default to values that work for +most terminals. If that does not work for your terminal you can set them +manually. The default values are set like this: > let &t_8f = "\[38;2;%lu;%lu;%lum" let &t_8b = "\[48;2;%lu;%lu;%lum" + let &t_8u = "\[58;2;%lu;%lu;%lum" Some terminals accept similar sequences, with semicolons replaced by colons and an extra colon after the number 2 (this is conformant to the ISO 8613-6 standard, but less widely supported): > let &t_8f = "\[38:2::%lu:%lu:%lum" let &t_8b = "\[48:2::%lu:%lu:%lum" + let &t_8u = "\[58:2::%lu:%lu:%lum" These options contain printf strings, with |printf()| (actually, its C equivalent hence `l` modifier) invoked with the t_ option value and three From e2d3e7818b0f408ad25ff97b86d6179c303c98d7 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sat, 25 Jul 2026 16:27:18 +0000 Subject: [PATCH 204/647] runtime(doc): remove incorrect note about spellcapcheck and the first word 'spellcapcheck' checks the first word in the file for a capital like any sentence start: capcol is seeded to 0 for line 1 in spell_check_sblock(). This has been the case since the feature was added in v7.0100, so the note that it "doesn't work for the first word in the file" is incorrect. related: f9184a1d3151b5b727fec86c2ac0946c9c68df4d (code change) related: 0d9c26dd8333aae4b20015f13fe2e8e1f07037bd (initial doc patch, just a few minutes later) related: #20715 Signed-off-by: Christian Brabandt --- runtime/doc/spell.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/runtime/doc/spell.txt b/runtime/doc/spell.txt index 774f0777c3..df8f4e9c8f 100644 --- a/runtime/doc/spell.txt +++ b/runtime/doc/spell.txt @@ -1,4 +1,4 @@ -*spell.txt* For Vim version 9.2. Last change: 2026 May 23 +*spell.txt* For Vim version 9.2. Last change: 2026 Jul 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -221,10 +221,10 @@ The 'spellsuggest' option influences how the list of suggestions is generated and sorted. See 'spellsuggest'. The 'spellcapcheck' option is used to check the first word of a sentence -starts with a capital. This doesn't work for the first word in the file. -When there is a line break right after a sentence the highlighting of the next -line may be postponed. Use |CTRL-L| when needed. Also see |set-spc-auto| for -how it can be set automatically when 'spelllang' is set. +starts with a capital. When there is a line break right after a sentence the +highlighting of the next line may be postponed. Use |CTRL-L| when needed. +Also see |set-spc-auto| for how it can be set automatically when 'spelllang' +is set. The 'spelloptions' option has a few more flags that influence the way spell checking works. For example, "camel" splits CamelCased words so that each From ac78f14b92f2733f1e951180ab96a0db0cfbde8a Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 25 Jul 2026 16:36:52 +0000 Subject: [PATCH 205/647] runtime(doc): Tweak documentation style a bit closes: #20843 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/gui_x11.txt | 2 +- runtime/doc/options.txt | 10 +++++----- runtime/doc/version9.txt | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index d55f35aba7..58467023a0 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -1,4 +1,4 @@ -*gui_x11.txt* For Vim version 9.2. Last change: 2026 June 29 +*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jun 29 VIM REFERENCE MANUAL by Bram Moolenaar diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 15e26e4484..84e4f30aea 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -4948,8 +4948,8 @@ A jump table for the options with a short description can be found at |Q_op|. restored if possible |X11|. See |X11-icon| for changing the icon on X11. For MS-Windows the icon can be changed, see |windows-icon|. - NOTE: GNU screen is not consistent in handling icon-title and title escape - sequences between versions. See 'title'. + NOTE: GNU screen is not consistent in handling icon-title and title + escape sequences between versions. See 'title'. *'iconstring'* 'iconstring' string (default "") @@ -9637,9 +9637,9 @@ A jump table for the options with a short description can be found at |Q_op|. then the WINDOWID environment variable should be inherited and the title of the window should change back to what it should be after exiting Vim. - NOTE: GNU screen is not consistent in handling icon-title and title escape - sequences between versions. In particular, screen 5 may swap title and - icon-title. + NOTE: GNU screen is not consistent in handling icon-title and title + escape sequences between versions. In particular, screen 5 may swap + title and icon-title. *'titlelen'* 'titlelen' number (default 85) diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index a5d3e0034d..efe88e9499 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -52664,7 +52664,7 @@ Platform specific ~ - support OpenType font features in 'guifont' for DirectWrite (Win32) - Include strptime() fallback for MS-Windows - Hardware-accelerated rendering for the GTK4 GUI via |gtk4-hwaccel|. -- The NSIS installer has been reworked (Win32): +- The NSIS installer has been reworked (Win32): - Support per-user and per-machine install. - Change the install directory structure. - Replace the batch files with the Vim launchers. From 770eb7db17c44e41fc4eb1975d67f9ec022edb58 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 25 Jul 2026 16:40:40 +0000 Subject: [PATCH 206/647] runtime(doc): clarify expandcmd() and "~" behaviour fixes: #20793 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index dc668c3a91..1f14e75281 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -3099,6 +3099,10 @@ expandcmd({string} [, {options}]) *expandcmd()* like with |expand()|, and environment variables, anywhere in {string}. "~user" and "~/path" are only expanded at the start. + The expansion is done in two steps: the special keywords are + evaluated first, then "~" and environment variables are + expanded in the result. Thus `expand('%:~')` keeps the "~", + while `expandcmd('%:~')` returns the full path. The following items are supported in the {options} Dict argument: From 3886a8ffc5bbc006d5965fca2e1004b4beb4c98b Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Sat, 25 Jul 2026 16:44:20 +0000 Subject: [PATCH 207/647] runtime(osc52): don't use osc52 provider if gui is running closes: #20841 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/osc52/autoload/osc52.vim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runtime/pack/dist/opt/osc52/autoload/osc52.vim b/runtime/pack/dist/opt/osc52/autoload/osc52.vim index bad4bc388d..16507d05c3 100644 --- a/runtime/pack/dist/opt/osc52/autoload/osc52.vim +++ b/runtime/pack/dist/opt/osc52/autoload/osc52.vim @@ -3,6 +3,9 @@ vim9script export var allowed: bool = false export def Available(): bool + if has('gui_running') + return false + endif if get(g:, 'osc52_force_avail', 0) return true endif From 2e9687647a2ab2aadee00f01e37c71a5cffbdfcc Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 25 Jul 2026 16:46:29 +0000 Subject: [PATCH 208/647] patch 9.2.0855: 'showcmd' not redrawn with empty mapping triggered on timeout Problem: 'showcmd' not redrawn with empty mapping triggered on timeout. Solution: Don't postpone redraw when inside vgetorpeek(). Also move test for tabline 'showcmd' to test_tabline.vim. fixes: #20839 closes: #20840 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/normal.c | 4 ++-- src/testdir/test_statusline.vim | 36 +++++++++++++++++---------------- src/testdir/test_tabline.vim | 18 +++++++++++++++++ src/version.c | 2 ++ 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/normal.c b/src/normal.c index d5de6abe51..a7959d62f1 100644 --- a/src/normal.c +++ b/src/normal.c @@ -1850,14 +1850,14 @@ display_showcmd(void) if (*p_sloc == 's') { - if (showcmd_is_clear) + if (showcmd_is_clear && !vgetc_busy) curwin->w_redr_status = true; else win_redr_status(curwin, FALSE); } else if (*p_sloc == 't') { - if (showcmd_is_clear) + if (showcmd_is_clear && !vgetc_busy) redraw_tabline = TRUE; else draw_tabline(); diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim index 69699a2d4d..6df015be1d 100644 --- a/src/testdir/test_statusline.vim +++ b/src/testdir/test_statusline.vim @@ -657,23 +657,6 @@ func Test_statusline_showcmd() call StopVimInTerminal(buf) endfunc -func Test_statusline_showcmd_redraw_tabline() - CheckRunVimInTerminal - - let lines =<< trim END - set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0 - nnoremap g :redraw - nnoremap gc - END - call writefile(lines, 'XTest_statusline_showcmd_redraw', 'D') - - let buf = RunVimInTerminal('-S XTest_statusline_showcmd_redraw', #{rows: 6, cols: 40}) - call term_sendkeys(buf, 'g') - call WaitForAssert({-> assert_match(':redraw', term_getline(buf, 6))}) - call WaitForAssert({-> assert_notmatch('^:', term_getline(buf, 1))}) - call StopVimInTerminal(buf) -endfunc - func Test_statusline_showcmd_cmd_mapping() set showcmd set statusline=AAA%SBBB @@ -698,6 +681,25 @@ func Test_statusline_showcmd_cmd_mapping() endtry endfunc +func Test_statusline_showcmd_nop_map() + CheckRunVimInTerminal + + let lines =<< trim END + set timeoutlen=500 showcmdloc=statusline laststatus=2 + nnoremap + nnoremap + END + call writefile(lines, 'XTest_statusline_showcmd_nop', 'D') + + let buf = RunVimInTerminal('-S XTest_statusline_showcmd_nop', {'rows': 6}) + call term_sendkeys(buf, ' ') + call WaitForAssert({-> assert_match('<20>', term_getline(buf, 5))}, 400) + sleep 500m + call WaitForAssert({-> assert_notmatch('<20>', term_getline(buf, 5))}, 400) + + call StopVimInTerminal(buf) +endfunc + func Test_statusline_highlight_group_cleared() CheckScreendump diff --git a/src/testdir/test_tabline.vim b/src/testdir/test_tabline.vim index 7ae0602489..c2863554c4 100644 --- a/src/testdir/test_tabline.vim +++ b/src/testdir/test_tabline.vim @@ -213,6 +213,24 @@ func Test_tabline_showcmd() call StopVimInTerminal(buf) endfunc +func Test_tabline_showcmd_redraw_tabline() + CheckRunVimInTerminal + + let lines =<< trim END + set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0 + nnoremap g :redraw + nnoremap gc + END + call writefile(lines, 'XTest_tabline_showcmd_redraw', 'D') + + let buf = RunVimInTerminal('-S XTest_tabline_showcmd_redraw', #{rows: 6, cols: 40}) + call term_sendkeys(buf, 'g') + call WaitForAssert({-> assert_match(':redraw', term_getline(buf, 6))}) + call WaitForAssert({-> assert_notmatch('^:', term_getline(buf, 1))}) + + call StopVimInTerminal(buf) +endfunc + func TruncTabLine() return '%1T口口%2Ta' .. repeat('b', &columns - 4) .. '%999X%#TabLine#c' endfunc diff --git a/src/version.c b/src/version.c index 4808dfa6d0..7a37a44ea2 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 855, /**/ 854, /**/ From f5882d534a5bb0aa3408eda9ebc07a28d7918264 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 16:51:19 +0000 Subject: [PATCH 209/647] CI: Bump the github-actions group across 1 directory with 3 updates Bumps the github-actions group with 3 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [github/codeql-action](https://github.com/github/codeql-action) and [actions/labeler](https://github.com/actions/labeler). Updates `actions/checkout` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v7.0.0...v7.0.1) Updates `github/codeql-action` from 4.37.0 to 4.37.1 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.37.0...v4.37.1) Updates `actions/labeler` from 6.2.0 to 7.0.0 - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v6.2.0...v7.0.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action dependency-version: 4.37.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/labeler dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... closes: #20838 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/ci-linux.yml | 2 +- .github/workflows/ci-linux_asan.yml | 2 +- .github/workflows/ci-macos.yml | 2 +- .github/workflows/ci-windows.yml | 2 +- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/coverity.yml | 2 +- .github/workflows/label.yml | 2 +- .github/workflows/link-check.yml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 016c58e0ae..015d9d698a 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -83,7 +83,7 @@ jobs: steps: - name: Checkout repository from GitHub - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Build timeout-minutes: 15 diff --git a/.github/workflows/ci-linux_asan.yml b/.github/workflows/ci-linux_asan.yml index db8cf437c6..394df10e83 100644 --- a/.github/workflows/ci-linux_asan.yml +++ b/.github/workflows/ci-linux_asan.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout repository from GitHub - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Build timeout-minutes: 15 diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index 9acda1df40..4e619b865d 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout repository from GitHub - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Install packages if: matrix.features == 'huge' diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index fb964cb783..c23fb028f0 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -128,7 +128,7 @@ jobs: release: false - name: Checkout repository from GitHub - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Create a list of download URLs shell: cmd diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index eaa78b1936..29d79ac6a8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,11 +44,11 @@ jobs: steps: - name: Checkout repository from github - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.0 + uses: github/codeql-action/init@v4.37.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.37.0 + uses: github/codeql-action/autobuild@v4.37.1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.0 + uses: github/codeql-action/analyze@v4.37.1 diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml index 5ff1dfada7..f788c2bbd0 100644 --- a/.github/workflows/coverity.yml +++ b/.github/workflows/coverity.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout repository from github if: env.TOKEN - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Download Coverity if: env.TOKEN diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index f12b48feff..ec6a4ec278 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -17,6 +17,6 @@ jobs: pull-requests: write steps: - - uses: actions/labeler@v6.2.0 + - uses: actions/labeler@v7.0.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml index 73aee1ca6b..f04e139581 100644 --- a/.github/workflows/link-check.yml +++ b/.github/workflows/link-check.yml @@ -8,7 +8,7 @@ jobs: lychee: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Run Lychee uses: lycheeverse/lychee-action@v2 with: From 06c0e88b760e62f1c44177241eb58f866c136fc6 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Sat, 25 Jul 2026 16:57:36 +0000 Subject: [PATCH 210/647] patch 9.2.0856: GTK4: undercurl rendering is inefficient Problem: In the GTK4 GUI the undercurl is drawn by building a path across the whole width of each decorated row. With many undercurls on screen this causes frame drops. Solution: Render a single cycle of the undercurl and tile it across the row with a repeating node, so the Vulkan and OpenGL renderers can repeat directly (Foxe Chen). closes: #20829 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4_da.c | 55 ++++++++++++++++++++++++++--------------------- src/version.c | 2 ++ 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 739f2e0aed..7a082cedfc 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -914,7 +914,12 @@ draw_row_ensure_decor(DrawRow *drow, int flags) int x_start = FILL_X(0); int x_end = FILL_X(drow->n_cells); - // GskPath was added in GSK 4.14, otherwise use cairo + // Instead of rendering the entire pattern, use a repeating node to + // render a single cycle of the undercurl, taking advantage of the GPU + // (if using opengl or vulkan renderer). + GskRenderNode *child = NULL; + + // GskPath was added in GSK 4.14, otherwise use Cairo #if GTK_CHECK_VERSION(4, 14, 0) GskPathBuilder *builder; GskPath *path; @@ -924,52 +929,52 @@ draw_row_ensure_decor(DrawRow *drow, int flags) builder = gsk_path_builder_new(); - gsk_path_builder_move_to(builder, - x_start + 1, - y - 2 + 0.5); + // Start at X = -1 (val[7]) to ensure a fully formed stroke at X = 0 + gsk_path_builder_move_to(builder, -1, y - val[7] + 0.5); + gsk_path_builder_line_to(builder, 0, y - val[0] + 0.5); - for (int i = x_start + 1; i < x_end; i++) - { - int offset = val[i % 8]; + for (int i = 1; i < 8; i++) + gsk_path_builder_line_to(builder, i, y - val[i] + 0.5); - gsk_path_builder_line_to(builder, - i, y - offset + 0.5); - } + // Extend to X = 9 (val[1]) to ensure a fully formed stroke at X = 8 + gsk_path_builder_line_to(builder, 8, y - val[0] + 0.5); + gsk_path_builder_line_to(builder, 9, y - val[1] + 0.5); path = gsk_path_builder_free_to_path(builder); - stroke = gsk_stroke_new(1.0); - gsk_path_get_stroke_bounds (path, stroke, &bounds); + gsk_path_get_stroke_bounds(path, stroke, &bounds); color_node = gsk_color_node_new(&white_rgba, &bounds); + child = gsk_stroke_node_new(color_node, path, stroke); - drow->underc_mask = gsk_stroke_node_new(color_node, path, stroke); gsk_stroke_free(stroke); gsk_path_unref(path); gsk_render_node_unref(color_node); #else - cairo_t *cr; - GskRenderNode *node; + cairo_t *cr; - node = gsk_cairo_node_new( - &GRAPHENE_RECT_INIT(x_start, y - 3, x_end - x_start, 5)); - cr = gsk_cairo_node_get_draw_context(node); + child = gsk_cairo_node_new(&GRAPHENE_RECT_INIT(-2, y - 4, 12, 7)); + cr = gsk_cairo_node_get_draw_context(child); cairo_set_line_width(cr, 1.0); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); - cairo_move_to(cr, x_start + 1, y - 2 + 0.5); + cairo_move_to(cr, -1, y - val[7] + 0.5); + cairo_line_to(cr, 0, y - val[0] + 0.5); - for (int i = x_start + 1; i < x_end; ++i) - { - int offset = val[i % 8]; - cairo_line_to(cr, i, y - offset + 0.5); - } + for (int i = 1; i < 8; ++i) + cairo_line_to(cr, i, y - val[i] + 0.5); + + cairo_line_to(cr, 8, y - val[0] + 0.5); + cairo_line_to(cr, 9, y - val[1] + 0.5); cairo_stroke(cr); cairo_destroy(cr); - drow->underc_mask = node; #endif + drow->underc_mask = gsk_repeat_node_new( + &GRAPHENE_RECT_INIT(x_start, y - 3, x_end - x_start, 5), + child, &GRAPHENE_RECT_INIT(0.0f, y - 3, 8.0f, 5.0f)); + gsk_render_node_unref(child); } } diff --git a/src/version.c b/src/version.c index 7a37a44ea2..b289c6800e 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 856, /**/ 855, /**/ From fb1a2e9d13f21fadec7ef4aef2fb6e760036daf0 Mon Sep 17 00:00:00 2001 From: frapank Date: Sat, 25 Jul 2026 17:03:08 +0000 Subject: [PATCH 211/647] runtime(sh): fix Bash/Ksh array highlighting after an escaped paren fixes: #18712 closes: #20705 Signed-off-by: frapank Signed-off-by: Christian Brabandt --- runtime/syntax/sh.vim | 6 +++--- runtime/syntax/testdir/dumps/sh_12_11.dump | 2 +- .../testdir/dumps/sh_bash_array_00.dump | 20 +++++++++++++++++++ .../syntax/testdir/input/sh_bash_array.bash | 14 +++++++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/sh_bash_array_00.dump create mode 100644 runtime/syntax/testdir/input/sh_bash_array.bash diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim index 044f2a9e3e..52d50df853 100644 --- a/runtime/syntax/sh.vim +++ b/runtime/syntax/sh.vim @@ -3,7 +3,7 @@ " Maintainer: This runtime file is looking for a new maintainer. " Previous Maintainers: Charles E. Campbell " Lennart Schultz -" Last Change: 2026 May 17 by Vim Project +" Last Change: 2026 Jul 25 by Vim Project " Version: 208 " Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH " For options and settings, please use: :help ft-sh-syntax @@ -598,12 +598,12 @@ syn match shVariable "\<\h\w*\ze=" nextgroup=shVarAssign if exists("b:is_bash") " The subscript form for array values, e.g. "foo=([2]=10 [4]=100)". syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign - syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,bashSpecialVariables,shParenError + syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shEscape,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,bashSpecialVariables,shParenError syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment elseif (exists("b:is_kornshell") && !exists("b:is_ksh88")) " The subscript form for array values, e.g. "foo=([2]=10 [4]=100)". syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign - syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,kshSpecialVariables,shParenError + syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shEscape,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,kshSpecialVariables,shParenError syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment,shArrayRegion endif if exists("b:is_bash") || exists("b:is_kornshell") diff --git a/runtime/syntax/testdir/dumps/sh_12_11.dump b/runtime/syntax/testdir/dumps/sh_12_11.dump index 21edbc825e..de2ecca5be 100644 --- a/runtime/syntax/testdir/dumps/sh_12_11.dump +++ b/runtime/syntax/testdir/dumps/sh_12_11.dump @@ -6,7 +6,7 @@ >e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|{|1|#+0#af5f00255&|$+0#e000e06&|{|1|%+0#af5f00255&@1|[+0#00e0003&|!+8#e000e06&|$+0#0000000&|{|n|l|}|\|"|]+0#00e0003&|*+0#0000000&|}+0#e000e06&@1|"+0#af5f00255&|;+0#0000000&| |e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|{|1|#+0#af5f00255&|$+0#e000e06&|{|1|%+0#af5f00255&@1|[+0#00e0003&|!+8#e000e06&|$+0#0000000&|{|n|l|}|\|'|]+0#00e0003&|*+0#0000000&|}+0#e000e06&@1|"+0#af5f00255&| +0#0000000&@14 @75 |b+0#00e0e07&|i|n|s|=+0#0000000&|(+0#e000e06&|)|;+0#0000000&| |b+0#00e0e07&|i|n|s|=+0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&|1+0#e000002&|)+0#e000e06&|;+0#0000000&| |e+0#af5f00255&|v|a|l| +0#0000000&|b+0#00e0e07&|i|n|s|++0#0000000&|=|(+0#e000e06&|{|0+0#e000002&|.+0#0000000&@1|1+0#e000002&|}+0#e000e06&|)| +0#0000000&@34 -|b+0#00e0e07&|i|n|s|[+0#e000e06&|0+0#e000002&|]+0#e000e06&|=+0#0000000&|0+0#e000002&|;+0#0000000&| |b+0#00e0e07&|i|n|s|[+0#e000e06&|1+0#e000002&|]+0#e000e06&|=+0#0000000&|1+0#e000002&|;+0#0000000&| |e+0#af5f00255&|v|a|l| +0#0000000&|b+0#00e0e07&|i|n|s|++0#0000000&|=|(+0#e000e06&|\+0#0000000&|$+0#e000e06&|{|b|i|n|s|[|{|1+0#e000002&|.+0#0000000&@1|0+0#e000002&|}+0#e000e06&|]|}|)|;+0#0000000&| |u+0#af5f00255&|n|s|e|t| +0#00e0e07&|b|i|n|s|[+0#e000e06&|3+0#e000002&|]+0#e000e06&| +0#00e0e07&|b|i|n|s|[+0#e000e06&|2+0#e000002&|]+0#e000e06&| +0#0000000& +|b+0#00e0e07&|i|n|s|[+0#e000e06&|0+0#e000002&|]+0#e000e06&|=+0#0000000&|0+0#e000002&|;+0#0000000&| |b+0#00e0e07&|i|n|s|[+0#e000e06&|1+0#e000002&|]+0#e000e06&|=+0#0000000&|1+0#e000002&|;+0#0000000&| |e+0#af5f00255&|v|a|l| +0#0000000&|b+0#00e0e07&|i|n|s|++0#0000000&|=|(+0#e000e06&|\|$|{|b+0#0000000&|i|n|s|[+0#00e0003&|{+0#0000000&|1|.@1|0|}|]+0#00e0003&|}+0#e000e06&|)|;+0#0000000&| |u+0#af5f00255&|n|s|e|t| +0#00e0e07&|b|i|n|s|[+0#e000e06&|3+0#e000002&|]+0#e000e06&| +0#00e0e07&|b|i|n|s|[+0#e000e06&|2+0#e000002&|]+0#e000e06&| +0#0000000& |b+0#00e0e07&|i|n|s|=+0#0000000&|(+0#e000e06&|[+0#00e0e07&|8+0#e000002&|#|0|]+0#00e0e07&|=+0#0000000&|$+0#e000e06&|(@1|2+0#e000002&|#|1|0@1|)+0#e000e06&@1| +0#0000000&|[+0#00e0e07&|$+0#e000e06&|(@1|8+0#e000002&|#|1|)+0#e000e06&@1|]+0#00e0e07&|=+0#0000000&|$+0#e000e06&|(@1|2+0#e000002&|#|1|0|)+0#e000e06&@1| +0#0000000&|[+0#00e0e07&|3+0#e000002&|]+0#00e0e07&|=+0#0000000&|$+0#e000e06&|{|b|i|n|s|[|2+0#e000002&|#|1|]+0#e000e06&|}| +0#0000000&|$+0#e000e06&|{|b|i|n|s|[|0+0#e000002&|]+0#e000e06&|}|)| +0#0000000&@2 |(+0#e000e06&|e+0#af5f00255&|c|h|o| +0#e000002&|s|u|m|[+0#e000e06&|$|(@1|b|i|n|s|[|1+0#e000002&|6|#|3|]+0#e000e06&| |+| |b|i|n|s|[|8+0#e000002&|#|2|]+0#e000e06&| |+| |b|i|n|s|[|2+0#e000002&|#|1|]+0#e000e06&| |+| |b|i|n|s|[|0+0#e000002&|]+0#e000e06&|)@1|]|)| +0#0000000&@13 |e+0#af5f00255&|v|a|l| +0#0000000&|u+0#af5f00255&|n|s|e|t| +0#00e0e07&|b|i|n|s|[+0#e000e06&|{|0+0#e000002&|.+0#0000000&@1|$+0#e000e06&|(@1|$|{|#|b|i|n|s|[|*+0#0000000&|]+0#e000e06&|}| |-| |1+0#e000002&|)+0#e000e06&@1|}|]| +0#0000000&@32 diff --git a/runtime/syntax/testdir/dumps/sh_bash_array_00.dump b/runtime/syntax/testdir/dumps/sh_bash_array_00.dump new file mode 100644 index 0000000000..a62438c13a --- /dev/null +++ b/runtime/syntax/testdir/dumps/sh_bash_array_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| |#|1|8|7|1|2| +0#0000000&@60 +@75 +|d+0#af5f00255&|e|c|l|a|r|e| +0#0000000&|-+0#e000e06&|A| +0#0000000&|b+0#00e0e07&|a|r|=+0#0000000&|(+0#e000e06&| +0#0000000&@58 +@2|[+0#e000e06&|\|(|\|)|]|=+0#0000000&|"+0#af5f00255&|b+0#e000002&|a|z|"+0#af5f00255&| +0#0000000&@60 +|)+0#e000e06&| +0#0000000&@73 +|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{|b|a|r|[|\|(|\|)|]|}| +0#0000000&@57 +@75 +|f+0#00e0e07&|o@1|=+0#0000000&|(+0#e000e06&|a+0#0000000&| |\+0#e000e06&|(| +0#0000000&|b|)+0#e000e06&| +0#0000000&@62 +|f+0#00e0e07&|o@1|=+0#0000000&|(+0#e000e06&|\|$|{|f+0#0000000&|o@1|[+0#e000e06&|1+0#0000000&|]+0#e000e06&|}|)| +0#0000000&@58 +@75 +|f+0#00e0e07&|o@1|=+0#0000000&|(+0#e000e06&|[|2+0#e000002&|]+0#e000e06&|=+0#0000000&|1+0#e000002&|0| +0#0000000&|[+0#e000e06&|4+0#e000002&|]+0#e000e06&|=+0#0000000&|1+0#e000002&|0@1|)+0#e000e06&| +0#0000000&@54 +|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|{|f|o@1|[|4+0#e000002&|]+0#e000e06&|}| +0#0000000&@60 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|i+0#0000000&|s|_|b|a|s|h|:| |1|,| @45|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/input/sh_bash_array.bash b/runtime/syntax/testdir/input/sh_bash_array.bash new file mode 100644 index 0000000000..59c4d7d7d4 --- /dev/null +++ b/runtime/syntax/testdir/input/sh_bash_array.bash @@ -0,0 +1,14 @@ +#!/bin/bash + +# Issue #18712 + +declare -A bar=( + [\(\)]="baz" +) +echo ${bar[\(\)]} + +foo=(a \( b) +foo=(\${foo[1]}) + +foo=([2]=10 [4]=100) +echo ${foo[4]} From f88e7191da1a03b2e79a2ba5fbc26f4948bcca81 Mon Sep 17 00:00:00 2001 From: qwavies Date: Sun, 26 Jul 2026 14:28:29 +0000 Subject: [PATCH 212/647] runtime(python): Fix indenting for brackets within python byte strings Problem: s:SearchBracket()'s skip-expression matches syntax group names ending in "Comment", "Todo", or "String" to decide whether a candidate bracket is inside a string/comment and should be skipped for indentation purposes. Byte and raw-byte string literals (b"...", rb"...") are highlighted via the pythonBytes/pythonRawBytes syntax groups, which don't end in "String", so brackets inside them (e.g. b"[") were never skipped and were counted as real, unmatched brackets, producing incorrect indentation. Solution: Add "Bytes" to the indent script's existing suffix match, so pythonBytes/pythonRawBytes are recognized directly, the same way pythonString/pythonFString/pythonRawString already are. This supersedes an earlier version of this fix that renamed pythonBytes/pythonRawBytes to pythonBytesString/pythonRawBytesString in runtime/syntax/python.vim. fixes: #20812 closes: #20827 Signed-off-by: qwavies Signed-off-by: Christian Brabandt --- runtime/autoload/python.vim | 2 +- runtime/indent/testdir/python.in | 26 +++++++++++++++++++ runtime/indent/testdir/python.ok | 26 +++++++++++++++++++ .../dumps/python_strings_bytes_02.dump | 2 +- .../dumps/python_strings_bytes_03.dump | 2 +- .../dumps/python_strings_bytes_04.dump | 2 +- .../dumps/python_strings_bytes_05.dump | 2 +- .../dumps/python_strings_bytes_06.dump | 2 +- .../dumps/python_strings_bytes_07.dump | 2 +- .../dumps/python_strings_bytes_08.dump | 2 +- .../dumps/python_strings_bytes_09.dump | 2 +- .../dumps/python_strings_bytes_10.dump | 2 +- .../dumps/python_strings_bytes_11.dump | 2 +- .../dumps/python_strings_bytes_12.dump | 2 +- .../dumps/python_strings_bytes_13.dump | 2 +- .../dumps/python_strings_bytes_14.dump | 8 +++--- .../dumps/python_strings_bytes_15.dump | 18 ++++++------- .../dumps/python_strings_bytes_16.dump | 20 ++++++++++++++ .../testdir/input/python_strings_bytes.py | 15 +++++++++++ 19 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/python_strings_bytes_16.dump diff --git a/runtime/autoload/python.vim b/runtime/autoload/python.vim index cf01198d73..8723b4ebea 100644 --- a/runtime/autoload/python.vim +++ b/runtime/autoload/python.vim @@ -23,7 +23,7 @@ function s:SearchBracket(fromlnum, flags) " VIM_INDENT_TEST_TRACE_START return searchpairpos('[[({]', '', '[])}]', a:flags, \ {-> synstack('.', col('.')) - \ ->indexof({_, id -> synIDattr(id, 'name') =~ '\%(Comment\|Todo\|String\)$'}) >= 0}, + \ ->indexof({_, id -> synIDattr(id, 'name') =~ '\%(Comment\|Todo\|String\|Bytes\)$'}) >= 0}, \ [0, a:fromlnum - s:maxoff]->max(), g:python_indent.searchpair_timeout) " VIM_INDENT_TEST_TRACE_END python#s:SearchBracket endfunction diff --git a/runtime/indent/testdir/python.in b/runtime/indent/testdir/python.in index 1f7654ae93..2a2f5bab55 100644 --- a/runtime/indent/testdir/python.in +++ b/runtime/indent/testdir/python.in @@ -94,3 +94,29 @@ open_paren_at_EOL( 100, 200, 300, 400) # END_INDENT + +# START_INDENT +"[" +# +b"abc" +# +f"[" +# +r"[" +# +b"[" +# +b"[" +b"]" +# +b"(" +# +b"{" +# +b"(" b")" +# +b"{" b"}" +# +# END_INDENT + + diff --git a/runtime/indent/testdir/python.ok b/runtime/indent/testdir/python.ok index aaeb69cdf3..6e25b5e149 100644 --- a/runtime/indent/testdir/python.ok +++ b/runtime/indent/testdir/python.ok @@ -94,3 +94,29 @@ open_paren_at_EOL( 100, 200, 300, 400) # END_INDENT + +# START_INDENT +"[" +# +b"abc" +# +f"[" +# +r"[" +# +b"[" +# +b"[" +b"]" +# +b"(" +# +b"{" +# +b"(" b")" +# +b"{" b"}" +# +# END_INDENT + + diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_02.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_02.dump index 86d9560e43..89894abc4e 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_02.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_02.dump @@ -17,4 +17,4 @@ |#+0#0000e05&| |R|a|w| |U|n|i|c|o|d|e| |l|i|t|e|r|a|l|s| |a|r|e| |n|o|t| |a|l@1|o|w|e|d| +0#0000000&@36 |t|e|s|t| |=| |u|r+0#e000002&|'|I|n|v|a|l|i|d| |s|t|r|i|n|g| |w|i|t|h| |\|'| |a|n|d| |\|"| |a|n|d| |\|t|'| +0#0000000&@27 |t|e|s|t| |=| |u|R+0#e000002&|"|I|n|v|a|l|i|d| |s|t|r|i|n|g| |w|i|t|h| |\|0|4|0| |a|n|d| |\|x|F@1|"| +0#0000000&@30 -@57|3@1|,|1| @9|1|2|%| +@57|3@1|,|1| @9|1@1|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_03.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_03.dump index b8ee777d39..3272470610 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_03.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_03.dump @@ -17,4 +17,4 @@ |a+0#e000002&|n|d| |\+0#e000e06&|u|0@1|A|1| +0#e000002&|a|n|d| |\+0#e000e06&|U|0@2|1|0|6|0|5|"+0#e000002&@2| +0#0000000&@46 @75 |#+0#0000e05&| |F|o|r|m|a|t@1|e|d| |s|t|r|i|n|g| |l|i|t|e|r|a|l|s| |(|f|-|s|t|r|i|n|g|s|)| +0#0000000&@35 -@57|4|9|,|1| @9|1|8|%| +@57|4|9|,|1| @9|1|7|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_04.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_04.dump index bb963d0846..af475b6c1e 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_04.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_04.dump @@ -17,4 +17,4 @@ |a+0#e000002&|n|d| |f|i|e|l|d|s| |{+0#e000e06&|1+0#e000002&|}+0#e000e06&|,+0#e000002&| |{+0#e000e06&|2+0#e000002&|}+0#e000e06&| +0#e000002&|a|n|d| |{+0#e000e06&|1+0#e000002&| +0#0000000&@48 @4|+| @69 @4|2+0#e000002&|}+0#e000e06&|"+0#e000002&@2| +0#0000000&@65 -@57|6@1|,|1| @9|2|5|%| +@57|6@1|,|1| @9|2|4|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_05.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_05.dump index 23afd16a44..3108e1c8f6 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_05.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_05.dump @@ -17,4 +17,4 @@ |t|e|s|t| |=| |R+0#e000002&|F|"|R|a|w| |f|-|s|t|r|i|n|g| |w|i|t|h| |l|i|t|e|r|a|l| |{@1|f|i|e|l|d|}@1| |a|n|d| |f|i|e|l|d|s| |{+0#e000e06&|f+0#0000000&|o@1|}+0#e000e06&| +0#e000002&|a|n|d| |{+0#e000e06&|b+0#0000000&|a|r|}+0#e000e06&|"+0#e000002&| +0#0000000&@1 |t|e|s|t| |=| |f+0#e000002&|r|'@2|R|a|w| |f|-|s|t|r|i|n|g| |w|i|t|h| |q|u|o|t|e|s| |'| |a|n|d| |"| +0#0000000&@30 |a+0#e000002&|n|d| |l|i|t|e|r|a|l| |\|t| |a|n|d| |\|0|4|0| |a|n|d| |\|x|F@1| +0#0000000&@42 -@57|8|2|,|1| @9|3|2|%| +@57|8|2|,|1| @9|3|0|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_06.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_06.dump index eb1ae0c310..8f1352e812 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_06.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_06.dump @@ -17,4 +17,4 @@ |t+0#0000000&|e|s|t| |=| |T+0#e000002&|"|T|-|s|t|r|i|n|g| |w|i|t|h| |e|s|c|a|p|e|s| |\+0#e000e06&|0|4|0| +0#e000002&|a|n|d| |\+0#e000e06&|x|F@1| +0#e000002&|a|n|d| |f|i|e|l|d|s| |{+0#e000e06&|f+0#0000000&|o@1|}+0#e000e06&| +0#e000002&|a|n|d| |{+0#e000e06&|b+0#0000000&|a|r|}+0#e000e06&|"+0#e000002&| +0#0000000&@2 |t|e|s|t| |=| |t+0#e000002&|'|T|-|s|t|r|i|n|g| |w|i|t|h| |e|s|c|a|p|e|s| |\+0#e000e06&|u|0@1|A|1| +0#e000002&|a|n|d| |\+0#e000e06&|U|0@2|1|0|6|0|5| +0#e000002&|a|n|d| |\+0#e000e06&|N|{|I|N|V|E|R|T|E|D| |E|X|C|L|A|M |A|T|I|O|N| |M|A|R|K|}| +0#e000002&|a|n|d| |f|i|e|l|d|s| |{+0#e000e06&|f+0#0000000&|o@1|}+0#e000e06&| +0#e000002&|a|n|d| |{+0#e000e06&|b+0#0000000&|a|r|}+0#e000e06&|'+0#e000002&| +0#0000000&@35 -@57|9|5|,|1| @9|3|8|%| +@57|9|5|,|1| @9|3|6|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_07.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_07.dump index ac44922a38..d8d600cbb9 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_07.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_07.dump @@ -17,4 +17,4 @@ |#+0#0000e05&| |R|a|w| |t|e|m|p|l|a|t|e| |s|t|r|i|n|g| |l|i|t|e|r|a|l|s| +0#0000000&@44 |t|e|s|t| |=| |t+0#e000002&|r|'|R|a|w| |t|-|s|t|r|i|n|g| |w|i|t|h| |l|i|t|e|r|a|l| |\|'| |a|n|d| |\|"| |a|n|d| |\|t| |a|n|d| |f|i|e|l|d|s| |{+0#e000e06&|f+0#0000000&|o@1|}+0#e000e06&| +0#e000002&|a|n|d| |{+0#e000e06& |b+0#0000000&|a|r|}+0#e000e06&|'+0#e000002&| +0#0000000&@69 -@57|1@1|0|,|1| @8|4|5|%| +@57|1@1|0|,|1| @8|4|2|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_08.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_08.dump index 34090dc857..86e14f46f4 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_08.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_08.dump @@ -17,4 +17,4 @@ |a+0#e000002&|n|d| |l|i|t|e|r|a|l| |\|u|0@1|A|1| |a|n|d| |\|U|0@2|1|0|6|0|5| +0#0000000&@41 |a+0#e000002&|n|d| |f|i|e|l|d|s| |{+0#e000e06&|1+0#e000002&|}+0#e000e06&|,+0#e000002&| |{+0#e000e06&|2+0#e000002&|}+0#e000e06&| +0#e000002&|a|n|d| |{+0#e000e06&|1+0#e000002&| +0#0000000&@48 @4|+| @69 -@57|1|2|5|,|1| @8|5|1|%| +@57|1|2|5|,|1| @8|4|8|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_09.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_09.dump index 56be10e7cc..2ab49cc46c 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_09.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_09.dump @@ -17,4 +17,4 @@ @4|2+0#e000002&| +0#0000000&|+| @67 @4|3+0#e000002&|}+0#e000e06&|"+0#e000002&| +0#0000000&@67 |t|e|s|t| |=| |f+0#e000002&|"|F|l|o|a|t| |i|s| |{+0#e000e06&|1+0#e000002&|.|2|3|}+0#e000e06&|"+0#e000002&| +0#0000000&@49 -@57|1|3|9|,|1| @8|5|7|%| +@57|1|3|9|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_10.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_10.dump index 882875c9ef..fb8502c5e2 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_10.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_10.dump @@ -17,4 +17,4 @@ |t|e|s|t| |=| |f+0#e000002&|"|r|e|s|u|l|t|:| |{+0#e000e06&|v+0#0000000&|a|l|u|e|:+0#e000e06&|{|w|i|d|t|h|:|d|}|.|{|p|r|e|c|i|s|i|o|n|!|s|}@1|"+0#e000002&| +0#0000000&@25 |t|e|s|t| |=| |f+0#e000002&|"|r|e|s|u|l|t|:| |{+0#e000e06&|v+0#0000000&|a|l|u|e|:+0#e000e06&|{|o|p|t|i|o|n|s|}|{|w|i|d|t|h|}|{|g|r|o|u|p|i|n|g|}|{|p|r|e|c|i|s|i|o|n|}|{|t|y|p|e|}@1|"+0#e000002&| +0#0000000&@5 |t|e|s|t| |=| |f+0#e000002&|"|{+0#e000e06&|n+0#0000000&|u|m|b|e|r|:+0#e000e06&|#|0|x|}|"+0#e000002&| +0#0000000&@52 -@57|1|5|7|,|1| @8|6|5|%| +@57|1|5|7|,|1| @8|6|1|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_11.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_11.dump index 03ca4e2dd6..87592e1718 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_11.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_11.dump @@ -17,4 +17,4 @@ |t|e|s|t| |=| |f+0#e000002&|"|a|b|c| |{+0#e000e06&|a+0#0000000&|[|"+0#e000002&|x|"|]+0#0000000&|}+0#e000e06&| +0#e000002&|d|e|f|"| +0#0000000&@48 |t|e|s|t| |=| |f+0#e000002&|"|L|i|s|t| |c|o|n|t|a|i|n|s|:|\+0#e000e06&|n|{|"+0#e000002&|\+0#e000e06&|n|"+0#e000002&|.+0#0000000&|j|o|i|n|(|a|)|}+0#e000e06&|"+0#e000002&| +0#0000000&@34 |t|e|s|t| |=| |f+0#e000002&|"|T|o|d|a|y|'|s| |d|a|t|e| |i|s| |{+0#e000e06&|d+0#0000000&|a|t|e|t|i|m|e|.|n|o|w|(|)|}+0#e000e06&|"+0#e000002&| +0#0000000&@32 -@57|1|7|5|,|1| @8|7|3|%| +@57|1|7|5|,|1| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_12.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_12.dump index 55c8de886e..c656774ec9 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_12.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_12.dump @@ -17,4 +17,4 @@ |t|e|s|t| |=| |f+0#e000002&|"|E|x|p|r|e|s@1|i|o|n| |i|s| |{+0#e000e06&|x+0#0000000&| |=@1| |1+0#e000002&|}+0#e000e06&|"+0#e000002&| +0#0000000&@42 |t|e|s|t| |=| |f+0#e000002&|"|E|x|p|r|e|s@1|i|o|n| |i|s| |{+0#e000e06&|x+0#0000000&| |!|=| |1+0#e000002&|}+0#e000e06&|"+0#e000002&| +0#0000000&@42 |t|e|s|t| |=| |f+0#e000002&|"|E|x|p|r|e|s@1|i|o|n| |i|s| |{+0#e000e06&|(+0#0000000&|x| |:|=| |1+0#e000002&|)+0#0000000&|}+0#e000e06&|"+0#e000002&| +0#0000000&@40 -@57|1|9|2|,|1| @8|8|0|%| +@57|1|9|2|,|1| @8|7|6|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_13.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_13.dump index 1924c9f006..748c058303 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_13.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_13.dump @@ -17,4 +17,4 @@ @75 |#+0#0000e05&| |B|y|t|e|s| +0#0000000&@67 |t|e|s|t| |=| |b+0#e000002&|'|B|y|t|e|s| |w|i|t|h| |e|s|c|a|p|e|s| |\+0#e000e06&|'| +0#e000002&|a|n|d| |\+0#e000e06&|"| +0#e000002&|a|n|d| |\+0#e000e06&|t|'+0#e000002&| +0#0000000&@29 -@57|2|1|0|,|1| @8|8|7|%| +@57|2|1|0|,|1| @8|8|2|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_14.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_14.dump index 882a1e9011..0652de0489 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_14.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_14.dump @@ -10,11 +10,11 @@ |t|e|s|t| |=| |B+0#e000002&|"@2|B|y|t|e|s| |w|i|t|h| |q|u|o|t|e|s| |'| |a|n|d| |"| +0#0000000&@38 |a+0#e000002&|n|d| |e|s|c|a|p|e|s| |\+0#e000e06&|t| +0#e000002&|a|n|d| |\+0#e000e06&|0|4|0| +0#e000002&|a|n|d| |\+0#e000e06&|x|F@1| +0#0000000&@42 |a+0#e000002&|n|d| |S|y|n|t|a|x|W|a|r|n|i|n|g| |\|u|0@1|A|1| |a|n|d| |\|U|0@2|1|0|6|0|5|"@2| +0#0000000&@32 +|t|e|s|t| |=| |b+0#e000002&|"|B|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |[|"| +0#0000000&@44 +|t|e|s|t| |=| |b+0#e000002&|"|B|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |(|"| +0#0000000&@44 +|t|e|s|t| |=| |b+0#e000002&|"|B|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |{|"| +0#0000000&@44 @75 |#+0#0000e05&| |R|a|w| |b|y|t|e|s| +0#0000000&@63 |t|e|s|t| |=| |b+0#e000002&|r|'|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|'| |a|n|d| |\|"| |a|n|d| |\|t|'| +0#0000000&@24 |t|e|s|t| |=| |b+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|0|4|0| |a|n|d| |\|x|F@1|"| +0#0000000&@27 -|t|e|s|t| |=| |B+0#e000002&|r|'|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|u|0@1|A|1| |a|n|d| |\|U|0@2|1|0|6|0|5| |a|n|d| |\|N|{|I|N|V|E|R|T|E|D| |E|X|C|L -|A|M|A|T|I|O|N| |M|A|R|K|}|'| +0#0000000&@60 -|t|e|s|t| |=| |B+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\@1| |b|a|c|k|s|l|a|s|h|e|s| |a|n|d| |l|i|t|e|r|a|l| |\| +0#0000000&@13 -@57|2@1|5|,|1| @8|9|4|%| +@57|2@1|5|,|1| @8|8|9|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_15.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_15.dump index 52fce247fe..92d457e219 100644 --- a/runtime/syntax/testdir/dumps/python_strings_bytes_15.dump +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_15.dump @@ -1,10 +1,13 @@ -|t+0&#ffffff0|e|s|t| |=| |B+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\@1| |b|a|c|k|s|l|a|s|h|e|s| |a|n|d| |l|i|t|e|r|a|l| |\| +0#0000000&@13 +|t+0&#ffffff0|e|s|t| |=| |b+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|0|4|0| |a|n|d| |\|x|F@1|"| +0#0000000&@27 +|t|e|s|t| |=| |B+0#e000002&|r|'|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|u|0@1|A|1| |a|n|d| |\|U|0@2|1|0|6|0|5| |a|n|d| |\|N|{|I|N|V|E|R|T|E|D| |E|X|C|L +|A|M|A|T|I|O|N| |M|A|R|K|}|'| +0#0000000&@60 +|t|e|s|t| |=| |B+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\@1| |b|a|c|k|s|l|a|s|h|e|s| |a|n|d| |l|i|t|e|r|a|l| |\| +0#0000000&@13 |n+0#e000002&|e|w|l|i|n|e|"| +0#0000000&@66 -|t|e|s|t| |=| |r+0#e000002&|b|'|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|'| |a|n|d| |\|"| |a|n|d| |\|t|'| +0#0000000&@24 +>t|e|s|t| |=| |r+0#e000002&|b|'|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|'| |a|n|d| |\|"| |a|n|d| |\|t|'| +0#0000000&@24 |t|e|s|t| |=| |r+0#e000002&|B|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|0|4|0| |a|n|d| |\|x|F@1|"| +0#0000000&@27 |t|e|s|t| |=| |R+0#e000002&|b|'|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\|u|0@1|A|1| |a|n|d| |\|U|0@2|1|0|6|0|5| |a|n|d| |\|N|{|I|N|V|E|R|T|E|D| |E|X|C|L |A|M|A|T|I|O|N| |M|A|R|K|}|'| +0#0000000&@60 ->t|e|s|t| |=| |R+0#e000002&|B|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\@1| |b|a|c|k|s|l|a|s|h|e|s| |a|n|d| |l|i|t|e|r|a|l| |\| +0#0000000&@13 +|t|e|s|t| |=| |R+0#e000002&|B|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |l|i|t|e|r|a|l| |\@1| |b|a|c|k|s|l|a|s|h|e|s| |a|n|d| |l|i|t|e|r|a|l| |\| +0#0000000&@13 |n+0#e000002&|e|w|l|i|n|e|"| +0#0000000&@66 |t|e|s|t| |=| |b+0#e000002&|r|'@2|R|a|w| |b|y|t|e|s| |w|i|t|h| |q|u|o|t|e|s| |'| |a|n|d| |"| +0#0000000&@33 |a+0#e000002&|n|d| |l|i|t|e|r|a|l| |\|t| |a|n|d| |\|0|4|0| |a|n|d| |\|x|F@1| +0#0000000&@42 @@ -12,9 +15,6 @@ |t|e|s|t| |=| |R+0#e000002&|B|"@2|R|a|w| |b|y|t|e|s| |w|i|t|h| |q|u|o|t|e|s| |'| |a|n|d| |"| +0#0000000&@33 |a+0#e000002&|n|d| |l|i|t|e|r|a|l| |\|t| |a|n|d| |\|0|4|0| |a|n|d| |\|x|F@1| +0#0000000&@42 |a+0#e000002&|n|d| |l|i|t|e|r|a|l| |\|u|0@1|A|1| |a|n|d| |\|U|0@2|1|0|6|0|5|"@2| +0#0000000&@38 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|2|4|2|,|1| @8|B|o|t| +|t|e|s|t| |=| |r+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |[|"| +0#0000000&@39 +|t|e|s|t| |=| |r+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |(|"| +0#0000000&@39 +@57|2|4|2|,|1| @8|9|5|%| diff --git a/runtime/syntax/testdir/dumps/python_strings_bytes_16.dump b/runtime/syntax/testdir/dumps/python_strings_bytes_16.dump new file mode 100644 index 0000000000..3b8500f04c --- /dev/null +++ b/runtime/syntax/testdir/dumps/python_strings_bytes_16.dump @@ -0,0 +1,20 @@ +|t+0&#ffffff0|e|s|t| |=| |r+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |(|"| +0#0000000&@39 +|t|e|s|t| |=| |r+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |{|"| +0#0000000&@39 +|t|e|s|t| |=| |R+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |[|"| +0#0000000&@39 +|t|e|s|t| |=| |R+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |(|"| +0#0000000&@39 +|t|e|s|t| |=| |R+0#e000002&|b|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |{|"| +0#0000000&@39 +>t|e|s|t| |=| |b+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |[|"| +0#0000000&@39 +|t|e|s|t| |=| |b+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |(|"| +0#0000000&@39 +|t|e|s|t| |=| |b+0#e000002&|R|"|R|a|w| |b|y|t|e|s| |w|i|t|h| |b|r|a|c|k|e|t| |{|"| +0#0000000&@39 +@75 +@75 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|2|5|9|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/input/python_strings_bytes.py b/runtime/syntax/testdir/input/python_strings_bytes.py index 569168637e..f8b880ef09 100644 --- a/runtime/syntax/testdir/input/python_strings_bytes.py +++ b/runtime/syntax/testdir/input/python_strings_bytes.py @@ -229,6 +229,9 @@ test = B"""Bytes with quotes ' and " and escapes \t and \040 and \xFF and SyntaxWarning \u00A1 and \U00010605""" +test = b"Bytes with bracket [" +test = b"Bytes with bracket (" +test = b"Bytes with bracket {" # Raw bytes test = br'Raw bytes with literal \' and \" and \t' @@ -247,3 +250,15 @@ test = RB"""Raw bytes with quotes ' and " and literal \t and \040 and \xFF and literal \u00A1 and \U00010605""" +test = rb"Raw bytes with bracket [" +test = rb"Raw bytes with bracket (" +test = rb"Raw bytes with bracket {" +test = Rb"Raw bytes with bracket [" +test = Rb"Raw bytes with bracket (" +test = Rb"Raw bytes with bracket {" +test = bR"Raw bytes with bracket [" +test = bR"Raw bytes with bracket (" +test = bR"Raw bytes with bracket {" + + + From 6c4bdf821e9e756329bfcbfa8522ba207c3770b7 Mon Sep 17 00:00:00 2001 From: mityu Date: Sun, 26 Jul 2026 14:40:46 +0000 Subject: [PATCH 213/647] patch 9.2.0857: popup: opacity popup over a terminal is not cleared when closed Problem: A semi-transparent (opacity) popup shown over a terminal window leaves its old cells on screen when it is closed. Solution: When a semi-transparent popup is closed, trigger full redraw of underlying terminal windows. fixes: #20846 closes: #20848 Signed-off-by: mityu Signed-off-by: Christian Brabandt --- src/popupwin.c | 11 +++++ .../Test_popupwin_opacity_term_close_1.dump | 12 +++++ .../Test_popupwin_opacity_term_close_2.dump | 12 +++++ src/testdir/test_popupwin.vim | 44 +++++++++++++++++++ src/version.c | 2 + 5 files changed, 81 insertions(+) create mode 100644 src/testdir/dumps/Test_popupwin_opacity_term_close_1.dump create mode 100644 src/testdir/dumps/Test_popupwin_opacity_term_close_2.dump diff --git a/src/popupwin.c b/src/popupwin.c index bbbfa300c6..7ef2d766a4 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -117,6 +117,7 @@ static void redraw_under_popup_area(int winrow, int wincol, int height, int width, int leftoff); static void redraw_overlapped_opacity_popups(int winrow, int wincol, int height, int width, int leftoff, int zindex); +static void redraw_win_under_opacity_popup(win_T *wp); #ifdef FEAT_IMAGE_KITTY static void popup_image_clear_kitty(win_T *wp); #endif @@ -4641,6 +4642,11 @@ popup_close(int id, int force) first_popupwin = wp->w_next; else prev->w_next = wp->w_next; +#ifdef FEAT_TERMINAL + // If the popup to be closed is opaque, terminal windows under + // the popup should trigger a force repaint of their windows. + redraw_win_under_opacity_popup(wp); +#endif popup_free(wp); return OK; } @@ -4684,6 +4690,11 @@ popup_close_tabpage(tabpage_T *tp, int id, int force) *root = wp->w_next; else prev->w_next = wp->w_next; +#ifdef FEAT_TERMINAL + // If the popup to be closed is opaque, terminal windows under + // the popup should trigger a force repaint of their windows. + redraw_win_under_opacity_popup(wp); +#endif popup_free(wp); return OK; } diff --git a/src/testdir/dumps/Test_popupwin_opacity_term_close_1.dump b/src/testdir/dumps/Test_popupwin_opacity_term_close_1.dump new file mode 100644 index 0000000000..46714d08b0 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_opacity_term_close_1.dump @@ -0,0 +1,12 @@ +|v+0&#ffffff0|i|m|>| > @69 +@75 +@75 +@75 +@9|A+0#0000001#ffffff255|B|C| +0#0000000#ffffff0@62 +@75 +@75 +@75 +@75 +@75 +@75 +@75 diff --git a/src/testdir/dumps/Test_popupwin_opacity_term_close_2.dump b/src/testdir/dumps/Test_popupwin_opacity_term_close_2.dump new file mode 100644 index 0000000000..cba005dca8 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_opacity_term_close_2.dump @@ -0,0 +1,12 @@ +|v+0&#ffffff0|i|m|>| > @69 +@75 +@75 +@75 +@75 +@75 +@75 +@75 +@75 +@75 +@75 +|:|c|a|l@1| |C|l|o|s|e|I|t|(|)| @59 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 6aed7be3ec..a08d50ebe5 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -5383,6 +5383,50 @@ func Test_popup_opacity_terminal_move_no_leftover() exe buf .. 'bwipe!' endfunc +func s:do_test_popup_opacity_terminal_close_no_leftover(tabpage) + CheckScreendump + CheckFeature terminal + CheckUnix + + " A semi-transparent popup over a terminal used to leave the old popup + " cells behind when it closed. + let lines =<< trim END + set shell=/bin/sh noruler + unlet $PROMPT_COMMAND + let $PS1 = 'vim> ' + terminal ++curwin + call popup_create('ABC', + \ #{line: 5, col: 10, highlight: 'None', opacity: 30}) + func CloseIt() + let id = popup_list()[0] + call popup_close(id) + endfunc + END + call writefile(lines, 'XtestPopupOpacityTermClose', 'D') + let buf = RunVimInTerminal('-S XtestPopupOpacityTermClose', + \ #{rows: 12, wait_for_ruler: 0}) + call WaitForAssert({-> assert_match('ABC', term_getline(buf, 5))}) + call VerifyScreenDump(buf, 'Test_popupwin_opacity_term_close_1', {}) + + " Close the popup: the old "ABC" cells must be cleared. + call term_sendkeys(buf, "\:call CloseIt()\") + call WaitForAssert({-> assert_equal('', term_getline(buf, 5)->trim())}) + call VerifyScreenDump(buf, 'Test_popupwin_opacity_term_close_2', {}) + + " clean up + call term_sendkeys(buf, "\:qa!\") + call WaitForAssert({-> assert_equal("finished", term_getstatus(buf))}) + exe buf .. 'bwipe!' +endfunc + +function Test_popup_opacity_global_terminal_close_no_leftover() + call s:do_test_popup_opacity_terminal_close_no_leftover(-1) +endfunction + +function Test_popup_opacity_tablocal_terminal_close_no_leftover() + call s:do_test_popup_opacity_terminal_close_no_leftover(0) +endfunction + func Test_popup_opacity_terminal_no_freeze() CheckFeature terminal CheckUnix diff --git a/src/version.c b/src/version.c index b289c6800e..ba72d4ad8b 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 857, /**/ 856, /**/ From 70da6c1a995601042a88f059523a3c95f31d39ac Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 26 Jul 2026 14:56:09 +0000 Subject: [PATCH 214/647] patch 9.2.0858: MS-Windows GUI: white flash when VimEnter is slow Problem: In the MS-Windows GUI the window is shown before the screen is drawn for the first time. Until then it displays undefined content, which appears as a white flash when a VimEnter autocommand delays the first redraw. Solution: Use the background color for the window as long as the screen contents are not available, and paint it again when the background color changes while only that color is shown. fixes: #20757 closes: #20807 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_w32.c | 18 ++++++++++++++++++ src/version.c | 2 ++ 2 files changed, 20 insertions(+) diff --git a/src/gui_w32.c b/src/gui_w32.c index d9dbe65aca..7e6c87ee23 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -379,6 +379,11 @@ static WPARAM s_wParam = 0; static LPARAM s_lParam = 0; static HWND s_textArea = NULL; + +// Set when the text area was painted with the background color only, because +// the screen contents were not available yet. +static bool s_textarea_bg_only = false; + static UINT s_uMsg = 0; static char_u *s_textfield; // Used by dialogs to pass back strings @@ -1632,6 +1637,10 @@ gui_mch_new_colors(void) prevBrush = (HBRUSH)SetClassLongPtr( s_hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)s_brush); InvalidateRect(s_hwnd, NULL, TRUE); + // The text area is a child window, the invalidation above does not + // include it. + if (s_textarea_bg_only && s_textArea != NULL) + InvalidateRect(s_textArea, NULL, TRUE); DeleteObject(prevBrush); } @@ -3714,6 +3723,15 @@ _OnPaint( if (!IsRectEmpty(&ps.rcPaint)) { + // The text area has no background brush, thus undefined pixels remain + // visible until the screen contents are drawn. + if (!screen_cleared || ScreenLines == NULL) + { + clear_rect(&ps.rcPaint); + s_textarea_bg_only = true; + } + else + s_textarea_bg_only = false; gui_redraw(ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left + 1, ps.rcPaint.bottom - ps.rcPaint.top + 1); diff --git a/src/version.c b/src/version.c index ba72d4ad8b..8dcb28fb00 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 858, /**/ 857, /**/ From 916809ae1e3e562e0a6220a6e7e08f38b8a23b62 Mon Sep 17 00:00:00 2001 From: Jon Parise Date: Sun, 26 Jul 2026 15:20:02 +0000 Subject: [PATCH 215/647] runtime(python): highlight the 'lazy' soft keyword Lazy imports (PEP 810, to be released in Python 3.15) introduces a `lazy` soft keyword that's recognized when it precedes a `from` or `import` keyword. closes: #20342 Signed-off-by: Jon Parise Signed-off-by: Christian Brabandt --- runtime/syntax/python.vim | 2 ++ .../testdir/dumps/python_import_00.dump | 20 +++++++++++++++++++ runtime/syntax/testdir/input/python_import.py | 18 +++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 runtime/syntax/testdir/dumps/python_import_00.dump create mode 100644 runtime/syntax/testdir/input/python_import.py diff --git a/runtime/syntax/python.vim b/runtime/syntax/python.vim index e483468995..c66fee6652 100644 --- a/runtime/syntax/python.vim +++ b/runtime/syntax/python.vim @@ -6,6 +6,7 @@ " 2025 Dec 03 by Vim Project: highlight t-strings #18679 " 2026 Jan 26 by Vim Project: highlight constants #18922 " 2026 Mar 11 by Vim Project: fix number performance #19630 +" 2026 May 27 by Vim Project: highlight `lazy` soft keyword (PEP 810) #20342 " Credits: Neil Schemenauer " Dmitry Vasiliev " Rob B @@ -120,6 +121,7 @@ syn keyword pythonAsync async await " for more on this. syn match pythonConditional "^\s*\zscase\%(\s\+.*:.*$\)\@=" syn match pythonConditional "^\s*\zsmatch\%(\s\+.*:\s*\%(#.*\)\=$\)\@=" +syn match pythonInclude "^\s*\zslazy\ze\s\+\%(from\|import\)\>" syn match pythonStatement "\#+0#0000e05#ffffff0| |I|m|p|o|r|t|s| +0#0000000&@65 +|i+0#e000e06&|m|p|o|r|t| +0#0000000&|j|s|o|n| @63 +|i+0#e000e06&|m|p|o|r|t| +0#0000000&|o|s|.|p|a|t|h| |a+0#af5f00255&|s| +0#0000000&|p| @55 +|f+0#e000e06&|r|o|m| +0#0000000&|j|s|o|n| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|d|u|m|p|s|,| |l|o|a|d|s| @45 +|f+0#e000e06&|r|o|m| +0#0000000&|j|s|o|n| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|d|u|m|p|s| |a+0#af5f00255&|s| +0#0000000&|d| @47 +|f+0#e000e06&|r|o|m| +0#0000000&|o|s| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|*| @58 +|f+0#e000e06&|r|o|m| +0#0000000&|.| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|s|u|b|m|o|d|u|l|e| @51 +|f+0#e000e06&|r|o|m| +0#0000000&|.+0#00e0e07&@2|p+0#0000000&|k|g|.|s|u|b| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|t|h|i|n|g| @46 +@75 +|#+0#0000e05&| |L|a|z|y| |i|m|p|o|r|t|s| |(|P|E|P| |8|1|0|)| +0#0000000&@50 +|l+0#e000e06&|a|z|y| +0#0000000&|i+0#e000e06&|m|p|o|r|t| +0#0000000&|j|s|o|n| @58 +|l+0#e000e06&|a|z|y| +0#0000000&|f+0#e000e06&|r|o|m| +0#0000000&|j|s|o|n| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|d|u|m|p|s| @47 +|l+0#e000e06&|a|z|y| +0#0000000&|f+0#e000e06&|r|o|m| +0#0000000&|.| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|s|u|b|m|o|d|u|l|e| @46 +|l+0#e000e06&|a|z|y| +0#0000000&|f+0#e000e06&|r|o|m| +0#0000000&|c|o|l@1|e|c|t|i|o|n|s| |i+0#e000e06&|m|p|o|r|t| +0#0000000&|O|r|d|e|r|e|d|D|i|c|t| |a+0#af5f00255&|s| +0#0000000&|O|D| @28 +@75 +|#+0#0000e05&| |`|l|a|z|y|`| |i|s| |a| |s|o|f|t| |k|e|y|w|o|r|d| |t|h|a|t|'|s| |o|n|l|y| |r|e|c|o|g|n|i|z|e|d| |i|n| |i|m|p|o|r|t|s| +0#0000000&@14 +|l|a|z|y| |=| |1+0#e000002&| +0#0000000&@66 +|d+0#af5f00255&|e|f| +0#0000000&|l+0#00e0e07&|a|z|y|(+0#0000000&|)|:| |p+0#af5f00255&|a|s@1| +0#0000000&@58 +|~+0#4040ff13&| @73 +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/input/python_import.py b/runtime/syntax/testdir/input/python_import.py new file mode 100644 index 0000000000..4cad61611f --- /dev/null +++ b/runtime/syntax/testdir/input/python_import.py @@ -0,0 +1,18 @@ +# Imports +import json +import os.path as p +from json import dumps, loads +from json import dumps as d +from os import * +from . import submodule +from ...pkg.sub import thing + +# Lazy imports (PEP 810) +lazy import json +lazy from json import dumps +lazy from . import submodule +lazy from collections import OrderedDict as OD + +# `lazy` is a soft keyword that's only recognized in imports +lazy = 1 +def lazy(): pass From 69db19ff65f2e1646cd34758ad42d68d2369057e Mon Sep 17 00:00:00 2001 From: Olaf Seibert Date: Mon, 27 Jul 2026 17:53:33 +0000 Subject: [PATCH 216/647] patch 9.2.0859: GTK2: Link error Problem: GTK2: Link error (after v9.2.0853) Solution: Adjust ifdef and include only when using at least GTK 3.10 (Olaf Seibert) Error message: ld: objects/gui_gtk_x11.o: in function `gui_mch_init': gui_gtk_x11.c:(.text+0x33f1): undefined reference to `gtk_widget_get_scale_factor' link.sh: Linking failed *** Error code 1 closes: #20857 Signed-off-by: Olaf Seibert Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 1291919b29..0647d9b16b 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -4299,7 +4299,7 @@ gui_mch_init(void) G_CALLBACK(gtk_settings_xft_dpi_changed_cb), NULL); } -#ifdef FEAT_IMAGE +#if defined(FEAT_IMAGE) && GTK_CHECK_VERSION(3,10,0) gui.scale = gtk_widget_get_scale_factor(gui.formwin); #endif diff --git a/src/version.c b/src/version.c index 8dcb28fb00..01b586bebf 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 859, /**/ 858, /**/ From 935fa240ea276f7bf361be87a1b0aa3ea15fd33a Mon Sep 17 00:00:00 2001 From: Ubaldo Tiberi Date: Mon, 27 Jul 2026 18:40:49 +0000 Subject: [PATCH 217/647] runtime(doc): clarify vim9 script autoload mechanism closes: #20833 Signed-off-by: Ubaldo Tiberi Signed-off-by: Christian Brabandt --- runtime/doc/usr_52.txt | 98 +++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/runtime/doc/usr_52.txt b/runtime/doc/usr_52.txt index f59e74b4eb..b34a80d490 100644 --- a/runtime/doc/usr_52.txt +++ b/runtime/doc/usr_52.txt @@ -1,4 +1,4 @@ -*usr_52.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*usr_52.txt* For Vim version 9.2. Last change: 2026 Jul 27 VIM USER MANUAL by Bram Moolenaar @@ -136,47 +136,83 @@ prefix that is very unlikely to be used elsewhere. For example, if you have a ============================================================================== *52.2* Autoloading -After splitting your large script into pieces, all the lines will still be -loaded and executed the moment the script is used. Every `import` loads the -imported script to find the items defined there. Although that is good for -finding errors early, it also takes time. Which is wasted if the -functionality is not often used. +After splitting a large script into pieces, an imported script is loaded and +executed at the moment the importing script is sourced. Every |:import| loads +the imported script to find the items defined there. However, if an imported +script is large, then the startup time may become noticeably slower, but on +the other hand if there are errors they will be detected at import time. -Instead of having `import` load the script immediately, it can be postponed -until needed. Using the example above, only one change needs to be made in -the plugin/theplugin.vim script: > +To avoid long startup times, the loading of an imported script may be deferred +until it is actually needed. This is done with the `autoload` keyword. Using +the example above, only one change is needed in `plugin/theplugin.vim`: +> import autoload "../lib/getmessage.vim" - +< Nothing in the rest of the script needs to change. However, the types will -not be checked. Not even the existence of the GetMessage() function is -checked until it is used. You will have to decide what is more important for -your script: fast startup or getting errors early. You can also add the -"autoload" argument later, after you have checked everything works. +not be checked, and "../lib/getmessage.vim" is not loaded at import time; Vim +only verifies that the file exists and is readable. Not even the existence of +the GetMessage() function is checked until it is used. As a result, errors in +the "getmessage.vim" script are detected only at runtime. +You will have to decide what is more important for your script: fast startup +or getting errors early. -AUTOLOAD DIRECTORY +A practical strategy is to omit the `autoload` keyword during development and +debugging so that errors are reported immediately, then add it back before +distributing your plugin to improve startup performance. -Another form is to use autoload with a script name that is not an absolute or -relative path: > - import autoload "monthlib.vim" -This will search for the script "monthlib.vim" in the autoload directories of -'runtimepath'. With Unix one of the directories often is "~/.vim/autoload". -It will also search under 'packpath', under "start". +AUTOLOAD DIRECTORIES -The main advantage of this is that this script can be easily shared with other -scripts. You do need to make sure that the script name is unique, since Vim -will search all the "autoload" directories in 'runtimepath', and if you are -using several plugins with a plugin manager, it may add a directory to -'runtimepath', each of which might have an "autoload" directory. +Another way to lazily load scripts is to `import autoload` a script without +specifying any relative or absolute path, like in the following example: > -Without autoload: > + import autoload "monthlib.vim" +< +Vim searches for the script in the "autoload" directories under 'runtimepath'. +This means that the script must reside in an "autoload" folder. On Unix +systems, one such directory is often `~/.vim/autoload`. It will also search +under 'packpath', under "start". + +When a script is imported this way, its exported symbols are referenced +through a global autoload namespace rather than remaining local to the +importing script. + +Since Vim searches every "autoload" directory in 'runtimepath', choose a +unique script name. Plugin managers often add multiple directories to +'runtimepath', each of which may contain an "autoload" directory. + +The two forms of `import autoload` are summarized as follows: + +- `import autoload "foo.vim"` + Vim searches 'runtimepath' for the script. Because such scripts must reside + under an "autoload" directory, exported symbols are available through the + global autoload namespace. + +- `import autoload "/some/path/foo.vim"` + If the resolved path falls under an "autoload" directory, exported symbols + are likewise in the global autoload namespace; otherwise they remain local + to the importing script. + +The main advantage of accessing symbols through the global autoload namespace +is that the script can be easily imported by other scripts, and symbols can +be used straight away. However, this has some drawbacks when reloading a +script, see |vim9-reload| for more info. + +When symbols are in script-local scope, sharing them across scripts is more +involved and there is no general rule: the right approach depends on the +plugin layout. + +Finally, when a script is imported without `autoload` and without path, like +the following example: > import "monthlib.vim" - +< Vim will search for the script "monthlib.vim" in the import directories of -'runtimepath'. Note that in this case adding or removing "autoload" changes -where the script is found. With a relative or absolute path the location does -not change. +'runtimepath'. + +In this case, adding or removing the `autoload` keyword changes where Vim +searches for the script. When a relative or absolute path is used, then the +location does not change. ============================================================================== *52.3* Autoloading without import/export From 247a4cb45e5d9b03e4cb0bbf1eddd0538471649d Mon Sep 17 00:00:00 2001 From: "Wu, Zhenyu" Date: Mon, 27 Jul 2026 18:55:11 +0000 Subject: [PATCH 218/647] patch 9.2.0860: filetype: xilinx design constraint files are not recognized Problem: filetype: xilinx design constraint files are not recognized Solution: Detect *.xdc files as tcl filetype (Wu, Zhenyu) Reference: https://docs.amd.com/r/en-US/ug903-vivado-using-constraints/About-XDC-Constraints closes: #20853 Signed-off-by: Wu, Zhenyu Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 4 +++- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 5b4264aeb4..7ed41785f9 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 24 +# Last Change: 2026 Jul 27 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -3166,6 +3166,8 @@ const ft_from_ext = { "tiltfile": "tiltfile", # Ghostty "ghostty": "ghostty", + # Xilinx Design Constraint file + "xdc": "tcl", } # Key: file name (the final path component, excluding the drive and root) # Value: filetype diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 075430ae54..e98f308afb 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -891,7 +891,7 @@ def s:GetFilenameChecks(): dict> taskdata: ['pending.data', 'completed.data', 'undo.data'], taskedit: ['file.task'], tcl: ['file.tcl', 'file.tm', 'file.tk', 'file.itcl', 'file.itk', 'file.jacl', '.tclshrc', 'tclsh.rc', '.wishrc', '.tclsh-history', - '.xsctcmdhistory', '.xsdbcmdhistory', 'vivado.jou', 'vivado.log'], + '.xsctcmdhistory', '.xsdbcmdhistory', 'vivado.jou', 'vivado.log', 'file.xdc'], teal: ['file.tl'], templ: ['file.templ'], template: ['file.tmpl'], diff --git a/src/version.c b/src/version.c index 01b586bebf..131299e89f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 860, /**/ 859, /**/ From 074e419c44620a58df88dead0c31b850241afda8 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 27 Jul 2026 19:13:22 +0000 Subject: [PATCH 219/647] patch 9.2.0861: GTK4: bleed region updates in jumps Problem: In the GTK4 GUI (GtkSnapshot) the bleed region is only repainted when the text grid changes by a whole cell, so during a resize it updates in jumps of several pixels instead of following the window edge smoothly. Solution: Redraw the draw area whenever the bleed values change (Foxe Chen). closes: #20851 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.c | 4 ++-- src/gui_gtk4.c | 9 ++++++++- src/proto/gui_gtk4.pro | 2 +- src/version.c | 2 ++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gui.c b/src/gui.c index 0c7b39be0b..d58f9f2cc8 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1727,7 +1727,7 @@ gui_resize_shell(int pixel_width, int pixel_height) gui_update_scrollbars(TRUE); gui_update_cursor(FALSE, TRUE); #if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) - gui_gtk_calculate_bleed(pixel_width, pixel_height); + gui_gtk4_calculate_bleed(pixel_width, pixel_height); #endif #if defined(FEAT_XIM) && !defined(FEAT_GUI_GTK) xim_set_status_area(); @@ -1900,7 +1900,7 @@ gui_set_shellsize( gui_reset_scroll_region(); #if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) - gui_gtk_calculate_bleed(width, height); + gui_gtk4_calculate_bleed(width, height); #endif } diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 486ed38a0e..6e5dbfda12 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -5018,8 +5018,11 @@ gui_mch_set_text_area_pos(int x, int y, int w, int h) * after all UI elements are positioned and resized. */ void -gui_gtk_calculate_bleed(int width, int height) +gui_gtk4_calculate_bleed(int width, int height) { + int old_right = gui.bleed_right; + int old_bot = gui.bleed_bot; + gui.bleed_right = width - last_text_area_w; gui.bleed_bot = height - last_text_area_h; @@ -5035,6 +5038,10 @@ gui_gtk_calculate_bleed(int width, int height) gui.bleed_right = 0; if (gui.bleed_bot < 0) gui.bleed_bot = 0; + + // Make sure to update draw area if changed + if (old_right != gui.bleed_right || old_bot != gui.bleed_bot) + gtk_widget_queue_draw(GTK_WIDGET(gui.drawarea)); } #endif diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index af55b50fcf..1541e45640 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -106,7 +106,7 @@ int gui_mch_get_scrollbar_ypadding(void); void gui_mch_create_scrollbar(scrollbar_T *sb, int orient); void gui_mch_destroy_scrollbar(scrollbar_T *sb); void gui_mch_set_text_area_pos(int x, int y, int w, int h); -void gui_gtk_calculate_bleed(int width, int height); +void gui_gtk4_calculate_bleed(int width, int height); char_u *gui_mch_browse(int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter); char_u *gui_mch_browsedir(char_u *title, char_u *initdir); int gui_mch_dialog(int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield, int ex_cmd); diff --git a/src/version.c b/src/version.c index 131299e89f..a183147a66 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 861, /**/ 860, /**/ From 6230e0d30e6b86c758ac9d1936c4e75c8d49b906 Mon Sep 17 00:00:00 2001 From: mityu Date: Mon, 27 Jul 2026 19:25:56 +0000 Subject: [PATCH 220/647] patch 9.2.0862: Missing test change from v9.2.0857 Problem: Missing test change from v9.2.0857 Solution: Update the test (mityu) related: #20848 closes: #20850 Signed-off-by: mityu Signed-off-by: Christian Brabandt --- src/testdir/test_popupwin.vim | 4 ++-- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index a08d50ebe5..701e33e52d 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -5390,13 +5390,13 @@ func s:do_test_popup_opacity_terminal_close_no_leftover(tabpage) " A semi-transparent popup over a terminal used to leave the old popup " cells behind when it closed. - let lines =<< trim END + let lines =<< eval trim END set shell=/bin/sh noruler unlet $PROMPT_COMMAND let $PS1 = 'vim> ' terminal ++curwin call popup_create('ABC', - \ #{line: 5, col: 10, highlight: 'None', opacity: 30}) + \ #{{line: 5, col: 10, highlight: 'None', opacity: 30, tabpage: {a:tabpage}}}) func CloseIt() let id = popup_list()[0] call popup_close(id) diff --git a/src/version.c b/src/version.c index a183147a66..42d645ef49 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 862, /**/ 861, /**/ From f546abd51b72b46429bec32dfd093ef6868035c4 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 27 Jul 2026 20:19:48 +0000 Subject: [PATCH 221/647] patch 9.2.0863: MS-Windows GUI: window contents can be missing when VimEnter is slow Problem: On MS-Windows the text area can stay undrawn while a slow VimEnter autocommand runs, so the window shows what was on the screen behind it. Whether this happens depends on when the first paint message arrives. Solution: Draw the text area when the window is opened, instead of waiting for the message loop. related: #20807 closes: #20858 Co-Authored-By: Claude Opus 5 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_w32.c | 10 ++++++++++ src/version.c | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/gui_w32.c b/src/gui_w32.c index 7e6c87ee23..0960b0d82f 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -1665,8 +1665,18 @@ gui_mch_open(void) // Actually open the window, if not already visible // (may be done already in gui_mch_set_shellsize) if (!IsWindowVisible(s_hwnd)) + { ShowWindow(s_hwnd, SW_SHOWDEFAULT); + // Waiting for the message loop leaves the window undrawn while a + // slow VimEnter autocommand runs. The flush presents the DirectX draw. + if (s_textArea != NULL) + { + UpdateWindow(s_textArea); + gui_mch_flush(); + } + } + #ifdef MSWIN_FIND_REPLACE // Init replace string here, so that we keep it when re-opening the // dialog. diff --git a/src/version.c b/src/version.c index 42d645ef49..e5dfd3eaa3 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 863, /**/ 862, /**/ From 32bc32c974a455f2d678c72bb270e93241998258 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 27 Jul 2026 20:28:31 +0000 Subject: [PATCH 222/647] patch 9.2.0864: Using some dead code in Wayland feature Problem: Using some dead code in Wayland feature Solution: Cleanup configure check and remove HAVE_SHM_OPEN test, remove mch_open_anon_file(), Show result "no" when disabling Wayland via configure, regenerate auto/configure (Foxe Chen) closes: #20859 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/auto/configure | 34 +++---------------------------- src/config.h.in | 3 --- src/configure.ac | 13 ++---------- src/os_unix.c | 47 ------------------------------------------- src/proto/os_unix.pro | 1 - src/version.c | 2 ++ 6 files changed, 7 insertions(+), 93 deletions(-) diff --git a/src/auto/configure b/src/auto/configure index f5d6dea01c..ffdff96628 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -9177,37 +9177,6 @@ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_fontset" >&5 printf "%s\n" "$enable_fontset" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if shm_open is available" >&5 -printf %s "checking if shm_open is available... " >&6; } -cppflags_save=$CPPFLAGS -CPPFLAGS="$CPPFLAGS $X_CFLAGS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include - #include -int -main (void) -{ -shm_open("/test", O_CREAT, 0600); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; }; printf "%s\n" "#define HAVE_SHM_OPEN 1" >>confdefs.h - -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } ;; -esac -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -CPPFLAGS=$cppflags_save - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking --with-wayland argument" >&5 printf %s "checking --with-wayland argument... " >&6; } @@ -9269,6 +9238,9 @@ printf "%s\n" "no" >&6; } fi CPPFLAGS=$cppflags_save CFLAGS=$cflags_save +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$enable_gui" = "xgtk4"; then diff --git a/src/config.h.in b/src/config.h.in index 7861329897..bb16501ead 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -514,9 +514,6 @@ /* Define if we have flock() */ #undef HAVE_FLOCK -/* Define if we have shm_open() */ -#undef HAVE_SHM_OPEN - /* Define to inline symbol or empty */ #undef inline diff --git a/src/configure.ac b/src/configure.ac index b71e553394..0cf75308be 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -2425,17 +2425,6 @@ AC_ARG_ENABLE(fontset, AC_MSG_RESULT($enable_fontset) dnl defining FEAT_XFONTSET is delayed, so that it can be disabled for no GUI -AC_MSG_CHECKING(if shm_open is available) -cppflags_save=$CPPFLAGS -CPPFLAGS="$CPPFLAGS $X_CFLAGS" -AC_LINK_IFELSE([AC_LANG_PROGRAM( - [#include - #include - #include ], [shm_open("/test", O_CREAT, 0600);])], - AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SHM_OPEN), - AC_MSG_RESULT(no)) -CPPFLAGS=$cppflags_save - AC_MSG_CHECKING(--with-wayland argument) AC_ARG_WITH(wayland, [ --with-wayland Include support for the Wayland protocol.], @@ -2480,6 +2469,8 @@ if test "$with_wayland" = yes; then fi CPPFLAGS=$cppflags_save CFLAGS=$cflags_save +else + AC_MSG_RESULT(no) fi dnl GTK4 does not use X11 APIs directly, so skip X11 detection entirely. diff --git a/src/os_unix.c b/src/os_unix.c index 85b4353c43..5a6ccacc9c 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -26,12 +26,6 @@ #include "os_unixx.h" // unix includes for os_unix.c only -#ifdef HAVE_SHM_OPEN -# include -# include -# include -#endif - #ifdef USE_XSMP # include #endif @@ -9168,44 +9162,3 @@ start_timeout(long msec) } # endif // PROF_NSEC #endif // FEAT_RELTIME - -/* - * Create an anonymous/temporary file/object and return its file descriptor. - * Returns -1 on error. - */ - int -mch_create_anon_file(void) -{ - int fd = -1; -#ifdef HAVE_SHM_OPEN - const char template[] = "/vimXXXXXX"; - - for (int i = 0; i < 100; i++) - { - mch_get_random((char_u*)template + 4, 6); - - errno = 0; - fd = shm_open(template, O_CREAT | O_RDWR | O_EXCL, 0600); - - if (fd >= 0 || errno != EEXIST) - break; - } - // Remove object name from namespace - shm_unlink(template); -#endif - // Last resort - if (fd == -1) - { - char_u *tempname; - // get a name for the temp file - if ((tempname = vim_tempname('w', FALSE)) == NULL) - { - emsg(_(e_cant_get_temp_file_name)); - return -1; - } - fd = mch_open((char *)tempname, O_CREAT | O_RDWR | O_EXCL, 0600); - mch_remove(tempname); - vim_free(tempname); - } - return fd; -} diff --git a/src/proto/os_unix.pro b/src/proto/os_unix.pro index aca289d1f7..69e620b981 100644 --- a/src/proto/os_unix.pro +++ b/src/proto/os_unix.pro @@ -95,5 +95,4 @@ void xsmp_close(void); void stop_timeout(void); volatile sig_atomic_t *start_timeout(long msec); void delete_timer(void); -int mch_create_anon_file(void); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index e5dfd3eaa3..6921752476 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 864, /**/ 863, /**/ From b56b4a3a6691a610f53f6d7a1ba721af3ad46b35 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 27 Jul 2026 20:43:18 +0000 Subject: [PATCH 223/647] patch 9.2.0865: GTK4: non-hardware accelerated UI is too slow Problem: GTK4: non-hardware accelerated UI is too slow Solution: Remove the sofware rendering (cairo) backend, make the GTK4 hardware accelerated rendering the default (Foxe Chen). closes: #20844 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/doc/gui_x11.txt | 10 +- runtime/doc/tags | 1 - runtime/doc/version9.txt | 3 +- src/auto/configure | 24 - src/config.h.in | 3 - src/configure.ac | 13 - src/feature.h | 2 +- src/gui.c | 30 +- src/gui.h | 8 +- src/gui_gtk4.c | 966 +-------------------------------------- src/gui_gtk4_da.c | 4 - src/gui_gtk4_da.h | 18 +- src/netbeans.c | 10 +- src/po/vim.pot | 5 +- src/proto/gui_gtk4.pro | 4 - src/version.c | 6 +- 16 files changed, 51 insertions(+), 1056 deletions(-) diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index 58467023a0..8f37a154c0 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -1,4 +1,4 @@ -*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jun 29 +*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jul 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -371,14 +371,6 @@ to use software rendering: > $ GSK_RENDERER=cairo gvim $ LIBGL_ALWAYS_SOFTWARE=true gvim < - *gtk4-hwaccel* -If Vim is compiled with the configure option "--enable-gtk4-hwaccel" set, then -the GTK4 GUI will use GtkSnapshot instead of Cairo, allowing for hardware -accelerated rendering, which is much faster. Enabling this configure option -also makes the GTK4 GUI use |+image_gdk| instead of |+image_cairo| for -rendering popup window images. Note that this feature is currently -experimental. - Tooltip Colors ~ *gtk-tooltip-colors* Example, which sets the tooltip colors to black on light-yellow: > diff --git a/runtime/doc/tags b/runtime/doc/tags index b01ae42046..28c30f03c9 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -8260,7 +8260,6 @@ gt tabpage.txt /*gt* gtk-css gui_x11.txt /*gtk-css* gtk-tooltip-colors gui_x11.txt /*gtk-tooltip-colors* gtk3-slow gui_x11.txt /*gtk3-slow* -gtk4-hwaccel gui_x11.txt /*gtk4-hwaccel* gtk4-menu-navigation gui_x11.txt /*gtk4-menu-navigation* gtk4-slow gui_x11.txt /*gtk4-slow* gu change.txt /*gu* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index efe88e9499..738e95bdbe 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Jul 22 +*version9.txt* For Vim version 9.2. Last change: 2026 Jul 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52663,7 +52663,6 @@ Platform specific ~ ----------------- - support OpenType font features in 'guifont' for DirectWrite (Win32) - Include strptime() fallback for MS-Windows -- Hardware-accelerated rendering for the GTK4 GUI via |gtk4-hwaccel|. - The NSIS installer has been reworked (Win32): - Support per-user and per-machine install. - Change the install directory structure. diff --git a/src/auto/configure b/src/auto/configure index ffdff96628..8fd4ba3b7e 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -862,7 +862,6 @@ enable_gui enable_gtk2_check enable_gnome_check enable_gtk4_check -enable_gtk4_hwaccel enable_gtk3_check enable_motif_check enable_gtktest @@ -1542,7 +1541,6 @@ Optional Features: --enable-gtk2-check If auto-select GUI, check for GTK+ 2 default=yes --enable-gnome-check If GTK GUI, check for GNOME default=no --enable-gtk4-check If auto-select GUI, check for GTK 4 default=yes - --enable-gtk4-hwaccel Use hardware accelerated rendering backend for GTK4 default=no --enable-gtk3-check If auto-select GUI, check for GTK+ 3 default=yes --enable-motif-check If auto-select GUI, check for Motif default=yes --disable-gtktest Do not try to compile and run a test GTK program @@ -10583,28 +10581,6 @@ printf "%s\n" "$enable_gtk4_check" >&6; } fi fi -if test "x$SKIP_GTK4" != "xYES" -a "$enable_gui_canon" = "gtk4"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking --enable-gtk4-hwaccel argument" >&5 -printf %s "checking --enable-gtk4-hwaccel argument... " >&6; } - # Check whether --enable-gtk4-hwaccel was given. -if test ${enable_gtk4_hwaccel+y} -then : - enableval=$enable_gtk4_hwaccel; -else case e in #( - e) enable_gtk4_hwaccel="no" ;; -esac -fi - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_gtk4_hwaccel" >&5 -printf "%s\n" "$enable_gtk4_hwaccel" >&6; } - - if test "x$enable_gtk4_hwaccel" = "xyes"; then - printf "%s\n" "#define USE_GTK4_SNAPSHOT 1" >>confdefs.h - - fi -fi - - if test "x$SKIP_GTK3" != "xYES" -a "$enable_gui_canon" != "gtk3"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether or not to look for GTK+ 3" >&5 printf %s "checking whether or not to look for GTK+ 3... " >&6; } diff --git a/src/config.h.in b/src/config.h.in index bb16501ead..d26bd2078e 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -499,9 +499,6 @@ /* Define if GTK GUI is to be linked against GTK 4 */ #undef USE_GTK4 -/* Define if GTK4 GUI should use hardware accelerated backend */ -#undef USE_GTK4_SNAPSHOT - /* Define if we have isinf() */ #undef HAVE_ISINF diff --git a/src/configure.ac b/src/configure.ac index 0cf75308be..654959874d 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -2715,19 +2715,6 @@ if test "x$SKIP_GTK4" != "xYES" -a "$enable_gui_canon" != "gtk4"; then fi fi -if test "x$SKIP_GTK4" != "xYES" -a "$enable_gui_canon" = "gtk4"; then - AC_MSG_CHECKING(--enable-gtk4-hwaccel argument) - AC_ARG_ENABLE(gtk4-hwaccel, - [ --enable-gtk4-hwaccel Use hardware accelerated rendering backend for GTK4 [default=no]], - , enable_gtk4_hwaccel="no") - AC_MSG_RESULT($enable_gtk4_hwaccel) - - if test "x$enable_gtk4_hwaccel" = "xyes"; then - AC_DEFINE(USE_GTK4_SNAPSHOT) - fi -fi - - if test "x$SKIP_GTK3" != "xYES" -a "$enable_gui_canon" != "gtk3"; then AC_MSG_CHECKING(whether or not to look for GTK+ 3) AC_ARG_ENABLE(gtk3-check, diff --git a/src/feature.h b/src/feature.h index 3a0b6931c0..5d5512615b 100644 --- a/src/feature.h +++ b/src/feature.h @@ -1132,7 +1132,7 @@ #endif #if defined(FEAT_IMAGE) && defined(FEAT_GUI_GTK) -# ifdef USE_GTK4_SNAPSHOT +# ifdef USE_GTK4 # define FEAT_IMAGE_GDK # else # define FEAT_IMAGE_CAIRO diff --git a/src/gui.c b/src/gui.c index d58f9f2cc8..5d6eae1054 100644 --- a/src/gui.c +++ b/src/gui.c @@ -24,7 +24,7 @@ static void set_guifontwide(char_u *font_name); static void gui_check_pos(void); static void gui_reset_scroll_region(void); static void gui_outstr(char_u *, int); -#ifndef USE_GTK4_SNAPSHOT +#ifndef USE_GTK4 static int gui_screenchar(int off, int flags, guicolor_T fg, guicolor_T bg, int back); #endif static int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T bg, int back); @@ -1199,7 +1199,7 @@ gui_update_cursor( int cattr; // cursor attributes int attr; attrentry_T *aep = NULL; -#if (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN)) && !defined(USE_GTK4_SNAPSHOT) +#if (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN)) && !defined(USE_GTK4) bool lig_left = false, lig_right = false; #endif @@ -1367,7 +1367,7 @@ gui_update_cursor( */ if (!gui.in_focus) { -#ifdef USE_GTK4_SNAPSHOT +#ifdef USE_GTK4 gui_gtk4_draw_cursor(cbg, cfg, -1, -1); #else gui_mch_draw_hollow_cursor(cbg); @@ -1375,7 +1375,7 @@ gui_update_cursor( return; } -#ifdef USE_GTK4_SNAPSHOT +#ifdef USE_GTK4 // Make sure that character underneath is drawn again in case it is part of // a ligature. gui_redraw_block(gui.row, gui.col, gui.row, gui.col, GUI_MON_NOCLEAR); @@ -1392,7 +1392,7 @@ gui_update_cursor( { gui_redraw_block(gui.row, c + 1, gui.row, gui.col - 1, GUI_MON_NOCLEAR); -# ifndef USE_GTK4_SNAPSHOT +# ifndef USE_GTK4 lig_left = true; # endif } @@ -1406,7 +1406,7 @@ gui_update_cursor( { gui_redraw_block(gui.row, gui.col + 1, gui.row, c - 1, GUI_MON_NOCLEAR); -# ifndef USE_GTK4_SNAPSHOT +# ifndef USE_GTK4 lig_right = true; # endif } @@ -1416,7 +1416,7 @@ gui_update_cursor( // it again. gui.cursor_is_valid = true; -# ifndef USE_GTK4_SNAPSHOT +# ifndef USE_GTK4 if ((lig_left || lig_right) && shape->shape != SHAPE_BLOCK) { // Because the cursor is not drawn with gui_screenchar(), must blit the @@ -1435,7 +1435,7 @@ gui_update_cursor( old_hl_mask = gui.highlight_mask; if (shape->shape == SHAPE_BLOCK) { -#ifdef USE_GTK4_SNAPSHOT +#ifdef USE_GTK4 gui_gtk4_draw_cursor(cbg, cfg, 0, 0); #else /* @@ -1484,7 +1484,7 @@ gui_update_cursor( } #endif } -#ifdef USE_GTK4_SNAPSHOT +#ifdef USE_GTK4 gui_gtk4_draw_cursor(cbg, cfg, cur_width, cur_height); #else gui_mch_draw_part_cursor(cur_width, cur_height, cbg); @@ -1496,7 +1496,7 @@ gui_update_cursor( // Doesn't seem to work for MSWindows. We call gui_redraw_block() above // for GtkSnapshot. -#if !defined(FEAT_GUI_MSWIN) && !defined(USE_GTK4_SNAPSHOT) +#if !defined(FEAT_GUI_MSWIN) && !defined(USE_GTK4) gui.highlight_mask = ScreenAttrs[LineOffset[gui.row] + gui.col]; (void)gui_screenchar(LineOffset[gui.row] + gui.col, GUI_MON_TRS_CURSOR | GUI_MON_NOCLEAR, @@ -1689,14 +1689,14 @@ gui_resize_shell(int pixel_width, int pixel_height) gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; gui.num_rows = (pixel_height - gui_get_base_height()) / gui.char_height; -#ifdef USE_GTK4_SNAPSHOT +#ifdef USE_GTK4 gui_gtk4_update_size(); #endif gui_position_components(pixel_width); gui_reset_scroll_region(); -#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) && !defined(USE_GTK4_SNAPSHOT) +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) && !defined(USE_GTK4) // We do not resize the draw area via the "resize" signal. This is because // when the window is resized, the form widget is the one that is resized, // so let that call gui_resize_shell() which will allocate the surface and @@ -1726,7 +1726,7 @@ gui_resize_shell(int pixel_width, int pixel_height) gui_update_scrollbars(TRUE); gui_update_cursor(FALSE, TRUE); -#if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) gui_gtk4_calculate_bleed(pixel_width, pixel_height); #endif #if defined(FEAT_XIM) && !defined(FEAT_GUI_GTK) @@ -1899,7 +1899,7 @@ gui_set_shellsize( gui_update_scrollbars(TRUE); gui_reset_scroll_region(); -#if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) gui_gtk4_calculate_bleed(width, height); #endif } @@ -2293,7 +2293,7 @@ gui_outstr(char_u *s, int len) } } -#ifndef USE_GTK4_SNAPSHOT +#ifndef USE_GTK4 /* * Output one character (may be one or two display cells). * Caller must check for valid "off". diff --git a/src/gui.h b/src/gui.h index 16f13e4772..e2232982e9 100644 --- a/src/gui.h +++ b/src/gui.h @@ -285,7 +285,7 @@ typedef struct Gui #ifdef FEAT_DIRECTX bool directx_enabled; // DirectX (DirectWrite) rendering active #endif -#if defined(FEAT_GUI_GTK) && defined(USE_GTK4_SNAPSHOT) +#if defined(FEAT_GUI_GTK) && defined(USE_GTK4) int bleed_right; // Number of pixels to bleed bg color right int bleed_bot; // Number of pixels to bleed bg color down #endif @@ -400,11 +400,9 @@ typedef struct Gui GdkColor *bgcolor; // GDK-styled background color GdkColor *spcolor; // GDK-styled special color # endif -# if defined(USE_GTK3) || defined(USE_GTK4) -# ifndef USE_GTK4_SNAPSHOT +# if defined(USE_GTK3) && !defined(USE_GTK4) cairo_surface_t *surface; // drawarea surface -# endif -# else +# elif !defined(USE_GTK4) GdkGC *text_gc; // cached GC for normal text # endif PangoContext *text_context; // the context used for all text diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 6e5dbfda12..93851af7c2 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -30,9 +30,7 @@ #include #include "gui_gtk4_f.h" #include "gui_gtk4_cb.h" -#ifdef USE_GTK4_SNAPSHOT -# include "gui_gtk4_da.h" -#endif +#include "gui_gtk4_da.h" #ifdef FEAT_TOOLBAR # include "gui_gtk4_tb.h" #endif @@ -271,9 +269,6 @@ modifiers_gdk2vim(guint state) static GtkWidget *vbox; // the main vertical box // Forward declarations for event callbacks -#ifndef USE_GTK4_SNAPSHOT -static void draw_event(GtkDrawingArea *area, cairo_t *cr, int width, int height, gpointer data); -#endif static gboolean key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); static void key_release_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); static void button_press_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data); @@ -299,9 +294,6 @@ static int query_pointer_pos(int *x, int *y, GdkModifierType *state); static void mainwin_fullscreened_cb(GObject *obj, GParamSpec *pspec, gpointer user_data); static void drawarea_realize_cb(GtkWidget *widget, gpointer data); static void drawarea_unrealize_cb(GtkWidget *widget, gpointer data); -#ifndef USE_GTK4_SNAPSHOT -static cairo_surface_t *create_backing_surface(int width, int height); -#endif static void scale_factor_cb(GdkSurface *surface, GParamSpec *pspec, void *udata); static void clipboard_changed_cb(GdkClipboard *clipboard, gpointer user_data); #ifdef FEAT_MENU @@ -554,22 +546,12 @@ gui_mch_init(void) gtk_box_append(GTK_BOX(vbox), gui.formwin); // The drawing area for the editor content. -#ifdef USE_GTK4_SNAPSHOT gui.drawarea = vim_draw_area_new(); -#else - gui.drawarea = gtk_drawing_area_new(); - gui.surface = NULL; -#endif gtk_widget_set_focusable(gui.drawarea, TRUE); gtk_widget_set_vexpand(gui.drawarea, TRUE); gtk_widget_set_hexpand(gui.drawarea, TRUE); vim_form_put(VIM_FORM(gui.formwin), gui.drawarea, 0, 0); -#ifndef USE_GTK4_SNAPSHOT - // Set up drawing. - gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(gui.drawarea), - (GtkDrawingAreaDrawFunc)draw_event, NULL, NULL); -#endif g_signal_connect(G_OBJECT(gui.drawarea), "realize", G_CALLBACK(drawarea_realize_cb), NULL); g_signal_connect(G_OBJECT(gui.drawarea), "unrealize", @@ -664,31 +646,9 @@ gui_mch_init(void) return OK; } -#ifndef USE_GTK4_SNAPSHOT -/* - * Called when the foreground or background color has been changed. - */ - static void -surface_fill_bg(void) -{ - if (gui.surface != NULL) - { - cairo_t *cr = cairo_create(gui.surface); - cairo_set_source_rgba(cr, - gui.bgcolor->red, gui.bgcolor->green, - gui.bgcolor->blue, gui.bgcolor->alpha); - cairo_paint(cr); - cairo_destroy(cr); - } -} -#endif - void gui_mch_new_colors(void) { -#ifndef USE_GTK4_SNAPSHOT - surface_fill_bg(); -#endif if (gui.drawarea != NULL && gtk_widget_get_realized(gui.drawarea)) gtk_widget_queue_draw(gui.drawarea); } @@ -1427,7 +1387,6 @@ gui_mch_get_rgb(guicolor_T pixel) * ============================================================ */ -#ifdef USE_GTK4_SNAPSHOT void gui_gtk4_update_size(void) { @@ -1435,7 +1394,7 @@ gui_gtk4_update_size(void) gui.num_rows, gui.num_cols); } -# ifdef FEAT_NETBEANS_INTG +#ifdef FEAT_NETBEANS_INTG void gui_gtk4_add_multisign( cairo_surface_t *surf, @@ -1447,90 +1406,13 @@ gui_gtk4_add_multisign( vim_draw_area_add_multisign(VIM_DRAW_AREA(gui.drawarea), surf, row, col, width, height); } -# endif -#else // USE_GTK4_SNAPSHOT -static void set_cairo_source_from_pixel(cairo_t *cr, guicolor_T pixel); - - static void -draw_event(GtkDrawingArea *area UNUSED, cairo_t *cr, - int width, int height, gpointer data UNUSED) -{ - // Surface creation/resizing is handled by drawarea_resize_cb. - // Here we only paint the surface to the widget. - - // Fill background with Vim's background color - set_cairo_source_from_pixel(cr, gui.back_pixel); - cairo_rectangle(cr, 0, 0, width, height); - cairo_fill(cr); - - // Paint the Vim surface on top - if (gui.surface != NULL) - { - cairo_set_source_surface(cr, gui.surface, 0, 0); - cairo_paint(cr); - } -} - - static void -set_cairo_source_from_pixel(cairo_t *cr, guicolor_T pixel) -{ - cairo_set_source_rgb(cr, - ((pixel & 0xff0000) >> 16) / 255.0, - ((pixel & 0xff00) >> 8) / 255.0, - (pixel & 0xff) / 255.0); -} - - static int -get_drawarea_scale(void) -{ - int scale = 1; - - if (gui.drawarea != NULL) - scale = gtk_widget_get_scale_factor(gui.drawarea); - if (scale < 1) - scale = 1; - return scale; -} - - static cairo_surface_t * -create_backing_surface(int width, int height) -{ - cairo_surface_t *surf; - int scale; - - if (width <= 0 || height <= 0) - return NULL; - - scale = get_drawarea_scale(); - surf = cairo_image_surface_create( - CAIRO_FORMAT_ARGB32, width * scale, height * scale); - cairo_surface_set_device_scale(surf, (double)scale, (double)scale); - return surf; -} -#endif // !USE_GTK4_SNAPSHOT +#endif void gui_mch_clear_block(int row1, int col1, int row2, int col2) { -#ifdef USE_GTK4_SNAPSHOT vim_draw_area_clear_block(VIM_DRAW_AREA(gui.drawarea), row1, col1, row2, col2); -#else - cairo_t *cr; - - if (gui.surface == NULL) - return; - - cr = cairo_create(gui.surface); - set_cairo_source_from_pixel(cr, gui.back_pixel); - cairo_rectangle(cr, - FILL_X(col1), FILL_Y(row1), - (col2 - col1 + 1) * gui.char_width, - (row2 - row1 + 1) * gui.char_height); - cairo_fill(cr); - cairo_destroy(cr); -#endif - if (gui.drawarea != NULL) gtk_widget_queue_draw(gui.drawarea); } @@ -1538,20 +1420,7 @@ gui_mch_clear_block(int row1, int col1, int row2, int col2) void gui_mch_clear_all(void) { -#ifdef USE_GTK4_SNAPSHOT vim_draw_area_clear(VIM_DRAW_AREA(gui.drawarea)); -#else - cairo_t *cr; - - if (gui.surface == NULL) - return; - - cr = cairo_create(gui.surface); - set_cairo_source_from_pixel(cr, gui.back_pixel); - cairo_paint(cr); - cairo_destroy(cr); -#endif - if (gui.drawarea != NULL) gtk_widget_queue_draw(gui.drawarea); } @@ -1687,52 +1556,12 @@ gui_mch_draw_popup_image( } #endif // FEAT_IMAGE_CAIRO -#ifndef USE_GTK4_SNAPSHOT - static void -surface_copy_rect(int dest_x, int dest_y, - int src_x, int src_y, - int width, int height) -{ - cairo_t *cr; - cairo_surface_t *tmp; - - if (gui.surface == NULL || width <= 0 || height <= 0) - return; - - // Use a temporary surface to avoid overlap issues - tmp = create_backing_surface(width, height); - if (tmp == NULL) - return; - cr = cairo_create(tmp); - cairo_set_source_surface(cr, gui.surface, -src_x, -src_y); - cairo_paint(cr); - cairo_destroy(cr); - - cr = cairo_create(gui.surface); - cairo_set_source_surface(cr, tmp, dest_x, dest_y); - cairo_paint(cr); - cairo_destroy(cr); - cairo_surface_destroy(tmp); -} -#endif - void gui_mch_delete_lines(int row, int num_lines) { -#ifdef USE_GTK4_SNAPSHOT vim_draw_area_move_block(VIM_DRAW_AREA(gui.drawarea), row, row + num_lines, gui.scroll_region_bot, gui.scroll_region_left, gui.scroll_region_right); -#else - int ncols = gui.scroll_region_right - gui.scroll_region_left + 1; - int nrows = gui.scroll_region_bot - row + 1; - int src_nrows = nrows - num_lines; - - surface_copy_rect( - FILL_X(gui.scroll_region_left), FILL_Y(row), - FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines), - gui.char_width * ncols + 1, gui.char_height * src_nrows); -#endif gui_clear_block( gui.scroll_region_bot - num_lines + 1, gui.scroll_region_left, gui.scroll_region_bot, gui.scroll_region_right); @@ -1743,20 +1572,9 @@ gui_mch_delete_lines(int row, int num_lines) void gui_mch_insert_lines(int row, int num_lines) { -#ifdef USE_GTK4_SNAPSHOT vim_draw_area_move_block(VIM_DRAW_AREA(gui.drawarea), row + num_lines, row, gui.scroll_region_bot - num_lines, gui.scroll_region_left, gui.scroll_region_right); -#else - int ncols = gui.scroll_region_right - gui.scroll_region_left + 1; - int nrows = gui.scroll_region_bot - row + 1; - int src_nrows = nrows - num_lines; - - surface_copy_rect( - FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines), - FILL_X(gui.scroll_region_left), FILL_Y(row), - gui.char_width * ncols + 1, gui.char_height * src_nrows); -#endif gui_clear_block( row, gui.scroll_region_left, row + num_lines - 1, gui.scroll_region_right); @@ -1764,7 +1582,6 @@ gui_mch_insert_lines(int row, int num_lines) gtk_widget_queue_draw(gui.drawarea); } -#if defined(USE_GTK4_SNAPSHOT) || defined(PROTO) /* * See vim_draw_area_set_cursor() for more information */ @@ -1776,70 +1593,11 @@ gui_gtk4_draw_cursor(guicolor_T bg, guicolor_T fg, int w, int h) vim_draw_area_set_cursor(VIM_DRAW_AREA(gui.drawarea), w, h); gtk_widget_queue_draw(gui.drawarea); } -#endif - -#if !defined(USE_GTK4_SNAPSHOT) || defined(PROTO) - void -gui_mch_draw_hollow_cursor(guicolor_T color) -{ - cairo_t *cr; - int i = 1; - - if (gui.surface == NULL) - return; - - cr = cairo_create(gui.surface); - gui_mch_set_fg_color(color); - cairo_set_source_rgba(cr, - gui.fgcolor->red, gui.fgcolor->green, - gui.fgcolor->blue, gui.fgcolor->alpha); - if (mb_lefthalve(gui.row, gui.col)) - i = 2; - cairo_set_line_width(cr, 1.0); - cairo_rectangle(cr, - FILL_X(gui.col) + 0.5, FILL_Y(gui.row) + 0.5, - i * gui.char_width - 1, gui.char_height - 1); - cairo_stroke(cr); - cairo_destroy(cr); - - gtk_widget_queue_draw(gui.drawarea); -} - - void -gui_mch_draw_part_cursor(int w, int h, guicolor_T color) -{ - cairo_t *cr; - - if (gui.surface == NULL) - return; - - gui_mch_set_fg_color(color); - cr = cairo_create(gui.surface); - cairo_set_source_rgba(cr, - gui.fgcolor->red, gui.fgcolor->green, - gui.fgcolor->blue, gui.fgcolor->alpha); - cairo_rectangle(cr, -# ifdef FEAT_RIGHTLEFT - CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w : -# endif - FILL_X(gui.col), FILL_Y(gui.row) + gui.char_height - h, - w, h); - cairo_fill(cr); - cairo_destroy(cr); - - gtk_widget_queue_draw(gui.drawarea); -} -#endif void gui_mch_flash(int msec) { // Invert the screen, wait, then invert back -#ifndef USE_GTK4_SNAPSHOT - if (gui.surface == NULL) - return; -#endif - gui_mch_invert_rectangle(0, 0, (int)Rows - 1, (int)Columns - 1); gui_mch_flush(); ui_delay((long)msec, TRUE); @@ -1849,24 +1607,7 @@ gui_mch_flash(int msec) void gui_mch_invert_rectangle(int r, int c, int nr, int nc) { -#ifdef USE_GTK4_SNAPSHOT vim_draw_area_invert_block(VIM_DRAW_AREA(gui.drawarea), r, c, nr, nc); -#else - cairo_t *cr; - - if (gui.surface == NULL) - return; - - cr = cairo_create(gui.surface); - cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE); - cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); - cairo_rectangle(cr, - FILL_X(c), FILL_Y(r), - (nc + 1) * gui.char_width, (nr + 1) * gui.char_height); - cairo_fill(cr); - cairo_destroy(cr); -#endif - gtk_widget_queue_draw(gui.drawarea); } @@ -2318,39 +2059,15 @@ focus_out_event(GtkEventControllerFocus *controller UNUSED, static void drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) { -#ifndef USE_GTK4_SNAPSHOT - int w, h; - - // Use formwin size since drawarea may not have its final size yet - if (gui.formwin != NULL) - { - w = gtk_widget_get_width(gui.formwin); - h = gtk_widget_get_height(gui.formwin); - } - else - { - w = gtk_widget_get_width(widget); - h = gtk_widget_get_height(widget); - } - - if (w <= 0) w = 800; - if (h <= 0) h = 600; + // Use GdkSurface, as that handles fractional scale values. + GdkSurface *surface = gtk_native_get_surface( + gtk_widget_get_native(gui.drawarea)); + double old = gui.scale; - if (gui.surface != NULL) - cairo_surface_destroy(gui.surface); - gui.surface = create_backing_surface(w, h); -#endif - { - // Use GdkSurface, as that handles fractional scale values. - GdkSurface *surface = gtk_native_get_surface( - gtk_widget_get_native(gui.drawarea)); - double old = gui.scale; - - gui.scale = gdk_surface_get_scale(surface); - popup_update_scale(old); - g_signal_connect(G_OBJECT(surface), "notify::scale", - G_CALLBACK(scale_factor_cb), NULL); - } + gui.scale = gdk_surface_get_scale(surface); + popup_update_scale(old); + g_signal_connect(G_OBJECT(surface), "notify::scale", + G_CALLBACK(scale_factor_cb), NULL); gui_mch_new_colors(); } @@ -2361,98 +2078,18 @@ drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) #ifdef FEAT_XIM im_shutdown(); #endif -#ifndef USE_GTK4_SNAPSHOT - if (gui.surface != NULL) - { - cairo_surface_destroy(gui.surface); - gui.surface = NULL; - } -#endif -} - -#ifndef USE_GTK4_SNAPSHOT - void -gui_gtk4_resize(int width, int height) -{ - cairo_t *cr; - cairo_surface_t *old_surface; - int scale = get_drawarea_scale(); - - if (width <= 0 || height <= 0) - return; - - // Keep the backing surface in sync with the drawing area so GTK keeps - // showing the previous frame. Re-creating it preserves the old - // contents. - if (gui.surface != NULL) - { - int sw = cairo_image_surface_get_width(gui.surface) / scale; - int sh = cairo_image_surface_get_height(gui.surface) / scale; - if (sw != width || sh != height) - { - old_surface = gui.surface; - gui.surface = create_backing_surface(width, height); - if (gui.surface != NULL) - { - cr = cairo_create(gui.surface); - set_cairo_source_from_pixel(cr, gui.back_pixel); - cairo_paint(cr); - cairo_set_source_surface(cr, old_surface, 0, 0); - cairo_paint(cr); - cairo_destroy(cr); - } - cairo_surface_destroy(old_surface); - } - } - else - { - gui.surface = create_backing_surface(width, height); - if (gui.surface != NULL) - { - cr = cairo_create(gui.surface); - set_cairo_source_from_pixel(cr, gui.back_pixel); - cairo_paint(cr); - cairo_destroy(cr); - } - } } -#endif static void scale_factor_cb(GdkSurface *surface, GParamSpec *pspec UNUSED, void *udata UNUSED) { -#ifndef USE_GTK4_SNAPSHOT - int w, h; - - w = gtk_widget_get_width(gui.drawarea); - h = gtk_widget_get_height(gui.drawarea); - if (w <= 0 || h <= 0) - return; - - if (gui.surface != NULL) - cairo_surface_destroy(gui.surface); - gui.surface = create_backing_surface(w, h); - - if (gui.surface != NULL) - { - cairo_t *cr = cairo_create(gui.surface); - set_cairo_source_from_pixel(cr, gui.back_pixel); - cairo_paint(cr); - cairo_destroy(cr); - } - gtk_widget_queue_draw(gui.drawarea); - if (gui.in_use) - redraw_all_later(UPD_CLEAR); -#endif #if defined(FEAT_IMAGE) - { - double old = gui.scale; + double old = gui.scale; - gui.scale = gdk_surface_get_scale(surface); - popup_update_scale(old); - } + gui.scale = gdk_surface_get_scale(surface); + popup_update_scale(old); #endif } @@ -3454,7 +3091,6 @@ tabline_menu_press_event( void gui_mch_drawsign(int row, int col, int typenr) { -# ifdef USE_GTK4_SNAPSHOT GdkTexture *sign; sign = (GdkTexture *)sign_get_image(typenr); @@ -3463,42 +3099,6 @@ gui_mch_drawsign(int row, int col, int typenr) vim_draw_area_add_sign(VIM_DRAW_AREA(gui.drawarea), sign, row, col, SIGN_WIDTH, SIGN_HEIGHT); -# else - GdkPixbuf *sign; - cairo_t *cr; - int width, height; - - sign = (GdkPixbuf *)sign_get_image(typenr); - if (sign == NULL || gui.surface == NULL) - return; - - cr = cairo_create(gui.surface); - - width = gdk_pixbuf_get_width(sign); - height = gdk_pixbuf_get_height(sign); - - // Scale to fit the sign area if needed - if (width != SIGN_WIDTH || height != SIGN_HEIGHT) - { - GdkPixbuf *scaled = gdk_pixbuf_scale_simple(sign, - SIGN_WIDTH, SIGN_HEIGHT, GDK_INTERP_BILINEAR); - if (scaled != NULL) - { - gdk_cairo_set_source_pixbuf(cr, scaled, - FILL_X(col), FILL_Y(row)); - g_object_unref(scaled); - } - else - gdk_cairo_set_source_pixbuf(cr, sign, - FILL_X(col), FILL_Y(row)); - } - else - gdk_cairo_set_source_pixbuf(cr, sign, - FILL_X(col), FILL_Y(row)); - - cairo_paint(cr); - cairo_destroy(cr); -# endif gtk_widget_queue_draw(gui.drawarea); } @@ -3508,21 +3108,13 @@ gui_mch_register_sign(char_u *signfile) { if (signfile[0] != NUL && signfile[0] != '-' && gui.in_use) { - GError *error = NULL; -# ifdef USE_GTK4_SNAPSHOT + GError *error = NULL; GdkTexture *sign; sign = gdk_texture_new_from_filename((const char *)signfile, &error); if (sign != NULL) return sign; -# else - GdkPixbuf *sign; - - sign = gdk_pixbuf_new_from_file((const char *)signfile, &error); - if (error == NULL) - return sign; -# endif semsg("E255: %s", error->message); g_error_free(error); @@ -3544,417 +3136,6 @@ gui_mch_destroy_sign(void *sign) * ============================================================ */ -#ifndef USE_GTK4_SNAPSHOT -/* - * Ligature and text drawing support. - * Ported from gui_gtk_x11.c (GTK3) to support 'guiligatures' in GTK4. - */ - -# define INSERT_PANGO_ATTR(Attribute, AttrList, Start, End) \ - G_STMT_START{ \ - PangoAttribute *tmp_attr_; \ - tmp_attr_ = (Attribute); \ - tmp_attr_->start_index = (Start); \ - tmp_attr_->end_index = (End); \ - pango_attr_list_insert((AttrList), tmp_attr_); \ - }G_STMT_END - -/* - * Apply the 'guifontwide' font to double-width characters in the string. - */ - static void -apply_wide_font_attr(char_u *s, int len, PangoAttrList *attr_list) -{ - char_u *start = NULL; - char_u *p; - int uc; - - for (p = s; p < s + len; p += utf_byte2len(*p)) - { - uc = utf_ptr2char(p); - - if (start == NULL) - { - if (uc >= 0x80 && utf_char2cells(uc) == 2) - start = p; - } - else if (uc < 0x80 - || (utf_char2cells(uc) != 2 && !utf_iscomposing(uc))) - { - INSERT_PANGO_ATTR(pango_attr_font_desc_new(gui.wide_font), - attr_list, start - s, p - s); - start = NULL; - } - } - - if (start != NULL) - INSERT_PANGO_ATTR(pango_attr_font_desc_new(gui.wide_font), - attr_list, start - s, len); -} - -/* - * Count the number of display cells occupied by a glyph cluster. - */ - static int -count_cluster_cells(char_u *s, PangoItem *item, - PangoGlyphString *glyphs, int i, - int *cluster_width, - int *last_glyph_rbearing) -{ - char_u *p; - int next; - int start, end; - int width; - int uc; - int cellcount = 0; - - width = glyphs->glyphs[i].geometry.width; - - for (next = i + 1; next < glyphs->num_glyphs; ++next) - { - if (glyphs->glyphs[next].attr.is_cluster_start) - break; - else if (glyphs->glyphs[next].geometry.width > width) - width = glyphs->glyphs[next].geometry.width; - } - - start = item->offset + glyphs->log_clusters[i]; - end = item->offset + ((next < glyphs->num_glyphs) ? - glyphs->log_clusters[next] : item->length); - - for (p = s + start; p < s + end; p += utf_byte2len(*p)) - { - uc = utf_ptr2char(p); - if (uc < 0x80) - ++cellcount; - else if (!utf_iscomposing(uc)) - cellcount += utf_char2cells(uc); - } - - if (last_glyph_rbearing != NULL - && cellcount > 0 && next == glyphs->num_glyphs) - { - PangoRectangle ink_rect; - - pango_font_get_glyph_extents(item->analysis.font, - glyphs->glyphs[i].glyph, - &ink_rect, NULL); - - if (PANGO_RBEARING(ink_rect) > 0) - *last_glyph_rbearing = PANGO_RBEARING(ink_rect); - } - - if (cellcount > 0) - *cluster_width = width; - - return cellcount; -} - -/* - * Handle combining characters that form a zero-width cluster. - */ - static void -setup_zero_width_cluster(PangoItem *item, PangoGlyphInfo *glyph, - int last_cellcount, int last_cluster_width, - int last_glyph_rbearing) -{ - PangoRectangle ink_rect; - PangoRectangle logical_rect; - int width; - - width = last_cellcount * gui.char_width * PANGO_SCALE; - glyph->geometry.x_offset = -width + MAX(0, width - last_cluster_width) / 2; - glyph->geometry.width = 0; - - pango_font_get_glyph_extents(item->analysis.font, - glyph->glyph, - &ink_rect, &logical_rect); - if (ink_rect.x < 0) - { - glyph->geometry.x_offset += last_glyph_rbearing; - glyph->geometry.y_offset = logical_rect.height - - (gui.char_height - p_linespace) * PANGO_SCALE; - } - else - glyph->geometry.x_offset = -width + MAX(0, width - ink_rect.width) / 2; -} - -/* - * Draw a single glyph string segment: background, foreground, and fake bold. - */ - static void -draw_glyph_string(int row, int col, int num_cells, int flags, - PangoFont *font, PangoGlyphString *glyphs, - cairo_t *cr) -{ - if (!(flags & DRAW_TRANSP)) - { - cairo_set_source_rgba(cr, - gui.bgcolor->red, gui.bgcolor->green, gui.bgcolor->blue, - gui.bgcolor->alpha); - cairo_rectangle(cr, - FILL_X(col), FILL_Y(row), - num_cells * gui.char_width, gui.char_height); - cairo_fill(cr); - } - - cairo_set_source_rgba(cr, - gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue, - gui.fgcolor->alpha); - cairo_move_to(cr, TEXT_X(col), TEXT_Y(row)); - pango_cairo_show_glyph_string(cr, font, glyphs); - - // Redraw with offset of 1 to emulate bold - if ((flags & DRAW_BOLD) && !gui.font_can_bold) - { - cairo_move_to(cr, TEXT_X(col) + 1, TEXT_Y(row)); - pango_cairo_show_glyph_string(cr, font, glyphs); - } -} - -/* - * Draw underline, undercurl, and strikethrough decorations. - */ - static void -draw_under(int flags, int row, int col, int cells, cairo_t *cr) -{ - // Draw underline - if (flags & DRAW_UNDERL) - { - int y = FILL_Y(row + 1) - 1; - cairo_set_source_rgba(cr, - gui.fgcolor->red, gui.fgcolor->green, - gui.fgcolor->blue, gui.fgcolor->alpha); - cairo_set_line_width(cr, 1.0); - cairo_move_to(cr, FILL_X(col), y + 0.5); - cairo_line_to(cr, FILL_X(col + cells), y + 0.5); - cairo_stroke(cr); - } - - // Draw undercurl - if (flags & DRAW_UNDERC) - { - static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2}; - int y = FILL_Y(row + 1) - 1; - int i, offset; - - cairo_set_line_width(cr, 1.0); - cairo_set_source_rgba(cr, - gui.spcolor->red, gui.spcolor->green, - gui.spcolor->blue, gui.spcolor->alpha); - cairo_move_to(cr, FILL_X(col) + 1, y - 2 + 0.5); - for (i = FILL_X(col) + 1; i < FILL_X(col + cells); ++i) - { - offset = val[i % 8]; - cairo_line_to(cr, i, y - offset + 0.5); - } - cairo_stroke(cr); - } - - // Draw strikethrough - if (flags & DRAW_STRIKE) - { - int y = FILL_Y(row) + gui.char_height / 2; - cairo_set_source_rgba(cr, - gui.fgcolor->red, gui.fgcolor->green, - gui.fgcolor->blue, gui.fgcolor->alpha); - cairo_set_line_width(cr, 1.0); - cairo_move_to(cr, FILL_X(col), y + 0.5); - cairo_line_to(cr, FILL_X(col + cells), y + 0.5); - cairo_stroke(cr); - } -} - -/* - * Draw a string of characters on the screen. - * "force_pango" is set when ligature characters require Pango shaping - * instead of the fast ASCII glyph cache path. - * Returns the number of display cells used. - */ - int -gui_gtk_draw_string_ext( - int row, - int col, - char_u *s, - int len, - int flags, - int force_pango) -{ - PangoGlyphString *glyphs; - int column_offset = 0; - int i; - GdkRectangle area; - cairo_t *cr; - - if (gui.text_context == NULL || gui.surface == NULL) - return len; - - // Restrict all drawing to the current screen line. - area.x = gui.border_offset; - area.y = FILL_Y(row); - area.width = gui.num_cols * gui.char_width; - area.height = gui.char_height; - - cr = cairo_create(gui.surface); - cairo_rectangle(cr, area.x, area.y, area.width, area.height); - cairo_clip(cr); - - glyphs = pango_glyph_string_new(); - - // Fast path for pure ASCII: use cached glyph table. - // Skip this path when force_pango is set (ligatures need shaping). - if (!(flags & DRAW_ITALIC) - && !((flags & DRAW_BOLD) && gui.font_can_bold) - && gui.ascii_glyphs != NULL - && !force_pango) - { - char_u *p; - - for (p = s; p < s + len; ++p) - if (*p & 0x80) - goto not_ascii; - - pango_glyph_string_set_size(glyphs, len); - - for (i = 0; i < len; ++i) - { - glyphs->glyphs[i] = gui.ascii_glyphs->glyphs[2 * s[i]]; - glyphs->log_clusters[i] = i; - } - - draw_glyph_string(row, col, len, flags, gui.ascii_font, glyphs, cr); - - column_offset = len; - } - else - { -not_ascii:; - PangoAttrList *attr_list; - GList *item_list; - int cluster_width; - int last_glyph_rbearing; - int cells = 0; - - // Safety check: pango crashes with invalid utf-8. - if (!utf_valid_string(s, s + len)) - { - column_offset = len; - goto skipitall; - } - - cluster_width = PANGO_SCALE * gui.char_width; - last_glyph_rbearing = PANGO_SCALE * gui.char_width; - - attr_list = pango_attr_list_new(); - - // If 'guifontwide' is set then use that for double-width characters. - if (gui.wide_font != NULL) - apply_wide_font_attr(s, len, attr_list); - - if ((flags & DRAW_BOLD) && gui.font_can_bold) - INSERT_PANGO_ATTR(pango_attr_weight_new(PANGO_WEIGHT_BOLD), - attr_list, 0, len); - if (flags & DRAW_ITALIC) - INSERT_PANGO_ATTR(pango_attr_style_new(PANGO_STYLE_ITALIC), - attr_list, 0, len); - - item_list = pango_itemize(gui.text_context, - (const char *)s, 0, len, attr_list, NULL); - - while (item_list != NULL) - { - PangoItem *item; - int item_cells = 0; - - item = (PangoItem *)item_list->data; - item_list = g_list_delete_link(item_list, item_list); - - // Force LTR direction; Vim handles bidi on its own. - item->analysis.level = (item->analysis.level + 1) & (~1U); - - pango_shape_full((const char *)s + item->offset, item->length, - (const char *)s, len, &item->analysis, glyphs); - - // Fixed-width hack: assign a fixed width to each glyph based on - // the number of cells it occupies, handling composing characters - // and cluster boundaries properly. - for (i = 0; i < glyphs->num_glyphs; ++i) - { - PangoGlyphInfo *glyph; - - glyph = &glyphs->glyphs[i]; - - if (glyph->attr.is_cluster_start) - { - int cellcount; - - cellcount = count_cluster_cells( - s, item, glyphs, i, &cluster_width, - (item_list != NULL) ? &last_glyph_rbearing : NULL); - - if (cellcount > 0) - { - int width; - - width = cellcount * gui.char_width * PANGO_SCALE; - glyph->geometry.x_offset += - MAX(0, width - cluster_width) / 2; - glyph->geometry.width = width; - } - else - { - setup_zero_width_cluster(item, glyph, cells, - cluster_width, - last_glyph_rbearing); - } - - item_cells += cellcount; - cells = cellcount; - } - else if (i > 0) - { - int width; - - if (glyph->geometry.x_offset >= 0) - { - glyphs->glyphs[i].geometry.width = - glyphs->glyphs[i - 1].geometry.width; - glyphs->glyphs[i - 1].geometry.width = 0; - } - width = cells * gui.char_width * PANGO_SCALE; - glyph->geometry.x_offset += - MAX(0, width - cluster_width) / 2; - } - else - { - glyph->geometry.width = 0; - } - } - - draw_glyph_string(row, col + column_offset, item_cells, - flags, item->analysis.font, glyphs, cr); - - pango_item_free(item); - - column_offset += item_cells; - } - - pango_attr_list_unref(attr_list); - } - -skipitall: - draw_under(flags, row, col, column_offset, cr); - cairo_destroy(cr); - - pango_glyph_string_free(glyphs); - - if (gui.drawarea != NULL) - gtk_widget_queue_draw(gui.drawarea); - - return column_offset; -} -#endif // !USE_GTK4_SNAPSHOT - /* * Draw a string of characters on the screen using the current font and colors. * Splits the string into ASCII and ligature/UTF-8 segments so that ligature @@ -3965,7 +3146,6 @@ not_ascii:; int gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) { -#ifdef USE_GTK4_SNAPSHOT int cells; cells = vim_draw_area_draw_string(VIM_DRAW_AREA(gui.drawarea), @@ -3975,120 +3155,6 @@ gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) gtk_widget_queue_draw(gui.drawarea); return cells; -#else - char_u *conv_buf = NULL; - int convlen; - int len_sum; - int byte_sum; - char_u *cs; - int needs_pango; - int should_need_pango = FALSE; - int slen; - int is_ligature; - int is_utf8; - char_u backup_ch; - - if (gui.text_context == NULL || gui.surface == NULL) - return len; - - if (output_conv.vc_type != CONV_NONE) - { - convlen = len; - conv_buf = string_convert(&output_conv, s, &convlen); - if (conv_buf != NULL) - { - s = conv_buf; - len = convlen; - } - } - - /* - * Ligature support: - * Split the string into segments that are either pure ASCII (fast path) - * or ligature/UTF-8 (Pango path). A single ligature character between - * ASCII characters is treated as ASCII since it can't form a ligature - * on its own. - */ - len_sum = 0; - byte_sum = 0; - cs = s; - - // First char decides starting mode. - is_utf8 = (*cs & 0x80); - is_ligature = gui.ligatures_map[*cs] && (len > 1); - if (is_ligature) - is_ligature = gui.ligatures_map[*(cs + 1)]; - if (!is_utf8 && len > 1) - is_utf8 = (*(cs + 1) & 0x80) != 0; - needs_pango = is_utf8 || is_ligature; - - while (cs < s + len) - { - slen = 0; - while (slen < (len - byte_sum)) - { - is_ligature = gui.ligatures_map[*(cs + slen)]; - // Look ahead: single ligature char between ASCII is ASCII. - if (is_ligature && !needs_pango) - { - if ((slen + 1) < (len - byte_sum)) - is_ligature = gui.ligatures_map[*(cs + slen + 1)]; - else - is_ligature = 0; - } - is_utf8 = *(cs + slen) & 0x80; - // ASCII followed by UTF-8 could be combining. - if ((!is_utf8) && ((slen + 1) < (len - byte_sum))) - is_utf8 = (*(cs + slen + 1) & 0x80); - should_need_pango = (is_ligature || is_utf8); - if (needs_pango != should_need_pango) - break; - if (needs_pango) - { - if (is_ligature) - { - slen++; - } - else - { - if ((*(cs + slen) & 0xC0) == 0x80) - { - while ((slen < (len - byte_sum)) - && ((*(cs + slen) & 0xC0) == 0x80)) - slen++; - } - else if ((*(cs + slen) & 0xE0) == 0xC0) - slen++; - else if ((*(cs + slen) & 0xF0) == 0xE0) - slen += 2; - else if ((*(cs + slen) & 0xF8) == 0xF0) - slen += 3; - else - slen++; - } - } - else - { - slen++; - } - } - - if (slen < len) - { - backup_ch = *(cs + slen); - *(cs + slen) = NUL; - } - len_sum += gui_gtk_draw_string_ext(row, col + len_sum, cs, slen, - flags, needs_pango); - if (slen < len) - *(cs + slen) = backup_ch; - cs += slen; - byte_sum += slen; - needs_pango = should_need_pango; - } - vim_free(conv_buf); - return len_sum; -#endif } int @@ -5012,7 +4078,6 @@ gui_mch_set_text_area_pos(int x, int y, int w, int h) vim_form_move_resize(VIM_FORM(gui.formwin), gui.drawarea, x, y, w, h); } -#ifdef USE_GTK4_SNAPSHOT /* * Calculate the number of pixels to bleed background color to. Should be called * after all UI elements are positioned and resized. @@ -5043,7 +4108,6 @@ gui_gtk4_calculate_bleed(int width, int height) if (old_right != gui.bleed_right || old_bot != gui.bleed_bot) gtk_widget_queue_draw(GTK_WIDGET(gui.drawarea)); } -#endif /* * ============================================================ diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 7a082cedfc..80d3044cb5 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -9,8 +9,6 @@ #include "vim.h" -#ifdef USE_GTK4_SNAPSHOT - #include #include "gui_gtk4_da.h" @@ -2024,5 +2022,3 @@ vim_draw_area_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) } #endif } - -#endif // USE_GTK4_SNAPSHOT diff --git a/src/gui_gtk4_da.h b/src/gui_gtk4_da.h index a214729a87..5708849f98 100644 --- a/src/gui_gtk4_da.h +++ b/src/gui_gtk4_da.h @@ -12,11 +12,9 @@ #include "vim.h" -#ifdef USE_GTK4_SNAPSHOT +#include -# include - -# define VIM_TYPE_DRAW_AREA (vim_draw_area_get_type()) +#define VIM_TYPE_DRAW_AREA (vim_draw_area_get_type()) G_DECLARE_FINAL_TYPE(VimDrawArea, vim_draw_area, VIM, DRAW_AREA, GtkWidget) GtkWidget *vim_draw_area_new(void); @@ -27,17 +25,15 @@ void vim_draw_area_clear(VimDrawArea *self); void vim_draw_area_move_block(VimDrawArea *self, int to, int row1, int row2, int col1, int col2); void vim_draw_area_set_cursor(VimDrawArea *self, int w, int h); void vim_draw_area_invert_block(VimDrawArea *self, int row, int col, int nrows, int ncols); -# if defined(FEAT_SIGN_ICONS) +#if defined(FEAT_SIGN_ICONS) void vim_draw_area_add_sign(VimDrawArea *self, GdkTexture *sign, int row, int col, int width, int height); -# endif -# ifdef FEAT_NETBEANS_INTG +#endif +#ifdef FEAT_NETBEANS_INTG void vim_draw_area_add_multisign(VimDrawArea *self, cairo_surface_t *surf, int row, int col, int width, int height); -# endif -# ifdef FEAT_IMAGE_GDK +#endif +#ifdef FEAT_IMAGE_GDK void vim_draw_area_add_image(VimDrawArea *self, GdkTexture *image, int row, int col, double src_x, double src_y, double draw_w, double draw_h, int zindex, int id); void vim_draw_area_remove_image(VimDrawArea *self, int id); -# endif - #endif #endif diff --git a/src/netbeans.c b/src/netbeans.c index abe5d11bc5..9aec664900 100644 --- a/src/netbeans.c +++ b/src/netbeans.c @@ -3100,7 +3100,7 @@ netbeans_draw_multisign_indicator(int row) # else GdkDrawable *drawable = gui.drawarea->window; # endif -# ifdef USE_GTK4_SNAPSHOT +# ifdef USE_GTK4 cairo_surface_t *surf; # endif @@ -3108,14 +3108,14 @@ netbeans_draw_multisign_indicator(int row) return; x = 0; -# ifdef USE_GTK4_SNAPSHOT +# ifdef USE_GTK4 y = 2; # else y = row * gui.char_height + 2; # endif # if GTK_CHECK_VERSION(3,0,0) -# ifdef USE_GTK4_SNAPSHOT +# ifdef USE_GTK4 surf = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, 5, gui.char_height); cr = cairo_create(surf); @@ -3152,7 +3152,7 @@ netbeans_draw_multisign_indicator(int row) gdk_draw_point(drawable, gui.text_gc, x+2, y); # endif -# ifdef USE_GTK4_SNAPSHOT +# ifdef USE_GTK4 cairo_fill(cr); gui_gtk4_add_multisign(surf, row, 0, 5, gui.char_height); # endif @@ -3160,7 +3160,7 @@ netbeans_draw_multisign_indicator(int row) # if GTK_CHECK_VERSION(3,0,0) cairo_destroy(cr); # endif -# ifdef USE_GTK4_SNAPSHOT +# ifdef USE_GTK4 cairo_surface_destroy(surf); # endif } diff --git a/src/po/vim.pot b/src/po/vim.pot index 358f4bb614..b6ded21320 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-07-23 20:13+0000\n" +"POT-Creation-Date: 2026-07-27 20:48+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3469,9 +3469,6 @@ msgstr "" msgid "without GUI." msgstr "" -msgid "with GTK4 GUI (hwaccel)." -msgstr "" - msgid "with GTK4 GUI." msgstr "" diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index 1541e45640..3c5f7a9250 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -49,11 +49,8 @@ void gui_mch_draw_popup_image(win_T *wp, int row, int col, int src_x, int src_y, void gui_mch_delete_lines(int row, int num_lines); void gui_mch_insert_lines(int row, int num_lines); void gui_gtk4_draw_cursor(guicolor_T bg, guicolor_T fg, int w, int h); -void gui_mch_draw_hollow_cursor(guicolor_T color); -void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_flash(int msec); void gui_mch_invert_rectangle(int r, int c, int nr, int nc); -void gui_gtk4_resize(int width, int height); void gui_gtk_set_dnd_targets(void); void gui_mch_update(void); int gui_mch_wait_for_chars(long wtime); @@ -78,7 +75,6 @@ void gui_mch_set_curtab(int nr); void gui_mch_drawsign(int row, int col, int typenr); void *gui_mch_register_sign(char_u *signfile); void gui_mch_destroy_sign(void *sign); -int gui_gtk_draw_string_ext(int row, int col, char_u *s, int len, int flags, int force_pango); int gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags); int gui_get_x11_windis(Window *win, Display **dis); void gui_gtk_set_mnemonics(int enable); diff --git a/src/version.c b/src/version.c index 6921752476..3f239da856 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 865, /**/ 864, /**/ @@ -2835,11 +2837,7 @@ list_version(void) msg_puts(_("without GUI.")); #elif defined(FEAT_GUI_GTK) # if defined(USE_GTK4) -# ifdef USE_GTK4_SNAPSHOT - msg_puts(_("with GTK4 GUI (hwaccel).")); -# else msg_puts(_("with GTK4 GUI.")); -# endif # elif defined(USE_GTK3) msg_puts(_("with GTK3 GUI.")); # elif defined(FEAT_GUI_GNOME) From a29d16a3919a12a0e775d50cc67f062c8d7ca33a Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 27 Jul 2026 21:55:27 +0000 Subject: [PATCH 224/647] patch 9.2.0866: MS-Windows: ":language messages" only works once Problem: On MS-Windows ":language messages" has no effect once messages have been translated, the previous language keeps being used. Solution: Make gettext drop the translations it cached. related: #18622 closes: #20862 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/locale.c | 4 ++++ src/os_win32.c | 7 +++++++ src/version.c | 2 ++ src/vim.h | 1 + 4 files changed, 14 insertions(+) diff --git a/src/locale.c b/src/locale.c index db2dfa1af5..eb1845fce5 100644 --- a/src/locale.c +++ b/src/locale.c @@ -348,6 +348,10 @@ ex_language(exarg_T *eap) extern int _nl_msg_cat_cntr; ++_nl_msg_cat_cntr; +# elif defined(DYNAMIC_GETTEXT) + // Same thing when gettext is loaded at runtime. + if (dyn_libintl_nl_msg_cat_cntr != NULL) + ++*dyn_libintl_nl_msg_cat_cntr; # endif // Reset $LC_ALL, otherwise it would overrule everything. vim_setenv((char_u *)"LC_ALL", (char_u *)""); diff --git a/src/os_win32.c b/src/os_win32.c index 4797eed426..53b600f809 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -696,6 +696,7 @@ char *(*dyn_libintl_bindtextdomain)(const char *, const char *) char *(*dyn_libintl_bind_textdomain_codeset)(const char *, const char *) = null_libintl_bind_textdomain_codeset; int (*dyn_libintl_wputenv)(const wchar_t *) = null_libintl_wputenv; +int *dyn_libintl_nl_msg_cat_cntr = NULL; int dyn_libintl_init(void) @@ -770,6 +771,11 @@ dyn_libintl_init(void) if (dyn_libintl_wputenv == NULL || dyn_libintl_wputenv == _wputenv) dyn_libintl_wputenv = null_libintl_wputenv; + // The _nl_msg_cat_cntr variable is optional. It is used to make gettext + // drop the translations it cached. + dyn_libintl_nl_msg_cat_cntr = (int *)GetProcAddress(hLibintlDLL, + "_nl_msg_cat_cntr"); + return 1; } @@ -785,6 +791,7 @@ dyn_libintl_end(void) dyn_libintl_bindtextdomain = null_libintl_bindtextdomain; dyn_libintl_bind_textdomain_codeset = null_libintl_bind_textdomain_codeset; dyn_libintl_wputenv = null_libintl_wputenv; + dyn_libintl_nl_msg_cat_cntr = NULL; } static char * diff --git a/src/version.c b/src/version.c index 3f239da856..48389e931f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 866, /**/ 865, /**/ diff --git a/src/vim.h b/src/vim.h index 408cf711d1..0caf437408 100644 --- a/src/vim.h +++ b/src/vim.h @@ -577,6 +577,7 @@ extern char *(*dyn_libintl_bindtextdomain)(const char *domainname, const char *d extern char *(*dyn_libintl_bind_textdomain_codeset)(const char *domainname, const char *codeset); extern char *(*dyn_libintl_textdomain)(const char *domainname); extern int (*dyn_libintl_wputenv)(const wchar_t *envstring); +extern int *dyn_libintl_nl_msg_cat_cntr; #endif From 930dccfed0617979b836dfefbbe57d5c26a6679d Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 27 Jul 2026 22:04:06 +0000 Subject: [PATCH 225/647] patch 9.2.0867: MS-Windows: messages are not in the display language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: On MS-Windows the messages use the language of the regional format, not the language that Windows is displayed in (Markus Nißl) Solution: Use the display language for the messages, with the other preferred languages as fall back. Make ":language messages" overrule it (Hirohito Higashi). fixes: #20855 closes: #20860 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/mlang.txt | 6 ++- src/locale.c | 15 +++--- src/option.c | 103 ++++++++++++++++++++++++++++++++---------- src/version.c | 2 + 4 files changed, 93 insertions(+), 33 deletions(-) diff --git a/runtime/doc/mlang.txt b/runtime/doc/mlang.txt index 6f0bb3fe62..0c1747eed6 100644 --- a/runtime/doc/mlang.txt +++ b/runtime/doc/mlang.txt @@ -1,4 +1,4 @@ -*mlang.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*mlang.txt* For Vim version 9.2. Last change: 2026 Jul 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -122,6 +122,10 @@ If you write your own translations you need to generate the .po file and convert it to a .mo file. You need to get the source distribution and read the file "src/po/README.txt". +The language of the messages comes from the display language of Windows, not +from the regional format. The other locale categories, such as the one used +for |strftime()|, do follow the regional format. + To overrule the automatic choice of the language, set the $LANG variable to the language of your choice. use "en" to disable translations. > diff --git a/src/locale.c b/src/locale.c index eb1845fce5..0d217fd434 100644 --- a/src/locale.c +++ b/src/locale.c @@ -116,10 +116,12 @@ get_mess_lang(void) p = get_locale_val(LC_MESSAGES); # else // This is necessary for Win32, where LC_MESSAGES is not defined and $LANG - // may be set to the LCID number. LC_COLLATE is the best guess, LC_TIME - // and LC_MONETARY may be set differently for a Japanese working in the - // US. - p = get_locale_val(LC_COLLATE); + // may be set to the LCID number. $LANG holds the display language, see + // set_init_lang_env(). Otherwise LC_COLLATE is the best guess, LC_TIME + // and LC_MONETARY may be set differently for a Japanese working in the US. + p = mch_getenv((char_u *)"LANG"); + if (!is_valid_mess_lang(p)) + p = get_locale_val(LC_COLLATE); # endif # else p = mch_getenv((char_u *)"LC_ALL"); @@ -365,9 +367,6 @@ ex_language(exarg_T *eap) if (what == LC_ALL) { vim_setenv((char_u *)"LANG", name); - - // Clear $LANGUAGE because GNU gettext uses it. - vim_setenv((char_u *)"LANGUAGE", (char_u *)""); # ifdef MSWIN // Apparently MS-Windows printf() may cause a crash when // we give it 8-bit text while it's expecting text in the @@ -383,6 +382,8 @@ ex_language(exarg_T *eap) # else mname = name; # endif + // Clear $LANGUAGE because GNU gettext uses it. + vim_setenv((char_u *)"LANGUAGE", (char_u *)""); vim_setenv((char_u *)"LC_MESSAGES", mname); # ifdef FEAT_MULTI_LANG set_helplang_default(mname); diff --git a/src/option.c b/src/option.c index d4f63203dd..f511b8ea5d 100644 --- a/src/option.c +++ b/src/option.c @@ -494,6 +494,64 @@ set_init_expand_env(void) } } +#if defined(MSWIN) && defined(FEAT_GETTEXT) +/* + * Get the display language of Windows and the languages to fall back on, as a + * colon separated list for gettext, e.g. "ja_JP:en_US". The list stops after + * English, untranslated messages are English already. + * Returns NULL when it cannot be obtained. The result must be freed. + */ + static char_u * +get_ui_langs(void) +{ + ULONG num_languages = 0; + ULONG bufsize = 0; + WCHAR *buffer; + char_u *langs = NULL; + + if (!GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &num_languages, NULL, + &bufsize) + || bufsize == 0) + return NULL; + + buffer = ALLOC_MULT(WCHAR, bufsize); + if (buffer == NULL) + return NULL; + + if (GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &num_languages, buffer, + &bufsize)) + { + // The list is NUL separated, the result needs the same room. + langs = alloc(bufsize); + if (langs != NULL) + { + char_u *d = langs; + WCHAR *s = buffer; + + while (*s != L'\0') + { + bool english = s[0] == L'e' && s[1] == L'n' + && (s[2] == L'\0' || s[2] == L'-'); + + if (d > langs) + *d++ = ':'; + // Locale names are ASCII, "en-US" becomes "en_US". + for ( ; *s != L'\0'; ++s) + *d++ = *s == L'-' ? '_' : (char_u)*s; + ++s; + + if (english) + break; + } + *d = NUL; + } + } + vim_free(buffer); + + return langs; +} +#endif + /* * Initialize the 'LANG' environment variable to a default value. */ @@ -501,32 +559,27 @@ set_init_expand_env(void) set_init_lang_env(void) { #if defined(MSWIN) && defined(FEAT_GETTEXT) - // If $LANG isn't set, try to get a good value for it. This makes the - // right language be used automatically. Don't do this for English. - if (mch_getenv((char_u *)"LANG") == NULL) - { - char buf[20]; - long_u n; - - // Could use LOCALE_SISO639LANGNAME, but it's not in Win95. - // LOCALE_SABBREVLANGNAME gives us three letters, like "enu", we use - // only the first two. - n = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, - (LPTSTR)buf, 20); - if (n >= 2 && STRNICMP(buf, "en", 2) != 0) - { - // There are a few exceptions (probably more) - if (STRNICMP(buf, "cht", 3) == 0 || STRNICMP(buf, "zht", 3) == 0) - STRCPY(buf, "zh_TW"); - else if (STRNICMP(buf, "chs", 3) == 0 - || STRNICMP(buf, "zhc", 3) == 0) - STRCPY(buf, "zh_CN"); - else if (STRNICMP(buf, "jp", 2) == 0) - STRCPY(buf, "ja"); - else - buf[2] = NUL; // truncate to two-letter code - vim_setenv((char_u *)"LANG", (char_u *)buf); + // If the language isn't set in the environment, use the display language + // of Windows. Not the regional format, which is what the CRT would use + // for setlocale(LC_ALL, ""). + if (mch_getenv((char_u *)"LANG") == NULL + && mch_getenv((char_u *)"LANGUAGE") == NULL + && mch_getenv((char_u *)"LC_ALL") == NULL + && mch_getenv((char_u *)"LC_MESSAGES") == NULL) + { + char_u *langs = get_ui_langs(); + + if (langs != NULL && *langs != NUL) + { + char_u *colon = vim_strchr(langs, ':'); + + // $LANGUAGE is the list gettext picks from, $LANG the language. + vim_setenv((char_u *)"LANGUAGE", langs); + if (colon != NULL) + *colon = NUL; + vim_setenv((char_u *)"LANG", langs); } + vim_free(langs); } #elif defined(MACOS_CONVERT) // Moved to os_mac_conv.c to avoid dependency problems. diff --git a/src/version.c b/src/version.c index 48389e931f..af42c7cbd1 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 867, /**/ 866, /**/ From 70d55cd5162b03e5a058907b30bc96d544fc0594 Mon Sep 17 00:00:00 2001 From: Sam Williams Date: Tue, 28 Jul 2026 18:33:49 +0000 Subject: [PATCH 226/647] runtime(m4): Prevent the m4Disabled region from nesting within itself. closes: #20801 Signed-off-by: Sam Williams Signed-off-by: Christian Brabandt --- runtime/syntax/m4.vim | 2 +- runtime/syntax/testdir/dumps/m4_input_00.dump | 20 +++++++++++++++++++ runtime/syntax/testdir/input/m4_input.m4 | 19 ++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 runtime/syntax/testdir/dumps/m4_input_00.dump create mode 100644 runtime/syntax/testdir/input/m4_input.m4 diff --git a/runtime/syntax/m4.vim b/runtime/syntax/m4.vim index c993e5864c..95bd0688be 100644 --- a/runtime/syntax/m4.vim +++ b/runtime/syntax/m4.vim @@ -46,7 +46,7 @@ syn cluster m4Top add=m4Quoted " they simply prevent any macros from being expanded, while the text remains " in the output. This region therefore disables any other matches. " – Comments themselves are disabled when quoted. -syn region m4Disabled start=+#+ end=+$+ containedin=ALLBUT,m4Quoted,m4ParamCount +syn region m4Disabled start=+#+ end=+$+ containedin=ALLBUT,m4Quoted,m4ParamCount,m4Disabled " Macros in M4: " – Name tokens consist of the longest possible sequence of letters, digits, diff --git a/runtime/syntax/testdir/dumps/m4_input_00.dump b/runtime/syntax/testdir/dumps/m4_input_00.dump new file mode 100644 index 0000000000..c8343eb9d8 --- /dev/null +++ b/runtime/syntax/testdir/dumps/m4_input_00.dump @@ -0,0 +1,20 @@ +>d+0#0000e05#ffffff0|n|l| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |d|e|f| |l|i|n|k| |m|4|D|i|s|a|b|l|e|d| |m|4|C|o|m@1|e|n|t| +0#0000000&@23 +@75 +|#+0#0000e05&@39| +0#0000000&@34 +|#+0#0000e05&@1| |<|s|u|m@1|a|r|y|>| +0#0000000&@62 +|#+0#0000e05&@1| @5|D|o|n|t|a|u|d|i|t| |s|e|a|r|c|h| |s@1|h| |h|o|m|e| |d|i|r|e|c|t|o|r|y| +0#0000000&@31 +|#+0#0000e05&@1| |<|/|s|u|m@1|a|r|y|>| +0#0000000&@61 +|#+0#0000e05&@1| |<|p|a|r|a|m| |n|a|m|e|=|"|d|o|m|a|i|n|"|>| +0#0000000&@50 +|#+0#0000e05&@1| @5|<|s|u|m@1|a|r|y|>| +0#0000000&@57 +|#+0#0000e05&@1| @5|D|o|m|a|i|n| |t|o| |n|o|t| |a|u|d|i|t|.| +0#0000000&@46 +|#+0#0000e05&@1| @5|<|/|s|u|m@1|a|r|y|>| +0#0000000&@56 +|#+0#0000e05&@1| |<|/|p|a|r|a|m|>| +0#0000000&@63 +|#+0#0000e05&| +0#0000000&@73 +|i|n|t|e|r|f|a|c|e|(|`+0#e000e06&|s+0#0000000&@1|h|_|d|o|n|t|a|u|d|i|t|_|s|e|a|r|c|h|_|u|s|e|r|_|h|o|m|e|_|d|i|r|'+0#e000e06&|,+0#0000000&|`+0#e000e06&| +0#0000000&@26 +@8|g|e|n|_|r|e|q|u|i|r|e|(+0#e000e06&|`| +0#0000000&@53 +@16|t|y|p|e| |s@1|h|_|h|o|m|e|_|t|;| @42 +@8|'+0#e000e06&|)| +0#0000000&@64 +@75 +@8|d|o|n|t|a|u|d|i|t| |$+0#e000e06&|1| +0#0000000&|s@1|h|_|h|o|m|e|_|t|:|d|i|r| |s|e|a|r|c|h|_|d|i|r|_|p|e|r|m|s|;| @21 +|'+0#e000e06&|)+0#0000000&| @72 +@57|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/input/m4_input.m4 b/runtime/syntax/testdir/input/m4_input.m4 new file mode 100644 index 0000000000..332cfeeefc --- /dev/null +++ b/runtime/syntax/testdir/input/m4_input.m4 @@ -0,0 +1,19 @@ +dnl VIM_TEST_SETUP hi def link m4Disabled m4Comment + +######################################## +## +## Dontaudit search ssh home directory +## +## +## +## Domain to not audit. +## +## +# +interface(`ssh_dontaudit_search_user_home_dir',` + gen_require(` + type ssh_home_t; + ') + + dontaudit $1 ssh_home_t:dir search_dir_perms; +') From 7bffbb25be97e99f8dfaef77703bd93dffdd8b9f Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Tue, 28 Jul 2026 18:43:56 +0000 Subject: [PATCH 227/647] patch 9.2.0868: GTK: Window Manager hint prevents giving focus to dialog Problem: GTK: Window Manager hint prevents giving focus to dialog (Allen Wild, after v9.1.0881) Solution: Remove Window Manager hint again (Christoffer Aasted) related: #16100 fixes: #17760 closes: #20727 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui_gtk.c | 2 -- src/version.c | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui_gtk.c b/src/gui_gtk.c index 620480289b..eef771e840 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -1716,8 +1716,6 @@ gui_mch_dialog(int type, // type of dialog dialog = create_message_dialog(type, title, message); dialoginfo.dialog = GTK_DIALOG(dialog); dialog_add_buttons(GTK_DIALOG(dialog), buttons); - gtk_window_set_type_hint(GTK_WINDOW(dialog), - GDK_WINDOW_TYPE_HINT_POPUP_MENU); if (textfield != NULL) { diff --git a/src/version.c b/src/version.c index af42c7cbd1..1c6be6d116 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 868, /**/ 867, /**/ From 35f7fdfdfb036028cc8760d7c1556361bb85206a Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 28 Jul 2026 18:52:44 +0000 Subject: [PATCH 228/647] patch 9.2.0869: buf_copy_options() can lose the P_INSECURE flag Problem: An insecurely-set 'indentexpr', 'formatexpr', 'includeexpr' or 'complete' value can end up evaluated outside the sandbox after buf_copy_options() and clears the flag. Solution: Copy the insecure flag alongside the value in buf_copy_options(), and make 'complete' a per-buffer insecure-flags field Supported by AI. closes: #20861 Signed-off-by: Christian Brabandt --- src/option.c | 10 +++ src/structs.h | 1 + src/testdir/test_options.vim | 118 +++++++++++++++++++++++++++++++++++ src/version.c | 2 + 4 files changed, 131 insertions(+) diff --git a/src/option.c b/src/option.c index f511b8ea5d..aa4c990dcb 100644 --- a/src/option.c +++ b/src/option.c @@ -3489,6 +3489,9 @@ insecure_flag(win_T *wp, int opt_idx, int opt_flags) # ifdef FEAT_FIND_ID case PV_INEX: return &wp->w_buffer->b_p_inex_flags; # endif +# ifdef FEAT_COMPL_FUNC + case PV_CPT: return &wp->w_buffer->b_p_cpt_flags; +# endif # endif } else @@ -7786,6 +7789,8 @@ clear_winopt(winopt_T *wop UNUSED) // Index into the options table for a buffer-local option enum. static int buf_opt_idx[BV_COUNT]; # define COPY_OPT_SCTX(buf, bv) buf->b_p_script_ctx[bv] = options[buf_opt_idx[bv]].script_ctx +# define COPY_OPT_INSECURE(flagsfield, bv) \ + (flagsfield) = (options[buf_opt_idx[bv]].flags & P_INSECURE) /* * Initialize buf_opt_idx[] if not done already. @@ -7805,6 +7810,7 @@ init_buf_opt_idx(void) } #else # define COPY_OPT_SCTX(buf, bv) +# define COPY_OPT_INSECURE(flagsfield, bv) #endif /* @@ -7927,6 +7933,7 @@ buf_copy_options(buf_T *buf, int flags) buf->b_p_cpt = vim_strsave(p_cpt); COPY_OPT_SCTX(buf, BV_CPT); #ifdef FEAT_COMPL_FUNC + COPY_OPT_INSECURE(buf->b_p_cpt_flags, BV_CPT); set_buflocal_cpt_callbacks(buf); #endif #ifdef BACKSLASH_IN_FILENAME @@ -8020,6 +8027,7 @@ buf_copy_options(buf_T *buf, int flags) #if defined(FEAT_EVAL) buf->b_p_inde = vim_strsave(p_inde); COPY_OPT_SCTX(buf, BV_INDE); + COPY_OPT_INSECURE(buf->b_p_inde_flags, BV_INDE); buf->b_p_indk = vim_strsave(p_indk); COPY_OPT_SCTX(buf, BV_INDK); #endif @@ -8027,6 +8035,7 @@ buf_copy_options(buf_T *buf, int flags) #if defined(FEAT_EVAL) buf->b_p_fex = vim_strsave(p_fex); COPY_OPT_SCTX(buf, BV_FEX); + COPY_OPT_INSECURE(buf->b_p_fex_flags, BV_FEX); #endif #ifdef FEAT_CRYPT buf->b_p_key = vim_strsave(p_key); @@ -8081,6 +8090,7 @@ buf_copy_options(buf_T *buf, int flags) # ifdef FEAT_EVAL buf->b_p_inex = vim_strsave(p_inex); COPY_OPT_SCTX(buf, BV_INEX); + COPY_OPT_INSECURE(buf->b_p_inex_flags, BV_INEX); # endif #endif buf->b_p_cot = empty_option; diff --git a/src/structs.h b/src/structs.h index b112c6d182..d9b7b6b0a5 100644 --- a/src/structs.h +++ b/src/structs.h @@ -3447,6 +3447,7 @@ struct file_buffer char_u *b_p_csl; // 'completeslash' #endif #ifdef FEAT_COMPL_FUNC + long_u b_p_cpt_flags; // flags for 'complete' callback_T *b_p_cpt_cb; // F{func} in 'complete' callback int b_p_cpt_count; // Count of values in 'complete' char_u *b_p_cfu; // 'completefunc' diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index 7580ace6db..b1201eb397 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -3167,4 +3167,122 @@ func Test_comma_option_key_value() set lcs& endfunc +func Test_insecure_flag_copied_to_new_buffer_indentexpr() + let modeline = &modeline + let modelineexpr = &modelineexpr + let modelinestrict = &modelinestrict + + func! Xindentexprpwn(findstart, base) + if a:findstart + sandbox setglobal indentexpr=writefile(['leak'],\ 'Xindentexpr_proof') + return 0 + endif + return [] + endfunc + + try + set modeline modelineexpr nomodelinestrict + + call writefile([ + \ 'vim: set complete=FXindentexprpwn :', + \ 'body', + \ ], 'Xindentexpr_attack', 'D') + call delete('Xindentexpr_proof') + edit Xindentexpr_attack + call cursor(2, 1) + call feedkeys("i\\", 'xt') + bwipe! + + " A brand new buffer now inherits the poisoned 'indentexpr' via + " buf_copy_options(). It must still be evaluated in the sandbox. + enew! + call setline(1, ['{', 'x', '}']) + normal! 2G== + call assert_false(filereadable('Xindentexpr_proof')) + bwipe! + finally + let &modeline = modeline + let &modelineexpr = modelineexpr + let &modelinestrict = modelinestrict + set indentexpr& + call delete('Xindentexpr_proof') + delfunc Xindentexprpwn + endtry +endfunc + +func Test_insecure_flag_not_cleared_by_other_buffer_complete() + let modeline = &modeline + let modelineexpr = &modelineexpr + let modelinestrict = &modelinestrict + + func! Xcompletepwn(findstart, base) + if a:findstart + call writefile(['leak'], 'Xcomplete_cross_proof') + return 0 + endif + return ['match'] + endfunc + + try + set modeline modelineexpr nomodelinestrict + + call writefile([ + \ 'vim: set complete=FXcompletepwn :', + \ 'body', + \ ], 'Xcomplete_cross_attack', 'D') + call delete('Xcomplete_cross_proof') + edit Xcomplete_cross_attack + let bufA = bufnr('%') + + " An unrelated buffer does a completely ordinary, trusted reset. + new + setlocal complete=.,w,b,u,t + bwipe! + + " Back in the modeline-tainted buffer: must still be sandboxed. + exe 'buffer ' .. bufA + call cursor(2, 1) + call assert_fails('call feedkeys("i\\", "xt")', 'E48:') + call assert_false(filereadable('Xcomplete_cross_proof')) + bwipe! + finally + let &modeline = modeline + let &modelineexpr = modelineexpr + let &modelinestrict = modelinestrict + call delete('Xcomplete_cross_proof') + delfunc Xcompletepwn + endtry +endfunc + +func Test_formatexpr_insecure_copied_to_new_buffer() + new + sandbox setglobal formatexpr=writefile(['leak'],\ 'Xleak_fex') + enew! + call setline(1, ['some text to format']) + set textwidth=10 + silent! normal! gqq + call assert_false(filereadable('Xleak_fex')) + call delete('Xleak_fex') + set formatexpr& textwidth& + bwipe! +endfunc + +" includeexpr: triggered via gf / find_pattern_in_path (used by [i, gf, etc.) +func Test_includeexpr_insecure_copied_to_new_buffer() + func Xleakinclude(fname) + call writefile(['leak'], 'Xleak_inex') + return a:fname + endfunc + new + sandbox setglobal includeexpr=Xleakinclude(v:fname) + enew! + call setline(1, ['#include "foo.h"']) + silent! normal! [i + call assert_false(filereadable('Xleak_inex')) + call delete('Xleak_inex') + set includeexpr& + delfunc Xleakinclude + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 1c6be6d116..915e1c8e22 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 869, /**/ 868, /**/ From 95da62a910809787cc8fdf26b131721359812d8f Mon Sep 17 00:00:00 2001 From: Brian Carbone Date: Tue, 28 Jul 2026 19:03:49 +0000 Subject: [PATCH 229/647] patch 9.2.0870: filetype: marko files are not recognized Problem: filetype: marko files are not recognized Solution: Detect *.marko files as marko filetype, include a syntax plugin and add syntax tests (Brian Carbone) References: https://markojs.com https://github.com/marko-js/tree-sitter https://github.com/marko-js/language-server https://v5.markojs.com/docs/editor-plugins/ closes: #20863 Signed-off-by: Brian Carbone Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/autoload/dist/ft.vim | 4 +- runtime/syntax/marko.vim | 382 ++++++++++++++++++ runtime/syntax/testdir/dumps/marko_00.dump | 20 + runtime/syntax/testdir/dumps/marko_01.dump | 20 + runtime/syntax/testdir/dumps/marko_02.dump | 20 + .../testdir/dumps/marko_concise_00.dump | 20 + .../testdir/dumps/marko_concise_01.dump | 20 + .../testdir/dumps/marko_concise_02.dump | 20 + runtime/syntax/testdir/input/marko.marko | 35 ++ .../syntax/testdir/input/marko_concise.marko | 43 ++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 + 13 files changed, 587 insertions(+), 1 deletion(-) create mode 100644 runtime/syntax/marko.vim create mode 100644 runtime/syntax/testdir/dumps/marko_00.dump create mode 100644 runtime/syntax/testdir/dumps/marko_01.dump create mode 100644 runtime/syntax/testdir/dumps/marko_02.dump create mode 100644 runtime/syntax/testdir/dumps/marko_concise_00.dump create mode 100644 runtime/syntax/testdir/dumps/marko_concise_01.dump create mode 100644 runtime/syntax/testdir/dumps/marko_concise_02.dump create mode 100644 runtime/syntax/testdir/input/marko.marko create mode 100644 runtime/syntax/testdir/input/marko_concise.marko diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index ea76824880..44ccadf6b4 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -629,6 +629,7 @@ runtime/syntax/m3quake.vim @dkearns runtime/syntax/mailcap.vim @dkearns runtime/syntax/mallard.vim @jhradilek runtime/syntax/markdown.vim @tpope +runtime/syntax/marko.vim @briancarbone runtime/syntax/mason.vim @petdance runtime/syntax/mbsync.vim @fymyte runtime/syntax/mediawiki.vim @avidseeker diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 7ed41785f9..0d1e7119ce 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 27 +# Last Change: 2026 Jul 28 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -2416,6 +2416,8 @@ const ft_from_ext = { "page": "mallard", # Manpage "man": "man", + # Marko + "marko": "marko", # Maple V "mv": "maple", "mpl": "maple", diff --git a/runtime/syntax/marko.vim b/runtime/syntax/marko.vim new file mode 100644 index 0000000000..be589534c3 --- /dev/null +++ b/runtime/syntax/marko.vim @@ -0,0 +1,382 @@ +" Vim syntax file +" Language: Marko +" Maintainer: Brian Carbone +" URL: https://markojs.com +" Filenames: *.marko +" Last Change: 2026 Jul 28 + +" Marko interleaves HTML-like tags, TypeScript expressions and CSS style +" blocks, in two modes: an HTML-like mode and an indentation-based concise +" mode. Mode is tracked structurally: the body of an html-mode element is +" an html-mode region (bare text stays plain there), while everywhere else +" is concise context, where a line-start name is a tag: +"

if you want, stop by

body text, plain +" my-tag size="large" concise tag, highlighted +" +" Same-position priority goes to the item defined last, so definition order +" is deliberate throughout; the load-bearing orderings are called out in +" the comments below. + +if !exists("main_syntax") + if exists("b:current_syntax") + finish + endif + let main_syntax = "marko" +endif + +let s:cpo_save = &cpo +set cpo&vim + +syn spell toplevel + +" TypeScript for expressions and statement tags, CSS for style blocks. +" Both includes mutate shared state ("syn case", "syn iskeyword", sync +" rules, 'iskeyword'), all of it restored or restated afterwards. +let s:iskeyword_save = &l:iskeyword +syn include @markoTS syntax/typescript.vim +unlet! b:current_syntax +syn include @markoCSS syntax/css.vim +unlet! b:current_syntax +let &l:iskeyword = s:iskeyword_save +unlet s:iskeyword_save +syn case match + +" typescript.vim (yats) attaches type arguments via nextgroup after every +" identifier, so an unspaced "<" in any expression opens a region hunting a +" ">" that may never come: +"
would swallow the rest of the file +" Its block comment carries "extend", which would let one stray "/*" escape +" every containing region below. Both are redefined bounded; the cost is +" generic-call coloring inside script blocks. +silent! syn clear typescriptTypeArguments +silent! syn clear typescriptComment +syn region typescriptComment contained start="/\*" end="\*/" contains=@Spell,typescriptCommentTodo + +" Everything an embedded TypeScript expression may contain. The bracket +" pairs keep an outer region open across nested delimiters and shield the +" spaces inside groupings from attribute-value termination: +" a={ b: { c: 1 } } d=2 +" Without the matchgroup each region would re-match at its own start +" character through its own contains and consume the closing delimiter. +" markoTSDelim is deliberately unlinked: the delimiters render as plain +" text, like brackets in a TypeScript buffer. +syn cluster markoExpr contains=@markoTS,markoTSBraces,markoTSParens,markoTSBrackets +syn region markoTSBraces contained transparent matchgroup=markoTSDelim + \ start="{" end="}" + \ contains=@markoExpr extend +syn region markoTSParens contained transparent matchgroup=markoTSDelim + \ start="(" end=")" + \ contains=@markoExpr extend +syn region markoTSBrackets contained transparent matchgroup=markoTSDelim + \ start="\[" end="]" + \ contains=@markoExpr extend + +" Comments are recognized where the parser allows text to start; anchoring +" to the line start keeps "//" inside URLs as text: +" // note /* note */ https://example.com +syn region markoComment start="" contains=@Spell fold +syn match markoComment "^\s*//.*$" contains=@Spell display +syn region markoComment start="^\s*/\*" end="\*/" contains=@Spell fold +syn region markoTagComment contained start="/\*" end="\*/" +syn match markoTagComment contained "//.*" + +syn region markoCData start="" +" Declarations; "" may close with ">" or "?>": +" +syn region markoDeclaration start="" +syn region markoDeclaration start="" + +" Placeholders interpolate into text, and backslashes escape pairwise: +" ${user.name} $!{rawHtml} \${literal} \\${live} +" The containedin lets them apply inside style rules and property values. +" markoEscape must never take "display": it exists to suppress +" markoPlaceholder, so skipping it during state computation would change +" what matches. +syn match markoEscape "\%(\\\\\)\+\ze\$!\={" +syn match markoEscape "\%(\\\\\)*\\\$!\={" +syn region markoPlaceholder matchgroup=markoPlaceholderDelim + \ start="\$!\={" end="}" + \ contains=@markoExpr containedin=cssDefinition,cssAttrRegion extend + +syn match markoEntity "&\%(#\d\+\|#[xX]\x\+\|\w\+\);" display + +" Scriptlets; the whitespace after "$" is required, so a line-start +" placeholder is not a scriptlet: +" $ count += 1 +" $ { let total = 0; } +" ${count} placeholder +syn region markoScriptlet matchgroup=markoScriptletDelim + \ start="^\s*\$\s\+{\@!" end="$" + \ contains=@markoExpr keepend +syn region markoScriptlet matchgroup=markoScriptletDelim + \ start="^\s*\$\s\+{" end="};\=" + \ contains=@markoExpr + +" "--" marks one line of text in concise mode: +" p -- some text +syn match markoBlockDelim "\%(^\|\s\)\@1<=--\+\ze\%(\s\|$\)" display + +" Attributes. An unquoted value ends at whitespace (quoted strings and +" bracket pairs shield theirs), does not start at the "=" of an arrow, and +" continues across " => " so arrow values stay whole: +" size="large" total:=sum ...spread onClick=(e) => handle(e) +" The attr name must not match the "${" of a dynamic tag name. +syn match markoAttrName contained "\%(\$!\={\)\@![[:alnum:]_$@][-[:alnum:]_$.]*" display +syn match markoSpread contained "\.\.\." display +syn region markoAttrValue contained matchgroup=markoOperator + \ start=":\==>\@!\s*" end="\ze\%(\%(=>\)\@2\)\@!\|=\@1\|/>\)" end="$" + \ contains=@markoExpr +syn region markoString contained start=+\z(["']\)+ skip=+\\\z1+ end=+\z1+ contains=@Spell + +" Shorthands after the tag name: +" +syn match markoShorthandId contained "#[-[:alnum:]_$]\+" display +syn match markoShorthandClass contained "\.[-[:alnum:]_$]\+" display + +" Tag variables, arguments, |parameters|, and attribute method +" shorthand bodies: +" +" >
+" No body opens for html voids, parsed-text tags, bodiless core tags +" ( takes no close tag) or "@" attribute tags (those auto-close +" at their parent, which no name pairing can track). Defined after +" markoTag so open tags still overlay inside bodies, and after the +" concise regions so html mode wins at a line-start "<". A mismatched or +" missing close leaves its body open for the rest of the buffer, as an +" unclosed tag does in html.vim. +exe 'syn region markoHtmlBody' + \ . ' start=+<\ze\%(\%(area\|base\|br\|col\|embed\|hr\|img\|input\|link\|meta\|param' + \ . '\|source\|track\|wbr\|style\|script\|textarea\|html-comment\|html-style' + \ . '\|html-script\|let\|const\|id\|log\|debug\|effect\|lifecycle\|return\)' + \ . '\%(\k\|[$:]\)\@!\)\@!' + \ . '\z(\%(\k\|[$:]\)\+\)\%(\_s\|[/>|(<.#=]\)\@=' . s:tag_end_ahead . '+' + \ . ' matchgroup=markoTagDelim' + \ . ' end="" end=""' + \ . ' contains=@markoHtmlContent' +exe 'syn region markoDynamicBody' + \ . ' start=+<\ze\%(\$!\={\)\@=' . s:tag_end_ahead . '+' + \ . ' matchgroup=markoTagDelim' + \ . ' end=""' + \ . ' contains=@markoHtmlContent' +unlet s:tag_end_ahead + +" Delimited text blocks in concise mode contain html-mode content. An +" indented block closes at a matching delimiter line or at any line +" indented less than its opener; a column-0 block closes only at its +" matching delimiter: +" -- +" A block of text, html mode. +" -- +syn region markoTextBlock matchgroup=markoBlockDelim + \ start="^\z(\s\+\)--\+\s*$" + \ end="^\z1--\+\s*$" end="^\%(\z1\)\@!\ze\s*\S" + \ contains=@markoHtmlContent +syn region markoTextBlock matchgroup=markoBlockDelim + \ start="^--\+\s*$" + \ end="^--\+\s*$" + \ contains=@markoHtmlContent + +" Parsed-text tags: bodies contain only text and placeholders (style and +" script embed CSS and TypeScript, a textarea body is plain text, an +" html-comment body is comment text). Defined after the generic tag and +" body regions to win at the same "<". The "/\@1 +" keepend stops an unterminated embedded construct at the close tag. +syn region markoStyle matchgroup=markoTagNameBuiltin + \ start=+<\%(html-\)\=style\>\_[^>]\{-,300}/\@1+ + \ end="" + \ contains=@markoCSS,markoPlaceholder keepend fold +syn region markoStyle matchgroup=markoTagNameBuiltin + \ start="^\s*style\%([./][^ \t{]*\)\=\s*{" end="}" + \ contains=@markoCSS,markoPlaceholder fold +syn region markoScript matchgroup=markoTagNameBuiltin + \ start=+<\%(html-\)\=script\>\_[^>]\{-,300}/\@1+ + \ end="" + \ contains=@markoTS,markoPlaceholder keepend fold +syn region markoTextareaTag matchgroup=markoTagNameBuiltin + \ start=+\_[^>]\{-,300}/\@1+ + \ end="" + \ contains=markoPlaceholder,markoEntity,@Spell keepend +syn region markoHtmlCommentTag matchgroup=markoTagNameBuiltin + \ start=+\_[^>]\{-,300}/\@1+ + \ end="" + \ contains=markoPlaceholder,@Spell keepend + +" Tag names inside "<...>"/"" (concise names are colored by the +" region matchgroups above). The generic name is defined after the +" attribute name, so it wins right after "<"; the class-specific names are +" defined after the generic one, so they win over it. +syn match markoTagName contained "\%(<+0#e000e06#ffffff0|!|d|o|c|t|y|p|e| |h|t|m|l|>| +0#0000000&@59 +|<+0#0000e05&|!|-@1| |h|t|m|l| |m|o|d|e|:| |t|a|g|s|,| |a|t@1|r|i|b|u|t|e|s|,| |e|m|b|e|d@1|e|d| |l|a|n|g|u|a|g|e|s| |-@1|>| +0#0000000&@18 +|i+0#af5f00255&|m|p|o|r|t| +0#0000000&|{+0#00e0e07&| +0#0000000&|f|o|r|m|a|t|P|r|i|c|e| |}+0#00e0e07&| +0#0000000&|f+0#af5f00255&|r|o|m| +0#0000000&|"+0#e000002&|.|/|u|t|i|l|"| +0#0000000&@38 +|s+0#af5f00255&|t|a|t|i|c| +0#0000000&|c+0#af5f00255&|o|n|s|t| +0#0000000&|V|E|R|S|I|O|N| |=| |1+0#e000002&| +0#0000000&@50 +@75 +|<+0#e000e06&|s|t|y|l|e|>| +0#0000000&@67 +@2|.+0#00e0e07&|p|r|i|c|e| +0#0000000&|{+0#00e0e07&| +0#0000000&|c+0#00e0003&|o|l|o|r|:+0#0000000&| |g+0#e000002&|r|e@1|n| +0#0000000&|}+0#00e0e07&| +0#0000000&@49 +|<+0#e000e06&|/|s|t|y|l|e|>| +0#0000000&@66 +@75 +|<+0#e000e06&|l|e|t|/+0#00e0e07&|c|o|u|n|t|=+0#af5f00255&|1+0#e000002&|/+0#e000e06&|>| +0#0000000&@60 +|<+0#e000e06&|c|o|n|s|t|/+0#00e0e07&|{+0#e000e06&| +0#0000000&|i|t|e|m|s| |}+0#e000e06&|=+0#af5f00255&|i+0#0000000&|n|p|u|t|/+0#e000e06&|>| +0#0000000&@50 +@75 +|<+0#e000e06&|d+0#af5f00255&|i|v|.+0#00e0e07&|c|a|r|d|#+0#e000002&|m|a|i|n| +0#0000000&|c+0#00e0003&|l|a|s@1|=+0#af5f00255&|"+0#e000002&|c|a|r|t|"| +0#0000000&|d+0#00e0003&|a|t|a|-|t|o|t|a|l|:+0#af5f00255&|=|t+0#0000000&|o|t|a|l| |.+0#af5f00255&@2|r+0#00e0003&|e|s|t|>+0#e000e06&| +0#0000000&@20 +@2|<+0#e000e06&|i+0#af5f00255&|f|=|c+0#0000000&|o|u|n|t|>+0#e000e06&| +0#0000000&@62 +@4|<+0#e000e06&|m+0#af5f00255&|y|-|b|u|t@1|o|n| +0#0000000&|s+0#00e0003&|i|z|e|=+0#af5f00255&|"+0#e000002&|l|a|r|g|e|"| +0#0000000&|o+0#00e0003&|n|C|l|i|c|k|=+0#af5f00255&|(+0#0000000&|)| |=+0#00e0003&|>| +0#0000000&|b|u|y|(|)|>+0#e000e06&|B+0#0000000&|u|y| |$+0#e000e06&|{|c+0#0000000&|o|u|n|t| |+| |1+0#e000002&|}+0#e000e06&|<|/|m+0#af5f00255&|y|-|b|u|t@1|o|n +|>+0#e000e06&| +0#0000000&@73 +@2|<+0#e000e06&|/|i+0#af5f00255&|f|>+0#e000e06&| +0#0000000&@67 +@2|<+0#e000e06&|f+0#af5f00255&|o|r||+0#e000e06&|i+0#0000000&|t|e|m|,| |i|n|d|e|x||+0#e000e06&| +0#0000000&|o+0#00e0003&|f|=+0#af5f00255&|i+0#0000000&|t|e|m|s|>+0#e000e06&| +0#0000000&@45 +@4|<+0#e000e06&|s+0#af5f00255&|p|a|n|>+0#e000e06&|$|{|f+0#0000000&|o|r|m|a|t|P|r|i|c|e|(|i+0#e000e06&|t|e|m|.+0#0000000&|p+0#e000e06&|r|i|c|e|)+0#0000000&|}+0#e000e06&|<|/|s+0#af5f00255&|p|a|n|>+0#e000e06&| +0#0000000&@31 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/marko_01.dump b/runtime/syntax/testdir/dumps/marko_01.dump new file mode 100644 index 0000000000..fc2493b8f4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/marko_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|<+0#e000e06&|i+0#af5f00255&|f|=|c+0#0000000&|o|u|n|t|>+0#e000e06&| +0#0000000&@62 +@4|<+0#e000e06&|m+0#af5f00255&|y|-|b|u|t@1|o|n| +0#0000000&|s+0#00e0003&|i|z|e|=+0#af5f00255&|"+0#e000002&|l|a|r|g|e|"| +0#0000000&|o+0#00e0003&|n|C|l|i|c|k|=+0#af5f00255&|(+0#0000000&|)| |=+0#00e0003&|>| +0#0000000&|b|u|y|(|)|>+0#e000e06&|B+0#0000000&|u|y| |$+0#e000e06&|{|c+0#0000000&|o|u|n|t| |+| |1+0#e000002&|}+0#e000e06&|<|/|m+0#af5f00255&|y|-|b|u|t@1|o|n +|>+0#e000e06&| +0#0000000&@73 +@2|<+0#e000e06&|/|i+0#af5f00255&|f|>+0#e000e06&| +0#0000000&@67 +@2|<+0#e000e06&|f+0#af5f00255&|o|r||+0#e000e06&|i+0#0000000&|t|e|m|,| |i|n|d|e|x||+0#e000e06&| +0#0000000&|o+0#00e0003&|f|=+0#af5f00255&|i+0#0000000&|t|e|m|s|>+0#e000e06&| +0#0000000&@45 +@4><+0#e000e06&|s+0#af5f00255&|p|a|n|>+0#e000e06&|$|{|f+0#0000000&|o|r|m|a|t|P|r|i|c|e|(|i+0#e000e06&|t|e|m|.+0#0000000&|p+0#e000e06&|r|i|c|e|)+0#0000000&|}+0#e000e06&|<|/|s+0#af5f00255&|p|a|n|>+0#e000e06&| +0#0000000&@31 +@2|<+0#e000e06&|/|f+0#af5f00255&|o|r|>+0#e000e06&| +0#0000000&@66 +@2|<+0#e000e06&|g+0#af5f00255&|e|n|e|r|i|c|-|l|i|s|t|<+0#e000e06&|s+0#0000000&|t|r|i|n|g|>+0#e000e06&| +0#0000000&|a+0#00e0003&|=+0#af5f00255&|1+0#e000002&|/+0#e000e06&|>| +0#0000000&@45 +@2|<+0#e000e06&|$|{|d+0#0000000&|y|n|a|m|i|c|T|a|g|}+0#e000e06&| +0#0000000&|t+0#00e0003&|i|t|l|e|=+0#af5f00255&|"+0#e000002&|d|y|n|a|m|i|c|"|>+0#e000e06&|b+0#0000000&|o|d|y|<+0#e000e06&|/|>+0#0000000&| @34 +@2|<+0#e000e06&|@+0#00e0e07&|f|o@1|t|e|r|>+0#e000e06&|s+0#0000000&|l|o|t| |c|o|n|t|e|n|t|<|/|@+0#af5f00255&|f|o@1|t|e|r|>+0#e000e06&| +0#0000000&@41 +|<+0#e000e06&|/|d+0#af5f00255&|i|v|>+0#e000e06&| +0#0000000&@68 +@75 +|<+0#e000e06&|d+0#af5f00255&|i|v| +0#0000000&@70 +@2|c+0#00e0003&|l|a|s@1|=+0#af5f00255&|"+0#e000002&|m|u|l|t|i|l|i|n|e|"| +0#0000000&@55 +@2|d+0#00e0003&|a|t|a|-|x|=+0#af5f00255&|1+0#e000002&| +0#0000000&@64 +|>+0#e000e06&|t+0#0000000&|e|x|t| |w|i|t|h| |&+0#e000e06&|a|m|p|;| +0#0000000&|e|n|t|i|t|y| |a|n|d| |\+0#e000e06&|$|{|a+0#0000000&|n| |e|s|c|a|p|e|d| |p|l|a|c|e|h|o|l|d|e|r|}|<+0#e000e06&|/|d+0#af5f00255&|i|v|>+0#e000e06&| +0#0000000&@14 +@75 +|<+0#e000e06&|t|e|x|t|a|r|e|a| |r|o|w|s|=|3|>|l+0#0000000&|i|t|e|r|a|l| |<|b|>|t|e|x|t|<|/|b|>| |w|i|t|h| |$+0#e000e06&|{|c+0#0000000&|o|u|n|t|}+0#e000e06&|<|/|t|e|x|t|a|r|e|a|>| +0#0000000&@13 +|<+0#e000e06&|h|t|m|l|-|c|o|m@1|e|n|t|>|r+0#0000e05&|e|n|d|e|r|e|d| |<|i|>|c|o|m@1|e|n|t|<|/|i|>| |b|o|d|y|<+0#e000e06&|/|h|t|m|l|-|c|o|m@1|e|n|t|>| +0#0000000&@17 +@57|1|8|,|5| @9|7|6|%| diff --git a/runtime/syntax/testdir/dumps/marko_02.dump b/runtime/syntax/testdir/dumps/marko_02.dump new file mode 100644 index 0000000000..a9c90cd698 --- /dev/null +++ b/runtime/syntax/testdir/dumps/marko_02.dump @@ -0,0 +1,20 @@ +|<+0#e000e06#ffffff0|h|t|m|l|-|c|o|m@1|e|n|t|>|r+0#0000e05&|e|n|d|e|r|e|d| |<|i|>|c|o|m@1|e|n|t|<|/|i|>| |b|o|d|y|<+0#e000e06&|/|h|t|m|l|-|c|o|m@1|e|n|t|>| +0#0000000&@17 +@75 +|<+0#e000e06&|s|c|r|i|p|t|>| +0#0000000&@66 +@2|c+0#af5f00255&|o|n|s|t| +0#0000000&|e|l| |=| |d+0#00e0003&|o|c|u|m|e|n|t|.+0#0000000&|q+0#af5f00255&|u|e|r|y|S|e|l|e|c|t|o|r|(+0#0000000&|"+0#e000002&|.|p|r|i|c|e|"|)+0#0000000&|;| @28 +><+0#e000e06&|/|s|c|r|i|p|t|>| +0#0000000&@65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|5|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/marko_concise_00.dump b/runtime/syntax/testdir/dumps/marko_concise_00.dump new file mode 100644 index 0000000000..3dcec6ce31 --- /dev/null +++ b/runtime/syntax/testdir/dumps/marko_concise_00.dump @@ -0,0 +1,20 @@ +>/+0#0000e05#ffffff0@1| |c|o|n|c|i|s|e| |m|o|d|e|:| |c|u|s|t|o|m| |t|a|g|s|,| |b|u|i|l|t|i|n|s|,| |s|t|a|t|e|m|e|n|t|s|,| |s|c|r|i|p|t|l|e|t|s|,| |t|e|x|t| |b|l|o|c|k|s +|i+0#af5f00255&|m|p|o|r|t| +0#0000000&|{+0#00e0e07&| +0#0000000&|f|e|t|c|h|I|t|e|m|s| |}+0#00e0e07&| +0#0000000&|f+0#af5f00255&|r|o|m| +0#0000000&|"+0#e000002&|.|/|a|p|i|"| +0#0000000&@40 +@75 +|$+0#e000e06&| |c+0#af5f00255&|o|n|s|t| +0#0000000&|d|o|u|b|l|e|d| |=| |i|n|p|u|t|.|c+0#af5f00255&|o|u|n|t| +0#0000000&|*| |2+0#e000002&|;+0#0000000&| @40 +@75 +|l+0#e000e06&|e|t|/+0#00e0e07&|b|a|s|k|e|t|=+0#af5f00255&|[+0#0000000&|]| @61 +|l+0#e000e06&|e|t|<|n+0#0000000&|u|m|b|e|r|>+0#e000e06&|/+0#00e0e07&|t|y|p|e|d|=+0#af5f00255&|0+0#e000002&| +0#0000000&@55 +@75 +|c+0#af5f00255&|o|n|t|a|i|n|e|r| +0#0000000&|f+0#00e0003&|l|u|i|d| +0#0000000&@59 +@2|s+0#af5f00255&|e|c|t|i|o|n|-|h|e|a|d|i|n|g| +0#0000000&|a+0#00e0003&|s|=+0#af5f00255&|"+0#e000002&|h|2|"| +0#0000000&|-+0#e000e06&@1| +0#0000000&|E|v|e|r|y|t|h|i|n|g| |p|a|r|t|n|e|r|s|h|i|p|s| |n|e@1|d| @17 +@2|b+0#af5f00255&|e|n|t|o| +0#0000000&|c+0#00e0003&|o|l|s|=+0#af5f00255&|4+0#e000002&| +0#0000000&@60 +@4|b+0#af5f00255&|e|n|t|o|-|c|e|l@1| +0#0000000&|[+0#e000e06&| +0#0000000&@58 +@6|f+0#00e0003&|e|a|t|u|r|e|d| +0#0000000&@60 +@6|c+0#00e0003&|o|l|S|p|a|n|=+0#af5f00255&|2+0#e000002&| +0#0000000&@59 +@6|t+0#00e0003&|i|t|l|e|=+0#af5f00255&|"+0#e000002&|O|n|e| |p|l|a|t|f|o|r|m|"| +0#0000000&@48 +@4|]+0#e000e06&| +0#0000000&@69 +@6|p+0#af5f00255&| +0#0000000&|-+0#e000e06&@1| +0#0000000&|O|n|b|o|a|r|d|i|n|g| |a|n|d| |e|n|a|b|l|e|m|e|n|t|,| |u|n|i|f|i|e|d|.| @28 +@75 +|i+0#af5f00255&|f|=|i+0#0000000&|n|p|u|t|.|r+0#af5f00255&|e|a|d|y| +0#0000000&@60 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/marko_concise_01.dump b/runtime/syntax/testdir/dumps/marko_concise_01.dump new file mode 100644 index 0000000000..fb80cfb9f4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/marko_concise_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@5|c+0#00e0003&|o|l|S|p|a|n|=+0#af5f00255&|2+0#e000002&| +0#0000000&@59 +@6|t+0#00e0003&|i|t|l|e|=+0#af5f00255&|"+0#e000002&|O|n|e| |p|l|a|t|f|o|r|m|"| +0#0000000&@48 +@4|]+0#e000e06&| +0#0000000&@69 +@6|p+0#af5f00255&| +0#0000000&|-+0#e000e06&@1| +0#0000000&|O|n|b|o|a|r|d|i|n|g| |a|n|d| |e|n|a|b|l|e|m|e|n|t|,| |u|n|i|f|i|e|d|.| @28 +@75 +>i+0#af5f00255&|f|=|i+0#0000000&|n|p|u|t|.|r+0#af5f00255&|e|a|d|y| +0#0000000&@60 +@2|f+0#af5f00255&|o|r||+0#e000e06&|i+0#0000000&|t|e|m|,| |i||+0#e000e06&| +0#0000000&|o+0#00e0003&|f|=+0#af5f00255&|f+0#0000000&|e|t|c|h|I|t|e|m|s|(|)| @44 +@4|l+0#e000e06&|o|g| +0#0000000&|"+0#e000002&|i|t|e|m| |l|o|a|d|e|d|"| +0#0000000&@53 +@4|-+0#e000e06&@1| +0#0000000&|P|r|i|c|e|:| |$+0#e000e06&|{|i+0#0000000&|t|e|m|.|p|r|i|c|e|}+0#e000e06&| +0#0000000&@47 +@2|w+0#af5f00255&|h|i|l|e|(+0#e000e06&|i+0#0000000&|<|1+0#e000002&|0|)+0#e000e06&| +0#0000000&@61 +@4|-+0#e000e06&@1| +0#0000000&|c|o|u|n|t|i|n|g| @59 +|t+0#af5f00255&|r|y| +0#0000000&@71 +@2|a+0#af5f00255&|w|a|i|t|(+0#e000e06&|p+0#0000000&|r|o|m|i|s|e|)+0#e000e06&| +0#0000000&@58 +|e+0#af5f00255&|l|s|e| +0#0000000&@70 +@2|r+0#af5f00255&|e|t|u|r|n|=|n+0#e000002&|u|l@1| +0#0000000&@61 +|@+0#00e0e07&|t|h|e|n||+0#e000e06&|r+0#0000000&|e|s|u|l|t||+0#e000e06&| +0#0000000&@61 +@2|-+0#e000e06&@1| +0#0000000&|r|e|s|o|l|v|e|d| @61 +@75 +|s+0#e000e06&|t|y|l|e|.|s|c|s@1| |{| +0#0000000&@62 +@57|1|9|,|1| @9|5|4|%| diff --git a/runtime/syntax/testdir/dumps/marko_concise_02.dump b/runtime/syntax/testdir/dumps/marko_concise_02.dump new file mode 100644 index 0000000000..2c1356382e --- /dev/null +++ b/runtime/syntax/testdir/dumps/marko_concise_02.dump @@ -0,0 +1,20 @@ +|s+0#e000e06#ffffff0|t|y|l|e|.|s|c|s@1| |{| +0#0000000&@62 +@2|.+0#00e0e07&|b|a|s|k|e|t| +0#0000000&|{+0#00e0e07&| +0#0000000&|c+0#00e0003&|o|l|o|r|:+0#0000000&| |r+0#e000002&|e|d| +0#0000000&|}+0#00e0e07&| +0#0000000&@50 +|}+0#e000e06&| +0#0000000&@73 +@75 +|-+0#e000e06&@1| +0#0000000&@72 +>A| |d|e|l|i|m|i|t|e|d| |b|l|o|c|k| |i|s| |h|t|m|l| |m|o|d|e|,| |s|o| |b|a|r|e| |w|o|r|d|s| |a|r|e| |p|r|o|s|e|.| @18 +|<+0#e000e06&|b+0#af5f00255&|>+0#e000e06&|b+0#0000000&|o|l|d| |$+0#e000e06&|{|d+0#0000000&|o|u|b|l|e|d|}+0#e000e06&|<|/|b+0#af5f00255&|>+0#e000e06&| +0#0000000&@52 +|-+0#e000e06&@1| +0#0000000&@72 +@75 +|<+0#e000e06&|f+0#af5f00255&|o@1|t|e|r|>+0#e000e06&| +0#0000000&@66 +|i|f| |y|o|u| |r|e|a|d| |t|h|i|s| |i|n|s|i|d|e| |a|n| |e|l|e|m|e|n|t| |b|o|d|y|,| |i|t| |s|t|a|y|s| |p|l|a|i|n| |p|r|o|s|e| @13 +|<+0#e000e06&|/|f+0#af5f00255&|o@1|t|e|r|>+0#e000e06&| +0#0000000&@65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|7|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/marko.marko b/runtime/syntax/testdir/input/marko.marko new file mode 100644 index 0000000000..1281ce0bdc --- /dev/null +++ b/runtime/syntax/testdir/input/marko.marko @@ -0,0 +1,35 @@ + + +import { formatPrice } from "./util" +static const VERSION = 1 + + + + + + + + + buy()>Buy ${count + 1} +
+ + ${formatPrice(item.price)} + + a=1/> + <${dynamicTag} title="dynamic">body + <@footer>slot content + + +
text with & entity and \${an escaped placeholder}
+ + +rendered comment body + + diff --git a/runtime/syntax/testdir/input/marko_concise.marko b/runtime/syntax/testdir/input/marko_concise.marko new file mode 100644 index 0000000000..d8994cb46a --- /dev/null +++ b/runtime/syntax/testdir/input/marko_concise.marko @@ -0,0 +1,43 @@ +// concise mode: custom tags, builtins, statements, scriptlets, text blocks +import { fetchItems } from "./api" + +$ const doubled = input.count * 2; + +let/basket=[] +let/typed=0 + +container fluid + section-heading as="h2" -- Everything partnerships need + bento cols=4 + bento-cell [ + featured + colSpan=2 + title="One platform" + ] + p -- Onboarding and enablement, unified. + +if=input.ready + for|item, i| of=fetchItems() + log "item loaded" + -- Price: ${item.price} + while(i<10) + -- counting +try + await(promise) +else + return=null +@then|result| + -- resolved + +style.scss { + .basket { color: red } +} + +-- +A delimited block is html mode, so bare words are prose. +bold ${doubled} +-- + +
+if you read this inside an element body, it stays plain prose +
diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index e98f308afb..9eff140299 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -505,6 +505,7 @@ def s:GetFilenameChecks(): dict> manconf: ['/etc/man.conf', 'man.config', 'any/etc/man.conf'], maple: ['file.mv', 'file.mpl', 'file.mws'], markdown: ['file.markdown', 'file.mdown', 'file.mkd', 'file.mkdn', 'file.mdwn', 'file.md'], + marko: ['file.marko'], masm: ['file.masm'], mason: ['file.mason', 'file.mhtml'], master: ['file.mas', 'file.master'], diff --git a/src/version.c b/src/version.c index 915e1c8e22..167dd49382 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 870, /**/ 869, /**/ From f26970ce56f73a7770aa74a9c84f9ddd5ba84e6f Mon Sep 17 00:00:00 2001 From: Patrick Meiser-Knosowski Date: Tue, 28 Jul 2026 20:36:22 +0000 Subject: [PATCH 230/647] runtime(karel): improve indent plugin closes: #20873 Signed-off-by: Patrick Meiser-Knosowski Signed-off-by: Christian Brabandt --- runtime/indent/karel.vim | 4 +- runtime/indent/testdir/karel.in | 75 ++++++++++++++++++++++++++++++--- runtime/indent/testdir/karel.ok | 75 ++++++++++++++++++++++++++++++--- 3 files changed, 140 insertions(+), 14 deletions(-) diff --git a/runtime/indent/karel.vim b/runtime/indent/karel.vim index 9913607570..e6a407abc9 100644 --- a/runtime/indent/karel.vim +++ b/runtime/indent/karel.vim @@ -2,7 +2,7 @@ " Language: Fanuc Karel " Maintainer: Patrick Meiser-Knosowski " Version: 1.0.0 -" Last Change: 28. May 2026 +" Last Change: 29. Jul 2026 " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -64,7 +64,7 @@ function GetKarelIndent() abort let addShiftwidthPattern ..= '|type>' let addShiftwidthPattern ..= '|var>' let addShiftwidthPattern ..= '|begin>' - let addShiftwidthPattern ..= '|routine>' + let addShiftwidthPattern ..= '|%(routine\s+\w+>)%(.*\s*$)@!' if get(g:, 'karelIndentBetweenPrg', 1) let addShiftwidthPattern ..= '|program>' endif diff --git a/runtime/indent/testdir/karel.in b/runtime/indent/testdir/karel.in index edee2bdbbd..d60a0121a6 100644 --- a/runtime/indent/testdir/karel.in +++ b/runtime/indent/testdir/karel.in @@ -23,18 +23,39 @@ VAR i1 :integer b1 :boolean fhCh :file -ROUTINE prg1() +ROUTINE WAITFOR(strucvar : MyStruct; STATUS : BOOLEAN; timeout : INTEGER) : BOOLEAN FROM otherkarel +ROUTINE WAITFOR2 : BOOLEAN FROM otherkarel +ROUTINE WAITFOR3 FROM otherkarel +ROUTINE prg1(b:BOOLEAN) VAR i :integer BEGIN -- END prg1 -ROUTINE fcnt1( s :string ) :string +ROUTINE prg2 +VAR +i :integer +BEGIN + -- +END prg2 +ROUTINE fcnt1 ( s :string ) :string VAR i :integer BEGIN RETURN ' ' END fcnt1 +ROUTINE fcnt2 :string +VAR +i :integer +BEGIN +RETURN ' ' +END fcnt2 +ROUTINE fcnt3:string +VAR +i :integer +BEGIN +RETURN ' ' +END fcnt3 BEGIN IF b1 THEN -- @@ -93,18 +114,39 @@ var i1 :integer b1 :boolean fhCh :file -routine prg1() +routine WAITFOR(strucvar : MyStruct; STATUS : BOOLEAN; timeout : INTEGER) : BOOLEAN from otherkarel +routine WAITFOR2 : BOOLEAN from otherkarel +routine WAITFOR3 from otherkarel +routine prg1(b:BOOLEAN) var i :integer begin -- end prg1 -routine fcnt1( s :string ) :string +routine prg2 +var +i :integer +begin + -- +end prg2 +routine fcnt1 ( s :string ) :string var i :integer begin return ' ' end fcnt1 +routine fcnt2 :string +var +i :integer +begin +return ' ' +end fcnt2 +routine fcnt3:string +var +i :integer +begin +return ' ' +end fcnt3 begin if b1 then -- @@ -163,18 +205,39 @@ Var i1 :integer b1 :boolean fhCh :file -Routine prg1() +Routine WAITFOR(strucvar : MyStruct; STATUS : BOOLEAN; timeout : INTEGER) : BOOLEAN From otherkarel +Routine WAITFOR2 : BOOLEAN From otherkarel +Routine WAITFOR3 From otherkarel +Routine prg1(b:BOOLEAN) Var i :integer Begin -- End prg1 -Routine fcnt1( s :string ) :string +Routine prg2 +Var +i :integer +Begin + -- +End prg2 +Routine fcnt1 ( s :string ) :string Var i :integer Begin Return ' ' End fcnt1 +Routine fcnt2 :string +Var +i :integer +Begin +Return ' ' +End fcnt2 +Routine fcnt3:string +Var +i :integer +Begin +Return ' ' +End fcnt3 Begin If b1 Then -- diff --git a/runtime/indent/testdir/karel.ok b/runtime/indent/testdir/karel.ok index a7b5e9fa6d..a09968c914 100644 --- a/runtime/indent/testdir/karel.ok +++ b/runtime/indent/testdir/karel.ok @@ -23,18 +23,39 @@ VAR i1 :integer b1 :boolean fhCh :file - ROUTINE prg1() + ROUTINE WAITFOR(strucvar : MyStruct; STATUS : BOOLEAN; timeout : INTEGER) : BOOLEAN FROM otherkarel + ROUTINE WAITFOR2 : BOOLEAN FROM otherkarel + ROUTINE WAITFOR3 FROM otherkarel + ROUTINE prg1(b:BOOLEAN) VAR i :integer BEGIN -- END prg1 - ROUTINE fcnt1( s :string ) :string + ROUTINE prg2 + VAR + i :integer + BEGIN + -- + END prg2 + ROUTINE fcnt1 ( s :string ) :string VAR i :integer BEGIN RETURN ' ' END fcnt1 + ROUTINE fcnt2 :string + VAR + i :integer + BEGIN + RETURN ' ' + END fcnt2 + ROUTINE fcnt3:string + VAR + i :integer + BEGIN + RETURN ' ' + END fcnt3 BEGIN IF b1 THEN -- @@ -93,18 +114,39 @@ var i1 :integer b1 :boolean fhCh :file - routine prg1() + routine WAITFOR(strucvar : MyStruct; STATUS : BOOLEAN; timeout : INTEGER) : BOOLEAN from otherkarel + routine WAITFOR2 : BOOLEAN from otherkarel + routine WAITFOR3 from otherkarel + routine prg1(b:BOOLEAN) var i :integer begin -- end prg1 - routine fcnt1( s :string ) :string + routine prg2 + var + i :integer + begin + -- + end prg2 + routine fcnt1 ( s :string ) :string var i :integer begin return ' ' end fcnt1 + routine fcnt2 :string + var + i :integer + begin + return ' ' + end fcnt2 + routine fcnt3:string + var + i :integer + begin + return ' ' + end fcnt3 begin if b1 then -- @@ -163,18 +205,39 @@ Var i1 :integer b1 :boolean fhCh :file - Routine prg1() + Routine WAITFOR(strucvar : MyStruct; STATUS : BOOLEAN; timeout : INTEGER) : BOOLEAN From otherkarel + Routine WAITFOR2 : BOOLEAN From otherkarel + Routine WAITFOR3 From otherkarel + Routine prg1(b:BOOLEAN) Var i :integer Begin -- End prg1 - Routine fcnt1( s :string ) :string + Routine prg2 + Var + i :integer + Begin + -- + End prg2 + Routine fcnt1 ( s :string ) :string Var i :integer Begin Return ' ' End fcnt1 + Routine fcnt2 :string + Var + i :integer + Begin + Return ' ' + End fcnt2 + Routine fcnt3:string + Var + i :integer + Begin + Return ' ' + End fcnt3 Begin If b1 Then -- From decab25acfcf11e614a11053b517cd5d5e622122 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 28 Jul 2026 20:39:43 +0000 Subject: [PATCH 231/647] runtime(doc): Vim9: dictionary in a lambda block is not documented Problem: It is not documented that inside a lambda block the closing "}" of a dictionary must not be at the start of a line. The note is only given for a command block, while the restriction is the same. Solution: Mention it at |inline-function| and refer to |command-block|. closes: #20872 fixes: #20693 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/vim9.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index 897246b5b0..be987bf021 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.2. Last change: 2026 Jul 22 +*vim9.txt* For Vim version 9.2. Last change: 2026 Jul 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -724,6 +724,10 @@ characters, e.g.: > }) No command can follow the "{", only a comment can be used there. +Since the block ends at the first line starting with "}", the closing "}" of a +dictionary inside the block must not be at the start of a line. See +|command-block| for an example and the workaround. + *command-block* *E1026* The block can also be used for defining a user command. Inside the block Vim9 syntax will be used. From ab36bcc870f47a96c00602bd50bdf1aeb09e71da Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 28 Jul 2026 20:45:27 +0000 Subject: [PATCH 232/647] patch 9.2.0871: screen line is lost when splitting a 'winfixheight' window Problem: When the only window has 'winfixheight' set and 'laststatus' is one, splitting it leaves one screen line unused. This happens for example when jumping to an item from a maximized quickfix window (rendcrx) Solution: Do not subtract the height of the status line twice (Hirohito Higashi) fixes: #20495 closes: #20871 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_window_cmd.vim | 17 +++++++++++++++++ src/version.c | 2 ++ src/window.c | 3 +-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index e7f391ed9c..bf524030f9 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -2481,6 +2481,23 @@ func Test_winfixheight_resize_wmh_zero() set winminheight& laststatus& endfunc +" Splitting the only window while it has 'winfixheight' set and 'laststatus' is +" one must not leave a screen line unused. +func Test_winfixheight_split_only_window() + set laststatus=1 + new + only! + setlocal winfixheight + split + " Two windows, both with a status line, and the command line. + call assert_equal(&lines - &cmdheight - 2, winheight(1) + winheight(2)) + + only! + setlocal winfixheight& + set laststatus& + bwipe! +endfunc + " Test that setting 'laststatus' from 0 to 2 gives all windows in a vertical " split (FR_ROW) the same height and correct status line position. func Test_laststatus_vsplit_row_height() diff --git a/src/version.c b/src/version.c index 167dd49382..725d66af7f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 871, /**/ 870, /**/ diff --git a/src/window.c b/src/window.c index 3933f4e884..f2ee69071d 100644 --- a/src/window.c +++ b/src/window.c @@ -1232,9 +1232,8 @@ win_split_ins( win_setheight_win(oldwin->w_height + new_size + statusline_height(oldwin), oldwin); + // w_height now excludes the status line oldwin_height = oldwin->w_height; - if (need_status) - oldwin_height -= statusline_height(oldwin); } // Only make all windows the same height if one of them (except oldwin) From 3d863d6aa15f2305848f82b61b5876d48e811ec8 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 28 Jul 2026 20:50:27 +0000 Subject: [PATCH 233/647] runtime(doc): Update popup width rule Problem: The documentation says the width of a popup window is equal to the longest visible line, while since 9.2.0419 it is the longest line in the buffer, also when that line is not displayed. Solution: Update the documentation and correct a comment that says otherwise. Reported: https://groups.google.com/g/vim_use/c/_rOLxGz5kNM related: #20042 closes: #20870 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- runtime/doc/popup.txt | 10 ++++++---- src/popupwin.c | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt index ef3310638c..d002df11de 100644 --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -1,4 +1,4 @@ -*popup.txt* For Vim version 9.2. Last change: 2026 Jun 17 +*popup.txt* For Vim version 9.2. Last change: 2026 Jul 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -79,9 +79,11 @@ wrapping, lines in the buffer. It can be limited with the "maxheight" property. You can use empty lines to increase the height or the "minheight" property. -The width of the window is normally equal to the longest visible line in the -buffer. It can be limited with the "maxwidth" property. You can use spaces -to increase the width or use the "minwidth" property. +The width of the window is normally equal to the longest line in the buffer, +also when that line is not displayed. This keeps the width the same while +scrolling through the popup. It can be limited with the "maxwidth" property, +which is a good idea when the buffer may contain long lines. You can use +spaces to increase the width or use the "minwidth" property. By default the 'wrap' option is set, so that no text disappears. Otherwise, if there is not enough space then the window is shifted left in order to diff --git a/src/popupwin.c b/src/popupwin.c index 7ef2d766a4..2149ee0997 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -2700,7 +2700,8 @@ popup_adjust_position(win_T *wp) else ++lnum; - // do not use the width of lines we're not going to show + // stop at the last line that is going to be shown; the width was + // already computed above from every buffer line if (maxheight > 0 && (wp->w_firstline >= 0 ? lnum - wp->w_topline From 4a997e146f0451de97ac936b582d379ff429e231 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 28 Jul 2026 20:53:34 +0000 Subject: [PATCH 234/647] runtime(doc): GTK: document that "font" in a highlight group has no effect Problem: It is not documented that in the GTK GUI the "font" item of a highlight group only works for the "Normal" group. The example even uses another group, so it does not work there. Solution: Mention the restriction and use the "Normal" group in the example. closes: #20867 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/syntax.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index f50e12a9a1..7b555d3ca1 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 9.2. Last change: 2026 Jun 21 +*syntax.txt* For Vim version 9.2. Last change: 2026 Jul 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -5870,6 +5870,8 @@ font={font-name} *highlight-font* When setting the font for the "Normal" group, this becomes the default font (until the 'guifont' option is changed; the last one set is used). + In the GTK GUI, a font can only be set for the "Normal" group; for + other groups it is accepted but has no effect. The following only works with Motif, not with other GUIs: When setting the font for the "Menu" group, the menus will be changed. When setting the font for the "Tooltip" group, the tooltips will be @@ -5880,7 +5882,7 @@ font={font-name} *highlight-font* To use a font name with an embedded space or other special character, put it in single quotes. The single quote cannot be used then. Example: > - :hi comment font='Monospace 10' + :hi Normal font='Monospace 10' guifg={color-name} *highlight-guifg* guibg={color-name} *highlight-guibg* From b34beebd24e7636149fd770f04838973f29f1706 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 29 Jul 2026 18:38:53 +0000 Subject: [PATCH 235/647] patch 9.2.0872: popup with opacity does not use the font of the highlight group Problem: When a popup window has an opacity between 0 and 99 the "font" item of its highlight group is ignored and the regular font is used instead. The same applies to "ctermfont", and to the popup menu when the "opacity:" value of 'pumopt' is used (Salman Halim). Solution: Also take the font from the popup highlight when blending the cell attributes (Hirohito Higashi) fixes: #20551 closes: #20866 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/highlight.c | 13 +++++++++---- src/version.c | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/highlight.c b/src/highlight.c index 1b9cbed7c2..4914526fbe 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -3466,14 +3466,18 @@ hl_blend_attr(int char_attr, int popup_attr, int blend, int blend_fg UNUSED) else { // blend_fg=FALSE: popup text is opaque. Replace the - // underlying cell's attribute flags, fg and special - // color with the popup's, so the underlying syntax + // underlying cell's attribute flags, fg, special color + // and font with the popup's, so the underlying syntax // highlighting and any decoration (textprop undercurl, // ...) do not bleed through. new_en.ae_attr = popup_aep->ae_attr; // fallback correctly to Normal fg color if fg_color == INVALCOLOR new_en.ae_u.gui.fg_color = popup_aep->ae_u.gui.fg_color; new_en.ae_u.gui.sp_color = popup_aep->ae_u.gui.sp_color; + new_en.ae_u.gui.font = popup_aep->ae_u.gui.font; +# ifdef FEAT_XFONTSET + new_en.ae_u.gui.fontset = popup_aep->ae_u.gui.fontset; +# endif } // Blend background color: blend popup bg toward underlying bg { @@ -3547,8 +3551,8 @@ hl_blend_attr(int char_attr, int popup_attr, int blend, int blend_fg UNUSED) if (!blend_fg) { // blend_fg=FALSE: popup text is opaque. Replace the - // underlying cell's attribute flags, fg and underline - // color with the popup's, so the underlying syntax + // underlying cell's attribute flags, fg, underline color + // and font with the popup's, so the underlying syntax // highlighting and any decoration (textprop undercurl, // ...) do not bleed through. When the popup has no fg // (e.g. "guifg=NONE") fall back to Normal's fg so the @@ -3564,6 +3568,7 @@ hl_blend_attr(int char_attr, int popup_attr, int blend, int blend_fg UNUSED) // black-ish or white-ish new_en.ae_u.cterm.fg_color = (*p_bg == 'l') ? 1 : 16; new_en.ae_u.cterm.ul_color = popup_aep->ae_u.cterm.ul_color; + new_en.ae_u.cterm.font = popup_aep->ae_u.cterm.font; #ifdef FEAT_TERMGUICOLORS new_en.ae_u.cterm.ul_rgb = popup_aep->ae_u.cterm.ul_rgb; #endif diff --git a/src/version.c b/src/version.c index 725d66af7f..c7eac10f8f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 872, /**/ 871, /**/ From 430ea723347acdf5caa236993022ee2087f40187 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 29 Jul 2026 18:45:28 +0000 Subject: [PATCH 236/647] patch 9.2.0873: :redrawstatus does not update the ruler of the last window Problem: When the last window has no status line the ruler takes its place in the last screen line, but ":redrawstatus" and re-setting 'rulerformat' or 'statusline' do not update it there. An item such as a clock in 'rulerformat' can therefore not be refreshed from a timer (watael) Solution: Also mark the ruler for redrawing when the last window has no status line and 'ruler' is set. Update the documentation, tests and add a new test (Hirohito Higashi) Reported: https://groups.google.com/g/vim_use/c/VKCL2bH8xlk closes: #20865 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/various.txt | 5 +++- src/drawscreen.c | 14 +++++++++++ src/testdir/dumps/Test_terminal_focus_1.dump | 2 +- src/testdir/dumps/Test_terminal_focus_2.dump | 2 +- src/testdir/test_cmdline.vim | 26 ++++++++++++++++++++ src/version.c | 2 ++ 6 files changed, 48 insertions(+), 3 deletions(-) diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 4a4bd69554..0a5ff259ca 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -1,4 +1,4 @@ -*various.txt* For Vim version 9.2. Last change: 2026 Jun 13 +*various.txt* For Vim version 9.2. Last change: 2026 Jul 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -28,6 +28,9 @@ CTRL-L Clear and redraw the screen. The redraw may happen Useful to update the status line(s) when 'statusline' includes an item that doesn't cause automatic updating. + When the last window has no status line the ruler is + redrawn instead, this is useful when 'rulerformat' + includes such an item. If the command line is being edited the redraw is postponed until later. diff --git a/src/drawscreen.c b/src/drawscreen.c index 2c932d4ba7..a5b3124212 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -3477,6 +3477,17 @@ redraw_buf_and_status_later(buf_T *buf, int type) } #endif +/* + * mark the ruler for redraw when the last window has no status line and the + * ruler takes its place in the last screen line; showmode() draws it + */ + static void +ruler_redraw_lastwin(void) +{ + if (p_ru && lastwin->w_status_height == 0) + redraw_cmdline = TRUE; +} + /* * mark all status lines for redraw; used after first :cd */ @@ -3491,6 +3502,7 @@ status_redraw_all(void) wp->w_redr_status = true; redraw_later(UPD_VALID); } + ruler_redraw_lastwin(); } /* @@ -3507,6 +3519,8 @@ status_redraw_curbuf(void) wp->w_redr_status = true; redraw_later(UPD_VALID); } + if (lastwin->w_buffer == curbuf) + ruler_redraw_lastwin(); } /* diff --git a/src/testdir/dumps/Test_terminal_focus_1.dump b/src/testdir/dumps/Test_terminal_focus_1.dump index caf67e71af..94097b92c4 100644 --- a/src/testdir/dumps/Test_terminal_focus_1.dump +++ b/src/testdir/dumps/Test_terminal_focus_1.dump @@ -3,4 +3,4 @@ |~| @73 |~| @73 |~| @73 -| +0#0000000&@56|0|,|0|-|1| @8|A|l@1| +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_terminal_focus_2.dump b/src/testdir/dumps/Test_terminal_focus_2.dump index d02c1515f3..195dbad898 100644 --- a/src/testdir/dumps/Test_terminal_focus_2.dump +++ b/src/testdir/dumps/Test_terminal_focus_2.dump @@ -3,4 +3,4 @@ |~| @73 |~| @73 |~| @73 -| +0#0000000&@56|0|,|0|-|1| @8|A|l@1| +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index ef036d2b03..a83dcb973c 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -4693,6 +4693,32 @@ func Test_rulerformat_function() call StopVimInTerminal(buf) endfunc +func s:BumpRulerCounter(timer) + let g:ruler_counter = 2 + redrawstatus +endfunc + +" When the last window has no status line the ruler is drawn in the last +" screen line. ":redrawstatus" must update it there as well. +func Test_rulerformat_redrawstatus() + CheckFeature timers + + let save_ruf = &rulerformat + set ruler laststatus=0 + let g:ruler_counter = 1 + set rulerformat=%20(count:\ %{g:ruler_counter}%) + redraw! + call assert_match('count: 1', Screenline(&lines)) + + " The ruler must be updated without any key being typed. + call timer_start(10, function('s:BumpRulerCounter')) + call WaitForAssert({-> assert_match('count: 2', Screenline(&lines))}) + + let &rulerformat = save_ruf + unlet g:ruler_counter + set ruler& laststatus& +endfunc + func Test_getcompletion_usercmd() command! -nargs=* -complete=command TestCompletion echo diff --git a/src/version.c b/src/version.c index c7eac10f8f..1f78ca0d85 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 873, /**/ 872, /**/ From 773dc19f145744d65e0e920df57e6e3d33fd4591 Mon Sep 17 00:00:00 2001 From: Igor Mikushkin Date: Wed, 29 Jul 2026 18:53:08 +0000 Subject: [PATCH 237/647] patch 9.2.0874: fold size is compared against 'foldminlines' of the wrong window Problem: checkSmall() compares the fold size of window "wp" against the current window's 'foldminlines'. A fold of another window, e.g. measured while it is redrawn, is judged by an unrelated option value. Solution: Use 'foldminlines' of the window containing the fold (Igor Mikushkin). closes: #20864 Co-authored-by: Claude Signed-off-by: Igor Mikushkin Signed-off-by: Christian Brabandt --- src/fold.c | 4 ++-- src/testdir/test_fold.vim | 38 ++++++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/fold.c b/src/fold.c index 19c444c14c..04698429d6 100644 --- a/src/fold.c +++ b/src/fold.c @@ -1730,7 +1730,7 @@ checkSmall( // Mark any nested folds to maybe-small setSmallMaybe(&fp->fd_nested); - if (fp->fd_len > curwin->w_p_fml) + if (fp->fd_len > wp->w_p_fml) fp->fd_small = FALSE; else { @@ -1738,7 +1738,7 @@ checkSmall( for (n = 0; n < fp->fd_len; ++n) { count += plines_win_nofold(wp, fp->fd_top + lnum_off + n); - if (count > curwin->w_p_fml) + if (count > wp->w_p_fml) { fp->fd_small = FALSE; return; diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim index d4b3a5093b..1c09719b13 100644 --- a/src/testdir/test_fold.vim +++ b/src/testdir/test_fold.vim @@ -2105,4 +2105,42 @@ func Test_cursor_fold_marker_undo() bwipe! endfunc +" The fold size must be compared against 'foldminlines' of the window that +" contains the fold, not of the current window. +func Test_foldminlines_per_window() + " Window with 'foldminlines'=5: its two-line fold stays displayed open. + new + setlocal foldenable foldmethod=manual foldminlines=5 + call setline(1, ['one', 'two', 'three', 'four']) + 2,3fold + call assert_equal(-1, foldclosed(2)) + let winid = win_getid() + + " Split; only the new current window gets 'foldminlines'=0. setline() + " invalidates the fold sizes of both windows and measures them again right + " away, the other window's while this window is current. win_execute() + " below only reads that cached verdict, without measuring again. + split + setlocal foldminlines=0 + call setline(2, 'changed') + call assert_equal(2, foldclosed(2)) + call win_execute(winid, 'call assert_equal(-1, foldclosed(2))') + bwipe! + + " The same the other way around: 'foldminlines'=0 in the other window, so + " its fold must remain closed while the current window has a higher value. + new + setlocal foldenable foldmethod=manual foldminlines=0 + call setline(1, ['one', 'two', 'three', 'four']) + 2,3fold + call assert_equal(2, foldclosed(2)) + let winid = win_getid() + split + setlocal foldminlines=5 + call setline(2, 'changed') + call assert_equal(-1, foldclosed(2)) + call win_execute(winid, 'call assert_equal(2, foldclosed(2))') + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 1f78ca0d85..9d2474d687 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 874, /**/ 873, /**/ From b4ae16ca3ed558e4b2da28bbb05c15fb4fdcd4eb Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 29 Jul 2026 19:22:21 +0000 Subject: [PATCH 238/647] runtime(doc): clarify 'laststatus' effect fixes: #20875 Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 84e4f30aea..647e2a622c 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Jul 22 +*options.txt* For Vim version 9.2. Last change: 2026 Jul 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -5680,6 +5680,12 @@ A jump table for the options with a short description can be found at |Q_op|. 0: never 1: only if there are at least two windows 2: always + + Here "last window" means the last window in a column, i.e. the bottom- + most one, just above the command line. A window with another window + below it always has a status line, since it also visually separates + those. + The screen looks nicer with a status line if you have several windows, but it takes another screen line. |status-line| From 7556f1cba5b76cbf69ccf68068d3156ca164029c Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 29 Jul 2026 19:34:29 +0000 Subject: [PATCH 239/647] patch 9.2.0875: GTK4: GUI does not support command-line arguments Problem: The GTK4 GUI does not support command-line arguments Solution: Parse the supported GUI arguments in gui_mch_prepare() and add the GTK4-specific --prg-name argument (Foxe Chen). closes: #20847 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/doc/gui.txt | 2 +- runtime/doc/gui_x11.txt | 19 ++++- runtime/doc/vim.1 | 3 + runtime/doc/vim.man | 3 + src/globals.h | 2 +- src/gui_gtk4.c | 163 ++++++++++++++++++++++++++++------------ src/main.c | 12 ++- src/po/vim.pot | 7 +- src/version.c | 2 + 9 files changed, 160 insertions(+), 53 deletions(-) diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt index 5edf1abcb1..89fdb0137f 100644 --- a/runtime/doc/gui.txt +++ b/runtime/doc/gui.txt @@ -25,7 +25,7 @@ Other GUI documentation: First you must make sure you actually have a version of Vim with the GUI code included. You can check this with the ":version" command, it says "with xxx -GUI", where "xxx" is X11-Motif, Photon, GTK2, GTK3, etc., or +GUI", where "xxx" is X11-Motif, Photon, GTK2, GTK3, GTK4, etc., or "MS-Windows 32 bit GUI version". How to start the GUI depends on the system used. Mostly you can run the diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index 8f37a154c0..3bb469cecd 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -321,11 +321,24 @@ stuff like -bg, -fg, etc). The ones that are supported are: -fg -foreground {color} foreground color -bg -background {color} background color +If using the GTK4 GUI, then only the following are supported: + -fn or -font + -geom or -geometry (window positioning is NOT supported) + -fg -foreground {color} + -bg -background {color} + +Command line arguments specific to GTK4: + command line argument meaning ~ + --prg-name {name} Argument passed to g_set_prgname(), otherwise + "gvim" is used. On Wayland this will set the app + id, which is equivalent to the X11 WM_CLASS + To set the font, see 'guifont'. For GTK, there's also a menu option that does this. Additionally, there are these command line arguments, which are handled by GTK -internally. Look in the GTK documentation for how they are used: +internally (except GTK4, see below). Look in the GTK documentation for how +they are used: --sync --gdk-debug --gdk-no-debug @@ -343,6 +356,10 @@ These arguments are ignored when the |+netbeans_intg| feature is used: -xrm -mf +If using the GTK4 GUI, then no GTK specific command line arguments are +supported. Instead configure GTK via environment variables: +https://docs.gtk.org/gtk4/running.html + As for colors, Vim's color settings (for syntax highlighting) is still done the traditional Vim way. See |:highlight| for more help. diff --git a/runtime/doc/vim.1 b/runtime/doc/vim.1 index 93c28d6ace..c6d6527c06 100644 --- a/runtime/doc/vim.1 +++ b/runtime/doc/vim.1 @@ -485,6 +485,9 @@ that the user knows that the input and/or output is not connected to a terminal. This will avoid the warning and the two second delay that would happen. .TP +\--prg-name {name} +Set GTK program name. Only for GTK4 GUI. +.TP \-\-remote Connect to a Vim server and make it edit the files given in the rest of the arguments. If no server is found a warning is given and the files are edited diff --git a/runtime/doc/vim.man b/runtime/doc/vim.man index 583d9d28fd..2bcd8d6b59 100644 --- a/runtime/doc/vim.man +++ b/runtime/doc/vim.man @@ -355,6 +355,9 @@ OPTIONS is not connected to a terminal. This will avoid the warn‐ ing and the two second delay that would happen. + --prg-name {name} + Set GTK program name. Only for GTK4 GUI. + --remote Connect to a Vim server and make it edit the files given in the rest of the arguments. If no server is found a warning is given and the files are edited in the current Vim. diff --git a/src/globals.h b/src/globals.h index 8550725235..8e0a37494e 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1885,7 +1885,7 @@ EXTERN Display *xterm_dpy INIT(= NULL); EXTERN XtAppContext app_context INIT(= (XtAppContext)NULL); #endif -#ifdef FEAT_GUI_GTK +#if defined(FEAT_GUI_GTK) && !defined(USE_GTK4) EXTERN guint32 gtk_socket_id INIT(= 0); EXTERN int echo_wid_arg INIT(= FALSE); // --echo-wid argument #endif diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 93851af7c2..45ee9f505d 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -43,16 +43,11 @@ * Format: [WIDTHxHEIGHT][{+-}XOFF{+-}YOFF] */ #define NoValue 0x0000 -#define XValue 0x0001 -#define YValue 0x0002 #define WidthValue 0x0004 #define HeightValue 0x0008 -#define XNegative 0x0010 -#define YNegative 0x0020 static int -vim_parse_geometry(const char *str, int *x, int *y, - unsigned int *width, unsigned int *height) +vim_parse_geometry(const char *str, unsigned int *width, unsigned int *height) { int mask = NoValue; char *end; @@ -86,37 +81,6 @@ vim_parse_geometry(const char *str, int *x, int *y, } } - // Parse x offset - if (*str == '+' || *str == '-') - { - int negative = (*str == '-'); - str++; - val = strtol(str, &end, 10); - if (end != str) - { - *x = negative ? -(int)val : (int)val; - mask |= XValue; - if (negative) - mask |= XNegative; - str = end; - } - } - - // Parse y offset - if (*str == '+' || *str == '-') - { - int negative = (*str == '-'); - str++; - val = strtol(str, &end, 10); - if (end != str) - { - *y = negative ? -(int)val : (int)val; - mask |= YValue; - if (negative) - mask |= YNegative; - } - } - return mask; } @@ -300,6 +264,28 @@ static void clipboard_changed_cb(GdkClipboard *clipboard, gpointer user_data); static void show_menubar_popover(void); #endif +static const char *prgname = NULL; + +/* + * Check if "s" is the option "name" (which includes the leading dash(es)). + * "value" is set to the value if the option uses 'opt=val' format. + */ + static gboolean +arg_match(const char *s, const char *name, char **value) +{ + size_t len = strlen(name); + + if (strncmp(s, name, len) != 0) + return FALSE; + if (s[len] == '=') + *value = (char *)s + len + 1; + else if (s[len] != NUL) + // Something follows the option name that isn't "=": this is a + // different, longer option (e.g. "-fnord" while matching "-fn"). + return FALSE; + return TRUE; +} + /* * Parse the GUI related command-line arguments. Any arguments used are * deleted from argv, and *argc is decremented accordingly. This is called @@ -312,6 +298,86 @@ gui_mch_prepare(int *argc, char **argv) // gui_mch_init_check() after the fork. Calling it before fork // breaks the display connection in the child process, causing gvim // to fail to start without --nofork. + + int i = 0; + + while (i < *argc) + { + char *s = argv[i]; + char *value = NULL; + int has_inline_value = FALSE; + int n_strip; + + if (s[0] != '-' && s[0] != '+') + { + ++i; + continue; + } + + if (strchr(s, '=') != NULL) + has_inline_value = TRUE; + + // If the value was not given inline (no "="), it would come from the + // next argv element. Do not treat that next element as this option's + // value if it is "--" (end-of-options marker) or is another option. + if (!has_inline_value) + { + if (i + 1 < *argc + && strcmp(argv[i + 1], "--") != 0 + && !((argv[i + 1][0] == '-' || argv[i + 1][0] == '+') + && !vim_isdigit(argv[i + 1][1]))) + value = argv[i + 1]; + else + value = NULL; + } + + if (arg_match(s, "-fn", &value) || arg_match(s, "-font", &value)) + font_argument = value; + else if (arg_match(s, "-geom", &value) + || arg_match(s, "-geometry", &value)) + { + if (value != NULL) + gui.geom = vim_strsave((char_u *)value); + } + else if (arg_match(s, "-bg", &value) + || arg_match(s, "-background", &value)) + background_argument = value; + else if (arg_match(s, "-fg", &value) + || arg_match(s, "-foreground", &value)) + foreground_argument = value; + else if (strncmp(s, "-nb", 3) == 0) + { + gui.dofork = false; // don't fork() when starting GUI + netbeansArg = argv[i]; + has_inline_value = TRUE; // -nb uses non standard syntax, just + // remove the flag. + } + else if (arg_match(s, "--prg-name", &value)) + // GTK4 specific + prgname = value; + else + { + i++; + continue; + } + + // Remove the flag from the argument vector. + n_strip = 1; + // Move the argument's value as well, but only if it was consumed + // from a separate argv element (the "-opt=value" form lives inside + // the flag's own element and is stripped along with it already). + if (value != NULL && !has_inline_value) + n_strip = 2; + + if (*argc - n_strip >= i) + { + *argc -= n_strip; + if (*argc > i) + mch_memmove(&argv[i], &argv[i + n_strip], + (*argc - i) * sizeof(char *)); + argv[*argc] = NULL; + } + } } /* @@ -417,8 +483,9 @@ gui_mch_init_check(void) { // This defaults to argv[0], but we want it to match the name of the // shipped gvim.desktop so that Vim's windows can be associated with this - // file. Also sets WM_CLASS on X11. - g_set_prgname("gvim"); + // file. Also sets WM_CLASS on X11. If "--prg-name" is specified, then use + // that. + g_set_prgname(prgname == NULL ? "gvim" : prgname); // Suppress noisy EGL warnings when GL is not available. Only set // this when actually starting the GUI, so non-GUI invocations are @@ -668,10 +735,8 @@ gui_mch_open(void) { int mask; unsigned int w, h; - int x = 0; - int y = 0; - mask = vim_parse_geometry((char *)gui.geom, &x, &y, &w, &h); + mask = vim_parse_geometry((char *)gui.geom, &w, &h); if (mask & WidthValue) Columns = w; @@ -685,12 +750,15 @@ gui_mch_open(void) VIM_CLEAR(gui.geom); } + else + { + // Use 80x24 as the default GUI size, unless geometry was specified. + if (Columns > 80) + Columns = 80; + if (Rows > 24) + Rows = 24; + } - // Use 80x24 as the default GUI size, unless geometry was specified. - if (Columns > 80 && gui.geom == NULL) - Columns = 80; - if (Rows > 24 && gui.geom == NULL) - Rows = 24; pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), @@ -725,6 +793,7 @@ gui_mch_open(void) G_CALLBACK(mainwin_destroy_cb), NULL); // Resize is handled by GtkForm's size_allocate callback. + // Not sure if this needed but still do it I guess? gtk_widget_set_visible(gui.mainwin, TRUE); // Make sure the drawing area gets keyboard focus. diff --git a/src/main.c b/src/main.c index 53a2923256..95d0494a15 100644 --- a/src/main.c +++ b/src/main.c @@ -1965,13 +1965,13 @@ early_arg_scan(mparm_T *parmp UNUSED) else # ifdef FEAT_GUI_MSWIN win_socket_id = id; -# else +# elif !defined(USE_GTK4) gtk_socket_id = id; # endif i++; } # endif -# ifdef FEAT_GUI_GTK +# if defined(FEAT_GUI_GTK) && !defined(USE_GTK4) else if (STRICMP(argv[i], "--echo-wid") == 0) echo_wid_arg = TRUE; # endif @@ -3812,17 +3812,25 @@ usage(void) main_msg(_("-xrm \tSet the specified resource")); # endif // FEAT_GUI_X11 # ifdef FEAT_GUI_GTK +# ifdef USE_GTK4 + mch_msg(_("\nArguments recognised by gvim (GTK4 version):\n")); +# else mch_msg(_("\nArguments recognised by gvim (GTK+ version):\n")); +# endif main_msg(_("-background \tUse for the background (also: -bg)")); main_msg(_("-foreground \tUse for normal text (also: -fg)")); main_msg(_("-font \t\tUse for normal text (also: -fn)")); main_msg(_("-geometry \tUse for initial geometry (also: -geom)")); +# ifdef USE_GTK4 + main_msg("--prg-name \tSet GTK program name"); +# else main_msg(_("-iconic\t\tStart Vim iconified")); main_msg(_("-reverse\t\tUse reverse video (also: -rv)")); main_msg(_("-display \tRun Vim on (also: --display)")); main_msg(_("--role \tSet a unique role to identify the main window")); main_msg(_("--socketid \tOpen Vim inside another GTK widget")); main_msg(_("--echo-wid\t\tMake gvim echo the Window ID on stdout")); +# endif # endif # ifdef FEAT_GUI_MSWIN # ifdef VIMDLL diff --git a/src/po/vim.pot b/src/po/vim.pot index b6ded21320..8f7f2e070f 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-07-27 20:48+0000\n" +"POT-Creation-Date: 2026-07-29 19:37+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1821,6 +1821,11 @@ msgstr "" msgid "-xrm \tSet the specified resource" msgstr "" +msgid "" +"\n" +"Arguments recognised by gvim (GTK4 version):\n" +msgstr "" + msgid "" "\n" "Arguments recognised by gvim (GTK+ version):\n" diff --git a/src/version.c b/src/version.c index 9d2474d687..0f6a474227 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 875, /**/ 874, /**/ From b0e0b22535079e478c3acfb47a61709c3c59ff2d Mon Sep 17 00:00:00 2001 From: curbe454 Date: Thu, 30 Jul 2026 18:14:51 +0000 Subject: [PATCH 240/647] runtime(zip): Improve Compatibility for powershell 5 and pwsh 7 related: #20832 Co-Authored-By: curbe454 Signed-off-by: Christian Brabandt --- runtime/autoload/zip.vim | 88 ++++++++++++++++++++++++++++++---------- runtime/doc/pi_zip.txt | 23 +++++++---- 2 files changed, 82 insertions(+), 29 deletions(-) diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim index 44bdfc6820..1d0ecff45b 100644 --- a/runtime/autoload/zip.vim +++ b/runtime/autoload/zip.vim @@ -25,6 +25,7 @@ " 2026 Apr 14 by Vim Project: Detect more path traversal attacks on Windows " 2026 Apr 15 by Vim Project: Detect more path traversal attacks on Windows " 2026 Jun 20 by Vim Project: Fix wrong escaping for the powershell calls +" 2026 Jul 25 by Vim Project: Improved Compatibility for powershell 5 and pwsh 7 " License: Vim License (see vim's :help license) " Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, @@ -61,6 +62,9 @@ endif if !exists("g:zip_extractcmd") let g:zip_extractcmd= g:zip_unzipcmd endif +if !exists("g:zip_pwsh") + let g:zip_pwsh='' +endif " --------------------------------------------------------------------- " required early @@ -77,16 +81,55 @@ if v:version < 901 call s:Mess('WarningMsg', "***warning*** this version of zip needs vim 9.1 or later") finish endif -" sanity checks -if !executable(g:zip_unzipcmd) && &shell !~ 'pwsh' - call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system") - finish + +" --------------------------------------------------------------------- +" Compatibility checks +" PowerShell: {{{2 +" Existence of powershell always means a Windows OS. By default the +" `zip`/`unzip` is not installed on Windows, but the runtime of +" powershell support relative functionalities about zip compression +" and extraction. +" In the following implementations we'll use some powershell scripts +" to manipulate zip files. All these scripts should available to both +" Windows PowerShell 5 and pwsh 7+. + +let s:ps = '' +" order: `g:zip_pwsh` > `&shell`, with executable check +if &shell =~# 'powershell' || g:zip_pwsh =~# 'powershell' + if executable('powershell') + let s:ps = 'powershell' + endif endif -if !dist#vim#IsSafeExecutable('zip', g:zip_unzipcmd) && &shell !~ 'pwsh' - call s:Mess('Error', "Warning: NOT executing " .. g:zip_unzipcmd .. " from current directory!") - finish +if (empty(g:zip_pwsh) && &shell =~# 'pwsh') || g:zip_pwsh =~# 'pwsh' + if executable('pwsh') + let s:ps = 'pwsh' + endif endif +fun! s:isPS() + return !empty(s:ps) +endfun + +" --------------------------------------------------------------------- +" sanity checks +" s:SafeExecutable: {{{2 +fun! s:SafeExecutable(exe) + if !executable(a:exe) && !s:isPS() + call s:Mess('Error', "***error*** (zip) '".a:exe."' not available on your system") + return v:false + endif + if !dist#vim#IsSafeExecutable('zip', a:exe) && !s:isPS() + call s:Mess('Error', "Warning: NOT executing " .. a:exe .. " from current directory!") + return v:false + endif + return v:true +endfun +" guarantee default command is exist and not be injected by environment +" every default command should be checked +if !s:SafeExecutable(g:zip_zipcmd) | finish | endif +if !s:SafeExecutable(g:zip_unzipcmd) | finish | endif +if !s:SafeExecutable(g:zip_extractcmd) | finish | endif + " ---------------- " PowerShell: {{{1 " ---------------- @@ -94,8 +137,8 @@ endif function! s:TryExecGnuFallBackToPs(executable, gnu_func_call, ...) " Check that a gnu executable is available, run the gnu_func_call if so. If " the gnu executable is not available or if gnu_func_call fails, try - " ps_func_call if &shell =~ 'pwsh'. If all attempts fail, print errors. - " a:executable - one of (g:zip_zipcmd, g:zip_unzipcmd, g:zip_extractcmd) + " ps_func_call if `s:isPS()`. If all attempts fail, print errors. + " a:executable - (string) name of the executable program " a:gnu_func_call - (string) a gnu function call to execute " a:1 - (optional string) a PowerShell function call to execute. let failures = [] @@ -109,12 +152,12 @@ function! s:TryExecGnuFallBackToPs(executable, gnu_func_call, ...) else call add(failures, a:executable.' not available on your system') endif - if &shell =~ 'pwsh' && a:0 == 1 + if s:isPS() && a:0 == 1 try exe a:1 return catch - call add(failures, 'Fallback to PowerShell attempted but failed') + call add(failures, 'Fallback to PowerShell attempted but failed: '.a:1) endtry endif for msg in failures @@ -127,20 +170,22 @@ function! s:ZipBrowsePS(zipfile) " Browse the contents of a zip file using PowerShell's " Equivalent `unzip -Z1 -- zipfile` let cmds = [ + \ 'Add-Type -AssemblyName System.IO.Compression.FileSystem;', \ '$zip = [System.IO.Compression.ZipFile]::OpenRead(' . s:PSEscape(a:zipfile) . ');', \ '$zip.Entries | ForEach-Object { $_.FullName };', \ '$zip.Dispose()' \ ] - return 'pwsh -NoProfile -Command ' . s:Escape(join(cmds, ' '), 1) + return s:ps . ' -NoProfile -Command ' . s:Escape(join(cmds, ' '), 1) endfunction function! s:ZipReadPS(zipfile, fname, tempfile) " Read a filename within a zipped file to a temporary file. " Equivalent to `unzip -p -- zipfile fname > tempfile` - if &shell =~ 'pwsh' + if s:isPS() call s:Mess('WarningMsg', "***warning*** PowerShell can display, but cannot update, files in archive subfolders") endif let cmds = [ + \ 'Add-Type -AssemblyName System.IO.Compression.FileSystem;', \ '$zip = [System.IO.Compression.ZipFile]::OpenRead(' . s:PSEscape(a:zipfile) . ');', \ '$fileEntry = $zip.Entries | Where-Object { $_.FullName -eq ' . s:PSEscape(a:fname) . ' };', \ '$stream = $fileEntry.Open();', @@ -150,13 +195,13 @@ function! s:ZipReadPS(zipfile, fname, tempfile) \ '$stream.Close();', \ '$zip.Dispose()' \ ] - return 'pwsh -NoProfile -Command ' . s:Escape(join(cmds, ' ')) + return s:ps . ' -NoProfile -Command ' . s:Escape(join(cmds, ' ')) endfunction function! s:ZipUpdatePS(zipfile, fname) " Update a filename within a zipped file " Equivalent to `zip -u zipfile fname` - if &shell =~ 'pwsh' && a:fname =~ '/' + if s:isPS() && a:fname =~ '/' call s:Mess('Error', "***error*** PowerShell cannot update files in archive subfolders") return ':' endif @@ -171,6 +216,7 @@ function! s:ZipExtractFilePS(zipfile, fname) return ':' endif let cmds = [ + \ 'Add-Type -AssemblyName System.IO.Compression.FileSystem;', \ '$zip = [System.IO.Compression.ZipFile]::OpenRead(' . s:PSEscape(a:zipfile) . ');', \ '$fileEntry = $zip.Entries | Where-Object { $_.FullName -eq ' . s:PSEscape(a:fname) . ' };', \ '$stream = $fileEntry.Open();', @@ -180,7 +226,7 @@ function! s:ZipExtractFilePS(zipfile, fname) \ '$stream.Close();', \ '$zip.Dispose()' \ ] - return 'pwsh -NoProfile -Command ' . s:Escape(join(cmds, ' ')) + return s:ps . ' -NoProfile -Command ' . s:Escape(join(cmds, ' ')) endfunction function! s:ZipDeleteFilePS(zipfile, fname) @@ -193,7 +239,7 @@ function! s:ZipDeleteFilePS(zipfile, fname) \ 'if ($entry) { $entry.Delete(); $zip.Dispose() }', \ 'else { $zip.Dispose() }' \ ] - return 'pwsh -NoProfile -Command ' . s:Escape(join(cmds, ' ')) + return s:ps . ' -NoProfile -Command ' . s:Escape(join(cmds, ' ')) endfunction " ---------------- @@ -214,7 +260,7 @@ fun! zip#Browse(zipfile) defer s:RestoreOpts(dict) " sanity checks - if !executable(g:zip_unzipcmd) && &shell !~ 'pwsh' + if !executable(g:zip_unzipcmd) && !s:isPS() call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system") return endif @@ -322,7 +368,7 @@ fun! zip#Read(fname,mode) endif let fname = fname->substitute('[', '[[]', 'g')->escape('?*\\') " sanity check - if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','','')) && &shell !~ 'pwsh' + if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','','')) && !s:isPS() call s:Mess('Error', "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program") return endif @@ -442,7 +488,7 @@ fun! zip#Write(fname) let ps_cmd = s:ZipUpdatePS(zip, fname) let ps_cmd = 'call system(''' . substitute(ps_cmd, "'", "''", 'g') . ''')' call s:TryExecGnuFallBackToPs(g:zip_zipcmd, gnu_cmd, ps_cmd) - if &shell =~ 'pwsh' + if s:isPS() " Vim flashes 'creation in progress ...' from what I believe is the " ProgressAction stream of PowerShell. Unfortunately, this cannot be " suppressed (as of 250824) due to an open PowerShell issue. @@ -540,7 +586,7 @@ fun! zip#Extract() if v:shell_error != 0 call s:Mess('Error', "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!") - elseif !filereadable(fname) && &shell !~ 'pwsh' + elseif !filereadable(fname) && !s:isPS() call s:Mess('Error', "***error*** attempted to extract ".fname." but it doesn't appear to be present!") else echomsg "***note*** successfully extracted ".fname diff --git a/runtime/doc/pi_zip.txt b/runtime/doc/pi_zip.txt index dc462cfefc..271fc11e98 100644 --- a/runtime/doc/pi_zip.txt +++ b/runtime/doc/pi_zip.txt @@ -1,4 +1,4 @@ -*pi_zip.txt* For Vim version 9.2. Last change: 2026 Jun 20 +*pi_zip.txt* For Vim version 9.2. Last change: 2026 Jul 30 +====================+ | Zip File Interface | @@ -71,16 +71,22 @@ Copyright: Copyright (C) 2005-2015 Charles E Campbell *zip-copyright* "0": > let g:zip_exec=0 < - FALLBACK TO POWERSHELL CORE~ + FALLBACK TO POWERSHELL~ + *g:zip_pwsh* This plugin will first attempt to use the (more capable) GNU zip/unzip commands. If these commands are not available or fail, and the user is - using PowerShell Core (i.e., the 'shell' option matches "pwsh"), the - plugin will fall back to a PowerShell Core cmdlet. The PowerShell Core - cmdlets are limited: they cannot write or extract files within - subdirectories of a zip archive. The advantage, however, is that no - separate unzip binary needs to be installed. - + using PowerShell, the plugin will fall back to a PowerShell cmdlet. + The PowerShell cmdlets are limited: they cannot write or extract files + within subdirectories of a zip archive. The advantage, however, is that + no separate unzip binary needs to be installed. The 'shell' option will + be checked whether to choose "pwsh" or "powershell", or set `g:zip_pwsh`. + If both are available, this plugin will prefer pwsh. Default value of + "g:zip_pwsh" is an empty string, which would not overwrite the 'shell' + option configuration. This functionality is not turned on by default on + MS-Windows, since the default 'shell' is "cmd.exe". For example: > + let g:zip_pwsh='powershell' +< PREVENTING LOADING~ If for some reason you do not wish to use vim to examine zipped files, @@ -116,6 +122,7 @@ Copyright: Copyright (C) 2005-2015 Charles E Campbell *zip-copyright* ============================================================================== 4. History *zip-history* {{{1 unreleased: + Jul 25, 2026 * support both Windows PowerShell 5 and pwsh 7+ Sep 19, 2025 * support PowerShell Core Jul 12, 2025 * drop ../ on write to prevent path traversal attacks Mar 11, 2025 * handle filenames with leading '-' correctly From f594f41e7de59ddb47a2fe5019afb0865a74856c Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 30 Jul 2026 18:20:48 +0000 Subject: [PATCH 241/647] runtime(doc): regenerate help tags forgotten from b0e0b22535079e478c3acf Signed-off-by: Christian Brabandt --- runtime/doc/tags | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/doc/tags b/runtime/doc/tags index 28c30f03c9..9f59289a8c 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -8075,6 +8075,7 @@ g:zipPlugin_ext pi_zip.txt /*g:zipPlugin_ext* g:zip_exec pi_zip.txt /*g:zip_exec* g:zip_extractcmd pi_zip.txt /*g:zip_extractcmd* g:zip_nomax pi_zip.txt /*g:zip_nomax* +g:zip_pwsh pi_zip.txt /*g:zip_pwsh* g:zip_unzipcmd pi_zip.txt /*g:zip_unzipcmd* g:zip_zipcmd pi_zip.txt /*g:zip_zipcmd* g; motion.txt /*g;* From 61997d8cedb05af5a7e0ce35fbeb8dd2b7ac36cf Mon Sep 17 00:00:00 2001 From: Antonio Giovanni Colombo Date: Thu, 30 Jul 2026 18:21:41 +0000 Subject: [PATCH 242/647] translation(it): Update Italian man page Signed-off-by: Antonio Giovanni Colombo Signed-off-by: Christian Brabandt --- runtime/doc/vim-it.1 | 7 +++++-- runtime/doc/vim-it.UTF-8.1 | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/runtime/doc/vim-it.1 b/runtime/doc/vim-it.1 index 0d471fdbc9..b9db187f98 100644 --- a/runtime/doc/vim-it.1 +++ b/runtime/doc/vim-it.1 @@ -216,7 +216,7 @@ in Modo Ex migliorato, come se il programma eseguito sia "exim". Direttamente [Foreground]. Per la versione GUI, .B Vim non creare [fork] una nuova finestra, indipendente dalla shell di invocazione. -Per l'Amiga, non fa ripartire +Per l'Amiga, non far ripartire .B Vim per aprire una nuova finestra. Opzione da usare quando @@ -483,7 +483,7 @@ e scrivere le registrazioni a {nome_file}. Ci in una fase molto iniziale dell'avvio del programma. .TP \-\-nofork -Eseguire Vim irettamente [Foreground]. Per la versione GUI, +Eseguire Vim direttamente [Foreground]. Per la versione GUI, .B Vim non crea [fork] una nuova finestra, indipendente dalla shell di invocazione. .TP @@ -498,6 +498,9 @@ terminale vero e proprio. Ci e il ritardo di due secondi, ossia il comportamento previsto in assenza di questo argomento. .TP +\--prg-name {nome} +Impostare il nome del programma GTK. Solo se si sta usando la GUI GTK4. +.TP \-\-remote Connettersi a un server Vim a cui chiedere di editare i file elencati come altri argomenti. Se non si trova un server viene dato un messaggio e i file diff --git a/runtime/doc/vim-it.UTF-8.1 b/runtime/doc/vim-it.UTF-8.1 index 8eb61707d0..140223ef9b 100644 --- a/runtime/doc/vim-it.UTF-8.1 +++ b/runtime/doc/vim-it.UTF-8.1 @@ -216,7 +216,7 @@ in Modo Ex migliorato, come se il programma eseguito sia "exim". Direttamente [Foreground]. Per la versione GUI, .B Vim non creare [fork] una nuova finestra, indipendente dalla shell di invocazione. -Per l'Amiga, non fa ripartire +Per l'Amiga, non far ripartire .B Vim per aprire una nuova finestra. Opzione da usare quando @@ -483,7 +483,7 @@ e scrivere le registrazioni a {nome_file}. Ciò equivale a chiamare in una fase molto iniziale dell'avvio del programma. .TP \-\-nofork -Eseguire Vim irettamente [Foreground]. Per la versione GUI, +Eseguire Vim direttamente [Foreground]. Per la versione GUI, .B Vim non crea [fork] una nuova finestra, indipendente dalla shell di invocazione. .TP @@ -498,6 +498,9 @@ terminale vero e proprio. Ciò serve per evitare il messaggio di avvertimento e il ritardo di due secondi, ossia il comportamento previsto in assenza di questo argomento. .TP +\--prg-name {nome} +Impostare il nome del programma GTK. Solo se si sta usando la GUI GTK4. +.TP \-\-remote Connettersi a un server Vim a cui chiedere di editare i file elencati come altri argomenti. Se non si trova un server viene dato un messaggio e i file From fa285ef8dce38c05102975e69c0bd1fc7b781fba Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Thu, 30 Jul 2026 18:23:25 +0000 Subject: [PATCH 243/647] patch 9.2.0876: GTK4: compile error with disabled netbeans feat Problem: GTK4: compile error with disabled netbeans feature Solution: Add ifdefs (Foxe Chen) closes: #20879 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 45ee9f505d..f5fb4487df 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -345,6 +345,7 @@ gui_mch_prepare(int *argc, char **argv) else if (arg_match(s, "-fg", &value) || arg_match(s, "-foreground", &value)) foreground_argument = value; +#ifdef FEAT_NETBEANS_INTG else if (strncmp(s, "-nb", 3) == 0) { gui.dofork = false; // don't fork() when starting GUI @@ -352,6 +353,7 @@ gui_mch_prepare(int *argc, char **argv) has_inline_value = TRUE; // -nb uses non standard syntax, just // remove the flag. } +#endif else if (arg_match(s, "--prg-name", &value)) // GTK4 specific prgname = value; diff --git a/src/version.c b/src/version.c index 0f6a474227..e921a5c367 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 876, /**/ 875, /**/ From 99921ffc39591f7163d015dec43b29ae30a4462b Mon Sep 17 00:00:00 2001 From: Brian Carbone Date: Thu, 30 Jul 2026 18:32:16 +0000 Subject: [PATCH 244/647] runtime(marko): improve syntax highlighting closes: #20874 Signed-off-by: Brian Carbone Signed-off-by: Christian Brabandt --- runtime/syntax/marko.vim | 602 ++++++++++++------ runtime/syntax/testdir/dumps/marko_00.dump | 16 +- runtime/syntax/testdir/dumps/marko_01.dump | 34 +- runtime/syntax/testdir/dumps/marko_02.dump | 32 +- .../testdir/dumps/marko_concise_00.dump | 36 +- .../testdir/dumps/marko_concise_01.dump | 38 +- .../testdir/dumps/marko_concise_02.dump | 28 +- runtime/syntax/testdir/input/marko.marko | 41 +- .../syntax/testdir/input/marko_concise.marko | 77 +-- 9 files changed, 560 insertions(+), 344 deletions(-) diff --git a/runtime/syntax/marko.vim b/runtime/syntax/marko.vim index be589534c3..96d24970a8 100644 --- a/runtime/syntax/marko.vim +++ b/runtime/syntax/marko.vim @@ -1,21 +1,18 @@ " Vim syntax file " Language: Marko -" Maintainer: Brian Carbone +" Maintainer: Brian Carbone " URL: https://markojs.com " Filenames: *.marko -" Last Change: 2026 Jul 28 +" Last Change: 2026 Jul 29 -" Marko interleaves HTML-like tags, TypeScript expressions and CSS style -" blocks, in two modes: an HTML-like mode and an indentation-based concise -" mode. Mode is tracked structurally: the body of an html-mode element is -" an html-mode region (bare text stays plain there), while everywhere else -" is concise context, where a line-start name is a tag: +" Marko interleaves HTML-like tags, TypeScript expressions and CSS in two +" modes. Mode is tracked structurally: element bodies and "--" text blocks +" are html mode (bare text stays plain), everywhere else is concise, where +" a line-start name is a tag: "

if you want, stop by

body text, plain " my-tag size="large" concise tag, highlighted -" -" Same-position priority goes to the item defined last, so definition order -" is deliberate throughout; the load-bearing orderings are called out in -" the comments below. +" Same-position priority goes to the item defined last; definition order +" is deliberate throughout. if !exists("main_syntax") if exists("b:current_syntax") @@ -27,11 +24,11 @@ endif let s:cpo_save = &cpo set cpo&vim +" Top level is mostly markup; regions holding prose opt into @Spell. syn spell toplevel -" TypeScript for expressions and statement tags, CSS for style blocks. -" Both includes mutate shared state ("syn case", "syn iskeyword", sync -" rules, 'iskeyword'), all of it restored or restated afterwards. +" Both includes mutate shared state ("syn case", "syn iskeyword", sync, +" 'iskeyword'), restored or restated afterwards. let s:iskeyword_save = &l:iskeyword syn include @markoTS syntax/typescript.vim unlet! b:current_syntax @@ -41,107 +38,190 @@ let &l:iskeyword = s:iskeyword_save unlet s:iskeyword_save syn case match -" typescript.vim (yats) attaches type arguments via nextgroup after every -" identifier, so an unspaced "<" in any expression opens a region hunting a -" ">" that may never come: +" A "\%#=1" prefix pins a pattern to the backtracking regexp engine: the +" default NFA engine is much slower on this file's characteristic shapes +" (a lookbehind or bounded repeat in front of an alternation). Both +" engines answer alike; only patterns measured faster carry the prefix. + +" yats attaches type arguments via nextgroup after every identifier, so an +" unspaced "<" in any expression would hunt a ">" that may never come: "
"-style line ends; +" mid-line "x > 1" continues via the break end's own guard); single +" "+"/"-" continue, postfix "i++" ends; unary keywords count unless a +" word character precedes ("a-new Date()" stays whole), binary and type +" keywords only after whitespace ("class=step-in" ends); a trailing "." +" continues when a word character follows, across blank lines. A "/" +" counts only when spaces flank it (ahead of the break it is ambiguous +" with "/>"), and the break demands a non-space before the space, so a +" continuation line's indent cannot end the value it continues: +" ratio=total / count max=10 +" total=base + +" tax +let s:val_nocont = '[&*^:=!<%|?~]\@1\|>>\)\@2\@1; \t]\)\@=' +let s:val_head = ' contained matchgroup=markoOperator start=":\==>\@!\s*"' + \ . ' matchgroup=NONE start="\.\@1<=\%(\.\.\.\)\@3<="' +let s:val_tail = ' contains=@markoExpr keepend extend' +exe 'syn region markoAttrValue' . s:val_head + \ . ' end="\ze," end="\ze/>" end="=\@1"' + \ . ' end="' . s:val_last . '\ze\s*\n\%(\_s*\%(' . s:val_op . '\|-\|/[/*>]\@!\)\)\@!"' + \ . ' end="' . s:val_break . '\%(\_s*\%(' . s:val_op . '\|-\|/[/*>]\@!\)\)\@!"' . s:val_tail +exe 'syn region markoAttrValueConcise' . s:val_head + \ . ' end="\ze[,;]" end="' . s:val_last . '"' + \ . ' end="' . s:val_break . '\%(\s*\%(' . s:val_op . '\|--\@!\|/[/*]\@!\|>\)\)\@!"' . s:val_tail +exe 'syn region markoAttrValueInGroup' . s:val_head + \ . ' end="\ze[,\]]" end="' . s:val_last . '"' + \ . ' end="' . s:val_break . '\%(\s*\%(' . s:val_op . '\|-\|/[/*]\@!\|>\)\)\@!"' . s:val_tail +unlet s:val_nocont s:val_last s:val_break s:val_op s:val_head s:val_tail + syn cluster markoTagStuff contains=markoTagVar,markoShorthandId,markoShorthandClass, - \markoAttrName,markoAttrValue,markoString,markoArgs,markoParams,markoTypeArgs, + \markoAttrName,markoString,markoArgs,markoParams,markoTypeArgs, \markoMethodBody,markoSpread,markoTagComment,markoPlaceholder -syn cluster markoTagNames contains=markoTagName,markoAttrTagName,markoTagNameConditional, - \markoTagNameRepeat,markoTagNameException,markoTagNameStatement,markoTagNameBuiltin - -" Concise attribute groups may span lines: -" define [ -" size = "large" -" ] +" The name groups themselves are defined near the end of the file; a +" cluster may name them before they exist. +syn cluster markoTagNames contains=markoTagName,markoTagNameTail,markoAttrTagName, + \markoTagNameConditional,markoTagNameRepeat,markoTagNameException, + \markoTagNameStatement,markoTagNameBuiltin + +" Attribute groups may span lines. The lookbehind keeps a spread's array +" literal out; that "[" opens a value, not a group: +" define [size = "large"] my-tag ...[1, 2] syn region markoAttrGroup contained matchgroup=markoTagDelim - \ start="\[" end="]" - \ contains=@markoTagStuff extend + \ start="\%(\.\.\.\)\@3" - \ end="$" contains=@markoExpr -syn region markoStatement - \ start="^\s*\ze\%(import\|export\|class\)\>" + \ matchgroup=NONE start="^\s*\ze\%(import\|export\|class\)\>" \ end="$" contains=@markoExpr " A tag name may be empty (<.card>), dynamic (<${tag}>) or an attribute -" tag (<@body>); the ">" of an arrow does not end the tag. +" tag (<@body>); an arrow's ">" does not end the tag. syn region markoTag matchgroup=markoTagDelim - \ start="<\ze[^/ \t!?<>=]" end="/>" end="=\@1" - \ contains=@markoTagStuff,@markoTagNames + \ start="<\ze[^/ \t!?<>=]" end="/>" end="\%#=1=\@1" + \ contains=@markoTagStuff,@markoTagNames,markoAttrValue +" Recovers a close tag no body end consumed, eg a stray one in concise +" context. syn region markoCloseTag matchgroup=markoTagDelim \ start="" \ contains=@markoTagNames,markoPlaceholder -" The name of a close tag whose "". -syn match markoCloseName "\%(". +" It stops before "${", so a dynamic close name's placeholder colors: +" +syn match markoCloseName + \ "/\@1<=\%(" display - -" Everything html-mode content may contain. Statement tags and concise -" tags are absent: bare text inside an element body is prose. +" A dynamic close name's placeholder, chained so the closing ">" keeps +" its color: via the body's nextgroup, via the +" close name's. +syn region markoClosePlaceholder contained matchgroup=markoPlaceholderDelim + \ start="\$!\={" end="}" + \ contains=@markoExpr + \ nextgroup=markoCloseGt,markoCloseTail +syn match markoCloseTail contained "\%(\k\|:\)\+\s*" + \ nextgroup=markoCloseGt,markoClosePlaceholder display +" The anonymous form (): a body end consumed the "" takes its color directly. +syn match markoCloseAnon "\%(" display + +" Statement and concise tags are absent: bare text in a body is prose. +" The close-name refinements keep
would swallow the rest of the file -" Its block comment carries "extend", which would let one stray "/*" escape -" every containing region below. Both are redefined bounded; the cost is -" generic-call coloring inside script blocks. +" That group stays cleared. The comment region replaces yats' block +" comment, whose "extend" would escape every containing region below. silent! syn clear typescriptTypeArguments silent! syn clear typescriptComment syn region typescriptComment contained start="/\*" end="\*/" contains=@Spell,typescriptCommentTodo -" Everything an embedded TypeScript expression may contain. The bracket -" pairs keep an outer region open across nested delimiters and shield the -" spaces inside groupings from attribute-value termination: +" yats claims call arguments, bodies, indexing, arrays, templates and +" parenthesized expressions via nextgroup, so the markoTS* pairs below +" never see those delimiters. Each row is yats' own definition plus +" "contained extend", the one difference from upstream: a multiline group +" keeps its containing attribute value open, and a bracketed one shields +" the spaces inside, as the parser's group tracking does: +" count=Math.max(0, tiers.findIndex((t) => t.featured)) +" pair=raw as [string, string] +for s:def in [ + \ 'typescriptBlock matchgroup=typescriptBraces start=/{/ end=/}/ contains=@typescriptStatement,@typescriptComments fold', + \ 'typescriptFuncCallArg matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptValue,@typescriptComments,typescriptCastKeyword nextgroup=@typescriptSymbols,typescriptDotNotation skipwhite skipempty skipnl', + \ 'typescriptArray matchgroup=typescriptBraces start=/\[/ end=/]/ contains=@typescriptValue,@typescriptComments,typescriptCastKeyword nextgroup=@typescriptSymbols,typescriptDotNotation skipwhite skipempty fold', + \ 'typescriptTemplate start=/`/ skip=/\\\\\|\\`\|\n/ end=/`\|$/ contains=typescriptTemplateSubstitution,typescriptSpecial,@Spell nextgroup=@typescriptSymbols skipwhite skipempty', + \ 'typescriptObjectLiteral matchgroup=typescriptBraces start=/{/ end=/}/ contains=@typescriptComments,typescriptObjectLabel,typescriptStringProperty,typescriptComputedPropertyName,typescriptObjectAsyncKeyword,typescriptTernary,typescriptCastKeyword fold', + \ 'typescriptObjectType matchgroup=typescriptBraces start=/{/ end=/}/ contains=@typescriptTypeMember,typescriptEndColons,@typescriptComments,typescriptAccessibilityModifier,typescriptReadonlyModifier nextgroup=@typescriptTypeOperator skipwhite skipnl fold', + \ 'typescriptParenExp matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptComments,@typescriptValue,typescriptCastKeyword nextgroup=@typescriptSymbols skipwhite skipempty', + \ 'typescriptIndexExpr matchgroup=typescriptProperty start=/\[/ end=/]/ contains=@typescriptValue,typescriptCastKeyword nextgroup=@typescriptSymbols,typescriptDotNotation,typescriptFuncCallArg skipwhite skipempty', + \ 'typescriptCall matchgroup=typescriptParens start=/(/ end=/)/ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments nextgroup=typescriptTypeAnnotation,typescriptBlock skipwhite skipnl', + \ 'typescriptTupleType matchgroup=typescriptBraces start=/\[/ end=/\]/ contains=@typescriptType,@typescriptComments,typescriptRestOrSpread,typescriptTupleLable skipwhite', + \ 'typescriptParenthesizedType matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptType nextgroup=@typescriptTypeOperator skipwhite skipempty fold', + \ 'typescriptFuncType matchgroup=typescriptParens start=/(\(\k\+:\|)\)\@=/ end=/)\s*=>/me=e-2 contains=@typescriptParameterList nextgroup=typescriptFuncTypeArrow skipwhite skipnl oneline', + \ 'typescriptStringLiteralType start=/\z(["'']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/ nextgroup=typescriptUnion skipwhite skipempty', + \ 'typescriptTemplateLiteralType start=/`/ skip=/\\\\\|\\`\|\n/ end=/`\|$/ contains=typescriptTemplateSubstitutionType nextgroup=typescriptTypeOperator skipwhite skipempty', + \ ] + silent! exe 'syn clear ' . matchstr(s:def, '^\S\+') + exe 'syn region ' . s:def . ' contained extend' +endfor +unlet s:def +" yats' own arrow-function definitions, restated to stay last-defined at +" a "(": params eaten as a parenthesized expression turn the arrow's "{" +" body into an object literal, whose ternary region has no closing bound: +" f((x) => { value = x ?? other; }) +syntax match typescriptArrowFuncDef contained /\K\k*\s*=>/ + \ contains=typescriptArrowFuncArg,typescriptArrowFunc + \ nextgroup=@typescriptExpression,typescriptBlock + \ skipwhite skipempty +syntax match typescriptArrowFuncDef contained /(\%(\_[^()]\+\|(\_[^()]*)\)*)\_s*=>/ + \ contains=typescriptArrowFuncArg,typescriptArrowFunc,@typescriptCallSignature + \ nextgroup=@typescriptExpression,typescriptBlock + \ skipwhite skipempty +syntax region typescriptArrowFuncDef contained start=/(\%(\_[^()]\+\|(\_[^()]*)\)*):/ matchgroup=typescriptArrowFunc end=/=>/ + \ contains=typescriptArrowFuncArg,typescriptTypeAnnotation,@typescriptCallSignature + \ nextgroup=@typescriptExpression,typescriptBlock + \ skipwhite skipempty keepend + +" The bracket pairs keep an outer region open across nested delimiters +" and shield the spaces inside groupings from value termination: " a={ b: { c: 1 } } d=2 -" Without the matchgroup each region would re-match at its own start -" character through its own contains and consume the closing delimiter. -" markoTSDelim is deliberately unlinked: the delimiters render as plain -" text, like brackets in a TypeScript buffer. +" markoTSDelim is deliberately unlinked: delimiters render plain. syn cluster markoExpr contains=@markoTS,markoTSBraces,markoTSParens,markoTSBrackets -syn region markoTSBraces contained transparent matchgroup=markoTSDelim - \ start="{" end="}" - \ contains=@markoExpr extend -syn region markoTSParens contained transparent matchgroup=markoTSDelim - \ start="(" end=")" - \ contains=@markoExpr extend -syn region markoTSBrackets contained transparent matchgroup=markoTSDelim - \ start="\[" end="]" - \ contains=@markoExpr extend - -" Comments are recognized where the parser allows text to start; anchoring -" to the line start keeps "//" inside URLs as text: -" // note /* note */ https://example.com +for [s:pair, s:open, s:close] in [["Braces", '{', '}'], ["Parens", '(', ')'], ["Brackets", '\[', ']']] + exe 'syn region markoTS' . s:pair . ' contained transparent matchgroup=markoTSDelim' + \ . ' start="' . s:open . '" end="' . s:close . '"' + \ . ' contains=@markoExpr extend' +endfor +unlet s:pair s:open s:close + +" html-mode "//" and "/* */" comments open wherever whitespace precedes +" the slash (a URL's "//" follows ":", so it stays plain); concise context +" takes only the line-anchored forms, defined second so they win at a line +" start and keep their fold and indent handling: +" // note

done // for now

plain +" No comment item may take "display": a match skipped during offscreen +" state computation exposes its text, and a " +syn region markoDeclaration start="" +syn region markoDeclaration start="" syn region markoCData start="" -" Declarations; "" may close with ">" or "?>": -" -syn region markoDeclaration start="" -syn region markoDeclaration start="" -" Placeholders interpolate into text, and backslashes escape pairwise: +" Placeholders interpolate into text; backslashes escape pairwise: " ${user.name} $!{rawHtml} \${literal} \\${live} -" The containedin lets them apply inside style rules and property values. -" markoEscape must never take "display": it exists to suppress -" markoPlaceholder, so skipping it during state computation would change -" what matches. -syn match markoEscape "\%(\\\\\)\+\ze\$!\={" -syn match markoEscape "\%(\\\\\)*\\\$!\={" +" markoEscape must never take "display" (it exists to suppress +" markoPlaceholder); it consumes an escaped "$", or stops before a "${" +" an even backslash run leaves live. +syn match markoEscape "\%(\\\\\)*\%(\\\$!\={\|\\\\\ze\$!\={\)" syn region markoPlaceholder matchgroup=markoPlaceholderDelim \ start="\$!\={" end="}" - \ contains=@markoExpr containedin=cssDefinition,cssAttrRegion extend + \ contains=@markoExpr extend +" The no-"extend" variant for keepend parsed-text bodies and the CSS +" contexts: an unterminated "\${" must stop at the container's close. +syn region markoPlaceholderText contained matchgroup=markoPlaceholderDelim + \ start="\$!\={" end="}" + \ contains=@markoExpr + \ containedin=cssDefinition,cssAttrRegion,cssStringQ,cssStringQQ syn match markoEntity "&\%(#\d\+\|#[xX]\x\+\|\w\+\);" display -" Scriptlets; the whitespace after "$" is required, so a line-start -" placeholder is not a scriptlet: -" $ count += 1 -" $ { let total = 0; } -" ${count} placeholder +" Scriptlets; the whitespace after "$" keeps line-start placeholders out. +" No keepend: an open bracket continues, as the parser's group tracking +" does. The "$ {" block form is second, so it wins where both start: +" $ count += 1 $ { let total = 0; } +" $ const rows = [ +" "a", +" ] syn region markoScriptlet matchgroup=markoScriptletDelim - \ start="^\s*\$\s\+{\@!" end="$" - \ contains=@markoExpr keepend + \ start="^\s*\$\s\+" end="$" + \ contains=@markoExpr syn region markoScriptlet matchgroup=markoScriptletDelim \ start="^\s*\$\s\+{" end="};\=" \ contains=@markoExpr -" "--" marks one line of text in concise mode: +" "--" marks the rest of the line as text; at end of line it opens an +" indented block instead: " p -- some text -syn match markoBlockDelim "\%(^\|\s\)\@1<=--\+\ze\%(\s\|$\)" display - -" Attributes. An unquoted value ends at whitespace (quoted strings and -" bracket pairs shield theirs), does not start at the "=" of an arrow, and -" continues across " => " so arrow values stay whole: -" size="large" total:=sum ...spread onClick=(e) => handle(e) -" The attr name must not match the "${" of a dynamic tag name. -syn match markoAttrName contained "\%(\$!\={\)\@![[:alnum:]_$@][-[:alnum:]_$.]*" display +" p -- +" A block of text, html mode. +" The inline form is a one-line html region, so later dash runs on the +" line sit inside it and are never delimiters (the parser's rule), and +" keepend bounds what the line opens. Both forms stand down on a line +" whose first non-blank is "<" (html content, where dashes are text). +" They overlap at a trailing "--": the nextgroup form is second and wins, +" and must not take "display". A bare "--" line belongs to the +" later-defined markoTextDelimBlock. +syn region markoInlineText oneline keepend matchgroup=markoBlockDelim + \ start="\%#=1\%(^\s*<.\{-}\)\@200 +" An unquoted value ends at whitespace or the mode's terminators, except +" that the parser continues across whitespace flanked by an operator: +" if=tag === "select" content=a.desc ?? b.desc onClick=(e) => go(e) +syn match markoAttrName contained "\%#=1\%(\$!\={\)\@![[:alnum:]_$@]\%(\k\|[$.]\|:=\@!\)*" display syn match markoSpread contained "\.\.\." display -syn region markoAttrValue contained matchgroup=markoOperator - \ start=":\==>\@!\s*" end="\ze\%(\%(=>\)\@2\)\@!\|=\@1\|/>\)" end="$" - \ contains=@markoExpr syn region markoString contained start=+\z(["']\)+ skip=+\\\z1+ end=+\z1+ contains=@Spell -" Shorthands after the tag name: -" -syn match markoShorthandId contained "#[-[:alnum:]_$]\+" display -syn match markoShorthandClass contained "\.[-[:alnum:]_$]\+" display - -" Tag variables, arguments, |parameters|, and attribute method -" shorthand bodies: +" Regions so an interpolation can sit inside one (no keepend: the +" placeholder carries the region past its "}"): +" +syn region markoShorthandId contained oneline + \ start="#[-[:alnum:]_$]\@=" end="[-[:alnum:]_$]\@!" + \ contains=markoPlaceholder +syn region markoShorthandClass contained oneline + \ start="\.[-[:alnum:]_$]\@=" end="[-[:alnum:]_$]\@!" + \ contains=markoPlaceholder + +" Tag variables, arguments, |parameters|, and method bodies: " " >
Conditional at any depth; generic +" markoTagName stays out or it would outrank markoCloseName. syn cluster markoHtmlContent contains=markoTag,markoHtmlBody,markoDynamicBody, \markoStyle,markoScript,markoTextareaTag,markoHtmlCommentTag, - \markoComment,markoCData,markoDeclaration,markoEscape,markoPlaceholder, - \markoEntity,markoScriptlet,markoCloseName - -" Whether ", -" "=>" and spaced comparisons finds the structural ">", and a "/>" there -" means self-closing, so no body: + \markoComment,markoHtmlComment,markoCData,markoDeclaration,markoEscape,markoPlaceholder, + \markoEntity,markoScriptlet,markoCloseName,markoCloseAnon,markoAttrTagName, + \markoTagNameConditional,markoTagNameRepeat,markoTagNameException, + \markoTagNameStatement,markoTagNameBuiltin + +" Whether "" finds the structural one, +" and a "/>" there means self-closing, no body: " go(a > b) /> +" -" No body opens for html voids, parsed-text tags, bodiless core tags -" ( takes no close tag) or "@" attribute tags (those auto-close -" at their parent, which no name pairing can track). Defined after -" markoTag so open tags still overlay inside bodies, and after the -" concise regions so html mode wins at a line-start "<". A mismatched or -" missing close leaves its body open for the rest of the buffer, as an -" unclosed tag does in html.vim. +" The excluded names are the parser's void and text lists ( +" takes no close tag; is in neither and opens a body). Defined +" after markoTag and the concise regions so a body wins at "<"; a missing +" close leaves the body open, as in html.vim. exe 'syn region markoHtmlBody' \ . ' start=+<\ze\%(\%(area\|base\|br\|col\|embed\|hr\|img\|input\|link\|meta\|param' \ . '\|source\|track\|wbr\|style\|script\|textarea\|html-comment\|html-style' - \ . '\|html-script\|let\|const\|id\|log\|debug\|effect\|lifecycle\|return\)' - \ . '\%(\k\|[$:]\)\@!\)\@!' + \ . '\|html-script\|let\|const\|id\|log\|debug\|lifecycle\|return\)' + \ . '\%(\k\|\$\|:=\@!\)\@!\)\@!' \ . '\z(\%(\k\|[$:]\)\+\)\%(\_s\|[/>|(<.#=]\)\@=' . s:tag_end_ahead . '+' \ . ' matchgroup=markoTagDelim' - \ . ' end="" end=""' + \ . ' end="" end=""' \ . ' contains=@markoHtmlContent' +" A dynamic name -- any mix of literal characters and "${...}" +" placeholders -- cannot be paired, so a dynamic body closes at the first +" close tag of dynamic shape, regardless of nesting: +" heading <${tag}>body exe 'syn region markoDynamicBody' - \ . ' start=+<\ze\%(\$!\={\)\@=' . s:tag_end_ahead . '+' + \ . ' start=+<\ze\%(\%(\k\|:\)*\$!\={\)\@=' . s:tag_end_ahead . '+' \ . ' matchgroup=markoTagDelim' - \ . ' end=""' - \ . ' contains=@markoHtmlContent' + \ . ' end=""' + \ . ' contains=@markoHtmlContent nextgroup=markoClosePlaceholder' unlet s:tag_end_ahead -" Delimited text blocks in concise mode contain html-mode content. An -" indented block closes at a matching delimiter line or at any line -" indented less than its opener; a column-0 block closes only at its -" matching delimiter: +" Standalone delimited blocks hold html content, like markoTextIndent. +" A block closes at its exact delimiter -- same indent, same dash count, +" longer or shorter runs are text -- or on any dedent; a column-0 block +" only at its delimiter (the empty \z1 kills the dedent end). Defined +" after the markoBlockDelim forms so a bare "--" line opens a block: " -- " A block of text, html mode. " -- -syn region markoTextBlock matchgroup=markoBlockDelim - \ start="^\z(\s\+\)--\+\s*$" - \ end="^\z1--\+\s*$" end="^\%(\z1\)\@!\ze\s*\S" - \ contains=@markoHtmlContent -syn region markoTextBlock matchgroup=markoBlockDelim - \ start="^--\+\s*$" - \ end="^--\+\s*$" +syn region markoTextDelimBlock matchgroup=markoBlockDelim + \ start="^\z(\s*\)\z(--\+\)\s*$" + \ end="^\z1\z2\s*$" end="^\%(\z1\)\@!\ze\s*\S" \ contains=@markoHtmlContent -" Parsed-text tags: bodies contain only text and placeholders (style and -" script embed CSS and TypeScript, a textarea body is plain text, an -" html-comment body is comment text). Defined after the generic tag and -" body regions to win at the same "<". The "/\@1 -" keepend stops an unterminated embedded construct at the close tag. -syn region markoStyle matchgroup=markoTagNameBuiltin - \ start=+<\%(html-\)\=style\>\_[^>]\{-,300}/\@1+ - \ end="" - \ contains=@markoCSS,markoPlaceholder keepend fold +" Parsed-text tags: bodies hold only text and placeholders (style/script +" embed CSS and TypeScript). Each region consumes only its "<"; the +" markoParsedOpen overlay colors the open tag normally: +" - - - - - - buy()>Buy ${count + 1} + + + 0> + buy(e)>${count + 1}
+ ${formatPrice(item.price)} - a=1/> - <${dynamicTag} title="dynamic">body - <@footer>slot content + > a=1/> + <${dynamicTag} title="dynamic">body - + + s.active), +)/> +heading +<${"hello"}-world/> + +
(e) { go(e) } action(a, b) msg="say \"hi\""/> +body prose + + <@then|result|>${result} + +${formatPrice(amount)}
text with & entity and \${an escaped placeholder}
- -rendered comment body - diff --git a/runtime/syntax/testdir/input/marko_concise.marko b/runtime/syntax/testdir/input/marko_concise.marko index d8994cb46a..23987244f0 100644 --- a/runtime/syntax/testdir/input/marko_concise.marko +++ b/runtime/syntax/testdir/input/marko_concise.marko @@ -1,43 +1,48 @@ -// concise mode: custom tags, builtins, statements, scriptlets, text blocks +// concise mode: custom tags, builtins, statements, scriptlets, blocks import { fetchItems } from "./api" - -$ const doubled = input.count * 2; - -let/basket=[] -let/typed=0 - -container fluid - section-heading as="h2" -- Everything partnerships need - bento cols=4 - bento-cell [ - featured - colSpan=2 - title="One platform" - ] - p -- Onboarding and enablement, unified. - +$ const person = { + name: "Frank", +} +let/[h, i, , ...j]=[1, 2, 3, 4, 5] as const +const/isLocalized=locale !== baseLocale +const/nodes=input.nodes ?? +(typeof parts === "function" + ? buildNodes(parts(input.inputs)) + : undefined) +bento-cell [ + featured + colSpan=2 + title=head.title ?? "One platform" +] +link + ,rel="alternate" + // a comment may sit between continued attributes + ,href=( + translated ? localizeUrl(url, { locale }).href : baseHref + ) + ,onLoad(e) { + ready = true; + } +input type="text", + value=name checked:=mode === "edit" if=input.ready for|item, i| of=fetchItems() - log "item loaded" - -- Price: ${item.price} - while(i<10) - -- counting -try + while(i < 10) + my-tag ...[1, 2] ...rest total=base + + tax await(promise) -else - return=null -@then|result| - -- resolved - -style.scss { + return=x instanceof B +@then|result| -- resolved +${`button`} type="button" class=styles.button -- Press me +h${size} -- Dynamic heading +.hero-copy#main/$el -- Shorthand tag +style/styles -- .basket { color: red } -} - + -- +p -- + An indented text block runs until dedent, with html. +p ---- text after a longer dash run -- -A delimited block is html mode, so bare words are prose. -bold ${doubled} +A delimited block is html mode: bold ${person.name} and bare prose. -- - -
-if you read this inside an element body, it stays plain prose -
+
element bodies stay html mode, so this is plain prose
From 4fce82d7535b936aa356d13f9f9d5418cd7a7952 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 30 Jul 2026 18:43:11 +0000 Subject: [PATCH 245/647] patch 9.2.0877: Vim9: crash when a closure assigns to a variable declared in a loop Problem: Vim9: crash when a closure assigns to a variable that was declared in a loop (neoharju) Solution: Encode the loop depth in the STOREOUTER instruction the same way as in LOADOUTER, so that the executor decodes it correctly (Hirohito Higashi) fixes: #20877 closes: #20881 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_script.vim | 30 ++++++++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9.h | 6 +++--- src/vim9execute.c | 7 ++++--- src/vim9instr.c | 14 ++++++++++---- 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 2f54f6da62..91873845d8 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2899,6 +2899,36 @@ def Test_for_loop_with_closure() endfor END v9.CheckDefAndScriptSuccess(lines) + + # assigning to a variable declared in the loop from a closure + lines =<< trim END + for i in range(3) + var inloop = 0 + var F = () => { + inloop = i + 1 + } + F() + assert_equal(i + 1, inloop) + endfor + END + v9.CheckDefAndScriptSuccess(lines) + + # same in a nested loop + lines =<< trim END + var result: list + for i in range(2) + for j in range(2) + var inloop = 0 + var F = () => { + inloop = i * 10 + j + } + F() + result += [inloop] + endfor + endfor + assert_equal([0, 1, 10, 11], result) + END + v9.CheckDefAndScriptSuccess(lines) enddef def Test_define_global_closure_in_loops() diff --git a/src/version.c b/src/version.c index e921a5c367..3fba5845f9 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 877, /**/ 876, /**/ diff --git a/src/vim9.h b/src/vim9.h index c10d435a24..58cda7b852 100644 --- a/src/vim9.h +++ b/src/vim9.h @@ -444,11 +444,11 @@ typedef struct { // arguments to ISN_LOADOUTER and ISN_STOREOUTER typedef struct { int outer_idx; // index - int outer_depth; // nesting level, stack frames to go up + int outer_depth; // nesting level, stack frames to go up; + // negative for a loop variable, the loop + // depth is -outer_depth - 1 } isn_outer_T; -#define OUTER_LOOP_DEPTH -9 // used for outer_depth for loop variables - // arguments to ISN_SUBSTITUTE typedef struct { char_u *subs_cmd; // :s command diff --git a/src/vim9execute.c b/src/vim9execute.c index 68ca777d06..1c30338eb8 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -7330,9 +7330,10 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc) { isn_outer_T *outer = &iptr->isn_arg.outer; - if (outer->outer_depth == OUTER_LOOP_DEPTH) - smsg("%s%4d STOREOUTER level 1 $%d in loop", - pfx, current, outer->outer_idx); + if (outer->outer_depth < 0) + smsg("%s%4d STOREOUTER $%d in loop level %d", + pfx, current, outer->outer_idx, + -outer->outer_depth); else smsg("%s%4d STOREOUTER level %d $%d", pfx, current, outer->outer_depth, outer->outer_idx); diff --git a/src/vim9instr.c b/src/vim9instr.c index 24834af673..5e9ab38b7b 100644 --- a/src/vim9instr.c +++ b/src/vim9instr.c @@ -1177,7 +1177,12 @@ generate_CLASSMEMBER( * Generate an ISN_STOREOUTER instruction. */ static int -generate_STOREOUTER(cctx_T *cctx, int idx, int level, int loop_idx) +generate_STOREOUTER( + cctx_T *cctx, + int idx, + int level, + int loop_depth, + int loop_idx) { isn_T *isn; @@ -1187,9 +1192,9 @@ generate_STOREOUTER(cctx_T *cctx, int idx, int level, int loop_idx) if (level == 1 && loop_idx >= 0 && idx >= loop_idx) { // Store a variable defined in a loop. A copy will be made at the end - // of the loop. TODO: how about deeper nesting? + // of the loop. isn->isn_arg.outer.outer_idx = idx - loop_idx; - isn->isn_arg.outer.outer_depth = OUTER_LOOP_DEPTH; + isn->isn_arg.outer.outer_depth = -loop_depth - 1; } else { @@ -2644,7 +2649,8 @@ generate_store_lhs(cctx_T *cctx, lhs_T *lhs, int instr_count, int is_decl) } else if (lhs->lhs_lvar->lv_from_outer > 0) generate_STOREOUTER(cctx, lhs->lhs_lvar->lv_idx, - lhs->lhs_lvar->lv_from_outer, lhs->lhs_lvar->lv_loop_idx); + lhs->lhs_lvar->lv_from_outer, lhs->lhs_lvar->lv_loop_depth, + lhs->lhs_lvar->lv_loop_idx); else generate_STORE(cctx, ISN_STORE, lhs->lhs_lvar->lv_idx, NULL); return OK; From ce55a4910dc7a1de95d828ddce916d2d2bd4d6d6 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 30 Jul 2026 18:49:22 +0000 Subject: [PATCH 246/647] patch 9.2.0878: Vim9: cannot use a script variable of an enclosing block in a lambda Problem: Vim9: E1001 when a lambda inside a :def function uses a script variable that was declared in an enclosing block, while the :def function itself can use it (neoharju) Solution: Copy the block scope IDs to the lambda, like it is done for a nested function (Hirohito Higashi). fixes: #20876 closes: #PR Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_script.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ src/vim9expr.c | 17 +++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 91873845d8..b86acd071e 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -449,6 +449,24 @@ def Test_block_local_vars_with_func() assert_equal(['foo', 'bar'], Func()) END v9.CheckScriptSuccess(lines) + + # also when the variables are used in a lambda inside the function + lines =<< trim END + vim9script + if true + var foo = 'foo' + if true + var bar = 'bar' + def Func(): list + var Lambda = () => [foo, bar] + return Lambda() + enddef + defcompile + endif + endif + assert_equal(['foo', 'bar'], Func()) + END + v9.CheckScriptSuccess(lines) enddef " legacy func for command that's defined later diff --git a/src/version.c b/src/version.c index 3fba5845f9..0e5c697ec9 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 878, /**/ 877, /**/ diff --git a/src/vim9expr.c b/src/vim9expr.c index f69488d5bd..7f47d82fb6 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -1795,10 +1795,27 @@ compile_lambda(char_u **arg, cctx_T *cctx) clear_tv(&rettv); if (cctx->ctx_ufunc != NULL) + { // This lambda might be defined in a class method. Inherit the class // from the current function. ufunc->uf_defclass = cctx->ctx_ufunc->uf_defclass; + // Copy over the block scope IDs, so that a script variable declared in + // an enclosing block can be found. + int block_depth = cctx->ctx_ufunc->uf_block_depth; + + if (block_depth > 0) + { + ufunc->uf_block_ids = ALLOC_MULT(int, block_depth); + if (ufunc->uf_block_ids != NULL) + { + mch_memmove(ufunc->uf_block_ids, cctx->ctx_ufunc->uf_block_ids, + sizeof(int) * block_depth); + ufunc->uf_block_depth = block_depth; + } + } + } + // Compile it here to get the return type. The return type is optional, // when it's missing use t_unknown. This is recognized in // compile_return(). From 5ffc8c11d141bef8986529edebade6b272af6d9b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 30 Jul 2026 19:22:16 +0000 Subject: [PATCH 247/647] patch 9.2.0879: popup: "maxwidth" is not respected when 'wrap' is off Problem: A popup window can become wider than "maxwidth" when 'wrap' is off and the popup is near the right edge of the screen. Solution: Do not shift the popup leftwards beyond "maxwidth", truncate the text instead, like it is done when 'wrap' is on. Reported: https://groups.google.com/g/vim_use/c/_rOLxGz5kNM/m/JFt7d81QCQAJ closes: #20883 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 7 +++---- src/testdir/test_popupwin.vim | 38 +++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/popupwin.c b/src/popupwin.c index 2149ee0997..07e0b90e27 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -2665,10 +2665,9 @@ popup_adjust_position(win_T *wp) shift_by -= truncate_shift; } - // When wrapping is enabled and maxwidth is explicitly set, - // don't shift beyond maxwidth - let the text wrap instead. - if (wp->w_p_wrap && wp->w_maxwidth > 0 - && maxwidth + shift_by > wp->w_maxwidth) + // When maxwidth is explicitly set, don't shift beyond it, the text + // is wrapped or truncated instead. + if (wp->w_maxwidth > 0 && maxwidth + shift_by > wp->w_maxwidth) shift_by = wp->w_maxwidth - maxwidth; if (shift_by > 0) diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 701e33e52d..2663c52da2 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -2203,6 +2203,44 @@ func Test_popup_wrap_with_maxwidth() %bwipe! endfunc +func Test_popup_nowrap_with_maxwidth() + " When wrap is off and maxwidth is explicitly set, a popup near the right + " edge of the screen must not get wider than maxwidth by shifting left. + let maxw = 20 + let col = &columns - maxw + 1 + + " Text longer than maxwidth is truncated, no shift is needed. + let p = popup_create(repeat('x', 40), #{ + \ line: 5, col: col, maxwidth: maxw, wrap: 0}) + call s:VerifyPosition(p, 'nowrap with maxwidth at right edge', + \ 5, col, maxw, 1) + call popup_close(p) + + " Not enough space at the right: shift left, but only up to maxwidth. + let p = popup_create(repeat('y', 40), #{ + \ line: 5, col: &columns - 5, maxwidth: maxw, wrap: 0}) + call s:VerifyPosition(p, 'nowrap with maxwidth shifts up to maxwidth', + \ 5, col, maxw, 1) + call popup_close(p) + + " Same with a border and padding. + let p = popup_create(repeat('z', 40), #{ + \ line: 5, col: &columns - 5, maxwidth: maxw, wrap: 0, + \ border: [], padding: [0, 1, 0, 1]}) + call assert_equal(maxw, popup_getpos(p).core_width) + call popup_close(p) + + " When maxwidth is not set, shift-left uses the whole text width. + let p = popup_create(repeat('w', 40), #{ + \ line: 5, col: col, wrap: 0}) + call s:VerifyPosition(p, 'nowrap without maxwidth shifts left', + \ 5, col - maxw, 40, 1) + call popup_close(p) + + call popup_clear() + %bwipe! +endfunc + func Test_adjust_left_past_screen_width() " width of screen let X = join(map(range(&columns), {->'X'}), '') diff --git a/src/version.c b/src/version.c index 0e5c697ec9..5bc24b40a0 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 879, /**/ 878, /**/ From 7fe3ea7658a1f3be4e07dee14041302ca129c8a9 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 30 Jul 2026 19:28:04 +0000 Subject: [PATCH 248/647] patch 9.2.0880: scroll: window scrolls when using the autocommand window Problem: The window scrolls when an autocommand window is used while the cursor is behind multi-byte characters. Solution: Use the byte column instead of the character count when computing how many screen lines the text up to the cursor takes. fixes: #12085 closes: #20884 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 10 +++++----- src/misc1.c | 5 +++-- src/testdir/test_window_cmd.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index f265b39689..9c8c0f4933 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Jun 23 +*todo.txt* For Vim version 9.2. Last change: 2026 Jul 30 VIM REFERENCE MANUAL by Bram Moolenaar @@ -40,10 +40,10 @@ Mapping with modifier is not recognized after a partial mapping. Probably because the typeahead was simplified when looking for a matching mapping. Need to somehow undo the simplification. #12002 -Windows scroll when using the autocmd window. #12085 -in restore_snapshot_rec() restore more values from the snapshot, instead of -calling frame_new_height() and frame_new_width(), especially w_topline and -w_skipcol. +Using the autocmd window resets w_skipcol when the cursor is in a long +wrapped line. In restore_snapshot_rec() restore more values from the +snapshot, instead of calling frame_new_height() and frame_new_width(), +especially w_skipcol. Check places that source "path/*.vim" to not match other extensions, e.g. .vim9, on MS-Windows (short file name match, gets expanded to long file name). diff --git a/src/misc1.c b/src/misc1.c index c09ae81275..6ba215500d 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -439,7 +439,7 @@ plines_win_nofold(win_T *wp, linenr_T lnum) /* * Like plines_win(), but only reports the number of physical screen lines - * used from the start of the line to the given column number. + * used from the start of the line to the given byte column. */ int plines_win_col(win_T *wp, linenr_T lnum, long column) @@ -465,7 +465,8 @@ plines_win_col(win_T *wp, linenr_T lnum, long column) line = ml_get_buf(wp->w_buffer, lnum, FALSE); init_chartabsize_arg(&cts, wp, lnum, 0, line, line); - while (*cts.cts_ptr != NUL && --column >= 0) + // "column" is a byte index, advance the pointer until it is reached. + while (*cts.cts_ptr != NUL && cts.cts_ptr < line + column) { cts.cts_vcol += win_lbr_chartabsize(&cts, NULL, NULL); MB_PTR_ADV(cts.cts_ptr); diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index bf524030f9..701eec65c4 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -2034,6 +2034,24 @@ func Test_splitkeep_cmdheight() set splitkeep& cmdheight& endfunc +func Test_aucmd_win_scroll_multibyte() + " Using the autocommand window must not scroll the current window when the + " cursor is behind multi-byte characters. + set splitkeep=cursor + call setline(1, repeat([repeat(nr2char(0x3042), 200)], 20)) + normal! G0100l + redraw + let topline = line('w0') + + for i in range(3) + call bufload(bufadd('')) + endfor + call assert_equal(topline, line('w0')) + + %bwipeout! + set splitkeep& +endfunc + func Test_splitkeep_cursor() CheckScreendump let lines =<< trim END diff --git a/src/version.c b/src/version.c index 5bc24b40a0..caef0f750a 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 880, /**/ 879, /**/ From 17f3923b8c8bacf5785e7721108d39705dc3179c Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 30 Jul 2026 19:40:11 +0000 Subject: [PATCH 249/647] patch 9.2.0881: 'smoothscroll' position is lost when the window height changes Problem: With 'smoothscroll' the scroll position of a window is lost when its height changes. Solution: Only reset the skipped columns when 'smoothscroll' is off, where they just serve to keep the cursor visible. closes: #20885 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_scroll_opt.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ src/window.c | 13 +++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim index 6d4fc81b81..cf362b6a29 100644 --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -1306,6 +1306,30 @@ func Test_smoothscroll_next_topline() bwipe! endfunc +func Test_smoothscroll_keep_skipcol() + call NewWindow(10, 40) + setlocal smoothscroll + call setline(1, ['abcde '->repeat(150)]->repeat(2)) + + exe "norm! 10\" + redraw + let skipcol = winsaveview().skipcol + call assert_notequal(0, skipcol) + + " Changing the height of the window must not reset the scroll position. + resize -3 + resize +3 + redraw + call assert_equal(skipcol, winsaveview().skipcol) + + " Using the autocommand window changes the height as well. + call bufload(bufadd('')) + redraw + call assert_equal(skipcol, winsaveview().skipcol) + + bwipe! +endfunc + func Test_smoothscroll_long_line_zb() call NewWindow(10, 40) call setline(1, 'abcde '->repeat(150)) diff --git a/src/version.c b/src/version.c index caef0f750a..7f650d214a 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 881, /**/ 880, /**/ diff --git a/src/window.c b/src/window.c index f2ee69071d..04d3d86c4e 100644 --- a/src/window.c +++ b/src/window.c @@ -7413,7 +7413,10 @@ win_new_height(win_T *wp, int height) // values might be invalid. if (!exiting && *p_spk == 'c') { - wp->w_skipcol = 0; + // With 'smoothscroll' w_skipcol is the scroll position, keep it. + // Otherwise it only keeps the cursor visible and is computed again. + if (!wp->w_p_sms) + wp->w_skipcol = 0; scroll_to_fraction(wp, prev_height); } } @@ -7469,14 +7472,16 @@ scroll_to_fraction(win_T *wp, int prev_height) if (wp->w_wrow >= wp->w_height && (wp->w_width - win_col_off(wp)) > 0) { - wp->w_skipcol += wp->w_width - win_col_off(wp); + // The cursor must be visible, override the scroll position. + colnr_T skipcol = wp->w_width - win_col_off(wp); + --wp->w_wrow; while (wp->w_wrow >= wp->w_height) { - wp->w_skipcol += wp->w_width - win_col_off(wp) - + win_col_off2(wp); + skipcol += wp->w_width - win_col_off(wp) + win_col_off2(wp); --wp->w_wrow; } + wp->w_skipcol = skipcol; } } else if (sline > 0) From 902db1d7a5141adabba4c869a62c8a5e9757680a Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 30 Jul 2026 20:16:15 +0000 Subject: [PATCH 250/647] runtime(doc): update todo for the remaining 'smoothscroll' scroll position The autocommand window no longer resets the scroll position since patch 9.2.0881. What is left is a window that is temporarily squeezed to a couple of lines, and 'splitkeep' "screen". related: #20885 closes: #20887 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 9c8c0f4933..a8073702f1 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -40,10 +40,13 @@ Mapping with modifier is not recognized after a partial mapping. Probably because the typeahead was simplified when looking for a matching mapping. Need to somehow undo the simplification. #12002 -Using the autocmd window resets w_skipcol when the cursor is in a long -wrapped line. In restore_snapshot_rec() restore more values from the -snapshot, instead of calling frame_new_height() and frame_new_width(), -especially w_skipcol. +With 'smoothscroll' the scroll position is lost when a window is temporarily +squeezed to a couple of lines, for example ":help" followed by ":close". In +restore_snapshot_rec() restore more values from the snapshot, instead of +calling frame_new_height() and frame_new_width(), especially w_skipcol. + +With 'splitkeep' "screen" the scroll position is lost when splitting and +closing a window, win_fix_cursor() moves the cursor to another line. Check places that source "path/*.vim" to not match other extensions, e.g. .vim9, on MS-Windows (short file name match, gets expanded to long file name). From e241ac0a62b774763733f2ccac4040dfe8aafac8 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 30 Jul 2026 20:22:52 +0000 Subject: [PATCH 251/647] runtime(zip): fix failure on Windows CI Problem: The zip autoload script aborts loading when the "zip" command is not available, so even read-only browsing of an archive fails with E117 (zip#Browse undefined) on systems that have "unzip" but not "zip" (e.g. the Windows CI runner). Regressed in b0e0b22. Solution: Drop the load-time executable gate and check each command per operation instead, so a missing "zip" only affects writing. Update the test to match the reworded message. Signed-off-by: Christian Brabandt --- runtime/autoload/zip.vim | 30 ++++++++++++++++-------------- src/testdir/test_plugin_zip.vim | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim index 1d0ecff45b..61e9807438 100644 --- a/runtime/autoload/zip.vim +++ b/runtime/autoload/zip.vim @@ -114,22 +114,17 @@ endfun " sanity checks " s:SafeExecutable: {{{2 fun! s:SafeExecutable(exe) - if !executable(a:exe) && !s:isPS() - call s:Mess('Error', "***error*** (zip) '".a:exe."' not available on your system") + " fails when exe is a full path with spaces + let exe = substitute(a:exe, '\s\+.*$', '', '') + if !executable(exe) && !s:isPS() return v:false endif - if !dist#vim#IsSafeExecutable('zip', a:exe) && !s:isPS() - call s:Mess('Error', "Warning: NOT executing " .. a:exe .. " from current directory!") + if !dist#vim#IsSafeExecutable('zip', exe) && !s:isPS() + call s:Mess('Error', "Warning: NOT executing " .. a:exe .. " from current directory!") return v:false endif return v:true endfun -" guarantee default command is exist and not be injected by environment -" every default command should be checked -if !s:SafeExecutable(g:zip_zipcmd) | finish | endif -if !s:SafeExecutable(g:zip_unzipcmd) | finish | endif -if !s:SafeExecutable(g:zip_extractcmd) | finish | endif - " ---------------- " PowerShell: {{{1 " ---------------- @@ -260,8 +255,8 @@ fun! zip#Browse(zipfile) defer s:RestoreOpts(dict) " sanity checks - if !executable(g:zip_unzipcmd) && !s:isPS() - call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system") + if !s:SafeExecutable(g:zip_unzipcmd) + call s:Mess('Error', "***error*** (zip#Browse) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program") return endif if !filereadable(a:zipfile) @@ -368,7 +363,7 @@ fun! zip#Read(fname,mode) endif let fname = fname->substitute('[', '[[]', 'g')->escape('?*\\') " sanity check - if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','','')) && !s:isPS() + if !s:SafeExecutable(g:zip_unzipcmd) call s:Mess('Error', "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program") return endif @@ -404,7 +399,7 @@ fun! zip#Write(fname) defer s:RestoreOpts(dict) " sanity checks - if !executable(substitute(g:zip_zipcmd,'\s\+.*$','','')) && &shell !~ 'pwsh' + if !s:SafeExecutable(g:zip_zipcmd) call s:Mess('Error', "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program") return endif @@ -532,6 +527,13 @@ fun! zip#Extract() let dict = s:SetSaneOpts() defer s:RestoreOpts(dict) + + " sanity checks + if !s:SafeExecutable(g:zip_extractcmd) + call s:Mess('Error', "***error*** (zip#Extract) sorry, your system doesn't appear to have the ".g:zip_extractcmd." program") + return + endif + let fname= getline(".") " sanity check diff --git a/src/testdir/test_plugin_zip.vim b/src/testdir/test_plugin_zip.vim index 4357131543..c46a3efc0d 100644 --- a/src/testdir/test_plugin_zip.vim +++ b/src/testdir/test_plugin_zip.vim @@ -86,7 +86,7 @@ def g:Test_zip_basic() ### Check opening zip when "unzip" program is missing var save_zip_unzipcmd = g:zip_unzipcmd g:zip_unzipcmd = "/" - assert_match('unzip not available on your system', execute("e X.zip")) + assert_match('(zip#Browse) sorry, your system doesn''t appear to have the / program', execute("e X.zip")) ### Check when "unzip" don't work if executable("false") From e31fb9bb67617fc4357cdd075aa16423ced9bbe3 Mon Sep 17 00:00:00 2001 From: CatsDeservePets <145048791+CatsDeservePets@users.noreply.github.com> Date: Fri, 31 Jul 2026 18:02:17 +0000 Subject: [PATCH 252/647] runtime(lf): update syntax to support lf version r42 closes: #20897 Signed-off-by: CatsDeservePets <145048791+CatsDeservePets@users.noreply.github.com> Signed-off-by: Christian Brabandt --- runtime/syntax/lf.vim | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/runtime/syntax/lf.vim b/runtime/syntax/lf.vim index fe46fc43b3..a7c2a0873f 100644 --- a/runtime/syntax/lf.vim +++ b/runtime/syntax/lf.vim @@ -3,10 +3,10 @@ " Maintainer: Andis Sprinkis , @CatsDeservePets " Former Maintainer: Cameron Wright " URL: https://github.com/andis-sprinkis/lf-vim -" Last Change: 4 Feb 2026 +" Last Change: 31 Jul 2026 " " The shell syntax highlighting is configurable. See $VIMRUNTIME/doc/syntax.txt -" lf version: 41 +" lf version: 42 if exists("b:current_syntax") | finish | endif @@ -34,6 +34,7 @@ syn keyword lfOptions \ anchorfind \ autoquit \ borderfmt + \ borderstyle \ bottom \ calcdirsize \ cd @@ -135,6 +136,7 @@ syn keyword lfOptions \ mouse \ nmaps \ number + \ numbercursorfmt \ numberfmt \ on-cd \ on-focus-gained @@ -164,7 +166,6 @@ syn keyword lfOptions \ reload \ rename \ reverse - \ roundbox \ rulerfile \ rulerfmt \ scroll-down @@ -190,6 +191,8 @@ syn keyword lfOptions \ smartcase \ smartdia \ sortby + \ sortignorecase + \ sortignoredia \ source \ statfmt \ sync @@ -198,6 +201,7 @@ syn keyword lfOptions \ tag-toggle \ tagfmt \ tempmarks + \ terminalcursor \ timefmt \ toggle \ top From 3e4019a082701f48bb44de0cc7a92f6a3077bd4e Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 31 Jul 2026 18:07:40 +0000 Subject: [PATCH 253/647] patch 9.2.0882: :bwipe crashes if WinLeave wipes all other buffers Problem: :bwipe crashes if WinLeave wipes all other buffers (after 9.1.2068). Solution: Check for NULL pointer. related: neovim/neovim#41066 closes: #20888 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/buffer.c | 3 ++- src/testdir/test_buffer.vim | 7 +++++++ src/version.c | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/buffer.c b/src/buffer.c index 48a6bdc3db..c33c3efa0f 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1653,7 +1653,8 @@ do_buffer_ext( buf = curbuf->b_next; else buf = curbuf->b_prev; - if (bt_quickfix(buf) || (buf != curbuf && buf->b_locked_split)) + if (bt_quickfix(buf) + || (buf != NULL && buf != curbuf && buf->b_locked_split)) buf = NULL; } } diff --git a/src/testdir/test_buffer.vim b/src/testdir/test_buffer.vim index 733ef65434..a8b6e8bd69 100644 --- a/src/testdir/test_buffer.vim +++ b/src/testdir/test_buffer.vim @@ -935,6 +935,13 @@ func Test_split_window_in_BufLeave_from_switching_buffer() bwipe! Xb endfunc +func Test_wipe_other_buffers_in_WinLeave_from_bwipe() + tabnew + autocmd WinLeave * ++once 1,$-1bwipe! + " This should not crash + $bwipe! +endfunc + " Switch to a buffer whose name contains '%' via completion (#20529). func Test_buffer_switch_to_name_with_percent() CheckMSWindows diff --git a/src/version.c b/src/version.c index 7f650d214a..e7c89e8186 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 882, /**/ 881, /**/ From 5ed8fc10fac461981a729e9cd0995545be64ae46 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 31 Jul 2026 18:28:25 +0000 Subject: [PATCH 254/647] patch 9.2.0883: scroll: 'smoothscroll' position is lost when using "|" Problem: With 'smoothscroll' the scroll position in a long line is lost when moving to a column with "|". Solution: Adjust the skipped columns for the column the cursor ends up in, not for column zero. related: #20885 closes: #20890 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/normal.c | 6 +++++- .../dumps/Test_smooth_long_scrolloff_1.dump | 2 +- .../dumps/Test_smooth_long_scrolloff_2.dump | 2 +- .../dumps/Test_smooth_long_scrolloff_3.dump | 2 +- .../dumps/Test_smooth_long_scrolloff_4.dump | 2 +- .../dumps/Test_smooth_long_scrolloff_5.dump | 2 +- .../dumps/Test_smooth_long_scrolloff_6.dump | 2 +- .../dumps/Test_smooth_long_scrolloff_7.dump | 2 +- .../Test_smooth_long_scrolloff_ru_1.dump | 2 +- .../Test_smooth_long_scrolloff_ru_2.dump | 2 +- .../Test_smooth_long_scrolloff_ru_3.dump | 2 +- .../Test_smooth_long_scrolloff_ru_4.dump | 2 +- .../Test_smooth_long_scrolloff_ru_5.dump | 2 +- .../Test_smooth_long_scrolloff_ru_6.dump | 2 +- .../Test_smooth_long_scrolloff_ru_7.dump | 2 +- src/testdir/test_scroll_opt.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 17 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/normal.c b/src/normal.c index a7959d62f1..642d9e465f 100644 --- a/src/normal.c +++ b/src/normal.c @@ -6604,7 +6604,10 @@ nv_pipe(cmdarg_T *cap) { cap->oap->motion_type = MCHAR; cap->oap->inclusive = FALSE; - beginline(0); + // Not using beginline(), the columns to skip for 'smoothscroll' must be + // adjusted for the column we end up in, not for column zero. + curwin->w_cursor.col = 0; + curwin->w_cursor.coladd = 0; if (cap->count0 > 0) { coladvance((colnr_T)(cap->count0 - 1)); @@ -6615,6 +6618,7 @@ nv_pipe(cmdarg_T *cap) // keep curswant at the column where we wanted to go, not where // we ended; differs if line is too short curwin->w_set_curswant = false; + adjust_skipcol(); } /* diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump index f6ca843e78..0175a354d6 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump @@ -5,4 +5,4 @@ |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n -| @39 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump index 9162df0c22..e52116654f 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump @@ -5,4 +5,4 @@ >l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n -| @39 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump index 1a1fcaeae0..558ef73e45 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump @@ -5,4 +5,4 @@ > |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@40 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump index 4ed62b65bf..70b2097277 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump @@ -5,4 +5,4 @@ | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o > |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@40 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump index 6d7e1578d1..6aeef32e0d 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump @@ -5,4 +5,4 @@ | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@40 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump index 4f5dcea8b9..bad57cfe40 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump @@ -5,4 +5,4 @@ |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 >t|h|r|e@1| @34 |f|o|u|r| @35 -@40 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump index 6d7e1578d1..6aeef32e0d 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump @@ -5,4 +5,4 @@ | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@40 +|:|n|o|r|m| |j|7|2|1||| @28 diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_1.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_1.dump index b78abfa727..3baa0eea64 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_1.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_1.dump @@ -5,4 +5,4 @@ |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n -| @21|2|,|7|2|1| @8|2|0|%| +|:|n|o|r|m| |j|7|2|1||| @10|2|,|7|2|1| @8|2|0|%| diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_2.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_2.dump index 906327d273..ac4b1b8f18 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_2.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_2.dump @@ -5,4 +5,4 @@ >l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n -| @21|2|,|7|6|1| @8|2|0|%| +|:|n|o|r|m| |j|7|2|1||| @10|2|,|7|6|1| @8|2|0|%| diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_3.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_3.dump index 021431d477..7f71841147 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_3.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_3.dump @@ -5,4 +5,4 @@ > |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@22|2|,|8|0|1| @8|2|0|%| +|:|n|o|r|m| |j|7|2|1||| @10|2|,|8|0|1| @8|2|0|%| diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_4.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_4.dump index 4e2f6b3938..4e1cad8cf8 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_4.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_4.dump @@ -5,4 +5,4 @@ | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o > |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@22|2|,|8|4|1| @8|2|0|%| +|:|n|o|r|m| |j|7|2|1||| @10|2|,|8|4|1| @8|2|0|%| diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_5.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_5.dump index 6e285023ab..6ed2fd0ff4 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_5.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_5.dump @@ -5,4 +5,4 @@ | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@22|2|,|8@1|1| @8|2|0|%| +|:|n|o|r|m| |j|7|2|1||| @10|2|,|8@1|1| @8|2|0|%| diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_6.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_6.dump index 456bff2cad..6a8fe5476c 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_6.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_6.dump @@ -5,4 +5,4 @@ |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 >t|h|r|e@1| @34 |f|o|u|r| @35 -@22|3|,|1| @10|3@1|%| +|:|n|o|r|m| |j|7|2|1||| @10|3|,|1| @10|3@1|%| diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_7.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_7.dump index 6e285023ab..6ed2fd0ff4 100644 --- a/src/testdir/dumps/Test_smooth_long_scrolloff_ru_7.dump +++ b/src/testdir/dumps/Test_smooth_long_scrolloff_ru_7.dump @@ -5,4 +5,4 @@ | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20 -@22|2|,|8@1|1| @8|2|0|%| +|:|n|o|r|m| |j|7|2|1||| @10|2|,|8@1|1| @8|2|0|%| diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim index cf362b6a29..992d76388c 100644 --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -1330,6 +1330,25 @@ func Test_smoothscroll_keep_skipcol() bwipe! endfunc +func Test_smoothscroll_cursor_back_in_line() + call NewWindow(10, 40) + setlocal smoothscroll + call setline(1, ['abcde '->repeat(150)]->repeat(2)) + + exe "norm! 10\" + redraw + call assert_equal(400, winsaveview().skipcol) + + " Moving to an earlier column in the same line scrolls back only as far as + " needed, not all the way to the start of the line. + norm! 240| + redraw + call assert_equal(200, winsaveview().skipcol) + call assert_equal(1, winline()) + + bwipe! +endfunc + func Test_smoothscroll_long_line_zb() call NewWindow(10, 40) call setline(1, 'abcde '->repeat(150)) diff --git a/src/version.c b/src/version.c index e7c89e8186..56fbf8a76d 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 883, /**/ 882, /**/ From 2ea497f072f102220a683822fd201bfb530894b2 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 31 Jul 2026 18:32:50 +0000 Subject: [PATCH 255/647] patch 9.2.0884: scroll: unreachable 'smoothscroll' code in cursor_correct() Problem: cursor_correct() checks for 'smoothscroll' with 'wrap' off, a combination where 'smoothscroll' has no effect. Solution: Remove the check, adjust_skipcol() already handles the case where the cursor line just fits in the window. closes: #20891 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/move.c | 13 ------------- src/version.c | 2 ++ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/move.c b/src/move.c index 49bcfb7cc5..9f90134249 100644 --- a/src/move.c +++ b/src/move.c @@ -3114,19 +3114,6 @@ cursor_correct(void) ) return; - if (curwin->w_p_sms && !curwin->w_p_wrap) - { - // 'smoothscroll' is active - if (curwin->w_cline_height == curwin->w_height) - { - // The cursor line just fits in the window, don't scroll. - reset_skipcol(); - return; - } - // TODO: If the cursor line doesn't fit in the window then only adjust - // w_skipcol. - } - /* * Narrow down the area where the cursor can be put by taking lines from * the top and the bottom until: diff --git a/src/version.c b/src/version.c index 56fbf8a76d..29de0350fa 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 884, /**/ 883, /**/ From 15f8ba5cec35feea22622fbc7c78f3204aad50df Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 31 Jul 2026 18:39:49 +0000 Subject: [PATCH 256/647] patch 9.2.0885: scroll: 'smoothscroll' position is lost when the window is squeezed Problem: With 'smoothscroll' the scroll position in a long line is lost when a window is temporarily squeezed to a couple of lines, for example when opening and closing a help window. Solution: When the cursor ends up in the skipped columns, skip up to the screen line the cursor is in instead of showing the start of the line. closes: #20892 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/move.c | 20 +++++++++++++++++--- src/testdir/test_scroll_opt.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/move.c b/src/move.c index 9f90134249..cd9169de94 100644 --- a/src/move.c +++ b/src/move.c @@ -2537,9 +2537,23 @@ scroll_cursor_top(int min_scroll, int always) { validate_virtcol(); if (curwin->w_skipcol >= curwin->w_virtcol) - // TODO: if the line doesn't fit may optimize w_skipcol instead - // of making it zero - reset_skipcol(); + { + // Skip up to the screen line the cursor is in, so that the + // position in the line is kept. + int width1 = curwin->w_width - curwin_col_off(); + int width2 = width1 + curwin_col_off2(); + int plines_off = 0; + int skipcol; + + if (width2 > 0 && curwin->w_virtcol >= (colnr_T)width1) + plines_off = (curwin->w_virtcol - width1) / width2 + 1; + skipcol = skipcol_from_plines(curwin, plines_off); + if (skipcol != curwin->w_skipcol) + { + curwin->w_skipcol = skipcol; + redraw_later(UPD_SOME_VALID); + } + } } if (curwin->w_topline != old_topline || curwin->w_skipcol != old_skipcol diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim index 992d76388c..fc266da03e 100644 --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -1349,6 +1349,27 @@ func Test_smoothscroll_cursor_back_in_line() bwipe! endfunc +func Test_smoothscroll_squeezed_window() + setlocal smoothscroll + call setline(1, [repeat('x', 3000)] + repeat(['line'], 10)) + exe "norm! gg10\" + redraw + let skipcol = winsaveview().skipcol + call assert_notequal(0, skipcol) + let virtcol = virtcol('.') + + " Squeezing the window to one line and restoring it must not scroll back to + " the start of the line. + new + wincmd _ + close + redraw + call assert_notequal(0, winsaveview().skipcol) + call assert_equal(virtcol, virtcol('.')) + + bwipe! +endfunc + func Test_smoothscroll_long_line_zb() call NewWindow(10, 40) call setline(1, 'abcde '->repeat(150)) diff --git a/src/version.c b/src/version.c index 29de0350fa..55f755f23f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 885, /**/ 884, /**/ From 7872568f4240027f1bb6b458eee58c96a474fe25 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 31 Jul 2026 18:48:43 +0000 Subject: [PATCH 257/647] patch 9.2.0886: :set completion works for an invalid sub-option name Problem: Completing the value after a sub-option name also works when the name merely ends in a valid one, e.g. "invalid_close:". Solution: Require the name to start the option value or to follow a comma. Compute the length of the name at compile time. closes: #20893 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/optionstr.c | 24 +++++++++++++++++++----- src/testdir/test_options.vim | 8 ++++++++ src/version.c | 2 ++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/optionstr.c b/src/optionstr.c index b656288cb5..59a5a7e1d1 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -1132,14 +1132,28 @@ did_set_ambiwidth(optset_T *args UNUSED) } #if defined(FEAT_TABPANEL) || defined(FEAT_DIFF) || defined(FEAT_PROP_POPUP) + +// "name" must be a string literal, the length is computed at compile time. +# define completing_value_for_subopt(args, name) \ + completing_value_for_subopt_len(args, name, (int)STRLEN_LITERAL(name)) + +/* + * Return true when completing the value of the sub-option "name" with length + * "len", e.g. the value after "close:" in 'completepopup'. + */ static bool -completing_value_for_subopt(optexpand_T *args, char *name_suffix) +completing_value_for_subopt_len(optexpand_T *args, char *name, int len) { - char_u *colon = args->oe_xp->xp_pattern - 1; - int len = (int)STRLEN(name_suffix); + char_u *colon = args->oe_xp->xp_pattern - 1; + int off = (int)(colon - args->oe_set_arg); + + if (off < len) + return false; + // The name must follow a comma when it does not start the option value. + if (off > len && *(colon - len - 1) != ',') + return false; - return colon - args->oe_set_arg >= len - && STRNCMP(colon - len, name_suffix, len) == 0; + return STRNCMP(colon - len, name, len) == 0; } #endif diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index b1201eb397..93d0e61442 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -663,6 +663,12 @@ func Test_set_completion_string_values() call feedkeys(":set completepopup=height:10,align:\\\"\", 'xt') call assert_equal('"set completepopup=height:10,align:item', @:) call assert_equal([], getcompletion('set completepopup=bogusname:', 'cmdline')) + " a name ending in a known sub-option name is not a sub-option + call assert_equal([], getcompletion('set completepopup=invalid_close:', 'cmdline')) + call assert_equal([], getcompletion('set completepopup=xborder:', 'cmdline')) + call assert_equal([], getcompletion('set completepopup=xhighlight:', 'cmdline')) + call assert_equal(['on', 'off'], + \ getcompletion('set completepopup=border:on,close:', 'cmdline')) call assert_equal(['on', 'off'], getcompletion('set completepopup=close:', 'cmdline')) call assert_equal(['on', 'off'], getcompletion('set completepopup=close:o', 'cmdline')) call assert_equal(['off'], getcompletion('set previewpopup=close:of', 'cmdline')) @@ -687,6 +693,8 @@ func Test_set_completion_string_values() " diffopt: special handling of algorithm: and inline: call assert_equal('filler', getcompletion('set diffopt+=', 'cmdline')[0]) call assert_equal([], getcompletion('set diffopt+=iblank,foldcolumn:', 'cmdline')) + call assert_equal([], getcompletion('set diffopt+=Xalgorithm:', 'cmdline')) + call assert_equal([], getcompletion('set diffopt+=iblank,Xinline:', 'cmdline')) call assert_equal('patience', getcompletion('set diffopt+=iblank,algorithm:pat*', 'cmdline')[0]) call assert_equal('char', getcompletion('set diffopt+=iwhite,inline:ch*', 'cmdline')[0]) diff --git a/src/version.c b/src/version.c index 55f755f23f..59e9c7bb4b 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 886, /**/ 885, /**/ From d0b42a50b7da1cd443df02df45b1faf9c6691262 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 31 Jul 2026 18:58:18 +0000 Subject: [PATCH 258/647] patch 9.2.0887: scroll: jump-scrolling when moving the cursor onto a wrapping line Problem: With 'smoothscroll' and "lastline" in 'display', moving the cursor to a wrapping line scrolls much more than needed. Solution: Only require the screen lines up to the cursor to be visible, the rest of the line can be cut off at the bottom. closes: #20895 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 3 --- src/move.c | 9 +++++++++ src/testdir/test_scroll_opt.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index a8073702f1..6329ac24a6 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -64,9 +64,6 @@ Virtual text problems: When 'virtualedit' is "all" and 'cursorcolumn' is set, the wrong column may be highlighted. (van-de-bugger, 2018 Jan 23, #2576) -With 'smoothscroll' set and "lastline" in 'display', moving the cursor to a -wrapping line that makes the display scroll up may scroll much more than -needed, thus jump-scrolling. (part of issue 12411) Errors when running tests with valgrind: - test_codestyle.vim: e.g.: command line..script /home/mool/vim/vim91/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 6: keycode_check.vim: space before tab: Expected 0 but got 7 diff --git a/src/move.c b/src/move.c index cd9169de94..9b45b0e2bc 100644 --- a/src/move.c +++ b/src/move.c @@ -2701,6 +2701,15 @@ scroll_cursor_bot(int min_scroll, int set_topbot) used = curwin->w_cline_height; #endif + if (do_sms && (dy_flags & DY_LASTLINE)) + { + // The rest of the cursor line may be cut off at the bottom. + int upto_cursor = plines_win_col(curwin, cln, curwin->w_cursor.col); + + if (upto_cursor < used) + used = upto_cursor; + } + // If the cursor is on or below botline, we will at least scroll by the // height of the cursor line, which is "used". Correct for empty lines, // which are really part of botline. diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim index fc266da03e..ee865e6372 100644 --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -1370,6 +1370,26 @@ func Test_smoothscroll_squeezed_window() bwipe! endfunc +func Test_smoothscroll_lastline_no_jump() + call NewWindow(10, 40) + setlocal smoothscroll + set display=lastline + call setline(1, map(range(1, 9), {i, v -> 'short ' .. v}) + \ + [repeat('long ', 60)] + repeat(['tail'], 5)) + normal! gg + redraw + call assert_equal(1, line('w0')) + + " The first screen line of the wrapping line is already visible. + normal! 9j + redraw + call assert_equal(10, line('.')) + call assert_equal(1, line('w0')) + + set display& + bwipe! +endfunc + func Test_smoothscroll_long_line_zb() call NewWindow(10, 40) call setline(1, 'abcde '->repeat(150)) diff --git a/src/version.c b/src/version.c index 59e9c7bb4b..b3bd5174f6 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 887, /**/ 886, /**/ From 62c8cdc37c2a1b3ef825022cfa343d5c16019831 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 31 Jul 2026 19:07:27 +0000 Subject: [PATCH 259/647] patch 9.2.0888: mapping: modifier is not recognized after a partial mapping Problem: With the key protocol enabled, a mapping for a key with a modifier is not used when it follows a partial match of another mapping. Solution: When the modifier was merged into the key in the typeahead, mark the key, so that the mapping for the simplified key can be used. fixes: #12002 closes: #20898 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 6 +----- src/getchar.c | 24 ++++++++++++++++++------ src/testdir/test_termcodes.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 6329ac24a6..38b6ae4545 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Jul 30 +*todo.txt* For Vim version 9.2. Last change: 2026 Jul 31 VIM REFERENCE MANUAL by Bram Moolenaar @@ -36,10 +36,6 @@ browser use: https://github.com/vim/vim/issues/1234 *known-bugs* -------------------- Known bugs and current work ----------------------- -Mapping with modifier is not recognized after a partial mapping. Probably -because the typeahead was simplified when looking for a matching mapping. -Need to somehow undo the simplification. #12002 - With 'smoothscroll' the scroll position is lost when a window is temporarily squeezed to a couple of lines, for example ":help" followed by ":close". In restore_snapshot_rec() restore more values from the snapshot, instead of diff --git a/src/getchar.c b/src/getchar.c index 83e4be3ebb..9eef2235f8 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -78,6 +78,7 @@ static int KeyNoremap = 0; // remapping flags #define RM_NONE 1 // tb_noremap: don't remap #define RM_SCRIPT 2 // tb_noremap: remap local script mappings #define RM_ABBR 4 // tb_noremap: don't remap, do abbrev. +#define RM_SIMPLIFIED 8 // tb_noremap: modifiers merged into the key // typebuf.tb_buf has three parts: room in front (for result of mappings), the // middle for typeahead and room for new characters (which needs to be 3 * @@ -2770,6 +2771,7 @@ check_simplify_modifier(int max_offset) { char_u new_string[MB_MAXBYTES]; int len; + int key_offset = offset; if (offset == 0) { @@ -2797,10 +2799,17 @@ check_simplify_modifier(int max_offset) else { tp[2] = modifier; - if (put_string_in_typebuf(offset + 3, 1, new_string, len, + key_offset = offset + 3; + if (put_string_in_typebuf(key_offset, 1, new_string, len, NULL, 0, NULL) == FAIL) return -1; } + + // A mapping for the simplified key can be used for it even + // when the key protocol is enabled. + for (int i = 0; i < len; ++i) + typebuf.tb_noremap[typebuf.tb_off + key_offset + i] + |= RM_SIMPLIFIED; return len; } } @@ -2939,7 +2948,9 @@ handle_mapping( if (mp->m_keys[0] == tb_c1 && (mp->m_mode & local_State) && !(mp->m_simplified && key_protocol_enabled() - && typebuf.tb_maplen == 0) + && typebuf.tb_maplen == 0 + && (typebuf.tb_noremap[typebuf.tb_off] + & RM_SIMPLIFIED) == 0) && ((mp->m_mode & MODE_LANGMAP) == 0 || typebuf.tb_maplen == 0)) { @@ -3002,7 +3013,7 @@ handle_mapping( // If only script-local mappings are allowed, check if the // mapping starts with K_SNR. s = typebuf.tb_noremap + typebuf.tb_off; - if (*s == RM_SCRIPT + if ((*s & ~RM_SIMPLIFIED) == RM_SCRIPT && (mp->m_keys[0] != K_SPECIAL || mp->m_keys[1] != KS_EXTRA || mp->m_keys[2] != KE_SNR)) @@ -3126,8 +3137,8 @@ handle_mapping( if (in_osc || no_mapping == 0 || allow_keys != 0) { if (in_osc || ((typebuf.tb_maplen == 0 - || (p_remap && typebuf.tb_noremap[ - typebuf.tb_off] == RM_YES)) + || (p_remap && (typebuf.tb_noremap[typebuf.tb_off] + & ~RM_SIMPLIFIED) == RM_YES)) && !*timedout)) keylen = check_termcode(max_mlen + 1, NULL, 0, NULL); else @@ -3635,7 +3646,8 @@ vgetorpeek(int advance) gotchars(typebuf.tb_buf + typebuf.tb_off, 1); } - KeyNoremap = typebuf.tb_noremap[typebuf.tb_off]; + KeyNoremap = typebuf.tb_noremap[typebuf.tb_off] + & ~RM_SIMPLIFIED; del_typebuf(1, 0); } break; // got character, break the for loop diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index adabeeedbf..a5e80d72d1 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -2298,6 +2298,30 @@ func Test_modifyOtherKeys_mapped() set timeoutlen& endfunc +func Test_modifyOtherKeys_after_partial_mapping() + new + set timeoutlen=10 + imap x + imap ab y + call setline(1, '') + + " "a" is a partial match for the "ab" mapping, CTRL-J is simplified while + " looking for that mapping and must still match the mapping. + call feedkeys("aa" .. GetEscCodeCSI27('J', 5) .. "\", 'Lx!') + call assert_equal('ax', getline(1)) + + " A NL that was not simplified from the key protocol does not use the + " mapping for CTRL-J. + %d _ + call feedkeys("aa\\", 'Lx!') + call assert_equal(['a', ''], getline(1, '$')) + + iunmap + iunmap ab + set timeoutlen& + bwipe! +endfunc + func Test_modifyOtherKeys_ambiguous_mapping() new set timeoutlen=10 diff --git a/src/version.c b/src/version.c index b3bd5174f6..0fdd61f59f 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 888, /**/ 887, /**/ From 52593298a256f50918b64ee8b5a7fc154dc3422a Mon Sep 17 00:00:00 2001 From: Scott Klein Date: Sat, 1 Aug 2026 10:44:01 +0000 Subject: [PATCH 260/647] patch 9.2.0889: VMS: spurious "INVALID DECC FEATURE VALUE" message at every startup Problem: On OpenVMS, Vim prints "INVALID DECC FEATURE VALUE" once per DECC feature at every startup whenever that feature is already set to the value Vim wants -- e.g. when DECC$ARGV_PARSE_STYLE, DECC$EFS_CASE_PRESERVE or DECC$EFS_CHARSET are defined as logical names. Conversely, a genuinely out-of-range value is silently ignored, so the diagnostic fires exactly when it should not and never when it should (after v9.1.1591) Solution: Add braces so that the "else" binds to the range check rather than to the inner "if", matching the existing indentation and the evident intent (Scott Klein). related: #17810 closes: #20904 Supported by AI. Signed-off-by: Scott Klein Signed-off-by: Christian Brabandt --- src/os_vms.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/os_vms.c b/src/os_vms.c index 17fa067743..3c82299394 100644 --- a/src/os_vms.c +++ b/src/os_vms.c @@ -1005,9 +1005,11 @@ vms_init(void) feat_value_max = decc$feature_get_value(feat_index, 3); if ((decc_feat_array[i].value >= feat_value_min) && (decc_feat_array[i].value <= feat_value_max)) + { // Valid value. Set it if necessary if (feat_value != decc_feat_array[i].value) sts = decc$feature_set_value(feat_index, 1, decc_feat_array[i].value); + } else // Invalid DECC feature value printf("INVALID DECC FEATURE VALUE, %d: %d <= %s <= %d.\n", diff --git a/src/version.c b/src/version.c index 0fdd61f59f..dcec47b106 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 889, /**/ 888, /**/ From 1fe0be29211e1d35f4cfbc287e47bad82e87b8d8 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 1 Aug 2026 10:51:44 +0000 Subject: [PATCH 261/647] patch 9.2.0890: test: test for patch v9.2.0888 can be clarified Problem: test for patch v9.2.0888 can be clarified (zeertzjq) Solution: use instead of CTRL-J for a NL The comment says "A NL", using makes the intent clearer. related: #20898 closes: #20906 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_termcodes.vim | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index a5e80d72d1..8dd33a6fd7 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -2313,7 +2313,7 @@ func Test_modifyOtherKeys_after_partial_mapping() " A NL that was not simplified from the key protocol does not use the " mapping for CTRL-J. %d _ - call feedkeys("aa\\", 'Lx!') + call feedkeys("aa\\", 'Lx!') call assert_equal(['a', ''], getline(1, '$')) iunmap diff --git a/src/version.c b/src/version.c index dcec47b106..09996f74bd 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 890, /**/ 889, /**/ From 6351c1775730a376b0e57989a291ef11173d1b0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 13:18:08 +0000 Subject: [PATCH 262/647] CI: Bump github/codeql-action Bumps the github-actions group with 1 update in the / directory: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 4.37.1 to 4.37.3 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.37.1...v4.37.3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.37.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... closes: #20905 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 29d79ac6a8..01e3a960b2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.1 + uses: github/codeql-action/init@v4.37.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.37.1 + uses: github/codeql-action/autobuild@v4.37.3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.1 + uses: github/codeql-action/analyze@v4.37.3 From a3df0ea61b708534fb0a2277216adaacf79ece43 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 1 Aug 2026 13:26:21 +0000 Subject: [PATCH 263/647] patch 9.2.0891: MS-Windows: filename-modifier ":8:t" causes underflow Problem: On MS-Windows using ":8" with ":t", ":e" or ":r" in one fnamemodify() gives a wrong result or an out of memory error. Solution: Recompute the tail after ":8" replaced the name (Hirohito Higashi). related: #20899 closes: #20903 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/filepath.c | 4 ++++ src/testdir/test_shortpathname.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 26 insertions(+) diff --git a/src/filepath.c b/src/filepath.c index 8bdba335c6..e70b9c300b 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -586,6 +586,10 @@ modify_fname( } *fnamelen = l; } + + // The name was replaced by the short name, "tail" points into the + // previous name. + tail = gettail(*fnamep); } #endif // MSWIN diff --git a/src/testdir/test_shortpathname.vim b/src/testdir/test_shortpathname.vim index b3d7b82be5..a1d9d9816e 100644 --- a/src/testdir/test_shortpathname.vim +++ b/src/testdir/test_shortpathname.vim @@ -101,4 +101,24 @@ func Test_ColonEight_notexists() call assert_equal(non_exists, fnamemodify(non_exists, ':p:8')) endfunc +" ":8" replaces the name, the modifiers after it must use the new name. +func Test_ColonEight_then_tail() + let dir = 'c:/Xtest_C8tail' + call s:SetupDir(dir) + + let file = dir . '/longfilename.txt' + + call mkdir(dir, 'D') + call writefile([], file, 'D') + + let sfile = fnamemodify(file, ':p:8') + if sfile ==? fnamemodify(file, ':p') + throw 'Skipped: 8.3 short names are not created on this volume' + endif + + call assert_equal(fnamemodify(sfile, ':t'), fnamemodify(file, ':p:8:t')) + call assert_equal(fnamemodify(sfile, ':e'), fnamemodify(file, ':p:8:e')) + call assert_equal(fnamemodify(sfile, ':r'), fnamemodify(file, ':p:8:r')) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 09996f74bd..c48aca0ff4 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 891, /**/ 890, /**/ From 5a90b9dbd2e1915b7aea98813316c7279e5dd27f Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 1 Aug 2026 13:32:48 +0000 Subject: [PATCH 264/647] patch 9.2.0892: highlight: wrong column highlighted with 'cursorcolumn' Problem: With 'virtualedit' set to "all" and 'cursorcolumn' set, the wrong column may be highlighted after a command that moved the cursor into virtual space and back (van-de-bugger). Solution: Make sure the virtual column is up to date before drawing the window (Hirohito Higashi). fixes: #2576 closes: #20902 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 5 +--- src/drawscreen.c | 7 ++++++ .../Test_cursorcolumn_virtualedit_1.dump | 8 +++++++ src/testdir/test_highlight.vim | 24 +++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/testdir/dumps/Test_cursorcolumn_virtualedit_1.dump diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 38b6ae4545..2698ad6ff6 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Jul 31 +*todo.txt* For Vim version 9.2. Last change: 2026 Aug 01 VIM REFERENCE MANUAL by Bram Moolenaar @@ -57,9 +57,6 @@ Virtual text problems: #12232) - truncated Virtual text below an empty line causes display error #12493 -When 'virtualedit' is "all" and 'cursorcolumn' is set, the wrong column may be -highlighted. (van-de-bugger, 2018 Jan 23, #2576) - Errors when running tests with valgrind: - test_codestyle.vim: e.g.: command line..script /home/mool/vim/vim91/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 6: keycode_check.vim: space before tab: Expected 0 but got 7 diff --git a/src/drawscreen.c b/src/drawscreen.c index a5b3124212..f5271e7c17 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -1660,6 +1660,13 @@ win_update(win_T *wp) } #endif +#ifdef FEAT_SYN_HL + // 'cursorcolumn' is drawn with w_virtcol, make sure it is up to date. + // This may set w_redr_type, thus do it before using it below. + if (wp->w_p_cuc) + validate_virtcol_win(wp); +#endif + type = wp->w_redr_type; if (type == UPD_NOT_VALID) diff --git a/src/testdir/dumps/Test_cursorcolumn_virtualedit_1.dump b/src/testdir/dumps/Test_cursorcolumn_virtualedit_1.dump new file mode 100644 index 0000000000..552b8cf5f5 --- /dev/null +++ b/src/testdir/dumps/Test_cursorcolumn_virtualedit_1.dump @@ -0,0 +1,8 @@ +| +0&#e0e0e08| +0&#ffffff0@73 +| +0&#e0e0e08| +0&#ffffff0@73 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|,|0|-|1| @8|A|l@1| diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim index 081eff43c5..3824ecff79 100644 --- a/src/testdir/test_highlight.vim +++ b/src/testdir/test_highlight.vim @@ -622,6 +622,30 @@ func Test_cursorcolumn_insert_on_tab() call StopVimInTerminal(buf) endfunc +" The column highlighted with 'cursorcolumn' must be the column of the cursor, +" also after a command that moved the cursor into virtual space and back. +func Test_cursorcolumn_virtualedit() + CheckScreendump + + let lines =<< trim END + set virtualedit=all + set cursorcolumn + call setline(1, ['', '', '']) + call cursor(3, 1) + END + call writefile(lines, 'Xcuc_virtualedit', 'D') + + let buf = RunVimInTerminal('-S Xcuc_virtualedit', #{rows: 8}) + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_cursorcolumn_virtualedit_1', {}) + + call term_sendkeys(buf, "\") + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_cursorcolumn_virtualedit_1', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_cursorcolumn_callback() CheckScreendump CheckFeature timers diff --git a/src/version.c b/src/version.c index c48aca0ff4..fe82bcdc4a 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 892, /**/ 891, /**/ From 64b0196a9200335d0992259a1d46f7626e6485cb Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 1 Aug 2026 13:42:54 +0000 Subject: [PATCH 265/647] runtime(doc): remove todo entry for test_codestyle errors The two reported problems are gone: keycode_check.vim has no space before a tab and setup.vim, now util/setup.vim, has no trailing white space. Since patch 9.2.0195 the check is not part of the test suite but a separate "make codestyle" target. closes: #20900 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 2698ad6ff6..4789b8c3b6 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -58,9 +58,6 @@ Virtual text problems: - truncated Virtual text below an empty line causes display error #12493 Errors when running tests with valgrind: -- test_codestyle.vim: e.g.: - command line..script /home/mool/vim/vim91/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 6: keycode_check.vim: space before tab: Expected 0 but got 7 - command line..script /home/mool/vim/vim91/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 10: setup.vim: trailing white space: Expected 0 but got 23 - test_gui.vim: Found errors in Test_gui_mouse_event(): From 8e5d1761ce5d3a5af565d1828f53fa56687bc3c1 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sat, 1 Aug 2026 13:47:20 +0000 Subject: [PATCH 266/647] patch 9.2.0893: MS-Windows: "*.vim" also matches files with a longer extension Problem: On MS-Windows a pattern like "path/*.vim" also matches files such as "foo.vim9", because the 8.3 short name "FOO~1.VIM" is used for matching as well. These files are then sourced. Solution: Only match against the short name when the pattern contains a '~' (Hirohito Higashi). closes: #20899 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 4 ---- src/filepath.c | 8 +++++++- src/testdir/test_shortpathname.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 4789b8c3b6..3b2f65a9c9 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -44,10 +44,6 @@ calling frame_new_height() and frame_new_width(), especially w_skipcol. With 'splitkeep' "screen" the scroll position is lost when splitting and closing a window, win_fix_cursor() moves the cursor to another line. -Check places that source "path/*.vim" to not match other extensions, e.g. -.vim9, on MS-Windows (short file name match, gets expanded to long file name). -E.g. for startup files, plugins, packs, etc. - When a help item can't be found, then open 'helpfile'. Search for the tag in that file and gtive E149 only when not found. Helps for a tiny Vim installed without all the help files. diff --git a/src/filepath.c b/src/filepath.c index e70b9c300b..388ce7af17 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -3578,6 +3578,7 @@ dos_expandpath( char_u *matchname; int ok; char_u *p_alt; + int use_short_name; // Expanding "**" may take a long time, check for CTRL-C. if (stardepth > 0) @@ -3672,6 +3673,10 @@ dos_expandpath( // remember the pattern or file name being looked for matchname = vim_strsave(s); + // Only match against the alternate (8.3) file name when the pattern looks + // like a short name, it contains a '~'. + use_short_name = vim_strchr(s, '~') != NULL; + len = (size_t)(s - buf); // If "**" is by itself, this is the first time we encounter it and more // is following then find matches without any directory. @@ -3701,7 +3706,8 @@ dos_expandpath( // Do not use the alternate filename when the file name ends in '~', // because it picks up backup files: short name for "foo.vim~" is // "foo~1.vim", which matches "*.vim". - if (*wfb.cAlternateFileName == NUL || p[STRLEN(p) - 1] == '~') + if (!use_short_name || *wfb.cAlternateFileName == NUL + || p[STRLEN(p) - 1] == '~') p_alt = NULL; else p_alt = utf16_to_enc(wfb.cAlternateFileName, NULL); diff --git a/src/testdir/test_shortpathname.vim b/src/testdir/test_shortpathname.vim index a1d9d9816e..7bd72ebf75 100644 --- a/src/testdir/test_shortpathname.vim +++ b/src/testdir/test_shortpathname.vim @@ -121,4 +121,26 @@ func Test_ColonEight_then_tail() call assert_equal(fnamemodify(sfile, ':r'), fnamemodify(file, ':p:8:r')) endfunc +" A pattern must not match the short name of a file with a longer extension: +" the short name of "foo.vim9" is "FOO~1.VIM", which matches "*.vim". +func Test_glob_short_name_extension() + let dir = 'c:/Xtest_glob8' + call s:SetupDir(dir) + call mkdir(dir, 'D') + + let file = dir . '/foo.vim9' + call writefile([], file, 'D') + if fnamemodify(file, ':p:8') ==? fnamemodify(file, ':p') + throw 'Skipped: 8.3 short names are not created on this volume' + endif + call writefile([], dir . '/bar.vim', 'D') + + let matches = map(split(glob(dir . '/*.vim'), "\n"), {_, v -> fnamemodify(v, ':t')}) + call assert_equal(['bar.vim'], matches) + + " A pattern that is a short name still matches. + let short = fnamemodify(file, ':p:8:t') + call assert_equal([file], split(glob(dir . '/' . short), "\n")) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index fe82bcdc4a..c69281a7ad 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 893, /**/ 892, /**/ From c28515b9992e52f49c3fd90484601c248c672aec Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sat, 1 Aug 2026 13:57:32 +0000 Subject: [PATCH 267/647] patch 9.2.0894: filetype: ed script files not recognised Problem: filetype: ed script files not recognised. Solution: Add filetype detection for *.ed files and shebang lines, include syntax script and syntax tests. Features of the ed syntax file: - BSD and GNU extensions are supported - Andrew L. Moore's ed extensions are not supported - Rebuild synmenu.vim closes: #19602 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 1 + runtime/autoload/dist/ft.vim | 4 +- runtime/autoload/dist/script.vim | 4 + runtime/makemenu.vim | 5 +- runtime/synmenu.vim | 217 ++--- runtime/syntax/ed.vim | 616 +++++++++++++ .../syntax/testdir/dumps/ed_addresses_00.dump | 20 + .../syntax/testdir/dumps/ed_addresses_01.dump | 20 + .../syntax/testdir/dumps/ed_addresses_02.dump | 20 + .../syntax/testdir/dumps/ed_addresses_03.dump | 20 + .../syntax/testdir/dumps/ed_addresses_04.dump | 20 + .../syntax/testdir/dumps/ed_addresses_05.dump | 20 + .../syntax/testdir/dumps/ed_addresses_06.dump | 20 + .../syntax/testdir/dumps/ed_addresses_07.dump | 20 + .../syntax/testdir/dumps/ed_addresses_08.dump | 20 + .../syntax/testdir/dumps/ed_addresses_09.dump | 20 + .../syntax/testdir/dumps/ed_addresses_10.dump | 20 + .../syntax/testdir/dumps/ed_addresses_11.dump | 20 + .../syntax/testdir/dumps/ed_addresses_12.dump | 20 + .../syntax/testdir/dumps/ed_addresses_13.dump | 20 + .../syntax/testdir/dumps/ed_addresses_14.dump | 20 + .../syntax/testdir/dumps/ed_addresses_15.dump | 20 + .../syntax/testdir/dumps/ed_commands_00.dump | 20 + .../syntax/testdir/dumps/ed_commands_01.dump | 20 + .../syntax/testdir/dumps/ed_commands_02.dump | 20 + .../syntax/testdir/dumps/ed_commands_03.dump | 20 + .../syntax/testdir/dumps/ed_commands_04.dump | 20 + .../syntax/testdir/dumps/ed_commands_05.dump | 20 + .../syntax/testdir/dumps/ed_commands_06.dump | 20 + .../syntax/testdir/dumps/ed_commands_07.dump | 20 + .../syntax/testdir/dumps/ed_commands_08.dump | 20 + .../syntax/testdir/dumps/ed_commands_09.dump | 20 + .../syntax/testdir/dumps/ed_commands_10.dump | 20 + .../syntax/testdir/dumps/ed_commands_11.dump | 20 + .../syntax/testdir/dumps/ed_commands_12.dump | 20 + .../syntax/testdir/dumps/ed_commands_13.dump | 20 + .../syntax/testdir/dumps/ed_commands_14.dump | 20 + .../syntax/testdir/dumps/ed_commands_15.dump | 20 + .../syntax/testdir/dumps/ed_commands_16.dump | 20 + .../syntax/testdir/dumps/ed_commands_17.dump | 20 + .../syntax/testdir/dumps/ed_commands_18.dump | 20 + .../syntax/testdir/dumps/ed_commands_19.dump | 20 + .../syntax/testdir/dumps/ed_commands_20.dump | 20 + .../syntax/testdir/dumps/ed_commands_21.dump | 20 + .../syntax/testdir/dumps/ed_commands_22.dump | 20 + .../syntax/testdir/dumps/ed_commands_23.dump | 20 + .../syntax/testdir/dumps/ed_commands_24.dump | 20 + .../syntax/testdir/dumps/ed_commands_25.dump | 20 + .../syntax/testdir/dumps/ed_commands_26.dump | 20 + .../syntax/testdir/dumps/ed_commands_27.dump | 20 + .../syntax/testdir/dumps/ed_commands_28.dump | 20 + .../syntax/testdir/dumps/ed_commands_29.dump | 20 + .../syntax/testdir/dumps/ed_commands_30.dump | 20 + .../syntax/testdir/dumps/ed_commands_31.dump | 20 + .../syntax/testdir/dumps/ed_commands_32.dump | 20 + .../syntax/testdir/dumps/ed_commands_33.dump | 20 + .../syntax/testdir/dumps/ed_commands_34.dump | 20 + .../syntax/testdir/dumps/ed_commands_35.dump | 20 + .../syntax/testdir/dumps/ed_commands_36.dump | 20 + .../syntax/testdir/dumps/ed_commands_37.dump | 20 + .../syntax/testdir/dumps/ed_commands_38.dump | 20 + .../syntax/testdir/dumps/ed_commands_39.dump | 20 + .../syntax/testdir/dumps/ed_commands_40.dump | 20 + .../syntax/testdir/dumps/ed_commands_41.dump | 20 + .../syntax/testdir/dumps/ed_commands_42.dump | 20 + .../syntax/testdir/dumps/ed_commands_43.dump | 20 + .../syntax/testdir/dumps/ed_commands_44.dump | 20 + .../syntax/testdir/dumps/ed_commands_45.dump | 20 + runtime/syntax/testdir/input/ed_addresses.ed | 274 ++++++ runtime/syntax/testdir/input/ed_commands.ed | 824 ++++++++++++++++++ src/testdir/test_filetype.vim | 2 + src/version.c | 2 + 72 files changed, 3078 insertions(+), 111 deletions(-) create mode 100644 runtime/syntax/ed.vim create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_00.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_01.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_02.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_03.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_04.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_05.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_06.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_07.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_08.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_09.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_10.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_11.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_12.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_13.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_14.dump create mode 100644 runtime/syntax/testdir/dumps/ed_addresses_15.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_00.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_01.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_02.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_03.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_04.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_05.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_06.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_07.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_08.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_09.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_10.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_11.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_12.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_13.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_14.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_15.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_16.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_17.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_18.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_19.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_20.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_21.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_22.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_23.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_24.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_25.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_26.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_27.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_28.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_29.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_30.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_31.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_32.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_33.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_34.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_35.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_36.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_37.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_38.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_39.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_40.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_41.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_42.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_43.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_44.dump create mode 100644 runtime/syntax/testdir/dumps/ed_commands_45.dump create mode 100644 runtime/syntax/testdir/input/ed_addresses.ed create mode 100644 runtime/syntax/testdir/input/ed_commands.ed diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 44ccadf6b4..9b221eb7a2 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -544,6 +544,7 @@ runtime/syntax/dot.vim @mmottl runtime/syntax/doxygen.vim @frogonwheels runtime/syntax/dtd.vim @chrisbra runtime/syntax/dts.vim @zonque +runtime/syntax/ed.vim @dkearns runtime/syntax/editorconfig.vim @gpanders runtime/syntax/eiffel.vim @jocelyn runtime/syntax/erlang.vim @hcs42 diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 0d1e7119ce..398e2ae26b 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 28 +# Last Change: 2026 Jul 30 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -2053,6 +2053,8 @@ const ft_from_ext = { "overlay": "dts", # Embedix Component Description "ecd": "ecd", + # ed(1) + "ed": "ed", # ERicsson LANGuage; Yaws is erlang too "erl": "erlang", "hrl": "erlang", diff --git a/runtime/autoload/dist/script.vim b/runtime/autoload/dist/script.vim index 3f9a5acfd0..61e6cec592 100644 --- a/runtime/autoload/dist/script.vim +++ b/runtime/autoload/dist/script.vim @@ -243,6 +243,10 @@ export def Exe2filetype(name: string, line1: string): string elseif name =~ '^vim\>' return 'vim' + # ed(1) + elseif name =~ '^ed\>' + return 'ed' + endif return '' diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 6611f737cd..79d188a92e 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -1,8 +1,8 @@ vim9script # Script to define the syntax menu in synmenu.vim -# Maintainer: The Vim Project -# Last Change: 2025 Mar 09 +# Maintainer: The Vim Project +# Last Change: 2026 Jul 30 # Former Maintainer: Bram Moolenaar # This is used by "make menu" in the src directory. @@ -205,6 +205,7 @@ SynMenu DE.Dylan.Dylan\ interface:dylanintr SynMenu DE.Dylan.Dylan\ lid:dylanlid SynMenu DE.EDIF:edif +SynMenu DE.Ed:ed SynMenu DE.Eiffel:eiffel SynMenu DE.Eight:8th SynMenu DE.Elinks\ config:elinks diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index c26c128b3c..17241ff281 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -110,46 +110,46 @@ an 50.20.110 &Syntax.C.C++ :cal SetSyn("cpp") an 50.20.120 &Syntax.C.C# :cal SetSyn("cs") an 50.20.130 &Syntax.C.Cabal\ Haskell\ build\ file :cal SetSyn("cabal") an 50.20.140 &Syntax.C.Calendar :cal SetSyn("calendar") -an 50.20.140 &Syntax.C.Cangjie :cal SetSyn("cangjie") -an 50.20.150 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css") -an 50.20.160 &Syntax.C.CDL :cal SetSyn("cdl") -an 50.20.170 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc") -an 50.20.180 &Syntax.C.Cdrdao\ config :cal SetSyn("cdrdaoconf") -an 50.20.190 &Syntax.C.Century\ Term :cal SetSyn("cterm") -an 50.20.200 &Syntax.C.CH\ script :cal SetSyn("ch") -an 50.20.210 &Syntax.C.ChaiScript :cal SetSyn("chaiscript") -an 50.20.220 &Syntax.C.ChangeLog :cal SetSyn("changelog") -an 50.20.230 &Syntax.C.CHILL :cal SetSyn("chill") -an 50.20.240 &Syntax.C.Cheetah\ template :cal SetSyn("cheetah") -an 50.20.250 &Syntax.C.Chicken :cal SetSyn("chicken") -an 50.20.260 &Syntax.C.ChordPro :cal SetSyn("chordpro") -an 50.20.270 &Syntax.C.Clean :cal SetSyn("clean") -an 50.20.280 &Syntax.C.Clever :cal SetSyn("cl") -an 50.20.290 &Syntax.C.Clipper :cal SetSyn("clipper") -an 50.20.300 &Syntax.C.Clojure :cal SetSyn("clojure") -an 50.20.310 &Syntax.C.Cmake :cal SetSyn("cmake") -an 50.20.320 &Syntax.C.Cmod :cal SetSyn("cmod") -an 50.20.330 &Syntax.C.Cmusrc :cal SetSyn("cmusrc") -an 50.20.340 &Syntax.C.Cobol :cal SetSyn("cobol") -an 50.20.350 &Syntax.C.Coco/R :cal SetSyn("coco") -an 50.20.360 &Syntax.C.Cold\ Fusion :cal SetSyn("cf") -an 50.20.370 &Syntax.C.Conary\ Recipe :cal SetSyn("conaryrecipe") -an 50.20.380 &Syntax.C.Config.Cfg\ Config\ file :cal SetSyn("cfg") -an 50.20.390 &Syntax.C.Config.Configure\.in :cal SetSyn("config") -an 50.20.400 &Syntax.C.Config.Generic\ Config\ file :cal SetSyn("conf") -an 50.20.410 &Syntax.C.CRM114 :cal SetSyn("crm") -an 50.20.420 &Syntax.C.Crontab :cal SetSyn("crontab") -an 50.20.430 &Syntax.C.CSDL :cal SetSyn("csdl") -an 50.20.440 &Syntax.C.CSP :cal SetSyn("csp") -an 50.20.450 &Syntax.C.Ctrl-H :cal SetSyn("ctrlh") -an 50.20.460 &Syntax.C.Cucumber :cal SetSyn("cucumber") -an 50.20.470 &Syntax.C.CUDA :cal SetSyn("cuda") -an 50.20.480 &Syntax.C.CUPL.CUPL :cal SetSyn("cupl") -an 50.20.490 &Syntax.C.CUPL.Simulation :cal SetSyn("cuplsim") -an 50.20.500 &Syntax.C.CVS.commit\ file :cal SetSyn("cvs") -an 50.20.510 &Syntax.C.CVS.cvsrc :cal SetSyn("cvsrc") -an 50.20.520 &Syntax.C.Cyn++ :cal SetSyn("cynpp") -an 50.20.530 &Syntax.C.Cynlib :cal SetSyn("cynlib") +an 50.20.150 &Syntax.C.Cangjie :cal SetSyn("cangjie") +an 50.20.160 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css") +an 50.20.170 &Syntax.C.CDL :cal SetSyn("cdl") +an 50.20.180 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc") +an 50.20.190 &Syntax.C.Cdrdao\ config :cal SetSyn("cdrdaoconf") +an 50.20.200 &Syntax.C.Century\ Term :cal SetSyn("cterm") +an 50.20.210 &Syntax.C.CH\ script :cal SetSyn("ch") +an 50.20.220 &Syntax.C.ChaiScript :cal SetSyn("chaiscript") +an 50.20.230 &Syntax.C.ChangeLog :cal SetSyn("changelog") +an 50.20.240 &Syntax.C.CHILL :cal SetSyn("chill") +an 50.20.250 &Syntax.C.Cheetah\ template :cal SetSyn("cheetah") +an 50.20.260 &Syntax.C.Chicken :cal SetSyn("chicken") +an 50.20.270 &Syntax.C.ChordPro :cal SetSyn("chordpro") +an 50.20.280 &Syntax.C.Clean :cal SetSyn("clean") +an 50.20.290 &Syntax.C.Clever :cal SetSyn("cl") +an 50.20.300 &Syntax.C.Clipper :cal SetSyn("clipper") +an 50.20.310 &Syntax.C.Clojure :cal SetSyn("clojure") +an 50.20.320 &Syntax.C.Cmake :cal SetSyn("cmake") +an 50.20.330 &Syntax.C.Cmod :cal SetSyn("cmod") +an 50.20.340 &Syntax.C.Cmusrc :cal SetSyn("cmusrc") +an 50.20.350 &Syntax.C.Cobol :cal SetSyn("cobol") +an 50.20.360 &Syntax.C.Coco/R :cal SetSyn("coco") +an 50.20.370 &Syntax.C.Cold\ Fusion :cal SetSyn("cf") +an 50.20.380 &Syntax.C.Conary\ Recipe :cal SetSyn("conaryrecipe") +an 50.20.390 &Syntax.C.Config.Cfg\ Config\ file :cal SetSyn("cfg") +an 50.20.400 &Syntax.C.Config.Configure\.in :cal SetSyn("config") +an 50.20.410 &Syntax.C.Config.Generic\ Config\ file :cal SetSyn("conf") +an 50.20.420 &Syntax.C.CRM114 :cal SetSyn("crm") +an 50.20.430 &Syntax.C.Crontab :cal SetSyn("crontab") +an 50.20.440 &Syntax.C.CSDL :cal SetSyn("csdl") +an 50.20.450 &Syntax.C.CSP :cal SetSyn("csp") +an 50.20.460 &Syntax.C.Ctrl-H :cal SetSyn("ctrlh") +an 50.20.470 &Syntax.C.Cucumber :cal SetSyn("cucumber") +an 50.20.480 &Syntax.C.CUDA :cal SetSyn("cuda") +an 50.20.490 &Syntax.C.CUPL.CUPL :cal SetSyn("cupl") +an 50.20.500 &Syntax.C.CUPL.Simulation :cal SetSyn("cuplsim") +an 50.20.510 &Syntax.C.CVS.commit\ file :cal SetSyn("cvs") +an 50.20.520 &Syntax.C.CVS.cvsrc :cal SetSyn("cvsrc") +an 50.20.530 &Syntax.C.Cyn++ :cal SetSyn("cynpp") +an 50.20.540 &Syntax.C.Cynlib :cal SetSyn("cynlib") an 50.30.100 &Syntax.DE.D :cal SetSyn("d") an 50.30.110 &Syntax.DE.Dart :cal SetSyn("dart") an 50.30.120 &Syntax.DE.Datascript :cal SetSyn("datascript") @@ -189,23 +189,24 @@ an 50.30.450 &Syntax.DE.Dylan.Dylan :cal SetSyn("dylan") an 50.30.460 &Syntax.DE.Dylan.Dylan\ interface :cal SetSyn("dylanintr") an 50.30.470 &Syntax.DE.Dylan.Dylan\ lid :cal SetSyn("dylanlid") an 50.30.490 &Syntax.DE.EDIF :cal SetSyn("edif") -an 50.30.500 &Syntax.DE.Eiffel :cal SetSyn("eiffel") -an 50.30.510 &Syntax.DE.Eight :cal SetSyn("8th") -an 50.30.520 &Syntax.DE.Elinks\ config :cal SetSyn("elinks") -an 50.30.530 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt") -an 50.30.540 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd") -an 50.30.550 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang") -an 50.30.560 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc") -an 50.30.570 &Syntax.DE.ESQL-C :cal SetSyn("esqlc") -an 50.30.580 &Syntax.DE.Essbase\ script :cal SetSyn("csc") -an 50.30.590 &Syntax.DE.Esterel :cal SetSyn("esterel") -an 50.30.600 &Syntax.DE.Eterm\ config :cal SetSyn("eterm") -an 50.30.610 &Syntax.DE.Euphoria\ 3 :cal SetSyn("euphoria3") -an 50.30.620 &Syntax.DE.Euphoria\ 4 :cal SetSyn("euphoria4") -an 50.30.630 &Syntax.DE.Eviews :cal SetSyn("eviews") -an 50.30.640 &Syntax.DE.Exim\ conf :cal SetSyn("exim") -an 50.30.650 &Syntax.DE.Expect :cal SetSyn("expect") -an 50.30.660 &Syntax.DE.Exports :cal SetSyn("exports") +an 50.30.500 &Syntax.DE.Ed :cal SetSyn("ed") +an 50.30.510 &Syntax.DE.Eiffel :cal SetSyn("eiffel") +an 50.30.520 &Syntax.DE.Eight :cal SetSyn("8th") +an 50.30.530 &Syntax.DE.Elinks\ config :cal SetSyn("elinks") +an 50.30.540 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt") +an 50.30.550 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd") +an 50.30.560 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang") +an 50.30.570 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc") +an 50.30.580 &Syntax.DE.ESQL-C :cal SetSyn("esqlc") +an 50.30.590 &Syntax.DE.Essbase\ script :cal SetSyn("csc") +an 50.30.600 &Syntax.DE.Esterel :cal SetSyn("esterel") +an 50.30.610 &Syntax.DE.Eterm\ config :cal SetSyn("eterm") +an 50.30.620 &Syntax.DE.Euphoria\ 3 :cal SetSyn("euphoria3") +an 50.30.630 &Syntax.DE.Euphoria\ 4 :cal SetSyn("euphoria4") +an 50.30.640 &Syntax.DE.Eviews :cal SetSyn("eviews") +an 50.30.650 &Syntax.DE.Exim\ conf :cal SetSyn("exim") +an 50.30.660 &Syntax.DE.Expect :cal SetSyn("expect") +an 50.30.670 &Syntax.DE.Exports :cal SetSyn("exports") an 50.40.100 &Syntax.FG.Falcon :cal SetSyn("falcon") an 50.40.110 &Syntax.FG.Fantom :cal SetSyn("fan") an 50.40.120 &Syntax.FG.Fetchmail :cal SetSyn("fetchmail") @@ -257,57 +258,57 @@ an 50.50.170 &Syntax.HIJK.Hercules :cal SetSyn("hercules") an 50.50.180 &Syntax.HIJK.Hex\ dump.XXD :cal SetSyn("xxd") an 50.50.190 &Syntax.HIJK.Hex\ dump.Intel\ MCS51 :cal SetSyn("hex") an 50.50.200 &Syntax.HIJK.Hg\ commit :cal SetSyn("hgcommit") -an 50.50.205 &Syntax.HIJK.HIP :cal SetSyn("hip") -an 50.50.210 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") -an 50.50.220 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") -an 50.50.230 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") -an 50.50.240 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby") -an 50.50.250 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah") -an 50.50.260 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango") -an 50.50.270 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs") -an 50.50.280 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos") -an 50.50.290 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml") -an 50.50.300 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf") -an 50.50.310 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess") -an 50.50.320 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb") -an 50.50.340 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu") -an 50.50.350 &Syntax.HIJK.Icon :cal SetSyn("icon") -an 50.50.360 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl") -an 50.50.370 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl") -an 50.50.380 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent") -an 50.50.390 &Syntax.HIJK.Inform :cal SetSyn("inform") -an 50.50.400 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl") -an 50.50.410 &Syntax.HIJK.Initng :cal SetSyn("initng") -an 50.50.420 &Syntax.HIJK.Inittab :cal SetSyn("inittab") -an 50.50.430 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss") -an 50.50.440 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat") -an 50.50.450 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog") -an 50.50.460 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt") -an 50.50.470 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog") -an 50.50.480 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog") -an 50.50.490 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog") -an 50.50.500 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd") -an 50.50.510 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang") -an 50.50.520 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter") -an 50.50.540 &Syntax.HIJK.J :cal SetSyn("j") -an 50.50.550 &Syntax.HIJK.JAL :cal SetSyn("jal") -an 50.50.560 &Syntax.HIJK.JAM :cal SetSyn("jam") -an 50.50.570 &Syntax.HIJK.Jargon :cal SetSyn("jargon") -an 50.50.580 &Syntax.HIJK.Java.Java :cal SetSyn("java") -an 50.50.590 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc") -an 50.50.600 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp") -an 50.50.610 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties") -an 50.50.620 &Syntax.HIJK.JavaScript :cal SetSyn("javascript") -an 50.50.630 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact") -an 50.50.640 &Syntax.HIJK.Jess :cal SetSyn("jess") -an 50.50.650 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph") -an 50.50.660 &Syntax.HIJK.Jovial :cal SetSyn("jovial") -an 50.50.670 &Syntax.HIJK.JSON :cal SetSyn("json") -an 50.50.690 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") -an 50.50.700 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") -an 50.50.710 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") -an 50.50.720 &Syntax.HIJK.Kivy :cal SetSyn("kivy") -an 50.50.730 &Syntax.HIJK.KixTart :cal SetSyn("kix") +an 50.50.210 &Syntax.HIJK.HIP :cal SetSyn("hip") +an 50.50.220 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") +an 50.50.230 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") +an 50.50.240 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") +an 50.50.250 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby") +an 50.50.260 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah") +an 50.50.270 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango") +an 50.50.280 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs") +an 50.50.290 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos") +an 50.50.300 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml") +an 50.50.310 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf") +an 50.50.320 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess") +an 50.50.330 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb") +an 50.50.350 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu") +an 50.50.360 &Syntax.HIJK.Icon :cal SetSyn("icon") +an 50.50.370 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl") +an 50.50.380 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl") +an 50.50.390 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent") +an 50.50.400 &Syntax.HIJK.Inform :cal SetSyn("inform") +an 50.50.410 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl") +an 50.50.420 &Syntax.HIJK.Initng :cal SetSyn("initng") +an 50.50.430 &Syntax.HIJK.Inittab :cal SetSyn("inittab") +an 50.50.440 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss") +an 50.50.450 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat") +an 50.50.460 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog") +an 50.50.470 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt") +an 50.50.480 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog") +an 50.50.490 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog") +an 50.50.500 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog") +an 50.50.510 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd") +an 50.50.520 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang") +an 50.50.530 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter") +an 50.50.550 &Syntax.HIJK.J :cal SetSyn("j") +an 50.50.560 &Syntax.HIJK.JAL :cal SetSyn("jal") +an 50.50.570 &Syntax.HIJK.JAM :cal SetSyn("jam") +an 50.50.580 &Syntax.HIJK.Jargon :cal SetSyn("jargon") +an 50.50.590 &Syntax.HIJK.Java.Java :cal SetSyn("java") +an 50.50.600 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc") +an 50.50.610 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp") +an 50.50.620 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties") +an 50.50.630 &Syntax.HIJK.JavaScript :cal SetSyn("javascript") +an 50.50.640 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact") +an 50.50.650 &Syntax.HIJK.Jess :cal SetSyn("jess") +an 50.50.660 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph") +an 50.50.670 &Syntax.HIJK.Jovial :cal SetSyn("jovial") +an 50.50.680 &Syntax.HIJK.JSON :cal SetSyn("json") +an 50.50.700 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") +an 50.50.710 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") +an 50.50.720 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") +an 50.50.730 &Syntax.HIJK.Kivy :cal SetSyn("kivy") +an 50.50.740 &Syntax.HIJK.KixTart :cal SetSyn("kix") an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace") an 50.60.110 &Syntax.L.LambdaProlog :cal SetSyn("lprolog") an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte") diff --git a/runtime/syntax/ed.vim b/runtime/syntax/ed.vim new file mode 100644 index 0000000000..393e225b0e --- /dev/null +++ b/runtime/syntax/ed.vim @@ -0,0 +1,616 @@ +" Vim syntax file +" Language: ed(1) +" Maintainer: Doug Kearns +" Last Change: 2026 Jul 30 + +if exists("b:current_syntax") + finish +endif +let s:cpo_save = &cpo +set cpo&vim + +syn match edLineStart + \ /^/ + \ skipwhite + \ nextgroup=@edAddress,edAddressSeparator,@edCommand + +" Addresses {{{1 + +" TODO: Rename edAddress_Line, edAdress_Mark etc? +syn match edAddress contained + \ /[.$]\|\d\+\|'[a-z]/ + \ skipwhite + \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand +syn region edAddress_Pattern contained + \ matchgroup=Delimiter + \ start=+/+ + \ end=+/\|$+ + \ skipwhite + \ nextgroup=@edAddressModifier, + \ edAddressSeparator, + \ @edCommand, + \ edAddress_Pattern_Flag + \ contains=edRegex_SlashEscape, + \ edRegex_BackslashEscape, + \ edRegex_BracketExpression +syn region edAddress_Pattern contained + \ matchgroup=Delimiter + \ start=/?/ + \ end=/?\|$/ + \ skipwhite + \ nextgroup=@edAddressModifier, + \ edAddressSeparator, + \ @edCommand, + \ edAddress_Pattern_Flag + \ contains=edRegex_QuestionMarkEscape, + \ edRegex_BackslashEscape, + \ edRegex_BracketExpression + +syn match edAddress_Pattern_Flag contained + \ +[/?]\@1<=I+ + \ skipwhite + \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand + +syn match edRegex_BracketExpression contained + \ "\[\^\=\]\=\%(\[:.\{-}:\]\|\[\..\{-}\.\]\|\[=.\{-}=\]\|[^]]\)*\]" + \ contains=NONE + \ transparent +syn match edRegex_SlashEscape contained + \ +\\/+ + \ contains=NONE + \ transparent +syn match edRegex_QuestionMarkEscape contained + \ /\\?/ + \ contains=NONE + \ transparent +syn match edRegex_BackslashEscape contained + \ /\\\\/ + \ contains=NONE + \ transparent +syn match edRegex_EscapeSequence contained + \ /\\./ + \ contains=NONE + \ transparent + + +syn cluster edAddress + \ contains=edAddress,edAddress_Pattern,edAddressModifier_Offset + +syn match edAddressModifier_Offset contained + \ /[+-]\s*\%(\d\+\)\=/ + \ skipwhite + \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand +" BSD extension +syn match edAddressModifier_Offset contained + \ /\^\s*\%(\d\+\)\=/ + \ skipwhite + \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand +syn match edAddressModifier_Count contained + \ /\d\+/ + \ skipwhite + \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand +syn cluster edAddressModifier + \ contains=edAddressModifier_Offset,edAddressModifier_Count + +syn match edAddressSeparator contained + \ /[,;]/ + \ skipwhite + \ nextgroup=@edAddress,edAddressSeparator,@edCommand +" BSD/GNU extension +syn match edAddressSeparator contained + \ /%/ + \ skipwhite + \ nextgroup=@edAddress,edAddressSeparator,@edCommand + +" Commands {{{1 + +" Append Command {{{2 +syn match edCommand_Append contained + \ /a/ + \ skipnl + \ nextgroup=@edCommandPrint_InputMode, + \ edArg_InputMode_Text, + \ edArg_InputMode_EndMarker, + \ edLineContinue_InputMode + +syn match edArg_InputMode_EndMarker contained + \ /^\.\ze\%(\s*\\\)\=$/ + +syn region edArg_InputMode_Text contained + \ start=/^\%(\.$\)\@!/ + "\ end=/^\.$/ + \ matchgroup=edArg_InputMode_EndMarker + "\ TODO: remove \\? + \ end=/^\.\ze\%(\s*\\\)\=$/ + \ fold +syn region edArg_InputMode_Text_Global contained + \ start=/^\%(\.$\)\@!/ + \ end=/\ze\\\@1/ + \ skipwhite + \ nextgroup=edArg_File,edCommand_ShellEscape + +" Substitute Command {{{2 +syn match edCommand_Substitute contained + \ /s/ + \ nextgroup=edCommand_Substitute_Arg_Regexp +syn region edCommand_Substitute_Arg_Regexp contained + \ matchgroup=Delimiter + \ start=/\z([^\\ \n]\)/ + "\ /$/ so we don't run to EOF when editing + \ end=/\ze\z1\|$/ + \ nextgroup=edCommand_Substitute_Arg_Replacement + \ contains=edRegex_EscapeSequence,edRegex_BracketExpression +syn region edCommand_Substitute_Arg_Replacement contained + \ matchgroup=Delimiter + \ start=/\z(.\)/ + \ skip=/\\$/ + \ end=/\z1\|$/ + \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count + \ contains=edCommand_Substitute_Arg_Replacement_Escape, + \ edCommand_Substitute_Arg_Replacement_Newline, + \ edCommand_Substitute_Arg_Replacement_Match + +syn region edCommand_Substitute_Arg_Replacement contained + \ matchgroup=Delimiter + \ start=/\z(.\)%\@=/ + \ end=/\%(\z1%\)\@<=\%(\z1\|$\)/ + \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count + \ contains=edCommand_Substitute_Arg_Replacement_Repeat + \ oneline + +syn match edCommand_Substitute_Arg_Replacement_Escape contained /\\./ +syn match edCommand_Substitute_Arg_Replacement_Newline contained /\\$/ +syn match edCommand_Substitute_Arg_Replacement_Match contained /&/ +syn match edCommand_Substitute_Arg_Replacement_Repeat contained /%/ + +syn match edCommand_Substitute_Arg_Flag contained + \ /g/ + \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count +" GNU extension +syn match edCommand_Substitute_Arg_Flag contained + \ /[iI]/ + \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count + +syn match edCommand_Substitute_Arg_Count contained + \ /\d\+/ + \ nextgroup=edCommand_Substitute_Arg_Flag + +syn match edCommand_Substitute_Arg_Flag contained + \ /[lnp]/ + \ skipnl + \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count + +" repeat last s command +" BSD/GNU extension + +syn match edCommand_Substitute contained + \ /s\%(\%([gpr]\|\d\+\)\{1,4}\&\%(.*\([gpr]\).*\1\)\@!\&\%(.*\d\D\+\d\)\@!.*\)\>/ + \ contains=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count + +syn match edCommand_Substitute_Arg_Flag contained + \ /r/ + \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count + +" Copy Command {{{2 +syn match edCommand_Copy contained + \ /t/ + "\ GNU extension + \ skipwhite + \ nextgroup=@edAddress,edAddressSeparator,@edCommandPrint + +" TODO: maybe implement as a region so that the command list is contained? +" Global Not-Matched Command {{{2 +syn match edCommand_GlobalNotMatched contained + \ /v/ + \ nextgroup=edCommand_GlobalNotMatched_Arg_Regexp +syn region edCommand_GlobalNotMatched_Arg_Regexp contained + \ matchgroup=Delimiter + \ start=/\z([^\\ \n]\)/ + \ end=/\z1\|$/ + \ skipwhite + \ nextgroup=@edAddress, + \ edAddressSeparator, + \ @edCommand, + \ edCommand_GlobalNotMatched_Arg_Regexp_Flag + \ contains=edRegex_EscapeSequence,edRegex_BracketExpression + +" GNU extension +syn match edCommand_GlobalNotMatched_Arg_Regexp_Flag contained + \ /[^\\ \n]\@1<=I/ + \ skipwhite + \ nextgroup=@edAddress,edAddressSeparator,@edCommand + +" Interactive Global Not-Matched Command {{{2 +syn match edCommand_InteractiveGlobalNotMatched contained + \ /V/ + \ nextgroup=edCommand_InteractiveGlobalNotMatched_Arg_Regexp +syn region edCommand_InteractiveGlobalNotMatched_Arg_Regexp contained + \ matchgroup=Delimiter + \ start=/\z([^\\ \n]\)/ + \ end=/\z1\|$/ + \ nextgroup=edCommand_InteractiveGlobalNotMatched_Arg_Regexp_Flag + \ contains=edRegex_EscapeSequence,edRegex_BracketExpression + +" GNU extension +syn match edCommand_InteractiveGlobalNotMatched_Arg_Regexp_Flag contained + \ /[^\\ \n]\@1<=I/ + +" Write Command {{{2 +syn match edCommand_Write contained + \ /w\>/ + \ skipwhite + \ nextgroup=edArg_File,edCommand_ShellEscape + +" Write Append Command {{{2 +" BSD/GNU extension +syn match edCommand_WriteAppend contained + \ /W\>/ + \ skipwhite + \ nextgroup=edArg_File,edCommand_ShellEscape + +" Write Quit Command {{{2 +" BSD/GNU extension +syn match edCommand_WriteQuit contained + \ /wq\>/ + \ skipwhite + \ nextgroup=edArg_File,edCommand_ShellEscape + +" Paste Cut Buffer Command {{{2 +" GNU extension +syn match edCommand_Paste contained + \ /x/ + \ nextgroup=@edCommandPrint + +" Yank Cut Buffer Command {{{2 +" GNU extension +syn match edCommand_Yank contained + \ /y/ + \ nextgroup=@edCommandPrint + +" Scroll Command {{{2 +" BSD/GNU extension +syn match edCommand_Scroll contained + \ /z/ + \ nextgroup=edCommand_Scroll_Arg_Count,@edCommandPrint +syn match edCommand_Scroll_Arg_Count contained + \ /\d\+/ + \ nextgroup=@edCommandPrint + +" Line Number Command {{{2 +syn match edCommand_LineNumber contained + \ /=/ + \ nextgroup=@edCommandPrint +" }}} + +" no address prefix commands + +" Edit Command {{{2 +syn match edCommand_Edit contained + \ /\/ + \ skipwhite + \ nextgroup=edArg_File,edCommand_ShellEscape + +" Edit Without Checking Command {{{2 +syn match edCommand_EditWithoutChecking contained + \ /\/ + \ skipwhite + \ nextgroup=edArg_File,edCommand_ShellEscape + +" Filename Command {{{2 +syn match edCommand_Filename contained + \ /\/ + \ skipwhite + \ nextgroup=edArg_File + +" Help Command {{{2 +syn match edCommand_Help contained + \ /\/ + +" Quit Without Checking Command {{{2 +syn match edCommand_QuitWithoutChecking contained + \ /\/ + +" Undo Command {{{2 +syn match edCommand_Undo contained + \ /\#+0#0000e05#ffffff0| |e|d|(|1|)| +0#0000000&@67 +|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |e|d|A|d@1|r|e|s@1|S|e|p|a|r|a|t|o|r| |T|o|d|o| +0#0000000&@26 +@75 +@75 +|#+0#0000e05&| |A|d@1|r|e|s@1|e|s| +0#0000000&@63 +@75 +|.+0#e000002&| +0#0000000&@73 +|$+0#e000002&| +0#0000000&@73 +|4+0#e000002&|2| +0#0000000&@72 +|'+0#e000002&|a| +0#0000000&@72 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@69 +|/+0#e000e06&|f+0#0000000&|o@1| @70 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@69 +|?+0#e000e06&|f+0#0000000&|o@1| @70 +|++0#e000e06&| +0#0000000&@73 +|-+0#e000e06&| +0#0000000&@73 +|++0#e000e06&|4|2| +0#0000000&@71 +|-+0#e000e06&|4|2| +0#0000000&@71 +@75 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_01.dump b/runtime/syntax/testdir/dumps/ed_addresses_01.dump new file mode 100644 index 0000000000..85a6826214 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_01.dump @@ -0,0 +1,20 @@ +|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @70 +|++0#e000e06&| +0#0000000&@73 +|-+0#e000e06&| +0#0000000&@73 +|++0#e000e06&|4|2| +0#0000000&@71 +|-+0#e000e06&|4|2| +0#0000000&@71 +> @74 +|.+0#e000002&|p+0#af5f00255&| +0#0000000&@72 +|$+0#e000002&|p+0#af5f00255&| +0#0000000&@72 +|4+0#e000002&|2|p+0#af5f00255&| +0#0000000&@71 +|'+0#e000002&|a|p+0#af5f00255&| +0#0000000&@71 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@68 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|p+0#af5f00255&| +0#0000000&@68 +|++0#e000e06&|p+0#af5f00255&| +0#0000000&@72 +|-+0#e000e06&|p+0#af5f00255&| +0#0000000&@72 +|++0#e000e06&|4|2|p+0#af5f00255&| +0#0000000&@70 +|-+0#e000e06&|4|2|p+0#af5f00255&| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |p|a|t@1|e|r|n| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54 +@57|1|9|,|0|-|1| @8|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_02.dump b/runtime/syntax/testdir/dumps/ed_addresses_02.dump new file mode 100644 index 0000000000..30ded8bfa6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_02.dump @@ -0,0 +1,20 @@ +|#+0#0000e05#ffffff0| |p|a|t@1|e|r|n| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54 +@75 +|/+0#e000e06&|\+0#0000000&|/|f|o@1|\|/|b|a|r|\|/|/+0#e000e06&| +0#0000000&@60 +|?+0#e000e06&|\+0#0000000&|?|f|o@1|\|?|b|a|r|\|?|?+0#e000e06&| +0#0000000&@60 +|/+0#e000e06&|\+0#0000000&|/|f|o@1|\|/|b|a|r|\|/| @61 +>?+0#e000e06&|\+0#0000000&|?|f|o@1|\|?|b|a|r|\|?| @61 +@75 +|/+0#e000e06&|f+0#0000000&|o@1|[|/|]|b|a|r|/+0#e000e06&| +0#0000000&@63 +|?+0#e000e06&|f+0#0000000&|o@1|[|?|]|b|a|r|?+0#e000e06&| +0#0000000&@63 +|/+0#e000e06&|f+0#0000000&|o@1|[|/|]|b|a|r| @64 +|?+0#e000e06&|f+0#0000000&|o@1|[|?|]|b|a|r| @64 +@75 +@75 +|#+0#0000e05&| |M|o|d|i|f|i|e|r|s| +0#0000000&@63 +@75 +@75 +|#+0#0000e05&| |o|f@1|s|e|t|s| +0#0000000&@65 +@75 +|.+0#e000002&|++0#e000e06&| +0#0000000&@72 +@57|3|7|,|1| @9|1|2|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_03.dump b/runtime/syntax/testdir/dumps/ed_addresses_03.dump new file mode 100644 index 0000000000..69da5fcfa1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_03.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|++0#e000e06&| +0#0000000&@72 +|.+0#e000002&|-+0#e000e06&| +0#0000000&@72 +|.+0#e000002&|++0#e000e06&|4|2| +0#0000000&@70 +|.+0#e000002&|-+0#e000e06&|4|2| +0#0000000&@70 +|.+0#e000002&|++0#e000e06&|4|2|-|4|2| +0#0000000&@67 +>.+0#e000002&|-+0#e000e06&|4|2|+|4|2| +0#0000000&@67 +|.+0#e000002&|++0#e000e06&|-|4|2| +0#0000000&@69 +|.+0#e000002&|-+0#e000e06&|+|4|2| +0#0000000&@69 +|.+0#e000002&|++0#e000e06&|4|2|-| +0#0000000&@69 +|.+0#e000002&|-+0#e000e06&|4|2|+| +0#0000000&@69 +|.+0#e000002&|4+0#e000e06&|2|+|-| +0#0000000&@69 +|.+0#e000002&|4+0#e000e06&|2|-|+| +0#0000000&@69 +@75 +|$+0#e000002&|++0#e000e06&| +0#0000000&@72 +|$+0#e000002&|-+0#e000e06&| +0#0000000&@72 +|$+0#e000002&|++0#e000e06&|4|2| +0#0000000&@70 +|$+0#e000002&|-+0#e000e06&|4|2| +0#0000000&@70 +|$+0#e000002&|++0#e000e06&|4|2|-|4|2| +0#0000000&@67 +|$+0#e000002&|-+0#e000e06&|4|2|+|4|2| +0#0000000&@67 +@57|5@1|,|1| @9|1|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_04.dump b/runtime/syntax/testdir/dumps/ed_addresses_04.dump new file mode 100644 index 0000000000..5df0460c8c --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_04.dump @@ -0,0 +1,20 @@ +|$+0#e000002#ffffff0|-+0#e000e06&|4|2|+|4|2| +0#0000000&@67 +|$+0#e000002&|++0#e000e06&|-|4|2| +0#0000000&@69 +|$+0#e000002&|-+0#e000e06&|+|4|2| +0#0000000&@69 +|$+0#e000002&|++0#e000e06&|4|2|-| +0#0000000&@69 +|$+0#e000002&|-+0#e000e06&|4|2|+| +0#0000000&@69 +>$+0#e000002&|4+0#e000e06&|2|+|-| +0#0000000&@69 +|$+0#e000002&|4+0#e000e06&|2|-|+| +0#0000000&@69 +@75 +|4+0#e000002&|2|++0#e000e06&| +0#0000000&@71 +|4+0#e000002&|2|-+0#e000e06&| +0#0000000&@71 +|4+0#e000002&|2|++0#e000e06&|4|2| +0#0000000&@69 +|4+0#e000002&|2|-+0#e000e06&|4|2| +0#0000000&@69 +|4+0#e000002&|2|++0#e000e06&|4|2|-|4|2| +0#0000000&@66 +|4+0#e000002&|2|-+0#e000e06&|4|2|+|4|2| +0#0000000&@66 +|4+0#e000002&|2|++0#e000e06&|-|4|2| +0#0000000&@68 +|4+0#e000002&|2|-+0#e000e06&|+|4|2| +0#0000000&@68 +|4+0#e000002&|2|++0#e000e06&|4|2|-| +0#0000000&@68 +|4+0#e000002&|2|-+0#e000e06&|4|2|+| +0#0000000&@68 +|4+0#e000002&|2| +0#0000000&|4+0#e000e06&|2|+|-| +0#0000000&@67 +@57|7|3|,|1| @9|2|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_05.dump b/runtime/syntax/testdir/dumps/ed_addresses_05.dump new file mode 100644 index 0000000000..0dc85e759b --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_05.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2| +0#0000000&|4+0#e000e06&|2|+|-| +0#0000000&@67 +|4+0#e000002&|2| +0#0000000&|4+0#e000e06&|2|-|+| +0#0000000&@67 +@75 +|'+0#e000002&|a|++0#e000e06&| +0#0000000&@71 +|'+0#e000002&|a|-+0#e000e06&| +0#0000000&@71 +>'+0#e000002&|a|++0#e000e06&|4|2| +0#0000000&@69 +|'+0#e000002&|a|-+0#e000e06&|4|2| +0#0000000&@69 +|'+0#e000002&|a|++0#e000e06&|4|2|-|4|2| +0#0000000&@66 +|'+0#e000002&|a|-+0#e000e06&|4|2|+|4|2| +0#0000000&@66 +|'+0#e000002&|a|++0#e000e06&|-|4|2| +0#0000000&@68 +|'+0#e000002&|a|-+0#e000e06&|+|4|2| +0#0000000&@68 +|'+0#e000002&|a|++0#e000e06&|4|2|-| +0#0000000&@68 +|'+0#e000002&|a|-+0#e000e06&|4|2|+| +0#0000000&@68 +|'+0#e000002&|a|4+0#e000e06&|2|+|-| +0#0000000&@68 +|'+0#e000002&|a|4+0#e000e06&|2|-|+| +0#0000000&@68 +@75 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+| +0#0000000&@68 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-| +0#0000000&@68 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66 +@57|9|1|,|1| @9|3@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_06.dump b/runtime/syntax/testdir/dumps/ed_addresses_06.dump new file mode 100644 index 0000000000..5544a9a66e --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_06.dump @@ -0,0 +1,20 @@ +|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2| +0#0000000&@66 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|-|4|2| +0#0000000&@65 +>/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|+|4|2| +0#0000000&@65 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2|-| +0#0000000&@65 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2|+| +0#0000000&@65 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2|+|-| +0#0000000&@65 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2|-|+| +0#0000000&@65 +@75 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+| +0#0000000&@68 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-| +0#0000000&@68 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2| +0#0000000&@66 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2| +0#0000000&@66 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|-|4|2| +0#0000000&@65 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65 +@57|1|0|9|,|1| @8|4|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_07.dump b/runtime/syntax/testdir/dumps/ed_addresses_07.dump new file mode 100644 index 0000000000..6baee89ba4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_07.dump @@ -0,0 +1,20 @@ +|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2|-| +0#0000000&@65 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2|+| +0#0000000&@65 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2|+|-| +0#0000000&@65 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2|-|+| +0#0000000&@65 +> @74 +|#+0#0000e05&| |c|o|u|n|t|s| +0#0000000&@66 +@75 +|.+0#e000002&|4+0#e000e06&|2| +0#0000000&@71 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2| +0#0000000&@67 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2| +0#0000000&@67 +@75 +|#+0#0000e05&| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@62 +@75 +|.+0#e000002&| +0#0000000&|-+0#e000e06&| |+| |-|4|2| +0#0000000&|++0#e000e06&|4|2| +0#0000000&|4+0#e000e06&|2| +0#0000000&|4+0#e000e06&|2| +0#0000000&|-+0#e000e06&| |4|2| +0#0000000&|++0#e000e06&| |4|2| +0#0000000&@45 +@75 +@75 +|#+0#0000e05&| |R|a|n|g|e|s| +0#0000000&@66 +@75 +@57|1|2|7|,|0|-|1| @6|4|7|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_08.dump b/runtime/syntax/testdir/dumps/ed_addresses_08.dump new file mode 100644 index 0000000000..5ce19ca6b3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_08.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|,+0#0000001#ffff4012| +0#0000000#ffffff0@73 +|;+0#0000001#ffff4012| +0#0000000#ffffff0@73 +@75 +|,+0#0000001#ffff4012@1| +0#0000000#ffffff0@72 +>;+0#0000001#ffff4012@1| +0#0000000#ffffff0@72 +|,+0#0000001#ffff4012|;| +0#0000000#ffffff0@72 +|;+0#0000001#ffff4012|,| +0#0000000#ffffff0@72 +@75 +|,+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@72 +|,+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@72 +|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@71 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@71 +|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@68 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 +|,+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@72 +|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72 +@57|1|4|5|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_09.dump b/runtime/syntax/testdir/dumps/ed_addresses_09.dump new file mode 100644 index 0000000000..419467a93e --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_09.dump @@ -0,0 +1,20 @@ +|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72 +|,+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@70 +|,+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@70 +@75 +|;+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@72 +>;+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@72 +|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@71 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@71 +|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 +|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@68 +|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 +|;+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@72 +|;+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72 +|;+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@70 +|;+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@70 +@75 +|.+0#e000002&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|$+0#e000002&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 +@57|1|6|3|,|1| @8|6|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_10.dump b/runtime/syntax/testdir/dumps/ed_addresses_10.dump new file mode 100644 index 0000000000..ddc9d9c175 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_10.dump @@ -0,0 +1,20 @@ +|$+0#e000002#ffffff0|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|4+0#e000002&|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@71 +|'+0#e000002&|a|,+0#0000001#ffff4012| +0#0000000#ffffff0@71 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68 +>++0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|-+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|++0#e000e06&|4|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@70 +|-+0#e000e06&|4|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@70 +@75 +|.+0#e000002&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|$+0#e000002&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|4+0#e000002&|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@71 +|'+0#e000002&|a|;+0#0000001#ffff4012| +0#0000000#ffffff0@71 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|++0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|-+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 +|++0#e000e06&|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70 +@57|1|8|1|,|1| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_11.dump b/runtime/syntax/testdir/dumps/ed_addresses_11.dump new file mode 100644 index 0000000000..dc28282211 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_11.dump @@ -0,0 +1,20 @@ +|++0#e000e06#ffffff0|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70 +|-+0#e000e06&|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70 +@75 +|.+0#e000002&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|$+0#e000002&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 +|'+0#e000002&|a|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|++0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|-+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|++0#e000e06&|4|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 +|-+0#e000e06&|4|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 +@75 +|4+0#e000002&|2|,+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|,+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 +|4+0#e000002&|2|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@69 +|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66 +@57|1|9@1|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_12.dump b/runtime/syntax/testdir/dumps/ed_addresses_12.dump new file mode 100644 index 0000000000..92011c70fa --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_12.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 +|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 +|4+0#e000002&|2|,+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@70 +>4+0#e000002&|2|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|,+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@68 +@75 +|.+0#e000002&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|$+0#e000002&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|4+0#e000002&|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 +|'+0#e000002&|a|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|++0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|-+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 +|++0#e000e06&|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 +|-+0#e000e06&|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 +@57|2|1|7|,|1| @8|8|2|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_13.dump b/runtime/syntax/testdir/dumps/ed_addresses_13.dump new file mode 100644 index 0000000000..e377448054 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_13.dump @@ -0,0 +1,20 @@ +|-+0#e000e06#ffffff0|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 +@75 +|4+0#e000002&|2|;+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|;+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 +>4+0#e000002&|2|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@69 +|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 +|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 +|4+0#e000002&|2|;+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|;+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@70 +|4+0#e000002&|2|;+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@68 +|4+0#e000002&|2|;+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@68 +@75 +@75 +|#+0#0000e05&| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@62 +@75 +|.+0#e000002&| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|.+0#e000002&| +0#0000000&@65 +@57|2|3|5|,|1| @8|8|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_14.dump b/runtime/syntax/testdir/dumps/ed_addresses_14.dump new file mode 100644 index 0000000000..142f98eeaa --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_14.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|.+0#e000002&| +0#0000000&@65 +|$+0#e000002&| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|$+0#e000002&| +0#0000000&@65 +|4+0#e000002&|2| +0#0000000&@3|,+0#0000001#ffff4012| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&@64 +|'+0#e000002&|a| +0#0000000&@3|,+0#0000001#ffff4012| +0#0000000#ffffff0|'+0#e000002&|a| +0#0000000&@64 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@61 +>?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1| @62 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1| @62 +|++0#e000e06&| @4|,+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&| +0#0000000&@65 +|-+0#e000e06&| @4|,+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&| +0#0000000&@65 +|++0#e000e06&|4|2| +0#0000000&@2|,+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&|4|2| +0#0000000&@63 +|-+0#e000e06&|4|2| +0#0000000&@2|,+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&|4|2| +0#0000000&@63 +@75 +|.+0#e000002&| +0#0000000&@4|;+0#0000001#ffff4012| +0#0000000#ffffff0|.+0#e000002&| +0#0000000&@65 +|$+0#e000002&| +0#0000000&@4|;+0#0000001#ffff4012| +0#0000000#ffffff0|$+0#e000002&| +0#0000000&@65 +|4+0#e000002&|2| +0#0000000&@3|;+0#0000001#ffff4012| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&@64 +|'+0#e000002&|a| +0#0000000&@3|;+0#0000001#ffff4012| +0#0000000#ffffff0|'+0#e000002&|a| +0#0000000&@64 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@61 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61 +@57|2|5|3|,|1| @8|9|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_15.dump b/runtime/syntax/testdir/dumps/ed_addresses_15.dump new file mode 100644 index 0000000000..eab6c80cc0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_addresses_15.dump @@ -0,0 +1,20 @@ +|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61 +|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1| @62 +|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1| @62 +|++0#e000e06&| @4|;+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&| +0#0000000&@65 +|-+0#e000e06&| @4|;+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&| +0#0000000&@65 +>++0#e000e06&|4|2| +0#0000000&@2|;+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&|4|2| +0#0000000&@63 +|-+0#e000e06&|4|2| +0#0000000&@2|;+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&|4|2| +0#0000000&@63 +@75 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|2|7|1|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/dumps/ed_commands_00.dump b/runtime/syntax/testdir/dumps/ed_commands_00.dump new file mode 100644 index 0000000000..221f1100c5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_00.dump @@ -0,0 +1,20 @@ +>#+0#0000e05#ffffff0| |e|d|(|1|)| |c|o|m@1|a|n|d|s| +0#0000000&@58 +@75 +@75 +|#+0#0000e05&| |A|p@1|e|n|d| |C|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|a+0#af5f00255&| +0#0000000&@73 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|a+0#af5f00255&| +0#0000000&@73 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|a+0#af5f00255&| +0#0000000&@73 +|l|i|n|e| |1| @68 +|l|i|n|e| |2| @68 +|l|i|n|e| |3| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/ed_commands_01.dump b/runtime/syntax/testdir/dumps/ed_commands_01.dump new file mode 100644 index 0000000000..4c817331ae --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_01.dump @@ -0,0 +1,20 @@ +|a+0#af5f00255#ffffff0| +0#0000000&@73 +|l|i|n|e| |1| @68 +|l|i|n|e| |2| @68 +|l|i|n|e| |3| @68 +|.+0#af5f00255&| +0#0000000&@73 +> @74 +|a+0#af5f00255&|n| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|a+0#af5f00255&|l| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|a+0#af5f00255&|p| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|.+0#e000002&|a+0#af5f00255&| +0#0000000&@72 +@57|1|9|,|0|-|1| @8|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_02.dump b/runtime/syntax/testdir/dumps/ed_commands_02.dump new file mode 100644 index 0000000000..1eec762f79 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_02.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|a+0#af5f00255&| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +> @74 +|a+0#af5f00255&|l|n|p| +0#0000000&@70 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1| @68 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +@57|3|7|,|0|-|1| @8|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_03.dump b/runtime/syntax/testdir/dumps/ed_commands_03.dump new file mode 100644 index 0000000000..961ad63e62 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_03.dump @@ -0,0 +1,20 @@ +|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +>l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&|\+0#e000e06&| +0#0000000&@72 +|p+0#af5f00255&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&| +0#0000000&@73 +@75 +|#+0#0000e05&| |C|h|a|n|g|e| |C|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|c+0#af5f00255&| +0#0000000&@73 +|.+0#af5f00255&| +0#0000000&@73 +@75 +@57|5@1|,|1| @10|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_04.dump b/runtime/syntax/testdir/dumps/ed_commands_04.dump new file mode 100644 index 0000000000..d94fb91a1f --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_04.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|c+0#af5f00255&| +0#0000000&@73 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +>c+0#af5f00255&| +0#0000000&@73 +|l|i|n|e| |1| @68 +|l|i|n|e| |2| @68 +|l|i|n|e| |3| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|c+0#af5f00255&|n| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|c+0#af5f00255&|l| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +@57|7|3|,|1| @10|8|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_05.dump b/runtime/syntax/testdir/dumps/ed_commands_05.dump new file mode 100644 index 0000000000..716a2b23c0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_05.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|c+0#af5f00255&|p| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +>.+0#e000002&|,+0#0000000&|.+0#e000002&|c+0#af5f00255&| +0#0000000&@70 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|c+0#af5f00255&|l|n|p| +0#0000000&@70 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +@57|9|1|,|1| @9|1|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_06.dump b/runtime/syntax/testdir/dumps/ed_commands_06.dump new file mode 100644 index 0000000000..892b101516 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_06.dump @@ -0,0 +1,20 @@ +|.+0#af5f00255#ffffff0| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1| @68 +@75 +>g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&|\+0#e000e06&| +0#0000000&@72 +|p+0#af5f00255&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&| +0#0000000&@73 +@75 +@75 +@57|1|0|9|,|1| @8|1|2|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_07.dump b/runtime/syntax/testdir/dumps/ed_commands_07.dump new file mode 100644 index 0000000000..2958d95294 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_07.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|#+0#0000e05&| |D|e|l|e|t|e| |C|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|d+0#af5f00255&| +0#0000000&@73 +>.+0#e000002&|,+0#0000000&|.+0#e000002&|d+0#af5f00255&| +0#0000000&@70 +@75 +|d+0#af5f00255&|l| +0#0000000&@72 +|d+0#af5f00255&|n| +0#0000000&@72 +|d+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|d+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |E|d|i|t| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +@57|1|2|7|,|1| @8|1|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_08.dump b/runtime/syntax/testdir/dumps/ed_commands_08.dump new file mode 100644 index 0000000000..c0ac47b26a --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_08.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|e+0#af5f00255&| +0#0000000&@73 +|e+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64 +@75 +|e+0#af5f00255&| +0#0000000&|!+0#af5f00255&|e+0#0000000&|c|h|o| |I|n|p|u|t| |t|e|x|t| @56 +>e+0#af5f00255&| +0#0000000&|!+0#af5f00255&|!+0#e000002&| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |E|d|i|t| |W|i|t|h|o|u|t| |C|h|e|c|k|i|n|g| |C|o|m@1|a|n|d| +0#0000000&@43 +@75 +@75 +|E+0#af5f00255&| +0#0000000&@73 +|E+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64 +@75 +@75 +|#+0#0000e05&| |F|i|l|e|n|a|m|e| |C|o|m@1|a|n|d| +0#0000000&@56 +@75 +@75 +|f+0#af5f00255&| +0#0000000&@73 +@57|1|4|5|,|1| @8|1|7|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_09.dump b/runtime/syntax/testdir/dumps/ed_commands_09.dump new file mode 100644 index 0000000000..2a38adaf16 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_09.dump @@ -0,0 +1,20 @@ +|f+0#af5f00255#ffffff0| +0#0000000&@73 +|f+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64 +@75 +@75 +|#+0#0000e05&| |G|l|o|b|a|l| |C|o|m@1|a|n|d| +0#0000000&@58 +> @74 +@75 +|g+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 +|g+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +@75 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +@75 +|g+0#af5f00255&|/+0#e000e06&@1|p+0#af5f00255&| +0#0000000&@70 +|g+0#af5f00255&|/+0#e000e06&@1|\| +0#0000000&@70 +@57|1|6|3|,|0|-|1| @6|1|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_10.dump b/runtime/syntax/testdir/dumps/ed_commands_10.dump new file mode 100644 index 0000000000..bb46632b2a --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_10.dump @@ -0,0 +1,20 @@ +|g+0#af5f00255#ffffff0|/+0#e000e06&@1|\| +0#0000000&@70 +|p+0#af5f00255&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&@1|l+0#af5f00255&|\+0#e000e06&| +0#0000000&@69 +|n+0#af5f00255&|\+0#e000e06&| +0#0000000&@72 +>p+0#af5f00255&| +0#0000000&@73 +|g+0#af5f00255&|/+0#e000e06&@1|\| +0#0000000&@70 +|l+0#af5f00255&|\+0#e000e06&| +0#0000000&@72 +|n+0#af5f00255&|\+0#e000e06&| +0#0000000&@72 +|p+0#af5f00255&| +0#0000000&@73 +@75 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@64 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@60 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@69 +@75 +@75 +|#+0#0000e05&| |I|n|t|e|r|a|c|t|i|v|e| |G|l|o|b|a|l| |C|o|m@1|a|n|d| +0#0000000&@46 +@75 +@57|1|8|1|,|1| @8|2|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_11.dump b/runtime/syntax/testdir/dumps/ed_commands_11.dump new file mode 100644 index 0000000000..c29b6740fe --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_11.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@75 +|G+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 +|G+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 +|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 +>G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +@75 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +@75 +|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|d+0#af5f00255&| +0#0000000&@73 +|&+0#af5f00255&| +0#0000000&@73 +@75 +@75 +|#+0#0000e05&| |H|e|l|p| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@57|1|9@1|,|1| @8|2|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_12.dump b/runtime/syntax/testdir/dumps/ed_commands_12.dump new file mode 100644 index 0000000000..1214b254de --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_12.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|h+0#af5f00255&| +0#0000000&@73 +@75 +|h+0#af5f00255&|l| +0#0000000&@72 +|h+0#af5f00255&|n| +0#0000000&@72 +>h+0#af5f00255&|p| +0#0000000&@72 +@75 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|h+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |H|e|l|p| |M|o|d|e| |C|o|m@1|a|n|d| +0#0000000&@55 +@75 +|H+0#af5f00255&| +0#0000000&@73 +@75 +|H+0#af5f00255&|l| +0#0000000&@72 +|H+0#af5f00255&|n| +0#0000000&@72 +@57|2|1|7|,|1| @8|2|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_13.dump b/runtime/syntax/testdir/dumps/ed_commands_13.dump new file mode 100644 index 0000000000..f913ce5f6b --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_13.dump @@ -0,0 +1,20 @@ +|H+0#af5f00255#ffffff0|n| +0#0000000&@72 +|H+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +>H+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |I|n|s|e|r|t| |C|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|i+0#af5f00255&| +0#0000000&@73 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|i+0#af5f00255&| +0#0000000&@73 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|i+0#af5f00255&| +0#0000000&@73 +@57|2|3|5|,|1| @8|2|8|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_14.dump b/runtime/syntax/testdir/dumps/ed_commands_14.dump new file mode 100644 index 0000000000..fd78cc80f4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_14.dump @@ -0,0 +1,20 @@ +|i+0#af5f00255#ffffff0| +0#0000000&@73 +|l|i|n|e| |1| @68 +|l|i|n|e| |2| @68 +|l|i|n|e| |3| @68 +|.+0#af5f00255&| +0#0000000&@73 +> @74 +|i+0#af5f00255&|n| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|i+0#af5f00255&|l| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|i+0#af5f00255&|p| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|.+0#e000002&|i+0#af5f00255&| +0#0000000&@72 +@57|2|5|3|,|0|-|1| @6|3|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_15.dump b/runtime/syntax/testdir/dumps/ed_commands_15.dump new file mode 100644 index 0000000000..94202461f4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_15.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|i+0#af5f00255&| +0#0000000&@72 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +> @74 +|i+0#af5f00255&|l|n|p| +0#0000000&@70 +|l|i|n|e| |1| @68 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1| @68 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +@57|2|7|1|,|0|-|1| @6|3|2|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_16.dump b/runtime/syntax/testdir/dumps/ed_commands_16.dump new file mode 100644 index 0000000000..08fd835400 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_16.dump @@ -0,0 +1,20 @@ +|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +>l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&|\+0#e000e06&| +0#0000000&@72 +|p+0#af5f00255&| +0#0000000&@73 +@75 +|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 +|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 +|.+0#e000002&| +0#0000000&@73 +@75 +@75 +|#+0#0000e05&| |J|o|i|n| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|j+0#af5f00255&| +0#0000000&@73 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|++0#e000e06&|1|j+0#af5f00255&| +0#0000000&@68 +@57|2|8|9|,|1| @8|3|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_17.dump b/runtime/syntax/testdir/dumps/ed_commands_17.dump new file mode 100644 index 0000000000..d5007afc8b --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_17.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|,+0#0000000&|.+0#e000002&|++0#e000e06&|1|j+0#af5f00255&| +0#0000000&@68 +@75 +|j+0#af5f00255&|l| +0#0000000&@72 +|j+0#af5f00255&|n| +0#0000000&@72 +|j+0#af5f00255&|p| +0#0000000&@72 +> @74 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|j+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |M|a|r|k| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|k+0#af5f00255&|a+0#e000002&| +0#0000000&@72 +|.+0#e000002&|k+0#af5f00255&|a+0#e000002&| +0#0000000&@71 +@75 +|k+0#af5f00255&|a+0#e000002&|l+0#af5f00255&| +0#0000000&@71 +|k+0#af5f00255&|a+0#e000002&|n+0#af5f00255&| +0#0000000&@71 +@57|3|0|7|,|0|-|1| @6|3|7|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_18.dump b/runtime/syntax/testdir/dumps/ed_commands_18.dump new file mode 100644 index 0000000000..8fdcc486af --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_18.dump @@ -0,0 +1,20 @@ +|k+0#af5f00255#ffffff0|a+0#e000002&|n+0#af5f00255&| +0#0000000&@71 +|k+0#af5f00255&|a+0#e000002&|p+0#af5f00255&| +0#0000000&@71 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +>k+0#af5f00255&|a+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69 +@75 +@75 +|#+0#0000e05&| |L|i|s|t| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|l+0#af5f00255&| +0#0000000&@73 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|l+0#af5f00255&| +0#0000000&@70 +@75 +|l+0#af5f00255&@1| +0#0000000&@72 +|l+0#af5f00255&|n| +0#0000000&@72 +|l+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@57|3|2|5|,|1| @8|3|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_19.dump b/runtime/syntax/testdir/dumps/ed_commands_19.dump new file mode 100644 index 0000000000..d9ba8fef7f --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_19.dump @@ -0,0 +1,20 @@ +|#+0#0000e05#ffffff0| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|l+0#af5f00255&@1|n|p| +0#0000000&@70 +@75 +@75 +>#+0#0000e05&| |M|o|v|e| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|m+0#af5f00255&|$+0#e000002&| +0#0000000&@72 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|$+0#e000002&| +0#0000000&@69 +@75 +|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61 +@75 +|m+0#af5f00255&|l| +0#0000000&@72 +|m+0#af5f00255&|n| +0#0000000&@72 +|m+0#af5f00255&|p| +0#0000000&@72 +@75 +|m+0#af5f00255&|$+0#e000002&|l+0#af5f00255&| +0#0000000&@71 +@57|3|4|3|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_20.dump b/runtime/syntax/testdir/dumps/ed_commands_20.dump new file mode 100644 index 0000000000..2550a648ce --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_20.dump @@ -0,0 +1,20 @@ +|m+0#af5f00255#ffffff0|$+0#e000002&|l+0#af5f00255&| +0#0000000&@71 +|m+0#af5f00255&|$+0#e000002&|n+0#af5f00255&| +0#0000000&@71 +|m+0#af5f00255&|$+0#e000002&|p+0#af5f00255&| +0#0000000&@71 +@75 +|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63 +>m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63 +|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|m+0#af5f00255&|l|n|p| +0#0000000&@70 +|m+0#af5f00255&|$+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69 +|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61 +@75 +@75 +|#+0#0000e05&| |N|u|m|b|e|r| |C|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|n+0#af5f00255&| +0#0000000&@73 +@57|3|6|1|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_21.dump b/runtime/syntax/testdir/dumps/ed_commands_21.dump new file mode 100644 index 0000000000..89c28320fa --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_21.dump @@ -0,0 +1,20 @@ +|n+0#af5f00255#ffffff0| +0#0000000&@73 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|n+0#af5f00255&| +0#0000000&@70 +@75 +|n+0#af5f00255&|l| +0#0000000&@72 +|n+0#af5f00255&@1| +0#0000000&@72 +>n+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|n+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |P|r|i|n|t| |C|o|m@1|a|n|d| +0#0000000&@59 +@75 +@75 +|p+0#af5f00255&| +0#0000000&@73 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|p+0#af5f00255&| +0#0000000&@70 +@75 +|p+0#af5f00255&|l| +0#0000000&@72 +@57|3|7|9|,|1| @8|4|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_22.dump b/runtime/syntax/testdir/dumps/ed_commands_22.dump new file mode 100644 index 0000000000..ab363773d2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_22.dump @@ -0,0 +1,20 @@ +|p+0#af5f00255#ffffff0|l| +0#0000000&@72 +|p+0#af5f00255&|n| +0#0000000&@72 +|p+0#af5f00255&@1| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +> @74 +|p+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |P|r|o|m|p|t| |C|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|P+0#af5f00255&| +0#0000000&@73 +@75 +|P+0#af5f00255&|l| +0#0000000&@72 +|P+0#af5f00255&|n| +0#0000000&@72 +|P+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@57|3|9|7|,|0|-|1| @6|4|8|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_23.dump b/runtime/syntax/testdir/dumps/ed_commands_23.dump new file mode 100644 index 0000000000..0af8cb669d --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_23.dump @@ -0,0 +1,20 @@ +|#+0#0000e05#ffffff0| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|P+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +>#+0#0000e05&| |Q|u|i|t| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|q+0#af5f00255&| +0#0000000&@73 +@75 +@75 +|#+0#0000e05&| |Q|u|i|t| |W|i|t|h|o|u|t| |C|h|e|c|k|i|n|g| |C|o|m@1|a|n|d| +0#0000000&@43 +@75 +|Q+0#af5f00255&| +0#0000000&@73 +@75 +@75 +|#+0#0000e05&| |R|e|a|d| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +|r+0#af5f00255&| +0#0000000&@73 +@57|4|1|5|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_24.dump b/runtime/syntax/testdir/dumps/ed_commands_24.dump new file mode 100644 index 0000000000..34560f697f --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_24.dump @@ -0,0 +1,20 @@ +|r+0#af5f00255#ffffff0| +0#0000000&@73 +|r+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64 +|$+0#e000002&|r+0#af5f00255&| +0#0000000&@72 +|$+0#e000002&|r+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @63 +@75 +>r+0#af5f00255&| +0#0000000&|!+0#af5f00255&|e+0#0000000&|c|h|o| |I|n|p|u|t| |t|e|x|t| @56 +|r+0#af5f00255&| +0#0000000&|!+0#af5f00255&|!+0#e000002&| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |S|u|b|s|t|i|t|u|t|e| |C|o|m@1|a|n|d| +0#0000000&@54 +@75 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@61 +@75 +|s+0#af5f00255&|/+0#e000e06&@1|b+0#0000000&|a|r| @68 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|b|a|z| @62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 +@57|4|3@1|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_25.dump b/runtime/syntax/testdir/dumps/ed_commands_25.dump new file mode 100644 index 0000000000..6de5a8d2ef --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_25.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 +|b|a|z| @71 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 +|b|a|z|/+0#e000e06&| +0#0000000&@70 +@75 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|b+0#0000000&|a|z| @61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63 +|b|a|z| @71 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63 +|b|a|z|/+0#e000e06&| +0#0000000&@70 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%| +0#0000000&@67 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%|/| +0#0000000&@66 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\|%| +0#0000000&@66 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\|%|/| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&@1| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&@1|/+0#e000e06&| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a| @66 +@57|4|5|1|,|1| @8|5@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_26.dump b/runtime/syntax/testdir/dumps/ed_commands_26.dump new file mode 100644 index 0000000000..eb0abdab1b --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_26.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|/+0#e000e06&| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#0000000&|%| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#0000000&|%|/+0#e000e06&| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|%| @65 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|%|/+0#e000e06&| +0#0000000&@64 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|2|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|3|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|4|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|5|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|6|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|7|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|8|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|9|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|0+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +@57|4|6|9|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_27.dump b/runtime/syntax/testdir/dumps/ed_commands_27.dump new file mode 100644 index 0000000000..3d6656c14b --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_27.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|2+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|3+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|4+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|5+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|6+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|7+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|8+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|9+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +@75 +@75 +|#+0#0000e05&| |f|l|a|g|s| +0#0000000&@67 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62 +@57|4|8|7|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_28.dump b/runtime/syntax/testdir/dumps/ed_commands_28.dump new file mode 100644 index 0000000000..55b31f8eaa --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_28.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61 +@57|5|0|5|,|1| @8|6|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_29.dump b/runtime/syntax/testdir/dumps/ed_commands_29.dump new file mode 100644 index 0000000000..61aa012142 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_29.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 +@57|5|2|3|,|1| @8|6|4|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_30.dump b/runtime/syntax/testdir/dumps/ed_commands_30.dump new file mode 100644 index 0000000000..b8cfdfea66 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_30.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l|p| +0#0000000&@60 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60 +@57|5|4|1|,|1| @8|6@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_31.dump b/runtime/syntax/testdir/dumps/ed_commands_31.dump new file mode 100644 index 0000000000..b481c08832 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_31.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g|n| +0#0000000&@60 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|g| +0#0000000&@60 +@75 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62 +@57|5@1|9|,|1| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_32.dump b/runtime/syntax/testdir/dumps/ed_commands_32.dump new file mode 100644 index 0000000000..1b06960392 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_32.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61 +@57|5|7@1|,|1| @8|7|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_33.dump b/runtime/syntax/testdir/dumps/ed_commands_33.dump new file mode 100644 index 0000000000..99947733a6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_33.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l| +0#0000000&@61 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 +@75 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60 +@57|5|9|5|,|1| @8|7|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_34.dump b/runtime/syntax/testdir/dumps/ed_commands_34.dump new file mode 100644 index 0000000000..ec720d67a3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_34.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n|l| +0#0000000&@60 +>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60 +@57|6|1|3|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_35.dump b/runtime/syntax/testdir/dumps/ed_commands_35.dump new file mode 100644 index 0000000000..eeb50e4a59 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_35.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|3| +0#0000000&@60 +> @74 +@75 +|#+0#0000e05&| |r|e|p|e|a|t| |l|a|s|t| |s|u|b|s|t|i|t|u|t|e| +0#0000000&@50 +@75 +|s+0#af5f00255&|3+0#e000e06&| +0#0000000&@72 +|s+0#af5f00255&|g+0#e000e06&| +0#0000000&@72 +|s+0#af5f00255&|p+0#e000e06&| +0#0000000&@72 +|s+0#af5f00255&|r+0#e000e06&| +0#0000000&@72 +@75 +|s+0#af5f00255&|3+0#e000e06&|g| +0#0000000&@71 +|s+0#af5f00255&|3+0#e000e06&|p| +0#0000000&@71 +|s+0#af5f00255&|3+0#e000e06&|r| +0#0000000&@71 +|s+0#af5f00255&|g+0#e000e06&|3| +0#0000000&@71 +|s+0#af5f00255&|g+0#e000e06&|p| +0#0000000&@71 +@57|6|3|1|,|0|-|1| @6|7@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_36.dump b/runtime/syntax/testdir/dumps/ed_commands_36.dump new file mode 100644 index 0000000000..78bfc763e1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_36.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|g+0#e000e06&|p| +0#0000000&@71 +|s+0#af5f00255&|g+0#e000e06&|r| +0#0000000&@71 +|s+0#af5f00255&|p+0#e000e06&|3| +0#0000000&@71 +|s+0#af5f00255&|p+0#e000e06&|g| +0#0000000&@71 +|s+0#af5f00255&|p+0#e000e06&|r| +0#0000000&@71 +>s+0#af5f00255&|r+0#e000e06&|3| +0#0000000&@71 +|s+0#af5f00255&|r+0#e000e06&|g| +0#0000000&@71 +|s+0#af5f00255&|r+0#e000e06&|p| +0#0000000&@71 +@75 +|s+0#af5f00255&|3+0#e000e06&|g|p| +0#0000000&@70 +|s+0#af5f00255&|3+0#e000e06&|g|r| +0#0000000&@70 +|s+0#af5f00255&|3+0#e000e06&|p|g| +0#0000000&@70 +|s+0#af5f00255&|3+0#e000e06&|p|r| +0#0000000&@70 +|s+0#af5f00255&|3+0#e000e06&|r|g| +0#0000000&@70 +|s+0#af5f00255&|3+0#e000e06&|r|p| +0#0000000&@70 +|s+0#af5f00255&|g+0#e000e06&|3|p| +0#0000000&@70 +|s+0#af5f00255&|g+0#e000e06&|3|r| +0#0000000&@70 +|s+0#af5f00255&|g+0#e000e06&|p|3| +0#0000000&@70 +|s+0#af5f00255&|g+0#e000e06&|p|r| +0#0000000&@70 +@57|6|4|9|,|1| @8|7|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_37.dump b/runtime/syntax/testdir/dumps/ed_commands_37.dump new file mode 100644 index 0000000000..1df42b4cd5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_37.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|g+0#e000e06&|p|r| +0#0000000&@70 +|s+0#af5f00255&|g+0#e000e06&|r|3| +0#0000000&@70 +|s+0#af5f00255&|g+0#e000e06&|r|p| +0#0000000&@70 +|s+0#af5f00255&|p+0#e000e06&|3|g| +0#0000000&@70 +|s+0#af5f00255&|p+0#e000e06&|3|r| +0#0000000&@70 +>s+0#af5f00255&|p+0#e000e06&|g|3| +0#0000000&@70 +|s+0#af5f00255&|p+0#e000e06&|g|r| +0#0000000&@70 +|s+0#af5f00255&|p+0#e000e06&|r|3| +0#0000000&@70 +|s+0#af5f00255&|p+0#e000e06&|r|g| +0#0000000&@70 +|s+0#af5f00255&|r+0#e000e06&|3|g| +0#0000000&@70 +|s+0#af5f00255&|r+0#e000e06&|3|p| +0#0000000&@70 +|s+0#af5f00255&|r+0#e000e06&|g|3| +0#0000000&@70 +|s+0#af5f00255&|r+0#e000e06&|g|p| +0#0000000&@70 +|s+0#af5f00255&|r+0#e000e06&|p|3| +0#0000000&@70 +|s+0#af5f00255&|r+0#e000e06&|p|g| +0#0000000&@70 +@75 +|s+0#af5f00255&|3+0#e000e06&|g|p|r| +0#0000000&@69 +|s+0#af5f00255&|3+0#e000e06&|g|r|p| +0#0000000&@69 +|s+0#af5f00255&|3+0#e000e06&|p|g|r| +0#0000000&@69 +@57|6@1|7|,|1| @8|8|2|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_38.dump b/runtime/syntax/testdir/dumps/ed_commands_38.dump new file mode 100644 index 0000000000..ee3ba0311a --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_38.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|3+0#e000e06&|p|g|r| +0#0000000&@69 +|s+0#af5f00255&|3+0#e000e06&|p|r|g| +0#0000000&@69 +|s+0#af5f00255&|3+0#e000e06&|r|g|p| +0#0000000&@69 +|s+0#af5f00255&|3+0#e000e06&|r|p|g| +0#0000000&@69 +|s+0#af5f00255&|g+0#e000e06&|3|p|r| +0#0000000&@69 +>s+0#af5f00255&|g+0#e000e06&|3|r|p| +0#0000000&@69 +|s+0#af5f00255&|g+0#e000e06&|p|3|r| +0#0000000&@69 +|s+0#af5f00255&|g+0#e000e06&|p|r|3| +0#0000000&@69 +|s+0#af5f00255&|g+0#e000e06&|r|3|p| +0#0000000&@69 +|s+0#af5f00255&|g+0#e000e06&|r|p|3| +0#0000000&@69 +|s+0#af5f00255&|p+0#e000e06&|3|g|r| +0#0000000&@69 +|s+0#af5f00255&|p+0#e000e06&|3|r|g| +0#0000000&@69 +|s+0#af5f00255&|p+0#e000e06&|g|3|r| +0#0000000&@69 +|s+0#af5f00255&|p+0#e000e06&|g|r|3| +0#0000000&@69 +|s+0#af5f00255&|p+0#e000e06&|r|3|g| +0#0000000&@69 +|s+0#af5f00255&|p+0#e000e06&|r|g|3| +0#0000000&@69 +|s+0#af5f00255&|r+0#e000e06&|3|g|p| +0#0000000&@69 +|s+0#af5f00255&|r+0#e000e06&|3|p|g| +0#0000000&@69 +|s+0#af5f00255&|r+0#e000e06&|g|3|p| +0#0000000&@69 +@57|6|8|5|,|1| @8|8|4|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_39.dump b/runtime/syntax/testdir/dumps/ed_commands_39.dump new file mode 100644 index 0000000000..ce953910ed --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_39.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|r+0#e000e06&|g|3|p| +0#0000000&@69 +|s+0#af5f00255&|r+0#e000e06&|g|p|3| +0#0000000&@69 +|s+0#af5f00255&|r+0#e000e06&|p|3|g| +0#0000000&@69 +|s+0#af5f00255&|r+0#e000e06&|p|g|3| +0#0000000&@69 +@75 +>#+0#0000e05&| |r|e|p|e|a|t| |l|a|s|t| |s|u|b|s|t|i|t|u|t|e| |f|l|a|g|s| |a|s| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@30 +@75 +|s+0#af5f00255&|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&| +0#0000000&@64 +@75 +@75 +|#+0#0000e05&| |C|o|p|y| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|t+0#af5f00255&|$+0#e000002&| +0#0000000&@72 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|t+0#af5f00255&|$+0#e000002&| +0#0000000&@69 +@75 +@57|7|0|3|,|1| @8|8|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_40.dump b/runtime/syntax/testdir/dumps/ed_commands_40.dump new file mode 100644 index 0000000000..505c073400 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_40.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61 +@75 +|t+0#af5f00255&|l| +0#0000000&@72 +>t+0#af5f00255&|n| +0#0000000&@72 +|t+0#af5f00255&|p| +0#0000000&@72 +@75 +|t+0#af5f00255&|$+0#e000002&|l+0#af5f00255&| +0#0000000&@71 +|t+0#af5f00255&|$+0#e000002&|n+0#af5f00255&| +0#0000000&@71 +|t+0#af5f00255&|$+0#e000002&|p+0#af5f00255&| +0#0000000&@71 +@75 +|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63 +|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63 +|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|t+0#af5f00255&|l|n|p| +0#0000000&@70 +@57|7|2|1|,|1| @8|8@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_41.dump b/runtime/syntax/testdir/dumps/ed_commands_41.dump new file mode 100644 index 0000000000..5dce3cd831 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_41.dump @@ -0,0 +1,20 @@ +|t+0#af5f00255#ffffff0|l|n|p| +0#0000000&@70 +|t+0#af5f00255&|$+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69 +|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61 +@75 +@75 +>#+0#0000e05&| |U|n|d|o| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|u+0#af5f00255&| +0#0000000&@73 +@75 +|u+0#af5f00255&|l| +0#0000000&@72 +|u+0#af5f00255&|n| +0#0000000&@72 +|u+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|u+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +@57|7|3|9|,|1| @8|9|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_42.dump b/runtime/syntax/testdir/dumps/ed_commands_42.dump new file mode 100644 index 0000000000..d72a8794e6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_42.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|#+0#0000e05&| |G|l|o|b|a|l| |N|o|n|-|M|a|t|c|h|e|d| |C|o|m@1|a|n|d| +0#0000000&@46 +@75 +@75 +|v+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 +>v+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 +|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 +|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +@75 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +@75 +@75 +|#+0#0000e05&| |I|n|t|e|r|a|c|t|i|v|e| |G|l|o|b|a|l| |N|o|n|-|M|a|t|c|h|e|d| |C|o|m@1|a|n|d| +0#0000000&@34 +@75 +@75 +|V+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 +@57|7|5|7|,|1| @8|9|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_43.dump b/runtime/syntax/testdir/dumps/ed_commands_43.dump new file mode 100644 index 0000000000..4b34f8a0e7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_43.dump @@ -0,0 +1,20 @@ +|V+0#af5f00255#ffffff0|/+0#e000e06&| +0#0000000&@72 +|V+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 +|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 +|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +@75 +>1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +@75 +@75 +|#+0#0000e05&| |W|r|i|t|e| |C|o|m@1|a|n|d| +0#0000000&@59 +@75 +@75 +|w+0#af5f00255&| +0#0000000&@73 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|w+0#af5f00255&| +0#0000000&@70 +|w+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|w+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @61 +@75 +@57|7@1|5|,|1| @8|9|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_44.dump b/runtime/syntax/testdir/dumps/ed_commands_44.dump new file mode 100644 index 0000000000..82aeda867f --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_44.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@75 +|#+0#0000e05&| |L|i|n|e| |N|u|m|b|e|r| |C|o|m@1|a|n|d| +0#0000000&@53 +@75 +@75 +>=+0#af5f00255&| +0#0000000&@73 +|$+0#e000002&|=+0#af5f00255&| +0#0000000&@72 +@75 +|=+0#af5f00255&|l| +0#0000000&@72 +|=+0#af5f00255&|n| +0#0000000&@72 +|=+0#af5f00255&|p| +0#0000000&@72 +@75 +|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 +@75 +|=+0#af5f00255&|l|n|p| +0#0000000&@70 +@75 +@75 +|#+0#0000e05&| |S|h|e|l@1| |E|s|c|a|p|e| |C|o|m@1|a|n|d| +0#0000000&@52 +@75 +@57|7|9|3|,|1| @8|9|7|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_45.dump b/runtime/syntax/testdir/dumps/ed_commands_45.dump new file mode 100644 index 0000000000..aca707cf4c --- /dev/null +++ b/runtime/syntax/testdir/dumps/ed_commands_45.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@75 +|!+0#af5f00255&|e+0#0000000&|c|h|o| |"|F|o@1|"| @63 +@75 +|!+0#af5f00255&|!+0#e000002&| +0#0000000&@72 +> @74 +|!+0#af5f00255&|e+0#0000000&|c|h|o| |%+0#e000e06&| +0#0000000&@67 +|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&|%| +0#0000000&@66 +|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&@1|%| +0#0000000&@65 +|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&@2|%| +0#0000000&@64 +|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&@3|%| +0#0000000&@63 +@75 +@75 +|#+0#0000e05&| |N|u|l@1| |C|o|m@1|a|n|d| +0#0000000&@60 +@75 +@75 +|.+0#e000002&|++0#e000e06&|1| +0#0000000&@71 +@75 +@75 +@57|8|1@1|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/input/ed_addresses.ed b/runtime/syntax/testdir/input/ed_addresses.ed new file mode 100644 index 0000000000..c1961e3f1c --- /dev/null +++ b/runtime/syntax/testdir/input/ed_addresses.ed @@ -0,0 +1,274 @@ +# ed(1) +# VIM_TEST_SETUP hi link edAddressSeparator Todo + + +# Addresses + +. +$ +42 +'a +/foo/ +/foo +?foo? +?foo ++ +- ++42 +-42 + +.p +$p +42p +'ap +/foo/p +?foo?p ++p +-p ++42p +-42p + + +# pattern delimiters + +/\/foo\/bar\// +?\?foo\?bar\?? +/\/foo\/bar\/ +?\?foo\?bar\? + +/foo[/]bar/ +?foo[?]bar? +/foo[/]bar +?foo[?]bar + + +# Modifiers + + +# offsets + +.+ +.- +.+42 +.-42 +.+42-42 +.-42+42 +.+-42 +.-+42 +.+42- +.-42+ +.42+- +.42-+ + +$+ +$- +$+42 +$-42 +$+42-42 +$-42+42 +$+-42 +$-+42 +$+42- +$-42+ +$42+- +$42-+ + +42+ +42- +42+42 +42-42 +42+42-42 +42-42+42 +42+-42 +42-+42 +42+42- +42-42+ +42 42+- +42 42-+ + +'a+ +'a- +'a+42 +'a-42 +'a+42-42 +'a-42+42 +'a+-42 +'a-+42 +'a+42- +'a-42+ +'a42+- +'a42-+ + +/foo/+ +/foo/- +/foo/+42 +/foo/-42 +/foo/+42-42 +/foo/-42+42 +/foo/+-42 +/foo/-+42 +/foo/+42- +/foo/-42+ +/foo/42+- +/foo/42-+ + +?foo?+ +?foo?- +?foo?+42 +?foo?-42 +?foo?+42-42 +?foo?-42+42 +?foo?+-42 +?foo?-+42 +?foo?+42- +?foo?-42+ +?foo?42+- +?foo?42-+ + +# counts + +.42 +/foo/42 +?foo?42 + +# whitespace + +. - + -42 +42 42 42 - 42 + 42 + + +# Ranges + +, +; + +,, +;; +,; +;, + +,. +,$ +,42 +,'a +,/foo/ +,/foo +,?foo? +,?foo +,+ +,- +,+42 +,-42 + +;. +;$ +;42 +;'a +;/foo/ +;/foo +;?foo? +;?foo +;+ +;- +;+42 +;-42 + +., +$, +42, +'a, +/foo/, +?foo?, ++, +-, ++42, +-42, + +.; +$; +42; +'a; +/foo/; +?foo?; ++; +-; ++42; +-42; + +.,42 +$,42 +42,42 +'a,42 +/foo/,42 +?foo?,42 ++,42 +-,42 ++42,42 +-42,42 + +42,. +42,$ +42,42 +42,'a +42,/foo/ +42,/foo +42,?foo? +42,?foo +42,+ +42,- +42,+42 +42,-42 + +.;42 +$;42 +42;42 +'a;42 +/foo/;42 +?foo?;42 ++;42 +-;42 ++42;42 +-42;42 + +42;. +42;$ +42;42 +42;'a +42;/foo/ +42;/foo +42;?foo? +42;?foo +42;+ +42;- +42;+42 +42;-42 + + +# whitespace + +. , . +$ , $ +42 , 42 +'a , 'a +/foo/ , /foo/ +?foo? , ?foo? +/foo/ , /foo +?foo? , ?foo ++ , + +- , - ++42 , +42 +-42 , -42 + +. ; . +$ ; $ +42 ; 42 +'a ; 'a +/foo/ ; /foo/ +?foo? ; ?foo? +/foo/ ; /foo +?foo? ; ?foo ++ ; + +- ; - ++42 ; +42 +-42 ; -42 + + diff --git a/runtime/syntax/testdir/input/ed_commands.ed b/runtime/syntax/testdir/input/ed_commands.ed new file mode 100644 index 0000000000..dabf08b7b2 --- /dev/null +++ b/runtime/syntax/testdir/input/ed_commands.ed @@ -0,0 +1,824 @@ +# ed(1) commands + + +# Append Command + + +a +. + +a +line 1 +. + +a +line 1 +line 2 +line 3 +. + +an +line 1 +. + +al +line 1 +. + +ap +line 1 +. + +.a +line 1 +. + +# extensions + +alnp +line 1 +. + +# global subcommand + +g/foo/a\ +. + +g/foo/a\ +line 1 + +g/foo/a\ +line 1\ +. + +g/foo/a\ +line 1\ +.\ +p + +g/foo/al\ +line 1\ +. + +# Change Command + + +c +. + +c +line 1 +. + +c +line 1 +line 2 +line 3 +. + +cn +line 1 +. + +cl +line 1 +. + +cp +line 1 +. + +.,.c +line 1 +. + +# extensions + +clnp +line 1 +. + +# global subcommand + +g/foo/c\ +. + +g/foo/c\ +line 1 + +g/foo/c\ +line 1\ +. + +g/foo/c\ +line 1\ +.\ +p + +g/foo/cl\ +line 1\ +. + + +# Delete Command + + +d +.,.d + +dl +dn +dp + +# extensions + +dlnp + + +# Edit Command + + +e +e filename + +e !echo Input text +e !! + + +# Edit Without Checking Command + + +E +E filename + + +# Filename Command + + +f +f filename + + +# Global Command + + +g/ +g// +g/foo +g/foo/ + +1,$g/ +1,$g// +1,$g/foo +1,$g/foo/ + +g//p +g//\ +p + +g//l\ +n\ +p +g//\ +l\ +n\ +p + +1,$g/foo/p +1,$g/foo/.,+1p +1,$g/foo/\ +.,+1p + + +# Interactive Global Command + + +G/ +G// +G/foo +G/foo/ + +1,$G/ +1,$G// +1,$G/foo +1,$G/foo/ + +G/foo/ +d +& + + +# Help Command + +h + +hl +hn +hp + + +# extensions + +hlnp + + +# Help Mode Command + +H + +Hl +Hn +Hp + +# extensions + +Hlnp + + +# Insert Command + + +i +. + +i +line 1 +. + +i +line 1 +line 2 +line 3 +. + +in +line 1 +. + +il +line 1 +. + +ip +line 1 +. + +.i +line 1 +. + +# extensions + +ilnp +line 1 +. + +# global subcommand + +g/foo/i\ +. + +g/foo/i\ +line 1 + +g/foo/i\ +line 1\ +. + +g/foo/i\ +line 1\ +.\ +p + +g/foo/il\ +line 1\ +. + + +# Join Command + + +j +.,.+1j + +jl +jn +jp + +# extensions + +jlnp + + +# Mark Command + + +ka +.ka + +kal +kan +kap + +# extensions + +kalnp + + +# List Command + + +l +.,.l + +ll +ln +lp + +# extensions + +llnp + + +# Move Command + + +m$ +.,.m$ + +m/pattern/ +.,.m/pattern/ + +ml +mn +mp + +m$l +m$n +m$p + +m/pattern/l +m/pattern/n +m/pattern/p + +# extensions + +mlnp +m$lnp +m/pattern/lnp + + +# Number Command + + +n +.,.n + +nl +nn +np + +# extensions + +nlnp + + +# Print Command + + +p +.,.p + +pl +pn +pp + +# extensions + +plnp + + +# Prompt Command + + +P + +Pl +Pn +Pp + +# extensions + +Plnp + + +# Quit Command + + +q + + +# Quit Without Checking Command + +Q + + +# Read Command + +r +r filename +$r +$r filename + +r !echo Input text +r !! + + +# Substitute Command + + +s/foo/bar/ +.,.s/foo/bar/ + +s//bar + +s/foo/barbaz +s/foo/bar\ +baz +s/foo/bar\ +baz/ + +s/foo/bar&baz +s/foo/bar&\ +baz +s/foo/bar&\ +baz/ + +s/foo/% +s/foo/%/ + +s/foo/\% +s/foo/\%/ +s/foo/%% +s/foo/%%/ +s/foo/%a +s/foo/%a/ +s/foo/a% +s/foo/a%/ +s/foo/%a% +s/foo/%a%/ + +s/foo/bar\1baz/ +s/foo/bar\2baz/ +s/foo/bar\3baz/ +s/foo/bar\4baz/ +s/foo/bar\5baz/ +s/foo/bar\6baz/ +s/foo/bar\7baz/ +s/foo/bar\8baz/ +s/foo/bar\9baz/ + +s/foo/bar\10baz/ +s/foo/bar\11baz/ +s/foo/bar\12baz/ +s/foo/bar\13baz/ +s/foo/bar\14baz/ +s/foo/bar\15baz/ +s/foo/bar\16baz/ +s/foo/bar\17baz/ +s/foo/bar\18baz/ +s/foo/bar\19baz/ + + +# flags + +s/foo/bar/g +s/foo/bar/l +s/foo/bar/n +s/foo/bar/p + +s/foo/bar/gl +s/foo/bar/gn +s/foo/bar/gp +s/foo/bar/lg +s/foo/bar/ln +s/foo/bar/lp +s/foo/bar/ng +s/foo/bar/nl +s/foo/bar/np +s/foo/bar/pg +s/foo/bar/pl +s/foo/bar/pn + +s/foo/bar/gln +s/foo/bar/glp +s/foo/bar/gnl +s/foo/bar/gnp +s/foo/bar/gpl +s/foo/bar/gpn +s/foo/bar/lgn +s/foo/bar/lgp +s/foo/bar/lng +s/foo/bar/lnp +s/foo/bar/lpg +s/foo/bar/lpn +s/foo/bar/ngl +s/foo/bar/ngp +s/foo/bar/nlg +s/foo/bar/nlp +s/foo/bar/npg +s/foo/bar/npl +s/foo/bar/pgl +s/foo/bar/pgn +s/foo/bar/plg +s/foo/bar/pln +s/foo/bar/png +s/foo/bar/pnl + +s/foo/bar/glnp +s/foo/bar/glpn +s/foo/bar/gnlp +s/foo/bar/gnpl +s/foo/bar/gpln +s/foo/bar/gpnl +s/foo/bar/lgnp +s/foo/bar/lgpn +s/foo/bar/lngp +s/foo/bar/lnpg +s/foo/bar/lpgn +s/foo/bar/lpng +s/foo/bar/nglp +s/foo/bar/ngpl +s/foo/bar/nlgp +s/foo/bar/nlpg +s/foo/bar/npgl +s/foo/bar/nplg +s/foo/bar/pgln +s/foo/bar/pgnl +s/foo/bar/plgn +s/foo/bar/plng +s/foo/bar/pngl +s/foo/bar/pnlg + + +s/foo/bar/3 +s/foo/bar/l +s/foo/bar/n +s/foo/bar/p + +s/foo/bar/3l +s/foo/bar/3n +s/foo/bar/3p +s/foo/bar/l3 +s/foo/bar/ln +s/foo/bar/lp +s/foo/bar/n3 +s/foo/bar/nl +s/foo/bar/np +s/foo/bar/p3 +s/foo/bar/pl +s/foo/bar/pn + +s/foo/bar/3ln +s/foo/bar/3lp +s/foo/bar/3nl +s/foo/bar/3np +s/foo/bar/3pl +s/foo/bar/3pn +s/foo/bar/l3n +s/foo/bar/l3p +s/foo/bar/ln3 +s/foo/bar/lnp +s/foo/bar/lp3 +s/foo/bar/lpn +s/foo/bar/n3l +s/foo/bar/n3p +s/foo/bar/nl3 +s/foo/bar/nlp +s/foo/bar/np3 +s/foo/bar/npl +s/foo/bar/p3l +s/foo/bar/p3n +s/foo/bar/pl3 +s/foo/bar/pln +s/foo/bar/pn3 +s/foo/bar/pnl + +s/foo/bar/3lnp +s/foo/bar/3lpn +s/foo/bar/3nlp +s/foo/bar/3npl +s/foo/bar/3pln +s/foo/bar/3pnl +s/foo/bar/l3np +s/foo/bar/l3pn +s/foo/bar/ln3p +s/foo/bar/lnp3 +s/foo/bar/lp3n +s/foo/bar/lpn3 +s/foo/bar/n3lp +s/foo/bar/n3pl +s/foo/bar/nl3p +s/foo/bar/nlp3 +s/foo/bar/np3l +s/foo/bar/npl3 +s/foo/bar/p3ln +s/foo/bar/p3nl +s/foo/bar/pl3n +s/foo/bar/pln3 +s/foo/bar/pn3l +s/foo/bar/pnl3 + + +# repeat last substitute + +s3 +sg +sp +sr + +s3g +s3p +s3r +sg3 +sgp +sgr +sp3 +spg +spr +sr3 +srg +srp + +s3gp +s3gr +s3pg +s3pr +s3rg +s3rp +sg3p +sg3r +sgp3 +sgpr +sgr3 +sgrp +sp3g +sp3r +spg3 +spgr +spr3 +sprg +sr3g +sr3p +srg3 +srgp +srp3 +srpg + +s3gpr +s3grp +s3pgr +s3prg +s3rgp +s3rpg +sg3pr +sg3rp +sgp3r +sgpr3 +sgr3p +sgrp3 +sp3gr +sp3rg +spg3r +spgr3 +spr3g +sprg3 +sr3gp +sr3pg +srg3p +srgp3 +srp3g +srpg3 + +# repeat last substitute flags as delimiters + +s3...3...3 +sg...g...g +sp...p...p +sr...r...r + + +# Copy Command + + +t$ +.,.t$ + +t/pattern/ +.,.t/pattern/ + +tl +tn +tp + +t$l +t$n +t$p + +t/pattern/l +t/pattern/n +t/pattern/p + +# extensions + +tlnp +t$lnp +t/pattern/lnp + + +# Undo Command + + +u + +ul +un +up + +# extensions + +ulnp + + +# Global Non-Matched Command + + +v/ +v// +v/foo +v/foo/ + +1,$v/ +1,$v// +1,$v/foo +1,$v/foo/ + + +# Interactive Global Non-Matched Command + + +V/ +V// +V/foo +V/foo/ + +1,$V/ +1,$V// +1,$V/foo +1,$V/foo/ + + +# Write Command + + +w +1,$w +w filename +1,$w filename + + +# Line Number Command + + += +$= + +=l +=n +=p + +# extensions + +=lnp + + +# Shell Escape Command + + +!echo "Foo" + +!! + +!echo % +!echo \% +!echo \\% +!echo \\\% +!echo \\\\% + + +# Null Command + + +.+1 + + diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 9eff140299..59020deae2 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -271,6 +271,7 @@ def s:GetFilenameChecks(): dict> dylanlid: ['file.lid'], earthfile: ['Earthfile'], ecd: ['file.ecd'], + ed: ['file.ed'], edif: ['file.edf', 'file.edif', 'file.edo'], editorconfig: ['.editorconfig'], eelixir: ['file.eex', 'file.leex'], @@ -1161,6 +1162,7 @@ def s:GetScriptChecks(): dict>> dart: [['#!/path/dart']], bpftrace: [['#!/path/bpftrace']], vim: [['#!/path/vim']], + ed: [['#!/usr/bin/ed -f']], } enddef diff --git a/src/version.c b/src/version.c index c69281a7ad..d1497635b9 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 894, /**/ 893, /**/ From 85b8034dff60c3631c0cd6fb9c9104610d064659 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 2 Aug 2026 17:13:43 +0000 Subject: [PATCH 268/647] patch 9.2.0895: test: Test_aucmd_win_scroll_multibyte() is flaky in the GUI Problem: The test comparing the top line before and after using the autocommand window is flaky in the GUI. Solution: Run the test in a window with a fixed size. In the GUI a pending resize of the shell is applied at the end of a screen update, thus the size may change between the two measurements. related: #20884 closes: #20913 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_window_cmd.vim | 8 ++++++-- src/version.c | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index 701eec65c4..f3aa38dc4a 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -2038,8 +2038,11 @@ func Test_aucmd_win_scroll_multibyte() " Using the autocommand window must not scroll the current window when the " cursor is behind multi-byte characters. set splitkeep=cursor - call setline(1, repeat([repeat(nr2char(0x3042), 200)], 20)) - normal! G0100l + " Use a window with a fixed size, the size of the screen may change while + " the test is running. + call NewWindow(11, 40) + call setline(1, repeat([repeat(nr2char(0x3042), 100)], 20)) + normal! G050l redraw let topline = line('w0') @@ -2049,6 +2052,7 @@ func Test_aucmd_win_scroll_multibyte() call assert_equal(topline, line('w0')) %bwipeout! + only! set splitkeep& endfunc diff --git a/src/version.c b/src/version.c index d1497635b9..d1b8ad9311 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 895, /**/ 894, /**/ From a556e21552e9978e670fd351c8fc263efffe47b1 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 2 Aug 2026 17:20:29 +0000 Subject: [PATCH 269/647] patch 9.2.0896: textprop: wrong Tab size in a line with virtual text above it Problem: In a line with virtual text above it a Tab does not have the right size, depending on the width of the window. Solution: Do not count the columns of the virtual text for the size of the Tab, neither when drawing nor when computing the column. fixes: #12232 closes: #20901 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/charset.c | 16 +++++++++++-- src/drawline.c | 6 +++-- src/structs.h | 2 ++ src/testdir/test_textprop.vim | 42 +++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/charset.c b/src/charset.c index bf7c59620f..c47180e2ce 100644 --- a/src/charset.c +++ b/src/charset.c @@ -1285,11 +1285,18 @@ win_lbr_chartabsize( #if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) int has_lcs_eol = wp->w_p_list && wp->w_lcs_chars.eol != NUL; + // Virtual text above the line is on its own screen line, it does not count + // for the size of a Tab. + colnr_T tab_vcol = vcol; + +# ifdef FEAT_PROP_POPUP + tab_vcol -= cts->cts_above_width; +# endif /* * First get the normal size, without 'linebreak' or text properties */ - size = win_chartabsize(wp, s, vcol); + size = win_chartabsize(wp, s, tab_vcol); # ifdef FEAT_LINEBREAK if (*s == NUL) { @@ -1367,7 +1374,8 @@ win_lbr_chartabsize( { // tab size changes because of the inserted text size -= tab_size; - tab_size = win_chartabsize(wp, s, vcol + size); + tab_size = win_chartabsize(wp, s, + vcol + size - cts->cts_above_width); size += tab_size; } # endif @@ -1549,6 +1557,10 @@ win_lbr_chartabsize( *tailp = size - size_before_lbr; # ifdef FEAT_PROP_POPUP + if (cts->cts_first_char > 0) + // Remember the width for the size of a Tab later in the line. Use + // assignment, this may be called more than once for a character. + cts->cts_above_width = cts->cts_first_char; size += cts->cts_first_char; # endif # endif diff --git a/src/drawline.c b/src/drawline.c index a2679e1467..c799291ba6 100644 --- a/src/drawline.c +++ b/src/drawline.c @@ -3334,7 +3334,9 @@ win_line( if (c == TAB && (!wp->w_p_list || wp->w_lcs_chars.tab1)) { int tab_len = 0; - long vcol_adjusted = wlv.vcol; // removed showbreak len + // Virtual text and 'showbreak' do not count for the size + // of a Tab. + long vcol_adjusted = wlv.vcol - wlv.vcol_off_tp; int lcs_tab1 = wp->w_lcs_chars.tab1; int lcs_tab2 = wp->w_lcs_chars.tab2; int lcs_tab3 = wp->w_lcs_chars.tab3; @@ -3353,7 +3355,7 @@ win_line( // only adjust the tab_len, when at the first column // after the showbreak value was drawn if (*sbr != NUL && wlv.vcol == wlv.vcol_sbr && wp->w_p_wrap) - vcol_adjusted = wlv.vcol - MB_CHARLEN(sbr); + vcol_adjusted -= MB_CHARLEN(sbr); #endif // tab amount depends on current column #ifdef FEAT_VARTABS diff --git a/src/structs.h b/src/structs.h index d9b7b6b0a5..38037c9d5e 100644 --- a/src/structs.h +++ b/src/structs.h @@ -5359,6 +5359,8 @@ typedef struct { int cts_cur_text_width; // width of current inserted text int cts_prop_lines; // nr of properties above or below int cts_first_char; // width text props above the line + int cts_above_width; // width of text props above the line, + // kept for the whole line int cts_with_trailing; // include size of trailing props with // last character int cts_start_incl; // prop has true "start_incl" arg diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim index a566a47af8..a89ed55154 100644 --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -3782,6 +3782,48 @@ func Test_prop_above_with_indent() call prop_type_delete('indented') endfunc +" A Tab in the line is not affected by virtual text above it. +func Test_prop_above_with_tab() + " Use a width that is not a multiple of 'tabstop', otherwise counting the + " virtual text for the size of a Tab happens to give the right result. + call NewWindow(10, 45) + setlocal tabstop=8 + call setline(1, ["\tX"]) + call prop_type_add('above', #{highlight: 'Search'}) + + " Get the column of the "X" without and with the virtual text. + redraw + let col_without = 0 + for col in range(1, winwidth(0)) + if screenstring(1, col) == 'X' + let col_without = col + break + endif + endfor + call assert_equal(9, col_without) + + call prop_add(1, 0, #{type: 'above', text: 'text above', text_align: 'above'}) + redraw + let col_with = 0 + for col in range(1, winwidth(0)) + if screenstring(2, col) == 'X' + let col_with = col + break + endif + endfor + call assert_equal(col_without, col_with) + + " The cursor is placed on the character, also with a second Tab. + call setline(1, ["\t\tX"]) + redraw + normal! 0fX + call assert_equal('X', screenstring(winline(), wincol())) + + only! + bwipe! + call prop_type_delete('above') +endfunc + func Test_prop_above_with_number() CheckScreendump CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index d1b8ad9311..30b9a310be 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 896, /**/ 895, /**/ From bd2970b041871bea99626c5ef701ae02216bc8c3 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 2 Aug 2026 17:25:35 +0000 Subject: [PATCH 270/647] patch 9.2.0896: scroll: 'smoothscroll' position is lost when splitting a window Problem: With 'smoothscroll' the position in a long line is lost when a window is split and closed again. Solution: With 'splitkeep' "screen" keep the skipped columns, they are part of keeping the same screen lines. Otherwise put the cursor in the row that keeps its relative position, instead of the last row. closes: #20912 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 5 +---- src/testdir/test_window_cmd.vim | 19 +++++++++++++++++++ src/window.c | 12 ++++++++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 3b2f65a9c9..a277a260f6 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Aug 01 +*todo.txt* For Vim version 9.2. Last change: 2026 Aug 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -41,9 +41,6 @@ squeezed to a couple of lines, for example ":help" followed by ":close". In restore_snapshot_rec() restore more values from the snapshot, instead of calling frame_new_height() and frame_new_width(), especially w_skipcol. -With 'splitkeep' "screen" the scroll position is lost when splitting and -closing a window, win_fix_cursor() moves the cursor to another line. - When a help item can't be found, then open 'helpfile'. Search for the tag in that file and gtive E149 only when not found. Helps for a tiny Vim installed without all the help files. diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index f3aa38dc4a..dc670fa7c1 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -2034,6 +2034,25 @@ func Test_splitkeep_cmdheight() set splitkeep& cmdheight& endfunc +func Test_splitkeep_screen_smoothscroll() + set splitkeep=screen + setlocal smoothscroll + call setline(1, [repeat('x', 3000)] + repeat(['line'], 10)) + exe "normal! gg10\" + redraw + let skipcol = winsaveview().skipcol + call assert_notequal(0, skipcol) + + " Keeping the same screen lines also keeps the position in a long line. + split + close + redraw + call assert_equal(skipcol, winsaveview().skipcol) + + %bwipeout! + set splitkeep& +endfunc + func Test_aucmd_win_scroll_multibyte() " Using the autocommand window must not scroll the current window when the " cursor is behind multi-byte characters. diff --git a/src/window.c b/src/window.c index 04d3d86c4e..8ac5b8f5ea 100644 --- a/src/window.c +++ b/src/window.c @@ -7287,6 +7287,9 @@ win_fix_scroll(int resize) int diff = (wp->w_winrow - wp->w_prev_winrow) + (wp->w_height - wp->w_prev_height); pos_T cursor = wp->w_cursor; + linenr_T topline = wp->w_topline; + colnr_T skipcol = wp->w_skipcol; + wp->w_cursor.lnum = wp->w_botline - 1; // Add difference in height and row to botline. @@ -7301,6 +7304,9 @@ win_fix_scroll(int resize) scroll_to_fraction(wp, wp->w_prev_height); wp->w_cursor = cursor; + // Keeping the same screen lines includes the skipped columns. + if (wp->w_topline == topline) + wp->w_skipcol = skipcol; wp->w_valid &= ~VALID_WCOL; } else if (wp == curwin) @@ -7468,15 +7474,17 @@ scroll_to_fraction(win_T *wp, int prev_height) * Make cursor line the first line in the window. If not enough * room use w_skipcol; */ + int want_row = wp->w_wrow; // where the cursor should be + wp->w_wrow = line_size; if (wp->w_wrow >= wp->w_height && (wp->w_width - win_col_off(wp)) > 0) { - // The cursor must be visible, override the scroll position. + // Skip columns to get the cursor in the wanted row. colnr_T skipcol = wp->w_width - win_col_off(wp); --wp->w_wrow; - while (wp->w_wrow >= wp->w_height) + while (wp->w_wrow > want_row) { skipcol += wp->w_width - win_col_off(wp) + win_col_off2(wp); --wp->w_wrow; From cdeee18f31fd78d36e9bbe65266805d2e9053d07 Mon Sep 17 00:00:00 2001 From: Mateo Gjika <104777599+mateoxh@users.noreply.github.com> Date: Sun, 2 Aug 2026 17:49:36 +0000 Subject: [PATCH 271/647] runtime(vimgoto): make 'gf' find imported python files In Vim script with this line: py3 import file make gf work using vimgoto plugin. closes: #20908 Signed-off-by: Mateo Gjika <104777599+mateoxh@users.noreply.github.com> Signed-off-by: Christian Brabandt --- runtime/autoload/vimgoto.vim | 55 +++++++++++++++++++++++++++++++++--- runtime/ftplugin/vim.vim | 3 +- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/runtime/autoload/vimgoto.vim b/runtime/autoload/vimgoto.vim index 634457dff5..351714f02d 100644 --- a/runtime/autoload/vimgoto.vim +++ b/runtime/autoload/vimgoto.vim @@ -5,7 +5,7 @@ vim9script # Shane-XB-Qian # Andrew Radev # thinca -# Last Change: 2026 Mar 30 +# Last Change: 2026 Aug 02 # # Vim script to handle jumping to the targets of several types of Vim commands # (:import, :packadd, :runtime, :colorscheme), and to autoloaded functions of @@ -37,7 +37,12 @@ export def Find(editcmd: string) #{{{2 return endif - var curfunc = FindCurfunc() + if curline =~ '^\s*py\%(thon\)\=3\s\+\%(from\|import\)\s' + HandlePythonImportLine(editcmd, curline) + return + endif + + var curfunc = ExpandCurWord('#') if stridx(curfunc, '#') >= 0 var parts = split(curfunc, '#') @@ -171,6 +176,48 @@ def HandleImportLine(editcmd: string, curline: string) #{{{2 execute how_to_split .. ' ' .. fnameescape(filepath) enddef +def HandlePythonImportLine(editcmd: string, curline: string) #{{{2 + # from ftplugin/python.vim + var grandparent_match: string = '^\(.\.\)\(\.*\)' + var grandparent_sub: string = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))' + + var parent_match: string = '^\.\(\.\)\@!' + var parent_sub: string = './' + + var child_match: string = '\(\w\)\.\(\w\)' + var child_sub: string = '\1/\2' + + var fname: string + + if curline =~ '\' || curline =~ '\' + fname = curline->matchstr('^\s*py\%(thon\)\=3\s\+\%(from\|import\)\s\+\zs\S\+') + else + fname = ExpandCurWord('.') + endif + + fname = fname + ->substitute(grandparent_match, grandparent_sub, '') + ->substitute(parent_match, parent_sub, '') + ->substitute(child_match, child_sub, 'g') + .. '.py' + + var filepath: string = globpath(&runtimepath, 'python/' .. fname, true, true) + ->get(0, '') + + if !filepath->filereadable() + printf('E447: Can''t find file "%s" in path', fname) + ->Error() + return + endif + + var how_to_split: string = { + gF: 'edit', + "\F": 'split', + "\gF": 'tab split', + }[editcmd] + execute how_to_split .. ' ' .. fnameescape(filepath) +enddef + def Open(target: any, editcmd: string, search_pattern: string = '') #{{{2 var split: string = editcmd[0] == 'g' ? 'edit' : editcmd[1] == 'g' ? 'tabedit' : 'split' var fname: string @@ -220,12 +267,12 @@ def Fallback(editcmd: string) #{{{2 endtry enddef -def FindCurfunc(): string #{{{2 +def ExpandCurWord(char: string): string #{{{2 var curfunc = '' var saved_iskeyword = &iskeyword try - set iskeyword+=# + execute 'set iskeyword+=' .. char curfunc = expand('') finally &iskeyword = saved_iskeyword diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim index b54cb48f02..9c57399264 100644 --- a/runtime/ftplugin/vim.vim +++ b/runtime/ftplugin/vim.vim @@ -7,6 +7,7 @@ " @tpope (s:Help()) " @lacygoill " Last Change: 2026 Jun 27 +" 2026 Aug 02 by Vim project: Update 'path' setting #20908 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -135,7 +136,7 @@ endif " set 'path' to common Vim directories setlocal path-=/usr/include -setlocal path+=pack/**,runtime/**,autoload/**,colors/**,compiler/**,ftplugin/**,indent/**,keymap/**,macros/**,plugin/**,syntax/**,after/** +setlocal path+=pack/**,runtime/**,autoload/**,colors/**,compiler/**,ftplugin/**,indent/**,keymap/**,macros/**,plugin/**,syntax/**,after/**,python/** if !exists("no_plugin_maps") && !exists("no_vim_maps") let b:did_add_maps = 1 From cd29d79dde5a076a859009b97287e6357933efe3 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Sun, 2 Aug 2026 18:01:14 +0000 Subject: [PATCH 272/647] patch 9.2.0897: GTK3 X11 redraws are not coalesced Problem: GTK3 X11 redraws are not coalesced Solution: Improve redrawing logic, unify Wayland with X11 redraw code (Christoffer Aasted) closes: #20909 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 148 +++++++++++++--------------------------------- src/version.c | 2 + 2 files changed, 44 insertions(+), 106 deletions(-) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 0647d9b16b..f2db6d1da8 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -778,25 +778,7 @@ draw_event(GtkWidget *widget UNUSED, // for GTK+ 3, may induce other draw events. cairo_set_source_surface(cr, gui.surface, 0, 0); - - { - cairo_rectangle_list_t *list = NULL; - - list = cairo_copy_clip_rectangle_list(cr); - if (list->status != CAIRO_STATUS_CLIP_NOT_REPRESENTABLE) - { - int i; - - for (i = 0; i < list->num_rectangles; i++) - { - const cairo_rectangle_t *rect = &list->rectangles[i]; - cairo_rectangle(cr, rect->x, rect->y, - rect->width, rect->height); - cairo_fill(cr); - } - } - cairo_rectangle_list_destroy(list); - } + cairo_paint(cr); return FALSE; } @@ -3758,54 +3740,6 @@ gui_gtk_set_dnd_targets(void) GDK_ACTION_COPY | GDK_ACTION_MOVE); } -#ifdef GDK_WINDOWING_WAYLAND -static struct { - int left; - int top; - int right; - int bottom; - bool active; -} wl_dirty_rect = {0, 0, 0, 0, false}; - - static void -wl_queue_dirty_area(int x, int y, int width, int height) -{ - if (!wl_dirty_rect.active) - { - wl_dirty_rect.left = x; - wl_dirty_rect.top = y; - wl_dirty_rect.right = x + width; - wl_dirty_rect.bottom = y + height; - wl_dirty_rect.active = true; - } - else - { - // Expand to append further changes - if (x < wl_dirty_rect.left) wl_dirty_rect.left = x; - if (y < wl_dirty_rect.top) wl_dirty_rect.top = y; - if (x + width > wl_dirty_rect.right) wl_dirty_rect.right = x + width; - if (y + height > wl_dirty_rect.bottom) wl_dirty_rect.bottom = y + height; - } -} - - static void -wl_flush(void) -{ - if (!wl_dirty_rect.active) - return; - int draw_x = wl_dirty_rect.left; - int draw_y = wl_dirty_rect.top; - int draw_w = wl_dirty_rect.right - wl_dirty_rect.left; - int draw_h = wl_dirty_rect.bottom - wl_dirty_rect.top; - - if (draw_w > 0 && draw_h > 0) - { - gtk_widget_queue_draw_area(gui.drawarea, draw_x, draw_y, draw_w, draw_h); - } - wl_dirty_rect.active = false; -} -#endif - /* * Initialize the GUI. Create all the windows, set up all the callbacks etc. * Returns OK for success, FAIL when the GUI can't be started. @@ -6287,20 +6221,28 @@ gui_gtk_draw_string(int row, int col, char_u *s, int len, int flags) return len_sum; } +#if GTK_CHECK_VERSION(3,0,0) +static cairo_region_t *dirty_region = NULL; + static void -queue_draw_area( - int x, - int y, - int width, - int height) +queue_draw_area(int x, int y, int width, int height) { -#ifdef GDK_WINDOWING_WAYLAND - if (gui.is_wayland) - wl_queue_dirty_area(x, y, width, height); + cairo_rectangle_int_t rect; + + if (width <= 0 || height <= 0 || gui.drawarea == NULL) + return; + + rect.x = x; + rect.y = y; + rect.width = width; + rect.height = height; + + if (dirty_region == NULL) + dirty_region = cairo_region_create_rectangle(&rect); else -#endif - gtk_widget_queue_draw_area(gui.drawarea, x, y, width, height); + cairo_region_union_rectangle(dirty_region, &rect); } +#endif int gui_gtk_draw_string_ext( @@ -6554,8 +6496,8 @@ gui_gtk_draw_string_ext( #if GTK_CHECK_VERSION(3,0,0) cairo_destroy(cr); - queue_draw_area(area.x, area.y, - area.width, area.height); + queue_draw_area(FILL_X(col), FILL_Y(row), + column_offset * gui.char_width + 1, gui.char_height); #else gdk_gc_set_clip_rectangle(gui.text_gc, NULL); #endif @@ -6698,8 +6640,7 @@ gui_mch_invert_rectangle(int r, int c, int nr, int nc) cairo_destroy(cr); - queue_draw_area(rect.x, rect.y, - rect.width, rect.height); + queue_draw_area(rect.x, rect.y, rect.width, rect.height); #else GdkGCValues values; GdkGC *invert_gc; @@ -6852,17 +6793,14 @@ gui_mch_update(void) { int cnt = 0; // prevent endless loop while (g_main_context_pending(NULL) && !vim_is_input_buf_full() - && ++cnt < 100) + && ++cnt < 100) { -#ifdef GDK_WINDOWING_WAYLAND - if (gui.is_wayland) - { - int prio = 0; - g_main_context_prepare(NULL, &prio); - // peek internal scheduling of redraw - if (prio == GDK_PRIORITY_REDRAW) - gui_may_flush(); // prepares redraw: g_main_context_iteration - } +#if GTK_CHECK_VERSION(3,0,0) + int prio = 0; + g_main_context_prepare(NULL, &prio); + // peek internal scheduling of redraw + if (prio == GDK_PRIORITY_REDRAW) + gui_may_flush(); // prepares redraw: g_main_context_iteration #endif g_main_context_iteration(NULL, TRUE); } @@ -6997,18 +6935,19 @@ gui_mch_wait_for_chars(long wtime) void gui_mch_flush(void) { - if (gui.mainwin != NULL && gtk_widget_get_realized(gui.mainwin)) + if (gui.mainwin == NULL || !gtk_widget_get_realized(gui.mainwin)) + return; +#if GTK_CHECK_VERSION(3,0,0) + if (dirty_region != NULL && gui.drawarea != NULL) { -#ifdef GDK_WINDOWING_WAYLAND - if (gui.is_wayland) - return wl_flush(); -#endif -#if GTK_CHECK_VERSION(2,4,0) - gdk_display_flush(gtk_widget_get_display(gui.mainwin)); + gtk_widget_queue_draw_region(gui.drawarea, dirty_region); + cairo_region_destroy(dirty_region); + dirty_region = NULL; + } #else - gdk_display_sync(gtk_widget_get_display(gui.mainwin)); + gdk_display_flush(gtk_widget_get_display(gui.mainwin)); + return; #endif - } } /* @@ -7060,8 +6999,7 @@ gui_mch_clear_block(int row1arg, int col1arg, int row2arg, int col2arg) cairo_fill(cr); cairo_destroy(cr); - queue_draw_area( - rect.x, rect.y, rect.width, rect.height); + queue_draw_area(rect.x, rect.y, rect.width, rect.height); } #else // !GTK_CHECK_VERSION(3,0,0) gdk_gc_set_foreground(gui.text_gc, &color); @@ -7097,8 +7035,7 @@ gui_gtk_window_clear(GdkWindow *win) cairo_fill(cr); cairo_destroy(cr); - queue_draw_area( - rect.x, rect.y, rect.width, rect.height); + queue_draw_area(rect.x, rect.y, rect.width, rect.height); } #else # define gui_gtk_window_clear(win) gdk_window_clear(win) @@ -7156,8 +7093,7 @@ gui_mch_draw_popup_image( # if GTK_CHECK_VERSION(3,0,0) cairo_popup_image_paint(wp, gui.surface, x, y, src_x, src_y, draw_w, draw_h); - if (gui.drawarea != NULL) - queue_draw_area(x, y, draw_w, draw_h); + queue_draw_area(x, y, draw_w, draw_h); # else cairo_popup_image_paint(wp, gui.drawarea->window, x, y, src_x, src_y, draw_w, draw_h); diff --git a/src/version.c b/src/version.c index 30b9a310be..7c831d2ae2 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 897, /**/ 896, /**/ From f141c19dca84331202ea06f3035c04ffc63066d0 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Sun, 2 Aug 2026 18:27:01 +0000 Subject: [PATCH 273/647] patch 9.2.0898: printing support is lacking Problem: printing support is lacking Solution: Improve printing support by making use of pango and cairo libraries, use a graphical dialog for :hardcopy in the GTK4 ui (Foxe Chen). fixes: #8935 closes: #20648 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- Filelist | 5 + runtime/doc/options.txt | 4 +- runtime/doc/print.txt | 60 +- runtime/doc/tags | 3 + runtime/doc/various.txt | 3 +- runtime/doc/version9.txt | 4 +- src/Makefile | 24 +- src/auto/configure | 97 ++ src/config.h.in | 3 + src/config.mk.in | 8 + src/configure.ac | 73 + src/errors.h | 8 +- src/evalfunc.c | 7 + src/evalvars.c | 2 +- src/feature.h | 14 +- src/globals.h | 4 +- src/gui_gtk4.c | 402 ++--- src/hardcopy.c | 2639 +-------------------------------- src/hardcopy.h | 46 + src/hardcopy_pango.c | 783 ++++++++++ src/hardcopy_pango.h | 32 + src/hardcopy_postscript.c | 2512 +++++++++++++++++++++++++++++++ src/hardcopy_postscript.h | 42 + src/option.c | 4 +- src/option.h | 4 +- src/optiondefs.h | 4 +- src/proto/gui_gtk4.pro | 3 +- src/proto/hardcopy.pro | 13 +- src/structs.h | 5 +- src/testdir/test_hardcopy.vim | 47 +- src/version.c | 7 + src/vim.h | 6 + 32 files changed, 3956 insertions(+), 2912 deletions(-) create mode 100644 src/hardcopy.h create mode 100644 src/hardcopy_pango.c create mode 100644 src/hardcopy_pango.h create mode 100644 src/hardcopy_postscript.c create mode 100644 src/hardcopy_postscript.h diff --git a/Filelist b/Filelist index 07853f4c69..7a2f1219ba 100644 --- a/Filelist +++ b/Filelist @@ -93,6 +93,11 @@ SRC_ALL = \ src/gui.h \ src/gui_beval.c \ src/hardcopy.c \ + src/hardcopy.h \ + src/hardcopy_pango.c \ + src/hardcopy_pango.h \ + src/hardcopy_postscript.c \ + src/hardcopy_postscript.h \ src/hashtab.c \ src/help.c \ src/highlight.c \ diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 647e2a622c..a9d8f06f53 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Jul 29 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -6900,7 +6900,7 @@ A jump table for the options with a short description can be found at |Q_op|. 'printexpr' 'pexpr' string (default: see below) global {only available when compiled with the |+printer| - and |+postscript| features} + and |+postscript| or |+pango| features} Expression used to print the PostScript produced with |:hardcopy|. See |pexpr-option|. This option cannot be set from a |modeline| or in the |sandbox|, for diff --git a/runtime/doc/print.txt b/runtime/doc/print.txt index 2e8466482c..392ad26878 100644 --- a/runtime/doc/print.txt +++ b/runtime/doc/print.txt @@ -1,4 +1,4 @@ -*print.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*print.txt* For Vim version 9.2. Last change: 2026 Aug 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -13,7 +13,8 @@ Printing *printing* 5. PostScript CJK Printing |postscript-cjk-printing| 6. PostScript Printing Troubleshooting |postscript-print-trouble| 7. PostScript Utilities |postscript-print-util| -8. Formfeed Characters |printing-formfeed| +8. Pango Printing |pango-printing| +9. Formfeed Characters |printing-formfeed| {only available when compiled with the |+printer| feature} @@ -33,20 +34,23 @@ Note: If you have problems printing with |:hardcopy|, an alternative is to use Send [range] lines (default whole file) to the printer. - On MS-Windows a dialog is displayed to allow selection - of printer, paper size etc. To skip the dialog, use - the [!]. In this case the printer defined by - 'printdevice' is used, or, if 'printdevice' is empty, - the system default printer. + On MS-Windows or GTK4 GUI, a dialog is displayed to + allow selection of printer, paper size etc. To skip + the dialog, use the [!]. In this case the printer + defined by 'printdevice' is used, or, if 'printdevice' + is empty, the system default printer. Note that the + GTK4 GUI print dialog requires at least GTK 4.14. - For systems other than MS-Windows, PostScript is - written in a temp file and 'printexpr' is used to + For systems other than MS-Windows or Pango, PostScript + is written in a temp file and 'printexpr' is used to actually print it. Then [arguments] can be used by 'printexpr' through |v:cmdarg|. Otherwise [arguments] is ignored. 'printoptions' can be used to specify paper size, duplex, etc. Note: If you want PDF, there are tools such as - "ps2pdf" that can convert the PostScript to PDF. + "ps2pdf" that can convert the PostScript to PDF. If + the |+pango| feature is enabled, then emit PDF by + setting "format" to "pdf" in 'printoptions'. :[range]ha[rdcopy][!] >{filename} As above, but write the resulting PostScript in file @@ -54,7 +58,7 @@ Note: If you have problems printing with |:hardcopy|, an alternative is to use Things like "%" are expanded |cmdline-special| Careful: An existing file is silently overwritten. {only available when compiled with the |+postscript| - feature} + or |+pango| feature} On MS-Windows use the "print to file" feature of the printer driver. @@ -129,7 +133,7 @@ MS-Windows platform. *pexpr-option* 'printexpr' 'pexpr' String (default: see below) global -Expression that is evaluated to print the PostScript produced with +Expression that is evaluated to print the PostScript or PDF produced with |:hardcopy|. The file name to be printed is in |v:fname_in|. The arguments to the ":hardcopy" command are in |v:cmdarg|. @@ -195,7 +199,8 @@ output. It has the same format as the 'guifont' option, except that only one font may be named, and the special "guifont=*" syntax is not available. In the Win32 GUI version this specifies a font name with its extra attributes, -as with the 'guifont' option. +as with the 'guifont' option. When |+pango| is enabled, the format is the +same as 'guifont' for the GTK GUI (e.g. "Courier New 10"). For other systems, only ":h11" is recognized, where "11" is the point size of the font. When omitted, the point size is 10. @@ -397,6 +402,13 @@ of |:hardcopy|: formfeed:y When a form feed character is encountered, continue printing of the current line at the beginning of the first line on a new page. + format:postscript (default) + Output format: Postscript + format:{name} Output format from this table (only used when compiled + with |+pango| feature): + {name} meaning ~ + postscript Generate Postscript + pdf Generate Adobe PDF The item indicated with (default) is used when the item is not present. The values are not always used, especially when using a dialog to select the @@ -436,6 +448,9 @@ There are currently a number of limitations with PostScript printing: unknown characters. Printing will fail if Vim cannot convert the multibyte to the 8-bit encoding. +When using the Pango backend for printing, these limitations are solved. See +|pango-printing| for more information. + ============================================================================== 4. Custom 8-bit Print Character Encodings *postscript-print-encoding* *E618* *E619* @@ -717,9 +732,26 @@ There are a couple of points to bear in mind: desktop ink jets than for small office laser printers where the paper path is hidden from view. +============================================================================== +8. Pango Printing *pango-printing* + +If Vim is compiled with |+pango|, then it will render pages using Pango (a +text handling library), and Cairo (a graphics library). The benefit of this +is that Unicode is fully supported. Postscript files will still be generated +using Cairo. Additionally, PDF files can be emitted as well, see the +"format" key in |popt-option| + +When using the GTK GUI, |+pango| is always enabled and used. On terminal +builds of Vim, "--enable-hardcopy-pango" must be passed to the configure +options. The linked Cairo library must have the Postscript and PDF backends +enabled. + + *gtk4-print* +When using the GTK4 GUI, |:hardcopy| will use a native graphical print dialog, +similar to MS-Windows. See |:hardcopy| for more information. ============================================================================== -8. Formfeed Characters *printing-formfeed* +9. Formfeed Characters *printing-formfeed* By default Vim does not do any special processing of formfeed control characters. Setting the 'printoptions' formfeed item will make Vim recognize diff --git a/runtime/doc/tags b/runtime/doc/tags index 9f59289a8c..e83116386d 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -1514,6 +1514,7 @@ $quote eval.txt /*$quote* +num64 various.txt /*+num64* +ole various.txt /*+ole* +packages various.txt /*+packages* ++pango various.txt /*+pango* +path_extra various.txt /*+path_extra* +perl various.txt /*+perl* +perl/dyn various.txt /*+perl\/dyn* @@ -8262,6 +8263,7 @@ gtk-css gui_x11.txt /*gtk-css* gtk-tooltip-colors gui_x11.txt /*gtk-tooltip-colors* gtk3-slow gui_x11.txt /*gtk3-slow* gtk4-menu-navigation gui_x11.txt /*gtk4-menu-navigation* +gtk4-print print.txt /*gtk4-print* gtk4-slow gui_x11.txt /*gtk4-slow* gu change.txt /*gu* gugu change.txt /*gugu* @@ -9717,6 +9719,7 @@ page-up intro.txt /*page-up* page_down intro.txt /*page_down* page_up intro.txt /*page_up* pager message.txt /*pager* +pango-printing print.txt /*pango-printing* papp.vim syntax.txt /*papp.vim* paragraph motion.txt /*paragraph* partial builtin.txt /*partial* diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 0a5ff259ca..f0e9acaaee 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -1,4 +1,4 @@ -*various.txt* For Vim version 9.2. Last change: 2026 Jul 29 +*various.txt* For Vim version 9.2. Last change: 2026 Aug 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -482,6 +482,7 @@ m *+perl/dyn* Perl interface |perl-dynamic| |/dyn| N *+persistent_undo* Persistent undo |undo-persistence| N *+popupwin* Popup windows |popup-window| *+postscript* |:hardcopy| writes a PostScript file + *+pango* |:hardcopy| uses Pango and Cairo to render pages N *+printer* |:hardcopy| command H *+profile* |:profile| command m *+python* Python 2 interface |python| diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 738e95bdbe..4db123621e 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Jul 27 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52590,6 +52590,8 @@ GUI ~ - Added support for the GTK 4 GUI (via patch 9.2.0501). Enable with `--enable-gui=gtk4` configure switch at build time. - Add support for fullscreen mode in the GTK UI |'go-s'|. +- Enable native printing diaglog for the GTK4 UI using pango library, see + |pango-printing|. Popups ~ ------ diff --git a/src/Makefile b/src/Makefile index a3878d0c85..a8a046da7f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1417,6 +1417,8 @@ ALL_LIBS = \ $(X_PRE_LIBS) \ $(X_LIBS) \ $(WAYLAND_LIBS) \ + $(CAIRO_LIBS) \ + $(PANGO_LIBS) \ $(X_EXTRA_LIBS) \ $(MZSCHEME_LIBS) \ $(LIBS) \ @@ -1543,6 +1545,8 @@ BASIC_SRC = \ gc.c \ gui_xim.c \ hardcopy.c \ + hardcopy_pango.c \ + hardcopy_postscript.c \ hashtab.c \ help.c \ highlight.c \ @@ -1729,6 +1733,8 @@ OBJ_COMMON = \ objects/gc.o \ objects/gui_xim.o \ objects/hardcopy.o \ + objects/hardcopy_pango.o \ + objects/hardcopy_postscript.o \ objects/hashtab.o \ objects/help.o \ objects/highlight.o \ @@ -3381,6 +3387,12 @@ objects/gc.o: gc.c objects/hardcopy.o: hardcopy.c $(CCC) -o $@ hardcopy.c +objects/hardcopy_pango.o: hardcopy_pango.c + $(CCC) $(CAIRO_CFLAGS) $(CAIRO_CPPFLAGS) $(PANGO_CFLAGS) $(PANGO_CPPFLAGS) -o $@ hardcopy_pango.c + +objects/hardcopy_postscript.o: hardcopy_postscript.c + $(CCC) -o $@ hardcopy_postscript.c + objects/hashtab.o: hashtab.c $(CCC) -o $@ hashtab.c @@ -4097,7 +4109,17 @@ objects/hardcopy.o: auto/osdef.h hardcopy.c vim.h protodef.h auto/config.h featu ascii.h keymap.h termdefs.h macros.h option.h beval.h \ structs.h regexp.h gui.h libvterm/include/vterm.h \ libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ - globals.h errors.h version.h + globals.h errors.h version.h hardcopy.h hardcopy_pango.h hardcopy_postscript.h +objects/hardcopy_pango.o: auto/osdef.h hardcopy_pango.c vim.h protodef.h auto/config.h feature.h os_unix.h \ + ascii.h keymap.h termdefs.h macros.h option.h beval.h \ + structs.h regexp.h gui.h libvterm/include/vterm.h \ + libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ + globals.h errors.h hardcopy.h hardcopy_pango.h +objects/hardcopy_postscript.o: auto/osdef.h hardcopy_postscript.c vim.h protodef.h auto/config.h feature.h os_unix.h \ + ascii.h keymap.h termdefs.h macros.h option.h beval.h \ + structs.h regexp.h gui.h libvterm/include/vterm.h \ + libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ + globals.h errors.h version.h hardcopy.h hardcopy_postscript.h objects/hashtab.o: auto/osdef.h hashtab.c vim.h protodef.h auto/config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h option.h beval.h \ structs.h regexp.h gui.h libvterm/include/vterm.h \ diff --git a/src/auto/configure b/src/auto/configure index 8fd4ba3b7e..a47cb58d2a 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -657,6 +657,12 @@ GUI_LIB_LOC GUI_INC_LOC NARROW_PROTO MOTIF_LIBNAME +CAIRO_CPPFLAGS +CAIRO_CFLAGS +CAIRO_LIBS +PANGO_CPPFLAGS +PANGO_CFLAGS +PANGO_LIBS GRESOURCE_OBJ GRESOURCE_SRC UPDATE_DESKTOP_DATABASE @@ -870,6 +876,7 @@ with_gnome_libs with_gnome enable_icon_cache_update enable_desktop_database_update +enable_hardcopy_pango with_motif_lib with_tlib enable_largefile @@ -1546,6 +1553,7 @@ Optional Features: --disable-gtktest Do not try to compile and run a test GTK program --disable-icon-cache-update update disabled --disable-desktop-database-update update disabled + --enable-hardcopy-pango Use Pango and Cairo for improved hardcopy printing. default=yes when GTK GUI enabled --disable-largefile omit support for large files --disable-canberra Do not use libcanberra. --disable-libsodium Do not use libsodium. @@ -9241,6 +9249,43 @@ else printf "%s\n" "no" >&6; } fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cairo" >&5 +printf %s "checking for cairo... " >&6; } +have_cairo="no" +if "$PKG_CONFIG" --exists 'cairo-ps'; then + if "$PKG_CONFIG" --exists 'cairo-pdf'; then + have_cairo="yes" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + CAIRO_CFLAGS=`$PKG_CONFIG --cflags-only-other cairo-ps cairo-pdf` + CAIRO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I cairo-ps cairo-pdf` + CAIRO_LIBS=`$PKG_CONFIG --libs cairo-ps cairo-pdf` + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pango" >&5 +printf %s "checking for pango... " >&6; } +have_pango="no" +if "$PKG_CONFIG" --exists 'pango' && "$PKG_CONFIG" --exists 'pangocairo'; then + have_pango="yes" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + PANGO_CFLAGS=`$PKG_CONFIG --cflags-only-other pango pangocairo` + PANGO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I pango pangocairo` + PANGO_LIBS=`$PKG_CONFIG --libs pango pangocairo` +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$enable_gui" = "xgtk4"; then with_x=no fi @@ -11494,6 +11539,58 @@ fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking --enable-hardcopy-pango argument" >&5 +printf %s "checking --enable-hardcopy-pango argument... " >&6; } +# Check whether --enable-hardcopy-pango was given. +if test ${enable_hardcopy_pango+y} +then : + enableval=$enable_hardcopy_pango; +fi + + +if test "x$have_pango" = "xno" || test "x$have_cairo" = "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, Pango or Cairo not found" >&5 +printf "%s\n" "no, Pango or Cairo not found" >&6; } +else + if test "x$GUITYPE" = "xGTK" || test "x$GUITYPE" = "xGTK4"; then + enable_hardcopy_pango="yes" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, GTK GUI enabled" >&5 +printf "%s\n" "yes, GTK GUI enabled" >&6; } + else + if test "$enable_hardcopy_pango" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi +fi + +if test "$enable_hardcopy_pango" = "yes"; then + cppflags_save=$CPPFLAGS + cflags_save=$CFLAGS + + printf "%s\n" "#define FEAT_PRINT_PANGO 1" >>confdefs.h + + + CPPFLAGS="$CPPFLAGS $PANGO_CPPFLAGS" + CFLAGS="$CFLAGS $PANGO_CFLAGS" + + + + + CPPFLAGS="$CPPFLAGS $CAIRO_CPPFLAGS" + CFLAGS="$CFLAGS $CAIRO_CFLAGS" + + + + + CPPFLAGS=$cppflags_save + CFLAGS=$cflags_save +fi + + if test -z "$SKIP_MOTIF"; then gui_XXX="/usr/XXX/Motif* /usr/Motif*/XXX /usr/XXX /usr/shlib /usr/X11*/XXX /usr/XXX/X11* /usr/dt/XXX /local/Motif*/XXX /local/XXX/Motif* /usr/local/Motif*/XXX /usr/local/XXX/Motif* /usr/local/XXX /usr/local/X11*/XXX /usr/local/LessTif/Motif*/XXX $MOTIFHOME/XXX" diff --git a/src/config.h.in b/src/config.h.in index d26bd2078e..2dc3b2decf 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -499,6 +499,9 @@ /* Define if GTK GUI is to be linked against GTK 4 */ #undef USE_GTK4 +/* Define to use Pango and Cairo for hardcopy printing */ +#undef FEAT_PRINT_PANGO + /* Define if we have isinf() */ #undef HAVE_ISINF diff --git a/src/config.mk.in b/src/config.mk.in index a46a140a71..06a77aed69 100644 --- a/src/config.mk.in +++ b/src/config.mk.in @@ -43,6 +43,14 @@ WAYLAND_OBJ = @WAYLAND_OBJ@ WAYLAND_CFLAGS = @WAYLAND_CFLAGS@ WAYLAND_CPPFLAGS = @WAYLAND_CPPFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_CPPFLAGS = @CAIRO_CPPFLAGS@ + +PANGO_LIBS = @PANGO_LIBS@ +PANGO_CFLAGS = @PANGO_CFLAGS@ +PANGO_CPPFLAGS = @PANGO_CPPFLAGS@ + XDIFF_OBJS_USED = @XDIFF_OBJS_USED@ LUA_LIBS = @LUA_LIBS@ diff --git a/src/configure.ac b/src/configure.ac index 654959874d..2fdc516372 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -2473,6 +2473,36 @@ else AC_MSG_RESULT(no) fi +AC_MSG_CHECKING(for cairo) +have_cairo="no" +if "$PKG_CONFIG" --exists 'cairo-ps'; then + if "$PKG_CONFIG" --exists 'cairo-pdf'; then + have_cairo="yes" + AC_MSG_RESULT([yes]) + + CAIRO_CFLAGS=`$PKG_CONFIG --cflags-only-other cairo-ps cairo-pdf` + CAIRO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I cairo-ps cairo-pdf` + CAIRO_LIBS=`$PKG_CONFIG --libs cairo-ps cairo-pdf` + else + AC_MSG_RESULT(no, pdf backend not enabled) + fi +else + AC_MSG_RESULT(no, postscript backend not enabled) +fi + +AC_MSG_CHECKING(for pango) +have_pango="no" +if "$PKG_CONFIG" --exists 'pango' && "$PKG_CONFIG" --exists 'pangocairo'; then + have_pango="yes" + AC_MSG_RESULT([yes]) + + PANGO_CFLAGS=`$PKG_CONFIG --cflags-only-other pango pangocairo` + PANGO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I pango pangocairo` + PANGO_LIBS=`$PKG_CONFIG --libs pango pangocairo` +else + AC_MSG_RESULT(no) +fi + dnl GTK4 does not use X11 APIs directly, so skip X11 detection entirely. dnl This avoids pulling libICE/libSM/libX11/libXt into build dependencies dnl for GTK4-only builds, even when --with-x=yes is passed (e.g. by a @@ -3121,6 +3151,49 @@ AC_SUBST(GRESOURCE_OBJ) AC_SUBST(GTK_UPDATE_ICON_CACHE) AC_SUBST(UPDATE_DESKTOP_DATABASE) +AC_MSG_CHECKING(--enable-hardcopy-pango argument) +AC_ARG_ENABLE(hardcopy-pango, + [ --enable-hardcopy-pango Use Pango and Cairo for improved hardcopy printing. [default=yes when GTK GUI enabled]], + ,, enable_hardcopy_pango="no") + +if test "x$have_pango" = "xno" || test "x$have_cairo" = "xno"; then + AC_MSG_RESULT([no, Pango or Cairo not found]) +else + if test "x$GUITYPE" = "xGTK" || test "x$GUITYPE" = "xGTK4"; then + enable_hardcopy_pango="yes" + AC_MSG_RESULT([yes, GTK GUI enabled]) + else + if test "$enable_hardcopy_pango" = "yes"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi +fi + +if test "$enable_hardcopy_pango" = "yes"; then + cppflags_save=$CPPFLAGS + cflags_save=$CFLAGS + + AC_DEFINE(FEAT_PRINT_PANGO) + + CPPFLAGS="$CPPFLAGS $PANGO_CPPFLAGS" + CFLAGS="$CFLAGS $PANGO_CFLAGS" + AC_SUBST(PANGO_LIBS) + AC_SUBST(PANGO_CFLAGS) + AC_SUBST(PANGO_CPPFLAGS) + + CPPFLAGS="$CPPFLAGS $CAIRO_CPPFLAGS" + CFLAGS="$CFLAGS $CAIRO_CFLAGS" + AC_SUBST(CAIRO_LIBS) + AC_SUBST(CAIRO_CFLAGS) + AC_SUBST(CAIRO_CPPFLAGS) + + CPPFLAGS=$cppflags_save + CFLAGS=$cflags_save +fi + + dnl Check for Motif include files location. dnl The LAST one found is used, this makes the highest version to be used, dnl e.g. when Motif1.2 and Motif2.0 are both present. diff --git a/src/errors.h b/src/errors.h index 143e7d7e6c..350ffe704d 100644 --- a/src/errors.h +++ b/src/errors.h @@ -569,7 +569,7 @@ EXTERN char e_font_str_is_not_fixed_width[] INIT(= N_("E236: Font \"%s\" is not fixed-width")); # endif #endif -#ifdef MSWIN +#if defined(MSWIN) || defined(FEAT_PRINT_PANGO) EXTERN char e_printer_selection_failed[] INIT(= N_("E237: Printer selection failed")); EXTERN char e_print_error_str[] @@ -815,7 +815,7 @@ EXTERN char e_line_number_out_of_range_nr_past_the_end[] INIT(= "E322: Line number out of range: %ld past the end"); EXTERN char e_line_count_wrong_in_block_nr[] INIT(= "E323: Line count wrong in block %ld"); -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) EXTERN char e_cant_open_postscript_output_file[] INIT(= N_("E324: Can't open PostScript output file")); #endif @@ -915,7 +915,7 @@ EXTERN char e_pattern_uses_more_memory_than_maxmempattern[] EXTERN char e_library_call_failed_for_str[] INIT(= N_("E364: Library call failed for \"%s()\"")); #endif -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) EXTERN char e_failed_to_print_postscript_file[] INIT(= N_("E365: Failed to print PostScript file")); #endif @@ -1568,7 +1568,7 @@ EXTERN char e_using_special_as_number[] EXTERN char e_too_many_signs_defined[] INIT(= N_("E612: Too many signs defined")); #endif -#if defined(MSWIN) && defined(FEAT_PRINTER) +#if defined(FEAT_PRINTER) && (defined(MSWIN) || defined(FEAT_PRINT_PANGO)) EXTERN char e_unknown_printer_font_str[] INIT(= N_("E613: Unknown printer font: %s")); #endif diff --git a/src/evalfunc.c b/src/evalfunc.c index bad28de7cc..74ca2716ec 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -7560,6 +7560,13 @@ f_has(typval_T *argvars, typval_T *rettv) 1 #else 0 +#endif + }, + {"pango", +#ifdef FEAT_PRINT_PANGO + 1 +#else + 0 #endif }, {"printer", diff --git a/src/evalvars.c b/src/evalvars.c index 854cb1fc00..c08a9d6e08 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -412,7 +412,7 @@ eval_charconvert( return OK; } -#if defined(FEAT_POSTSCRIPT) +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) int eval_printexpr(char_u *fname, char_u *args) { diff --git a/src/feature.h b/src/feature.h index 5d5512615b..ee7475276c 100644 --- a/src/feature.h +++ b/src/feature.h @@ -291,17 +291,13 @@ && !defined(AMIGA) # define FEAT_PRINTER #endif -#if defined(FEAT_PRINTER) && ((defined(MSWIN) && defined(MSWINPS)) \ - || (!defined(MSWIN) && defined(FEAT_EVAL))) +#if defined(FEAT_PRINTER) && !defined(FEAT_PRINT_PANGO) \ + && ((defined(MSWIN) && defined(MSWINPS)) \ + || (!defined(MSWIN) && defined(FEAT_EVAL))) # define FEAT_POSTSCRIPT #endif - -/* - * +gtk_print Native GTK print dialog for :hardcopy (GTK4). - * Uses GtkPrintOperation + Pango/Cairo instead of PostScript. - */ -#if defined(FEAT_PRINTER) && defined(FEAT_GUI_GTK) && defined(USE_GTK4) -# define FEAT_GUI_GTK_PRINT +#if !defined(FEAT_PRINTER) && defined(FEAT_PRINT_PANGO) +# undef FEAT_PRINT_PANGO #endif /* diff --git a/src/globals.h b/src/globals.h index 8e0a37494e..305725c3e5 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1832,8 +1832,9 @@ extern cursorentry_T shape_table[SHAPE_IDX_COUNT]; # define OPT_PRINT_COLLATE 11 # define OPT_PRINT_JOBSPLIT 12 # define OPT_PRINT_FORMFEED 13 +# define OPT_PRINT_FORMAT 14 -# define OPT_PRINT_NUM_OPTIONS 14 +# define OPT_PRINT_NUM_OPTIONS 15 EXTERN option_table_T printer_opts[OPT_PRINT_NUM_OPTIONS] # ifdef DO_INIT @@ -1852,6 +1853,7 @@ EXTERN option_table_T printer_opts[OPT_PRINT_NUM_OPTIONS] {"collate", FALSE, 0, NULL, 0, FALSE}, {"jobsplit", FALSE, 0, NULL, 0, FALSE}, {"formfeed", FALSE, 0, NULL, 0, FALSE}, + {"format", FALSE, 0, NULL, 0, FALSE}, } # endif ; diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index f5fb4487df..40fa89d896 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -5043,322 +5043,188 @@ ex_helpfind(exarg_T *eap UNUSED) do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp"); } - /* * ============================================================ - * Printing with GtkPrintOperation + * Native print dialog * ============================================================ */ -#ifdef FEAT_GUI_GTK_PRINT -typedef struct -{ - linenr_T first_line; // first line to print (from range) - linenr_T last_line; // last line to print (from range) - int n_pages; // total number of pages - int lines_per_page; // lines that fit on one page - PangoFontDescription *font_desc; - int do_syntax; // whether to use syntax highlighting - double line_height; // line height in points - double char_width; // character width in points -} print_data_T; +#ifdef USE_GTK4_PRINT_DIALOG +static GtkPrintDialog *print_dialog = NULL; +static GtkPrintSettings *print_settings = NULL; +static GtkPageSetup *page_setup = NULL; +static GtkPrintSetup *print_setup = NULL; +static GFile *print_file; -/* - * "begin-print" signal handler. - * Calculate pagination based on page size and font metrics. - */ static void -print_begin_cb( - GtkPrintOperation *op, - GtkPrintContext *context, - gpointer user_data) +print_dialog_cb(GtkPrintDialog *dialog, GAsyncResult *result, gboolean *done) { - print_data_T *pd = (print_data_T *)user_data; - PangoLayout *layout; - PangoFontMetrics *metrics; - double page_height; - int total_lines; - - page_height = gtk_print_context_get_height(context); - - // Create a PangoLayout to measure font metrics on the print surface. - layout = gtk_print_context_create_pango_layout(context); - pango_layout_set_font_description(layout, pd->font_desc); - - metrics = pango_context_get_metrics( - pango_layout_get_context(layout), - pd->font_desc, NULL); - - pd->line_height = (double)(pango_font_metrics_get_ascent(metrics) - + pango_font_metrics_get_descent(metrics)) / PANGO_SCALE; - pd->char_width = (double)pango_font_metrics_get_approximate_char_width( - metrics) / PANGO_SCALE; - - pango_font_metrics_unref(metrics); - g_object_unref(layout); - - if (pd->line_height <= 0) - pd->line_height = 12.0; + GError *error = NULL; + print_setup = gtk_print_dialog_setup_finish(dialog, result, &error); - pd->lines_per_page = (int)(page_height / pd->line_height); - if (pd->lines_per_page <= 0) - pd->lines_per_page = 1; - - total_lines = (int)(pd->last_line - pd->first_line + 1); - pd->n_pages = (total_lines + pd->lines_per_page - 1) / pd->lines_per_page; - if (pd->n_pages <= 0) - pd->n_pages = 1; - - gtk_print_operation_set_n_pages(op, pd->n_pages); + if (print_setup == NULL) + { + semsg(_(e_print_error_str), error->message); + g_error_free(error); + } + *done = TRUE; } /* - * "draw-page" signal handler. - * Render one page of buffer text with optional syntax highlighting. + * Return file to write to on success (allocated string), or NULL on failure + * (e.g. user cancelled) */ - static void -print_draw_page_cb( - GtkPrintOperation *op UNUSED, - GtkPrintContext *context, - int page_nr, - gpointer user_data) + char_u * +gui_gtk4_print_dialog( + prt_settings_T *psettings, + char_u *jobname, + double *page_width, + double *page_height) { - print_data_T *pd = (print_data_T *)user_data; - cairo_t *cr; - linenr_T lnum; - linenr_T first; - linenr_T last; - double y; - - cr = gtk_print_context_get_cairo_context(context); + GtkPrintDialog *dialog = gtk_print_dialog_new(); + gboolean done = FALSE; + char_u *temp; - first = pd->first_line + (linenr_T)page_nr * pd->lines_per_page; - last = first + pd->lines_per_page - 1; - if (last > pd->last_line) - last = pd->last_line; + gtk_print_dialog_set_title(dialog, (const char *)jobname); + gtk_print_dialog_set_modal(dialog, TRUE); - y = 0; + print_dialog = NULL; + print_setup = NULL; - for (lnum = first; lnum <= last; ++lnum) + if (print_settings == NULL) { - char_u *line; - PangoLayout *layout; - PangoAttrList *attr_list; + option_table_T *opt; - line = ml_get(lnum); - layout = gtk_print_context_create_pango_layout(context); - pango_layout_set_font_description(layout, pd->font_desc); + print_settings = gtk_print_settings_new(); - attr_list = pango_attr_list_new(); - -# ifdef FEAT_SYN_HL - if (pd->do_syntax && syntax_present(curwin)) + opt = &printer_opts[OPT_PRINT_DUPLEX]; + if (opt->present) { - colnr_T col; - int prev_syn_id = -1; - int attr_start = 0; - long_u prev_fg = 0; - int prev_bold = FALSE; - int prev_italic = FALSE; - int len = (int)STRLEN(line); - - for (col = 0; col < len; ) - { - int id; - int outputlen; - long_u fg_color; - int is_bold; - int is_italic; - - if (has_mbyte) - { - outputlen = (*mb_ptr2len)(line + col); - if (outputlen < 1) - outputlen = 1; - } - else - outputlen = 1; - - id = syn_get_id(curwin, lnum, col, 1, NULL, FALSE); - if (id > 0) - id = syn_get_final_id(id); - else - id = 0; - // syn_get_id may invalidate the line pointer. - line = ml_get(lnum); - - fg_color = highlight_gui_color_rgb(id, TRUE); - is_bold = (highlight_has_attr(id, HL_BOLD, 'g') != NULL); - is_italic = (highlight_has_attr(id, HL_ITALIC, 'g') != NULL); - - // When attributes change, flush the previous run. - if (id != prev_syn_id && col > 0) - { - if (prev_fg != 0 && prev_fg != (long_u)0xffffffL) - { - PangoAttribute *a = pango_attr_foreground_new( - (guint16)(((prev_fg >> 16) & 0xff) * 257), - (guint16)(((prev_fg >> 8) & 0xff) * 257), - (guint16)((prev_fg & 0xff) * 257)); - a->start_index = attr_start; - a->end_index = col; - pango_attr_list_insert(attr_list, a); - } - if (prev_bold) - { - PangoAttribute *a = pango_attr_weight_new( - PANGO_WEIGHT_BOLD); - a->start_index = attr_start; - a->end_index = col; - pango_attr_list_insert(attr_list, a); - } - if (prev_italic) - { - PangoAttribute *a = pango_attr_style_new( - PANGO_STYLE_ITALIC); - a->start_index = attr_start; - a->end_index = col; - pango_attr_list_insert(attr_list, a); - } - attr_start = col; - } - - prev_syn_id = id; - prev_fg = fg_color; - prev_bold = is_bold; - prev_italic = is_italic; - - col += outputlen; - } + if (STRNICMP(opt->string, "off", 3) == 0) + gtk_print_settings_set_duplex(print_settings, + GTK_PRINT_DUPLEX_SIMPLEX); + else if (STRNICMP(opt->string, "short", 5) == 0) + gtk_print_settings_set_duplex(print_settings, + GTK_PRINT_DUPLEX_VERTICAL); + else + gtk_print_settings_set_duplex(print_settings, + GTK_PRINT_DUPLEX_HORIZONTAL); + } - // Flush the last run. - if (attr_start < len) - { - if (prev_fg != 0 && prev_fg != (long_u)0xffffffL) - { - PangoAttribute *a = pango_attr_foreground_new( - (guint16)(((prev_fg >> 16) & 0xff) * 257), - (guint16)(((prev_fg >> 8) & 0xff) * 257), - (guint16)((prev_fg & 0xff) * 257)); - a->start_index = attr_start; - a->end_index = len; - pango_attr_list_insert(attr_list, a); - } - if (prev_bold) - { - PangoAttribute *a = pango_attr_weight_new( - PANGO_WEIGHT_BOLD); - a->start_index = attr_start; - a->end_index = len; - pango_attr_list_insert(attr_list, a); - } - if (prev_italic) - { - PangoAttribute *a = pango_attr_style_new( - PANGO_STYLE_ITALIC); - a->start_index = attr_start; - a->end_index = len; - pango_attr_list_insert(attr_list, a); - } - } + opt = &printer_opts[OPT_PRINT_PORTRAIT]; + if (opt->present) + { + if (*opt->string == 'y') + gtk_print_settings_set_orientation(print_settings, + GTK_PAGE_ORIENTATION_PORTRAIT); + else + gtk_print_settings_set_orientation(print_settings, + GTK_PAGE_ORIENTATION_LANDSCAPE); } -# endif // FEAT_SYN_HL - pango_layout_set_attributes(layout, attr_list); + opt = &printer_opts[OPT_PRINT_PAPER]; + if (opt->present) + { + gtk_print_settings_set_paper_size(print_settings, + gtk_paper_size_new((const char *)opt->string)); + } - // Expand tabs. Use a tab array matching Vim's tabstop. + opt = &printer_opts[OPT_PRINT_COLLATE]; + if (opt->present) { - PangoTabArray *tabs; - int tab_width = (int)(curbuf->b_p_ts * pd->char_width); - - if (tab_width <= 0) - tab_width = (int)(8 * pd->char_width); - tabs = pango_tab_array_new(1, TRUE); - pango_tab_array_set_tab(tabs, 0, PANGO_TAB_LEFT, tab_width); - pango_layout_set_tabs(layout, tabs); - pango_tab_array_free(tabs); + if (*opt->string == 'y') + gtk_print_settings_set_collate(print_settings, TRUE); + else + gtk_print_settings_set_collate(print_settings, FALSE); } + } - pango_layout_set_text(layout, (const char *)line, -1); + if (page_setup == NULL) + page_setup = gtk_page_setup_new(); - cairo_move_to(cr, 0, y); - pango_cairo_show_layout(cr, layout); + gtk_print_dialog_set_print_settings(dialog, print_settings); + gtk_print_dialog_set_page_setup(dialog, page_setup); - pango_attr_list_unref(attr_list); - g_object_unref(layout); + gtk_print_dialog_setup(dialog, GTK_WINDOW(gui.mainwin), NULL, + (GAsyncReadyCallback)print_dialog_cb, &done); - y += pd->line_height; + while (!done) + g_main_context_iteration(NULL, TRUE); + + if (print_setup == NULL) + { + g_object_unref(dialog); + g_clear_pointer(&print_setup, gtk_print_setup_unref); + + psettings->user_abort_msg = FALSE; + return NULL; } -} -/* - * Main entry point for GTK4 native printing. - * Called from ex_hardcopy() when running in a GTK4 GUI. - */ - void -gui_gtk4_hardcopy(exarg_T *eap) -{ - GtkPrintOperation *op; - GtkPrintOperationResult res; - print_data_T pd; - char_u *font_name; + g_clear_object(&print_settings); + g_clear_object(&page_setup); + print_settings = g_object_ref( + gtk_print_setup_get_print_settings(print_setup)); + page_setup = g_object_ref(gtk_print_setup_get_page_setup(print_setup)); - static GtkPrintSettings *settings = NULL; + { + GtkPrintDuplex duplex = gtk_print_settings_get_duplex(print_settings); + psettings->duplex = duplex != GTK_PRINT_DUPLEX_SIMPLEX; + } - CLEAR_FIELD(pd); - pd.first_line = eap->line1; - pd.last_line = eap->line2; + psettings->has_color = gtk_print_settings_get_use_color(print_settings); - // Use 'printfont' if set, otherwise fall back to 'guifont'. - font_name = *p_pfn != NUL ? p_pfn : p_guifont; - if (font_name == NULL || *font_name == NUL) - font_name = (char_u *)"Monospace 10"; + *page_width = gtk_page_setup_get_paper_width(page_setup, + GTK_UNIT_POINTS); + *page_height = gtk_page_setup_get_paper_height(page_setup, + GTK_UNIT_POINTS); - pd.font_desc = pango_font_description_from_string((const char *)font_name); - if (pd.font_desc == NULL) + temp = vim_tempname('p', FALSE); + if (temp == NULL) { - semsg(_(e_unknown_font_str), font_name); - return; - } + emsg(_(e_cant_find_temp_file_for_writing)); + g_clear_object(&dialog); + g_clear_pointer(&print_setup, gtk_print_setup_unref); - // Ensure the font description has a size (default 10pt if missing). - if (pango_font_description_get_size(pd.font_desc) == 0) - pango_font_description_set_size(pd.font_desc, 10 * PANGO_SCALE); + psettings->user_abort_msg = FALSE; + return NULL; + } + print_file = g_file_new_for_path((char *)temp); -# ifdef FEAT_SYN_HL - pd.do_syntax = syntax_present(curwin); -# endif + print_dialog = dialog; - op = gtk_print_operation_new(); + return temp; +} - if (settings != NULL) - gtk_print_operation_set_print_settings(op, settings); + static void +print_file_cb( + GtkPrintDialog *dialog, + GAsyncResult *result, + GFile *file) +{ + char *path = g_file_get_path(file); - gtk_print_operation_set_job_name(op, - curbuf->b_fname != NULL - ? (const char *)curbuf->b_fname : "Vim"); - gtk_print_operation_set_show_progress(op, TRUE); - gtk_print_operation_set_unit(op, GTK_UNIT_POINTS); + (void)gtk_print_dialog_print_file_finish(dialog, result, NULL); + g_object_unref(dialog); - g_signal_connect(op, "begin-print", G_CALLBACK(print_begin_cb), &pd); - g_signal_connect(op, "draw-page", G_CALLBACK(print_draw_page_cb), &pd); + // Don't use g_file_delete() to be consistent + mch_remove(path); + g_free(path); +} - res = gtk_print_operation_run(op, - GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, - GTK_WINDOW(gui.mainwin), NULL); - if (res == GTK_PRINT_OPERATION_RESULT_APPLY) + void +gui_gtk4_print_finish(void) +{ + if (print_dialog != NULL) { - if (settings != NULL) - g_object_unref(settings); - settings = g_object_ref( - gtk_print_operation_get_print_settings(op)); + gtk_print_dialog_print_file( + print_dialog, GTK_WINDOW(gui.mainwin), + print_setup, print_file, NULL, + (GAsyncReadyCallback)print_file_cb, print_file); + print_dialog = NULL; + g_clear_pointer(&print_setup, gtk_print_setup_unref); } - - g_object_unref(op); - pango_font_description_free(pd.font_desc); } - -#endif // FEAT_GUI_GTK_PRINT +#endif // USE_GTK4_PRINT_DIALOG #endif // FEAT_GUI_GTK diff --git a/src/hardcopy.c b/src/hardcopy.c index 10c3beb8f1..d7f2298950 100644 --- a/src/hardcopy.c +++ b/src/hardcopy.c @@ -15,6 +15,15 @@ #include "version.h" #if defined(FEAT_PRINTER) + +#include "hardcopy.h" +#ifdef FEAT_POSTSCRIPT +# include "hardcopy_postscript.h" +#endif +#ifdef FEAT_PRINT_PANGO +# include "hardcopy_pango.h" +#endif + /* * To implement printing on a platform, the following functions must be * defined: @@ -92,35 +101,12 @@ static const long_u cterm_color_16[16] = static int current_syn_id; #endif -#define PRCOLOR_BLACK (long_u)0 -#define PRCOLOR_WHITE (long_u)0xFFFFFFL - -static int curr_italic; -static int curr_bold; -static int curr_underline; -static long_u curr_bg; -static long_u curr_fg; -static int page_count; - -#if defined(FEAT_POSTSCRIPT) -# define OPT_MBFONT_USECOURIER 0 -# define OPT_MBFONT_ASCII 1 -# define OPT_MBFONT_REGULAR 2 -# define OPT_MBFONT_BOLD 3 -# define OPT_MBFONT_OBLIQUE 4 -# define OPT_MBFONT_BOLDOBLIQUE 5 -# define OPT_MBFONT_NUM_OPTIONS 6 - -static option_table_T mbfont_opts[OPT_MBFONT_NUM_OPTIONS] = -{ - {"c", FALSE, 0, NULL, 0, FALSE}, - {"a", FALSE, 0, NULL, 0, FALSE}, - {"r", FALSE, 0, NULL, 0, FALSE}, - {"b", FALSE, 0, NULL, 0, FALSE}, - {"i", FALSE, 0, NULL, 0, FALSE}, - {"o", FALSE, 0, NULL, 0, FALSE}, -}; -#endif +int prt_curr_italic; +int prt_curr_bold; +int prt_curr_underline; +long_u prt_curr_bg; +long_u prt_curr_fg; +int prt_page_count; /* * These values determine the print position on a page. @@ -135,6 +121,25 @@ typedef struct int ff; // seen form feed character } prt_pos_T; +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) +prt_mediasize_T prt_mediasize[PRT_MEDIASIZE_LEN] = { + {"A4", 595.0, 842.0}, + {"letter", 612.0, 792.0}, + {"10x14", 720.0, 1008.0}, + {"A3", 842.0, 1191.0}, + {"A5", 420.0, 595.0}, + {"B4", 729.0, 1032.0}, + {"B5", 516.0, 729.0}, + {"executive", 522.0, 756.0}, + {"folio", 595.0, 935.0}, + {"ledger", 1224.0, 792.0}, + {"legal", 612.0, 1008.0}, + {"quarto", 610.0, 780.0}, + {"statement", 396.0, 612.0}, + {"tabloid", 792.0, 1224.0} +}; +#endif + static char *parse_list_options(char_u *option_str, option_table_T *table, int table_size); static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T *ppos); @@ -334,34 +339,34 @@ prt_get_attr( static void prt_set_fg(long_u fg) { - if (fg == curr_fg) + if (fg == prt_curr_fg) return; - curr_fg = fg; + prt_curr_fg = fg; mch_print_set_fg(fg); } static void prt_set_bg(long_u bg) { - if (bg == curr_bg) + if (bg == prt_curr_bg) return; - curr_bg = bg; + prt_curr_bg = bg; mch_print_set_bg(bg); } static void prt_set_font(int bold, int italic, int underline) { - if (curr_bold == bold - && curr_italic == italic - && curr_underline == underline) + if (prt_curr_bold == bold + && prt_curr_italic == italic + && prt_curr_underline == underline) return; - curr_underline = underline; - curr_italic = italic; - curr_bold = bold; + prt_curr_underline = underline; + prt_curr_italic = italic; + prt_curr_bold = bold; mch_print_set_font(bold, italic, underline); } @@ -539,7 +544,7 @@ prt_header( /* * Display a print status message. */ - static void + void prt_message(char_u *s) { screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0); @@ -559,18 +564,11 @@ ex_hardcopy(exarg_T *eap) CLEAR_FIELD(settings); settings.has_color = TRUE; - -#ifdef FEAT_GUI_GTK_PRINT - // Use the native GTK print dialog only for interactive printing; - // ":hardcopy >file" must fall through to the PostScript writer. - if (gui.in_use && *eap->arg != '>') - { - gui_gtk4_hardcopy(eap); - return; - } +#ifdef FEAT_PRINT_PANGO + settings.user_abort_msg = TRUE; #endif -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) if (*eap->arg == '>') { char *errormsg = NULL; @@ -659,11 +657,11 @@ ex_hardcopy(exarg_T *eap) } // Set colors and font to normal. - curr_bg = (long_u)0xffffffffL; - curr_fg = (long_u)0xffffffffL; - curr_italic = MAYBE; - curr_bold = MAYBE; - curr_underline = MAYBE; + prt_curr_bg = (long_u)0xffffffffL; + prt_curr_fg = (long_u)0xffffffffL; + prt_curr_italic = MAYBE; + prt_curr_bold = MAYBE; + prt_curr_underline = MAYBE; prt_set_fg(PRCOLOR_BLACK); prt_set_bg(PRCOLOR_WHITE); @@ -681,7 +679,7 @@ ex_hardcopy(exarg_T *eap) /* * Loop over collated copies: 1 2 3, 1 2 3, ... */ - page_count = 0; + prt_page_count = 0; for (collated_copies = 0; collated_copies < settings.n_collated_copies; collated_copies++) @@ -705,7 +703,7 @@ ex_hardcopy(exarg_T *eap) /* * Loop over all pages in the print job: 1 2 3 ... */ - for (page_count = 0; prtpos.file_line <= eap->line2; ++page_count) + for (prt_page_count = 0; prtpos.file_line <= eap->line2; ++prt_page_count) { /* * Loop over uncollated copies: 1 1 1, 2 2 2, 3 3 3, ... @@ -733,7 +731,7 @@ ex_hardcopy(exarg_T *eap) goto print_fail; sprintf((char *)IObuff, _("Printing page %d (%d%%)"), - page_count + 1 + side, + prt_page_count + 1 + side, prtpos.bytes_printed > 1000000 ? (int)(prtpos.bytes_printed / (bytes_to_print / 100)) @@ -753,7 +751,7 @@ ex_hardcopy(exarg_T *eap) * Output header if required */ if (prt_header_height() > 0) - prt_header(&settings, page_count + 1 + side, + prt_header(&settings, prt_page_count + 1 + side, prtpos.file_line); for (page_line = 0; page_line < settings.lines_per_page; @@ -796,7 +794,7 @@ ex_hardcopy(exarg_T *eap) } } if (settings.duplex && prtpos.file_line <= eap->line2) - ++page_count; + ++prt_page_count; // Remember the position where the next page starts. page_prtpos = prtpos; @@ -808,7 +806,11 @@ ex_hardcopy(exarg_T *eap) } print_fail: - if (got_int || settings.user_abort) + if (got_int || (settings.user_abort +#ifdef FEAT_PRINT_PANGO + && settings.user_abort_msg +#endif + )) { sprintf((char *)IObuff, "%s", _("Printing aborted")); prt_message(IObuff); @@ -950,2519 +952,4 @@ hardcopy_line( return col; } -#if defined(FEAT_POSTSCRIPT) - -/* - * PS printer stuff. - * - * Sources of information to help maintain the PS printing code: - * - * 1. PostScript Language Reference, 3rd Edition, - * Addison-Wesley, 1999, ISBN 0-201-37922-8 - * 2. PostScript Language Program Design, - * Addison-Wesley, 1988, ISBN 0-201-14396-8 - * 3. PostScript Tutorial and Cookbook, - * Addison Wesley, 1985, ISBN 0-201-10179-3 - * 4. PostScript Language Document Structuring Conventions Specification, - * version 3.0, - * Adobe Technote 5001, 25th September 1992 - * 5. PostScript Printer Description File Format Specification, Version 4.3, - * Adobe technote 5003, 9th February 1996 - * 6. Adobe Font Metrics File Format Specification, Version 4.1, - * Adobe Technote 5007, 7th October 1998 - * 7. Adobe CMap and CIDFont Files Specification, Version 1.0, - * Adobe Technote 5014, 8th October 1996 - * 8. Adobe CJKV Character Collections and CMaps for CID-Keyed Fonts, - * Adoboe Technote 5094, 8th September, 2001 - * 9. CJKV Information Processing, 2nd Edition, - * O'Reilly, 2002, ISBN 1-56592-224-7 - * - * Some of these documents can be found in PDF form on Adobe's web site - - * http://www.adobe.com - */ - -# define PRT_PS_DEFAULT_DPI (72) // Default user space resolution -# define PRT_PS_DEFAULT_FONTSIZE (10) -# define PRT_PS_DEFAULT_BUFFER_SIZE (80) - -struct prt_mediasize_S -{ - char *name; - float width; // width and height in points for portrait - float height; -}; - -# define PRT_MEDIASIZE_LEN ARRAY_LENGTH(prt_mediasize) - -static struct prt_mediasize_S prt_mediasize[] = -{ - {"A4", 595.0, 842.0}, - {"letter", 612.0, 792.0}, - {"10x14", 720.0, 1008.0}, - {"A3", 842.0, 1191.0}, - {"A5", 420.0, 595.0}, - {"B4", 729.0, 1032.0}, - {"B5", 516.0, 729.0}, - {"executive", 522.0, 756.0}, - {"folio", 595.0, 935.0}, - {"ledger", 1224.0, 792.0}, // Yes, it is wider than taller! - {"legal", 612.0, 1008.0}, - {"quarto", 610.0, 780.0}, - {"statement", 396.0, 612.0}, - {"tabloid", 792.0, 1224.0} -}; - -// PS font names, must be in Roman, Bold, Italic, Bold-Italic order -struct prt_ps_font_S -{ - int wx; - int uline_offset; - int uline_width; - int bbox_min_y; - int bbox_max_y; - char *(ps_fontname[4]); -}; - -# define PRT_PS_FONT_ROMAN (0) -# define PRT_PS_FONT_BOLD (1) -# define PRT_PS_FONT_OBLIQUE (2) -# define PRT_PS_FONT_BOLDOBLIQUE (3) - -// Standard font metrics for Courier family -static struct prt_ps_font_S prt_ps_courier_font = -{ - 600, - -100, 50, - -250, 805, - {"Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique"} -}; - -// Generic font metrics for multi-byte fonts -static struct prt_ps_font_S prt_ps_mb_font = -{ - 1000, - -100, 50, - -250, 805, - {NULL, NULL, NULL, NULL} -}; - -// Pointer to current font set being used -static struct prt_ps_font_S* prt_ps_font; - -// Structures to map user named encoding and mapping to PS equivalents for -// building CID font name -struct prt_ps_encoding_S -{ - char *encoding; - char *cmap_encoding; - int needs_charset; -}; - -struct prt_ps_charset_S -{ - char *charset; - char *cmap_charset; - int has_charset; -}; - - -# define CS_JIS_C_1978 (0x01) -# define CS_JIS_X_1983 (0x02) -# define CS_JIS_X_1990 (0x04) -# define CS_NEC (0x08) -# define CS_MSWINDOWS (0x10) -# define CS_CP932 (0x20) -# define CS_KANJITALK6 (0x40) -# define CS_KANJITALK7 (0x80) - -// Japanese encodings and charsets -static struct prt_ps_encoding_S j_encodings[] = -{ - {"iso-2022-jp", NULL, (CS_JIS_C_1978|CS_JIS_X_1983|CS_JIS_X_1990| - CS_NEC)}, - {"euc-jp", "EUC", (CS_JIS_C_1978|CS_JIS_X_1983|CS_JIS_X_1990)}, - {"sjis", "RKSJ", (CS_JIS_C_1978|CS_JIS_X_1983|CS_MSWINDOWS| - CS_KANJITALK6|CS_KANJITALK7)}, - {"cp932", "RKSJ", CS_JIS_X_1983}, - {"ucs-2", "UCS2", CS_JIS_X_1990}, - {"utf-8", "UTF8" , CS_JIS_X_1990} -}; -static struct prt_ps_charset_S j_charsets[] = -{ - {"JIS_C_1978", "78", CS_JIS_C_1978}, - {"JIS_X_1983", NULL, CS_JIS_X_1983}, - {"JIS_X_1990", "Hojo", CS_JIS_X_1990}, - {"NEC", "Ext", CS_NEC}, - {"MSWINDOWS", "90ms", CS_MSWINDOWS}, - {"CP932", "90ms", CS_JIS_X_1983}, - {"KANJITALK6", "83pv", CS_KANJITALK6}, - {"KANJITALK7", "90pv", CS_KANJITALK7} -}; - -# define CS_GB_2312_80 (0x01) -# define CS_GBT_12345_90 (0x02) -# define CS_GBK2K (0x04) -# define CS_SC_MAC (0x08) -# define CS_GBT_90_MAC (0x10) -# define CS_GBK (0x20) -# define CS_SC_ISO10646 (0x40) - -// Simplified Chinese encodings and charsets -static struct prt_ps_encoding_S sc_encodings[] = -{ - {"iso-2022", NULL, (CS_GB_2312_80|CS_GBT_12345_90)}, - {"gb18030", NULL, CS_GBK2K}, - {"euc-cn", "EUC", (CS_GB_2312_80|CS_GBT_12345_90|CS_SC_MAC| - CS_GBT_90_MAC)}, - {"gbk", "EUC", CS_GBK}, - {"ucs-2", "UCS2", CS_SC_ISO10646}, - {"utf-8", "UTF8", CS_SC_ISO10646} -}; -static struct prt_ps_charset_S sc_charsets[] = -{ - {"GB_2312-80", "GB", CS_GB_2312_80}, - {"GBT_12345-90","GBT", CS_GBT_12345_90}, - {"MAC", "GBpc", CS_SC_MAC}, - {"GBT-90_MAC", "GBTpc", CS_GBT_90_MAC}, - {"GBK", "GBK", CS_GBK}, - {"GB18030", "GBK2K", CS_GBK2K}, - {"ISO10646", "UniGB", CS_SC_ISO10646} -}; - -# define CS_CNS_PLANE_1 (0x01) -# define CS_CNS_PLANE_2 (0x02) -# define CS_CNS_PLANE_1_2 (0x04) -# define CS_B5 (0x08) -# define CS_ETEN (0x10) -# define CS_HK_GCCS (0x20) -# define CS_HK_SCS (0x40) -# define CS_HK_SCS_ETEN (0x80) -# define CS_MTHKL (0x100) -# define CS_MTHKS (0x200) -# define CS_DLHKL (0x400) -# define CS_DLHKS (0x800) -# define CS_TC_ISO10646 (0x1000) - -// Traditional Chinese encodings and charsets -static struct prt_ps_encoding_S tc_encodings[] = -{ - {"iso-2022", NULL, (CS_CNS_PLANE_1|CS_CNS_PLANE_2)}, - {"euc-tw", "EUC", CS_CNS_PLANE_1_2}, - {"big5", "B5", (CS_B5|CS_ETEN|CS_HK_GCCS|CS_HK_SCS| - CS_HK_SCS_ETEN|CS_MTHKL|CS_MTHKS|CS_DLHKL| - CS_DLHKS)}, - {"cp950", "B5", CS_B5}, - {"ucs-2", "UCS2", CS_TC_ISO10646}, - {"utf-8", "UTF8", CS_TC_ISO10646}, - {"utf-16", "UTF16", CS_TC_ISO10646}, - {"utf-32", "UTF32", CS_TC_ISO10646} -}; -static struct prt_ps_charset_S tc_charsets[] = -{ - {"CNS_1992_1", "CNS1", CS_CNS_PLANE_1}, - {"CNS_1992_2", "CNS2", CS_CNS_PLANE_2}, - {"CNS_1993", "CNS", CS_CNS_PLANE_1_2}, - {"BIG5", NULL, CS_B5}, - {"CP950", NULL, CS_B5}, - {"ETEN", "ETen", CS_ETEN}, - {"HK_GCCS", "HKgccs", CS_HK_GCCS}, - {"SCS", "HKscs", CS_HK_SCS}, - {"SCS_ETEN", "ETHK", CS_HK_SCS_ETEN}, - {"MTHKL", "HKm471", CS_MTHKL}, - {"MTHKS", "HKm314", CS_MTHKS}, - {"DLHKL", "HKdla", CS_DLHKL}, - {"DLHKS", "HKdlb", CS_DLHKS}, - {"ISO10646", "UniCNS", CS_TC_ISO10646} -}; - -# define CS_KR_X_1992 (0x01) -# define CS_KR_MAC (0x02) -# define CS_KR_X_1992_MS (0x04) -# define CS_KR_ISO10646 (0x08) - -// Korean encodings and charsets -static struct prt_ps_encoding_S k_encodings[] = -{ - {"iso-2022-kr", NULL, CS_KR_X_1992}, - {"euc-kr", "EUC", (CS_KR_X_1992|CS_KR_MAC)}, - {"johab", "Johab", CS_KR_X_1992}, - {"cp1361", "Johab", CS_KR_X_1992}, - {"uhc", "UHC", CS_KR_X_1992_MS}, - {"cp949", "UHC", CS_KR_X_1992_MS}, - {"ucs-2", "UCS2", CS_KR_ISO10646}, - {"utf-8", "UTF8", CS_KR_ISO10646} -}; -static struct prt_ps_charset_S k_charsets[] = -{ - {"KS_X_1992", "KSC", CS_KR_X_1992}, - {"CP1361", "KSC", CS_KR_X_1992}, - {"MAC", "KSCpc", CS_KR_MAC}, - {"MSWINDOWS", "KSCms", CS_KR_X_1992_MS}, - {"CP949", "KSCms", CS_KR_X_1992_MS}, - {"WANSUNG", "KSCms", CS_KR_X_1992_MS}, - {"ISO10646", "UniKS", CS_KR_ISO10646} -}; - -// Collections of encodings and charsets for multi-byte printing -struct prt_ps_mbfont_S -{ - int num_encodings; - struct prt_ps_encoding_S *encodings; - int num_charsets; - struct prt_ps_charset_S *charsets; - char *ascii_enc; - char *defcs; -}; - -static struct prt_ps_mbfont_S prt_ps_mbfonts[] = -{ - { - ARRAY_LENGTH(j_encodings), - j_encodings, - ARRAY_LENGTH(j_charsets), - j_charsets, - "jis_roman", - "JIS_X_1983" - }, - { - ARRAY_LENGTH(sc_encodings), - sc_encodings, - ARRAY_LENGTH(sc_charsets), - sc_charsets, - "gb_roman", - "GB_2312-80" - }, - { - ARRAY_LENGTH(tc_encodings), - tc_encodings, - ARRAY_LENGTH(tc_charsets), - tc_charsets, - "cns_roman", - "BIG5" - }, - { - ARRAY_LENGTH(k_encodings), - k_encodings, - ARRAY_LENGTH(k_charsets), - k_charsets, - "ks_roman", - "KS_X_1992" - } -}; - -struct prt_ps_resource_S -{ - char_u name[64]; - char_u filename[MAXPATHL + 1]; - int type; - char_u title[256]; - char_u version[256]; -}; - -// Types of PS resource file currently used -# define PRT_RESOURCE_TYPE_PROCSET (0) -# define PRT_RESOURCE_TYPE_ENCODING (1) -# define PRT_RESOURCE_TYPE_CMAP (2) - -// The PS prolog file version number has to match - if the prolog file is -// updated, increment the number in the file and here. Version checking was -// added as of VIM 6.2. -// The CID prolog file version number behaves as per PS prolog. -// Table of VIM and prolog versions: -// -// VIM Prolog CIDProlog -// 6.2 1.3 -// 7.0 1.4 1.0 -# define PRT_PROLOG_VERSION ((char_u *)"1.4") -# define PRT_CID_PROLOG_VERSION ((char_u *)"1.0") - -// String versions of PS resource types - indexed by constants above so don't -// re-order! -static char *prt_resource_types[] = -{ - "procset", - "encoding", - "cmap" -}; - -// Strings to look for in a PS resource file -# define PRT_RESOURCE_HEADER "%!PS-Adobe-" -# define PRT_RESOURCE_RESOURCE "Resource-" -# define PRT_RESOURCE_PROCSET "ProcSet" -# define PRT_RESOURCE_ENCODING "Encoding" -# define PRT_RESOURCE_CMAP "CMap" - - -// Data for table based DSC comment recognition, easy to extend if VIM needs to -// read more comments. -# define PRT_DSC_MISC_TYPE (-1) -# define PRT_DSC_TITLE_TYPE (1) -# define PRT_DSC_VERSION_TYPE (2) -# define PRT_DSC_ENDCOMMENTS_TYPE (3) - -# define PRT_DSC_TITLE "%%Title:" -# define PRT_DSC_VERSION "%%Version:" -# define PRT_DSC_ENDCOMMENTS "%%EndComments:" - -struct prt_dsc_comment_S -{ - char *string; - int len; - int type; -}; - -struct prt_dsc_line_S -{ - int type; - char_u *string; - int len; -}; - - -# define SIZEOF_CSTR(s) (sizeof(s) - 1) -static struct prt_dsc_comment_S prt_dsc_table[] = -{ - {PRT_DSC_TITLE, SIZEOF_CSTR(PRT_DSC_TITLE), PRT_DSC_TITLE_TYPE}, - {PRT_DSC_VERSION, SIZEOF_CSTR(PRT_DSC_VERSION), - PRT_DSC_VERSION_TYPE}, - {PRT_DSC_ENDCOMMENTS, SIZEOF_CSTR(PRT_DSC_ENDCOMMENTS), - PRT_DSC_ENDCOMMENTS_TYPE} -}; - -static void prt_write_file_len(char_u *buffer, int bytes); -static int prt_next_dsc(struct prt_dsc_line_S *p_dsc_line); - -/* - * Variables for the output PostScript file. - */ -static FILE *prt_ps_fd; -static int prt_file_error; -static char_u *prt_ps_file_name = NULL; - -/* - * Various offsets and dimensions in default PostScript user space (points). - * Used for text positioning calculations - */ -static float prt_page_width; -static float prt_page_height; -static float prt_left_margin; -static float prt_right_margin; -static float prt_top_margin; -static float prt_bottom_margin; -static float prt_line_height; -static float prt_first_line_height; -static float prt_char_width; -static float prt_number_width; -static float prt_bgcol_offset; -static float prt_pos_x_moveto = 0.0; -static float prt_pos_y_moveto = 0.0; - -/* - * Various control variables used to decide when and how to change the - * PostScript graphics state. - */ -static int prt_need_moveto; -static int prt_do_moveto; -static int prt_need_font; -static int prt_font; -static int prt_need_underline; -static int prt_underline; -static int prt_do_underline; -static int prt_need_fgcol; -static int prt_fgcol; -static int prt_need_bgcol; -static int prt_do_bgcol; -static int prt_bgcol; -static int prt_new_bgcol; -static int prt_attribute_change; -static float prt_text_run; -static int prt_page_num; -static int prt_bufsiz; - -/* - * Variables controlling physical printing. - */ -static int prt_media; -static int prt_portrait; -static int prt_num_copies; -static int prt_duplex; -static int prt_tumble; -static int prt_collate; - -/* - * Buffers used when generating PostScript output - */ -static char_u prt_line_buffer[257]; -static garray_T prt_ps_buffer; - -static int prt_do_conv; -static vimconv_T prt_conv; - -static int prt_out_mbyte; -static int prt_custom_cmap; -static char prt_cmap[80]; -static int prt_use_courier; -static int prt_in_ascii; -static int prt_half_width; -static char *prt_ascii_encoding; -static const char_u prt_hexchar[] = "0123456789abcdef"; - - static void -prt_write_file_raw_len(char_u *buffer, int bytes) -{ - if (!prt_file_error - && fwrite(buffer, sizeof(char_u), bytes, prt_ps_fd) - != (size_t)bytes) - { - emsg(_(e_error_writing_to_postscript_output_file)); - prt_file_error = TRUE; - } -} - - static void -prt_write_file(char_u *buffer) -{ - prt_write_file_len(buffer, (int)STRLEN(buffer)); -} - - static void -prt_write_file_len(char_u *buffer, int bytes) -{ - prt_write_file_raw_len(buffer, bytes); -} - -/* - * Write a string. - */ - static void -prt_write_string(char *s) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), "%s", s); - prt_write_file(prt_line_buffer); -} - -/* - * Write an int and a space. - */ - static void -prt_write_int(int i) -{ - sprintf((char *)prt_line_buffer, "%d ", i); - prt_write_file(prt_line_buffer); -} - -/* - * Write a boolean and a space. - */ - static void -prt_write_boolean(int b) -{ - sprintf((char *)prt_line_buffer, "%s ", (b ? "T" : "F")); - prt_write_file(prt_line_buffer); -} - -/* - * Write PostScript to re-encode and define the font. - */ - static void -prt_def_font( - char *new_name, - char *encoding, - int height, - char *font) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "/_%s /VIM-%s /%s ref\n", new_name, encoding, font); - prt_write_file(prt_line_buffer); - if (prt_out_mbyte) - sprintf((char *)prt_line_buffer, "/%s %d %f /_%s sffs\n", - new_name, height, 500./prt_ps_courier_font.wx, new_name); - else - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "/%s %d /_%s ffs\n", new_name, height, new_name); - prt_write_file(prt_line_buffer); -} - -/* - * Write a line to define the CID font. - */ - static void -prt_def_cidfont(char *new_name, int height, char *cidfont) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "/_%s /%s[/%s] vim_composefont\n", new_name, prt_cmap, cidfont); - prt_write_file(prt_line_buffer); - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "/%s %d /_%s ffs\n", new_name, height, new_name); - prt_write_file(prt_line_buffer); -} - -/* - * Write a line to define a duplicate of a CID font - */ - static void -prt_dup_cidfont(char *original_name, char *new_name) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "/%s %s d\n", new_name, original_name); - prt_write_file(prt_line_buffer); -} - -/* - * Convert a real value into an integer and fractional part as integers, with - * the fractional part being in the range [0,10^precision). The fractional part - * is also rounded based on the precision + 1'th fractional digit. - */ - static void -prt_real_bits( - double real, - int precision, - int *pinteger, - int *pfraction) -{ - int i; - int integer; - float fraction; - - integer = (int)real; - fraction = (float)(real - integer); - if (real < (double)integer) - fraction = -fraction; - for (i = 0; i < precision; i++) - fraction *= 10.0; - - *pinteger = integer; - *pfraction = (int)(fraction + 0.5); -} - -/* - * Write a real and a space. Save bytes if real value has no fractional part! - * We use prt_real_bits() as %f in sprintf uses the locale setting to decide - * what decimal point character to use, but PS always requires a '.'. - */ - static void -prt_write_real(double val, int prec) -{ - int integer; - int fraction; - - prt_real_bits(val, prec, &integer, &fraction); - // Emit integer part - sprintf((char *)prt_line_buffer, "%d", integer); - prt_write_file(prt_line_buffer); - // Only emit fraction if necessary - if (fraction != 0) - { - // Remove any trailing zeros - while ((fraction % 10) == 0) - { - prec--; - fraction /= 10; - } - // Emit fraction left padded with zeros - sprintf((char *)prt_line_buffer, ".%0*d", prec, fraction); - prt_write_file(prt_line_buffer); - } - sprintf((char *)prt_line_buffer, " "); - prt_write_file(prt_line_buffer); -} - -/* - * Write a line to define a numeric variable. - */ - static void -prt_def_var(char *name, double value, int prec) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "/%s ", name); - prt_write_file(prt_line_buffer); - prt_write_real(value, prec); - sprintf((char *)prt_line_buffer, "d\n"); - prt_write_file(prt_line_buffer); -} - -// Convert size from font space to user space at current font scale -# define PRT_PS_FONT_TO_USER(scale, size) ((size) * ((scale)/1000.0)) - - static void -prt_flush_buffer(void) -{ - if (prt_ps_buffer.ga_len <= 0) - return; - - // Any background color must be drawn first - if (prt_do_bgcol && (prt_new_bgcol != PRCOLOR_WHITE)) - { - int r, g, b; - - if (prt_do_moveto) - { - prt_write_real(prt_pos_x_moveto, 2); - prt_write_real(prt_pos_y_moveto, 2); - prt_write_string("m\n"); - prt_do_moveto = FALSE; - } - - // Size of rect of background color on which text is printed - prt_write_real(prt_text_run, 2); - prt_write_real(prt_line_height, 2); - - // Lastly add the color of the background - r = ((unsigned)prt_new_bgcol & 0xff0000) >> 16; - g = ((unsigned)prt_new_bgcol & 0xff00) >> 8; - b = prt_new_bgcol & 0xff; - prt_write_real(r / 255.0, 3); - prt_write_real(g / 255.0, 3); - prt_write_real(b / 255.0, 3); - prt_write_string("bg\n"); - } - // Draw underlines before the text as it makes it slightly easier to - // find the starting point. - if (prt_do_underline) - { - if (prt_do_moveto) - { - prt_write_real(prt_pos_x_moveto, 2); - prt_write_real(prt_pos_y_moveto, 2); - prt_write_string("m\n"); - prt_do_moveto = FALSE; - } - - // Underline length of text run - prt_write_real(prt_text_run, 2); - prt_write_string("ul\n"); - } - // Draw the text - if (prt_out_mbyte) - prt_write_string("<"); - else - prt_write_string("("); - prt_write_file_raw_len(prt_ps_buffer.ga_data, prt_ps_buffer.ga_len); - if (prt_out_mbyte) - prt_write_string(">"); - else - prt_write_string(")"); - // Add a moveto if need be and use the appropriate show procedure - if (prt_do_moveto) - { - prt_write_real(prt_pos_x_moveto, 2); - prt_write_real(prt_pos_y_moveto, 2); - // moveto and a show - prt_write_string("ms\n"); - prt_do_moveto = FALSE; - } - else // Simple show - prt_write_string("s\n"); - - ga_clear(&prt_ps_buffer); - ga_init2(&prt_ps_buffer, sizeof(char), prt_bufsiz); -} - - - static void -prt_resource_name(char_u *filename, void *cookie) -{ - char_u *resource_filename = cookie; - - if (STRLEN(filename) >= MAXPATHL) - *resource_filename = NUL; - else - STRCPY(resource_filename, filename); -} - - static int -prt_find_resource(char *name, struct prt_ps_resource_S *resource) -{ - char_u *buffer; - int retval; - - buffer = alloc(MAXPATHL + 1); - if (buffer == NULL) - return FALSE; - - vim_strncpy(resource->name, (char_u *)name, 63); - // Look for named resource file in runtimepath - STRCPY(buffer, "print"); - add_pathsep(buffer); - vim_strcat(buffer, (char_u *)name, MAXPATHL); - vim_strcat(buffer, (char_u *)".ps", MAXPATHL); - resource->filename[0] = NUL; - retval = (do_in_runtimepath(buffer, 0, prt_resource_name, - resource->filename) - && resource->filename[0] != NUL); - vim_free(buffer); - return retval; -} - -// PS CR and LF characters have platform independent values -# define PSLF (0x0a) -# define PSCR (0x0d) - -// Static buffer to read initial comments in a resource file, some can have a -// couple of KB of comments! -# define PRT_FILE_BUFFER_LEN (2048) -struct prt_resfile_buffer_S -{ - char_u buffer[PRT_FILE_BUFFER_LEN]; - int len; - int line_start; - int line_end; -}; - -static struct prt_resfile_buffer_S prt_resfile; - - static int -prt_resfile_next_line(void) -{ - int idx; - - // Move to start of next line and then find end of line - idx = prt_resfile.line_end + 1; - while (idx < prt_resfile.len) - { - if (prt_resfile.buffer[idx] != PSLF && prt_resfile.buffer[idx] != PSCR) - break; - idx++; - } - prt_resfile.line_start = idx; - - while (idx < prt_resfile.len) - { - if (prt_resfile.buffer[idx] == PSLF || prt_resfile.buffer[idx] == PSCR) - break; - idx++; - } - prt_resfile.line_end = idx; - - return (idx < prt_resfile.len); -} - - static int -prt_resfile_strncmp(int offset, char *string, int len) -{ - // Force not equal if string is longer than remainder of line - if (len > (prt_resfile.line_end - (prt_resfile.line_start + offset))) - return 1; - - return STRNCMP(&prt_resfile.buffer[prt_resfile.line_start + offset], - string, len); -} - - static int -prt_resfile_skip_nonws(int offset) -{ - int idx; - - idx = prt_resfile.line_start + offset; - while (idx < prt_resfile.line_end) - { - if (SAFE_isspace(prt_resfile.buffer[idx])) - return idx - prt_resfile.line_start; - idx++; - } - return -1; -} - - static int -prt_resfile_skip_ws(int offset) -{ - int idx; - - idx = prt_resfile.line_start + offset; - while (idx < prt_resfile.line_end) - { - if (!SAFE_isspace(prt_resfile.buffer[idx])) - return idx - prt_resfile.line_start; - idx++; - } - return -1; -} - -// prt_next_dsc() - returns detail on next DSC comment line found. Returns true -// if a DSC comment is found, else false - static int -prt_next_dsc(struct prt_dsc_line_S *p_dsc_line) -{ - int comment; - int offset; - - // Move to start of next line - if (!prt_resfile_next_line()) - return FALSE; - - // DSC comments always start %% - if (prt_resfile_strncmp(0, "%%", 2) != 0) - return FALSE; - - // Find type of DSC comment - for (comment = 0; comment < (int)ARRAY_LENGTH(prt_dsc_table); comment++) - if (prt_resfile_strncmp(0, prt_dsc_table[comment].string, - prt_dsc_table[comment].len) == 0) - break; - - if (comment != ARRAY_LENGTH(prt_dsc_table)) - { - // Return type of comment - p_dsc_line->type = prt_dsc_table[comment].type; - offset = prt_dsc_table[comment].len; - } - else - { - // Unrecognised DSC comment, skip to ws after comment leader - p_dsc_line->type = PRT_DSC_MISC_TYPE; - offset = prt_resfile_skip_nonws(0); - if (offset == -1) - return FALSE; - } - - // Skip ws to comment value - offset = prt_resfile_skip_ws(offset); - if (offset == -1) - return FALSE; - - p_dsc_line->string = &prt_resfile.buffer[prt_resfile.line_start + offset]; - p_dsc_line->len = prt_resfile.line_end - (prt_resfile.line_start + offset); - - return TRUE; -} - -/* - * Improved hand crafted parser to get the type, title, and version number of a - * PS resource file so the file details can be added to the DSC header comments. - */ - static int -prt_open_resource(struct prt_ps_resource_S *resource) -{ - int offset; - int seen_all; - int seen_title; - int seen_version; - FILE *fd_resource; - struct prt_dsc_line_S dsc_line; - - fd_resource = mch_fopen((char *)resource->filename, READBIN); - if (fd_resource == NULL) - { - semsg(_(e_cant_open_file_str_3), resource->filename); - return FALSE; - } - CLEAR_FIELD(prt_resfile.buffer); - - // Parse first line to ensure valid resource file - prt_resfile.len = (int)fread((char *)prt_resfile.buffer, sizeof(char_u), - PRT_FILE_BUFFER_LEN, fd_resource); - if (ferror(fd_resource)) - { - semsg(_(e_cant_read_postscript_resource_file_str), - resource->filename); - fclose(fd_resource); - return FALSE; - } - fclose(fd_resource); - - prt_resfile.line_end = -1; - prt_resfile.line_start = 0; - if (!prt_resfile_next_line()) - return FALSE; - - offset = 0; - - if (prt_resfile_strncmp(offset, PRT_RESOURCE_HEADER, - (int)STRLEN_LITERAL(PRT_RESOURCE_HEADER)) != 0) - { - semsg(_(e_file_str_is_not_postscript_resource_file), - resource->filename); - return FALSE; - } - - // Skip over any version numbers and following ws - offset += (int)STRLEN_LITERAL(PRT_RESOURCE_HEADER); - offset = prt_resfile_skip_nonws(offset); - if (offset == -1) - return FALSE; - offset = prt_resfile_skip_ws(offset); - if (offset == -1) - return FALSE; - - if (prt_resfile_strncmp(offset, PRT_RESOURCE_RESOURCE, - (int)STRLEN_LITERAL(PRT_RESOURCE_RESOURCE)) != 0) - { - semsg(_(e_file_str_is_not_supported_postscript_resource_file), - resource->filename); - return FALSE; - } - offset += (int)STRLEN_LITERAL(PRT_RESOURCE_RESOURCE); - - // Decide type of resource in the file - if (prt_resfile_strncmp(offset, PRT_RESOURCE_PROCSET, - (int)STRLEN_LITERAL(PRT_RESOURCE_PROCSET)) == 0) - resource->type = PRT_RESOURCE_TYPE_PROCSET; - else if (prt_resfile_strncmp(offset, PRT_RESOURCE_ENCODING, - (int)STRLEN_LITERAL(PRT_RESOURCE_ENCODING)) == 0) - resource->type = PRT_RESOURCE_TYPE_ENCODING; - else if (prt_resfile_strncmp(offset, PRT_RESOURCE_CMAP, - (int)STRLEN_LITERAL(PRT_RESOURCE_CMAP)) == 0) - resource->type = PRT_RESOURCE_TYPE_CMAP; - else - { - semsg(_(e_file_str_is_not_supported_postscript_resource_file), - resource->filename); - return FALSE; - } - - // Look for title and version of resource - resource->title[0] = '\0'; - resource->version[0] = '\0'; - seen_title = FALSE; - seen_version = FALSE; - seen_all = FALSE; - while (!seen_all && prt_next_dsc(&dsc_line)) - { - switch (dsc_line.type) - { - case PRT_DSC_TITLE_TYPE: - vim_strncpy(resource->title, dsc_line.string, dsc_line.len); - seen_title = TRUE; - if (seen_version) - seen_all = TRUE; - break; - - case PRT_DSC_VERSION_TYPE: - vim_strncpy(resource->version, dsc_line.string, dsc_line.len); - seen_version = TRUE; - if (seen_title) - seen_all = TRUE; - break; - - case PRT_DSC_ENDCOMMENTS_TYPE: - // Won't find title or resource after this comment, stop searching - seen_all = TRUE; - break; - - case PRT_DSC_MISC_TYPE: - // Not interested in whatever comment this line had - break; - } - } - - if (!seen_title || !seen_version) - { - semsg(_(e_file_str_is_not_supported_postscript_resource_file), - resource->filename); - return FALSE; - } - - return TRUE; -} - - static int -prt_check_resource(struct prt_ps_resource_S *resource, char_u *version) -{ - // Version number m.n should match, the revision number does not matter - if (STRNCMP(resource->version, version, STRLEN(version)) != 0) - { - semsg(_(e_str_resource_file_has_wrong_version), - resource->name); - return FALSE; - } - - // Other checks to be added as needed - return TRUE; -} - - static void -prt_dsc_start(void) -{ - prt_write_string("%!PS-Adobe-3.0\n"); -} - - static void -prt_dsc_noarg(char *comment) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%%s\n", comment); - prt_write_file(prt_line_buffer); -} - - static void -prt_dsc_textline(char *comment, char *text) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%%s: %s\n", comment, text); - prt_write_file(prt_line_buffer); -} - - static void -prt_dsc_text(char *comment, char *text) -{ - // TODO - should scan 'text' for any chars needing escaping! - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%%s: (%s)\n", comment, text); - prt_write_file(prt_line_buffer); -} - -# define prt_dsc_atend(c) prt_dsc_text((c), "atend") - - static void -prt_dsc_ints(char *comment, int count, int *ints) -{ - int i; - - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%%s:", comment); - prt_write_file(prt_line_buffer); - - for (i = 0; i < count; i++) - { - sprintf((char *)prt_line_buffer, " %d", ints[i]); - prt_write_file(prt_line_buffer); - } - - prt_write_string("\n"); -} - - static void -prt_dsc_resources( - char *comment, // if NULL add to previous - char *type, - char *string) -{ - if (comment != NULL) - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%%s: %s", comment, type); - else - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%+ %s", type); - prt_write_file(prt_line_buffer); - - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - " %s\n", string); - prt_write_file(prt_line_buffer); -} - - static void -prt_dsc_font_resource(char *resource, struct prt_ps_font_S *ps_font) -{ - int i; - - prt_dsc_resources(resource, "font", - ps_font->ps_fontname[PRT_PS_FONT_ROMAN]); - for (i = PRT_PS_FONT_BOLD ; i <= PRT_PS_FONT_BOLDOBLIQUE ; i++) - if (ps_font->ps_fontname[i] != NULL) - prt_dsc_resources(NULL, "font", ps_font->ps_fontname[i]); -} - - static void -prt_dsc_requirements( - int duplex, - int tumble, - int collate, - int color, - int num_copies) -{ - // Only output the comment if we need to. - // Note: tumble is ignored if we are not duplexing - if (!(duplex || collate || color || (num_copies > 1))) - return; - - sprintf((char *)prt_line_buffer, "%%%%Requirements:"); - prt_write_file(prt_line_buffer); - - if (duplex) - { - prt_write_string(" duplex"); - if (tumble) - prt_write_string("(tumble)"); - } - if (collate) - prt_write_string(" collate"); - if (color) - prt_write_string(" color"); - if (num_copies > 1) - { - prt_write_string(" numcopies("); - // Note: no space wanted so don't use prt_write_int() - sprintf((char *)prt_line_buffer, "%d", num_copies); - prt_write_file(prt_line_buffer); - prt_write_string(")"); - } - prt_write_string("\n"); -} - - static void -prt_dsc_docmedia( - char *paper_name, - double width, - double height, - double weight, - char *colour, - char *type) -{ - vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), - "%%%%DocumentMedia: %s ", paper_name); - prt_write_file(prt_line_buffer); - prt_write_real(width, 2); - prt_write_real(height, 2); - prt_write_real(weight, 2); - if (colour == NULL) - prt_write_string("()"); - else - prt_write_string(colour); - prt_write_string(" "); - if (type == NULL) - prt_write_string("()"); - else - prt_write_string(type); - prt_write_string("\n"); -} - - void -mch_print_cleanup(void) -{ - if (prt_out_mbyte) - { - int i; - - // Free off all CID font names created, but first clear duplicate - // pointers to the same string (when the same font is used for more than - // one style). - for (i = PRT_PS_FONT_ROMAN; i <= PRT_PS_FONT_BOLDOBLIQUE; i++) - { - if (prt_ps_mb_font.ps_fontname[i] != NULL) - VIM_CLEAR(prt_ps_mb_font.ps_fontname[i]); - } - } - - if (prt_do_conv) - { - convert_setup(&prt_conv, NULL, NULL); - prt_do_conv = FALSE; - } - if (prt_ps_fd != NULL) - { - fclose(prt_ps_fd); - prt_ps_fd = NULL; - prt_file_error = FALSE; - } - if (prt_ps_file_name != NULL) - VIM_CLEAR(prt_ps_file_name); -} - - static float -to_device_units(int idx, double physsize, int def_number) -{ - float ret; - int u; - int nr; - - u = prt_get_unit(idx); - if (u == PRT_UNIT_NONE) - { - u = PRT_UNIT_PERC; - nr = def_number; - } - else - nr = printer_opts[idx].number; - - switch (u) - { - case PRT_UNIT_INCH: - ret = (float)(nr * PRT_PS_DEFAULT_DPI); - break; - case PRT_UNIT_MM: - ret = (float)(nr * PRT_PS_DEFAULT_DPI) / (float)25.4; - break; - case PRT_UNIT_POINT: - ret = (float)nr; - break; - case PRT_UNIT_PERC: - default: - ret = (float)(physsize * nr) / 100; - break; - } - - return ret; -} - -/* - * Calculate margins for given width and height from printoptions settings. - */ - static void -prt_page_margins( - double width, - double height, - double *left, - double *right, - double *top, - double *bottom) -{ - *left = to_device_units(OPT_PRINT_LEFT, width, 10); - *right = width - to_device_units(OPT_PRINT_RIGHT, width, 5); - *top = height - to_device_units(OPT_PRINT_TOP, height, 5); - *bottom = to_device_units(OPT_PRINT_BOT, height, 5); -} - - static void -prt_font_metrics(int font_scale) -{ - prt_line_height = (float)font_scale; - prt_char_width = (float)PRT_PS_FONT_TO_USER(font_scale, prt_ps_font->wx); -} - - - static int -prt_get_cpl(void) -{ - if (prt_use_number()) - { - prt_number_width = PRINT_NUMBER_WIDTH * prt_char_width; - // If we are outputting multi-byte characters then line numbers will be - // printed with half width characters - if (prt_out_mbyte) - prt_number_width /= 2; - prt_left_margin += prt_number_width; - } - else - prt_number_width = 0.0; - - return (int)((prt_right_margin - prt_left_margin) / prt_char_width); -} - - static int -prt_build_cid_fontname(int font, char_u *name, int name_len) -{ - char *fontname; - - fontname = alloc(name_len + 1); - if (fontname == NULL) - return FALSE; - vim_strncpy((char_u *)fontname, name, name_len); - prt_ps_mb_font.ps_fontname[font] = fontname; - - return TRUE; -} - -/* - * Get number of lines of text that fit on a page (excluding the header). - */ - static int -prt_get_lpp(void) -{ - int lpp; - - /* - * Calculate offset to lower left corner of background rect based on actual - * font height (based on its bounding box) and the line height, handling the - * case where the font height can exceed the line height. - */ - prt_bgcol_offset = (float)PRT_PS_FONT_TO_USER(prt_line_height, - prt_ps_font->bbox_min_y); - if ((prt_ps_font->bbox_max_y - prt_ps_font->bbox_min_y) < 1000.0) - { - prt_bgcol_offset -= (float)PRT_PS_FONT_TO_USER(prt_line_height, - (1000.0 - (prt_ps_font->bbox_max_y - - prt_ps_font->bbox_min_y)) / 2); - } - - // Get height for topmost line based on background rect offset. - prt_first_line_height = prt_line_height + prt_bgcol_offset; - - // Calculate lpp - lpp = (int)((prt_top_margin - prt_bottom_margin) / prt_line_height); - - // Adjust top margin if there is a header - prt_top_margin -= prt_line_height * prt_header_height(); - - return lpp - prt_header_height(); -} - - static int -prt_match_encoding( - char *p_encoding, - struct prt_ps_mbfont_S *p_cmap, - struct prt_ps_encoding_S **pp_mbenc) -{ - int mbenc; - int enc_len; - struct prt_ps_encoding_S *p_mbenc; - - *pp_mbenc = NULL; - // Look for recognised encoding - enc_len = (int)STRLEN(p_encoding); - p_mbenc = p_cmap->encodings; - for (mbenc = 0; mbenc < p_cmap->num_encodings; mbenc++) - { - if (STRNICMP(p_mbenc->encoding, p_encoding, enc_len) == 0) - { - *pp_mbenc = p_mbenc; - return TRUE; - } - p_mbenc++; - } - return FALSE; -} - - static int -prt_match_charset( - char *p_charset, - struct prt_ps_mbfont_S *p_cmap, - struct prt_ps_charset_S **pp_mbchar) -{ - int mbchar; - int char_len; - struct prt_ps_charset_S *p_mbchar; - - // Look for recognised character set, using default if one is not given - if (*p_charset == NUL) - p_charset = p_cmap->defcs; - char_len = (int)STRLEN(p_charset); - p_mbchar = p_cmap->charsets; - for (mbchar = 0; mbchar < p_cmap->num_charsets; mbchar++) - { - if (STRNICMP(p_mbchar->charset, p_charset, char_len) == 0) - { - *pp_mbchar = p_mbchar; - return TRUE; - } - p_mbchar++; - } - return FALSE; -} - - int -mch_print_init( - prt_settings_T *psettings, - char_u *jobname, - int forceit UNUSED) -{ - int i; - char *paper_name; - int paper_strlen; - int fontsize; - char_u *p; - double left; - double right; - double top; - double bottom; - int props; - int cmap = 0; - char_u *p_encoding; - struct prt_ps_encoding_S *p_mbenc; - struct prt_ps_encoding_S *p_mbenc_first; - struct prt_ps_charset_S *p_mbchar = NULL; - -# if 0 - /* - * TODO: - * If "forceit" is false: pop up a dialog to select: - * - printer name - * - copies - * - collated/uncollated - * - duplex off/long side/short side - * - paper size - * - portrait/landscape - * - font size - * - * If "forceit" is true: use the default printer and settings - */ - if (forceit) - s_pd.Flags |= PD_RETURNDEFAULT; -# endif - - /* - * Set up font and encoding. - */ - p_encoding = enc_skip(p_penc); - if (*p_encoding == NUL) - p_encoding = enc_skip(p_enc); - - // Look for a multi-byte font that matches the encoding and character set. - // Only look if multi-byte character set is defined, or using multi-byte - // encoding other than Unicode. This is because a Unicode encoding does not - // uniquely identify a CJK character set to use. - p_mbenc = NULL; - props = enc_canon_props(p_encoding); - if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE))) - { - int cmap_first = 0; - - p_mbenc_first = NULL; - for (cmap = 0; cmap < (int)ARRAY_LENGTH(prt_ps_mbfonts); cmap++) - if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap], - &p_mbenc)) - { - if (p_mbenc_first == NULL) - { - p_mbenc_first = p_mbenc; - cmap_first = cmap; - } - if (prt_match_charset((char *)p_pmcs, &prt_ps_mbfonts[cmap], - &p_mbchar)) - break; - } - - // Use first encoding matched if no charset matched - if (p_mbchar == NULL && p_mbenc_first != NULL) - { - p_mbenc = p_mbenc_first; - cmap = cmap_first; - } - } - - prt_out_mbyte = (p_mbenc != NULL); - if (prt_out_mbyte) - { - // Build CMap name - will be same for all multi-byte fonts used - prt_cmap[0] = NUL; - - prt_custom_cmap = (p_mbchar == NULL); - if (!prt_custom_cmap) - { - // Check encoding and character set are compatible - if ((p_mbenc->needs_charset & p_mbchar->has_charset) == 0) - { - emsg(_(e_incompatible_multi_byte_encoding_and_character_set)); - return FALSE; - } - - // Add charset name if not empty - if (p_mbchar->cmap_charset != NULL) - { - vim_strncpy((char_u *)prt_cmap, - (char_u *)p_mbchar->cmap_charset, sizeof(prt_cmap) - 3); - STRCAT(prt_cmap, "-"); - } - } - else - { - // Add custom CMap character set name - if (*p_pmcs == NUL) - { - emsg(_(e_printmbcharset_cannot_be_empty_with_multi_byte_encoding)); - return FALSE; - } - vim_strncpy((char_u *)prt_cmap, p_pmcs, sizeof(prt_cmap) - 3); - STRCAT(prt_cmap, "-"); - } - - // CMap name ends with (optional) encoding name and -H for horizontal - if (p_mbenc->cmap_encoding != NULL && STRLEN(prt_cmap) - + STRLEN(p_mbenc->cmap_encoding) + 3 < sizeof(prt_cmap)) - { - STRCAT(prt_cmap, p_mbenc->cmap_encoding); - STRCAT(prt_cmap, "-"); - } - STRCAT(prt_cmap, "H"); - - if (!mbfont_opts[OPT_MBFONT_REGULAR].present) - { - emsg(_(e_no_default_font_specified_for_multi_byte_printing)); - return FALSE; - } - - // Derive CID font names with fallbacks if not defined - if (!prt_build_cid_fontname(PRT_PS_FONT_ROMAN, - mbfont_opts[OPT_MBFONT_REGULAR].string, - mbfont_opts[OPT_MBFONT_REGULAR].strlen)) - return FALSE; - if (mbfont_opts[OPT_MBFONT_BOLD].present) - if (!prt_build_cid_fontname(PRT_PS_FONT_BOLD, - mbfont_opts[OPT_MBFONT_BOLD].string, - mbfont_opts[OPT_MBFONT_BOLD].strlen)) - return FALSE; - if (mbfont_opts[OPT_MBFONT_OBLIQUE].present) - if (!prt_build_cid_fontname(PRT_PS_FONT_OBLIQUE, - mbfont_opts[OPT_MBFONT_OBLIQUE].string, - mbfont_opts[OPT_MBFONT_OBLIQUE].strlen)) - return FALSE; - if (mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].present) - if (!prt_build_cid_fontname(PRT_PS_FONT_BOLDOBLIQUE, - mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].string, - mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].strlen)) - return FALSE; - - // Check if need to use Courier for ASCII code range, and if so pick up - // the encoding to use - prt_use_courier = mbfont_opts[OPT_MBFONT_USECOURIER].present && - (TOLOWER_ASC(mbfont_opts[OPT_MBFONT_USECOURIER].string[0]) == 'y'); - if (prt_use_courier) - { - // Use national ASCII variant unless ASCII wanted - if (mbfont_opts[OPT_MBFONT_ASCII].present && - (TOLOWER_ASC(mbfont_opts[OPT_MBFONT_ASCII].string[0]) == 'y')) - prt_ascii_encoding = "ascii"; - else - prt_ascii_encoding = prt_ps_mbfonts[cmap].ascii_enc; - } - - prt_ps_font = &prt_ps_mb_font; - } - else - { - prt_use_courier = FALSE; - prt_ps_font = &prt_ps_courier_font; - } - - /* - * Find the size of the paper and set the margins. - */ - prt_portrait = (!printer_opts[OPT_PRINT_PORTRAIT].present - || TOLOWER_ASC(printer_opts[OPT_PRINT_PORTRAIT].string[0]) == 'y'); - if (printer_opts[OPT_PRINT_PAPER].present) - { - paper_name = (char *)printer_opts[OPT_PRINT_PAPER].string; - paper_strlen = printer_opts[OPT_PRINT_PAPER].strlen; - } - else - { - paper_name = "A4"; - paper_strlen = 2; - } - for (i = 0; i < (int)PRT_MEDIASIZE_LEN; ++i) - if (STRLEN(prt_mediasize[i].name) == (unsigned)paper_strlen - && STRNICMP(prt_mediasize[i].name, paper_name, - paper_strlen) == 0) - break; - if (i == PRT_MEDIASIZE_LEN) - i = 0; - prt_media = i; - - /* - * Set PS pagesize based on media dimensions and print orientation. - * Note: Media and page sizes have defined meanings in PostScript and should - * be kept distinct. Media is the paper (or transparency, or ...) that is - * printed on, whereas the page size is the area that the PostScript - * interpreter renders into. - */ - if (prt_portrait) - { - prt_page_width = prt_mediasize[i].width; - prt_page_height = prt_mediasize[i].height; - } - else - { - prt_page_width = prt_mediasize[i].height; - prt_page_height = prt_mediasize[i].width; - } - - /* - * Set PS page margins based on the PS pagesize, not the mediasize - this - * needs to be done before the cpl and lpp are calculated. - */ - prt_page_margins(prt_page_width, prt_page_height, &left, &right, &top, - &bottom); - prt_left_margin = (float)left; - prt_right_margin = (float)right; - prt_top_margin = (float)top; - prt_bottom_margin = (float)bottom; - - /* - * Set up the font size. - */ - fontsize = PRT_PS_DEFAULT_FONTSIZE; - for (p = p_pfn; (p = vim_strchr(p, ':')) != NULL; ++p) - if (p[1] == 'h' && VIM_ISDIGIT(p[2])) - fontsize = atoi((char *)p + 2); - prt_font_metrics(fontsize); - - /* - * Return the number of characters per line, and lines per page for the - * generic print code. - */ - psettings->chars_per_line = prt_get_cpl(); - psettings->lines_per_page = prt_get_lpp(); - - // Catch margin settings that leave no space for output! - if (psettings->chars_per_line <= 0 || psettings->lines_per_page <= 0) - return FAIL; - - /* - * Sort out the number of copies to be printed. PS by default will do - * uncollated copies for you, so once we know how many uncollated copies are - * wanted cache it away and lie to the generic code that we only want one - * uncollated copy. - */ - psettings->n_collated_copies = 1; - psettings->n_uncollated_copies = 1; - prt_num_copies = 1; - prt_collate = (!printer_opts[OPT_PRINT_COLLATE].present - || TOLOWER_ASC(printer_opts[OPT_PRINT_COLLATE].string[0]) == 'y'); - if (prt_collate) - { - // TODO: Get number of collated copies wanted. - psettings->n_collated_copies = 1; - } - else - { - // TODO: Get number of uncollated copies wanted and update the cached - // count. - prt_num_copies = 1; - } - - psettings->jobname = jobname; - - /* - * Set up printer duplex and tumble based on Duplex option setting - default - * is long sided duplex printing (i.e. no tumble). - */ - prt_duplex = TRUE; - prt_tumble = FALSE; - psettings->duplex = 1; - if (printer_opts[OPT_PRINT_DUPLEX].present) - { - if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "off", 3) == 0) - { - prt_duplex = FALSE; - psettings->duplex = 0; - } - else if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "short", 5) - == 0) - prt_tumble = TRUE; - } - - // For now user abort not supported - psettings->user_abort = 0; - - // If the user didn't specify a file name, use a temp file. - if (psettings->outfile == NULL) - { - prt_ps_file_name = vim_tempname('p', TRUE); - if (prt_ps_file_name == NULL) - { - emsg(_(e_cant_get_temp_file_name)); - return FAIL; - } - prt_ps_fd = mch_fopen((char *)prt_ps_file_name, WRITEBIN); - } - else - { - p = expand_env_save(psettings->outfile); - if (p != NULL) - { - prt_ps_fd = mch_fopen((char *)p, WRITEBIN); - vim_free(p); - } - } - if (prt_ps_fd == NULL) - { - emsg(_(e_cant_open_postscript_output_file)); - mch_print_cleanup(); - return FAIL; - } - - prt_bufsiz = psettings->chars_per_line; - if (prt_out_mbyte) - prt_bufsiz *= 2; - ga_init2(&prt_ps_buffer, sizeof(char), prt_bufsiz); - - prt_page_num = 0; - - prt_attribute_change = FALSE; - prt_need_moveto = FALSE; - prt_need_font = FALSE; - prt_need_fgcol = FALSE; - prt_need_bgcol = FALSE; - prt_need_underline = FALSE; - - prt_file_error = FALSE; - - return OK; -} - - static int -prt_add_resource(struct prt_ps_resource_S *resource) -{ - FILE* fd_resource; - char_u resource_buffer[512]; - size_t bytes_read; - - fd_resource = mch_fopen((char *)resource->filename, READBIN); - if (fd_resource == NULL) - { - semsg(_(e_cant_open_file_str_2), resource->filename); - return FALSE; - } - prt_dsc_resources("BeginResource", prt_resource_types[resource->type], - (char *)resource->title); - - prt_dsc_textline("BeginDocument", (char *)resource->filename); - - for (;;) - { - bytes_read = fread((char *)resource_buffer, sizeof(char_u), - sizeof(resource_buffer), fd_resource); - if (ferror(fd_resource)) - { - semsg(_(e_cant_read_postscript_resource_file_str), - resource->filename); - fclose(fd_resource); - return FALSE; - } - if (bytes_read == 0) - break; - prt_write_file_raw_len(resource_buffer, (int)bytes_read); - if (prt_file_error) - { - fclose(fd_resource); - return FALSE; - } - } - fclose(fd_resource); - - prt_dsc_noarg("EndDocument"); - - prt_dsc_noarg("EndResource"); - - return TRUE; -} - - int -mch_print_begin(prt_settings_T *psettings) -{ - int bbox[4]; - double left; - double right; - double top; - double bottom; - struct prt_ps_resource_S *res_prolog; - struct prt_ps_resource_S *res_encoding; - char buffer[256]; - char_u *p_encoding; - struct prt_ps_resource_S *res_cidfont; - struct prt_ps_resource_S *res_cmap; - int retval = FALSE; - - res_prolog = ALLOC_ONE(struct prt_ps_resource_S); - res_encoding = ALLOC_ONE(struct prt_ps_resource_S); - res_cidfont = ALLOC_ONE(struct prt_ps_resource_S); - res_cmap = ALLOC_ONE(struct prt_ps_resource_S); - if (res_prolog == NULL || res_encoding == NULL - || res_cidfont == NULL || res_cmap == NULL) - goto theend; - - /* - * PS DSC Header comments - no PS code! - */ - prt_dsc_start(); - prt_dsc_textline("Title", (char *)psettings->jobname); - if (!get_user_name((char_u *)buffer, 256)) - STRCPY(buffer, "Unknown"); - prt_dsc_textline("For", buffer); - prt_dsc_textline("Creator", VIM_VERSION_LONG); - // Note: to ensure Clean8bit I don't think we can use LC_TIME - - prt_dsc_textline("CreationDate", get_ctime(time(NULL), FALSE)); - prt_dsc_textline("DocumentData", "Clean8Bit"); - prt_dsc_textline("Orientation", prt_portrait ? "Portrait" : "Landscape"); - prt_dsc_atend("Pages"); - prt_dsc_textline("PageOrder", "Ascend"); - // The bbox does not change with orientation - it is always in the default - // user coordinate system! We have to recalculate right and bottom - // coordinates based on the font metrics for the bbox to be accurate. - prt_page_margins(prt_mediasize[prt_media].width, - prt_mediasize[prt_media].height, - &left, &right, &top, &bottom); - bbox[0] = (int)left; - if (prt_portrait) - { - // In portrait printing the fixed point is the top left corner so we - // derive the bbox from that point. We have the expected cpl chars - // across the media and lpp lines down the media. - bbox[1] = (int)(top - (psettings->lines_per_page + prt_header_height()) - * (double)prt_line_height); - bbox[2] = (int)(left + psettings->chars_per_line - * (double)prt_char_width + 0.5); - bbox[3] = (int)(top + 0.5); - } - else - { - // In landscape printing the fixed point is the bottom left corner so we - // derive the bbox from that point. We have lpp chars across the media - // and cpl lines up the media. - bbox[1] = (int)bottom; - bbox[2] = (int)(left + ((psettings->lines_per_page - + prt_header_height()) * prt_line_height) + 0.5); - bbox[3] = (int)(bottom + psettings->chars_per_line - * (double)prt_char_width + 0.5); - } - prt_dsc_ints("BoundingBox", 4, bbox); - // The media width and height does not change with landscape printing! - prt_dsc_docmedia(prt_mediasize[prt_media].name, - prt_mediasize[prt_media].width, - prt_mediasize[prt_media].height, - (double)0, NULL, NULL); - // Define fonts needed - if (!prt_out_mbyte || prt_use_courier) - prt_dsc_font_resource("DocumentNeededResources", &prt_ps_courier_font); - if (prt_out_mbyte) - { - prt_dsc_font_resource((prt_use_courier ? NULL - : "DocumentNeededResources"), &prt_ps_mb_font); - if (!prt_custom_cmap) - prt_dsc_resources(NULL, "cmap", prt_cmap); - } - - // Search for external resources VIM supplies - if (!prt_find_resource("prolog", res_prolog)) - { - semsg(_(e_cant_find_postscript_resource_file_str_ps), "prolog"); - goto theend; - } - if (!prt_open_resource(res_prolog)) - goto theend; - if (!prt_check_resource(res_prolog, PRT_PROLOG_VERSION)) - goto theend; - if (prt_out_mbyte) - { - // Look for required version of multi-byte printing procset - if (!prt_find_resource("cidfont", res_cidfont)) - { - semsg(_(e_cant_find_postscript_resource_file_str_ps), "cidfont"); - goto theend; - } - if (!prt_open_resource(res_cidfont)) - goto theend; - if (!prt_check_resource(res_cidfont, PRT_CID_PROLOG_VERSION)) - goto theend; - } - - // Find an encoding to use for printing. - // Check 'printencoding'. If not set or not found, then use 'encoding'. If - // that cannot be found then default to "latin1". - // Note: VIM specific encoding header is always skipped. - if (!prt_out_mbyte) - { - p_encoding = enc_skip(p_penc); - if (*p_encoding == NUL - || !prt_find_resource((char *)p_encoding, res_encoding)) - { - // 'printencoding' not set or not supported - find alternate - int props; - - p_encoding = enc_skip(p_enc); - props = enc_canon_props(p_encoding); - if (!(props & ENC_8BIT) - || !prt_find_resource((char *)p_encoding, res_encoding)) - // 8-bit 'encoding' is not supported - { - // Use latin1 as default printing encoding - p_encoding = (char_u *)"latin1"; - if (!prt_find_resource((char *)p_encoding, res_encoding)) - { - semsg(_(e_cant_find_postscript_resource_file_str_ps), - p_encoding); - goto theend; - } - } - } - if (!prt_open_resource(res_encoding)) - goto theend; - // For the moment there are no checks on encoding resource files to - // perform - } - else - { - p_encoding = enc_skip(p_penc); - if (*p_encoding == NUL) - p_encoding = enc_skip(p_enc); - if (prt_use_courier) - { - // Include ASCII range encoding vector - if (!prt_find_resource(prt_ascii_encoding, res_encoding)) - { - semsg(_(e_cant_find_postscript_resource_file_str_ps), - prt_ascii_encoding); - goto theend; - } - if (!prt_open_resource(res_encoding)) - goto theend; - // For the moment there are no checks on encoding resource files to - // perform - } - } - - prt_conv.vc_type = CONV_NONE; - if (!(enc_canon_props(p_enc) & enc_canon_props(p_encoding) & ENC_8BIT)) - { - // Set up encoding conversion if required - if (FAIL == convert_setup(&prt_conv, p_enc, p_encoding)) - { - semsg(_(e_unable_to_convert_to_print_encoding_str), p_encoding); - goto theend; - } - prt_do_conv = TRUE; - } - prt_do_conv = prt_conv.vc_type != CONV_NONE; - - if (prt_out_mbyte && prt_custom_cmap) - { - // Find user supplied CMap - if (!prt_find_resource(prt_cmap, res_cmap)) - { - semsg(_(e_cant_find_postscript_resource_file_str_ps), prt_cmap); - goto theend; - } - if (!prt_open_resource(res_cmap)) - goto theend; - } - - // List resources supplied - STRCPY(buffer, res_prolog->title); - STRCAT(buffer, " "); - STRCAT(buffer, res_prolog->version); - prt_dsc_resources("DocumentSuppliedResources", "procset", buffer); - if (prt_out_mbyte) - { - STRCPY(buffer, res_cidfont->title); - STRCAT(buffer, " "); - STRCAT(buffer, res_cidfont->version); - prt_dsc_resources(NULL, "procset", buffer); - - if (prt_custom_cmap) - { - STRCPY(buffer, res_cmap->title); - STRCAT(buffer, " "); - STRCAT(buffer, res_cmap->version); - prt_dsc_resources(NULL, "cmap", buffer); - } - } - if (!prt_out_mbyte || prt_use_courier) - { - STRCPY(buffer, res_encoding->title); - STRCAT(buffer, " "); - STRCAT(buffer, res_encoding->version); - prt_dsc_resources(NULL, "encoding", buffer); - } - prt_dsc_requirements(prt_duplex, prt_tumble, prt_collate, -# ifdef FEAT_SYN_HL - psettings->do_syntax -# else - 0 -# endif - , prt_num_copies); - prt_dsc_noarg("EndComments"); - - /* - * PS Document page defaults - */ - prt_dsc_noarg("BeginDefaults"); - - // List font resources most likely common to all pages - if (!prt_out_mbyte || prt_use_courier) - prt_dsc_font_resource("PageResources", &prt_ps_courier_font); - if (prt_out_mbyte) - { - prt_dsc_font_resource((prt_use_courier ? NULL : "PageResources"), - &prt_ps_mb_font); - if (!prt_custom_cmap) - prt_dsc_resources(NULL, "cmap", prt_cmap); - } - - // Paper will be used for all pages - prt_dsc_textline("PageMedia", prt_mediasize[prt_media].name); - - prt_dsc_noarg("EndDefaults"); - - /* - * PS Document prolog inclusion - all required procsets. - */ - prt_dsc_noarg("BeginProlog"); - - // Add required procsets - NOTE: order is important! - if (!prt_add_resource(res_prolog)) - goto theend; - if (prt_out_mbyte) - { - // Add CID font procset, and any user supplied CMap - if (!prt_add_resource(res_cidfont)) - goto theend; - if (prt_custom_cmap && !prt_add_resource(res_cmap)) - goto theend; - } - - if (!prt_out_mbyte || prt_use_courier) - // There will be only one Roman font encoding to be included in the PS - // file. - if (!prt_add_resource(res_encoding)) - goto theend; - - prt_dsc_noarg("EndProlog"); - - /* - * PS Document setup - must appear after the prolog - */ - prt_dsc_noarg("BeginSetup"); - - // Device setup - page size and number of uncollated copies - prt_write_int((int)prt_mediasize[prt_media].width); - prt_write_int((int)prt_mediasize[prt_media].height); - prt_write_int(0); - prt_write_string("sps\n"); - prt_write_int(prt_num_copies); - prt_write_string("nc\n"); - prt_write_boolean(prt_duplex); - prt_write_boolean(prt_tumble); - prt_write_string("dt\n"); - prt_write_boolean(prt_collate); - prt_write_string("c\n"); - - // Font resource inclusion and definition - if (!prt_out_mbyte || prt_use_courier) - { - // When using Courier for ASCII range when printing multi-byte, need to - // pick up ASCII encoding to use with it. - if (prt_use_courier) - p_encoding = (char_u *)prt_ascii_encoding; - prt_dsc_resources("IncludeResource", "font", - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_ROMAN]); - prt_def_font("F0", (char *)p_encoding, (int)prt_line_height, - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_ROMAN]); - prt_dsc_resources("IncludeResource", "font", - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLD]); - prt_def_font("F1", (char *)p_encoding, (int)prt_line_height, - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLD]); - prt_dsc_resources("IncludeResource", "font", - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); - prt_def_font("F2", (char *)p_encoding, (int)prt_line_height, - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); - prt_dsc_resources("IncludeResource", "font", - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); - prt_def_font("F3", (char *)p_encoding, (int)prt_line_height, - prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); - } - if (prt_out_mbyte) - { - // Define the CID fonts to be used in the job. Typically CJKV fonts do - // not have an italic form being a western style, so where no font is - // defined for these faces VIM falls back to an existing face. - // Note: if using Courier for the ASCII range then the printout will - // have bold/italic/bolditalic regardless of the setting of printmbfont. - prt_dsc_resources("IncludeResource", "font", - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_ROMAN]); - if (!prt_custom_cmap) - prt_dsc_resources("IncludeResource", "cmap", prt_cmap); - prt_def_cidfont("CF0", (int)prt_line_height, - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_ROMAN]); - - if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD] != NULL) - { - prt_dsc_resources("IncludeResource", "font", - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD]); - if (!prt_custom_cmap) - prt_dsc_resources("IncludeResource", "cmap", prt_cmap); - prt_def_cidfont("CF1", (int)prt_line_height, - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD]); - } - else - // Use ROMAN for BOLD - prt_dup_cidfont("CF0", "CF1"); - - if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE] != NULL) - { - prt_dsc_resources("IncludeResource", "font", - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); - if (!prt_custom_cmap) - prt_dsc_resources("IncludeResource", "cmap", prt_cmap); - prt_def_cidfont("CF2", (int)prt_line_height, - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); - } - else - // Use ROMAN for OBLIQUE - prt_dup_cidfont("CF0", "CF2"); - - if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE] != NULL) - { - prt_dsc_resources("IncludeResource", "font", - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); - if (!prt_custom_cmap) - prt_dsc_resources("IncludeResource", "cmap", prt_cmap); - prt_def_cidfont("CF3", (int)prt_line_height, - prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); - } - else - // Use BOLD for BOLDOBLIQUE - prt_dup_cidfont("CF1", "CF3"); - } - - // Misc constant vars used for underlining and background rects - prt_def_var("UO", PRT_PS_FONT_TO_USER(prt_line_height, - prt_ps_font->uline_offset), 2); - prt_def_var("UW", PRT_PS_FONT_TO_USER(prt_line_height, - prt_ps_font->uline_width), 2); - prt_def_var("BO", prt_bgcol_offset, 2); - - prt_dsc_noarg("EndSetup"); - - // Fail if any problems writing out to the PS file - retval = !prt_file_error; - -theend: - vim_free(res_prolog); - vim_free(res_encoding); - vim_free(res_cidfont); - vim_free(res_cmap); - - return retval; -} - - void -mch_print_end(prt_settings_T *psettings) -{ - prt_dsc_noarg("Trailer"); - - /* - * Output any info we don't know in toto until we finish - */ - prt_dsc_ints("Pages", 1, &prt_page_num); - - prt_dsc_noarg("EOF"); - - // Write CTRL-D to close serial communication link if used. - // NOTHING MUST BE WRITTEN AFTER THIS! - prt_write_file((char_u *)"\004"); - - if (!prt_file_error && psettings->outfile == NULL - && !got_int && !psettings->user_abort) - { - // Close the file first. - if (prt_ps_fd != NULL) - { - fclose(prt_ps_fd); - prt_ps_fd = NULL; - } - prt_message((char_u *)_("Sending to printer...")); - - // Not printing to a file: use 'printexpr' to print the file. - if (eval_printexpr(prt_ps_file_name, psettings->arguments) == FAIL) - emsg(_(e_failed_to_print_postscript_file)); - else - prt_message((char_u *)_("Print job sent.")); - } - - mch_print_cleanup(); -} - - int -mch_print_end_page(void) -{ - prt_flush_buffer(); - - prt_write_string("re sp\n"); - - prt_dsc_noarg("PageTrailer"); - - return !prt_file_error; -} - - int -mch_print_begin_page(char_u *str UNUSED) -{ - int page_num[2]; - - prt_page_num++; - - page_num[0] = page_num[1] = prt_page_num; - prt_dsc_ints("Page", 2, page_num); - - prt_dsc_noarg("BeginPageSetup"); - - prt_write_string("sv\n0 g\n"); - prt_in_ascii = !prt_out_mbyte; - if (prt_out_mbyte) - prt_write_string("CF0 sf\n"); - else - prt_write_string("F0 sf\n"); - prt_fgcol = PRCOLOR_BLACK; - prt_bgcol = PRCOLOR_WHITE; - prt_font = PRT_PS_FONT_ROMAN; - - // Set up page transformation for landscape printing. - if (!prt_portrait) - { - prt_write_int(-((int)prt_mediasize[prt_media].width)); - prt_write_string("sl\n"); - } - - prt_dsc_noarg("EndPageSetup"); - - // We have reset the font attributes, force setting them again. - curr_bg = (long_u)0xffffffff; - curr_fg = (long_u)0xffffffff; - curr_bold = MAYBE; - - return !prt_file_error; -} - - int -mch_print_blank_page(void) -{ - return (mch_print_begin_page(NULL) ? (mch_print_end_page()) : FALSE); -} - -static float prt_pos_x = 0; -static float prt_pos_y = 0; - - void -mch_print_start_line(int margin, int page_line) -{ - prt_pos_x = prt_left_margin; - if (margin) - prt_pos_x -= prt_number_width; - - prt_pos_y = prt_top_margin - prt_first_line_height - - page_line * prt_line_height; - - prt_attribute_change = TRUE; - prt_need_moveto = TRUE; - prt_half_width = FALSE; -} - - int -mch_print_text_out(char_u *textp, int len UNUSED) -{ - char_u *p = textp; - int need_break; - char_u ch; - char_u ch_buff[8]; - float char_width; - float next_pos; - int in_ascii; - int half_width; - char_u *tofree = NULL; - - char_width = prt_char_width; - - // Ideally VIM would create a rearranged CID font to combine a Roman and - // CJKV font to do what VIM is doing here - use a Roman font for characters - // in the ASCII range, and the original CID font for everything else. - // The problem is that GhostScript still (as of 8.13) does not support - // rearranged fonts even though they have been documented by Adobe for 7 - // years! If they ever do, a lot of this code will disappear. - if (prt_use_courier) - { - in_ascii = (len == 1 && *p < 0x80); - if (prt_in_ascii) - { - if (!in_ascii) - { - // No longer in ASCII range - need to switch font - prt_in_ascii = FALSE; - prt_need_font = TRUE; - prt_attribute_change = TRUE; - } - } - else if (in_ascii) - { - // Now in ASCII range - need to switch font - prt_in_ascii = TRUE; - prt_need_font = TRUE; - prt_attribute_change = TRUE; - } - } - if (prt_out_mbyte) - { - half_width = ((*mb_ptr2cells)(p) == 1); - if (half_width) - char_width /= 2; - if (prt_half_width) - { - if (!half_width) - { - prt_half_width = FALSE; - prt_pos_x += prt_char_width/4; - prt_need_moveto = TRUE; - prt_attribute_change = TRUE; - } - } - else if (half_width) - { - prt_half_width = TRUE; - prt_pos_x += prt_char_width/4; - prt_need_moveto = TRUE; - prt_attribute_change = TRUE; - } - } - - // Output any required changes to the graphics state, after flushing any - // text buffered so far. - if (prt_attribute_change) - { - prt_flush_buffer(); - // Reset count of number of chars that will be printed - prt_text_run = 0; - - if (prt_need_moveto) - { - prt_pos_x_moveto = prt_pos_x; - prt_pos_y_moveto = prt_pos_y; - prt_do_moveto = TRUE; - - prt_need_moveto = FALSE; - } - if (prt_need_font) - { - if (!prt_in_ascii) - prt_write_string("CF"); - else - prt_write_string("F"); - prt_write_int(prt_font); - prt_write_string("sf\n"); - prt_need_font = FALSE; - } - if (prt_need_fgcol) - { - int r, g, b; - r = ((unsigned)prt_fgcol & 0xff0000) >> 16; - g = ((unsigned)prt_fgcol & 0xff00) >> 8; - b = prt_fgcol & 0xff; - - prt_write_real(r / 255.0, 3); - if (r == g && g == b) - prt_write_string("g\n"); - else - { - prt_write_real(g / 255.0, 3); - prt_write_real(b / 255.0, 3); - prt_write_string("r\n"); - } - prt_need_fgcol = FALSE; - } - - if (prt_bgcol != PRCOLOR_WHITE) - { - prt_new_bgcol = prt_bgcol; - if (prt_need_bgcol) - prt_do_bgcol = TRUE; - } - else - prt_do_bgcol = FALSE; - prt_need_bgcol = FALSE; - - if (prt_need_underline) - prt_do_underline = prt_underline; - prt_need_underline = FALSE; - - prt_attribute_change = FALSE; - } - - if (prt_do_conv) - { - // Convert from multi-byte to 8-bit encoding - tofree = p = string_convert(&prt_conv, p, &len); - if (p == NULL) - { - p = (char_u *)""; - len = 0; - } - } - - if (prt_out_mbyte) - { - // Multi-byte character strings are represented more efficiently as hex - // strings when outputting clean 8 bit PS. - while (len-- > 0) - { - ch = prt_hexchar[(unsigned)(*p) >> 4]; - ga_append(&prt_ps_buffer, ch); - ch = prt_hexchar[(*p) & 0xf]; - ga_append(&prt_ps_buffer, ch); - p++; - } - } - else - { - // Add next character to buffer of characters to output. - // Note: One printed character may require several PS characters to - // represent it, but we only count them as one printed character. - ch = *p; - if (ch < 32 || ch == '(' || ch == ')' || ch == '\\') - { - // Convert non-printing characters to either their escape or octal - // sequence, ensures PS sent over a serial line does not interfere - // with the comms protocol. - ga_append(&prt_ps_buffer, '\\'); - switch (ch) - { - case BS: ga_append(&prt_ps_buffer, 'b'); break; - case TAB: ga_append(&prt_ps_buffer, 't'); break; - case NL: ga_append(&prt_ps_buffer, 'n'); break; - case FF: ga_append(&prt_ps_buffer, 'f'); break; - case CAR: ga_append(&prt_ps_buffer, 'r'); break; - case '(': ga_append(&prt_ps_buffer, '('); break; - case ')': ga_append(&prt_ps_buffer, ')'); break; - case '\\': ga_append(&prt_ps_buffer, '\\'); break; - - default: - sprintf((char *)ch_buff, "%03o", (unsigned int)ch); - ga_append(&prt_ps_buffer, ch_buff[0]); - ga_append(&prt_ps_buffer, ch_buff[1]); - ga_append(&prt_ps_buffer, ch_buff[2]); - break; - } - } - else - ga_append(&prt_ps_buffer, ch); - } - - // Need to free any translated characters - vim_free(tofree); - - prt_text_run += char_width; - prt_pos_x += char_width; - - // The downside of fp - use relative error on right margin check - next_pos = prt_pos_x + prt_char_width; - need_break = (next_pos > prt_right_margin) && - ((next_pos - prt_right_margin) > (prt_right_margin*1e-5)); - - if (need_break) - prt_flush_buffer(); - - return need_break; -} - - void -mch_print_set_font(int iBold, int iItalic, int iUnderline) -{ - int font = 0; - - if (iBold) - font |= 0x01; - if (iItalic) - font |= 0x02; - - if (font != prt_font) - { - prt_font = font; - prt_attribute_change = TRUE; - prt_need_font = TRUE; - } - if (prt_underline != iUnderline) - { - prt_underline = iUnderline; - prt_attribute_change = TRUE; - prt_need_underline = TRUE; - } -} - - void -mch_print_set_bg(long_u bgcol) -{ - prt_bgcol = (int)bgcol; - prt_attribute_change = TRUE; - prt_need_bgcol = TRUE; -} - - void -mch_print_set_fg(long_u fgcol) -{ - if (fgcol == (long_u)prt_fgcol) - return; - - prt_fgcol = (int)fgcol; - prt_attribute_change = TRUE; - prt_need_fgcol = TRUE; -} - -#endif //FEAT_POSTSCRIPT #endif //FEAT_PRINTER diff --git a/src/hardcopy.h b/src/hardcopy.h new file mode 100644 index 0000000000..0d8d6e5746 --- /dev/null +++ b/src/hardcopy.h @@ -0,0 +1,46 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * hardcopy.h: common stuff for hardcopy feature + */ + +#ifndef HARDCOPY_H +#define HARDCOPY_H + +#include "vim.h" + +#if defined(FEAT_PRINTER) + +# define PRCOLOR_BLACK (long_u)0 +# define PRCOLOR_WHITE (long_u)0xFFFFFFL + +extern int prt_curr_italic; +extern int prt_curr_bold; +extern int prt_curr_underline; +extern long_u prt_curr_bg; +extern long_u prt_curr_fg; +extern int prt_page_count; + +# if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) +typedef struct +{ + char *name; + double width; // Width and height in points for portrait + double height; +} prt_mediasize_T; + +# define PRT_MEDIASIZE_LEN 14 + +extern prt_mediasize_T prt_mediasize[PRT_MEDIASIZE_LEN]; +# endif + +#endif + +#endif diff --git a/src/hardcopy_pango.c b/src/hardcopy_pango.c new file mode 100644 index 0000000000..e3d46a57b7 --- /dev/null +++ b/src/hardcopy_pango.c @@ -0,0 +1,783 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * See https://www.cairographics.org/documentation/using_the_postscript_surface/ + * for information about Cairo's postscript backend. + * + * Related: + * https://www.cairographics.org/manual/cairo-PDF-Surfaces.html#cairo-pdf-surface-set-size + */ + +#include "vim.h" +#include "version.h" + +#ifdef FEAT_PRINT_PANGO + +#include "hardcopy.h" +#include "hardcopy_pango.h" + +#include +#include +#include +#include + +#define PRINT_DPI 72.0 + +#define PRT_DRAW_BOLD 1 +#define PRT_DRAW_ITALIC 2 +#define PRT_DRAW_UNDERLINE 4 + +#define GET_Y(l) (pctx.top_margin + (l) * pctx.char_height) +#define GET_TEXT_Y(l) (GET_Y(l) + pctx.char_ascent) + +typedef enum +{ + PRT_FORMAT_PS, // Postscript + PRT_FORMAT_PDF, // PDF +} prt_format_T; + +/* + * Global state for printing + */ +static struct +{ + // Cairo surface to draw on. Note that surface is scaled in points (1/72 of + // an inch), for all formats. + cairo_surface_t *surface; + cairo_t *cr; + PangoContext *text_context; + + PangoFontDescription *font; + + char_u *filename; + + int media; + bool portrait; + bool collate; + bool duplex; + bool tumble; // Short edge duplex + + prt_format_T format; + + double char_width; + double char_ascent; + double char_height; + double line_spacing; + double ul_pos; + double ul_thickness; + + double page_width; + double page_height; + + double left_margin; + double right_margin; + double top_margin; + double bottom_margin; + + double number_width; + + // Current position to draw from + double cur_x; + int cur_line; + long_u cur_fg; + long_u cur_bg; + + char_u draw_flags; + +#ifdef USE_GTK4_PRINT_DIALOG + bool dialog; +#endif +} pctx; + +static const char *print_formats[] = { + [PRT_FORMAT_PS] = "postscript", + [PRT_FORMAT_PDF] = "pdf", +}; + +/* + * Convert the margin specified in "idx" to device units. "physsize" is the size + * (width or height). + */ + static double +to_device_units(int idx, double physsize, int def_number) +{ + float ret; + int u; + int nr; + + u = prt_get_unit(idx); + if (u == PRT_UNIT_NONE) + { + u = PRT_UNIT_PERC; + nr = def_number; + } + else + nr = printer_opts[idx].number; + + switch (u) + { + case PRT_UNIT_INCH: + ret = (nr * PRINT_DPI); + break; + case PRT_UNIT_MM: + ret = (nr * PRINT_DPI) / 25.4; + break; + case PRT_UNIT_POINT: + ret = (double)nr; + break; + case PRT_UNIT_PERC: + default: + ret = physsize * (nr / 100.0); + break; + } + + return ret; +} + +/* + * Calculate margins for given width and height from printoptions settings. + */ + static void +get_page_margins( + double width, + double height, + double *left, + double *right, + double *top, + double *bottom) +{ + *left = to_device_units(OPT_PRINT_LEFT, width, 10); + *right = width - to_device_units(OPT_PRINT_RIGHT, width, 5); + + *top = to_device_units(OPT_PRINT_TOP, height, 5); + *bottom = height - to_device_units(OPT_PRINT_BOT, height, 5); +} + +/* + * Get characters per line (excluding margins). + */ + static int +get_cpl(void) +{ + if (prt_use_number()) + { + pctx.number_width = PRINT_NUMBER_WIDTH * pctx.char_width; + pctx.left_margin += pctx.number_width; + } + else + pctx.number_width = 0.0; + + return (int)((pctx.right_margin - pctx.left_margin) / pctx.char_width); +} + +/* + * Get number of lines of text that fit on a page (excluding the header). + */ + static int +get_lpp(void) +{ + int lpp; + + // Calculate lpp + lpp = (int)((pctx.bottom_margin - pctx.top_margin) / pctx.char_height); + + // Adjust top margin if there is a header + pctx.top_margin += pctx.char_height * prt_header_height(); + + return lpp - prt_header_height(); +} + +/* + * Get the font descrption from the given name. Returns NULL on failure. + */ + static PangoFontDescription * +get_font(char_u *name) +{ + PangoFontDescription *font; + + if (name == NULL) + return NULL; + + font = pango_font_description_from_string((const char *)name); + if (font == NULL) + { + semsg(_(e_unknown_printer_font_str), name); + return NULL; + } + + // Ensure a size is set + if (pango_font_description_get_size(font) <= 0) + pango_font_description_set_size(font, 10 * PANGO_SCALE); + + return font; +} + + int +mch_print_init( + prt_settings_T *psettings, + char_u *jobname, + int forceit UNUSED) +{ + char_u *paper_name; + int paper_strlen; + bool portrait; + int media; + char_u *filename = NULL; +#ifdef USE_GTK4_PRINT_DIALOG + bool dialog = false; + + if (gui.in_use && !forceit && psettings->outfile == NULL) + { + filename = gui_gtk4_print_dialog(psettings, jobname, + &pctx.page_width, &pctx.page_height); + + if (filename == NULL) + return FAIL; + dialog = true; + } +#endif + + pctx.format = PRT_FORMAT_PS; + + // Let GTK handle stuff when using dialog. Not sure if our postscript DSC + // comments can intefere with dialog settings, but don't add them... +#ifdef USE_GTK4_PRINT_DIALOG + if (!dialog) +#endif + { + // Get paper type to use + portrait = (!printer_opts[OPT_PRINT_PORTRAIT].present || + TOLOWER_ASC(printer_opts[OPT_PRINT_PORTRAIT].string[0]) == 'y'); + pctx.portrait = portrait; + if (printer_opts[OPT_PRINT_PAPER].present) + { + paper_name = printer_opts[OPT_PRINT_PAPER].string; + paper_strlen = printer_opts[OPT_PRINT_PAPER].strlen; + } + else + { + paper_name = (char_u *)"A4"; + paper_strlen = 2; + } + + // Set width and height using given paper type + for (media = 0; media < (int)PRT_MEDIASIZE_LEN; ++media) + if ((int)STRLEN(prt_mediasize[media].name) == paper_strlen + && STRNICMP(prt_mediasize[media].name, + paper_name, paper_strlen) == 0) + break; + if (media == PRT_MEDIASIZE_LEN) + media = 0; + pctx.media = media; + + if (portrait) + { + pctx.page_width = prt_mediasize[media].width; + pctx.page_height = prt_mediasize[media].height; + } + else + { + pctx.page_width = prt_mediasize[media].height; + pctx.page_height = prt_mediasize[media].width; + } + + if (printer_opts[OPT_PRINT_FORMAT].present) + { + for (int i = 0; i < (int)ARRAY_LENGTH(print_formats); i++) + if (STRNCMP(printer_opts[OPT_PRINT_FORMAT].string, + print_formats[i], + printer_opts[OPT_PRINT_FORMAT].strlen) == 0) + { + pctx.format = i; + break; + } + } + } + psettings->user_abort = FALSE; + +#ifdef USE_GTK4_PRINT_DIALOG + if (dialog) + // Always use PDF for dialog + pctx.format = PRT_FORMAT_PDF; +#endif + + if (filename == NULL) + { + // If the user didn't specify a file name, use a temp file. + if (psettings->outfile == NULL) + { + filename = vim_tempname('p', TRUE); + if (filename == NULL) + { + emsg(_(e_cant_get_temp_file_name)); + return FAIL; + } + } + else + filename = expand_env_save(psettings->outfile); + } + + // If using dialog, then always use PDF + if (pctx.format == PRT_FORMAT_PS) + pctx.surface = cairo_ps_surface_create((const char *)filename, + pctx.page_width, pctx.page_height); + else + pctx.surface = cairo_pdf_surface_create((const char *)filename, + pctx.page_width, pctx.page_height); + + pctx.filename = (char_u *)filename; + + if (cairo_surface_status(pctx.surface) != CAIRO_STATUS_SUCCESS) + { + emsg(_(e_cant_open_postscript_output_file)); + mch_print_cleanup(); + return FAIL; + } + + pctx.cr = cairo_create(pctx.surface); + pctx.text_context = pango_cairo_create_context(pctx.cr); + pctx.font = get_font(p_pfn); + + if (pctx.font == NULL) + { + mch_print_cleanup(); + return FAIL; + } + + pango_context_set_font_description(pctx.text_context, pctx.font); + // Pango DPI is 96, must adjust + pango_cairo_context_set_resolution(pctx.text_context, 72.0); + + // Get line height and char width + { + PangoLayout *layout; + PangoFontMetrics *metrics; + int ascent; + int descent; + + layout = pango_layout_new(pctx.text_context); + pango_layout_set_font_description(layout, pctx.font); + + metrics = pango_context_get_metrics( + pango_layout_get_context(layout), pctx.font, NULL); + + pctx.char_width = + (double)pango_font_metrics_get_approximate_char_width(metrics) + / PANGO_SCALE; + + ascent = pango_font_metrics_get_ascent(metrics); + descent = pango_font_metrics_get_descent(metrics); + + pctx.char_ascent = (double)ascent / PANGO_SCALE; + pctx.char_height = (double)(ascent + descent + + (PANGO_SCALE * 15.0) / 16.0) / PANGO_SCALE; + + pctx.line_spacing = (double) + (pango_font_metrics_get_height(metrics) - (ascent + descent)) + / PANGO_SCALE; + + pctx.ul_pos = + (double)pango_font_metrics_get_underline_position(metrics) + / PANGO_SCALE; + pctx.ul_thickness = + (double)pango_font_metrics_get_underline_thickness(metrics) + / PANGO_SCALE; + + pango_font_metrics_unref(metrics); + g_object_unref(layout); + } + + // Calculate margins + { + double left; + double right; + double top; + double bottom; + + get_page_margins(pctx.page_width, pctx.page_height, &left, &right, &top, + &bottom); + pctx.left_margin = left; + pctx.right_margin = right; + pctx.top_margin = top; + pctx.bottom_margin = bottom; + } + + psettings->chars_per_line = get_cpl(); + psettings->lines_per_page = get_lpp(); + + // Postscript handles collating pages, don't let Vim handle it. This means + // we don't need to worry about the "jobsplit" value in 'printoptions' + psettings->n_collated_copies = 1; + psettings->n_uncollated_copies = 1; + + psettings->jobname = jobname; + +#ifdef USE_GTK4_PRINT_DIALOG + if (!dialog) +#endif + { + pctx.collate = (!printer_opts[OPT_PRINT_COLLATE].present || + TOLOWER_ASC(printer_opts[OPT_PRINT_COLLATE].string[0]) == 'y'); + + pctx.duplex = TRUE; + pctx.tumble = FALSE; + psettings->duplex = TRUE; + if (printer_opts[OPT_PRINT_DUPLEX].present) + { + if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "off", 3) == 0) + { + pctx.duplex = FALSE; + psettings->duplex = 0; + } + else if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "short", + 5) == 0) + pctx.tumble = TRUE; + } + } + +#ifdef USE_GTK4_PRINT_DIALOG + pctx.dialog = dialog; +#endif + + return OK; +} + +/* + * Emit a DSC comment, "fmt" may be NULL to indicate no arguments. + */ + static void +emit_dsc_comment(char *comment, char *fmt, ...) +{ + static char buf[257]; + + va_list ap; + int len = sizeof(buf); + int o; + char *s = buf; + + if (fmt == NULL) + { + o = vim_snprintf(s, len, "%%%%%s", comment); + goto exit; + } + else + o = vim_snprintf(s, len, "%%%%%s: ", comment); + + len -= o; + s += o; + if (len <= 0) + return; + + va_start(ap, fmt); + vim_vsnprintf(s, len, fmt, ap); + va_end(ap); + +exit: + cairo_ps_surface_dsc_comment(pctx.surface, buf); +} + + int +mch_print_begin(prt_settings_T *psettings) +{ + char user[256]; + + pctx.cur_x = 0.0; + pctx.cur_line = 0; + pctx.draw_flags = 0; + +#ifdef USE_GTK4_PRINT_DIALOG + if (pctx.dialog) + return TRUE; +#endif + + if (!get_user_name((char_u *)user, sizeof(user))) + STRCPY(user, "Unknown"); + + if (pctx.format == PRT_FORMAT_PS) + { + emit_dsc_comment("Title", (char *)psettings->jobname); + emit_dsc_comment("For", user); + emit_dsc_comment("Orientation", + pctx.portrait ? "Portrait" : "Landscape"); + emit_dsc_comment("PageOrder", "Ascend"); + + emit_dsc_comment("DocumentMedia", + "%s %.2lf %.2lf 0 () ()", + prt_mediasize[pctx.media].name, + prt_mediasize[pctx.media].width, + prt_mediasize[pctx.media].height); + + emit_dsc_comment("Requirements", "%s%s %s %s", + pctx.duplex ? "duplex" : "", + pctx.tumble ? "(tumble)" : "", + pctx.collate ? "collate" : "", + psettings->do_syntax ? "color" : ""); + + // In defaults section (defaults for every page) + emit_dsc_comment("BeginDefaults", NULL); + emit_dsc_comment("PageMedia", prt_mediasize[pctx.media].name); + emit_dsc_comment("EndDefaults", NULL); + } + else if (pctx.format == PRT_FORMAT_PDF) + { + char_u *str = (char_u *)user; + + if (output_conv.vc_type != CONV_NONE) + str = string_convert(&output_conv, str, NULL); + + cairo_pdf_surface_set_metadata(pctx.surface, + CAIRO_PDF_METADATA_AUTHOR, (char *)str); + if (output_conv.vc_type != CONV_NONE) + vim_free(str); + + str = psettings->jobname; + if (output_conv.vc_type != CONV_NONE) + str = string_convert(&output_conv, str, NULL); + cairo_pdf_surface_set_metadata(pctx.surface, + CAIRO_PDF_METADATA_TITLE, (char *)str); + if (output_conv.vc_type != CONV_NONE) + vim_free(str); + + cairo_pdf_surface_set_metadata(pctx.surface, + CAIRO_PDF_METADATA_CREATOR, VIM_VERSION_LONG); + } + + return TRUE; +} + + void +mch_print_end(prt_settings_T *psettings) +{ + // Make sure surface flushes to file or stream + cairo_surface_finish(pctx.surface); + + if (psettings->outfile == NULL && !got_int && !psettings->user_abort + && pctx.filename != NULL +#ifdef USE_GTK4_PRINT_DIALOG + && !pctx.dialog +#endif + ) + { + msg(_("Sending to printer...")); + + // Not printing to a file: use 'printexpr' to print the file. + if (eval_printexpr(pctx.filename, psettings->arguments) == FAIL) + emsg(_(e_failed_to_print_postscript_file)); + else + msg(_("Print job sent.")); + } + + mch_print_cleanup(); +} + + int +mch_print_end_page(void) +{ + cairo_show_page(pctx.cr); + return TRUE; +} + +/* + * Do nothing because we create a new page for the cairo surface at the end of + * every page. + */ + int +mch_print_begin_page(char_u *str UNUSED) +{ + return TRUE; +} + + int +mch_print_blank_page(void) +{ + mch_print_end_page(); + return TRUE; +} + + void +mch_print_start_line(int margin, int page_line) +{ + pctx.cur_x = pctx.left_margin; + if (margin) + pctx.cur_x -= pctx.number_width; + + pctx.cur_line = page_line; +} + + static void +long_to_rgb(long_u c, double *r, double *g, double *b) +{ + *r = ((c >> 16) & 0xFF) / 255.0; + *g = ((c >> 8) & 0xFF) / 255.0; + *b = ((c >> 0) & 0xFF) / 255.0; +} + +/* + * Don't use PangoLayout for rendering the text, so that we can handle the + * positioning and sizing ourselves. + */ + int +mch_print_text_out(char_u *textp, int len) +{ + PangoAttrList *attr_list; + GList *item_list; + PangoGlyphString *glyphs; + char_u *str; + double r, g, b; + double width = 0; + double next_x; + + // Always convert to UTF-8, Pango expects that + if (output_conv.vc_type == CONV_NONE) + str = textp; + else + str = string_convert(&output_conv, textp, &len); + + if (str == NULL) + return TRUE; + + attr_list = pango_attr_list_new(); + +#define INSERT_PANGO_ATTR(Attribute, AttrList, Start, End) \ + G_STMT_START{ \ + PangoAttribute *tmp_attr_; \ + tmp_attr_ = (Attribute); \ + tmp_attr_->start_index = (Start); \ + tmp_attr_->end_index = (End); \ + pango_attr_list_insert((AttrList), tmp_attr_); \ + }G_STMT_END + + // Underline attribute does not work with pango_itemize(). + if ((pctx.draw_flags & PRT_DRAW_BOLD)) + INSERT_PANGO_ATTR(pango_attr_weight_new(PANGO_WEIGHT_BOLD), + attr_list, 0, len); + if (pctx.draw_flags & PRT_DRAW_ITALIC) + INSERT_PANGO_ATTR(pango_attr_style_new(PANGO_STYLE_ITALIC), + attr_list, 0, len); + +#undef INSERT_PANGO_ATTR + + item_list = pango_itemize(pctx.text_context, + (const char *)str, 0, len, attr_list, NULL); + pango_attr_list_unref(attr_list); + + glyphs = pango_glyph_string_new(); + + // Loop is probably unecessary, because "str" represents a single character. + // Do it anyways to be sure. + while (item_list != NULL) + { + PangoItem *item; + double o; + + item = (PangoItem *)item_list->data; + item_list = g_list_delete_link(item_list, item_list); + + pango_shape_full((const char *)str + item->offset, item->length, + (const char *)str, len, &item->analysis, glyphs); + + // Benefit of directly getting the width instead of deriving it from the + // char width and number of cells, is that non-monospace fonts look + // better. + o = (double)pango_glyph_string_get_width(glyphs) / PANGO_SCALE; + + // Draw background color (only if different). Cannot batch bg color, + // because then we would overwrite glyphs. + if (pctx.cur_bg != PRCOLOR_WHITE) + { + long_to_rgb(pctx.cur_bg, &r, &g, &b); + cairo_set_source_rgb(pctx.cr, r, g, b); + cairo_rectangle(pctx.cr, pctx.cur_x + width, + GET_Y(pctx.cur_line) - pctx.line_spacing, o, pctx.char_height); + cairo_fill(pctx.cr); + } + + // Draw actual text + long_to_rgb(pctx.cur_fg, &r, &g, &b); + cairo_set_source_rgb(pctx.cr, r, g, b); + cairo_move_to(pctx.cr, pctx.cur_x + width, GET_TEXT_Y(pctx.cur_line)); + pango_cairo_show_glyph_string(pctx.cr, item->analysis.font, glyphs); + + pango_item_free(item); + width += o; + } + + // Draw underline if needed + if (pctx.draw_flags & PRT_DRAW_UNDERLINE) + { + double y = GET_TEXT_Y(pctx.cur_line) - pctx.ul_pos; + + long_to_rgb(pctx.cur_fg, &r, &g, &b); + cairo_set_source_rgb(pctx.cr, r, g, b); + cairo_set_line_width(pctx.cr, pctx.ul_thickness); + cairo_move_to(pctx.cr, pctx.cur_x, y); + cairo_line_to(pctx.cr, pctx.cur_x + width, y); + cairo_stroke(pctx.cr); + } + + pango_glyph_string_free(glyphs); + + pctx.cur_x += width; + + next_x = pctx.cur_x + pctx.char_width; + + if (output_conv.vc_type != CONV_NONE) + vim_free(str); + + // Use epsilon when comparing floating point + return (next_x > pctx.right_margin) && + ((next_x - pctx.right_margin) > (pctx.right_margin * 1e-5)); +} + + void +mch_print_set_font(int bold, int italic, int underline) +{ + pctx.draw_flags = 0; + + if (bold) + pctx.draw_flags |= PRT_DRAW_BOLD; + if (italic) + pctx.draw_flags |= PRT_DRAW_ITALIC; + if (underline) + pctx.draw_flags |= PRT_DRAW_UNDERLINE; +} + + void +mch_print_set_bg(long_u bgcol) +{ + pctx.cur_bg = bgcol; +} + + void +mch_print_set_fg(long_u fgcol) +{ + // Probably can just call cairo_set_source_rgba() here but defer it later to + // be consistent with bg color. + pctx.cur_fg = fgcol; +} + + void +mch_print_cleanup(void) +{ + g_clear_pointer(&pctx.cr, cairo_destroy); + g_clear_pointer(&pctx.surface, cairo_surface_destroy); + g_clear_object(&pctx.text_context); + g_clear_pointer(&pctx.font, pango_font_description_free); + +#ifdef USE_GTK4_PRINT_DIALOG + // If using dialog, defer the temp file deletion later + if (pctx.dialog) + gui_gtk4_print_finish(); +#endif + + g_clear_pointer(&pctx.filename, vim_free); +} + +#endif // FEAT_PRINT_PANGO diff --git a/src/hardcopy_pango.h b/src/hardcopy_pango.h new file mode 100644 index 0000000000..26a4c227a6 --- /dev/null +++ b/src/hardcopy_pango.h @@ -0,0 +1,32 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#ifndef HARDCOPY_PANGO_H +#define HARDCOPY_PANGO_H + +#include "vim.h" + +#if defined(FEAT_PRINT_PANGO) + +int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); +int mch_print_begin(prt_settings_T *psettings); +void mch_print_end(prt_settings_T *psettings); +int mch_print_end_page(void); +int mch_print_begin_page(char_u *str); +int mch_print_blank_page(void); +void mch_print_start_line(int margin, int page_line); +int mch_print_text_out(char_u *textp, int len); +void mch_print_set_font(int bold, int italic, int underline); +void mch_print_set_bg(long_u bgcol); +void mch_print_set_fg(long_u fgcol); +void mch_print_cleanup(void); + +#endif + +#endif diff --git a/src/hardcopy_postscript.c b/src/hardcopy_postscript.c new file mode 100644 index 0000000000..123b9f3407 --- /dev/null +++ b/src/hardcopy_postscript.c @@ -0,0 +1,2512 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * PS printer stuff. + * + * Sources of information to help maintain the PS printing code: + * + * 1. PostScript Language Reference, 3rd Edition, + * Addison-Wesley, 1999, ISBN 0-201-37922-8 + * 2. PostScript Language Program Design, + * Addison-Wesley, 1988, ISBN 0-201-14396-8 + * 3. PostScript Tutorial and Cookbook, + * Addison Wesley, 1985, ISBN 0-201-10179-3 + * 4. PostScript Language Document Structuring Conventions Specification, + * version 3.0, + * Adobe Technote 5001, 25th September 1992 + * 5. PostScript Printer Description File Format Specification, Version 4.3, + * Adobe technote 5003, 9th February 1996 + * 6. Adobe Font Metrics File Format Specification, Version 4.1, + * Adobe Technote 5007, 7th October 1998 + * 7. Adobe CMap and CIDFont Files Specification, Version 1.0, + * Adobe Technote 5014, 8th October 1996 + * 8. Adobe CJKV Character Collections and CMaps for CID-Keyed Fonts, + * Adoboe Technote 5094, 8th September, 2001 + * 9. CJKV Information Processing, 2nd Edition, + * O'Reilly, 2002, ISBN 1-56592-224-7 + * + * Some of these documents can be found in PDF form on Adobe's web site - + * http://www.adobe.com + */ + +#include "vim.h" +#include "version.h" + +#ifdef FEAT_POSTSCRIPT + +# include "hardcopy.h" +# include "hardcopy_postscript.h" + +option_table_T mbfont_opts[OPT_MBFONT_NUM_OPTIONS] = +{ + {"c", FALSE, 0, NULL, 0, FALSE}, + {"a", FALSE, 0, NULL, 0, FALSE}, + {"r", FALSE, 0, NULL, 0, FALSE}, + {"b", FALSE, 0, NULL, 0, FALSE}, + {"i", FALSE, 0, NULL, 0, FALSE}, + {"o", FALSE, 0, NULL, 0, FALSE}, +}; + +# define PRT_PS_DEFAULT_DPI (72) // Default user space resolution +# define PRT_PS_DEFAULT_FONTSIZE (10) +# define PRT_PS_DEFAULT_BUFFER_SIZE (80) + +// PS font names, must be in Roman, Bold, Italic, Bold-Italic order +struct prt_ps_font_S +{ + int wx; + int uline_offset; + int uline_width; + int bbox_min_y; + int bbox_max_y; + char *(ps_fontname[4]); +}; + +# define PRT_PS_FONT_ROMAN (0) +# define PRT_PS_FONT_BOLD (1) +# define PRT_PS_FONT_OBLIQUE (2) +# define PRT_PS_FONT_BOLDOBLIQUE (3) + +// Standard font metrics for Courier family +static struct prt_ps_font_S prt_ps_courier_font = +{ + 600, + -100, 50, + -250, 805, + {"Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique"} +}; + +// Generic font metrics for multi-byte fonts +static struct prt_ps_font_S prt_ps_mb_font = +{ + 1000, + -100, 50, + -250, 805, + {NULL, NULL, NULL, NULL} +}; + +// Pointer to current font set being used +static struct prt_ps_font_S* prt_ps_font; + +// Structures to map user named encoding and mapping to PS equivalents for +// building CID font name +struct prt_ps_encoding_S +{ + char *encoding; + char *cmap_encoding; + int needs_charset; +}; + +struct prt_ps_charset_S +{ + char *charset; + char *cmap_charset; + int has_charset; +}; + +# define CS_JIS_C_1978 (0x01) +# define CS_JIS_X_1983 (0x02) +# define CS_JIS_X_1990 (0x04) +# define CS_NEC (0x08) +# define CS_MSWINDOWS (0x10) +# define CS_CP932 (0x20) +# define CS_KANJITALK6 (0x40) +# define CS_KANJITALK7 (0x80) + +// Japanese encodings and charsets +static struct prt_ps_encoding_S j_encodings[] = +{ + {"iso-2022-jp", NULL, (CS_JIS_C_1978|CS_JIS_X_1983|CS_JIS_X_1990| + CS_NEC)}, + {"euc-jp", "EUC", (CS_JIS_C_1978|CS_JIS_X_1983|CS_JIS_X_1990)}, + {"sjis", "RKSJ", (CS_JIS_C_1978|CS_JIS_X_1983|CS_MSWINDOWS| + CS_KANJITALK6|CS_KANJITALK7)}, + {"cp932", "RKSJ", CS_JIS_X_1983}, + {"ucs-2", "UCS2", CS_JIS_X_1990}, + {"utf-8", "UTF8" , CS_JIS_X_1990} +}; +static struct prt_ps_charset_S j_charsets[] = +{ + {"JIS_C_1978", "78", CS_JIS_C_1978}, + {"JIS_X_1983", NULL, CS_JIS_X_1983}, + {"JIS_X_1990", "Hojo", CS_JIS_X_1990}, + {"NEC", "Ext", CS_NEC}, + {"MSWINDOWS", "90ms", CS_MSWINDOWS}, + {"CP932", "90ms", CS_JIS_X_1983}, + {"KANJITALK6", "83pv", CS_KANJITALK6}, + {"KANJITALK7", "90pv", CS_KANJITALK7} +}; + +# define CS_GB_2312_80 (0x01) +# define CS_GBT_12345_90 (0x02) +# define CS_GBK2K (0x04) +# define CS_SC_MAC (0x08) +# define CS_GBT_90_MAC (0x10) +# define CS_GBK (0x20) +# define CS_SC_ISO10646 (0x40) + +// Simplified Chinese encodings and charsets +static struct prt_ps_encoding_S sc_encodings[] = +{ + {"iso-2022", NULL, (CS_GB_2312_80|CS_GBT_12345_90)}, + {"gb18030", NULL, CS_GBK2K}, + {"euc-cn", "EUC", (CS_GB_2312_80|CS_GBT_12345_90|CS_SC_MAC| + CS_GBT_90_MAC)}, + {"gbk", "EUC", CS_GBK}, + {"ucs-2", "UCS2", CS_SC_ISO10646}, + {"utf-8", "UTF8", CS_SC_ISO10646} +}; +static struct prt_ps_charset_S sc_charsets[] = +{ + {"GB_2312-80", "GB", CS_GB_2312_80}, + {"GBT_12345-90","GBT", CS_GBT_12345_90}, + {"MAC", "GBpc", CS_SC_MAC}, + {"GBT-90_MAC", "GBTpc", CS_GBT_90_MAC}, + {"GBK", "GBK", CS_GBK}, + {"GB18030", "GBK2K", CS_GBK2K}, + {"ISO10646", "UniGB", CS_SC_ISO10646} +}; + +# define CS_CNS_PLANE_1 (0x01) +# define CS_CNS_PLANE_2 (0x02) +# define CS_CNS_PLANE_1_2 (0x04) +# define CS_B5 (0x08) +# define CS_ETEN (0x10) +# define CS_HK_GCCS (0x20) +# define CS_HK_SCS (0x40) +# define CS_HK_SCS_ETEN (0x80) +# define CS_MTHKL (0x100) +# define CS_MTHKS (0x200) +# define CS_DLHKL (0x400) +# define CS_DLHKS (0x800) +# define CS_TC_ISO10646 (0x1000) + +// Traditional Chinese encodings and charsets +static struct prt_ps_encoding_S tc_encodings[] = +{ + {"iso-2022", NULL, (CS_CNS_PLANE_1|CS_CNS_PLANE_2)}, + {"euc-tw", "EUC", CS_CNS_PLANE_1_2}, + {"big5", "B5", (CS_B5|CS_ETEN|CS_HK_GCCS|CS_HK_SCS| + CS_HK_SCS_ETEN|CS_MTHKL|CS_MTHKS|CS_DLHKL| + CS_DLHKS)}, + {"cp950", "B5", CS_B5}, + {"ucs-2", "UCS2", CS_TC_ISO10646}, + {"utf-8", "UTF8", CS_TC_ISO10646}, + {"utf-16", "UTF16", CS_TC_ISO10646}, + {"utf-32", "UTF32", CS_TC_ISO10646} +}; +static struct prt_ps_charset_S tc_charsets[] = +{ + {"CNS_1992_1", "CNS1", CS_CNS_PLANE_1}, + {"CNS_1992_2", "CNS2", CS_CNS_PLANE_2}, + {"CNS_1993", "CNS", CS_CNS_PLANE_1_2}, + {"BIG5", NULL, CS_B5}, + {"CP950", NULL, CS_B5}, + {"ETEN", "ETen", CS_ETEN}, + {"HK_GCCS", "HKgccs", CS_HK_GCCS}, + {"SCS", "HKscs", CS_HK_SCS}, + {"SCS_ETEN", "ETHK", CS_HK_SCS_ETEN}, + {"MTHKL", "HKm471", CS_MTHKL}, + {"MTHKS", "HKm314", CS_MTHKS}, + {"DLHKL", "HKdla", CS_DLHKL}, + {"DLHKS", "HKdlb", CS_DLHKS}, + {"ISO10646", "UniCNS", CS_TC_ISO10646} +}; + +# define CS_KR_X_1992 (0x01) +# define CS_KR_MAC (0x02) +# define CS_KR_X_1992_MS (0x04) +# define CS_KR_ISO10646 (0x08) + +// Korean encodings and charsets +static struct prt_ps_encoding_S k_encodings[] = +{ + {"iso-2022-kr", NULL, CS_KR_X_1992}, + {"euc-kr", "EUC", (CS_KR_X_1992|CS_KR_MAC)}, + {"johab", "Johab", CS_KR_X_1992}, + {"cp1361", "Johab", CS_KR_X_1992}, + {"uhc", "UHC", CS_KR_X_1992_MS}, + {"cp949", "UHC", CS_KR_X_1992_MS}, + {"ucs-2", "UCS2", CS_KR_ISO10646}, + {"utf-8", "UTF8", CS_KR_ISO10646} +}; +static struct prt_ps_charset_S k_charsets[] = +{ + {"KS_X_1992", "KSC", CS_KR_X_1992}, + {"CP1361", "KSC", CS_KR_X_1992}, + {"MAC", "KSCpc", CS_KR_MAC}, + {"MSWINDOWS", "KSCms", CS_KR_X_1992_MS}, + {"CP949", "KSCms", CS_KR_X_1992_MS}, + {"WANSUNG", "KSCms", CS_KR_X_1992_MS}, + {"ISO10646", "UniKS", CS_KR_ISO10646} +}; + +// Collections of encodings and charsets for multi-byte printing +struct prt_ps_mbfont_S +{ + int num_encodings; + struct prt_ps_encoding_S *encodings; + int num_charsets; + struct prt_ps_charset_S *charsets; + char *ascii_enc; + char *defcs; +}; + +static struct prt_ps_mbfont_S prt_ps_mbfonts[] = +{ + { + ARRAY_LENGTH(j_encodings), + j_encodings, + ARRAY_LENGTH(j_charsets), + j_charsets, + "jis_roman", + "JIS_X_1983" + }, + { + ARRAY_LENGTH(sc_encodings), + sc_encodings, + ARRAY_LENGTH(sc_charsets), + sc_charsets, + "gb_roman", + "GB_2312-80" + }, + { + ARRAY_LENGTH(tc_encodings), + tc_encodings, + ARRAY_LENGTH(tc_charsets), + tc_charsets, + "cns_roman", + "BIG5" + }, + { + ARRAY_LENGTH(k_encodings), + k_encodings, + ARRAY_LENGTH(k_charsets), + k_charsets, + "ks_roman", + "KS_X_1992" + } +}; + +struct prt_ps_resource_S +{ + char_u name[64]; + char_u filename[MAXPATHL + 1]; + int type; + char_u title[256]; + char_u version[256]; +}; + +// Types of PS resource file currently used +# define PRT_RESOURCE_TYPE_PROCSET (0) +# define PRT_RESOURCE_TYPE_ENCODING (1) +# define PRT_RESOURCE_TYPE_CMAP (2) + +// The PS prolog file version number has to match - if the prolog file is +// updated, increment the number in the file and here. Version checking was +// added as of VIM 6.2. +// The CID prolog file version number behaves as per PS prolog. +// Table of VIM and prolog versions: +// +// VIM Prolog CIDProlog +// 6.2 1.3 +// 7.0 1.4 1.0 +# define PRT_PROLOG_VERSION ((char_u *)"1.4") +# define PRT_CID_PROLOG_VERSION ((char_u *)"1.0") + +// String versions of PS resource types - indexed by constants above so don't +// re-order! +static char *prt_resource_types[] = +{ + "procset", + "encoding", + "cmap" +}; + +// Strings to look for in a PS resource file +# define PRT_RESOURCE_HEADER "%!PS-Adobe-" +# define PRT_RESOURCE_RESOURCE "Resource-" +# define PRT_RESOURCE_PROCSET "ProcSet" +# define PRT_RESOURCE_ENCODING "Encoding" +# define PRT_RESOURCE_CMAP "CMap" + + +// Data for table based DSC comment recognition, easy to extend if VIM needs to +// read more comments. +# define PRT_DSC_MISC_TYPE (-1) +# define PRT_DSC_TITLE_TYPE (1) +# define PRT_DSC_VERSION_TYPE (2) +# define PRT_DSC_ENDCOMMENTS_TYPE (3) + +# define PRT_DSC_TITLE "%%Title:" +# define PRT_DSC_VERSION "%%Version:" +# define PRT_DSC_ENDCOMMENTS "%%EndComments:" + +struct prt_dsc_comment_S +{ + char *string; + int len; + int type; +}; + +struct prt_dsc_line_S +{ + int type; + char_u *string; + int len; +}; + + +# define SIZEOF_CSTR(s) (sizeof(s) - 1) +static struct prt_dsc_comment_S prt_dsc_table[] = +{ + {PRT_DSC_TITLE, SIZEOF_CSTR(PRT_DSC_TITLE), PRT_DSC_TITLE_TYPE}, + {PRT_DSC_VERSION, SIZEOF_CSTR(PRT_DSC_VERSION), + PRT_DSC_VERSION_TYPE}, + {PRT_DSC_ENDCOMMENTS, SIZEOF_CSTR(PRT_DSC_ENDCOMMENTS), + PRT_DSC_ENDCOMMENTS_TYPE} +}; + +static void prt_write_file_len(char_u *buffer, int bytes); +static int prt_next_dsc(struct prt_dsc_line_S *p_dsc_line); + +/* + * Variables for the output PostScript file. + */ +static FILE *prt_ps_fd; +static int prt_file_error; +static char_u *prt_ps_file_name = NULL; + +/* + * Various offsets and dimensions in default PostScript user space (points). + * Used for text positioning calculations + */ +static float prt_page_width; +static float prt_page_height; +static float prt_left_margin; +static float prt_right_margin; +static float prt_top_margin; +static float prt_bottom_margin; +static float prt_line_height; +static float prt_first_line_height; +static float prt_char_width; +static float prt_number_width; +static float prt_bgcol_offset; +static float prt_pos_x_moveto = 0.0; +static float prt_pos_y_moveto = 0.0; + +/* + * Various control variables used to decide when and how to change the + * PostScript graphics state. + */ +static int prt_need_moveto; +static int prt_do_moveto; +static int prt_need_font; +static int prt_font; +static int prt_need_underline; +static int prt_underline; +static int prt_do_underline; +static int prt_need_fgcol; +static int prt_fgcol; +static int prt_need_bgcol; +static int prt_do_bgcol; +static int prt_bgcol; +static int prt_new_bgcol; +static int prt_attribute_change; +static float prt_text_run; +static int prt_page_num; +static int prt_bufsiz; + +/* + * Variables controlling physical printing. + */ +static int prt_media; +static int prt_portrait; +static int prt_num_copies; +static int prt_duplex; +static int prt_tumble; +static int prt_collate; + +/* + * Buffers used when generating PostScript output + */ +static char_u prt_line_buffer[257]; +static garray_T prt_ps_buffer; + +static int prt_do_conv; +static vimconv_T prt_conv; + +static int prt_out_mbyte; +static int prt_custom_cmap; +static char prt_cmap[80]; +static int prt_use_courier; +static int prt_in_ascii; +static int prt_half_width; +static char *prt_ascii_encoding; +static const char_u prt_hexchar[] = "0123456789abcdef"; + + static void +prt_write_file_raw_len(char_u *buffer, int bytes) +{ + if (!prt_file_error + && fwrite(buffer, sizeof(char_u), bytes, prt_ps_fd) + != (size_t)bytes) + { + emsg(_(e_error_writing_to_postscript_output_file)); + prt_file_error = TRUE; + } +} + + static void +prt_write_file(char_u *buffer) +{ + prt_write_file_len(buffer, (int)STRLEN(buffer)); +} + + static void +prt_write_file_len(char_u *buffer, int bytes) +{ + prt_write_file_raw_len(buffer, bytes); +} + +/* + * Write a string. + */ + static void +prt_write_string(char *s) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), "%s", s); + prt_write_file(prt_line_buffer); +} + +/* + * Write an int and a space. + */ + static void +prt_write_int(int i) +{ + sprintf((char *)prt_line_buffer, "%d ", i); + prt_write_file(prt_line_buffer); +} + +/* + * Write a boolean and a space. + */ + static void +prt_write_boolean(int b) +{ + sprintf((char *)prt_line_buffer, "%s ", (b ? "T" : "F")); + prt_write_file(prt_line_buffer); +} + +/* + * Write PostScript to re-encode and define the font. + */ + static void +prt_def_font( + char *new_name, + char *encoding, + int height, + char *font) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "/_%s /VIM-%s /%s ref\n", new_name, encoding, font); + prt_write_file(prt_line_buffer); + if (prt_out_mbyte) + sprintf((char *)prt_line_buffer, "/%s %d %f /_%s sffs\n", + new_name, height, 500./prt_ps_courier_font.wx, new_name); + else + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "/%s %d /_%s ffs\n", new_name, height, new_name); + prt_write_file(prt_line_buffer); +} + +/* + * Write a line to define the CID font. + */ + static void +prt_def_cidfont(char *new_name, int height, char *cidfont) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "/_%s /%s[/%s] vim_composefont\n", new_name, prt_cmap, cidfont); + prt_write_file(prt_line_buffer); + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "/%s %d /_%s ffs\n", new_name, height, new_name); + prt_write_file(prt_line_buffer); +} + +/* + * Write a line to define a duplicate of a CID font + */ + static void +prt_dup_cidfont(char *original_name, char *new_name) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "/%s %s d\n", new_name, original_name); + prt_write_file(prt_line_buffer); +} + +/* + * Convert a real value into an integer and fractional part as integers, with + * the fractional part being in the range [0,10^precision). The fractional part + * is also rounded based on the precision + 1'th fractional digit. + */ + static void +prt_real_bits( + double real, + int precision, + int *pinteger, + int *pfraction) +{ + int i; + int integer; + float fraction; + + integer = (int)real; + fraction = (float)(real - integer); + if (real < (double)integer) + fraction = -fraction; + for (i = 0; i < precision; i++) + fraction *= 10.0; + + *pinteger = integer; + *pfraction = (int)(fraction + 0.5); +} + +/* + * Write a real and a space. Save bytes if real value has no fractional part! + * We use prt_real_bits() as %f in sprintf uses the locale setting to decide + * what decimal point character to use, but PS always requires a '.'. + */ + static void +prt_write_real(double val, int prec) +{ + int integer; + int fraction; + + prt_real_bits(val, prec, &integer, &fraction); + // Emit integer part + sprintf((char *)prt_line_buffer, "%d", integer); + prt_write_file(prt_line_buffer); + // Only emit fraction if necessary + if (fraction != 0) + { + // Remove any trailing zeros + while ((fraction % 10) == 0) + { + prec--; + fraction /= 10; + } + // Emit fraction left padded with zeros + sprintf((char *)prt_line_buffer, ".%0*d", prec, fraction); + prt_write_file(prt_line_buffer); + } + sprintf((char *)prt_line_buffer, " "); + prt_write_file(prt_line_buffer); +} + +/* + * Write a line to define a numeric variable. + */ + static void +prt_def_var(char *name, double value, int prec) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "/%s ", name); + prt_write_file(prt_line_buffer); + prt_write_real(value, prec); + sprintf((char *)prt_line_buffer, "d\n"); + prt_write_file(prt_line_buffer); +} + +// Convert size from font space to user space at current font scale +# define PRT_PS_FONT_TO_USER(scale, size) ((size) * ((scale)/1000.0)) + + static void +prt_flush_buffer(void) +{ + if (prt_ps_buffer.ga_len <= 0) + return; + + // Any background color must be drawn first + if (prt_do_bgcol && (prt_new_bgcol != PRCOLOR_WHITE)) + { + int r, g, b; + + if (prt_do_moveto) + { + prt_write_real(prt_pos_x_moveto, 2); + prt_write_real(prt_pos_y_moveto, 2); + prt_write_string("m\n"); + prt_do_moveto = FALSE; + } + + // Size of rect of background color on which text is printed + prt_write_real(prt_text_run, 2); + prt_write_real(prt_line_height, 2); + + // Lastly add the color of the background + r = ((unsigned)prt_new_bgcol & 0xff0000) >> 16; + g = ((unsigned)prt_new_bgcol & 0xff00) >> 8; + b = prt_new_bgcol & 0xff; + prt_write_real(r / 255.0, 3); + prt_write_real(g / 255.0, 3); + prt_write_real(b / 255.0, 3); + prt_write_string("bg\n"); + } + // Draw underlines before the text as it makes it slightly easier to + // find the starting point. + if (prt_do_underline) + { + if (prt_do_moveto) + { + prt_write_real(prt_pos_x_moveto, 2); + prt_write_real(prt_pos_y_moveto, 2); + prt_write_string("m\n"); + prt_do_moveto = FALSE; + } + + // Underline length of text run + prt_write_real(prt_text_run, 2); + prt_write_string("ul\n"); + } + // Draw the text + if (prt_out_mbyte) + prt_write_string("<"); + else + prt_write_string("("); + prt_write_file_raw_len(prt_ps_buffer.ga_data, prt_ps_buffer.ga_len); + if (prt_out_mbyte) + prt_write_string(">"); + else + prt_write_string(")"); + // Add a moveto if need be and use the appropriate show procedure + if (prt_do_moveto) + { + prt_write_real(prt_pos_x_moveto, 2); + prt_write_real(prt_pos_y_moveto, 2); + // moveto and a show + prt_write_string("ms\n"); + prt_do_moveto = FALSE; + } + else // Simple show + prt_write_string("s\n"); + + ga_clear(&prt_ps_buffer); + ga_init2(&prt_ps_buffer, sizeof(char), prt_bufsiz); +} + + + static void +prt_resource_name(char_u *filename, void *cookie) +{ + char_u *resource_filename = cookie; + + if (STRLEN(filename) >= MAXPATHL) + *resource_filename = NUL; + else + STRCPY(resource_filename, filename); +} + + static int +prt_find_resource(char *name, struct prt_ps_resource_S *resource) +{ + char_u *buffer; + int retval; + + buffer = alloc(MAXPATHL + 1); + if (buffer == NULL) + return FALSE; + + vim_strncpy(resource->name, (char_u *)name, 63); + // Look for named resource file in runtimepath + STRCPY(buffer, "print"); + add_pathsep(buffer); + vim_strcat(buffer, (char_u *)name, MAXPATHL); + vim_strcat(buffer, (char_u *)".ps", MAXPATHL); + resource->filename[0] = NUL; + retval = (do_in_runtimepath(buffer, 0, prt_resource_name, + resource->filename) + && resource->filename[0] != NUL); + vim_free(buffer); + return retval; +} + +// PS CR and LF characters have platform independent values +# define PSLF (0x0a) +# define PSCR (0x0d) + +// Static buffer to read initial comments in a resource file, some can have a +// couple of KB of comments! +# define PRT_FILE_BUFFER_LEN (2048) +struct prt_resfile_buffer_S +{ + char_u buffer[PRT_FILE_BUFFER_LEN]; + int len; + int line_start; + int line_end; +}; + +static struct prt_resfile_buffer_S prt_resfile; + + static int +prt_resfile_next_line(void) +{ + int idx; + + // Move to start of next line and then find end of line + idx = prt_resfile.line_end + 1; + while (idx < prt_resfile.len) + { + if (prt_resfile.buffer[idx] != PSLF && prt_resfile.buffer[idx] != PSCR) + break; + idx++; + } + prt_resfile.line_start = idx; + + while (idx < prt_resfile.len) + { + if (prt_resfile.buffer[idx] == PSLF || prt_resfile.buffer[idx] == PSCR) + break; + idx++; + } + prt_resfile.line_end = idx; + + return (idx < prt_resfile.len); +} + + static int +prt_resfile_strncmp(int offset, char *string, int len) +{ + // Force not equal if string is longer than remainder of line + if (len > (prt_resfile.line_end - (prt_resfile.line_start + offset))) + return 1; + + return STRNCMP(&prt_resfile.buffer[prt_resfile.line_start + offset], + string, len); +} + + static int +prt_resfile_skip_nonws(int offset) +{ + int idx; + + idx = prt_resfile.line_start + offset; + while (idx < prt_resfile.line_end) + { + if (SAFE_isspace(prt_resfile.buffer[idx])) + return idx - prt_resfile.line_start; + idx++; + } + return -1; +} + + static int +prt_resfile_skip_ws(int offset) +{ + int idx; + + idx = prt_resfile.line_start + offset; + while (idx < prt_resfile.line_end) + { + if (!SAFE_isspace(prt_resfile.buffer[idx])) + return idx - prt_resfile.line_start; + idx++; + } + return -1; +} + +// prt_next_dsc() - returns detail on next DSC comment line found. Returns true +// if a DSC comment is found, else false + static int +prt_next_dsc(struct prt_dsc_line_S *p_dsc_line) +{ + int comment; + int offset; + + // Move to start of next line + if (!prt_resfile_next_line()) + return FALSE; + + // DSC comments always start %% + if (prt_resfile_strncmp(0, "%%", 2) != 0) + return FALSE; + + // Find type of DSC comment + for (comment = 0; comment < (int)ARRAY_LENGTH(prt_dsc_table); comment++) + if (prt_resfile_strncmp(0, prt_dsc_table[comment].string, + prt_dsc_table[comment].len) == 0) + break; + + if (comment != ARRAY_LENGTH(prt_dsc_table)) + { + // Return type of comment + p_dsc_line->type = prt_dsc_table[comment].type; + offset = prt_dsc_table[comment].len; + } + else + { + // Unrecognised DSC comment, skip to ws after comment leader + p_dsc_line->type = PRT_DSC_MISC_TYPE; + offset = prt_resfile_skip_nonws(0); + if (offset == -1) + return FALSE; + } + + // Skip ws to comment value + offset = prt_resfile_skip_ws(offset); + if (offset == -1) + return FALSE; + + p_dsc_line->string = &prt_resfile.buffer[prt_resfile.line_start + offset]; + p_dsc_line->len = prt_resfile.line_end - (prt_resfile.line_start + offset); + + return TRUE; +} + +/* + * Improved hand crafted parser to get the type, title, and version number of a + * PS resource file so the file details can be added to the DSC header comments. + */ + static int +prt_open_resource(struct prt_ps_resource_S *resource) +{ + int offset; + int seen_all; + int seen_title; + int seen_version; + FILE *fd_resource; + struct prt_dsc_line_S dsc_line; + + fd_resource = mch_fopen((char *)resource->filename, READBIN); + if (fd_resource == NULL) + { + semsg(_(e_cant_open_file_str_3), resource->filename); + return FALSE; + } + CLEAR_FIELD(prt_resfile.buffer); + + // Parse first line to ensure valid resource file + prt_resfile.len = (int)fread((char *)prt_resfile.buffer, sizeof(char_u), + PRT_FILE_BUFFER_LEN, fd_resource); + if (ferror(fd_resource)) + { + semsg(_(e_cant_read_postscript_resource_file_str), + resource->filename); + fclose(fd_resource); + return FALSE; + } + fclose(fd_resource); + + prt_resfile.line_end = -1; + prt_resfile.line_start = 0; + if (!prt_resfile_next_line()) + return FALSE; + + offset = 0; + + if (prt_resfile_strncmp(offset, PRT_RESOURCE_HEADER, + (int)STRLEN_LITERAL(PRT_RESOURCE_HEADER)) != 0) + { + semsg(_(e_file_str_is_not_postscript_resource_file), + resource->filename); + return FALSE; + } + + // Skip over any version numbers and following ws + offset += (int)STRLEN_LITERAL(PRT_RESOURCE_HEADER); + offset = prt_resfile_skip_nonws(offset); + if (offset == -1) + return FALSE; + offset = prt_resfile_skip_ws(offset); + if (offset == -1) + return FALSE; + + if (prt_resfile_strncmp(offset, PRT_RESOURCE_RESOURCE, + (int)STRLEN_LITERAL(PRT_RESOURCE_RESOURCE)) != 0) + { + semsg(_(e_file_str_is_not_supported_postscript_resource_file), + resource->filename); + return FALSE; + } + offset += (int)STRLEN_LITERAL(PRT_RESOURCE_RESOURCE); + + // Decide type of resource in the file + if (prt_resfile_strncmp(offset, PRT_RESOURCE_PROCSET, + (int)STRLEN_LITERAL(PRT_RESOURCE_PROCSET)) == 0) + resource->type = PRT_RESOURCE_TYPE_PROCSET; + else if (prt_resfile_strncmp(offset, PRT_RESOURCE_ENCODING, + (int)STRLEN_LITERAL(PRT_RESOURCE_ENCODING)) == 0) + resource->type = PRT_RESOURCE_TYPE_ENCODING; + else if (prt_resfile_strncmp(offset, PRT_RESOURCE_CMAP, + (int)STRLEN_LITERAL(PRT_RESOURCE_CMAP)) == 0) + resource->type = PRT_RESOURCE_TYPE_CMAP; + else + { + semsg(_(e_file_str_is_not_supported_postscript_resource_file), + resource->filename); + return FALSE; + } + + // Look for title and version of resource + resource->title[0] = '\0'; + resource->version[0] = '\0'; + seen_title = FALSE; + seen_version = FALSE; + seen_all = FALSE; + while (!seen_all && prt_next_dsc(&dsc_line)) + { + switch (dsc_line.type) + { + case PRT_DSC_TITLE_TYPE: + vim_strncpy(resource->title, dsc_line.string, dsc_line.len); + seen_title = TRUE; + if (seen_version) + seen_all = TRUE; + break; + + case PRT_DSC_VERSION_TYPE: + vim_strncpy(resource->version, dsc_line.string, dsc_line.len); + seen_version = TRUE; + if (seen_title) + seen_all = TRUE; + break; + + case PRT_DSC_ENDCOMMENTS_TYPE: + // Won't find title or resource after this comment, stop searching + seen_all = TRUE; + break; + + case PRT_DSC_MISC_TYPE: + // Not interested in whatever comment this line had + break; + } + } + + if (!seen_title || !seen_version) + { + semsg(_(e_file_str_is_not_supported_postscript_resource_file), + resource->filename); + return FALSE; + } + + return TRUE; +} + + static int +prt_check_resource(struct prt_ps_resource_S *resource, char_u *version) +{ + // Version number m.n should match, the revision number does not matter + if (STRNCMP(resource->version, version, STRLEN(version)) != 0) + { + semsg(_(e_str_resource_file_has_wrong_version), + resource->name); + return FALSE; + } + + // Other checks to be added as needed + return TRUE; +} + + static void +prt_dsc_start(void) +{ + prt_write_string("%!PS-Adobe-3.0\n"); +} + + static void +prt_dsc_noarg(char *comment) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%%s\n", comment); + prt_write_file(prt_line_buffer); +} + + static void +prt_dsc_textline(char *comment, char *text) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%%s: %s\n", comment, text); + prt_write_file(prt_line_buffer); +} + + static void +prt_dsc_text(char *comment, char *text) +{ + // TODO - should scan 'text' for any chars needing escaping! + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%%s: (%s)\n", comment, text); + prt_write_file(prt_line_buffer); +} + +# define prt_dsc_atend(c) prt_dsc_text((c), "atend") + + static void +prt_dsc_ints(char *comment, int count, int *ints) +{ + int i; + + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%%s:", comment); + prt_write_file(prt_line_buffer); + + for (i = 0; i < count; i++) + { + sprintf((char *)prt_line_buffer, " %d", ints[i]); + prt_write_file(prt_line_buffer); + } + + prt_write_string("\n"); +} + + static void +prt_dsc_resources( + char *comment, // if NULL add to previous + char *type, + char *string) +{ + if (comment != NULL) + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%%s: %s", comment, type); + else + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%+ %s", type); + prt_write_file(prt_line_buffer); + + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + " %s\n", string); + prt_write_file(prt_line_buffer); +} + + static void +prt_dsc_font_resource(char *resource, struct prt_ps_font_S *ps_font) +{ + int i; + + prt_dsc_resources(resource, "font", + ps_font->ps_fontname[PRT_PS_FONT_ROMAN]); + for (i = PRT_PS_FONT_BOLD ; i <= PRT_PS_FONT_BOLDOBLIQUE ; i++) + if (ps_font->ps_fontname[i] != NULL) + prt_dsc_resources(NULL, "font", ps_font->ps_fontname[i]); +} + + static void +prt_dsc_requirements( + int duplex, + int tumble, + int collate, + int color, + int num_copies) +{ + // Only output the comment if we need to. + // Note: tumble is ignored if we are not duplexing + if (!(duplex || collate || color || (num_copies > 1))) + return; + + sprintf((char *)prt_line_buffer, "%%%%Requirements:"); + prt_write_file(prt_line_buffer); + + if (duplex) + { + prt_write_string(" duplex"); + if (tumble) + prt_write_string("(tumble)"); + } + if (collate) + prt_write_string(" collate"); + if (color) + prt_write_string(" color"); + if (num_copies > 1) + { + prt_write_string(" numcopies("); + // Note: no space wanted so don't use prt_write_int() + sprintf((char *)prt_line_buffer, "%d", num_copies); + prt_write_file(prt_line_buffer); + prt_write_string(")"); + } + prt_write_string("\n"); +} + + static void +prt_dsc_docmedia( + char *paper_name, + double width, + double height, + double weight, + char *colour, + char *type) +{ + vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), + "%%%%DocumentMedia: %s ", paper_name); + prt_write_file(prt_line_buffer); + prt_write_real(width, 2); + prt_write_real(height, 2); + prt_write_real(weight, 2); + if (colour == NULL) + prt_write_string("()"); + else + prt_write_string(colour); + prt_write_string(" "); + if (type == NULL) + prt_write_string("()"); + else + prt_write_string(type); + prt_write_string("\n"); +} + + void +mch_print_cleanup(void) +{ + if (prt_out_mbyte) + { + int i; + + // Free off all CID font names created, but first clear duplicate + // pointers to the same string (when the same font is used for more than + // one style). + for (i = PRT_PS_FONT_ROMAN; i <= PRT_PS_FONT_BOLDOBLIQUE; i++) + { + if (prt_ps_mb_font.ps_fontname[i] != NULL) + VIM_CLEAR(prt_ps_mb_font.ps_fontname[i]); + } + } + + if (prt_do_conv) + { + convert_setup(&prt_conv, NULL, NULL); + prt_do_conv = FALSE; + } + if (prt_ps_fd != NULL) + { + fclose(prt_ps_fd); + prt_ps_fd = NULL; + prt_file_error = FALSE; + } + if (prt_ps_file_name != NULL) + VIM_CLEAR(prt_ps_file_name); +} + + static float +to_device_units(int idx, double physsize, int def_number) +{ + float ret; + int u; + int nr; + + u = prt_get_unit(idx); + if (u == PRT_UNIT_NONE) + { + u = PRT_UNIT_PERC; + nr = def_number; + } + else + nr = printer_opts[idx].number; + + switch (u) + { + case PRT_UNIT_INCH: + ret = (float)(nr * PRT_PS_DEFAULT_DPI); + break; + case PRT_UNIT_MM: + ret = (float)(nr * PRT_PS_DEFAULT_DPI) / (float)25.4; + break; + case PRT_UNIT_POINT: + ret = (float)nr; + break; + case PRT_UNIT_PERC: + default: + ret = (float)(physsize * nr) / 100; + break; + } + + return ret; +} + +/* + * Calculate margins for given width and height from printoptions settings. + */ + static void +prt_page_margins( + double width, + double height, + double *left, + double *right, + double *top, + double *bottom) +{ + *left = to_device_units(OPT_PRINT_LEFT, width, 10); + *right = width - to_device_units(OPT_PRINT_RIGHT, width, 5); + *top = height - to_device_units(OPT_PRINT_TOP, height, 5); + *bottom = to_device_units(OPT_PRINT_BOT, height, 5); +} + + static void +prt_font_metrics(int font_scale) +{ + prt_line_height = (float)font_scale; + prt_char_width = (float)PRT_PS_FONT_TO_USER(font_scale, prt_ps_font->wx); +} + + + static int +prt_get_cpl(void) +{ + if (prt_use_number()) + { + prt_number_width = PRINT_NUMBER_WIDTH * prt_char_width; + // If we are outputting multi-byte characters then line numbers will be + // printed with half width characters + if (prt_out_mbyte) + prt_number_width /= 2; + prt_left_margin += prt_number_width; + } + else + prt_number_width = 0.0; + + return (int)((prt_right_margin - prt_left_margin) / prt_char_width); +} + + static int +prt_build_cid_fontname(int font, char_u *name, int name_len) +{ + char *fontname; + + fontname = alloc(name_len + 1); + if (fontname == NULL) + return FALSE; + vim_strncpy((char_u *)fontname, name, name_len); + prt_ps_mb_font.ps_fontname[font] = fontname; + + return TRUE; +} + +/* + * Get number of lines of text that fit on a page (excluding the header). + */ + static int +prt_get_lpp(void) +{ + int lpp; + + /* + * Calculate offset to lower left corner of background rect based on actual + * font height (based on its bounding box) and the line height, handling the + * case where the font height can exceed the line height. + */ + prt_bgcol_offset = (float)PRT_PS_FONT_TO_USER(prt_line_height, + prt_ps_font->bbox_min_y); + if ((prt_ps_font->bbox_max_y - prt_ps_font->bbox_min_y) < 1000.0) + { + prt_bgcol_offset -= (float)PRT_PS_FONT_TO_USER(prt_line_height, + (1000.0 - (prt_ps_font->bbox_max_y - + prt_ps_font->bbox_min_y)) / 2); + } + + // Get height for topmost line based on background rect offset. + prt_first_line_height = prt_line_height + prt_bgcol_offset; + + // Calculate lpp + lpp = (int)((prt_top_margin - prt_bottom_margin) / prt_line_height); + + // Adjust top margin if there is a header + prt_top_margin -= prt_line_height * prt_header_height(); + + return lpp - prt_header_height(); +} + + static int +prt_match_encoding( + char *p_encoding, + struct prt_ps_mbfont_S *p_cmap, + struct prt_ps_encoding_S **pp_mbenc) +{ + int mbenc; + int enc_len; + struct prt_ps_encoding_S *p_mbenc; + + *pp_mbenc = NULL; + // Look for recognised encoding + enc_len = (int)STRLEN(p_encoding); + p_mbenc = p_cmap->encodings; + for (mbenc = 0; mbenc < p_cmap->num_encodings; mbenc++) + { + if (STRNICMP(p_mbenc->encoding, p_encoding, enc_len) == 0) + { + *pp_mbenc = p_mbenc; + return TRUE; + } + p_mbenc++; + } + return FALSE; +} + + static int +prt_match_charset( + char *p_charset, + struct prt_ps_mbfont_S *p_cmap, + struct prt_ps_charset_S **pp_mbchar) +{ + int mbchar; + int char_len; + struct prt_ps_charset_S *p_mbchar; + + // Look for recognised character set, using default if one is not given + if (*p_charset == NUL) + p_charset = p_cmap->defcs; + char_len = (int)STRLEN(p_charset); + p_mbchar = p_cmap->charsets; + for (mbchar = 0; mbchar < p_cmap->num_charsets; mbchar++) + { + if (STRNICMP(p_mbchar->charset, p_charset, char_len) == 0) + { + *pp_mbchar = p_mbchar; + return TRUE; + } + p_mbchar++; + } + return FALSE; +} + + int +mch_print_init( + prt_settings_T *psettings, + char_u *jobname, + int forceit UNUSED) +{ + int i; + char *paper_name; + int paper_strlen; + int fontsize; + char_u *p; + double left; + double right; + double top; + double bottom; + int props; + int cmap = 0; + char_u *p_encoding; + struct prt_ps_encoding_S *p_mbenc; + struct prt_ps_encoding_S *p_mbenc_first; + struct prt_ps_charset_S *p_mbchar = NULL; + +# if 0 + /* + * TODO: + * If "forceit" is false: pop up a dialog to select: + * - printer name + * - copies + * - collated/uncollated + * - duplex off/long side/short side + * - paper size + * - portrait/landscape + * - font size + * + * If "forceit" is true: use the default printer and settings + */ + if (forceit) + s_pd.Flags |= PD_RETURNDEFAULT; +# endif + + /* + * Set up font and encoding. + */ + p_encoding = enc_skip(p_penc); + if (*p_encoding == NUL) + p_encoding = enc_skip(p_enc); + + // Look for a multi-byte font that matches the encoding and character set. + // Only look if multi-byte character set is defined, or using multi-byte + // encoding other than Unicode. This is because a Unicode encoding does not + // uniquely identify a CJK character set to use. + p_mbenc = NULL; + props = enc_canon_props(p_encoding); + if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE))) + { + int cmap_first = 0; + + p_mbenc_first = NULL; + for (cmap = 0; cmap < (int)ARRAY_LENGTH(prt_ps_mbfonts); cmap++) + if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap], + &p_mbenc)) + { + if (p_mbenc_first == NULL) + { + p_mbenc_first = p_mbenc; + cmap_first = cmap; + } + if (prt_match_charset((char *)p_pmcs, &prt_ps_mbfonts[cmap], + &p_mbchar)) + break; + } + + // Use first encoding matched if no charset matched + if (p_mbchar == NULL && p_mbenc_first != NULL) + { + p_mbenc = p_mbenc_first; + cmap = cmap_first; + } + } + + prt_out_mbyte = (p_mbenc != NULL); + if (prt_out_mbyte) + { + // Build CMap name - will be same for all multi-byte fonts used + prt_cmap[0] = NUL; + + prt_custom_cmap = (p_mbchar == NULL); + if (!prt_custom_cmap) + { + // Check encoding and character set are compatible + if ((p_mbenc->needs_charset & p_mbchar->has_charset) == 0) + { + emsg(_(e_incompatible_multi_byte_encoding_and_character_set)); + return FALSE; + } + + // Add charset name if not empty + if (p_mbchar->cmap_charset != NULL) + { + vim_strncpy((char_u *)prt_cmap, + (char_u *)p_mbchar->cmap_charset, sizeof(prt_cmap) - 3); + STRCAT(prt_cmap, "-"); + } + } + else + { + // Add custom CMap character set name + if (*p_pmcs == NUL) + { + emsg(_(e_printmbcharset_cannot_be_empty_with_multi_byte_encoding)); + return FALSE; + } + vim_strncpy((char_u *)prt_cmap, p_pmcs, sizeof(prt_cmap) - 3); + STRCAT(prt_cmap, "-"); + } + + // CMap name ends with (optional) encoding name and -H for horizontal + if (p_mbenc->cmap_encoding != NULL && STRLEN(prt_cmap) + + STRLEN(p_mbenc->cmap_encoding) + 3 < sizeof(prt_cmap)) + { + STRCAT(prt_cmap, p_mbenc->cmap_encoding); + STRCAT(prt_cmap, "-"); + } + STRCAT(prt_cmap, "H"); + + if (!mbfont_opts[OPT_MBFONT_REGULAR].present) + { + emsg(_(e_no_default_font_specified_for_multi_byte_printing)); + return FALSE; + } + + // Derive CID font names with fallbacks if not defined + if (!prt_build_cid_fontname(PRT_PS_FONT_ROMAN, + mbfont_opts[OPT_MBFONT_REGULAR].string, + mbfont_opts[OPT_MBFONT_REGULAR].strlen)) + return FALSE; + if (mbfont_opts[OPT_MBFONT_BOLD].present) + if (!prt_build_cid_fontname(PRT_PS_FONT_BOLD, + mbfont_opts[OPT_MBFONT_BOLD].string, + mbfont_opts[OPT_MBFONT_BOLD].strlen)) + return FALSE; + if (mbfont_opts[OPT_MBFONT_OBLIQUE].present) + if (!prt_build_cid_fontname(PRT_PS_FONT_OBLIQUE, + mbfont_opts[OPT_MBFONT_OBLIQUE].string, + mbfont_opts[OPT_MBFONT_OBLIQUE].strlen)) + return FALSE; + if (mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].present) + if (!prt_build_cid_fontname(PRT_PS_FONT_BOLDOBLIQUE, + mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].string, + mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].strlen)) + return FALSE; + + // Check if need to use Courier for ASCII code range, and if so pick up + // the encoding to use + prt_use_courier = mbfont_opts[OPT_MBFONT_USECOURIER].present && + (TOLOWER_ASC(mbfont_opts[OPT_MBFONT_USECOURIER].string[0]) == 'y'); + if (prt_use_courier) + { + // Use national ASCII variant unless ASCII wanted + if (mbfont_opts[OPT_MBFONT_ASCII].present && + (TOLOWER_ASC(mbfont_opts[OPT_MBFONT_ASCII].string[0]) == 'y')) + prt_ascii_encoding = "ascii"; + else + prt_ascii_encoding = prt_ps_mbfonts[cmap].ascii_enc; + } + + prt_ps_font = &prt_ps_mb_font; + } + else + { + prt_use_courier = FALSE; + prt_ps_font = &prt_ps_courier_font; + } + + /* + * Find the size of the paper and set the margins. + */ + prt_portrait = (!printer_opts[OPT_PRINT_PORTRAIT].present + || TOLOWER_ASC(printer_opts[OPT_PRINT_PORTRAIT].string[0]) == 'y'); + if (printer_opts[OPT_PRINT_PAPER].present) + { + paper_name = (char *)printer_opts[OPT_PRINT_PAPER].string; + paper_strlen = printer_opts[OPT_PRINT_PAPER].strlen; + } + else + { + paper_name = "A4"; + paper_strlen = 2; + } + for (i = 0; i < (int)PRT_MEDIASIZE_LEN; ++i) + if (STRLEN(prt_mediasize[i].name) == (unsigned)paper_strlen + && STRNICMP(prt_mediasize[i].name, paper_name, + paper_strlen) == 0) + break; + if (i == PRT_MEDIASIZE_LEN) + i = 0; + prt_media = i; + + /* + * Set PS pagesize based on media dimensions and print orientation. + * Note: Media and page sizes have defined meanings in PostScript and should + * be kept distinct. Media is the paper (or transparency, or ...) that is + * printed on, whereas the page size is the area that the PostScript + * interpreter renders into. + */ + if (prt_portrait) + { + prt_page_width = prt_mediasize[i].width; + prt_page_height = prt_mediasize[i].height; + } + else + { + prt_page_width = prt_mediasize[i].height; + prt_page_height = prt_mediasize[i].width; + } + + /* + * Set PS page margins based on the PS pagesize, not the mediasize - this + * needs to be done before the cpl and lpp are calculated. + */ + prt_page_margins(prt_page_width, prt_page_height, &left, &right, &top, + &bottom); + prt_left_margin = (float)left; + prt_right_margin = (float)right; + prt_top_margin = (float)top; + prt_bottom_margin = (float)bottom; + + /* + * Set up the font size. + */ + fontsize = PRT_PS_DEFAULT_FONTSIZE; + for (p = p_pfn; (p = vim_strchr(p, ':')) != NULL; ++p) + if (p[1] == 'h' && VIM_ISDIGIT(p[2])) + fontsize = atoi((char *)p + 2); + prt_font_metrics(fontsize); + + /* + * Return the number of characters per line, and lines per page for the + * generic print code. + */ + psettings->chars_per_line = prt_get_cpl(); + psettings->lines_per_page = prt_get_lpp(); + + // Catch margin settings that leave no space for output! + if (psettings->chars_per_line <= 0 || psettings->lines_per_page <= 0) + return FAIL; + + /* + * Sort out the number of copies to be printed. PS by default will do + * uncollated copies for you, so once we know how many uncollated copies are + * wanted cache it away and lie to the generic code that we only want one + * uncollated copy. + */ + psettings->n_collated_copies = 1; + psettings->n_uncollated_copies = 1; + prt_num_copies = 1; + prt_collate = (!printer_opts[OPT_PRINT_COLLATE].present + || TOLOWER_ASC(printer_opts[OPT_PRINT_COLLATE].string[0]) == 'y'); + if (prt_collate) + { + // TODO: Get number of collated copies wanted. + psettings->n_collated_copies = 1; + } + else + { + // TODO: Get number of uncollated copies wanted and update the cached + // count. + prt_num_copies = 1; + } + + psettings->jobname = jobname; + + /* + * Set up printer duplex and tumble based on Duplex option setting - default + * is long sided duplex printing (i.e. no tumble). + */ + prt_duplex = TRUE; + prt_tumble = FALSE; + psettings->duplex = 1; + if (printer_opts[OPT_PRINT_DUPLEX].present) + { + if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "off", 3) == 0) + { + prt_duplex = FALSE; + psettings->duplex = 0; + } + else if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "short", 5) + == 0) + prt_tumble = TRUE; + } + + // For now user abort not supported + psettings->user_abort = 0; + + // If the user didn't specify a file name, use a temp file. + if (psettings->outfile == NULL) + { + prt_ps_file_name = vim_tempname('p', TRUE); + if (prt_ps_file_name == NULL) + { + emsg(_(e_cant_get_temp_file_name)); + return FAIL; + } + prt_ps_fd = mch_fopen((char *)prt_ps_file_name, WRITEBIN); + } + else + { + p = expand_env_save(psettings->outfile); + if (p != NULL) + { + prt_ps_fd = mch_fopen((char *)p, WRITEBIN); + vim_free(p); + } + } + if (prt_ps_fd == NULL) + { + emsg(_(e_cant_open_postscript_output_file)); + mch_print_cleanup(); + return FAIL; + } + + prt_bufsiz = psettings->chars_per_line; + if (prt_out_mbyte) + prt_bufsiz *= 2; + ga_init2(&prt_ps_buffer, sizeof(char), prt_bufsiz); + + prt_page_num = 0; + + prt_attribute_change = FALSE; + prt_need_moveto = FALSE; + prt_need_font = FALSE; + prt_need_fgcol = FALSE; + prt_need_bgcol = FALSE; + prt_need_underline = FALSE; + + prt_file_error = FALSE; + + return OK; +} + + static int +prt_add_resource(struct prt_ps_resource_S *resource) +{ + FILE* fd_resource; + char_u resource_buffer[512]; + size_t bytes_read; + + fd_resource = mch_fopen((char *)resource->filename, READBIN); + if (fd_resource == NULL) + { + semsg(_(e_cant_open_file_str_2), resource->filename); + return FALSE; + } + prt_dsc_resources("BeginResource", prt_resource_types[resource->type], + (char *)resource->title); + + prt_dsc_textline("BeginDocument", (char *)resource->filename); + + for (;;) + { + bytes_read = fread((char *)resource_buffer, sizeof(char_u), + sizeof(resource_buffer), fd_resource); + if (ferror(fd_resource)) + { + semsg(_(e_cant_read_postscript_resource_file_str), + resource->filename); + fclose(fd_resource); + return FALSE; + } + if (bytes_read == 0) + break; + prt_write_file_raw_len(resource_buffer, (int)bytes_read); + if (prt_file_error) + { + fclose(fd_resource); + return FALSE; + } + } + fclose(fd_resource); + + prt_dsc_noarg("EndDocument"); + + prt_dsc_noarg("EndResource"); + + return TRUE; +} + + int +mch_print_begin(prt_settings_T *psettings) +{ + int bbox[4]; + double left; + double right; + double top; + double bottom; + struct prt_ps_resource_S *res_prolog; + struct prt_ps_resource_S *res_encoding; + char buffer[256]; + char_u *p_encoding; + struct prt_ps_resource_S *res_cidfont; + struct prt_ps_resource_S *res_cmap; + int retval = FALSE; + + res_prolog = ALLOC_ONE(struct prt_ps_resource_S); + res_encoding = ALLOC_ONE(struct prt_ps_resource_S); + res_cidfont = ALLOC_ONE(struct prt_ps_resource_S); + res_cmap = ALLOC_ONE(struct prt_ps_resource_S); + if (res_prolog == NULL || res_encoding == NULL + || res_cidfont == NULL || res_cmap == NULL) + goto theend; + + /* + * PS DSC Header comments - no PS code! + */ + prt_dsc_start(); + prt_dsc_textline("Title", (char *)psettings->jobname); + if (!get_user_name((char_u *)buffer, 256)) + STRCPY(buffer, "Unknown"); + prt_dsc_textline("For", buffer); + prt_dsc_textline("Creator", VIM_VERSION_LONG); + // Note: to ensure Clean8bit I don't think we can use LC_TIME + + prt_dsc_textline("CreationDate", get_ctime(time(NULL), FALSE)); + prt_dsc_textline("DocumentData", "Clean8Bit"); + prt_dsc_textline("Orientation", prt_portrait ? "Portrait" : "Landscape"); + prt_dsc_atend("Pages"); + prt_dsc_textline("PageOrder", "Ascend"); + // The bbox does not change with orientation - it is always in the default + // user coordinate system! We have to recalculate right and bottom + // coordinates based on the font metrics for the bbox to be accurate. + prt_page_margins(prt_mediasize[prt_media].width, + prt_mediasize[prt_media].height, + &left, &right, &top, &bottom); + bbox[0] = (int)left; + if (prt_portrait) + { + // In portrait printing the fixed point is the top left corner so we + // derive the bbox from that point. We have the expected cpl chars + // across the media and lpp lines down the media. + bbox[1] = (int)(top - (psettings->lines_per_page + prt_header_height()) + * (double)prt_line_height); + bbox[2] = (int)(left + psettings->chars_per_line + * (double)prt_char_width + 0.5); + bbox[3] = (int)(top + 0.5); + } + else + { + // In landscape printing the fixed point is the bottom left corner so we + // derive the bbox from that point. We have lpp chars across the media + // and cpl lines up the media. + bbox[1] = (int)bottom; + bbox[2] = (int)(left + ((psettings->lines_per_page + + prt_header_height()) * prt_line_height) + 0.5); + bbox[3] = (int)(bottom + psettings->chars_per_line + * (double)prt_char_width + 0.5); + } + prt_dsc_ints("BoundingBox", 4, bbox); + // The media width and height does not change with landscape printing! + prt_dsc_docmedia(prt_mediasize[prt_media].name, + prt_mediasize[prt_media].width, + prt_mediasize[prt_media].height, + (double)0, NULL, NULL); + // Define fonts needed + if (!prt_out_mbyte || prt_use_courier) + prt_dsc_font_resource("DocumentNeededResources", &prt_ps_courier_font); + if (prt_out_mbyte) + { + prt_dsc_font_resource((prt_use_courier ? NULL + : "DocumentNeededResources"), &prt_ps_mb_font); + if (!prt_custom_cmap) + prt_dsc_resources(NULL, "cmap", prt_cmap); + } + + // Search for external resources VIM supplies + if (!prt_find_resource("prolog", res_prolog)) + { + semsg(_(e_cant_find_postscript_resource_file_str_ps), "prolog"); + goto theend; + } + if (!prt_open_resource(res_prolog)) + goto theend; + if (!prt_check_resource(res_prolog, PRT_PROLOG_VERSION)) + goto theend; + if (prt_out_mbyte) + { + // Look for required version of multi-byte printing procset + if (!prt_find_resource("cidfont", res_cidfont)) + { + semsg(_(e_cant_find_postscript_resource_file_str_ps), "cidfont"); + goto theend; + } + if (!prt_open_resource(res_cidfont)) + goto theend; + if (!prt_check_resource(res_cidfont, PRT_CID_PROLOG_VERSION)) + goto theend; + } + + // Find an encoding to use for printing. + // Check 'printencoding'. If not set or not found, then use 'encoding'. If + // that cannot be found then default to "latin1". + // Note: VIM specific encoding header is always skipped. + if (!prt_out_mbyte) + { + p_encoding = enc_skip(p_penc); + if (*p_encoding == NUL + || !prt_find_resource((char *)p_encoding, res_encoding)) + { + // 'printencoding' not set or not supported - find alternate + int props; + + p_encoding = enc_skip(p_enc); + props = enc_canon_props(p_encoding); + if (!(props & ENC_8BIT) + || !prt_find_resource((char *)p_encoding, res_encoding)) + // 8-bit 'encoding' is not supported + { + // Use latin1 as default printing encoding + p_encoding = (char_u *)"latin1"; + if (!prt_find_resource((char *)p_encoding, res_encoding)) + { + semsg(_(e_cant_find_postscript_resource_file_str_ps), + p_encoding); + goto theend; + } + } + } + if (!prt_open_resource(res_encoding)) + goto theend; + // For the moment there are no checks on encoding resource files to + // perform + } + else + { + p_encoding = enc_skip(p_penc); + if (*p_encoding == NUL) + p_encoding = enc_skip(p_enc); + if (prt_use_courier) + { + // Include ASCII range encoding vector + if (!prt_find_resource(prt_ascii_encoding, res_encoding)) + { + semsg(_(e_cant_find_postscript_resource_file_str_ps), + prt_ascii_encoding); + goto theend; + } + if (!prt_open_resource(res_encoding)) + goto theend; + // For the moment there are no checks on encoding resource files to + // perform + } + } + + prt_conv.vc_type = CONV_NONE; + if (!(enc_canon_props(p_enc) & enc_canon_props(p_encoding) & ENC_8BIT)) + { + // Set up encoding conversion if required + if (FAIL == convert_setup(&prt_conv, p_enc, p_encoding)) + { + semsg(_(e_unable_to_convert_to_print_encoding_str), p_encoding); + goto theend; + } + prt_do_conv = TRUE; + } + prt_do_conv = prt_conv.vc_type != CONV_NONE; + + if (prt_out_mbyte && prt_custom_cmap) + { + // Find user supplied CMap + if (!prt_find_resource(prt_cmap, res_cmap)) + { + semsg(_(e_cant_find_postscript_resource_file_str_ps), prt_cmap); + goto theend; + } + if (!prt_open_resource(res_cmap)) + goto theend; + } + + // List resources supplied + STRCPY(buffer, res_prolog->title); + STRCAT(buffer, " "); + STRCAT(buffer, res_prolog->version); + prt_dsc_resources("DocumentSuppliedResources", "procset", buffer); + if (prt_out_mbyte) + { + STRCPY(buffer, res_cidfont->title); + STRCAT(buffer, " "); + STRCAT(buffer, res_cidfont->version); + prt_dsc_resources(NULL, "procset", buffer); + + if (prt_custom_cmap) + { + STRCPY(buffer, res_cmap->title); + STRCAT(buffer, " "); + STRCAT(buffer, res_cmap->version); + prt_dsc_resources(NULL, "cmap", buffer); + } + } + if (!prt_out_mbyte || prt_use_courier) + { + STRCPY(buffer, res_encoding->title); + STRCAT(buffer, " "); + STRCAT(buffer, res_encoding->version); + prt_dsc_resources(NULL, "encoding", buffer); + } + prt_dsc_requirements(prt_duplex, prt_tumble, prt_collate, +# ifdef FEAT_SYN_HL + psettings->do_syntax +# else + 0 +# endif + , prt_num_copies); + prt_dsc_noarg("EndComments"); + + /* + * PS Document page defaults + */ + prt_dsc_noarg("BeginDefaults"); + + // List font resources most likely common to all pages + if (!prt_out_mbyte || prt_use_courier) + prt_dsc_font_resource("PageResources", &prt_ps_courier_font); + if (prt_out_mbyte) + { + prt_dsc_font_resource((prt_use_courier ? NULL : "PageResources"), + &prt_ps_mb_font); + if (!prt_custom_cmap) + prt_dsc_resources(NULL, "cmap", prt_cmap); + } + + // Paper will be used for all pages + prt_dsc_textline("PageMedia", prt_mediasize[prt_media].name); + + prt_dsc_noarg("EndDefaults"); + + /* + * PS Document prolog inclusion - all required procsets. + */ + prt_dsc_noarg("BeginProlog"); + + // Add required procsets - NOTE: order is important! + if (!prt_add_resource(res_prolog)) + goto theend; + if (prt_out_mbyte) + { + // Add CID font procset, and any user supplied CMap + if (!prt_add_resource(res_cidfont)) + goto theend; + if (prt_custom_cmap && !prt_add_resource(res_cmap)) + goto theend; + } + + if (!prt_out_mbyte || prt_use_courier) + // There will be only one Roman font encoding to be included in the PS + // file. + if (!prt_add_resource(res_encoding)) + goto theend; + + prt_dsc_noarg("EndProlog"); + + /* + * PS Document setup - must appear after the prolog + */ + prt_dsc_noarg("BeginSetup"); + + // Device setup - page size and number of uncollated copies + prt_write_int((int)prt_mediasize[prt_media].width); + prt_write_int((int)prt_mediasize[prt_media].height); + prt_write_int(0); + prt_write_string("sps\n"); + prt_write_int(prt_num_copies); + prt_write_string("nc\n"); + prt_write_boolean(prt_duplex); + prt_write_boolean(prt_tumble); + prt_write_string("dt\n"); + prt_write_boolean(prt_collate); + prt_write_string("c\n"); + + // Font resource inclusion and definition + if (!prt_out_mbyte || prt_use_courier) + { + // When using Courier for ASCII range when printing multi-byte, need to + // pick up ASCII encoding to use with it. + if (prt_use_courier) + p_encoding = (char_u *)prt_ascii_encoding; + prt_dsc_resources("IncludeResource", "font", + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_ROMAN]); + prt_def_font("F0", (char *)p_encoding, (int)prt_line_height, + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_ROMAN]); + prt_dsc_resources("IncludeResource", "font", + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLD]); + prt_def_font("F1", (char *)p_encoding, (int)prt_line_height, + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLD]); + prt_dsc_resources("IncludeResource", "font", + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); + prt_def_font("F2", (char *)p_encoding, (int)prt_line_height, + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); + prt_dsc_resources("IncludeResource", "font", + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); + prt_def_font("F3", (char *)p_encoding, (int)prt_line_height, + prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); + } + if (prt_out_mbyte) + { + // Define the CID fonts to be used in the job. Typically CJKV fonts do + // not have an italic form being a western style, so where no font is + // defined for these faces VIM falls back to an existing face. + // Note: if using Courier for the ASCII range then the printout will + // have bold/italic/bolditalic regardless of the setting of printmbfont. + prt_dsc_resources("IncludeResource", "font", + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_ROMAN]); + if (!prt_custom_cmap) + prt_dsc_resources("IncludeResource", "cmap", prt_cmap); + prt_def_cidfont("CF0", (int)prt_line_height, + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_ROMAN]); + + if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD] != NULL) + { + prt_dsc_resources("IncludeResource", "font", + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD]); + if (!prt_custom_cmap) + prt_dsc_resources("IncludeResource", "cmap", prt_cmap); + prt_def_cidfont("CF1", (int)prt_line_height, + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD]); + } + else + // Use ROMAN for BOLD + prt_dup_cidfont("CF0", "CF1"); + + if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE] != NULL) + { + prt_dsc_resources("IncludeResource", "font", + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); + if (!prt_custom_cmap) + prt_dsc_resources("IncludeResource", "cmap", prt_cmap); + prt_def_cidfont("CF2", (int)prt_line_height, + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); + } + else + // Use ROMAN for OBLIQUE + prt_dup_cidfont("CF0", "CF2"); + + if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE] != NULL) + { + prt_dsc_resources("IncludeResource", "font", + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); + if (!prt_custom_cmap) + prt_dsc_resources("IncludeResource", "cmap", prt_cmap); + prt_def_cidfont("CF3", (int)prt_line_height, + prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); + } + else + // Use BOLD for BOLDOBLIQUE + prt_dup_cidfont("CF1", "CF3"); + } + + // Misc constant vars used for underlining and background rects + prt_def_var("UO", PRT_PS_FONT_TO_USER(prt_line_height, + prt_ps_font->uline_offset), 2); + prt_def_var("UW", PRT_PS_FONT_TO_USER(prt_line_height, + prt_ps_font->uline_width), 2); + prt_def_var("BO", prt_bgcol_offset, 2); + + prt_dsc_noarg("EndSetup"); + + // Fail if any problems writing out to the PS file + retval = !prt_file_error; + +theend: + vim_free(res_prolog); + vim_free(res_encoding); + vim_free(res_cidfont); + vim_free(res_cmap); + + return retval; +} + + void +mch_print_end(prt_settings_T *psettings) +{ + prt_dsc_noarg("Trailer"); + + /* + * Output any info we don't know in toto until we finish + */ + prt_dsc_ints("Pages", 1, &prt_page_num); + + prt_dsc_noarg("EOF"); + + // Write CTRL-D to close serial communication link if used. + // NOTHING MUST BE WRITTEN AFTER THIS! + prt_write_file((char_u *)"\004"); + + if (!prt_file_error && psettings->outfile == NULL + && !got_int && !psettings->user_abort) + { + // Close the file first. + if (prt_ps_fd != NULL) + { + fclose(prt_ps_fd); + prt_ps_fd = NULL; + } + prt_message((char_u *)_("Sending to printer...")); + + // Not printing to a file: use 'printexpr' to print the file. + if (eval_printexpr(prt_ps_file_name, psettings->arguments) == FAIL) + emsg(_(e_failed_to_print_postscript_file)); + else + prt_message((char_u *)_("Print job sent.")); + } + + mch_print_cleanup(); +} + + int +mch_print_end_page(void) +{ + prt_flush_buffer(); + + prt_write_string("re sp\n"); + + prt_dsc_noarg("PageTrailer"); + + return !prt_file_error; +} + + int +mch_print_begin_page(char_u *str UNUSED) +{ + int page_num[2]; + + prt_page_num++; + + page_num[0] = page_num[1] = prt_page_num; + prt_dsc_ints("Page", 2, page_num); + + prt_dsc_noarg("BeginPageSetup"); + + prt_write_string("sv\n0 g\n"); + prt_in_ascii = !prt_out_mbyte; + if (prt_out_mbyte) + prt_write_string("CF0 sf\n"); + else + prt_write_string("F0 sf\n"); + prt_fgcol = PRCOLOR_BLACK; + prt_bgcol = PRCOLOR_WHITE; + prt_font = PRT_PS_FONT_ROMAN; + + // Set up page transformation for landscape printing. + if (!prt_portrait) + { + prt_write_int(-((int)prt_mediasize[prt_media].width)); + prt_write_string("sl\n"); + } + + prt_dsc_noarg("EndPageSetup"); + + // We have reset the font attributes, force setting them again. + prt_curr_bg = (long_u)0xffffffff; + prt_curr_fg = (long_u)0xffffffff; + prt_curr_bold = MAYBE; + + return !prt_file_error; +} + + int +mch_print_blank_page(void) +{ + return (mch_print_begin_page(NULL) ? (mch_print_end_page()) : FALSE); +} + +static float prt_pos_x = 0; +static float prt_pos_y = 0; + + void +mch_print_start_line(int margin, int page_line) +{ + prt_pos_x = prt_left_margin; + if (margin) + prt_pos_x -= prt_number_width; + + prt_pos_y = prt_top_margin - prt_first_line_height - + page_line * prt_line_height; + + prt_attribute_change = TRUE; + prt_need_moveto = TRUE; + prt_half_width = FALSE; +} + + int +mch_print_text_out(char_u *textp, int len UNUSED) +{ + char_u *p = textp; + int need_break; + char_u ch; + char_u ch_buff[8]; + float char_width; + float next_pos; + int in_ascii; + int half_width; + char_u *tofree = NULL; + + char_width = prt_char_width; + + // Ideally VIM would create a rearranged CID font to combine a Roman and + // CJKV font to do what VIM is doing here - use a Roman font for characters + // in the ASCII range, and the original CID font for everything else. + // The problem is that GhostScript still (as of 8.13) does not support + // rearranged fonts even though they have been documented by Adobe for 7 + // years! If they ever do, a lot of this code will disappear. + if (prt_use_courier) + { + in_ascii = (len == 1 && *p < 0x80); + if (prt_in_ascii) + { + if (!in_ascii) + { + // No longer in ASCII range - need to switch font + prt_in_ascii = FALSE; + prt_need_font = TRUE; + prt_attribute_change = TRUE; + } + } + else if (in_ascii) + { + // Now in ASCII range - need to switch font + prt_in_ascii = TRUE; + prt_need_font = TRUE; + prt_attribute_change = TRUE; + } + } + if (prt_out_mbyte) + { + half_width = ((*mb_ptr2cells)(p) == 1); + if (half_width) + char_width /= 2; + if (prt_half_width) + { + if (!half_width) + { + prt_half_width = FALSE; + prt_pos_x += prt_char_width/4; + prt_need_moveto = TRUE; + prt_attribute_change = TRUE; + } + } + else if (half_width) + { + prt_half_width = TRUE; + prt_pos_x += prt_char_width/4; + prt_need_moveto = TRUE; + prt_attribute_change = TRUE; + } + } + + // Output any required changes to the graphics state, after flushing any + // text buffered so far. + if (prt_attribute_change) + { + prt_flush_buffer(); + // Reset count of number of chars that will be printed + prt_text_run = 0; + + if (prt_need_moveto) + { + prt_pos_x_moveto = prt_pos_x; + prt_pos_y_moveto = prt_pos_y; + prt_do_moveto = TRUE; + + prt_need_moveto = FALSE; + } + if (prt_need_font) + { + if (!prt_in_ascii) + prt_write_string("CF"); + else + prt_write_string("F"); + prt_write_int(prt_font); + prt_write_string("sf\n"); + prt_need_font = FALSE; + } + if (prt_need_fgcol) + { + int r, g, b; + r = ((unsigned)prt_fgcol & 0xff0000) >> 16; + g = ((unsigned)prt_fgcol & 0xff00) >> 8; + b = prt_fgcol & 0xff; + + prt_write_real(r / 255.0, 3); + if (r == g && g == b) + prt_write_string("g\n"); + else + { + prt_write_real(g / 255.0, 3); + prt_write_real(b / 255.0, 3); + prt_write_string("r\n"); + } + prt_need_fgcol = FALSE; + } + + if (prt_bgcol != PRCOLOR_WHITE) + { + prt_new_bgcol = prt_bgcol; + if (prt_need_bgcol) + prt_do_bgcol = TRUE; + } + else + prt_do_bgcol = FALSE; + prt_need_bgcol = FALSE; + + if (prt_need_underline) + prt_do_underline = prt_underline; + prt_need_underline = FALSE; + + prt_attribute_change = FALSE; + } + + if (prt_do_conv) + { + // Convert from multi-byte to 8-bit encoding + tofree = p = string_convert(&prt_conv, p, &len); + if (p == NULL) + { + p = (char_u *)""; + len = 0; + } + } + + if (prt_out_mbyte) + { + // Multi-byte character strings are represented more efficiently as hex + // strings when outputting clean 8 bit PS. + while (len-- > 0) + { + ch = prt_hexchar[(unsigned)(*p) >> 4]; + ga_append(&prt_ps_buffer, ch); + ch = prt_hexchar[(*p) & 0xf]; + ga_append(&prt_ps_buffer, ch); + p++; + } + } + else + { + // Add next character to buffer of characters to output. + // Note: One printed character may require several PS characters to + // represent it, but we only count them as one printed character. + ch = *p; + if (ch < 32 || ch == '(' || ch == ')' || ch == '\\') + { + // Convert non-printing characters to either their escape or octal + // sequence, ensures PS sent over a serial line does not interfere + // with the comms protocol. + ga_append(&prt_ps_buffer, '\\'); + switch (ch) + { + case BS: ga_append(&prt_ps_buffer, 'b'); break; + case TAB: ga_append(&prt_ps_buffer, 't'); break; + case NL: ga_append(&prt_ps_buffer, 'n'); break; + case FF: ga_append(&prt_ps_buffer, 'f'); break; + case CAR: ga_append(&prt_ps_buffer, 'r'); break; + case '(': ga_append(&prt_ps_buffer, '('); break; + case ')': ga_append(&prt_ps_buffer, ')'); break; + case '\\': ga_append(&prt_ps_buffer, '\\'); break; + + default: + sprintf((char *)ch_buff, "%03o", (unsigned int)ch); + ga_append(&prt_ps_buffer, ch_buff[0]); + ga_append(&prt_ps_buffer, ch_buff[1]); + ga_append(&prt_ps_buffer, ch_buff[2]); + break; + } + } + else + ga_append(&prt_ps_buffer, ch); + } + + // Need to free any translated characters + vim_free(tofree); + + prt_text_run += char_width; + prt_pos_x += char_width; + + // The downside of fp - use relative error on right margin check + next_pos = prt_pos_x + prt_char_width; + need_break = (next_pos > prt_right_margin) && + ((next_pos - prt_right_margin) > (prt_right_margin*1e-5)); + + if (need_break) + prt_flush_buffer(); + + return need_break; +} + + void +mch_print_set_font(int iBold, int iItalic, int iUnderline) +{ + int font = 0; + + if (iBold) + font |= 0x01; + if (iItalic) + font |= 0x02; + + if (font != prt_font) + { + prt_font = font; + prt_attribute_change = TRUE; + prt_need_font = TRUE; + } + if (prt_underline != iUnderline) + { + prt_underline = iUnderline; + prt_attribute_change = TRUE; + prt_need_underline = TRUE; + } +} + + void +mch_print_set_bg(long_u bgcol) +{ + prt_bgcol = (int)bgcol; + prt_attribute_change = TRUE; + prt_need_bgcol = TRUE; +} + + void +mch_print_set_fg(long_u fgcol) +{ + if (fgcol == (long_u)prt_fgcol) + return; + + prt_fgcol = (int)fgcol; + prt_attribute_change = TRUE; + prt_need_fgcol = TRUE; +} + +#endif // FEAT_POSTSCRIPT diff --git a/src/hardcopy_postscript.h b/src/hardcopy_postscript.h new file mode 100644 index 0000000000..fe41df8f87 --- /dev/null +++ b/src/hardcopy_postscript.h @@ -0,0 +1,42 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#ifndef HARDCOPY_POSTSCRIPT_H +#define HARDCOPY_POSTSCRIPT_H + +#include "vim.h" + +#if defined(FEAT_POSTSCRIPT) + +# define OPT_MBFONT_USECOURIER 0 +# define OPT_MBFONT_ASCII 1 +# define OPT_MBFONT_REGULAR 2 +# define OPT_MBFONT_BOLD 3 +# define OPT_MBFONT_OBLIQUE 4 +# define OPT_MBFONT_BOLDOBLIQUE 5 +# define OPT_MBFONT_NUM_OPTIONS 6 + +extern option_table_T mbfont_opts[OPT_MBFONT_NUM_OPTIONS]; + +void mch_print_cleanup(void); +int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); +int mch_print_begin(prt_settings_T *psettings); +void mch_print_end(prt_settings_T *psettings); +int mch_print_end_page(void); +int mch_print_begin_page(char_u *str); +int mch_print_blank_page(void); +void mch_print_start_line(int margin, int page_line); +int mch_print_text_out(char_u *textp, int len); +void mch_print_set_font(int iBold, int iItalic, int iUnderline); +void mch_print_set_bg(long_u bgcol); +void mch_print_set_fg(long_u fgcol); + +#endif + +#endif diff --git a/src/option.c b/src/option.c index aa4c990dcb..353082cdab 100644 --- a/src/option.c +++ b/src/option.c @@ -323,7 +323,7 @@ set_init_default_printencoding(void) #endif } -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) /* * Initialize the 'printexpr' option to a default value. */ @@ -724,7 +724,7 @@ set_init_1(int clean_arg) set_init_default_maxmemtot(); set_init_default_cdpath(); set_init_default_printencoding(); -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) set_init_default_printexpr(); #endif diff --git a/src/option.h b/src/option.h index c3df71fcaf..326b48b630 100644 --- a/src/option.h +++ b/src/option.h @@ -666,10 +666,12 @@ EXTERN char_u *p_pvp; // 'previewpopup' EXTERN char_u *p_pdev; // 'printdevice' # ifdef FEAT_POSTSCRIPT EXTERN char_u *p_penc; // 'printencoding' -EXTERN char_u *p_pexpr; // 'printexpr' EXTERN char_u *p_pmfn; // 'printmbfont' EXTERN char_u *p_pmcs; // 'printmbcharset' # endif +# if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) +EXTERN char_u *p_pexpr; // 'printexpr' +# endif EXTERN char_u *p_pfn; // 'printfont' EXTERN char_u *p_popt; // 'printoptions' EXTERN char_u *p_header; // 'printheader' diff --git a/src/optiondefs.h b/src/optiondefs.h index f238209a75..187747368a 100644 --- a/src/optiondefs.h +++ b/src/optiondefs.h @@ -2022,7 +2022,7 @@ static struct vimoption options[] = #endif SCTX_INIT}, {"printexpr", "pexpr", P_STRING|P_VI_DEF|P_SECURE, -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) (char_u *)&p_pexpr, PV_NONE, did_set_optexpr, NULL, {(char_u *)"", (char_u *)0L} #else @@ -2036,6 +2036,8 @@ static struct vimoption options[] = { # ifdef MSWIN (char_u *)"Courier_New:h10", +# elif defined(FEAT_PRINT_PANGO) + (char_u *)"Courier New 10", # else (char_u *)"courier", # endif diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index 3c5f7a9250..d4a9b52832 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -109,5 +109,6 @@ int gui_mch_dialog(int type, char_u *title, char_u *message, char_u *buttons, in void gui_mch_find_dialog(exarg_T *eap); void gui_mch_replace_dialog(exarg_T *eap); void ex_helpfind(exarg_T *eap); -void gui_gtk4_hardcopy(exarg_T *eap); +char_u *gui_gtk4_print_dialog(prt_settings_T *psettings, char_u *jobname, double *page_width, double *page_height); +void gui_gtk4_print_finish(void); /* vim: set ft=c : */ diff --git a/src/proto/hardcopy.pro b/src/proto/hardcopy.pro index 8a8c73e56f..369aab398c 100644 --- a/src/proto/hardcopy.pro +++ b/src/proto/hardcopy.pro @@ -4,17 +4,6 @@ char *parse_printmbfont(optset_T *args); int prt_header_height(void); int prt_use_number(void); int prt_get_unit(int idx); +void prt_message(char_u *s); void ex_hardcopy(exarg_T *eap); -void mch_print_cleanup(void); -int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); -int mch_print_begin(prt_settings_T *psettings); -void mch_print_end(prt_settings_T *psettings); -int mch_print_end_page(void); -int mch_print_begin_page(char_u *str); -int mch_print_blank_page(void); -void mch_print_start_line(int margin, int page_line); -int mch_print_text_out(char_u *textp, int len); -void mch_print_set_font(int iBold, int iItalic, int iUnderline); -void mch_print_set_bg(long_u bgcol); -void mch_print_set_fg(long_u fgcol); /* vim: set ft=c : */ diff --git a/src/structs.h b/src/structs.h index 38037c9d5e..b1ec3fa788 100644 --- a/src/structs.h +++ b/src/structs.h @@ -4831,8 +4831,11 @@ typedef struct int do_syntax; #endif int user_abort; +#ifdef FEAT_PRINT_PANGO + int user_abort_msg; +#endif char_u *jobname; -#ifdef FEAT_POSTSCRIPT +#if defined(FEAT_POSTSCRIPT) || defined(FEAT_PRINT_PANGO) char_u *outfile; char_u *arguments; #endif diff --git a/src/testdir/test_hardcopy.vim b/src/testdir/test_hardcopy.vim index 33ef4bff1b..62065139c7 100644 --- a/src/testdir/test_hardcopy.vim +++ b/src/testdir/test_hardcopy.vim @@ -1,5 +1,13 @@ " Test :hardcopy +func s:HasPostscript() + if has('postscript') || has('pango') + return + endif + throw 'Skipped: hardcopy backend does not use postscript' +endfunc +command -nargs=0 HasPostscript call s:HasPostscript() + func Test_printoptions() edit test_hardcopy.vim syn on @@ -97,7 +105,7 @@ func Test_printmbcharset() endfunc func Test_printexpr() - CheckFeature postscript + HasPostscript " Not a very useful printexpr value, but enough to test " hardcopy with 'printexpr'. @@ -136,7 +144,7 @@ func Test_printexpr() endfunc func Test_errors() - CheckFeature postscript + HasPostscript edit test_hardcopy.vim call assert_fails('hardcopy >', 'E324:') @@ -150,7 +158,7 @@ func Test_dark_background() for bg in ['dark', 'light'] exe 'set background=' .. bg - if has('postscript') + if has('postscript') || has('pango') hardcopy > Xhardcopy_dark_background let lines = readfile('Xhardcopy_dark_background') call assert_true(len(lines) > 20) @@ -164,7 +172,7 @@ func Test_dark_background() endfun func Test_empty_buffer() - CheckFeature postscript + HasPostscript new call assert_equal("\nNo text to be printed", execute('hardcopy')) @@ -182,7 +190,7 @@ func Test_printheader_parsing() endfunc func Test_fname_with_spaces() - CheckFeature postscript + HasPostscript split t\ e\ s\ t.txt call setline(1, ['just', 'some', 'text']) @@ -208,27 +216,34 @@ func Test_illegal_byte() endfunc func Test_printoptions_portrait() - CheckFeature postscript + HasPostscript edit test_hardcopy.vim syn on set printoptions=portrait:y 1,50hardcopy > Xhardcopy_printoptions_portrait let lines = readfile('Xhardcopy_printoptions_portrait') - call assert_match('Orientation: Portrait', lines[6]) - call assert_match('BoundingBox: 59 49 564 800', lines[9]) - call assert_match('DocumentMedia: A4', lines[10]) - call assert_match('PageMedia: A4', lines[24]) - call delete('Xhardcopy_printoptions') + + call assert_true(match(lines, 'Orientation: Portrait') != -1) + if has('postscript') + call assert_true(match(lines, 'BoundingBox: 59 49 564 800') != -1) + endif + call assert_true(match(lines, 'DocumentMedia: A4') != -1) + call assert_true(match(lines, 'PageMedia: A4') != -1) + call delete('Xhardcopy_printoptions_portrait') set printoptions=portrait:n 1,50hardcopy > Xhardcopy_printoptions_portrait let lines = readfile('Xhardcopy_printoptions_portrait') - call assert_match('Orientation: Landscape', lines[6]) - call assert_match('BoundingBox: 59 42 590 756', lines[9]) - call assert_match('DocumentMedia: A4', lines[10]) - call assert_match('PageMedia: A4', lines[24]) - call delete('Xhardcopy_printoptions') + call delete('Xhardcopy_printoptions_portrait') + + call assert_true(match(lines, 'Orientation: Landscape') != -1) + if has('postscript') + call assert_true(match(lines, 'BoundingBox: 59 42 590 756') != -1) + endif + call assert_true(match(lines, 'DocumentMedia: A4') != -1) + call assert_true(match(lines, 'PageMedia: A4') != -1) + call delete('Xhardcopy_printoptions_portrait') set printoptions& bwipe diff --git a/src/version.c b/src/version.c index 7c831d2ae2..fedd56dba8 100644 --- a/src/version.c +++ b/src/version.c @@ -461,6 +461,11 @@ static char *(features[]) = "+packages", #else "-packages", +#endif +#ifdef FEAT_PRINT_PANGO + "+pango", +#else + "-pango", #endif "+path_extra", #ifdef FEAT_PERL @@ -758,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 898, /**/ 897, /**/ diff --git a/src/vim.h b/src/vim.h index 0caf437408..ce402f6662 100644 --- a/src/vim.h +++ b/src/vim.h @@ -2780,6 +2780,12 @@ typedef int (*opt_expand_cb_T)(optexpand_T *args, int *numMatches, char_u ***mat # endif #endif +#if defined(FEAT_PRINT_PANGO) && defined(FEAT_GUI_GTK) && defined(USE_GTK4) +# if GTK_CHECK_VERSION(4, 14, 0) +# define USE_GTK4_PRINT_DIALOG +# endif +#endif + #ifndef FEAT_NETBEANS_INTG # undef NBDEBUG #endif From 0db0c3c142b9994b64c63162914ba4db528f88a2 Mon Sep 17 00:00:00 2001 From: Sam Roeca Date: Sun, 2 Aug 2026 18:41:16 +0000 Subject: [PATCH 274/647] patch 9.2.0899: command output temporary files may collide Problem: On MS-Windows, get_cmd_output() removes its reserved temporary file before the shell opens it, allowing another Vim process to reuse the same name. Solution: Keep the temporary file reserved until command output handling is complete (Sam Roeca). closes: #20915 Signed-off-by: Sam Roeca Signed-off-by: Christian Brabandt --- src/misc1.c | 8 ++++---- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/misc1.c b/src/misc1.c index 6ba215500d..5927768a25 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -2430,8 +2430,9 @@ get_cmd_output( if (check_restricted() || check_secure()) return NULL; - // get a name for the temp file - if ((tempname = vim_tempname('o', FALSE)) == NULL) + // Keep the file reserved until the shell opens it. On MS-Windows, + // deleting it here would let another Vim process reuse the same name. + if ((tempname = vim_tempname('o', TRUE)) == NULL) { emsg(_(e_cant_get_temp_file_name)); return NULL; @@ -2478,7 +2479,6 @@ get_cmd_output( if (buffer != NULL) i = (int)fread((char *)buffer, (size_t)1, (size_t)len, fd); fclose(fd); - mch_remove(tempname); if (buffer == NULL) goto done; # ifdef VMS @@ -2502,6 +2502,7 @@ get_cmd_output( *ret_len = len; done: + mch_remove(tempname); vim_free(tempname); return buffer; } @@ -2955,4 +2956,3 @@ trim_to_int(vimlong_T x) { return x > INT_MAX ? INT_MAX : x < INT_MIN ? INT_MIN : x; } - diff --git a/src/version.c b/src/version.c index fedd56dba8..41209b1257 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 899, /**/ 898, /**/ From d474289d0f12505b16b59a61ad161c57c3e596cb Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Sun, 2 Aug 2026 19:00:41 +0000 Subject: [PATCH 275/647] patch 9.2.0900: FocusGained still triggered when closing dialog Problem: FocusGained still triggered when closing dialog (after v9.2.0851) Solution: Track that dialog is active and suppress the FocusGained autocommand (Christoffer Aasted) related: #20780 closes: #20894 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui.h | 3 +-- src/gui_gtk.c | 5 ++--- src/gui_gtk_x11.c | 12 +++++++++++- src/version.c | 2 ++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gui.h b/src/gui.h index e2232982e9..653937cfe6 100644 --- a/src/gui.h +++ b/src/gui.h @@ -422,8 +422,7 @@ typedef struct Gui # ifdef FEAT_GUI_DIALOG // Multiple dialogs not allowed, just tracked for future use. int dialogs_active; // number of active GUI dialogs - - // X11 focus_in_event() by dialogs, ignored to match wayland. + // Suppress focus-in event when focus returns. int dialog_focus_pending; # endif bool is_x11; // active gdk backend in gtk is x11 diff --git a/src/gui_gtk.c b/src/gui_gtk.c index eef771e840..89159d237f 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -1710,8 +1710,6 @@ gui_mch_dialog(int type, // type of dialog DialogInfo dialoginfo; ++gui.dialogs_active; - if (gui.is_x11) - ++gui.dialog_focus_pending; dialog = create_message_dialog(type, title, message); dialoginfo.dialog = GTK_DIALOG(dialog); @@ -1798,7 +1796,8 @@ gui_mch_dialog(int type, // type of dialog gtk_widget_destroy(dialog); } - --gui.dialogs_active; + if (gui.dialogs_active > 0) + --gui.dialogs_active; return response > 0 ? response : 0; } diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index f2db6d1da8..6b56a1ee5c 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -1071,8 +1071,13 @@ focus_in_event(GtkWidget *widget, gpointer data UNUSED) { #ifdef FEAT_GUI_DIALOG - if (gui.is_x11 && gui.dialog_focus_pending > 0) + if (gui.dialog_focus_pending > 0) + { --gui.dialog_focus_pending; + ++hold_gui_events; + gui_focus_change(TRUE); + --hold_gui_events; + } else #endif gui_focus_change(TRUE); @@ -1093,6 +1098,11 @@ focus_out_event(GtkWidget *widget UNUSED, GdkEventFocus *event UNUSED, gpointer data UNUSED) { +#ifdef FEAT_GUI_DIALOG + if (gui.dialogs_active > 0) + ++gui.dialog_focus_pending; +#endif + gui_focus_change(FALSE); if (blink_state != BLINK_NONE) diff --git a/src/version.c b/src/version.c index 41209b1257..ac814a01ee 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 900, /**/ 899, /**/ From 1050666c96c68abe3ef738359312e85c76607901 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 2 Aug 2026 19:25:12 +0000 Subject: [PATCH 276/647] patch 9.2.0901: textprop: wrong cursor line with truncated virtual text Problem: The cursor is displayed in the wrong line when virtual text below an empty line is truncated. Solution: Do not count an extra column for an empty line that has virtual text below it, its width already includes filling up the line. (Hirohito Higashi). fixes: #12493 closes: #20917 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 1 - src/charset.c | 12 +++++++++--- src/structs.h | 2 ++ src/testdir/test_textprop.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index a277a260f6..a8f9dff8e4 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -48,7 +48,6 @@ without all the help files. Virtual text problems: - Virtual text aligned "above": Wrong indentation when using tabs (Issue #12232) -- truncated Virtual text below an empty line causes display error #12493 Errors when running tests with valgrind: - test_gui.vim: diff --git a/src/charset.c b/src/charset.c index c47180e2ce..1c45688fe3 100644 --- a/src/charset.c +++ b/src/charset.c @@ -921,9 +921,10 @@ win_linetabsize_cts(chartabsize_T *cts, colnr_T len) int head = 0; (void)win_lbr_chartabsize(cts, &head, NULL); vcol += cts->cts_cur_text_width + head; - // when properties are above or below the empty line must also be - // counted - if (cts->cts_ptr == cts->cts_line && cts->cts_prop_lines > 0) + // When properties are above the empty line must also be counted. For + // a property below the width already includes filling up the line. + if (cts->cts_ptr == cts->cts_line && cts->cts_prop_lines > 0 + && !cts->cts_has_below) ++vcol; cts->cts_vcol = vcol > MAXCOL ? MAXCOL : (int)vcol; } @@ -1260,6 +1261,7 @@ win_lbr_chartabsize( #if defined(FEAT_PROP_POPUP) cts->cts_cur_text_width = 0; + cts->cts_has_below = false; cts->cts_first_char = 0; #endif @@ -1381,8 +1383,12 @@ win_lbr_chartabsize( # endif if (tp->tp_col == MAXCOL && (tp->tp_flags & (TP_FLAG_ALIGN_ABOVE | TP_FLAG_ALIGN_BELOW))) + { // count extra line for property above/below ++cts->cts_prop_lines; + if (tp->tp_flags & TP_FLAG_ALIGN_BELOW) + cts->cts_has_below = true; + } } } if (tp->tp_col != MAXCOL && tp->tp_col - 1 > col) diff --git a/src/structs.h b/src/structs.h index b1ec3fa788..fdba4ee835 100644 --- a/src/structs.h +++ b/src/structs.h @@ -5361,6 +5361,8 @@ typedef struct { char cts_has_prop_with_text; // TRUE if a property inserts text int cts_cur_text_width; // width of current inserted text int cts_prop_lines; // nr of properties above or below + bool cts_has_below; // true if a text property below was + // counted, its width fills up the line int cts_first_char; // width text props above the line int cts_above_width; // width of text props above the line, // kept for the whole line diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim index a89ed55154..86437354bb 100644 --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -3229,6 +3229,27 @@ func Test_prop_with_text_above_below_empty() call StopVimInTerminal(buf) endfunc +func Test_prop_with_text_below_empty_truncated() + " Use a fixed size, the virtual text must be wider than the text area. + call NewWindow(12, 40) + setlocal number + call setline(1, ['11111', '', '33333', '', '55555']) + + call prop_type_add('belowprop', #{highlight: 'Directory'}) + for ln in range(1, 5) + call prop_add(ln, 0, #{type: 'belowprop', + \ text: repeat('+', winwidth(0)), text_align: 'below'}) + endfor + normal! G + redraw + + " Every line takes two screen lines: the line and the virtual text below it. + call assert_equal(9, winline()) + + call prop_type_delete('belowprop') + bwipe! +endfunc + func Test_prop_multiple_lines_above() CheckScreendump CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index ac814a01ee..dcea5c2ab2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 901, /**/ 900, /**/ From c0da86685a416c08c90155acbd8aa7cf67103a70 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 3 Aug 2026 18:21:30 +0000 Subject: [PATCH 277/647] runtime: Add TOML entry to the syntax menu fixes: #20927 closes: #20930 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/makemenu.vim | 3 ++- runtime/synmenu.vim | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 79d188a92e..8be8cc9fcf 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -2,7 +2,7 @@ vim9script # Script to define the syntax menu in synmenu.vim # Maintainer: The Vim Project -# Last Change: 2026 Jul 30 +# Last Change: 2026 Aug 03 # Former Maintainer: Bram Moolenaar # This is used by "make menu" in the src directory. @@ -620,6 +620,7 @@ SynMenu T.TF\ mud\ client:tf SynMenu T.Tidy\ configuration:tidy SynMenu T.Tilde:tilde SynMenu T.Tmux\ configuration:tmux +SynMenu T.TOML:toml SynMenu T.TPP:tpp SynMenu T.Trasys\ input:trasys SynMenu T.Treetop:treetop diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index 17241ff281..86272c1fd7 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -2,7 +2,7 @@ " This file is normally sourced from menu.vim. " " Maintainer: The Vim Project -" Last Change: 2025 Mar 09 +" Last Change: 2025 Aug 03 " Former Maintainer: Bram Moolenaar " Define the SetSyn function, used for the Syntax menu entries. @@ -593,15 +593,16 @@ an 50.150.310 &Syntax.T.TF\ mud\ client :cal SetSyn("tf") an 50.150.320 &Syntax.T.Tidy\ configuration :cal SetSyn("tidy") an 50.150.330 &Syntax.T.Tilde :cal SetSyn("tilde") an 50.150.340 &Syntax.T.Tmux\ configuration :cal SetSyn("tmux") -an 50.150.350 &Syntax.T.TPP :cal SetSyn("tpp") -an 50.150.360 &Syntax.T.Trasys\ input :cal SetSyn("trasys") -an 50.150.370 &Syntax.T.Treetop :cal SetSyn("treetop") -an 50.150.380 &Syntax.T.Trustees :cal SetSyn("trustees") -an 50.150.390 &Syntax.T.TSS.Command\ Line :cal SetSyn("tsscl") -an 50.150.400 &Syntax.T.TSS.Geometry :cal SetSyn("tssgm") -an 50.150.410 &Syntax.T.TSS.Optics :cal SetSyn("tssop") -an 50.150.420 &Syntax.T.Typescript :cal SetSyn("typescript") -an 50.150.430 &Syntax.T.TypescriptReact :cal SetSyn("typescriptreact") +an 50.150.350 &Syntax.T.TOML :cal SetSyn("toml") +an 50.150.360 &Syntax.T.TPP :cal SetSyn("tpp") +an 50.150.370 &Syntax.T.Trasys\ input :cal SetSyn("trasys") +an 50.150.380 &Syntax.T.Treetop :cal SetSyn("treetop") +an 50.150.390 &Syntax.T.Trustees :cal SetSyn("trustees") +an 50.150.400 &Syntax.T.TSS.Command\ Line :cal SetSyn("tsscl") +an 50.150.410 &Syntax.T.TSS.Geometry :cal SetSyn("tssgm") +an 50.150.420 &Syntax.T.TSS.Optics :cal SetSyn("tssop") +an 50.150.430 &Syntax.T.Typescript :cal SetSyn("typescript") +an 50.150.440 &Syntax.T.TypescriptReact :cal SetSyn("typescriptreact") an 50.160.100 &Syntax.UV.Udev\ config :cal SetSyn("udevconf") an 50.160.110 &Syntax.UV.Udev\ permissions :cal SetSyn("udevperm") an 50.160.120 &Syntax.UV.Udev\ rules :cal SetSyn("udevrules") From bc71c0b3f3638dbd201e084982caba7bad60ffab Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 3 Aug 2026 19:50:33 +0000 Subject: [PATCH 278/647] runtime(doc): remove todo entries that are fixed The 'smoothscroll' scroll position is kept when a window is squeezed since patch 9.2.0885, and the Tab size in a line with virtual text above it is correct since patch 9.2.0896. closes: #20921 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/todo.txt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index a8f9dff8e4..ea57dfaabb 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Aug 02 +*todo.txt* For Vim version 9.2. Last change: 2026 Aug 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -36,19 +36,10 @@ browser use: https://github.com/vim/vim/issues/1234 *known-bugs* -------------------- Known bugs and current work ----------------------- -With 'smoothscroll' the scroll position is lost when a window is temporarily -squeezed to a couple of lines, for example ":help" followed by ":close". In -restore_snapshot_rec() restore more values from the snapshot, instead of -calling frame_new_height() and frame_new_width(), especially w_skipcol. - When a help item can't be found, then open 'helpfile'. Search for the tag in that file and gtive E149 only when not found. Helps for a tiny Vim installed without all the help files. -Virtual text problems: -- Virtual text aligned "above": Wrong indentation when using tabs (Issue - #12232) - Errors when running tests with valgrind: - test_gui.vim: Found errors in Test_gui_mouse_event(): From 6d2f94baa38751fe1d42c2654c049b740a96b335 Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Mon, 3 Aug 2026 19:54:50 +0000 Subject: [PATCH 279/647] patch 9.2.0902: Vim9: iterating over a tuple leaks memory Problem: Looping over a tuple with ":for" copies each item with copy_tv() but never clears the copy, leaking the value on every iteration (26MB over 100k iterations of a two-string tuple). Container items keep an extra reference forever, also defeating garbage collection. Solution: Clear the copied typval on both return paths, like the string branch of next_for_item() already does (Samuel Schlesinger). closes: #20914 Supported by AI. Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/eval.c | 7 +++++-- src/testdir/test_tuple.vim | 26 ++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/eval.c b/src/eval.c index 7d212b5b30..d5373c0991 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3005,9 +3005,12 @@ next_for_item(void *fi_void, char_u *arg) ++fi->fi_tuple_idx; ++fi->fi_bi; if (skip_assign) - return TRUE; - return ex_let_vars(arg, &tv, TRUE, fi->fi_semicolon, + result = TRUE; + else + result = ex_let_vars(arg, &tv, TRUE, fi->fi_semicolon, fi->fi_varcount, flag, NULL) == OK; + clear_tv(&tv); + return result; } item = fi->fi_lw.lw_item; diff --git a/src/testdir/test_tuple.vim b/src/testdir/test_tuple.vim index 68bdca08c2..ace890c040 100644 --- a/src/testdir/test_tuple.vim +++ b/src/testdir/test_tuple.vim @@ -778,6 +778,20 @@ func Test_tuple_for() LET sum += v2 endfor call assert_equal(0, sum) + + #" iterating over string items; the copied item must not be leaked + VAR res = '' + for v3 in ('a', 'bb', 'ccc') + LET res ..= v3 + endfor + call assert_equal('abbccc', res) + + #" iterating over container items must not leak a reference + VAR flat = [] + for v4 in (['a'], ['b', 'c']) + LET flat += v4 + endfor + call assert_equal(['a', 'b', 'c'], flat) END call v9.CheckSourceLegacyAndVim9Success(lines) @@ -792,6 +806,18 @@ func Test_tuple_for() END call v9.CheckSourceSuccess(lines) + " ignoring the for loop assignment using '_'; string items must not be + " leaked + let lines =<< trim END + vim9script + var count = 0 + for _ in ('a', 'bb', 'ccc') + count += 1 + endfor + assert_equal(3, count) + END + call v9.CheckSourceSuccess(lines) + let lines =<< trim END var sum = 0 for v in null_tuple diff --git a/src/version.c b/src/version.c index dcea5c2ab2..851013e9e5 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 902, /**/ 901, /**/ From 1ec4fd2c0e6204334c95f7312b3da156b42bad31 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 3 Aug 2026 20:02:51 +0000 Subject: [PATCH 280/647] patch 9.2.0903: Vim9: cannot use an exported function of an autoload import Problem: Using an exported function of a script imported with "import autoload" as a value gives E121, unless the script is under an "autoload" directory. Solution: When the name is not a script variable also look for an exported function and push a funcref for it (Hirohito Hirohito). fixes: #20911 closes: #20922 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_import.vim | 35 ++++++++++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9execute.c | 27 +++++++++++++++++++++--- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index 54bbd3f2aa..4c441b1ca3 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -2843,6 +2843,41 @@ def Test_import_autoload_postponed() &rtp = save_rtp enddef +def Test_import_autoload_func_as_value() + var lines =<< trim END + vim9script + export def Exported(): string + return 'exported' + enddef + END + writefile(lines, 'XimportRelFunc.vim', 'D') + writefile(lines, 'XimportRelFunc2.vim', 'D') + + # Using the exported function as a value, not calling it. + lines =<< trim END + vim9script + import autoload './XimportRelFunc.vim' + def Func() + var Fn: func = XimportRelFunc.Exported + assert_equal('exported', Fn()) + enddef + Func() + END + v9.CheckScriptSuccess(lines) + + # The script is not loaded yet when compiling, thus the name is only + # checked when the function runs. + lines =<< trim END + vim9script + import autoload './XimportRelFunc2.vim' + def Func() + var Fn: func = XimportRelFunc2.NoSuchFunc + enddef + Func() + END + v9.CheckScriptFailure(lines, 'E121: Undefined variable: NoSuchFunc', 1) +enddef + def Test_import_autoload_override() mkdir('Xoverdir/autoload', 'pR') var save_rtp = &rtp diff --git a/src/version.c b/src/version.c index 851013e9e5..2fed34c3a1 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 903, /**/ 902, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index 1c30338eb8..c8790d634a 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -4180,9 +4180,30 @@ exec_instructions(ectx_T *ectx) if (di == NULL) { - SOURCING_LNUM = iptr->isn_lnum; - semsg(_(e_undefined_variable_str), name); - goto on_error; + ufunc_T *ufunc = NULL; + + if (iptr->isn_type == ISN_LOADEXPORT) + { + type_T *type; + + // Not a variable, it can be an exported function + // used as a value. + (void)find_exported(sid, name, &ufunc, &type, + NULL, NULL, FALSE); + } + if (ufunc == NULL) + { + SOURCING_LNUM = iptr->isn_lnum; + semsg(_(e_undefined_variable_str), name); + goto on_error; + } + if (GA_GROW_FAILS(&ectx->ec_stack, 1)) + goto theend; + tv = STACK_TV_BOT(0); + tv->v_lock = 0; + ++ectx->ec_stack.ga_len; + tv->v_type = VAR_FUNC; + tv->vval.v_string = vim_strsave(ufunc->uf_name); } else { From aee686334c2137f8a94b04de130a3f51d928a7ed Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 3 Aug 2026 20:08:04 +0000 Subject: [PATCH 281/647] patch 9.2.0904: "zb" scrolls incorrectly with cursor just above fold Problem: "zb" scrolls incorrectly with cursor just above fold. Solution: Handle boff.lnum being set to the last line of a fold (zeertzjq). With the cursor just above fold, botline_forw() moves boff.lnum to the last line of the fold, but curwin->w_botline is at the first line of the fold, so the boff.lnum == curwin->w_botline condition never holds. Instead, check that boff.lnum has just moved to or past w_botline by comparing its previous value with w_botline. Also make a similar change to the loff.lnum check above for symmetry. That one doesn't change behavior, as topline_back() sets loff.lnum to the first line of a fold. related: neovim/neovim#41122 closes: #20923 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/move.c | 14 +++++--------- src/testdir/test_normal.vim | 9 +++++++-- src/version.c | 2 ++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/move.c b/src/move.c index 9b45b0e2bc..6e7921cc2b 100644 --- a/src/move.c +++ b/src/move.c @@ -2790,6 +2790,7 @@ scroll_cursor_bot(int min_scroll, int set_topbot) ) break; + linenr_T loff_lnum_before = loff.lnum; // Add one line above topline_back(&loff); if (loff.height == MAXCOL) @@ -2808,15 +2809,13 @@ scroll_cursor_bot(int min_scroll, int set_topbot) // Count screen lines that are below the window. scrolled += loff.height; if (loff.lnum == curwin->w_botline -#ifdef FEAT_DIFF - && loff.fill == 0 -#endif - ) + && loff_lnum_before > curwin->w_botline) scrolled -= curwin->w_empty_rows; } if (boff.lnum < curbuf->b_ml.ml_line_count) { + linenr_T boff_lnum_before = boff.lnum; // Add one line below botline_forw(&boff); used += boff.height; @@ -2835,11 +2834,8 @@ scroll_cursor_bot(int min_scroll, int set_topbot) { // Count screen lines that are below the window. scrolled += boff.height; - if (boff.lnum == curwin->w_botline -#ifdef FEAT_DIFF - && boff.fill == 0 -#endif - ) + if (boff.lnum >= curwin->w_botline + && boff_lnum_before < curwin->w_botline) scrolled -= curwin->w_empty_rows; } } diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index 9b9eca8cfd..d61796a936 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -4397,16 +4397,21 @@ func Test_single_line_filler_zb() endfunc " Test for zb with fewer buffer lines than window height, non-zero 'scrolloff' -" and cursor on fold. -func Test_zb_with_cursor_on_fold() +" and cursor on or just above a fold. +func Test_zb_with_cursor_on_or_just_above_fold() 15new call setline(1, range(1, 5) + ['', 'foo{{{', 'bar}}}', '', 'baz']) setlocal foldmethod=marker scrolloff=1 call assert_equal(8, foldclosedend(7)) + call cursor(7, 1) normal! zb call assert_equal(1, line('w0')) + call cursor(6, 1) + normal! zb + call assert_equal(1, line('w0')) + bwipe! endfunc diff --git a/src/version.c b/src/version.c index 2fed34c3a1..abd19fb95a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 904, /**/ 903, /**/ From b362f0e2f953aa0080a6f69b1a72da8846e10032 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 3 Aug 2026 20:13:17 +0000 Subject: [PATCH 282/647] patch 9.2.0905: MS-Windows: ghost cursor with ligatures Problem: With ligatures enabled, a ghost cursor can be left on screen because the cursor is marked valid before the ligature cleanup, which redraws the cell with gui_screenchar() and invalidates the cursor again (ubaldot) Solution: Set gui.cursor_is_valid only after the ligature redraw is done, so it isn't cleared afterwards (Foxe Chen). fixes: #20916 closes: #20924 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.c | 6 +++--- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gui.c b/src/gui.c index 5d6eae1054..e2b3b40218 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1412,9 +1412,6 @@ gui_update_cursor( } break; } - // gui_redraw_block() may invalidate the cursor, make sure to validate - // it again. - gui.cursor_is_valid = true; # ifndef USE_GTK4 if ((lig_left || lig_right) && shape->shape != SHAPE_BLOCK) @@ -1430,6 +1427,9 @@ gui_update_cursor( gui.col = old; } # endif + // gui_redraw_block()/gui_screenchar() may invalidate the cursor, make sure + // to validate it again. + gui.cursor_is_valid = true; #endif old_hl_mask = gui.highlight_mask; diff --git a/src/version.c b/src/version.c index abd19fb95a..7bb915f932 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 905, /**/ 904, /**/ From 124c86868c253a5ec1347e7cbe102504d2d66a07 Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Mon, 3 Aug 2026 20:30:09 +0000 Subject: [PATCH 283/647] patch 9.2.0906: slow transstr() with long strings Problem: transstr() appends with STRCAT()/STRLEN() from the start of the result on every iteration, making it quadratic to the length of the string. Solution: Keep a tail pointer and append at it. (Samuel Schlesinger). closes: #20925 Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/charset.c | 25 ++++++++++++++--- src/testdir/test_functions.vim | 50 ++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/charset.c b/src/charset.c index 1c45688fe3..3be32f5fb4 100644 --- a/src/charset.c +++ b/src/charset.c @@ -383,7 +383,10 @@ transstr(char_u *s) if (res == NULL) return NULL; - *res = NUL; + // Keep a tail pointer to append to, appending with STRCAT would make + // this loop quadratic. + char_u *d = res; + p = s; while (*p != NUL) { @@ -391,14 +394,28 @@ transstr(char_u *s) { c = (*mb_ptr2char)(p); if (vim_isprintc(c)) - STRNCAT(res, p, l); // append printable multi-byte char + { + // append printable multi-byte char + mch_memmove(d, p, (size_t)l); + d += l; + } else - transchar_hex(res + STRLEN(res), c); + { + transchar_hex(d, c); + d += STRLEN(d); + } p += l; } else - STRCAT(res, transchar_byte(*p++)); + { + char_u *trs = transchar_byte(*p++); + int trs_len = (int)STRLEN(trs); + + mch_memmove(d, trs, (size_t)trs_len); + d += trs_len; + } } + *d = NUL; return res; } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 645ff531ed..2f2a7fc5f6 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -211,6 +211,56 @@ func Test_strwidth() set ambiwidth& endfunc +func Test_strtrans() + " The default of 'isprint' is platform-dependent: 0x7f and 0x9f are + " printable on Win32 and VMS. Set it so the expectations below hold + " everywhere. + let save_isprint = &isprint + set isprint=@,161-255 + + " printable ASCII is unchanged + call assert_equal('', strtrans('')) + call assert_equal('abc', strtrans('abc')) + + " control characters are displayed as ^X + call assert_equal('^I', strtrans("\t")) + call assert_equal('a^Mb^[c', strtrans("a\rb\ec")) + call assert_equal('^A^_^?', strtrans("\x01\x1f\x7f")) + + " printable multibyte characters are unchanged, including composing + " characters and characters above 0xffff + call assert_equal('héllo 你好', strtrans('héllo 你好')) + let s = 'e' .. nr2char(0x301) .. 'x' + call assert_equal(s, strtrans(s)) + call assert_equal(nr2char(0x1d11e), strtrans(nr2char(0x1d11e))) + + " unprintable multibyte characters are displayed in hex form + call assert_equal('<9f>', strtrans(nr2char(0x9f))) + call assert_equal('<200b>', strtrans(nr2char(0x200b))) + call assert_equal('', strtrans(nr2char(0xfeff))) + + " illegal bytes are displayed in hex form + call assert_equal('AB', strtrans("A\xffB")) + + " a long string mixing all kinds of characters + call assert_equal(repeat('a^Bé<9f>', 100), + \ strtrans(repeat("a\x02é" .. nr2char(0x9f), 100))) + + " the non-multi-byte code path + set encoding=latin1 + set isprint=@,161-255 + call assert_equal('a^Mb^[c', strtrans("a\rb\ec")) + call assert_equal('^A^_^?', strtrans("\x01\x1f\x7f")) + " an unprintable byte above 0x7f uses the meta notation + call assert_equal('| ', strtrans("\xa0")) + " a printable high byte is unchanged + call assert_equal("\xe9", strtrans("\xe9")) + call assert_equal("x^B\xe9| y", strtrans("x\x02\xe9\xa0y")) + set encoding=utf-8 + + let &isprint = save_isprint +endfunc + func Test_str2nr() call assert_equal(0, str2nr('')) call assert_equal(1, str2nr('1')) diff --git a/src/version.c b/src/version.c index 7bb915f932..13c9fc7d31 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 906, /**/ 905, /**/ From 28698bca20dd3970cd7a7e2996ecc74ce00f151b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 3 Aug 2026 20:38:42 +0000 Subject: [PATCH 284/647] patch 9.2.0907: popup: virtual text is not redrawn when a text property changes Problem: Adding or removing a text property in the buffer of a popup window does not update the popup on the screen. The old virtual text stays visible until something else causes a redraw. Solution: Also mark popup windows displaying the buffer for redrawing in redraw_buf_later() (Hirohito Higashi). fixes: #19297 closes: #20931 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/drawscreen.c | 9 +++++ .../Test_popupwin_textprop_redraw_1.dump | 10 +++++ .../Test_popupwin_textprop_redraw_2.dump | 10 +++++ src/testdir/test_popupwin.vim | 37 +++++++++++++++++++ src/version.c | 2 + 5 files changed, 68 insertions(+) create mode 100644 src/testdir/dumps/Test_popupwin_textprop_redraw_1.dump create mode 100644 src/testdir/dumps/Test_popupwin_textprop_redraw_2.dump diff --git a/src/drawscreen.c b/src/drawscreen.c index f5271e7c17..d85ae57dce 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -3443,6 +3443,15 @@ redraw_buf_later(buf_T *buf, int type) if (wp->w_buffer == buf) redraw_win_later(wp, type); } +#ifdef FEAT_PROP_POPUP + // popup windows are not in the list of windows + FOR_ALL_POPUPWINS(wp) + if (wp->w_buffer == buf) + redraw_win_later(wp, type); + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) + if (wp->w_buffer == buf) + redraw_win_later(wp, type); +#endif #if defined(FEAT_TERMINAL) && defined(FEAT_PROP_POPUP) // terminal in popup window is not in list of windows if (curwin->w_buffer == buf) diff --git a/src/testdir/dumps/Test_popupwin_textprop_redraw_1.dump b/src/testdir/dumps/Test_popupwin_textprop_redraw_1.dump new file mode 100644 index 0000000000..27326b4ee4 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_textprop_redraw_1.dump @@ -0,0 +1,10 @@ +> +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| |╔+0#0000001#ffd7ff255|═@29|╗| +0#4040ff13#ffffff0@40 +|~| |║+0#0000001#ffd7ff255|p|o|p|u|p| |t|e|x|t| @11|c+0&#ffff4012|o|u|n|t|=|1| |║+0&#ffd7ff255| +0#4040ff13#ffffff0@40 +|~| |╚+0#0000001#ffd7ff255|═@29|╝| +0#4040ff13#ffffff0@40 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|"+0#0000000&|X|p|o|p|u|p|P|r|o|p|"| |[|N|e|w|]| @38|0|,|0|-|1| @8|A|l@1| diff --git a/src/testdir/dumps/Test_popupwin_textprop_redraw_2.dump b/src/testdir/dumps/Test_popupwin_textprop_redraw_2.dump new file mode 100644 index 0000000000..f713073d63 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_textprop_redraw_2.dump @@ -0,0 +1,10 @@ +> +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| |╔+0#0000001#ffd7ff255|═@29|╗| +0#4040ff13#ffffff0@40 +|~| |║+0#0000001#ffd7ff255|p|o|p|u|p| |t|e|x|t| @11|c+0&#ffff4012|o|u|n|t|=|2| |║+0&#ffd7ff255| +0#4040ff13#ffffff0@40 +|~| |╚+0#0000001#ffd7ff255|═@29|╝| +0#4040ff13#ffffff0@40 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|"+0#0000000&|X|p|o|p|u|p|P|r|o|p|"| |[|N|e|w|]| @38|0|,|0|-|1| @8|A|l@1| diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 2663c52da2..6826731090 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -6243,4 +6243,41 @@ func Test_popup_image_clipwindow_scroll() call prop_type_delete('imgclipprop') endfunc +func Test_popupwin_textprop_redraw() + CheckScreendump + + let lines =<< trim END + vim9script + var buf = bufadd('XpopupProp') + bufload(buf) + setbufline(buf, 1, 'popup text') + prop_type_add('counter', {bufnr: buf, highlight: 'Search'}) + popup_create(buf, {line: 3, col: 3, minwidth: 30, border: []}) + + var counter = 0 + def g:UpdateProp() + counter += 1 + prop_remove({all: true, type: 'counter', bufnr: buf}, 1) + prop_add(1, 0, { + bufnr: buf, + type: 'counter', + text: $'count={counter} ', + text_align: 'right', + }) + enddef + nnoremap g:UpdateProp() + END + call writefile(lines, 'XtestPopupProp', 'D') + let buf = RunVimInTerminal('-S XtestPopupProp', #{rows: 10}) + + " Updating only the virtual text of the popup buffer must redraw the popup. + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_popupwin_textprop_redraw_1', {}) + + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_popupwin_textprop_redraw_2', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 diff --git a/src/version.c b/src/version.c index 13c9fc7d31..5a748f4996 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 907, /**/ 906, /**/ From 7203411bc9038d95686a2c7d44de7a9843019b80 Mon Sep 17 00:00:00 2001 From: Ubaldo Tiberi Date: Tue, 4 Aug 2026 19:39:05 +0000 Subject: [PATCH 285/647] runtime(doc): add a few more references to 'guiligatures' closes: #20937 Signed-off-by: Ubaldo Tiberi Signed-off-by: Christian Brabandt --- runtime/doc/gui.txt | 4 ++-- runtime/doc/options.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt index 89fdb0137f..7f77539ada 100644 --- a/runtime/doc/gui.txt +++ b/runtime/doc/gui.txt @@ -1,4 +1,4 @@ -*gui.txt* For Vim version 9.2. Last change: 2026 Jun 02 +*gui.txt* For Vim version 9.2. Last change: 2026 Aug 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1167,7 +1167,7 @@ Examples: > :set guifont=Andale_Mono:h7.5:w4.5 :set guifont=Cascadia_Code:h14:fss19=1:fcalt=1:fliga=1 -See also |font-sizes|. +See also |font-sizes|, 'guiligatures' and 'renderoptions' (MS-Windows only). Note on Weights: Fonts often come with a variety of weights. "Normal" weights in Windows have a value of 400 and, left unspecified, this is the value that diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index a9d8f06f53..521446ada5 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 02 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7341,7 +7341,7 @@ A jump table for the options with a short description can be found at |Q_op|. emoji might be rendered beyond the bounding box of drawing cell. - Other render types are currently not supported. + Other render types are currently not supported. See also 'guiligatures'. *'report'* 'report' number (default 2) From f620c3001891e6f0abb1c97932af94d021c4e9a0 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Tue, 4 Aug 2026 19:43:26 +0000 Subject: [PATCH 286/647] runtime(dart): Update compiler plugins Use the unified dart command for all. closes: #20936 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/compiler/dart.vim | 4 ++-- runtime/compiler/dart2js.vim | 4 ++-- runtime/compiler/dart2native.vim | 4 ++-- runtime/compiler/dartanalyser.vim | 4 ++-- runtime/compiler/dartdevc.vim | 3 ++- runtime/compiler/dartdoc.vim | 4 ++-- runtime/compiler/dartfmt.vim | 4 ++-- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/runtime/compiler/dart.vim b/runtime/compiler/dart.vim index 9577236bee..2334b512bf 100644 --- a/runtime/compiler/dart.vim +++ b/runtime/compiler/dart.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart VM " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,7 +11,7 @@ let current_compiler = "dart" let s:cpo_save = &cpo set cpo&vim -CompilerSet makeprg=dart +CompilerSet makeprg=dart\ run CompilerSet errorformat=%E%f:%l:%c:\ Error:\ %m, \%CTry\ %.%#, \%Z\ %#^%\\+, diff --git a/runtime/compiler/dart2js.vim b/runtime/compiler/dart2js.vim index a05dead2a9..c3027d1d99 100644 --- a/runtime/compiler/dart2js.vim +++ b/runtime/compiler/dart2js.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart to JavaScript Compiler " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,7 +11,7 @@ let current_compiler = "dart2js" let s:cpo_save = &cpo set cpo&vim -CompilerSet makeprg=dart2js +CompilerSet makeprg=dart\ compile\ js CompilerSet errorformat=%E%f:%l:%c:, \%-GError:\ Compilation\ failed., \%CError:\ %m, diff --git a/runtime/compiler/dart2native.vim b/runtime/compiler/dart2native.vim index 6604fc4bd4..6b4fcaa4b6 100644 --- a/runtime/compiler/dart2native.vim +++ b/runtime/compiler/dart2native.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart to Native Compiler " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,7 +11,7 @@ let current_compiler = "dart2native" let s:cpo_save = &cpo set cpo&vim -CompilerSet makeprg=dart2native +CompilerSet makeprg=dart\ compile\ exe CompilerSet errorformat=%E%f:%l:%c:\ Error:\ %m, \%CTry\ %.%#, \%Z\ %#^%\\+, diff --git a/runtime/compiler/dartanalyser.vim b/runtime/compiler/dartanalyser.vim index 48a976a016..e50f8e08f4 100644 --- a/runtime/compiler/dartanalyser.vim +++ b/runtime/compiler/dartanalyser.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart Analyzer " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,7 +11,7 @@ let current_compiler = "dartanalyzer" let s:cpo_save = &cpo set cpo&vim -CompilerSet makeprg=dartanalyzer\ --format\ machine +CompilerSet makeprg=dart\ analyze\ --format\ machine CompilerSet errorformat=%t%\\w%\\+\|%\\w%\\+\|%\\w%\\+\|%f\|%l\|%c\|%\\d%\\+\|%m, \%-G%.%# diff --git a/runtime/compiler/dartdevc.vim b/runtime/compiler/dartdevc.vim index 16e4ed7ced..d600d29d06 100644 --- a/runtime/compiler/dartdevc.vim +++ b/runtime/compiler/dartdevc.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart Development Compiler " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,6 +11,7 @@ let current_compiler = "dartdevc" let s:cpo_save = &cpo set cpo&vim +" DEPRECATED: discontinued as of Dart 2.18 (remove in release after Vim 9.2) CompilerSet makeprg=dartdevc CompilerSet errorformat=%E%f:%l:%c:\ Error:\ %m, \%CTry\ %.%#, diff --git a/runtime/compiler/dartdoc.vim b/runtime/compiler/dartdoc.vim index 78f0d241a4..f98f9d5a46 100644 --- a/runtime/compiler/dartdoc.vim +++ b/runtime/compiler/dartdoc.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart Documentation Generator " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,7 +11,7 @@ let current_compiler = "dartdoc" let s:cpo_save = &cpo set cpo&vim -CompilerSet makeprg=dartdoc +CompilerSet makeprg=dart\ doc CompilerSet errorformat=\ \ %tarning:\ %m, \\ \ %trror:\ %m, \%+EGeneration\ failed:\ %m, diff --git a/runtime/compiler/dartfmt.vim b/runtime/compiler/dartfmt.vim index d204df8a73..be69b36093 100644 --- a/runtime/compiler/dartfmt.vim +++ b/runtime/compiler/dartfmt.vim @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: Dart Formatter " Maintainer: Doug Kearns -" Last Change: 2024 Apr 03 +" Last Change: 2026 Aug 04 if exists("current_compiler") finish @@ -11,7 +11,7 @@ let current_compiler = "dartfmt" let s:cpo_save = &cpo set cpo&vim -CompilerSet makeprg=dartfmt +CompilerSet makeprg=dart\ format CompilerSet errorformat=%Eline\ %l\\,\ column\ %c\ of\ %f:\ %m, \%Z\ %\\{3}│\ %\\+^%\\+, \%C%.%#, From 284d1b51230a577e3736f2b7a2dabc03e04d2733 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 4 Aug 2026 19:50:18 +0000 Subject: [PATCH 287/647] patch 9.2.0908: cannot use a {} block in a nested :autocmd Problem: At script level a "{" block is only recognized when it is the whole argument of :autocmd or :command, so an :autocmd that is the command of another :autocmd cannot use a block. In a :def function a trailing "{" is accepted instead, and there any command ending in "{", such as "normal! {", is mistaken for the start of a block (lacygoill). Solution: Locate the block by following the argument of the command, descending into a nested :autocmd or :command, and use that everywhere a block needs to be recognized (Hirohito Higashi). fixes: #20918 closes: #20933 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/autocmd.txt | 10 +++- src/autocmd.c | 50 ++++++++++++++++++ src/ex_docmd.c | 62 ++++++++++++++++++++++ src/proto/autocmd.pro | 1 + src/proto/ex_docmd.pro | 1 + src/testdir/test_autocmd.vim | 86 +++++++++++++++++++++++++++++++ src/testdir/test_usercommands.vim | 36 +++++++++++++ src/testdir/test_vim9_script.vim | 41 +++++++++++++++ src/usercmd.c | 11 ++-- src/userfunc.c | 9 +--- src/version.c | 2 + src/vim9cmds.c | 34 ++++-------- 12 files changed, 307 insertions(+), 36 deletions(-) diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index b3d1deb25f..7a1df5c46a 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 9.2. Last change: 2026 May 23 +*autocmd.txt* For Vim version 9.2. Last change: 2026 Aug 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -103,6 +103,14 @@ triggered. setlocal matchpairs+=<:> / + au FileType xml au BufWinEnter * ++once { + setlocal matchpairs+=<:> + } + pat && *(cmd - 1) == '\\'))) + ++cmd; + cmd = skipwhite(cmd); + + // "++once" and "++nested" can come in any order. + for (int i = 0; i < 2; ++i) + { + if (STRNCMP(cmd, "++once", 6) == 0 && VIM_ISWHITE(cmd[6])) + cmd = skipwhite(cmd + 6); + if (STRNCMP(cmd, "++nested", 8) == 0 && VIM_ISWHITE(cmd[8])) + cmd = skipwhite(cmd + 8); + if (!in_vim9script() && STRNCMP(cmd, "nested", 6) == 0 + && VIM_ISWHITE(cmd[6])) + cmd = skipwhite(cmd + 6); + } + + return *cmd == NUL ? NULL : cmd; +} + /* * Return TRUE if "event" is included in 'eventignore(win)'. */ diff --git a/src/ex_docmd.c b/src/ex_docmd.c index b23504a85b..f5771cb615 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2838,6 +2838,68 @@ checkforcmd_noparen( return checkforcmd_opt(pp, cmd, len, TRUE); } +/* + * Find the replacement text of a ":command", the part after the attributes and + * the command name. Returns NULL when there is none. Does not modify "arg" + * and gives no error messages. + */ + static char_u * +find_ucmd_repl(char_u *arg) +{ + char_u *p = arg; + + // Skip over the attributes. + while (*p == '-') + p = skipwhite(skiptowhite(p)); + + // Skip over the command name. + if (!ASCII_ISALPHA(*p)) + return NULL; + while (ASCII_ISALNUM(*p)) + ++p; + + return *p == NUL ? NULL : skipwhite(p); +} + +/* + * Find the "{" in "line" that starts a block for ":command" or ":autocmd". + * That is the case when the command argument is "{" at the end of the line, + * also when the command is nested in another ":command" or ":autocmd". + * Returns NULL when the line does not start such a block. + */ + char_u * +find_cmd_block_start(char_u *line) +{ + char_u *p = skipwhite(line); + + for (;;) + { + char_u *arg = p; + + if (*p == '{' && ends_excmd2(p, skipwhite(p + 1))) + return p; + + if (checkforcmd_noparen(&arg, "autocmd", 2)) + { + if (*arg == '!') + arg = skipwhite(arg + 1); + p = au_find_cmd_arg(arg); + } + else if (checkforcmd_noparen(&arg, "command", 3)) + { + if (*arg == '!') + arg = skipwhite(arg + 1); + p = find_ucmd_repl(arg); + } + else + return NULL; + + if (p == NULL) + return NULL; + p = skipwhite(p); + } +} + /* * Parse and skip over command modifiers: * - update eap->cmd diff --git a/src/proto/autocmd.pro b/src/proto/autocmd.pro index abff7fd414..143c731d28 100644 --- a/src/proto/autocmd.pro +++ b/src/proto/autocmd.pro @@ -5,6 +5,7 @@ void do_augroup(char_u *arg, int del_group); void autocmd_init(void); void free_all_autocmds(void); int is_aucmd_win(win_T *win); +char_u *au_find_cmd_arg(char_u *arg); int event_ignored(event_T event, char_u *ei); int check_ei(char_u *ei); char_u *au_event_disable(char *what); diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index df44d02004..299820077a 100644 --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -10,6 +10,7 @@ char *ex_errmsg(char *msg, char_u *arg); char *ex_range_without_command(exarg_T *eap); int checkforcmd(char_u **pp, char *cmd, int len); int checkforcmd_noparen(char_u **pp, char *cmd, int len); +char_u *find_cmd_block_start(char_u *line); int parse_command_modifiers(exarg_T *eap, char **errormsg, cmdmod_T *cmod, int skip_only); int has_cmdmod(cmdmod_T *cmod, int ignore_silent); int cmdmod_error(int ignore_silent); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 7e36eec53e..b76cec4f3f 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -4070,6 +4070,92 @@ func Test_autocmd_with_block() augroup END endfunc +" Test for a {} block at script level in an :autocmd nested in another one +func Test_autocmd_nested_block() + let lines =<< trim END + vim9script + autocmd CursorHold * autocmd BufReadPre * ++once { + g:nested_block = 'yes' + } + END + call writefile(lines, 'XautoNestedBlock', 'D') + source XautoNestedBlock + + doautocmd CursorHold + doautocmd BufReadPre + call assert_equal('yes', g:nested_block) + + unlet g:nested_block + au! CursorHold + au! BufReadPre +endfunc + +" Test for a {} block in an :autocmd nested two levels deep +func Test_autocmd_nested_block_twice() + let lines =<< trim END + vim9script + autocmd CursorHold * autocmd CursorHoldI * autocmd BufReadPre * ++once { + g:nested_twice = 'yes' + } + END + call writefile(lines, 'XautoNestedTwice', 'D') + source XautoNestedTwice + + doautocmd CursorHold + doautocmd CursorHoldI + doautocmd BufReadPre + call assert_equal('yes', g:nested_twice) + + unlet g:nested_twice + au! CursorHold + au! CursorHoldI + au! BufReadPre +endfunc + +" Only the :autocmd owning the block uses Vim9 syntax, the one it is nested in +" keeps the syntax of the script. The old "nested" is valid in legacy script +" but an error in Vim9 script, so it tells the two apart. +func Test_autocmd_nested_block_legacy_script() + let lines =<< trim END + autocmd CursorHold * autocmd BufReadPre * nested { + g:legacy_block = 'yes' + } + END + call writefile(lines, 'XautoNestedLegacy', 'D') + source XautoNestedLegacy + + doautocmd CursorHold + doautocmd BufReadPre + call assert_equal('yes', g:legacy_block) + + unlet g:legacy_block + au! CursorHold + au! BufReadPre +endfunc + +" A trailing "{" that is an argument of the command does not start a block, +" the lines after it are not swallowed +func Test_autocmd_trailing_curly_no_block() + let lines =<< trim END + vim9script + autocmd CursorHold * normal! { + g:after_autocmd = 'reached' + END + call writefile(lines, 'XautoTrailingCurly', 'D') + source XautoTrailingCurly + call assert_equal('reached', g:after_autocmd) + + new + call setline(1, ['one', '', 'two']) + call cursor(3, 1) + doautocmd CursorHold + call assert_equal(2, line('.')) + + bwipe! + unlet g:after_autocmd + au! CursorHold +endfunc + func Test_closing_autocmd_window() let lines =<< trim END edit Xa.txt diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim index e505e2d4c3..7f8fea4216 100644 --- a/src/testdir/test_usercommands.vim +++ b/src/testdir/test_usercommands.vim @@ -927,6 +927,42 @@ func Test_usercmd_custom() delfunc T2 endfunc +" Test for a {} block in a command nested in :command or :autocmd +func Test_usercmd_nested_block() + command DefineIt command DoNested { + g:didnested = 'yes' + } + DefineIt + DoNested + call assert_equal('yes', g:didnested) + unlet g:didnested + delcommand DoNested + delcommand DefineIt + + " a command defined by an autocmd + autocmd CursorHold * command DoFromAu { + g:didfromau = 'yes' + } + doautocmd CursorHold + DoFromAu + call assert_equal('yes', g:didfromau) + unlet g:didfromau + delcommand DoFromAu + au! CursorHold + + " a trailing "{" that is an argument of the command is not a block + let lines =<< trim END + vim9script + command NoBlock normal! { + g:after_command = 'reached' + END + call writefile(lines, 'XcmdTrailingCurly', 'D') + source XcmdTrailingCurly + call assert_equal('reached', g:after_command) + unlet g:after_command + delcommand NoBlock +endfunc + func Test_usercmd_with_block() command DoSomething { g:didit = 'yes' # comment diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index b86acd071e..c82c01a0fa 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -485,6 +485,47 @@ def Test_command_block() unlet g:someVar enddef +" Test for a {} block in an :autocmd nested in another :autocmd +def Test_nested_autocmd_block_in_def() + au CursorHold * autocmd BufNew *.xml { + g:nestedVar = 'nested' + } + doautocmd CursorHold + split other.xml + assert_equal('nested', g:nestedVar) + + bwipe! + au! CursorHold + au! BufNew *.xml + unlet g:nestedVar +enddef + +" A trailing "{" that is an argument of the command does not start a block. +" Use a separate script, when the "{" is taken for a block the rest of this +" file would be swallowed until a line starting with "}". +def Test_autocmd_trailing_curly_no_block_in_def() + var lines =<< trim END + vim9script + def Setup() + au CursorHold * normal! { + g:afterCurly = 'reached' + enddef + Setup() + END + v9.CheckScriptSuccess(lines) + assert_equal('reached', g:afterCurly) + + new + setline(1, ['one', '', 'two']) + cursor(3, 1) + doautocmd CursorHold + assert_equal(2, line('.')) + + bwipe! + unlet g:afterCurly + au! CursorHold +enddef + " Test for using heredoc in a :command command block def Test_command_block_heredoc() var lines =<< trim CODE diff --git a/src/usercmd.c b/src/usercmd.c index 412ac0ae7a..9dcd0f8066 100644 --- a/src/usercmd.c +++ b/src/usercmd.c @@ -1322,16 +1322,16 @@ uc_add_command( } /* - * If "p" starts with "{" then read a block of commands until "}". + * If "p" starts a block of commands, read it until "}". * Used for ":command" and ":autocmd". */ char_u * may_get_cmd_block(exarg_T *eap, char_u *p, char_u **tofree, int *flags) { char_u *retp = p; + char_u *block = find_cmd_block_start(p); - if (*p == '{' && ends_excmd2(eap->arg, skipwhite(p + 1)) - && eap->ea_getline != NULL) + if (block != NULL && eap->ea_getline != NULL) { garray_T ga; char_u *line = NULL; @@ -1364,7 +1364,10 @@ may_get_cmd_block(exarg_T *eap, char_u *p, char_u **tofree, int *flags) if (retp == NULL) retp = p; ga_clear_strings(&ga); - *flags |= UC_VIM9; + // Only the command owning the block uses Vim9 syntax. A command with + // the block nested in it keeps the syntax of its script. + if (block == p) + *flags |= UC_VIM9; } return retp; } diff --git a/src/userfunc.c b/src/userfunc.c index 4dddf621d5..0cc9e31e33 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -1257,14 +1257,7 @@ get_function_body( --end; is_block = end > p + 2 && end[-1] == '=' && end[0] == '>'; if (!is_block) - { - char_u *s = p; - - // check for line starting with "au" for :autocmd or - // "com" for :command, these can use a {} block - is_block = checkforcmd_noparen(&s, "autocmd", 2) - || checkforcmd_noparen(&s, "command", 3); - } + is_block = find_cmd_block_start(p) != NULL; if (is_block) { diff --git a/src/version.c b/src/version.c index 5a748f4996..bc604af0b3 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 908, /**/ 907, /**/ diff --git a/src/vim9cmds.c b/src/vim9cmds.c index 1a8ff15f48..01643b83d9 100644 --- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -2345,30 +2345,18 @@ compile_exec(char_u *line_arg, exarg_T *eap, cctx_T *cctx) } else if (eap->cmdidx == CMD_command || eap->cmdidx == CMD_autocmd) { - // If there is a trailing '{' read lines until the '}' - p = eap->arg + STRLEN(eap->arg) - 1; - while (p > eap->arg && VIM_ISWHITE(*p)) - --p; - if (*p == '{') + exarg_T ea; + int flags = 0; // unused + int start_lnum = SOURCING_LNUM; + + CLEAR_FIELD(ea); + ea.arg = eap->arg; + fill_exarg_from_cctx(&ea, cctx); + p = may_get_cmd_block(&ea, line, &tofree, &flags); + if (tofree != NULL) { - exarg_T ea; - int flags = 0; // unused - int start_lnum = SOURCING_LNUM; - - CLEAR_FIELD(ea); - ea.arg = eap->arg; - fill_exarg_from_cctx(&ea, cctx); - (void)may_get_cmd_block(&ea, p, &tofree, &flags); - if (tofree != NULL) - { - *p = NUL; - line = concat_str(line, tofree); - if (line == NULL) - goto theend; - vim_free(tofree); - tofree = line; - SOURCING_LNUM = start_lnum; - } + line = p; + SOURCING_LNUM = start_lnum; } } } From aeac948c6273076f666b473862af70e8b7e6c653 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 4 Aug 2026 20:12:32 +0000 Subject: [PATCH 288/647] runtime: Update Syntax Menus Update makemenu.vim and re-generate synmenu.vim (using make menu). closes: #20932 related: #20930 Signed-off-by: Christian Brabandt --- runtime/makemenu.vim | 181 +++++- runtime/synmenu.vim | 1341 +++++++++++++++++++++++------------------- 2 files changed, 924 insertions(+), 598 deletions(-) diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 8be8cc9fcf..7ebf595063 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -57,17 +57,22 @@ SynMenu AB.ABAP/4:abap SynMenu AB.Abaqus:abaqus SynMenu AB.ABC\ music\ notation:abc SynMenu AB.ABEL:abel +SynMenu AB.ABNF:abnf SynMenu AB.AceDB\ model:acedb SynMenu AB.Ada:ada SynMenu AB.AfLex:aflex +SynMenu AB.Aidl:aidl +SynMenu AB.Algol68:algol68 SynMenu AB.ALSA\ config:alsaconf SynMenu AB.Altera\ AHDL:ahdl SynMenu AB.Amiga\ DOS:amiga SynMenu AB.AMPL:ampl SynMenu AB.Ant\ build\ file:ant SynMenu AB.ANTLR:antlr +SynMenu AB.ANTLR4:antlr4 SynMenu AB.Apache\ config:apache SynMenu AB.Apache-style\ config:apachestyle +SynMenu AB.Apkbuild:apkbuild SynMenu AB.Applix\ ELF:elf SynMenu AB.APT\ config:aptconf SynMenu AB.Arc\ Macro\ Language:aml @@ -93,11 +98,14 @@ SynMenu AB.Assembly.xa\ 6502\ cross\ assembler:a65 SynMenu AB.ASN\.1:asn SynMenu AB.Asterisk\ config:asterisk SynMenu AB.Asterisk\ voicemail\ config:asteriskvm +SynMenu AB.Astro:astro +SynMenu AB.Asy:asy SynMenu AB.Atlas:atlas SynMenu AB.Autodoc:autodoc SynMenu AB.AutoHotKey:autohotkey SynMenu AB.AutoIt:autoit SynMenu AB.Automake:automake +SynMenu AB.Autopkgtest:autopkgtest SynMenu AB.Avenue:ave SynMenu AB.Awk:awk SynMenu AB.AYacc:ayacc @@ -113,16 +121,22 @@ SynMenu AB.Bazaar\ commit\ file:bzr SynMenu AB.Bazel:bzl SynMenu AB.BC\ calculator:bc SynMenu AB.BDF\ font:bdf +SynMenu AB.Beancount:beancount SynMenu AB.BibTeX.Bibliography\ database:bib SynMenu AB.BibTeX.Bibliography\ Style:bst SynMenu AB.BIND.BIND\ config:named SynMenu AB.BIND.BIND\ zone:bindzone +SynMenu AB.Bitbake:bitbake SynMenu AB.Blank:blank +SynMenu AB.Bpftrace:bpftrace +SynMenu AB.Bsdl:bsdl SynMenu C.C:c SynMenu C.C++:cpp SynMenu C.C#:cs SynMenu C.Cabal\ Haskell\ build\ file:cabal +SynMenu C.Cabal\ Config:cabalconfig +SynMenu C.Cabal\ Project:cabalproject SynMenu C.Calendar:calendar SynMenu C.Cangjie:cangjie SynMenu C.Cascading\ Style\ Sheets:css @@ -130,31 +144,40 @@ SynMenu C.CDL:cdl SynMenu C.Cdrdao\ TOC:cdrtoc SynMenu C.Cdrdao\ config:cdrdaoconf SynMenu C.Century\ Term:cterm +SynMenu C.Cgdbrc:cgdbrc SynMenu C.CH\ script:ch +SynMenu C.Chatito:chatito SynMenu C.ChaiScript:chaiscript SynMenu C.ChangeLog:changelog SynMenu C.CHILL:chill SynMenu C.Cheetah\ template:cheetah SynMenu C.Chicken:chicken SynMenu C.ChordPro:chordpro +SynMenu C.Chuck:chuck SynMenu C.Clean:clean SynMenu C.Clever:cl SynMenu C.Clipper:clipper SynMenu C.Clojure:clojure +SynMenu C.Cmacro:cmacro SynMenu C.Cmake:cmake +SynMenu C.Cmake\ Cache\ file:cmakecache SynMenu C.Cmod:cmod SynMenu C.Cmusrc:cmusrc SynMenu C.Cobol:cobol SynMenu C.Coco/R:coco +SynMenu C.Codeowners:codeowners SynMenu C.Cold\ Fusion:cf SynMenu C.Conary\ Recipe:conaryrecipe SynMenu C.Config.Cfg\ Config\ file:cfg SynMenu C.Config.Configure\.in:config SynMenu C.Config.Generic\ Config\ file:conf +SynMenu C.Confini:confini SynMenu C.CRM114:crm SynMenu C.Crontab:crontab SynMenu C.CSDL:csdl SynMenu C.CSP:csp +SynMenu C.CSV.CSV:csv +SynMenu C.CSV.TSV:tsv SynMenu C.Ctrl-H:ctrlh SynMenu C.Cucumber:cucumber SynMenu C.CUDA:cuda @@ -168,11 +191,14 @@ SynMenu C.Cynlib:cynlib SynMenu DE.D:d SynMenu DE.Dart:dart SynMenu DE.Datascript:datascript +SynMenu DE.Dax:dax +SynMenu DE.Debian.Debian\ 822sources:deb822sources SynMenu DE.Debian.Debian\ ChangeLog:debchangelog SynMenu DE.Debian.Debian\ Control:debcontrol SynMenu DE.Debian.Debian\ Copyright:debcopyright SynMenu DE.Debian.Debian\ Sources\.list:debsources SynMenu DE.Denyhosts:denyhosts +SynMenu DE.Dep3patch:dep3patch SynMenu DE.Desktop:desktop SynMenu DE.Dict\ config:dictconf SynMenu DE.Dictd\ config:dictdconf @@ -182,6 +208,7 @@ SynMenu DE.Dircolors:dircolors SynMenu DE.Dirpager:dirpager SynMenu DE.Django\ template:django SynMenu DE.DNS/BIND\ zone:bindzone +SynMenu DE.Dns:dns SynMenu DE.Dnsmasq\ config:dnsmasq SynMenu DE.DocBook.auto-detect:docbk SynMenu DE.DocBook.SGML:docbksgml @@ -206,11 +233,14 @@ SynMenu DE.Dylan.Dylan\ lid:dylanlid SynMenu DE.EDIF:edif SynMenu DE.Ed:ed +SynMenu DE.Editorconfig:editorconfig SynMenu DE.Eiffel:eiffel SynMenu DE.Eight:8th SynMenu DE.Elinks\ config:elinks +SynMenu DE.Elm:elm SynMenu DE.Elm\ filter\ rules:elmfilt SynMenu DE.Embedix\ Component\ Description:ecd +SynMenu DE.ENV:env SynMenu DE.ERicsson\ LANGuage:erlang SynMenu DE.ESMTP\ rc:esmtprc SynMenu DE.ESQL-C:esqlc @@ -227,6 +257,7 @@ SynMenu DE.Exports:exports SynMenu FG.Falcon:falcon SynMenu FG.Fantom:fan SynMenu FG.Fetchmail:fetchmail +SynMenu FG.Fish:fish SynMenu FG.FlexWiki:flexwiki SynMenu FG.Focus\ Executable:focexec SynMenu FG.Focus\ Master:master @@ -234,6 +265,7 @@ SynMenu FG.FORM:form SynMenu FG.Forth:forth SynMenu FG.Fortran:fortran SynMenu FG.FoxPro:foxpro +SynMenu FG.Fpcmake:fpcmake SynMenu FG.FrameScript:framescript SynMenu FG.Fstab:fstab SynMenu FG.Fvwm.Fvwm\ configuration:fvwm1 @@ -242,19 +274,33 @@ SynMenu FG.Fvwm.Fvwm2\ configuration\ with\ M4:fvwm2m4 SynMenu FG.GDB\ command\ file:gdb SynMenu FG.GDMO:gdmo +SynMenu FG.Gdresource:gdresource +SynMenu FG.Gdscript:gdscript +SynMenu FG.Gdshader:gdshader SynMenu FG.Gedcom:gedcom +SynMenu FG.Gel:gel +SynMenu FG.Gemtext:gemtext +SynMenu FG.Gift:gift SynMenu FG.Git.Output:git +SynMenu FG.Git.Attributes:gitattributes SynMenu FG.Git.Commit:gitcommit SynMenu FG.Git.Config:gitconfig +SynMenu FG.Git.Ignore:gitignore SynMenu FG.Git.Rebase:gitrebase +SynMenu FG.Git.Revlist:gitrevlist SynMenu FG.Git.Send\ Email:gitsendemail SynMenu FG.Gitolite:gitolite SynMenu FG.Gkrellmrc:gkrellmrc +SynMenu FG.Gleam:gleam +SynMenu FG.Glimmer:glimmer +SynMenu FG.Glsl:glsl SynMenu FG.Gnash:gnash -SynMenu FG.Go:go -SynMenu FG.Godoc:godoc +SynMenu FG.Go.Access:goaccess +SynMenu FG.Go.Doc:godoc +SynMenu FG.Go.Go:go SynMenu FG.GP:gp SynMenu FG.GPG:gpg +SynMenu FG.Graphql:graphql SynMenu FG.Grof:gprof SynMenu FG.Group\ file:group SynMenu FG.Grub:grub @@ -265,21 +311,29 @@ SynMenu FG.Gretl:gretl SynMenu FG.Groff:groff SynMenu FG.Groovy:groovy SynMenu FG.GTKrc:gtkrc +SynMenu FG.Gvpr:gvpr +SynMenu FG.Gyp:gyp SynMenu HIJK.Haml:haml SynMenu HIJK.Hamster:hamster +SynMenu HIJK.Handlebars:handlebars +SynMenu HIJK.Hare.Hare:hare +SynMenu HIJK.Hare.Doc:haredoc SynMenu HIJK.Haskell.Haskell:haskell SynMenu HIJK.Haskell.Haskell-c2hs:chaskell SynMenu HIJK.Haskell.Haskell-literate:lhaskell SynMenu HIJK.HASTE:haste SynMenu HIJK.HASTE\ preproc:hastepreproc +SynMenu HIJK.HCL:hcl SynMenu HIJK.Hercules:hercules SynMenu HIJK.Hex\ dump.XXD:xxd SynMenu HIJK.Hex\ dump.Intel\ MCS51:hex SynMenu HIJK.Hg\ commit:hgcommit SynMenu HIJK.HIP:hip +SynMenu HIJK.HLSPlaylist:hlsplaylist SynMenu HIJK.Hollywood:hollywood SynMenu HIJK.HTML.HTML:html +SynMenu HIJK.HTML.HTMLAngular:htmlangular SynMenu HIJK.HTML.HTML\ with\ M4:htmlm4 SynMenu HIJK.HTML.HTML\ with\ Ruby\ (eRuby):eruby SynMenu HIJK.HTML.Cheetah\ HTML\ template:htmlcheetah @@ -290,10 +344,13 @@ SynMenu HIJK.HTML.XHTML:xhtml SynMenu HIJK.Host\.conf:hostconf SynMenu HIJK.Hosts\ access:hostsaccess SynMenu HIJK.Hyper\ Builder:hb +SynMenu HIJK.Hyprlang:hyprlang +SynMenu HIJK.I3Config:i3config SynMenu HIJK.Icewm\ menu:icemenu SynMenu HIJK.Icon:icon SynMenu HIJK.IDL\Generic\ IDL:idl SynMenu HIJK.IDL\Microsoft\ IDL:msidl +SynMenu HIJK.Idris2:idris2 SynMenu HIJK.Indent\ profile:indent SynMenu HIJK.Inform:inform SynMenu HIJK.Informix\ 4GL:fgl @@ -308,6 +365,7 @@ SynMenu HIJK.Innovation\ Data\ Processing.Usserver\ log:usserverlog SynMenu HIJK.Innovation\ Data\ Processing.USW2KAgt\ log:usw2kagtlog SynMenu HIJK.InstallShield\ script:ishd SynMenu HIJK.Interactive\ Data\ Lang:idlang +SynMenu HIJK.Ipkg:ipkg SynMenu HIJK.IPfilter:ipfilter SynMenu HIJK.J:j SynMenu HIJK.JAL:jal @@ -321,24 +379,40 @@ SynMenu HIJK.JavaScript:javascript SynMenu HIJK.JavaScriptReact:javascriptreact SynMenu HIJK.Jess:jess SynMenu HIJK.Jgraph:jgraph +SynMenu HIJK.Jinja:jinja +SynMenu HIJK.JJdescription:jjdescription SynMenu HIJK.Jovial:jovial -SynMenu HIJK.JSON:json +SynMenu HIJK.JQ:jq +SynMenu HIJK.JSON.JSON:json +SynMenu HIJK.JSON.JSON5:json5 +SynMenu HIJK.JSON.JSONC:jsonc +SynMenu HIJK.Julia:julia +SynMenu HIJK.Just:just +SynMenu HIJK.Karel:karel SynMenu HIJK.Kconfig:kconfig SynMenu HIJK.KDE\ script:kscript +SynMenu HIJK.Kdl:kdl SynMenu HIJK.Kimwitu++:kwt +SynMenu HIJK.Kitty:kitty SynMenu HIJK.Kivy:kivy SynMenu HIJK.KixTart:kix +SynMenu HIJK.Kotlin:kotlin +SynMenu HIJK.Krl:krl SynMenu L.Lace:lace SynMenu L.LambdaProlog:lprolog SynMenu L.Latte:latte +SynMenu L.LC:lc SynMenu L.Ld\ script:ld SynMenu L.LDAP.LDIF:ldif SynMenu L.LDAP.Configuration:ldapconf +SynMenu L.Leex:leex SynMenu L.Less:less SynMenu L.Lex:lex +SynMenu L.Lf:lf SynMenu L.LFTP\ config:lftp SynMenu L.Libao:libao +SynMenu L.Lidris2:lidris2 SynMenu L.LifeLines\ script:lifelines SynMenu L.Lilo:lilo SynMenu L.Limits\ config:limits @@ -347,7 +421,11 @@ SynMenu L.Liquid:liquid SynMenu L.Lisp:lisp SynMenu L.Lite:lite SynMenu L.LiteStep\ RC:litestep +SynMenu L.Livebook:livebook +SynMenu L.LNK:lnk +SynMenu L.LNKMAP:lnkmap SynMenu L.Locale\ Input:fdcc +SynMenu L.Log:log SynMenu L.Login\.access:loginaccess SynMenu L.Login\.defs:logindefs SynMenu L.Logtalk:logtalk @@ -356,9 +434,14 @@ SynMenu L.LotusScript:lscript SynMenu L.Lout:lout SynMenu L.LPC:lpc SynMenu L.Lua:lua +SynMenu L.Luau:luau +SynMenu L.Lyrics:lyrics SynMenu L.Lynx\ Style:lss SynMenu L.Lynx\ config:lynx +SynMenu M.M17ndb:m17ndb +SynMenu M.M3build:m3build +SynMenu M.M3quake:m3quake SynMenu M.M4:m4 SynMenu M.MaGic\ Point:mgp SynMenu M.Mail:mail @@ -372,11 +455,15 @@ SynMenu M.Man\.conf:manconf SynMenu M.Maple\ V:maple SynMenu M.Markdown:markdown SynMenu M.Markdown\ with\ R\ statements:rmd +SynMenu M.Marko:marko SynMenu M.Mason:mason SynMenu M.Mathematica:mma SynMenu M.Matlab:matlab SynMenu M.Maxima:maxima +SynMenu M.Mbsync:mbsync +SynMenu M.Mediawiki:mediawiki SynMenu M.MEL\ (for\ Maya):mel +SynMenu M.Mermaid:mermaid SynMenu M.Meson:meson SynMenu M.Messages\ (/var/log):messages SynMenu M.Metafont:mf @@ -391,6 +478,7 @@ SynMenu M.Modula-2.R10\ (2010):modula2:r10 SynMenu M.Modula-2.ISO\ (1994):modula2:iso SynMenu M.Modula-2.PIM\ (1985):modula2:pim SynMenu M.Modula-3:modula3 +SynMenu M.Mojo:mojo SynMenu M.Monk:monk SynMenu M.Motorola\ S-Record:srec SynMenu M.Mplayer\ config:mplayerconf @@ -404,6 +492,7 @@ SynMenu M.MS-DOS/Windows.Module\ Definition:def SynMenu M.MS-DOS/Windows.Registry:registry SynMenu M.MS-DOS/Windows.Resource\ file:rc SynMenu M.Msql:msql +SynMenu M.Mss:mss SynMenu M.MuPAD:mupad SynMenu M.Murphi:murphi SynMenu M.MUSHcode:mush @@ -413,29 +502,45 @@ SynMenu NO.N1QL:n1ql SynMenu NO.Nanorc:nanorc SynMenu NO.Nastran\ input/DMAP:nastran SynMenu NO.Natural:natural -SynMenu NO.NeoMutt\ setup\ files:neomuttrc +SynMenu NO.NeoMutt.logfile:neomuttlog +SynMenu NO.NeoMutt.neomuttrc:neomuttrc SynMenu NO.Netrc:netrc +SynMenu NO.Nginx:nginx SynMenu NO.Ninja:ninja +SynMenu NO.Nix:nix SynMenu NO.Novell\ NCF\ batch:ncf SynMenu NO.Not\ Quite\ C\ (LEGO):nqc SynMenu NO.Nroff:nroff SynMenu NO.NSIS\ script:nsis +SynMenu NO.Nu:nu SynMenu NO.Obj\ 3D\ wavefront:obj SynMenu NO.Objective\ C:objc SynMenu NO.Objective\ C++:objcpp +SynMenu NO.Obse:obse SynMenu NO.OCAML:ocaml SynMenu NO.Occam:occam +SynMenu NO.Odin:odin SynMenu NO.Omnimark:omnimark +SynMenu NO.Ondir:ondir +SynMenu NO.Opam:opam +SynMenu NO.Opencl:opencl SynMenu NO.OpenROAD:openroad +SynMenu NO.OpenSCAD:openscad +SynMenu NO.OpenVPN:openvpn SynMenu NO.Open\ Psion\ Lang:opl SynMenu NO.Oracle\ config:ora +SynMenu NO.Org:org SynMenu PQ.Packet\ filter\ conf:pf +SynMenu PQ.Pacmanlog:pacmanlog SynMenu PQ.Palm\ resource\ compiler:pilrc SynMenu PQ.Pam\ config:pamconf +SynMenu PQ.Pam\ environment\ config\ file:pamenv +SynMenu PQ.Pandoc:pandoc SynMenu PQ.PApp:papp SynMenu PQ.Pascal:pascal SynMenu PQ.Password\ file:passwd +SynMenu PQ.Pbtxt:pbtxt SynMenu PQ.PCCTS:pccts SynMenu PQ.PDF:pdf SynMenu PQ.Perl.Perl:perl @@ -450,16 +555,22 @@ SynMenu PQ.PHP.Phtml\ (PHP\ 2):phtml SynMenu PQ.Pike:pike SynMenu PQ.Pine\ RC:pine SynMenu PQ.Pinfo\ RC:pinfo +SynMenu PQ.Pkl:pkl SynMenu PQ.PL/M:plm SynMenu PQ.PL/SQL:plsql SynMenu PQ.Pli:pli SynMenu PQ.PLP:plp SynMenu PQ.PO\ (GNU\ gettext):po +SynMenu PQ.Poefilter:poefilter +SynMenu PQ.Poke:poke SynMenu PQ.Postfix\ main\ config:pfmain SynMenu PQ.PostScript.PostScript:postscr SynMenu PQ.PostScript.PostScript\ Printer\ Description:ppd SynMenu PQ.Povray.Povray\ scene\ descr:pov SynMenu PQ.Povray.Povray\ configuration:povini +SynMenu PQ.Power\ Query\ M:pq +SynMenu PQ.PowerShell.PowerShell:ps1 +SynMenu PQ.PowerShell.XML:ps1xml SynMenu PQ.PPWizard:ppwiz SynMenu PQ.Prescribe\ (Kyocera):prescribe SynMenu PQ.Printcap:pcap @@ -469,20 +580,31 @@ SynMenu PQ.Product\ Spec\ File:psf SynMenu PQ.Progress:progress SynMenu PQ.Prolog:prolog SynMenu PQ.ProMeLa:promela +SynMenu PQ.Property\ Specification\ Language:psl SynMenu PQ.Proto:proto SynMenu PQ.Protocols:protocols +SynMenu PQ.Prql:prql +SynMenu PQ.Ptx:ptx SynMenu PQ.Purify\ log:purifylog SynMenu PQ.Pyrex:pyrex SynMenu PQ.Python:python +SynMenu PQ.Python2:python2 +SynMenu PQ.Python\ Manifest:pymanifest +SynMenu PQ.Qb64:qb64 +SynMenu PQ.QML:qml SynMenu PQ.Quake:quake +SynMenu PQ.Quarto:quarto SynMenu PQ.Quickfix\ window:qf SynMenu R.R.R:r SynMenu R.R.R\ help:rhelp SynMenu R.R.R\ noweb:rnoweb SynMenu R.Racc\ input:racc +SynMenu R.Racket:racket SynMenu R.Radiance:radiance SynMenu R.Raml:raml +SynMenu R.Rapid:rapid +SynMenu R.Rasi:rasi SynMenu R.Ratpoison:ratpoison SynMenu R.RCS.RCS\ log\ output:rcslog SynMenu R.RCS.RCS\ file:rcs @@ -495,6 +617,7 @@ SynMenu R.Remind:remind SynMenu R.Relax\ NG\ compact:rnc SynMenu R.Renderman.Renderman\ Shader\ Lang:sl SynMenu R.Renderman.Renderman\ Interface\ Bytestream:rib +SynMenu R.Requirements:requirements SynMenu R.Resolv\.conf:resolv SynMenu R.Reva\ Forth:reva SynMenu R.Rexx:rexx @@ -503,7 +626,8 @@ SynMenu R.RockLinux\ package\ desc\.:desc SynMenu R.Rpcgen:rpcgen SynMenu R.RPL/2:rpl SynMenu R.ReStructuredText:rst -SynMenu M.ReStructuredText\ with\ R\ statements:rrst +SynMenu R.ReStructuredText\ with\ R\ statements:rrst +SynMenu R.Routeros:routeros SynMenu R.RTF:rtf SynMenu R.Ruby:ruby SynMenu R.Rust:rust @@ -511,10 +635,12 @@ SynMenu R.Rust:rust SynMenu S-Sm.S-Lang:slang SynMenu S-Sm.Samba\ config:samba SynMenu S-Sm.SAS:sas +SynMenu S-Sm.Salt:salt SynMenu S-Sm.Sass:sass SynMenu S-Sm.Sather:sather SynMenu S-Sm.Sbt:sbt SynMenu S-Sm.Scala:scala +SynMenu S-Sm.Scdoc:scdoc SynMenu S-Sm.Scheme:scheme SynMenu S-Sm.Scilab:scilab SynMenu S-Sm.Screen\ RC:screen @@ -530,21 +656,26 @@ SynMenu S-Sm.Service\ Location\ registration:slpreg SynMenu S-Sm.Service\ Location\ SPI:slpspi SynMenu S-Sm.Services:services SynMenu S-Sm.Setserial\ config:setserial +SynMenu S-Sm.Sexplib:sexplib +SynMenu S-Sm.SGF:sgf SynMenu S-Sm.SGML.SGML\ catalog:catalog SynMenu S-Sm.SGML.SGML\ DTD:sgml SynMenu S-Sm.SGML.SGML\ Declaration:sgmldecl SynMenu S-Sm.SGML.SGML-linuxdoc:sgmllnx +SynMenu S-Sm.Shaderslang:shaderslang SynMenu S-Sm.Shell\ script.sh\ and\ ksh:sh SynMenu S-Sm.Shell\ script.csh:csh SynMenu S-Sm.Shell\ script.tcsh:tcsh SynMenu S-Sm.Shell\ script.zsh:zsh SynMenu S-Sm.SiCAD:sicad SynMenu S-Sm.Sieve:sieve +SynMenu S-Sm.Sil:sil SynMenu S-Sm.Simula:simula SynMenu S-Sm.Sinda.Sinda\ compare:sindacmp SynMenu S-Sm.Sinda.Sinda\ input:sinda SynMenu S-Sm.Sinda.Sinda\ output:sindaout SynMenu S-Sm.SiSU:sisu +SynMenu S-Sm.Skhd:skhd SynMenu S-Sm.SKILL.SKILL:skill SynMenu S-Sm.SKILL.SKILL\ for\ Diva:diva SynMenu S-Sm.Slice:slice @@ -561,6 +692,8 @@ SynMenu Sn-Sy.SNNS.SNNS\ pattern:snnspat SynMenu Sn-Sy.SNNS.SNNS\ result:snnsres SynMenu Sn-Sy.Snobol4:snobol4 SynMenu Sn-Sy.Snort\ Configuration:hog +SynMenu Sn-Sy.Solidity:solidity +SynMenu Sn-Sy.Spajson:spajson SynMenu Sn-Sy.SPEC\ (Linux\ RPM):spec SynMenu Sn-Sy.Specman:specman SynMenu Sn-Sy.Spice:spice @@ -568,6 +701,7 @@ SynMenu Sn-Sy.Spyce:spyce SynMenu Sn-Sy.Speedup:spup SynMenu Sn-Sy.Splint:splint SynMenu Sn-Sy.Squid\ config:squid +SynMenu Sn-Sy.Squirrel:squirrel SynMenu Sn-Sy.SQL.SAP\ HANA:sqlhana SynMenu Sn-Sy.SQL.ESQL-C:esqlc SynMenu Sn-Sy.SQL.MySQL:mysql @@ -579,17 +713,29 @@ SynMenu Sn-Sy.SQL.SQL\ Forms:sqlforms SynMenu Sn-Sy.SQL.SQLJ:sqlj SynMenu Sn-Sy.SQL.SQL-Informix:sqlinformix SynMenu Sn-Sy.SQR:sqr +SynMenu Sn-Sy.Srt:srt +SynMenu Sn-Sy.Ssa:ssa +SynMenu Sn-Sy.Ssh.ssh_allowedsigners:sshallowedsigners +SynMenu Sn-Sy.Ssh.ssh_authorizedkeys:sshauthorizedkeys SynMenu Sn-Sy.Ssh.ssh_config:sshconfig SynMenu Sn-Sy.Ssh.sshd_config:sshdconfig +SynMenu Sn-Sy.Ssh.ssh_knownhosts:sshknownhosts +SynMenu Sn-Sy.Ssh.ssh_publickey:sshpublickey SynMenu Sn-Sy.Standard\ ML:sml SynMenu Sn-Sy.Stata.SMCL:smcl SynMenu Sn-Sy.Stata.Stata:stata SynMenu Sn-Sy.Stored\ Procedures:stp SynMenu Sn-Sy.Strace:strace SynMenu Sn-Sy.Streaming\ descriptor\ file:sd +SynMenu Sn-Sy.Structurizr:structurizr +SynMenu Sn-Sy.Stylus:stylus SynMenu Sn-Sy.Subversion\ commit:svn SynMenu Sn-Sy.Sudoers:sudoers SynMenu Sn-Sy.SVG:svg +SynMenu Sn-Sy.Swayconfig:swayconfig +SynMenu Sn-Sy.Swift.Swift:swift +SynMenu Sn-Sy.Swift.GYB:swiftgyb +SynMenu Sn-Sy.Swig:swig SynMenu Sn-Sy.Symbian\ meta-makefile:mmp SynMenu Sn-Sy.Sysctl\.conf:sysctl SynMenu Sn-Sy.Systemd:systemd @@ -610,6 +756,7 @@ SynMenu T.Termcap/Printcap:ptcap SynMenu T.Terminfo:terminfo SynMenu T.Tera:tera SynMenu T.Tera\ Term:teraterm +SynMenu T.Terraform:terraform SynMenu T.TeX.TeX/LaTeX:tex SynMenu T.TeX.plain\ TeX:plaintex SynMenu T.TeX.Initex:initex @@ -617,9 +764,12 @@ SynMenu T.TeX.ConTeXt:context SynMenu T.TeX.TeX\ configuration:texmf SynMenu T.TeX.Texinfo:texinfo SynMenu T.TF\ mud\ client:tf +SynMenu T.Thrift:thrift +SynMenu T.Tiasm:tiasm SynMenu T.Tidy\ configuration:tidy SynMenu T.Tilde:tilde SynMenu T.Tmux\ configuration:tmux +SynMenu T.Tolk:tolk SynMenu T.TOML:toml SynMenu T.TPP:tpp SynMenu T.Trasys\ input:trasys @@ -630,15 +780,20 @@ SynMenu T.TSS.Geometry:tssgm SynMenu T.TSS.Optics:tssop SynMenu T.Typescript:typescript SynMenu T.TypescriptReact:typescriptreact +SynMenu T.Typst:typst +SynMenu UV.Uci:uci SynMenu UV.Udev\ config:udevconf SynMenu UV.Udev\ permissions:udevperm SynMenu UV.Udev\ rules:udevrules SynMenu UV.UIT/UIL:uil +SynMenu UV.Unison:unison SynMenu UV.UnrealScript:uc SynMenu UV.Updatedb\.conf:updatedb SynMenu UV.Upstart:upstart +SynMenu UV.URLShortcut:urlshortcut SynMenu UV.Valgrind:valgrind +SynMenu UV.VDF:vdf SynMenu UV.Vera:vera SynMenu UV.Verbose\ TAP\ Output:tap SynMenu UV.Verilog-AMS\ HDL:verilogams @@ -647,6 +802,7 @@ SynMenu UV.Vgrindefs:vgrindefs SynMenu UV.VHDL:vhdl SynMenu UV.Vim.Vim\ help\ file:help SynMenu UV.Vim.Vim\ script:vim +SynMenu UV.Vim.Vim\ tutor:tutor SynMenu UV.Vim.Viminfo\ file:viminfo SynMenu UV.Virata\ config:virata SynMenu UV.Visual\ Basic:vb @@ -655,6 +811,7 @@ SynMenu UV.VRML:vrml SynMenu UV.Vroom:vroom SynMenu UV.VSE\ JCL:vsejcl +SynMenu WXYZ.WDL:wdl SynMenu WXYZ.WEB.CWEB:cweb SynMenu WXYZ.WEB.WEB:web SynMenu WXYZ.WEB.WEB\ Changes:change @@ -663,16 +820,19 @@ SynMenu WXYZ.Webmacro:webmacro SynMenu WXYZ.Website\ MetaLanguage:wml SynMenu WXYZ.wDiff:wdiff SynMenu WXYZ.Wget\ config:wget +SynMenu WXYZ.Wget2:wget2 SynMenu WXYZ.Whitespace\ (add):whitespace +SynMenu WXYZ.Wks:wks SynMenu WXYZ.WildPackets\ EtherPeek\ Decoder:dcd SynMenu WXYZ.WinBatch/Webbatch:winbatch SynMenu WXYZ.Windows\ Scripting\ Host:wsh SynMenu WXYZ.WSML:wsml SynMenu WXYZ.WvDial:wvdial -SynMenu WXYZ.X\ Keyboard\ Extension:xkb -SynMenu WXYZ.X\ Pixmap:xpm -SynMenu WXYZ.X\ Pixmap\ (2):xpm2 -SynMenu WXYZ.X\ resources:xdefaults +SynMenu WXYZ.X.Compose:xcompose +SynMenu WXYZ.X.Keyboard\ Extension:xkb +SynMenu WXYZ.X.Pixmap:xpm +SynMenu WXYZ.X.Pixmap\ (2):xpm2 +SynMenu WXYZ.X.resources:xdefaults SynMenu WXYZ.XBL:xbl SynMenu WXYZ.Xinetd\.conf:xinetd SynMenu WXYZ.Xmodmap:xmodmap @@ -684,7 +844,10 @@ SynMenu WXYZ.Xslt:xslt SynMenu WXYZ.XFree86\ Config:xf86conf SynMenu WXYZ.YAML:yaml SynMenu WXYZ.Yacc:yacc +SynMenu WXYZ.Zathurarc:zathurarc +SynMenu WXYZ.ZIG:zig SynMenu WXYZ.Zimbu:zimbu +SynMenu WXYZ.Zir:zir SynMenu WXYZ.Zserio:zserio append(lnum, "") diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index 86272c1fd7..b744857ec3 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -2,7 +2,7 @@ " This file is normally sourced from menu.vim. " " Maintainer: The Vim Project -" Last Change: 2025 Aug 03 +" Last Change: 2025 Mar 09 " Former Maintainer: Bram Moolenaar " Define the SetSyn function, used for the Syntax menu entries. @@ -45,618 +45,781 @@ an 50.10.120 &Syntax.AB.ABAP/4 :cal SetSyn("abap") an 50.10.130 &Syntax.AB.Abaqus :cal SetSyn("abaqus") an 50.10.140 &Syntax.AB.ABC\ music\ notation :cal SetSyn("abc") an 50.10.150 &Syntax.AB.ABEL :cal SetSyn("abel") -an 50.10.160 &Syntax.AB.AceDB\ model :cal SetSyn("acedb") -an 50.10.170 &Syntax.AB.Ada :cal SetSyn("ada") -an 50.10.180 &Syntax.AB.AfLex :cal SetSyn("aflex") -an 50.10.190 &Syntax.AB.ALSA\ config :cal SetSyn("alsaconf") -an 50.10.200 &Syntax.AB.Altera\ AHDL :cal SetSyn("ahdl") -an 50.10.210 &Syntax.AB.Amiga\ DOS :cal SetSyn("amiga") -an 50.10.220 &Syntax.AB.AMPL :cal SetSyn("ampl") -an 50.10.230 &Syntax.AB.Ant\ build\ file :cal SetSyn("ant") -an 50.10.240 &Syntax.AB.ANTLR :cal SetSyn("antlr") -an 50.10.250 &Syntax.AB.Apache\ config :cal SetSyn("apache") -an 50.10.260 &Syntax.AB.Apache-style\ config :cal SetSyn("apachestyle") -an 50.10.270 &Syntax.AB.Applix\ ELF :cal SetSyn("elf") -an 50.10.280 &Syntax.AB.APT\ config :cal SetSyn("aptconf") -an 50.10.290 &Syntax.AB.Arc\ Macro\ Language :cal SetSyn("aml") -an 50.10.300 &Syntax.AB.Arch\ inventory :cal SetSyn("arch") -an 50.10.310 &Syntax.AB.Arduino :cal SetSyn("arduino") -an 50.10.320 &Syntax.AB.ART :cal SetSyn("art") -an 50.10.330 &Syntax.AB.Ascii\ Doc :cal SetSyn("asciidoc") -an 50.10.340 &Syntax.AB.ASP\ with\ VBScript :cal SetSyn("aspvbs") -an 50.10.350 &Syntax.AB.ASP\ with\ Perl :cal SetSyn("aspperl") -an 50.10.360 &Syntax.AB.Assembly.680x0 :cal SetSyn("asm68k") -an 50.10.370 &Syntax.AB.Assembly.AVR :cal SetSyn("avra") -an 50.10.380 &Syntax.AB.Assembly.Flat :cal SetSyn("fasm") -an 50.10.390 &Syntax.AB.Assembly.GNU :cal SetSyn("asm") -an 50.10.400 &Syntax.AB.Assembly.GNU\ H-8300 :cal SetSyn("asmh8300") -an 50.10.410 &Syntax.AB.Assembly.Intel\ IA-64 :cal SetSyn("ia64") -an 50.10.420 &Syntax.AB.Assembly.Microsoft :cal SetSyn("masm") -an 50.10.430 &Syntax.AB.Assembly.Netwide :cal SetSyn("nasm") -an 50.10.440 &Syntax.AB.Assembly.PIC :cal SetSyn("pic") -an 50.10.450 &Syntax.AB.Assembly.Turbo :cal SetSyn("tasm") -an 50.10.460 &Syntax.AB.Assembly.VAX\ Macro\ Assembly :cal SetSyn("vmasm") -an 50.10.470 &Syntax.AB.Assembly.Z-80 :cal SetSyn("z8a") -an 50.10.480 &Syntax.AB.Assembly.xa\ 6502\ cross\ assembler :cal SetSyn("a65") -an 50.10.490 &Syntax.AB.ASN\.1 :cal SetSyn("asn") -an 50.10.500 &Syntax.AB.Asterisk\ config :cal SetSyn("asterisk") -an 50.10.510 &Syntax.AB.Asterisk\ voicemail\ config :cal SetSyn("asteriskvm") -an 50.10.520 &Syntax.AB.Atlas :cal SetSyn("atlas") -an 50.10.530 &Syntax.AB.Autodoc :cal SetSyn("autodoc") -an 50.10.540 &Syntax.AB.AutoHotKey :cal SetSyn("autohotkey") -an 50.10.550 &Syntax.AB.AutoIt :cal SetSyn("autoit") -an 50.10.560 &Syntax.AB.Automake :cal SetSyn("automake") -an 50.10.570 &Syntax.AB.Avenue :cal SetSyn("ave") -an 50.10.580 &Syntax.AB.Awk :cal SetSyn("awk") -an 50.10.590 &Syntax.AB.AYacc :cal SetSyn("ayacc") -an 50.10.610 &Syntax.AB.B :cal SetSyn("b") -an 50.10.620 &Syntax.AB.Baan :cal SetSyn("baan") -an 50.10.630 &Syntax.AB.Bash :cal SetSyn("bash") -an 50.10.640 &Syntax.AB.Basic.FreeBasic :cal SetSyn("freebasic") -an 50.10.650 &Syntax.AB.Basic.IBasic :cal SetSyn("ibasic") -an 50.10.660 &Syntax.AB.Basic.QBasic :cal SetSyn("basic") -an 50.10.670 &Syntax.AB.Basic.Visual\ Basic :cal SetSyn("vb") -an 50.10.680 &Syntax.AB.Bazaar\ commit\ file :cal SetSyn("bzr") -an 50.10.690 &Syntax.AB.Bazel :cal SetSyn("bzl") -an 50.10.700 &Syntax.AB.BC\ calculator :cal SetSyn("bc") -an 50.10.710 &Syntax.AB.BDF\ font :cal SetSyn("bdf") -an 50.10.720 &Syntax.AB.BibTeX.Bibliography\ database :cal SetSyn("bib") -an 50.10.730 &Syntax.AB.BibTeX.Bibliography\ Style :cal SetSyn("bst") -an 50.10.740 &Syntax.AB.BIND.BIND\ config :cal SetSyn("named") -an 50.10.750 &Syntax.AB.BIND.BIND\ zone :cal SetSyn("bindzone") -an 50.10.760 &Syntax.AB.Blank :cal SetSyn("blank") +an 50.10.160 &Syntax.AB.ABNF :cal SetSyn("abnf") +an 50.10.170 &Syntax.AB.AceDB\ model :cal SetSyn("acedb") +an 50.10.180 &Syntax.AB.Ada :cal SetSyn("ada") +an 50.10.190 &Syntax.AB.AfLex :cal SetSyn("aflex") +an 50.10.200 &Syntax.AB.Aidl :cal SetSyn("aidl") +an 50.10.210 &Syntax.AB.Algol68 :cal SetSyn("algol68") +an 50.10.220 &Syntax.AB.ALSA\ config :cal SetSyn("alsaconf") +an 50.10.230 &Syntax.AB.Altera\ AHDL :cal SetSyn("ahdl") +an 50.10.240 &Syntax.AB.Amiga\ DOS :cal SetSyn("amiga") +an 50.10.250 &Syntax.AB.AMPL :cal SetSyn("ampl") +an 50.10.260 &Syntax.AB.Ant\ build\ file :cal SetSyn("ant") +an 50.10.270 &Syntax.AB.ANTLR :cal SetSyn("antlr") +an 50.10.280 &Syntax.AB.ANTLR4 :cal SetSyn("antlr4") +an 50.10.290 &Syntax.AB.Apache\ config :cal SetSyn("apache") +an 50.10.300 &Syntax.AB.Apache-style\ config :cal SetSyn("apachestyle") +an 50.10.310 &Syntax.AB.Apkbuild :cal SetSyn("apkbuild") +an 50.10.320 &Syntax.AB.Applix\ ELF :cal SetSyn("elf") +an 50.10.330 &Syntax.AB.APT\ config :cal SetSyn("aptconf") +an 50.10.340 &Syntax.AB.Arc\ Macro\ Language :cal SetSyn("aml") +an 50.10.350 &Syntax.AB.Arch\ inventory :cal SetSyn("arch") +an 50.10.360 &Syntax.AB.Arduino :cal SetSyn("arduino") +an 50.10.370 &Syntax.AB.ART :cal SetSyn("art") +an 50.10.380 &Syntax.AB.Ascii\ Doc :cal SetSyn("asciidoc") +an 50.10.390 &Syntax.AB.ASP\ with\ VBScript :cal SetSyn("aspvbs") +an 50.10.400 &Syntax.AB.ASP\ with\ Perl :cal SetSyn("aspperl") +an 50.10.410 &Syntax.AB.Assembly.680x0 :cal SetSyn("asm68k") +an 50.10.420 &Syntax.AB.Assembly.AVR :cal SetSyn("avra") +an 50.10.430 &Syntax.AB.Assembly.Flat :cal SetSyn("fasm") +an 50.10.440 &Syntax.AB.Assembly.GNU :cal SetSyn("asm") +an 50.10.450 &Syntax.AB.Assembly.GNU\ H-8300 :cal SetSyn("asmh8300") +an 50.10.460 &Syntax.AB.Assembly.Intel\ IA-64 :cal SetSyn("ia64") +an 50.10.470 &Syntax.AB.Assembly.Microsoft :cal SetSyn("masm") +an 50.10.480 &Syntax.AB.Assembly.Netwide :cal SetSyn("nasm") +an 50.10.490 &Syntax.AB.Assembly.PIC :cal SetSyn("pic") +an 50.10.500 &Syntax.AB.Assembly.Turbo :cal SetSyn("tasm") +an 50.10.510 &Syntax.AB.Assembly.VAX\ Macro\ Assembly :cal SetSyn("vmasm") +an 50.10.520 &Syntax.AB.Assembly.Z-80 :cal SetSyn("z8a") +an 50.10.530 &Syntax.AB.Assembly.xa\ 6502\ cross\ assembler :cal SetSyn("a65") +an 50.10.540 &Syntax.AB.ASN\.1 :cal SetSyn("asn") +an 50.10.550 &Syntax.AB.Asterisk\ config :cal SetSyn("asterisk") +an 50.10.560 &Syntax.AB.Asterisk\ voicemail\ config :cal SetSyn("asteriskvm") +an 50.10.570 &Syntax.AB.Astro :cal SetSyn("astro") +an 50.10.580 &Syntax.AB.Asy :cal SetSyn("asy") +an 50.10.590 &Syntax.AB.Atlas :cal SetSyn("atlas") +an 50.10.600 &Syntax.AB.Autodoc :cal SetSyn("autodoc") +an 50.10.610 &Syntax.AB.AutoHotKey :cal SetSyn("autohotkey") +an 50.10.620 &Syntax.AB.AutoIt :cal SetSyn("autoit") +an 50.10.630 &Syntax.AB.Automake :cal SetSyn("automake") +an 50.10.640 &Syntax.AB.Autopkgtest :cal SetSyn("autopkgtest") +an 50.10.650 &Syntax.AB.Avenue :cal SetSyn("ave") +an 50.10.660 &Syntax.AB.Awk :cal SetSyn("awk") +an 50.10.670 &Syntax.AB.AYacc :cal SetSyn("ayacc") +an 50.10.690 &Syntax.AB.B :cal SetSyn("b") +an 50.10.700 &Syntax.AB.Baan :cal SetSyn("baan") +an 50.10.710 &Syntax.AB.Bash :cal SetSyn("bash") +an 50.10.720 &Syntax.AB.Basic.FreeBasic :cal SetSyn("freebasic") +an 50.10.730 &Syntax.AB.Basic.IBasic :cal SetSyn("ibasic") +an 50.10.740 &Syntax.AB.Basic.QBasic :cal SetSyn("basic") +an 50.10.750 &Syntax.AB.Basic.Visual\ Basic :cal SetSyn("vb") +an 50.10.760 &Syntax.AB.Bazaar\ commit\ file :cal SetSyn("bzr") +an 50.10.770 &Syntax.AB.Bazel :cal SetSyn("bzl") +an 50.10.780 &Syntax.AB.BC\ calculator :cal SetSyn("bc") +an 50.10.790 &Syntax.AB.BDF\ font :cal SetSyn("bdf") +an 50.10.800 &Syntax.AB.Beancount :cal SetSyn("beancount") +an 50.10.810 &Syntax.AB.BibTeX.Bibliography\ database :cal SetSyn("bib") +an 50.10.820 &Syntax.AB.BibTeX.Bibliography\ Style :cal SetSyn("bst") +an 50.10.830 &Syntax.AB.BIND.BIND\ config :cal SetSyn("named") +an 50.10.840 &Syntax.AB.BIND.BIND\ zone :cal SetSyn("bindzone") +an 50.10.850 &Syntax.AB.Bitbake :cal SetSyn("bitbake") +an 50.10.860 &Syntax.AB.Blank :cal SetSyn("blank") +an 50.10.870 &Syntax.AB.Bpftrace :cal SetSyn("bpftrace") +an 50.10.880 &Syntax.AB.Bsdl :cal SetSyn("bsdl") an 50.20.100 &Syntax.C.C :cal SetSyn("c") an 50.20.110 &Syntax.C.C++ :cal SetSyn("cpp") an 50.20.120 &Syntax.C.C# :cal SetSyn("cs") an 50.20.130 &Syntax.C.Cabal\ Haskell\ build\ file :cal SetSyn("cabal") -an 50.20.140 &Syntax.C.Calendar :cal SetSyn("calendar") -an 50.20.150 &Syntax.C.Cangjie :cal SetSyn("cangjie") -an 50.20.160 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css") -an 50.20.170 &Syntax.C.CDL :cal SetSyn("cdl") -an 50.20.180 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc") -an 50.20.190 &Syntax.C.Cdrdao\ config :cal SetSyn("cdrdaoconf") -an 50.20.200 &Syntax.C.Century\ Term :cal SetSyn("cterm") -an 50.20.210 &Syntax.C.CH\ script :cal SetSyn("ch") -an 50.20.220 &Syntax.C.ChaiScript :cal SetSyn("chaiscript") -an 50.20.230 &Syntax.C.ChangeLog :cal SetSyn("changelog") -an 50.20.240 &Syntax.C.CHILL :cal SetSyn("chill") -an 50.20.250 &Syntax.C.Cheetah\ template :cal SetSyn("cheetah") -an 50.20.260 &Syntax.C.Chicken :cal SetSyn("chicken") -an 50.20.270 &Syntax.C.ChordPro :cal SetSyn("chordpro") -an 50.20.280 &Syntax.C.Clean :cal SetSyn("clean") -an 50.20.290 &Syntax.C.Clever :cal SetSyn("cl") -an 50.20.300 &Syntax.C.Clipper :cal SetSyn("clipper") -an 50.20.310 &Syntax.C.Clojure :cal SetSyn("clojure") -an 50.20.320 &Syntax.C.Cmake :cal SetSyn("cmake") -an 50.20.330 &Syntax.C.Cmod :cal SetSyn("cmod") -an 50.20.340 &Syntax.C.Cmusrc :cal SetSyn("cmusrc") -an 50.20.350 &Syntax.C.Cobol :cal SetSyn("cobol") -an 50.20.360 &Syntax.C.Coco/R :cal SetSyn("coco") -an 50.20.370 &Syntax.C.Cold\ Fusion :cal SetSyn("cf") -an 50.20.380 &Syntax.C.Conary\ Recipe :cal SetSyn("conaryrecipe") -an 50.20.390 &Syntax.C.Config.Cfg\ Config\ file :cal SetSyn("cfg") -an 50.20.400 &Syntax.C.Config.Configure\.in :cal SetSyn("config") -an 50.20.410 &Syntax.C.Config.Generic\ Config\ file :cal SetSyn("conf") -an 50.20.420 &Syntax.C.CRM114 :cal SetSyn("crm") -an 50.20.430 &Syntax.C.Crontab :cal SetSyn("crontab") -an 50.20.440 &Syntax.C.CSDL :cal SetSyn("csdl") -an 50.20.450 &Syntax.C.CSP :cal SetSyn("csp") -an 50.20.460 &Syntax.C.Ctrl-H :cal SetSyn("ctrlh") -an 50.20.470 &Syntax.C.Cucumber :cal SetSyn("cucumber") -an 50.20.480 &Syntax.C.CUDA :cal SetSyn("cuda") -an 50.20.490 &Syntax.C.CUPL.CUPL :cal SetSyn("cupl") -an 50.20.500 &Syntax.C.CUPL.Simulation :cal SetSyn("cuplsim") -an 50.20.510 &Syntax.C.CVS.commit\ file :cal SetSyn("cvs") -an 50.20.520 &Syntax.C.CVS.cvsrc :cal SetSyn("cvsrc") -an 50.20.530 &Syntax.C.Cyn++ :cal SetSyn("cynpp") -an 50.20.540 &Syntax.C.Cynlib :cal SetSyn("cynlib") +an 50.20.140 &Syntax.C.Cabal\ Config :cal SetSyn("cabalconfig") +an 50.20.150 &Syntax.C.Cabal\ Project :cal SetSyn("cabalproject") +an 50.20.160 &Syntax.C.Calendar :cal SetSyn("calendar") +an 50.20.170 &Syntax.C.Cangjie :cal SetSyn("cangjie") +an 50.20.180 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css") +an 50.20.190 &Syntax.C.CDL :cal SetSyn("cdl") +an 50.20.200 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc") +an 50.20.210 &Syntax.C.Cdrdao\ config :cal SetSyn("cdrdaoconf") +an 50.20.220 &Syntax.C.Century\ Term :cal SetSyn("cterm") +an 50.20.230 &Syntax.C.Cgdbrc :cal SetSyn("cgdbrc") +an 50.20.240 &Syntax.C.CH\ script :cal SetSyn("ch") +an 50.20.250 &Syntax.C.Chatito :cal SetSyn("chatito") +an 50.20.260 &Syntax.C.ChaiScript :cal SetSyn("chaiscript") +an 50.20.270 &Syntax.C.ChangeLog :cal SetSyn("changelog") +an 50.20.280 &Syntax.C.CHILL :cal SetSyn("chill") +an 50.20.290 &Syntax.C.Cheetah\ template :cal SetSyn("cheetah") +an 50.20.300 &Syntax.C.Chicken :cal SetSyn("chicken") +an 50.20.310 &Syntax.C.ChordPro :cal SetSyn("chordpro") +an 50.20.320 &Syntax.C.Chuck :cal SetSyn("chuck") +an 50.20.330 &Syntax.C.Clean :cal SetSyn("clean") +an 50.20.340 &Syntax.C.Clever :cal SetSyn("cl") +an 50.20.350 &Syntax.C.Clipper :cal SetSyn("clipper") +an 50.20.360 &Syntax.C.Clojure :cal SetSyn("clojure") +an 50.20.370 &Syntax.C.Cmacro :cal SetSyn("cmacro") +an 50.20.380 &Syntax.C.Cmake :cal SetSyn("cmake") +an 50.20.390 &Syntax.C.Cmake\ Cache\ file :cal SetSyn("cmakecache") +an 50.20.400 &Syntax.C.Cmod :cal SetSyn("cmod") +an 50.20.410 &Syntax.C.Cmusrc :cal SetSyn("cmusrc") +an 50.20.420 &Syntax.C.Cobol :cal SetSyn("cobol") +an 50.20.430 &Syntax.C.Coco/R :cal SetSyn("coco") +an 50.20.440 &Syntax.C.Codeowners :cal SetSyn("codeowners") +an 50.20.450 &Syntax.C.Cold\ Fusion :cal SetSyn("cf") +an 50.20.460 &Syntax.C.Conary\ Recipe :cal SetSyn("conaryrecipe") +an 50.20.470 &Syntax.C.Config.Cfg\ Config\ file :cal SetSyn("cfg") +an 50.20.480 &Syntax.C.Config.Configure\.in :cal SetSyn("config") +an 50.20.490 &Syntax.C.Config.Generic\ Config\ file :cal SetSyn("conf") +an 50.20.500 &Syntax.C.Confini :cal SetSyn("confini") +an 50.20.510 &Syntax.C.CRM114 :cal SetSyn("crm") +an 50.20.520 &Syntax.C.Crontab :cal SetSyn("crontab") +an 50.20.530 &Syntax.C.CSDL :cal SetSyn("csdl") +an 50.20.540 &Syntax.C.CSP :cal SetSyn("csp") +an 50.20.550 &Syntax.C.CSV.CSV :cal SetSyn("csv") +an 50.20.560 &Syntax.C.CSV.TSV :cal SetSyn("tsv") +an 50.20.570 &Syntax.C.Ctrl-H :cal SetSyn("ctrlh") +an 50.20.580 &Syntax.C.Cucumber :cal SetSyn("cucumber") +an 50.20.590 &Syntax.C.CUDA :cal SetSyn("cuda") +an 50.20.600 &Syntax.C.CUPL.CUPL :cal SetSyn("cupl") +an 50.20.610 &Syntax.C.CUPL.Simulation :cal SetSyn("cuplsim") +an 50.20.620 &Syntax.C.CVS.commit\ file :cal SetSyn("cvs") +an 50.20.630 &Syntax.C.CVS.cvsrc :cal SetSyn("cvsrc") +an 50.20.640 &Syntax.C.Cyn++ :cal SetSyn("cynpp") +an 50.20.650 &Syntax.C.Cynlib :cal SetSyn("cynlib") an 50.30.100 &Syntax.DE.D :cal SetSyn("d") an 50.30.110 &Syntax.DE.Dart :cal SetSyn("dart") an 50.30.120 &Syntax.DE.Datascript :cal SetSyn("datascript") -an 50.30.130 &Syntax.DE.Debian.Debian\ ChangeLog :cal SetSyn("debchangelog") -an 50.30.140 &Syntax.DE.Debian.Debian\ Control :cal SetSyn("debcontrol") -an 50.30.150 &Syntax.DE.Debian.Debian\ Copyright :cal SetSyn("debcopyright") -an 50.30.160 &Syntax.DE.Debian.Debian\ Sources\.list :cal SetSyn("debsources") -an 50.30.170 &Syntax.DE.Denyhosts :cal SetSyn("denyhosts") -an 50.30.180 &Syntax.DE.Desktop :cal SetSyn("desktop") -an 50.30.190 &Syntax.DE.Dict\ config :cal SetSyn("dictconf") -an 50.30.200 &Syntax.DE.Dictd\ config :cal SetSyn("dictdconf") -an 50.30.210 &Syntax.DE.Diff :cal SetSyn("diff") -an 50.30.220 &Syntax.DE.Digital\ Command\ Lang :cal SetSyn("dcl") -an 50.30.230 &Syntax.DE.Dircolors :cal SetSyn("dircolors") -an 50.30.240 &Syntax.DE.Dirpager :cal SetSyn("dirpager") -an 50.30.250 &Syntax.DE.Django\ template :cal SetSyn("django") -an 50.30.260 &Syntax.DE.DNS/BIND\ zone :cal SetSyn("bindzone") -an 50.30.270 &Syntax.DE.Dnsmasq\ config :cal SetSyn("dnsmasq") -an 50.30.280 &Syntax.DE.DocBook.auto-detect :cal SetSyn("docbk") -an 50.30.290 &Syntax.DE.DocBook.SGML :cal SetSyn("docbksgml") -an 50.30.300 &Syntax.DE.DocBook.XML :cal SetSyn("docbkxml") -an 50.30.310 &Syntax.DE.Dockerfile :cal SetSyn("dockerfile") -an 50.30.320 &Syntax.DE.Dot :cal SetSyn("dot") -an 50.30.330 &Syntax.DE.Doxygen.C\ with\ doxygen :cal SetSyn("c.doxygen") -an 50.30.340 &Syntax.DE.Doxygen.C++\ with\ doxygen :cal SetSyn("cpp.doxygen") -an 50.30.350 &Syntax.DE.Doxygen.IDL\ with\ doxygen :cal SetSyn("idl.doxygen") -an 50.30.360 &Syntax.DE.Doxygen.Java\ with\ doxygen :cal SetSyn("java.doxygen") -an 50.30.370 &Syntax.DE.Doxygen.DataScript\ with\ doxygen :cal SetSyn("datascript.doxygen") -an 50.30.380 &Syntax.DE.Dracula :cal SetSyn("dracula") -an 50.30.390 &Syntax.DE.DSSSL :cal SetSyn("dsl") -an 50.30.400 &Syntax.DE.DTD :cal SetSyn("dtd") -an 50.30.410 &Syntax.DE.DTML\ (Zope) :cal SetSyn("dtml") -an 50.30.420 &Syntax.DE.DTrace :cal SetSyn("dtrace") -an 50.30.430 &Syntax.DE.Dts/dtsi :cal SetSyn("dts") -an 50.30.440 &Syntax.DE.Dune :cal SetSyn("dune") -an 50.30.450 &Syntax.DE.Dylan.Dylan :cal SetSyn("dylan") -an 50.30.460 &Syntax.DE.Dylan.Dylan\ interface :cal SetSyn("dylanintr") -an 50.30.470 &Syntax.DE.Dylan.Dylan\ lid :cal SetSyn("dylanlid") -an 50.30.490 &Syntax.DE.EDIF :cal SetSyn("edif") -an 50.30.500 &Syntax.DE.Ed :cal SetSyn("ed") -an 50.30.510 &Syntax.DE.Eiffel :cal SetSyn("eiffel") -an 50.30.520 &Syntax.DE.Eight :cal SetSyn("8th") -an 50.30.530 &Syntax.DE.Elinks\ config :cal SetSyn("elinks") -an 50.30.540 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt") -an 50.30.550 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd") -an 50.30.560 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang") -an 50.30.570 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc") -an 50.30.580 &Syntax.DE.ESQL-C :cal SetSyn("esqlc") -an 50.30.590 &Syntax.DE.Essbase\ script :cal SetSyn("csc") -an 50.30.600 &Syntax.DE.Esterel :cal SetSyn("esterel") -an 50.30.610 &Syntax.DE.Eterm\ config :cal SetSyn("eterm") -an 50.30.620 &Syntax.DE.Euphoria\ 3 :cal SetSyn("euphoria3") -an 50.30.630 &Syntax.DE.Euphoria\ 4 :cal SetSyn("euphoria4") -an 50.30.640 &Syntax.DE.Eviews :cal SetSyn("eviews") -an 50.30.650 &Syntax.DE.Exim\ conf :cal SetSyn("exim") -an 50.30.660 &Syntax.DE.Expect :cal SetSyn("expect") -an 50.30.670 &Syntax.DE.Exports :cal SetSyn("exports") +an 50.30.130 &Syntax.DE.Dax :cal SetSyn("dax") +an 50.30.140 &Syntax.DE.Debian.Debian\ 822sources :cal SetSyn("deb822sources") +an 50.30.150 &Syntax.DE.Debian.Debian\ ChangeLog :cal SetSyn("debchangelog") +an 50.30.160 &Syntax.DE.Debian.Debian\ Control :cal SetSyn("debcontrol") +an 50.30.170 &Syntax.DE.Debian.Debian\ Copyright :cal SetSyn("debcopyright") +an 50.30.180 &Syntax.DE.Debian.Debian\ Sources\.list :cal SetSyn("debsources") +an 50.30.190 &Syntax.DE.Denyhosts :cal SetSyn("denyhosts") +an 50.30.200 &Syntax.DE.Dep3patch :cal SetSyn("dep3patch") +an 50.30.210 &Syntax.DE.Desktop :cal SetSyn("desktop") +an 50.30.220 &Syntax.DE.Dict\ config :cal SetSyn("dictconf") +an 50.30.230 &Syntax.DE.Dictd\ config :cal SetSyn("dictdconf") +an 50.30.240 &Syntax.DE.Diff :cal SetSyn("diff") +an 50.30.250 &Syntax.DE.Digital\ Command\ Lang :cal SetSyn("dcl") +an 50.30.260 &Syntax.DE.Dircolors :cal SetSyn("dircolors") +an 50.30.270 &Syntax.DE.Dirpager :cal SetSyn("dirpager") +an 50.30.280 &Syntax.DE.Django\ template :cal SetSyn("django") +an 50.30.290 &Syntax.DE.DNS/BIND\ zone :cal SetSyn("bindzone") +an 50.30.300 &Syntax.DE.Dns :cal SetSyn("dns") +an 50.30.310 &Syntax.DE.Dnsmasq\ config :cal SetSyn("dnsmasq") +an 50.30.320 &Syntax.DE.DocBook.auto-detect :cal SetSyn("docbk") +an 50.30.330 &Syntax.DE.DocBook.SGML :cal SetSyn("docbksgml") +an 50.30.340 &Syntax.DE.DocBook.XML :cal SetSyn("docbkxml") +an 50.30.350 &Syntax.DE.Dockerfile :cal SetSyn("dockerfile") +an 50.30.360 &Syntax.DE.Dot :cal SetSyn("dot") +an 50.30.370 &Syntax.DE.Doxygen.C\ with\ doxygen :cal SetSyn("c.doxygen") +an 50.30.380 &Syntax.DE.Doxygen.C++\ with\ doxygen :cal SetSyn("cpp.doxygen") +an 50.30.390 &Syntax.DE.Doxygen.IDL\ with\ doxygen :cal SetSyn("idl.doxygen") +an 50.30.400 &Syntax.DE.Doxygen.Java\ with\ doxygen :cal SetSyn("java.doxygen") +an 50.30.410 &Syntax.DE.Doxygen.DataScript\ with\ doxygen :cal SetSyn("datascript.doxygen") +an 50.30.420 &Syntax.DE.Dracula :cal SetSyn("dracula") +an 50.30.430 &Syntax.DE.DSSSL :cal SetSyn("dsl") +an 50.30.440 &Syntax.DE.DTD :cal SetSyn("dtd") +an 50.30.450 &Syntax.DE.DTML\ (Zope) :cal SetSyn("dtml") +an 50.30.460 &Syntax.DE.DTrace :cal SetSyn("dtrace") +an 50.30.470 &Syntax.DE.Dts/dtsi :cal SetSyn("dts") +an 50.30.480 &Syntax.DE.Dune :cal SetSyn("dune") +an 50.30.490 &Syntax.DE.Dylan.Dylan :cal SetSyn("dylan") +an 50.30.500 &Syntax.DE.Dylan.Dylan\ interface :cal SetSyn("dylanintr") +an 50.30.510 &Syntax.DE.Dylan.Dylan\ lid :cal SetSyn("dylanlid") +an 50.30.530 &Syntax.DE.EDIF :cal SetSyn("edif") +an 50.30.540 &Syntax.DE.Ed :cal SetSyn("ed") +an 50.30.550 &Syntax.DE.Editorconfig :cal SetSyn("editorconfig") +an 50.30.560 &Syntax.DE.Eiffel :cal SetSyn("eiffel") +an 50.30.570 &Syntax.DE.Eight :cal SetSyn("8th") +an 50.30.580 &Syntax.DE.Elinks\ config :cal SetSyn("elinks") +an 50.30.590 &Syntax.DE.Elm :cal SetSyn("elm") +an 50.30.600 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt") +an 50.30.610 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd") +an 50.30.620 &Syntax.DE.ENV :cal SetSyn("env") +an 50.30.630 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang") +an 50.30.640 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc") +an 50.30.650 &Syntax.DE.ESQL-C :cal SetSyn("esqlc") +an 50.30.660 &Syntax.DE.Essbase\ script :cal SetSyn("csc") +an 50.30.670 &Syntax.DE.Esterel :cal SetSyn("esterel") +an 50.30.680 &Syntax.DE.Eterm\ config :cal SetSyn("eterm") +an 50.30.690 &Syntax.DE.Euphoria\ 3 :cal SetSyn("euphoria3") +an 50.30.700 &Syntax.DE.Euphoria\ 4 :cal SetSyn("euphoria4") +an 50.30.710 &Syntax.DE.Eviews :cal SetSyn("eviews") +an 50.30.720 &Syntax.DE.Exim\ conf :cal SetSyn("exim") +an 50.30.730 &Syntax.DE.Expect :cal SetSyn("expect") +an 50.30.740 &Syntax.DE.Exports :cal SetSyn("exports") an 50.40.100 &Syntax.FG.Falcon :cal SetSyn("falcon") an 50.40.110 &Syntax.FG.Fantom :cal SetSyn("fan") an 50.40.120 &Syntax.FG.Fetchmail :cal SetSyn("fetchmail") -an 50.40.130 &Syntax.FG.FlexWiki :cal SetSyn("flexwiki") -an 50.40.140 &Syntax.FG.Focus\ Executable :cal SetSyn("focexec") -an 50.40.150 &Syntax.FG.Focus\ Master :cal SetSyn("master") -an 50.40.160 &Syntax.FG.FORM :cal SetSyn("form") -an 50.40.170 &Syntax.FG.Forth :cal SetSyn("forth") -an 50.40.180 &Syntax.FG.Fortran :cal SetSyn("fortran") -an 50.40.190 &Syntax.FG.FoxPro :cal SetSyn("foxpro") -an 50.40.200 &Syntax.FG.FrameScript :cal SetSyn("framescript") -an 50.40.210 &Syntax.FG.Fstab :cal SetSyn("fstab") -an 50.40.220 &Syntax.FG.Fvwm.Fvwm\ configuration :cal SetSyn("fvwm1") -an 50.40.230 &Syntax.FG.Fvwm.Fvwm2\ configuration :cal SetSyn("fvwm2") -an 50.40.240 &Syntax.FG.Fvwm.Fvwm2\ configuration\ with\ M4 :cal SetSyn("fvwm2m4") -an 50.40.260 &Syntax.FG.GDB\ command\ file :cal SetSyn("gdb") -an 50.40.270 &Syntax.FG.GDMO :cal SetSyn("gdmo") -an 50.40.280 &Syntax.FG.Gedcom :cal SetSyn("gedcom") -an 50.40.290 &Syntax.FG.Git.Output :cal SetSyn("git") -an 50.40.300 &Syntax.FG.Git.Commit :cal SetSyn("gitcommit") -an 50.40.310 &Syntax.FG.Git.Config :cal SetSyn("gitconfig") -an 50.40.320 &Syntax.FG.Git.Rebase :cal SetSyn("gitrebase") -an 50.40.330 &Syntax.FG.Git.Send\ Email :cal SetSyn("gitsendemail") -an 50.40.340 &Syntax.FG.Gitolite :cal SetSyn("gitolite") -an 50.40.350 &Syntax.FG.Gkrellmrc :cal SetSyn("gkrellmrc") -an 50.40.360 &Syntax.FG.Gnash :cal SetSyn("gnash") -an 50.40.370 &Syntax.FG.Go :cal SetSyn("go") -an 50.40.380 &Syntax.FG.Godoc :cal SetSyn("godoc") -an 50.40.390 &Syntax.FG.GP :cal SetSyn("gp") -an 50.40.400 &Syntax.FG.GPG :cal SetSyn("gpg") -an 50.40.410 &Syntax.FG.Grof :cal SetSyn("gprof") -an 50.40.420 &Syntax.FG.Group\ file :cal SetSyn("group") -an 50.40.430 &Syntax.FG.Grub :cal SetSyn("grub") -an 50.40.440 &Syntax.FG.GNU\ Server\ Pages :cal SetSyn("gsp") -an 50.40.450 &Syntax.FG.GNUplot :cal SetSyn("gnuplot") -an 50.40.460 &Syntax.FG.GrADS\ scripts :cal SetSyn("grads") -an 50.40.470 &Syntax.FG.Gretl :cal SetSyn("gretl") -an 50.40.480 &Syntax.FG.Groff :cal SetSyn("groff") -an 50.40.490 &Syntax.FG.Groovy :cal SetSyn("groovy") -an 50.40.500 &Syntax.FG.GTKrc :cal SetSyn("gtkrc") +an 50.40.130 &Syntax.FG.Fish :cal SetSyn("fish") +an 50.40.140 &Syntax.FG.FlexWiki :cal SetSyn("flexwiki") +an 50.40.150 &Syntax.FG.Focus\ Executable :cal SetSyn("focexec") +an 50.40.160 &Syntax.FG.Focus\ Master :cal SetSyn("master") +an 50.40.170 &Syntax.FG.FORM :cal SetSyn("form") +an 50.40.180 &Syntax.FG.Forth :cal SetSyn("forth") +an 50.40.190 &Syntax.FG.Fortran :cal SetSyn("fortran") +an 50.40.200 &Syntax.FG.FoxPro :cal SetSyn("foxpro") +an 50.40.210 &Syntax.FG.Fpcmake :cal SetSyn("fpcmake") +an 50.40.220 &Syntax.FG.FrameScript :cal SetSyn("framescript") +an 50.40.230 &Syntax.FG.Fstab :cal SetSyn("fstab") +an 50.40.240 &Syntax.FG.Fvwm.Fvwm\ configuration :cal SetSyn("fvwm1") +an 50.40.250 &Syntax.FG.Fvwm.Fvwm2\ configuration :cal SetSyn("fvwm2") +an 50.40.260 &Syntax.FG.Fvwm.Fvwm2\ configuration\ with\ M4 :cal SetSyn("fvwm2m4") +an 50.40.280 &Syntax.FG.GDB\ command\ file :cal SetSyn("gdb") +an 50.40.290 &Syntax.FG.GDMO :cal SetSyn("gdmo") +an 50.40.300 &Syntax.FG.Gdresource :cal SetSyn("gdresource") +an 50.40.310 &Syntax.FG.Gdscript :cal SetSyn("gdscript") +an 50.40.320 &Syntax.FG.Gdshader :cal SetSyn("gdshader") +an 50.40.330 &Syntax.FG.Gedcom :cal SetSyn("gedcom") +an 50.40.340 &Syntax.FG.Gel :cal SetSyn("gel") +an 50.40.350 &Syntax.FG.Gemtext :cal SetSyn("gemtext") +an 50.40.360 &Syntax.FG.Gift :cal SetSyn("gift") +an 50.40.370 &Syntax.FG.Git.Output :cal SetSyn("git") +an 50.40.380 &Syntax.FG.Git.Attributes :cal SetSyn("gitattributes") +an 50.40.390 &Syntax.FG.Git.Commit :cal SetSyn("gitcommit") +an 50.40.400 &Syntax.FG.Git.Config :cal SetSyn("gitconfig") +an 50.40.410 &Syntax.FG.Git.Ignore :cal SetSyn("gitignore") +an 50.40.420 &Syntax.FG.Git.Rebase :cal SetSyn("gitrebase") +an 50.40.430 &Syntax.FG.Git.Revlist :cal SetSyn("gitrevlist") +an 50.40.440 &Syntax.FG.Git.Send\ Email :cal SetSyn("gitsendemail") +an 50.40.450 &Syntax.FG.Gitolite :cal SetSyn("gitolite") +an 50.40.460 &Syntax.FG.Gkrellmrc :cal SetSyn("gkrellmrc") +an 50.40.470 &Syntax.FG.Gleam :cal SetSyn("gleam") +an 50.40.480 &Syntax.FG.Glimmer :cal SetSyn("glimmer") +an 50.40.490 &Syntax.FG.Glsl :cal SetSyn("glsl") +an 50.40.500 &Syntax.FG.Gnash :cal SetSyn("gnash") +an 50.40.510 &Syntax.FG.Go.Access :cal SetSyn("goaccess") +an 50.40.520 &Syntax.FG.Go.Doc :cal SetSyn("godoc") +an 50.40.530 &Syntax.FG.Go.Go :cal SetSyn("go") +an 50.40.540 &Syntax.FG.GP :cal SetSyn("gp") +an 50.40.550 &Syntax.FG.GPG :cal SetSyn("gpg") +an 50.40.560 &Syntax.FG.Graphql :cal SetSyn("graphql") +an 50.40.570 &Syntax.FG.Grof :cal SetSyn("gprof") +an 50.40.580 &Syntax.FG.Group\ file :cal SetSyn("group") +an 50.40.590 &Syntax.FG.Grub :cal SetSyn("grub") +an 50.40.600 &Syntax.FG.GNU\ Server\ Pages :cal SetSyn("gsp") +an 50.40.610 &Syntax.FG.GNUplot :cal SetSyn("gnuplot") +an 50.40.620 &Syntax.FG.GrADS\ scripts :cal SetSyn("grads") +an 50.40.630 &Syntax.FG.Gretl :cal SetSyn("gretl") +an 50.40.640 &Syntax.FG.Groff :cal SetSyn("groff") +an 50.40.650 &Syntax.FG.Groovy :cal SetSyn("groovy") +an 50.40.660 &Syntax.FG.GTKrc :cal SetSyn("gtkrc") +an 50.40.670 &Syntax.FG.Gvpr :cal SetSyn("gvpr") +an 50.40.680 &Syntax.FG.Gyp :cal SetSyn("gyp") an 50.50.100 &Syntax.HIJK.Haml :cal SetSyn("haml") an 50.50.110 &Syntax.HIJK.Hamster :cal SetSyn("hamster") -an 50.50.120 &Syntax.HIJK.Haskell.Haskell :cal SetSyn("haskell") -an 50.50.130 &Syntax.HIJK.Haskell.Haskell-c2hs :cal SetSyn("chaskell") -an 50.50.140 &Syntax.HIJK.Haskell.Haskell-literate :cal SetSyn("lhaskell") -an 50.50.150 &Syntax.HIJK.HASTE :cal SetSyn("haste") -an 50.50.160 &Syntax.HIJK.HASTE\ preproc :cal SetSyn("hastepreproc") -an 50.50.170 &Syntax.HIJK.Hercules :cal SetSyn("hercules") -an 50.50.180 &Syntax.HIJK.Hex\ dump.XXD :cal SetSyn("xxd") -an 50.50.190 &Syntax.HIJK.Hex\ dump.Intel\ MCS51 :cal SetSyn("hex") -an 50.50.200 &Syntax.HIJK.Hg\ commit :cal SetSyn("hgcommit") -an 50.50.210 &Syntax.HIJK.HIP :cal SetSyn("hip") -an 50.50.220 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") -an 50.50.230 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") -an 50.50.240 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") -an 50.50.250 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby") -an 50.50.260 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah") -an 50.50.270 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango") -an 50.50.280 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs") -an 50.50.290 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos") -an 50.50.300 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml") -an 50.50.310 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf") -an 50.50.320 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess") -an 50.50.330 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb") -an 50.50.350 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu") -an 50.50.360 &Syntax.HIJK.Icon :cal SetSyn("icon") -an 50.50.370 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl") -an 50.50.380 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl") -an 50.50.390 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent") -an 50.50.400 &Syntax.HIJK.Inform :cal SetSyn("inform") -an 50.50.410 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl") -an 50.50.420 &Syntax.HIJK.Initng :cal SetSyn("initng") -an 50.50.430 &Syntax.HIJK.Inittab :cal SetSyn("inittab") -an 50.50.440 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss") -an 50.50.450 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat") -an 50.50.460 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog") -an 50.50.470 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt") -an 50.50.480 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog") -an 50.50.490 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog") -an 50.50.500 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog") -an 50.50.510 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd") -an 50.50.520 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang") -an 50.50.530 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter") -an 50.50.550 &Syntax.HIJK.J :cal SetSyn("j") -an 50.50.560 &Syntax.HIJK.JAL :cal SetSyn("jal") -an 50.50.570 &Syntax.HIJK.JAM :cal SetSyn("jam") -an 50.50.580 &Syntax.HIJK.Jargon :cal SetSyn("jargon") -an 50.50.590 &Syntax.HIJK.Java.Java :cal SetSyn("java") -an 50.50.600 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc") -an 50.50.610 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp") -an 50.50.620 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties") -an 50.50.630 &Syntax.HIJK.JavaScript :cal SetSyn("javascript") -an 50.50.640 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact") -an 50.50.650 &Syntax.HIJK.Jess :cal SetSyn("jess") -an 50.50.660 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph") -an 50.50.670 &Syntax.HIJK.Jovial :cal SetSyn("jovial") -an 50.50.680 &Syntax.HIJK.JSON :cal SetSyn("json") -an 50.50.700 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") -an 50.50.710 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") -an 50.50.720 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") -an 50.50.730 &Syntax.HIJK.Kivy :cal SetSyn("kivy") -an 50.50.740 &Syntax.HIJK.KixTart :cal SetSyn("kix") +an 50.50.120 &Syntax.HIJK.Handlebars :cal SetSyn("handlebars") +an 50.50.130 &Syntax.HIJK.Hare.Hare :cal SetSyn("hare") +an 50.50.140 &Syntax.HIJK.Hare.Doc :cal SetSyn("haredoc") +an 50.50.150 &Syntax.HIJK.Haskell.Haskell :cal SetSyn("haskell") +an 50.50.160 &Syntax.HIJK.Haskell.Haskell-c2hs :cal SetSyn("chaskell") +an 50.50.170 &Syntax.HIJK.Haskell.Haskell-literate :cal SetSyn("lhaskell") +an 50.50.180 &Syntax.HIJK.HASTE :cal SetSyn("haste") +an 50.50.190 &Syntax.HIJK.HASTE\ preproc :cal SetSyn("hastepreproc") +an 50.50.200 &Syntax.HIJK.HCL :cal SetSyn("hcl") +an 50.50.210 &Syntax.HIJK.Hercules :cal SetSyn("hercules") +an 50.50.220 &Syntax.HIJK.Hex\ dump.XXD :cal SetSyn("xxd") +an 50.50.230 &Syntax.HIJK.Hex\ dump.Intel\ MCS51 :cal SetSyn("hex") +an 50.50.240 &Syntax.HIJK.Hg\ commit :cal SetSyn("hgcommit") +an 50.50.250 &Syntax.HIJK.HIP :cal SetSyn("hip") +an 50.50.260 &Syntax.HIJK.HLSPlaylist :cal SetSyn("hlsplaylist") +an 50.50.270 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") +an 50.50.280 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") +an 50.50.290 &Syntax.HIJK.HTML.HTMLAngular :cal SetSyn("htmlangular") +an 50.50.300 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") +an 50.50.310 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby") +an 50.50.320 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah") +an 50.50.330 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango") +an 50.50.340 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs") +an 50.50.350 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos") +an 50.50.360 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml") +an 50.50.370 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf") +an 50.50.380 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess") +an 50.50.390 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb") +an 50.50.400 &Syntax.HIJK.Hyprlang :cal SetSyn("hyprlang") +an 50.50.420 &Syntax.HIJK.I3Config :cal SetSyn("i3config") +an 50.50.430 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu") +an 50.50.440 &Syntax.HIJK.Icon :cal SetSyn("icon") +an 50.50.450 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl") +an 50.50.460 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl") +an 50.50.470 &Syntax.HIJK.Idris2 :cal SetSyn("idris2") +an 50.50.480 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent") +an 50.50.490 &Syntax.HIJK.Inform :cal SetSyn("inform") +an 50.50.500 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl") +an 50.50.510 &Syntax.HIJK.Initng :cal SetSyn("initng") +an 50.50.520 &Syntax.HIJK.Inittab :cal SetSyn("inittab") +an 50.50.530 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss") +an 50.50.540 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat") +an 50.50.550 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog") +an 50.50.560 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt") +an 50.50.570 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog") +an 50.50.580 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog") +an 50.50.590 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog") +an 50.50.600 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd") +an 50.50.610 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang") +an 50.50.620 &Syntax.HIJK.Ipkg :cal SetSyn("ipkg") +an 50.50.630 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter") +an 50.50.650 &Syntax.HIJK.J :cal SetSyn("j") +an 50.50.660 &Syntax.HIJK.JAL :cal SetSyn("jal") +an 50.50.670 &Syntax.HIJK.JAM :cal SetSyn("jam") +an 50.50.680 &Syntax.HIJK.Jargon :cal SetSyn("jargon") +an 50.50.690 &Syntax.HIJK.Java.Java :cal SetSyn("java") +an 50.50.700 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc") +an 50.50.710 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp") +an 50.50.720 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties") +an 50.50.730 &Syntax.HIJK.JavaScript :cal SetSyn("javascript") +an 50.50.740 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact") +an 50.50.750 &Syntax.HIJK.Jess :cal SetSyn("jess") +an 50.50.760 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph") +an 50.50.770 &Syntax.HIJK.Jinja :cal SetSyn("jinja") +an 50.50.780 &Syntax.HIJK.JJdescription :cal SetSyn("jjdescription") +an 50.50.790 &Syntax.HIJK.Jovial :cal SetSyn("jovial") +an 50.50.800 &Syntax.HIJK.JQ :cal SetSyn("jq") +an 50.50.810 &Syntax.HIJK.JSON.JSON :cal SetSyn("json") +an 50.50.820 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5") +an 50.50.830 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc") +an 50.50.840 &Syntax.HIJK.Julia :cal SetSyn("julia") +an 50.50.850 &Syntax.HIJK.Just :cal SetSyn("just") +an 50.50.870 &Syntax.HIJK.Karel :cal SetSyn("karel") +an 50.50.880 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") +an 50.50.890 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") +an 50.50.900 &Syntax.HIJK.Kdl :cal SetSyn("kdl") +an 50.50.910 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") +an 50.50.920 &Syntax.HIJK.Kitty :cal SetSyn("kitty") +an 50.50.930 &Syntax.HIJK.Kivy :cal SetSyn("kivy") +an 50.50.940 &Syntax.HIJK.KixTart :cal SetSyn("kix") +an 50.50.950 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin") +an 50.50.960 &Syntax.HIJK.Krl :cal SetSyn("krl") an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace") an 50.60.110 &Syntax.L.LambdaProlog :cal SetSyn("lprolog") an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte") -an 50.60.130 &Syntax.L.Ld\ script :cal SetSyn("ld") -an 50.60.140 &Syntax.L.LDAP.LDIF :cal SetSyn("ldif") -an 50.60.150 &Syntax.L.LDAP.Configuration :cal SetSyn("ldapconf") -an 50.60.160 &Syntax.L.Less :cal SetSyn("less") -an 50.60.170 &Syntax.L.Lex :cal SetSyn("lex") -an 50.60.180 &Syntax.L.LFTP\ config :cal SetSyn("lftp") -an 50.60.190 &Syntax.L.Libao :cal SetSyn("libao") -an 50.60.200 &Syntax.L.LifeLines\ script :cal SetSyn("lifelines") -an 50.60.210 &Syntax.L.Lilo :cal SetSyn("lilo") -an 50.60.220 &Syntax.L.Limits\ config :cal SetSyn("limits") -an 50.60.230 &Syntax.L.Linden\ scripting :cal SetSyn("lsl") -an 50.60.240 &Syntax.L.Liquid :cal SetSyn("liquid") -an 50.60.250 &Syntax.L.Lisp :cal SetSyn("lisp") -an 50.60.260 &Syntax.L.Lite :cal SetSyn("lite") -an 50.60.270 &Syntax.L.LiteStep\ RC :cal SetSyn("litestep") -an 50.60.280 &Syntax.L.Locale\ Input :cal SetSyn("fdcc") -an 50.60.290 &Syntax.L.Login\.access :cal SetSyn("loginaccess") -an 50.60.300 &Syntax.L.Login\.defs :cal SetSyn("logindefs") -an 50.60.310 &Syntax.L.Logtalk :cal SetSyn("logtalk") -an 50.60.320 &Syntax.L.LOTOS :cal SetSyn("lotos") -an 50.60.330 &Syntax.L.LotusScript :cal SetSyn("lscript") -an 50.60.340 &Syntax.L.Lout :cal SetSyn("lout") -an 50.60.350 &Syntax.L.LPC :cal SetSyn("lpc") -an 50.60.360 &Syntax.L.Lua :cal SetSyn("lua") -an 50.60.370 &Syntax.L.Lynx\ Style :cal SetSyn("lss") -an 50.60.380 &Syntax.L.Lynx\ config :cal SetSyn("lynx") -an 50.70.100 &Syntax.M.M4 :cal SetSyn("m4") -an 50.70.110 &Syntax.M.MaGic\ Point :cal SetSyn("mgp") -an 50.70.120 &Syntax.M.Mail :cal SetSyn("mail") -an 50.70.130 &Syntax.M.Mail\ aliases :cal SetSyn("mailaliases") -an 50.70.140 &Syntax.M.Mailcap :cal SetSyn("mailcap") -an 50.70.150 &Syntax.M.Mallard :cal SetSyn("mallard") -an 50.70.160 &Syntax.M.Makefile :cal SetSyn("make") -an 50.70.170 &Syntax.M.MakeIndex :cal SetSyn("ist") -an 50.70.180 &Syntax.M.Man\ page :cal SetSyn("man") -an 50.70.190 &Syntax.M.Man\.conf :cal SetSyn("manconf") -an 50.70.200 &Syntax.M.Maple\ V :cal SetSyn("maple") -an 50.70.210 &Syntax.M.Markdown :cal SetSyn("markdown") -an 50.70.220 &Syntax.M.Markdown\ with\ R\ statements :cal SetSyn("rmd") -an 50.70.230 &Syntax.M.Mason :cal SetSyn("mason") -an 50.70.240 &Syntax.M.Mathematica :cal SetSyn("mma") -an 50.70.250 &Syntax.M.Matlab :cal SetSyn("matlab") -an 50.70.260 &Syntax.M.Maxima :cal SetSyn("maxima") -an 50.70.270 &Syntax.M.MEL\ (for\ Maya) :cal SetSyn("mel") -an 50.70.280 &Syntax.M.Meson :cal SetSyn("meson") -an 50.70.290 &Syntax.M.Messages\ (/var/log) :cal SetSyn("messages") -an 50.70.300 &Syntax.M.Metafont :cal SetSyn("mf") -an 50.70.310 &Syntax.M.MetaPost :cal SetSyn("mp") -an 50.70.320 &Syntax.M.MGL :cal SetSyn("mgl") -an 50.70.330 &Syntax.M.MIX :cal SetSyn("mix") -an 50.70.340 &Syntax.M.MMIX :cal SetSyn("mmix") -an 50.70.350 &Syntax.M.Modconf :cal SetSyn("modconf") -an 50.70.360 &Syntax.M.Model :cal SetSyn("model") -an 50.70.370 &Syntax.M.Modsim\ III :cal SetSyn("modsim3") -an 50.70.380 &Syntax.M.Modula-2.R10\ (2010) :cal SetSyn("modula2:r10") -an 50.70.390 &Syntax.M.Modula-2.ISO\ (1994) :cal SetSyn("modula2:iso") -an 50.70.400 &Syntax.M.Modula-2.PIM\ (1985) :cal SetSyn("modula2:pim") -an 50.70.410 &Syntax.M.Modula-3 :cal SetSyn("modula3") -an 50.70.420 &Syntax.M.Monk :cal SetSyn("monk") -an 50.70.430 &Syntax.M.Motorola\ S-Record :cal SetSyn("srec") -an 50.70.440 &Syntax.M.Mplayer\ config :cal SetSyn("mplayerconf") -an 50.70.450 &Syntax.M.MOO :cal SetSyn("moo") -an 50.70.460 &Syntax.M.Mrxvtrc :cal SetSyn("mrxvtrc") -an 50.70.470 &Syntax.M.MS-DOS/Windows.4DOS\ \.bat\ file :cal SetSyn("btm") -an 50.70.480 &Syntax.M.MS-DOS/Windows.\.bat\/\.cmd\ file :cal SetSyn("dosbatch") -an 50.70.490 &Syntax.M.MS-DOS/Windows.\.ini\ file :cal SetSyn("dosini") -an 50.70.500 &Syntax.M.MS-DOS/Windows.Message\ text :cal SetSyn("msmessages") -an 50.70.510 &Syntax.M.MS-DOS/Windows.Module\ Definition :cal SetSyn("def") -an 50.70.520 &Syntax.M.MS-DOS/Windows.Registry :cal SetSyn("registry") -an 50.70.530 &Syntax.M.MS-DOS/Windows.Resource\ file :cal SetSyn("rc") -an 50.70.540 &Syntax.M.Msql :cal SetSyn("msql") -an 50.70.550 &Syntax.M.MuPAD :cal SetSyn("mupad") -an 50.70.560 &Syntax.M.Murphi :cal SetSyn("murphi") -an 50.70.570 &Syntax.M.MUSHcode :cal SetSyn("mush") -an 50.70.580 &Syntax.M.Muttrc :cal SetSyn("muttrc") +an 50.60.130 &Syntax.L.LC :cal SetSyn("lc") +an 50.60.140 &Syntax.L.Ld\ script :cal SetSyn("ld") +an 50.60.150 &Syntax.L.LDAP.LDIF :cal SetSyn("ldif") +an 50.60.160 &Syntax.L.LDAP.Configuration :cal SetSyn("ldapconf") +an 50.60.170 &Syntax.L.Leex :cal SetSyn("leex") +an 50.60.180 &Syntax.L.Less :cal SetSyn("less") +an 50.60.190 &Syntax.L.Lex :cal SetSyn("lex") +an 50.60.200 &Syntax.L.Lf :cal SetSyn("lf") +an 50.60.210 &Syntax.L.LFTP\ config :cal SetSyn("lftp") +an 50.60.220 &Syntax.L.Libao :cal SetSyn("libao") +an 50.60.230 &Syntax.L.Lidris2 :cal SetSyn("lidris2") +an 50.60.240 &Syntax.L.LifeLines\ script :cal SetSyn("lifelines") +an 50.60.250 &Syntax.L.Lilo :cal SetSyn("lilo") +an 50.60.260 &Syntax.L.Limits\ config :cal SetSyn("limits") +an 50.60.270 &Syntax.L.Linden\ scripting :cal SetSyn("lsl") +an 50.60.280 &Syntax.L.Liquid :cal SetSyn("liquid") +an 50.60.290 &Syntax.L.Lisp :cal SetSyn("lisp") +an 50.60.300 &Syntax.L.Lite :cal SetSyn("lite") +an 50.60.310 &Syntax.L.LiteStep\ RC :cal SetSyn("litestep") +an 50.60.320 &Syntax.L.Livebook :cal SetSyn("livebook") +an 50.60.330 &Syntax.L.LNK :cal SetSyn("lnk") +an 50.60.340 &Syntax.L.LNKMAP :cal SetSyn("lnkmap") +an 50.60.350 &Syntax.L.Locale\ Input :cal SetSyn("fdcc") +an 50.60.360 &Syntax.L.Log :cal SetSyn("log") +an 50.60.370 &Syntax.L.Login\.access :cal SetSyn("loginaccess") +an 50.60.380 &Syntax.L.Login\.defs :cal SetSyn("logindefs") +an 50.60.390 &Syntax.L.Logtalk :cal SetSyn("logtalk") +an 50.60.400 &Syntax.L.LOTOS :cal SetSyn("lotos") +an 50.60.410 &Syntax.L.LotusScript :cal SetSyn("lscript") +an 50.60.420 &Syntax.L.Lout :cal SetSyn("lout") +an 50.60.430 &Syntax.L.LPC :cal SetSyn("lpc") +an 50.60.440 &Syntax.L.Lua :cal SetSyn("lua") +an 50.60.450 &Syntax.L.Luau :cal SetSyn("luau") +an 50.60.460 &Syntax.L.Lyrics :cal SetSyn("lyrics") +an 50.60.470 &Syntax.L.Lynx\ Style :cal SetSyn("lss") +an 50.60.480 &Syntax.L.Lynx\ config :cal SetSyn("lynx") +an 50.70.100 &Syntax.M.M17ndb :cal SetSyn("m17ndb") +an 50.70.110 &Syntax.M.M3build :cal SetSyn("m3build") +an 50.70.120 &Syntax.M.M3quake :cal SetSyn("m3quake") +an 50.70.130 &Syntax.M.M4 :cal SetSyn("m4") +an 50.70.140 &Syntax.M.MaGic\ Point :cal SetSyn("mgp") +an 50.70.150 &Syntax.M.Mail :cal SetSyn("mail") +an 50.70.160 &Syntax.M.Mail\ aliases :cal SetSyn("mailaliases") +an 50.70.170 &Syntax.M.Mailcap :cal SetSyn("mailcap") +an 50.70.180 &Syntax.M.Mallard :cal SetSyn("mallard") +an 50.70.190 &Syntax.M.Makefile :cal SetSyn("make") +an 50.70.200 &Syntax.M.MakeIndex :cal SetSyn("ist") +an 50.70.210 &Syntax.M.Man\ page :cal SetSyn("man") +an 50.70.220 &Syntax.M.Man\.conf :cal SetSyn("manconf") +an 50.70.230 &Syntax.M.Maple\ V :cal SetSyn("maple") +an 50.70.240 &Syntax.M.Markdown :cal SetSyn("markdown") +an 50.70.250 &Syntax.M.Markdown\ with\ R\ statements :cal SetSyn("rmd") +an 50.70.260 &Syntax.M.Marko :cal SetSyn("marko") +an 50.70.270 &Syntax.M.Mason :cal SetSyn("mason") +an 50.70.280 &Syntax.M.Mathematica :cal SetSyn("mma") +an 50.70.290 &Syntax.M.Matlab :cal SetSyn("matlab") +an 50.70.300 &Syntax.M.Maxima :cal SetSyn("maxima") +an 50.70.310 &Syntax.M.Mbsync :cal SetSyn("mbsync") +an 50.70.320 &Syntax.M.Mediawiki :cal SetSyn("mediawiki") +an 50.70.330 &Syntax.M.MEL\ (for\ Maya) :cal SetSyn("mel") +an 50.70.340 &Syntax.M.Mermaid :cal SetSyn("mermaid") +an 50.70.350 &Syntax.M.Meson :cal SetSyn("meson") +an 50.70.360 &Syntax.M.Messages\ (/var/log) :cal SetSyn("messages") +an 50.70.370 &Syntax.M.Metafont :cal SetSyn("mf") +an 50.70.380 &Syntax.M.MetaPost :cal SetSyn("mp") +an 50.70.390 &Syntax.M.MGL :cal SetSyn("mgl") +an 50.70.400 &Syntax.M.MIX :cal SetSyn("mix") +an 50.70.410 &Syntax.M.MMIX :cal SetSyn("mmix") +an 50.70.420 &Syntax.M.Modconf :cal SetSyn("modconf") +an 50.70.430 &Syntax.M.Model :cal SetSyn("model") +an 50.70.440 &Syntax.M.Modsim\ III :cal SetSyn("modsim3") +an 50.70.450 &Syntax.M.Modula-2.R10\ (2010) :cal SetSyn("modula2:r10") +an 50.70.460 &Syntax.M.Modula-2.ISO\ (1994) :cal SetSyn("modula2:iso") +an 50.70.470 &Syntax.M.Modula-2.PIM\ (1985) :cal SetSyn("modula2:pim") +an 50.70.480 &Syntax.M.Modula-3 :cal SetSyn("modula3") +an 50.70.490 &Syntax.M.Mojo :cal SetSyn("mojo") +an 50.70.500 &Syntax.M.Monk :cal SetSyn("monk") +an 50.70.510 &Syntax.M.Motorola\ S-Record :cal SetSyn("srec") +an 50.70.520 &Syntax.M.Mplayer\ config :cal SetSyn("mplayerconf") +an 50.70.530 &Syntax.M.MOO :cal SetSyn("moo") +an 50.70.540 &Syntax.M.Mrxvtrc :cal SetSyn("mrxvtrc") +an 50.70.550 &Syntax.M.MS-DOS/Windows.4DOS\ \.bat\ file :cal SetSyn("btm") +an 50.70.560 &Syntax.M.MS-DOS/Windows.\.bat\/\.cmd\ file :cal SetSyn("dosbatch") +an 50.70.570 &Syntax.M.MS-DOS/Windows.\.ini\ file :cal SetSyn("dosini") +an 50.70.580 &Syntax.M.MS-DOS/Windows.Message\ text :cal SetSyn("msmessages") +an 50.70.590 &Syntax.M.MS-DOS/Windows.Module\ Definition :cal SetSyn("def") +an 50.70.600 &Syntax.M.MS-DOS/Windows.Registry :cal SetSyn("registry") +an 50.70.610 &Syntax.M.MS-DOS/Windows.Resource\ file :cal SetSyn("rc") +an 50.70.620 &Syntax.M.Msql :cal SetSyn("msql") +an 50.70.630 &Syntax.M.Mss :cal SetSyn("mss") +an 50.70.640 &Syntax.M.MuPAD :cal SetSyn("mupad") +an 50.70.650 &Syntax.M.Murphi :cal SetSyn("murphi") +an 50.70.660 &Syntax.M.MUSHcode :cal SetSyn("mush") +an 50.70.670 &Syntax.M.Muttrc :cal SetSyn("muttrc") an 50.80.100 &Syntax.NO.N1QL :cal SetSyn("n1ql") an 50.80.110 &Syntax.NO.Nanorc :cal SetSyn("nanorc") an 50.80.120 &Syntax.NO.Nastran\ input/DMAP :cal SetSyn("nastran") an 50.80.130 &Syntax.NO.Natural :cal SetSyn("natural") -an 50.80.140 &Syntax.NO.NeoMutt\ setup\ files :cal SetSyn("neomuttrc") -an 50.80.150 &Syntax.NO.Netrc :cal SetSyn("netrc") -an 50.80.160 &Syntax.NO.Ninja :cal SetSyn("ninja") -an 50.80.170 &Syntax.NO.Novell\ NCF\ batch :cal SetSyn("ncf") -an 50.80.180 &Syntax.NO.Not\ Quite\ C\ (LEGO) :cal SetSyn("nqc") -an 50.80.190 &Syntax.NO.Nroff :cal SetSyn("nroff") -an 50.80.200 &Syntax.NO.NSIS\ script :cal SetSyn("nsis") -an 50.80.220 &Syntax.NO.Obj\ 3D\ wavefront :cal SetSyn("obj") -an 50.80.230 &Syntax.NO.Objective\ C :cal SetSyn("objc") -an 50.80.240 &Syntax.NO.Objective\ C++ :cal SetSyn("objcpp") -an 50.80.250 &Syntax.NO.OCAML :cal SetSyn("ocaml") -an 50.80.260 &Syntax.NO.Occam :cal SetSyn("occam") -an 50.80.270 &Syntax.NO.Omnimark :cal SetSyn("omnimark") -an 50.80.280 &Syntax.NO.OpenROAD :cal SetSyn("openroad") -an 50.80.290 &Syntax.NO.Open\ Psion\ Lang :cal SetSyn("opl") -an 50.80.300 &Syntax.NO.Oracle\ config :cal SetSyn("ora") +an 50.80.140 &Syntax.NO.NeoMutt.logfile :cal SetSyn("neomuttlog") +an 50.80.150 &Syntax.NO.NeoMutt.neomuttrc :cal SetSyn("neomuttrc") +an 50.80.160 &Syntax.NO.Netrc :cal SetSyn("netrc") +an 50.80.170 &Syntax.NO.Nginx :cal SetSyn("nginx") +an 50.80.180 &Syntax.NO.Ninja :cal SetSyn("ninja") +an 50.80.190 &Syntax.NO.Nix :cal SetSyn("nix") +an 50.80.200 &Syntax.NO.Novell\ NCF\ batch :cal SetSyn("ncf") +an 50.80.210 &Syntax.NO.Not\ Quite\ C\ (LEGO) :cal SetSyn("nqc") +an 50.80.220 &Syntax.NO.Nroff :cal SetSyn("nroff") +an 50.80.230 &Syntax.NO.NSIS\ script :cal SetSyn("nsis") +an 50.80.240 &Syntax.NO.Nu :cal SetSyn("nu") +an 50.80.260 &Syntax.NO.Obj\ 3D\ wavefront :cal SetSyn("obj") +an 50.80.270 &Syntax.NO.Objective\ C :cal SetSyn("objc") +an 50.80.280 &Syntax.NO.Objective\ C++ :cal SetSyn("objcpp") +an 50.80.290 &Syntax.NO.Obse :cal SetSyn("obse") +an 50.80.300 &Syntax.NO.OCAML :cal SetSyn("ocaml") +an 50.80.310 &Syntax.NO.Occam :cal SetSyn("occam") +an 50.80.320 &Syntax.NO.Odin :cal SetSyn("odin") +an 50.80.330 &Syntax.NO.Omnimark :cal SetSyn("omnimark") +an 50.80.340 &Syntax.NO.Ondir :cal SetSyn("ondir") +an 50.80.350 &Syntax.NO.Opam :cal SetSyn("opam") +an 50.80.360 &Syntax.NO.Opencl :cal SetSyn("opencl") +an 50.80.370 &Syntax.NO.OpenROAD :cal SetSyn("openroad") +an 50.80.380 &Syntax.NO.OpenSCAD :cal SetSyn("openscad") +an 50.80.390 &Syntax.NO.OpenVPN :cal SetSyn("openvpn") +an 50.80.400 &Syntax.NO.Open\ Psion\ Lang :cal SetSyn("opl") +an 50.80.410 &Syntax.NO.Oracle\ config :cal SetSyn("ora") +an 50.80.420 &Syntax.NO.Org :cal SetSyn("org") an 50.90.100 &Syntax.PQ.Packet\ filter\ conf :cal SetSyn("pf") -an 50.90.110 &Syntax.PQ.Palm\ resource\ compiler :cal SetSyn("pilrc") -an 50.90.120 &Syntax.PQ.Pam\ config :cal SetSyn("pamconf") -an 50.90.130 &Syntax.PQ.PApp :cal SetSyn("papp") -an 50.90.140 &Syntax.PQ.Pascal :cal SetSyn("pascal") -an 50.90.150 &Syntax.PQ.Password\ file :cal SetSyn("passwd") -an 50.90.160 &Syntax.PQ.PCCTS :cal SetSyn("pccts") -an 50.90.170 &Syntax.PQ.PDF :cal SetSyn("pdf") -an 50.90.180 &Syntax.PQ.Perl.Perl :cal SetSyn("perl") -an 50.90.190 &Syntax.PQ.Perl.Perl\ 6 :cal SetSyn("perl6") -an 50.90.200 &Syntax.PQ.Perl.Perl\ POD :cal SetSyn("pod") -an 50.90.210 &Syntax.PQ.Perl.Perl\ XS :cal SetSyn("xs") -an 50.90.220 &Syntax.PQ.Perl.Template\ toolkit :cal SetSyn("tt2") -an 50.90.230 &Syntax.PQ.Perl.Template\ toolkit\ Html :cal SetSyn("tt2html") -an 50.90.240 &Syntax.PQ.Perl.Template\ toolkit\ JS :cal SetSyn("tt2js") -an 50.90.250 &Syntax.PQ.PHP.PHP\ 3-4 :cal SetSyn("php") -an 50.90.260 &Syntax.PQ.PHP.Phtml\ (PHP\ 2) :cal SetSyn("phtml") -an 50.90.270 &Syntax.PQ.Pike :cal SetSyn("pike") -an 50.90.280 &Syntax.PQ.Pine\ RC :cal SetSyn("pine") -an 50.90.290 &Syntax.PQ.Pinfo\ RC :cal SetSyn("pinfo") -an 50.90.300 &Syntax.PQ.PL/M :cal SetSyn("plm") -an 50.90.310 &Syntax.PQ.PL/SQL :cal SetSyn("plsql") -an 50.90.320 &Syntax.PQ.Pli :cal SetSyn("pli") -an 50.90.330 &Syntax.PQ.PLP :cal SetSyn("plp") -an 50.90.340 &Syntax.PQ.PO\ (GNU\ gettext) :cal SetSyn("po") -an 50.90.350 &Syntax.PQ.Postfix\ main\ config :cal SetSyn("pfmain") -an 50.90.360 &Syntax.PQ.PostScript.PostScript :cal SetSyn("postscr") -an 50.90.370 &Syntax.PQ.PostScript.PostScript\ Printer\ Description :cal SetSyn("ppd") -an 50.90.380 &Syntax.PQ.Povray.Povray\ scene\ descr :cal SetSyn("pov") -an 50.90.390 &Syntax.PQ.Povray.Povray\ configuration :cal SetSyn("povini") -an 50.90.400 &Syntax.PQ.PPWizard :cal SetSyn("ppwiz") -an 50.90.410 &Syntax.PQ.Prescribe\ (Kyocera) :cal SetSyn("prescribe") -an 50.90.420 &Syntax.PQ.Printcap :cal SetSyn("pcap") -an 50.90.430 &Syntax.PQ.Privoxy :cal SetSyn("privoxy") -an 50.90.440 &Syntax.PQ.Procmail :cal SetSyn("procmail") -an 50.90.450 &Syntax.PQ.Product\ Spec\ File :cal SetSyn("psf") -an 50.90.460 &Syntax.PQ.Progress :cal SetSyn("progress") -an 50.90.470 &Syntax.PQ.Prolog :cal SetSyn("prolog") -an 50.90.480 &Syntax.PQ.ProMeLa :cal SetSyn("promela") -an 50.90.490 &Syntax.PQ.Proto :cal SetSyn("proto") -an 50.90.500 &Syntax.PQ.Protocols :cal SetSyn("protocols") -an 50.90.510 &Syntax.PQ.Purify\ log :cal SetSyn("purifylog") -an 50.90.520 &Syntax.PQ.Pyrex :cal SetSyn("pyrex") -an 50.90.530 &Syntax.PQ.Python :cal SetSyn("python") -an 50.90.550 &Syntax.PQ.Quake :cal SetSyn("quake") -an 50.90.560 &Syntax.PQ.Quickfix\ window :cal SetSyn("qf") +an 50.90.110 &Syntax.PQ.Pacmanlog :cal SetSyn("pacmanlog") +an 50.90.120 &Syntax.PQ.Palm\ resource\ compiler :cal SetSyn("pilrc") +an 50.90.130 &Syntax.PQ.Pam\ config :cal SetSyn("pamconf") +an 50.90.140 &Syntax.PQ.Pam\ environment\ config\ file :cal SetSyn("pamenv") +an 50.90.150 &Syntax.PQ.Pandoc :cal SetSyn("pandoc") +an 50.90.160 &Syntax.PQ.PApp :cal SetSyn("papp") +an 50.90.170 &Syntax.PQ.Pascal :cal SetSyn("pascal") +an 50.90.180 &Syntax.PQ.Password\ file :cal SetSyn("passwd") +an 50.90.190 &Syntax.PQ.Pbtxt :cal SetSyn("pbtxt") +an 50.90.200 &Syntax.PQ.PCCTS :cal SetSyn("pccts") +an 50.90.210 &Syntax.PQ.PDF :cal SetSyn("pdf") +an 50.90.220 &Syntax.PQ.Perl.Perl :cal SetSyn("perl") +an 50.90.230 &Syntax.PQ.Perl.Perl\ 6 :cal SetSyn("perl6") +an 50.90.240 &Syntax.PQ.Perl.Perl\ POD :cal SetSyn("pod") +an 50.90.250 &Syntax.PQ.Perl.Perl\ XS :cal SetSyn("xs") +an 50.90.260 &Syntax.PQ.Perl.Template\ toolkit :cal SetSyn("tt2") +an 50.90.270 &Syntax.PQ.Perl.Template\ toolkit\ Html :cal SetSyn("tt2html") +an 50.90.280 &Syntax.PQ.Perl.Template\ toolkit\ JS :cal SetSyn("tt2js") +an 50.90.290 &Syntax.PQ.PHP.PHP\ 3-4 :cal SetSyn("php") +an 50.90.300 &Syntax.PQ.PHP.Phtml\ (PHP\ 2) :cal SetSyn("phtml") +an 50.90.310 &Syntax.PQ.Pike :cal SetSyn("pike") +an 50.90.320 &Syntax.PQ.Pine\ RC :cal SetSyn("pine") +an 50.90.330 &Syntax.PQ.Pinfo\ RC :cal SetSyn("pinfo") +an 50.90.340 &Syntax.PQ.Pkl :cal SetSyn("pkl") +an 50.90.350 &Syntax.PQ.PL/M :cal SetSyn("plm") +an 50.90.360 &Syntax.PQ.PL/SQL :cal SetSyn("plsql") +an 50.90.370 &Syntax.PQ.Pli :cal SetSyn("pli") +an 50.90.380 &Syntax.PQ.PLP :cal SetSyn("plp") +an 50.90.390 &Syntax.PQ.PO\ (GNU\ gettext) :cal SetSyn("po") +an 50.90.400 &Syntax.PQ.Poefilter :cal SetSyn("poefilter") +an 50.90.410 &Syntax.PQ.Poke :cal SetSyn("poke") +an 50.90.420 &Syntax.PQ.Postfix\ main\ config :cal SetSyn("pfmain") +an 50.90.430 &Syntax.PQ.PostScript.PostScript :cal SetSyn("postscr") +an 50.90.440 &Syntax.PQ.PostScript.PostScript\ Printer\ Description :cal SetSyn("ppd") +an 50.90.450 &Syntax.PQ.Povray.Povray\ scene\ descr :cal SetSyn("pov") +an 50.90.460 &Syntax.PQ.Povray.Povray\ configuration :cal SetSyn("povini") +an 50.90.470 &Syntax.PQ.Power\ Query\ M :cal SetSyn("pq") +an 50.90.480 &Syntax.PQ.PowerShell.PowerShell :cal SetSyn("ps1") +an 50.90.490 &Syntax.PQ.PowerShell.XML :cal SetSyn("ps1xml") +an 50.90.500 &Syntax.PQ.PPWizard :cal SetSyn("ppwiz") +an 50.90.510 &Syntax.PQ.Prescribe\ (Kyocera) :cal SetSyn("prescribe") +an 50.90.520 &Syntax.PQ.Printcap :cal SetSyn("pcap") +an 50.90.530 &Syntax.PQ.Privoxy :cal SetSyn("privoxy") +an 50.90.540 &Syntax.PQ.Procmail :cal SetSyn("procmail") +an 50.90.550 &Syntax.PQ.Product\ Spec\ File :cal SetSyn("psf") +an 50.90.560 &Syntax.PQ.Progress :cal SetSyn("progress") +an 50.90.570 &Syntax.PQ.Prolog :cal SetSyn("prolog") +an 50.90.580 &Syntax.PQ.ProMeLa :cal SetSyn("promela") +an 50.90.590 &Syntax.PQ.Property\ Specification\ Language :cal SetSyn("psl") +an 50.90.600 &Syntax.PQ.Proto :cal SetSyn("proto") +an 50.90.610 &Syntax.PQ.Protocols :cal SetSyn("protocols") +an 50.90.620 &Syntax.PQ.Prql :cal SetSyn("prql") +an 50.90.630 &Syntax.PQ.Ptx :cal SetSyn("ptx") +an 50.90.640 &Syntax.PQ.Purify\ log :cal SetSyn("purifylog") +an 50.90.650 &Syntax.PQ.Pyrex :cal SetSyn("pyrex") +an 50.90.660 &Syntax.PQ.Python :cal SetSyn("python") +an 50.90.670 &Syntax.PQ.Python2 :cal SetSyn("python2") +an 50.90.680 &Syntax.PQ.Python\ Manifest :cal SetSyn("pymanifest") +an 50.90.700 &Syntax.PQ.Qb64 :cal SetSyn("qb64") +an 50.90.710 &Syntax.PQ.QML :cal SetSyn("qml") +an 50.90.720 &Syntax.PQ.Quake :cal SetSyn("quake") +an 50.90.730 &Syntax.PQ.Quarto :cal SetSyn("quarto") +an 50.90.740 &Syntax.PQ.Quickfix\ window :cal SetSyn("qf") an 50.100.100 &Syntax.R.R.R :cal SetSyn("r") an 50.100.110 &Syntax.R.R.R\ help :cal SetSyn("rhelp") an 50.100.120 &Syntax.R.R.R\ noweb :cal SetSyn("rnoweb") an 50.100.130 &Syntax.R.Racc\ input :cal SetSyn("racc") -an 50.100.140 &Syntax.R.Radiance :cal SetSyn("radiance") -an 50.100.150 &Syntax.R.Raml :cal SetSyn("raml") -an 50.100.160 &Syntax.R.Ratpoison :cal SetSyn("ratpoison") -an 50.100.170 &Syntax.R.RCS.RCS\ log\ output :cal SetSyn("rcslog") -an 50.100.180 &Syntax.R.RCS.RCS\ file :cal SetSyn("rcs") -an 50.100.190 &Syntax.R.Readline\ config :cal SetSyn("readline") -an 50.100.200 &Syntax.R.Rebol :cal SetSyn("rebol") -an 50.100.210 &Syntax.R.ReDIF :cal SetSyn("redif") -an 50.100.220 &Syntax.R.Rego :cal SetSyn("rego") -an 50.100.230 &Syntax.R.Relax\ NG :cal SetSyn("rng") -an 50.100.240 &Syntax.R.Remind :cal SetSyn("remind") -an 50.100.250 &Syntax.R.Relax\ NG\ compact :cal SetSyn("rnc") -an 50.100.260 &Syntax.R.Renderman.Renderman\ Shader\ Lang :cal SetSyn("sl") -an 50.100.270 &Syntax.R.Renderman.Renderman\ Interface\ Bytestream :cal SetSyn("rib") -an 50.100.280 &Syntax.R.Resolv\.conf :cal SetSyn("resolv") -an 50.100.290 &Syntax.R.Reva\ Forth :cal SetSyn("reva") -an 50.100.300 &Syntax.R.Rexx :cal SetSyn("rexx") -an 50.100.310 &Syntax.R.Robots\.txt :cal SetSyn("robots") -an 50.100.320 &Syntax.R.RockLinux\ package\ desc\. :cal SetSyn("desc") -an 50.100.330 &Syntax.R.Rpcgen :cal SetSyn("rpcgen") -an 50.100.340 &Syntax.R.RPL/2 :cal SetSyn("rpl") -an 50.100.350 &Syntax.R.ReStructuredText :cal SetSyn("rst") -an 50.110.100 &Syntax.M.ReStructuredText\ with\ R\ statements :cal SetSyn("rrst") -an 50.120.100 &Syntax.R.RTF :cal SetSyn("rtf") -an 50.120.110 &Syntax.R.Ruby :cal SetSyn("ruby") -an 50.120.120 &Syntax.R.Rust :cal SetSyn("rust") -an 50.130.100 &Syntax.S-Sm.S-Lang :cal SetSyn("slang") -an 50.130.110 &Syntax.S-Sm.Samba\ config :cal SetSyn("samba") -an 50.130.120 &Syntax.S-Sm.SAS :cal SetSyn("sas") -an 50.130.130 &Syntax.S-Sm.Sass :cal SetSyn("sass") -an 50.130.140 &Syntax.S-Sm.Sather :cal SetSyn("sather") -an 50.130.150 &Syntax.S-Sm.Sbt :cal SetSyn("sbt") -an 50.130.160 &Syntax.S-Sm.Scala :cal SetSyn("scala") -an 50.130.170 &Syntax.S-Sm.Scheme :cal SetSyn("scheme") -an 50.130.180 &Syntax.S-Sm.Scilab :cal SetSyn("scilab") -an 50.130.190 &Syntax.S-Sm.Screen\ RC :cal SetSyn("screen") -an 50.130.200 &Syntax.S-Sm.SCSS :cal SetSyn("scss") -an 50.130.210 &Syntax.S-Sm.SDC\ Synopsys\ Design\ Constraints :cal SetSyn("sdc") -an 50.130.220 &Syntax.S-Sm.SDL :cal SetSyn("sdl") -an 50.130.230 &Syntax.S-Sm.Sed :cal SetSyn("sed") -an 50.130.240 &Syntax.S-Sm.Sendmail\.cf :cal SetSyn("sm") -an 50.130.250 &Syntax.S-Sm.Send-pr :cal SetSyn("sendpr") -an 50.130.260 &Syntax.S-Sm.Sensors\.conf :cal SetSyn("sensors") -an 50.130.270 &Syntax.S-Sm.Service\ Location\ config :cal SetSyn("slpconf") -an 50.130.280 &Syntax.S-Sm.Service\ Location\ registration :cal SetSyn("slpreg") -an 50.130.290 &Syntax.S-Sm.Service\ Location\ SPI :cal SetSyn("slpspi") -an 50.130.300 &Syntax.S-Sm.Services :cal SetSyn("services") -an 50.130.310 &Syntax.S-Sm.Setserial\ config :cal SetSyn("setserial") -an 50.130.320 &Syntax.S-Sm.SGML.SGML\ catalog :cal SetSyn("catalog") -an 50.130.330 &Syntax.S-Sm.SGML.SGML\ DTD :cal SetSyn("sgml") -an 50.130.340 &Syntax.S-Sm.SGML.SGML\ Declaration :cal SetSyn("sgmldecl") -an 50.130.350 &Syntax.S-Sm.SGML.SGML-linuxdoc :cal SetSyn("sgmllnx") -an 50.130.360 &Syntax.S-Sm.Shell\ script.sh\ and\ ksh :cal SetSyn("sh") -an 50.130.370 &Syntax.S-Sm.Shell\ script.csh :cal SetSyn("csh") -an 50.130.380 &Syntax.S-Sm.Shell\ script.tcsh :cal SetSyn("tcsh") -an 50.130.390 &Syntax.S-Sm.Shell\ script.zsh :cal SetSyn("zsh") -an 50.130.400 &Syntax.S-Sm.SiCAD :cal SetSyn("sicad") -an 50.130.410 &Syntax.S-Sm.Sieve :cal SetSyn("sieve") -an 50.130.420 &Syntax.S-Sm.Simula :cal SetSyn("simula") -an 50.130.430 &Syntax.S-Sm.Sinda.Sinda\ compare :cal SetSyn("sindacmp") -an 50.130.440 &Syntax.S-Sm.Sinda.Sinda\ input :cal SetSyn("sinda") -an 50.130.450 &Syntax.S-Sm.Sinda.Sinda\ output :cal SetSyn("sindaout") -an 50.130.460 &Syntax.S-Sm.SiSU :cal SetSyn("sisu") -an 50.130.470 &Syntax.S-Sm.SKILL.SKILL :cal SetSyn("skill") -an 50.130.480 &Syntax.S-Sm.SKILL.SKILL\ for\ Diva :cal SetSyn("diva") -an 50.130.490 &Syntax.S-Sm.Slice :cal SetSyn("slice") -an 50.130.500 &Syntax.S-Sm.SLRN.Slrn\ rc :cal SetSyn("slrnrc") -an 50.130.510 &Syntax.S-Sm.SLRN.Slrn\ score :cal SetSyn("slrnsc") -an 50.130.520 &Syntax.S-Sm.SmallTalk :cal SetSyn("st") -an 50.130.530 &Syntax.S-Sm.Smarty\ Templates :cal SetSyn("smarty") -an 50.130.540 &Syntax.S-Sm.SMIL :cal SetSyn("smil") -an 50.130.550 &Syntax.S-Sm.SMITH :cal SetSyn("smith") -an 50.140.100 &Syntax.Sn-Sy.SNMP\ MIB :cal SetSyn("mib") -an 50.140.110 &Syntax.Sn-Sy.SNNS.SNNS\ network :cal SetSyn("snnsnet") -an 50.140.120 &Syntax.Sn-Sy.SNNS.SNNS\ pattern :cal SetSyn("snnspat") -an 50.140.130 &Syntax.Sn-Sy.SNNS.SNNS\ result :cal SetSyn("snnsres") -an 50.140.140 &Syntax.Sn-Sy.Snobol4 :cal SetSyn("snobol4") -an 50.140.150 &Syntax.Sn-Sy.Snort\ Configuration :cal SetSyn("hog") -an 50.140.160 &Syntax.Sn-Sy.SPEC\ (Linux\ RPM) :cal SetSyn("spec") -an 50.140.170 &Syntax.Sn-Sy.Specman :cal SetSyn("specman") -an 50.140.180 &Syntax.Sn-Sy.Spice :cal SetSyn("spice") -an 50.140.190 &Syntax.Sn-Sy.Spyce :cal SetSyn("spyce") -an 50.140.200 &Syntax.Sn-Sy.Speedup :cal SetSyn("spup") -an 50.140.210 &Syntax.Sn-Sy.Splint :cal SetSyn("splint") -an 50.140.220 &Syntax.Sn-Sy.Squid\ config :cal SetSyn("squid") -an 50.140.230 &Syntax.Sn-Sy.SQL.SAP\ HANA :cal SetSyn("sqlhana") -an 50.140.240 &Syntax.Sn-Sy.SQL.ESQL-C :cal SetSyn("esqlc") -an 50.140.250 &Syntax.Sn-Sy.SQL.MySQL :cal SetSyn("mysql") -an 50.140.260 &Syntax.Sn-Sy.SQL.PL/SQL :cal SetSyn("plsql") -an 50.140.270 &Syntax.Sn-Sy.SQL.SQL\ Anywhere :cal SetSyn("sqlanywhere") -an 50.140.280 &Syntax.Sn-Sy.SQL.SQL\ (automatic) :cal SetSyn("sql") -an 50.140.290 &Syntax.Sn-Sy.SQL.SQL\ (Oracle) :cal SetSyn("sqloracle") -an 50.140.300 &Syntax.Sn-Sy.SQL.SQL\ Forms :cal SetSyn("sqlforms") -an 50.140.310 &Syntax.Sn-Sy.SQL.SQLJ :cal SetSyn("sqlj") -an 50.140.320 &Syntax.Sn-Sy.SQL.SQL-Informix :cal SetSyn("sqlinformix") -an 50.140.330 &Syntax.Sn-Sy.SQR :cal SetSyn("sqr") -an 50.140.340 &Syntax.Sn-Sy.Ssh.ssh_config :cal SetSyn("sshconfig") -an 50.140.350 &Syntax.Sn-Sy.Ssh.sshd_config :cal SetSyn("sshdconfig") -an 50.140.360 &Syntax.Sn-Sy.Standard\ ML :cal SetSyn("sml") -an 50.140.370 &Syntax.Sn-Sy.Stata.SMCL :cal SetSyn("smcl") -an 50.140.380 &Syntax.Sn-Sy.Stata.Stata :cal SetSyn("stata") -an 50.140.390 &Syntax.Sn-Sy.Stored\ Procedures :cal SetSyn("stp") -an 50.140.400 &Syntax.Sn-Sy.Strace :cal SetSyn("strace") -an 50.140.410 &Syntax.Sn-Sy.Streaming\ descriptor\ file :cal SetSyn("sd") -an 50.140.420 &Syntax.Sn-Sy.Subversion\ commit :cal SetSyn("svn") -an 50.140.430 &Syntax.Sn-Sy.Sudoers :cal SetSyn("sudoers") -an 50.140.440 &Syntax.Sn-Sy.SVG :cal SetSyn("svg") -an 50.140.450 &Syntax.Sn-Sy.Symbian\ meta-makefile :cal SetSyn("mmp") -an 50.140.460 &Syntax.Sn-Sy.Sysctl\.conf :cal SetSyn("sysctl") -an 50.140.470 &Syntax.Sn-Sy.Systemd :cal SetSyn("systemd") -an 50.140.480 &Syntax.Sn-Sy.SystemVerilog :cal SetSyn("systemverilog") -an 50.150.100 &Syntax.T.TADS :cal SetSyn("tads") -an 50.150.110 &Syntax.T.Tags :cal SetSyn("tags") -an 50.150.120 &Syntax.T.TAK.TAK\ compare :cal SetSyn("takcmp") -an 50.150.130 &Syntax.T.TAK.TAK\ input :cal SetSyn("tak") -an 50.150.140 &Syntax.T.TAK.TAK\ output :cal SetSyn("takout") -an 50.150.150 &Syntax.T.Tar\ listing :cal SetSyn("tar") -an 50.150.160 &Syntax.T.Task\ data :cal SetSyn("taskdata") -an 50.150.170 &Syntax.T.Task\ 42\ edit :cal SetSyn("taskedit") -an 50.150.180 &Syntax.T.Tcl/Tk :cal SetSyn("tcl") -an 50.150.190 &Syntax.T.TealInfo :cal SetSyn("tli") -an 50.150.200 &Syntax.T.Telix\ Salt :cal SetSyn("tsalt") -an 50.150.210 &Syntax.T.Termcap/Printcap :cal SetSyn("ptcap") -an 50.150.220 &Syntax.T.Terminfo :cal SetSyn("terminfo") -an 50.150.230 &Syntax.T.Tera :cal SetSyn("tera") -an 50.150.240 &Syntax.T.Tera\ Term :cal SetSyn("teraterm") -an 50.150.250 &Syntax.T.TeX.TeX/LaTeX :cal SetSyn("tex") -an 50.150.260 &Syntax.T.TeX.plain\ TeX :cal SetSyn("plaintex") -an 50.150.270 &Syntax.T.TeX.Initex :cal SetSyn("initex") -an 50.150.280 &Syntax.T.TeX.ConTeXt :cal SetSyn("context") -an 50.150.290 &Syntax.T.TeX.TeX\ configuration :cal SetSyn("texmf") -an 50.150.300 &Syntax.T.TeX.Texinfo :cal SetSyn("texinfo") -an 50.150.310 &Syntax.T.TF\ mud\ client :cal SetSyn("tf") -an 50.150.320 &Syntax.T.Tidy\ configuration :cal SetSyn("tidy") -an 50.150.330 &Syntax.T.Tilde :cal SetSyn("tilde") -an 50.150.340 &Syntax.T.Tmux\ configuration :cal SetSyn("tmux") -an 50.150.350 &Syntax.T.TOML :cal SetSyn("toml") -an 50.150.360 &Syntax.T.TPP :cal SetSyn("tpp") -an 50.150.370 &Syntax.T.Trasys\ input :cal SetSyn("trasys") -an 50.150.380 &Syntax.T.Treetop :cal SetSyn("treetop") -an 50.150.390 &Syntax.T.Trustees :cal SetSyn("trustees") -an 50.150.400 &Syntax.T.TSS.Command\ Line :cal SetSyn("tsscl") -an 50.150.410 &Syntax.T.TSS.Geometry :cal SetSyn("tssgm") -an 50.150.420 &Syntax.T.TSS.Optics :cal SetSyn("tssop") -an 50.150.430 &Syntax.T.Typescript :cal SetSyn("typescript") -an 50.150.440 &Syntax.T.TypescriptReact :cal SetSyn("typescriptreact") -an 50.160.100 &Syntax.UV.Udev\ config :cal SetSyn("udevconf") -an 50.160.110 &Syntax.UV.Udev\ permissions :cal SetSyn("udevperm") -an 50.160.120 &Syntax.UV.Udev\ rules :cal SetSyn("udevrules") -an 50.160.130 &Syntax.UV.UIT/UIL :cal SetSyn("uil") -an 50.160.140 &Syntax.UV.UnrealScript :cal SetSyn("uc") -an 50.160.150 &Syntax.UV.Updatedb\.conf :cal SetSyn("updatedb") -an 50.160.160 &Syntax.UV.Upstart :cal SetSyn("upstart") -an 50.160.180 &Syntax.UV.Valgrind :cal SetSyn("valgrind") -an 50.160.190 &Syntax.UV.Vera :cal SetSyn("vera") -an 50.160.200 &Syntax.UV.Verbose\ TAP\ Output :cal SetSyn("tap") -an 50.160.210 &Syntax.UV.Verilog-AMS\ HDL :cal SetSyn("verilogams") -an 50.160.220 &Syntax.UV.Verilog\ HDL :cal SetSyn("verilog") -an 50.160.230 &Syntax.UV.Vgrindefs :cal SetSyn("vgrindefs") -an 50.160.240 &Syntax.UV.VHDL :cal SetSyn("vhdl") -an 50.160.250 &Syntax.UV.Vim.Vim\ help\ file :cal SetSyn("help") -an 50.160.260 &Syntax.UV.Vim.Vim\ script :cal SetSyn("vim") -an 50.160.270 &Syntax.UV.Vim.Viminfo\ file :cal SetSyn("viminfo") -an 50.160.280 &Syntax.UV.Virata\ config :cal SetSyn("virata") -an 50.160.290 &Syntax.UV.Visual\ Basic :cal SetSyn("vb") -an 50.160.300 &Syntax.UV.VOS\ CM\ macro :cal SetSyn("voscm") -an 50.160.310 &Syntax.UV.VRML :cal SetSyn("vrml") -an 50.160.320 &Syntax.UV.Vroom :cal SetSyn("vroom") -an 50.160.330 &Syntax.UV.VSE\ JCL :cal SetSyn("vsejcl") -an 50.170.100 &Syntax.WXYZ.WEB.CWEB :cal SetSyn("cweb") -an 50.170.110 &Syntax.WXYZ.WEB.WEB :cal SetSyn("web") -an 50.170.120 &Syntax.WXYZ.WEB.WEB\ Changes :cal SetSyn("change") -an 50.170.130 &Syntax.WXYZ.WebAssembly :cal SetSyn("wat") -an 50.170.140 &Syntax.WXYZ.Webmacro :cal SetSyn("webmacro") -an 50.170.150 &Syntax.WXYZ.Website\ MetaLanguage :cal SetSyn("wml") -an 50.170.170 &Syntax.WXYZ.wDiff :cal SetSyn("wdiff") -an 50.170.190 &Syntax.WXYZ.Wget\ config :cal SetSyn("wget") -an 50.170.200 &Syntax.WXYZ.Whitespace\ (add) :cal SetSyn("whitespace") -an 50.170.210 &Syntax.WXYZ.WildPackets\ EtherPeek\ Decoder :cal SetSyn("dcd") -an 50.170.220 &Syntax.WXYZ.WinBatch/Webbatch :cal SetSyn("winbatch") -an 50.170.230 &Syntax.WXYZ.Windows\ Scripting\ Host :cal SetSyn("wsh") -an 50.170.240 &Syntax.WXYZ.WSML :cal SetSyn("wsml") -an 50.170.250 &Syntax.WXYZ.WvDial :cal SetSyn("wvdial") -an 50.170.270 &Syntax.WXYZ.X\ Keyboard\ Extension :cal SetSyn("xkb") -an 50.170.280 &Syntax.WXYZ.X\ Pixmap :cal SetSyn("xpm") -an 50.170.290 &Syntax.WXYZ.X\ Pixmap\ (2) :cal SetSyn("xpm2") -an 50.170.300 &Syntax.WXYZ.X\ resources :cal SetSyn("xdefaults") -an 50.170.310 &Syntax.WXYZ.XBL :cal SetSyn("xbl") -an 50.170.320 &Syntax.WXYZ.Xinetd\.conf :cal SetSyn("xinetd") -an 50.170.330 &Syntax.WXYZ.Xmodmap :cal SetSyn("xmodmap") -an 50.170.340 &Syntax.WXYZ.Xmath :cal SetSyn("xmath") -an 50.170.350 &Syntax.WXYZ.XML :cal SetSyn("xml") -an 50.170.360 &Syntax.WXYZ.XML\ Schema\ (XSD) :cal SetSyn("xsd") -an 50.170.370 &Syntax.WXYZ.XQuery :cal SetSyn("xquery") -an 50.170.380 &Syntax.WXYZ.Xslt :cal SetSyn("xslt") -an 50.170.390 &Syntax.WXYZ.XFree86\ Config :cal SetSyn("xf86conf") -an 50.170.410 &Syntax.WXYZ.YAML :cal SetSyn("yaml") -an 50.170.420 &Syntax.WXYZ.Yacc :cal SetSyn("yacc") -an 50.170.440 &Syntax.WXYZ.Zimbu :cal SetSyn("zimbu") -an 50.170.450 &Syntax.WXYZ.Zserio :cal SetSyn("zserio") +an 50.100.140 &Syntax.R.Racket :cal SetSyn("racket") +an 50.100.150 &Syntax.R.Radiance :cal SetSyn("radiance") +an 50.100.160 &Syntax.R.Raml :cal SetSyn("raml") +an 50.100.170 &Syntax.R.Rapid :cal SetSyn("rapid") +an 50.100.180 &Syntax.R.Rasi :cal SetSyn("rasi") +an 50.100.190 &Syntax.R.Ratpoison :cal SetSyn("ratpoison") +an 50.100.200 &Syntax.R.RCS.RCS\ log\ output :cal SetSyn("rcslog") +an 50.100.210 &Syntax.R.RCS.RCS\ file :cal SetSyn("rcs") +an 50.100.220 &Syntax.R.Readline\ config :cal SetSyn("readline") +an 50.100.230 &Syntax.R.Rebol :cal SetSyn("rebol") +an 50.100.240 &Syntax.R.ReDIF :cal SetSyn("redif") +an 50.100.250 &Syntax.R.Rego :cal SetSyn("rego") +an 50.100.260 &Syntax.R.Relax\ NG :cal SetSyn("rng") +an 50.100.270 &Syntax.R.Remind :cal SetSyn("remind") +an 50.100.280 &Syntax.R.Relax\ NG\ compact :cal SetSyn("rnc") +an 50.100.290 &Syntax.R.Renderman.Renderman\ Shader\ Lang :cal SetSyn("sl") +an 50.100.300 &Syntax.R.Renderman.Renderman\ Interface\ Bytestream :cal SetSyn("rib") +an 50.100.310 &Syntax.R.Requirements :cal SetSyn("requirements") +an 50.100.320 &Syntax.R.Resolv\.conf :cal SetSyn("resolv") +an 50.100.330 &Syntax.R.Reva\ Forth :cal SetSyn("reva") +an 50.100.340 &Syntax.R.Rexx :cal SetSyn("rexx") +an 50.100.350 &Syntax.R.Robots\.txt :cal SetSyn("robots") +an 50.100.360 &Syntax.R.RockLinux\ package\ desc\. :cal SetSyn("desc") +an 50.100.370 &Syntax.R.Rpcgen :cal SetSyn("rpcgen") +an 50.100.380 &Syntax.R.RPL/2 :cal SetSyn("rpl") +an 50.100.390 &Syntax.R.ReStructuredText :cal SetSyn("rst") +an 50.100.400 &Syntax.R.ReStructuredText\ with\ R\ statements :cal SetSyn("rrst") +an 50.100.410 &Syntax.R.Routeros :cal SetSyn("routeros") +an 50.100.420 &Syntax.R.RTF :cal SetSyn("rtf") +an 50.100.430 &Syntax.R.Ruby :cal SetSyn("ruby") +an 50.100.440 &Syntax.R.Rust :cal SetSyn("rust") +an 50.110.100 &Syntax.S-Sm.S-Lang :cal SetSyn("slang") +an 50.110.110 &Syntax.S-Sm.Samba\ config :cal SetSyn("samba") +an 50.110.120 &Syntax.S-Sm.SAS :cal SetSyn("sas") +an 50.110.130 &Syntax.S-Sm.Salt :cal SetSyn("salt") +an 50.110.140 &Syntax.S-Sm.Sass :cal SetSyn("sass") +an 50.110.150 &Syntax.S-Sm.Sather :cal SetSyn("sather") +an 50.110.160 &Syntax.S-Sm.Sbt :cal SetSyn("sbt") +an 50.110.170 &Syntax.S-Sm.Scala :cal SetSyn("scala") +an 50.110.180 &Syntax.S-Sm.Scdoc :cal SetSyn("scdoc") +an 50.110.190 &Syntax.S-Sm.Scheme :cal SetSyn("scheme") +an 50.110.200 &Syntax.S-Sm.Scilab :cal SetSyn("scilab") +an 50.110.210 &Syntax.S-Sm.Screen\ RC :cal SetSyn("screen") +an 50.110.220 &Syntax.S-Sm.SCSS :cal SetSyn("scss") +an 50.110.230 &Syntax.S-Sm.SDC\ Synopsys\ Design\ Constraints :cal SetSyn("sdc") +an 50.110.240 &Syntax.S-Sm.SDL :cal SetSyn("sdl") +an 50.110.250 &Syntax.S-Sm.Sed :cal SetSyn("sed") +an 50.110.260 &Syntax.S-Sm.Sendmail\.cf :cal SetSyn("sm") +an 50.110.270 &Syntax.S-Sm.Send-pr :cal SetSyn("sendpr") +an 50.110.280 &Syntax.S-Sm.Sensors\.conf :cal SetSyn("sensors") +an 50.110.290 &Syntax.S-Sm.Service\ Location\ config :cal SetSyn("slpconf") +an 50.110.300 &Syntax.S-Sm.Service\ Location\ registration :cal SetSyn("slpreg") +an 50.110.310 &Syntax.S-Sm.Service\ Location\ SPI :cal SetSyn("slpspi") +an 50.110.320 &Syntax.S-Sm.Services :cal SetSyn("services") +an 50.110.330 &Syntax.S-Sm.Setserial\ config :cal SetSyn("setserial") +an 50.110.340 &Syntax.S-Sm.Sexplib :cal SetSyn("sexplib") +an 50.110.350 &Syntax.S-Sm.SGF :cal SetSyn("sgf") +an 50.110.360 &Syntax.S-Sm.SGML.SGML\ catalog :cal SetSyn("catalog") +an 50.110.370 &Syntax.S-Sm.SGML.SGML\ DTD :cal SetSyn("sgml") +an 50.110.380 &Syntax.S-Sm.SGML.SGML\ Declaration :cal SetSyn("sgmldecl") +an 50.110.390 &Syntax.S-Sm.SGML.SGML-linuxdoc :cal SetSyn("sgmllnx") +an 50.110.400 &Syntax.S-Sm.Shaderslang :cal SetSyn("shaderslang") +an 50.110.410 &Syntax.S-Sm.Shell\ script.sh\ and\ ksh :cal SetSyn("sh") +an 50.110.420 &Syntax.S-Sm.Shell\ script.csh :cal SetSyn("csh") +an 50.110.430 &Syntax.S-Sm.Shell\ script.tcsh :cal SetSyn("tcsh") +an 50.110.440 &Syntax.S-Sm.Shell\ script.zsh :cal SetSyn("zsh") +an 50.110.450 &Syntax.S-Sm.SiCAD :cal SetSyn("sicad") +an 50.110.460 &Syntax.S-Sm.Sieve :cal SetSyn("sieve") +an 50.110.470 &Syntax.S-Sm.Sil :cal SetSyn("sil") +an 50.110.480 &Syntax.S-Sm.Simula :cal SetSyn("simula") +an 50.110.490 &Syntax.S-Sm.Sinda.Sinda\ compare :cal SetSyn("sindacmp") +an 50.110.500 &Syntax.S-Sm.Sinda.Sinda\ input :cal SetSyn("sinda") +an 50.110.510 &Syntax.S-Sm.Sinda.Sinda\ output :cal SetSyn("sindaout") +an 50.110.520 &Syntax.S-Sm.SiSU :cal SetSyn("sisu") +an 50.110.530 &Syntax.S-Sm.Skhd :cal SetSyn("skhd") +an 50.110.540 &Syntax.S-Sm.SKILL.SKILL :cal SetSyn("skill") +an 50.110.550 &Syntax.S-Sm.SKILL.SKILL\ for\ Diva :cal SetSyn("diva") +an 50.110.560 &Syntax.S-Sm.Slice :cal SetSyn("slice") +an 50.110.570 &Syntax.S-Sm.SLRN.Slrn\ rc :cal SetSyn("slrnrc") +an 50.110.580 &Syntax.S-Sm.SLRN.Slrn\ score :cal SetSyn("slrnsc") +an 50.110.590 &Syntax.S-Sm.SmallTalk :cal SetSyn("st") +an 50.110.600 &Syntax.S-Sm.Smarty\ Templates :cal SetSyn("smarty") +an 50.110.610 &Syntax.S-Sm.SMIL :cal SetSyn("smil") +an 50.110.620 &Syntax.S-Sm.SMITH :cal SetSyn("smith") +an 50.120.100 &Syntax.Sn-Sy.SNMP\ MIB :cal SetSyn("mib") +an 50.120.110 &Syntax.Sn-Sy.SNNS.SNNS\ network :cal SetSyn("snnsnet") +an 50.120.120 &Syntax.Sn-Sy.SNNS.SNNS\ pattern :cal SetSyn("snnspat") +an 50.120.130 &Syntax.Sn-Sy.SNNS.SNNS\ result :cal SetSyn("snnsres") +an 50.120.140 &Syntax.Sn-Sy.Snobol4 :cal SetSyn("snobol4") +an 50.120.150 &Syntax.Sn-Sy.Snort\ Configuration :cal SetSyn("hog") +an 50.120.160 &Syntax.Sn-Sy.Solidity :cal SetSyn("solidity") +an 50.120.170 &Syntax.Sn-Sy.Spajson :cal SetSyn("spajson") +an 50.120.180 &Syntax.Sn-Sy.SPEC\ (Linux\ RPM) :cal SetSyn("spec") +an 50.120.190 &Syntax.Sn-Sy.Specman :cal SetSyn("specman") +an 50.120.200 &Syntax.Sn-Sy.Spice :cal SetSyn("spice") +an 50.120.210 &Syntax.Sn-Sy.Spyce :cal SetSyn("spyce") +an 50.120.220 &Syntax.Sn-Sy.Speedup :cal SetSyn("spup") +an 50.120.230 &Syntax.Sn-Sy.Splint :cal SetSyn("splint") +an 50.120.240 &Syntax.Sn-Sy.Squid\ config :cal SetSyn("squid") +an 50.120.250 &Syntax.Sn-Sy.Squirrel :cal SetSyn("squirrel") +an 50.120.260 &Syntax.Sn-Sy.SQL.SAP\ HANA :cal SetSyn("sqlhana") +an 50.120.270 &Syntax.Sn-Sy.SQL.ESQL-C :cal SetSyn("esqlc") +an 50.120.280 &Syntax.Sn-Sy.SQL.MySQL :cal SetSyn("mysql") +an 50.120.290 &Syntax.Sn-Sy.SQL.PL/SQL :cal SetSyn("plsql") +an 50.120.300 &Syntax.Sn-Sy.SQL.SQL\ Anywhere :cal SetSyn("sqlanywhere") +an 50.120.310 &Syntax.Sn-Sy.SQL.SQL\ (automatic) :cal SetSyn("sql") +an 50.120.320 &Syntax.Sn-Sy.SQL.SQL\ (Oracle) :cal SetSyn("sqloracle") +an 50.120.330 &Syntax.Sn-Sy.SQL.SQL\ Forms :cal SetSyn("sqlforms") +an 50.120.340 &Syntax.Sn-Sy.SQL.SQLJ :cal SetSyn("sqlj") +an 50.120.350 &Syntax.Sn-Sy.SQL.SQL-Informix :cal SetSyn("sqlinformix") +an 50.120.360 &Syntax.Sn-Sy.SQR :cal SetSyn("sqr") +an 50.120.370 &Syntax.Sn-Sy.Srt :cal SetSyn("srt") +an 50.120.380 &Syntax.Sn-Sy.Ssa :cal SetSyn("ssa") +an 50.120.390 &Syntax.Sn-Sy.Ssh.ssh_allowedsigners :cal SetSyn("sshallowedsigners") +an 50.120.400 &Syntax.Sn-Sy.Ssh.ssh_authorizedkeys :cal SetSyn("sshauthorizedkeys") +an 50.120.410 &Syntax.Sn-Sy.Ssh.ssh_config :cal SetSyn("sshconfig") +an 50.120.420 &Syntax.Sn-Sy.Ssh.sshd_config :cal SetSyn("sshdconfig") +an 50.120.430 &Syntax.Sn-Sy.Ssh.ssh_knownhosts :cal SetSyn("sshknownhosts") +an 50.120.440 &Syntax.Sn-Sy.Ssh.ssh_publickey :cal SetSyn("sshpublickey") +an 50.120.450 &Syntax.Sn-Sy.Standard\ ML :cal SetSyn("sml") +an 50.120.460 &Syntax.Sn-Sy.Stata.SMCL :cal SetSyn("smcl") +an 50.120.470 &Syntax.Sn-Sy.Stata.Stata :cal SetSyn("stata") +an 50.120.480 &Syntax.Sn-Sy.Stored\ Procedures :cal SetSyn("stp") +an 50.120.490 &Syntax.Sn-Sy.Strace :cal SetSyn("strace") +an 50.120.500 &Syntax.Sn-Sy.Streaming\ descriptor\ file :cal SetSyn("sd") +an 50.120.510 &Syntax.Sn-Sy.Structurizr :cal SetSyn("structurizr") +an 50.120.520 &Syntax.Sn-Sy.Stylus :cal SetSyn("stylus") +an 50.120.530 &Syntax.Sn-Sy.Subversion\ commit :cal SetSyn("svn") +an 50.120.540 &Syntax.Sn-Sy.Sudoers :cal SetSyn("sudoers") +an 50.120.550 &Syntax.Sn-Sy.SVG :cal SetSyn("svg") +an 50.120.560 &Syntax.Sn-Sy.Swayconfig :cal SetSyn("swayconfig") +an 50.120.570 &Syntax.Sn-Sy.Swift.Swift :cal SetSyn("swift") +an 50.120.580 &Syntax.Sn-Sy.Swift.GYB :cal SetSyn("swiftgyb") +an 50.120.590 &Syntax.Sn-Sy.Swig :cal SetSyn("swig") +an 50.120.600 &Syntax.Sn-Sy.Symbian\ meta-makefile :cal SetSyn("mmp") +an 50.120.610 &Syntax.Sn-Sy.Sysctl\.conf :cal SetSyn("sysctl") +an 50.120.620 &Syntax.Sn-Sy.Systemd :cal SetSyn("systemd") +an 50.120.630 &Syntax.Sn-Sy.SystemVerilog :cal SetSyn("systemverilog") +an 50.130.100 &Syntax.T.TADS :cal SetSyn("tads") +an 50.130.110 &Syntax.T.Tags :cal SetSyn("tags") +an 50.130.120 &Syntax.T.TAK.TAK\ compare :cal SetSyn("takcmp") +an 50.130.130 &Syntax.T.TAK.TAK\ input :cal SetSyn("tak") +an 50.130.140 &Syntax.T.TAK.TAK\ output :cal SetSyn("takout") +an 50.130.150 &Syntax.T.Tar\ listing :cal SetSyn("tar") +an 50.130.160 &Syntax.T.Task\ data :cal SetSyn("taskdata") +an 50.130.170 &Syntax.T.Task\ 42\ edit :cal SetSyn("taskedit") +an 50.130.180 &Syntax.T.Tcl/Tk :cal SetSyn("tcl") +an 50.130.190 &Syntax.T.TealInfo :cal SetSyn("tli") +an 50.130.200 &Syntax.T.Telix\ Salt :cal SetSyn("tsalt") +an 50.130.210 &Syntax.T.Termcap/Printcap :cal SetSyn("ptcap") +an 50.130.220 &Syntax.T.Terminfo :cal SetSyn("terminfo") +an 50.130.230 &Syntax.T.Tera :cal SetSyn("tera") +an 50.130.240 &Syntax.T.Tera\ Term :cal SetSyn("teraterm") +an 50.130.250 &Syntax.T.Terraform :cal SetSyn("terraform") +an 50.130.260 &Syntax.T.TeX.TeX/LaTeX :cal SetSyn("tex") +an 50.130.270 &Syntax.T.TeX.plain\ TeX :cal SetSyn("plaintex") +an 50.130.280 &Syntax.T.TeX.Initex :cal SetSyn("initex") +an 50.130.290 &Syntax.T.TeX.ConTeXt :cal SetSyn("context") +an 50.130.300 &Syntax.T.TeX.TeX\ configuration :cal SetSyn("texmf") +an 50.130.310 &Syntax.T.TeX.Texinfo :cal SetSyn("texinfo") +an 50.130.320 &Syntax.T.TF\ mud\ client :cal SetSyn("tf") +an 50.130.330 &Syntax.T.Thrift :cal SetSyn("thrift") +an 50.130.340 &Syntax.T.Tiasm :cal SetSyn("tiasm") +an 50.130.350 &Syntax.T.Tidy\ configuration :cal SetSyn("tidy") +an 50.130.360 &Syntax.T.Tilde :cal SetSyn("tilde") +an 50.130.370 &Syntax.T.Tmux\ configuration :cal SetSyn("tmux") +an 50.130.380 &Syntax.T.Tolk :cal SetSyn("tolk") +an 50.130.390 &Syntax.T.TOML :cal SetSyn("toml") +an 50.130.400 &Syntax.T.TPP :cal SetSyn("tpp") +an 50.130.410 &Syntax.T.Trasys\ input :cal SetSyn("trasys") +an 50.130.420 &Syntax.T.Treetop :cal SetSyn("treetop") +an 50.130.430 &Syntax.T.Trustees :cal SetSyn("trustees") +an 50.130.440 &Syntax.T.TSS.Command\ Line :cal SetSyn("tsscl") +an 50.130.450 &Syntax.T.TSS.Geometry :cal SetSyn("tssgm") +an 50.130.460 &Syntax.T.TSS.Optics :cal SetSyn("tssop") +an 50.130.470 &Syntax.T.Typescript :cal SetSyn("typescript") +an 50.130.480 &Syntax.T.TypescriptReact :cal SetSyn("typescriptreact") +an 50.130.490 &Syntax.T.Typst :cal SetSyn("typst") +an 50.140.100 &Syntax.UV.Uci :cal SetSyn("uci") +an 50.140.110 &Syntax.UV.Udev\ config :cal SetSyn("udevconf") +an 50.140.120 &Syntax.UV.Udev\ permissions :cal SetSyn("udevperm") +an 50.140.130 &Syntax.UV.Udev\ rules :cal SetSyn("udevrules") +an 50.140.140 &Syntax.UV.UIT/UIL :cal SetSyn("uil") +an 50.140.150 &Syntax.UV.Unison :cal SetSyn("unison") +an 50.140.160 &Syntax.UV.UnrealScript :cal SetSyn("uc") +an 50.140.170 &Syntax.UV.Updatedb\.conf :cal SetSyn("updatedb") +an 50.140.180 &Syntax.UV.Upstart :cal SetSyn("upstart") +an 50.140.190 &Syntax.UV.URLShortcut :cal SetSyn("urlshortcut") +an 50.140.210 &Syntax.UV.Valgrind :cal SetSyn("valgrind") +an 50.140.220 &Syntax.UV.VDF :cal SetSyn("vdf") +an 50.140.230 &Syntax.UV.Vera :cal SetSyn("vera") +an 50.140.240 &Syntax.UV.Verbose\ TAP\ Output :cal SetSyn("tap") +an 50.140.250 &Syntax.UV.Verilog-AMS\ HDL :cal SetSyn("verilogams") +an 50.140.260 &Syntax.UV.Verilog\ HDL :cal SetSyn("verilog") +an 50.140.270 &Syntax.UV.Vgrindefs :cal SetSyn("vgrindefs") +an 50.140.280 &Syntax.UV.VHDL :cal SetSyn("vhdl") +an 50.140.290 &Syntax.UV.Vim.Vim\ help\ file :cal SetSyn("help") +an 50.140.300 &Syntax.UV.Vim.Vim\ script :cal SetSyn("vim") +an 50.140.310 &Syntax.UV.Vim.Vim\ tutor :cal SetSyn("tutor") +an 50.140.320 &Syntax.UV.Vim.Viminfo\ file :cal SetSyn("viminfo") +an 50.140.330 &Syntax.UV.Virata\ config :cal SetSyn("virata") +an 50.140.340 &Syntax.UV.Visual\ Basic :cal SetSyn("vb") +an 50.140.350 &Syntax.UV.VOS\ CM\ macro :cal SetSyn("voscm") +an 50.140.360 &Syntax.UV.VRML :cal SetSyn("vrml") +an 50.140.370 &Syntax.UV.Vroom :cal SetSyn("vroom") +an 50.140.380 &Syntax.UV.VSE\ JCL :cal SetSyn("vsejcl") +an 50.150.100 &Syntax.WXYZ.WDL :cal SetSyn("wdl") +an 50.150.110 &Syntax.WXYZ.WEB.CWEB :cal SetSyn("cweb") +an 50.150.120 &Syntax.WXYZ.WEB.WEB :cal SetSyn("web") +an 50.150.130 &Syntax.WXYZ.WEB.WEB\ Changes :cal SetSyn("change") +an 50.150.140 &Syntax.WXYZ.WebAssembly :cal SetSyn("wat") +an 50.150.150 &Syntax.WXYZ.Webmacro :cal SetSyn("webmacro") +an 50.150.160 &Syntax.WXYZ.Website\ MetaLanguage :cal SetSyn("wml") +an 50.150.180 &Syntax.WXYZ.wDiff :cal SetSyn("wdiff") +an 50.150.200 &Syntax.WXYZ.Wget\ config :cal SetSyn("wget") +an 50.150.210 &Syntax.WXYZ.Wget2 :cal SetSyn("wget2") +an 50.150.220 &Syntax.WXYZ.Whitespace\ (add) :cal SetSyn("whitespace") +an 50.150.230 &Syntax.WXYZ.Wks :cal SetSyn("wks") +an 50.150.240 &Syntax.WXYZ.WildPackets\ EtherPeek\ Decoder :cal SetSyn("dcd") +an 50.150.250 &Syntax.WXYZ.WinBatch/Webbatch :cal SetSyn("winbatch") +an 50.150.260 &Syntax.WXYZ.Windows\ Scripting\ Host :cal SetSyn("wsh") +an 50.150.270 &Syntax.WXYZ.WSML :cal SetSyn("wsml") +an 50.150.280 &Syntax.WXYZ.WvDial :cal SetSyn("wvdial") +an 50.150.300 &Syntax.WXYZ.X.Compose :cal SetSyn("xcompose") +an 50.150.310 &Syntax.WXYZ.X.Keyboard\ Extension :cal SetSyn("xkb") +an 50.150.320 &Syntax.WXYZ.X.Pixmap :cal SetSyn("xpm") +an 50.150.330 &Syntax.WXYZ.X.Pixmap\ (2) :cal SetSyn("xpm2") +an 50.150.340 &Syntax.WXYZ.X.resources :cal SetSyn("xdefaults") +an 50.150.350 &Syntax.WXYZ.XBL :cal SetSyn("xbl") +an 50.150.360 &Syntax.WXYZ.Xinetd\.conf :cal SetSyn("xinetd") +an 50.150.370 &Syntax.WXYZ.Xmodmap :cal SetSyn("xmodmap") +an 50.150.380 &Syntax.WXYZ.Xmath :cal SetSyn("xmath") +an 50.150.390 &Syntax.WXYZ.XML :cal SetSyn("xml") +an 50.150.400 &Syntax.WXYZ.XML\ Schema\ (XSD) :cal SetSyn("xsd") +an 50.150.410 &Syntax.WXYZ.XQuery :cal SetSyn("xquery") +an 50.150.420 &Syntax.WXYZ.Xslt :cal SetSyn("xslt") +an 50.150.430 &Syntax.WXYZ.XFree86\ Config :cal SetSyn("xf86conf") +an 50.150.450 &Syntax.WXYZ.YAML :cal SetSyn("yaml") +an 50.150.460 &Syntax.WXYZ.Yacc :cal SetSyn("yacc") +an 50.150.480 &Syntax.WXYZ.Zathurarc :cal SetSyn("zathurarc") +an 50.150.490 &Syntax.WXYZ.ZIG :cal SetSyn("zig") +an 50.150.500 &Syntax.WXYZ.Zimbu :cal SetSyn("zimbu") +an 50.150.510 &Syntax.WXYZ.Zir :cal SetSyn("zir") +an 50.150.520 &Syntax.WXYZ.Zserio :cal SetSyn("zserio") " The End Of The Syntax Menu From 31b7b1a7da4e282ebdf09f3c1c3e16ded7b76e8a Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Tue, 4 Aug 2026 20:31:44 +0000 Subject: [PATCH 289/647] patch 9.2.0909: insert completion is slow to collect many matches Problem: ins_compl_add() checks for a duplicate by scanning the whole match list, making collection of N matches quadratic. Solution: Look matches up in a hashtab instead; each entry counts the matches with that string (Samuel Schlesinger). closes: #20926 Co-Authored-By: Claude Signed-off-by: Christian Brabandt --- src/hashtab.c | 2 - src/insexpand.c | 142 +++++++++++++++++++++++++++--- src/testdir/test_ins_complete.vim | 97 +++++++++++++++++++- src/version.c | 2 + 4 files changed, 225 insertions(+), 18 deletions(-) diff --git a/src/hashtab.c b/src/hashtab.c index 6d37748795..9533337c41 100644 --- a/src/hashtab.c +++ b/src/hashtab.c @@ -95,7 +95,6 @@ hash_clear(hashtab_T *ht) vim_free(ht->ht_array); } -#if defined(FEAT_SPELL) || defined(FEAT_TERMINAL) /* * Free the array of a hash table and all the keys it contains. The keys must * have been allocated. "off" is the offset from the start of the allocate @@ -118,7 +117,6 @@ hash_clear_all(hashtab_T *ht, int off) } hash_clear(ht); } -#endif /* * Find "key" in hashtable "ht". "key" must not be NULL. diff --git a/src/insexpand.c b/src/insexpand.c index 16b2e7b52b..b12f69eb0b 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -136,6 +136,56 @@ static compl_T *compl_curr_match = NULL; static compl_T *compl_shown_match = NULL; static compl_T *compl_old_match = NULL; +// Hashtab with the strings of the matches in the list above, except the +// original-text entries. Used to make the duplicate check O(1) instead of +// a scan of the whole list. Each entry owns a copy of the string and +// counts the matches with that string, so that when matches were added +// with "adup" the entry remains until the last match with the string is +// removed. +typedef struct +{ + int cse_count; // number of matches with this string + char_u cse_str[1]; // the string, actually longer +} complstr_T; + +#define CSE_OFF ((int)offsetof(complstr_T, cse_str)) +#define HI2CSE(hi) ((complstr_T *)((hi)->hi_key - CSE_OFF)) + +static hashtab_T compl_strings_ht; + +/* + * Count the string of a new match in the duplicate-check hashtab. + * "hash" is the hash of "str" when it is not zero, saving hashing the + * string again. + */ + static void +compl_strings_add(char_u *str, size_t len, hash_T hash) +{ + hashitem_T *hi; + complstr_T *entry; + + if (compl_strings_ht.ht_array == NULL) + hash_init(&compl_strings_ht); + if (hash == 0) + hash = hash_hash(str); + hi = hash_lookup(&compl_strings_ht, str, hash); + if (HASHITEM_EMPTY(hi)) + { + entry = alloc(CSE_OFF + len + 1); + if (entry == NULL) + // Out of memory: the duplicate check degrades, an equal string + // added later is not recognized as a duplicate. + return; + entry->cse_count = 1; + vim_strncpy(entry->cse_str, str, len); + if (hash_add_item(&compl_strings_ht, hi, entry->cse_str, hash) + == FAIL) + vim_free(entry); + } + else + ++HI2CSE(hi)->cse_count; +} + // list used to store the compl_T which have the max score static compl_T **compl_best_matches = NULL; static int compl_num_bests = 0; @@ -902,6 +952,8 @@ ins_compl_add( int dir = (cdir == 0 ? compl_direction : cdir); int flags = flags_arg; int inserted = FALSE; + char_u *new_str = NULL; + hash_T str_hash = 0; // hash of the match string, when not 0 if (flags & CP_FAST) fast_breakcheck(); @@ -913,22 +965,53 @@ ins_compl_add( len = (int)STRLEN(str); // If the same match is already present, don't add it. - if (compl_first_match != NULL && !adup) + if (compl_first_match != NULL && !adup && compl_strings_ht.ht_used > 0) { - match = compl_first_match; - do + // Use a stack buffer for the NUL-terminated key when it fits, so + // that rejecting a duplicate does not allocate memory. + char_u keybuf[128]; + char_u *key; + hashitem_T *hi; + + if (len < (int)sizeof(keybuf)) + { + mch_memmove(keybuf, str, (size_t)len); + keybuf[len] = NUL; + key = keybuf; + } + else + { + new_str = vim_strnsave(str, len); + if (new_str == NULL) + return FAIL; + key = new_str; + } + str_hash = hash_hash(key); + hi = hash_lookup(&compl_strings_ht, key, str_hash); + if (!HASHITEM_EMPTY(hi)) { - if (!match_at_original_text(match) - && STRNCMP(match->cp_str.string, str, len) == 0 - && ((int)match->cp_str.length <= len - || match->cp_str.string[len] == NUL)) + if (is_nearest_active() && score > 0) { - if (is_nearest_active() && score > 0 && score < match->cp_score) - match->cp_score = score; - return NOTDONE; + // The duplicate may need its score updated, scan the + // matches to find it. + match = compl_first_match; + do + { + if (!match_at_original_text(match) + && STRNCMP(match->cp_str.string, str, len) == 0 + && ((int)match->cp_str.length <= len + || match->cp_str.string[len] == NUL)) + { + if (score < match->cp_score) + match->cp_score = score; + break; + } + match = match->cp_next; + } while (match != NULL && !is_first_match(match)); } - match = match->cp_next; - } while (match != NULL && !is_first_match(match)); + vim_free(new_str); + return NOTDONE; + } } // Remove any popup menu before changing the list of matches. @@ -938,14 +1021,17 @@ ins_compl_add( // Copy the values to the new match structure. match = ALLOC_CLEAR_ONE(compl_T); if (match == NULL) + { + vim_free(new_str); return FAIL; + } match->cp_number = flags & CP_ORIGINAL_TEXT ? 0 : -1; - if ((match->cp_str.string = vim_strnsave(str, len)) == NULL) + if (new_str == NULL && (new_str = vim_strnsave(str, len)) == NULL) { vim_free(match); return FAIL; } - + match->cp_str.string = new_str; match->cp_str.length = len; // match-fname is: @@ -1035,6 +1121,10 @@ ins_compl_add( compl_first_match = match; compl_curr_match = match; + if (!match_at_original_text(match)) + compl_strings_add(match->cp_str.string, match->cp_str.length, + str_hash); + // Find the longest common string if still doing that. if (compl_get_longest && (flags & CP_ORIGINAL_TEXT) == 0 && !cot_fuzzy() && !ins_compl_preinsert_longest() && !ctrl_x_mode_thesaurus()) @@ -2263,6 +2353,25 @@ find_line_end(char_u *ptr) static void ins_compl_item_free(compl_T *match) { + // Uncount the match string in the duplicate-check hashtab; the entry is + // only removed with its last match. The hashtab is empty when it was + // already cleared as a whole by ins_compl_free(). + if (compl_strings_ht.ht_used > 0 && match->cp_str.string != NULL + && !match_at_original_text(match)) + { + hashitem_T *hi = hash_find(&compl_strings_ht, match->cp_str.string); + + if (!HASHITEM_EMPTY(hi)) + { + complstr_T *entry = HI2CSE(hi); + + if (--entry->cse_count <= 0) + { + hash_remove(&compl_strings_ht, hi, "completion match"); + vim_free(entry); + } + } + } VIM_CLEAR_STRING(match->cp_str); // several entries may use the same fname, free it just once. if (match->cp_flags & CP_FREE_FNAME) @@ -2292,6 +2401,11 @@ ins_compl_free(void) ins_compl_del_pum(); pum_clear(); + // Free the duplicate-check hashtab entries all at once, then freeing + // the matches below does not need to uncount them one by one. + hash_clear_all(&compl_strings_ht, CSE_OFF); + hash_init(&compl_strings_ht); + compl_curr_match = compl_first_match; do { diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 5dd18ecf2f..a0ee08dc10 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -5903,7 +5903,9 @@ func Test_completetimeout_autocompletetimeout() set completetimeout=1 call feedkeys("Gof\\\0", 'xt!') let match_count = len(b:matches->mapnew('v:val.word')) - call assert_true(match_count < 4000) + " How many matches are collected in 1 msec varies with machine speed, only + " check the timeout truncated the collection. + call assert_true(match_count < 60000) set completetimeout=1000 call feedkeys("\Sf\\\0", 'xt!') @@ -5912,9 +5914,14 @@ func Test_completetimeout_autocompletetimeout() set autocomplete set autocompletetimeout=81 + " Use enough long words that collecting all of them takes well over the + " timeout even on a fast machine. + let pad = repeat('y', 60) + call setline(1, map(range(200000), '"foo" . v:val . pad')) call feedkeys("\Sf\\0", 'xt!') let match_count = len(b:matches->mapnew('v:val.word')) - call assert_true(match_count < 50000) + " The timeout must have truncated the collection. + call assert_true(match_count < 200000) set complete& omnifunc& autocomplete& autocompletetimeout& completetimeout& bwipe! @@ -6634,4 +6641,90 @@ func Test_complete_check_mapped_typed_key() unlet g:compl_iterations endfunc +" Test for the duplicate check when adding completion matches +func Test_ins_complete_dedup() + new + setl complete=. + + " a word that occurs several times only results in one match + call setline(1, ['alpha beta alpha gamma', 'beta alpha delta beta', '']) + call cursor(3, 1) + call feedkeys("Aal\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['alpha'], g:compl_info.items->mapnew('v:val.word')) + + " the duplicate check is case-sensitive + %delete _ + call setline(1, ['Foo foo FOO fooBar Foo foo', '']) + call cursor(2, 1) + call feedkeys("Afo\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['foo', 'fooBar'], g:compl_info.items->mapnew('v:val.word')) + + " with 'ignorecase' and 'infercase' case variants fold into one match + setl ignorecase infercase + %delete _ + call setline(1, ['Word word WORD wordy Word', '']) + call cursor(2, 1) + call feedkeys("Awo\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['word', 'wordy'], g:compl_info.items->mapnew('v:val.word')) + setl noignorecase noinfercase + + " duplicate dictionary entries only appear once; with 'ignorecase' case + " variants all match but stay separate matches + call writefile(['apple', 'apple', 'Apple', 'apricot', 'apricot', 'banana'], + \ 'Xcompldict', 'D') + setl dictionary=Xcompldict + set ignorecase + %delete _ + call feedkeys("Aap\\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['apple', 'Apple', 'apricot'], g:compl_info.items->mapnew('v:val.word')) + set noignorecase + setl dictionary& + + " duplicate items passed to complete() are only added once + inoremap call complete(1, ['dup', 'dup', 'uniq', 'dup']) + %delete _ + call feedkeys("i\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['dup', 'uniq'], g:compl_info.items->mapnew('v:val.word')) + + " restarting a completion rebuilds the matches without duplicates + %delete _ + call setline(1, ['echo edit eecho edit echo', '']) + call cursor(2, 1) + call feedkeys("Ae\\\", 'tx') + call feedkeys("A\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['echo', 'edit', 'eecho'], g:compl_info.items->mapnew('v:val.word')) + + " With "dup" matches from several sources, refreshing one source removes + " its duplicate but must not forget about the equal match of the other + " source: adding "dupword" again without "dup" is still a duplicate. + let g:dedup_calls = 0 + func! DedupSrcA(findstart, base) + if a:findstart + return 0 + endif + let g:dedup_calls += 1 + if g:dedup_calls == 1 + return #{words: [#{word: 'dupword', dup: 1}], refresh: 'always'} + endif + return #{words: [#{word: 'dupword'}], refresh: 'always'} + endfunc + func! DedupSrcB(findstart, base) + if a:findstart + return 0 + endif + return #{words: [#{word: 'dupword', dup: 1}]} + endfunc + setl complete=FDedupSrcA,FDedupSrcB + %delete _ + call feedkeys("Sdup\\\=GetCompleteInfo()\\\", 'tx') + call assert_equal(['dupword'], g:compl_info.items->mapnew('v:val.word')) + setl complete& + delfunc DedupSrcA + delfunc DedupSrcB + unlet g:dedup_calls + + bwipe! + unlet g:compl_info +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/version.c b/src/version.c index bc604af0b3..cba6e9a4f5 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 909, /**/ 908, /**/ From 78ebe0f424a979ef72e2e27c62cf693595ba560c Mon Sep 17 00:00:00 2001 From: "Philip H." <47042125+pheiduck@users.noreply.github.com> Date: Tue, 4 Aug 2026 20:41:29 +0000 Subject: [PATCH 290/647] CI: bump clang to v22 in ci-linux_asan closes: #20928 Signed-off-by: Philip H. <47042125+pheiduck@users.noreply.github.com> Signed-off-by: Christian Brabandt --- .github/workflows/ci-linux_asan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-linux_asan.yml b/.github/workflows/ci-linux_asan.yml index 394df10e83..45f69b1e78 100644 --- a/.github/workflows/ci-linux_asan.yml +++ b/.github/workflows/ci-linux_asan.yml @@ -19,7 +19,7 @@ jobs: env: CC: clang - CLANG_VER: 21 + CLANG_VER: 22 SRCDIR: ./src LEAK_CFLAGS: -DEXITFREE LOG_DIR: ${{ github.workspace }}/logs From 9e4e00710c712a216324a811af5b79a48a9ecf4c Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Tue, 4 Aug 2026 21:00:38 +0000 Subject: [PATCH 291/647] patch 9.2.0910: runtime(vim): Update syntax, contain Ex commands Problem: Vim Syntax Script can be improved Solution: Rework syntax script, update syntax tests and unit tests (Doug Kearns). - Contain Ex commands to valid syntactic contexts. - Add full address (:range) matching. - Match :Next, :Print, :X, :global, :&, :~, :>, :<, :# and := commands. - Match text input commands with folding. Use :syn-keyword to match all commands except when immediately following \w range characters where :syn-match is employed. fixes: #20250 (variables with s_ prefix are wrongly highlighted) fixes: #17543 (do not highlight vim commands within :runtime) fixes: #16937 (do not highlight vim commands after packadd) fixes: #14895 (incorrect highlighting of Vim syntax) fixes: #14020 (insert commands) closes: #19331 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/doc/syntax.txt | 3 +- runtime/syntax/generator/gen_syntax_vim.vim | 134 +- runtime/syntax/generator/vim.vim.base | 3516 +++++++++------- runtime/syntax/help.vim | 5 +- .../vim9_builtin_object_methods2_00.dump | 4 +- .../testdir/dumps/vim9_comments_04.dump | 2 +- .../testdir/dumps/vim9_def_variables_03.dump | 22 +- .../testdir/dumps/vim9_def_variables_04.dump | 8 +- .../testdir/dumps/vim9_def_variables_07.dump | 12 +- .../testdir/dumps/vim9_def_variables_08.dump | 34 +- .../testdir/dumps/vim9_def_variables_09.dump | 38 +- .../testdir/dumps/vim9_def_variables_10.dump | 14 +- .../testdir/dumps/vim9_ex_commands_00.dump | 18 +- .../testdir/dumps/vim9_ex_commands_01.dump | 20 +- .../testdir/dumps/vim9_ex_commands_02.dump | 16 +- .../testdir/dumps/vim9_ex_commands_03.dump | 18 +- .../testdir/dumps/vim9_ex_commands_04.dump | 16 +- .../testdir/dumps/vim9_ex_commands_05.dump | 20 +- .../testdir/dumps/vim9_ex_commands_06.dump | 18 +- .../testdir/dumps/vim9_ex_commands_07.dump | 20 +- .../testdir/dumps/vim9_ex_commands_08.dump | 16 +- .../testdir/dumps/vim9_ex_commands_09.dump | 18 +- .../testdir/dumps/vim9_ex_commands_10.dump | 16 +- .../testdir/dumps/vim9_ex_commands_11.dump | 16 +- .../testdir/dumps/vim9_ex_commands_12.dump | 12 +- .../testdir/dumps/vim9_ex_commands_13.dump | 16 +- .../testdir/dumps/vim9_ex_commands_14.dump | 14 +- .../testdir/dumps/vim9_ex_commands_15.dump | 14 +- .../testdir/dumps/vim9_ex_commands_16.dump | 14 +- .../testdir/dumps/vim9_ex_commands_17.dump | 16 +- .../testdir/dumps/vim9_ex_commands_18.dump | 14 +- .../testdir/dumps/vim9_ex_commands_19.dump | 14 +- .../testdir/dumps/vim9_ex_commands_20.dump | 14 +- .../testdir/dumps/vim9_ex_commands_21.dump | 14 +- .../testdir/dumps/vim9_ex_commands_22.dump | 14 +- .../testdir/dumps/vim9_ex_commands_23.dump | 14 +- .../testdir/dumps/vim9_ex_commands_24.dump | 14 +- .../testdir/dumps/vim9_ex_commands_25.dump | 14 +- .../testdir/dumps/vim9_ex_commands_26.dump | 12 +- .../testdir/dumps/vim9_ex_commands_27.dump | 12 +- .../testdir/dumps/vim9_ex_commands_28.dump | 12 +- .../testdir/dumps/vim9_ex_commands_29.dump | 12 +- .../testdir/dumps/vim9_ex_commands_30.dump | 14 +- .../testdir/dumps/vim9_ex_commands_31.dump | 12 +- .../testdir/dumps/vim9_ex_commands_32.dump | 12 +- .../testdir/dumps/vim9_ex_commands_33.dump | 28 +- .../testdir/dumps/vim9_ex_commands_34.dump | 40 +- .../testdir/dumps/vim9_ex_commands_35.dump | 40 +- .../testdir/dumps/vim9_ex_commands_36.dump | 40 +- .../testdir/dumps/vim9_ex_commands_37.dump | 40 +- .../testdir/dumps/vim9_ex_commands_38.dump | 40 +- .../testdir/dumps/vim9_ex_commands_39.dump | 40 +- .../testdir/dumps/vim9_ex_commands_40.dump | 40 +- .../testdir/dumps/vim9_ex_commands_41.dump | 40 +- .../testdir/dumps/vim9_ex_commands_42.dump | 40 +- .../testdir/dumps/vim9_ex_commands_43.dump | 40 +- .../testdir/dumps/vim9_ex_commands_44.dump | 40 +- .../testdir/dumps/vim9_ex_commands_45.dump | 40 +- .../testdir/dumps/vim9_ex_commands_46.dump | 40 +- .../testdir/dumps/vim9_ex_commands_47.dump | 40 +- .../testdir/dumps/vim9_ex_commands_48.dump | 40 +- .../testdir/dumps/vim9_ex_commands_49.dump | 40 +- .../testdir/dumps/vim9_ex_commands_50.dump | 40 +- .../testdir/dumps/vim9_ex_commands_51.dump | 40 +- .../testdir/dumps/vim9_ex_commands_52.dump | 40 +- .../testdir/dumps/vim9_ex_commands_53.dump | 40 +- .../testdir/dumps/vim9_ex_commands_54.dump | 40 +- .../testdir/dumps/vim9_ex_commands_55.dump | 40 +- .../testdir/dumps/vim9_ex_commands_56.dump | 40 +- .../testdir/dumps/vim9_ex_commands_57.dump | 40 +- .../testdir/dumps/vim9_ex_commands_58.dump | 40 +- .../testdir/dumps/vim9_ex_commands_59.dump | 40 +- .../testdir/dumps/vim9_ex_commands_60.dump | 40 +- .../testdir/dumps/vim9_ex_commands_61.dump | 40 +- .../testdir/dumps/vim9_ex_commands_62.dump | 40 +- .../testdir/dumps/vim9_ex_commands_63.dump | 40 +- .../testdir/dumps/vim9_ex_commands_64.dump | 40 +- .../testdir/dumps/vim9_ex_commands_65.dump | 40 +- .../testdir/dumps/vim9_ex_commands_66.dump | 34 +- .../testdir/dumps/vim9_ex_commands_67.dump | 36 +- .../testdir/dumps/vim9_ex_commands_68.dump | 20 + .../testdir/dumps/vim9_ex_commands_69.dump | 20 + .../testdir/dumps/vim9_ex_commands_70.dump | 20 + .../testdir/dumps/vim9_ex_defcompile_00.dump | 20 + .../testdir/dumps/vim9_ex_defcompile_01.dump | 20 + .../testdir/dumps/vim9_ex_disassemble_00.dump | 20 + .../testdir/dumps/vim9_ex_disassemble_01.dump | 20 + .../syntax/testdir/dumps/vim9_ex_enum_02.dump | 2 +- .../syntax/testdir/dumps/vim9_ex_enum_03.dump | 4 +- .../testdir/dumps/vim9_ex_enum_fold_02.dump | 2 +- .../syntax/testdir/dumps/vim9_ex_for_04.dump | 4 +- .../testdir/dumps/vim9_ex_let_heredoc_02.dump | 2 +- .../testdir/dumps/vim9_ex_let_heredoc_03.dump | 2 +- .../testdir/dumps/vim9_ex_range_00.dump | 20 + .../testdir/dumps/vim9_ex_range_01.dump | 20 + .../testdir/dumps/vim9_ex_range_02.dump | 20 + .../testdir/dumps/vim9_ex_range_03.dump | 20 + .../testdir/dumps/vim9_ex_range_04.dump | 20 + .../testdir/dumps/vim9_ex_range_05.dump | 20 + .../testdir/dumps/vim9_ex_range_06.dump | 20 + .../testdir/dumps/vim9_ex_range_07.dump | 20 + .../testdir/dumps/vim9_ex_range_08.dump | 20 + .../testdir/dumps/vim9_ex_range_09.dump | 20 + .../testdir/dumps/vim9_ex_range_10.dump | 20 + .../testdir/dumps/vim9_ex_range_11.dump | 20 + .../testdir/dumps/vim9_ex_range_12.dump | 20 + .../testdir/dumps/vim9_ex_range_13.dump | 20 + .../testdir/dumps/vim9_ex_range_14.dump | 20 + .../testdir/dumps/vim9_ex_range_15.dump | 20 + .../testdir/dumps/vim9_ex_range_16.dump | 20 + .../testdir/dumps/vim9_ex_range_17.dump | 20 + .../testdir/dumps/vim9_ex_range_18.dump | 20 + .../testdir/dumps/vim9_ex_range_19.dump | 20 + .../testdir/dumps/vim9_ex_range_20.dump | 20 + .../testdir/dumps/vim9_ex_range_21.dump | 20 + .../testdir/dumps/vim9_ex_range_22.dump | 20 + .../testdir/dumps/vim9_ex_range_23.dump | 20 + .../testdir/dumps/vim9_ex_range_24.dump | 20 + .../testdir/dumps/vim9_ex_range_25.dump | 20 + .../testdir/dumps/vim9_ex_range_26.dump | 20 + .../testdir/dumps/vim9_ex_range_27.dump | 20 + .../testdir/dumps/vim9_ex_range_28.dump | 20 + .../testdir/dumps/vim9_ex_range_29.dump | 20 + .../testdir/dumps/vim9_ex_range_30.dump | 20 + .../testdir/dumps/vim9_ex_range_31.dump | 20 + .../testdir/dumps/vim9_ex_range_32.dump | 20 + .../testdir/dumps/vim9_ex_range_33.dump | 20 + .../testdir/dumps/vim9_ex_range_34.dump | 20 + .../testdir/dumps/vim9_ex_range_35.dump | 20 + .../testdir/dumps/vim9_ex_range_36.dump | 20 + .../testdir/dumps/vim9_ex_range_37.dump | 20 + .../testdir/dumps/vim9_ex_range_38.dump | 20 + .../testdir/dumps/vim9_ex_range_39.dump | 20 + .../testdir/dumps/vim9_ex_range_40.dump | 20 + .../testdir/dumps/vim9_ex_range_41.dump | 20 + .../testdir/dumps/vim9_ex_range_42.dump | 20 + .../testdir/dumps/vim9_ex_range_43.dump | 20 + .../testdir/dumps/vim9_ex_range_44.dump | 20 + .../testdir/dumps/vim9_ex_range_45.dump | 20 + .../testdir/dumps/vim9_ex_range_46.dump | 20 + .../testdir/dumps/vim9_ex_range_47.dump | 20 + .../testdir/dumps/vim9_ex_range_48.dump | 20 + .../testdir/dumps/vim9_ex_range_49.dump | 20 + .../testdir/dumps/vim9_ex_range_50.dump | 20 + .../testdir/dumps/vim9_ex_range_51.dump | 20 + .../testdir/dumps/vim9_ex_range_52.dump | 20 + .../testdir/dumps/vim9_ex_range_53.dump | 20 + .../testdir/dumps/vim9_ex_range_54.dump | 20 + .../testdir/dumps/vim9_ex_range_55.dump | 20 + .../testdir/dumps/vim9_ex_range_56.dump | 20 + .../testdir/dumps/vim9_ex_range_57.dump | 20 + .../testdir/dumps/vim9_ex_range_58.dump | 20 + .../testdir/dumps/vim9_ex_range_59.dump | 20 + .../testdir/dumps/vim9_ex_range_60.dump | 20 + .../testdir/dumps/vim9_ex_range_61.dump | 20 + .../testdir/dumps/vim9_ex_range_62.dump | 20 + .../testdir/dumps/vim9_ex_range_63.dump | 20 + .../testdir/dumps/vim9_ex_range_64.dump | 20 + .../testdir/dumps/vim9_ex_range_65.dump | 20 + .../testdir/dumps/vim9_ex_range_66.dump | 20 + .../testdir/dumps/vim9_ex_range_67.dump | 20 + .../testdir/dumps/vim9_ex_range_68.dump | 20 + .../testdir/dumps/vim9_ex_range_69.dump | 20 + .../testdir/dumps/vim9_expressions_10.dump | 2 +- .../testdir/dumps/vim9_expressions_11.dump | 2 +- .../testdir/dumps/vim9_function_calls_09.dump | 4 +- .../syntax/testdir/dumps/vim9_lambdas_07.dump | 2 +- .../testdir/dumps/vim9_legacy_header_00.dump | 2 +- .../dumps/vim9_legacy_header_fold_00.dump | 2 +- .../dumps/vim9_super_this_keywords2_00.dump | 4 +- .../dumps/vim9_super_this_keywords2_01.dump | 4 +- .../dumps/vim9_super_this_keywords_01.dump | 6 +- .../dumps/vim9_super_this_keywords_02.dump | 2 +- .../syntax/testdir/dumps/vim_comments_00.dump | 4 +- .../syntax/testdir/dumps/vim_comments_01.dump | 2 +- .../syntax/testdir/dumps/vim_comments_02.dump | 2 +- .../syntax/testdir/dumps/vim_comments_03.dump | 18 +- .../syntax/testdir/dumps/vim_comments_04.dump | 20 +- .../syntax/testdir/dumps/vim_comments_05.dump | 20 + .../testdir/dumps/vim_ex_append_00.dump | 20 + .../testdir/dumps/vim_ex_append_01.dump | 20 + .../testdir/dumps/vim_ex_append_02.dump | 20 + .../testdir/dumps/vim_ex_append_03.dump | 20 + .../testdir/dumps/vim_ex_append_04.dump | 20 + .../testdir/dumps/vim_ex_append_05.dump | 20 + .../testdir/dumps/vim_ex_append_06.dump | 20 + .../testdir/dumps/vim_ex_append_07.dump | 20 + .../testdir/dumps/vim_ex_append_08.dump | 20 + .../testdir/dumps/vim_ex_append_09.dump | 20 + .../testdir/dumps/vim_ex_append_10.dump | 20 + .../testdir/dumps/vim_ex_append_11.dump | 20 + .../testdir/dumps/vim_ex_autocmd_07.dump | 4 +- .../testdir/dumps/vim_ex_autocmd_09.dump | 4 +- .../testdir/dumps/vim_ex_change_00.dump | 20 + .../testdir/dumps/vim_ex_change_01.dump | 20 + .../testdir/dumps/vim_ex_change_02.dump | 20 + .../testdir/dumps/vim_ex_change_03.dump | 20 + .../testdir/dumps/vim_ex_change_04.dump | 20 + .../testdir/dumps/vim_ex_change_05.dump | 20 + .../testdir/dumps/vim_ex_change_06.dump | 20 + .../testdir/dumps/vim_ex_change_07.dump | 20 + .../testdir/dumps/vim_ex_change_08.dump | 20 + .../testdir/dumps/vim_ex_change_09.dump | 20 + .../testdir/dumps/vim_ex_change_10.dump | 20 + .../testdir/dumps/vim_ex_change_11.dump | 20 + .../testdir/dumps/vim_ex_change_12.dump | 20 + .../testdir/dumps/vim_ex_change_13.dump | 20 + .../testdir/dumps/vim_ex_change_14.dump | 20 + .../testdir/dumps/vim_ex_change_15.dump | 20 + .../dumps/vim_ex_command_modifiers_01.dump | 2 +- .../dumps/vim_ex_command_modifiers_02.dump | 6 +- .../dumps/vim_ex_command_modifiers_03.dump | 10 +- .../dumps/vim_ex_command_modifiers_04.dump | 10 +- .../dumps/vim_ex_command_modifiers_05.dump | 10 +- .../dumps/vim_ex_command_modifiers_06.dump | 10 +- .../dumps/vim_ex_command_modifiers_07.dump | 14 +- .../dumps/vim_ex_command_modifiers_08.dump | 20 + .../dumps/vim_ex_command_modifiers_09.dump | 20 + .../dumps/vim_ex_command_modifiers_10.dump | 20 + .../dumps/vim_ex_command_modifiers_11.dump | 20 + .../dumps/vim_ex_command_modifiers_12.dump | 20 + .../dumps/vim_ex_command_modifiers_13.dump | 20 + .../dumps/vim_ex_command_modifiers_14.dump | 20 + .../dumps/vim_ex_command_modifiers_15.dump | 20 + .../dumps/vim_ex_command_modifiers_16.dump | 20 + .../dumps/vim_ex_command_modifiers_17.dump | 20 + .../dumps/vim_ex_command_modifiers_18.dump | 20 + .../testdir/dumps/vim_ex_commands_00.dump | 20 +- .../testdir/dumps/vim_ex_commands_01.dump | 20 +- .../testdir/dumps/vim_ex_commands_02.dump | 20 +- .../testdir/dumps/vim_ex_commands_03.dump | 20 +- .../testdir/dumps/vim_ex_commands_04.dump | 14 +- .../testdir/dumps/vim_ex_commands_05.dump | 18 +- .../testdir/dumps/vim_ex_commands_06.dump | 24 +- .../testdir/dumps/vim_ex_commands_07.dump | 22 +- .../testdir/dumps/vim_ex_commands_08.dump | 20 +- .../testdir/dumps/vim_ex_commands_09.dump | 18 +- .../testdir/dumps/vim_ex_commands_10.dump | 14 +- .../testdir/dumps/vim_ex_commands_11.dump | 20 +- .../testdir/dumps/vim_ex_commands_12.dump | 18 +- .../testdir/dumps/vim_ex_commands_13.dump | 18 +- .../testdir/dumps/vim_ex_commands_14.dump | 14 +- .../testdir/dumps/vim_ex_commands_15.dump | 8 +- .../testdir/dumps/vim_ex_commands_16.dump | 18 +- .../testdir/dumps/vim_ex_commands_17.dump | 18 +- .../testdir/dumps/vim_ex_commands_18.dump | 18 +- .../testdir/dumps/vim_ex_commands_19.dump | 16 +- .../testdir/dumps/vim_ex_commands_20.dump | 18 +- .../testdir/dumps/vim_ex_commands_21.dump | 18 +- .../testdir/dumps/vim_ex_commands_22.dump | 20 +- .../testdir/dumps/vim_ex_commands_23.dump | 18 +- .../testdir/dumps/vim_ex_commands_24.dump | 10 +- .../testdir/dumps/vim_ex_commands_25.dump | 14 +- .../testdir/dumps/vim_ex_commands_26.dump | 18 +- .../testdir/dumps/vim_ex_commands_27.dump | 18 +- .../testdir/dumps/vim_ex_commands_28.dump | 12 +- .../testdir/dumps/vim_ex_commands_29.dump | 16 +- .../testdir/dumps/vim_ex_commands_30.dump | 20 +- .../testdir/dumps/vim_ex_commands_31.dump | 16 +- .../testdir/dumps/vim_ex_commands_32.dump | 18 +- .../testdir/dumps/vim_ex_commands_33.dump | 28 +- .../testdir/dumps/vim_ex_commands_34.dump | 40 +- .../testdir/dumps/vim_ex_commands_35.dump | 40 +- .../testdir/dumps/vim_ex_commands_36.dump | 40 +- .../testdir/dumps/vim_ex_commands_37.dump | 40 +- .../testdir/dumps/vim_ex_commands_38.dump | 40 +- .../testdir/dumps/vim_ex_commands_39.dump | 40 +- .../testdir/dumps/vim_ex_commands_40.dump | 40 +- .../testdir/dumps/vim_ex_commands_41.dump | 40 +- .../testdir/dumps/vim_ex_commands_42.dump | 38 +- .../testdir/dumps/vim_ex_commands_43.dump | 40 +- .../testdir/dumps/vim_ex_commands_44.dump | 40 +- .../testdir/dumps/vim_ex_commands_45.dump | 38 +- .../testdir/dumps/vim_ex_commands_46.dump | 38 +- .../testdir/dumps/vim_ex_commands_47.dump | 32 +- .../testdir/dumps/vim_ex_commands_48.dump | 32 +- .../testdir/dumps/vim_ex_commands_49.dump | 38 +- .../testdir/dumps/vim_ex_commands_50.dump | 36 +- .../testdir/dumps/vim_ex_commands_51.dump | 38 +- .../testdir/dumps/vim_ex_commands_52.dump | 38 +- .../testdir/dumps/vim_ex_commands_53.dump | 36 +- .../testdir/dumps/vim_ex_commands_54.dump | 38 +- .../testdir/dumps/vim_ex_commands_55.dump | 38 +- .../testdir/dumps/vim_ex_commands_56.dump | 38 +- .../testdir/dumps/vim_ex_commands_57.dump | 34 +- .../testdir/dumps/vim_ex_commands_58.dump | 34 +- .../testdir/dumps/vim_ex_commands_59.dump | 36 +- .../testdir/dumps/vim_ex_commands_60.dump | 38 +- .../testdir/dumps/vim_ex_commands_61.dump | 34 +- .../testdir/dumps/vim_ex_commands_62.dump | 36 +- .../testdir/dumps/vim_ex_commands_63.dump | 34 +- .../testdir/dumps/vim_ex_commands_64.dump | 34 +- .../testdir/dumps/vim_ex_commands_65.dump | 36 +- .../testdir/dumps/vim_ex_commands_66.dump | 32 +- .../testdir/dumps/vim_ex_commands_67.dump | 38 +- .../testdir/dumps/vim_ex_commands_68.dump | 20 + .../testdir/dumps/vim_ex_commands_69.dump | 20 + .../testdir/dumps/vim_ex_debuggreedy_01.dump | 6 +- .../testdir/dumps/vim_ex_debuggreedy_02.dump | 2 +- .../testdir/dumps/vim_ex_def_nested_00.dump | 2 +- .../testdir/dumps/vim_ex_def_nested_01.dump | 2 +- .../testdir/dumps/vim_ex_delete_00.dump | 20 + .../testdir/dumps/vim_ex_delete_01.dump | 20 + .../testdir/dumps/vim_ex_delete_02.dump | 20 + .../testdir/dumps/vim_ex_delete_03.dump | 20 + .../testdir/dumps/vim_ex_delete_04.dump | 20 + .../testdir/dumps/vim_ex_delete_05.dump | 20 + .../testdir/dumps/vim_ex_delete_06.dump | 20 + .../syntax/testdir/dumps/vim_ex_echo_01.dump | 2 +- .../syntax/testdir/dumps/vim_ex_echo_02.dump | 14 +- .../syntax/testdir/dumps/vim_ex_echo_03.dump | 14 +- .../testdir/dumps/vim_ex_equals_00.dump | 20 + .../testdir/dumps/vim_ex_equals_01.dump | 20 + .../syntax/testdir/dumps/vim_ex_eval_00.dump | 2 +- .../syntax/testdir/dumps/vim_ex_eval_01.dump | 2 +- .../testdir/dumps/vim_ex_function_13.dump | 2 +- .../dumps/vim_ex_function_fold_13.dump | 2 +- .../dumps/vim_ex_function_fold_16.dump | 6 +- .../testdir/dumps/vim_ex_global_00.dump | 20 + .../testdir/dumps/vim_ex_global_01.dump | 20 + .../testdir/dumps/vim_ex_global_02.dump | 20 + .../testdir/dumps/vim_ex_import_00.dump | 4 +- .../testdir/dumps/vim_ex_import_01.dump | 4 +- .../testdir/dumps/vim_ex_import_02.dump | 4 +- .../testdir/dumps/vim_ex_import_04.dump | 4 +- .../testdir/dumps/vim_ex_import_05.dump | 4 +- .../testdir/dumps/vim_ex_insert_00.dump | 20 + .../testdir/dumps/vim_ex_insert_01.dump | 20 + .../testdir/dumps/vim_ex_insert_02.dump | 20 + .../testdir/dumps/vim_ex_insert_03.dump | 20 + .../testdir/dumps/vim_ex_insert_04.dump | 20 + .../testdir/dumps/vim_ex_insert_05.dump | 20 + .../testdir/dumps/vim_ex_insert_06.dump | 20 + .../testdir/dumps/vim_ex_insert_07.dump | 20 + .../testdir/dumps/vim_ex_insert_08.dump | 20 + .../testdir/dumps/vim_ex_insert_09.dump | 20 + .../testdir/dumps/vim_ex_insert_10.dump | 20 + .../testdir/dumps/vim_ex_insert_11.dump | 20 + .../testdir/dumps/vim_ex_leftshift_00.dump | 20 + .../testdir/dumps/vim_ex_leftshift_01.dump | 20 + .../testdir/dumps/vim_ex_leftshift_02.dump | 20 + .../testdir/dumps/vim_ex_leftshift_03.dump | 20 + .../testdir/dumps/vim_ex_leftshift_04.dump | 20 + .../testdir/dumps/vim_ex_leftshift_05.dump | 20 + .../syntax/testdir/dumps/vim_ex_mark_02.dump | 2 +- .../syntax/testdir/dumps/vim_ex_mark_05.dump | 10 +- .../syntax/testdir/dumps/vim_ex_mark_06.dump | 2 +- .../syntax/testdir/dumps/vim_ex_mark_07.dump | 2 +- .../syntax/testdir/dumps/vim_ex_mark_08.dump | 2 +- .../syntax/testdir/dumps/vim_ex_mark_09.dump | 2 +- .../syntax/testdir/dumps/vim_ex_mark_10.dump | 6 +- .../syntax/testdir/dumps/vim_ex_mark_11.dump | 18 +- .../syntax/testdir/dumps/vim_ex_mark_12.dump | 20 - .../syntax/testdir/dumps/vim_ex_match_01.dump | 6 +- .../syntax/testdir/dumps/vim_ex_menu_04.dump | 2 +- .../testdir/dumps/vim_ex_packadd_00.dump | 20 + .../testdir/dumps/vim_ex_packadd_01.dump | 20 + .../syntax/testdir/dumps/vim_ex_pound_00.dump | 20 + .../syntax/testdir/dumps/vim_ex_pound_01.dump | 20 + .../syntax/testdir/dumps/vim_ex_pound_02.dump | 20 + .../syntax/testdir/dumps/vim_ex_pound_03.dump | 20 + .../syntax/testdir/dumps/vim_ex_pound_04.dump | 20 + .../syntax/testdir/dumps/vim_ex_pound_05.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_00.dump | 30 +- .../syntax/testdir/dumps/vim_ex_range_01.dump | 40 +- .../syntax/testdir/dumps/vim_ex_range_02.dump | 38 +- .../syntax/testdir/dumps/vim_ex_range_03.dump | 38 +- .../syntax/testdir/dumps/vim_ex_range_04.dump | 40 +- .../syntax/testdir/dumps/vim_ex_range_05.dump | 40 +- .../syntax/testdir/dumps/vim_ex_range_06.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_07.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_08.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_09.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_10.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_11.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_12.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_13.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_14.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_15.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_16.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_17.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_18.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_19.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_20.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_21.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_22.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_23.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_24.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_25.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_26.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_27.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_28.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_29.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_30.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_31.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_32.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_33.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_34.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_35.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_36.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_37.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_38.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_39.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_40.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_41.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_42.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_43.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_44.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_45.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_46.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_47.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_48.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_49.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_50.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_51.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_52.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_53.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_54.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_55.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_56.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_57.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_58.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_59.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_60.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_61.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_62.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_63.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_64.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_65.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_66.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_67.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_68.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_69.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_70.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_71.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_72.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_73.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_74.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_75.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_76.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_77.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_78.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_79.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_80.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_81.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_82.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_83.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_84.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_85.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_86.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_87.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_88.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_89.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_90.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_91.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_92.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_93.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_94.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_95.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_96.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_97.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_98.dump | 20 + .../syntax/testdir/dumps/vim_ex_range_99.dump | 20 + .../testdir/dumps/vim_ex_rightshift_00.dump | 20 + .../testdir/dumps/vim_ex_rightshift_01.dump | 20 + .../testdir/dumps/vim_ex_rightshift_02.dump | 20 + .../testdir/dumps/vim_ex_rightshift_03.dump | 20 + .../testdir/dumps/vim_ex_rightshift_04.dump | 20 + .../testdir/dumps/vim_ex_runtime_00.dump | 20 + .../testdir/dumps/vim_ex_runtime_01.dump | 20 + .../testdir/dumps/vim_ex_runtime_02.dump | 20 + .../testdir/dumps/vim_ex_substitute_02.dump | 6 +- .../testdir/dumps/vim_ex_substitute_03.dump | 8 +- .../testdir/dumps/vim_ex_substitute_04.dump | 10 +- .../testdir/dumps/vim_ex_substitute_05.dump | 12 +- .../testdir/dumps/vim_ex_substitute_06.dump | 12 +- .../testdir/dumps/vim_ex_substitute_07.dump | 12 +- .../testdir/dumps/vim_ex_substitute_08.dump | 28 +- .../testdir/dumps/vim_ex_substitute_09.dump | 26 +- .../testdir/dumps/vim_ex_substitute_10.dump | 26 +- .../testdir/dumps/vim_ex_substitute_11.dump | 26 +- .../testdir/dumps/vim_ex_substitute_12.dump | 20 + .../testdir/dumps/vim_ex_syntax_01.dump | 2 +- .../testdir/dumps/vim_ex_syntax_02.dump | 4 +- .../testdir/dumps/vim_ex_terminal_01.dump | 2 +- .../testdir/dumps/vim_ex_wincmd_01.dump | 2 +- .../testdir/dumps/vim_ex_wincmd_02.dump | 2 +- .../testdir/dumps/vim_ex_wincmd_03.dump | 16 +- .../testdir/dumps/vim_ex_wincmd_04.dump | 20 + .../testdir/dumps/vim_expressions_21.dump | 4 +- .../testdir/dumps/vim_expressions_22.dump | 6 +- .../testdir/dumps/vim_expressions_23.dump | 4 +- .../testdir/dumps/vim_function_calls_00.dump | 2 +- .../testdir/dumps/vim_function_calls_01.dump | 4 +- .../testdir/dumps/vim_function_calls_05.dump | 4 +- .../testdir/dumps/vim_function_calls_08.dump | 4 +- .../dumps/vim_function_variables_13.dump | 2 +- .../syntax/testdir/input/vim9_ex_commands.vim | 162 +- .../syntax/testdir/input/vim9_ex_range.vim | 1256 ++++++ runtime/syntax/testdir/input/vim_comments.vim | 7 + .../syntax/testdir/input/vim_ex_append.vim | 199 + .../syntax/testdir/input/vim_ex_change.vim | 277 ++ .../input/vim_ex_command_modifiers.vim | 185 +- .../syntax/testdir/input/vim_ex_commands.vim | 451 ++- .../testdir/input/vim_ex_debuggreedy.vim | 6 +- .../syntax/testdir/input/vim_ex_delete.vim | 115 + runtime/syntax/testdir/input/vim_ex_echo.vim | 6 + .../syntax/testdir/input/vim_ex_equals.vim | 32 + runtime/syntax/testdir/input/vim_ex_eval.vim | 2 +- .../syntax/testdir/input/vim_ex_global.vim | 42 + .../syntax/testdir/input/vim_ex_insert.vim | 199 + .../syntax/testdir/input/vim_ex_leftshift.vim | 87 + runtime/syntax/testdir/input/vim_ex_mark.vim | 9 +- .../syntax/testdir/input/vim_ex_packadd.vim | 20 + runtime/syntax/testdir/input/vim_ex_pound.vim | 92 + runtime/syntax/testdir/input/vim_ex_range.vim | 1759 +++++++- .../testdir/input/vim_ex_rightshift.vim | 86 + .../syntax/testdir/input/vim_ex_runtime.vim | 44 + .../testdir/input/vim_ex_substitute.vim | 25 +- .../syntax/testdir/input/vim_ex_wincmd.vim | 9 +- runtime/syntax/vim.vim | 3588 ++++++++++------- src/testdir/test_statusline.vim | 2 +- src/version.c | 2 + 523 files changed, 16407 insertions(+), 5767 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_68.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_69.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_70.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_defcompile_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_defcompile_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_disassemble_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_disassemble_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_13.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_14.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_15.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_16.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_17.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_18.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_19.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_20.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_21.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_22.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_23.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_24.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_25.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_26.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_27.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_28.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_29.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_30.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_31.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_32.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_33.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_34.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_35.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_36.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_37.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_38.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_39.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_40.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_41.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_42.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_43.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_44.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_45.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_46.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_47.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_48.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_49.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_50.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_51.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_52.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_53.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_54.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_55.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_56.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_57.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_58.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_59.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_60.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_61.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_62.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_63.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_64.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_65.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_66.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_67.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_68.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_range_69.dump create mode 100644 runtime/syntax/testdir/dumps/vim_comments_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_append_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_13.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_14.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_change_15.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_13.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_17.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_command_modifiers_18.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_68.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_69.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_delete_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_equals_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_equals_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_global_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_global_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_global_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_insert_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_leftshift_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_leftshift_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_leftshift_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_leftshift_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_leftshift_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_leftshift_05.dump delete mode 100644 runtime/syntax/testdir/dumps/vim_ex_mark_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_packadd_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_packadd_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_pound_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_pound_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_pound_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_pound_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_pound_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_pound_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_13.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_14.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_15.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_16.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_17.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_18.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_19.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_20.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_21.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_22.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_23.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_24.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_25.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_26.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_27.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_28.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_29.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_30.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_31.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_32.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_33.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_34.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_35.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_36.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_37.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_38.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_39.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_40.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_41.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_42.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_43.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_44.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_45.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_46.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_47.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_48.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_49.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_50.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_51.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_52.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_53.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_54.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_55.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_56.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_57.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_58.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_59.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_60.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_61.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_62.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_63.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_64.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_65.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_66.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_67.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_68.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_69.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_70.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_71.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_72.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_73.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_74.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_75.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_76.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_77.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_78.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_79.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_80.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_81.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_82.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_83.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_84.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_85.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_86.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_87.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_88.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_89.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_90.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_91.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_92.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_93.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_94.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_95.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_96.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_97.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_98.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_range_99.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_rightshift_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_rightshift_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_rightshift_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_rightshift_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_rightshift_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_runtime_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_runtime_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_runtime_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_substitute_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_wincmd_04.dump create mode 100644 runtime/syntax/testdir/input/vim9_ex_range.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_append.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_change.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_delete.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_equals.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_global.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_insert.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_leftshift.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_packadd.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_pound.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_rightshift.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_runtime.vim diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 7b555d3ca1..80f9baa4a9 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 9.2. Last change: 2026 Jul 29 +*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4156,6 +4156,7 @@ Some folding is now supported with when 'foldmethod' is set to "syntax": > g:vimsyn_folding =~# 'P' : fold Python heredocs g:vimsyn_folding =~# 'r' : fold Ruby heredocs g:vimsyn_folding =~# 't' : fold Tcl heredocs + g:vimsyn_folding =~# 'T' : fold :append, :change and :insert < By default, g:vimsyn_folding is unset. Concatenate the indicated characters diff --git a/runtime/syntax/generator/gen_syntax_vim.vim b/runtime/syntax/generator/gen_syntax_vim.vim index 3e7fe1bc2d..288a67a90e 100644 --- a/runtime/syntax/generator/gen_syntax_vim.vim +++ b/runtime/syntax/generator/gen_syntax_vim.vim @@ -1,7 +1,7 @@ " Vim syntax file generator " Language: Vim script -" Maintainer: Hirohito Higashi (h_east) -" Last Change: 2025 Dec 04 +" Maintainer: Hirohito Higashi (h_east) +" Last Change: 2026 Aug 02 let s:keepcpo= &cpo set cpo&vim @@ -111,8 +111,11 @@ function s:parse_vim_command(cmd) exec '/^}\?\s*cmdnames\[\]\s*=\s*$/+1;/^};/-1yank' %delete _ put + /EXCMD(CMD_block,/s/\s\+\/\/.*// + g/EXCMD(CMD_/,/),/j g!/^EXCMD(/d + let lcmd = {} for key in range(char2nr('a'), char2nr('z')) let lcmd[nr2char(key)] = [] @@ -124,7 +127,10 @@ function s:parse_vim_command(cmd) if !empty(list) " Small ascii character or other. let key = (list[1][:0] =~# '\l') ? list[1][:0] : '~' - call add(lcmd[key], list[1]) + let item.name = list[1] + let item.flags = {} + let item.flags.range = match(line, 'EX_RANGE') >= 0 + call add(lcmd[key], copy(item)) endif endfor quit! @@ -134,20 +140,20 @@ function s:parse_vim_command(cmd) let omit_idx = 0 if my > 0 let omit_idx = (key =~# '\l') ? 1 : 0 - for idx in range(1, strlen(lcmd[key][my])) + for idx in range(1, strlen(lcmd[key][my].name)) let matched = 0 for pre in range(my - 1, 0, -1) " Avoiding conflicts shortened command and special commands " - weird abbreviations for delete. (See :help :d) " - k{char} is used as mark. (See :help :k) " - :s commsnds repeat. (See :help :substitute-repeat) - if lcmd[key][my][:idx] ==# lcmd[key][pre][:idx] || + if lcmd[key][my].name[:idx] ==# lcmd[key][pre].name[:idx] || \ (key ==# 'd' && - \ lcmd[key][my][:idx] =~# '^d\%[elete][lp]$') + \ lcmd[key][my].name[:idx] =~# '^d\%[elete][lp]$') \ || (key ==# 'k' && - \ lcmd[key][my][:idx] =~# '^k[a-zA-Z]$') + \ lcmd[key][my].name[:idx] =~# '^k[a-zA-Z]$') \ || (key ==# 's' && - \ lcmd[key][my][:idx] =~# '^s\%(c\%([^sr][^ip]\=\)\=$\|g\|i[^mlg]\=$\|I\|r[^e]\=$\)') + \ lcmd[key][my].name[:idx] =~# '^s\%(c\%([^sr][^ip]\=\)\=$\|g\|i[^mlg]\=$\|I\|r[^e]\=$\)') let matched = 1 let omit_idx = idx + 1 break @@ -159,44 +165,23 @@ function s:parse_vim_command(cmd) endfor endif - let item.name = lcmd[key][my] + let item = 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:] . ']' + \ item.name[omit_idx + 1:] . ']' + let item.syn_pat = item.name[:omit_idx] . '\%[' . + \ item.name[omit_idx + 1:] . ']' else let item.omit_idx = -1 let item.syn_str = item.name + let item.syn_pat = item.name endif call add(a:cmd, copy(item)) endfor endfor - " 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)) - let no_shorten_in_vim9 =<< trim EOL final def @@ -313,12 +298,13 @@ function s:get_vim_command_type(cmd_name) breaklist browse bufdo + buffer call catch cdo cfdo - chdir change + chdir class command confirm @@ -355,10 +341,11 @@ function s:get_vim_command_type(cmd_name) filetype filter final - folddoopen folddoclosed + folddoopen for function + global grep grepadd help @@ -367,34 +354,37 @@ function s:get_vim_command_type(cmd_name) history if import - interface insert + interface join k language let ldo lfdo - loadkeymap - lhelpgrep lgrep lgrepadd - lvimgrep - lvimgrepadd - make + lhelpgrep + lmake + loadkeymap + lockvar lua luado luafile + lvimgrep + lvimgrepadd + make map mapclear mark match menutranslate - mzscheme mzfile + mzscheme noremap - new normal + number + packadd perl perldo popup @@ -403,13 +393,13 @@ function s:get_vim_command_type(cmd_name) promptfind promptrepl public - python - pyfile - pydo - python3 py3 py3do py3file + pydo + pyfile + python + python3 pythonx pyx pyxdo @@ -419,6 +409,7 @@ function s:get_vim_command_type(cmd_name) ruby rubydo rubyfile + runtime set setglobal setlocal @@ -432,6 +423,7 @@ function s:get_vim_command_type(cmd_name) swapname syntax syntime + t tabdo tcl tcldo @@ -445,15 +437,17 @@ function s:get_vim_command_type(cmd_name) unlockvar unmap var + vglobal vim9script vimgrep vimgrepadd while wincmd windo + write + z EOL - " 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\)$' @@ -503,6 +497,46 @@ function s:append_syn_vimcmd(lnum, str_info, cmd_list, type) call append(ret_lnum, str) let ret_lnum += 1 endif + return s:append_syn_vimcmd_after_range(ret_lnum, a:str_info, a:cmd_list, a:type) +endfunc + +" append post-range :syn-match variants +function s:append_syn_vimcmd_after_range(lnum, str_info, cmd_list, type) + let cmd_list = filter( + \ copy(a:cmd_list), + \ { _, v -> v.flags.range && v.type == a:type }) + let str_start = substitute( + \ a:str_info.start, + \ 'syn keyword vim\(\w\+\)\(.*\)', + \ 'syn match vim\1_\2', + \ '') + let str_end = a:str_info.end + let ret_lnum = a:lnum + + let by_head = {} + for cmd in cmd_list + let head = cmd.name[0] + if !has_key(by_head, head) + let by_head[head] = [] + endif + call add(by_head[head], cmd) + endfor + + for head in sort(keys(by_head)) + let str = str_start . ' "' . head + let tails = by_head[head]->map({ _, v -> v.syn_pat[1:] }) + if len(tails) == 1 + let str .= tails[0] + elseif len(tails) > 1 + let str .= '\%(' . tails->join('\|') . '\)' + endif + let str .= '\>"' + if !empty(str_end) + let str .= ' ' . str_end + endif + call append(ret_lnum, str) + let ret_lnum += 1 + endfor return ret_lnum endfunc diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 5b20d1ddff..3a60b31eec 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Jun 27 +" Last Change: 2026 Aug 02 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -35,25 +35,37 @@ syn cluster vimCommentGroup contains=vimTodo,@Spell " regular vim commands {{{2 " GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand contained', END_STR='nextgroup=vimBang' -" Lower priority :syn-match to allow for :command/function() distinction -" :chdir is handled specially elsewhere -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang +" lower priority :syn-match to allow for :command/function() distinction +" :chdir and :delete is handled specially elsewhere +syn match vimCommand contained "\" nextgroup=vimBang +syn match vimCommand_ contained "co\%[py]\>" nextgroup=vimBang +syn match vimCommand contained "\" nextgroup=vimBang +syn match vimCommand_ contained "j\%[oin]\>" nextgroup=vimBang +syn match vimCommand contained "\" nextgroup=vimBang +syn match vimCommand_ contained "sp\%[lit]\>" nextgroup=vimBang +syn match vimCommand contained "\" nextgroup=vimBang + +" commands starting with uppercase letter +syn keyword vimCommand contained N[ext] nextgroup=vimBang +syn match vimCommand_ contained "N\%[ext]\>" nextgroup=vimBang +syn keyword vimCommand contained P[rint] +syn match vimCommand_ contained "P\%[rint]\>" +syn keyword vimCommand contained X + +" GEN_SYN_VIM: vimCommand modifier, START_STR='syn keyword vimCommandModifier contained', END_STR='skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func' +" modifiers supporting bang, :filter is handled specially elsewhere +syn keyword vimCommandModifier contained sil[ent] skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + +syn match vimCommandModifierBang contained "\a\@1<=!" skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + +" lower priority :syn-match to allow for :command/function() distinction +syn match vimCommandModifier contained "\" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func +syn match vimCommandModifier contained "\" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + +syn match vimCommandModifierContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func contains=vimLeadingWhitespace +syn match vimCommandModifierContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimCommandModifierContinue contains=vimLeadingWhitespace +syn cluster vimCommandModifierContinue contains=vimCommandModifierContinue,vimCommandModifierContinueComment -" GEN_SYN_VIM: vimCommand modifier, START_STR='syn keyword vimCommandModifier', END_STR='skipwhite nextgroup=vimCommandModifierBang,@vimCmdList' -" :filter is handled specially elsewhere -syn match vimCommandModifierBang contained "\a\@1<=!" skipwhite nextgroup=@vimCmdList - -" Lower priority :syn-match to allow for :command/function() distinction -syn match vimCommand "\" skipwhite nextgroup=vimCommandModifierBang,@vimCmdList -syn match vimCommand "\" skipwhite nextgroup=vimCommandModifierBang,@vimCmdList - -" Lower priority for _new_ to distinguish constructors from the command. -syn match vimCommand contained "\(\@!" -syn match vimCommand contained "\" 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 @@ -98,7 +110,7 @@ syn case ignore " GEN_SYN_VIM: vimAutoEvent, START_STR='syn keyword vimAutoEvent contained', END_STR='skipwhite nextgroup=vimAutoEventSep,@vimAutocmdPattern' syn keyword vimAutoEvent contained User skipwhite nextgroup=vimUserAutoEvent -syn match vimUserAutoEvent contained "\<\h\w*\>" skipwhite nextgroup=vimUserAutoEventSep,vimAutocmdMod,vimAutocmdBlock +syn match vimUserAutoEvent contained "\<\h\w*\>" skipwhite skipnl nextgroup=vimUserAutoEventSep,vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc " Highlight commonly used Groupnames {{{2 " GEN_SYN_VIM: vimGroup, START_STR='syn keyword vimGroup contained', END_STR='' @@ -236,7 +248,7 @@ Vim9 syn keyword vim9Boolean true false " Numbers {{{2 " ======= syn case ignore -syn match vimNumber "\<\d\+\%('\d\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets,vimGlobal,vimSubst1 +syn match vimNumber "\<\d\+\%('\d\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets syn match vimNumber "\<\d\+\%('\d\+\)*\.\d\+\%(e[+-]\=\d\+\)\=" skipwhite nextgroup=@vimComment syn match vimNumber "\<0b[01]\+\%('[01]\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets syn match vimNumber "\<0o\=\o\+\%('\o\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets @@ -245,16 +257,8 @@ syn match vimNumber '\<0z\>' skipwhite nextgroup=@vimComment syn match vimNumber '\<0z\%(\x\x\)\+\%(\.\%(\x\x\)\+\)*' skipwhite nextgroup=@vimComment,vimSubscriptBrackets syn case match -" All vimCommands are contained by vimIsCommand. {{{2 -syn cluster vimCmdList contains=vimAbb,vimAddress,vimAt,vimAutocmd,vimAugroup,vimBehave,vimBreakadd,vimBreakdel,vimBreaklist,vimCall,vimCatch,vimCd,vimCommandModifier,vimConst,vimDoautocmd,vimDebug,vimDebuggreedy,vimDef,vimDefFold,vimDefer,vimDelcommand,vimDelFunction,vimDoCommand,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimEval,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimExMark,vimFiletype,vimFor,vimFunction,vimFunctionFold,vimGrep,vimGrepAdd,vimGlobal,vimHelp,vimHelpgrep,vimHighlight,vimHistory,vimImport,vimLanguage,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimProfdel,vimProfile,vimPrompt,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimSyntime,vimSynColor,vimSynLink,vimTerminal,vimThrow,vimUniq,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimWincmd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl -syn cluster vim9CmdList contains=vim9Abstract,vim9Class,vim9Const,vim9Enum,vim9Export,vim9Final,vim9For,vim9Interface,vim9Type,vim9Var -syn match vimCmdSep "\\\@1" nextgroup=vimBang contains=vimCommand -syn match vimBang contained "!" -syn match vimWhitespace contained "\s\+" - +" Variables {{{2 +" ========= syn region vimSubscriptBrackets contained \ matchgroup=vimSubscriptBracket \ start="\[" @@ -274,201 +278,203 @@ syn match vimFBVar contained "\<[bwglsta]:\h[a-zA-Z0-9#_]*\>" nextgroup=vim syn match vimVarScope contained "\<[bwglstav]:" syn match vimVimVar contained "\<[bwglstav]:\%(\h\|\d\)\@!" nextgroup=vimSubscriptBrackets,vimSubscriptDot -syn match vimVarNameError contained "\<\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot " just abort highlighting rather than match nextgroup? +syn match vimVarNameError contained "\<\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot " TODO: just abort highlighting rather than match nextgroup? syn match vimVimVar "\" contains=vim9Super,vim9This - -Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+[-+/*%]\==" contains=vimVar,@vimSpecialVar -Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+=<<" skipwhite nextgroup=vimLetHeredoc contains=vimVar,@vimSpecialVar -Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+\.\.=" contains=vimVar,@vimSpecialVar - -Vim9 syn match vim9LhsRegister "@["0-9\-a-zA-Z#=*+_/]\ze\s\+\%(\.\.\)\==" - syn cluster vimExprList contains=@vimSpecialVar,@vimFunc,vimNumber,vimOper,vimOperParen,vimLambda,vimString,vimVar,@vim9ExprList syn cluster vim9ExprList contains=vim9Boolean,vim9LambdaParams,vim9Null -" 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="^\.$" extend - syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=c\%[hange]$" matchgroup=vimCommand end="^\.$" extend - syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=i\%[nsert]$" matchgroup=vimCommand end="^\.$" extend -endif +" Commands {{{2 +syn cluster vimCmdList contains=@vim9CmdList,@vimExUserCmdList,vimAbb,vimAt,vimAugroup,vimAutocmd,vimBehave,vimBreakadd,vimBreakdel,vimBreaklist,vimBuffer,vimCall,vimCatch,vimCd,vimCommand,vimCommandModifier,vimConst,vimCopy,vimDebug,vimDebuggreedy,vimDef,vimDefFold,vimDefer,vimDelcommand,vimDelete,vimDelfunction,vimDoCommand,vimDoautocmd,vimTextInputFold,@vimEcho,vimElse,vimElseif,vimEnddef,vimEndfunction,vimEndif,vimEquals,vimEval,vimExFilter,vimExecute,vimExtCmd,vimFiletype,vimFor,vimFunction,vimFunctionFold,vimGlobal,vimGrep,vimGrepadd,vimHelp,vimHelpgrep,vimHighlight,vimHistory,vimIf,vimImport,vimLanguage,vimLet,vimLoadkeymap,vimLockvar,vimLua,vimMake,vimMap,vimMark,vimMatch,vimMenu,vimMenutranslate,vimMzScheme,vimNormal,vimPackadd,vimPerl,vimPound,vimProfdel,vimProfile,vimPrompt,vimPython,vimPython3,vimPythonX,vimRedir,vimReturn,vimRuby,vimRuntime,vimSet,vimShiftLeft,vimShiftRight,vimSleep,vimSort,vimSubst,vimSynColor,vimSynLink,vimSyntax,vimSyntime,vimTcl,vimTerminal,vimThrow,vimUniq,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimUsrCmd,vimVimgrep,vimVimgrepadd,vimWhile,vimWincmd,vimWrite +syn cluster vim9CmdList contains=vim9Abstract,vim9ClassBody,vim9Const,vim9EnumBody,vim9Export,vim9Final,vim9For,vim9InterfaceBody,vim9Type,vim9Var,vim9Wincmd -" Behave! {{{2 -" ======= -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror") - syn match vimBehaveError contained "[^ ]\+" -endif -syn match vimBehave "\" nextgroup=vimBehaveBang,vimBehaveModel,vimBehaveError skipwhite -syn match vimBehaveBang contained "\a\@1<=!" nextgroup=vimBehaveModel skipwhite -syn keyword vimBehaveModel contained mswin xterm +syn match vimCmdStart contained ":\+" skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList,vimComment +syn match vimCount contained "\d\+" +syn match vimBang contained "!" +syn match vimPrintFlag contained "[lp#]" skipwhite nextgroup=vimPrintFlag,vimComment,vimCmdSep -" Break* commands {{{2 -" =============== -syn keyword vimBreakaddFunc contained func skipwhite nextgroup=vimBreakpointFunctionLine,vimBreakpointFunction -syn keyword vimBreakaddFile contained file skipwhite nextgroup=vimBreakpointFileLine,vimBreakpointFilename -syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn keyword vimBreakaddExpr contained expr skipwhite nextgroup=@vimExprList +syn match vimWhitespace contained "\s\+" +syn match vimLeadingWhitespace contained "^\s\+" -syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +" :range {{{3 +syn match vimRange contained "[*%]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand -syn cluster vimBreakpointArg contains=vimBreakaddFunc,vimBreakaddFile,vimBreakaddHere,vimBreakaddExpr +syn region vimAddressPattern contained + \ matchgroup=Delimiter + \ start="/" + \ skip=+\\/\|\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ end="/" + \ skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand + \ contains=vimAddressSlashEscape,@vimContinue,@vimSubstList +syn match vimAddressSlashEscape contained "\\/" +syn region vimAddressPattern contained + \ matchgroup=Delimiter + \ start="?" + \ skip=+\\?\|\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ end="?" + \ skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand + \ contains=vimAddressQuestionEscape,@vimContinue,@vimSubstList +syn match vimAddressQuestionEscape contained "\\?" -syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointFunctionLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFunction -syn match vimBreakpointFileLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFilename +syn match vimAddressOffset contained "[+-]\%(\d\+\)\=\|\d\+" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,@vimCommand_ +syn match vimAddress contained "\%#=1\d\+" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,@vimCommand_ +syn match vimAddress contained "\%#=1[.$]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand +syn match vimAddress contained "\%#=1'[[\]<>'`"^.(){}]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand +syn match vimAddress contained "\%#=1'[a-zA-Z0-9]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,@vimCommand_ +" NOTE: needs leading ':' to distinguish \/ from line continuation in Vim script +syn match vimAddress contained "\%#=1\\[/?&]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand -syn keyword vimBreakadd breaka[dd] skipwhite nextgroup=@vimBreakpointArg -syn keyword vimBreakdel breakd[el] skipwhite nextgroup=@vimBreakpointArg,vimBreakpointNumber,vimBreakpointGlob -syn keyword vimBreaklist breakl[ist] skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimAddressSeparator contained "\%#=1[,;]" skipwhite nextgroup=vimAddress,vimAddressPattern,vimAddressOffset,vimCmdStart,@vimCmdList,vimCommand,vimAddressSeparator -" Call {{{2 -" ==== -syn match vimCall "\" skipwhite nextgroup=vimVar,@vimFunc +syn cluster vimRange contains=vimRange,vimAddress,vimAddressPattern,vimAddressOffset,vimAddressSeparator -" Cd: {{{2 +" :@ {{{3 " == -" GEN_SYN_VIM: vimCommand cd, START_STR='syn keyword vimCd', END_STR='skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep' -syn match vimCd "\" skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep -syn region vimCdArg contained - \ start=+["#|]\@!\S+ - \ end="\ze\s*$" - \ end=+\ze\s*\\\@1" contains=vimCount - -" Defer {{{2 -" ===== -syn match vimDefer "\" skipwhite nextgroup=@vimFunc,vim9LambdaParams +" TODO: needs to be limited to after a ':' in Vim9, otherwise a comment +if s:vim9script + syn match vimPound contained ":\@1<=#" skipwhite nextgroup=vimPoundCount,vimPrintFlag +else + syn match vimPound contained "#" skipwhite nextgroup=vimPoundCount,vimPrintFlag +endif +syn keyword vimPound contained nu[mber] skipwhite nextgroup=vimPoundCount,vimPrintFlag +syn match vimPound_ contained "nu\%[mber]\>" skipwhite nextgroup=vimPoundCount,vimPrintFlag +syn match vimPoundCount contained "\d\+" skipwhite nextgroup=vimPrintFlag -" *Do commands {{{2 -" ============ -syn match vimDoCommandBang contained "\a\@1<=!" skipwhite nextgroup=@vimCmdList +" := {{{3 +" == +syn match vimEquals contained "=" skipwhite nextgroup=vimPrintFlag -syn keyword vimDoCommand argdo bufd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList -syn keyword vimDoCommand tabd[o] wind[o] skipwhite nextgroup=@vimCmdList -syn keyword vimDoCommand cdo cfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList -syn keyword vimDoCommand ld[o] lfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList -syn keyword vimDoCommand foldd[oopen] folddoc[losed] skipwhite nextgroup=@vimCmdList +" :>, :< {{{3 +" ====== -" Exception Handling {{{2 -syn keyword vimThrow th[row] skipwhite nextgroup=@vimExprList -syn keyword vimCatch cat[ch] skipwhite nextgroup=vimCatchPattern -syn region vimCatchPattern contained matchgroup=Delimiter start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" skip="\\\\\|\\\z1" end="\z1" contains=@vimSubstList oneline +syn match vimShiftLeft contained "<\%(line\)\@!" skipwhite nextgroup=vimShiftLeftPlus,vimShiftLeftCount,vimPrintFlag +syn match vimShiftLeftPlus contained "<" skipwhite nextgroup=vimShiftLeftPlus,vimShiftLeftCount,vimPrintFlag +syn match vimShiftLeftCount contained "\d\+" skipwhite nextgroup=vimPrintFlag -" Export {{{2 -" ====== -if s:vim9script - syn keyword vim9Export export skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vim9Def,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var -endif +syn match vimShiftRight contained ">" skipwhite nextgroup=vimShiftRightPlus,vimShiftRightCount,vimPrintFlag +syn match vimShiftRightPlus contained ">" skipwhite nextgroup=vimShiftRightPlus,vimShiftRightCount,vimPrintFlag +syn match vimShiftRightCount contained "\d\+" skipwhite nextgroup=vimPrintFlag -" Filetypes {{{2 -" ========= -syn match vimFiletype "\]" skipwhite nextgroup=vimHistoryRange,vimCmdSep,vimComment,vim9Comment -syn match vimHistoryRange contained "-\=\<\d\+\>\%(\s*,\)\=" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn match vimHistoryRange contained ",\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn match vimHistoryRange contained "-\=\<\d\+\s*,\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment +" :append, :change, :insert {{{3 +" ========================= +" (buftype != nofile test avoids having append, change, insert show up in the command window) -" Import {{{2 -" ====== -syn keyword vimImportAutoload contained autoload skipwhite nextgroup=vimImportFilename -if s:vim9script - syn region vimImportFilename contained - \ start="\S" - \ skip=+\%#=1 - "\ continuation operators at SOL - \\n\%(\s*#.*\n\)*\s*\%([[:punct:]]\+\&[^#"'(]\) - \\| - "\ continuation operators at EOL - \\%(\%([[:punct:]]\+\&[^#"')]\)\s*\%(#.*\)\=\)\@<=$ - \\| - \\n\%(\s*#.*\n\)*\s*as\s - \\| - \\%(^\s*#.*\)\@<=$ - \\| - \\n\s*\%(\\\|#\\ \) - \+ - \ matchgroup=vimCommand - \ end="\s\+\zsas\ze\s\+\h" - \ matchgroup=NONE - \ end="$" - \ skipwhite nextgroup=vimImportName - \ contains=@vim9Continue,@vimExprList,vim9Comment - \ transparent -else - syn region vimImportFilename contained - \ start="\S" - \ skip=+\n\s*\%(\\\|"\\ \)+ +if &buftype != 'nofile' + syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand_ contained "a\%[ppend]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand_ contained "c\%[hange]\>" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand_ contained "i\%[nsert]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + + syn match vimChangeCount contained "\d\+" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimChangeBang contained + \ "\a\@1<=!" + \ skipwhite skipnl skipempty nextgroup=vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar + + syn match vimTextInputBang contained "\a\@1<=!" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimTextInputText contained "|\@1<=.*" skipnl skipempty nextgroup=@vimTextInputText + syn region vimTextInputText contained + \ start="^." \ matchgroup=vimCommand - \ end="\s\+\zsas\ze\s\+\h" - \ matchgroup=NONE - \ end="$" - \ skipwhite nextgroup=vimImportName - \ contains=@vimContinue,@vimExprList - \ transparent + \ end="^\.$" + \ extend + " NOTE: 'autoindent' end marker not supported + syn match vimTextInputEnd contained "^\.$" + syn cluster vimTextInputText contains=vimTextInputText,vimTextInputEnd + + syn match vimTextInputComment contained + \ /".*/ + \ skipnl skipempty nextgroup=@vimTextInputText + syn match vimTextInputBar contained + \ "\s*\zs|" + \ nextgroup=@vimTextInputText + + if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'T' + " excludes "extend" option, handled by wrapper + syn region vimTextInputText contained + \ start="^." + \ matchgroup=vimCommand + \ end="^\.$" + syn region vimTextInputFold contained + \ start="\" + \ start="\" + \ start="\" + \ end="^\.$" + \ contains=vimCommand + \ extend fold keepend transparent + syn region vimTextInputFold_ contained + \ start="a\%[ppend]\>" + \ start="c\%[hange]\>" + \ start="i\%[nsert]\>" + \ end="^\.$" + \ contains=vimCommand_ + \ extend fold keepend transparent + endif endif -syn match vimImportName contained "\%(\" skipwhite nextgroup=@vimComment -syn match vimImport "\" skipwhite nextgroup=vimImportAutoload,vimImportFilename -" Language {{{2 -" ======== -syn keyword vimLanguage lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimSep,vimComment,vim9Comment -syn keyword vimLanguageCategory contained col[late] cty[pe] mes[sages] tim[e] skipwhite nextgroup=@vimLanguageName - -" [language[_territory][.codeset][@modifier]] and the reserved "C" and "POSIX" -syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimSep,vimComment,vim9Comment -syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimSep,vimComment,vim9Comment -syn cluster vimLanguageName contains=vimLanguageName,vimLanguageNameReserved +" :argdo, :bufdo, :tabdo, :windo, :cdo, :cfdo, :ldo, :lfdo, :folddoopen, :folddoclosed {{{3 +" ===================================================================================== +syn match vimDoCommandBang contained "\a\@1<=!" skipwhite nextgroup=@vimCmdList -" 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,vimString,vimSubst,vimRegister,vimCmplxRepeat,vimNotation,vimCtrlChar,vimContinue +syn keyword vimDoCommand contained argdo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "argdo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained bufdo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "bufdo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained tabd[o] skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "tabdo\=\>" skipwhite nextgroup=@vimCmdList +syn keyword vimDoCommand contained windo skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "windo\>" skipwhite nextgroup=@vimCmdList + +syn keyword vimDoCommand contained cdo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "cdo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained cfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "cfdo\=\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList + +syn keyword vimDoCommand contained ldo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "ldo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained lfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "lfdo\=\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList + +syn keyword vimDoCommand contained foldd[oopen] skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "foldd\%[oopen]\>" skipwhite nextgroup=@vimCmdList +syn keyword vimDoCommand contained folddoc[losed] skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "folddoc\%[losed]\>" skipwhite nextgroup=@vimCmdList + +" :augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{3 +" ======== : Trade-off: Increasing synclines with slower editing vs augroup END error checking. +syn cluster vimAugroupList contains=@vimFunc,vimLineStart,vimContinue,vimCmdSep,vimLineComment,vimSpecFile,vimOper,vimNumber,vimOperParen,@vimComment,vimString,vimNotation,vimCtrlChar " define -VimFolda syn region vimAugroup +VimFolda syn region vimAugroup contained \ start="\\ze\s\+\%([eE][nN][dD]\%($\|[[:space:]|"#]\)\)\@!\S" \ matchgroup=vimAugroupKey \ end="\\ze\s*\%(["|]\|$\)" skipwhite nextgroup=vimCmdSep,vimComment contains=vimAugroupKey -Vim9 syn match vimAugroup "\\ze\s*\%([#|]\|$\)" skipwhite nextgroup=vimCmdSep,vim9Comment contains=vimAugroupKey +VimL syn match vimAugroup contained "\\ze\s*\%(["|]\|$\)" skipwhite nextgroup=vimCmdSep,vimComment contains=vimAugroupKey +Vim9 syn match vimAugroup contained "\\ze\s*\%([#|]\|$\)" skipwhite nextgroup=vimCmdSep,vim9Comment contains=vimAugroupKey -" Operators: {{{2 -" ========= -syn cluster vimOperGroup contains=@vimContinue,@vimExprList,vim9Comment,vim9LineComment,vimContinueString -syn match vimOper "\a\@=\|<=\|=\~\|!\~\|>\|<\)[?#]\=" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile -syn match vimOper "\" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile -syn match vimOper "\" skipwhite nextgroup=@vimExprList -syn region vimLambda contained - \ matchgroup=vimLambdaBrace - \ start=+{\ze[[:space:][:alnum:]_.,]*\%(\n\s*\%(\\[[:space:][:alnum:]_.,]*\|"\\ .*\)\)*->+ - \ skip=+\n\s*\%(\\\|"\\ \)+ - \ end="}" end="$" - \ contains=@vimContinue,@vimExprList,vimLambdaParams -syn match vimLambdaParams contained "\%({\n\=\)\@1<=\_.\{-}\%(->\)\@=" nextgroup=vimLambdaOperator contains=@vimContinue,vimFunctionParam +syn match vimAutocmdGroup contained "\%(\\["|[:space:]]\|[^"|[:space:]]\)\+" skipwhite nextgroup=vimAutoEvent,vimAutoEventGlob +syn match vimAutocmdBang contained "\a\@1<=!" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob -syn match vim9LambdaOperator contained "=>" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment -syn match vim9LambdaParen contained "[()]" -syn match vim9LambdaParams contained - \ "(\%(\" - \ skipwhite nextgroup=vim9LambdaOperator - \ contains=@vim9Continue,vimDefParam,vim9LambdaParen,vim9LambdaReturnType -syn region vim9LambdaReturnType contained start=")\@1<=:\s" end="\ze\s*#" end="\ze\s*=>" contains=@vim9Continue,@vimType transparent -syn region vim9LambdaBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList +" TODO: cleaner handling of | in pattern position +" : match pattern items in addition to wildcards +syn region vimAutocmdPattern contained + \ start="|\@!\S" + \ skip="\\\\\|\\[,[:space:]]" + \ end="\ze[,[:space:]]" + \ end="$" + \ skipwhite skipnl nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc + \ contains=vimEnvvar,@vimWildcard,vimAutocmdPatternEscape +syn match vimAutocmdBufferPattern contained "" skipwhite skipnl nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc +syn match vimAutocmdPatternSep contained "," skipwhite skipnl nextgroup=@vimAutocmdPattern,@vimAutocmdContinue +" trailing pattern separator comma allowed +syn match vimAutocmdPatternSep contained ",\ze\s\+" skipwhite skipnl nextgroup=vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc +syn match vimAutocmdPatternEscape contained "\\." +syn cluster vimAutocmdPattern contains=vimAutocmdPattern,vimAutocmdBufferPattern -syn match vim9LambdaOperatorComment contained "#.*" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment +" TODO: Vim9 requires '++' prefix +syn match vimAutocmdMod contained "\%(++\)\=\" skipwhite skipnl nextgroup=vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc +syn match vimAutocmdMod contained "++once\>" skipwhite skipnl nextgroup=vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc -" Functions: Tag is provided for those who wish to highlight tagged functions {{{2 -" ========= -syn cluster vimFunctionBodyCommon contains=@vimCmdList,vimCmplxRepeat,vimContinue,vimCtrlChar,vimDef,vimFBVar,vimFunction,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegister,vimSpecFile,vimString,vimSubst,vimFunctionFold,vimDefFold,vimCmdSep -syn cluster vimFunctionBodyList contains=@vimFunctionBodyCommon,vimComment,vimLineComment,vimInsert,vimConst,vimLet,vimSearch -syn cluster vimDefBodyList contains=@vimFunctionBodyCommon,vim9Comment,vim9LineComment,vim9Block,vim9Const,vim9Final,vim9Var,vim9Null,vim9Boolean,vim9For,vim9LhsVariable,vim9LhsVariableList,vim9LhsRegister,vim9Search,@vimSpecialVar,@vim9Func +" higher priority than vimAutocmdGroup, assume no group is so named +syn match vimAutoEventGlob contained "*" skipwhite nextgroup=@vimAutocmdPattern +syn match vimAutoEventSep contained "\a\@1<=," nextgroup=vimAutoEvent +syn match vimUserAutoEventSep contained "\a\@1<=," nextgroup=vimUserAutoEvent -syn region vimFunctionPattern contained - \ matchgroup=vimOper - \ start="/" - \ end="$" - \ contains=@vimSubstList +syn keyword vimAutocmd contained au[tocmd] skipwhite nextgroup=vimAutocmdBang,vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob -syn match vimFunctionBang contained "\a\@1<=!" skipwhite nextgroup=vimFunctionName -syn match vimDefBang contained "\a\@1<=!" skipwhite nextgroup=vimDefName -syn match vimFunctionSID contained "\c" -syn match vimFunctionScope contained "\<[bwglstav]:" -syn match vimFunctionName contained - \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" - \ skipwhite nextgroup=vimFunctionParams,vimCmdSep,vimComment,vim9Comment - \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag -syn match vimDefName contained - \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" - \ nextgroup=vimDefTypeParams,vimDefParams,vimCmdSep,vimComment,vim9Comment - \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag +syn match vimAutocmdContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc contains=vimLeadingWhitespace +syn match vimAutocmdContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimAutocmdContinue contains=vimLeadingWhitespace +syn cluster vimAutocmdContinue contains=vimAutocmdContinue,vimAutocmdContinueComment -syn match vimFunction "\" skipwhite nextgroup=vimFunctionBang,vimFunctionName,vimFunctionPattern,vimCmdSep,vimComment -syn match vimDef "\" skipwhite nextgroup=vimDefBang,vimDefName,vimFunctionPattern,vimCmdSep,vimComment +syn match vimDoautocmdMod contained "" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent +syn keyword vimDoautocmd contained do[autocmd] skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent +syn keyword vimDoautocmd contained doautoa[ll] skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent -syn region vimFunctionComment contained - \ start=+".*+ - \ skip=+\n\s*\%(\\\|"\\ \)+ - \ end="$" - \ skipwhite skipempty nextgroup=vimFunctionBody,vimEndfunction -syn region vimDefComment contained - \ start="#.*" - \ skip=+\n\s*\%(\\\|#\\ \)+ - \ end="$" - \ skipwhite skipempty nextgroup=vimDefBody,vimEnddef +" :behave {{{3 +" ======= +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror") + syn match vimBehaveError contained "[^ ]\+" +endif +syn keyword vimBehave contained be[have] nextgroup=vimBehaveBang,vimBehaveModel,vimBehaveError skipwhite +syn match vimBehaveBang contained "\a\@1<=!" nextgroup=vimBehaveModel skipwhite +syn keyword vimBehaveModel contained mswin xterm -syn region vimFunctionParams contained - \ matchgroup=Delimiter - \ start="(" - \ skip=+\n\s*\%(\\\|"\\ \)+ - \ end=")" - \ skipwhite skipempty nextgroup=vimFunctionBody,vimFunctionComment,vimEndfunction,vimFunctionMod,vim9CommentError - \ contains=vimFunctionParam,vimOperParen,@vimContinue -syn region vimDefParams contained - \ matchgroup=Delimiter - \ start="(" - \ end=")" - \ skipwhite skipempty nextgroup=vimDefBody,vimDefComment,vimEnddef,vimReturnType,vimCommentError - \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals,vimOperParen -syn region vimDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vimDefParams - \ contains=vim9DefTypeParam -syn match vimFunctionParam contained "\<\h\w*\>\|\.\.\." skipwhite nextgroup=vimFunctionParamEquals -syn match vimDefParam contained "\<\h\w*\>" skipwhite nextgroup=vimParamType,vimFunctionParamEquals -syn match vim9DefTypeParam contained "\<\u\w*\>" +" :breakadd, :breakdel, :breaklist {{{3 +" ================================ +syn keyword vimBreakaddFunc contained func skipwhite nextgroup=vimBreakpointFunctionLine,vimBreakpointFunction +syn keyword vimBreakaddFile contained file skipwhite nextgroup=vimBreakpointFileLine,vimBreakpointFilename +syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn keyword vimBreakaddExpr contained expr skipwhite nextgroup=@vimExprList -syn match vimFunctionParamEquals contained "=" skipwhite nextgroup=@vimExprList -syn match vimFunctionMod contained "\<\%(abort\|closure\|dict\|range\)\>" skipwhite skipempty nextgroup=vimFunctionBody,vimFunctionComment,vimEndfunction,vimFunctionMod,vim9CommentError +syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn region vimFunctionBody contained - \ start="^." - \ matchgroup=vimCommand - \ end="\" - \ skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError - \ contains=@vimFunctionBodyList -syn region vimDefBody contained - \ start="^." - \ matchgroup=vimCommand - \ end="\" - \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError - \ contains=@vimDefBodyList +syn cluster vimBreakpointArg contains=vimBreakaddFunc,vimBreakaddFile,vimBreakaddHere,vimBreakaddExpr -syn match vimEndfunction "\" skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError -syn match vimEnddef "\" skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError +syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointFunctionLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFunction +syn match vimBreakpointFileLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFilename -if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vimFunctionFold - \ start="\" skipwhite nextgroup=vimDelfunctionBang,vimFunctionName +" :buffer {{{3 +" ======= +" lower priority than [wtb]: Vim9 scoped variables at SOL +syn match vimBuffer contained "\" nextgroup=vimBang +syn match vimBuffer_ contained "b\%[uffer]\>" nextgroup=vimBang -" Types: {{{2 +" :call {{{3 " ===== +syn keyword vimCall contained cal[l] skipwhite nextgroup=vimVar,@vimFunc +syn match vimCall_ contained "call\=\>" skipwhite nextgroup=vimVar,@vimFunc -syn region vimReturnType contained - \ start=")\@1<=:\%(\s\|\n\)\@=" - \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + - \ end="$" - \ matchgroup=vim9Comment - "\ allow for legacy script tail comment error - \ end="\ze[#"]" - \ skipwhite skipempty nextgroup=vimDefBody,vimDefComment,vimEnddef,vimCommentError - \ contains=@vim9Continue,@vimType - \ transparent -syn match vimParamType contained ":\s" skipwhite skipnl nextgroup=@vimType contains=vimTypeSep - -syn match vimTypeSep contained ":\%(\s\|\n\)\@=" skipwhite nextgroup=@vimType -syn keyword vimType contained blob bool channel float job number string void -syn keyword vimTypeAny contained any -syn match vimTypeObject contained "\" skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep +syn region vimCdArg contained + \ start=+["#|]\@!\S+ + \ end="\ze\s*$" + \ end=+\ze\s*\\\@1" -syn region vimCompoundType contained matchgroup=vimType start="\" -syn cluster vimType contains=vimType,vimTypeAny,vimTypeObject,vimCompoundType,vimUserType +syn match vimCdBang contained "\a\@1<=!" skipwhite nextgroup=vimCdArg,vimComment,vim9Comment,vimCmdSep -" Classes, Enums And Interfaces: {{{2 -" ============================= +" :command {{{3 +" ======== +syn cluster vimUserCmdList contains=@vimCmdList,vimComment,vimCtrlChar,vimEscapeBrace,@vimFunc,vimNotation,vimNumber,vimOper,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange,@vim9Lhs,vimCmdSep -if s:vim9script +syn match vimUserCmd contained "\!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang +syn match vimUserCmd contained +\!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang - " Methods {{{3 - syn match vim9MethodDef contained "\" skipwhite nextgroup=vim9MethodDefName,vim9ConstructorDefName - syn match vim9MethodDefName contained "\<\h\w*\>" nextgroup=vim9MethodDefParams,vim9MethodDefTypeParams contains=@vim9MethodName - syn region vim9MethodDefParams contained - \ matchgroup=Delimiter start="(" end=")" - \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vim9MethodDefReturnType,vimCommentError - \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals - syn region vim9MethodDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vim9MethodDefParams - \ contains=vim9DefTypeParam +syn region vimUserCmdAttrs contained + \ start="-\l" + \ start=+^\s*\%(\\\|["#]\\ \)+ + \ end="\ze\s\u" + \ skipwhite nextgroup=vimUserCmdName + \ contains=@vimContinue,vimUserCmdAttr,vimUserCmdAttrError + \ transparent +syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)" +syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr +syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrComplete,vimUserCmdError +syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber +syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs +syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange +syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey - syn match vim9ConstructorDefName contained "\<_\=new\w*\>" - \ nextgroup=vim9ConstructorDefParams,vim9ConstuctorDefTypeParams - \ contains=@vim9MethodName - syn match vim9ConstructorDefParam contained "\<\%(this\.\)\=\h\w*\>" - \ skipwhite nextgroup=vimParamType,vimFunctionParamEquals - \ contains=vim9This,vimOper - syn region vim9ConstructorDefParams contained - \ matchgroup=Delimiter start="(" end=")" - \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError - \ contains=vim9ConstructorDefParam,vim9Comment,vimFunctionParamEquals - syn region vim9ConstuctorDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vim9ConstructorDefParams - \ contains=vim9DefTypeParam +syn match vimUserCmdAttrNargs contained "[01*?+]" +syn match vimUserCmdAttrRange contained "%" - syn region vim9MethodDefReturnType contained - \ start=")\@1<=:\%(\s\|\n\)\@=" - \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + - \ end="$" - \ matchgroup=vim9Comment - \ end="\ze#" - \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError - \ contains=@vim9Continue,vimType,vimTypeSep - \ transparent +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror") + syn match vimUserCmdError contained "\S\+\>" +endif - syn region vim9MethodDefComment contained - \ start="#.*" - \ skip=+\n\s*\%(\\\|#\\ \)+ - \ end="$" - \ skipwhite skipempty nextgroup=vim9MethodDefBody,vimEnddef +syn case ignore +syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister] - syn region vim9MethodDefBody contained - \ start="^.\=" matchgroup=vimCommand end="\" - \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError - \ contains=@vim9MethodDefBodyList +" GEN_SYN_VIM: vimUserCmdAttrComplete, START_STR='syn keyword vimUserCmdAttrComplete contained', END_STR='' +syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var +syn keyword vimUserCmdAttrComplete contained custom customlist nextgroup=vimUserCmdAttrCompleteFunc,vimUserCmdError +syn match vimUserCmdAttrCompleteFunc contained ",\%([bwglstav]:\|<[sS][iI][dD]>\)\=\h\w*\%([.#]\h\w*\)*"hs=s+1 nextgroup=vimUserCmdError contains=vimVarScope,vimFunctionSID - syn cluster vim9MethodDefBodyList contains=@vimDefBodyList,vim9This,vim9Super +" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR='' +syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win +syn match vimUserCmdAttrAddr contained "?" +syn case match - if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") - syn match vim9MethodNameError contained "\<[a-z0-9]\i\>" - endif - syn match vim9MethodName contained "\<_\=new\w*\>" - syn keyword vim9MethodName contained empty len string +syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock,vimUserCmdReplacement +syn match vimUserCmdName contained +\<\u[[:alnum:]]*\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdBlock,vimUserCmdReplacement +syn region vimUserCmdReplacement contained + \ start="\S" + \ start=+^\s*\%(\\\|["#]\\ \)+ + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue,@vimUserCmdList,vimComFilter + \ keepend +syn region vimUserCmdBlock contained + \ matchgroup=vimSep + \ start="{" + \ end="^\s*\zs}" + \ contains=@vimDefBodyList,@vimUserCmdList - syn cluster vim9MethodName contains=vim9MethodName,vim9MethodNameError +syn keyword vimDelcommand contained delc[ommand] skipwhite nextgroup=vimDelcommandAttr,vimDelcommandName +syn match vimDelcommandAttr contained "-buffer\>" skipwhite nextgroup=vimDelcommandName +syn match vimDelcommandName contained "\<\u[[:alnum:]]*\>" - if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vim9MethodDefFold contained - \ start="\%(^\s*\%(:\=static\s\+\)\=\)\@16<=:\=def\s\+\h\w*[<(]" - \ end="^\s*:\=enddef\>" - \ contains=vim9MethodDef - \ fold keepend extend transparent - endif +" :copy (special handling for :t only) {{{3 +" ===== +" lower priority than [wtb]: Vim9 scoped variables at SOL +syn match vimCopy contained "\" nextgroup=vimBang +syn match vimCopy_ contained "t\>" nextgroup=vimBang - syn cluster vim9MethodDef contains=vim9MethodDef,vim9MethodDefFold +" :debug {{{3 +" ====== +syn keyword vimDebug contained deb[ug] skipwhite nextgroup=@vimCmdList - " Classes {{{3 - syn cluster vim9ClassBodyList contains=vim9Abstract,vim9Class,vim9Comment,vim9LineComment,@vim9Continue,@vimExprList,vim9Extends,vim9Implements,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Super,vim9Var +" :debuggreedy {{{3 +" ============ +syn keyword vimDebuggreedy contained debugg[reedy] +syn match vimDebuggreedy_ contained "debugg\%[reedy]\>" - syn match vim9Class contained "\" skipwhite nextgroup=vim9ClassName - syn match vim9ClassName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends,vim9Implements - syn match vim9SuperClass contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Implements - syn match vim9ImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9InterfaceListComma,vim9Extends - syn match vim9InterfaceListComma contained "," skipwhite skipnl nextgroup=vim9ImplementedInterface - syn keyword vim9Abstract abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef - syn keyword vim9Extends contained extends skipwhite skipnl nextgroup=vim9SuperClass - syn keyword vim9Implements contained implements skipwhite skipnl nextgroup=vim9ImplementedInterface - syn keyword vim9Public contained public - syn keyword vim9Static contained static - " FIXME: don't match as dictionary keys, remove when operators are not - " shared between Vim9 and legacy script - syn match vim9This contained "\.\@1:\@!" - " super must be followed by '.' - syn match vim9Super contained "\.\@1" matchgroup=vimCommand end="\" contains=@vim9ClassBodyList transparent +" :delete {{{3 +" ======= +" TODO: handle Vim9 +syn keyword vimDelete contained d[elete] skipwhite nextgroup=vimDeleteRegister,vimDeleteCount,vimPrintFlag +syn match vimDelete_ contained "d\%[elete]\>" skipwhite nextgroup=vimDeleteRegister,vimDeleteCount,vimPrintFlag - " Enums {{{3 - syn cluster vim9EnumBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Enum,@vimExprList,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Var +syn match vimDelete contained "\\|#\)" nextgroup=vimPrintFlag +syn match vimDelete_ contained "d\%[elete]\ze\%([lp]\+\>\|#\)" nextgroup=vimPrintFlag +" :del is :delete only, not :delete | :list +syn match vimDelete contained "\" +syn match vimDelete_ contained "del\>" - syn match vim9Enum contained "\" skipwhite nextgroup=vim9EnumName +syn match vimDelete contained "\\)" nextgroup=vimDeleteRegister,vimDeleteCount +syn match vimDelete_ contained "d\%[elete]\ze\%(_\|\d\+\>\)" nextgroup=vimDeleteRegister,vimDeleteCount - syn match vim9EnumName contained "\<\u\w*\>" skipwhite skipempty nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements - syn match vim9EnumNameTrailing contained "\S.*" - syn region vim9EnumNameComment contained - \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" - \ skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue - \ contains=@vimCommentGroup,vimCommentString - " vim9EnumName's "skipempty" should only apply to comments and enum values and not implements clauses - syn match vim9EnumNameEmpty contained "^" skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue - " allow line continuation between enum name and "implements" - syn match vim9EnumNameContinue contained - \ "^\s*\\" - \ skipwhite skipnl nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements - \ contains=vimWhitespace - syn match vim9EnumNameContinueComment contained - \ "^\s*#\\ .*" - \ skipwhite skipnl nextgroup=vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue - \ contains=vimWhitespace - syn cluster vim9EnumNameContinue contains=vim9EnumNameContinue,vim9EnumNameContinueComment +syn match vimDeleteRegister contained +[-*+_]\|\\"+ skipwhite nextgroup=vimDeleteCount,vimPrintFlag +syn match vimDeleteRegister contained +\<\a+ skipwhite nextgroup=vimDeleteCount,vimPrintFlag - " enforce enum value list location - syn match vim9EnumValue contained "\<\a\w*\>" nextgroup=vim9EnumValueTypeArgs,vim9EnumValueArgList,vim9EnumValueListComma,vim9Comment - syn match vim9EnumValueListComma contained "," skipwhite skipempty nextgroup=vim9EnumValue,vim9EnumValueListCommaComment - syn region vim9EnumValueListCommaComment contained - \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" - \ skipwhite skipempty nextgroup=vim9EnumValueListCommaComment,vim9EnumValue - \ contains=@vimCommentGroup,vimCommentString - syn region vim9EnumValueTypeArgs contained - \ matchgroup=Delimiter - \ start="<\ze\a" - \ end=">" - \ nextgroup=vim9EnumValueArgList - \ contains=@vimType - \ oneline - syn region vim9EnumValueArgList contained - \ matchgroup=vimParenSep start="(" end=")" - \ nextgroup=vim9EnumValueListComma - \ contains=@vimExprList,vimContinueString,vim9Comment +syn match vimDeleteCount contained "\d\+" skipwhite nextgroup=vimPrintFlag - syn keyword vim9EnumImplements contained implements skipwhite nextgroup=vim9EnumImplementedInterface - syn match vim9EnumImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9EnumInterfaceListComma,vim9EnumImplementedInterfaceComment,vim9EnumValue - syn match vim9EnumInterfaceListComma contained "," skipwhite nextgroup=vim9EnumImplementedInterface - syn region vim9EnumImplementedInterfaceComment contained - \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" - \ skipwhite skipempty nextgroup=vim9EnumImplementedInterfaceComment,vim9EnumValue - \ contains=@vimCommentGroup,vimCommentString +" :echo, :execute {{{3 +" =============== +" NOTE: No trailing legacy script comments - VimFolde syn region vim9EnumBody start="\" matchgroup=vimCommand end="\" contains=@vim9EnumBodyList transparent +syn region vimEcho contained + \ matchgroup=vimCommand + \ start="\" + \ start="\" + \ start="\" + \ start="\" + \ start="\" + "\ TODO: default to \ + \ start="\" + \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ excludenl end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimExprList,vim9Comment + \ transparent - " Interfaces {{{3 - " TODO: limit to decl only - no init values - syn cluster vim9InterfaceBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Extends,vim9Interface,vim9AbstractDef,vim9Var +syn match vimEchohl contained "\" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchohlNone +syn case ignore +syn keyword vimEchohlNone contained none +syn case match - syn match vim9Interface contained "\" skipwhite nextgroup=vim9InterfaceName - syn match vim9InterfaceName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends +syn cluster vimEcho contains=vimEcho,vimEchohl - syn keyword vim9AbstractDef contained def skipwhite nextgroup=vim9AbstractDefName - syn match vim9AbstractDefName contained "\<\h\w*\>" skipwhite nextgroup=vim9AbstractDefParams,vim9AbstractDefTypeParams contains=@vim9MethodName - syn region vim9AbstractDefParams contained - \ matchgroup=Delimiter start="(" end=")" - \ skipwhite skipnl nextgroup=vimDefComment,vim9AbstractDefReturnType,vimCommentError - \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals - syn region vim9AbstractDefReturnType contained - \ start=")\@1<=:\s" end="$" matchgroup=vim9Comment end="\ze[#"]" - \ skipwhite skipnl nextgroup=vimDefComment,vimCommentError - \ contains=vimTypeSep - \ transparent - syn region vim9AbstractDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vim9AbstractDefParams - \ contains=vim9DefTypeParam - - VimFoldi syn region vim9InterfaceBody start="\" matchgroup=vimCommand end="\" contains=@vim9InterfaceBodyList transparent - - " Type Aliases {{{3 - syn match vim9Type "\" skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError - syn match vim9TypeAlias contained "\<\u\w*\>" skipwhite nextgroup=vim9TypeEquals - syn match vim9TypeEquals contained "=" skipwhite nextgroup=@vimType - if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_notypealiaserror") - syn match vim9TypeAliasError contained "\<\l\w*\>" skipwhite nextgroup=vim9TypeEquals - endif -endif +syn region vimExecute contained + \ matchgroup=vimCommand + \ start="\" + \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ excludenl end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimExprList,vim9Comment + \ transparent -" Blocks: {{{2 -" ====== -Vim9 syn region vim9Block - \ matchgroup=vimSep - \ start="{\ze\s*\%($\|[#|]\)" - \ end="^\s*\zs}" - \ skipwhite nextgroup=vim9Comment,vimCmdSep - \ contains=@vimDefBodyList +syn region vimEval contained + \ matchgroup=vimCommand + \ start="\" + \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ excludenl end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimExprList,vim9Comment,vimComment + \ transparent -" Keymaps: {{{2 +" :filter {{{3 " ======= +syn keyword vimExFilter contained filt[er] skipwhite nextgroup=vimExFilterBang,vimExFilterPattern +syn region vimExFilterPattern contained + \ start="[[:ident:]]" + \ end="\ze[[:space:]\n]" + \ skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + \ contains=@vimSubstList + \ oneline +syn region vimExFilterPattern contained + \ matchgroup=Delimiter + \ start="\z([^[:space:][:ident:]|"]\)" + \ skip="\\\\\|\\\z1" + \ end="\z1" + \ skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + \ contains=@vimSubstList + \ oneline +syn match vimExFilterBang contained "\a\@1<=!" skipwhite nextgroup=vimExFilterPattern -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 +" :catch, :throw {{{3 +" ============== +syn keyword vimThrow contained th[row] skipwhite nextgroup=@vimExprList +syn keyword vimCatch contained cat[ch] skipwhite nextgroup=vimCatchPattern +syn region vimCatchPattern contained matchgroup=Delimiter start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" skip="\\\\\|\\\z1" end="\z1" contains=@vimSubstList oneline -" TODO: remove when :" comment is matched in parts as "ex-colon comment" --djk +" :export {{{3 +" ======= if s:vim9script - syn match vim9KeymapLineComment "#.*" contained contains=@vimCommentGroup,vimCommentString,vim9CommentTitle -else - syn match vimKeymapLineComment +".*+ contained contains=@vimCommentGroup,vimCommentString,vimCommentTitle + syn keyword vim9Export export skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vimDef,vimDefFold,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var endif -syn cluster vimKeymapLineComment contains=vim9\=KeymapLineComment - -syn region vimLoadkeymap matchgroup=vimCommand start="\" end="\%$" contains=vimKeymapStart - -" Special Filenames, Modifiers, Extension Removal: {{{2 -" =============================================== -syn match vimSpecFile "" 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 - -syn match vimSpecFile contained "%[ \t:]"me=e-1 nextgroup=vimSpecFileMod -syn match vimSpecFile contained excludenl "%$" nextgroup=vimSpecFileMod -syn match vimSpecFile contained "%<"me=e-1 nextgroup=vimSpecFileMod - -" User-Specified Commands: {{{2 -" ======================= -syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,@vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange -syn match vimUserCmd "\!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang -syn match vimUserCmd +\!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang +" :filetype {{{3 +" ========= +syn match vimFiletype contained "\" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrComplete,vimUserCmdError -syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber -syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs -syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange -syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttrNargs contained "[01*?+]" -syn match vimUserCmdAttrRange contained "%" +syn match vim9ForInComment contained "#.*" skipwhite skipempty nextgroup=vim9ForInComment,@vimExprList -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror") - syn match vimUserCmdError contained "\S\+\>" -endif +syn match vimForInContinue contained "^\s*\zs\\" skipwhite skipnl nextgroup=@vimForInContinue,@vimExprList contains=vimLeadingWhitespace +syn match vimForInContinueComment contained '^\s*\zs["#]\\ .*' skipwhite skipnl nextgroup=@vimForInContinue,@vimExprList contains=vimLeadingWhitespace +syn cluster vimForInContinue contains=vimForInContinue,vimForInContinueComment -syn case ignore -syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister] +" :global, :vglobal {{{3 +" ================= +" TODO: [:.-] should only be removed for Vim9 +" : docs state ! is not allowed as a pattern delimiter but it works +syn region vimGlobalPattern contained + \ matchgroup=Delimiter + \ start=+\z([^[:space:][:alnum:]\\"|:.-]\)+ + \ skip="\\." + \ end="\z1" + \ skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList + \ contains=@vimSubstList +syn match vimGlobal contained "g\%[lobal]\>!\=[:.-]\@!" skipwhite nextgroup=vimGlobalPattern contains=vimBang +syn match vimGlobal contained "v\%[global]\>!\=[:.-]\@!" skipwhite nextgroup=vimGlobalPattern contains=vimBang -" GEN_SYN_VIM: vimUserCmdAttrComplete, START_STR='syn keyword vimUserCmdAttrComplete contained', END_STR='' -syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var -syn keyword vimUserCmdAttrComplete contained custom customlist nextgroup=vimUserCmdAttrCompleteFunc,vimUserCmdError -syn match vimUserCmdAttrCompleteFunc contained ",\%([bwglstav]:\|<[sS][iI][dD]>\)\=\h\w*\%([.#]\h\w*\)*"hs=s+1 nextgroup=vimUserCmdError contains=vimVarScope,vimFunctionSID +" :grep, :make {{{3 +" ============ +" | is the command separator, escaped with \| all other backslashes are passed through literally, no tail comments +syn keyword vimGrep contained gr[ep] lgr[ep] skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn match vimGrep_ contained "l\=gr\%[ep]\>" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn keyword vimGrepadd contained grepa[dd] lgrepa[dd] skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn match vimGrepadd_ contained "l\=grepa\%[dd]\>" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn region vimGrepArgs contained + \ start="|\@!\S" + \ skip=+\n\s*\%(\\\|[#"]\\ \)+ + \ end="\ze|" + \ end="$" + "\ TODO: include vimSpecFile + \ nextgroup=vimCmdSep + \ contains=vimGrepBarEscape +syn match vimGrepBarEscape contained "\\|" +syn match vimGrepBang contained "\a\@1<=!" skipwhite nextgroup=vimGrepArgs,vimCmdSep -" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR='' -syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win -syn match vimUserCmdAttrAddr contained "?" -syn case match +syn keyword vimMake contained mak[e] lmak[e] skipwhite nextgroup=vimMakeBang,vimMakeArgs,vimCmdSep +syn region vimMakeArgs contained + \ start="|\@!\S" + \ skip=+\n\s*\%(\\\|[#"]\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + "\ TODO: include vimSpecFile + \ contains=vimMakeBarEscape +syn match vimMakeBarEscape contained "\\|" +syn match vimMakeBang contained "\a\@1<=!" skipwhite nextgroup=vimMakeArgs,vimCmdSep -syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock,vimUserCmdReplacement -syn match vimUserCmdName contained +\<\u[[:alnum:]]*\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdBlock,vimUserCmdReplacement -syn region vimUserCmdReplacement contained +" :help, :helpgrep, :lhelpgrep {{{3 +" ============================ +syn keyword vimHelp contained h[elp] skipwhite nextgroup=vimHelpBang,vimHelpArg,vimHelpEndCommand +" TODO: match wildcards, ignoring exceptions? +syn region vimHelpArg contained \ start="\S" - \ start=+^\s*\%(\\\|["#]\\ \)+ - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - \ end="$" - \ contains=@vimContinue,@vimUserCmdList,vimComFilter - \ keepend -syn region vimUserCmdBlock contained - \ matchgroup=vimSep - \ start="{" - \ end="^\s*\zs}" - \ contains=@vimDefBodyList,@vimUserCmdList + \ matchgroup=Special + \ end="\%(@\a\a\)\=\ze\s*\%($\|\%x0d\|\%x00\||[^|]\)" + \ skipwhite nextgroup=vimHelpEndCommand + \ oneline +syn match vimHelpBang contained "\a\@1<=!" skipwhite nextgroup=vimHelpArg,vimHelpEndCommand +syn match vimHelpEndCommand contained "\ze|[^|]" skipwhite nextgroup=vimCmdSep +syn match vimHelpEndCommand contained "\%x0d\|\%x00" skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList,vimFunc,vim9Block,@vim9Lhs -syn match vimDelcommand "\" skipwhite nextgroup=vimDelcommandAttr,vimDelcommandName -syn match vimDelcommandAttr contained "-buffer\>" skipwhite nextgroup=vimDelcommandName -syn match vimDelcommandName contained "\<\u[[:alnum:]]*\>" +syn keyword vimHelpgrep contained helpg[rep] lh[elpgrep] skipwhite nextgroup=vimHelpgrepPattern +syn region vimHelpgrepPattern contained + \ start="\S" + \ matchgroup=Special + \ end="@\a\a\>" + \ end="$" + \ contains=@vimSubstList + \ oneline -" Lower Priority Comments: after some vim commands... {{{2 -" ======================= -if get(g:, "vimsyn_comment_strings", 1) - syn region vimCommentString contained oneline start='\S\s\+"'ms=e end='"' extend +" :highlight {{{3 +" ========== +syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,@vimComment +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror") + syn match vimHiCtermError contained "\D\i*" endif +syn keyword vimHighlight contained hi[ghlight] skipwhite nextgroup=vimHiBang,@vimHighlightCluster +syn match vimHiBang contained "\a\@1<=!" skipwhite nextgroup=@vimHighlightCluster -if s:vim9script - syn cluster vimComment contains=vim9Comment -else - syn cluster vimComment contains=vimComment -endif +syn case ignore +" Conceal is a generated low-priority match +syn match vimHiGroup contained "\%(\\)\@!\i\+" +syn keyword vimHiNone contained NONE +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 "\" +syn case match -VimL syn region vimComment +syn match vimHiFontname contained "[a-zA-Z\-*]\+" +syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'" +syn match vimHiGuiRgb contained "#\x\{6}" + +" :highlight {group} {key}={arg} ... {{{3 +syn cluster vimHiCluster contains=vimGroup,vimHLGroup,vimHiGroup,vimHiNone,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiCtermfont,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation,vimComment,vim9Comment +syn region vimHiKeyList contained + \ start="\i\+" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" \ excludenl - \ start=+"+ - \ skip=+\n\s*\%(\\\|"\\ \)+ \ end="$" - \ contains=@vimCommentGroup,vimCommentString - \ extend -Vim9 syn region vim9Comment + \ nextgroup=vimCmdSep + \ 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 {{{3 +syn keyword vimHiClear contained clear skipwhite nextgroup=vimGroup,vimHLGroup,vimHiGroup + +" :highlight link {{{3 +" see tst24 (hi def vs hi) (Jul 06, 2018) +"syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\\|\\)" end="$" contains=vimHiGroup,vimGroup,vimHLGroup,vimNotation +" TODO: simplify and allow line continuations --djk +syn region vimHiLink contained + \ matchgroup=Type + \ start="\%(\\|\\)" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" \ excludenl - \ start="\%#=1\s\@1<=#\%({\@!\|{{\)" - \ skip="\n\s*\%(\\\|#\\ \)" \ end="$" - \ contains=@vimCommentGroup,vimCommentString - \ extend + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimHiCluster -syn match vim9CommentError contained "#.*" -syn match vimCommentError contained +".*+ +" :history {{{3 +" ======== +" TODO: handle Vim9 "history" variable assignment (like `:wincmd =`, but a common variable name) +syn keyword vimHistory contained his[tory] skipwhite nextgroup=vimHistoryName,vimHistoryRange,vimCmdSep,vimComment,vim9Comment +syn keyword vimHistoryName contained c[md] s[earch] e[xpr] i[nput] d[ebug] a[ll] skipwhite nextgroup=vimHistoryRange,vimCmdSep,vimComment,vim9Comment +syn match vimHistoryName contained "[:/?=@>]" skipwhite nextgroup=vimHistoryRange,vimCmdSep,vimComment,vim9Comment +syn match vimHistoryRange contained "-\=\<\d\+\>\%(\s*,\)\=" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment +syn match vimHistoryRange contained ",\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment +syn match vimHistoryRange contained "-\=\<\d\+\s*,\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -" Environment Variables: {{{2 -" ===================== -syn match vimEnvvar "\$\I\i*" -syn match vimEnvvar "\${\I\i*}" +" :if, :else, :elseif, :endif {{{3 +" =========================== +syn keyword vimIf contained if skipwhite nextgroup=@vimExprList,vimNotation +syn keyword vimElseif contained elsei[f] skipwhite nextgroup=@vimExprList,vimNotation +syn keyword vimElse contained el[se] skipwhite nextgroup=vimComment,vim9Comment +syn keyword vimEndif contained en[dif] skipwhite nextgroup=vimComment,vim9Comment -" Strings {{{2 +" :import {{{3 " ======= +syn keyword vimImportAutoload contained autoload skipwhite nextgroup=vimImportFilename +if s:vim9script + syn region vimImportFilename contained + \ start="\S" + \ skip=+\%#=1 + "\ continuation operators at SOL + \\n\%(\s*#.*\n\)*\s*\%([[:punct:]]\+\&[^#"'(]\) + \\| + "\ continuation operators at EOL + \\%(\%([[:punct:]]\+\&[^#"')]\)\s*\%(#.*\)\=\)\@<=$ + \\| + \\n\%(\s*#.*\n\)*\s*as\s + \\| + \\%(^\s*#.*\)\@<=$ + \\| + \\n\s*\%(\\\|#\\ \) + \+ + \ matchgroup=vimCommand + \ end="\s\+\zsas\ze\s\+\h" + \ matchgroup=NONE + \ end="$" + \ skipwhite nextgroup=vimImportName + \ contains=@vim9Continue,@vimExprList,vim9Comment + \ transparent +else + syn region vimImportFilename contained + \ start="\S" + \ skip=+\n\s*\%(\\\|"\\ \)+ + \ matchgroup=vimCommand + \ end="\s\+\zsas\ze\s\+\h" + \ matchgroup=NONE + \ end="$" + \ skipwhite nextgroup=vimImportName + \ contains=@vimContinue,@vimExprList + \ transparent +endif +syn match vimImportName contained "\%(\" skipwhite nextgroup=@vimComment +syn keyword vimImport contained imp[ort] skipwhite nextgroup=vimImportAutoload,vimImportFilename -" In-String Specials: -" 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 matchgroup=vimString start=+[^a-zA-Z\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringGroup extend -syn region vimString oneline matchgroup=vimString start=+[^a-zA-Z\\@]'+lc=1 end=+'+ nextgroup=vimSubscriptBrackets contains=vimQuoteEscape extend -"syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup " see tst45.vim - -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 match vimQuoteEscape contained "''" +" :language {{{3 +" ========= +syn keyword vimLanguage contained lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimSep,vimComment,vim9Comment +syn keyword vimLanguageCategory contained col[late] cty[pe] mes[sages] tim[e] skipwhite nextgroup=@vimLanguageName -syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape extend -syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup extend -syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList -syn match vimStringInterpolationBrace contained "{{" -syn match vimStringInterpolationBrace contained "}}" -syn cluster vimStringInterpolation contains=vimStringInterpolationExpr,vimStringInterpolationBrace +" [language[_territory][.codeset][@modifier]] and the reserved "C" and "POSIX" +syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimSep,vimComment,vim9Comment +syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimSep,vimComment,vim9Comment +syn cluster vimLanguageName contains=vimLanguageName,vimLanguageNameReserved -syn region vimContinueString contained matchgroup=vimContinueString start=+"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,@vimStringGroup -syn region vimContinueString contained matchgroup=vimContinueString start=+'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,vimQuoteEscape -syn region vimContinueString contained matchgroup=vimContinueString start=+$"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,@vimStringInterpolation,@vimStringGroup -syn region vimContinueString contained matchgroup=vimContinueString start=+$'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,@vimStringInterpolation,vimQuoteEscape +" :loadkeymap {{{3 +" =========== -" 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]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount -syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat -syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount -syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount -syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat -syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount -syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags -" & and # after :s are always pattern delimiters not flags -syn match vimSubstFlags contained "[&cegiIlnpr#]\+" skipwhite nextgroup=vimSubstCount -syn match vimSubstCount contained "\d\+\>" -" 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="\\\@" skipwhite nextgroup=vimLockvarVars +syn region vimLockvarVars contained + \ start="\h" skip=+\n\s*\%(\\\|"\\ \)\|^\s*"\\ + end="$" end="\ze[|"]" + \ nextgroup=vimCmdSep,vimComment + \ contains=@vimContinue,vimVar -" Mark: {{{2 +" :map {{{3 " ==== -VimL syn match vimExMark "\\|[[\]<>'`]\)\@=" nextgroup=@vimMarkArg -VimL syn match vimExMark "\" skipwhite nextgroup=@vimMarkArg -syn match vimExMark "\" skipwhite nextgroup=@vimMarkArg +" GEN_SYN_VIM: vimCommand map, START_STR='syn keyword vimMap contained', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs' +syn match vimMap contained "\" skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs +syn keyword vimMap contained no[remap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs +" GEN_SYN_VIM: vimCommand mapclear, START_STR='syn keyword vimMap contained', END_STR='skipwhite nextgroup=vimMapMod' +syn keyword vimMap contained mapc[lear] skipwhite nextgroup=vimMapBang,vimMapMod +" GEN_SYN_VIM: vimCommand unmap, START_STR='syn keyword vimUnmap contained', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs' +syn keyword vimUnmap contained unm[ap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs + +syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite nextgroup=vimMapRhs +syn match vimMapLhs contained +\%(.\|\S\)\+\ze\s*\n\s*\%(\\\|["#]\\ \)+ contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite skipnl nextgroup=vimMapRhsContinue + +syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs +syn match vimMapMod contained "\%#=1<\%(buffer\|expr\|nowait\|script\|silent\|special\|unique\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs +syn region vimMapRhs contained + \ start="\S" + \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader +syn region vimMapRhsContinue contained + \ start=+^\s*\%(\\\|["#]\\ \)+ + \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader +syn match vimMapLeader contained "\%#=1\c<\%(local\)\=leader>" contains=vimMapLeaderKey +syn keyword vimMapModKey contained buffer expr nowait script silent special unique +syn case ignore +syn keyword vimMapLeaderKey contained leader localleader +syn case match + +" :mark {{{3 +" ===== +VimL syn match vimMark contained "\\|[[\]<>'`]\)\@=" nextgroup=@vimMarkArg +VimL syn match vimMark_ contained "k\%([a-zA-Z0-9]\>\|[[\]<>'`]\)\@=" nextgroup=@vimMarkArg +VimL syn keyword vimMark contained k skipwhite nextgroup=@vimMarkArg +VimL syn match vimMark_ contained "k\>" skipwhite nextgroup=@vimMarkArg +syn keyword vimMark contained ma[rk] skipwhite nextgroup=@vimMarkArg +syn match vimMark_ contained "ma\%[rk]\>" skipwhite nextgroup=@vimMarkArg syn match vimMarkArg contained "[a-zA-Z]\>\|[[\]<>'`]" skipwhite nextgroup=vimCmdSep,vimComment syn match vimMarkArgError contained "["^.(){}0-9]" syn cluster vimMarkArg contains=vimMarkArg,vimMarkArgError -" Marks, Registers, Addresses, Filters: {{{2 -syn match vimMark "'[a-zA-Z0-9]\ze\s*$" -syn match vimMark "'[[\]{}()<>'`"^.]\ze\s*$" -syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1 -syn match vimMark "'[[\]{}()<>'`"^.]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1 -syn match vimMark ",\zs'[[\]{}()<>'`"^.]" nextgroup=vimFilter,vimMarkNumber,vimSubst1 -syn match vimMark "[!,:]\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 '@"' -syn match vimLetRegister contained '@["@0-9\-a-zA-Z:.%#=*+~_/]' +" :match {{{3 +" ====== +syn keyword vimMatch contained mat[ch] skipwhite nextgroup=vimMatchGroup,vimMatchNone +syn match vimMatch_ contained "mat\%[ch]\>" skipwhite nextgroup=vimMatchGroup,vimMatchNone -syn match vimAddress ",\zs[.$]" skipwhite nextgroup=vimSubst1 -syn match vimAddress "%\ze\a" skipwhite nextgroup=vimString,vimSubst1 +" conflicts with :match +" syn keyword vimMatch contained mat[ch] skipwhite nextgroup=vimMatchGroup,vimMatchNone +syn match vimMatchGroup contained "[[:alnum:]._-]\+" skipwhite nextgroup=vimMatchPattern +syn case ignore +syn keyword vimMatchNone contained none +syn case match +syn region vimMatchPattern contained + \ matchgroup=Delimiter + \ start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" + \ skip="\\\\\|\\\z1" + \ end="\z1" + \ contains=@vimSubstList + \ oneline -syn match vimFilter "^!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile -syn match vimFilter contained "!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile -syn match vimComFilter contained "|!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile +" :menu {{{3 +" ===== +" NOTE: tail comments disallowed +" GEN_SYN_VIM: vimCommand menu, START_STR='syn keyword vimMenu contained', END_STR='skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus' +syn keyword vimMenu contained popu[p] skipwhite nextgroup=vimMenuBang,vimMenuName +syn region vimMenuRhs contained + \ start="|\@!\S" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ end="\ze|" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimNotation +syn region vimMenuRhsContinue contained + \ start=+^\s*\%(\\\|"\\ \)+ + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ end="\ze|" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimNotation +syn match vimMenuName "\.\@!\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation skipwhite nextgroup=vimCmdSep,vimMenuRhs +syn match vimMenuName +\.\@!\%(\\\s\|\S\)\+\ze\s*\n\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 -" Complex Repeats: (:h complex-repeat) {{{2 -" =============== -syn match vimCmplxRepeat '[^a-zA-Z_/\\()]q[0-9a-zA-Z"]\>'lc=1 +syn region vimMenutranslate contained + \ matchgroup=vimCommand + \ start="\" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ end="\ze|" + \ matchgroup=vimMenuClear + \ end="\!\=" skipwhite nextgroup=vimNormalArg contains=vimBang +syn match vimNormal contained "norm\%[al]\>!\=" skipwhite nextgroup=vimNormalArg contains=vimBang +syn region vimNormalArg contained + \ start="\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue + +" :packadd {{{3 +" ======== +syn keyword vimPackadd contained pa[ckadd] skipwhite nextgroup=vimPackaddBang,vimPackaddArg,vimComment,vim9Comment,vimCmdSep +syn region vimPackaddArg contained + \ start=+["#|]\@!\S+ + \ end="\ze\s*$" + \ end=+\ze\s*\\\@1>\=" skipwhite nextgroup=vimRedirFile +syn region vimRedirFile contained + \ start="\S" + \ matchgroup=Normal + \ end="\s*$" + \ end="\s*\ze[|"]" + \ nextgroup=vimCmdSep,vimComment + \ contains=vimSpecFile +syn match vimRedirRegisterOperator contained ">>\=" +syn match vimRedirRegister contained "@[a-zA-Z*+"]" nextgroup=vimRedirRegisterOperator +syn match vimRedirVariableOperator contained "=>>\=" skipwhite nextgroup=vimVar +syn keyword vimRedirEnd contained END + +" :return {{{3 +" ======= +syn keyword vimReturn contained ret[urn] skipwhite nextgroup=@vimExprList,vimNotation + +" :runtime {{{3 +" ======== +syn keyword vimRuntime contained ru[ntime] skipwhite nextgroup=vimRuntimeBang,vimRuntimeWhere,vimRuntimeArgs +syn keyword vimRuntimeWhere contained + \ START OPT PACK ALL + \ skipwhite nextgroup=vimRuntimeArgs +syn region vimRuntimeArgs contained + \ start=+["#|]\@!\S+ + \ skip=+\s*\n\s*\%(\\\|["#]\\ \)\|^\s*["#]\\ + + \ end="\ze\s*$" + \ end=+\ze\s*\\\@1" skipwhite nextgroup=vimSetBang,vimCmdSep,vimComment,vimSetArgs +" :set {{{3 +" ==== +syn keyword vimSet contained setl[ocal] setg[lobal] se[t] skipwhite nextgroup=vimSetBang,vimCmdSep,vimComment,vimSetArgs syn region vimSetComment contained start=+"+ skip=+\n\s*\%(\\\||"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString extend -syn match vimSetCmdSep contained "|" skipwhite nextgroup=@vimCmdList,vimSubst1,@vimFunc +syn match vimSetCmdSep contained "|" skipwhite nextgroup=@vimCmdList,@vimFunc syn match vimSetEscape contained "\\\%(\\[|"]\|.\)" syn match vimSetBarEscape contained "\\|" syn match vimSetQuoteEscape contained +\\"+ @@ -1158,336 +1270,325 @@ syn keyword vimSetTermcap contained termcap syn match vimSetSep contained "[,:]" syn match vimSetMod contained "\a\@1<=\%(&vim\=\|[!&?<]\)" -" Variable Declarations: {{{2 -" ===================== -VimL syn keyword vimLet let skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar -VimL syn keyword vimConst cons[t] skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar -syn region vimVarList contained - \ start="\[" end="]" - \ skipwhite nextgroup=vimLetHeredoc - \ contains=@vimContinue,@vimSpecialVar,vimVar -syn match vimLetVar contained "\<\%([bwglstav]:\)\=\h[a-zA-Z0-9#_]*\>\ze\%(\[.*]\)\=\s*=<<" skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc contains=vimVarScope,vimSubscriptBrackets -hi link vimLetVar vimVar -syn region vimLetVarSubscript contained - \ matchgroup=vimSubscriptBracket - \ start="\S\@1<=\[" - \ end="]" - \ skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc - \ contains=@vimExprList - -syn keyword vimUnlet unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars -syn match vimUnletBang contained "\a\@1<=!" skipwhite nextgroup=vimUnletVars -syn region vimUnletVars contained - \ start="$\I\|\h" skip=+\n\s*\%(\\\|["#]\\ \)\|^\s*["#]\\ + end="$" end=+\ze\s*[|"#]+ - \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment - \ contains=@vimContinue,vimEnvvar,vimVar,vimVimVar +" :sleep {{{3 +" ====== +syn keyword vimSleep contained sl[eep] skipwhite nextgroup=vimSleepBang,vimSleepArg +syn match vimSleep_ contained "sl\%[eep]\>" skipwhite nextgroup=vimSleepBang,vimSleepArg +syn match vimSleepBang contained "\a\@1<=!" skipwhite nextgroup=vimSleepArg +syn match vimSleepArg contained "\<\%(\d\+\)\=m\=\>" -" TODO: type error after register or environment variables (strings) -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop - \ end="^\z1\=\z2$" - \ extend -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="=<<\%(\s*\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop end="^\z1$" - \ extend -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop - \ end="^\z1\=\z2$" - \ contains=@vimStringInterpolation - \ extend -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop - \ end="^\z1$" - \ contains=@vimStringInterpolation - \ extend - -Vim9 syn keyword vim9Const const skipwhite nextgroup=vim9Variable,vim9VariableList -Vim9 syn keyword vim9Final final skipwhite nextgroup=vim9Variable,vim9VariableList -Vim9 syn keyword vim9Var var skipwhite nextgroup=vim9Variable,vim9VariableList - -syn match vim9Variable contained "\<\h\w*\>" skipwhite nextgroup=vim9VariableTypeSep,vimLetHeredoc,vimOper -syn region vim9VariableList contained start="\[" end="]" contains=@vimContinue,@vimSpecialVar,vim9Variable skipwhite nextgroup=vimLetHeredoc - -syn match vim9VariableTypeSep contained "\S\@1<=:\%(\s\|\n\)\@=" skipwhite nextgroup=@vim9VariableType -syn keyword vim9VariableType contained blob bool channel float job number string void skipwhite nextgroup=vimLetHeredoc -syn keyword vim9VariableTypeAny contained any skipwhite nextgroup=vimLetHeredoc -syn match vim9VariableTypeObject contained "\" skipwhite nextgroup=vimLetHeredoc -syn region vim9VariableCompoundType contained - \ matchgroup=vim9VariableType - \ start="\" skipwhite nextgroup=vimSortBang,@vimSortOptions,vimSortPattern,vimCmdSep +syn match vimSortBang contained "\a\@1<=!" skipwhite nextgroup=@vimSortOptions,vimSortPattern,vimCmdSep +syn match vimSortOptionsError contained "\a\+" +syn match vimSortOptions contained "\<[ilur]*[nfxob]\=[ilur]*\>" skipwhite nextgroup=vimSortPattern,vimCmdSep +syn region vimSortPattern contained + \ matchgroup=Delimiter + \ start="\z([^[:space:][:alpha:]|]\)" + \ skip="\\\\\|\\\z1" + \ end="\z1" + \ skipwhite nextgroup=@vimSortOptions,vimCmdSep + \ contains=@vimSubstList \ oneline - \ transparent -syn match vim9VariableUserType contained "\<\%(\h\w*\.\)*\u\w*\>" skipwhite nextgroup=vimLetHeredoc -syn cluster vim9VariableType contains=vim9VariableType,vim9VariableTypeAny,vim9VariableTypeObject,vim9VariableCompoundType,vim9VariableUserType +syn cluster vimSortOptions contains=vimSortOptions,vimSortOptionsError -" Lockvar and Unlockvar: {{{2 -" ===================== -syn keyword vimLockvar lockv[ar] skipwhite nextgroup=vimLockvarBang,vimLockvarDepth,vimLockvarVars -syn keyword vimUnlockvar unlo[ckvar] skipwhite nextgroup=vimLockvarBang,vimLockvarDepth,vimLockvarVars -syn match vimLockvarBang contained "\a\@1<=!" skipwhite nextgroup=vimLockvarVars -syn match vimLockvarDepth contained "\<[0-3]\>" skipwhite nextgroup=vimLockvarVars -syn region vimLockvarVars contained - \ start="\h" skip=+\n\s*\%(\\\|"\\ \)\|^\s*"\\ + end="$" end="\ze[|"]" - \ nextgroup=vimCmdSep,vimComment - \ contains=@vimContinue,vimVar +" :substitute {{{3 +" =========== +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 contained "\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount +syn match vimSubst contained "\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat +syn match vimSubst contained "\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount +syn match vimSubst_ contained "\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount +syn match vimSubst_ contained "\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat +syn match vimSubst_ contained "\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount +syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags +" & and # after :s are always pattern delimiters not flags +syn match vimSubstFlags contained "[&cegiIlnpr#]\+" skipwhite nextgroup=vimSubstCount +syn match vimSubstCount contained "\d\+\>" +" 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="\\\@" end="\" - \ skipwhite skipnl nextgroup=@vimForInContinue,vim9ForInComment,@vimExprList - \ contains=@vimContinue,vimVar,vimVarList,vim9Variable,vim9VariableList - \ transparent +" two and three letter variants (matched as :s + flags, count may follow immediately) +syn match vimSubst contained "\" skipwhite nextgroup=vimGroupListEquals +syn match vimSynContainedin contained "\" skipwhite nextgroup=vimGroupListEquals +syn match vimSynNextgroup contained "\" skipwhite nextgroup=vimGroupListEquals +if has("conceal") + " no whitespace allowed after '=' + syn match vimSynCchar contained "\]" - \ contains=vimWildcardBracketStart,vimWildcardEscape +" :syntax cluster {{{3 +syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName +syn region vimClusterName contained + \ keepend + \ matchgroup=vimGroupName + \ start="\h\w*\>" + \ skip=+\\\\\|\\\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError +syn match vimGroupAdd contained "\" skipwhite nextgroup=vimGroupListEquals +syn match vimGroupRem contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimWildcardBracketCharacter contained "." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd -syn match vimWildcardBracketRightBracket contained "]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -syn match vimWildcardBracketHyphen contained "-]\@!" nextgroup=@vimWildcardBracketCharacter -syn match vimWildcardBracketEscape contained "\\." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd -syn match vimWildcardBracketCharacterClass contained "\[:[^:]\+:]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -syn match vimWildcardBracketEquivalenceClass contained "\[=[^=]\+=]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -syn match vimWildcardBracketCollatingSymbol contained "\[\.[^.]\+\.]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +" :syntax conceal {{{3 +syn match vimSynType contained "\" skipwhite nextgroup=vimSynConceal,vimSynConcealError +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynconcealerror") + syn match vimSynConcealError contained "\i\+" +endif +syn keyword vimSynConceal contained on off -syn match vimWildcardBracketStart contained "\[" nextgroup=vimWildcardBracketCaret,vimWildcardBracketRightBracket,@vimWildcardBracketCharacter -syn match vimWildcardBracketCaret contained "\^" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketRightBracket -syn match vimWildcardBracketEnd contained "]" +" :syntax foldlevel {{{3 +syn keyword vimSynType contained foldlevel skipwhite nextgroup=vimSynFoldlevel,vimSynFoldlevelError +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynfoldlevelerror") + syn match vimSynFoldlevelError contained "\i\+" +endif +syn keyword vimSynFoldlevel contained start minimum -syn cluster vimWildcardBracketCharacter contains=vimWildcardBracketCharacter,vimWildcardBracketEscape,vimWildcardBracketCharacterClass,vimWildcardBracketEquivalenceClass,vimWildcardBracketCollatingSymbol +" :syntax iskeyword {{{3 +syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimSynIskeyword +syn keyword vimSynIskeyword contained clear +syn match vimSynIskeyword contained "\S\+" contains=vimSynIskeywordSep +syn match vimSynIskeywordSep contained "," -syn match vimWildcardEscape contained "\\." +" :syntax include {{{3 +syn keyword vimSynType contained include skipwhite nextgroup=vimSynIncludeCluster +syn match vimSynIncludeCluster contained "@[_a-zA-Z0-9]\+\>" -syn cluster vimWildcard contains=vimWildcardQuestion,vimWildcardStar,vimWildcardBrace,vimWildcardBracket,vimWildcardInterval +" :syntax keyword {{{3 +syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynContainedin,vimSynKeyError +syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion +syn region vimSynKeyRegion contained + \ keepend + \ matchgroup=vimGroupName + \ start="\h\w*\>" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimSynKeyGroup +syn match vimSynKeyOpt contained "\%#=1\<\%(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>" +syn match vimSynKeyError contained "\" -" Autocmd and Doauto{cmd,all}: {{{2 -" =========================== -" TODO: explicitly match the {cmd} arg rather than bailing out to TOP -syn region vimAutocmdBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList +" :syntax match {{{3 +syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimSynMtchGroup +syn match vimSynMtchOpt contained "\%#=1\<\%(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>" -syn match vimAutocmdGroup contained "\%(\\["|[:space:]]\|[^"|[:space:]]\)\+" skipwhite nextgroup=vimAutoEvent,vimAutoEventGlob -syn match vimAutocmdBang contained "\a\@1<=!" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob +" :syntax {{{3 +syn keyword vimSynType contained enable list manual off on reset -" TODO: cleaner handling of | in pattern position -" : match pattern items in addition to wildcards -syn region vimAutocmdPattern contained - \ start="|\@!\S" - \ skip="\\\\\|\\[,[:space:]]" - \ end="\ze[,[:space:]]" +" :syntax region {{{3 +syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation +syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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="\ze|" \ end="$" - \ skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimFunc - \ contains=vimEnvvar,@vimWildcard,vimAutocmdPatternEscape -syn match vimAutocmdBufferPattern contained "" skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimFunc -" trailing pattern separator comma allowed -syn match vimAutocmdPatternSep contained "," skipwhite nextgroup=@vimAutocmdPattern,vimAutocmdMod,vimAutocmdBlock -syn match vimAutocmdPatternEscape contained "\\." -syn cluster vimAutocmdPattern contains=vimAutocmdPattern,vimAutocmdBufferPattern + \ nextgroup=vimCmdSep + \ 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*\%(\\\|"\\ \)/ 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 '"[^"]\+$' -" TODO: Vim9 requires '++' prefix -syn match vimAutocmdMod contained "\%(++\)\=\" skipwhite nextgroup=vimAutocmdMod,vimAutocmdBlock -syn match vimAutocmdMod contained "++once\>" skipwhite nextgroup=vimAutocmdMod,vimAutocmdBlock +" :syntax spell {{{3 +syn keyword vimSynType contained spell skipwhite nextgroup=vimSynSpell,vimSynSpellError +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynspellerror") + syn match vimSynSpellError contained "\i\+" +endif +syn keyword vimSynSpell contained default notoplevel toplevel -" higher priority than vimAutocmdGroup, assume no group is so named -syn match vimAutoEventGlob contained "*" skipwhite nextgroup=@vimAutocmdPattern -syn match vimAutoEventSep contained "\a\@1<=," nextgroup=vimAutoEvent -syn match vimUserAutoEventSep contained "\a\@1<=," nextgroup=vimUserAutoEvent - -syn match vimAutocmd "\" skipwhite nextgroup=vimAutocmdBang,vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob +" :syntax sync {{{3 +syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncClear,vimSyncMatch,vimSyncError,vimSyncRegion,vimSyncArgs +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncerror") + syn match vimSyncError contained "\i\+" +endif +syn region vimSyncArgs contained + \ start="\S" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=vimSyncLines,vimSyncLinebreak,vimSyncLinecont,vimSyncFromstart,vimSyncCcomment -syn match vimDoautocmdMod contained "" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent -syn match vimDoautocmd "\" skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent -syn match vimDoautocmd "\" skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent +syn keyword vimSyncCcomment contained ccomment skipwhite nextgroup=vimGroupName +syn keyword vimSyncClear contained clear skipwhite nextgroup=vimSyncGroupName +syn keyword vimSyncFromstart contained fromstart +syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName +syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynRegion +syn match vimSyncLinebreak contained "\" skipwhite nextgroup=vimSyncKey +syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup +syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup +syn match vimSyncGroup contained "\<\h\w*\>" skipwhite nextgroup=vimSynRegPat,vimSyncNone +syn keyword vimSyncNone contained NONE -" Echo And Execute: -- prefer strings! {{{2 -" ================ -" NOTE: No trailing comments +" :syntime {{{3 +" ======== +syn keyword vimSyntimeArg contained on off clear report skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep +syn keyword vimSyntime contained synti[me] skipwhite nextgroup=vimSyntimeArg -syn region vimEcho - \ matchgroup=vimCommand - \ start="\" - \ start="\" - \ start="\" - \ start="\" - \ start="\" - \ start="\" - \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ excludenl end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,@vimExprList,vim9Comment - \ transparent +" :terminal {{{3 +" ========= +syn match vimTerminal contained "\" skipwhite nextgroup=vimTerminalOptions,vimTerminalCommand +syn match vimTerminal contained +\\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimTerminalOptions,vimTerminalCommand,@vimTerminalContinue +syn match vimTerminal_ contained "ter\%[minal]\>" skipwhite nextgroup=vimTerminalOptions,vimTerminalCommand +syn match vimTerminal_ contained +ter\%[minal]\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimTerminalOptions,vimTerminalCommand,@vimTerminalContinue -syn match vimEchohl "\" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchohlNone -syn case ignore -syn keyword vimEchohlNone contained none -syn case match +syn match vimTerminalContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimLeadingWhitespace +syn match vimTerminalContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimLeadingWhitespace +syn cluster vimTerminalContinue contains=vimTerminalContinue,vimTerminalContinueComment -syn cluster vimEcho contains=vimEcho,vimEchohl +syn region vimTerminalCommand contained + \ start="\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue -syn region vimExecute - \ matchgroup=vimCommand - \ start="\" - \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ excludenl end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,@vimExprList,vim9Comment +syn region vimTerminalOptions contained + \ start="++" + \ skip=/\s\+++\|\%(\n\|^\)\s*\%(\\\|["#]\\ \)/ + \ end="\s" + \ end="$" + \ skipwhite nextgroup=vimTerminalCommand + \ contains=@vimContinue,vimTerminalOption \ transparent -syn region vimEval - \ matchgroup=vimCommand - \ start="\" - \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ excludenl end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,@vimExprList,vim9Comment,vimComment - \ transparent +syn match vimTerminalOption contained "++\%(\%(no\)\=close\|open\|curwin\|hidden\|norestore\|shell\)\>" +syn match vimTerminalOption contained "++kill=" nextgroup=vimTerminalKillOptionArg +syn match vimTerminalOption contained "++\%(rows\|cols\)=" nextgroup=vimTerminalSizeOptionArg +syn match vimTerminalOption contained "++eof=" nextgroup=vimTerminalEofOptionArg +syn match vimTerminalOption contained "++type=" nextgroup=vimTerminalTypeOptionArg +syn match vimTerminalOption contained "++api=" nextgroup=vimTerminalApiOptionArg -" Filter: {{{2 -" ====== -syn match vimExFilter "\" skipwhite nextgroup=vimExFilterBang,vimExFilterPattern -syn region vimExFilterPattern contained - \ start="[[:ident:]]" - \ end="\ze[[:space:]\n]" - \ skipwhite nextgroup=@vimCmdList - \ contains=@vimSubstList - \ oneline -syn region vimExFilterPattern contained +syn match vimTerminalApiOptionArg contained "\<\S\+\>" +syn match vimTerminalEofOptionArg contained "\<\S\+\>" +syn match vimTerminalSizeOptionArg contained "\<\d\+\>" +syn keyword vimTerminalKillOptionArg contained term hup quit int kill +syn match vimTerminalKillOptionArg contained "\<\d\+\>" +syn keyword vimTerminalTypeOptionArg contained conpty winpty + +" :uniq {{{3 +" ===== +syn keyword vimUniq contained uni[q] skipwhite nextgroup=vimUniqBang,@vimUniqOptions,vimUniqPattern,vimCmdSep +syn match vimUniq_ contained "\" skipwhite nextgroup=vimUniqBang,@vimUniqOptions,vimUniqPattern,vimCmdSep +syn match vimUniqBang contained "\a\@1<=!" skipwhite nextgroup=@vimUniqOptions,vimUniqPattern,vimCmdSep +syn match vimUniqOptionsError contained "\a\+" +syn match vimUniqOptions contained "\<[ilur]*\>" skipwhite nextgroup=vimUniqPattern,vimCmdSep +syn region vimUniqPattern contained \ matchgroup=Delimiter - \ start="\z([^[:space:][:ident:]|"]\)" + \ start="\z([^[:space:][:alpha:]|]\)" \ skip="\\\\\|\\\z1" \ end="\z1" - \ skipwhite nextgroup=@vimCmdList + \ skipwhite nextgroup=@vimUniqOptions,vimCmdSep \ contains=@vimSubstList \ oneline -syn match vimExFilterBang contained "\a\@1<=!" skipwhite nextgroup=vimExFilterPattern - -" Grep and Make: {{{2 -" ============= -" | is the command separator, escaped with \| all other backslashes are passed through literally, no tail comments -syn match vimGrep "\" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep -syn match vimGrepadd "\" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep -syn region vimGrepArgs contained - \ start="|\@!\S" - \ skip=+\n\s*\%(\\\|[#"]\\ \)+ - \ matchgroup=vimCmdSep - \ end="|" - \ end="$" - "\ TODO: include vimSpecFile - \ contains=vimGrepBarEscape -syn match vimGrepBarEscape contained "\\|" -syn match vimGrepBang contained "\a\@1<=!" skipwhite nextgroup=vimGrepArgs,vimCmdSep - -syn match vimMake "\" skipwhite nextgroup=vimMakeBang,vimMakeArgs,vimCmdSep -syn region vimMakeArgs contained - \ start="|\@!\S" - \ skip=+\n\s*\%(\\\|[#"]\\ \)+ - \ matchgroup=vimCmdSep - \ end="|" - \ end="$" - "\ TODO: include vimSpecFile - \ contains=vimMakeBarEscape -syn match vimMakeBarEscape contained "\\|" -syn match vimMakeBang contained "\a\@1<=!" skipwhite nextgroup=vimMakeArgs,vimCmdSep - -" Help*: {{{2 -" ===== -syn match vimHelp "\" skipwhite nextgroup=vimHelpBang,vimHelpArg,vimHelpNextCommand -" TODO: match wildcards, ignoring exceptions? -syn region vimHelpArg contained - \ start="\S" - \ matchgroup=Special - \ end="\%(@\a\a\)\=\ze\s*\%($\|\%x0d\|\%x00\||[^|]\)" - \ oneline -syn match vimHelpNextCommand contained "\ze|[^|]" skipwhite nextgroup=vimCmdSep -syn match vimHelpBang contained "\a\@1<=!" skipwhite nextgroup=vimHelpArg,vimHelpNextCommand -syn match vimHelpgrep "\" skipwhite nextgroup=vimHelpgrepBang,vimHelpgrepPattern -syn region vimHelpgrepPattern contained - \ start="\S" - \ matchgroup=Special - \ end="@\a\a\>" - \ end="$" - \ contains=@vimSubstList - \ oneline +syn cluster vimUniqOptions contains=vimUniqOptions,vimUniqOptionsError -" Vimgrep: {{{2 -" ======= -syn match vimVimgrep "\" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern -syn match vimVimgrepadd "\" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +" :vimgrep, lvimgrep, :vimgrepadd, :lvimgrepadd {{{3 +" ============================================= +syn keyword vimVimgrep contained vim[grep] lv[imgrep] skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +syn keyword vimVimgrepadd contained vimgrepa[dd] lvimgrepa[dd] skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +syn match vimVimgrep_ contained "l\=vim\%[grep]\>" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +syn match vimVimgrepadd_ contained "l\=vimgrepa\%[dd]\>" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern syn match vimVimgrepBang contained "\a\@1<=!" skipwhite nextgroup=vimVimgrepPattern syn region vimVimgrepPattern contained \ start="[[:ident:]]" @@ -1507,492 +1608,718 @@ syn match vimVimgrepEscape contained "\\\%(\\|\|.\)" syn match vimVimgrepBarEscape contained "\\|" syn region vimVimgrepFile contained \ start="|\@!\S" - \ matchgroup=vimCmdSep - \ end="|" + \ end="\ze|" \ end="\ze\s" \ end="$" \ skipwhite nextgroup=vimVimgrepFile \ contains=vimSpecFile,vimVimgrepEscape,vimVimgrepBarEscape -syn match vimVimgrepFlags contained "\<[gjf]\{,3\}\>" skipwhite nextgroup=vimVimgrepfile +syn match vimVimgrepFlags contained "\<[gjf]\{,3\}\>" skipwhite nextgroup=vimVimgrepFile -" Maps: {{{2 -" ==== -" GEN_SYN_VIM: vimCommand map, START_STR='syn keyword vimMap', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs' -syn match vimMap "\" skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs -syn keyword vimMap no[remap] 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=vimMapMod,vimMapLhs' -syn keyword vimUnmap unm[ap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs - -syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite nextgroup=vimMapRhs -syn match vimMapLhs contained "\%(.\|\S\)\+\ze\s*$" contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite skipnl nextgroup=vimMapRhsContinue -syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs -syn match vimMapMod contained "\%#=1<\%(buffer\|expr\|nowait\|script\|silent\|special\|unique\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs -syn region vimMapRhs contained - \ start="\S" - \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader -syn region vimMapRhsContinue contained - \ start=+^\s*\%(\\\|["#]\\ \)+ - \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader -syn match vimMapLeader contained "\%#=1\c<\%(local\)\=leader>" contains=vimMapLeaderKey -syn keyword vimMapModKey contained buffer expr nowait script silent special unique -syn case ignore -syn keyword vimMapLeaderKey contained leader localleader -syn case match +" :while {{{3 +" ====== +syn keyword vimWhile contained wh[ile] skipwhite nextgroup=@vimExprList,vimNotation -" 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*\%(\\\|"\\ \)+ end="$" matchgroup=vimSep end="|" -syn region vimMenuRhsContinue contained contains=@vimContinue,vimNotation start=+^\s*\%(\\\|"\\ \)+ skip=+\\\\\|\\|\|\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 +" :wincmd {{{3 +" ======= +syn keyword vimWincmd contained winc[md] skipwhite nextgroup=vimWincmdArg +syn match vimWincmd_ contained "winc\%[md]\>" skipwhite nextgroup=vimWincmdArg +" TODO: consider extracting this list from the help file +syn match vimWincmdArg contained + \ "\<[sSvnqojkhlwWtbpPrRxKJHLTfFz]\>\|[\^:=\-+_<>|\]}]\|\" + \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn region vimMenutranslate - \ matchgroup=vimCommand start="\" - \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ - \ end="$" matchgroup=vimCmdSep end="|" matchgroup=vimMenuClear end="\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg -" If, While and Return: {{{2 -" ==================== -syn match vimNotFunc "\%#=1\<\%(if\|el\%[seif]\|retu\%[rn]\|while\)\>" skipwhite nextgroup=@vimExprList,vimNotation -syn match vimElse "\" skipwhite nextgroup=vimComment,vim9Comment -syn match vimEndif "\" skipwhite nextgroup=vimComment,vim9Comment +" :write {{{3 +" ====== +" lower priority than [wtb]: Vim9 scoped variables at SOL +syn match vimWrite contained "\" nextgroup=vimBang +syn match vimWrite_ contained "w\%[rite]\>" nextgroup=vimBang -" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2 -" ====================== -syn case ignore -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([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 +" :z {{{3 +" == +syn match vimCommand_ contained "z[-+^.=]\=\>" +syn match vimCommand contained "\" -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(net\|dec\|jsb\|pterm\|urxvt\|sgr\)mouse>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(left\|middle\|right\)\%(mouse\|drag\|release\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}left\%(mouse\|release\)nm>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}x[12]\%(mouse\|drag\|release\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}sgrmouserelease>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}mouse\%(up\|down\|move\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}scrollwheel\%(up\|down\|right\|left\)>" contains=vimBracket +" Operators: {{{2 +" ========= +syn cluster vimOperGroup contains=@vimContinue,@vimExprList,vim9Comment,vim9LineComment,vimContinueString +syn match vimOper "\a\@=\|<=\|=\~\|!\~\|>\|<\)[?#]\=" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile +syn match vimOper "\" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile +syn match vimOper "\\)\=<\%(sid\|nop\|nul\|lt\|drop\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%(snr\|plug\|cursorhold\|ignore\|cmd\|scriptcmd\|focus\%(gained\|lost\)\)>" contains=vimBracket -" syn match vimNotation contained '\%(\\\|\)\=[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket -syn match vimNotation contained '\%#=1\%(\\\|\)\=<\%([fq]-\)\=\%(line[12]\|count\|bang\|reg\|args\|mods\|lt\)>' contains=vimBracket skipwhite nextgroup=vimSubst1 -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([cas]file\|abuf\|amatch\|cexpr\|cword\|cWORD\|client\|stack\|script\|sf\=lnum\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket +syn match vimOperContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList contains=vimLeadingWhitespace +syn match vimOperContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList contains=vimLeadingWhitespace +syn cluster vimOperContinue contains=vimOperContinue,vimOperContinueComment -syn match vimBracket contained "[\\<>]" -syn case match +" Lambda Expressions: {{{2 +" ================== +syn match vimLambdaOperator contained "->" skipwhite nextgroup=@vimExprList +syn region vimLambda contained + \ matchgroup=vimLambdaBrace + \ start=+{\ze[[:space:][:alnum:]_.,]*\%(\n\s*\%(\\[[:space:][:alnum:]_.,]*\|"\\ .*\)\)*->+ + \ skip=+\n\s*\%(\\\|"\\ \)+ + \ end="}" end="$" + \ contains=@vimContinue,@vimExprList,vimLambdaParams +syn match vimLambdaParams contained "\%({\n\=\)\@1<=\_.\{-}\%(->\)\@=" nextgroup=vimLambdaOperator contains=@vimContinue,vimFunctionParam -" User Command Highlighting: {{{2 -syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' +syn match vim9LambdaOperator contained "=>" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment +syn match vim9LambdaParen contained "[()]" +syn match vim9LambdaParams contained + \ "(\%(\" + \ skipwhite nextgroup=vim9LambdaOperator + \ contains=@vim9Continue,vimDefParam,vim9LambdaParen,vim9LambdaReturnType +syn region vim9LambdaReturnType contained start=")\@1<=:\s" end="\ze\s*#" end="\ze\s*=>" contains=@vim9Continue,@vimType transparent +syn region vim9LambdaBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList -" Vim user commands +syn match vim9LambdaOperatorComment contained "#.*" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment -" Compiler plugins -syn match vimCompilerSet "\" skipwhite nextgroup=vimSetArgs +" Functions: Tag is provided for those who wish to highlight tagged functions {{{2 +" ========= +syn cluster vimFunctionBodyCommon contains=vimContinue,vimCtrlChar,vimDef,vimFBVar,vimFunction,vimNumber,vimOper,vimOperParen,vimSpecFile,vimString,vimFunctionFold,vimDefFold,vimCmdSep +syn cluster vimFunctionBodyList contains=@vimFunctionBodyCommon,vimLineStart,vimComment,vimConst,vimLet +syn cluster vimDefBodyList contains=@vimFunctionBodyCommon,vim9LineStart,vim9Comment,vim9Const,vim9Final,vim9Var,vim9Null,vim9Boolean,vim9For,@vimSpecialVar,@vim9Func,vim9LhsVariable_,vim9Wincmd -" runtime/makemenu.vim -syn match vimSynMenu "\" skipwhite nextgroup=vimSynMenuPath -syn match vimSynMenuPath contained ".*\ze:" nextgroup=vimSynMenuColon contains=vimMenuNotation -syn match vimSynMenuColon contained ":" nextgroup=vimSynMenuName -syn match vimSynMenuName contained "\w\+" +syn region vimFunctionPattern contained + \ matchgroup=vimOper + \ start="/" + \ end="$" + \ contains=@vimSubstList -" runtime/syntax/syncolor.vim -syn match vimSynColor "\" skipwhite nextgroup=vimSynColorGroup -syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyList contains=vimGroup -syn match vimSynLink "\" skipwhite nextgroup=vimSynLinkGroup -syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup +syn match vimFunctionBang contained "\a\@1<=!" skipwhite nextgroup=vimFunctionName +syn match vimDefBang contained "\a\@1<=!" skipwhite nextgroup=vimDefName +syn match vimFunctionSID contained "\c" +syn match vimFunctionScope contained "\<[bwglstav]:" +syn match vimFunctionName contained + \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" + \ skipwhite nextgroup=vimFunctionParams,vimCmdSep,vimComment,vim9Comment + \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag +syn match vimDefName contained + \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" + \ nextgroup=vimDefTypeParams,vimDefParams,vimCmdSep,vimComment,vim9Comment + \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag -syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu +syn match vimFunction contained "\" skipwhite nextgroup=vimFunctionBang,vimFunctionName,vimFunctionPattern,vimCmdSep,vimComment +syn match vimDef contained "\" skipwhite nextgroup=vimDefBang,vimDefName,vimFunctionPattern,vimCmdSep,vimComment -" Errors And Warnings: {{{2 -" ==================== -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") - syn match vimFunctionError contained "[[:space:]!]\@1<=\<[a-z0-9]\w\{-}\ze\s*(" - syn match vimFunctionError contained "\%(<[sS][iI][dD]>\|[sg]:\)\d\w\{-}\ze\s*(" - syn match vimElseIfErr "\" - syn match vimBufnrWarn /\\|\.\.\." skipwhite nextgroup=vimFunctionParamEquals +syn match vimDefParam contained "\<\h\w*\>" skipwhite nextgroup=vimParamType,vimFunctionParamEquals +syn match vim9DefTypeParam contained "\<\u\w*\>" + +syn match vimFunctionParamEquals contained "=" skipwhite nextgroup=@vimExprList +syn match vimFunctionMod contained "\<\%(abort\|closure\|dict\|range\)\>" skipwhite skipempty nextgroup=vimFunctionBody,vimFunctionComment,vimEndfunction,vimFunctionMod,vim9CommentError + +syn region vimFunctionBody contained + \ start="^." + \ matchgroup=vimCommand + \ end="\" + \ skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError + \ contains=@vimFunctionBodyList +syn region vimDefBody contained + \ start="^." + \ matchgroup=vimCommand + \ end="\" + \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError + \ contains=@vimDefBodyList + +syn keyword vimEndfunction contained endf[unction] skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError +syn keyword vimEnddef contained enddef skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError + +if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' + syn region vimFunctionFold + \ start="\" skipwhite nextgroup=vimMatchGroup,vimMatchNone contains=vimCount -syn match vimMatchGroup contained "[[:alnum:]._-]\+" skipwhite nextgroup=vimMatchPattern -syn case ignore -syn keyword vimMatchNone contained none -syn case match -syn region vimMatchPattern contained - \ matchgroup=Delimiter - \ start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" - \ skip="\\\\\|\\\z1" - \ end="\z1" - \ contains=@vimSubstList + +syn region vimReturnType contained + \ start=")\@1<=:\%(\s\|\n\)\@=" + \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + + \ end="$" + \ matchgroup=vim9Comment + "\ allow for legacy script tail comment error + \ end="\ze[#"]" + \ skipwhite skipempty nextgroup=vimDefBody,vimDefComment,vimEnddef,vimCommentError + \ contains=@vim9Continue,@vimType + \ transparent +syn match vimParamType contained ":\s" skipwhite skipnl nextgroup=@vimType contains=vimTypeSep + +syn match vimTypeSep contained ":\%(\s\|\n\)\@=" skipwhite nextgroup=@vimType +syn keyword vimType contained blob bool channel float job number string void +syn keyword vimTypeAny contained any +syn match vimTypeObject contained "\" +syn region vimCompoundType contained matchgroup=vimType start="\" + +syn cluster vimType contains=vimType,vimTypeAny,vimTypeObject,vimCompoundType,vimUserType + +" Classes, Enums And Interfaces: {{{2 +" ============================= + +if s:vim9script + + " Methods {{{3 + syn match vim9MethodDef contained "\" skipwhite nextgroup=vim9MethodDefName,vim9ConstructorDefName + syn match vim9MethodDefName contained "\<\h\w*\>" nextgroup=vim9MethodDefParams,vim9MethodDefTypeParams contains=@vim9MethodName + syn region vim9MethodDefParams contained + \ matchgroup=Delimiter start="(" end=")" + \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vim9MethodDefReturnType,vimCommentError + \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals + syn region vim9MethodDefTypeParams contained + \ matchgroup=Delimiter + \ start="<" + \ end=">" + \ nextgroup=vim9MethodDefParams + \ contains=vim9DefTypeParam + + syn match vim9ConstructorDefName contained "\<_\=new\w*\>" + \ nextgroup=vim9ConstructorDefParams,vim9ConstuctorDefTypeParams + \ contains=@vim9MethodName + syn match vim9ConstructorDefParam contained "\<\%(this\.\)\=\h\w*\>" + \ skipwhite nextgroup=vimParamType,vimFunctionParamEquals + \ contains=vim9This,vimOper + syn region vim9ConstructorDefParams contained + \ matchgroup=Delimiter start="(" end=")" + \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError + \ contains=vim9ConstructorDefParam,vim9Comment,vimFunctionParamEquals + syn region vim9ConstuctorDefTypeParams contained + \ matchgroup=Delimiter + \ start="<" + \ end=">" + \ nextgroup=vim9ConstructorDefParams + \ contains=vim9DefTypeParam + + syn region vim9MethodDefReturnType contained + \ start=")\@1<=:\%(\s\|\n\)\@=" + \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + + \ end="$" + \ matchgroup=vim9Comment + \ end="\ze#" + \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError + \ contains=@vim9Continue,vimType,vimTypeSep + \ transparent + + syn region vim9MethodDefComment contained + \ start="#.*" + \ skip=+\n\s*\%(\\\|#\\ \)+ + \ end="$" + \ skipwhite skipempty nextgroup=vim9MethodDefBody,vimEnddef + + syn region vim9MethodDefBody contained + \ start="^.\=" matchgroup=vimCommand end="\" + \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError + \ contains=@vim9MethodDefBodyList + + syn cluster vim9MethodDefBodyList contains=@vimDefBodyList,vim9This,vim9Super + + if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") + syn match vim9MethodNameError contained "\<[a-z0-9]\i\>" + endif + syn match vim9MethodName contained "\<_\=new\w*\>" + syn keyword vim9MethodName contained empty len string + + syn cluster vim9MethodName contains=vim9MethodName,vim9MethodNameError + + if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' + syn region vim9MethodDefFold contained + \ start="\%(^\s*\%(:\=static\s\+\)\=\)\@16<=:\=def\s\+\h\w*[<(]" + \ end="^\s*:\=enddef\>" + \ contains=vim9MethodDef + \ fold keepend extend transparent + endif + + syn cluster vim9MethodDef contains=vim9MethodDef,vim9MethodDefFold + + " Classes {{{3 + syn cluster vim9ClassBodyList contains=vim9Abstract,vim9Class,vim9Comment,vim9LineComment,@vim9Continue,@vimExprList,vim9Extends,vim9Implements,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Super,vim9Var + + syn match vim9Class contained "\" skipwhite nextgroup=vim9ClassName + syn match vim9ClassName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends,vim9Implements + syn match vim9SuperClass contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Implements + syn match vim9ImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9InterfaceListComma,vim9Extends + syn match vim9InterfaceListComma contained "," skipwhite skipnl nextgroup=vim9ImplementedInterface + syn keyword vim9Abstract abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef + syn keyword vim9Extends contained extends skipwhite skipnl nextgroup=vim9SuperClass + syn keyword vim9Implements contained implements skipwhite skipnl nextgroup=vim9ImplementedInterface + syn keyword vim9Public contained public + syn keyword vim9Static contained static + " FIXME: don't match as dictionary keys, remove when operators are not + " shared between Vim9 and legacy script + syn match vim9This contained "\.\@1:\@!" + " super must be followed by '.' + syn match vim9Super contained "\.\@1" matchgroup=vimCommand end="\" contains=@vim9ClassBodyList transparent + + " Enums {{{3 + syn cluster vim9EnumBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Enum,@vimExprList,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Var + + syn match vim9Enum contained "\" skipwhite nextgroup=vim9EnumName + + syn match vim9EnumName contained "\<\u\w*\>" skipwhite skipempty nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements + syn match vim9EnumNameTrailing contained "\S.*" + syn region vim9EnumNameComment contained + \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" + \ skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue + \ contains=@vimCommentGroup,vimCommentString + " vim9EnumName's "skipempty" should only apply to comments and enum values and not implements clauses + syn match vim9EnumNameEmpty contained "^" skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue + " allow line continuation between enum name and "implements" + syn match vim9EnumNameContinue contained + \ "^\s*\\" + \ skipwhite skipnl nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements + \ contains=vimLeadingWhitespace + syn match vim9EnumNameContinueComment contained + \ "^\s*#\\ .*" + \ skipwhite skipnl nextgroup=vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue + \ contains=vimLeadingWhitespace + syn cluster vim9EnumNameContinue contains=vim9EnumNameContinue,vim9EnumNameContinueComment + + " enforce enum value list location + syn match vim9EnumValue contained "\<\a\w*\>" nextgroup=vim9EnumValueTypeArgs,vim9EnumValueArgList,vim9EnumValueListComma,vim9Comment + syn match vim9EnumValueListComma contained "," skipwhite skipempty nextgroup=vim9EnumValue,vim9EnumValueListCommaComment + syn region vim9EnumValueListCommaComment contained + \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" + \ skipwhite skipempty nextgroup=vim9EnumValueListCommaComment,vim9EnumValue + \ contains=@vimCommentGroup,vimCommentString + syn region vim9EnumValueTypeArgs contained + \ matchgroup=Delimiter + \ start="<\ze\a" + \ end=">" + \ nextgroup=vim9EnumValueArgList + \ contains=@vimType + \ oneline + syn region vim9EnumValueArgList contained + \ matchgroup=vimParenSep start="(" end=")" + \ nextgroup=vim9EnumValueListComma + \ contains=@vimExprList,vimContinueString,vim9Comment + + syn keyword vim9EnumImplements contained implements skipwhite nextgroup=vim9EnumImplementedInterface + syn match vim9EnumImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9EnumInterfaceListComma,vim9EnumImplementedInterfaceComment,vim9EnumValue + syn match vim9EnumInterfaceListComma contained "," skipwhite nextgroup=vim9EnumImplementedInterface + syn region vim9EnumImplementedInterfaceComment contained + \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" + \ skipwhite skipempty nextgroup=vim9EnumImplementedInterfaceComment,vim9EnumValue + \ contains=@vimCommentGroup,vimCommentString + + VimFolde syn region vim9EnumBody start="\" matchgroup=vimCommand end="\" contains=@vim9EnumBodyList transparent + + " Interfaces {{{3 + " TODO: limit to decl only - no init values + syn cluster vim9InterfaceBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Extends,vim9Interface,vim9AbstractDef,vim9Var + + syn match vim9Interface contained "\" skipwhite nextgroup=vim9InterfaceName + syn match vim9InterfaceName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends + + syn keyword vim9AbstractDef contained def skipwhite nextgroup=vim9AbstractDefName + syn match vim9AbstractDefName contained "\<\h\w*\>" skipwhite nextgroup=vim9AbstractDefParams,vim9AbstractDefTypeParams contains=@vim9MethodName + syn region vim9AbstractDefParams contained + \ matchgroup=Delimiter start="(" end=")" + \ skipwhite skipnl nextgroup=vimDefComment,vim9AbstractDefReturnType,vimCommentError + \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals + syn region vim9AbstractDefReturnType contained + \ start=")\@1<=:\s" end="$" matchgroup=vim9Comment end="\ze[#"]" + \ skipwhite skipnl nextgroup=vimDefComment,vimCommentError + \ contains=vimTypeSep + \ transparent + syn region vim9AbstractDefTypeParams contained + \ matchgroup=Delimiter + \ start="<" + \ end=">" + \ nextgroup=vim9AbstractDefParams + \ contains=vim9DefTypeParam + + VimFoldi syn region vim9InterfaceBody start="\" matchgroup=vimCommand end="\" contains=@vim9InterfaceBodyList transparent + + " Type Aliases {{{3 + syn match vim9Type "\" skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError + syn match vim9TypeAlias contained "\<\u\w*\>" skipwhite nextgroup=vim9TypeEquals + syn match vim9TypeEquals contained "=" skipwhite nextgroup=@vimType + if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_notypealiaserror") + syn match vim9TypeAliasError contained "\<\l\w*\>" skipwhite nextgroup=vim9TypeEquals + endif +endif -" Normal: {{{2 +" Blocks: {{{2 " ====== -syn match vimNormal "\!\=" skipwhite nextgroup=vimNormalArg contains=vimBang -syn region vimNormalArg contained start="\S" skip=+\n\s*\%(\\\|["#]\\ \)+ end="$" contains=@vimContinue +syn region vim9Block contained + \ matchgroup=vimSep + \ start="{\ze\s*\%($\|[#|]\)" + \ end="^\s*\zs}" + \ skipwhite nextgroup=vim9Comment,vimCmdSep + \ contains=@vimDefBodyList -" Profile: {{{2 -" ======= -syn match vimProfileBang contained "\a\@1<=!" skipwhite nextgroup=vimProfileArg -syn keyword vimProfileArg contained start skipwhite nextgroup=vimProfilePattern -syn keyword vimProfileArg contained func skipwhite nextgroup=vimProfilePattern -syn keyword vimProfileArg contained file skipwhite nextgroup=vimProfilePattern -syn keyword vimProfileArg contained stop pause skipwhite nextgroup=vimCmdSep,@vimComment -syn keyword vimProfileArg contained continue dump skipwhite nextgroup=vimCmdSep,@vimComment -" TODO: match file pattern -syn region vimProfilePattern contained - \ start="\S" - \ skip=+\\[|"#]+ - \ end="$" end=+\ze\s*[|"#]+ - \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn match vimProfile "\" skipwhite nextgroup=vimProfileBang,vimProfileArg +" Special Filenames, Modifiers, Extension Removal: {{{2 +" =============================================== +syn match vimSpecFile "" nextgroup=vimSpecFileMod +syn match vimSpecFile "<\([acs]file\|amatch\|abuf\)>" nextgroup=vimSpecFileMod +syn match vimSpecFile "\s%[ \t:]"ms=s+1,me=e-1 nextgroup=vimSpecFileMod +syn match vimSpecFile "\s%$"ms=s+1 nextgroup=vimSpecFileMod +syn match vimSpecFile "\s%<"ms=s+1,me=e-1 nextgroup=vimSpecFileMod +syn match vimSpecFile "#\d\+\|[#%]<\>" nextgroup=vimSpecFileMod +syn match vimSpecFileMod "\(:[phtre]\)\+" contained -syn keyword vimProfdelArg contained func skipwhite nextgroup=vimProfilePattern -syn keyword vimProfdelArg contained file skipwhite nextgroup=vimProfilePattern -syn keyword vimProfdelArg contained here skipwhite nextgroup=vimCmdSep,@vimComment -syn match vimProfdel "\" skipwhite nextgroup=vimProfdelArg +syn match vimSpecFile contained "%[ \t:]"me=e-1 nextgroup=vimSpecFileMod +syn match vimSpecFile contained excludenl "%$" nextgroup=vimSpecFileMod +syn match vimSpecFile contained "%<"me=e-1 nextgroup=vimSpecFileMod -" Prompt{find,repl}: {{{2 -" ================= -syn region vimPromptArg contained - \ start="\S" - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - \ end="$" - \ contains=@vimContinue -syn keyword vimPrompt promptf[ind] promptr[epl] skipwhite nextgroup=vimPromptArg +" Lower Priority Comments: after some vim commands... {{{2 +" ======================= +if get(g:, "vimsyn_comment_strings", 1) + syn region vimCommentString contained oneline start='\S\s\+"'ms=e end='"' extend +endif -" Redir: {{{2 -" ===== -syn match vimRedir "\" skipwhite nextgroup=vimRedirBang,vimRedirFileOperator,vimRedirVariableOperator,vimRedirRegister,vimRedirEnd -syn match vimRedirBang contained "\a\@1<=!" skipwhite nextgroup=vimRedirFileOperator +if s:vim9script + syn cluster vimComment contains=vim9Comment +else + syn cluster vimComment contains=vimComment +endif -syn match vimRedirFileOperator contained ">>\=" skipwhite nextgroup=vimRedirFile -syn region vimRedirFile contained - \ start="\S" - \ matchgroup=Normal - \ end="\s*$" - \ end="\s*\ze[|"]" - \ nextgroup=vimCmdSep,vimComment - \ contains=vimSpecFile -syn match vimRedirRegisterOperator contained ">>\=" -syn match vimRedirRegister contained "@[a-zA-Z*+"]" nextgroup=vimRedirRegisterOperator -syn match vimRedirVariableOperator contained "=>>\=" skipwhite nextgroup=vimVar -syn keyword vimRedirEnd contained END +VimL syn region vimComment + \ excludenl + \ start=+"+ + \ skip=+\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ contains=@vimCommentGroup,vimCommentString + \ extend +Vim9 syn region vim9Comment + \ excludenl + \ start="\%#=1\s\@1<=#\%({\@!\|{{\)" + \ skip="\n\s*\%(\\\|#\\ \)" + \ end="$" + \ contains=@vimCommentGroup,vimCommentString + \ extend -" Sleep: {{{2 -" ===== -syn keyword vimSleep sl[eep] skipwhite nextgroup=vimSleepBang,vimSleepArg -syn match vimSleepBang contained "\a\@1<=!" skipwhite nextgroup=vimSleepArg -syn match vimSleepArg contained "\<\%(\d\+\)\=m\=\>" +syn match vim9CommentError contained "#.*" +syn match vimCommentError contained +".*+ -" Sort: {{{2 -" ==== -syn match vimSort "\" skipwhite nextgroup=vimSortBang,@vimSortOptions,vimSortPattern,vimCmdSep -syn match vimSortBang contained "\a\@1<=!" skipwhite nextgroup=@vimSortOptions,vimSortPattern,vimCmdSep -syn match vimSortOptionsError contained "\a\+" -syn match vimSortOptions contained "\<[ilur]*[nfxob]\=[ilur]*\>" skipwhite nextgroup=vimSortPattern,vimCmdSep -syn region vimSortPattern contained - \ matchgroup=Delimiter - \ start="\z([^[:space:][:alpha:]|]\)" - \ skip="\\\\\|\\\z1" - \ end="\z1" - \ skipwhite nextgroup=@vimSortOptions,vimCmdSep - \ contains=@vimSubstList - \ oneline +" Environment Variables: {{{2 +" ===================== +syn match vimEnvvar "\$\I\i*" +syn match vimEnvvar "\${\I\i*}" -syn cluster vimSortOptions contains=vimSortOptions,vimSortOptionsError +" Strings {{{2 +" ======= -" Terminal: {{{2 -" ======== -syn match vimTerminal "\" skipwhite nextgroup=vimTerminalOptions,vimTerminalCommand -syn match vimTerminal +\\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimTerminalOptions,vimTerminalCommand,@vimTerminalContinue +" In-String Specials: +" 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 matchgroup=vimString start=+[^a-zA-Z\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringGroup extend +syn region vimString oneline matchgroup=vimString start=+[^a-zA-Z\\@]'+lc=1 end=+'+ nextgroup=vimSubscriptBrackets contains=vimQuoteEscape extend +"syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup " see tst45.vim -syn match vimTerminalContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimWhitespace -syn match vimTerminalContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimWhitespace -syn cluster vimTerminalContinue contains=vimTerminalContinue,vimTerminalContinueComment +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 match vimQuoteEscape contained "''" -syn region vimTerminalCommand contained - \ start="\S" - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - \ end="$" - \ contains=@vimContinue +syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape extend +syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup extend +syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList +syn match vimStringInterpolationBrace contained "{{" +syn match vimStringInterpolationBrace contained "}}" +syn cluster vimStringInterpolation contains=vimStringInterpolationExpr,vimStringInterpolationBrace -syn region vimTerminalOptions contained - \ start="++" - \ skip=/\s\+++\|\%(\n\|^\)\s*\%(\\\|["#]\\ \)/ - \ end="\s" - \ end="$" - \ skipwhite nextgroup=vimTerminalCommand - \ contains=@vimContinue,vimTerminalOption - \ transparent +syn region vimContinueString contained matchgroup=vimContinueString start=+"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,@vimStringGroup +syn region vimContinueString contained matchgroup=vimContinueString start=+'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,vimQuoteEscape +syn region vimContinueString contained matchgroup=vimContinueString start=+$"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,@vimStringInterpolation,@vimStringGroup +syn region vimContinueString contained matchgroup=vimContinueString start=+$'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,@vimStringInterpolation,vimQuoteEscape -syn match vimTerminalOption contained "++\%(\%(no\)\=close\|open\|curwin\|hidden\|norestore\|shell\)\>" -syn match vimTerminalOption contained "++kill=" nextgroup=vimTerminalKillOptionArg -syn match vimTerminalOption contained "++\%(rows\|cols\)=" nextgroup=vimTerminalSizeOptionArg -syn match vimTerminalOption contained "++eof=" nextgroup=vimTerminalEofOptionArg -syn match vimTerminalOption contained "++type=" nextgroup=vimTerminalTypeOptionArg -syn match vimTerminalOption contained "++api=" nextgroup=vimTerminalApiOptionArg +" Registers, Addresses, Filters: {{{2 +syn match vimLetRegister contained '@["@0-9\-a-zA-Z:.%#=*+~_/]' -syn match vimTerminalApiOptionArg contained "\<\S\+\>" -syn match vimTerminalEofOptionArg contained "\<\S\+\>" -syn match vimTerminalSizeOptionArg contained "\<\d\+\>" -syn keyword vimTerminalKillOptionArg contained term hup quit int kill -syn match vimTerminalKillOptionArg contained "\<\d\+\>" -syn keyword vimTerminalTypeOptionArg contained conpty winpty +" TODO: match this as a contained ex command +syn match vimFilter "^!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile +syn match vimFilter contained "!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile +syn match vimComFilter contained "|!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile -" Uniq: {{{2 -" ==== -syn match vimUniq "\" skipwhite nextgroup=vimUniqBang,@vimUniqOptions,vimUniqPattern,vimCmdSep -syn match vimUniqBang contained "\a\@1<=!" skipwhite nextgroup=@vimUniqOptions,vimUniqPattern,vimCmdSep -syn match vimUniqOptionsError contained "\a\+" -syn match vimUniqOptions contained "\<[ilur]*\>" skipwhite nextgroup=vimUniqPattern,vimCmdSep -syn region vimUniqPattern contained - \ matchgroup=Delimiter - \ start="\z([^[:space:][:alpha:]|]\)" - \ skip="\\\\\|\\\z1" - \ end="\z1" - \ skipwhite nextgroup=@vimUniqOptions,vimCmdSep - \ contains=@vimSubstList - \ oneline +" Variable Declarations: {{{2 +" ===================== +VimL syn keyword vimLet contained let skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar +VimL syn keyword vimConst contained cons[t] skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar +syn region vimVarList contained + \ start="\[" end="]" + \ skipwhite nextgroup=vimLetHeredoc + \ contains=@vimContinue,@vimSpecialVar,vimVar +syn match vimLetVar contained "\<\%([bwglstav]:\)\=\h[a-zA-Z0-9#_]*\>\ze\%(\[.*]\)\=\s*=<<" skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc contains=vimVarScope,vimSubscriptBrackets -syn cluster vimUniqOptions contains=vimUniqOptions,vimUniqOptionsError +syn region vimLetVarSubscript contained + \ matchgroup=vimSubscriptBracket + \ start="\S\@1<=\[" + \ end="]" + \ skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc + \ contains=@vimExprList -" Wincmd: {{{2 -" ====== -syn match vimWincmd "\" skipwhite nextgroup=vimWincmdArg -" TODO: consider extracting this list from the help file -syn match vimWincmdArg contained - \ "\<[sSvnqojkhlwWtbpPrRxKJHLTfFz]\>\|[\^:=\-+_<>|\]}]\|\" +syn keyword vimUnlet contained unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars +syn match vimUnletBang contained "\a\@1<=!" skipwhite nextgroup=vimUnletVars +syn region vimUnletVars contained + \ start="$\I\|\h" skip=+\n\s*\%(\\\|["#]\\ \)\|^\s*["#]\\ + end="$" end=+\ze\s*[|"#]+ \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment + \ contains=@vimContinue,vimEnvvar,vimVar,vimVimVar -" only handles oneline assignments -Vim9 syn match vimWincmd "\s\=\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg +" TODO: type error after register or environment variables (strings) +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop + \ end="^\z1\=\z2$" + \ extend +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="=<<\%(\s*\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop end="^\z1$" + \ extend +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop + \ end="^\z1\=\z2$" + \ contains=@vimStringInterpolation + \ extend +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop + \ end="^\z1$" + \ contains=@vimStringInterpolation + \ extend -" Syntax: {{{2 -"======= -syn region vimGroupList contained - \ start="\S" - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - "\ need to consume the whitespace - \ end="\s"he=e-1 - \ end="$" - \ contains=@vimGroupListContinue,vimGroupSpecial,vimGroupListContinueComma -syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP -syn match vimGroupListComma contained "," -syn match vimGroupListContinueComma contained "\s\+,\s*\|,\s\+" contains=vimGroupListComma -syn match vimGroupListContinueComma contained "\s*,\s*\%(\n\s*\%(\\\s\+\|["#]\\ .*\)\)\+" contains=@vimGroupListContinue,vimGroupListComma +Vim9 syn keyword vim9Const contained const skipwhite nextgroup=vim9Variable,vim9VariableList +Vim9 syn keyword vim9Final contained final skipwhite nextgroup=vim9Variable,vim9VariableList +Vim9 syn keyword vim9Var contained var skipwhite nextgroup=vim9Variable,vim9VariableList -syn match vimGroupListEquals contained "=" skipwhite skipnl nextgroup=vimGroupListContinueStart,vimGroupList -" the first continuation line does not terminate the list at whitepace after \ -syn match vimGroupListContinueStart contained "^\%(\s*["#]\\ .*\n\)*\s*\\\s\+" skipwhite nextgroup=vimGroupList contains=@vimGroupListContinue transparent +syn match vim9Variable contained "\<\h\w*\>" skipwhite nextgroup=vim9VariableTypeSep,vimLetHeredoc,vimOper +syn region vim9VariableList contained start="\[" end="]" contains=@vimContinue,@vimSpecialVar,vim9Variable skipwhite nextgroup=vimLetHeredoc + +syn match vim9VariableTypeSep contained "\S\@1<=:\%(\s\|\n\)\@=" skipwhite nextgroup=@vim9VariableType +syn keyword vim9VariableType contained blob bool channel float job number string void skipwhite nextgroup=vimLetHeredoc +syn keyword vim9VariableTypeAny contained any skipwhite nextgroup=vimLetHeredoc +syn match vim9VariableTypeObject contained "\" skipwhite nextgroup=vimLetHeredoc +syn region vim9VariableCompoundType contained + \ matchgroup=vim9VariableType + \ start="\" skipwhite nextgroup=vimLetHeredoc -syn match vimGroupListContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimGroupListContinue,vimGroupListContinueComma contains=vimWhitespace -syn match vimGroupListContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimGroupListContinue contains=vimWhitespace -syn cluster vimGroupListContinue contains=vimGroupListContinue,vimGroupListContinueComment +syn cluster vim9VariableType contains=vim9VariableType,vim9VariableTypeAny,vim9VariableTypeObject,vim9VariableCompoundType,vim9VariableUserType -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror") - syn match vimSynError contained "\i\+" -endif -syn match vimSynContains contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimSynContainedin contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimSynNextgroup contained "\" skipwhite nextgroup=vimGroupListEquals -if has("conceal") - " no whitespace allowed after '=' - syn match vimSynCchar contained "\" contains=vimCommand skipwhite nextgroup=vimSynType,@vimComment -syn cluster vimFunctionBodyList add=vimSyntax +syn match vimWildcardQuestion contained "?" +syn match vimWildcardStar contained "*" -" 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 +syn match vimWildcardBraceComma contained "," +syn region vimWildcardBrace contained + \ matchgroup=vimWildcard + \ start="{" + \ end="}" + \ contains=vimWildcardEscape,vimWildcardBrace,vimWildcardBraceComma,vimWildcardQuestion,vimWildcardStar,vimWildcardBracket + \ oneline -" Syntax: clear {{{2 -syn keyword vimSynType contained clear +syn match vimWildcardIntervalNumber contained "\d\+" +syn match vimWildcardInterval contained "\\\\\\{\d\+\%(,\d\+\)\=\\}" contains=vimWildcardIntervalNumber -" Syntax: cluster {{{2 -syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName -syn region vimClusterName contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="$\||" contains=@vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError -syn match vimGroupAdd contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimGroupRem contained "\" skipwhite nextgroup=vimGroupListEquals -" Syntax: conceal {{{2 -syn match vimSynType contained "\" skipwhite nextgroup=vimSynConceal,vimSynConcealError -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynconcealerror") - syn match vimSynConcealError contained "\i\+" -endif -syn keyword vimSynConceal contained on off +syn match vimWildcardBracket contained "\[\%(\^\=]\=\%(\\.\|\[\([:.=]\)[^:.=]\+\1]\|[^][:space:]]\)*\)\@>]" + \ contains=vimWildcardBracketStart,vimWildcardEscape -" Syntax: foldlevel {{{2 -syn keyword vimSynType contained foldlevel skipwhite nextgroup=vimSynFoldlevel,vimSynFoldlevelError -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynfoldlevelerror") - syn match vimSynFoldlevelError contained "\i\+" -endif -syn keyword vimSynFoldlevel contained start minimum +syn match vimWildcardBracketCharacter contained "." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd +syn match vimWildcardBracketRightBracket contained "]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +syn match vimWildcardBracketHyphen contained "-]\@!" nextgroup=@vimWildcardBracketCharacter +syn match vimWildcardBracketEscape contained "\\." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd +syn match vimWildcardBracketCharacterClass contained "\[:[^:]\+:]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +syn match vimWildcardBracketEquivalenceClass contained "\[=[^=]\+=]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +syn match vimWildcardBracketCollatingSymbol contained "\[\.[^.]\+\.]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -" Syntax: iskeyword {{{2 -syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimSynIskeyword -syn keyword vimSynIskeyword contained clear -syn match vimSynIskeyword contained "\S\+" contains=vimSynIskeywordSep -syn match vimSynIskeywordSep contained "," +syn match vimWildcardBracketStart contained "\[" nextgroup=vimWildcardBracketCaret,vimWildcardBracketRightBracket,@vimWildcardBracketCharacter +syn match vimWildcardBracketCaret contained "\^" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketRightBracket +syn match vimWildcardBracketEnd contained "]" -" Syntax: include {{{2 -syn keyword vimSynType contained include skipwhite nextgroup=vimSynIncludeCluster -syn match vimSynIncludeCluster contained "@[_a-zA-Z0-9]\+\>" +syn cluster vimWildcardBracketCharacter contains=vimWildcardBracketCharacter,vimWildcardBracketEscape,vimWildcardBracketCharacterClass,vimWildcardBracketEquivalenceClass,vimWildcardBracketCollatingSymbol -" Syntax: keyword {{{2 -syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynContainedin,vimSynKeyError -syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion -syn region vimSynKeyRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=@vimSynKeyGroup -syn match vimSynKeyOpt contained "\%#=1\<\%(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>" -syn match vimSynKeyError contained "\" +syn match vimWildcardEscape contained "\\." -" Syntax: match {{{2 -syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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=vimCmdSep end="|\|$" contains=@vimSynMtchGroup -syn match vimSynMtchOpt contained "\%#=1\<\%(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>" +syn cluster vimWildcard contains=vimWildcardQuestion,vimWildcardStar,vimWildcardBrace,vimWildcardBracket,vimWildcardInterval -" Syntax: off and on {{{2 -syn keyword vimSynType contained enable list manual off on reset +" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2 +" ====================== +syn case ignore +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([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 -" Syntax: region {{{2 -syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation -syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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*\%(\\\|"\\ \)+ matchgroup=vimCmdSep 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*\%(\\\|"\\ \)/ 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 '"[^"]\+$' +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(net\|dec\|jsb\|pterm\|urxvt\|sgr\)mouse>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(left\|middle\|right\)\%(mouse\|drag\|release\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}left\%(mouse\|release\)nm>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}x[12]\%(mouse\|drag\|release\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}sgrmouserelease>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}mouse\%(up\|down\|move\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}scrollwheel\%(up\|down\|right\|left\)>" contains=vimBracket -" Syntax: spell {{{2 -syn keyword vimSynType contained spell skipwhite nextgroup=vimSynSpell,vimSynSpellError -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynspellerror") - syn match vimSynSpellError contained "\i\+" -endif -syn keyword vimSynSpell contained default notoplevel toplevel +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%(sid\|nop\|nul\|lt\|drop\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%(snr\|plug\|cursorhold\|ignore\|cmd\|scriptcmd\|focus\%(gained\|lost\)\)>" contains=vimBracket +" syn match vimNotation contained '\%(\\\|\)\=[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket +syn match vimNotation contained '\%#=1\%(\\\|\)\=<\%([fq]-\)\=\%(line[12]\|count\|bang\|reg\|args\|mods\|lt\)>' contains=vimBracket skipwhite nextgroup=vimSubst +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([cas]file\|abuf\|amatch\|cexpr\|cword\|cWORD\|client\|stack\|script\|sf\=lnum\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket -" Syntax: sync {{{2 -" ============ -syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncClear,vimSyncMatch,vimSyncError,vimSyncRegion,vimSyncArgs -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncerror") - syn match vimSyncError contained "\i\+" -endif +syn match vimBracket contained "[\\<>]" +syn case match -syn region vimSyncArgs contained start="\S" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=vimSyncLines,vimSyncLinebreak,vimSyncLinecont,vimSyncFromstart,vimSyncCcomment +" User Command Highlighting: {{{2 +" syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' +" syn match vimUsrCmd contained '\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' nextgroup=vimBang +syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:space:]]\|$\)\@=' nextgroup=vimBang -syn keyword vimSyncCcomment contained ccomment skipwhite nextgroup=vimGroupName -syn keyword vimSyncClear contained clear skipwhite nextgroup=vimSyncGroupName -syn keyword vimSyncFromstart contained fromstart -syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName -syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynRegion -syn match vimSyncLinebreak contained "\" skipwhite nextgroup=vimSyncKey -syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup -syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup -syn match vimSyncGroup contained "\<\h\w*\>" skipwhite nextgroup=vimSynRegPat,vimSyncNone -syn keyword vimSyncNone contained NONE +" Vim user commands -" Syntime: {{{2 -" ======= -syn keyword vimSyntimeArg contained on off clear report skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep -syn keyword vimSyntime synti[me] skipwhite nextgroup=vimSyntimeArg -" Additional IsCommand: here by reasons of precedence {{{2 -" ==================== -syn match vimIsCommand "\s*\a\+" transparent contains=vimCommand,vimNotation +" Compiler plugins +syn match vimCompilerSet "\" skipwhite nextgroup=vimSetArgs -" Highlighting: {{{2 -" ============ -syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,@vimComment -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror") - syn match vimHiCtermError contained "\D\i*" -endif -syn match vimHighlight "\" skipwhite nextgroup=vimHiBang,@vimHighlightCluster -syn match vimHiBang contained "\a\@1<=!" skipwhite nextgroup=@vimHighlightCluster +" runtime/makemenu.vim +syn match vimSynMenu "\" skipwhite nextgroup=vimSynMenuPath +syn match vimSynMenuPath contained ".*\ze:" nextgroup=vimSynMenuColon contains=vimMenuNotation +syn match vimSynMenuColon contained ":" nextgroup=vimSynMenuName +syn match vimSynMenuName contained "\w\+" -syn case ignore -" Conceal is a generated low-priority match -syn match vimHiGroup contained "\%(\\)\@!\i\+" -syn keyword vimHiNone contained NONE -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 "\" -syn case match +" runtime/syntax/syncolor.vim +syn match vimSynColor "\" skipwhite nextgroup=vimSynColorGroup +syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyList contains=vimGroup +syn match vimSynLink "\" skipwhite nextgroup=vimSynLinkGroup +syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup -syn match vimHiFontname contained "[a-zA-Z\-*]\+" -syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'" -syn match vimHiGuiRgb contained "#\x\{6}" +syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu -" Highlighting: hi group key=arg ... {{{2 -syn cluster vimHiCluster contains=vimGroup,vimHLGroup,vimHiGroup,vimHiNone,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiCtermfont,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation,vimComment,vim9comment -syn region vimHiKeyList contained start="\i\+" skip=+\\\\\|\\|\|\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 +" Errors And Warnings: {{{2 +" ==================== +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") + syn match vimFunctionError contained "[[:space:]!]\@1<=\<[a-z0-9]\w\{-}\ze\s*(" + syn match vimFunctionError contained "\%(<[sS][iI][dD]>\|[sg]:\)\d\w\{-}\ze\s*(" + syn match vimElseIfErr "\" + syn match vimBufnrWarn /\" skipwhite nextgroup=vimLuaHeredoc,vimLuaStatement +syn match vimLua_ contained "luado\>" skipwhite nextgroup=vimLuaStatement +syn match vimLua_ contained "luafile\>" syn region vimLuaStatement contained \ start="\S" @@ -2064,8 +2394,10 @@ if s:interfaces =~# 'm' let &l:isk = s:iskKeep endif -syn keyword vimMzScheme mz[scheme] skipwhite nextgroup=vimMzSchemeHeredoc,vimMzSchemeStatement -syn keyword vimMzScheme mzf[ile] +syn keyword vimMzScheme contained mz[scheme] skipwhite nextgroup=vimMzSchemeHeredoc,vimMzSchemeStatement +syn keyword vimMzScheme contained mzf[ile] +syn match vimMzScheme_ contained "mz\%[scheme]\>" skipwhite nextgroup=vimMzSchemeHeredoc,vimMzSchemeStatement +syn match vimMzScheme_ contained "mzf\%[ile]\>" syn region vimMzSchemeStatement contained \ start="\S" @@ -2103,8 +2435,10 @@ if s:interfaces =~# 'p' unlet b:current_syntax endif -syn keyword vimPerl pe[rl] skipwhite nextgroup=vimPerlHeredoc,vimPerlStatement -syn keyword vimPerl perld[o] skipwhite nextgroup=vimPerlStatement +syn keyword vimPerl contained pe[rl] skipwhite nextgroup=vimPerlHeredoc,vimPerlStatement +syn keyword vimPerl contained perld[o] skipwhite nextgroup=vimPerlStatement +syn match vimPerl_ contained "pe\%[rl]\>" skipwhite nextgroup=vimPerlHeredoc,vimPerlStatement +syn match vimPerl_ contained "perld\%[o]\>" skipwhite nextgroup=vimPerlStatement syn region vimPerlStatement contained \ start="\S" @@ -2140,9 +2474,12 @@ if s:interfaces =~# 'P' unlet b:current_syntax endif -syn keyword vimPython py[thon] skipwhite nextgroup=vimPythonHeredoc,vimPythonStatement -syn keyword vimPython pydo skipwhite nextgroup=vimPythonStatement -syn keyword vimPython pyfile +syn keyword vimPython contained py[thon] skipwhite nextgroup=vimPythonHeredoc,vimPythonStatement +syn keyword vimPython contained pydo skipwhite nextgroup=vimPythonStatement +syn keyword vimPython contained pyfile +syn match vimPython__ contained "py\%[thon]\>" skipwhite nextgroup=vimPythonHeredoc,vimPythonStatement +syn match vimPython__ contained "pydo\>" skipwhite nextgroup=vimPythonStatement +syn match vimPython__ contained "pyfile\>" syn region vimPythonStatement contained \ start="\S" @@ -2180,9 +2517,13 @@ if s:interfaces =~# 'P' unlet b:current_syntax endif -syn keyword vimPython3 python3 py3 skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement -syn keyword vimPython3 py3do skipwhite nextgroup=vimPython3Statement -syn keyword vimPython3 py3file +syn keyword vimPython3 contained python3 py3 skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement +syn keyword vimPython3 contained py3do skipwhite nextgroup=vimPython3Statement +syn keyword vimPython3 contained py3file +syn match vimPython3__ contained "python3\>" skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement +syn match vimPython3__ contained "py3\>" skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement +syn match vimPython3__ contained "py3do\>" skipwhite nextgroup=vimPython3Statement +syn match vimPython3__ contained "py3file\>" syn region vimPython3Statement contained \ start="\S" @@ -2223,9 +2564,13 @@ if s:interfaces =~# 'P' endif endif -syn keyword vimPythonX pythonx pyx skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement -syn keyword vimPythonX pyxdo skipwhite nextgroup=vimPythonXStatement -syn keyword vimPythonX pyxfile +syn keyword vimPythonX contained pythonx pyx skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement +syn keyword vimPythonX contained pyxdo skipwhite nextgroup=vimPythonXStatement +syn keyword vimPythonX contained pyxfile +syn match vimPythonX__ contained "pythonx\>" skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement +syn match vimPythonX__ contained "pyx\>" skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement +syn match vimPythonX__ contained "pyxdo\>" skipwhite nextgroup=vimPythonXStatement +syn match vimPythonX__ contained "pyxfile\>" syn region vimPythonXStatement contained \ start="\S" @@ -2263,9 +2608,12 @@ if s:interfaces =~# 'r' unlet b:current_syntax endif -syn keyword vimRuby rub[y] skipwhite nextgroup=vimRubyHeredoc,vimRubyStatement -syn keyword vimRuby rubyd[o] skipwhite nextgroup=vimRubyStatement -syn keyword vimRuby rubyf[ile] +syn keyword vimRuby contained rub[y] skipwhite nextgroup=vimRubyHeredoc,vimRubyStatement +syn keyword vimRuby contained rubyd[o] skipwhite nextgroup=vimRubyStatement +syn keyword vimRuby contained rubyf[ile] +syn match vimRuby_ contained "rub[y]\=\>" skipwhite nextgroup=vimRubyHeredoc,vimRubyStatement +syn match vimRuby_ contained "rubydo\=\>" skipwhite nextgroup=vimRubyStatement +syn match vimRuby_ contained "rubyf\%[ile]\>" syn region vimRubyStatement contained \ start="\S" @@ -2302,9 +2650,12 @@ if s:interfaces =~# 't' unlet b:current_syntax endif -syn keyword vimTcl tcl skipwhite nextgroup=vimTclHeredoc,vimTclStatement -syn keyword vimTcl tcld[o] skipwhite nextgroup=vimTclStatement -syn keyword vimTcl tclf[ile] +syn keyword vimTcl contained tcl skipwhite nextgroup=vimTclHeredoc,vimTclStatement +syn keyword vimTcl contained tcld[o] skipwhite nextgroup=vimTclStatement +syn keyword vimTcl contained tclf[ile] +syn match vimTcl_ contained "tcl\>" skipwhite nextgroup=vimTclHeredoc,vimTclStatement +syn match vimTcl_ contained "tcld\%[o]\>" skipwhite nextgroup=vimTclStatement +syn match vimTcl_ contained "tclf\%[ile]\>" syn region vimTclStatement contained \ start="\S" \ skip=+\n\s*\%(\\\|["#]\\ \)+ @@ -2336,48 +2687,19 @@ VimFoldt syn region vimTclHeredoc contained \ contains=@vimTclScript unlet s:interfaces -" Function Call Highlighting: {{{2 -" (following Gautam Iyer's suggestion) -" ========================== -syn match vimFunc contained "\<\l\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimFuncName -" dict-key only -syn match vimUserFuncKey contained "\%(\l\|\d\)\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName -syn match vimUserFunc contained "\<[[:upper:]_]\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName,vim9Super,vim9This -syn match vimUserFunc contained "\<\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen contains=vimVarScope -syn match vimUserFunc contained "\%(\<[sgbwtlav]:\|<[sS][iI][dD]>\)\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation - -Vim9 syn match vim9UserFunc "^\s*\zs\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This -Vim9 syn match vim9UserFunc "^\s*\zs\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimVarScope -Vim9 syn match vim9Func "^\s*\zs\l\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimFuncName - -syn cluster vimFunc contains=vimFunc,vimUserFunc -syn cluster vim9Func contains=vim9Func,vim9UserFunc - -syn region vim9TypeArgs contained - \ matchgroup=Delimiter - \ start="<\ze\a" - \ end=">" - \ nextgroup=vimOperParen - \ contains=@vimType - \ oneline - " Beginners - Patterns that involve ^ {{{2 " ========= -Vim9 syn region vim9LineComment start=+^[ \t:]*\zs#.*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend -VimL syn region vimLineComment start=+^[ \t:]*\zs".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle extend +syn cluster vimCommand_ contains=vimCommand_,vim\u\w\+_ + +Vim9 syn region vim9LineComment contained start=+\%#=1#\%({\@!\|{{\).*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend +VimL syn region vimLineComment contained start=+".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle extend syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup syn match vim9CommentTitle '#\s*\%([sS]:\|\h\w*#\)\=\%([A-DF-Z]\w*\|E\%(\d\{1,4}\>\)\@!\w*\)\(\s\+\u\w*\)*:'hs=s+1 contained contains=vim9CommentTitleLeader,vimTodo,@vimCommentGroup -" allowed anywhere in the file -if !s:vim9script - syn match vimShebangError "^\s*\zs#!.*" display -endif -syn match vimShebang "\%^#!.*" display - -syn match vimContinue "^\s*\zs\\" -syn match vimContinueComment '^\s*\zs["#]\\ .*' extend -syn match vim9ContinueComment "^\s*\zs#\\ .*" extend +syn match vimContinue "^\s*\zs\\" contains=vimLeadingWhitespace "skipwhite nextgroup=vimCmdSep +syn match vimContinueComment '^\s*\zs["#]\\ .*' extend contains=vimLeadingWhitespace +syn match vim9ContinueComment "^\s*\zs#\\ .*" extend contains=vimLeadingWhitespace syn cluster vimContinue contains=vimContinue,vimContinueComment syn cluster vim9Continue contains=vimContinue,vim9ContinueComment @@ -2387,21 +2709,95 @@ syn region vimString start="^\s*\\'" end="'" oneline keepend contains=vimQuoteEs syn match vimCommentTitleLeader '"\s\+'ms=s+1 contained syn match vim9CommentTitleLeader '#\s\+'ms=s+1 contained -" Searches And Globals: {{{2 -" ==================== -VimL syn match vimSearch '^\s*[/?].*' contains=vimSearchDelim -syn match vimSearchDelim '^\s*\zs[/?]\|[/?]$' contained -Vim9 syn match vim9Search '^\s*:[/?].*' contains=vim9SearchDelim -syn match vim9SearchDelim '^\s*\zs:[/?]\|[/?]$' contained contains=vimCmdSep -syn region vimGlobal matchgroup=Statement start='\" contains=vimVar,vimVarScope,@vimSpecialVar,vimEnvvar,vim9Super,vim9This +Vim9 syn match vim9LhsVariable contained transparent "\s\=\%([bwgstv]:\|&\%([lg]:\)\=\|\$\)\=\h[a-zA-Z0-9#_]*\ze\[" nextgroup=vimSubscriptBrackets contains=vimVar,vimVarScope,@vimSpecialVar,vimEnvvar +" TODO: remove these in favour of funccall handling? +Vim9 syn match vim9LhsVariable contained transparent "\s\=\%([bwgtv]:\|&\%([lg]:\)\=\|\$\)\=\h[a-zA-Z0-9#_]*\ze\." nextgroup=vimSubscriptDot contains=vimVar,vimVarScope,@vimSpecialVar,vimEnvvar,vim9Super,vim9This + +Vim9 syn match vim9LhsVariableList contained "\[\_[^]]\+]\ze\s\+[-+/*%]\==" contains=vimVar,@vimSpecialVar +Vim9 syn match vim9LhsVariableList contained "\[\_[^]]\+]\ze\s\+=<<" skipwhite nextgroup=vimLetHeredoc contains=vimVar,@vimSpecialVar +Vim9 syn match vim9LhsVariableList contained "\[\_[^]]\+]\ze\s\+\.\.=" contains=vimVar,@vimSpecialVar + +Vim9 syn match vim9LhsRegister contained "@["0-9\-a-zA-Z#=*+_/]\ze\s\+\%(\.\.\)\==" + +syn cluster vim9Lhs contains=vim9Lhs.* + +" TODO: Useless expressions like "string" at SOL? +" : Continue shouldn't be included here. +VimL syn match vimLineStart "^" skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList,@vimContinue,vimComment,vimLineComment + " FIXME: continued expressions +Vim9 syn match vim9LineStart "^" skipwhite nextgroup=vimCmdStart,@vimCmdList,@vim9Continue,vimCmdSep,vim9Comment,vim9LineComment,vim9Block,vim9Lhs.*,@vim9Func ,vimOperParen,vimOper,vim9Boolean,vim9Null,vimNumber,vimString + +syn match vimCmdSep "\\\@1" contains=vimVar,vim9Super,vim9This,vimWhitespace +Vim9 syn match vim9LhsVariable_ "^\s*\h\w*\ze\s\+=<<" skipwhite nextgroup=vimLetHeredoc contains=vimVar,vim9Super,vim9This,vimWhitespace +" rename vim9LhsFunctionCall? +Vim9 syn match vim9UserFunc "^\s*\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This,vimWhitespace +Vim9 syn match vim9UserFunc "^\s*\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimVarScope,vimWhitespace +Vim9 syn match vim9Func "^\s*\l\w*\ze(" skipwhite nextgroup=vimOperParen contains=vimFuncName,vimWhitespace + +Vim9 syn match vim9Wincmd contained "\s\=\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg contains=vimWhitespace +Vim9 syn match vim9Wincmd "^\s*\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg contains=vimWhitespace + +" allowed anywhere in the file +if !s:vim9script + syn match vimShebangError "^\s*\zs#!.*" display +endif +syn match vimShebang "\%^#!.*" display + + +" Function Call Highlighting: {{{2 +" (following Gautam Iyer's suggestion) +" ========================== +syn match vimFunc contained "\<\l\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimFuncName +" dict-key only +syn match vimUserFuncKey contained "\%(\l\|\d\)\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName +syn match vimUserFunc contained "\<[[:upper:]_]\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName,vim9Super,vim9This +syn match vimUserFunc contained "\<\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen contains=vimVarScope +syn match vimUserFunc contained "\%(\<[sgbwtlav]:\|<[sS][iI][dD]>\)\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation + +Vim9 syn match vim9UserFunc contained "\s\=\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This,vimWhitespace +Vim9 syn match vim9UserFunc contained "\s\=\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimVarScope,vimWhitespace +Vim9 syn match vim9Func contained "\l\w*\ze(" skipwhite nextgroup=vimOperParen contains=vimFuncName +" higher priority for matches in command position +Vim9 syn match vim9FuncWrap contained "\s\+\l\w*\ze(" contains=vim9Func transparent + +syn cluster vimFunc contains=vimFunc,vimUserFunc +syn cluster vim9Func contains=vim9FuncWrap,vim9UserFunc + +syn region vim9TypeArgs contained + \ matchgroup=Delimiter + \ start="<\ze\a" + \ end=">" + \ nextgroup=vimOperParen + \ contains=@vimType + \ oneline " Vim9 script Regions: {{{2 " ================== if s:vim9script - syn cluster vimLegacyTop contains=TOP,vim9LegacyHeader,vim9Comment,vim9LineComment - VimFoldH syn region vim9LegacyHeader start="\%^" end="^\ze\s*vim9s\%[cript]\>" contains=@vimLegacyTop,vimComment,vimLineComment + syn cluster vimLegacyTop contains=TOP,vim9LegacyHeader,vim9LineStart,vim9Comment + VimFoldH syn region vim9LegacyHeader start="\%^" end="^\ze\s*vim9s\%[cript]\>" contains=@vimLegacyTop,vimLineStart,vimComment syn keyword vim9Vim9ScriptArg noclear contained syn keyword vim9Vim9Script vim9s[cript] nextgroup=vim9Vim9ScriptArg skipwhite @@ -2452,7 +2848,10 @@ if !exists("skip_vim_syntax_inits") endif hi def link vimAbb vimCommand - hi def link vimAddress vimMark + hi def link vimAddress Constant + hi def link vimAddressOffset Type + hi def link vimAddressSlashEscape Special + hi def link vimAddressQuestionEscape Special hi def link vimAt vimCommand hi def link vimAtArg Special hi def link vimAugroupBang vimBang @@ -2460,6 +2859,8 @@ if !exists("skip_vim_syntax_inits") hi def link vimAugroupKey vimCommand hi def link vimAutocmd vimCommand hi def link vimAutocmdBang vimBang + hi def link vimAutocmdContinue vimContinue + hi def link vimAutocmdContinueComment vimContinueComment hi def link vimAutocmdPatternEscape Special hi def link vimAutoEvent Type hi def link vimAutoEventGlob Type @@ -2479,14 +2880,24 @@ if !exists("skip_vim_syntax_inits") hi def link vimBreakadd vimCommand hi def link vimBreakdel vimCommand hi def link vimBreaklist vimCommand + hi def link vimBuffer vimCommand + hi def link vimBuffer_ vimBuffer hi def link vimCall vimCommand + hi def link vimCall_ vimCall hi def link vimCatch vimCommand + hi def link vimChangeBang vimBang + hi def link vimChangeCount vimCount hi def link vimCd vimCommand hi def link vimCdBang vimBang - hi def link vimCmplxRepeat SpecialChar + hi def link vimCmdSepContinue vimContinue + hi def link vimCmdSepContinueComment vimContinueComment hi def link vimCommand Statement + hi def link vimCommand_ vimCommand hi def link vimCommandModifier vimCommand + hi def link vimCommandModifier_ vimCommandModifier hi def link vimCommandModifierBang vimBang + hi def link vimCommandModifierContinue vimContinue + hi def link vimCommandModifierContinueComment vimContinueComment hi def link vimComment Comment hi def link vimCommentError vimError hi def link vimCommentString vimString @@ -2496,10 +2907,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimContinue Special hi def link vimContinueComment vimComment hi def link vimContinueString vimString + hi def link vimCopy vimCommand + hi def link vimCopy_ vimCopy hi def link vimCount Number hi def link vimCtrlChar SpecialChar hi def link vimDebug vimCommand hi def link vimDebuggreedy vimCommand + hi def link vimDebuggreedy_ vimDebuggreedy hi def link vimDef vimCommand hi def link vimDefBang vimBang hi def link vimDefComment vim9Comment @@ -2507,16 +2921,26 @@ if !exists("skip_vim_syntax_inits") hi def link vimDefParam vimVar hi def link vimDelcommand vimCommand hi def link vimDelcommandAttr vimUserCmdAttr + hi def link vimDelete vimCommand + hi def link vimDelete_ vimDelete + hi def link vimDeleteCount Number + hi def link vimDeleteRegister Constant hi def link vimDelfunction vimCommand hi def link vimDelfunctionBang vimBang hi def link vimDoautocmd vimCommand hi def link vimDoautocmdMod Special hi def link vimDoCommand vimCommand + hi def link vimDoCommand_ vimDoCommand hi def link vimDoCommandBang vimBang + hi def link vimTextInputBang vimBang + hi def link vimTextInputComment vimComment + hi def link vimTextInputEnd vimCommand + hi def link vimTextInputText String hi def link vimEcho vimCommand hi def link vimEchohlNone vimGroup hi def link vimEchohl vimCommand hi def link vimElse vimCommand + hi def link vimElseif vimCommand hi def link vimElseIfErr Error hi def link vimEndfunction vimCommand hi def link vimEnddef vimCommand @@ -2524,10 +2948,10 @@ if !exists("skip_vim_syntax_inits") hi def link vimEnvvar PreProc hi def link vimError Error hi def link vimEscape Special + hi def link vimEquals vimCommand hi def link vimEval vimCommand hi def link vimExFilter vimCommand hi def link vimExFilterBang vimBang - hi def link vimExMark vimCommand hi def link vimFBVar vimVar hi def link vimFgBgAttrib vimHiAttrib hi def link vimFuncEcho vimCommand @@ -2545,8 +2969,11 @@ if !exists("skip_vim_syntax_inits") hi def link vimFunctionParamEquals vimOper hi def link vimFunctionScope vimVarScope hi def link vimFunctionSID vimNotation + hi def link vimGlobal vimCommand hi def link vimGrep vimCommand + hi def link vimGrep_ vimGrep hi def link vimGrepadd vimCommand + hi def link vimGrepadd_ vimGrepadd hi def link vimGrepBang vimBang hi def link vimGroup Type hi def link vimGroupAdd vimSynOption @@ -2580,10 +3007,10 @@ if !exists("skip_vim_syntax_inits") hi def link vimHLGroup vimGroup hi def link vimHistory vimCommand hi def link vimHistoryName Special + hi def link vimIf vimCommand hi def link vimImport vimCommand hi def link vimImportAutoload Special hi def link vimImportAs vimImport - hi def link vimInsert vimString hi def link vim9KeymapLineComment vimKeymapLineComment hi def link vimKeymapLineComment vimComment hi def link vimKeymapTailComment vimComment @@ -2597,8 +3024,14 @@ if !exists("skip_vim_syntax_inits") hi def link vimLetHeredocStart Special hi def link vimLetHeredocStop Special hi def link vimLetRegister vimRegister + hi def link vimLetVar vimVar hi def link vimLineComment vimComment + hi def link vimLoadkeymap vimCommand + hi def link vimLockvar vimCommand + hi def link vimLockvarBang vimBang + hi def link vimLockvarDepth vimNumber hi def link vimLua vimCommand + hi def link vimLua_ vimLua hi def link vimMake vimCommand hi def link vimMakeadd vimCommand hi def link vimMakeBang vimBang @@ -2608,9 +3041,10 @@ if !exists("skip_vim_syntax_inits") hi def link vimMapModKey vimFunctionSID hi def link vimMapMod vimBracket hi def link vimMap vimCommand - hi def link vimMark Number - hi def link vimMarkNumber vimNumber + hi def link vimMark vimCommand + hi def link vimMark_ vimMark hi def link vimMatch vimCommand + hi def link vimMatch_ vimMatch hi def link vimMatchGroup vimGroup hi def link vimMatchNone vimGroup hi def link vimMenuBang vimBang @@ -2618,6 +3052,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimMenuMod vimMapMod hi def link vimMenuName PreProc hi def link vimMenu vimCommand + hi def link vimMenu_ vimMenu hi def link vimMenuNotation vimNotation hi def link vimMenuPriority Number hi def link vimMenuStatus Special @@ -2625,10 +3060,10 @@ if !exists("skip_vim_syntax_inits") hi def link vim9MethodName vimFuncName hi def link vimMtchComment vimComment hi def link vimMzScheme vimCommand + hi def link vimMzScheme_ vimMzScheme hi def link vimNonText NonText hi def link vimNormal 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 @@ -2638,6 +3073,8 @@ if !exists("skip_vim_syntax_inits") hi def link vimOption PreProc hi def link vimOptionVar Identifier hi def link vimOptionVarName Identifier + hi def link vimPackadd vimCommand + hi def link vimPackaddBang vimBang hi def link vimParenSep Delimiter hi def link vimPatSepErr vimError hi def link vimPatSepR vimPatSep @@ -2646,7 +3083,11 @@ if !exists("skip_vim_syntax_inits") hi def link vimPatSepZ vimPatSep hi def link vimPattern Type hi def link vimPerl vimCommand - hi def link vimPlainMark vimMark + hi def link vimPerl_ vimPerl + hi def link vimPound vimCommand + hi def link vimPound_ vimPound + hi def link vimPoundCount Number + hi def link vimPrintFlag Special hi def link vimProfile vimCommand hi def link vimProfileArg vimSpecial hi def link vimProfileBang vimBang @@ -2656,7 +3097,11 @@ if !exists("skip_vim_syntax_inits") hi def link vimPython vimCommand hi def link vimPython3 vimCommand hi def link vimPythonX vimCommand + hi def link vimPython__ vimPython + hi def link vimPython3__ vimPython3 + hi def link vimPythonX__ vimPythonX hi def link vimQuoteEscape vimEscape + hi def link vimRange Constant hi def link vimRedir vimCommand hi def link vimRedirBang vimBang hi def link vimRedirFileOperator vimOper @@ -2665,12 +3110,15 @@ if !exists("skip_vim_syntax_inits") hi def link vimRedirEnd Special hi def link vimRedirRegister vimRegister hi def link vimRegister SpecialChar + hi def link vimReturn vimCommand hi def link vimRuby vimCommand + hi def link vimRuby_ vimRuby + hi def link vimRuntime vimCommand + hi def link vimRuntimeBang vimBang + hi def link vimRuntimeWhere Special hi def link vimScriptDelim Comment hi def link vimScriptHeredocStart vimLetHeredocStart hi def link vimScriptHeredocStop vimLetHeredocStop - hi def link vimSearch vimString - hi def link vimSearchDelim Delimiter hi def link vimSep Delimiter hi def link vimSet vimCommand hi def link vimSetAll vimOption @@ -2680,10 +3128,18 @@ if !exists("skip_vim_syntax_inits") hi def link vimSetSep vimSep hi def link vimSetTermcap vimOption hi def link vimShebang PreProc + hi def link vimShiftLeftCount Number + hi def link vimShiftLeftPlus Special + hi def link vimShiftLeft vimCommand + hi def link vimShiftRightCount Number + hi def link vimShiftRightPlus Special + hi def link vimShiftRight vimCommand hi def link vimSleep vimCommand + hi def link vimSleep_ vimSleep hi def link vimSleepArg Constant hi def link vimSleepBang vimBang hi def link vimSort vimCommand + hi def link vimSort_ vimSort hi def link vimSortBang vimBang hi def link vimSortOptions Special hi def link vimSpecFile Identifier @@ -2693,13 +3149,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimString String hi def link vimStringEnd vimString hi def link vimStringInterpolationBrace vimEscape - hi def link vimSubst1 vimSubst hi def link vimSubstCount Number 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 vimSubst_ vimSubst hi def link vimSynCase Type hi def link vimSyncCcomment Type hi def link vimSynCchar vimSynOption @@ -2737,7 +3193,9 @@ if !exists("skip_vim_syntax_inits") hi def link vimSyntime vimCommand hi def link vimSyntimeArg vimSpecial hi def link vimTcl vimCommand + hi def link vimTcl_ vimTcl hi def link vimTerminal vimCommand + hi def link vimTerminal_ vimCommand hi def link vimTerminalContinue vimContinue hi def link vimTerminalContinueComment vimContinueComment hi def link vimTerminalOption vimSpecial @@ -2751,10 +3209,12 @@ if !exists("skip_vim_syntax_inits") hi def link vimTypeObject vimType hi def link vimTypeObjectBracket vimTypeObject hi def link vimUniq vimCommand + hi def link vimUniq_ vimUniq hi def link vimUniqBang vimBang hi def link vimUniqOptions Special hi def link vimUnlet vimCommand hi def link vimUnletBang vimBang + hi def link vimUnlockvar vimCommand hi def link vimUnmap vimMap hi def link vimUserCmd vimCommand hi def link vimUserCmdAttrAddr vimSpecial @@ -2773,22 +3233,25 @@ if !exists("skip_vim_syntax_inits") hi def link vimVarKey vimVar hi def link vimVarScope Identifier hi def link vimVimgrep vimCommand + hi def link vimVimgrep_ vimVimgrep hi def link vimVimgrepadd vimCommand + hi def link vimVimgrepadd_ vimVimgrepadd hi def link vimVimgrepBang vimBang hi def link vimVimgrepFlags Special hi def link vimVimVar Identifier hi def link vimVimVarName Identifier hi def link vimWarn WarningMsg + hi def link vimWhile vimCommand hi def link vimWildcard Special hi def link vimWildcardBraceComma vimWildcard hi def link vimWildcardBracket vimWildcard hi def link vimWildcardBracketCaret vimWildcard hi def link vimWildcardBracketCharacter Normal hi def link vimWildcardBracketCharacter Normal - hi def link vimWildcardBracketCharacterClass vimWildCard - hi def link vimWildcardBracketCollatingSymbol vimWildCard + hi def link vimWildcardBracketCharacterClass vimWildcard + hi def link vimWildcardBracketCollatingSymbol vimWildcard hi def link vimWildcardBracketEnd vimWildcard - hi def link vimWildcardBracketEquivalenceClass vimWildCard + hi def link vimWildcardBracketEquivalenceClass vimWildcard hi def link vimWildcardBracketEscape vimWildcard hi def link vimWildcardBracketHyphen vimWildcard hi def link vimWildcardBracketRightBracket vimWildcardBracketCharacter @@ -2798,6 +3261,8 @@ if !exists("skip_vim_syntax_inits") hi def link vimWildcardQuestion vimWildcard hi def link vimWildcardStar vimWildcard hi def link vimWinCmd vimCommand + hi def link vimWrite vimCommand + hi def link vimWrite_ vimWrite hi def link vim9Abstract vimCommand hi def link vim9Boolean Boolean @@ -2834,8 +3299,6 @@ if !exists("skip_vim_syntax_inits") hi def link vim9MethodNameError vimFunctionError hi def link vim9Null Constant hi def link vim9Public vimCommand - hi def link vim9Search vimString - hi def link vim9SearchDelim Delimiter hi def link vim9Static vimCommand hi def link vim9Super Identifier hi def link vim9This Identifier @@ -2849,12 +3312,15 @@ if !exists("skip_vim_syntax_inits") hi def link vim9Var vimCommand hi def link vim9Vim9ScriptArg Special hi def link vim9Vim9Script vimCommand + hi def link vim9Wincmd vimWincmd + hi def link vimWincmd_ vimWincmd hi def link vimCompilerSet vimCommand hi def link vimSynColor vimCommand hi def link vimSynLink vimCommand hi def link vimSynMenu vimCommand hi def link vimSynMenuPath vimMenuName + endif " Current Syntax Variable: {{{2 diff --git a/runtime/syntax/help.vim b/runtime/syntax/help.vim index c851bdfec2..cd962886a6 100644 --- a/runtime/syntax/help.vim +++ b/runtime/syntax/help.vim @@ -2,8 +2,7 @@ " Language: Vim help file " Maintainer: Doug Kearns " Former Maintainer: Bram Moolenaar -" Last Change: 2025 Nov 13 -" 2026 Apr 09 by Vim project: improve pattern for translated syntaxt.txt #19942 +" Last Change: 2026 Aug 02 " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") @@ -59,7 +58,7 @@ if has_key(g:help_example_languages, "vim9") syn region vim9LegacyHeader_HelpExample \ start=+" legacy Vim script comments may go here+ \ end="^\ze\s*vim9s\%[cript]\>" - \ contains=@vimLegacyTop,vimComment,vimLineComment + \ contains=@vimLegacyTop,vimComment,vimLineComment,vimLineStart syn cluster helpExampleHighlight_vim9 add=vim9LegacyHeader_HelpExample endif diff --git a/runtime/syntax/testdir/dumps/vim9_builtin_object_methods2_00.dump b/runtime/syntax/testdir/dumps/vim9_builtin_object_methods2_00.dump index 9d2ccedf0f..a0f6c044f7 100644 --- a/runtime/syntax/testdir/dumps/vim9_builtin_object_methods2_00.dump +++ b/runtime/syntax/testdir/dumps/vim9_builtin_object_methods2_00.dump @@ -9,8 +9,8 @@ @8|p+0#af5f00255&|u|b|l|i|c| +0#0000000&|c+0#af5f00255&|o|n|s|t| +0#0000000&|b+0#00e0e07&|:+0#0000000&| |a+0#00e0003&|n|y| +0#0000000&@47 @75 @8|d+0#af5f00255&|e|f| +0#0000000&|n+0#e000e06&|e|w|(|a+0#00e0e07&|:+0#0000000&| |a+0#00e0003&|n|y|,+0#0000000&| |b+0#00e0e07&|:+0#0000000&| |a+0#00e0003&|n|y|)+0#e000e06&| +0#0000000&@43 -@8| +0#00e0e07&@7|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|a+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|a+0#00e0e07&| +0#0000000&@48 -@8| +0#00e0e07&@7|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|b+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|b+0#00e0e07&| +0#0000000&@48 +@16|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|a+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|a+0#00e0e07&| +0#0000000&@48 +@16|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|b+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|b+0#00e0e07&| +0#0000000&@48 @8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60 @75 @8|d+0#af5f00255&|e|f| +0#0000000&|e+0#e000e06&|m|p|t|y|(|)|:+0#0000000&| |b+0#00e0003&|o@1|l| +0#0000000&@49 diff --git a/runtime/syntax/testdir/dumps/vim9_comments_04.dump b/runtime/syntax/testdir/dumps/vim9_comments_04.dump index 3572cb34bf..24c335ef87 100644 --- a/runtime/syntax/testdir/dumps/vim9_comments_04.dump +++ b/runtime/syntax/testdir/dumps/vim9_comments_04.dump @@ -3,7 +3,7 @@ |#+0#0000e05&| +0#0000000&|I+0#e000e06&|s@1|u|e|:| +0#0000e05&|#|1|3|0|4|7| +0#0000000&@59 @75 |i+0#af5f00255&|f| +0#0000000&|!+0#af5f00255&|e+0#00e0e07&|x|i|s|t|s|(+0#e000e06&|"+0#e000002&|:|D|i|f@1|O|r|i|g|"|)+0#e000e06&| +0#0000000&@51 -@2>c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|D|i|f@1|O|r|i|g| |v+0#af5f00255&|e|r|t| +0#0000000&|n+0#af5f00255&|e|w| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&|b+0#e000e06&|t|=+0#af5f00255&|n+0#0000000&|o|f|i|l|e| ||| |r+0#af5f00255&| +0#0000000&|++0#af5f00255&@1|e+0#00e0e07&|d|i|t| +0#0000000&|%+0#af5f00255&|%+0#00e0e07&| +0#0000000&||| |0+0#e000002&|d+0#0000000&|_| ||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000& +@2>c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|D|i|f@1|O|r|i|g| |v+0#af5f00255&|e|r|t| +0#0000000&|n+0#af5f00255&|e|w| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&|b+0#e000e06&|t|=+0#af5f00255&|n+0#0000000&|o|f|i|l|e| ||| |r+0#af5f00255&| +0#0000000&|++0#af5f00255&@1|e+0#00e0e07&|d|i|t| +0#0000000&|%+0#af5f00255&|%+0#00e0e07&| +0#0000000&||| |0+0#e000002&|d+0#af5f00255&|_+0#e000002&| +0#0000000&||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000& @18|\+0#e000e06&| +0#0000000&||| |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|p| ||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@33 |e+0#af5f00255&|n|d|i|f| +0#0000000&@69 @75 diff --git a/runtime/syntax/testdir/dumps/vim9_def_variables_03.dump b/runtime/syntax/testdir/dumps/vim9_def_variables_03.dump index 48f1253284..c2da01b47b 100644 --- a/runtime/syntax/testdir/dumps/vim9_def_variables_03.dump +++ b/runtime/syntax/testdir/dumps/vim9_def_variables_03.dump @@ -2,19 +2,19 @@ @75 @2|#+0#0000e05&| |A|s@1|i|g|n|m|e|n|t|s| +0#0000000&@59 @75 -@1| +0#00e0e07&|f|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@62 +@2|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@62 > @74 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|0+0#e000002&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@59 +@2|f+0#00e0e07&|o@1|[+0#0000000&|0+0#e000002&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@59 @75 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|1+0#e000002&|:+0#0000000&|2+0#e000002&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@57 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|:|2+0#e000002&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@58 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|1+0#e000002&|:+0#0000000&|]| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@58 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|:|]| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@59 +@2|f+0#00e0e07&|o@1|[+0#0000000&|1+0#e000002&|:+0#0000000&|2+0#e000002&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@57 +@2|f+0#00e0e07&|o@1|[+0#0000000&|:|2+0#e000002&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@58 +@2|f+0#00e0e07&|o@1|[+0#0000000&|1+0#e000002&|:+0#0000000&|]| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@58 +@2|f+0#00e0e07&|o@1|[+0#0000000&|:|]| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@59 @75 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|"+0#e000002&|k|e|y|"|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@55 -@1| +0#00e0e07&|f|o@1|[+0#0000000&|'+0#e000002&|k|e|y|'|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@55 +@2|f+0#00e0e07&|o@1|[+0#0000000&|"+0#e000002&|k|e|y|"|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@55 +@2|f+0#00e0e07&|o@1|[+0#0000000&|'+0#e000002&|k|e|y|'|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@55 @75 -@1| +0#00e0e07&|f|o@1| +0#0000000&|++0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 -@1| +0#00e0e07&|f|o@1| +0#0000000&|-+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 -@1| +0#00e0e07&|f|o@1| +0#0000000&|*+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|++0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|-+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|*+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 @57|5@1|,|0|-|1| @7|2|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_def_variables_04.dump b/runtime/syntax/testdir/dumps/vim9_def_variables_04.dump index 2c507e1ed0..cfe1107800 100644 --- a/runtime/syntax/testdir/dumps/vim9_def_variables_04.dump +++ b/runtime/syntax/testdir/dumps/vim9_def_variables_04.dump @@ -1,7 +1,7 @@ -| +0&#ffffff0| +0#00e0e07&|f|o@1| +0#0000000&|*+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 -@1| +0#00e0e07&|f|o@1| +0#0000000&|/+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 -@1| +0#00e0e07&|f|o@1| +0#0000000&|%+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 -@1| +0#00e0e07&|f|o@1| +0#0000000&|.+0#af5f00255&@1|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@60 +| +0&#ffffff0@1|f+0#00e0e07&|o@1| +0#0000000&|*+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|/+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|%+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|.+0#af5f00255&@1|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@60 @75 @2>b+0#00e0e07&|:|f|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@60 @2|g+0#00e0e07&|:|f|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@60 diff --git a/runtime/syntax/testdir/dumps/vim9_def_variables_07.dump b/runtime/syntax/testdir/dumps/vim9_def_variables_07.dump index 928fc56aa9..15f3000195 100644 --- a/runtime/syntax/testdir/dumps/vim9_def_variables_07.dump +++ b/runtime/syntax/testdir/dumps/vim9_def_variables_07.dump @@ -11,10 +11,10 @@ @2|&+0#00e0e07&|g|:|a|l|e|p|h| +0#0000000&|++0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@56 @2|&+0#00e0e07&|g|:|a|l|e|p|h| +0#0000000&|-+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@56 @75 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@55 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| @67 -@8|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 -@2|[+0#e000e06&|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| |v+0#00e0e07&|:|f|a|l|s|e|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@48 -@2|[+0#e000e06&|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| @64 -@8|\+0#e000e06&| +0#0000000&|v+0#00e0e07&|:|f|a|l|s|e|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@49 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@55 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| @67 +@8|\| |b+0#00e0e07&|a|r|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +@2|[|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| |v+0#00e0e07&|:|f|a|l|s|e|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@48 +@2|[|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| @64 +@8|\| |v+0#00e0e07&|:|f|a|l|s|e|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@49 @57|1|2|7|,|3| @8|5|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_def_variables_08.dump b/runtime/syntax/testdir/dumps/vim9_def_variables_08.dump index 22c33e877c..147dc4a439 100644 --- a/runtime/syntax/testdir/dumps/vim9_def_variables_08.dump +++ b/runtime/syntax/testdir/dumps/vim9_def_variables_08.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@7|\+0#e000e06&| +0#0000000&|v+0#00e0e07&|:|f|a|l|s|e|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@49 -@2|[+0#e000e06&|&+0#00e0e07&|a|r|i|,+0#0000000&| |&+0#00e0e07&|b|k|c|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 -@2|[+0#e000e06&|&+0#00e0e07&|a|r|i|,+0#0000000&| @66 -@8|\+0#e000e06&| +0#0000000&|&+0#00e0e07&|b|k|c|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@52 -@2|[+0#e000e06&|$|f|o@1|,+0#0000000&| |$+0#e000e06&|b|a|r|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 -@2>[+0#e000e06&|$|f|o@1|,+0#0000000&| @66 -@8|\+0#e000e06&| +0#0000000&@1|$+0#e000e06&|b|a|r|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@51 -@2|[+0#e000e06&|@|a|,+0#0000000&| |@+0#e000e06&|b|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@57 -@2|[+0#e000e06&|@|a|,+0#0000000&| @68 -@8|\+0#e000e06&| +0#0000000&@1|@+0#e000e06&|a|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +| +0&#ffffff0@7|\| |v+0#00e0e07&|:|f|a|l|s|e|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@49 +@2|[|&+0#00e0e07&|a|r|i|,+0#0000000&| |&+0#00e0e07&|b|k|c|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +@2|[|&+0#00e0e07&|a|r|i|,+0#0000000&| @66 +@8|\| |&+0#00e0e07&|b|k|c|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@52 +@2|[|$+0#e000e06&|f|o@1|,+0#0000000&| |$+0#e000e06&|b|a|r|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +@2>[|$+0#e000e06&|f|o@1|,+0#0000000&| @66 +@8|\| @1|$+0#e000e06&|b|a|r|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@51 +@2|[|@+0#e000e06&|a|,+0#0000000&| |@+0#e000e06&|b|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@57 +@2|[|@+0#e000e06&|a|,+0#0000000&| @68 +@8|\| @1|@+0#e000e06&|a|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 @75 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|.+0#af5f00255&@1|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|++0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|-+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|*+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|/+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#e000e06&| +0#0000000&|%+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |.+0#af5f00255&@1|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |++0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |-+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |*+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |/+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|]+0#0000000&| |%+0#af5f00255&|=| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 @75 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|;+0#0000000&| |b+0#00e0e07&|a|z|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@50 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|;+0#0000000&| |b+0#00e0e07&|a|z|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@50 @57|1|4|5|,|3| @8|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_def_variables_09.dump b/runtime/syntax/testdir/dumps/vim9_def_variables_09.dump index a8db5cd3ee..ec1ac9782d 100644 --- a/runtime/syntax/testdir/dumps/vim9_def_variables_09.dump +++ b/runtime/syntax/testdir/dumps/vim9_def_variables_09.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@1|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|;+0#0000000&| |b+0#00e0e07&|a|z|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@50 -@2|[+0#e000e06&|f+0#00e0e07&|o@1|,+0#0000000&| @67 -@8|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|a|r|;+0#0000000&| @60 -@8|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|a|z|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 -@2|[+0#e000e06&|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| |v+0#00e0e07&|:|f|a|l|s|e|;+0#0000000&| |v+0#00e0e07&|:|n|o|n|e|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@40 -@2>[+0#e000e06&|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| @64 -@8|\+0#e000e06&| +0#0000000&|v+0#00e0e07&|:|f|a|l|s|e|;+0#0000000&| @56 -@8|\+0#e000e06&| +0#0000000&|v+0#00e0e07&|:|n|o|n|e|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@50 -@2|[+0#e000e06&|$|f|o@1|,+0#0000000&| |$+0#e000e06&|b|a|r|;+0#0000000&| |$+0#e000e06&|b|a|z|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@47 -@2|[+0#e000e06&|$|f|o@1|,+0#0000000&| @66 -@8|\+0#e000e06&| +0#0000000&|$+0#e000e06&|b|a|r|;+0#0000000&| @59 -@8|\+0#e000e06&| +0#0000000&|$+0#e000e06&|b|a|z|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@52 -@2|[+0#e000e06&|&+0#00e0e07&|a|r|i|,+0#0000000&| |&+0#00e0e07&|b|k|c|;+0#0000000&| |&+0#00e0e07&|c|m|p|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@47 -@2|[+0#e000e06&|&+0#00e0e07&|a|r|i|,+0#0000000&| @66 -@8|\+0#e000e06&| +0#0000000&|&+0#00e0e07&|b|k|c|;+0#0000000&| @59 -@8|\+0#e000e06&| +0#0000000&|&+0#00e0e07&|c|m|p|]+0#e000e06&| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@52 -@2|[+0#e000e06&|@|a|,+0#0000000&| |@+0#e000e06&|b|;+0#0000000&| |@+0#e000e06&|c|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 -@2|[+0#e000e06&|@|a|,+0#0000000&| @68 -@8|\+0#e000e06&| +0#0000000&|@+0#e000e06&|b|;+0#0000000&| @61 +| +0&#ffffff0@1|[|f+0#00e0e07&|o@1|,+0#0000000&| |b+0#00e0e07&|a|r|;+0#0000000&| |b+0#00e0e07&|a|z|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@50 +@2|[|f+0#00e0e07&|o@1|,+0#0000000&| @67 +@8|\| |b+0#00e0e07&|a|r|;+0#0000000&| @60 +@8|\| |b+0#00e0e07&|a|z|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +@2|[|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| |v+0#00e0e07&|:|f|a|l|s|e|;+0#0000000&| |v+0#00e0e07&|:|n|o|n|e|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@40 +@2>[|v+0#00e0e07&|:|t|r|u|e|,+0#0000000&| @64 +@8|\| |v+0#00e0e07&|:|f|a|l|s|e|;+0#0000000&| @56 +@8|\| |v+0#00e0e07&|:|n|o|n|e|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@50 +@2|[|$+0#e000e06&|f|o@1|,+0#0000000&| |$+0#e000e06&|b|a|r|;+0#0000000&| |$+0#e000e06&|b|a|z|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@47 +@2|[|$+0#e000e06&|f|o@1|,+0#0000000&| @66 +@8|\| |$+0#e000e06&|b|a|r|;+0#0000000&| @59 +@8|\| |$+0#e000e06&|b|a|z|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@52 +@2|[|&+0#00e0e07&|a|r|i|,+0#0000000&| |&+0#00e0e07&|b|k|c|;+0#0000000&| |&+0#00e0e07&|c|m|p|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@47 +@2|[|&+0#00e0e07&|a|r|i|,+0#0000000&| @66 +@8|\| |&+0#00e0e07&|b|k|c|;+0#0000000&| @59 +@8|\| |&+0#00e0e07&|c|m|p|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@52 +@2|[|@+0#e000e06&|a|,+0#0000000&| |@+0#e000e06&|b|;+0#0000000&| |@+0#e000e06&|c|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@53 +@2|[|@+0#e000e06&|a|,+0#0000000&| @68 +@8|\| |@+0#e000e06&|b|;+0#0000000&| @61 @57|1|6|3|,|3| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_def_variables_10.dump b/runtime/syntax/testdir/dumps/vim9_def_variables_10.dump index 6d359140b5..733615f885 100644 --- a/runtime/syntax/testdir/dumps/vim9_def_variables_10.dump +++ b/runtime/syntax/testdir/dumps/vim9_def_variables_10.dump @@ -1,19 +1,19 @@ -| +0&#ffffff0@7|\+0#e000e06&| +0#0000000&|@+0#e000e06&|b|;+0#0000000&| @61 -@8|\+0#e000e06&| +0#0000000&|@+0#e000e06&|c|]| +0#0000000&|=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 +| +0&#ffffff0@7|\| |@+0#e000e06&|b|;+0#0000000&| @61 +@8|\| |@+0#e000e06&|c|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|e+0#00e0e07&|x|p|r| +0#0000000&@54 @75 -@1| +0#00e0e07&|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |E|N|D| +0#0000000&@61 +@2|f+0#00e0e07&|o@1| +0#0000000&|=+0#e000e06&|<@1| |E|N|D| +0#0000000&@61 |.+0#e000002&@2| +0#0000000&@71 >E+0#e000e06&|N|D| +0#0000000&@71 -@1| +0#00e0e07&|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |t|r|i|m| |E|N|D| +0#0000000&@56 +@2|f+0#00e0e07&|o@1| +0#0000000&|=+0#e000e06&|<@1| |t|r|i|m| |E|N|D| +0#0000000&@56 | +0#e000002&@1|.@2| +0#0000000&@69 | +0#e000e06&@1|E|N|D| +0#0000000&@69 -@1| +0#00e0e07&|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |e|v|a|l| |E|N|D| +0#0000000&@56 +@2|f+0#00e0e07&|o@1| +0#0000000&|=+0#e000e06&|<@1| |e|v|a|l| |E|N|D| +0#0000000&@56 |.+0#e000002&@2| +0#0000000&@71 |E+0#e000e06&|N|D| +0#0000000&@71 -@1| +0#00e0e07&|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |t|r|i|m| |e|v|a|l| |E|N|D| +0#0000000&@51 +@2|f+0#00e0e07&|o@1| +0#0000000&|=+0#e000e06&|<@1| |t|r|i|m| |e|v|a|l| |E|N|D| +0#0000000&@51 | +0#e000002&@1|.@2| +0#0000000&@69 | +0#e000e06&@1|E|N|D| +0#0000000&@69 -@1| +0#00e0e07&|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |e|v|a|l| |t|r|i|m| |E|N|D| +0#0000000&@51 +@2|f+0#00e0e07&|o@1| +0#0000000&|=+0#e000e06&|<@1| |e|v|a|l| |t|r|i|m| |E|N|D| +0#0000000&@51 | +0#e000002&@3|.@2| +0#0000000&@67 | +0#e000e06&@1|E|N|D| +0#0000000&@69 @75 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_00.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_00.dump index 48b1b931bf..a91172f2c3 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_00.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_00.dump @@ -2,19 +2,19 @@ |#+0#0000e05&| |V|i|m|9| |E|x| |c|o|m@1|a|n|d|s| +0#0000000&@56 @75 @75 -|#+0#0000e05&| |S|T|A|R|T| |N|O|T| |M|A|T|C|H|E|D| +0#0000000&@55 -|:|N|e|x|t| @69 -|:|X| @72 -|#+0#0000e05&| |E|N|D| |N|O|T| |M|A|T|C|H|E|D| +0#0000000&@57 -@75 |:|h+0#af5f00255&|e|l|p| +0#0000000&@69 @1|:|h+0#af5f00255&|e|l|p| +0#0000000&@68 |:| |h+0#af5f00255&|e|l|p| +0#0000000&@68 -@1|:+0#af5f00255&| +0#0000000&|h+0#00e0e07&|e|l|p| +0#0000000&|#+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@59 +@1|:+0#af5f00255&| +0#0000000&|h+0#00e0e07&|e|l|p| +0#0000000&@67 @75 +|:|&+0#af5f00255&| +0#0000000&@72 +|:|~+0#af5f00255&| +0#0000000&@72 |:|@+0#af5f00255&| +0#0000000&@72 +|#+0#0000e05&| |:|*| +0#0000000&@70 +|:|>+0#af5f00255&| +0#0000000&@72 +|:|<+0#af5f00255&| +0#0000000&@72 +|:|#+0#af5f00255&| +0#0000000&@72 +|:|=+0#af5f00255&| +0#0000000&@72 +|:|!+0#af5f00255&| +0#0000000&@72 @75 -|:|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 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_01.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_01.dump index e407c48cf3..ad6ce47869 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_01.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_01.dump @@ -1,9 +1,15 @@ -| +0&#ffffff0@74 -|:|@+0#af5f00255&| +0#0000000&@72 +|:+0&#ffffff0|>+0#af5f00255&| +0#0000000&@72 +|:|<+0#af5f00255&| +0#0000000&@72 +|:|#+0#af5f00255&| +0#0000000&@72 +|:|=+0#af5f00255&| +0#0000000&@72 +|:|!+0#af5f00255&| +0#0000000&@72 +> @74 +|:|N+0#af5f00255&|e|x|t| +0#0000000&@69 +|:|X+0#af5f00255&| +0#0000000&@72 @75 |:|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&|b|o|v|e|l|e|f|t| +0#0000000&@64 |:|a+0#af5f00255&|b|s|t|r|a|c|t| +0#0000000&@65 |:|a+0#af5f00255&|l@1| +0#0000000&@70 |:|a+0#af5f00255&|m|e|n|u| +0#0000000&@68 @@ -11,10 +17,4 @@ |:|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@67 |:|a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@64 |:|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@64 -|:|a+0#af5f00255&|r|g|d|o| +0#0000000&@68 -|:|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@66 -|:|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|s| +0#0000000&@69 -|:|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@65 -@57|1|9|,|1| @10|1|%| +@57|1|9|,|0|-|1| @8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_02.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_02.dump index 80de241940..b19903fbf6 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_02.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_02.dump @@ -1,9 +1,15 @@ -|:+0&#ffffff0|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@65 +|:+0&#ffffff0|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@64 +|:|a+0#af5f00255&|r|g|d|o| +0#0000000&@68 +|:|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@66 +|:|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|s| +0#0000000&@69 +|:|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|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|n|m|e|n|u| +0#0000000&@66 ->:|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@66 +|:|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@66 |:|b+0#af5f00255&|a|d@1| +0#0000000&@69 |:|b+0#af5f00255&|a|l@1| +0#0000000&@69 |:|b+0#af5f00255&|a|l|t| +0#0000000&@69 @@ -11,10 +17,4 @@ |:|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 |:|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 -|:|b+0#af5f00255&|n|e|x|t| +0#0000000&@68 -|:|b+0#af5f00255&|N|e|x|t| +0#0000000&@68 -|:|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@65 @57|3|7|,|1| @10|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_03.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_03.dump index b91691e3fa..490abeb1c1 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_03.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_03.dump @@ -1,9 +1,15 @@ -|:+0&#ffffff0|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@65 +|:+0&#ffffff0|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 +|:|b+0#af5f00255&|n|e|x|t| +0#0000000&@68 +>:|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&|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 +|:|b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@64 |:|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66 |:|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@67 |:|b+0#af5f00255&|u|f|d|o| +0#0000000&@68 @@ -11,10 +17,4 @@ |:|b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@66 |:|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@66 |:|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@65 -|:|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|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|f|i|l|e| +0#0000000&@65 -@57|5@1|,|1| @10|4|%| +@57|5@1|,|1| @10|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_04.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_04.dump index 46b383bf96..170ebe450e 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_04.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_04.dump @@ -1,9 +1,15 @@ -|:+0&#ffffff0|c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@65 +|:+0&#ffffff0|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@65 +|:|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|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|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 |:|c+0#af5f00255&|a|t|c|h| +0#0000000&@68 |:|c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@66 ->:|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@67 +|:|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@67 |:|c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@66 |:|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66 |:|c+0#af5f00255&@1| +0#0000000&@71 @@ -11,10 +17,4 @@ |:|c+0#af5f00255&|d| +0#0000000&@71 |:|c+0#af5f00255&|d|o| +0#0000000&@70 |:|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|d|o| +0#0000000&@69 -|:|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|e|x|p|r| +0#0000000&@65 @57|7|3|,|1| @10|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_05.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_05.dump index 5de68b2859..ab9a171665 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_05.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_05.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@65 +|:+0&#ffffff0|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|d|o| +0#0000000&@69 +|:|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|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 |:|c+0#af5f00255&|h|d|i|r| +0#0000000&@68 |:|c+0#af5f00255&|h|e|c|k|p|a|t|h| +0#0000000&@64 ->:|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@64 +|:|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@64 |:|c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@65 |:|c+0#af5f00255&|l|a|s@1| +0#0000000&@68 +|e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@66 |:|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 -|:|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|w|e|r| +0#0000000&@67 -|:|c+0#af5f00255&|n|e|x|t| +0#0000000&@68 -|:|c+0#af5f00255&|N|e|x|t| +0#0000000&@68 -|:|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@67 -@57|9|1|,|1| @10|7|%| +@57|9|1|,|1| @10|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_06.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_06.dump index f6b5bbda81..0e478a853b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_06.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_06.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@67 +|:+0&#ffffff0|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|w|e|r| +0#0000000&@67 +>:|c+0#af5f00255&|n|e|x|t| +0#0000000&@68 +|:|c+0#af5f00255&|N|e|x|t| +0#0000000&@68 +|:|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|a|b@1|r|e|v| +0#0000000&@62 |:|c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 |:|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64 ->:|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@67 +|:|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@67 |:|c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@62 |:|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@65 |:|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@66 |:|c+0#af5f00255&|o|m|p|i|l|e|r| +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|n|t|i|n|u|e| +0#0000000&@65 -|:|c+0#af5f00255&|o|p|e|n| +0#0000000&@68 -|:|c+0#af5f00255&|o|p|y| +0#0000000&@69 -|:|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@67 -|:|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 -|:|c+0#af5f00255&|q|u|i|t| +0#0000000&@68 -|:|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66 @57|1|0|9|,|1| @9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_07.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_07.dump index 75399df7fa..1c9d8e33f3 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_07.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_07.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66 +|:+0&#ffffff0|c+0#af5f00255&|o|n|s|t| +0#0000000&@68 +|:|c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@65 +|:|c+0#af5f00255&|o|p|e|n| +0#0000000&@68 +|:|c+0#af5f00255&|o|p|y| +0#0000000&@69 +|:|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@67 +>:|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 +|:|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|t|a|g| +0#0000000&@68 |:|c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@64 |:|c+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 ->:|c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 +|:|c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 |:|c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@66 |:|d+0#af5f00255&|e|b|u|g| +0#0000000&@68 |:|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@62 |:|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|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|e|t|e| +0#0000000&@67 -|:|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|g|e|t| +0#0000000&@66 -|:|d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@66 -@57|1|2|7|,|1| @8|1|0|%| +@57|1|2|7|,|1| @9|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_08.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_08.dump index 0f735c5829..35a19b0587 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_08.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_08.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@66 +|:+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|e|t|e| +0#0000000&@67 +|:|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|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|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 ->:|d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@63 +|:|d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@63 |:|d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@65 |:|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@62 -|:|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@62 |:|d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@66 |:|d+0#af5f00255&|j|u|m|p| +0#0000000&@68 -|:|d+0#af5f00255&|l| +0#0000000&@71 |:|d+0#af5f00255&|l|i|s|t| +0#0000000&@68 |:|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@64 |:|d+0#af5f00255&|o|a|u|t|o|c|m|d| +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 @57|1|4|5|,|1| @8|1@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_09.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_09.dump index 07ed29a00a..7a8d3723d0 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_09.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_09.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|d+0#af5f00255&|s|p|l|i|t| +0#0000000&@67 +|:+0&#ffffff0|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@64 +|:|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&|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 +|:|e+0#af5f00255&|c|h|o|h|l| +0#0000000&@67 |:|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@66 |:|e+0#af5f00255&|c|h|o|n| +0#0000000&@68 |:|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@63 @@ -11,10 +14,7 @@ |:|e+0#af5f00255&|l|s|e| +0#0000000&@69 |:|e+0#af5f00255&|l|s|e|i|f| +0#0000000&@67 |:|e+0#af5f00255&|m|e|n|u| +0#0000000&@68 -|:|e|n|d|c|l|a|s@1| @65 +|#+0#0000e05&| |:|e|n|d|c|l|a|s@1| +0#0000000&@63 |:|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@67 -|:|e|n|d|e|n|u|m| @66 -|:|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|i|f| +0#0000000&@68 -@57|1|6|3|,|1| @8|1|3|%| +|#+0#0000e05&| |:|e|n|d|e|n|u|m| +0#0000000&@64 +@57|1|6|3|,|1| @8|1|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_10.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_10.dump index 5f63535a65..fd140891a0 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_10.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_10.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|e+0#af5f00255&|n|d|i|f| +0#0000000&@68 -|:|e|n|d|i|n|t|e|r|f|a|c|e| @61 -|:|e+0#af5f00255&|n|d|t|r|y| +0#0000000&@67 +|#+0#0000e05#ffffff0| |:|e|n|d|e|n|u|m| +0#0000000&@64 +|:|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|i|f| +0#0000000&@68 +|#+0#0000e05&| |:|e|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@59 +>:|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|e|w| +0#0000000&@69 ->:|e+0#af5f00255&|n|u|m| +0#0000000&@69 +|:|e+0#af5f00255&|n|u|m| +0#0000000&@69 +|e+0#af5f00255&|n|d|e|n|u|m| +0#0000000&@67 |:|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 |:|e+0#af5f00255&|x|p|o|r|t| +0#0000000&@67 -|:|e+0#af5f00255&|x|p|o|r|t| +0#0000000&@67 |:|e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@66 |:|f+0#af5f00255&|i|l|e| +0#0000000&@69 |:|f+0#af5f00255&|i|l|e|s| +0#0000000&@68 |:|f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@65 -|:|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@67 -|:|f+0#af5f00255&|i|n|a|l| +0#0000000&@68 -|:|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@66 @57|1|8|1|,|1| @8|1|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_11.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_11.dump index 8a097c24ea..c670db5cf2 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_11.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_11.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@66 +|:+0&#ffffff0|f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@65 +|:|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@67 +|:|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|d| +0#0000000&@69 -|:|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@67 +>:|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|c|l|o|s|e|d| +0#0000000&@61 |:|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@63 |:|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@65 |:|f+0#af5f00255&|o|r| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@50 |:|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@65 -|:|g+0#af5f00255&|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@62 +|:|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@67 |:|g+0#af5f00255&|o|t|o| +0#0000000&@69 |:|g+0#af5f00255&|r|e|p| +0#0000000&@69 |:|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@66 -|:|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 -@57|1|9@1|,|1| @8|1|6|%| +@57|1|9@1|,|1| @8|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_12.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_12.dump index 0af7a4fd55..cd14d74ca4 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_12.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_12.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@65 +|:+0&#ffffff0|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@66 +|:|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 +>:|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|d|e| +0#0000000&@69 |:|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@64 |:|h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@66 @@ -14,7 +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 -|:|i+0#af5f00255&|m|p|o|r|t| +0#0000000&@67 @57|2|1|7|,|1| @8|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_13.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_13.dump index dba3c326ca..3d43c0da4d 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_13.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_13.dump @@ -1,9 +1,13 @@ -|:+0&#ffffff0|i+0#af5f00255&|m|p|o|r|t| +0#0000000&@67 +|:+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|a|b@1|r|e|v| +0#0000000&@62 -|:|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 +>:|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 |:|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64 |:|i+0#af5f00255&|n|t|e|r|f|a|c|e| +0#0000000&@64 ->:|i+0#af5f00255&|n|t|r|o| +0#0000000&@68 +|e+0#af5f00255&|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@62 +|:|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|a|b@1|r|e|v| +0#0000000&@64 @@ -11,10 +15,6 @@ |:|i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 |:|j+0#af5f00255&|o|i|n| +0#0000000&@69 |:|j+0#af5f00255&|u|m|p|s| +0#0000000&@68 -|:|k+0#af5f00255&| +0#0000000&@72 |:|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@66 |:|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@64 -|:|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@64 -|:|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@61 -|:|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@67 -@57|2|3|5|,|1| @8|1|9|%| +@57|2|3|5|,|1| @8|1|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_14.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_14.dump index d3e36b612f..eced2d7e5f 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_14.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_14.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@67 +|:+0&#ffffff0|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@64 +|:|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@64 +|:|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@61 +|:|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@67 |:|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@63 -|:|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@65 +>:|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@65 |:|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|n|g|u|a|g|e| +0#0000000&@65 +|:|l+0#af5f00255&|a|n|g|u|a|g|e| +0#0000000&@65 |:|l+0#af5f00255&|a|s|t| +0#0000000&@69 |:|l+0#af5f00255&|a|t|e|r| +0#0000000&@68 |:|l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@66 @@ -14,7 +17,4 @@ |:|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&|e|f|t| +0#0000000&@69 -|:|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@64 -@57|2|5|3|,|1| @8|2|0|%| +@57|2|5|3|,|1| @8|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_15.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_15.dump index 0e982b0678..37de2cd8c1 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_15.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_15.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@64 +|:+0&#ffffff0|l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@66 +|:|l+0#af5f00255&|d|o| +0#0000000&@70 +|:|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|x|p|r| +0#0000000&@68 +>:|l+0#af5f00255&|e|x|p|r| +0#0000000&@68 |:|l+0#af5f00255&|f|d|o| +0#0000000&@69 |:|l+0#af5f00255&|f|i|l|e| +0#0000000&@68 ->:|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@67 +|:|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@67 |:|l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@63 |:|l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@65 |:|l+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@65 @@ -14,7 +17,4 @@ |:|l+0#af5f00255&|i|s|t| +0#0000000&@69 |:|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 -@57|2|7|1|,|1| @8|2@1|%| +@57|2|7|1|,|1| @8|2|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_16.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_16.dump index 2aac4046d7..e43c6733e4 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_16.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_16.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|l+0#af5f00255&|m|a|p| +0#0000000&@69 +|:+0&#ffffff0|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|c|l|e|a|r| +0#0000000&@64 -|:|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@67 +>:|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@67 |:|l+0#af5f00255&|n|e|x|t| +0#0000000&@68 |:|l+0#af5f00255&|N|e|x|t| +0#0000000&@68 ->:|l+0#af5f00255&|n|f|i|l|e| +0#0000000&@67 +|:|l+0#af5f00255&|n|f|i|l|e| +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 |#+0#0000e05&| |:|l|o|a|d|k|e|y|m|a|p| |#| |d|i|s|a|b|l|e|d| |-| |r|u|n|s| |u|n|t|i|l| |E|O|F| +0#0000000&@33 @@ -14,7 +17,4 @@ |:|l+0#af5f00255&|o|p|e|n| +0#0000000&@68 |:|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@67 |:|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 -|:|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 -@57|2|8|9|,|1| @8|2|3|%| +@57|2|8|9|,|1| @8|2@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_17.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_17.dump index bbcd3683ae..4fca21bb1e 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_17.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_17.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|l+0#af5f00255&|t|a|g| +0#0000000&@69 +|:+0&#ffffff0|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 +|:|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|a| +0#0000000&@70 -|:|l+0#af5f00255&|u|a|d|o| +0#0000000&@68 +>:|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|n|m|a|p| +0#0000000&@67 ->:|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@65 +|:|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 |:|m+0#af5f00255&|a|k|e| +0#0000000&@69 -|:|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@65 |:|m+0#af5f00255&|a|p| +0#0000000&@70 +|:|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@65 |:|m+0#af5f00255&|a|r|k| +0#0000000&@69 |:|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 -|:|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 -@57|3|0|7|,|1| @8|2|5|%| +@57|3|0|7|,|1| @8|2|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_18.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_18.dump index 7f043f5470..ce477de9cb 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_18.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_18.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@64 +|:+0&#ffffff0|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|p|e|l@1| +0#0000000&@66 -|:|m+0#af5f00255&|k|v|i|e|w| +0#0000000&@67 +>:|m+0#af5f00255&|k|v|i|e|w| +0#0000000&@67 |:|m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@66 |:|m+0#af5f00255&|o|v|e| +0#0000000&@69 ->:|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@67 +|:|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@67 |:|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@65 |:|n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@66 |:|n+0#af5f00255&|b|k|e|y| +0#0000000&@68 @@ -14,7 +17,4 @@ |:|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|h|l|s|e|a|r|c|h| +0#0000000&@63 -@57|3|2|5|,|1| @8|2|6|%| +@57|3|2|5|,|1| @8|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_19.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_19.dump index 4699962f7a..6eb89ded55 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_19.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_19.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@63 +|:+0&#ffffff0|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|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|m|a|p| +0#0000000&@66 +>:|n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@66 |:|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 +|:|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@63 |:|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@67 |:|n+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 |:|n+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 @@ -14,7 +17,4 @@ |:|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|e|n|u| +0#0000000&@66 -@57|3|4|3|,|1| @8|2|8|%| +@57|3|4|3|,|1| @8|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_20.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_20.dump index 67fdb5d1e0..3e947e44d4 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_20.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_20.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 +|:+0&#ffffff0|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|e|n|u| +0#0000000&@66 |:|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|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 ->:|p+0#af5f00255&|e|d|i|t| +0#0000000&@68 +|:|p+0#af5f00255&|e|d|i|t| +0#0000000&@68 |:|p+0#af5f00255&|e|r|l| +0#0000000&@69 |:|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@67 |:|p+0#af5f00255&|o|p| +0#0000000&@70 @@ -14,7 +17,4 @@ |:|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 |:|p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@66 |:|p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@66 -|:|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&|s|e|a|r|c|h| +0#0000000&@66 -@57|3|6|1|,|1| @8|2|9|%| +@57|3|6|1|,|1| @8|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_21.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_21.dump index efb41a43e5..2f67cecfaf 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_21.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_21.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@66 +|:+0&#ffffff0|p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@66 +|:|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&|s|e|a|r|c|h| +0#0000000&@66 |:|p+0#af5f00255&|t|a|g| +0#0000000&@69 -|:|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@66 +>:|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@66 |:|p+0#af5f00255&|t|j|u|m|p| +0#0000000&@67 |:|p+0#af5f00255&|t|l|a|s|t| +0#0000000&@67 ->:|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@67 +|:|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@67 |:|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@67 |:|p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@63 |:|p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@65 @@ -14,7 +17,4 @@ |:|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|d|o| +0#0000000&@69 -|:|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@67 -|:|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@67 -|:|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66 -@57|3|7|9|,|1| @8|3|1|%| +@57|3|7|9|,|1| @8|3|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_22.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_22.dump index 630385357c..b0d7a7b139 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_22.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_22.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66 +|:+0&#ffffff0|p+0#af5f00255&|y|d|o| +0#0000000&@69 +|:|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@67 +|:|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@67 +|:|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66 |:|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@66 -|:|p+0#af5f00255&|y|x| +0#0000000&@70 +>:|p+0#af5f00255&|y|x| +0#0000000&@70 |:|p+0#af5f00255&|y|x|d|o| +0#0000000&@68 |:|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@66 ->:|q+0#af5f00255&|a|l@1| +0#0000000&@69 +|:|q+0#af5f00255&|a|l@1| +0#0000000&@69 |:|q+0#af5f00255&|u|i|t| +0#0000000&@69 |:|q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@66 |:|r+0#af5f00255&|e|a|d| +0#0000000&@69 @@ -14,7 +17,4 @@ |:|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|t|a|b| +0#0000000&@68 -|:|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@67 -@57|3|9|7|,|1| @8|3|2|%| +@57|3|9|7|,|1| @8|3|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_23.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_23.dump index d53b9d9fae..b245935ede 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_23.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_23.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@67 +|:+0&#ffffff0|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|t|a|b| +0#0000000&@68 +|:|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| +0#0000000&@68 |:|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@63 |:|r+0#af5f00255&|u|b|y| +0#0000000&@69 ->:|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@67 +|:|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@67 |:|r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@65 |:|r+0#af5f00255&|u|n|d|o| +0#0000000&@68 |:|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@66 @@ -14,7 +17,4 @@ |:|s+0#af5f00255&|a|v|e|a|s| +0#0000000&@67 |:|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 -|:|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@67 -@57|4|1|5|,|1| @8|3|4|%| +@57|4|1|5|,|1| @8|3@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_24.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_24.dump index 2714e67fca..a8c6ec878c 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_24.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_24.dump @@ -1,9 +1,12 @@ -|:+0&#ffffff0|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@67 +|:+0&#ffffff0|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 +|:|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@67 |:|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@67 -|:|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@63 +>:|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@63 |:|s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@65 |:|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66 ->:|s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@59 +|:|s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@59 |:|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@62 |:|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 @@ -14,7 +17,4 @@ |:|s+0#af5f00255&|f|i|n|d| +0#0000000&@68 |:|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|g|n| +0#0000000&@69 -|:|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@67 -|:|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@67 -@57|4|3@1|,|1| @8|3|5|%| +@57|4|3@1|,|1| @8|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_25.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_25.dump index f3c66fec5f..e30be7f5c8 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_25.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_25.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@67 +|:+0&#ffffff0|s+0#af5f00255&|h|e|l@1| +0#0000000&@68 +|:|s+0#af5f00255&|i|g|n| +0#0000000&@69 +|:|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@67 +|:|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@67 |:|s+0#af5f00255&|l|a|s|t| +0#0000000&@68 -|:|s+0#af5f00255&|l|e@1|p| +0#0000000&@68 -|:|s+0#af5f00255&|l|e@1|p|!| +0#0000000&@67 +>:|s+0#af5f00255&|l|e@1|p| +0#0000000&@68 |:|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| +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 @@ -15,6 +17,4 @@ |:|s+0#af5f00255&|o|r|t| +0#0000000&@69 |:|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|i|n|f|o| +0#0000000&@64 -@57|4|5|1|,|1| @8|3|7|%| +@57|4|5|1|,|1| @8|3|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_26.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_26.dump index e687f3b5d0..8c342f99d6 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_26.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_26.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@64 +|:+0&#ffffff0|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|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 -|:|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@64 +>:|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@64 |:|s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@63 ->:|s+0#af5f00255&|p|l|i|t| +0#0000000&@68 +|:|s+0#af5f00255&|p|l|i|t| +0#0000000&@68 |:|s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 |:|s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66 |:|s+0#af5f00255&|t|a|g| +0#0000000&@69 @@ -15,6 +17,4 @@ |:|s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@63 |:|s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@65 |:|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@63 -|:|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@66 -|:|s+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 -@57|4|6|9|,|1| @8|3|8|%| +@57|4|6|9|,|1| @8|3|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_27.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_27.dump index 404739b8b2..cfdf7a8abf 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_27.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_27.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|s+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 +|:+0&#ffffff0|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@63 +|:|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 -|:|s+0#af5f00255&|v|i|e|w| +0#0000000&@68 +>:|s+0#af5f00255&|v|i|e|w| +0#0000000&@68 |:|s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@65 ->:|s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@65 +|:|s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@65 |:|s+0#af5f00255&|y|n|t|a|x| +0#0000000&@67 |:|s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@66 |:|t+0#af5f00255&|a|b| +0#0000000&@70 @@ -15,6 +17,4 @@ |:|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|n|e|w| +0#0000000&@67 -|:|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@66 -|:|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@66 -@57|4|8|7|,|1| @8|4|0|%| +@57|4|8|7|,|1| @8|3|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_28.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_28.dump index c7352db6e6..396ea5dfbc 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_28.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_28.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@66 +|:+0&#ffffff0|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|N|e|x|t| +0#0000000&@66 |:|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@66 |:|t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@62 -|:|t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@64 +>:|t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@64 |:|t+0#af5f00255&|a|b|s| +0#0000000&@69 ->:|t+0#af5f00255&|a|g| +0#0000000&@70 +|:|t+0#af5f00255&|a|g| +0#0000000&@70 |:|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 @@ -15,6 +17,4 @@ |:|t+0#af5f00255&|f|i|r|s|t| +0#0000000&@67 |:|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 -@57|5|0|5|,|1| @8|4|1|%| +@57|5|0|5|,|1| @8|4|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_29.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_29.dump index de0d9e9298..e2cf13681e 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_29.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_29.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@67 +|:+0&#ffffff0|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 |:|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@63 |:|t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@65 -|:|t+0#af5f00255&|m|a|p| +0#0000000&@69 +>:|t+0#af5f00255&|m|a|p| +0#0000000&@69 |:|t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 ->:|t+0#af5f00255&|m|e|n|u| +0#0000000&@68 +|:|t+0#af5f00255&|m|e|n|u| +0#0000000&@68 |:|t+0#af5f00255&|n|e|x|t| +0#0000000&@68 |:|t+0#af5f00255&|N|e|x|t| +0#0000000&@68 |:|t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 @@ -15,6 +17,4 @@ |:|t+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 |:|t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 |:|t+0#af5f00255&|y|p|e| +0#0000000&@69 -|:|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@61 -|:|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@61 -@57|5|2|3|,|1| @8|4|3|%| +@57|5|2|3|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_30.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_30.dump index 7bae3e042b..2ee3c751f1 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_30.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_30.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@61 +|:+0&#ffffff0|t+0#af5f00255&|y|p|e| +0#0000000&@69 +|:|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@61 |:|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|h|i|d|e| +0#0000000&@67 ->:|u+0#af5f00255&|n|i|q| +0#0000000&@69 +>:|u+0#af5f00255&|n|h|i|d|e| +0#0000000&@67 +|:|u+0#af5f00255&|n|i|q| +0#0000000&@69 +|:|u+0#af5f00255&|n|l|e|t| +0#0000000&@68 |:|u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@64 |:|u+0#af5f00255&|n|m|a|p| +0#0000000&@68 |:|u+0#af5f00255&|n|m|e|n|u| +0#0000000&@67 @@ -13,8 +15,6 @@ |:|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@66 |:|v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@66 |:|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@65 -|:|v+0#af5f00255&|g|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@61 +|:|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@66 |:|v+0#af5f00255&|i|e|w| +0#0000000&@69 -|:|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@66 -|#+0#0000e05&| |:|v|i|m|9|s|c|r|i|p|t| +0#0000000&@61 -@57|5|4|1|,|1| @8|4@1|%| +@57|5|4|1|,|1| @8|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_31.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_31.dump index f1131a4d60..70a379073e 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_31.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_31.dump @@ -1,9 +1,11 @@ -|#+0#0000e05#ffffff0| |:|v|i|m|9|s|c|r|i|p|t| +0#0000000&@61 +|:+0&#ffffff0|v+0#af5f00255&|i|e|w| +0#0000000&@69 +|:|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@66 +|#+0#0000e05&| |:|v|i|m|9|s|c|r|i|p|t| +0#0000000&@61 |:|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 +>:|v+0#af5f00255&|i|s|u|a|l| +0#0000000&@67 |:|v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@66 ->:|v+0#af5f00255&|m|a|p| +0#0000000&@69 +|:|v+0#af5f00255&|m|a|p| +0#0000000&@69 |:|v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 |:|v+0#af5f00255&|m|e|n|u| +0#0000000&@68 |:|v+0#af5f00255&|n|e|w| +0#0000000&@69 @@ -15,6 +17,4 @@ |:|w+0#af5f00255&|a|l@1| +0#0000000&@69 |:|w+0#af5f00255&|h|i|l|e| +0#0000000&@68 |:|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@67 -|:|w+0#af5f00255&|i|n|d|o| +0#0000000&@68 -|:|w+0#af5f00255&|i|n|p|o|s| +0#0000000&@67 -@57|5@1|9|,|1| @8|4|6|%| +@57|5@1|9|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_32.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_32.dump index a50b6a861d..66a3ceb0a2 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_32.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_32.dump @@ -1,9 +1,11 @@ -|:+0&#ffffff0|w+0#af5f00255&|i|n|p|o|s| +0#0000000&@67 +|:+0&#ffffff0|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@67 +|:|w+0#af5f00255&|i|n|d|o| +0#0000000&@68 +|:|w+0#af5f00255&|i|n|p|o|s| +0#0000000&@67 |:|w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@66 |:|w+0#af5f00255&|n|e|x|t| +0#0000000&@68 -|:|w+0#af5f00255&|N|e|x|t| +0#0000000&@68 +>:|w+0#af5f00255&|N|e|x|t| +0#0000000&@68 |:|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 ->:|w+0#af5f00255&|q| +0#0000000&@71 +|:|w+0#af5f00255&|q| +0#0000000&@71 |:|w+0#af5f00255&|q|a|l@1| +0#0000000&@68 |:|w+0#af5f00255&|r|i|t|e| +0#0000000&@68 |:|w+0#af5f00255&|u|n|d|o| +0#0000000&@68 @@ -15,6 +17,4 @@ |:|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&|r|e|s|t|o|r|e| +0#0000000&@65 -|:|x+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 -|:|x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 -@57|5|7@1|,|1| @8|4|7|%| +@57|5|7@1|,|1| @8|4|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_33.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_33.dump index c45488123f..457345300e 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_33.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_33.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 +|:+0&#ffffff0|x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@65 +|:|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 |:|z+0#af5f00255&| +0#0000000&@72 -@75 +> @74 |F|o@1|(+0#e000e06&|)||+0#0000000&|h+0#af5f00255&|e|l|p| +0#0000000&@64 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@62 |F|o@1|(+0#e000e06&|)| +0#0000000&|||h+0#af5f00255&|e|l|p| +0#0000000&@63 |F|o@1|(+0#e000e06&|)||+0#0000000&| |h+0#af5f00255&|e|l|p| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@62 +@75 +|F|o@1|(+0#e000e06&|)| +0#0000000&|||:|h+0#af5f00255&|e|l|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|h+0#af5f00255&|e|l|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&|||:| |h+0#af5f00255&|e|l|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:| |h+0#af5f00255&|e|l|p| +0#0000000&@60 @75 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|s|t|r|a|c|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|l@1| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|a|d@1| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@57 -@57|5|9|5|,|1| @8|4|9|%| +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |&+0#af5f00255&| +0#0000000&@65 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |~+0#af5f00255&| +0#0000000&@65 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |@+0#af5f00255&| +0#0000000&@65 +@57|5|9|5|,|0|-|1| @6|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_34.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_34.dump index 784020926f..49d0249cc2 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_34.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_34.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@58 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|s| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|s|c|i@1| +0#0000000&@61 -|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| @41 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|d@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -@57|6|1|3|,|1| @8|5|0|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |@+0#af5f00255&| +0#0000000&@65 +|#+0#0000e05&| |F|o@1|(|)| ||| |*| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |>+0#af5f00255&| +0#0000000&@65 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |<+0#af5f00255&| +0#0000000&@65 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |#+0#0000e05&| +0#0000000&@65 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |=+0#af5f00255&| +0#0000000&@65 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |!+0#af5f00255&| +0#0000000&@65 +@75 +@75 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |N+0#af5f00255&|e|x|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |X+0#af5f00255&| +0#0000000&@65 +@75 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|b|s|t|r|a|c|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|l@1| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +@57|6|1|3|,|1| @8|4|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_35.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_35.dump index 20121203e6..88a70b9e69 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_35.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_35.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|l|a|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|n|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|N|e|x|t| +0#0000000&@61 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|a|d@1| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|d|e|l| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@59 -@57|6|3|1|,|1| @8|5|2|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|a|d@1| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|o| +0#0000000&@61 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|s| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|s|c|i@1| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|F|o@1| @55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|d@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|a|l|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@59 +@57|6|3|1|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_36.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_36.dump index 805ad1426b..8c38c3d552 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_36.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_36.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|o|v|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@58 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|f|t|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|l@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|e|l|o|w| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&@1| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&@1|l|o|s|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d|o| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|n|t|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|x|p|r| +0#0000000&@61 -@57|6|4|9|,|1| @8|5|3|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@54 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@54 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|l|a|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|n|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|N|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|a|d@1| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|d|e|l| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r| +0#0000000&@60 +@57|6|4|9|,|1| @8|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_37.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_37.dump index 7e297dabad..cfbcbbd9a6 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_37.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_37.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|x|p|r| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|d|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|l|e| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@56 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|d|i|r| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|e|c|k|p|a|t|h| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|a|s@1| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|a|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|e|a|r|j|u|m|p|s| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|i|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|o|s|e| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -@57|6@1|7|,|1| @8|5@1|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@59 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|b|o|v|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|f|t|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|l@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|e|l|o|w| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&@1| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&@1|l|o|s|e| +0#0000000&@60 +@57|6@1|7|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_38.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_38.dump index 071b0ef5c7..be4415598f 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_38.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_38.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|w|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|e|x|t| +0#0000000&@61 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|l|d|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|p|i|l|e|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|e|n| +0#0000000&@61 -@57|6|8|5|,|1| @8|5|6|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&@1|l|o|s|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|d|o| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|n|t|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|e|x|p|r| +0#0000000&@61 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|d|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|l|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|d|i|r| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|e|c|k|p|a|t|h| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|a|s@1| +0#0000000&@61 +|e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@66 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|a|s|t| +0#0000000&@61 +@57|6|8|5|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_39.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_39.dump index 355244dd2f..87d2405c72 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_39.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_39.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|e|n| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|y| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|q|u|i|t| +0#0000000&@61 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|s|c|o|p|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|s|t|a|g| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|e|r| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@56 -@57|7|0|3|,|1| @8|5|8|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|a|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|e|a|r|j|u|m|p|s| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|i|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|l|o|s|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p| +0#0000000&@62 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|w|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|N|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|l|d|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@59 +@57|7|0|3|,|1| @8|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_40.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_40.dump index 309839a5e1..174a95e864 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_40.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_40.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|e|t|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|s|p|l|i|t| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|j|u|m|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|l| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|l|i|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@57 -@57|7|2|1|,|1| @8|5|9|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|p|i|l|e|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@58 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|e|n| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|p|y| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|q|u|i|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|s|c|o|p|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|s|t|a|g| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@55 +@57|7|2|1|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_41.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_41.dump index 3cefd9fe95..5c6c5ca652 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_41.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_41.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|p| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|r|o|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|p|l|i|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|n| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e|i|f| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|c|l|a|s@1| @58 -@57|7|3|9|,|1| @8|6|1|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f|e|r| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@56 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|e|t|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|s|p|l|i|t| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|j|u|m|p| +0#0000000&@61 +@57|7|3|9|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_42.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_42.dump index c4b5ddd8dd..210de66833 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_42.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_42.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|c|l|a|s@1| @58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|e|n|u|m| @59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@55 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|i|n|t|e|r|f|a|c|e| @54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|e|w| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|u|m| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|v|a|l| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|i|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|p|o|r|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|p|o|r|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e| +0#0000000&@62 -@57|7|5|7|,|1| @8|6|3|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|j|u|m|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|l|i|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|r|o|p| +0#0000000&@62 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|s|p|l|i|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|n| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e|i|f| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|m|e|n|u| +0#0000000&@61 +@57|7|5|7|,|1| @8|6|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_43.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_43.dump index 84d24d0936..ef80f755a3 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_43.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_43.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|s| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l| +0#0000000&@61 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|d| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|i|s|h| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|r|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|x|d|e|l| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|r| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@43 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|o|t|o| +0#0000000&@62 -@57|7@1|5|,|1| @8|6|4|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|#+0#0000e05&| |:|e|n|d|c|l|a|s@1| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60 +|#+0#0000e05&| |:|e|n|d|e|n|u|m| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@61 +|#+0#0000e05&| |:|e|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|e|w| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|n|u|m| +0#0000000&@62 +|e+0#af5f00255&|n|d|e|n|u|m| +0#0000000&@67 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|v|a|l| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|i|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|p|o|r|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@59 +@57|7@1|5|,|1| @8|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_44.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_44.dump index cc15234cc5..7a9c0e9e6b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_44.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_44.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|o|t|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|u|i| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|v|i|m| +0#0000000&@62 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|d|e| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|f| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|j|u|m|p| +0#0000000&@61 -@57|7|9|3|,|1| @8|6@1|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|s| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|d| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|i|s|h| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|r|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|x|d|e|l| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@54 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|o|r| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@43 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|l|o|b|a|l| +0#0000000&@60 +@57|7|9|3|,|1| @8|6|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_45.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_45.dump index ac36858445..0932717a07 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_45.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_45.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|j|u|m|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|l|i|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|e|n|u| +0#0000000&@61 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|p|o|r|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|t|e|r|f|a|c|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|t|r|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|p|l|i|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|o|i|n| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|u|m|p|s| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@59 -@57|8|1@1|,|1| @8|6|7|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|l|o|b|a|l| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|o|t|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|u|i| +0#0000000&@63 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|v|i|m| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|d|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|f| +0#0000000&@64 +@57|8|1@1|,|1| @8|6|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_46.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_46.dump index c7f37a9b71..05d18f4f2b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_46.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_46.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|b|o|v|e| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|f|t|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|n|g|u|a|g|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|s|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|t|e|r| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|e|l|o|w| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|d| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|h|d|i|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|l|o|s|e| +0#0000000&@60 -@57|8|2|9|,|1| @8|6|9|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|f| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|j|u|m|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|l|i|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|m|p|o|r|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|t|e|r|f|a|c|e| +0#0000000&@57 +|e+0#af5f00255&|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|t|r|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|s|p|l|i|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|o|i|n| +0#0000000&@62 +@57|8|2|9|,|1| @8|6@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_47.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_47.dump index a83f90b50f..405d9bfc05 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_47.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_47.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|l|o|s|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|d|o| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@57 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|g|a|c|y| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|x|p|r| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|d|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|i|l|e| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|r|e|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|i|s|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1| +0#0000000&@64 -@57|8|4|7|,|1| @8|7|0|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|o|i|n| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|u|m|p|s| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@57 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@54 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|b|o|v|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|f|t|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|n|g|u|a|g|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|s|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|a|t|e|r| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|e|l|o|w| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|d| +0#0000000&@63 +@57|8|4|7|,|1| @8|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_48.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_48.dump index 158d4d24ba..a2b9a280ff 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_48.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_48.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|a|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|i|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|k|e| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p| +0#0000000&@62 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|e|w|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|#+0#0000e05&| |F|o@1|(|)| ||| |l|o|a|d|k|e|y|m|a|p| |#| |d|i|s|a|b|l|e|d| |-| |r|u|n|s| |u|n|t|i|l| |E|O|F| +0#0000000&@26 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|a|d|v|i|e|w| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|l|d|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|p|e|n| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|f|i|l|e| +0#0000000&@60 -@57|8|6|5|,|1| @8|7|2|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|d| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|h|d|i|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|l|o|s|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|d|o| +0#0000000&@63 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|g|a|c|y| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|x|p|r| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|d|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|i|l|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|r|e|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@58 +@57|8|6|5|,|1| @8|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_49.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_49.dump index f94e39210d..c08afbcd30 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_49.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_49.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|s| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|t|a|g| +0#0000000&@62 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|k|e| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|o|v|e| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|p| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k|s| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|t|c|h| +0#0000000&@61 -@57|8@1|3|,|1| @8|7|3|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|i|s|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|a|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&@1|i|s|t| +0#0000000&@61 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|k|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|e|w|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|N|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|#+0#0000e05&| |:|l|o|a|d|k|e|y|m|a|p| |#| |d|i|s|a|b|l|e|d| |-| |r|u|n|s| |u|n|t|i|l| |E|O|F| +0#0000000&@33 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|a|d|v|i|e|w| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|l|d|e|r| +0#0000000&@60 +@57|8@1|3|,|1| @8|7|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_50.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_50.dump index 62e5b5c49a..ed2d953595 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_50.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_50.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|t|c|h| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@53 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|e|x|r|c| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|v|i|e|w| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|z|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|k|e|y| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|e|w| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|e|x|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|e|n|u| +0#0000000&@61 -@57|9|0|1|,|1| @8|7|5|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|l|d|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|p|e|n| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|s| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|t|a|g| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|k|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|p| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k|s| +0#0000000&@61 +@57|9|0|1|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_51.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_51.dump index c8ce286a56..0088b7849d 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_51.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_51.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@56 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|m|a|l| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|m|b|e|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|l|y| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -@57|9|1|9|,|1| @8|7|6|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k|s| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|t|c|h| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@53 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@58 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|e|x|r|c| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|v|i|e|w| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|o|v|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|z|f|i|l|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|k|e|y| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|e|w| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|e|x|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p| +0#0000000&@62 +@57|9|1|9|,|1| @8|7|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_52.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_52.dump index f1d21db59c..cb99c54dc6 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_52.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_52.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|c|l|o|s|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|d|i|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l|d|o| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p|u|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&@1|o|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|i|n|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@59 -@57|9|3|7|,|1| @8|7|8|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@57 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|r|m|a|l| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|m|b|e|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|e|n|u| +0#0000000&@61 +@57|9|3|7|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_53.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_53.dump index 15511c3906..ba1d3c235d 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_53.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_53.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|m|p|t|f|i|n|d| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|a|g| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|j|u|m|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|l|a|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|n|e|x|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|N|e|x|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|u|t| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|w|d| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@59 -@57|9|5@1|,|1| @8|7|9|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|l|y| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@59 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|c|l|o|s|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|d|i|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|e|r|l|d|o| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|o|p|u|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&@1|o|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@58 +@57|9|5@1|,|1| @8|7|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_54.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_54.dump index de2558dcde..caaa5492c6 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_54.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_54.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|d|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|f|i|l|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|a|l@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|a|d| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|c|o|v|e|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|i|r| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@53 -@57|9|7|3|,|1| @8|8|1|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|i|n|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|m|p|t|f|i|n|d| +0#0000000&@56 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|a|g| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|j|u|m|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|l|a|s|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|n|e|x|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|N|e|x|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|u|t| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|w|d| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3| +0#0000000&@63 +@57|9|7|3|,|1| @8|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_55.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_55.dump index b0838eec2f..76f8f9468b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_55.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_55.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@53 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|s|i|z|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|t|a|b| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|w|i|n|d| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|d|o| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|n|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|l@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|v|e|a|s| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|a|l@1| +0#0000000&@61 -@57|9@1|1|,|1| @8|8|2|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|d|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|f|i|l|e| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|a|l@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|a|d| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|c|o|v|e|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|i|r| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w| +0#0000000&@60 +@57|9@1|1|,|1| @8|7|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_56.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_56.dump index 133a501589..73912e5247 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_56.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_56.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|a|l@1| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|f|i|r|s|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|l|a|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|n|e|x|t| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|N|e|x|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@52 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|v|e|r|s|i|o|n| +0#0000000&@53 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|n|d| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -@57|1|0@1|9|,|1| @7|8|4|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@54 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@53 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|s|i|z|e| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|t|a|b| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|w|i|n|d| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|d|o| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|n|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|l@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@57 +@57|1|0@1|9|,|1| @7|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_57.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_57.dump index 8441704654..fee3c5d4f8 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_57.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_57.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|h|e|l@1| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|g|n| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|l|e|n|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|m|a|l|t| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|a|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|e@1|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|e@1|p|!| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|g|i|c| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|i|l|e| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|N|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|r|t| +0#0000000&@62 -@57|1|0|2|7|,|1| @7|8|5|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|a|v|e|a|s| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|a|l@1| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|f|i|r|s|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|l|a|s|t| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|n|e|x|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|N|e|x|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@52 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|v|e|r|s|i|o|n| +0#0000000&@53 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@58 +@57|1|0|2|7|,|1| @7|8|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_58.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_58.dump index 859389dcb0..b79d18c36b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_58.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_58.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|r|t| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|u|r|c|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@57 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|l|i|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|g| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@53 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|j|u|m|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@56 -@57|1|0|4|5|,|1| @7|8|7|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|n|d| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|h|e|l@1| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|g|n| +0#0000000&@62 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|l|e|n|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|i|m|a|l|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|a|s|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|l|e@1|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|g|i|c| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|m|i|l|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|N|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +@57|1|0|4|5|,|1| @7|8|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_59.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_59.dump index 4137a55a43..4ebd684a88 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_59.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_59.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|v|i|e|w| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|a|x| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@59 -@57|1|0|6|3|,|1| @7|8@1|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|r|t| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|o|u|r|c|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@57 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|l|i|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|g| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@53 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@54 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|j|u|m|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p| +0#0000000&@62 +@57|1|0|6|3|,|1| @7|8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_60.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_60.dump index 13cb087a3a..1be5c58932 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_60.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_60.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|w| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@55 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|s| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g|s| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|d| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|h|d|i|r| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -@57|1|0|8|1|,|1| @7|9|0|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@59 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|v|i|e|w| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|a|x| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@58 +@57|1|0|8|1|,|1| @7|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_61.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_61.dump index 31261ce9c9..14c24b6d01 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_61.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_61.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|h|r|o|w| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|j|u|m|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|a|s|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|m|e|n|u| +0#0000000&@60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|n|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|N|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|y| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -@57|1|0|9@1|,|1| @7|9|1|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|w| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@59 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|s| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g|s| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|d| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|h|d|i|r| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@58 +@57|1|0|9@1|,|1| @7|8@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_62.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_62.dump index b145a0c17b..e3932a8d5a 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_62.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_62.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|y|p|e| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@54 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|h|i|d|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|i|q| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|a|p| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|e|n|u| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|p|d|a|t|e| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|a|r| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@58 -@57|1@2|7|,|1| @7|9|3|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|f|i|r|s|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|h|r|o|w| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|j|u|m|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|a|s|t| +0#0000000&@61 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|m|e|n|u| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|n|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|N|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|r|y| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@59 +@57|1@2|7|,|1| @7|8|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_63.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_63.dump index a2992fadd0..ccca6baab0 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_63.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_63.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|g|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@59 -|#+0#0000e05&| |c|a|l@1| |F|o@1|(|)| ||| |v|i|m|9|s|c|r|i|p|t| +0#0000000&@49 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@56 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|s|u|a|l| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|e|w| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|e|w| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|s|p|l|i|t| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|d|o| +0#0000000&@61 -@57|1@1|3|5|,|1| @7|9|4|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|y|p|e| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@54 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|h|i|d|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|i|q| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|e|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|a|p| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|e|n|u| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|p|d|a|t|e| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|a|r| +0#0000000&@63 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@59 +@57|1@1|3|5|,|1| @7|9|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_64.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_64.dump index b1eb631ef1..d67496b409 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_64.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_64.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|r|i|t|e| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|N|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|a|l@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|h|i|l|e| +0#0000000&@61 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|c|m|d| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|p|o|s| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|n|e|x|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|q| +0#0000000&@64 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|q|a|l@1| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|u|n|d|o| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|a|l@1| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|e|n|u| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@58 -@57|1@1|5|3|,|1| @7|9|6|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|e|w| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@59 +>#+0#0000e05&| |:|v|i|m|9|s|c|r|i|p|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|s|u|a|l| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|e|w| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|s|p|l|i|t| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +@57|1@1|5|3|,|1| @7|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_65.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_65.dump index 72124d17a0..fdde2d57dc 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_65.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_65.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |y+0#af5f00255&|a|n|k| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |z+0#af5f00255&| +0#0000000&@65 -@75 -@75 -|#+0#0000e05&| |L|e|g|a|c|y|-|s|c|r|i|p|t| |o|n|l|y| +0#0000000&@54 -@75 -|:|P|r|i|n|t| @68 -|:+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 -|:+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 -|:+0#af5f00255&|i|n|s|e|r|t| +0#0000000&@67 -@57|1@1|7|1|,|1| @7|9|7|%| +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|a|l@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|h|i|l|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|c|m|d| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|d|o| +0#0000000&@61 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|p|o|s| +0#0000000&@60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|n|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|N|e|x|t| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|q| +0#0000000&@64 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|q|a|l@1| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|r|i|t|e| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|u|n|d|o| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|a|l@1| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p| +0#0000000&@62 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|e|n|u| +0#0000000&@61 +@57|1@1|7|1|,|1| @7|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_66.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_66.dump index 5553301525..536ea5e1db 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_66.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_66.dump @@ -1,20 +1,20 @@ -|:+0#af5f00255#ffffff0|i|n|s|e|r|t| +0#0000000&@67 -| +0#e000002&@3|t|e|x|t| +0#0000000&@66 -|.+0#af5f00255&| +0#0000000&@73 -|:|k+0#af5f00255&| +0#0000000&@72 -|:|l+0#af5f00255&|e|t| +0#0000000&@70 ->:|m+0#af5f00255&|o|d|e| +0#0000000&@69 -|:|o+0#af5f00255&|p|e|n| +0#0000000&@69 -|:|t+0#af5f00255&| +0#0000000&@72 -|:|u+0#af5f00255&|n|l|e|t| +0#0000000&@68 -|:|x+0#af5f00255&|i|t| +0#0000000&@70 +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|m|e|n|u| +0#0000000&@61 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|a|p| +0#0000000&@60 +>F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |y+0#af5f00255&|a|n|k| +0#0000000&@62 +@75 +|#+0#0000e05&| |L|e|g|a|c|y|-|s|c|r|i|p|t| |o|n|l|y| +0#0000000&@54 @75 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a|p@1|e|n|d| @60 -@4|t|e|x|t| @66 +|:|P+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|:|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@67 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c|h|a|n|g|e| @60 -@4|t|e|x|t| @66 +|:|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@67 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i|n|s|e|r|t| @60 -@4|t|e|x|t| @66 -@57|1@1|8|9|,|1| @7|9@1|%| +|:|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@67 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +@57|1@1|8|9|,|1| @7|9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_67.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_67.dump index 0f1d5fd5df..0a77fcd9e1 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_commands_67.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_67.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@3|t|e|x|t| @66 +| +0#e000002#ffffff0@3|t|e|x|t| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&@65 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|e|t| +0#0000000&@63 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|o|d|e| +0#0000000&@62 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|e|n| +0#0000000&@62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&| +0#0000000&@65 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|e|t| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |x+0#af5f00255&|i|t| +0#0000000&@63 +|:|k+0#af5f00255&| +0#0000000&@72 +|:|l+0#af5f00255&|e|t| +0#0000000&@70 +|:|m+0#af5f00255&|o|d|e| +0#0000000&@69 +>:|o+0#af5f00255&|p|e|n| +0#0000000&@69 +|:|t+0#af5f00255&| +0#0000000&@72 +|:|x+0#af5f00255&|i|t| +0#0000000&@70 @75 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|2|0|7|,|1| @7|B|o|t| +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|p@1|e|n|d| +0#0000000&@55 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|h|a|n|g|e| +0#0000000&@55 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|s|e|r|t| +0#0000000&@55 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&@60 +@57|1|2|0|7|,|1| @7|9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_68.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_68.dump new file mode 100644 index 0000000000..d00a8bda8d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_68.dump @@ -0,0 +1,20 @@ +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&@60 +|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&||| |m+0#af5f00255&|o|d|e| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|e|n| +0#0000000&@57 +|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&||| |x+0#af5f00255&|i|t| +0#0000000&@58 +@75 +@75 +|#+0#0000e05&| |U|s|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@59 +@75 +|F|o@1|b|a|r| @68 +|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@67 +|F|o@1|b|a|r|1|2|3| @65 +|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@64 +|F|o@1|1|2|3|b|a|r| @65 +|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@64 +@75 +|:|F|o@1|b|a|r| @67 +|:|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@66 +@57|1|2@1|5|,|1| @7|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_69.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_69.dump new file mode 100644 index 0000000000..3050896784 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_69.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@66 +|:|F|o@1|b|a|r|1|2|3| @64 +|:|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@63 +|:|F|o@1|1|2|3|b|a|r| @64 +|:|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@63 +> @74 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r| @60 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r|1|2|3| @57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|1|2|3|b|a|r| @57 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@56 +@75 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r| @59 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@58 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r|1|2|3| @56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@55 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|1|2|3|b|a|r| @56 +|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@55 +@57|1|2|4|3|,|0|-|1| @5|9@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_70.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_70.dump new file mode 100644 index 0000000000..61e9af9ce1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_70.dump @@ -0,0 +1,20 @@ +|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@55 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|2|5|7|,|0|-|1| @5|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_defcompile_00.dump b/runtime/syntax/testdir/dumps/vim9_ex_defcompile_00.dump new file mode 100644 index 0000000000..60c40420ee --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_defcompile_00.dump @@ -0,0 +1,20 @@ +>v+0#af5f00255#ffffff0|i|m|9|s|c|r|i|p|t| +0#0000000&@64 +|#+0#0000e05&| |V|i|m|9| |:|d|e|f|c|o|m|p|i|l|e| |c|o|m@1|a|n|d| +0#0000000&@48 +|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |v|i|m|9|U|s|e|r|F|u|n|c|2| |T|o|d|o| +0#0000000&@24 +@75 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@64 +@75 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@60 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|d+0#00e0003&|e|b|u|g| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@54 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|p+0#00e0003&|r|o|f|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@52 +@75 +|#+0#0000e05&| |f|u|n|c|t|i|o|n| |n|a|m|e|s| +0#0000000&@58 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|<+0#e000e06&|S|I|D|>|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@55 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|g+0#00e0e07&|:|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@58 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@58 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|.|b|a|r| +0#0000000#ffffff0@56 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@56 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@54 +@75 +@75 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_defcompile_01.dump b/runtime/syntax/testdir/dumps/vim9_ex_defcompile_01.dump new file mode 100644 index 0000000000..6a7aa2a509 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_defcompile_01.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|e|f|c|o|m|p|i|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@58 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|.|b|a|r| +0#0000000#ffffff0@56 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@56 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@54 +@75 +> @74 +|#+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r| |a|n|d| |t|a|i|l| |c|o|m@1|e|n|t|s| +0#0000000&@42 +@75 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@12||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@12|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@8||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@8|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|d+0#00e0003&|e|b|u|g| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@2||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|d+0#00e0003&|e|b|u|g| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@2|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|p+0#00e0003&|r|o|f|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&|p+0#00e0003&|r|o|f|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |d|e|f|c|o|m|p|i|l|e| |F|o@1| @47 +@75 +@57|1|9|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_disassemble_00.dump b/runtime/syntax/testdir/dumps/vim9_ex_disassemble_00.dump new file mode 100644 index 0000000000..e5c36b1039 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_disassemble_00.dump @@ -0,0 +1,20 @@ +>v+0#af5f00255#ffffff0|i|m|9|s|c|r|i|p|t| +0#0000000&@64 +|#+0#0000e05&| |V|i|m|9| |:|d|i|s|a|s@1|e|m|b|l|e| |c|o|m@1|a|n|d| +0#0000000&@47 +|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |v|i|m|9|U|s|e|r|F|u|n|c|2| |T|o|d|o| +0#0000000&@24 +@75 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@59 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|d+0#00e0003&|e|b|u|g| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@53 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|p+0#00e0003&|r|o|f|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@51 +@75 +|#+0#0000e05&| |f|u|n|c|t|i|o|n| |n|a|m|e|s| +0#0000000&@58 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|<+0#e000e06&|S|I|D|>|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@54 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|g+0#00e0e07&|:|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@57 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@57 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|.|b|a|r| +0#0000000#ffffff0@55 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@55 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@53 +@75 +@75 +|#+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r| |a|n|d| |t|a|i|l| |c|o|m@1|e|n|t|s| +0#0000000&@42 +@75 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_disassemble_01.dump b/runtime/syntax/testdir/dumps/vim9_ex_disassemble_01.dump new file mode 100644 index 0000000000..b020a80c09 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_disassemble_01.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|i|s|a|s@1|e|m|b|l|e| +0#0000000&|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@55 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|g+0#00e0e07&|:|f+0#0000001#ffff4012|o@1|#|b|a|r| +0#0000000#ffffff0@53 +@75 +@75 +|#+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r| |a|n|d| |t|a|i|l| |c|o|m@1|e|n|t|s| +0#0000000&@42 +> @74 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@8||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@38 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@8|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|d+0#00e0003&|e|b|u|g| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@2||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@38 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|d+0#00e0003&|e|b|u|g| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@2|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|p+0#00e0003&|r|o|f|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@38 +|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&|p+0#00e0003&|r|o|f|i|l|e| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |d|i|s|a|s@1|e|m|b|l|e| |F|o@1| @46 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|9|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_enum_02.dump b/runtime/syntax/testdir/dumps/vim9_ex_enum_02.dump index 6f50dcd67a..88f72ebd3b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_enum_02.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_enum_02.dump @@ -12,7 +12,7 @@ |e+0#af5f00255&|n|d|e|n|u|m| +0#0000000&@67 @75 |e+0#af5f00255&|n|u|m| +0#0000000&|E|n|u|m|6| @64 -@6|#+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|#+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|i+0#af5f00255&|m|p|l|e|m|e|n|t|s| +0#0000000&|I|n|t|e|r|f|a|c|e|1|,| |I|n|t|e|r|f|a|c|e|2| @33 @2|V+0#0000001#ffff4012|a|l|u|e|1| +0#0000000#ffffff0@66 @2|d+0#af5f00255&|e|f| +0#0000000&|D|e|f|1|(+0#e000e06&|)| +0#0000000&@62 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_enum_03.dump b/runtime/syntax/testdir/dumps/vim9_ex_enum_03.dump index 5bcf508c24..aaa2a2dcd5 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_enum_03.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_enum_03.dump @@ -7,9 +7,9 @@ >#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@65 |e+0#af5f00255&|n|u|m| +0#0000000&|E|n|u|m|7| @64 @6|\+0#e000e06&| +0#0000000&@67 -@6|#+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|#+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&@67 -@6|#+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|#+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|i+0#af5f00255&|m|p|l|e|m|e|n|t|s| +0#0000000&|I|n|t|e|r|f|a|c|e|1|,| |I|n|t|e|r|f|a|c|e|2| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@23 @4|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 @4|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_enum_fold_02.dump b/runtime/syntax/testdir/dumps/vim9_ex_enum_fold_02.dump index b88ba571e8..b12edf0918 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_enum_fold_02.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_enum_fold_02.dump @@ -10,7 +10,7 @@ ||+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|d|e|n|u|m| +0#0000000&@65 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|u|m| +0#0000000&|E|n|u|m|6| @62 -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@5|#+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@5|#+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@5|\+0#e000e06&| +0#0000000&|i+0#af5f00255&|m|p|l|e|m|e|n|t|s| +0#0000000&|I|n|t|e|r|f|a|c|e|1|,| |I|n|t|e|r|f|a|c|e|2| @31 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|V+0#0000001#ffff4012|a|l|u|e|1|,+0#0000000#ffffff0| @63 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|V+0#0000001#ffff4012|a|l|u|e|2|,+0#0000000#ffffff0| @63 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_for_04.dump b/runtime/syntax/testdir/dumps/vim9_ex_for_04.dump index 9d4db8f915..ff69376a97 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_for_04.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_for_04.dump @@ -5,14 +5,14 @@ @75 >v+0#af5f00255&|a|r| +0#0000000&|m+0#00e0e07&|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@61 |v+0#af5f00255&|a|r| +0#0000000&|n+0#00e0e07&|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@61 -|f+0#af5f00255&|o|r| +0#0000000&|x+0#00e0e07&|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|r+0#00e0e07&|a|n|g|e|(+0#e000e06&|2+0#e000002&|)+0#e000e06&| +0#0000000&||| |m+0#af5f00255&| +0#0000000&|=+0#af5f00255&| +0#0000000&|x+0#00e0e07&| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@32 +|f+0#af5f00255&|o|r| +0#0000000&|x+0#00e0e07&|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|r+0#00e0e07&|a|n|g|e|(+0#e000e06&|2+0#e000002&|)+0#e000e06&| +0#0000000&||| |m+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|x+0#00e0e07&| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@32 |#+0#0000e05&@5| |^@5| +0#0000000&@61 |e+0#af5f00255&|c|h|o| +0#0000000&|m+0#00e0e07&| +0#0000000&@68 |f+0#af5f00255&|o|r| +0#0000000&|[|x+0#00e0e07&|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r|,+0#0000000&| |y+0#00e0e07&|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r|]+0#0000000&| |i+0#af5f00255&|n| +0#0000000&|[+0#e000e06&@1|0+0#e000002&|,+0#0000000&| |0+0#e000002&|]+0#e000e06&|,+0#0000000&| |[+0#e000e06&|1+0#e000002&|,+0#0000000&| |1+0#e000002&|]+0#e000e06&@1| +0#0000000&||| |[|m+0#00e0e07&|,+0#0000000&| |n+0#00e0e07&|]+0#0000000&| |=+0#af5f00255&| +0#0000000&|[+0#e000e06&|x+0#00e0e07&|,+0#0000000&| |y+0#00e0e07&|]+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@1 |e+0#af5f00255&|c|h|o| +0#0000000&|m+0#00e0e07&| +0#0000000&|n+0#00e0e07&| +0#0000000&@66 @75 |v+0#af5f00255&|a|r| +0#0000000&|F+0#00e0e07&|:+0#0000000&| |f+0#00e0003&|u|n|c| +0#0000000&@63 -|f+0#af5f00255&|o|r| +0#0000000&|t+0#00e0e07&|:+0#0000000&| |t+0#00e0003&|u|p|l|e|<|f|u|n|c|>| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|(+0#e000e06&@1|f+0#00e0e07&|u|n|c|t|i|o|n|(+0#e000e06&|'+0#e000002&|t|o|l|o|w|e|r|'|)+0#e000e06&|,+0#0000000&|)+0#e000e06&|,+0#0000000&|)+0#e000e06&| +0#0000000&||| |F| |=+0#af5f00255&| +0#0000000&|t+0#00e0e07&|[+0#0000000&|0+0#e000002&|]+0#0000000&| ||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@7 +|f+0#af5f00255&|o|r| +0#0000000&|t+0#00e0e07&|:+0#0000000&| |t+0#00e0003&|u|p|l|e|<|f|u|n|c|>| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|(+0#e000e06&@1|f+0#00e0e07&|u|n|c|t|i|o|n|(+0#e000e06&|'+0#e000002&|t|o|l|o|w|e|r|'|)+0#e000e06&|,+0#0000000&|)+0#e000e06&|,+0#0000000&|)+0#e000e06&| +0#0000000&||| |F+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#00e0e07&|[+0#0000000&|0+0#e000002&|]+0#0000000&| ||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@7 |#+0#0000e05&@5| |^@10| +0#0000000&@56 |e+0#af5f00255&|c|h|o| +0#0000000&|F|(+0#e000e06&|'+0#e000002&|H|E|L@1|O|'|)+0#e000e06&| +0#0000000&@59 |f+0#af5f00255&|o|r| +0#0000000&|[|L+0#00e0e07&|:+0#0000000&| |f+0#00e0003&|u|n|c|,+0#0000000&| |U+0#00e0e07&|:+0#0000000&| |f+0#00e0003&|u|n|c|]+0#0000000&| |i+0#af5f00255&|n| +0#0000000&|[+0#e000e06&@1|f+0#00e0e07&|u|n|c|t|i|o|n|(+0#e000e06&|'+0#e000002&|t|o|l|o|w|e|r|'|)+0#e000e06&|,+0#0000000&| |f+0#00e0e07&|u|n|c|t|i|o|n|(+0#e000e06&|'+0#e000002&|t|o|u|p@1|e|r|'|)+0#e000e06&|]@1| +0#0000000&@4 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_02.dump b/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_02.dump index aa40a19db3..9a0d9ff41b 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_02.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_02.dump @@ -12,7 +12,7 @@ ||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 ||+0#0000e05#a8a8a8255| |E+0#e000e06#ffffff0|N|D| +0#0000000&@69 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0| +0#00e0e07&|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |E|N|D| +0#0000000&@59 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|f+0#00e0e07&|o@1| +0#0000000&|=+0#e000e06&|<@1| |E|N|D| +0#0000000&@59 ||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 ||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 ||+0#0000e05#a8a8a8255| |E+0#e000e06#ffffff0|N|D| +0#0000000&@69 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_03.dump b/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_03.dump index 9f70a8ce56..71bc2a041f 100644 --- a/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_03.dump +++ b/runtime/syntax/testdir/dumps/vim9_ex_let_heredoc_03.dump @@ -4,7 +4,7 @@ ||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 ||+0#0000e05#a8a8a8255| |E+0#e000e06#ffffff0|N|D| +0#0000000&@69 | +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0| +0#00e0e07&|g|:|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |E|N|D| +0#0000000&@57 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|g+0#00e0e07&|:|f|o@1| +0#0000000&|=+0#e000e06&|<@1| |E|N|D| +0#0000000&@57 ||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 ||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 ||+0#0000e05#a8a8a8255| |E+0#e000e06#ffffff0|N|D| +0#0000000&@69 diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_00.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_00.dump new file mode 100644 index 0000000000..258812a9ea --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_00.dump @@ -0,0 +1,20 @@ +>v+0#af5f00255#ffffff0|i|m|9|s|c|r|i|p|t| +0#0000000&@64 +|#+0#0000e05&| |E|x| |c|o|m@1|a|n|d| |r|a|n|g|e|s| +0#0000000&@55 +|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|A|d@1|r|e|s@1|S|e|p|a|r|a|t|o|r| |T|o|d|o| +0#0000000&@25 +|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|A|d@1|r|e|s@1|O|f@1|s|e|t| |T|y|p|e| +0#0000000&@28 +@75 +@75 +|:|'+0#e000002&|<|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|:|'+0#e000002&|(|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|:|'+0#e000002&|{|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|:|'+0#e000002&|[|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|<|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@56 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|(|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@56 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|{|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@56 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|[|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@56 +@75 +|#+0#0000e05&| |b|a|r|e| |m|a|r|k| |r|a|n|g|e|s| +0#0000000&@56 +@75 +@1|:|'+0#e000002&|a| +0#0000000&@70 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_01.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_01.dump new file mode 100644 index 0000000000..9e9befc32e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_01.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&||| |:|'+0#e000002&|{|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@56 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|[|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@56 +@75 +|#+0#0000e05&| |b|a|r|e| |m|a|r|k| |r|a|n|g|e|s| +0#0000000&@56 +@75 +@1>:|'+0#e000002&|a| +0#0000000&@70 +|:| |'+0#e000002&|a| +0#0000000&@70 +|:|'+0#e000002&|a| +0#0000000&@71 +|:|'+0#e000002&|k| +0#0000000&@71 +|:|'+0#e000002&|z| +0#0000000&@71 +|:|'+0#e000002&|A| +0#0000000&@71 +|:|'+0#e000002&|K| +0#0000000&@71 +|:|'+0#e000002&|Z| +0#0000000&@71 +|:|'+0#e000002&|0| +0#0000000&@71 +|:|'+0#e000002&|9| +0#0000000&@71 +|:|'+0#e000002&|[| +0#0000000&@71 +|:|'+0#e000002&|]| +0#0000000&@71 +|:|'+0#e000002&|{| +0#0000000&@71 +|:|'+0#e000002&|}| +0#0000000&@71 +@57|1|9|,|2| @10|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_02.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_02.dump new file mode 100644 index 0000000000..7d61aad119 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_02.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|'+0#e000002&|}| +0#0000000&@71 +|:|'+0#e000002&|(| +0#0000000&@71 +|:|'+0#e000002&|)| +0#0000000&@71 +|:|'+0#e000002&|<| +0#0000000&@71 +|:|'+0#e000002&|>| +0#0000000&@71 +>:|'+0#e000002&|`| +0#0000000&@71 +|:|'+0#e000002&@1| +0#0000000&@71 +|:|'+0#e000002&|"| +0#0000000&@71 +|:|'+0#e000002&|^| +0#0000000&@71 +|:|'+0#e000002&|.| +0#0000000&@71 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|||:|'+0#e000002&|a| +0#0000000&@65 +|e+0#af5f00255&|c|h|o||+0#0000000&| |:|'+0#e000002&|a| +0#0000000&@65 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|a| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|k| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|z| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|A| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|K| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|Z| +0#0000000&@64 +@57|3|7|,|1| @10|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_03.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_03.dump new file mode 100644 index 0000000000..f43c2024e6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_03.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&||| |:|'+0#e000002&|Z| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|0| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|9| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|[| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|]| +0#0000000&@64 +>e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|{| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|}| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|(| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|)| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|<| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|>| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|`| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&@1| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|"| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|^| +0#0000000&@64 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |:|'+0#e000002&|.| +0#0000000&@64 +@75 +@75 +|:|1+0#e000002&|,+0#0000001#ffff4012|1+0#e000002#ffffff0|0|:+0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +@57|5@1|,|1| @10|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_04.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_04.dump new file mode 100644 index 0000000000..5e12b9e713 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_04.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|1+0#e000002&|,+0#0000001#ffff4012|1+0#e000002#ffffff0|0|:+0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +@75 +|#+0#0000e05&| |r|a|n|g|e| |(|w|i|t|h| |w|h|i|t|e|s|p|a|c|e|)| +0#0000000&@49 +@75 +|:|1+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@66 +>:|2+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@66 +|:|3+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@66 +@75 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|&+0#af5f00255&| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|~+0#af5f00255&| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|@+0#af5f00255&| +0#0000000&@66 +|#+0#0000e05&| |:|4|2|,|4|2| |*| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|>+0#af5f00255&| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|<+0#af5f00255&| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|#+0#0000e05&| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|=+0#af5f00255&| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|!+0#af5f00255&| +0#0000000&@66 +@75 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|N+0#af5f00255&|e|x|t| +0#0000000&@63 +@57|7|3|,|1| @10|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_05.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_05.dump new file mode 100644 index 0000000000..a44a2169b8 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_05.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|N+0#af5f00255&|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|P+0#af5f00255&|r|i|n|t| +0#0000000&@62 +@75 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b|s|t|r|a|c|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|l@1| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|s| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@59 +@57|9|1|,|1| @10|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_06.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_06.dump new file mode 100644 index 0000000000..c15fa96ca7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_06.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|s|c|i@1| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|F|o@1| @56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|a|d@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|a|l|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|l|a|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@59 +@57|1|0|9|,|1| @9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_07.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_07.dump new file mode 100644 index 0000000000..4602f4536a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_07.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k|a|d@1| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k|d|e|l| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|f|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|f@1|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|b|o|v|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@59 +@57|1|2|7|,|1| @9|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_08.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_08.dump new file mode 100644 index 0000000000..c364ed198a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_08.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|t|c|h| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&@1| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&@1|l|o|s|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|d| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|d|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|e|n|t|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|e|x|p|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|f|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|f|i|r|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@59 +@57|1|4|5|,|1| @8|1@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_09.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_09.dump new file mode 100644 index 0000000000..cfd1c5a15e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_09.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|d|i|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|e|c|k|p|a|t|h| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|a|s@1| +0#0000000&@62 +|e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|a|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|e|a|r|j|u|m|p|s| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|i|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|o|s|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|e|w|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|N|e|x|t| +0#0000000&@62 +@57|1|6|3|,|1| @8|1|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_10.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_10.dump new file mode 100644 index 0000000000..7bda7138d0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_10.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|m|p|i|l|e|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|p|e|n| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|q|u|i|t| +0#0000000&@62 +@57|1|8|1|,|1| @8|1|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_11.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_11.dump new file mode 100644 index 0000000000..ebb09c6764 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_11.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|q|u|i|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|s|c|o|p|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|s|t|a|g| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|b|u|g| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|f| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|f|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@60 +@57|1|9@1|,|1| @8|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_12.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_12.dump new file mode 100644 index 0000000000..ce9fab7661 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_12.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|s|p|l|i|t| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|j|u|m|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|l|i|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|r|o|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|s|p|l|i|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@56 +@57|2|1|7|,|1| @8|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_13.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_13.dump new file mode 100644 index 0000000000..6ce6a79457 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_13.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|h|l| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|n| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|d|i|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|l|s|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|l|s|e|i|f| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|#+0#0000e05&| |:|4|2|,|4|2| |e|n|d|c|l|a|s@1| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@61 +|#+0#0000e05&| |:|4|2|,|4|2| |e|n|d|e|n|u|m| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|i|f| +0#0000000&@62 +|#+0#0000e05&| |:|4|2|,|4|2| |e|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@53 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|t|r|y| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@59 +@57|2|3|5|,|1| @8|1|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_14.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_14.dump new file mode 100644 index 0000000000..6fe3e441eb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_14.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|e|w| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|u|m| +0#0000000&@63 +|e+0#af5f00255&|n|d|e|n|u|m| +0#0000000&@67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|v|a|l| +0#0000000&@63 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|i|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|p|o|r|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|e|s| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|a|l| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|d| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|r|s|t| +0#0000000&@62 +@57|2|5|3|,|1| @8|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_15.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_15.dump new file mode 100644 index 0000000000..45b7a79afb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_15.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|r|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|x|d|e|l| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@55 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|r| +0#0000000&|f|o@1| |i+0#af5f00255&|n| +0#0000000&|b|a|r| ||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@44 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|o|t|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|r|e|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|u|i| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|v|i|m| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@59 +@57|2|7|1|,|1| @8|2|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_16.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_16.dump new file mode 100644 index 0000000000..9ebb82020e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_16.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|i|d|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|f| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|j|u|m|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|l|i|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|p|o|r|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +@57|2|8|9|,|1| @8|2@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_17.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_17.dump new file mode 100644 index 0000000000..1082ed6091 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_17.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|t|e|r|f|a|c|e| +0#0000000&@58 +|e+0#af5f00255&|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|t|r|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|s|p|l|i|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|j+0#af5f00255&|o|i|n| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|j+0#af5f00255&|u|m|p|s| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@59 +@57|3|0|7|,|1| @8|2|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_18.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_18.dump new file mode 100644 index 0000000000..aabce21b54 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_18.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|f|t|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|n|g|u|a|g|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|t|e|r| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|e|l|o|w| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|d| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|h|d|i|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|l|o|s|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|d|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|f|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|x|p|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|d|o| +0#0000000&@63 +@57|3|2|5|,|1| @8|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_19.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_19.dump new file mode 100644 index 0000000000..446e113c6b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_19.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|r|e|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|i|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&@1| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&@1|a|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&@1|i|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|k|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|e|x|t| +0#0000000&@62 +@57|3|4|3|,|1| @8|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_20.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_20.dump new file mode 100644 index 0000000000..27e5eec633 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_20.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|N|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +>#+0#0000e05&| |:|4|2|,|4|2| |l|o|a|d|k|e|y|m|a|p| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|a|d|v|i|e|w| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|l|d|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|p|e|n| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|s| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|t|a|g| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@60 +@57|3|6|1|,|1| @8|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_21.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_21.dump new file mode 100644 index 0000000000..194602fd0a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_21.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|k|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|p| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|r|k| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|r|k|s| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@54 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|e|x|r|c| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|v|i|e|w| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@60 +@57|3|7|9|,|1| @8|3|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_22.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_22.dump new file mode 100644 index 0000000000..89f38cc6fe --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_22.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|o|v|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|b|k|e|y| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|e|w| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@59 +@57|3|9|7|,|1| @8|3|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_23.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_23.dump new file mode 100644 index 0000000000..9cf2f673d1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_23.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|m|a|l| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|n|l|y| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@56 +@57|4|1|5|,|1| @8|3@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_24.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_24.dump new file mode 100644 index 0000000000..0aa6d7e708 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_24.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|c|l|o|s|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|e|d|i|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|e|r|l| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@61 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|o|p| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|o|p|u|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&@1|o|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|m|p|t|f|i|n|d| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|a|g| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|j|u|m|p| +0#0000000&@61 +@57|4|3@1|,|1| @8|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_25.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_25.dump new file mode 100644 index 0000000000..3051663ded --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_25.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|j|u|m|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|l|a|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@57 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p|u|b|l|i|c| @61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|u|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|w|d| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|3| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|3|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x| +0#0000000&@64 +@57|4|5|1|,|1| @8|3|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_26.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_26.dump new file mode 100644 index 0000000000..6ea1cfc68b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_26.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|q+0#af5f00255&|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|q+0#af5f00255&|u|i|t| +0#0000000&@63 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|a|d| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|c|o|v|e|r| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|i|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|r|a|w| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@54 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|t|a|b| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|w|i|n|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|i|g|h|t| +0#0000000&@62 +@57|4|6|9|,|1| @8|3|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_27.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_27.dump new file mode 100644 index 0000000000..e656d524c5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_27.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|i|g|h|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|b|y| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|n|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|v|e|a|s| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|a|l@1| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|f|i|r|s|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|l|a|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@57 +@57|4|8|7|,|1| @8|3|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_28.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_28.dump new file mode 100644 index 0000000000..6d0e9bd12a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_28.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@53 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@56 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|r|i|p|t|v|e|r|s|i|o|n| +0#0000000&@54 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|f|i|n|d| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|f|i|r|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|h|e|l@1| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|g|n| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|a|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|e@1|p| +0#0000000&@62 +@57|5|0|5|,|1| @8|4|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_29.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_29.dump new file mode 100644 index 0000000000..79eb7b5c79 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_29.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|e@1|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|e@1|p|!| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|a|g|i|c| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|o|r|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|o|u|r|c|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@56 +@57|5|2|3|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_30.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_30.dump new file mode 100644 index 0000000000..1e99a28bbf --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_30.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|l|i|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|g| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@54 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s|t|a|t|i|c| @61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|j|u|m|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|o|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +@57|5|4|1|,|1| @8|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_31.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_31.dump new file mode 100644 index 0000000000..454cfe5f92 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_31.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|v|i|e|w| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|n|e|w| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@60 +@57|5@1|9|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_32.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_32.dump new file mode 100644 index 0000000000..820f64c21b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_32.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@56 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|s| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|g| +0#0000000&@64 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|g|s| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|d| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|h|d|i|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|l| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|l|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|f|i|r|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|h|r|o|w| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|j|u|m|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|a|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@57 +@57|5|7@1|,|1| @8|4|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_33.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_33.dump new file mode 100644 index 0000000000..8e624931b5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_33.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|m|e|n|u| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|r|y| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|y|p|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@55 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@59 +@57|5|9|5|,|1| @8|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_34.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_34.dump new file mode 100644 index 0000000000..c87d6d0e31 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_34.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|h|i|d|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|l|e|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|m|a|p| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|m|e|n|u| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|a|r| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|e|w| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|s|u|a|l| +0#0000000&@61 +@57|6|1|3|,|1| @8|4|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_35.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_35.dump new file mode 100644 index 0000000000..38b79ace7e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_35.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|s|u|a|l| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|m|e|n|u| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|n|e|w| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|s|p|l|i|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|h|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|p|o|s| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|N|e|x|t| +0#0000000&@62 +@57|6|3|1|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_36.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_36.dump new file mode 100644 index 0000000000..f36984b6ae --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_36.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|q| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|q|a|l@1| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|r|i|t|e| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|u|n|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|m|a|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|u|n|m|a|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|y+0#af5f00255&|a|n|k| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|z+0#af5f00255&| +0#0000000&@66 +@75 +@57|6|4|9|,|1| @8|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_37.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_37.dump new file mode 100644 index 0000000000..b0e0119384 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_37.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|#+0#0000e05&| |r|a|n|g|e| +0#0000000&@67 +@75 +|:|1+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@67 +|:|2+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@67 +>:|3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@67 +@75 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|&+0#af5f00255&| +0#0000000&@67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|~+0#af5f00255&| +0#0000000&@67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|@+0#af5f00255&| +0#0000000&@67 +|#+0#0000e05&| |:|4|2|,|4|2|*| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|>+0#af5f00255&| +0#0000000&@67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|<+0#af5f00255&| +0#0000000&@67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|#+0#0000000&| @67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|=+0#af5f00255&| +0#0000000&@67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|!+0#af5f00255&| +0#0000000&@67 +@75 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|N+0#af5f00255&|e|x|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|P+0#af5f00255&|r|i|n|t| +0#0000000&@63 +@57|6@1|7|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_38.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_38.dump new file mode 100644 index 0000000000..97e983cc20 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_38.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|P+0#af5f00255&|r|i|n|t| +0#0000000&@63 +@75 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b@1|r|e|v|i|a|t|e| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b|c|l|e|a|r| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b|o|v|e|l|e|f|t| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b|s|t|r|a|c|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|l@1| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g|d|e|d|u|p|e| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g@1|l|o|b|a|l| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g|l|o|c|a|l| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g|s| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|s|c|i@1| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|6|8|5|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_39.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_39.dump new file mode 100644 index 0000000000..491df27a7b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_39.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|s|c|i@1| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|g|r|o|u|p| |E|N|D| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|g|r|o|u|p| |F|o@1| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|t|o|c|m|d| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|a|d@1| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|a|l@1| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|a|l|t| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|e|h|a|v|e| |m|s|w|i|n| @2|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|e|h|a|v|e| |x|t|e|r|m| @2|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|e|l|o|w|r|i|g|h|t| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|l|a|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|o|t|r|i|g|h|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +@57|7|0|3|,|1| @8|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_40.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_40.dump new file mode 100644 index 0000000000..83a6334534 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_40.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k|a|d@1| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k|d|e|l| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k|l|i|s|t| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|o|w|s|e| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|u|f|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|u|f@1|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|u|f@1|e|r|s| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|b@1|r|e|v| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|b|c|l|e|a|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|b|o|v|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|d@1|e|x|p|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|d@1|f|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@62 +@57|7|2|1|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_41.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_41.dump new file mode 100644 index 0000000000..72e0df6aad --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_41.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|l@1| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|t|c|h| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|b|o|t@1|o|m| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&@1| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&@1|l|o|s|e| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|d| @12|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|d|o| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|e|n|t|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|e|x|p|r| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|f|d|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|f|i|l|e| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|g|e|t|e|x|p|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|g|e|t|f|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|7|3|9|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_42.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_42.dump new file mode 100644 index 0000000000..4281067a75 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_42.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|g|e|t|f|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|h|a|n|g|e|s| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|h|d|i|r| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|h|e|c|k|p|a|t|h| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|l|a|s@1| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|e|n|d|c|l|a|s@1| @66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|l|a|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|l|e|a|r|j|u|m|p|s| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|l|i|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|l|o|s|e| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|e|w|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@62 +@57|7|5|7|,|1| @8|6|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_43.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_43.dump new file mode 100644 index 0000000000..997f211ef6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_43.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|n|o|r|e|a|b@1|r|e|v| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|l|o|r|s|c|h|e|m|e| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|m|c|l|e|a|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|m@1|a|n|d| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|m|p|i|l|e|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|f|i|r|m| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|t|i|n|u|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|o|p|e|n| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|o|p|y| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|q|u|i|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +@57|7@1|5|,|1| @8|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_44.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_44.dump new file mode 100644 index 0000000000..fb3fb7a133 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_44.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|s|c|o|p|e| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|s|t|a|g| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|u|n|a|b@1|r|e|v| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|b|u|g| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f|c|o|m|p|i|l|e| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f|e|r| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|l|c|o|m@1|a|n|d| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|l|f|u|n|c|t|i|o|n| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|l|m|a|r|k|s| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|o|f@1| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|p|a|t|c|h| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|7|9|3|,|1| @8|6|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_45.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_45.dump new file mode 100644 index 0000000000..81cab1fe15 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_45.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|p|a|t|c|h| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|s|p|l|i|t| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|t|h|i|s| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|u|p|d|a|t|e| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|g|r|a|p|h|s| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|s|a|s@1|e|m|b|l|e| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|s|p|l|a|y| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|j|u|m|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|l|i|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|o|a|u|t|o|a|l@1| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|o|a|u|t|o|c|m|d| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|r|o|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|s|p|l|i|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|a|r|l|i|e|r| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|c|o|n|s|o|l|e| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|e|r@1| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|h|l| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|8|1@1|,|1| @8|6|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_46.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_46.dump new file mode 100644 index 0000000000..734e45037f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_46.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|h|l| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|m|s|g| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|n| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|w|i|n|d|o|w| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|d|i|t| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|l|s|e|i|f| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|l|s|e| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|#+0#0000e05&| |:|4|2|,|4|2|e|n|d|c|l|a|s@1| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d@1|e|f| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|#+0#0000e05&| |:|4|2|,|4|2|e|n|d|e|n|u|m| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|f|o|r| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|f|u|n|c|t|i|o|n| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|i|f| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|#+0#0000e05&| |:|4|2|,|4|2|e|n|d|i|n|t|e|r|f|a|c|e| +0#0000000&@54 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|t|r|y| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|w|h|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|e|w| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|8|2|9|,|1| @8|6@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_47.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_47.dump new file mode 100644 index 0000000000..85609b96f4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_47.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|e|w| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|u|m| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|e|n|d|e|n|u|m| @67 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|v|a|l| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x|e|c|u|t|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#af5f00255&|x|i|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x| @12|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x|p|o|r|t| @62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x|u|s|a|g|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|i|l|e| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|l|e|s| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|l|e|t|y|p|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|l|t|e|r| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|a|l| @63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|a|l@1|y| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|a|l| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|i|n|d| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|i|s|h| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|r|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|8|4|7|,|1| @8|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_48.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_48.dump new file mode 100644 index 0000000000..ae80c4f212 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_48.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|r|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|x|d|e|l| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@56 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|o|r| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|u|n|c|t|i|o|n| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|o|t|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|r|e|p| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#0000000&|u|i| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#0000000&|v|i|m| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|c|l|o|s|e| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|f|i|n|d| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|g|r|e|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|8|6|5|,|1| @8|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_49.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_49.dump new file mode 100644 index 0000000000..de75523082 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_49.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|g|r|e|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|t|a|g|s| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#af5f00255&|i|d|e| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|i|g|h|l|i|g|h|t| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|i|s|t|o|r|y| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|o|r|i|z|o|n|t|a|l| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|a|b@1|r|e|v| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|a|b|c|l|e|a|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|f| @12|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|j|u|m|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|l|i|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|p|o|r|t| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|o|r|e|a|b@1|r|e|v| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +@57|8@1|3|,|1| @8|7|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_50.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_50.dump new file mode 100644 index 0000000000..2b2b345944 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_50.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|t|e|r|f|a|c|e| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|e|n|d|i|n|t|e|r|f|a|c|e| @62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|t|r|o| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@61 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|s|p|l|i|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|u|n|a|b@1|r|e|v| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|j+0#af5f00255&|o|i|n| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|j+0#0000000&|u|m|p|s| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p|a|l|t| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p|j|u|m|p|s| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p|m|a|r|k|s| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p@1|a|t@1|e|r|n|s| @2|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|d@1|e|x|p|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|d@1|f|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|9|0|1|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_51.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_51.dump new file mode 100644 index 0000000000..194754037e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_51.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|d@1|f|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|f|t|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|n|g|u|a|g|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|s|t| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|t|e|r| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|b|e|l|o|w| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|b|o|t@1|o|m| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|c|d| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|c|h|d|i|r| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|c|l|o|s|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|c|s|c|o|p|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|d|o| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|e|f|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|f|t|a|b|o|v|e| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|g|a|c|y| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|x|p|r| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|f|d|o| +0#0000000&@64 +@57|9|1|9|,|1| @8|7|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_52.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_52.dump new file mode 100644 index 0000000000..3091b7e76e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_52.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|f|d|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|f|i|l|e| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|g|e|t|e|x|p|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|g|e|t|f|i|l|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|g|r|e|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|h|e|l|p|g|r|e|p| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|i|s|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&@1| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&@1|a|s|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&@1|i|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|k|e| @9|#+0#0000e05&| |n|o|r|a|n|g|e| +0#0000000&@44 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|e|x|t| +0#0000000&@63 +@57|9|3|7|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_53.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_53.dump new file mode 100644 index 0000000000..042586a709 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_53.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|N|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>#+0#0000e05&| |:|4|2|,|4|2|l|o|a|d|k|e|y|m|a|p| @2|#| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|o|a|d|v|i|e|w| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|o|c|k|m|a|r|k|s| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|o|c|k|v|a|r| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|o|l|d|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|o|p|e|n| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|s| @12|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|t|a|g| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@61 +@57|9|5@1|,|1| @8|7|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_54.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_54.dump new file mode 100644 index 0000000000..9d7a0be567 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_54.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@61 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|k|e| @10|#+0#0000e05&| |n|o|r|a|n|g|e| +0#0000000&@44 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|p|c|l|e|a|r| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|p| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|a|r|k| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|r|k|s| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|a|t|c|h| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|e|n|u| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|e|n|u|t|r|a|n|s|l|a|t|e| @1|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|e|x|r|c| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|s|e|s@1|i|o|n| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|s|p|e|l@1| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|v|i|e|w| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|v|i|m|r|c| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|9|7|3|,|1| @8|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_55.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_55.dump new file mode 100644 index 0000000000..5607ad57e5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_55.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|v|i|m|r|c| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|o|v|e| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|b|c|l|o|s|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|b|k|e|y| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|b|s|t|a|r|t| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|e|w| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|e|x|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&@1|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|a|u|t|o|c|m|d| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|h|l|s|e|a|r|c|h| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|r|e|a|b@1|r|e|v| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|r|e|m|a|p| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@60 +@57|9@1|1|,|1| @8|7|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_56.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_56.dump new file mode 100644 index 0000000000..867e66610c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_56.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|o|r|m|a|l| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|s|w|a|p|f|i|l|e| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|l|d|f|i|l|e|s| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|n|l|y| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|p|t|i|o|n|s| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|w|n|s|y|n|t|a|x| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|a|c|k|a|d@1| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|a|c|k|l|o|a|d|a|l@1| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|1|0@1|9|,|1| @7|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_57.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_57.dump new file mode 100644 index 0000000000..01a988412a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_57.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|a|c|k|l|o|a|d|a|l@1| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|c|l|o|s|e| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|e|d|i|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|e|r|l| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@62 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|o|p| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|o|p|u|p| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&@1|o|p| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|e|s|e|r|v|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|f|d|e|l| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|f|i|l|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|m|p|t|f|i|n|d| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|m|p|t|r|e|p|l| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|a|g| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|j|u|m|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|1|0|2|7|,|1| @7|8|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_58.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_58.dump new file mode 100644 index 0000000000..bafd80ba81 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_58.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|j|u|m|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|l|a|s|t| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@58 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|s|e|l|e|c|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|u|b|l|i|c| @62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|u|t| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|w|d| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|3| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|3|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|d|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x| +0#0000000&@65 +@57|1|0|4|5|,|1| @7|8|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_59.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_59.dump new file mode 100644 index 0000000000..ff0f637b94 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_59.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|q+0#0000000&|a|l@1| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|q+0#af5f00255&|u|i|t| +0#0000000&@64 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|q+0#0000000&|u|i|t|a|l@1| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|a|d| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|c|o|v|e|r| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|i|r| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|o| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|r|a|w| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|r|a|w|s|t|a|t|u|s| @2|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|r|a|w|t|a|b|l|i|n|e| @1|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|g|i|s|t|e|r|s| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|t|a|b| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|t|u|r|n| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|w|i|n|d| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|i|g|h|t| +0#0000000&@63 +@57|1|0|6|3|,|1| @7|8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_60.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_60.dump new file mode 100644 index 0000000000..5731b3995d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_60.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|i|g|h|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|i|g|h|t|b|e|l|o|w| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|u|b|y| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@60 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|u|n|d|o| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|u|n|t|i|m|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|v|i|m|i|n|f|o| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|a|l@1| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|a|n|d|b|o|x| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|a|v|e|a|s| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|a|l@1| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|f|i|r|s|t| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|l|a|s|t| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@58 +@57|1|0|8|1|,|1| @7|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_61.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_61.dump new file mode 100644 index 0000000000..3482191454 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_61.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|r|e|w|i|n|d| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|c|r|i|p|t|e|n|c|o|d|i|n|g| |#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@57 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|c|r|i|p|t|v|e|r|s|i|o|n| @1|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|c|s|c|o|p|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t|f|i|l|e|t|y|p|e| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t|g|l|o|b|a|l| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t|l|o|c|a|l| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|f|i|n|d| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|f|i|r|s|t| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|h|e|l@1| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|i|g|n| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|i|l|e|n|t| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|i|m|a|l|t| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|l|a|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|l|e@1|p| +0#0000000&@63 +@57|1|0|9@1|,|1| @7|8@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_62.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_62.dump new file mode 100644 index 0000000000..4c6114b96c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_62.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|l|e@1|p| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|l|e@1|p|!| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|m|a|g|i|c| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|m|i|l|e| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|o|r|t| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|o|u|r|c|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|d|u|m|p| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|i|n|f|o| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|r|e|p|a|l@1| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|1@2|7|,|1| @7|8|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_63.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_63.dump new file mode 100644 index 0000000000..ee07ef2284 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_63.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|r|e|p|a|l@1| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|l|i|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|r|e|w|i|n|d| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|t|a|g| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|r|t|g|r|e|p|l|a|c|e| @1|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|r|t|i|n|s|e|r|t| @3|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|r|t|r|e|p|l|a|c|e| @2|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|t|i|c| @62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|j|u|m|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|o|p|i|n|s|e|r|t| @4|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|o|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|s|e|l|e|c|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|1@1|3|5|,|1| @7|9|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_64.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_64.dump new file mode 100644 index 0000000000..2aa41412b8 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_64.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|s|p|e|n|d| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|v|i|e|w| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|w|a|p|n|a|m|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|y|n|c|b|i|n|d| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|y|n|t|a|x| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|y|n|t|i|m|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|f|i|r|s|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|l|a|s|t| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|n|e|w| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b| +0#0000000&@11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@61 +@57|1@1|5|3|,|1| @7|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_65.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_65.dump new file mode 100644 index 0000000000..f52935baed --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_65.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@57 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|r|e|w|i|n|d| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|s| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|g| +0#0000000&@65 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|g|s| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|c|d| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|c|h|d|i|r| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|c|l| +0#0000000&@65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|c|l|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|e|a|r|o|f@1| @61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@60 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|h|r|o|w| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|j|u|m|p| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|l|a|s|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@58 +@57|1@1|7|1|,|1| @7|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_66.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_66.dump new file mode 100644 index 0000000000..d5d1df97c0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_66.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|l|u|n|m|e|n|u| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|m|e|n|u| +0#0000000&@63 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|o|p|l|e|f|t| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|r|y| @11|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|s|e|l|e|c|t| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|y|p|e| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|a|b@1|r|e|v|i|a|t|e| @2|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#af5f00255&|n|d|o| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|d|o|j|o|i|n| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|1@1|8|9|,|1| @7|9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_67.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_67.dump new file mode 100644 index 0000000000..86391c7850 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_67.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|d|o|j|o|i|n| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|d|o|l|i|s|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#af5f00255&|n|h|i|d|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|l|e|t| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|l|o|c|k|v|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|m|a|p| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|m|e|n|u| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|s|i|l|e|n|t| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|a|r| @65 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|e|r|s|i|o|n| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|e|r|t|i|c|a|l| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|e|w| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|m|9|c|m|d| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@61 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@58 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|s|u|a|l| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +@57|1|2|0|7|,|1| @7|9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_68.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_68.dump new file mode 100644 index 0000000000..3019489605 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_68.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|s|u|a|l| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|u|s|a|g|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|m|e|n|u| +0#0000000&@63 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|n|e|w| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|s|p|l|i|t| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|a|l@1| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|h|i|l|e| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@62 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|i|n|d|o| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|i|n|p|o|s| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|i|n|s|i|z|e| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|N|e|x|t| +0#0000000&@63 +@57|1|2@1|5|,|1| @7|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_range_69.dump b/runtime/syntax/testdir/dumps/vim9_ex_range_69.dump new file mode 100644 index 0000000000..bf0aca00dc --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_range_69.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|q| +0#0000000&@66 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|q|a|l@1| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|r|i|t|e| +0#0000000&@63 +>:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|u|n|d|o| @9|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|v|i|m|i|n|f|o| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|a|l@1| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|m|a|p|c|l|e|a|r| @5|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|m|a|p| @10|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|n|o|r|e|m|a|p| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|r|e|s|t|o|r|e| @6|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|u|n|m|a|p| @8|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|u|n|m|e|n|u| @7|#+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@43 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|y+0#af5f00255&|a|n|k| +0#0000000&@64 +|:|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|z+0#af5f00255&| +0#0000000&@67 +@75 +@57|1|2|4|3|,|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim9_expressions_10.dump b/runtime/syntax/testdir/dumps/vim9_expressions_10.dump index d83a170c17..f5feca5ca2 100644 --- a/runtime/syntax/testdir/dumps/vim9_expressions_10.dump +++ b/runtime/syntax/testdir/dumps/vim9_expressions_10.dump @@ -10,7 +10,7 @@ @75 |#+0#0000e05&| |I|s@1|u|e| |#|1|4@1|2|3| |(|v|i|m|.|v|i|m|:| |O|p|t| |o|u|t| |o|f| |v|i|m|S|e|a|r|c|h|*|)| +0#0000000&@27 @75 -|:|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@66 +|:|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @66 |c+0#af5f00255&|o|n|s|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#e000002&|a|l|s|e| +0#0000000&@46 @4|?+0#af5f00255&| +0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&@66 @4|)+0#e000e06&| +0#0000000&@69 diff --git a/runtime/syntax/testdir/dumps/vim9_expressions_11.dump b/runtime/syntax/testdir/dumps/vim9_expressions_11.dump index fdea0d092c..c9c79a3f11 100644 --- a/runtime/syntax/testdir/dumps/vim9_expressions_11.dump +++ b/runtime/syntax/testdir/dumps/vim9_expressions_11.dump @@ -1,7 +1,7 @@ |e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&@63 @75 |d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65 -| +0#e000002&@1|:+0#0000000&|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@64 +@2|:|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @64 @2|c+0#af5f00255&|o|n|s|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#e000002&|a|l|s|e| +0#0000000&@44 @6>?+0#af5f00255&| +0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&@64 @6|)+0#e000e06&| +0#0000000&@67 diff --git a/runtime/syntax/testdir/dumps/vim9_function_calls_09.dump b/runtime/syntax/testdir/dumps/vim9_function_calls_09.dump index 9e02888b21..44bb9f6508 100644 --- a/runtime/syntax/testdir/dumps/vim9_function_calls_09.dump +++ b/runtime/syntax/testdir/dumps/vim9_function_calls_09.dump @@ -13,8 +13,8 @@ |v+0#af5f00255&|a|r| +0#0000000&|i|f| |=+0#af5f00255&| +0#0000000&|i+0#ffffff16#ff404010|f|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@59 |c+0#af5f00255&|a|l@1| +0#0000000&|i+0#ffffff16#ff404010|f|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@63 |#+0#0000e05&| |f|u|n|c|t|i|o|n| +0#0000000&@64 -|i+0#ffffff16#ff404010|f|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#af5f00255&@1| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@55 +|i+0#ffffff16#ff404010|f|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#e000002&|.+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@55 |#+0#0000e05&| |c|o|m@1|a|n|d| +0#0000000&@65 -|i+0#af5f00255&|f| +0#0000000&|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#af5f00255&@1| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@54 +|i+0#af5f00255&|f| +0#0000000&|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#e000002&|.+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@54 @75 @57|1|6|3|,|0|-|1| @6|5|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_lambdas_07.dump b/runtime/syntax/testdir/dumps/vim9_lambdas_07.dump index 831c23bd23..062b00e375 100644 --- a/runtime/syntax/testdir/dumps/vim9_lambdas_07.dump +++ b/runtime/syntax/testdir/dumps/vim9_lambdas_07.dump @@ -15,6 +15,6 @@ @75 |v+0#af5f00255&|a|r| +0#0000000&|c+0#00e0e07&|o|u|n|t| +0#0000000&|=+0#af5f00255&| +0#0000000&|0+0#e000002&| +0#0000000&@61 |v+0#af5f00255&|a|r| +0#0000000&|t+0#00e0e07&|i|m|e|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#00e0e07&|i|m|e|r|_|s|t|a|r|t|(+0#e000e06&|5+0#e000002&|0@1|,+0#0000000&| |(+0#0000001#ffff4012|_+0#00e0e07#ffffff0|)+0#0000001#ffff4012| +0#0000000#ffffff0|=+0#0000001#ffff4012|>| +0#0000000#ffffff0|{+0#e000e06&| +0#0000000&@37 -@8| +0#00e0e07&|c|o|u|n|t| +0#0000000&|++0#af5f00255&|=| +0#0000000&|1+0#e000002&| +0#0000000&@55 +@9|c+0#00e0e07&|o|u|n|t| +0#0000000&|++0#af5f00255&|=| +0#0000000&|1+0#e000002&| +0#0000000&@55 @9|e+0#af5f00255&|c|h|o|m| +0#0000000&|'+0#e000002&|H|a|n|d|l|e|r| |c|a|l@1|e|d| |'| +0#0000000&|.+0#af5f00255&@1| +0#0000000&|c+0#00e0e07&|o|u|n|t| +0#0000000&@33 @57|1|2|7|,|7| @8|8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_legacy_header_00.dump b/runtime/syntax/testdir/dumps/vim9_legacy_header_00.dump index 456cd3b731..75103ebd40 100644 --- a/runtime/syntax/testdir/dumps/vim9_legacy_header_00.dump +++ b/runtime/syntax/testdir/dumps/vim9_legacy_header_00.dump @@ -5,7 +5,7 @@ @75 |i+0#af5f00255&|f| +0#0000000&|!+0#af5f00255&|h+0#00e0e07&|a|s|(+0#e000e06&|'+0#e000002&|v|i|m|9|s|c|r|i|p|t|'|)+0#e000e06&| +0#0000000&@53 @2|#| |4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58 -@2|s+0#af5f00255&|o|u|r|c|e| +0#00e0e07&|f|o@1|.+0#0000000&|v+0#00e0e07&|i|m| +0#0000000&@58 +@2|s+0#af5f00255&|o|u|r|c|e| +0#0000000&|f|o@1|.+0#af5f00255&|v+0#00e0e07&|i|m| +0#0000000&@58 @2|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@66 |e+0#af5f00255&|n|d|i|f| +0#0000000&@69 @75 diff --git a/runtime/syntax/testdir/dumps/vim9_legacy_header_fold_00.dump b/runtime/syntax/testdir/dumps/vim9_legacy_header_fold_00.dump index 3852e3665d..89b32ceae0 100644 --- a/runtime/syntax/testdir/dumps/vim9_legacy_header_fold_00.dump +++ b/runtime/syntax/testdir/dumps/vim9_legacy_header_fold_00.dump @@ -7,7 +7,7 @@ ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 ||+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|f| +0#0000000&|!+0#af5f00255&|h+0#00e0e07&|a|s|(+0#e000e06&|'+0#e000002&|v|i|m|9|s|c|r|i|p|t|'|)+0#e000e06&| +0#0000000&@51 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|#| |4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|s+0#af5f00255&|o|u|r|c|e| +0#0000000&|f|o@1|.|v|i|m| @56 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|s+0#af5f00255&|o|u|r|c|e| +0#0000000&|f|o@1|.+0#af5f00255&|v+0#0000000&|i|m| @56 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@64 ||+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|d|i|f| +0#0000000&@67 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 diff --git a/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_00.dump b/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_00.dump index 525ab4b920..3627439efe 100644 --- a/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_00.dump +++ b/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_00.dump @@ -9,11 +9,11 @@ @2|v+0#af5f00255&|a|r| +0#0000000&|_+0#00e0e07&|v|a|l|u|e|:+0#0000000&| |a+0#00e0003&|n|y| +0#0000000&@57 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|n+0#00e0e07&|e|w|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|:+0#0000000&| |a+0#00e0003&|n|y|)+0#e000e06&| +0#0000000&@53 -@3| +0#00e0e07&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|_|B|a|s|e|I|n|i|t|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|)+0#e000e06&| +0#0000000&@49 +@4|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|_|B|a|s|e|I|n|i|t|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|)+0#e000e06&| +0#0000000&@49 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|_|B|a|s|e|I|n|i|t|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|:+0#0000000&| |a+0#00e0003&|n|y|)+0#e000e06&| +0#0000000&@47 -@3| +0#00e0e07&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|_+0#00e0e07&|v|a|l|u|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|v+0#00e0e07&|a|l|u|e| +0#0000000&@51 +@4|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|_+0#00e0e07&|v|a|l|u|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|v+0#00e0e07&|a|l|u|e| +0#0000000&@51 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|V|a|l|u|e|(+0#e000e06&|)|:+0#0000000&| |a+0#00e0003&|n|y| +0#0000000&@56 diff --git a/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_01.dump b/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_01.dump index 325cbec165..1434108544 100644 --- a/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_01.dump +++ b/runtime/syntax/testdir/dumps/vim9_super_this_keywords2_01.dump @@ -1,6 +1,6 @@ | +0&#ffffff0@74 @2|d+0#af5f00255&|e|f| +0#0000000&|_|B|a|s|e|I|n|i|t|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|:+0#0000000&| |a+0#00e0003&|n|y|)+0#e000e06&| +0#0000000&@47 -@3| +0#00e0e07&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|_+0#00e0e07&|v|a|l|u|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|v+0#00e0e07&|a|l|u|e| +0#0000000&@51 +@4|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|_+0#00e0e07&|v|a|l|u|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|v+0#00e0e07&|a|l|u|e| +0#0000000&@51 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2>d+0#af5f00255&|e|f| +0#0000000&|V|a|l|u|e|(+0#e000e06&|)|:+0#0000000&| |a+0#00e0003&|n|y| +0#0000000&@56 @@ -10,7 +10,7 @@ @75 |c+0#af5f00255&|l|a|s@1| +0#0000000&|B| |e+0#af5f00255&|x|t|e|n|d|s| +0#0000000&|A| @57 @2|d+0#af5f00255&|e|f| +0#0000000&|n+0#00e0e07&|e|w|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r|)+0#e000e06&| +0#0000000&@50 -@3| +0#00e0e07&|s+0#0000001#ffff4012|u|p|e|r|.+0#0000000#ffffff0|_|B|a|s|e|I|n|i|t|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|)+0#e000e06&| +0#0000000&@48 +@4|s+0#0000001#ffff4012|u|p|e|r|.+0#0000000#ffffff0|_|B|a|s|e|I|n|i|t|(+0#e000e06&|v+0#00e0e07&|a|l|u|e|)+0#e000e06&| +0#0000000&@48 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|V|a|l|u|e|(+0#e000e06&|)|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&@53 diff --git a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_01.dump b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_01.dump index 42b21778dc..0d10a2dfe7 100644 --- a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_01.dump +++ b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_01.dump @@ -8,13 +8,13 @@ @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|D|e|f|1|(+0#e000e06&|a+0#00e0e07&|r|g| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|x+0#00e0e07&|)+0#e000e06&| +0#0000000&@50 -@3| +0#00e0e07&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|a+0#00e0e07&|r|g| +0#0000000&@58 -@3| +0#00e0e07&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|z+0#00e0e07&| +0#0000000&|++0#af5f00255&|=| +0#0000000&|a+0#00e0e07&|r|g| +0#0000000&@57 +@4|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|a+0#00e0e07&|r|g| +0#0000000&@58 +@4|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|z+0#00e0e07&| +0#0000000&|++0#af5f00255&|=| +0#0000000&|a+0#00e0e07&|r|g| +0#0000000&@57 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|D|e|f|2|(+0#e000e06&|a+0#00e0e07&|r|g| +0#0000000&|=+0#af5f00255&| +0#0000000&|(+0#e000e06&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|x+0#00e0e07&| +0#0000000&|++0#af5f00255&| +0#0000000&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|y+0#00e0e07&| +0#0000000&|++0#af5f00255&| +0#0000000&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|z+0#00e0e07&|)+0#e000e06&@1| +0#0000000&@30 @4|E|c|h|o|(+0#e000e06&|t+0#0000001#ffff4012|h|i|s|,+0#0000000#ffffff0| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|x+0#00e0e07&|,+0#0000000&| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|y+0#00e0e07&|,+0#0000000&| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|z+0#00e0e07&|)+0#e000e06&| +0#0000000&@36 -@3| +0#00e0e07&|t+0#0000001#ffff4012|h|i|s|-+0#af5f00255#ffffff0|>|E+0#0000000&|c|h|o|(+0#e000e06&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|x+0#00e0e07&|,+0#0000000&| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|y+0#00e0e07&|,+0#0000000&| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|z+0#00e0e07&|)+0#e000e06&| +0#0000000&@36 +@4|t+0#0000001#ffff4012|h|i|s|-+0#af5f00255#ffffff0|>|E+0#0000000&|c|h|o|(+0#e000e06&|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|x+0#00e0e07&|,+0#0000000&| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|y+0#00e0e07&|,+0#0000000&| |t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|z+0#00e0e07&|)+0#e000e06&| +0#0000000&@36 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @57|1|9|,|0|-|1| @7|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_02.dump b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_02.dump index e5bc889673..2642dceb08 100644 --- a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_02.dump +++ b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_02.dump @@ -10,7 +10,7 @@ @75 |c+0#af5f00255&|l|a|s@1| +0#0000000&|B|a|r| |e+0#af5f00255&|x|t|e|n|d|s| +0#0000000&|F|o@1| @53 @2|d+0#af5f00255&|e|f| +0#0000000&|D|e|f|1|(+0#e000e06&|)| +0#0000000&@62 -@3| +0#00e0e07&|s+0#0000001#ffff4012|u|p|e|r|.+0#0000000#ffffff0|D|e|f|1|(+0#e000e06&|)| +0#0000000&@58 +@4|s+0#0000001#ffff4012|u|p|e|r|.+0#0000000#ffffff0|D|e|f|1|(+0#e000e06&|)| +0#0000000&@58 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|D|e|f|2|(+0#e000e06&|)| +0#0000000&@62 diff --git a/runtime/syntax/testdir/dumps/vim_comments_00.dump b/runtime/syntax/testdir/dumps/vim_comments_00.dump index 5e6b5a2f0f..bba603d565 100644 --- a/runtime/syntax/testdir/dumps/vim_comments_00.dump +++ b/runtime/syntax/testdir/dumps/vim_comments_00.dump @@ -3,11 +3,11 @@ @75 |"+0#0000e05&| |L|e|g|a|c|y|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@51 @75 -|#| |4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 @75 |f+0#af5f00255&|u|n|c|t|i|o|n|!| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@59 @2|"+0#0000e05&| |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|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58 |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63 @75 |d+0#af5f00255&|e|f|!| +0#0000000&|B|a|r|(+0#e000e06&|)| +0#0000000&@64 diff --git a/runtime/syntax/testdir/dumps/vim_comments_01.dump b/runtime/syntax/testdir/dumps/vim_comments_01.dump index 2c52e515da..7e3c696d9a 100644 --- a/runtime/syntax/testdir/dumps/vim_comments_01.dump +++ b/runtime/syntax/testdir/dumps/vim_comments_01.dump @@ -17,4 +17,4 @@ @75 |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@65 | +0#0000e05&@1|\| |c|o|n|t|i|n|u|i|n|g| |c|o|m@1|e|n|t| +0#0000000&@52 -@57|1|9|,|3| @9|2|0|%| +@57|1|9|,|3| @9|1|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_comments_02.dump b/runtime/syntax/testdir/dumps/vim_comments_02.dump index 5156e42793..a6fa3d1c29 100644 --- a/runtime/syntax/testdir/dumps/vim_comments_02.dump +++ b/runtime/syntax/testdir/dumps/vim_comments_02.dump @@ -17,4 +17,4 @@ @75 |:|F|o@1| @70 @6|"+0#0000e05&|\| |l|i|n|e| |c|o|n|t|i|n|u|a|t|i|o|n| |c|o|m@1|e|n|t| +0#0000000&@40 -@57|3|7|,|3| @9|4|8|%| +@57|3|7|,|3| @9|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_comments_03.dump b/runtime/syntax/testdir/dumps/vim_comments_03.dump index a125c0bb18..fb853732fe 100644 --- a/runtime/syntax/testdir/dumps/vim_comments_03.dump +++ b/runtime/syntax/testdir/dumps/vim_comments_03.dump @@ -4,17 +4,17 @@ @6|\+0#e000e06&| +0#0000000&|a|r|g|2| @62 @75 > @74 +@75 +|:|"+0#0000e05&|c|o|m@1|e|n|t|"| +0#0000000&@64 +|:| |"+0#0000e05&|c|o|m@1|e|n|t|"| +0#0000000&@63 +|:|"+0#0000e05&|c|o|m@1|e|n|t| +0#0000000&@65 +|:| |"+0#0000e05&|c|o|m@1|e|n|t| +0#0000000&@64 +@75 +@75 |"+0#0000e05&| +0#0000000&|I+0#e000e06&|s@1|u|e|:| +0#0000e05&|#|1|3|0|4|7| +0#0000000&@59 @75 |i+0#af5f00255&|f| +0#0000000&|!+0#af5f00255&|e+0#00e0e07&|x|i|s|t|s|(+0#e000e06&|"+0#e000002&|:|D|i|f@1|O|r|i|g|"|)+0#e000e06&| +0#0000000&@51 -@2|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|D|i|f@1|O|r|i|g| |v+0#af5f00255&|e|r|t| +0#0000000&|n+0#af5f00255&|e|w| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&|b+0#e000e06&|t|=+0#af5f00255&|n+0#0000000&|o|f|i|l|e| ||| |r+0#af5f00255&| +0#0000000&|++0#af5f00255&@1|e+0#00e0e07&|d|i|t| +0#0000000&|#| ||| |0+0#e000002&|d+0#0000000&|_| ||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@1 +@2|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|D|i|f@1|O|r|i|g| |v+0#af5f00255&|e|r|t| +0#0000000&|n+0#af5f00255&|e|w| +0#0000000&||| |s+0#af5f00255&|e|t| +0#0000000&|b+0#e000e06&|t|=+0#af5f00255&|n+0#0000000&|o|f|i|l|e| ||| |r+0#af5f00255&| +0#0000000&|++0#af5f00255&@1|e+0#00e0e07&|d|i|t| +0#0000000&|#+0#af5f00255&| +0#0000000&||| |0+0#e000002&|d+0#af5f00255&|_+0#e000002&| +0#0000000&||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@1 @18|\+0#e000e06&| +0#0000000&||| |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|p| ||| |d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@33 |e+0#af5f00255&|n|d|i|f| +0#0000000&@69 -@75 -@75 -|"+0#0000e05&| +0#0000000&|I+0#e000e06&|s@1|u|e|:| +0#0000e05&|#|1@1|3|0|7| |a|n|d| |#|1@1|5|6|0| +0#0000000&@48 -@75 -|"+0#0000e05&| |T|h|i|s| |i|s| |w|h|a|t| |w|e| |c|a|l@1| |"| |b|l|a|h| +0#0000000&@45 -@75 -@75 -@57|5@1|,|0|-|1| @7|7|6|%| +@57|5@1|,|0|-|1| @7|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_comments_04.dump b/runtime/syntax/testdir/dumps/vim_comments_04.dump index 48acc83f63..11d843a920 100644 --- a/runtime/syntax/testdir/dumps/vim_comments_04.dump +++ b/runtime/syntax/testdir/dumps/vim_comments_04.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@74 +|e+0#af5f00255#ffffff0|n|d|i|f| +0#0000000&@69 +@75 +@75 +|"+0#0000e05&| +0#0000000&|I+0#e000e06&|s@1|u|e|:| +0#0000e05&|#|1@1|3|0|7| |a|n|d| |#|1@1|5|6|0| +0#0000000&@48 +@75 +>"+0#0000e05&| |T|h|i|s| |i|s| |w|h|a|t| |w|e| |c|a|l@1| |"| |b|l|a|h| +0#0000000&@45 +@75 +@75 |"+0#0000e05&| |I|s@1|u|e| |#| |#|9|5|8|7| +0#0000000&@59 @75 |d+0#af5f00255&|e|f| +0#0000000&|C|o|m@1|e|n|t|T|i|t|l|e|(+0#e000e06&|)| +0#0000000&@56 @2|#+0#0000e05&| +0#0000000&|T+0#e000e06&|i|t|l|e|:| +0#0000e05&|.@2| +0#0000000&@60 ->e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 @75 @75 |"+0#0000e05&| +0#0000000&|P+0#e000e06&|R|:| +0#0000e05&|#|1|9|3|9|0| +0#0000000&@62 |"+0#0000e05&| |h|t@1|p|s|:|/@1|g|i|t|h|u|b|.|c|o|m|/|v|i|m|/|v|i|m|/|p|u|l@1|/|1|9|3|9|0|#|i|s@1|u|e|-|3|9|3@1|7|5@1|8|4|6| +0#0000000&@18 @75 |d+0#af5f00255&|e|f| +0#0000000&|C|o|m@1|e|n|t|T|i|t|l|e|2|(+0#e000e06&|)| +0#0000000&@55 -@2|#+0#0000e05&| |E|1|2|3|4|:| |s|h|o|u|l|d| |n|o|t| |h|a|v|e| |v|i|m|9|C|o|m@1|e|n|t|T|i|t|l|e| |o|n| |'|E|1|2|3|4|:|'| +0#0000000&@19 -@2|#+0#0000e05&| +0#0000000&|E+0#e000e06&|R@1|3|4|:| +0#0000e05&|s|h|o|u|l|d| |h|a|v|e| |v|i|m|9|C|o|m@1|e|n|t|T|i|t|l|e| |o|n| |'|E|R@1|3|4|:|'| +0#0000000&@23 -|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 -@75 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|7|3|,|1| @9|B|o|t| +@57|7|3|,|1| @9|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_comments_05.dump b/runtime/syntax/testdir/dumps/vim_comments_05.dump new file mode 100644 index 0000000000..a7c0554b07 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_comments_05.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|e|f| +0#0000000&|C|o|m@1|e|n|t|T|i|t|l|e|2|(+0#e000e06&|)| +0#0000000&@55 +@2|#+0#0000e05&| |E|1|2|3|4|:| |s|h|o|u|l|d| |n|o|t| |h|a|v|e| |v|i|m|9|C|o|m@1|e|n|t|T|i|t|l|e| |o|n| |'|E|1|2|3|4|:|'| +0#0000000&@19 +@2|#+0#0000e05&| +0#0000000&|E+0#e000e06&|R@1|3|4|:| +0#0000e05&|s|h|o|u|l|d| |h|a|v|e| |v|i|m|9|C|o|m@1|e|n|t|T|i|t|l|e| |o|n| |'|E|R@1|3|4|:|'| +0#0000000&@23 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|9|0|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_00.dump b/runtime/syntax/testdir/dumps/vim_ex_append_00.dump new file mode 100644 index 0000000000..896f273938 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_00.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1>"+0&#ffffff0| |V|i|m| |:|a|p@1|e|n|d| |c|o|m@1|a|n|d| +0#0000000&@51 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |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&|T|"| +0#0000000&@29 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s|e|t|l| |f|d|c|=|2| |f|d|l|=|9@2| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@26 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t| |o|n|l|y| +0#0000000&@42 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_01.dump b/runtime/syntax/testdir/dumps/vim_ex_append_01.dump new file mode 100644 index 0000000000..436a6289cf --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_01.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +@57|1|9|,|0|-|1| @8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_02.dump b/runtime/syntax/testdir/dumps/vim_ex_append_02.dump new file mode 100644 index 0000000000..73d44ffc40 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_02.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| >l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +@57|3|7|,|1| @9|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_03.dump b/runtime/syntax/testdir/dumps/vim_ex_append_03.dump new file mode 100644 index 0000000000..f02ae12e0e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_03.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| >a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@41 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|0| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@36 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +@57|5@1|,|1| @9|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_04.dump b/runtime/syntax/testdir/dumps/vim_ex_append_04.dump new file mode 100644 index 0000000000..ea64dfc93b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_04.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |e|m|p|t|y| |f|i|r|s|t| |l|i|n|e| +0#0000000&@54 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|7|3|,|0|-|1| @7|3|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_05.dump b/runtime/syntax/testdir/dumps/vim_ex_append_05.dump new file mode 100644 index 0000000000..d37aba5720 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_05.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +@57|9|1|,|0|-|1| @7|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_06.dump b/runtime/syntax/testdir/dumps/vim_ex_append_06.dump new file mode 100644 index 0000000000..175fa70e6e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_06.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| >l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@41 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +@57|1|0|9|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_07.dump b/runtime/syntax/testdir/dumps/vim_ex_append_07.dump new file mode 100644 index 0000000000..9591941dcc --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_07.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| >a+0#af5f00255#ffffff0|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@36 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |n|o| |e|a|r|l|y| |t|e|r|m|i|n|a|t|i|o|n| +0#0000000&@50 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|'|a|u|t|o|i|n|d|e|n|t|'| |e|n|d| |m|a|r|k|e|r| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000&@27 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +@57|1|2|7|,|1| @8|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_08.dump b/runtime/syntax/testdir/dumps/vim_ex_append_08.dump new file mode 100644 index 0000000000..9884c3557a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_08.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@64 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0>.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&@63 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +@57|1|4|5|,|2| @8|7@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_09.dump b/runtime/syntax/testdir/dumps/vim_ex_append_09.dump new file mode 100644 index 0000000000..f3924e6c5b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_09.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0>.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +@57|1|6|3|,|2| @8|8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_10.dump b/runtime/syntax/testdir/dumps/vim_ex_append_10.dump new file mode 100644 index 0000000000..94db90ab15 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_10.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@64 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| >.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&@63 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|n|d|f|u|n|c|t|i|o|n| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +@57|1|8|1|,|1| @8|9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_append_11.dump b/runtime/syntax/testdir/dumps/vim_ex_append_11.dump new file mode 100644 index 0000000000..b4aa7a0f2a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_append_11.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|i|o|n| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|9@1|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump index ca3c695175..f857a3c5db 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump @@ -3,8 +3,8 @@ @75 |"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|"|B|u|f|R|e|a|d|"| |a|n|d| |"+0#e000002&|*|"| +0#0000e05&|a|r|e| |v|a|l|i|d| |g|r|o|u|p| |n|a|m|e|s|,| |h|o|w|e|v|e|r|,| |:|h|e|l|p| |:|a|u|g|r|o|u|p| +0#0000000&@1 |"+0#0000e05&| |e|x|p|l|i|c|i|t|l|y| |d|i|r|e|c|t|s| |t|h|e| |u|s|e|r| |N|O|T| |t|o| |s|h|a|d|o|w| |e|v|e|n|t| |n|a|m|e|s| |w|i|t|h| |g|r|o|u|p| |n|a|m|e|s| +0#0000000&@2 ->a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#af5f00255&|.|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@18 -|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|*+0#00e0003&| +0#0000000&@6|B|u|f|R|e|a|d| |*+0#af5f00255&|.|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@18 +>a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e|c|h|o| |"+0#e000002&|F|o@1|"| +0#0000000&@18 +|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|*+0#00e0003&| +0#0000000&@6|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e|c|h|o| |"+0#e000002&|F|o@1|"| +0#0000000&@18 @75 @75 |"+0#0000e05&| |R|e|m|o|v|e| +0#0000000&@66 diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump index 8efefee3aa..48d204684c 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump @@ -11,9 +11,9 @@ |"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|"|*|"| |a|n|d| |"+0#e000002&|B|u|f|R|e|a|d|"| +0#0000e05&|a|r|e| |v|a|l|i|d| |g|r|o|u|p| |n|a|m|e|s|,| |h|o|w|e|v|e|r|,| |:|h|e|l|p| |:|a|u|g|r|o|u|p| +0#0000000&@1 |"+0#0000e05&| |e|x|p|l|i|c|i|t|l|y| |d|i|r|e|c|t|s| |t|h|e| |u|s|e|r| |N|O|T| |t|o| |s|h|a|d|o|w| |e|v|e|n|t| |n|a|m|e|s| +0#0000000&@19 |"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |g|r|o|u|p| |"+0#e000002&|*|"| +0#0000e05&|-|>| |e|v|e|n|t| |g|l|o|b| |-|>| |p|a|t@1|e|r|n| +0#0000000&@27 -|a+0#af5f00255&|u|t|o|c|m|d|!|*+0#00e0003&| +0#0000000&|*+0#e000e06&| +0#0000000&|*+0#af5f00255&|.|t+0#0000000&|x|t| @57 +|a+0#af5f00255&|u|t|o|c|m|d|!|*+0#00e0003&| +0#0000000&|*+0#e000e06&| +0#0000000&|*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| @57 |"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |g|r|o|u|p| |"+0#e000002&|B|u|f|R|e|a|d|"| +0#0000e05&|-|>| |e|v|e|n|t| |"+0#e000002&|B|u|f|R|e|a|d|"| +0#0000e05&|-|>| |p|a|t@1|e|r|n| +0#0000000&@16 -|a+0#af5f00255&|u|t|o|c|m|d|!|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#af5f00255&|.|t+0#0000000&|x|t| @45 +|a+0#af5f00255&|u|t|o|c|m|d|!|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| @45 @75 @75 |"+0#0000e05&| |L|i|s|t| +0#0000000&@68 diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_00.dump b/runtime/syntax/testdir/dumps/vim_ex_change_00.dump new file mode 100644 index 0000000000..32f8a377b7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_00.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1>"+0&#ffffff0| |V|i|m| |:|c|h|a|n|g|e| |c|o|m@1|a|n|d| +0#0000000&@51 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |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&|T|"| +0#0000000&@29 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s|e|t|l| |f|d|c|=|2| |f|d|l|=|9@2| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@26 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t| |o|n|l|y| +0#0000000&@42 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_01.dump b/runtime/syntax/testdir/dumps/vim_ex_change_01.dump new file mode 100644 index 0000000000..fe473fdc4d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_01.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|1|9|,|0|-|1| @8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_02.dump b/runtime/syntax/testdir/dumps/vim_ex_change_02.dump new file mode 100644 index 0000000000..8626b4845c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_02.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +@57|3|7|,|0|-|1| @7|1|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_03.dump b/runtime/syntax/testdir/dumps/vim_ex_change_03.dump new file mode 100644 index 0000000000..a73f0f6312 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_03.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| >l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +@57|5@1|,|1| @9|1|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_04.dump b/runtime/syntax/testdir/dumps/vim_ex_change_04.dump new file mode 100644 index 0000000000..d08c7cfc0b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_04.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| >c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@39 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@41 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|0| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +@57|7|3|,|1| @9|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_05.dump b/runtime/syntax/testdir/dumps/vim_ex_change_05.dump new file mode 100644 index 0000000000..cf184bdc9f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_05.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@34 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|0| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| >.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@36 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |e|m|p|t|y| |f|i|r|s|t| |l|i|n|e| +0#0000000&@54 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +@57|9|1|,|1| @9|3|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_06.dump b/runtime/syntax/testdir/dumps/vim_ex_change_06.dump new file mode 100644 index 0000000000..96331e0055 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_06.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +@57|1|0|9|,|0|-|1| @6|3|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_07.dump b/runtime/syntax/testdir/dumps/vim_ex_change_07.dump new file mode 100644 index 0000000000..0fc920b595 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_07.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| >.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +@57|1|2|7|,|1| @8|4|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_08.dump b/runtime/syntax/testdir/dumps/vim_ex_change_08.dump new file mode 100644 index 0000000000..9d4171d352 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_08.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| > +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|1|4|5|,|0|-|1| @6|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_09.dump b/runtime/syntax/testdir/dumps/vim_ex_change_09.dump new file mode 100644 index 0000000000..27eae4c8ba --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_09.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@39 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@41 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +@57|1|6|3|,|0|-|1| @6|6|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_10.dump b/runtime/syntax/testdir/dumps/vim_ex_change_10.dump new file mode 100644 index 0000000000..d0f6a62777 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_10.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@34 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| >l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@36 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |n|o| |e|a|r|l|y| |t|e|r|m|i|n|a|t|i|o|n| +0#0000000&@50 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|'|a|u|t|o|i|n|d|e|n|t|'| |e|n|d| |m|a|r|k|e|r| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000&@27 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +@57|1|8|1|,|1| @8|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_11.dump b/runtime/syntax/testdir/dumps/vim_ex_change_11.dump new file mode 100644 index 0000000000..38d8816d10 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_11.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1>f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@64 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@61 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&@63 +@57|1|9@1|,|1| @8|7|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_12.dump b/runtime/syntax/testdir/dumps/vim_ex_change_12.dump new file mode 100644 index 0000000000..33ca55c6c9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_12.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&@63 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@51 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +@57|2|1|7|,|0|-|1| @6|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_13.dump b/runtime/syntax/testdir/dumps/vim_ex_change_13.dump new file mode 100644 index 0000000000..6200f79b60 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_13.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@64 +@57|2|3|5|,|0|-|1| @6|8@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_14.dump b/runtime/syntax/testdir/dumps/vim_ex_change_14.dump new file mode 100644 index 0000000000..e1e5cdb318 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_14.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@64 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@61 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| >.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&@63 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@51 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +@57|2|5|3|,|1| @8|9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_change_15.dump b/runtime/syntax/testdir/dumps/vim_ex_change_15.dump new file mode 100644 index 0000000000..f598e4ab80 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_change_15.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&|4+0#e000002&|2| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@53 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| >.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|i|o|n| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|2|7|1|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_01.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_01.dump index 3c2fac5720..922049d997 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_01.dump @@ -17,4 +17,4 @@ |u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 -@57|1|9|,|1| @9|1@1|%| +@57|1|9|,|1| @10|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump index 05b0489521..f43e9b2644 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump @@ -3,8 +3,7 @@ @75 @75 |:| @1|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@6|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -@1>"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|n|o|t| |a| |t|e|r|n|a|r|y| |o|p|e|r|a|t|o|r| |'|:|'| +0#0000000&@38 -@1|:+0#af5f00255&| +0#0000000&|a|b|o|v|e|l|e|f|t| @6|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +@1>:| |a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@6|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 @2|:|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@6|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 @75 |:|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 @@ -17,4 +16,5 @@ |:|h+0#af5f00255&|i|d|e| +0#0000000&@13|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -@57|3|7|,|2| @9|2|6|%| +|:|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +@57|3|7|,|2| @9|1|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_03.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_03.dump index 6af289dec4..a287fad12f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_03.dump @@ -1,10 +1,9 @@ -|:+0&#ffffff0|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -|:|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +|:+0&#ffffff0|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@5|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 ->:|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -|:|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +|:|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +>:|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 @@ -17,4 +16,5 @@ |:|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -@57|5@1|,|1| @9|4|2|%| +@75 +@57|5@1|,|1| @9|1|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump index 53ac039c2d..381347259a 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump @@ -1,10 +1,9 @@ -|:+0&#ffffff0|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -@75 +| +0&#ffffff0@74 @75 |e+0#af5f00255&|c|h|o||+0#0000000&|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o||+0#0000000&| |a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 ->e+0#af5f00255&|c|h|o| +0#0000000&|||a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 -@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|||a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +> @74 |e+0#af5f00255&|c|h|o| +0#0000000&||| |a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 @@ -17,4 +16,5 @@ |e+0#af5f00255&|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 -@57|7|3|,|1| @9|5|7|%| +|e+0#af5f00255&|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@5|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +@57|7|3|,|0|-|1| @7|2@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump index 2f09531969..a05d373930 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump @@ -1,10 +1,9 @@ -|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@5|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@5|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |l+0#af5f00255&|e|g|a|c|y| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 ->e+0#af5f00255&|c|h|o| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@8|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +>e+0#af5f00255&|c|h|o| +0#0000000&||| |n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |s+0#af5f00255&|i|l|e|n|t| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 @@ -17,4 +16,5 @@ |e+0#af5f00255&|c|h|o| +0#0000000&||| |v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 @75 @75 -@57|9|1|,|1| @9|7|3|%| +|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|@+0#4040ff13&@2 +| +0#0000000&@56|9|1|,|1| @9|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump index 9b089ae2b0..afe497e623 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump @@ -1,10 +1,9 @@ -| +0&#ffffff0@74 -|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1 +|a+0#af5f00255#ffffff0|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1 |e|r|n|/+0#e000e06&| +0#0000000&|h+0#af5f00255&|i|d|e| +0#0000000&|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&|l+0#af5f00255&|e|g |a|c|y| +0#0000000&|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|t+0#af5f00255&|a|b| +0#0000000&|t+0#af5f00255&|o |p|l|e|f|t| +0#0000000&|u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@24 ->a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@65 -@6|\+0#e000e06&| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@56 +|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@65 +@6>\+0#e000e06&| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@56 @6|\+0#e000e06&| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@60 @6|\+0#e000e06&| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@59 @@ -17,4 +16,5 @@ @6|\+0#e000e06&| +0#0000000&|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@54 @6|\+0#e000e06&| +0#0000000&|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@57 -@57|1|0|6|,|1| @8|8|6|%| +@6|\+0#e000e06&| +0#0000000&|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@60 +@57|1|0|6|,|7| @8|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_07.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_07.dump index be01800d8b..e804e17894 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_07.dump @@ -1,10 +1,9 @@ -| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@57 -@6|\+0#e000e06&| +0#0000000&|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@60 +| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@60 @6|\+0#e000e06&| +0#0000000&|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@56 -@6>\+0#e000e06&| +0#0000000&|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@56 -@6|\+0#e000e06&| +0#0000000&|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@59 +@6|\+0#e000e06&| +0#0000000&|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@56 +@6>\+0#e000e06&| +0#0000000&|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@59 @6|\+0#e000e06&| +0#0000000&|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@60 @6|\+0#e000e06&| +0#0000000&|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@59 @6|\+0#e000e06&| +0#0000000&|t+0#af5f00255&|a|b| +0#0000000&@63 @@ -15,6 +14,7 @@ @6|\+0#e000e06&| +0#0000000&|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@59 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 @75 -|~+0#4040ff13&| @73 -|~| @73 -| +0#0000000&@56|1|2|4|,|7| @8|B|o|t| +@75 +|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@8|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@7|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +@57|1|2|4|,|7| @8|3|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump new file mode 100644 index 0000000000..1a20520f3b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump @@ -0,0 +1,20 @@ +|b+0#af5f00255#ffffff0|e|l|o|w|r|i|g|h|t| +0#0000000&@7|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +>f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|h+0#af5f00255&|i|d|e| +0#0000000&@13|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@8|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@8|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@5|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@8|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@11|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@8|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@8|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@7|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@7|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +@57|1|4|2|,|1| @8|4|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump new file mode 100644 index 0000000000..12ee320eb6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump @@ -0,0 +1,20 @@ +|s+0#af5f00255#ffffff0|a|n|d|b|o|x| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@11|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|t+0#af5f00255&|a|b| +0#0000000&@14|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +>u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@9|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@9|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +@75 +|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@8|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@7|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|h+0#af5f00255&|i|d|e| +0#0000000&@13|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +@57|1|6|0|,|1| @8|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_10.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_10.dump new file mode 100644 index 0000000000..664d81297d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_10.dump @@ -0,0 +1,20 @@ +|h+0#af5f00255#ffffff0|o|r|i|z|o|n|t|a|l| +0#0000000&@7|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@8|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@8|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@5|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +>l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@8|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@11|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@8|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@8|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@7|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@7|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@11|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|t+0#af5f00255&|a|b| +0#0000000&@14|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@9|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@9|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +@57|1|7|8|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump new file mode 100644 index 0000000000..e46b54724d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump @@ -0,0 +1,20 @@ +|v+0#af5f00255#ffffff0|e|r|t|i|c|a|l| +0#0000000&@9|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +@75 +@75 +|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|:|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|_+0#e000002&| +0#0000000&@58 +>s+0#af5f00255&|i|l|e|n|t| +0#0000000&|$+0#e000002&|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|_+0#e000002&| +0#0000000&@58 +|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|:|$+0#e000002&|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|_+0#e000002&| +0#0000000&@57 +@75 +|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&|'+0#e000002&|[|,+0#0000000&|'+0#e000002&|]|d+0#af5f00255&| +0#0000000&|_+0#e000002&| +0#0000000&@56 +@75 +|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&|%+0#e000002&|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|^|%|(|%|(@1|[|=|`|:|.|'|"|~|^|_|*|+|#|-|]|)|\|1|+|\|n|)|?|.|{|1|,|2|}|\|n|(|[|=|`|:|.|'|"|~|^|_|*|+ +|#|-|]|)|\|2|+|)|||%|(|%|(@1|[|=|`|:|.|'@1|"|~|^|_|*|+|#|-|]|)|\|3|{|2|,|}|\|n|)|?|.|{|3|,|}|\|n|(|[|=|`|:|.|'@1|"|~|^|_|*|+|#|-|]|)|\|4|{|2|,|}|)|$|/+0#e000e06& +|\+0#0000000&|=|c|l|o|s|u|r|e|.|P|r|o|c|e|s@1|(|s|u|b|m|a|t|c|h|(|0|)@1|/+0#e000e06&|g|n| +0#0000000&@41 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@75 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@61 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|c+0#af5f00255&|o|p|y| +0#0000000&@59 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@56 +@57|1|9|6|,|1| @8|6|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_12.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_12.dump new file mode 100644 index 0000000000..34dba883ed --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_12.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@56 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@54 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@54 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@52 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@59 +@2>s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@57 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@54 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@52 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@59 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@57 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@54 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@52 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|C|o|p|y| @61 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|C|o|p|y| @59 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|C|o|p|y|!+0#af5f00255&| +0#0000000&@60 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|C|o|p|y|!+0#af5f00255&| +0#0000000&@58 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@56 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@54 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@54 +@57|2|1|2|,|3| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_13.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_13.dump new file mode 100644 index 0000000000..de9a19e1a5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_13.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@54 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@52 +@75 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@60 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|c+0#af5f00255&|o|p|y| +0#0000000&@58 +@2>s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@55 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@53 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@53 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@51 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@58 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@56 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@53 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@58 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@56 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@53 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|C|o|p|y| @60 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|C|o|p|y| @58 +@57|2|3|0|,|3| @8|7|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump new file mode 100644 index 0000000000..70a17b4d38 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|C|o|p|y| @58 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|C|o|p|y|!+0#af5f00255&| +0#0000000&@59 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|C|o|p|y|!+0#af5f00255&| +0#0000000&@57 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@55 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@53 +@2>s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@53 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@51 +@75 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#af5f00255&|o|p|y| +0#0000000&@53 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#af5f00255&|o|p|y| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@48 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@57|2|4|8|,|3| @8|8|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump new file mode 100644 index 0000000000..f7f9d024f2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y| @53 +@2>f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y| @51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y|!+0#af5f00255&| +0#0000000&@52 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y|!+0#af5f00255&| +0#0000000&@50 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@48 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@75 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|o|p|y| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 +@57|2|6@1|,|3| @8|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump new file mode 100644 index 0000000000..f26a2f5f19 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@47 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@42 +@2>f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@47 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@42 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y| @51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y| @49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y|!+0#af5f00255&| +0#0000000&@50 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y|!+0#af5f00255&| +0#0000000&@48 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 +@75 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=| @57 +@57|2|8|4|,|3| @8|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_17.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_17.dump new file mode 100644 index 0000000000..b333c0cf66 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_17.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=| @57 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@47 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@44 +@2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|w|i|n|c|m|d| |=+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@54 +@75 +>e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +@75 +|"+0#0000e05&| |R|a|n|d|o|m| |t|e|s|t| |f|a|i|l|u|r|e|s| |-| |n|o|w| |f|i|x|e|d| +0#0000000&@40 +@75 +|"+0#0000e05&| |e|x|e| |i|s| |e|r@1|o|r| |h|i|g|h|i|g|h|t|e|d| +0#0000000&@49 +|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|e+0#af5f00255&|x|e| +0#0000000&|(+0#e000e06&|n+0#0000000&|r|++0#af5f00255&|1+0#e000002&|)+0#e000e06&| +0#0000000&|.+0#af5f00255&| +0#0000000&|'+0#e000002&|d| |_|'| +0#0000000&@48 +|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|e+0#af5f00255&|x|e| +0#0000000&|(+0#e000e06&|n+0#0000000&|r|++0#af5f00255&|1+0#e000002&|)+0#e000e06&| +0#0000000&|.+0#af5f00255&| +0#0000000&|'+0#e000002&|d| |_|'| +0#0000000&@46 +|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63 +@75 +|"+0#0000e05&| |e|x|e|c|u|t|e| |i|s| |c|o|m@1|a|n|d| |n|o|t| |f|u|n|c|t|i|o|n| +0#0000000&@41 +|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|(+0#e000e06&|n+0#0000000&|r|++0#af5f00255&|1+0#e000002&|)+0#e000e06&| +0#0000000&|.+0#af5f00255&| +0#0000000&|'+0#e000002&|d| |_|'| +0#0000000&@44 +|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 +@57|3|0|2|,|1| @8|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_18.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_18.dump new file mode 100644 index 0000000000..cb7394930a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_18.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&@60 +@2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&|(+0#e000e06&|n+0#0000000&|r|++0#af5f00255&|1+0#e000002&|)+0#e000e06&| +0#0000000&|.+0#af5f00255&| +0#0000000&|'+0#e000002&|d| |_|'| +0#0000000&@42 +|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|1|8|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump index f76ed95f83..66bd71d6bf 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_00.dump @@ -1,20 +1,20 @@ >"+0#0000e05#ffffff0| |E|x| |c|o|m@1|a|n|d|s| +0#0000000&@61 @75 @75 -|"+0#0000e05&| |S|T|A|R|T| |N|O|T| |M|A|T|C|H|E|D| +0#0000000&@55 -|:|N|e|x|t| @69 -|:|P|r|i|n|t| @68 -|:|X| @72 -|"+0#0000e05&| |E|N|D| |N|O|T| |M|A|T|C|H|E|D| +0#0000000&@57 -@75 |:|h+0#af5f00255&|e|l|p| +0#0000000&@69 @1|:|h+0#af5f00255&|e|l|p| +0#0000000&@68 |:| |h+0#af5f00255&|e|l|p| +0#0000000&@68 -@1|:+0#af5f00255&| +0#0000000&|h+0#00e0e07&|e|l|p| +0#0000000&|#| |F|I|X|M|E| @59 +@1|:| |h+0#af5f00255&|e|l|p| +0#0000000&@67 @75 +|:|&+0#af5f00255&| +0#0000000&@72 +|:|~+0#af5f00255&| +0#0000000&@72 |:|@+0#af5f00255&| +0#0000000&@72 +|"+0#0000e05&| |:|*| +0#0000000&@70 +|:|>+0#af5f00255&| +0#0000000&@72 +|:|<+0#af5f00255&| +0#0000000&@72 +|:|#+0#af5f00255&| +0#0000000&@72 +|:|=+0#af5f00255&| +0#0000000&@72 +|:|!+0#af5f00255&| +0#0000000&@72 @75 -|:+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 +|:|N+0#af5f00255&|e|x|t| +0#0000000&@69 @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 71de8142a6..587a6e59c6 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_01.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@74 -|:|@+0#af5f00255&| +0#0000000&@72 +|:+0&#ffffff0|<+0#af5f00255&| +0#0000000&@72 +|:|#+0#af5f00255&| +0#0000000&@72 +|:|=+0#af5f00255&| +0#0000000&@72 +|:|!+0#af5f00255&| +0#0000000&@72 @75 -|:+0#af5f00255&|a|p@1|e|n|d| +0#0000000&@67 +>:|N+0#af5f00255&|e|x|t| +0#0000000&@69 +|:|P+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|:|X+0#af5f00255&| +0#0000000&@72 +@75 +|:|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@67 | +0#e000002&@3|t|e|x|t| +0#0000000&@66 ->.+0#af5f00255&| +0#0000000&@73 +|.+0#af5f00255&| +0#0000000&@73 |:|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 |:|a+0#af5f00255&|m|e|n|u| +0#0000000&@68 |:|a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64 -|:|a+0#af5f00255&|r|g|s| +0#0000000&@69 |:|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@67 -|:|a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@64 -|:|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 @57|1|9|,|1| @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 98b142a75b..96e44a61ff 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_02.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@64 +|:+0&#ffffff0|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@67 +|:|a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@64 +|:|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@64 +|:|a+0#af5f00255&|r|g|d|o| +0#0000000&@68 +|:|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@66 +>:|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|s| +0#0000000&@69 |:|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|g|r|o|u|p| +0#0000000&|F|o@1| @62 +|:|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|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 -|:|b+0#af5f00255&|a|l@1| +0#0000000&@69 +|:|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@66 |:|b+0#af5f00255&|a|d@1| +0#0000000&@69 +|:|b+0#af5f00255&|a|l@1| +0#0000000&@69 |:|b+0#af5f00255&|a|l|t| +0#0000000&@69 |:|b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@66 |:|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 -|:|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 @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 fcedbfe3cc..a81a051558 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_03.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|b+0#af5f00255&|l|a|s|t| +0#0000000&@68 -|:|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@64 +|:+0&#ffffff0|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 +|:|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 |:|b+0#af5f00255&|n|e|x|t| +0#0000000&@68 +|:|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&|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|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 +|:|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66 |:|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@67 |:|b+0#af5f00255&|u|f|d|o| +0#0000000&@68 +|:|b+0#af5f00255&|u|f@1|e|r| +0#0000000&@67 |:|b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@66 -|:|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@66 -|:|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@65 -|:+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 -@57|5@1|,|1| @10|4|%| +@57|5@1|,|1| @10|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump index 2a4372e58f..c851e2f85c 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_04.dump @@ -1,9 +1,13 @@ -|:+0&#ffffff0|c+0#af5f00255&|N|e|x|t| +0#0000000&@68 -|:|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@67 +|:+0&#ffffff0|b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@66 +|:|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@66 +|:|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@65 +|:|c+0#af5f00255&|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&|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|d@1|b|u|f@1|e|r| +0#0000000&@63 +|:|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|f|i|l|e| +0#0000000&@65 |:|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@67 @@ -13,8 +17,4 @@ |:|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@67 |:|c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@66 |:|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66 -|:|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 @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 8c9b77acd6..6c12ac276d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_05.dump @@ -1,9 +1,13 @@ -|:+0&#ffffff0|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 +|:+0&#ffffff0|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66 +|:|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&|e|n|t|e|r| +0#0000000&@67 |:|c+0#af5f00255&|e|x|p|r| +0#0000000&@68 +|:|c+0#af5f00255&|f|d|o| +0#0000000&@69 |:|c+0#af5f00255&|f|i|l|e| +0#0000000&@68 ->:|c+0#af5f00255&|f|i|r|s|t| +0#0000000&@67 +|:|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|e|x|p|r| +0#0000000&@65 |:|c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@65 @@ -13,8 +17,4 @@ |:|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@64 |:|c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@65 |:|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|%| +@57|9|1|,|1| @10|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump index 368df373f9..f3567e280d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_06.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|c+0#af5f00255&|m|a|p| +0#0000000&@69 -|:|c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 +|:+0&#ffffff0|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 +>:|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|w|e|r| +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|e|x|t| +0#0000000&@68 +|:|c+0#af5f00255&|N|e|x|t| +0#0000000&@68 +|:|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|a|b@1|r|e|v| +0#0000000&@62 +|:|c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 |:|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64 -|:|c+0#af5f00255&|o|p|y| +0#0000000&@69 |:|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@67 |:|c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@62 -|:|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@66 |:|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@65 -|:|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 +|:|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@66 @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 7507a133fa..252b301f5d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_07.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|c+0#af5f00255&|o|p|e|n| +0#0000000&@68 -|:|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 +|:+0&#ffffff0|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@66 +|:|c+0#af5f00255&|o|m|p|i|l|e|r| +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|n|t|i|n|u|e| +0#0000000&@65 +>:|c+0#af5f00255&|o|p|e|n| +0#0000000&@68 +|:|c+0#af5f00255&|o|p|y| +0#0000000&@69 |:|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@67 +|:|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 |:|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 +|:|c+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 |:|c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 |:|c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@66 -|:|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@67 |:|d+0#af5f00255&|e|b|u|g| +0#0000000&@68 |:|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@62 -|:|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|%| +@57|1|2|7|,|1| @9|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump index 970062ec9d..3be431e2cf 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_08.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@62 +|:+0&#ffffff0|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@62 +|:|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|e|t|e| +0#0000000&@67 +|:|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|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 +|:|d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@63 |:|d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@65 -|:|d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@66 |:|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@62 +|:|d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@66 |:|d+0#af5f00255&|j|u|m|p| +0#0000000&@68 -|:|d+0#af5f00255&|l| +0#0000000&@71 -|:|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 6a8def6869..fb32dba6e4 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_09.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|d+0#af5f00255&|r|o|p| +0#0000000&@69 -|:|d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@66 +|:+0&#ffffff0|d+0#af5f00255&|j|u|m|p| +0#0000000&@68 +|:|d+0#af5f00255&|l|i|s|t| +0#0000000&@68 +|:|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@64 +|:|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@64 +|:|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&|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 |:|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@66 |:|e+0#af5f00255&|c|h|o|n| +0#0000000&@68 |:|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@63 +|:|e+0#af5f00255&|d|i|t| +0#0000000&@69 |:|e+0#af5f00255&|l|s|e| +0#0000000&@69 |:|e+0#af5f00255&|l|s|e|i|f| +0#0000000&@67 |:|e+0#af5f00255&|m|e|n|u| +0#0000000&@68 -|:|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 -@57|1|6|3|,|1| @8|1|3|%| +@57|1|6|3|,|1| @8|1|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump index 2a6deef87f..87283e7a41 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_10.dump @@ -1,9 +1,13 @@ -|:+0&#ffffff0|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 +|:+0&#ffffff0|e+0#af5f00255&|m|e|n|u| +0#0000000&@68 +|:|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@67 +|:|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|i|f| +0#0000000&@68 +>:|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|e|w| +0#0000000&@69 |:|e+0#af5f00255&|v|a|l| +0#0000000&@69 ->:|e+0#af5f00255&|x| +0#0000000&@71 +|:|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 |:|e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@66 @@ -11,10 +15,6 @@ |:|f+0#af5f00255&|i|l|e|s| +0#0000000&@68 |:|f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@65 |:|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 -|:|f+0#af5f00255&|i|r|s|t| +0#0000000&@68 -|:|f+0#af5f00255&|i|x|d|e|l| +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 a309127dcd..982ab9ce11 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_11.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_11.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|f+0#af5f00255&|i|x|d|e|l| +0#0000000&@67 -|:|f+0#af5f00255&|o|l|d| +0#0000000&@69 +|:+0&#ffffff0|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@66 +|:|f+0#af5f00255&|i|n|d| +0#0000000&@69 +|:|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|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|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|l|d@1|o@1|p|e|n| +0#0000000&@63 +|:|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@65 |:|f+0#af5f00255&|o|r| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@50 |:|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@65 -|:|g+0#af5f00255&|l|o|b|a|l|/|.+0#0000000&@2|/+0#af5f00255&| +0#0000000&@62 +|:|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@67 |:|g+0#af5f00255&|o|t|o| +0#0000000&@69 |:|g+0#af5f00255&|r|e|p| +0#0000000&@69 |:|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@66 |:|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 -|:|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 -@57|1|9@1|,|1| @8|1|6|%| +@57|1|9@1|,|1| @8|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump index 06203eb3fd..16d7990869 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_12.dump @@ -1,10 +1,14 @@ -|:+0&#ffffff0|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&|i|g|h|l|i|g|h|t| +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&|i|d|e| +0#0000000&@69 +|:|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@64 |:|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 +|:|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@63 +|:|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@67 | +0#e000002&@3|t|e|x|t| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 |:|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@66 @@ -13,8 +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 -|:|i+0#af5f00255&|m|p|o|r|t| +0#0000000&@67 -|:|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 @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 a9e23fb2e8..ba8019dfbe 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_13.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_13.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 +|:+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|a|b@1|r|e|v| +0#0000000&@62 +>:|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@65 |:|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&|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 +|:|i+0#af5f00255&|s|p|l|i|t| +0#0000000&@67 |:|i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@64 +|:|i+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 |:|i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 |:|j+0#af5f00255&|o|i|n| +0#0000000&@69 |:|j+0#af5f00255&|u|m|p|s| +0#0000000&@68 |:|k+0#af5f00255&| +0#0000000&@72 |:|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 -|:|l+0#af5f00255&|N|f|i|l|e| +0#0000000&@67 -|:|l+0#af5f00255&|i|s|t| +0#0000000&@69 -@57|2|3|5|,|1| @8|1|9|%| +|:|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@64 +@57|2|3|5|,|1| @8|1|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump index 26142ba640..010abdccfa 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_14.dump @@ -1,11 +1,12 @@ -|:+0&#ffffff0|l+0#af5f00255&|i|s|t| +0#0000000&@69 +|:+0&#ffffff0|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@64 +|:|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@61 |:|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|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 +|:|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@65 +>:|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|n|g|u|a|g|e| +0#0000000&@65 +|:|l+0#af5f00255&|a|s|t| +0#0000000&@69 |:|l+0#af5f00255&|a|t|e|r| +0#0000000&@68 |:|l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@66 |:|l+0#af5f00255&|b|e|l|o|w| +0#0000000&@67 @@ -16,5 +17,4 @@ |:|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 -@57|2|5|3|,|1| @8|2|0|%| +@57|2|5|3|,|1| @8|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump index 08cf8f7891..ef7b6adb12 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_15.dump @@ -1,9 +1,10 @@ -|:+0&#ffffff0|l+0#af5f00255&|f|d|o| +0#0000000&@69 +|:+0&#ffffff0|l+0#af5f00255&|d|o| +0#0000000&@70 |:|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|t| +0#0000000&@70 >:|l+0#af5f00255&|e|x|p|r| +0#0000000&@68 +|:|l+0#af5f00255&|f|d|o| +0#0000000&@69 |:|l+0#af5f00255&|f|i|l|e| +0#0000000&@68 |:|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@67 |:|l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@63 @@ -13,8 +14,7 @@ |:|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&|i|s|t| +0#0000000&@69 |:|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 -@57|2|7|1|,|1| @8|2@1|%| +@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 a9a77266b7..a8ab897a18 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_16.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_16.dump @@ -1,9 +1,13 @@ -|:+0&#ffffff0|l+0#af5f00255&|m|a|k|e| +0#0000000&@68 +|:+0&#ffffff0|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|c|l|e|a|r| +0#0000000&@64 +>:|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@67 |:|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|e|x|t| +0#0000000&@68 +|:|l+0#af5f00255&|n|f|i|l|e| +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 |"+0#0000e05&| |:|l|o|a|d|k|e|y|m|a|p| |"| |d|i|s|a|b|l|e|d| |-| |r|u|n|s| |u|n|t|i|l| |E|O|F| +0#0000000&@33 |:|l+0#af5f00255&|o|a|d|v|i|e|w| +0#0000000&@65 @@ -11,10 +15,6 @@ |:|l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@66 |:|l+0#af5f00255&|o|l|d|e|r| +0#0000000&@67 |:|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 -|:|l+0#af5f00255&|t|a|g| +0#0000000&@69 -|:|l+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 -@57|2|8|9|,|1| @8|2|3|%| +|:|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 +@57|2|8|9|,|1| @8|2@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump index 9f0186aaf6..4fca21bb1e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_17.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|l+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 +|:+0&#ffffff0|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 +|:|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|a| +0#0000000&@70 -|:|l+0#af5f00255&|u|a|d|o| +0#0000000&@68 +>:|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|n|m|a|p| +0#0000000&@67 |:|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&|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 -|:|m+0#af5f00255&|o|v|e| +0#0000000&@69 -|:|m+0#af5f00255&|a|r|k| +0#0000000&@69 |:|m+0#af5f00255&|a|k|e| +0#0000000&@69 |:|m+0#af5f00255&|a|p| +0#0000000&@70 |:|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@65 +|:|m+0#af5f00255&|a|r|k| +0#0000000&@69 |:|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 -|:|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 -@57|3|0|7|,|1| @8|2|5|%| +@57|3|0|7|,|1| @8|2|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump index ff65ca356b..e568d41882 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_18.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@64 +|:+0&#ffffff0|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|p|e|l@1| +0#0000000&@66 +>:|m+0#af5f00255&|k|v|i|e|w| +0#0000000&@67 |:|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 +|:|m+0#af5f00255&|o|v|e| +0#0000000&@69 |:|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@67 +|:|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@65 |:|n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@66 |:|n+0#af5f00255&|b|k|e|y| +0#0000000&@68 |:|n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@66 -|:|n+0#af5f00255&|e|x|t| +0#0000000&@69 |:|n+0#af5f00255&|e|w| +0#0000000&@70 +|:|n+0#af5f00255&|e|x|t| +0#0000000&@69 |:|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 -|:|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 -@57|3|2|5|,|1| @8|2|6|%| +@57|3|2|5|,|1| @8|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump index 2b91ce8c27..d0d4e5d222 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_19.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@66 +|:+0&#ffffff0|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|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|a|p| +0#0000000&@66 |:|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 +|:|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@63 |:|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@67 |:|n+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 |:|n+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 |:|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@65 -|:|o+0#af5f00255&|p|e|n| +0#0000000&@69 |:|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 -|:|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 -@57|3|4|3|,|1| @8|2|8|%| +@57|3|4|3|,|1| @8|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump index bf02f0157a..6d062fa14d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_20.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|o+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 -|:|o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@66 +|:+0&#ffffff0|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|e|n| +0#0000000&@69 +|:|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|e|n|u| +0#0000000&@66 |:|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 +|:|p+0#af5f00255&|c|l|o|s|e| +0#0000000&@67 |:|p+0#af5f00255&|e|d|i|t| +0#0000000&@68 |:|p+0#af5f00255&|e|r|l| +0#0000000&@69 -|:|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 -|:|p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@66 -|:|p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@66 -|:|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 |:|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 -@57|3|6|1|,|1| @8|2|9|%| +|:|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +@57|3|6|1|,|1| @8|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump index 2ee8d6fbdc..e4b43e1a68 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_21.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|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 +|:+0&#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|:|p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@66 +|:|p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@66 +|:|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&|s|e|a|r|c|h| +0#0000000&@66 |:|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 +|:|p+0#af5f00255&|t|j|u|m|p| +0#0000000&@67 |:|p+0#af5f00255&|t|l|a|s|t| +0#0000000&@67 |:|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@67 +|:|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@67 |:|p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@63 |:|p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@65 |:|p+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@65 |:|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 |:|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|d|o| +0#0000000&@69 -@57|3|7|9|,|1| @8|3|1|%| +@57|3|7|9|,|1| @8|3|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump index 376f35a219..d59cbce9ca 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_22.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|p+0#af5f00255&|y|d|o| +0#0000000&@69 +|:+0&#ffffff0|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|d|o| +0#0000000&@69 |:|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| +0#0000000&@67 +>:|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@66 |:|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@66 +|:|p+0#af5f00255&|y|x| +0#0000000&@70 |:|p+0#af5f00255&|y|x|d|o| +0#0000000&@68 ->:|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@66 +|:|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@66 +|:|q+0#af5f00255&|a|l@1| +0#0000000&@69 |:|q+0#af5f00255&|u|i|t| +0#0000000&@69 |:|q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@66 -|:|q+0#af5f00255&|a|l@1| +0#0000000&@69 |:|r+0#af5f00255&|e|a|d| +0#0000000&@69 |:|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|o| +0#0000000&@69 |:|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|t|a|b| +0#0000000&@68 -@57|3|9|7|,|1| @8|3|2|%| +@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 9c180652fd..c1f1f77a93 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_23.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_23.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|r+0#af5f00255&|e|t|a|b| +0#0000000&@68 -|:|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@67 +|:+0&#ffffff0|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|t|a|b| +0#0000000&@68 +>:|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 ->:|r+0#af5f00255&|u|b|y| +0#0000000&@69 +|:|r+0#af5f00255&|u|b|y| +0#0000000&@69 |:|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@67 |:|r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@65 |:|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 -|:|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|l@1| +0#0000000&@69 |:|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|N|e|x|t| +0#0000000&@67 -@57|4|1|5|,|1| @8|3|4|%| +@57|4|1|5|,|1| @8|3@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump index 1e45efe3c4..8a6dcd3092 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_24.dump @@ -1,13 +1,15 @@ -|:+0&#ffffff0|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@67 +|:+0&#ffffff0|s+0#af5f00255&|a|v|e|a|s| +0#0000000&@67 |:|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 >:|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@67 +|:|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@67 |:|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@63 |:|s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@65 -|:|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@62 +|:|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@66 |:|s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@59 +|:|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@62 |:|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 @@ -15,6 +17,4 @@ |:|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&|h|e|l@1| +0#0000000&@68 -@57|4|3@1|,|1| @8|3|5|%| +@57|4|3@1|,|1| @8|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_25.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_25.dump index 2c63093785..2fa44d7ed2 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&|h|e|l@1| +0#0000000&@68 -|:|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@67 +|:+0&#ffffff0|s+0#af5f00255&|f|i|n|d| +0#0000000&@68 +|:|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|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&|i|m|a|l|t| +0#0000000&@67 |:|s+0#af5f00255&|l|a|s|t| +0#0000000&@68 +|:|s+0#af5f00255&|l|e@1|p| +0#0000000&@68 |:|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 +|:|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&|p|e|l@1|d|u|m|p| +0#0000000&@64 -@57|4|5|1|,|1| @8|3|7|%| +@57|4|5|1|,|1| @8|3|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump index 147c58c75c..9cf9391c06 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_26.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@64 +|:+0&#ffffff0|s+0#af5f00255&|o|r|t| +0#0000000&@69 +|:|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|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|a|r|e| +0#0000000&@64 |:|s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@62 ->:|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@64 +|:|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@64 |:|s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@63 |:|s+0#af5f00255&|p|l|i|t| +0#0000000&@68 |:|s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 |:|s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@66 -|:|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|i|n|s|e|r|t| +0#0000000&@62 |:|s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@61 -|:|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|s|e|l|e|c|t| +0#0000000&@65 -|:|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@66 -@57|4|6|9|,|1| @8|3|8|%| +|:|s+0#af5f00255&|t|o|p| +0#0000000&@69 +|:|s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@63 +@57|4|6|9|,|1| @8|3|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump index db85b31e87..fe3f434398 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_27.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@66 +|:+0&#ffffff0|s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@63 +|:|s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@65 +|:|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@63 +|:|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|n|m|e|n|u| +0#0000000&@66 |:|s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@66 |:|s+0#af5f00255&|v|i|e|w| +0#0000000&@68 ->:|s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@65 +|:|s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@65 +|:|s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@65 |:|s+0#af5f00255&|y|n|t|a|x| +0#0000000&@67 |:|s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@66 -|:|s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@65 |:|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| +0#0000000&@70 |:|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|l|a|s|t| +0#0000000&@66 -|:|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@66 -@57|4|8|7|,|1| @8|4|0|%| +@57|4|8|7|,|1| @8|3|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump index 5d1200e6cb..f0fd3d4583 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_28.dump @@ -1,11 +1,13 @@ -|:+0&#ffffff0|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@66 +|:+0&#ffffff0|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|n|e|w| +0#0000000&@67 |:|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@66 +>:|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@66 |:|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@66 |:|t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@62 ->:|t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@64 +|:|t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@64 |:|t+0#af5f00255&|a|b|s| +0#0000000&@69 -|:|t+0#af5f00255&|a|b| +0#0000000&@70 |:|t+0#af5f00255&|a|g| +0#0000000&@70 |:|t+0#af5f00255&|a|g|s| +0#0000000&@69 |:|t+0#af5f00255&|c|d| +0#0000000&@70 @@ -15,6 +17,4 @@ |:|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&|f|i|r|s|t| +0#0000000&@67 -|:|t+0#af5f00255&|h|r|o|w| +0#0000000&@68 -@57|5|0|5|,|1| @8|4|1|%| +@57|5|0|5|,|1| @8|4|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump index 1b9117b388..24131c2c26 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_29.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|t+0#af5f00255&|h|r|o|w| +0#0000000&@68 +|:+0&#ffffff0|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&|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 +>:|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@67 |:|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@63 ->:|t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@65 -|:|t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 +|:|t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@65 |:|t+0#af5f00255&|m|a|p| +0#0000000&@69 +|:|t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 |:|t+0#af5f00255&|m|e|n|u| +0#0000000&@68 |:|t+0#af5f00255&|n|e|x|t| +0#0000000&@68 +|:|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 |:|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|e|n|u| +0#0000000&@66 -|:|u+0#af5f00255&|n|d|o| +0#0000000&@69 -@57|5|2|3|,|1| @8|4|3|%| +@57|5|2|3|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_30.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_30.dump index 5bcbeef9af..b4ad634e03 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|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 +|:+0&#ffffff0|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|e|n|u| +0#0000000&@66 |:|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@61 ->:|u+0#af5f00255&|n|h|i|d|e| +0#0000000&@67 +|:|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|h|i|d|e| +0#0000000&@67 |:|u+0#af5f00255&|n|i|q| +0#0000000&@69 |:|u+0#af5f00255&|n|l|e|t| +0#0000000&@68 |:|u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@64 @@ -11,10 +13,8 @@ |:|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&|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|s|i|o|n| +0#0000000&@66 |:|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|g|r|e|p| +0#0000000&@66 -@57|5|4|1|,|1| @8|4@1|%| +|:|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@66 +@57|5|4|1|,|1| @8|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_31.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_31.dump index 5abc5ab7f4..2306e2d2de 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&|i|m|g|r|e|p| +0#0000000&@66 +|:+0&#ffffff0|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@66 +|:|v+0#af5f00255&|i|e|w| +0#0000000&@69 +|:|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@66 +|:|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 +>:|v+0#af5f00255&|i|s|u|a|l| +0#0000000&@67 |:|v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@66 -|:|v+0#af5f00255&|i|e|w| +0#0000000&@69 ->:|v+0#af5f00255&|m|a|p| +0#0000000&@69 +|:|v+0#af5f00255&|m|a|p| +0#0000000&@69 |:|v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 |:|v+0#af5f00255&|m|e|n|u| +0#0000000&@68 |:|v+0#af5f00255&|n|e|w| +0#0000000&@69 @@ -12,9 +14,7 @@ |:|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&|N|e|x|t| +0#0000000&@68 |:|w+0#af5f00255&|a|l@1| +0#0000000&@69 |:|w+0#af5f00255&|h|i|l|e| +0#0000000&@68 -@57|5@1|9|,|1| @8|4|6|%| +|:|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@67 +@57|5@1|9|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump index 8ec5f2f9a5..c3648b87bb 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_32.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|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 +|:+0&#ffffff0|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@67 +|:|w+0#af5f00255&|i|n|d|o| +0#0000000&@68 |:|w+0#af5f00255&|i|n|p|o|s| +0#0000000&@67 +|:|w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@66 |:|w+0#af5f00255&|n|e|x|t| +0#0000000&@68 ->:|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 +>:|w+0#af5f00255&|N|e|x|t| +0#0000000&@68 +|:|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@64 |:|w+0#af5f00255&|q| +0#0000000&@71 |:|w+0#af5f00255&|q|a|l@1| +0#0000000&@68 +|:|w+0#af5f00255&|r|i|t|e| +0#0000000&@68 |:|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 +|:|x+0#af5f00255&|i|t| +0#0000000&@70 |:|x+0#af5f00255&|m|a|p| +0#0000000&@69 +|:|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@64 |:|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&|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&|u|n|m|a|p| +0#0000000&@67 -@57|5|7@1|,|1| @8|4|7|%| +@57|5|7@1|,|1| @8|4|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump index cc321b4ecb..2a33629444 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_33.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|x+0#af5f00255&|u|n|m|a|p| +0#0000000&@67 +|:+0&#ffffff0|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@64 +|:|x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@65 +|:|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 -|:|z+0#af5f00255&| +0#0000000&@72 +>:|z+0#af5f00255&| +0#0000000&@72 @75 ->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)||+0#0000000&|h+0#af5f00255&|e|l|p| +0#0000000&@59 -|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| +0#0000000&@59 |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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |h+0#af5f00255&|e|l|p| +0#0000000&@57 +@75 +|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| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&|||:| |h+0#af5f00255&|e|l|p| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:| |h+0#af5f00255&|e|l|p| +0#0000000&@55 @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 -|.+0#af5f00255&| +0#0000000&@73 -|c+0#00e0e07&|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&|m|e|n|u| +0#0000000&@56 -@57|5|9|5|,|1| @8|4|9|%| +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |&+0#af5f00255&| +0#0000000&@60 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |~+0#af5f00255&| +0#0000000&@60 +@57|5|9|5|,|1| @8|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump index bb2242efa2..850ae4fa85 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_34.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|a|d@1| +0#0000000&@55 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@52 ->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@52 -|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 -|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|d@1| +0#0000000&@57 -@57|6|1|3|,|1| @8|5|0|%| +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |~+0#af5f00255&| +0#0000000&@60 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |@+0#af5f00255&| +0#0000000&@60 +|"+0#0000e05&| |c|a|l@1| |F|o@1|(|)| ||| |:|*| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |>+0#af5f00255&| +0#0000000&@60 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |<+0#af5f00255&| +0#0000000&@60 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |#+0#af5f00255&| +0#0000000&@60 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |=+0#af5f00255&| +0#0000000&@60 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |!+0#af5f00255&| +0#0000000&@60 +@75 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |N+0#af5f00255&|e|x|t| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |P+0#af5f00255&|r|i|n|t| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |X+0#af5f00255&| +0#0000000&@60 +@75 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|p@1|e|n|d| +0#0000000&@55 +| +0#e000002&@3|t|e|x|t| +0#0000000&@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 +@57|6|1|3|,|1| @8|4|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump index 64447816b8..09acaaf2fe 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_35.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@49 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@49 ->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@51 -|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 -|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&|u|f|d|o| +0#0000000&@56 -@57|6|3|1|,|1| @8|5|2|%| +|c+0#af5f00255#ffffff0|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&|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|a|d@1| +0#0000000&@55 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@52 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@52 +|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|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@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|s| +0#0000000&@57 +|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|g|r|o|u|p| +0#0000000&|F|o@1| @50 +|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&|E|N|D| @50 +|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&||| |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&||| |b+0#af5f00255&|a|d@1| +0#0000000&@57 +@57|6|3|1|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump index 031dcb1588..bf04389b89 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_36.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@53 -|"+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&||| |c|h|a|n|g|e| @55 -@4|t|e|x|t| @66 -|.+0#af5f00255&| +0#0000000&@73 -|c+0#00e0e07&|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|t|c|h| +0#0000000&@56 -@57|6|4|9|,|1| @8|5|3|%| +|c+0#af5f00255#ffffff0|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@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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@49 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@49 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@51 +|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&|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|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|e|w|i|n|d| +0#0000000&@54 +@57|6|4|9|,|1| @8|5|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump index 739767ea0c..8459d99239 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_37.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+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&||| |c+0#af5f00255&@1| +0#0000000&@59 -|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 -|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|d|i|r| +0#0000000&@56 -@57|6@1|7|,|1| @8|5@1|%| +|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|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| +0#0000000&@55 +|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |b+0#af5f00255&|w|i|p|e|o|u|t| +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| +0#0000000&@55 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|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|t|c|h| +0#0000000&@56 +@57|6@1|7|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump index 0ee37ba1da..7bd70a9afc 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_38.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+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&||| |c+0#af5f00255&|l|a|s|t| +0#0000000&@56 ->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 -|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&|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 -@57|6|8|5|,|1| @8|5|7|%| +|c+0#af5f00255#ffffff0|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+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&||| |c+0#af5f00255&@1| +0#0000000&@59 +|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&|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|d|o| +0#0000000&@57 +|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|d|i|r| +0#0000000&@56 +@57|6|8|5|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump index 71e0796dce..11c6f85d90 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_39.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|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&|o|m|p|i|l|e|r| +0#0000000&@53 ->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 -|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|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 -@57|7|0|3|,|1| @8|5|8|%| +|c+0#af5f00255#ffffff0|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+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&||| |c+0#af5f00255&|l|a|s|t| +0#0000000&@56 +>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|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|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|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&|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|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|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|m|e|n|u| +0#0000000&@52 +@57|7|0|3|,|1| @8|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump index 1a5394dd17..f2f6d08ffa 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_40.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@50 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f| +0#0000000&@58 ->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 -|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|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 -@57|7|2|1|,|1| @8|6|0|%| +|c+0#af5f00255#ffffff0|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|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&|o|m@1|a|n|d| +0#0000000&@54 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c+0#af5f00255&|o|m|p|i|l|e|r| +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|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|p|e|n| +0#0000000&@56 +|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&|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&|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&|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|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|a|p| +0#0000000&@55 +@57|7|2|1|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump index 9586e55504..2dc2dbf105 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_41.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|j|u|m|p| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|l| +0#0000000&@59 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|l|i|s|t| +0#0000000&@56 ->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 -|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|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 -@57|7|3|9|,|1| @8|6|1|%| +|c+0#af5f00255#ffffff0|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|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|b|u|g| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@50 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|e|f| +0#0000000&@58 +|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|e|t|e| +0#0000000&@55 +|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|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|u|p|d|a|t|e| +0#0000000&@51 +@57|7|3|9|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump index 058fc102b7..a0c62061fe 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_42.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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#ffffff0|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|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|a|s@1|e|m|b|l|e| +0#0000000&@50 +|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&|j|u|m|p| +0#0000000&@56 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |d+0#af5f00255&|l|i|s|t| +0#0000000&@56 +|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&|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&|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&|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e| +0#0000000&@57 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e|i|f| +0#0000000&@55 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|m|e|n|u| +0#0000000&@56 ->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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|s| +0#0000000&@56 -@57|7|5|7|,|1| @8|6|3|%| +@57|7|5|7|,|1| @8|6|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump index 736510c9ae..84bf53d7d6 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_43.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|s| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@53 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r| +0#0000000&@55 -|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 -|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&|f+0#00e0e07&|o@1| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@38 -|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p| +0#0000000&@57 -@57|7@1|5|,|1| @8|6|4|%| +|c+0#af5f00255#ffffff0|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 +|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&|l|s|e| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|l|s|e|i|f| +0#0000000&@55 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e+0#af5f00255&|m|e|n|u| +0#0000000&@56 +>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|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|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|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|s| +0#0000000&@56 +@57|7@1|5|,|1| @8|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump index 9e5160d460..db7389a2ea 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_44.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p| +0#0000000&@57 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|u|i| +0#0000000&@58 -|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 -|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 -|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 -|c+0#00e0e07&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@54 -@57|7|9|3|,|1| @8|6@1|%| +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|s| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@53 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r| +0#0000000&@55 +|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|d| +0#0000000&@57 +|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|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@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|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&|f+0#00e0e07&|o@1| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@38 +|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&@55 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|o|t|o| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p| +0#0000000&@57 +@57|7|9|3|,|1| @8|6|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump index 135407e8ce..7ef0784a7b 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_45.dump @@ -1,20 +1,20 @@ -|c+0#00e0e07#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@54 +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |g+0#af5f00255&|u|i| +0#0000000&@58 +|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 +|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|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+0#af5f00255&|n|s|e|r|t| +0#0000000&@55 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+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&||| |i+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&||| |i+0#af5f00255&|f| +0#0000000&@59 -|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 -|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&|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|o|i|n| +0#0000000&@57 -@57|8|1@1|,|1| @8|6|7|%| +@57|8|1@1|,|1| @8|6|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump index 2dc666444f..f56b99fb29 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_46.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|o|i|n| +0#0000000&@57 +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i+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&||| |i+0#af5f00255&|f| +0#0000000&@59 +|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|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|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|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&|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|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|m|e|n|u| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|o|i|n| +0#0000000&@57 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|u|m|p|s| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&@60 -|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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@54 -@57|8|2|9|,|1| @8|6|9|%| +@57|8|2|9|,|1| @8|6@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump index b5426c5b45..0709dc9a3f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_47.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@54 +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |j+0#af5f00255&|u|m|p|s| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&@60 +|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|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|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@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&|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|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|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|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|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|s|t| +0#0000000&@57 +|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+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&||| |l+0#af5f00255&|b|e|l|o|w| +0#0000000&@55 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@54 |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 -|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&|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@53 -@57|8|4|7|,|1| @8|7|0|%| +@57|8|4|7|,|1| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump index 6c3ee2f4de..1346b906b4 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_48.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@53 +|c+0#af5f00255#ffffff0|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&|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&|f|d|o| +0#0000000&@57 +|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+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&||| |l+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&||| |l+0#af5f00255&|g|r|e|p| +0#0000000&@56 |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 -|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|o|r|e|m|a|p| +0#0000000&@53 -|"+0#0000e05&| |c|a|l@1| |F|o@1|(|)| ||| |l|o|a|d|k|e|y|m|a|p| |"| |d|i|s|a|b|l|e|d| |-| |r|u|n|s| |u|n|t|i|l| |E|O|F| +0#0000000&@21 -|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@52 -@57|8|6|5|,|1| @8|7|2|%| +@57|8|6|5|,|1| @8|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump index 5e7527e119..cbc36543b6 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_49.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@52 +|c+0#af5f00255#ffffff0|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&|i|s|t| +0#0000000&@57 +|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|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|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|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&|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 +|"+0#0000e05&| |:|l|o|a|d|k|e|y|m|a|p| |"| |d|i|s|a|b|l|e|d| |-| |r|u|n|s| |u|n|t|i|l| |E|O|F| +0#0000000&@33 +|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@52 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+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&||| |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 -|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&|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|k|e| +0#0000000&@57 -@57|8@1|3|,|1| @8|7|3|%| +@57|8@1|3|,|1| @8|7|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump index 13d729c01d..4bb3885709 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_50.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|k|e| +0#0000000&@57 +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |l+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&||| |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|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&|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&|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|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&|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&|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&|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&|a|k|e| +0#0000000&@57 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|p| +0#0000000&@58 |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 -|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&|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|k|e|y| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@54 -@57|9|0|1|,|1| @8|7|5|%| +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&@57 +@57|9|0|1|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump index 643459ba1e..bf6335b3c8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_51.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|e|x|t| +0#0000000&@57 +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&@57 +|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 +|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|e|w| +0#0000000&@55 +|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&|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|v|e| +0#0000000&@57 +|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&||| |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&||| |n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|k|e|y| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@54 |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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+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&|l|d|f|i|l|e|s| +0#0000000&@53 -@57|9|1|9|,|1| @8|7|6|%| +@57|9|1|9|,|1| @8|7|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump index 64f99821cd..83bb6845af 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_52.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@53 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |o+0#af5f00255&|p|e|n| +0#0000000&@57 +|c+0#af5f00255#ffffff0|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&|e|x|t| +0#0000000&@57 +|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 +|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|a|p| +0#0000000&@54 +|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |n+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&|l|d|f|i|l|e|s| +0#0000000&@53 |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 -|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&|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|i|n|t| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@54 -@57|9|3|7|,|1| @8|7|8|%| +@57|9|3|7|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump index 5e3d63d7f9..bcc85b4087 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_53.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|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&|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#ffffff0|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|e|n| +0#0000000&@57 +|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&|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 |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| +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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@51 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@53 -@57|9|5@1|,|1| @8|7|9|%| +@57|9|5@1|,|1| @8|7|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump index da5b8ab7a1..6b1883a168 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_54.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@53 +|c+0#af5f00255#ffffff0|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&|r|i|n|t| +0#0000000&@56 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|r|o|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&|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&|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|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 +|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|p|r|e|v|i|o|u|s| +0#0000000&@51 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@53 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+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&||| |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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|a|l@1| +0#0000000&@57 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|a|d| +0#0000000&@57 -@57|9|7|3|,|1| @8|8|1|%| +@57|9|7|3|,|1| @8|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump index 736a9c5094..638996717b 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_55.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|a|d| +0#0000000&@57 +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p+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&||| |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|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|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|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|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|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| +0#0000000&@58 +|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&|a|l@1| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|e|a|d| +0#0000000&@57 |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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@53 -|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 -@57|9@1|1|,|1| @8|8|2|%| +@57|9@1|1|,|1| @8|7|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump index 86f8660aba..d7ed4d969b 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_56.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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#ffffff0|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|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|o| +0#0000000&@57 +|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@53 +|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&||| |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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@53 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@50 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@47 -@57|1|0@1|9|,|1| @7|8|4|%| +@57|1|0@1|9|,|1| @7|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump index 71b504ea1b..1a6a8e62ce 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_57.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@47 +|c+0#af5f00255#ffffff0|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&||| |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|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|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|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|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@53 +|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&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@47 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@50 |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 -|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&|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&||| |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 -@57|1|0|2|7|,|1| @7|8|5|%| +@57|1|0|2|7|,|1| @7|8|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_58.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_58.dump index 6753a5100a..368b626cbe 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&|m|a|p|c|l|e|a|r| +0#0000000&@52 +|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|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|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&|l|a|s|t| +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&@56 +|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&||| |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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|l|i|t| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+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&||| |s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@54 -@57|1|0|4|5|,|1| @7|8|7|%| +|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 +@57|1|0|4|5|,|1| @7|8|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump index 57073b2e25..4b0c086d65 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_59.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+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&||| |s+0#af5f00255&|t|o|p| +0#0000000&@57 +|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|p|l|i|t| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+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&||| |s+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&||| |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|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|a|x| +0#0000000&@55 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@54 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@53 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&| +0#0000000&@60 -@57|1|0|6|3|,|1| @7|8@1|%| +|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 +@57|1|0|6|3|,|1| @7|8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump index b230033778..e11abf3b9d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_60.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|s| +0#0000000&@57 +|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|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|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|o|p| +0#0000000&@57 +|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|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|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|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@53 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|a|x| +0#0000000&@55 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@54 +|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&|a|b| +0#0000000&@58 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g| +0#0000000&@58 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g|s| +0#0000000&@57 -@57|1|0|8|1|,|1| @7|9|0|%| +|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 +@57|1|0|8|1|,|1| @7|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump index ffc8eab758..0f539636cf 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_61.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g|s| +0#0000000&@57 +|c+0#af5f00255#ffffff0|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|b|s| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|a|g| +0#0000000&@58 +|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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+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&||| |t+0#af5f00255&|m|a|p| +0#0000000&@57 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|e|n|u| +0#0000000&@56 -|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 -@57|1|0|9@1|,|1| @7|9|1|%| +@57|1|0|9@1|,|1| @7|8@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump index 54d4e484e9..df0ef1ad25 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_62.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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#ffffff0|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|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 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+0#af5f00255&|m|a|p| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t+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&||| |t+0#af5f00255&|m|e|n|u| +0#0000000&@56 +|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|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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|i|q| +0#0000000&@57 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|e|t| +0#0000000&@56 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@52 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|a|p| +0#0000000&@56 -@57|1@2|7|,|1| @7|9|3|%| +@57|1@2|7|,|1| @7|8|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump index 5d3070de16..ca5ae85708 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_63.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|a|p| +0#0000000&@56 +|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|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|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|h|i|d|e| +0#0000000&@55 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|i|q| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|e|t| +0#0000000&@56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@52 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |u+0#af5f00255&|n|m|a|p| +0#0000000&@56 |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&|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|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|m|a|p| +0#0000000&@57 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+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&||| |v+0#af5f00255&|m|e|n|u| +0#0000000&@56 -|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 -@57|1@1|3|5|,|1| @7|9|4|%| +@57|1@1|3|5|,|1| @7|9|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump index 64c9f4dc3d..c6d4d9cc15 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_64.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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#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&|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|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|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&|g|l|o|b|a|l| +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 +|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|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|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&|m|a|p| +0#0000000&@57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+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&||| |v+0#af5f00255&|m|e|n|u| +0#0000000&@56 +|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 -|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|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 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+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&||| |w+0#af5f00255&|q| +0#0000000&@59 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|q|a|l@1| +0#0000000&@56 -|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 -@57|1@1|5|3|,|1| @7|9|6|%| +@57|1@1|5|3|,|1| @7|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump index 51b2aa18f2..0c84f6d936 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_65.dump @@ -1,20 +1,20 @@ -|c+0#af5f00255#ffffff0|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#ffffff0|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&|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|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|d|o| +0#0000000&@56 +|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&|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&|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&|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&|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&||| |w+0#af5f00255&|q| +0#0000000&@59 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |w+0#af5f00255&|q|a|l@1| +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&|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&|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&|i|t| +0#0000000&@58 |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 -@75 -@75 -|"+0#0000e05&| |V|i|m|9|-|s|c|r|i|p|t| |o|n|l|y| +0#0000000&@56 -@75 -|:|a|b|s|t|r|a|c|t| @65 -|:|c|l|a|s@1| @68 -@57|1@1|7|1|,|1| @7|9|7|%| +@57|1@1|7|1|,|1| @7|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump index ab374c22c7..7aa719924e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_66.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|c|l|a|s@1| @68 +|c+0#af5f00255#ffffff0|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|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|e|n|u| +0#0000000&@56 +|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&|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&|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 +@75 +|"+0#0000e05&| |V|i|m|9|-|s|c|r|i|p|t| |o|n|l|y| +0#0000000&@56 +@75 +|:|a|b|s|t|r|a|c|t| @65 +|:|c|l|a|s@1| @68 |:|e|n|d|c|l|a|s@1| @65 |:|e|n|d|i|n|t|e|r|f|a|c|e| @61 |:|e|n|d|e|n|u|m| @66 |:|e|n|u|m| @69 ->:|e|x|p|o|r|t| @67 -|:|f+0#af5f00255&|i|n|a|l| +0#0000000&@68 -|:|i|n|t|e|r|f|a|c|e| @64 -|:|p|u|b|l|i|c| @67 -|:|s|t|a|t|i|c| @67 -|:|t|y|p|e| @69 -|:|v+0#af5f00255&|a|r| +0#0000000&@70 -@75 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a|b|s|t|r|a|c|t| @58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c|l|a|s@1| @61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|c|l|a|s@1| @58 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|e|n|u|m| @59 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|i|n|t|e|r|f|a|c|e| @54 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|u|m| @62 -@57|1@1|8|9|,|1| @7|9@1|%| +@57|1@1|8|9|,|1| @7|9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_67.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_67.dump index 7677b76cb1..080b066180 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_commands_67.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_67.dump @@ -1,20 +1,20 @@ -|F+0&#ffffff0|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|u|m| @62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|x|p|o|r|t| @60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |f+0#af5f00255&|i|n|a|l| +0#0000000&@61 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |i|n|t|e|r|f|a|c|e| @57 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p|u|b|l|i|c| @60 ->F|o@1|(+0#e000e06&|)| +0#0000000&||| |s|t|a|t|i|c| @60 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t|y|p|e| @62 -|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|a|r| +0#0000000&@63 +|:+0&#ffffff0|e|n|u|m| @69 +|:|e|x|p|o|r|t| @67 +|:|f+0#af5f00255&|i|n|a|l| +0#0000000&@68 +|:|i|n|t|e|r|f|a|c|e| @64 +|:|p|u|b|l|i|c| @67 +>:|s|t|a|t|i|c| @67 +|:|t|y|p|e| @69 +|:|v+0#af5f00255&|a|r| +0#0000000&@70 @75 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|2|0|7|,|1| @7|B|o|t| +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |a|b|s|t|r|a|c|t| @53 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |c|l|a|s@1| @56 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|c|l|a|s@1| @53 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|e|n|u|m| @54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|d|i|n|t|e|r|f|a|c|e| @49 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|n|u|m| @57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |e|x|p|o|r|t| @55 +|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&||| |i|n|t|e|r|f|a|c|e| @52 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p|u|b|l|i|c| @55 +@57|1|2|0|7|,|1| @7|9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_68.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_68.dump new file mode 100644 index 0000000000..d9e838480c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_68.dump @@ -0,0 +1,20 @@ +|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |p|u|b|l|i|c| @55 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s|t|a|t|i|c| @55 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |t|y|p|e| @57 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |v+0#af5f00255&|a|r| +0#0000000&@58 +@75 +> @74 +|"+0#0000e05&| |U|s|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@59 +@75 +|F|o@1|b|a|r| @68 +|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@67 +|F|o@1|b|a|r|1|2|3| @65 +|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@64 +|F|o@1|1|2|3|b|a|r| @65 +|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@64 +@75 +|:|F|o@1|b|a|r| @67 +|:|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@66 +|:|F|o@1|b|a|r|1|2|3| @64 +|:|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@63 +@57|1|2@1|5|,|0|-|1| @5|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_69.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_69.dump new file mode 100644 index 0000000000..9fe2e4a4af --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_69.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@63 +|:|F|o@1|1|2|3|b|a|r| @64 +|:|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@63 +@75 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r| @55 +>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r|1|2|3| @52 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@51 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|1|2|3|b|a|r| @52 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@51 +@75 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r| @54 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r|!+0#af5f00255&| +0#0000000&@53 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r|1|2|3| @51 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@50 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|1|2|3|b|a|r| @51 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|F|o@1|1|2|3|b|a|r|!+0#af5f00255&| +0#0000000&@50 +@75 +|~+0#4040ff13&| @73 +| +0#0000000&@56|1|2|4|3|,|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_01.dump b/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_01.dump index a850ee8b68..7c400296fe 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_01.dump @@ -10,11 +10,11 @@ @75 |d+0#af5f00255&|e|f| +0#0000000&|B|a|r|(+0#e000e06&|)| +0#0000000&@65 @2|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@61 -@2|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@60 +@2|:|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@59 @75 @2|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@1|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@50 -@2|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@50 +@2|:|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@49 @75 @2|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47 -@2|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47 +@2|:|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 @57|1|9|,|0|-|1| @7|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_02.dump b/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_02.dump index 357f8bb297..6d02ecdc2f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_debuggreedy_02.dump @@ -1,4 +1,4 @@ -| +0&#ffffff0@1|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47 +| +0&#ffffff0@1|:|0+0#e000002&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 > @74 |~+0#4040ff13&| @73 diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_nested_00.dump b/runtime/syntax/testdir/dumps/vim_ex_def_nested_00.dump index 96d4c98004..adb84e6463 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_def_nested_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_def_nested_00.dump @@ -15,6 +15,6 @@ @12|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|G|i|v|e|N|a|m|e|(+0#e000e06&|)| +0#0000000&@45 @8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60 @75 -| +0#00e0e07&@7|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|n+0#00e0e07&|a|m|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|N|a|m|e|(+0#e000e06&|)| +0#0000000&@48 +@8|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|n+0#00e0e07&|a|m|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|N|a|m|e|(+0#e000e06&|)| +0#0000000&@48 @4|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@64 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_nested_01.dump b/runtime/syntax/testdir/dumps/vim_ex_def_nested_01.dump index 473be656e8..e2811207e0 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_def_nested_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_def_nested_01.dump @@ -2,7 +2,7 @@ @12|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|G|i|v|e|N|a|m|e|(+0#e000e06&|)| +0#0000000&@45 @8|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@60 @75 -| +0#00e0e07&@7|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|n+0#00e0e07&|a|m|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|N|a|m|e|(+0#e000e06&|)| +0#0000000&@48 +@8|t+0#0000001#ffff4012|h|i|s|.+0#0000000#ffffff0|n+0#00e0e07&|a|m|e| +0#0000000&|=+0#af5f00255&| +0#0000000&|N|a|m|e|(+0#e000e06&|)| +0#0000000&@48 @4>e+0#af5f00255&|n|d@1|e|f| +0#0000000&@64 |e+0#af5f00255&|n|d|c|l|a|s@1| +0#0000000&@66 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_00.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_00.dump new file mode 100644 index 0000000000..e7149d123e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|d|e|l|e|t|e| |c|o|m@1|a|n|d| +0#0000000&@53 +@75 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@68 +@75 +@75 +|"+0#0000e05&| |p|r|i|n|t| |f|l|a|g|s| +0#0000000&@61 +@75 +@75 +|"+0#0000e05&| |:|d|e|l|e|t|e| ||| |:|l|i|s|t| +0#0000000&@57 +@75 +|d+0#af5f00255&|l+0#e000e06&| +0#0000000&@72 +|d+0#af5f00255&|e|l| +0#0000000&@4|"+0#0000e05&| |:|d|e|l|e|t|e| |o|n|l|y| +0#0000000&@52 +|d+0#af5f00255&|e|l|l+0#e000e06&| +0#0000000&@70 +|d+0#af5f00255&|e|l|e|l+0#e000e06&| +0#0000000&@69 +|d+0#af5f00255&|e|l|e|t|l+0#e000e06&| +0#0000000&@68 +|d+0#af5f00255&|e|l|e|t|e|l+0#e000e06&| +0#0000000&@67 +@75 +|"+0#0000e05&| |:|d|e|l|e|t|e| ||| |:|p|r|i|n|t| +0#0000000&@56 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_01.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_01.dump new file mode 100644 index 0000000000..67cc272be1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_01.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|e|l|l+0#e000e06&| +0#0000000&@70 +|d+0#af5f00255&|e|l|e|l+0#e000e06&| +0#0000000&@69 +|d+0#af5f00255&|e|l|e|t|l+0#e000e06&| +0#0000000&@68 +|d+0#af5f00255&|e|l|e|t|e|l+0#e000e06&| +0#0000000&@67 +@75 +>"+0#0000e05&| |:|d|e|l|e|t|e| ||| |:|p|r|i|n|t| +0#0000000&@56 +@75 +|d+0#af5f00255&|p+0#e000e06&| +0#0000000&@72 +|d+0#af5f00255&|e|p+0#e000e06&| +0#0000000&@71 +|d+0#af5f00255&|e|l|p+0#e000e06&| +0#0000000&@70 +|d+0#af5f00255&|e|l|e|p+0#e000e06&| +0#0000000&@69 +|d+0#af5f00255&|e|l|e|t|p+0#e000e06&| +0#0000000&@68 +|d+0#af5f00255&|e|l|e|t|e|p+0#e000e06&| +0#0000000&@67 +@75 +|"+0#0000e05&| |:|d|e|l|e|t|e| ||| |:|n|u|m|b|e|r| +0#0000000&@55 +@75 +|d+0#af5f00255&|#+0#e000e06&| +0#0000000&@72 +|d+0#af5f00255&|e|#+0#e000e06&| +0#0000000&@71 +|d+0#af5f00255&|e|l|#+0#e000e06&| +0#0000000&@70 +@57|1|9|,|1| @9|1|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_02.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_02.dump new file mode 100644 index 0000000000..dd0c75d56d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_02.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|e|l|#+0#e000e06&| +0#0000000&@70 +|d+0#af5f00255&|e|l|e|#+0#e000e06&| +0#0000000&@69 +|d+0#af5f00255&|e|l|e|t|#+0#e000e06&| +0#0000000&@68 +|d+0#af5f00255&|e|l|e|t|e|#+0#e000e06&| +0#0000000&@67 +@75 +>"+0#0000e05&| |a|f|t|e|r| |r|e|g|i|s|t|e|r| |a|n|d| |c|o|u|n|t| |a|r|g|s| +0#0000000&@43 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|l+0#e000002&| +0#0000000&|l+0#e000e06&| +0#0000000&@64 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|p+0#e000002&| +0#0000000&|p+0#e000e06&| +0#0000000&@64 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&| +0#0000000&|#+0#e000e06&| +0#0000000&@64 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|l+0#e000002&|l+0#e000e06&| +0#0000000&@65 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|p+0#e000002&|p+0#e000e06&| +0#0000000&@65 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&|#+0#e000e06&| +0#0000000&@65 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@63 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@63 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@63 +@75 +@57|3|7|,|1| @9|3|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_03.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_03.dump new file mode 100644 index 0000000000..8ac19559ad --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2|l+0#e000e06&| +0#0000000&@64 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2|p+0#e000e06&| +0#0000000&@64 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2|#+0#e000e06&| +0#0000000&@64 +@75 +>d+0#af5f00255&|e|l|e|t|e| +0#0000000&|l+0#e000002&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@61 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|p+0#e000002&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@61 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@61 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|l+0#e000002&|4|2|l+0#e000e06&| +0#0000000&@63 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|p+0#e000002&|4|2|p+0#e000e06&| +0#0000000&@63 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&|4|2|#+0#e000e06&| +0#0000000&@63 +@75 +|"+0#0000e05&| |m|u|l|t|i|p|l|e|,| |a|n|y| |o|r|d|e|r|,| |o|p|t|i|o|n|a|l| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@32 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|l+0#e000002&| +0#0000000&|p+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&|l+0#e000e06&@1| +0#0000000&|p+0#e000e06&@1| +0#0000000&|#+0#e000e06&@1| +0#0000000&@49 +@75 +@75 +|"+0#0000e05&| |r|e|g|i|s|t|e|r|s| |a|n|d| |c|o|u|n|t| +0#0000000&@53 +@57|5@1|,|1| @9|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_04.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_04.dump new file mode 100644 index 0000000000..eaf1614426 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_04.dump @@ -0,0 +1,20 @@ +|"+0#0000e05#ffffff0| |r|e|g|i|s|t|e|r|s| |a|n|d| |c|o|u|n|t| +0#0000000&@53 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|l+0#e000002&| +0#0000000&@66 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|p+0#e000002&| +0#0000000&@66 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|_+0#e000002&| +0#0000000&@66 +>d+0#af5f00255&|e|l|e|t|e| +0#0000000&|\+0#e000002&|"| +0#0000000&@65 +@75 +|d+0#af5f00255&|e|l|e|t|e|_+0#e000002&| +0#0000000&@67 +|d+0#af5f00255&|e|l|e|t|e|\+0#e000002&|"| +0#0000000&@66 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&| +0#0000000&@66 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@65 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&|4|2| +0#0000000&@64 +@75 +|d+0#af5f00255&|e|l|e|t|e|_+0#e000002&| +0#0000000&@67 +|d+0#af5f00255&|e|l|e|t|e|4+0#e000002&|2| +0#0000000&@66 +|d+0#af5f00255&|e|l|e|t|e|_+0#e000002&|4|2| +0#0000000&@65 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|_+0#e000002&|4|2| +0#0000000&@64 +@57|7|3|,|1| @9|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_05.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_05.dump new file mode 100644 index 0000000000..d13f349f8f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_05.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|e|l|e|t|e| +0#0000000&|_+0#e000002&|4|2| +0#0000000&@64 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|_+0#e000002&| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +@75 +|d+0#af5f00255&|e|l|e|t|e|\+0#e000002&|"| +0#0000000&@66 +|d+0#af5f00255&|e|l|e|t|e|4+0#e000002&|2| +0#0000000&@66 +>d+0#af5f00255&|e|l|e|t|e|\+0#e000002&|"|4|2| +0#0000000&@64 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|\+0#e000002&|"|4|2| +0#0000000&@63 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|\+0#e000002&|"| +0#0000000&|4+0#e000002&|2| +0#0000000&@62 +@75 +@75 +|"+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r| |a|n|d| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@43 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@5||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e||+0#0000000&| @6|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&||+0#0000000&| @4|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@2||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2||+0#0000000&| @3|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e|l+0#e000e06&| +0#0000000&@4||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@57|9|1|,|1| @9|8@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_delete_06.dump b/runtime/syntax/testdir/dumps/vim_ex_delete_06.dump new file mode 100644 index 0000000000..7f09e3cccd --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_delete_06.dump @@ -0,0 +1,20 @@ +|d+0#af5f00255#ffffff0|e|l|e|t|e|l+0#e000e06&| +0#0000000&@4||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|d+0#af5f00255&|e|l|e|t|e|l+0#e000e06&||+0#0000000&| @5|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@75 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@5|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +|d+0#af5f00255&|e|l|e|t|e|"+0#0000e05&| @6|c|o|m@1|e|n|t| +0#0000000&@53 +>d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&| +0#0000000&@3|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|a+0#e000002&|"+0#0000e05&| @4|c|o|m@1|e|n|t| +0#0000000&@53 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2| +0#0000000&@2|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +|d+0#af5f00255&|e|l|e|t|e| +0#0000000&|4+0#e000002&|2|"+0#0000e05&| @3|c|o|m@1|e|n|t| +0#0000000&@53 +|d+0#af5f00255&|e|l|e|t|e|l+0#e000e06&| +0#0000000&@4|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +|d+0#af5f00255&|e|l|e|t|e|l+0#e000e06&|"+0#0000e05&| @5|c|o|m@1|e|n|t| +0#0000000&@53 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|0|9|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump b/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump index f23db5d580..31914b648f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_echo_01.dump @@ -17,4 +17,4 @@ |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 -@57|1|9|,|1| @9|3@1|%| +@57|1|9|,|1| @9|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_02.dump b/runtime/syntax/testdir/dumps/vim_ex_echo_02.dump index 54b1cfe704..0dd5e4835a 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_echo_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_echo_02.dump @@ -5,16 +5,16 @@ @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&|"+0#e000002&|F|o@1|"| +0#0000000&@64 +@6|\+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|b|a|r|"| +0#0000000&@55 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"||+0#0000000&| @63 +@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|b|a|r|"| +0#0000000&@56 +@75 @75 |"+0#0000e05&| |T|r|a|i|l|i|n|g| |b|a|r| |a|n|d| |c|o|m@1|e|n|t|s| +0#0000000&@47 @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 -@57|3|7|,|7| @9|7|9|%| +@57|3|7|,|7| @9|6|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_03.dump b/runtime/syntax/testdir/dumps/vim_ex_echo_03.dump index 82c698c6c1..0d1999ab81 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_echo_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_echo_03.dump @@ -1,9 +1,15 @@ | +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&|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#0000000&|e+0#00e0e07&|n|d|)+0#e000e06&| +0#0000000&@52 ->e+0#af5f00255&|l|s|e| +0#0000000&@70 +|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 @75 @@ -11,10 +17,4 @@ |~| @73 |~| @73 |~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 | +0#0000000&@56|5@1|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_equals_00.dump b/runtime/syntax/testdir/dumps/vim_ex_equals_00.dump new file mode 100644 index 0000000000..c264e2c1e7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_equals_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|=| |c|o|m@1|a|n|d| +0#0000000&@58 +@75 +@75 +|=+0#af5f00255&| +0#0000000&@73 +|=+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@71 +@75 +|=+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@69 +@75 +|=+0#af5f00255&| +0#0000000&@2||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@58 +|=+0#af5f00255&| +0#0000000&@2|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 +|=+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@58 +|=+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|#+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|d|i|f@1|e|r|e|n|t|i|a|t|e| |o|p|e|r|a|t|o|r| |a|n|d| |c|o|m@1|a|n|d| |w|h|e|n| |o|p|e|r|a|t|o|r|s| |a|r|e| |c|o|n|t|a|i|n|e|d| +0#0000000& +@2|#+0#0000e05&| |=| +0#0000000&@69 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_equals_01.dump b/runtime/syntax/testdir/dumps/vim_ex_equals_01.dump new file mode 100644 index 0000000000..d98f84f6c9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_equals_01.dump @@ -0,0 +1,20 @@ +|=+0#af5f00255#ffffff0| +0#0000000&|l+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|#+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|d|i|f@1|e|r|e|n|t|i|a|t|e| |o|p|e|r|a|t|o|r| |a|n|d| |c|o|m@1|a|n|d| |w|h|e|n| |o|p|e|r|a|t|o|r|s| |a|r|e| |c|o|n|t|a|i|n|e|d| +0#0000000& +@2>#+0#0000e05&| |=| +0#0000000&@69 +@2|:|=+0#af5f00255&| +0#0000000&@70 +@2|:|=+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +@2|:|=+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +@2|:|=+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +@75 +@2|:|=+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +@75 +@2|:|=+0#af5f00255&| +0#0000000&@2||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@55 +@2|:|=+0#af5f00255&| +0#0000000&@2|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @58 +@2|:|=+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@55 +@2|:|=+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @58 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +@57|1|9|,|3| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_eval_00.dump b/runtime/syntax/testdir/dumps/vim_ex_eval_00.dump index ba9907670a..57fb550eb9 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_eval_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_eval_00.dump @@ -12,7 +12,7 @@ @75 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&@40 @75 -|e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@43 +|e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 @75 |d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 @2|e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 diff --git a/runtime/syntax/testdir/dumps/vim_ex_eval_01.dump b/runtime/syntax/testdir/dumps/vim_ex_eval_01.dump index 292a190b9a..752dc63690 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_eval_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_eval_01.dump @@ -1,5 +1,5 @@ | +0&#ffffff0@74 -|e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@43 +|e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 @75 |d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 @2|e+0#af5f00255&|v|a|l| +0#0000000&|"+0#e000002&|F|o@1|"|-+0#af5f00255&|>|a+0#00e0e07&|p@1|e|n|d|(+0#e000e06&|0+0#e000002&|)+0#e000e06&| +0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@41 diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_13.dump b/runtime/syntax/testdir/dumps/vim_ex_function_13.dump index 69be8a98f1..76f4f13366 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_function_13.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_function_13.dump @@ -13,7 +13,7 @@ @75 |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 @2|"+0#0000e05&| |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|#+0#af5f00255&| +0#0000000&|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 diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_13.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_13.dump index a73c91e526..391abc64e3 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_function_fold_13.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_13.dump @@ -14,7 +14,7 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|"+0#0000e05&| |L|e|g|a|c|y|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@47 -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|#| |4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|4+0#e000002&|2| +0#0000000&@61 ||+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 @57|2|3|4|,|0|-|1| @6|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_16.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_16.dump index e3d9bbd956..d650def3c5 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_function_fold_16.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_16.dump @@ -2,19 +2,19 @@ ||+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 -||+0#0000e05#a8a8a8255| | +0#af5f00255#ffffff0@1|a|p@1|e|n|d| +0#0000000&@64 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@64 ||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3>e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 ||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 ||+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 -||+0#0000e05#a8a8a8255| | +0#af5f00255#ffffff0@1|c|h|a|n|g|e| +0#0000000&@64 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@64 ||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 ||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 ||+0#0000e05#a8a8a8255| |e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 -||+0#0000e05#a8a8a8255| | +0#af5f00255#ffffff0@1|i|n|s|e|r|t| +0#0000000&@64 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@64 ||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 @57|2|8@1|,|5| @8|8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_global_00.dump b/runtime/syntax/testdir/dumps/vim_ex_global_00.dump new file mode 100644 index 0000000000..1996e7c0ee --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_global_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|g|l|o|b|a|l| |a|n|d| |:|v| |c|o|m@1|a|n|d|s| +0#0000000&@45 +@75 +@75 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@53 +|g+0#af5f00255&|l|o|b|a|l|!|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|v+0#af5f00255&|g|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +@75 +|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@1|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@75 +|"+0#0000e05&| |d|o|c|s| |s|t|a|t|e| |!| |i|s| |n|o|t| |a|l@1|o|w|e|d| |a|s| |t|h|e| |d|e|l|i|m|i|t|e|r| |b|u|t| |i|t| |w|o|r|k|s| +0#0000000&@15 +|g+0#af5f00255&|l|o|b|a|l|!|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@75 +|"+0#0000e05&| |c|o|m@1|a|n|d| |w|i|t|h| |r|a|n|g|e| +0#0000000&@54 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#0000000&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#0000000&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@55 +@75 +|"+0#0000e05&| |r|e|c|u|r|s|i|v|e| +0#0000000&@63 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_global_01.dump b/runtime/syntax/testdir/dumps/vim_ex_global_01.dump new file mode 100644 index 0000000000..d7fbc31304 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_global_01.dump @@ -0,0 +1,20 @@ +|g+0#af5f00255#ffffff0|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@75 +|"+0#0000e05&| |c|o|m@1|a|n|d| |w|i|t|h| |r|a|n|g|e| +0#0000000&@54 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#0000000&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#0000000&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@55 +@75 +>"+0#0000e05&| |r|e|c|u|r|s|i|v|e| +0#0000000&@63 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o|u|n|d|/+0#e000e06&|v+0#af5f00255&|/+0#e000e06&|n+0#0000000&|o|t|\+0#e000e06&|%|(|f+0#0000000&|o|u|n|d|\+0#e000e06&|)|/|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@35 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@51 +@2|g+0#af5f00255&|l|o|b|a|l|!|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|v+0#af5f00255&|g|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@75 +@2|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@1|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@2|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@2|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@75 +@2|#+0#0000e05&| |d|o|c|s| |s|t|a|t|e| |!| |i|s| |n|o|t| |a|l@1|o|w|e|d| |a|s| |t|h|e| |d|e|l|i|m|i|t|e|r| |b|u|t| |i|t| |w|o|r|k|s| +0#0000000&@13 +@57|1|9|,|1| @9|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_global_02.dump b/runtime/syntax/testdir/dumps/vim_ex_global_02.dump new file mode 100644 index 0000000000..6951ede51c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_global_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|#+0#0000e05&| |d|o|c|s| |s|t|a|t|e| |!| |i|s| |n|o|t| |a|l@1|o|w|e|d| |a|s| |t|h|e| |d|e|l|i|m|i|t|e|r| |b|u|t| |i|t| |w|o|r|k|s| +0#0000000&@13 +@2|g+0#af5f00255&|l|o|b|a|l|!|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@75 +@2|#+0#0000e05&| |c|o|m@1|a|n|d| |w|i|t|h| |r|a|n|g|e| +0#0000000&@52 +@2>g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#0000000&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#0000000&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@53 +@75 +@2|#+0#0000e05&| |r|e|c|u|r|s|i|v|e| +0#0000000&@61 +@2|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o|u|n|d|/+0#e000e06&|v+0#af5f00255&|/+0#e000e06&|n+0#0000000&|o|t|\+0#e000e06&|%|(|f+0#0000000&|o|u|n|d|\+0#e000e06&|)|/|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@33 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|7|,|3| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_import_00.dump b/runtime/syntax/testdir/dumps/vim_ex_import_00.dump index 8d1e40f005..cb52607532 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_import_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_import_00.dump @@ -14,7 +14,7 @@ @6|\+0#e000e06&| +0#0000000&|:+0#af5f00255&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@55 @75 |i+0#af5f00255&|m|p|o|r|t| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&|?+0#af5f00255&| +0#0000000&@59 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|f|o@1|.|v|i|m|"| +0#0000000&|:+0#af5f00255&| +0#0000000&@55 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_import_01.dump b/runtime/syntax/testdir/dumps/vim_ex_import_01.dump index 62070f9740..365852b281 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_import_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_import_01.dump @@ -1,9 +1,9 @@ | +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|:+0#af5f00255&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@55 @75 |i+0#af5f00255&|m|p|o|r|t| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&|?+0#af5f00255&| +0#0000000&@59 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|f|o@1|.|v|i|m|"| +0#0000000&|:+0#af5f00255&| +0#0000000&@55 -@6>"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6>"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@57 @75 |i+0#af5f00255&|m|p|o|r|t| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&@61 diff --git a/runtime/syntax/testdir/dumps/vim_ex_import_02.dump b/runtime/syntax/testdir/dumps/vim_ex_import_02.dump index 9fb21c2f41..921fe58c17 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_import_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_import_02.dump @@ -8,9 +8,9 @@ @6|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|s| +0#0000000&|b+0#0000001#ffff4012|a|z| +0#0000000#ffffff0@60 @75 |i+0#af5f00255&|m|p|o|r|t| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&|?+0#af5f00255&| +0#0000000&@59 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|f|o@1|.|v|i|m|"| +0#0000000&|:+0#af5f00255&| +0#0000000&@55 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@57 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|s| +0#0000000&|b+0#0000001#ffff4012|a|z| +0#0000000#ffffff0@60 diff --git a/runtime/syntax/testdir/dumps/vim_ex_import_04.dump b/runtime/syntax/testdir/dumps/vim_ex_import_04.dump index 957e4d9988..2da6c16607 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_import_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_import_04.dump @@ -4,9 +4,9 @@ @6|\+0#e000e06&| +0#0000000&|:+0#af5f00255&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@55 @75 >i+0#af5f00255&|m|p|o|r|t| +0#0000000&|a+0#e000e06&|u|t|o|l|o|a|d| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&|?+0#af5f00255&| +0#0000000&@50 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 | +0#e000002&@5|\+0#e000e06&|"+0#e000002&|f|o@1|.|v|i|m|"| +0#0000000&|:+0#af5f00255&| +0#0000000&@56 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@57 @75 |i+0#af5f00255&|m|p|o|r|t| +0#0000000&|a+0#e000e06&|u|t|o|l|o|a|d| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&@52 diff --git a/runtime/syntax/testdir/dumps/vim_ex_import_05.dump b/runtime/syntax/testdir/dumps/vim_ex_import_05.dump index 151b5eb3e1..7cdb01dec1 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_import_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_import_05.dump @@ -11,9 +11,9 @@ @6|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|s| +0#0000000&|b+0#0000001#ffff4012|a|z| +0#0000000#ffffff0@60 @75 |i+0#af5f00255&|m|p|o|r|t| +0#0000000&|a+0#e000e06&|u|t|o|l|o|a|d| +0#0000000&|v+0#00e0e07&|:|t|r|u|e| +0#0000000&|?+0#af5f00255&| +0#0000000&@50 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|f|o@1|.|v|i|m|"| +0#0000000&|:+0#af5f00255&| +0#0000000&@55 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| | +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|r|.|v|i|m|"| +0#0000000&@57 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|s| +0#0000000&|b+0#0000001#ffff4012|a|z| +0#0000000#ffffff0@60 diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_00.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_00.dump new file mode 100644 index 0000000000..0f8523b00c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_00.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1>"+0&#ffffff0| |V|i|m| |:|i|n|s|e|r|t| |c|o|m@1|a|n|d| +0#0000000&@51 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |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&|T|"| +0#0000000&@29 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s|e|t|l| |f|d|c|=|2| |f|d|l|=|9@2| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@26 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t| |o|n|l|y| +0#0000000&@42 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_01.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_01.dump new file mode 100644 index 0000000000..868876d590 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_01.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +@57|1|9|,|0|-|1| @8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_02.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_02.dump new file mode 100644 index 0000000000..a1d527867b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_02.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| >l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +@57|3|7|,|1| @9|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_03.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_03.dump new file mode 100644 index 0000000000..f2cd6c9682 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_03.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| >i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@41 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|0| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@36 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|1| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +@57|5@1|,|1| @9|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_04.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_04.dump new file mode 100644 index 0000000000..3b3c3f60fb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_04.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |e|m|p|t|y| |f|i|r|s|t| |l|i|n|e| +0#0000000&@54 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +@57|7|3|,|0|-|1| @7|3|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_05.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_05.dump new file mode 100644 index 0000000000..3bb4cfc69d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_05.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&@65 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@58 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +@57|9|1|,|0|-|1| @7|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_06.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_06.dump new file mode 100644 index 0000000000..749e996fee --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_06.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@57 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| >l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@42 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|"| |l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t| +0#0000000&@41 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +@57|1|0|9|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_07.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_07.dump new file mode 100644 index 0000000000..7cce8b1e78 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_07.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@37 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| >i+0#af5f00255#ffffff0|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|e|c|h|o| |"|l|i|n|e|0| |o|f| |i|n|p|u|t| |t|e|x|t|"| +0#0000000&@36 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@72 +||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|i|n|e|2| +0#0000000&@67 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |n|o| |e|a|r|l|y| |t|e|r|m|i|n|a|t|i|o|n| +0#0000000&@50 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| +0#0000000&|N+0#e000e06&|O|T|E|:| +0#0000e05&|'|a|u|t|o|i|n|d|e|n|t|'| |e|n|d| |m|a|r|k|e|r| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000&@27 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +@57|1|2|7|,|1| @8|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_08.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_08.dump new file mode 100644 index 0000000000..15a4f0bc7e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_08.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@64 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0>.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&@63 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +@57|1|4|5|,|2| @8|7@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_09.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_09.dump new file mode 100644 index 0000000000..81136da278 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_09.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0>.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| |.+0#e000002#ffffff0| | +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +@57|1|6|3|,|2| @8|8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_10.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_10.dump new file mode 100644 index 0000000000..ce996c535a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_10.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0|.| | +0#0000000&@69 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@64 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| >.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&@63 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|n|d|f|u|n|c|t|i|o|n| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@53 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@56 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +@57|1|8|1|,|1| @8|9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_insert_11.dump b/runtime/syntax/testdir/dumps/vim_ex_insert_11.dump new file mode 100644 index 0000000000..06b2592d82 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_insert_11.dump @@ -0,0 +1,20 @@ +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@1|i+0#af5f00255&|n|s|e|r|t|!| +0#0000000&||| +0#e000002&|l|i|n|e|0| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#e000002#ffffff0@3|e|n|d|f|u|n|c|i|o|n| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |.+0#af5f00255#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|9@1|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_leftshift_00.dump b/runtime/syntax/testdir/dumps/vim_ex_leftshift_00.dump new file mode 100644 index 0000000000..b051fab75f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_leftshift_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|<| |c|o|m@1|a|n|d| +0#0000000&@58 +@75 +|<+0#af5f00255&| +0#0000000&@73 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&@72 +|<+0#af5f00255&|<+0#e000e06&@1| +0#0000000&@71 +@75 +|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|<+0#e000e06&| +0#0000000&@69 +@75 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@70 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 +|<+0#af5f00255&|<+0#e000e06&@1| +0#0000000&|4+0#e000002&|2| +0#0000000&@68 +@75 +|<+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|l+0#e000e06&| +0#0000000&@70 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|p+0#e000e06&| +0#0000000&@70 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&@70 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_leftshift_01.dump b/runtime/syntax/testdir/dumps/vim_ex_leftshift_01.dump new file mode 100644 index 0000000000..4e7b433c18 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_leftshift_01.dump @@ -0,0 +1,20 @@ +|<+0#af5f00255#ffffff0| +0#0000000&|l+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@71 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|l+0#e000e06&| +0#0000000&@70 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|p+0#e000e06&| +0#0000000&@70 +><+0#af5f00255&|<+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&@70 +@75 +|<+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@69 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@68 +@75 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@67 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@67 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@67 +@75 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@65 +@57|1|9|,|1| @9|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_leftshift_02.dump b/runtime/syntax/testdir/dumps/vim_ex_leftshift_02.dump new file mode 100644 index 0000000000..1ad85e9c8e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_leftshift_02.dump @@ -0,0 +1,20 @@ +|<+0#af5f00255#ffffff0|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@65 +@75 +|<+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@60 +|<+0#af5f00255&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@63 +|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@58 +><+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|<+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@58 +|<+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@61 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|#+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|d|i|f@1|e|r|e|n|t|i|a|t|e| |o|p|e|r|a|t|o|r| |a|n|d| |c|o|m@1|a|n|d| |w|h|e|n| |o|p|e|r|a|t|o|r|s| |a|r|e| |c|o|n|t|a|i|n|e|d| +0#0000000& +@2|#+0#0000e05&| |<| +0#0000000&@69 +@2|:|<+0#af5f00255&| +0#0000000&@70 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&@68 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&@1| +0#0000000&@67 +@75 +@57|3|7|,|1| @9|4|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_leftshift_03.dump b/runtime/syntax/testdir/dumps/vim_ex_leftshift_03.dump new file mode 100644 index 0000000000..d071801b39 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_leftshift_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&@68 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|<+0#e000e06&| +0#0000000&@66 +@75 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@67 +@2>:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@65 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&@1| +0#0000000&|4+0#e000002&|2| +0#0000000&@64 +@75 +@2|:|<+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +@2|:|<+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +@2|:|<+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|l+0#e000e06&| +0#0000000&@66 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|p+0#e000e06&| +0#0000000&@66 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&@66 +@75 +@2|:|<+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@64 +@75 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@65 +@57|5@1|,|3| @9|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_leftshift_04.dump b/runtime/syntax/testdir/dumps/vim_ex_leftshift_04.dump new file mode 100644 index 0000000000..c9300e5f23 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_leftshift_04.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@65 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@65 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@65 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@63 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@63 +@2>:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@63 +@75 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@63 +@2|:|<+0#af5f00255&|<+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@62 +@75 +@2|:|<+0#af5f00255&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|<+0#af5f00255&| +0#0000000&@3|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|<+0#af5f00255&| +0#0000000&|<+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|<+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|<+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|<+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@57|7|3|,|3| @9|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_leftshift_05.dump b/runtime/syntax/testdir/dumps/vim_ex_leftshift_05.dump new file mode 100644 index 0000000000..fe4b5f65f0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_leftshift_05.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|n|d@1|e|f| +0#0000000&@68 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|8|7|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump index bd0e393c9d..31da092d03 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump @@ -17,4 +17,4 @@ |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@54 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@54 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@54 -@57|3|7|,|1| @9|1|5|%| +@57|3|7|,|1| @9|1|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump index d2b889b8b8..9848a3e251 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump @@ -4,10 +4,10 @@ |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|K+0#0000001#ffff4012| +0#0000000#ffffff0@59 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|z+0#0000001#ffff4012| +0#0000000#ffffff0@59 >c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@59 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|[+0#0000001#ffff4012| +0#0000000#ffffff0@59 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|]+0#0000001#ffff4012| +0#0000000#ffffff0@59 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|<+0#0000001#ffff4012| +0#0000000#ffffff0@59 -|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|>+0#0000001#ffff4012| +0#0000000#ffffff0@59 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k|[| @59 +|c|a|l@1| |F|o@1|(+0#e000e06&|)| +0#0000000&||| |k|]| @59 +|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k|<+0#af5f00255&| +0#0000000&@59 +|c|a|l@1| |F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|>+0#0000001#ffff4012| +0#0000000#ffffff0@59 @75 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|`+0#0000001#ffff4012| +0#0000000#ffffff0@58 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|'+0#0000001#ffff4012| +0#0000000#ffffff0@58 @@ -17,4 +17,4 @@ |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|K+0#0000001#ffff4012| +0#0000000#ffffff0@58 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|z+0#0000001#ffff4012| +0#0000000#ffffff0@58 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@58 -@57|9|1|,|1| @9|4|3|%| +@57|9|1|,|1| @9|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump index 224afb2d1b..021342d068 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump @@ -17,4 +17,4 @@ |k+0#af5f00255&| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@71 |k+0#af5f00255&| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@71 @75 -@57|1|0|9|,|0|-|1| @6|5|2|%| +@57|1|0|9|,|0|-|1| @6|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump index a2f23ea0f7..4272f236d6 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump @@ -17,4 +17,4 @@ |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@58 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@58 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@58 -@57|1|2|7|,|1| @8|6|1|%| +@57|1|2|7|,|1| @8|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump index 27f607a6c9..962058aebe 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump @@ -17,4 +17,4 @@ |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@57 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@57 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@57 -@57|1|4|5|,|1| @8|7|0|%| +@57|1|4|5|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump index 46eaca326b..13c244193d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump @@ -17,4 +17,4 @@ @2|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@66 @2|:|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@68 @2|:|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@69 -@57|1|6|3|,|1| @8|8|0|%| +@57|1|6|3|,|1| @8|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump index 32cc2249af..e04f117e39 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump @@ -8,8 +8,7 @@ |m+0#af5f00255&|a|r|k| +0#0000000&|"+0#ffffff16#ff404010| +0#0000000#ffffff0@68 |m+0#af5f00255&|a|r|k| +0#0000000&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@68 |m+0#af5f00255&|a|r|k| +0#0000000&|.+0#ffffff16#ff404010| +0#0000000#ffffff0@68 -|"+0#0000e05&| +0#0000000&|T+0#0000001#ffff4012|O|D|O|:+0#e000e06#ffffff0| +0#0000e05&|m|a|t|c|h|e|s| |a|s| |v|i|m|F|u|n|c| +0#0000000&@48 -|"+0#0000e05&| |m|a|r|k| |(| +0#0000000&@66 +|m+0#af5f00255&|a|r|k| +0#0000000&|(+0#ffffff16#ff404010| +0#0000000#ffffff0@68 |m+0#af5f00255&|a|r|k| +0#0000000&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@68 |m+0#af5f00255&|a|r|k| +0#0000000&|{+0#ffffff16#ff404010| +0#0000000#ffffff0@68 |m+0#af5f00255&|a|r|k| +0#0000000&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@68 @@ -17,4 +16,5 @@ |m+0#af5f00255&|a|r|k| +0#0000000&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@68 @75 |k+0#af5f00255&|"+0#ffffff16#ff404010| +0#0000000#ffffff0@72 -@57|1|8|1|,|1| @8|8|9|%| +|k+0#af5f00255&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@72 +@57|1|8|1|,|1| @8|9|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump index c986357c09..d32e5ca674 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump @@ -1,20 +1,20 @@ -|k+0#af5f00255#ffffff0|"+0#ffffff16#ff404010| +0#0000000#ffffff0@72 -|k+0#af5f00255&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@72 +|k+0#af5f00255#ffffff0|^+0#ffffff16#ff404010| +0#0000000#ffffff0@72 |k+0#af5f00255&|.+0#ffffff16#ff404010| +0#0000000#ffffff0@72 -|"+0#0000e05&| +0#0000000&|T+0#0000001#ffff4012|O|D|O|:+0#e000e06#ffffff0| +0#0000e05&|m|a|t|c|h|e|s| |a|s| |v|i|m|F|u|n|c| +0#0000000&@48 -|"+0#0000e05&| |k|(| +0#0000000&@70 ->k+0#af5f00255&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@72 +|k+0#af5f00255&|(+0#ffffff16#ff404010| +0#0000000#ffffff0@72 +|k+0#af5f00255&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@72 |k+0#af5f00255&|{+0#ffffff16#ff404010| +0#0000000#ffffff0@72 -|k+0#af5f00255&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@72 +>k+0#af5f00255&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@72 |k+0#af5f00255&|0+0#ffffff16#ff404010| +0#0000000#ffffff0@72 |k+0#af5f00255&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@72 @75 |k+0#af5f00255&| +0#0000000&|"+0#ffffff16#ff404010| +0#0000000#ffffff0@71 |k+0#af5f00255&| +0#0000000&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@71 |k+0#af5f00255&| +0#0000000&|.+0#ffffff16#ff404010| +0#0000000#ffffff0@71 -|"+0#0000e05&| +0#0000000&|T+0#0000001#ffff4012|O|D|O|:+0#e000e06#ffffff0| +0#0000e05&|m|a|t|c|h|e|s| |a|s| |v|i|m|F|u|n|c| +0#0000000&@48 -|"+0#0000e05&| |k| |(| +0#0000000&@69 +|k+0#af5f00255&| +0#0000000&|(+0#ffffff16#ff404010| +0#0000000#ffffff0@71 |k+0#af5f00255&| +0#0000000&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@71 |k+0#af5f00255&| +0#0000000&|{+0#ffffff16#ff404010| +0#0000000#ffffff0@71 |k+0#af5f00255&| +0#0000000&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@71 -@57|1|9@1|,|1| @8|9|8|%| +|k+0#af5f00255&| +0#0000000&|0+0#ffffff16#ff404010| +0#0000000#ffffff0@71 +|k+0#af5f00255&| +0#0000000&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@71 +@75 +@57|1|9@1|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_12.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_12.dump deleted file mode 100644 index 02064018ce..0000000000 --- a/runtime/syntax/testdir/dumps/vim_ex_mark_12.dump +++ /dev/null @@ -1,20 +0,0 @@ -|k+0#af5f00255#ffffff0| +0#0000000&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@71 -|k+0#af5f00255&| +0#0000000&|0+0#ffffff16#ff404010| +0#0000000#ffffff0@71 -|k+0#af5f00255&| +0#0000000&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@71 -> @74 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|2|1|5|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_match_01.dump b/runtime/syntax/testdir/dumps/vim_ex_match_01.dump index 01c51e0221..cfdaacb319 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_match_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_match_01.dump @@ -4,9 +4,9 @@ |3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 |3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@63 > @74 -|1+0#e000002&| +0#af5f00255&|m|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 -|2+0#e000002&| +0#af5f00255&|m|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 -|3+0#e000002&| +0#af5f00255&|m|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 +|1+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 +|2+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 +|3+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 @75 @75 |"+0#0000e05&| |D|i|f@1|e|r|e|n|t|i|a|t|e| |m|a|t|c|h|(|)| |f|r|o|m| |:|m|a|t|c|h| +0#0000000&@39 diff --git a/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump b/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump index 9a1bd9f149..3c91d58e33 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_menu_04.dump @@ -13,7 +13,7 @@ |"+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 |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&@53 -@3| +0#00e0e07&|p|o|p|u|p|.+0#0000000&|F|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 +@4|p+0#00e0e07&|o|p|u|p|.+0#0000000&|F|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#0000000&|t+0#00e0e07&|e|x|t|)+0#e000e06&| +0#0000000&@41 @8|}+0#e000e06&|)| +0#0000000&@64 diff --git a/runtime/syntax/testdir/dumps/vim_ex_packadd_00.dump b/runtime/syntax/testdir/dumps/vim_ex_packadd_00.dump new file mode 100644 index 0000000000..7fd34c4c95 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_packadd_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|p|a|c|k|a|d@1| |c|o|m@1|a|n|d| +0#0000000&@52 +@75 +@75 +|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| @58 +|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@48 +|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@45 +|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| @58 +|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@48 +|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@45 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| @56 +@2|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@46 +@2|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@43 +@2|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| @56 +@2|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@46 +@2|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@43 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_packadd_01.dump b/runtime/syntax/testdir/dumps/vim_ex_packadd_01.dump new file mode 100644 index 0000000000..8097a2520e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_packadd_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@46 +@2|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@1|f|o@1|/|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@43 +@2|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| @56 +@2|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@46 +@2|p+0#af5f00255&|a|c|k|a|d@1|!| +0#0000000&|f|o@1|/|b|a|r| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@43 +>e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @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_pound_00.dump b/runtime/syntax/testdir/dumps/vim_ex_pound_00.dump new file mode 100644 index 0000000000..91450f685e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_pound_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|#| |a|n|d| |:|n|u|m|b|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@45 +@75 +@75 +|#+0#af5f00255&| +0#0000000&@73 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@70 +|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@71 +|#+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@71 +|#+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@71 +@75 +|#+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@69 +@75 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +@75 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +@75 +@75 +|#+0#af5f00255&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_pound_01.dump b/runtime/syntax/testdir/dumps/vim_ex_pound_01.dump new file mode 100644 index 0000000000..97fc77ad74 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_pound_01.dump @@ -0,0 +1,20 @@ +|#+0#af5f00255#ffffff0| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +@75 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +@75 +@75 +>#+0#af5f00255&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|#+0#af5f00255&| +0#0000000&@3|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +@75 +@75 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@68 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@65 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&| +0#0000000&@66 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|p+0#e000e06&| +0#0000000&@66 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|#+0#e000e06&| +0#0000000&@66 +@75 +@57|1|9|,|1| @9|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_pound_02.dump b/runtime/syntax/testdir/dumps/vim_ex_pound_02.dump new file mode 100644 index 0000000000..0d1d199c42 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_pound_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@64 +@75 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@63 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@63 +>n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@63 +@75 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@61 +@75 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@4|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&| +0#0000000&@1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|:|#+0#af5f00255&| +0#0000000&@70 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@67 +@57|3|7|,|1| @9|4|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_pound_03.dump b/runtime/syntax/testdir/dumps/vim_ex_pound_03.dump new file mode 100644 index 0000000000..c325aa404d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_pound_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@67 +@2|:|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +@2|:|#+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +@2|:|#+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +@75 +@2>:|#+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +@75 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@65 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@65 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@65 +@75 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@63 +@75 +@2|:|#+0#af5f00255&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|#+0#af5f00255&| +0#0000000&@3|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|#+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@57|5@1|,|3| @9|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_pound_04.dump b/runtime/syntax/testdir/dumps/vim_ex_pound_04.dump new file mode 100644 index 0000000000..1de5c3d682 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_pound_04.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|:|#+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@75 +@75 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@66 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@63 +@2>n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&| +0#0000000&@64 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|p+0#e000e06&| +0#0000000&@64 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|#+0#e000e06&| +0#0000000&@64 +@75 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@62 +@75 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@61 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@61 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@61 +@75 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@59 +@75 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@3|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @53 +@57|7|3|,|3| @9|9|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_pound_05.dump b/runtime/syntax/testdir/dumps/vim_ex_pound_05.dump new file mode 100644 index 0000000000..c5274d5373 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_pound_05.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@3|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @53 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @53 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&|l+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @53 +>e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|9|1|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_00.dump b/runtime/syntax/testdir/dumps/vim_ex_range_00.dump index ecc0c73c62..6a51233b81 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_00.dump @@ -1,20 +1,20 @@ >"+0#0000e05#ffffff0| |E|x| |c|o|m@1|a|n|d| |r|a|n|g|e|s| +0#0000000&@55 +|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|A|d@1|r|e|s@1|S|e|p|a|r|a|t|o|r| |T|o|d|o| +0#0000000&@25 +|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|A|d@1|r|e|s@1|O|f@1|s|e|t| |T|y|p|e| +0#0000000&@28 @75 @75 -|'+0#e000002&|<|,+0#0000000&|'+0#e000002&|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 -|'+0#e000002&|(|,+0#0000000&|'+0#e000002&|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 -|'+0#e000002&|{|,+0#0000000&|'+0#e000002&|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 -|'+0#e000002&|[|,+0#0000000&|'+0#e000002&|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|"+0#0000e05&| |1|a|d@1|r| +0#0000000&@67 @75 -|:|'+0#e000002&|<|,+0#0000000&|'+0#e000002&|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 -|:|'+0#e000002&|(|,+0#0000000&|'+0#e000002&|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 -|:|'+0#e000002&|{|,+0#0000000&|'+0#e000002&|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 -|:|'+0#e000002&|[|,+0#0000000&|'+0#e000002&|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 -@75 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|<|,+0#0000000&|'+0#e000002&|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|(|,+0#0000000&|'+0#e000002&|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|{|,+0#0000000&|'+0#e000002&|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|[|,+0#0000000&|'+0#e000002&|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -@75 -|"+0#0000e05&| |b|a|r|e| |m|a|r|k| |r|a|n|g|e|s| +0#0000000&@56 +|.+0#e000002&|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|$+0#e000002&|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|a|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|k|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|z|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|A|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|Z|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|9|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_01.dump b/runtime/syntax/testdir/dumps/vim_ex_range_01.dump index 76085289fe..6ba41bef14 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_01.dump @@ -1,20 +1,20 @@ -|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&||| |'+0#e000002&|<|,+0#0000000&|'+0#e000002&|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|(|,+0#0000000&|'+0#e000002&|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|{|,+0#0000000&|'+0#e000002&|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|[|,+0#0000000&|'+0#e000002&|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -@75 ->"+0#0000e05&| |b|a|r|e| |m|a|r|k| |r|a|n|g|e|s| +0#0000000&@56 -@75 -|'+0#e000002&|a| +0#0000000&@72 -|'+0#e000002&|k| +0#0000000&@72 -|'+0#e000002&|z| +0#0000000&@72 -|'+0#e000002&|A| +0#0000000&@72 -|'+0#e000002&|K| +0#0000000&@72 -|'+0#e000002&|Z| +0#0000000&@72 -|'+0#e000002&|0| +0#0000000&@72 -|'+0#e000002&|9| +0#0000000&@72 -|'+0#e000002&|[| +0#0000000&@72 -|'+0#e000002&|]| +0#0000000&@72 -|'+0#e000002&|{| +0#0000000&@72 -|'+0#e000002&|}| +0#0000000&@72 -@57|1|9|,|1| @9|1|8|%| +|'+0#e000002#ffffff0|A|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|Z|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|9|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +>'+0#e000002&|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|{|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|(|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|<|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|`|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&@1|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|'+0#e000002&|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +@57|1|9|,|1| @10|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_02.dump b/runtime/syntax/testdir/dumps/vim_ex_range_02.dump index acfcf5431d..d4462bd6a1 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_02.dump @@ -1,20 +1,20 @@ -|'+0#e000002#ffffff0|}| +0#0000000&@72 -|'+0#e000002&|(| +0#0000000&@72 -|'+0#e000002&|)| +0#0000000&@72 -|'+0#e000002&|<| +0#0000000&@72 -|'+0#e000002&|>| +0#0000000&@72 ->'+0#e000002&|`| +0#0000000&@72 -|'+0#e000002&@1| +0#0000000&@72 -|'+0#e000002&|"| +0#0000000&@72 -|'+0#e000002&|^| +0#0000000&@72 -|'+0#e000002&|.| +0#0000000&@72 +|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|:|\+0#e000002&|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|:|\+0#e000002&|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|:|\+0#e000002&|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +>++0#00e0003&|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|-+0#00e0003&|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|++0#00e0003&|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|-+0#00e0003&|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 @75 -@1|:|'+0#e000002&|a| +0#0000000&@70 -|:| |'+0#e000002&|a| +0#0000000&@70 -|:|'+0#e000002&|a| +0#0000000&@71 -|:|'+0#e000002&|k| +0#0000000&@71 -|:|'+0#e000002&|z| +0#0000000&@71 -|:|'+0#e000002&|A| +0#0000000&@71 -|:|'+0#e000002&|K| +0#0000000&@71 -|:|'+0#e000002&|Z| +0#0000000&@71 -@57|3|7|,|1| @9|4|3|%| +@75 +|"+0#0000e05&| |2|a|d@1|r| +0#0000000&@67 +@75 +|"+0#0000e05&| |i|m|p|l|i|c|i|t| |l|i|n|e|1| |'|.|'| |a|n|d| |l|i|n|e|2| |'|.|'| +0#0000000&@40 +@75 +|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@68 +|,+0#0000001#ffff4012@1|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|,+0#0000001#ffff4012@2|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +@75 +@57|3|7|,|1| @10|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_03.dump b/runtime/syntax/testdir/dumps/vim_ex_range_03.dump index 89477a99e4..13d56567c5 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_03.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|'+0#e000002&|Z| +0#0000000&@71 -|:|'+0#e000002&|0| +0#0000000&@71 -|:|'+0#e000002&|9| +0#0000000&@71 -|:|'+0#e000002&|[| +0#0000000&@71 -|:|'+0#e000002&|]| +0#0000000&@71 ->:|'+0#e000002&|{| +0#0000000&@71 -|:|'+0#e000002&|}| +0#0000000&@71 -|:|'+0#e000002&|(| +0#0000000&@71 -|:|'+0#e000002&|)| +0#0000000&@71 -|:|'+0#e000002&|<| +0#0000000&@71 -|:|'+0#e000002&|>| +0#0000000&@71 -|:|'+0#e000002&|`| +0#0000000&@71 -|:|'+0#e000002&@1| +0#0000000&@71 -|:|'+0#e000002&|"| +0#0000000&@71 -|:|'+0#e000002&|^| +0#0000000&@71 -|:|'+0#e000002&|.| +0#0000000&@71 +| +0&#ffffff0@74 +|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@68 +|;+0#0000001#ffff4012@1|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|;+0#0000001#ffff4012@2|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 @75 -|e+0#af5f00255&|c|h|o| +0#0000000&|||'+0#e000002&|a| +0#0000000&@66 -|e+0#af5f00255&|c|h|o||+0#0000000&| |'+0#e000002&|a| +0#0000000&@66 -@57|5@1|,|1| @9|6|9|%| +>,+0#0000001#ffff4012|;|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|;+0#0000001#ffff4012|,|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|,+0#0000001#ffff4012|;|,|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|,|;|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +@75 +@75 +|"+0#0000e05&| |i|m|p|l|i|c|i|t| |l|i|n|e|2| |'|.|'| +0#0000000&@54 +@75 +|.+0#e000002&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|$+0#e000002&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|a|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|k|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|z|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +@57|5@1|,|1| @10|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_04.dump b/runtime/syntax/testdir/dumps/vim_ex_range_04.dump index d9869fe34b..0d930d7405 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_04.dump @@ -1,20 +1,20 @@ -|e+0#af5f00255#ffffff0|c|h|o||+0#0000000&| |'+0#e000002&|a| +0#0000000&@66 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|a| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|k| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|z| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|A| +0#0000000&@65 ->e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|K| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|Z| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|0| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|9| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|[| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|]| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|{| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|}| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|(| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|)| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|<| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|>| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|`| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&@1| +0#0000000&@65 -@57|7|3|,|1| @9|9|4|%| +|'+0#e000002#ffffff0|z|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|A|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|K|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|Z|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|0|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +>'+0#e000002&|9|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|[|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|]|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|{|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|}|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|(|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|)|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|<|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|>|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|`|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&@1|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|"|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|^|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|.|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +@57|7|3|,|1| @10|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_05.dump b/runtime/syntax/testdir/dumps/vim_ex_range_05.dump index cadd7bbaa8..f143082fe0 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_05.dump @@ -1,20 +1,20 @@ -|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&||| |'+0#e000002&@1| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|"| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|^| +0#0000000&@65 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |'+0#e000002&|.| +0#0000000&@65 -> @74 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|9|0|,|0|-|1| @7|B|o|t| +|'+0#e000002#ffffff0|.|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|:|\+0#e000002&|/|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|:|\+0#e000002&|?|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +>:|\+0#e000002&|&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|++0#00e0003&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|-+0#00e0003&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|++0#00e0003&|4|2|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|-+0#00e0003&|4|2|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +@75 +|.+0#e000002&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|$+0#e000002&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|4+0#e000002&|2|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|a|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|k|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|z|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|A|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|K|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +@57|9|1|,|1| @10|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_06.dump b/runtime/syntax/testdir/dumps/vim_ex_range_06.dump new file mode 100644 index 0000000000..5e0780a6f0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_06.dump @@ -0,0 +1,20 @@ +|'+0#e000002#ffffff0|K|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|Z|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|0|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|9|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|[|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +>'+0#e000002&|]|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|{|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|}|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|(|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|)|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|<|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|>|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|`|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&@1|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|"|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|^|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|'+0#e000002&|.|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +@57|1|0|9|,|1| @9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_07.dump b/runtime/syntax/testdir/dumps/vim_ex_range_07.dump new file mode 100644 index 0000000000..ff51a38f59 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_07.dump @@ -0,0 +1,20 @@ +|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|:|\+0#e000002&|/|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|:|\+0#e000002&|?|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|:|\+0#e000002&|&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|++0#00e0003&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +>-+0#00e0003&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@67 +|++0#00e0003&|4|2|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +|-+0#00e0003&|4|2|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 +@75 +|"+0#0000e05&| |i|m|p|l|i|c|i|t| |l|i|n|e|1| |'|.|'| +0#0000000&@54 +@75 +|,+0#0000001#ffff4012|.+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|,+0#0000001#ffff4012|$+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|k|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|z|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|A|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +@57|1|2|7|,|1| @9|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_08.dump b/runtime/syntax/testdir/dumps/vim_ex_range_08.dump new file mode 100644 index 0000000000..c54a2ba02d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_08.dump @@ -0,0 +1,20 @@ +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|9|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +>,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|(|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|<|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|`|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0@1|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@57|1|4|5|,|1| @9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_09.dump b/runtime/syntax/testdir/dumps/vim_ex_range_09.dump new file mode 100644 index 0000000000..fbace495a1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_09.dump @@ -0,0 +1,20 @@ +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|,+0#0000001#ffff4012|++0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +>,+0#0000001#ffff4012|-+0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|,+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +@75 +|;+0#0000001#ffff4012|.+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|;+0#0000001#ffff4012|$+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|k|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|z|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|A|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +@57|1|6|3|,|1| @9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_10.dump b/runtime/syntax/testdir/dumps/vim_ex_range_10.dump new file mode 100644 index 0000000000..01ca2d7d73 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_10.dump @@ -0,0 +1,20 @@ +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|9|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|{|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +>;+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|(|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|<|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|`|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0@1|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +@57|1|8|1|,|1| @9|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_11.dump b/runtime/syntax/testdir/dumps/vim_ex_range_11.dump new file mode 100644 index 0000000000..e6bd4b0622 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_11.dump @@ -0,0 +1,20 @@ +|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|;+0#0000001#ffff4012|++0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|;+0#0000001#ffff4012|-+0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 +|;+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +>;+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +@75 +|.+0#e000002&|,+0#0000001#ffff4012|.+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|,+0#0000001#ffff4012|$+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|k|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|z|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|A|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|9|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +@57|1|9@1|,|1| @8|1|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_12.dump b/runtime/syntax/testdir/dumps/vim_ex_range_12.dump new file mode 100644 index 0000000000..5d3efa1e88 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_12.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|,+0#0000001#ffff4012|'+0#e000002#ffffff0|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|(|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +>.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|<|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|`|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0@1|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|,+0#0000001#ffff4012|++0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +@57|2|1|7|,|1| @8|1@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_13.dump b/runtime/syntax/testdir/dumps/vim_ex_range_13.dump new file mode 100644 index 0000000000..17b9d81432 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_13.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|,+0#0000001#ffff4012|++0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|,+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|.+0#e000002&|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +@75 +>.+0#e000002&|;+0#0000001#ffff4012|.+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|;+0#0000001#ffff4012|$+0#e000002#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|k|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|z|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|A|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|K|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|0|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|9|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|[|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|{|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +@57|2|3|5|,|1| @8|1|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_14.dump b/runtime/syntax/testdir/dumps/vim_ex_range_14.dump new file mode 100644 index 0000000000..db82c4d822 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_14.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|;+0#0000001#ffff4012|'+0#e000002#ffffff0|{|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|(|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|<|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +>.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|`|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0@1|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 +|.+0#e000002&|;+0#0000001#ffff4012|++0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|;+0#0000001#ffff4012|-+0#00e0003#ffffff0|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|.+0#e000002&|;+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +@57|2|5|3|,|1| @8|1|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_15.dump b/runtime/syntax/testdir/dumps/vim_ex_range_15.dump new file mode 100644 index 0000000000..b3e75513d3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_15.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|;+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|.+0#e000002&|;+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +@75 +|"+0#0000e05&| |s|p|e|c|i|a|l| |2|a|d@1|r| +0#0000000&@59 +@75 +>%+0#e000002&|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +|*+0#e000002&|p+0#af5f00255&|r|i|n|t| +0#0000000&@68 +@75 +|"+0#0000e05&| |p|a|i|r|e|d| |m|a|r|k|s| +0#0000000&@60 +@75 +|'+0#e000002&|<|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|'+0#e000002&|(|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|'+0#e000002&|{|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|'+0#e000002&|[|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +@75 +@75 +|"+0#0000e05&| |o|f@1|s|e|t|s| +0#0000000&@65 +@75 +|"+0#0000e05&| |:|h|e|l|p| |:|r|a|n|g|e|-|o|f@1|s|e|t| +0#0000000&@53 +@57|2|7|1|,|1| @8|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_16.dump b/runtime/syntax/testdir/dumps/vim_ex_range_16.dump new file mode 100644 index 0000000000..fa0630ef7a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_16.dump @@ -0,0 +1,20 @@ +|"+0#0000e05#ffffff0| |:|h|e|l|p| |:|r|a|n|g|e|-|o|f@1|s|e|t| +0#0000000&@53 +@75 +|:|-+0#00e0003&|1@1|;+0#0000001#ffff4012|++0#00e0003#ffffff0|1| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@61 +|:|-+0#00e0003&@10|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|1|0| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@52 +|:|?+0#e000e06&|E+0#0000000&|a|c|h| |l|i|n|e|?+0#e000e06&|-+0#00e0003&|;+0#0000001#ffff4012|++0#00e0003#ffffff0| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@53 +>:|'+0#e000002&|{|++0#00e0003&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|++0#00e0003&|2| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|:|'+0#e000002&|{|++0#00e0003&|1|;+0#0000001#ffff4012|'+0#e000002#ffffff0|)|-+0#00e0003&|1| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@75 +|"+0#0000e05&| |s|i|g|n|-|l|e|s@1| |p|o|s|i|t|i|v|e| |o|f@1|s|e|t|s| +0#0000000&@46 +@75 +|.+0#e000002&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|.+0#e000002#ffffff0|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|.+0#e000002&|1+0#00e0003&|3|,+0#0000001#ffff4012|.+0#e000002#ffffff0|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|4+0#e000002&|2| +0#0000000&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@61 +|4+0#e000002&|2| +0#0000000&|1+0#00e0003&|3|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@54 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@44 +@57|2|8|9|,|1| @8|1|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_17.dump b/runtime/syntax/testdir/dumps/vim_ex_range_17.dump new file mode 100644 index 0000000000..98addcecfb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_17.dump @@ -0,0 +1,20 @@ +|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@44 +|*+0#e000002&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 +@75 +|"+0#0000e05&| |,| |s|e|p|a|r|a|t|o|r| +0#0000000&@61 +@75 +>.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|.+0#e000002#ffffff0|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|$+0#e000002#ffffff0|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|k|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|z|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|A|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|K|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|0|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|9|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|[|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +@57|3|0|7|,|1| @8|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_18.dump b/runtime/syntax/testdir/dumps/vim_ex_range_18.dump new file mode 100644 index 0000000000..01cc55c6b3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_18.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|(|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|<|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +>.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|`|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0@1|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|++0#00e0003#ffffff0@1|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@57|3|2|5|,|1| @8|1|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_19.dump b/runtime/syntax/testdir/dumps/vim_ex_range_19.dump new file mode 100644 index 0000000000..57b89ca38a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_19.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|++0#00e0003&|1|3|,+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@75 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|.+0#e000002#ffffff0|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|$+0#e000002#ffffff0|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +>.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|k|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|z|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|A|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|K|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|0|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|9|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|[|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|]|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|}|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|(|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +@57|3|4|3|,|1| @8|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_20.dump b/runtime/syntax/testdir/dumps/vim_ex_range_20.dump new file mode 100644 index 0000000000..ddc973e0d2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_20.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|(|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|)|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|<|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|>|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|`|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +>.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0@1|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|++0#00e0003#ffffff0|-|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|-+0#00e0003#ffffff0@1|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|-|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|-|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@75 +@57|3|6|1|,|1| @8|2|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_21.dump b/runtime/syntax/testdir/dumps/vim_ex_range_21.dump new file mode 100644 index 0000000000..3f97c8194a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_21.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|"+0#0000e05&| |;| |s|e|p|a|r|a|t|o|r| +0#0000000&@61 +@75 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|.+0#e000002#ffffff0|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|$+0#e000002#ffffff0|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +>.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|k|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|z|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|A|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|K|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|0|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|9|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|[|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|]|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|{|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|}|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|(|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +@57|3|7|9|,|1| @8|2|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_22.dump b/runtime/syntax/testdir/dumps/vim_ex_range_22.dump new file mode 100644 index 0000000000..bebdd2dc3b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_22.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|(|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|)|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|<|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|>|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|`|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +>.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0@1|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|++0#00e0003#ffffff0@1|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|-+0#00e0003#ffffff0|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|+|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@75 +@57|3|9|7|,|1| @8|2@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_23.dump b/runtime/syntax/testdir/dumps/vim_ex_range_23.dump new file mode 100644 index 0000000000..4f2d9f498c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_23.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|.+0#e000002#ffffff0|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|$+0#e000002#ffffff0|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +>.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|k|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|z|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|A|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|K|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|Z|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|0|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|9|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|[|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|]|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|{|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|}|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|(|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|)|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|<|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +@57|4|1|5|,|1| @8|2|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_24.dump b/runtime/syntax/testdir/dumps/vim_ex_range_24.dump new file mode 100644 index 0000000000..9b6a4ad1fa --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_24.dump @@ -0,0 +1,20 @@ +|.+0#e000002#ffffff0|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|<|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|>|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|`|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0@1|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +>.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|++0#00e0003#ffffff0|-|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|-+0#00e0003#ffffff0@1|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@60 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|++0#00e0003#ffffff0|4|2|-|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|-+0#00e0003#ffffff0|4|2|-|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +@75 +@75 +|"+0#0000e05&| |b|a|r|e| |r|a|n|g|e|s| +0#0000000&@61 +@57|4|3@1|,|1| @8|2|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_25.dump b/runtime/syntax/testdir/dumps/vim_ex_range_25.dump new file mode 100644 index 0000000000..aefeaea778 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_25.dump @@ -0,0 +1,20 @@ +|"+0#0000e05#ffffff0| |b|a|r|e| |r|a|n|g|e|s| +0#0000000&@61 +@75 +|.+0#e000002&| +0#0000000&@73 +|$+0#e000002&| +0#0000000&@73 +|4+0#e000002&|2| +0#0000000&@72 +>'+0#e000002&|a| +0#0000000&@72 +|'+0#e000002&|k| +0#0000000&@72 +|'+0#e000002&|z| +0#0000000&@72 +|'+0#e000002&|A| +0#0000000&@72 +|'+0#e000002&|K| +0#0000000&@72 +|'+0#e000002&|Z| +0#0000000&@72 +|'+0#e000002&|0| +0#0000000&@72 +|'+0#e000002&|9| +0#0000000&@72 +|'+0#e000002&|[| +0#0000000&@72 +|'+0#e000002&|]| +0#0000000&@72 +|'+0#e000002&|{| +0#0000000&@72 +|'+0#e000002&|}| +0#0000000&@72 +|'+0#e000002&|(| +0#0000000&@72 +|'+0#e000002&|)| +0#0000000&@72 +@57|4|5|1|,|1| @8|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_26.dump b/runtime/syntax/testdir/dumps/vim_ex_range_26.dump new file mode 100644 index 0000000000..803a16f0f8 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_26.dump @@ -0,0 +1,20 @@ +|'+0#e000002#ffffff0|)| +0#0000000&@72 +|'+0#e000002&|<| +0#0000000&@72 +|'+0#e000002&|>| +0#0000000&@72 +|'+0#e000002&|`| +0#0000000&@72 +|'+0#e000002&@1| +0#0000000&@72 +>'+0#e000002&|"| +0#0000000&@72 +|'+0#e000002&|^| +0#0000000&@72 +|'+0#e000002&|.| +0#0000000&@72 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@64 +|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @65 +|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@64 +|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @65 +|:|\+0#e000002&|/| +0#0000000&@71 +|:|\+0#e000002&|?| +0#0000000&@71 +|:|\+0#e000002&|&| +0#0000000&@71 +|++0#00e0003&| +0#0000000&@73 +|-+0#00e0003&| +0#0000000&@73 +|++0#00e0003&|4|2| +0#0000000&@71 +|-+0#00e0003&|4|2| +0#0000000&@71 +@57|4|6|9|,|1| @8|2|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_27.dump b/runtime/syntax/testdir/dumps/vim_ex_range_27.dump new file mode 100644 index 0000000000..511d90c91f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_27.dump @@ -0,0 +1,20 @@ +|-+0#00e0003#ffffff0|4|2| +0#0000000&@71 +@75 +|:|.+0#e000002&| +0#0000000&@72 +|:|$+0#e000002&| +0#0000000&@72 +|:|4+0#e000002&|2| +0#0000000&@71 +>:|'+0#e000002&|a| +0#0000000&@71 +|:|'+0#e000002&|k| +0#0000000&@71 +|:|'+0#e000002&|z| +0#0000000&@71 +|:|'+0#e000002&|A| +0#0000000&@71 +|:|'+0#e000002&|K| +0#0000000&@71 +|:|'+0#e000002&|Z| +0#0000000&@71 +|:|'+0#e000002&|0| +0#0000000&@71 +|:|'+0#e000002&|9| +0#0000000&@71 +|:|'+0#e000002&|[| +0#0000000&@71 +|:|'+0#e000002&|]| +0#0000000&@71 +|:|'+0#e000002&|{| +0#0000000&@71 +|:|'+0#e000002&|}| +0#0000000&@71 +|:|'+0#e000002&|(| +0#0000000&@71 +|:|'+0#e000002&|)| +0#0000000&@71 +@57|4|8|7|,|1| @8|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_28.dump b/runtime/syntax/testdir/dumps/vim_ex_range_28.dump new file mode 100644 index 0000000000..f0d427200d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_28.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|'+0#e000002&|)| +0#0000000&@71 +|:|'+0#e000002&|<| +0#0000000&@71 +|:|'+0#e000002&|>| +0#0000000&@71 +|:|'+0#e000002&|`| +0#0000000&@71 +|:|'+0#e000002&@1| +0#0000000&@71 +>:|'+0#e000002&|"| +0#0000000&@71 +|:|'+0#e000002&|^| +0#0000000&@71 +|:|'+0#e000002&|.| +0#0000000&@71 +|:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@63 +|:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @64 +|:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@63 +|:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @64 +|:|\+0#e000002&|/| +0#0000000&@71 +|:|\+0#e000002&|?| +0#0000000&@71 +|:|\+0#e000002&|&| +0#0000000&@71 +|:|++0#00e0003&| +0#0000000&@72 +|:|-+0#00e0003&| +0#0000000&@72 +|:|++0#00e0003&|4|2| +0#0000000&@70 +|:|-+0#00e0003&|4|2| +0#0000000&@70 +@57|5|0|5|,|1| @8|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_29.dump b/runtime/syntax/testdir/dumps/vim_ex_range_29.dump new file mode 100644 index 0000000000..2c345c87eb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_29.dump @@ -0,0 +1,20 @@ +|:+0&#ffffff0|-+0#00e0003&|4|2| +0#0000000&@70 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |.+0#e000002&| +0#0000000&@60 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |$+0#e000002&| +0#0000000&@60 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |4+0#e000002&|2| +0#0000000&@59 +>e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|a| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|k| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|z| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|A| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|K| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|Z| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|0| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|9| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|[| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|]| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|{| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|}| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|(| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|)| +0#0000000&@59 +@57|5|2|3|,|1| @8|2|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_30.dump b/runtime/syntax/testdir/dumps/vim_ex_range_30.dump new file mode 100644 index 0000000000..3a6b83ab55 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_30.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|)| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|<| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|>| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|`| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&@1| +0#0000000&@59 +>e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|"| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|^| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|.| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @52 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @52 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |\+0#e000002&|/| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |\+0#e000002&|?| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |\+0#e000002&|&| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |++0#00e0003&| +0#0000000&@60 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |-+0#00e0003&| +0#0000000&@60 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |++0#00e0003&|4|2| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |-+0#00e0003&|4|2| +0#0000000&@58 +@57|5|4|1|,|1| @8|3|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_31.dump b/runtime/syntax/testdir/dumps/vim_ex_range_31.dump new file mode 100644 index 0000000000..4887ca7ad3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_31.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |-+0#00e0003&|4|2| +0#0000000&@58 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|.+0#e000002&| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|$+0#e000002&| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|4+0#e000002&|2| +0#0000000&@58 +>e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|a| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|k| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|z| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|A| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|K| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|Z| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|0| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|9| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|[| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|]| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|{| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|}| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|(| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|)| +0#0000000&@58 +@57|5@1|9|,|1| @8|3|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_32.dump b/runtime/syntax/testdir/dumps/vim_ex_range_32.dump new file mode 100644 index 0000000000..115d9c4d70 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_32.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|)| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|<| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|>| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|`| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&@1| +0#0000000&@58 +>e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|"| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|^| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|.| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@50 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@50 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|\+0#e000002&|/| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|\+0#e000002&|?| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|\+0#e000002&|&| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|++0#00e0003&| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|-+0#00e0003&| +0#0000000&@59 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|++0#00e0003&|4|2| +0#0000000&@57 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |-+0#00e0003&|4|2| +0#0000000&@58 +@57|5|7@1|,|1| @8|3|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_33.dump b/runtime/syntax/testdir/dumps/vim_ex_range_33.dump new file mode 100644 index 0000000000..ff0aadd55e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_33.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |-+0#00e0003&|4|2| +0#0000000&@58 +@75 +@75 +|"+0#0000e05&| |r|a|n|g|e| |(|w|i|t|h| |w|h|i|t|e|s|p|a|c|e|)| +0#0000000&@49 +@75 +>1+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@67 +|2+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@67 +|3+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@67 +@75 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|&+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|~+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|@+0#af5f00255&| +0#0000000&@67 +|"+0#0000e05&| |4|2|,|4|2| |*| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|>+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|<+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|#+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|=+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|!+0#af5f00255&| +0#0000000&@67 +@75 +@57|5|9|5|,|1| @8|3@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_34.dump b/runtime/syntax/testdir/dumps/vim_ex_range_34.dump new file mode 100644 index 0000000000..3741275d01 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_34.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|N+0#af5f00255&|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|P+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|X+0#af5f00255&| +0#0000000&@67 +@75 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@62 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b|c|l|e|a|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|l@1| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|d|e|d|u|p|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@61 +@57|6|1|3|,|1| @8|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_35.dump b/runtime/syntax/testdir/dumps/vim_ex_range_35.dump new file mode 100644 index 0000000000..c3372f7fac --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_35.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g@1|l|o|b|a|l| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|l|o|c|a|l| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|s| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@60 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|s|c|i@1| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|F|o@1| @57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|g|r|o|u|p| +0#0000000&|E|N|D| @57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|a|d@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|a|l|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|m+0#af5f00255&|s|w|i|n| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|e|h|a|v|e| +0#0000000&|x+0#af5f00255&|t|e|r|m| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|l|a|s|t| +0#0000000&@63 +@57|6|3|1|,|1| @8|3|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_36.dump b/runtime/syntax/testdir/dumps/vim_ex_range_36.dump new file mode 100644 index 0000000000..75da74c259 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_36.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|l|a|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@60 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k|a|d@1| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k|d|e|l| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|a|k|l|i|s|t| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|f|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|f@1|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|f@1|e|r|s| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@62 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +@57|6|4|9|,|1| @8|3|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_37.dump b/runtime/syntax/testdir/dumps/vim_ex_range_37.dump new file mode 100644 index 0000000000..5f48340fe5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_37.dump @@ -0,0 +1,20 @@ +| +0#e000002#ffffff0@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|b|o|v|e| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|a|t|c|h| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&@1| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&@1|l|o|s|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|d| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|d|o| +0#0000000&@65 +@57|6@1|7|,|1| @8|3|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_38.dump b/runtime/syntax/testdir/dumps/vim_ex_range_38.dump new file mode 100644 index 0000000000..3d43b0e0d9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_38.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|d|o| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|e|n|t|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|e|x|p|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|f|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|f|i|l|e| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|a|n|g|e|s| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|d|i|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|e|c|k|p|a|t|h| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|a|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|e|a|r|j|u|m|p|s| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|i|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|l|o|s|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|a|p| +0#0000000&@64 +@57|6|8|5|,|1| @8|3|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_39.dump b/runtime/syntax/testdir/dumps/vim_ex_range_39.dump new file mode 100644 index 0000000000..9f500436b5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_39.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|e|w|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|e|x|t| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|l|o|r|s|c|h|e|m|e| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|m|p|i|l|e|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@60 +@57|7|0|3|,|1| @8|3|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_40.dump b/runtime/syntax/testdir/dumps/vim_ex_range_40.dump new file mode 100644 index 0000000000..fcbfa774ea --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_40.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|p|e|n| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|q|u|i|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|s|c|o|p|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|s|t|a|g| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|b|u|g| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|f| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|f|c|o|m|p|i|l|e| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|f|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@58 +@57|7|2|1|,|1| @8|4|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_41.dump b/runtime/syntax/testdir/dumps/vim_ex_range_41.dump new file mode 100644 index 0000000000..29218adb2a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_41.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|f|u|n|c|t|i|o|n| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|e|l|m|a|r|k|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@61 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|o|f@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|p|a|t|c|h| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|s|p|l|i|t| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|t|h|i|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|f@1|u|p|d|a|t|e| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|g|r|a|p|h|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|s|a|s@1|e|m|b|l|e| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|i|s|p|l|a|y| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|j|u|m|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|l|i|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|r|o|p| +0#0000000&@64 +@57|7|3|9|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_42.dump b/runtime/syntax/testdir/dumps/vim_ex_range_42.dump new file mode 100644 index 0000000000..eb140ff964 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_42.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|r|o|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|d+0#af5f00255&|s|p|l|i|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|a|r|l|i|e|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|h|l| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|n| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|d|i|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|l|s|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|l|s|e|i|f| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|f|o|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|i|f| +0#0000000&@63 +@57|7|5|7|,|1| @8|4|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_43.dump b/runtime/syntax/testdir/dumps/vim_ex_range_43.dump new file mode 100644 index 0000000000..43efacc335 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_43.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|i|f| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|t|r|y| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|d|w|h|i|l|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|n|e|w| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|v|a|l| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|e|c|u|t|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|i|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|e+0#af5f00255&|x|u|s|a|g|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|e|s| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|e|t|y|p|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|a|l| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|a|l@1|y| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|d| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|r|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|x|d|e|l| +0#0000000&@62 +@57|7@1|5|,|1| @8|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_44.dump b/runtime/syntax/testdir/dumps/vim_ex_range_44.dump new file mode 100644 index 0000000000..e69539c2aa --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_44.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|i|x|d|e|l| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@58 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|o|r| +0#0000000&|f|o@1| |i+0#af5f00255&|n| +0#0000000&|b|a|r| ||| |e+0#af5f00255&|n|d|f|o|r| +0#0000000&@45 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|o|t|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|r|e|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|u|i| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|g+0#af5f00255&|v|i|m| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|c|l|o|s|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|f|i|n|d| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@60 +@57|7|9|3|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_45.dump b/runtime/syntax/testdir/dumps/vim_ex_range_45.dump new file mode 100644 index 0000000000..2068212d37 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_45.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|e|l|p|t|a|g|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|i|d|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|i|g|h|l|i|g|h|t| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|i|s|t|o|r|y| +0#0000000&@61 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@62 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|a|b@1|r|e|v| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|a|b|c|l|e|a|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|f| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|j|u|m|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|l|i|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|m|p|o|r|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@57 +@57|8|1@1|,|1| @8|4|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_46.dump b/runtime/syntax/testdir/dumps/vim_ex_range_46.dump new file mode 100644 index 0000000000..3b0dbbf5b1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_46.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|a|b@1|r|e|v| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|n|t|r|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@61 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|s|p|l|i|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|u|n|a|b@1|r|e|v| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|i+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|j+0#af5f00255&|o|i|n| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|j+0#af5f00255&|u|m|p|s| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@60 +@57|8|2|9|,|1| @8|4|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_47.dump b/runtime/syntax/testdir/dumps/vim_ex_range_47.dump new file mode 100644 index 0000000000..bd67b634f9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_47.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|e|x|p|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|d@1|f|i|l|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|f|t|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|n|g|u|a|g|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|s|t| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|a|t|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|e|l|o|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|o|t@1|o|m| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|d| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|h|d|i|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|l|o|s|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|d|o| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|f|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|g|a|c|y| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|t| +0#0000000&@65 +@57|8|4|7|,|1| @8|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_48.dump b/runtime/syntax/testdir/dumps/vim_ex_range_48.dump new file mode 100644 index 0000000000..e7d721c71c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_48.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|e|x|p|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|e|t|e|x|p|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|e|t|f|i|l|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|r|e|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|i|s|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&@1| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&@1|a|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&@1|i|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|k|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +@57|8|6|5|,|1| @8|4|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_49.dump b/runtime/syntax/testdir/dumps/vim_ex_range_49.dump new file mode 100644 index 0000000000..a99c1889e2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_49.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|f|i|l|e| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|N|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|"+0#0000e05&| |4|2|,|4|2| |l|o|a|d|k|e|y|m|a|p| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|a|d|v|i|e|w| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|c|k|v|a|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|l|d|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|o|p|e|n| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|s| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|t|a|g| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a| +0#0000000&@65 +@57|8@1|3|,|1| @8|4|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_50.dump b/runtime/syntax/testdir/dumps/vim_ex_range_50.dump new file mode 100644 index 0000000000..c30bd75e4c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_50.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@60 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|k|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|p| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|p|c|l|e|a|r| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|r|k| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|r|k|s| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|e|n|u|t|r|a|n|s|l|a|t|e| +0#0000000&@55 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|e|x|r|c| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|s|e|s@1|i|o|n| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@61 +@57|9|0|1|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_51.dump b/runtime/syntax/testdir/dumps/vim_ex_range_51.dump new file mode 100644 index 0000000000..813c6db90f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_51.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|s|p|e|l@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|v|i|e|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|k|v|i|m|r|c| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|o|d|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|o|v|e| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|b|c|l|o|s|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|b|k|e|y| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|b|s|t|a|r|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|e|w| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@58 +@57|9|1|9|,|1| @8|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_52.dump b/runtime/syntax/testdir/dumps/vim_ex_range_52.dump new file mode 100644 index 0000000000..fc988c20c1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_52.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|h|l|s|e|a|r|c|h| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|a|b@1|r|e|v| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|m|a|p| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|r|m|a|l| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|n+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|n|l|y| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|p|e|n| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|p|t|i|o|n|s| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +@57|9|3|7|,|1| @8|5|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_53.dump b/runtime/syntax/testdir/dumps/vim_ex_range_53.dump new file mode 100644 index 0000000000..2b019cc423 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_53.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|o+0#af5f00255&|w|n|s|y|n|t|a|x| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|a|c|k|a|d@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|a|c|k|l|o|a|d|a|l@1| +0#0000000&@57 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|c|l|o|s|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|e|d|i|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|e|r|l| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|o|p| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|o|p|u|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&@1|o|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|e|s|e|r|v|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|f|d|e|l| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|f|i|l|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|m|p|t|f|i|n|d| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@58 +@57|9|5@1|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_54.dump b/runtime/syntax/testdir/dumps/vim_ex_range_54.dump new file mode 100644 index 0000000000..0adfe98cd3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_54.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|r|o|m|p|t|r|e|p|l| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|a|g| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|j|u|m|p| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|l|a|s|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|u|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|w|d| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|3| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|3|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@62 +@57|9|7|3|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_55.dump b/runtime/syntax/testdir/dumps/vim_ex_range_55.dump new file mode 100644 index 0000000000..698a0d7b24 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_55.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x|d|o| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|q+0#af5f00255&|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|q+0#af5f00255&|u|i|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|q+0#af5f00255&|u|i|t|a|l@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|a|d| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|c|o|v|e|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|i|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|r|a|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|r|a|w|s|t|a|t|u|s| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|d|r|a|w|t|a|b|l|i|n|e| +0#0000000&@55 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|g|i|s|t|e|r|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|t|a|b| +0#0000000&@63 +@57|9@1|1|,|1| @8|5@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_56.dump b/runtime/syntax/testdir/dumps/vim_ex_range_56.dump new file mode 100644 index 0000000000..a4eb5c2088 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_56.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|t|a|b| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|e|w|i|n|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|i|g|h|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&@58 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|b|y| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|n|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|r+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|a|v|e|a|s| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|a|l@1| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|f|i|r|s|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|l|a|s|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@58 +@57|1|0@1|9|,|1| @7|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_57.dump b/runtime/syntax/testdir/dumps/vim_ex_range_57.dump new file mode 100644 index 0000000000..d4f1b1877d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_57.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|r|e|w|i|n|d| +0#0000000&@60 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|r|i|p|t|e|n|c|o|d|i|n|g| +0#0000000&@54 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|r|i|p|t|v|e|r|s|i|o|n| +0#0000000&@55 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|c|s|c|o|p|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t|f|i|l|e|t|y|p|e| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t|g|l|o|b|a|l| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|f|i|n|d| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|h|e|l@1| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|g|n| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@62 +@57|1|0|2|7|,|1| @7|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_58.dump b/runtime/syntax/testdir/dumps/vim_ex_range_58.dump new file mode 100644 index 0000000000..8ab1315a7d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_58.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|l|e|n|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|i|m|a|l|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|a|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|e@1|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|l|e@1|p|!| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|a|g|i|c| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|m|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|o|r|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|o|u|r|c|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|d|u|m|p| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@59 +@57|1|0|4|5|,|1| @7|5|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_59.dump b/runtime/syntax/testdir/dumps/vim_ex_range_59.dump new file mode 100644 index 0000000000..825c63a29a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_59.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|i|n|f|o| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|r|e|p|a|l@1| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@59 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|l|i|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|g| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|r|t|g|r|e|p|l|a|c|e| +0#0000000&@55 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|r|t|i|n|s|e|r|t| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|a|r|t|r|e|p|l|a|c|e| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|j|u|m|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|o|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|o|p|i|n|s|e|r|t| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|t|s|e|l|e|c|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@61 +@57|1|0|6|3|,|1| @7|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_60.dump b/runtime/syntax/testdir/dumps/vim_ex_range_60.dump new file mode 100644 index 0000000000..494fe5a90c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_60.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|u|s|p|e|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|v|i|e|w| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|w|a|p|n|a|m|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|y|n|c|b|i|n|d| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|s+0#af5f00255&|y|n|t|i|m|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|f|i|r|s|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|l|a|s|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|n|e|w| +0#0000000&@62 +@57|1|0|8|1|,|1| @7|6|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_61.dump b/runtime/syntax/testdir/dumps/vim_ex_range_61.dump new file mode 100644 index 0000000000..9d443eab13 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_61.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|n|e|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@57 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|r|e|w|i|n|d| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|b|s| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|g| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|a|g|s| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|d| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|h|d|i|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|l| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|l|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|e|a|r|o|f@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|f|i|r|s|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|h|r|o|w| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|j|u|m|p| +0#0000000&@63 +@57|1|0|9@1|,|1| @7|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_62.dump b/runtime/syntax/testdir/dumps/vim_ex_range_62.dump new file mode 100644 index 0000000000..7d7db808b6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_62.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|j|u|m|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|a|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|l|u|n|m|e|n|u| +0#0000000&@60 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|o|p|l|e|f|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|r|y| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|s|e|l|e|c|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|t+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@56 +@57|1@2|7|,|1| @7|6|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_63.dump b/runtime/syntax/testdir/dumps/vim_ex_range_63.dump new file mode 100644 index 0000000000..5b9789f6c1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_63.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|a|b@1|r|e|v|i|a|t|e| +0#0000000&@56 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o|j|o|i|n| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|d|o|l|i|s|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|h|i|d|e| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|l|e|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|l|o|c|k|v|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|m|a|p| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|m|e|n|u| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|e|r|s|i|o|n| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|e|w| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@58 +@57|1@1|3|5|,|1| @7|6|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_64.dump b/runtime/syntax/testdir/dumps/vim_ex_range_64.dump new file mode 100644 index 0000000000..88dd3a7e39 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_64.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|s|u|a|l| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|i|u|s|a|g|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|n|e|w| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|s|p|l|i|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|v+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|h|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|p|o|s| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|i|n|s|i|z|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|n|e|x|t| +0#0000000&@63 +@57|1@1|5|3|,|1| @7|6|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_65.dump b/runtime/syntax/testdir/dumps/vim_ex_range_65.dump new file mode 100644 index 0000000000..e362e58556 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_65.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|q| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|q|a|l@1| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|r|i|t|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|u|n|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|w+0#af5f00255&|v|i|m|i|n|f|o| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|i|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|m|a|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|m|a|p|c|l|e|a|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|n|o|r|e|m|a|p| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|r|e|s|t|o|r|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|u|n|m|a|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|x+0#af5f00255&|u|n|m|e|n|u| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|y+0#af5f00255&|a|n|k| +0#0000000&@64 +@57|1@1|7|1|,|1| @7|6@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_66.dump b/runtime/syntax/testdir/dumps/vim_ex_range_66.dump new file mode 100644 index 0000000000..caf04176f2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_66.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|y+0#af5f00255&|a|n|k| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|z+0#af5f00255&| +0#0000000&@67 +@75 +@75 +|"+0#0000e05&| |r|a|n|g|e| +0#0000000&@67 +> @74 +|1+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 +|2+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 +|3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 +@75 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|&+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|~+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|@+0#af5f00255&| +0#0000000&@68 +|"+0#0000e05&| |4|2|,|4|2|*| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|>+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|<+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|#+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|=+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|!+0#af5f00255&| +0#0000000&@68 +@57|1@1|8|9|,|0|-|1| @5|6|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_67.dump b/runtime/syntax/testdir/dumps/vim_ex_range_67.dump new file mode 100644 index 0000000000..69cc76e888 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_67.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|!+0#af5f00255&| +0#0000000&@68 +@75 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|N+0#af5f00255&|e|x|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|P+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|X+0#0000000&| @13|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +> @74 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|p@1|e|n|d| +0#0000000&@63 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b@1|r|e|v|i|a|t|e| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b|c|l|e|a|r| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|b|o|v|e|l|e|f|t| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|l@1| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|a|d@1| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g|d|e|d|u|p|e| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|d|e|l|e|t|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|d|o| +0#0000000&@64 +@57|1|2|0|7|,|0|-|1| @5|6|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_68.dump b/runtime/syntax/testdir/dumps/vim_ex_range_68.dump new file mode 100644 index 0000000000..49e5b30742 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_68.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|e|d|i|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g@1|l|o|b|a|l| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g|l|o|c|a|l| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|r|g|s| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#af5f00255&|r|g|u|m|e|n|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|s|c|i@1| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|g|r|o|u|p| |E|N|D| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|g|r|o|u|p| |F|o@1| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|a+0#0000000&|u|t|o|c|m|d| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|a|d@1| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|a|l@1| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|a|l|t| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|d|e|l|e|t|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|e|h|a|v|e| |m|s|w|i|n| @2|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|e|h|a|v|e| |x|t|e|r|m| @2|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|e|l|o|w|r|i|g|h|t| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|2@1|5|,|1| @7|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_69.dump b/runtime/syntax/testdir/dumps/vim_ex_range_69.dump new file mode 100644 index 0000000000..c546cd0451 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_69.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|f|i|r|s|t| +0#0000000&@8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|l|a|s|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|m|o|d|i|f|i|e|d| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|n|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|N|e|x|t| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|o|t|r|i|g|h|t| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k|a|d@1| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k|d|e|l| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k|l|i|s|t| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|e|a|k| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|r|o|w|s|e| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|u|f|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|u|f@1|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#0000000&|u|f@1|e|r|s| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|u|n|l|o|a|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|b+0#af5f00255&|w|i|p|e|o|u|t| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@63 +@57|1|2|4|3|,|1| @7|7|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_70.dump b/runtime/syntax/testdir/dumps/vim_ex_range_70.dump new file mode 100644 index 0000000000..470193172e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_70.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|h|a|n|g|e| +0#0000000&@63 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|b@1|r|e|v| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|b|c|l|e|a|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|b|o|v|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|d@1|e|x|p|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|d@1|f|i|l|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|f|t|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|a|l@1| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|a|t|c|h| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|b|e|l|o|w| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|b|o|t@1|o|m| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&@1| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&@1|l|o|s|e| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|d| @12|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|2|6|1|,|1| @7|7|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_71.dump b/runtime/syntax/testdir/dumps/vim_ex_range_71.dump new file mode 100644 index 0000000000..c4856672c3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_71.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|d| @12|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|d|o| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|e|n|t|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|e|x|p|r| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|f|d|o| +0#0000000&@65 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|f|i|l|e| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|f|i|r|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|g|e|t|e|x|p|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|g|e|t|f|i|l|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|h|a|n|g|e|s| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|h|d|i|r| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|h|e|c|k|p|a|t|h| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|h|e|c|k|t|i|m|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|l|a|s|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|l|e|a|r|j|u|m|p|s| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|l|i|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|l|o|s|e| +0#0000000&@64 +@57|1|2|7|9|,|1| @7|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_72.dump b/runtime/syntax/testdir/dumps/vim_ex_range_72.dump new file mode 100644 index 0000000000..76dd91c9c9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_72.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|l|o|s|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|e|w|e|r| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|N|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|N|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|n|o|r|e|a|b@1|r|e|v| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|o|l|d|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|l|o|r|s|c|h|e|m|e| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|m|c|l|e|a|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|m@1|a|n|d| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|m|p|i|l|e|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|f|i|r|m| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|2|9|7|,|1| @7|7|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_73.dump b/runtime/syntax/testdir/dumps/vim_ex_range_73.dump new file mode 100644 index 0000000000..1109507f59 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_73.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|o|n|t|i|n|u|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|o|p|e|n| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|o|p|y| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|p|f|i|l|e| +0#0000000&@63 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|q|u|i|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|s|c|o|p|e| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|s|t|a|g| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|u|n|a|b@1|r|e|v| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|c+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|e|b|u|g@1|r|e@1|d|y| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|b|u|g| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f|c|o|m|p|i|l|e| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f|e|r| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|3|1|5|,|1| @7|7|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_74.dump b/runtime/syntax/testdir/dumps/vim_ex_range_74.dump new file mode 100644 index 0000000000..301e9cba2d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_74.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|f| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|l|c|o|m@1|a|n|d| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|e|l|e|t|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|l|f|u|n|c|t|i|o|n| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|e|l|m|a|r|k|s| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|i|f@1|g|e|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|o|f@1| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|p|a|t|c|h| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|i|f@1|p|u|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|s|p|l|i|t| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|t|h|i|s| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|f@1|u|p|d|a|t|e| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|g|r|a|p|h|s| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|s|a|s@1|e|m|b|l|e| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|i|s|p|l|a|y| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|j|u|m|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|l|i|s|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|o|a|u|t|o|a|l@1| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|o|a|u|t|o|c|m|d| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|3@2|,|1| @7|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_75.dump b/runtime/syntax/testdir/dumps/vim_ex_range_75.dump new file mode 100644 index 0000000000..4a6164f9b0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_75.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|o|a|u|t|o|c|m|d| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#0000000&|r|o|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|d+0#af5f00255&|s|p|l|i|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|a|r|l|i|e|r| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|c|o|n|s|o|l|e| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|e|r@1| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|h|l| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|m|s|g| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|n| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|c|h|o|w|i|n|d|o|w| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|d|i|t| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|l|s|e|i|f| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|l|s|e| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d@1|e|f| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|f|o|r| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|f|u|n|c|t|i|o|n| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|3|5|1|,|1| @7|7|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_76.dump b/runtime/syntax/testdir/dumps/vim_ex_range_76.dump new file mode 100644 index 0000000000..b16b72e250 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_76.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|f|u|n|c|t|i|o|n| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|i|f| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|t|r|y| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|d|w|h|i|l|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|n|e|w| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|v|a|l| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x|e|c|u|t|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#af5f00255&|x|i|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x| @12|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|e+0#0000000&|x|u|s|a|g|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|i|l|e| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|l|e|s| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|l|e|t|y|p|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|l|t|e|r| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|a|l@1|y| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|a|l| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|i|n|d| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|n|i|s|h| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|r|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|3|6|9|,|1| @7|7@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_77.dump b/runtime/syntax/testdir/dumps/vim_ex_range_77.dump new file mode 100644 index 0000000000..d5584638d0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_77.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|r|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|i|x|d|e|l| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d|c|l|o|s|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d@1|o|c|l|o|s|e|d| +0#0000000&@57 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d@1|o@1|p|e|n| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#af5f00255&|o|l|d|o|p|e|n| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|o|r| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|f+0#0000000&|u|n|c|t|i|o|n| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|o|t|o| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|r|e|p| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#af5f00255&|r|e|p|a|d@1| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#0000000&|u|i| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|g+0#0000000&|v|i|m| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#af5f00255&|a|r|d|c|o|p|y| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|c|l|o|s|e| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|f|i|n|d| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|g|r|e|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|3|8|7|,|1| @7|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_78.dump b/runtime/syntax/testdir/dumps/vim_ex_range_78.dump new file mode 100644 index 0000000000..4cc91943a2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_78.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|g|r|e|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|e|l|p|t|a|g|s| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#af5f00255&|i|d|e| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|i|g|h|l|i|g|h|t| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|i|s|t|o|r|y| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|h+0#0000000&|o|r|i|z|o|n|t|a|l| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|n|s|e|r|t| +0#0000000&@63 +| +0#e000002&@3|t|e|x|t| +0#0000000&@66 +|.+0#af5f00255&| +0#0000000&@73 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|a|b@1|r|e|v| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|a|b|c|l|e|a|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|f| @12|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|j|u|m|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|l|i|s|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|p|o|r|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|4|0|5|,|1| @7|7|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_79.dump b/runtime/syntax/testdir/dumps/vim_ex_range_79.dump new file mode 100644 index 0000000000..b6707c92de --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_79.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|m|p|o|r|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|o|r|e|a|b@1|r|e|v| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|n|t|r|o| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#af5f00255&|s|p|l|i|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|u|n|a|b@1|r|e|v| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|i+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|j+0#af5f00255&|o|i|n| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|j+0#0000000&|u|m|p|s| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p|a|l|t| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p|j|u|m|p|s| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p|m|a|r|k|s| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|k+0#0000000&|e@1|p@1|a|t@1|e|r|n|s| @2|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|b|o|v|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@59 +@57|1|4|2|3|,|1| @7|8|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_80.dump b/runtime/syntax/testdir/dumps/vim_ex_range_80.dump new file mode 100644 index 0000000000..d4da785ef5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_80.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|d@1|b|u|f@1|e|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|d@1|e|x|p|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|d@1|f|i|l|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|a|f|t|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|n|g|u|a|g|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|s|t| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|a|t|e|r| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|b|e|f|o|r|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|b|e|l|o|w| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|b|o|t@1|o|m| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|c|d| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|c|h|d|i|r| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|c|l|o|s|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|c|s|c|o|p|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|d|o| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|e|f|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|f|t|a|b|o|v|e| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|g|a|c|y| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|4@1|1|,|1| @7|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_81.dump b/runtime/syntax/testdir/dumps/vim_ex_range_81.dump new file mode 100644 index 0000000000..e5cc3723c3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_81.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|g|a|c|y| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|t| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|e|x|p|r| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|f|d|o| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|f|i|l|e| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|f|i|r|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|g|e|t|b|u|f@1|e|r| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|g|e|t|e|x|p|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|g|e|t|f|i|l|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|g|r|e|p| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|g|r|e|p|a|d@1| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|h|e|l|p|g|r|e|p| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|h|i|s|t|o|r|y| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|i|s|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&@1| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&@1|a|s|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&@1|i|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|k|e| @9|"+0#0000e05&| |n|o|r|a|n|g|e| +0#0000000&@45 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|4|5|9|,|1| @7|8|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_82.dump b/runtime/syntax/testdir/dumps/vim_ex_range_82.dump new file mode 100644 index 0000000000..543dda264f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_82.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|e|w|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|N|e|x|t| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|n|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|N|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|"+0#0000e05&| |4|2|,|4|2|l|o|a|d|k|e|y|m|a|p| @2|"| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|o|a|d|v|i|e|w| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|o|c|k|m|a|r|k|s| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|o|c|k|v|a|r| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|o|l|d|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|o|p|e|n| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|p|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|s| @12|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|t|a|g| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|4|7@1|,|1| @7|8|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_83.dump b/runtime/syntax/testdir/dumps/vim_ex_range_83.dump new file mode 100644 index 0000000000..ca0731cbf9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_83.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|t|a|g| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|u|a|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|l+0#af5f00255&|w|i|n|d|o|w| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|k|e| @10|"+0#0000e05&| |n|o|r|a|n|g|e| +0#0000000&@45 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|p|c|l|e|a|r| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|p| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|a|r|k| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|a|r|k|s| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|a|t|c|h| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|e|n|u| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|e|n|u|t|r|a|n|s|l|a|t|e| @1|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|e|s@1|a|g|e|s| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|e|x|r|c| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|s|e|s@1|i|o|n| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|4|9|5|,|1| @7|8|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_84.dump b/runtime/syntax/testdir/dumps/vim_ex_range_84.dump new file mode 100644 index 0000000000..30afbdd488 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_84.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|s|e|s@1|i|o|n| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|s|p|e|l@1| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|v|i|e|w| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|k|v|i|m|r|c| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#0000000&|o|d|e| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|o|v|e| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|z|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|m+0#af5f00255&|z|s|c|h|e|m|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|b|c|l|o|s|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|b|k|e|y| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|b|s|t|a|r|t| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|e|w| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|e|x|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&@1|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&@1|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|a|u|t|o|c|m|d| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|5|1|3|,|1| @7|8|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_85.dump b/runtime/syntax/testdir/dumps/vim_ex_range_85.dump new file mode 100644 index 0000000000..46a8589e88 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_85.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|a|u|t|o|c|m|d| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|h|l|s|e|a|r|c|h| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|r|e|a|b@1|r|e|v| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|r|e|m|a|p| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|o|r|e|m|e|n|u| +0#0000000&@61 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|o|r|m|a|l| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|o|s|w|a|p|f|i|l|e| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#af5f00255&|u|m|b|e|r| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|n+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|l|d|f|i|l|e|s| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|n|l|y| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#af5f00255&|p|e|n| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|p|t|i|o|n|s| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|5|3|1|,|1| @7|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_86.dump b/runtime/syntax/testdir/dumps/vim_ex_range_86.dump new file mode 100644 index 0000000000..0b2a3b1880 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_86.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|p|t|i|o|n|s| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|o+0#0000000&|w|n|s|y|n|t|a|x| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|a|c|k|a|d@1| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|a|c|k|l|o|a|d|a|l@1| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|c|l|o|s|e| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|e|d|i|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|e|r|l| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|e|r|l|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|o|p| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|o|p|u|p| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&@1|o|p| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|e|s|e|r|v|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|e|v|i|o|u|s| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|f|d|e|l| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|f|i|l|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|m|p|t|f|i|n|d| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|5|4|9|,|1| @7|8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_87.dump b/runtime/syntax/testdir/dumps/vim_ex_range_87.dump new file mode 100644 index 0000000000..30ae53d6e7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_87.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|m|p|t|f|i|n|d| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|r|o|m|p|t|r|e|p|l| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|s|e|a|r|c|h| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|a|g| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|f|i|r|s|t| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|j|u|m|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|l|a|s|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|p|r|e|v|i|o|u|s| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|t|r|e|w|i|n|d| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|t|s|e|l|e|c|t| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|u|t| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#0000000&|w|d| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|3| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|3|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|3|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|d|o| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@63 +@57|1|5|6|7|,|1| @7|8@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_88.dump b/runtime/syntax/testdir/dumps/vim_ex_range_88.dump new file mode 100644 index 0000000000..c2e1a17a93 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_88.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|f|i|l|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|t|h|o|n| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|t|h|o|n|3| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|t|h|o|n|x| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x| +0#0000000&@66 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|p+0#af5f00255&|y|x|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|q+0#0000000&|a|l@1| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|q+0#af5f00255&|u|i|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|q+0#0000000&|u|i|t|a|l@1| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|a|d| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|c|o|v|e|r| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|i|r| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|o| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|r|a|w| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|r|a|w|s|t|a|t|u|s| @2|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|d|r|a|w|t|a|b|l|i|n|e| @1|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|g|i|s|t|e|r|s| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@63 +@57|1|5|8|5|,|1| @7|8|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_89.dump b/runtime/syntax/testdir/dumps/vim_ex_range_89.dump new file mode 100644 index 0000000000..f606598263 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_89.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|s|i|z|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|e|t|a|b| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|t|u|r|n| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|e|w|i|n|d| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|i|g|h|t| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|i|g|h|t|b|e|l|o|w| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|u|b|y| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|u|b|y|d|o| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#af5f00255&|u|b|y|f|i|l|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|u|n|d|o| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|u|n|t|i|m|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|r+0#0000000&|v|i|m|i|n|f|o| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|a|l@1| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|a|n|d|b|o|x| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|a|r|g|u|m|e|n|t| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|a|v|e|a|s| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|a|l@1| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|f|i|r|s|t| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|l|a|s|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|6|0|3|,|1| @7|9|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_90.dump b/runtime/syntax/testdir/dumps/vim_ex_range_90.dump new file mode 100644 index 0000000000..bfbaa059a8 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_90.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|l|a|s|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|m|o|d|i|f|i|e|d| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|n|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|N|e|x|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|p|r|e|v|i|o|u|s| +0#0000000&@59 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|b|r|e|w|i|n|d| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|b|u|f@1|e|r| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|c|r|i|p|t|e|n|c|o|d|i|n|g| |"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|c|r|i|p|t|n|a|m|e|s| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|c|r|i|p|t|v|e|r|s|i|o|n| @1|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|c|s|c|o|p|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t|f|i|l|e|t|y|p|e| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t|g|l|o|b|a|l| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t|l|o|c|a|l| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|e|t| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|f|i|n|d| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|f|i|r|s|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|h|e|l@1| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|i|g|n| +0#0000000&@65 +@57|1|6|2|1|,|1| @7|9|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_91.dump b/runtime/syntax/testdir/dumps/vim_ex_range_91.dump new file mode 100644 index 0000000000..00aaaad8e2 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_91.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|i|g|n| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|i|l|e|n|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|i|m|a|l|t| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|l|a|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|l|e@1|p| +0#0000000&@64 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|l|e@1|p|!| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|m|a|g|i|c| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|m|i|l|e| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|n|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|N|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|n|o|m|a|g|i|c| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|o|r|t| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|o|u|r|c|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|d|u|m|p| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|6|3|9|,|1| @7|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_92.dump b/runtime/syntax/testdir/dumps/vim_ex_range_92.dump new file mode 100644 index 0000000000..6679b28984 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_92.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|d|u|m|p| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|g|o@1|d| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|i|n|f|o| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|r|a|r|e| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|p|e|l@1|r|e|p|a|l@1| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|u|n|d|o| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|e|l@1|w|r|o|n|g| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|l|i|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|r|e|w|i|n|d| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|t|a|g| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|r|t|g|r|e|p|l|a|c|e| @1|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|r|t|i|n|s|e|r|t| @3|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|a|r|t|r|e|p|l|a|c|e| @2|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|j|u|m|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|o|p|i|n|s|e|r|t| @4|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|o|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|t|s|e|l|e|c|t| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@59 +@57|1|6|5|7|,|1| @7|9|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_93.dump b/runtime/syntax/testdir/dumps/vim_ex_range_93.dump new file mode 100644 index 0000000000..4039e25748 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_93.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|u|b|s|t|i|t|u|t|e| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|u|n|h|i|d|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|u|s|p|e|n|d| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#af5f00255&|v|i|e|w| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|w|a|p|n|a|m|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|y|n|c|b|i|n|d| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|y|n|t|a|x| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|s+0#0000000&|y|n|t|i|m|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&| +0#0000000&@68 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|c|l|o|s|e| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|e|d|i|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|f|i|n|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|f|i|r|s|t| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|l|a|s|t| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@62 +@57|1|6|7|5|,|1| @7|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_94.dump b/runtime/syntax/testdir/dumps/vim_ex_range_94.dump new file mode 100644 index 0000000000..5202170d0b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_94.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|m|o|v|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|n|e|w| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|n|e|x|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|N|e|x|t| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|o|n|l|y| +0#0000000&@62 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|b|p|r|e|v|i|o|u|s| +0#0000000&@58 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|r|e|w|i|n|d| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|b|s| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|a|g| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|a|g|s| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|c|d| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|c|h|d|i|r| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|c|l| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|c|l|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|c|l|f|i|l|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|e|a|r|o|f@1| @62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@61 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|f|i|r|s|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|h|r|o|w| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|6|9|3|,|1| @7|9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_95.dump b/runtime/syntax/testdir/dumps/vim_ex_range_95.dump new file mode 100644 index 0000000000..547dbdd644 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_95.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|h|r|o|w| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|j|u|m|p| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|l|a|s|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|l|m|e|n|u| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|l|n|o|r|e|m|e|n|u| +0#0000000&@59 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|l|u|n|m|e|n|u| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|n|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|N|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|o|p|l|e|f|t| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#af5f00255&|r|e|w|i|n|d| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|r|y| @11|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|s|e|l|e|c|t| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|7|1@1|,|1| @7|9|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_96.dump b/runtime/syntax/testdir/dumps/vim_ex_range_96.dump new file mode 100644 index 0000000000..c04e412da6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_96.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|t+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|a|b@1|r|e|v|i|a|t|e| @2|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#af5f00255&|n|d|o| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|d|o|j|o|i|n| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|d|o|l|i|s|t| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#af5f00255&|n|h|i|d|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|l|e|t| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|l|o|c|k|v|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|m|a|p| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|m|e|n|u| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#0000000&|n|s|i|l|e|n|t| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|e|r|s|i|o|n| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|e|r|t|i|c|a|l| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|e|w| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|m|9|c|m|d| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@62 +@57|1|7|2|9|,|1| @7|9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_97.dump b/runtime/syntax/testdir/dumps/vim_ex_range_97.dump new file mode 100644 index 0000000000..2a5e2d1b4c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_97.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&@62 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&@59 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|s|u|a|l| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|i|u|s|a|g|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|n|e|w| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#af5f00255&|s|p|l|i|t| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|v+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|a|l@1| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|h|i|l|e| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|i|n|c|m|d| +0#0000000&@63 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|i|n|d|o| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|i|n|p|o|s| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|i|n|s|i|z|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|7|4|7|,|1| @7|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_98.dump b/runtime/syntax/testdir/dumps/vim_ex_range_98.dump new file mode 100644 index 0000000000..dd5c23eca8 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_98.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|i|n|s|i|z|e| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|n|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|N|e|x|t| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|p|r|e|v|i|o|u|s| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|q| +0#0000000&@67 +>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|q|a|l@1| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#af5f00255&|r|i|t|e| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|u|n|d|o| @9|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|w+0#0000000&|v|i|m|i|n|f|o| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|a|l@1| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#af5f00255&|i|t| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|m|a|p|c|l|e|a|r| @5|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|m|a|p| @10|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#af5f00255&|m|e|n|u| +0#0000000&@64 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|n|o|r|e|m|a|p| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#af5f00255&|n|o|r|e|m|e|n|u| +0#0000000&@60 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|r|e|s|t|o|r|e| @6|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|u|n|m|a|p| @8|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +@57|1|7|6|5|,|1| @7|9@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_99.dump b/runtime/syntax/testdir/dumps/vim_ex_range_99.dump new file mode 100644 index 0000000000..d2fc730ff6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_range_99.dump @@ -0,0 +1,20 @@ +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|x+0#0000000&|u|n|m|e|n|u| @7|"+0#0000e05&| |n|o| |r|a|n|g|e| +0#0000000&@44 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|y+0#af5f00255&|a|n|k| +0#0000000&@65 +|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2|z+0#af5f00255&| +0#0000000&@68 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|7|8|1|,|0|-|1| @5|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_rightshift_00.dump b/runtime/syntax/testdir/dumps/vim_ex_rightshift_00.dump new file mode 100644 index 0000000000..2fac9b781d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_rightshift_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|>| |c|o|m@1|a|n|d| +0#0000000&@58 +@75 +|>+0#af5f00255&| +0#0000000&@73 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&@72 +|>+0#af5f00255&|>+0#e000e06&@1| +0#0000000&@71 +@75 +|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|>+0#e000e06&| +0#0000000&@69 +@75 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@70 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 +|>+0#af5f00255&|>+0#e000e06&@1| +0#0000000&|4+0#e000002&|2| +0#0000000&@68 +@75 +|>+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|l+0#e000e06&| +0#0000000&@70 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|p+0#e000e06&| +0#0000000&@70 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&@70 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_rightshift_01.dump b/runtime/syntax/testdir/dumps/vim_ex_rightshift_01.dump new file mode 100644 index 0000000000..75fc833222 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_rightshift_01.dump @@ -0,0 +1,20 @@ +|>+0#af5f00255#ffffff0| +0#0000000&|l+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@71 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|l+0#e000e06&| +0#0000000&@70 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|p+0#e000e06&| +0#0000000&@70 +>>+0#af5f00255&|>+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&@70 +@75 +|>+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@69 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@68 +@75 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@67 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@67 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@67 +@75 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@65 +@57|1|9|,|1| @9|1|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_rightshift_02.dump b/runtime/syntax/testdir/dumps/vim_ex_rightshift_02.dump new file mode 100644 index 0000000000..28549d10c9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_rightshift_02.dump @@ -0,0 +1,20 @@ +|>+0#af5f00255#ffffff0|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@65 +@75 +|>+0#af5f00255&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|>+0#af5f00255&| +0#0000000&@3|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +>>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +|>+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@57 +|>+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@60 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|#+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|d|i|f@1|e|r|e|n|t|i|a|t|e| |o|p|e|r|a|t|o|r| |a|n|d| |c|o|m@1|a|n|d| |w|h|e|n| |o|p|e|r|a|t|o|r|s| |a|r|e| |c|o|n|t|a|i|n|e|d| +0#0000000& +@2|#+0#0000e05&| |>| +0#0000000&@69 +@2|:|>+0#af5f00255&| +0#0000000&@70 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@68 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&@1| +0#0000000&@67 +@75 +@57|3|7|,|1| @9|4|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_rightshift_03.dump b/runtime/syntax/testdir/dumps/vim_ex_rightshift_03.dump new file mode 100644 index 0000000000..ebb038ca48 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_rightshift_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@68 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|>+0#e000e06&| +0#0000000&@66 +@75 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@67 +@2>:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@65 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&@1| +0#0000000&|4+0#e000002&|2| +0#0000000&@64 +@75 +@2|:|>+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@68 +@2|:|>+0#af5f00255&| +0#0000000&|p+0#e000e06&| +0#0000000&@68 +@2|:|>+0#af5f00255&| +0#0000000&|#+0#e000e06&| +0#0000000&@68 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|l+0#e000e06&| +0#0000000&@66 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|p+0#e000e06&| +0#0000000&@66 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|#+0#e000e06&| +0#0000000&@66 +@75 +@2|:|>+0#af5f00255&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@66 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@64 +@75 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@65 +@57|5@1|,|3| @9|7|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_rightshift_04.dump b/runtime/syntax/testdir/dumps/vim_ex_rightshift_04.dump new file mode 100644 index 0000000000..82d099c855 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_rightshift_04.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@65 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@65 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@65 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&| +0#0000000&@63 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|p+0#e000e06&| +0#0000000&@63 +@2>:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&@63 +@75 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@63 +@2|:|>+0#af5f00255&|>+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&|l+0#e000e06&|p|#| +0#0000000&@62 +@75 +@2|:|>+0#af5f00255&| +0#0000000&@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|>+0#af5f00255&| +0#0000000&@3|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|>+0#af5f00255&| +0#0000000&|>+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|>+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +@2|:|>+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@54 +@2|:|>+0#af5f00255&| +0#0000000&|l+0#e000e06&| +0#0000000&@1|#+0#e000e06&| +0#0000000&|c|o|m@1|e|n|t| @57 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@57|7|3|,|3| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_runtime_00.dump b/runtime/syntax/testdir/dumps/vim_ex_runtime_00.dump new file mode 100644 index 0000000000..a28412fedf --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_runtime_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |:|r|u|n|t|i|m|e| |c|o|m@1|a|n|d| +0#0000000&@52 +@75 +@75 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@6|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @43 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|S+0#e000e06&|T|A|R|T| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @43 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|O+0#e000e06&|P|T| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @43 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|P+0#e000e06&|A|C|K| +0#0000000&@1|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @43 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|A+0#e000e06&|L@1| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @43 +@75 +|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&@6|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @42 +|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|S+0#e000e06&|T|A|R|T| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @42 +|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|O+0#e000e06&|P|T| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @42 +|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|P+0#e000e06&|A|C|K| +0#0000000&@1|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @42 +|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|A+0#e000e06&|L@1| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @42 +@75 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @49 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|b|a|r|.|v|i|m| @49 +@75 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_runtime_01.dump b/runtime/syntax/testdir/dumps/vim_ex_runtime_01.dump new file mode 100644 index 0000000000..67f898554c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_runtime_01.dump @@ -0,0 +1,20 @@ +|r+0#af5f00255#ffffff0|u|n|t|i|m|e|!| +0#0000000&|A+0#e000e06&|L@1| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @42 +@75 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @49 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|b|a|r|.|v|i|m| @49 +> @74 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@39 +|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@36 +@75 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&@6|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @41 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|S+0#e000e06&|T|A|R|T| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @41 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|O+0#e000e06&|P|T| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @41 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|P+0#e000e06&|A|C|K| +0#0000000&@1|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @41 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|A+0#e000e06&|L@1| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @41 +@75 +@2|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&@6|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @40 +@2|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|S+0#e000e06&|T|A|R|T| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @40 +@57|1|9|,|0|-|1| @7|5|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_runtime_02.dump b/runtime/syntax/testdir/dumps/vim_ex_runtime_02.dump new file mode 100644 index 0000000000..1c59fe7c10 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_runtime_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|S+0#e000e06&|T|A|R|T| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @40 +@2|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|O+0#e000e06&|P|T| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @40 +@2|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|P+0#e000e06&|A|C|K| +0#0000000&@1|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @40 +@2|r+0#af5f00255&|u|n|t|i|m|e|!| +0#0000000&|A+0#e000e06&|L@1| +0#0000000&@2|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @40 +@75 +@2>r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| @47 +@8|#+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56 +@8|\+0#e000e06&| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|b|a|r|.|v|i|m| @47 +@75 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| |#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@37 +@2|r+0#af5f00255&|u|n|t|i|m|e| +0#0000000&|p|l|u|g|i|n|/|*+0#e000e06&@1|/+0#0000000&|f|o@1|.|v|i|m| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@34 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|7|,|3| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump index 716f4af1de..a5432760af 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump @@ -1,11 +1,11 @@ | +0&#ffffff0@74 |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|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 @2|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|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 > @74 |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|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 @2|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|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 @@ -17,4 +17,4 @@ |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 -@57|3|7|,|0|-|1| @7|1|6|%| +@57|3|7|,|0|-|1| @7|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump index 036a279ff5..b904836f76 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump @@ -1,10 +1,9 @@ |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 -|"+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 ->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 @@ -17,4 +16,5 @@ |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 @57|5@1|,|1| @9|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump index b4ea513b89..d9887a1a4e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump @@ -1,10 +1,9 @@ -|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#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 |"+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 ->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 @@ -17,4 +16,5 @@ |s+0#af5f00255&| +0#0000000&|%+0#e000e06&|/+0#0000000&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|&+0#e000e06&|/+0#0000000&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -@57|7|3|,|1| @9|3|5|%| +|s+0#af5f00255&| +0#0000000&|(+0#e000e06&|/+0#0000000&|(+0#e000e06&|/+0#0000000&@1|(+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +@57|7|3|,|1| @9|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump index 3b6bc92f58..693aca0b20 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump @@ -1,11 +1,9 @@ -|s+0#af5f00255#ffffff0| +0#0000000&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|"+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&@54 +|s+0#af5f00255#ffffff0| +0#0000000&|(+0#e000e06&|/+0#0000000&|(+0#e000e06&|/+0#0000000&@1|(+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 ->s+0#af5f00255&| +0#0000000&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|,+0#e000e06&|/+0#0000000&|,+0#e000e06&|/+0#0000000&@1|,+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +>s+0#af5f00255&| +0#0000000&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|.+0#e000e06&|/+0#0000000&|.+0#e000e06&|/+0#0000000&@1|.+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|/+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&@56 |s+0#af5f00255&| +0#0000000&|:+0#e000e06&|/+0#0000000&|:+0#e000e06&|/+0#0000000&@1|:+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 @@ -17,4 +15,6 @@ |s+0#af5f00255&| +0#0000000&|@+0#e000e06&|/+0#0000000&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|[+0#e000e06&|/+0#0000000&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |"+0#0000e05&| |s| |\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41 -@57|9|1|,|1| @9|4@1|%| +|s+0#af5f00255&| +0#0000000&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +@57|9|1|,|1| @9|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump index 00569af72b..e57047b27a 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump @@ -1,11 +1,9 @@ -|"+0#0000e05#ffffff0| |s| |\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41 -|s+0#af5f00255&| +0#0000000&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255#ffffff0| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 ->s+0#af5f00255&| +0#0000000&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |"+0#0000e05&| |s| |||/|||/@1||| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41 -|s+0#af5f00255&| +0#0000000&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +>s+0#af5f00255&| +0#0000000&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |s+0#af5f00255&| +0#0000000&|~+0#e000e06&|/+0#0000000&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 @75 |s+0#af5f00255&|/+0#e000e06&@1|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62 @@ -17,4 +15,6 @@ |s+0#af5f00255&| +0#0000000&@73 |:|s+0#af5f00255&| +0#0000000&@72 |s+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@70 -@57|1|0|9|,|1| @8|5|4|%| +|:|s+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 +|s+0#af5f00255&|4+0#e000002&|2| +0#0000000&@71 +@57|1|0|9|,|1| @8|5|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump index 13956ce91b..d19f92672f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump @@ -1,11 +1,9 @@ -|s+0#af5f00255#ffffff0| +0#0000000&|4+0#e000002&|2| +0#0000000&@70 -|:|s+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 -|s+0#af5f00255&|4+0#e000002&|2| +0#0000000&@71 +|s+0#af5f00255#ffffff0|4+0#e000002&|2| +0#0000000&@71 |:|s+0#af5f00255&|4+0#e000002&|2| +0#0000000&@70 @75 ->s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@62 +|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@62 |:|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@61 -|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r|4+0#e000002&|2| +0#0000000&@60 +>s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r|4+0#e000002&|2| +0#0000000&@60 |:|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r|4+0#e000002&|2| +0#0000000&@59 |s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@59 |:|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@58 @@ -17,4 +15,6 @@ |s+0#af5f00255&|g+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 |:|s+0#af5f00255&|g+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@68 |s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@68 -@57|1|2|7|,|1| @8|6|4|%| +|:|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@67 +|s+0#af5f00255&|g+0#e000e06&|4+0#e000002&|2| +0#0000000&@70 +@57|1|2|7|,|1| @8|6|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump index bd1b5d0b18..5e3f040f17 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@68 -|:|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@67 -|s+0#af5f00255&|g+0#e000e06&|4+0#e000002&|2| +0#0000000&@70 +|s+0#af5f00255#ffffff0|g+0#e000e06&|4+0#e000002&|2| +0#0000000&@70 |:|s+0#af5f00255&|g+0#e000e06&|4+0#e000002&|2| +0#0000000&@69 |s+0#af5f00255&|g+0#e000e06&|i|4+0#e000002&|2| +0#0000000&@69 ->:|s+0#af5f00255&|g+0#e000e06&|i|4+0#e000002&|2| +0#0000000&@68 +|:|s+0#af5f00255&|g+0#e000e06&|i|4+0#e000002&|2| +0#0000000&@68 @75 -|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67 -|&+0#00e0e07&| +0#0000000&@73 +> @74 +|"+0#0000e05&| |:|&| |a|n|d| |:|~| +0#0000000&@63 +@75 +|&+0#af5f00255&| +0#0000000&@73 |&+0#af5f00255&@1| +0#0000000&@72 -|~| @73 -|~|&+0#00e0e07&| +0#0000000&@72 +|~+0#af5f00255&| +0#0000000&@73 +|~+0#af5f00255&|&| +0#0000000&@72 @75 -|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67 -|&+0#00e0e07&|c+0#0000000&|e|g|i|I|n|p|#|l+0#af5f00255&|r| +0#0000000&@63 -|&+0#af5f00255&@1|c+0#00e0e07&|e|g|i|I|n|p|#|l|r| +0#0000000&@62 -|~|c|e|g|i|I|n|p|#|l+0#af5f00255&|r| +0#0000000&@63 -|~|&+0#00e0e07&|c+0#0000000&|e|g|i|I|n|p|#|l+0#af5f00255&|r| +0#0000000&@62 +|&+0#af5f00255&| +0#0000000&@1|4+0#e000002&|2| +0#0000000&@69 +|&+0#af5f00255&@1| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 +|~+0#af5f00255&| +0#0000000&@1|4+0#e000002&|2| +0#0000000&@69 +|~+0#af5f00255&|&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69 @75 -@57|1|4|5|,|1| @8|7|3|%| +|&+0#af5f00255&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@63 +@57|1|4|5|,|0|-|1| @6|7|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump index bbe6bb3b25..02421e5534 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@74 +|&+0#af5f00255#ffffff0|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@63 +|&+0#af5f00255&@1|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@62 +|~+0#af5f00255&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@63 +|~+0#af5f00255&|&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@62 +@75 +>&+0#af5f00255&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@1|4+0#e000002&|2| +0#0000000&@59 +|&+0#af5f00255&@1|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@59 +|~+0#af5f00255&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@1|4+0#e000002&|2| +0#0000000&@59 +|~+0#af5f00255&|&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@59 +@75 +@75 |"+0#0000e05&| |2| |a|n|d| |3| |l|e|t@1|e|r| |r|e|p|e|a|t|-|p|r|e|v|i|o|u|s| |v|a|r|i|a|n|t|s| +0#0000000&@33 @75 |:|s+0#af5f00255&|c+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|c+0#e000e06&|e| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|g| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|l| +0#0000000&||| @19 |:|s+0#af5f00255&|g+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|e| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|l| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|r| +0#0000000&@14 ->:|s+0#af5f00255&|i+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|e| +0#0000000&||| @5||| |:|s+0#af5f00255&|i+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|i+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|p| +0#0000000&||| @5||| |:|s+0#af5f00255&|i+0#e000e06&|r| +0#0000000&@14 +|:|s+0#af5f00255&|i+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|e| +0#0000000&||| @5||| |:|s+0#af5f00255&|i+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|i+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|p| +0#0000000&||| @5||| |:|s+0#af5f00255&|i+0#e000e06&|r| +0#0000000&@14 |:|s+0#af5f00255&|I+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|e| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|g| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|I+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|l| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|r| +0#0000000&@14 |:|s+0#af5f00255&|r+0#e000e06&|c| +0#0000000&||| @5||| |:|s+0#af5f00255&|r+0#e000e06&|g| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|l| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&| +0#0000000&@15 @75 -@75 -|"+0#0000e05&| |e|x|c|e|p|t|i|o|n|s| +0#0000000&@62 -|:|s+0#af5f00255&|c|r| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|c|r|i|p|t|n|a|m|e|s|`| +0#0000000&@48 -|:|s+0#af5f00255&|e| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|e|t|`| +0#0000000&@56 -|:|s+0#af5f00255&|i|g| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|i|g|n|`| +0#0000000&@55 -|:|s+0#af5f00255&|i|l| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|i|l|e|n|t|`| +0#0000000&@53 -|:|s+0#af5f00255&|n| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|n|e|x|t|`| +0#0000000&@54 -|:|s+0#af5f00255&|p| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|p|l|i|t|`| +0#0000000&@54 -|:|s+0#af5f00255&|l| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|l|e@1|p|`| +0#0000000&@54 -|:|s+0#af5f00255&|r|e| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|r|e|w|i|n|d|`| +0#0000000&@52 -@57|1|6|3|,|1| @8|8|3|%| +@57|1|6|3|,|1| @8|8|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump index c04abd2691..81280ec3c5 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump @@ -1,20 +1,20 @@ -|:+0&#ffffff0|s+0#af5f00255&|r|e| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|r|e|w|i|n|d|`| +0#0000000&@52 +| +0&#ffffff0@74 +@75 +|"+0#0000e05&| |e|x|c|e|p|t|i|o|n|s| +0#0000000&@62 +|:|s+0#af5f00255&|c|r| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|c|r|i|p|t|n|a|m|e|s|`| +0#0000000&@48 +|:|s+0#af5f00255&|e| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|e|t|`| +0#0000000&@56 +>:|s+0#af5f00255&|i|g| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|i|g|n|`| +0#0000000&@55 +|:|s+0#af5f00255&|i|l| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|i|l|e|n|t|`| +0#0000000&@53 +|:|s+0#af5f00255&|n| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|n|e|x|t|`| +0#0000000&@54 +|:|s+0#af5f00255&|p| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|p|l|i|t|`| +0#0000000&@54 +|:|s+0#af5f00255&|l| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|l|e@1|p|`| +0#0000000&@54 +|:|s+0#af5f00255&|r|e| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|r|e|w|i|n|d|`| +0#0000000&@52 @75 @75 |"+0#0000e05&| |V|i| |c|o|m|p|a|t|i|b|i|l|i|t|y| +0#0000000&@56 @75 ->s+0#af5f00255&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62 +|s+0#af5f00255&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62 |s+0#af5f00255&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@62 |s+0#af5f00255&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@62 @75 -|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@61 -|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@61 -|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@61 -@75 -@75 -|"+0#0000e05&| |T|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |a|n|d| |b|a|r| +0#0000000&@48 -@75 -|s+0#af5f00255&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@64 -|s+0#af5f00255&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@61 -@75 -@57|1|8|1|,|1| @8|9|2|%| +@57|1|8|1|,|1| @8|8|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump index 7c6405238e..403714c5c3 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump @@ -1,20 +1,20 @@ | +0&#ffffff0@74 +|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@61 +|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@61 +|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@61 +@75 +> @74 +|"+0#0000e05&| |T|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |a|n|d| |b|a|r| +0#0000000&@48 +@75 +|s+0#af5f00255&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@64 +|s+0#af5f00255&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@61 +@75 |s+0#af5f00255&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@63 |s+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@60 @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 +|"+0#0000e05&| |I|s@1|u|e| |#|1|3|8@1|3| +0#0000000&@60 @75 |d+0#af5f00255&|e|f| +0#0000000&|T|e|s|t|(+0#e000e06&|)| +0#0000000&@64 -@1| +0#00e0e07&|s|t|r|[+0#0000000&|s+0#00e0e07&|]+0#0000000&| @66 -@2|s+0#ffffff16#ff404010|t|r|(+0#e000e06#ffffff0|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@66 -|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 -@75 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|9@1|,|1| @8|B|o|t| +@2|s+0#00e0e07&|t|r|[+0#0000000&|s+0#00e0e07&|]+0#0000000&| @66 +@57|1|9@1|,|0|-|1| @6|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_12.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_12.dump new file mode 100644 index 0000000000..a51668ac5d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_12.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|s+0#00e0e07&|t|r|[+0#0000000&|s+0#00e0e07&|]+0#0000000&| @66 +@2|s+0#ffffff16#ff404010|t|r|(+0#e000e06#ffffff0|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@66 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|2|1|5|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump index f55f9875aa..453467176f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_01.dump @@ -16,5 +16,5 @@ @75 |"+0#0000e05&| |:|s|y|n|-|i|n|c|l|u|d|e| +0#0000000&@60 @75 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|i+0#00e0003&|n|c|l|u|d|e| +0#0000000&|@|F|o@1| |<+0#00e0003&|s+0#0000000&|f|i|l|e|>+0#00e0003&|:+0#0000000&|p+0#af5f00255&|:+0#0000000&|h+0#af5f00255&|/+0#0000000&|f|o@1|.|v|i|m| @35 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|i+0#00e0003&|n|c|l|u|d|e| +0#0000000&|@|F|o@1| |<+0#00e0e07&|s|f|i|l|e|>|:|p|:|h|/+0#af5f00255&|f+0#00e0e07&|o@1|.+0#0000000&|v+0#00e0e07&|i|m| +0#0000000&@35 @57|1|9|,|0|-|1| @8|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump index 2253a0258b..6d205351cf 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_02.dump @@ -1,5 +1,5 @@ -|s+0#af5f00255#ffffff0|y|n|t|a|x| +0#0000000&|i+0#00e0003&|n|c|l|u|d|e| +0#0000000&|@|F|o@1| |<+0#00e0003&|s+0#0000000&|f|i|l|e|>+0#00e0003&|:+0#0000000&|p+0#af5f00255&|:+0#0000000&|h+0#af5f00255&|/+0#0000000&|f|o@1|.|v|i|m| @35 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|i+0#00e0003&|n|c|l|u|d|e| +0#0000000&|<+0#00e0003&|s+0#0000000&|f|i|l|e|>+0#00e0003&|:+0#0000000&|p+0#af5f00255&|:+0#0000000&|h+0#af5f00255&|/+0#0000000&|f|o@1|.|v|i|m| @40 +|s+0#af5f00255#ffffff0|y|n|t|a|x| +0#0000000&|i+0#00e0003&|n|c|l|u|d|e| +0#0000000&|@|F|o@1| |<+0#00e0e07&|s|f|i|l|e|>|:|p|:|h|/+0#af5f00255&|f+0#00e0e07&|o@1|.+0#0000000&|v+0#00e0e07&|i|m| +0#0000000&@35 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|i+0#00e0003&|n|c|l|u|d|e| +0#0000000&|<+0#00e0e07&|s|f|i|l|e|>|:|p|:|h|/+0#af5f00255&|f+0#00e0e07&|o@1|.+0#0000000&|v+0#00e0e07&|i|m| +0#0000000&@40 @75 |"+0#0000e05&| |:|s|y|n|-|i|s|k|e|y|w|o|r|d| +0#0000000&@58 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_terminal_01.dump b/runtime/syntax/testdir/dumps/vim_ex_terminal_01.dump index 2058a78942..56b26ef40f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_terminal_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_terminal_01.dump @@ -15,6 +15,6 @@ | +0#0000001#ffff4012@5|\+0#e000e06#ffffff0| +0#0000001#ffff4012|-|f| +0#0000000#ffffff0@64 | +0#0000001#ffff4012@5|\+0#e000e06#ffffff0| +0#0000001#ffff4012|/|t|m|p|/|l|o|g| +0#0000000#ffffff0@58 |t+0#af5f00255&|e|r|m|i|n|a|l| +0#0000000&@66 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|++0#00e0003&@1|k|i|l@1|=|t+0#e000002&|e|r|m| +0#0000000&@55 @57|1|9|,|1| @9|2|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_wincmd_01.dump b/runtime/syntax/testdir/dumps/vim_ex_wincmd_01.dump index e5daa83466..a022543571 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_wincmd_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_wincmd_01.dump @@ -17,4 +17,4 @@ |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|L+0#0000001#ffff4012| +0#0000000#ffffff0@66 |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|T+0#0000001#ffff4012| +0#0000000#ffffff0@66 |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0@66 -@57|1|9|,|1| @9|2|7|%| +@57|1|9|,|1| @9|2|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_wincmd_02.dump b/runtime/syntax/testdir/dumps/vim_ex_wincmd_02.dump index fe6b8552e1..d6934c4b9f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_wincmd_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_wincmd_02.dump @@ -17,4 +17,4 @@ |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|}+0#0000001#ffff4012| +0#0000000#ffffff0@66 |w+0#af5f00255&|i|n|c|m|d| +0#0000000&|g+0#0000001#ffff4012| |}| +0#0000000#ffffff0@64 @75 -@57|3|7|,|1| @9|6|4|%| +@57|3|7|,|1| @9|5|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_wincmd_03.dump b/runtime/syntax/testdir/dumps/vim_ex_wincmd_03.dump index af7faa3e64..918d513f3a 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_wincmd_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_wincmd_03.dump @@ -9,12 +9,12 @@ |d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 @2|v+0#af5f00255&|a|r| +0#0000000&|w|i|n|c|m|d| |=+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@57 @2|w|i|n|c|m|d| |=+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@61 -@2|:+0#e000e06&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0@63 -@1| +0#af5f00255&|w|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 -@1| +0#af5f00255&|w|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0||+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51 -@2|#+0#0000e05&| +0#0000000&|K+0#e000e06&|N|O|W|N|:| +0#0000e05&|i|n|c|o|r@1|e|c|t|l|y| |m|a|t|c|h|e|s| |a|s| |t|h|e| |E|x| |c|o|m@1|a|n|d| |r|a|t|h|e|r| |t|h|a|n| |a| |v|a|r|i|a|b|l|e| +0#0000000&@3 -@1| +0#af5f00255&|w|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0@64 -|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@2|:|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0@63 @75 -|~+0#4040ff13&| @73 -| +0#0000000&@56|5@1|,|1| @9|B|o|t| +@2|#+0#0000e05&| +0#0000000&|K+0#e000e06&|N|O|W|N|:| +0#0000e05&|i|n|c|o|r@1|e|c|t|l|y| |m|a|t|c|h| |a|s| |t|h|e| |E|x| |c|o|m@1|a|n|d| |r|a|t|h|e|r| |t|h|a|n| |a| |v|a|r|i|a|b|l|e| +0#0000000&@5 +@2|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 +@2|4+0#e000002&|2| +0#0000000&@70 +@2|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0@64 +@2|4+0#e000002&|2| +0#0000000&@70 +@75 +@57|5@1|,|1| @9|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_wincmd_04.dump b/runtime/syntax/testdir/dumps/vim_ex_wincmd_04.dump new file mode 100644 index 0000000000..2cff6e86a3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_wincmd_04.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@2|#+0#0000e05&| |E|1@1|4|3|:| |E|m|p|t|y| |e|x|p|r|e|s@1|i|o|n| +0#0000000&@47 +@2|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=+0#0000001#ffff4012| +0#0000000#ffffff0||+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|7|2|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_expressions_21.dump b/runtime/syntax/testdir/dumps/vim_expressions_21.dump index e49a5b752c..72e19d5619 100644 --- a/runtime/syntax/testdir/dumps/vim_expressions_21.dump +++ b/runtime/syntax/testdir/dumps/vim_expressions_21.dump @@ -12,9 +12,9 @@ |"+0#0000e05&| |L|i|n|e| |c|o|n|t|i|n|u|a|t|i|o|n| +0#0000000&@55 |l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|++0#af5f00255&| +0#0000000&@59 @6|\+0#e000e06&| +0#0000000&@67 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&@67 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|++0#af5f00255&| +0#0000000&@61 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|z|"| +0#0000000&@61 @57|3|7|1|,|1| @8|8|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_expressions_22.dump b/runtime/syntax/testdir/dumps/vim_expressions_22.dump index 0e5d818fac..5d71821561 100644 --- a/runtime/syntax/testdir/dumps/vim_expressions_22.dump +++ b/runtime/syntax/testdir/dumps/vim_expressions_22.dump @@ -1,15 +1,15 @@ | +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|z|"| +0#0000000&@61 @75 |l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|++0#af5f00255&| +0#0000000&@59 -@6|"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&@67 -@6>"+0#0000e05&|\| +0#0000000&|c+0#0000e05&|o|m@1|e|n|t| +0#0000000&@58 +@6>"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&@67 @6|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|++0#af5f00255&| +0#0000000&@61 @6|\+0#e000e06&| +0#0000000&|"+0#e000002&|b|a|z|"| +0#0000000&@61 @75 |l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|++0#af5f00255&| +0#0000000&@59 -@6|"+0#0000e05&|\| +0#0000000&|"+0#0000e05&|c|o|m@1|e|n|t| +0#0000000&|s+0#0000e05&|t|r|i|n|g|"| +0#0000000&@49 +@6|"+0#0000e05&|\| |"|c|o|m@1|e|n|t| |s|t|r|i|n|g|"| +0#0000000&@49 @6|\+0#e000e06&| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&@63 @75 |"+0#0000e05&| |F|u|n|c|t|i|o|n| |c|a|l@1|s| +0#0000000&@58 diff --git a/runtime/syntax/testdir/dumps/vim_expressions_23.dump b/runtime/syntax/testdir/dumps/vim_expressions_23.dump index 19fb9a4238..5c3ed7180f 100644 --- a/runtime/syntax/testdir/dumps/vim_expressions_23.dump +++ b/runtime/syntax/testdir/dumps/vim_expressions_23.dump @@ -6,7 +6,7 @@ > @74 |"+0#0000e05&| |I|s@1|u|e| |#|1|4@1|2|3| |(|v|i|m|.|v|i|m|:| |O|p|t| |o|u|t| |o|f| |v|i|m|S|e|a|r|c|h|*|)| +0#0000000&@27 @75 -|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@67 +|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @67 |l+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&|=+0#af5f00255&| +0#0000000&|0+0#e000002&| +0#0000000&@60 |\+0#e000e06&| +0#0000000&@2|?+0#af5f00255&| +0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&@66 |\+0#e000e06&| +0#0000000&@2|)+0#e000e06&| +0#0000000&@69 @@ -15,6 +15,6 @@ |e+0#af5f00255&|c|h|o| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&@63 @75 |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 -| +0#e000002&@1|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@65 +@2|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @65 @2|l+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&|=+0#af5f00255&| +0#0000000&|0+0#e000002&| +0#0000000&@58 @57|4|0|6|,|0|-|1| @6|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_function_calls_00.dump b/runtime/syntax/testdir/dumps/vim_function_calls_00.dump index 68d1ec63a1..31d25ce733 100644 --- a/runtime/syntax/testdir/dumps/vim_function_calls_00.dump +++ b/runtime/syntax/testdir/dumps/vim_function_calls_00.dump @@ -16,5 +16,5 @@ |a+0#af5f00255&|p@1|e|n|d| +0#0000000&@68 |.+0#af5f00255&| +0#0000000&@73 |"+0#0000e05&| |b|a|d| |c|o|m@1|a|n|d| +0#0000000&@61 -|a|p@1|e|n|d|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@64 +|a+0#af5f00255&|p@1|e|n|d|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@64 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_function_calls_01.dump b/runtime/syntax/testdir/dumps/vim_function_calls_01.dump index d3f3c42b8a..fbf3fd367c 100644 --- a/runtime/syntax/testdir/dumps/vim_function_calls_01.dump +++ b/runtime/syntax/testdir/dumps/vim_function_calls_01.dump @@ -3,8 +3,8 @@ |a+0#af5f00255&|p@1|e|n|d| +0#0000000&@68 |.+0#af5f00255&| +0#0000000&@73 |"+0#0000e05&| |b|a|d| |c|o|m@1|a|n|d| +0#0000000&@61 ->a|p@1|e|n|d|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@64 -|a|p@1|e|n|d| |(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@63 +>a+0#af5f00255&|p@1|e|n|d|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@64 +|a+0#af5f00255&|p@1|e|n|d| +0#0000000&|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@63 @75 |l+0#af5f00255&|e|t| +0#0000000&|b|r|o|w|s|e| |=+0#af5f00255&| +0#0000000&|b+0#00e0e07&|r|o|w|s|e|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@51 |c+0#af5f00255&|a|l@1| +0#0000000&|b+0#00e0e07&|r|o|w|s|e|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@59 diff --git a/runtime/syntax/testdir/dumps/vim_function_calls_05.dump b/runtime/syntax/testdir/dumps/vim_function_calls_05.dump index 7c764ed74a..647fefc52f 100644 --- a/runtime/syntax/testdir/dumps/vim_function_calls_05.dump +++ b/runtime/syntax/testdir/dumps/vim_function_calls_05.dump @@ -1,7 +1,7 @@ |.+0#af5f00255#ffffff0| +0#0000000&@73 |"+0#0000e05&| |b|a|d| |c|o|m@1|a|n|d| +0#0000000&@61 -|i|n|s|e|r|t|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@64 -|i|n|s|e|r|t| |(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@63 +|i+0#af5f00255&|n|s|e|r|t|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@64 +|i+0#af5f00255&|n|s|e|r|t| +0#0000000&|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@63 @75 >l+0#af5f00255&|e|t| +0#0000000&|j|o|i|n| |=+0#af5f00255&| +0#0000000&|j+0#00e0e07&|o|i|n|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@55 |c+0#af5f00255&|a|l@1| +0#0000000&|j+0#00e0e07&|o|i|n|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@61 diff --git a/runtime/syntax/testdir/dumps/vim_function_calls_08.dump b/runtime/syntax/testdir/dumps/vim_function_calls_08.dump index 204322789c..d9db592596 100644 --- a/runtime/syntax/testdir/dumps/vim_function_calls_08.dump +++ b/runtime/syntax/testdir/dumps/vim_function_calls_08.dump @@ -12,8 +12,8 @@ |l+0#af5f00255&|e|t| +0#0000000&|i|f| |=+0#af5f00255&| +0#0000000&|i+0#ffffff16#ff404010|f|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@59 |c+0#af5f00255&|a|l@1| +0#0000000&|i+0#ffffff16#ff404010|f|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@63 |"+0#0000e05&| |c|o|m@1|a|n|d| +0#0000000&@65 -|i+0#af5f00255&|f|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#af5f00255&@1| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@55 -|i+0#af5f00255&|f| +0#0000000&|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#af5f00255&@1| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@54 +|i+0#af5f00255&|f|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#e000002&|.+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@55 +|i+0#af5f00255&|f| +0#0000000&|(+0#e000e06&|4+0#e000002&|2|)+0#e000e06&| +0#0000000&||| |.+0#e000002&|.+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|n|d|i|f| +0#0000000&@54 @75 |l+0#af5f00255&|e|t| +0#0000000&|e|c|h|o| |=+0#af5f00255&| +0#0000000&|e+0#ffffff16#ff404010|c|h|o|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@55 |c+0#af5f00255&|a|l@1| +0#0000000&|e+0#ffffff16#ff404010|c|h|o|(+0#e000e06#ffffff0|4+0#e000002&|2|)+0#e000e06&| +0#0000000&@61 diff --git a/runtime/syntax/testdir/dumps/vim_function_variables_13.dump b/runtime/syntax/testdir/dumps/vim_function_variables_13.dump index cf9f6cc8ed..b05eb2ee8e 100644 --- a/runtime/syntax/testdir/dumps/vim_function_variables_13.dump +++ b/runtime/syntax/testdir/dumps/vim_function_variables_13.dump @@ -10,7 +10,7 @@ @2|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|b|a|r| @61 @2|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&@65 @8|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@56 -| +0#0000e05&@7|\| |b|a|r| +0#0000000&@61 +@8|\+0#e000e06&| +0#0000000&|b|a|r| @61 @75 @2|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@55 @2|l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@54 diff --git a/runtime/syntax/testdir/input/vim9_ex_commands.vim b/runtime/syntax/testdir/input/vim9_ex_commands.vim index 90da5e812b..85754616f7 100644 --- a/runtime/syntax/testdir/input/vim9_ex_commands.vim +++ b/runtime/syntax/testdir/input/vim9_ex_commands.vim @@ -2,17 +2,23 @@ vim9script # Vim9 Ex commands -# START NOT MATCHED -:Next -:X -# END NOT MATCHED - :help :help : help - : help # FIXME + : help +:& +:~ :@ +# :* +:> +:< +:# +:= +:! + +:Next +:X :abbreviate :abclear @@ -91,6 +97,7 @@ vim9script :checktime :chistory :class +endclass :clast :clearjumps :clist @@ -130,7 +137,6 @@ vim9script :debuggreedy :def :defcompile -:defcompile :defer :delcommand :delete @@ -145,14 +151,11 @@ vim9script :diffupdate :digraphs :disassemble -:disassemble :display :djump -:dl :dlist :doautoall :doautocmd -:dp :drop :dsearch :dsplit @@ -168,23 +171,23 @@ vim9script :else :elseif :emenu -:endclass +# :endclass :enddef -:endenum +# :endenum :endfor :endfunction :endif -:endinterface +# :endinterface :endtry :endwhile :enew :enum +endenum :eval :ex :execute :exit :export -:export :exusage :file :files @@ -203,7 +206,7 @@ vim9script :foldopen :for foo in bar | endfor :function -:global/.../ +:global :goto :grep :grepadd @@ -232,6 +235,7 @@ vim9script :inoremap :inoremenu :interface +endinterface :intro :isearch :isplit @@ -240,7 +244,6 @@ vim9script :iunmenu :join :jumps -:k :keepalt :keepjumps :keepmarks @@ -308,8 +311,8 @@ vim9script :lvimgrepadd :lwindow :make -:mapclear :map +:mapclear :mark :marks :match @@ -446,7 +449,6 @@ vim9script :simalt :slast :sleep -:sleep! :smagic :smap :smapclear @@ -533,12 +535,12 @@ vim9script :tunmenu :type :unabbreviate -:unabbreviate :undo :undojoin :undolist :unhide :uniq +:unlet :unlockvar :unmap :unmenu @@ -548,7 +550,7 @@ vim9script :verbose :version :vertical -:vglobal/.../ +:vglobal :view :vim9cmd # :vim9script @@ -592,9 +594,28 @@ vim9script :z Foo()|help -Foo() | help Foo() |help Foo()| help +Foo() | help + +Foo() |:help +Foo() | :help +Foo() |: help +Foo() | : help + +Foo() | & +Foo() | ~ +Foo() | @ +# Foo() | * +Foo() | > +Foo() | < +Foo() | # +Foo() | = +Foo() | ! + + +Foo() | Next +Foo() | X Foo() | abbreviate Foo() | abclear @@ -613,7 +634,8 @@ Foo() | arglocal Foo() | args Foo() | argument Foo() | ascii -Foo() | augroup Foo | augroup END +Foo() | augroup Foo +Foo() | augroup END Foo() | aunmenu Foo() | autocmd Foo() | badd @@ -672,6 +694,7 @@ Foo() | checkpath Foo() | checktime Foo() | chistory Foo() | class +endclass Foo() | clast Foo() | clearjumps Foo() | clist @@ -711,7 +734,6 @@ Foo() | debug Foo() | debuggreedy Foo() | def Foo() | defcompile -Foo() | defcompile Foo() | defer Foo() | delcommand Foo() | delete @@ -726,14 +748,11 @@ Foo() | diffthis Foo() | diffupdate Foo() | digraphs Foo() | disassemble -Foo() | disassemble Foo() | display Foo() | djump -Foo() | dl Foo() | dlist Foo() | doautoall Foo() | doautocmd -Foo() | dp Foo() | drop Foo() | dsearch Foo() | dsplit @@ -749,23 +768,23 @@ Foo() | edit Foo() | else Foo() | elseif Foo() | emenu -Foo() | endclass +# :endclass Foo() | enddef -Foo() | endenum +# :endenum Foo() | endfor Foo() | endfunction Foo() | endif -Foo() | endinterface +# :endinterface Foo() | endtry Foo() | endwhile Foo() | enew Foo() | enum +endenum Foo() | eval Foo() | ex Foo() | execute Foo() | exit Foo() | export -Foo() | export Foo() | exusage Foo() | file Foo() | files @@ -784,7 +803,7 @@ Foo() | folddoopen Foo() | foldopen Foo() | for foo in bar | endfor Foo() | function -Foo() | global/.../ +Foo() | global Foo() | goto Foo() | grep Foo() | grepadd @@ -813,6 +832,7 @@ Foo() | inoreabbrev Foo() | inoremap Foo() | inoremenu Foo() | interface +endinterface Foo() | intro Foo() | isearch Foo() | isplit @@ -869,7 +889,7 @@ Foo() | lNext Foo() | lnfile Foo() | lNfile Foo() | lnoremap -# Foo() | loadkeymap # disabled - runs until EOF +# :loadkeymap # disabled - runs until EOF Foo() | loadview Foo() | lockmarks Foo() | lockvar @@ -888,10 +908,9 @@ Foo() | lvimgrep Foo() | lvimgrepadd Foo() | lwindow Foo() | make -Foo() | mark -Foo() | move Foo() | map Foo() | mapclear +Foo() | mark Foo() | marks Foo() | match Foo() | menu @@ -902,6 +921,7 @@ Foo() | mksession Foo() | mkspell Foo() | mkview Foo() | mkvimrc +Foo() | move Foo() | mzfile Foo() | mzscheme Foo() | nbclose @@ -1026,7 +1046,6 @@ Foo() | silent Foo() | simalt Foo() | slast Foo() | sleep -Foo() | sleep! Foo() | smagic Foo() | smap Foo() | smapclear @@ -1113,12 +1132,12 @@ Foo() | tunmap Foo() | tunmenu Foo() | type Foo() | unabbreviate -Foo() | unabbreviate Foo() | undo Foo() | undojoin Foo() | undolist Foo() | unhide Foo() | uniq +Foo() | unlet Foo() | unlockvar Foo() | unmap Foo() | unmenu @@ -1128,14 +1147,14 @@ Foo() | var Foo() | verbose Foo() | version Foo() | vertical -Foo() | vglobal/.../ +Foo() | vglobal +Foo() | view Foo() | vim9cmd -# call Foo() | vim9script +# :vim9script Foo() | vimgrep Foo() | vimgrepadd Foo() | visual Foo() | viusage -Foo() | view Foo() | vmap Foo() | vmapclear Foo() | vmenu @@ -1145,32 +1164,30 @@ Foo() | vnoremenu Foo() | vsplit Foo() | vunmap Foo() | vunmenu -Foo() | windo -Foo() | write -Foo() | wNext Foo() | wall Foo() | while -Foo() | winsize Foo() | wincmd +Foo() | windo Foo() | winpos +Foo() | winsize Foo() | wnext +Foo() | wNext Foo() | wprevious Foo() | wq Foo() | wqall +Foo() | write Foo() | wundo Foo() | wviminfo Foo() | xall -Foo() | xmapclear Foo() | xmap +Foo() | xmapclear Foo() | xmenu -Foo() | xrestore Foo() | xnoremap Foo() | xnoremenu +Foo() | xrestore Foo() | xunmap Foo() | xunmenu Foo() | yank -Foo() | z - # Legacy-script only @@ -1189,23 +1206,52 @@ Foo() | z :mode :open :t -:unlet :xit -Foo() | append +call Foo() | append text . -Foo() | change +call Foo() | change text . -Foo() | insert +call Foo() | insert text . -Foo() | k -Foo() | let -Foo() | mode -Foo() | open -Foo() | t -Foo() | unlet -Foo() | xit +call Foo() | k +call Foo() | let +call Foo() | mode +call Foo() | open +call Foo() | t +call Foo() | xit + + +# User commands + +Foobar +Foobar! +Foobar123 +Foobar123! +Foo123bar +Foo123bar! + +:Foobar +:Foobar! +:Foobar123 +:Foobar123! +:Foo123bar +:Foo123bar! + +Foo() | Foobar +Foo() | Foobar! +Foo() | Foobar123 +Foo() | Foobar123! +Foo() | Foo123bar +Foo() | Foo123bar! + +Foo() | :Foobar +Foo() | :Foobar! +Foo() | :Foobar123 +Foo() | :Foobar123! +Foo() | :Foo123bar +Foo() | :Foo123bar! diff --git a/runtime/syntax/testdir/input/vim9_ex_range.vim b/runtime/syntax/testdir/input/vim9_ex_range.vim new file mode 100644 index 0000000000..30290f7e80 --- /dev/null +++ b/runtime/syntax/testdir/input/vim9_ex_range.vim @@ -0,0 +1,1256 @@ +vim9script +# Ex command ranges +# VIM_TEST_SETUP hi link vimAddressSeparator Todo +# VIM_TEST_SETUP hi link vimAddressOffset Type + + +:'<,'>print +:'(,')print +:'{,'}print +:'[,']print + +echo | :'<,'>print +echo | :'(,')print +echo | :'{,'}print +echo | :'[,']print + +# bare mark ranges + + :'a +: 'a +:'a +:'k +:'z +:'A +:'K +:'Z +:'0 +:'9 +:'[ +:'] +:'{ +:'} +:'( +:') +:'< +:'> +:'` +:'' +:'" +:'^ +:'. + +echo |:'a +echo| :'a +echo | :'a +echo | :'k +echo | :'z +echo | :'A +echo | :'K +echo | :'Z +echo | :'0 +echo | :'9 +echo | :'[ +echo | :'] +echo | :'{ +echo | :'} +echo | :'( +echo | :') +echo | :'< +echo | :'> +echo | :'` +echo | :'' +echo | :'" +echo | :'^ +echo | :'. + + +:1,10:print + +# range (with whitespace) + +:1 match +:2 match +:3 match + +:42,42 & +:42,42 ~ +:42,42 @ +# :42,42 * +:42,42 > +:42,42 < +:42,42 # +:42,42 = +:42,42 ! + +:42,42 Next +:42,42 Print + +:42,42 abbreviate +:42,42 abclear +:42,42 aboveleft +:42,42 abstract +:42,42 all +:42,42 amenu +:42,42 anoremenu +:42,42 argadd +:42,42 argdedupe +:42,42 argdelete +:42,42 argdo +:42,42 argedit +:42,42 argglobal +:42,42 arglocal +:42,42 args +:42,42 argument +:42,42 ascii +:42,42 augroup Foo +:42,42 augroup END +:42,42 aunmenu +:42,42 autocmd +:42,42 badd +:42,42 ball +:42,42 balt +:42,42 bdelete +:42,42 behave mswin +:42,42 behave xterm +:42,42 belowright +:42,42 bfirst +:42,42 blast +:42,42 bmodified +:42,42 bnext +:42,42 bNext +:42,42 botright +:42,42 bprevious +:42,42 break +:42,42 breakadd +:42,42 breakdel +:42,42 breaklist +:42,42 brewind +:42,42 browse +:42,42 bufdo +:42,42 buffer +:42,42 buffers +:42,42 bunload +:42,42 bwipeout +:42,42 cabbrev +:42,42 cabclear +:42,42 cabove +:42,42 caddbuffer +:42,42 caddexpr +:42,42 caddfile +:42,42 cafter +:42,42 call +:42,42 catch +:42,42 cbefore +:42,42 cbelow +:42,42 cbottom +:42,42 cbuffer +:42,42 cc +:42,42 cclose +:42,42 cd +:42,42 cdo +:42,42 center +:42,42 cexpr +:42,42 cfdo +:42,42 cfile +:42,42 cfirst +:42,42 cgetbuffer +:42,42 cgetexpr +:42,42 cgetfile +:42,42 changes +:42,42 chdir +:42,42 checkpath +:42,42 checktime +:42,42 chistory +:42,42 class +endclass +:42,42 clast +:42,42 clearjumps +:42,42 clist +:42,42 close +:42,42 cmap +:42,42 cmapclear +:42,42 cmenu +:42,42 cnewer +:42,42 cnext +:42,42 cNext +:42,42 cnfile +:42,42 cNfile +:42,42 cnoreabbrev +:42,42 cnoremap +:42,42 cnoremenu +:42,42 colder +:42,42 colorscheme +:42,42 comclear +:42,42 command +:42,42 compiler +:42,42 confirm +:42,42 const +:42,42 continue +:42,42 copen +:42,42 copy +:42,42 cpfile +:42,42 cprevious +:42,42 cquit +:42,42 crewind +:42,42 cscope +:42,42 cstag +:42,42 cunabbrev +:42,42 cunmap +:42,42 cunmenu +:42,42 cwindow +:42,42 debug +:42,42 debuggreedy +:42,42 def +:42,42 defcompile +:42,42 defer +:42,42 delcommand +:42,42 delete +:42,42 delfunction +:42,42 delmarks +:42,42 diffget +:42,42 diffoff +:42,42 diffpatch +:42,42 diffput +:42,42 diffsplit +:42,42 diffthis +:42,42 diffupdate +:42,42 digraphs +:42,42 disassemble +:42,42 display +:42,42 djump +:42,42 dlist +:42,42 doautoall +:42,42 doautocmd +:42,42 drop +:42,42 dsearch +:42,42 dsplit +:42,42 earlier +:42,42 echo +:42,42 echoconsole +:42,42 echoerr +:42,42 echohl +:42,42 echomsg +:42,42 echon +:42,42 echowindow +:42,42 edit +:42,42 else +:42,42 elseif +:42,42 emenu +# :42,42 endclass +:42,42 enddef +# :42,42 endenum +:42,42 endfor +:42,42 endfunction +:42,42 endif +# :42,42 endinterface +:42,42 endtry +:42,42 endwhile +:42,42 enew +:42,42 enum +endenum +:42,42 eval +:42,42 ex +:42,42 execute +:42,42 exit +:42,42 export +:42,42 exusage +:42,42 file +:42,42 files +:42,42 filetype +:42,42 filter +:42,42 final +:42,42 finally +:42,42 find +:42,42 finish +:42,42 first +:42,42 fixdel +:42,42 fold +:42,42 foldclose +:42,42 folddoclosed +:42,42 folddoopen +:42,42 foldopen +:42,42 for foo in bar | endfor +:42,42 function +:42,42 global +:42,42 goto +:42,42 grep +:42,42 grepadd +:42,42 gui +:42,42 gvim +:42,42 hardcopy +:42,42 help +:42,42 helpclose +:42,42 helpfind +:42,42 helpgrep +:42,42 helptags +:42,42 hide +:42,42 highlight +:42,42 history +:42,42 horizontal +:42,42 iabbrev +:42,42 iabclear +:42,42 if +:42,42 ijump +:42,42 ilist +:42,42 imap +:42,42 imapclear +:42,42 imenu +:42,42 import +:42,42 inoreabbrev +:42,42 inoremap +:42,42 inoremenu +:42,42 interface +endinterface +:42,42 intro +:42,42 isearch +:42,42 isplit +:42,42 iunabbrev +:42,42 iunmap +:42,42 iunmenu +:42,42 join +:42,42 jumps +:42,42 keepalt +:42,42 keepjumps +:42,42 keepmarks +:42,42 keeppatterns +:42,42 labove +:42,42 laddbuffer +:42,42 laddexpr +:42,42 laddfile +:42,42 lafter +:42,42 language +:42,42 last +:42,42 later +:42,42 lbefore +:42,42 lbelow +:42,42 lbottom +:42,42 lbuffer +:42,42 lcd +:42,42 lchdir +:42,42 lclose +:42,42 lcscope +:42,42 ldo +:42,42 left +:42,42 leftabove +:42,42 legacy +:42,42 lexpr +:42,42 lfdo +:42,42 lfile +:42,42 lfirst +:42,42 lgetbuffer +:42,42 lgetexpr +:42,42 lgetfile +:42,42 lgrep +:42,42 lgrepadd +:42,42 lhelpgrep +:42,42 lhistory +:42,42 list +:42,42 ll +:42,42 llast +:42,42 llist +:42,42 lmake +:42,42 lmap +:42,42 lmapclear +:42,42 lnewer +:42,42 lnext +:42,42 lNext +:42,42 lnfile +:42,42 lNfile +:42,42 lnoremap +# :42,42 loadkeymap +:42,42 loadview +:42,42 lockmarks +:42,42 lockvar +:42,42 lolder +:42,42 lopen +:42,42 lpfile +:42,42 lprevious +:42,42 lrewind +:42,42 ls +:42,42 ltag +:42,42 lua +:42,42 luado +:42,42 luafile +:42,42 lunmap +:42,42 lvimgrep +:42,42 lvimgrepadd +:42,42 lwindow +:42,42 make +:42,42 map +:42,42 mapclear +:42,42 mark +:42,42 marks +:42,42 match +:42,42 menu +:42,42 menutranslate +:42,42 messages +:42,42 mkexrc +:42,42 mksession +:42,42 mkspell +:42,42 mkview +:42,42 mkvimrc +:42,42 move +:42,42 mzfile +:42,42 mzscheme +:42,42 nbclose +:42,42 nbkey +:42,42 nbstart +:42,42 new +:42,42 next +:42,42 nmap +:42,42 nmapclear +:42,42 nmenu +:42,42 nnoremap +:42,42 nnoremenu +:42,42 noautocmd +:42,42 nohlsearch +:42,42 noreabbrev +:42,42 noremap +:42,42 noremenu +:42,42 normal +:42,42 noswapfile +:42,42 number +:42,42 nunmap +:42,42 nunmenu +:42,42 oldfiles +:42,42 omap +:42,42 omapclear +:42,42 omenu +:42,42 only +:42,42 onoremap +:42,42 onoremenu +:42,42 options +:42,42 ounmap +:42,42 ounmenu +:42,42 ownsyntax +:42,42 packadd +:42,42 packloadall +:42,42 pclose +:42,42 pedit +:42,42 perl +:42,42 perldo +:42,42 pop +:42,42 popup +:42,42 ppop +:42,42 preserve +:42,42 previous +:42,42 print +:42,42 profdel +:42,42 profile +:42,42 promptfind +:42,42 promptrepl +:42,42 psearch +:42,42 ptag +:42,42 ptfirst +:42,42 ptjump +:42,42 ptlast +:42,42 ptnext +:42,42 ptNext +:42,42 ptprevious +:42,42 ptrewind +:42,42 ptselect +:42,42 public +:42,42 put +:42,42 pwd +:42,42 py3 +:42,42 py3do +:42,42 py3file +:42,42 pydo +:42,42 pyfile +:42,42 python +:42,42 python3 +:42,42 pythonx +:42,42 pyx +:42,42 pyxdo +:42,42 pyxfile +:42,42 qall +:42,42 quit +:42,42 quitall +:42,42 read +:42,42 recover +:42,42 redir +:42,42 redo +:42,42 redraw +:42,42 redrawstatus +:42,42 redrawtabline +:42,42 registers +:42,42 resize +:42,42 retab +:42,42 return +:42,42 rewind +:42,42 right +:42,42 rightbelow +:42,42 ruby +:42,42 rubydo +:42,42 rubyfile +:42,42 rundo +:42,42 runtime +:42,42 rviminfo +:42,42 sall +:42,42 sandbox +:42,42 sargument +:42,42 saveas +:42,42 sball +:42,42 sbfirst +:42,42 sblast +:42,42 sbmodified +:42,42 sbnext +:42,42 sbNext +:42,42 sbprevious +:42,42 sbrewind +:42,42 sbuffer +:42,42 scriptencoding +:42,42 scriptnames +:42,42 scriptversion +:42,42 scscope +:42,42 set +:42,42 setfiletype +:42,42 setglobal +:42,42 setlocal +:42,42 sfind +:42,42 sfirst +:42,42 shell +:42,42 sign +:42,42 silent +:42,42 simalt +:42,42 slast +:42,42 sleep +:42,42 sleep! +:42,42 smagic +:42,42 smap +:42,42 smapclear +:42,42 smenu +:42,42 smile +:42,42 snext +:42,42 sNext +:42,42 snomagic +:42,42 snoremap +:42,42 snoremenu +:42,42 sort +:42,42 source +:42,42 spelldump +:42,42 spellgood +:42,42 spellinfo +:42,42 spellrare +:42,42 spellrepall +:42,42 spellundo +:42,42 spellwrong +:42,42 split +:42,42 sprevious +:42,42 srewind +:42,42 stag +:42,42 startgreplace +:42,42 startinsert +:42,42 startreplace +:42,42 static +:42,42 stjump +:42,42 stop +:42,42 stopinsert +:42,42 stselect +:42,42 substitute +:42,42 sunhide +:42,42 sunmap +:42,42 sunmenu +:42,42 suspend +:42,42 sview +:42,42 swapname +:42,42 syncbind +:42,42 syntax +:42,42 syntime +:42,42 tab +:42,42 tabclose +:42,42 tabdo +:42,42 tabedit +:42,42 tabfind +:42,42 tabfirst +:42,42 tablast +:42,42 tabmove +:42,42 tabnew +:42,42 tabnext +:42,42 tabNext +:42,42 tabonly +:42,42 tabprevious +:42,42 tabrewind +:42,42 tabs +:42,42 tag +:42,42 tags +:42,42 tcd +:42,42 tchdir +:42,42 tcl +:42,42 tcldo +:42,42 tclfile +:42,42 tearoff +:42,42 terminal +:42,42 tfirst +:42,42 throw +:42,42 tjump +:42,42 tlast +:42,42 tlmenu +:42,42 tlnoremenu +:42,42 tlunmenu +:42,42 tmap +:42,42 tmapclear +:42,42 tmenu +:42,42 tnext +:42,42 tNext +:42,42 tnoremap +:42,42 topleft +:42,42 tprevious +:42,42 trewind +:42,42 try +:42,42 tselect +:42,42 tunmap +:42,42 tunmenu +:42,42 type +:42,42 unabbreviate +:42,42 undo +:42,42 undojoin +:42,42 undolist +:42,42 unhide +:42,42 unlet +:42,42 unlockvar +:42,42 unmap +:42,42 unmenu +:42,42 unsilent +:42,42 update +:42,42 var +:42,42 verbose +:42,42 version +:42,42 vertical +:42,42 vglobal +:42,42 view +:42,42 vim9cmd +:42,42 vimgrep +:42,42 vimgrepadd +:42,42 visual +:42,42 viusage +:42,42 vmap +:42,42 vmapclear +:42,42 vmenu +:42,42 vnew +:42,42 vnoremap +:42,42 vnoremenu +:42,42 vsplit +:42,42 vunmap +:42,42 vunmenu +:42,42 wall +:42,42 while +:42,42 wincmd +:42,42 windo +:42,42 winpos +:42,42 winsize +:42,42 wnext +:42,42 wNext +:42,42 wprevious +:42,42 wq +:42,42 wqall +:42,42 write +:42,42 wundo +:42,42 wviminfo +:42,42 xall +:42,42 xmap +:42,42 xmapclear +:42,42 xmenu +:42,42 xnoremap +:42,42 xnoremenu +:42,42 xrestore +:42,42 xunmap +:42,42 xunmenu +:42,42 yank +:42,42 z + +# range + +:1match +:2match +:3match + +:42,42& +:42,42~ +:42,42@ +# :42,42* +:42,42> +:42,42< +:42,42# +:42,42= +:42,42! + +:42,42Next +:42,42Print + +:42,42abbreviate # no range +:42,42abclear # no range +:42,42aboveleft # no range +:42,42abstract # no range +:42,42all +:42,42amenu +:42,42anoremenu +:42,42argadd +:42,42argdedupe # no range +:42,42argdelete +:42,42argdo +:42,42argedit +:42,42argglobal # no range +:42,42arglocal # no range +:42,42args # no range +:42,42argument +:42,42ascii # no range +:42,42augroup END # no range +:42,42augroup Foo # no range +:42,42aunmenu # no range +:42,42autocmd # no range +:42,42badd # no range +:42,42ball +:42,42balt # no range +:42,42bdelete +:42,42behave mswin # no range +:42,42behave xterm # no range +:42,42belowright # no range +:42,42bfirst +:42,42blast +:42,42bmodified +:42,42bnext +:42,42bNext +:42,42botright # no range +:42,42bprevious +:42,42breakadd # no range +:42,42breakdel # no range +:42,42breaklist # no range +:42,42break # no range +:42,42brewind +:42,42browse # no range +:42,42bufdo +:42,42buffer +:42,42buffers # no range +:42,42bunload +:42,42bwipeout +:42,42cabbrev # no range +:42,42cabclear # no range +:42,42cabove +:42,42caddbuffer +:42,42caddexpr # no range +:42,42caddfile # no range +:42,42cafter +:42,42call +:42,42catch # no range +:42,42cbefore +:42,42cbelow +:42,42cbottom # no range +:42,42cbuffer +:42,42cc +:42,42cclose # no range +:42,42cd # no range +:42,42cdo +:42,42center +:42,42cexpr # no range +:42,42cfdo +:42,42cfile # no range +:42,42cfirst +:42,42cgetbuffer +:42,42cgetexpr # no range +:42,42cgetfile # no range +:42,42changes # no range +:42,42chdir # no range +:42,42checkpath # no range +:42,42checktime +:42,42chistory +:42,42class # no range +endclass +:42,42clast +:42,42clearjumps # no range +:42,42clist # no range +:42,42close +:42,42cmapclear # no range +:42,42cmap # no range +:42,42cmenu +:42,42cnewer +:42,42cnext +:42,42cNext +:42,42cnfile +:42,42cNfile +:42,42cnoreabbrev # no range +:42,42cnoremap # no range +:42,42cnoremenu +:42,42colder +:42,42colorscheme # no range +:42,42comclear # no range +:42,42command # no range +:42,42compiler # no range +:42,42confirm # no range +:42,42const # no range +:42,42continue # no range +:42,42copen +:42,42copy +:42,42cpfile +:42,42cprevious +:42,42cquit +:42,42crewind +:42,42cscope # no range +:42,42cstag # no range +:42,42cunabbrev # no range +:42,42cunmap # no range +:42,42cunmenu # no range +:42,42cwindow +:42,42debuggreedy +:42,42debug # no range +:42,42defcompile # no range +:42,42defer # no range +:42,42def # no range +:42,42delcommand # no range +:42,42delete +:42,42delfunction # no range +:42,42delmarks # no range +:42,42diffget +:42,42diffoff # no range +:42,42diffpatch # no range +:42,42diffput +:42,42diffsplit # no range +:42,42diffthis # no range +:42,42diffupdate # no range +:42,42digraphs # no range +:42,42disassemble # no range +:42,42display # no range +:42,42djump +:42,42dlist +:42,42doautoall # no range +:42,42doautocmd # no range +:42,42drop # no range +:42,42dsearch +:42,42dsplit +:42,42earlier # no range +:42,42echoconsole # no range +:42,42echoerr # no range +:42,42echohl # no range +:42,42echomsg # no range +:42,42echon # no range +:42,42echo # no range +:42,42echowindow # no range +:42,42edit # no range +:42,42elseif # no range +:42,42else # no range +:42,42emenu +# :42,42endclass +:42,42enddef # no range +# :42,42endenum +:42,42endfor # no range +:42,42endfunction # no range +:42,42endif # no range +# :42,42endinterface +:42,42endtry # no range +:42,42endwhile # no range +:42,42enew # no range +:42,42enum # no range +endenum +:42,42eval # no range +:42,42execute # no range +:42,42exit +:42,42ex # no range +:42,42export +:42,42exusage # no range +:42,42file +:42,42files # no range +:42,42filetype # no range +:42,42filter # no range +:42,42final +:42,42finally # no range +:42,42final # no range +:42,42find +:42,42finish # no range +:42,42first # no range +:42,42fixdel # no range +:42,42fold +:42,42foldclose +:42,42folddoclosed +:42,42folddoopen +:42,42foldopen +:42,42for # no range +:42,42function # no range +:42,42global +:42,42goto +:42,42grep +:42,42grepadd +:42,42gui # no range +:42,42gvim # no range +:42,42hardcopy +:42,42helpclose # no range +:42,42helpfind # no range +:42,42helpgrep # no range +:42,42help # no range +:42,42helptags # no range +:42,42hide +:42,42highlight # no range +:42,42history # no range +:42,42horizontal # no range +:42,42iabbrev # no range +:42,42iabclear # no range +:42,42if # no range +:42,42ijump +:42,42ilist +:42,42imapclear # no range +:42,42imap # no range +:42,42imenu +:42,42import # no range +:42,42inoreabbrev # no range +:42,42inoremap # no range +:42,42inoremenu +:42,42interface # no range +endinterface +:42,42intro # no range +:42,42isearch +:42,42isplit +:42,42iunabbrev # no range +:42,42iunmap # no range +:42,42iunmenu # no range +:42,42join +:42,42jumps # no range +:42,42keepalt # no range +:42,42keepjumps # no range +:42,42keepmarks # no range +:42,42keeppatterns # no range +:42,42labove +:42,42laddbuffer +:42,42laddexpr # no range +:42,42laddfile # no range +:42,42lafter +:42,42language # no range +:42,42last # no range +:42,42later # no range +:42,42lbefore +:42,42lbelow +:42,42lbottom # no range +:42,42lbuffer +:42,42lcd # no range +:42,42lchdir # no range +:42,42lclose +:42,42lcscope # no range +:42,42ldo +:42,42left +:42,42leftabove # no range +:42,42legacy # no range +:42,42lexpr # no range +:42,42lfdo +:42,42lfile # no range +:42,42lfirst +:42,42lgetbuffer +:42,42lgetexpr # no range +:42,42lgetfile # no range +:42,42lgrep +:42,42lgrepadd +:42,42lhelpgrep # no range +:42,42lhistory +:42,42list +:42,42ll +:42,42llast +:42,42llist # no range +:42,42lmake # norange +:42,42lmapclear # no range +:42,42lmap # no range +:42,42lnewer +:42,42lnext +:42,42lNext +:42,42lnfile +:42,42lNfile +:42,42lnoremap # no range +# :42,42loadkeymap # no range +:42,42loadview # no range +:42,42lockmarks # no range +:42,42lockvar # no range +:42,42lolder +:42,42lopen +:42,42lpfile +:42,42lprevious +:42,42lrewind +:42,42ls # no range +:42,42ltag # no range +:42,42lua +:42,42luado +:42,42luafile +:42,42lunmap # no range +:42,42lvimgrep +:42,42lvimgrepadd +:42,42lwindow +:42,42make # norange +:42,42mapclear # no range +:42,42map # no range +:42,42mark +:42,42marks # no range +:42,42match +:42,42menu +:42,42menutranslate # no range +:42,42messages +:42,42mkexrc # no range +:42,42mksession # no range +:42,42mkspell # no range +:42,42mkview # no range +:42,42mkvimrc # no range +:42,42move +:42,42mzfile +:42,42mzscheme +:42,42nbclose # no range +:42,42nbkey # no range +:42,42nbstart # no range +:42,42new +:42,42next +:42,42nmapclear # no range +:42,42nmap # no range +:42,42nmenu +:42,42nnoremap # no range +:42,42nnoremenu +:42,42noautocmd # no range +:42,42nohlsearch # no range +:42,42noreabbrev # no range +:42,42noremap # no range +:42,42noremenu +:42,42normal +:42,42noswapfile # no range +:42,42number +:42,42nunmap # no range +:42,42nunmenu # no range +:42,42oldfiles # no range +:42,42omapclear # no range +:42,42omap # no range +:42,42omenu +:42,42only +:42,42onoremap # no range +:42,42onoremenu +:42,42options # no range +:42,42ounmap # no range +:42,42ounmenu # no range +:42,42ownsyntax # no range +:42,42packadd # no range +:42,42packloadall # no range +:42,42pclose # no range +:42,42pedit # no range +:42,42perl +:42,42perldo +:42,42pop +:42,42popup # no range +:42,42ppop +:42,42preserve # no range +:42,42previous +:42,42print +:42,42profdel # no range +:42,42profile # no range +:42,42promptfind # no range +:42,42promptrepl # no range +:42,42psearch +:42,42ptag +:42,42ptfirst +:42,42ptjump # no range +:42,42ptlast # no range +:42,42ptnext +:42,42ptNext +:42,42ptprevious +:42,42ptrewind +:42,42ptselect # no range +:42,42public +:42,42put +:42,42pwd # no range +:42,42py3 +:42,42py3do +:42,42py3file +:42,42pydo +:42,42pyfile +:42,42python +:42,42python3 +:42,42pythonx +:42,42pyx +:42,42pyxdo +:42,42pyxfile +:42,42qall # no range +:42,42quit +:42,42quitall # no range +:42,42read +:42,42recover # no range +:42,42redir # no range +:42,42redo # no range +:42,42redraw # no range +:42,42redrawstatus # no range +:42,42redrawtabline # no range +:42,42registers # no range +:42,42resize +:42,42retab +:42,42return # no range +:42,42rewind # no range +:42,42right +:42,42rightbelow # no range +:42,42ruby +:42,42rubydo +:42,42rubyfile +:42,42rundo # no range +:42,42runtime # no range +:42,42rviminfo # no range +:42,42sall +:42,42sandbox # no range +:42,42sargument +:42,42saveas # no range +:42,42sball +:42,42sbfirst # no range +:42,42sblast # no range +:42,42sbmodified +:42,42sbnext +:42,42sbNext +:42,42sbprevious +:42,42sbrewind # no range +:42,42sbuffer +:42,42scriptencoding # no range +:42,42scriptnames +:42,42scriptversion # no range +:42,42scscope # no range +:42,42setfiletype # no range +:42,42setglobal # no range +:42,42setlocal # no range +:42,42set # no range +:42,42sfind +:42,42sfirst # no range +:42,42shell # no range +:42,42sign +:42,42silent # no range +:42,42simalt # no range +:42,42slast # no range +:42,42sleep +:42,42sleep! +:42,42smagic +:42,42smapclear # no range +:42,42smap # no range +:42,42smenu +:42,42smile # no range +:42,42snext +:42,42sNext +:42,42snomagic +:42,42snoremap # no range +:42,42snoremenu +:42,42sort +:42,42source +:42,42spelldump # no range +:42,42spellgood +:42,42spellinfo # no range +:42,42spellrare +:42,42spellrepall # no range +:42,42spellundo +:42,42spellwrong +:42,42split +:42,42sprevious +:42,42srewind # no range +:42,42stag +:42,42startgreplace # no range +:42,42startinsert # no range +:42,42startreplace # no range +:42,42static +:42,42stjump # no range +:42,42stopinsert # no range +:42,42stop # no range +:42,42stselect # no range +:42,42substitute +:42,42sunhide +:42,42sunmap # no range +:42,42sunmenu # no range +:42,42suspend # no range +:42,42sview +:42,42swapname # no range +:42,42syncbind # no range +:42,42syntax # no range +:42,42syntime # no range +:42,42tabclose +:42,42tabdo +:42,42tabedit +:42,42tabfind +:42,42tabfirst # no range +:42,42tablast # no range +:42,42tabmove +:42,42tabnew +:42,42tabnext +:42,42tabNext +:42,42tab # no range +:42,42tabonly +:42,42tabprevious +:42,42tabrewind # no range +:42,42tabs # no range +:42,42tag +:42,42tags # no range +:42,42tcd # no range +:42,42tchdir # no range +:42,42tcl +:42,42tcldo +:42,42tclfile +:42,42tearoff +:42,42terminal +:42,42tfirst +:42,42throw # no range +:42,42tjump # no range +:42,42tlast # no range +:42,42tlmenu +:42,42tlnoremenu +:42,42tlunmenu # no range +:42,42tmapclear # no range +:42,42tmap # no range +:42,42tmenu +:42,42tnext +:42,42tNext +:42,42tnoremap # no range +:42,42topleft # no range +:42,42tprevious +:42,42trewind +:42,42try # no range +:42,42tselect # no range +:42,42tunmap # no range +:42,42tunmenu # no range +:42,42type # no range +:42,42unabbreviate # no range +:42,42undo +:42,42undojoin # no range +:42,42undolist # no range +:42,42unhide +:42,42unlet # no range +:42,42unlockvar # no range +:42,42unmap # no range +:42,42unmenu # no range +:42,42unsilent # no range +:42,42update +:42,42var +:42,42verbose +:42,42version # no range +:42,42vertical # no range +:42,42vglobal +:42,42view # no range +:42,42vim9cmd # no range +:42,42vimgrep +:42,42vimgrepadd +:42,42visual # no range +:42,42viusage # no range +:42,42vmapclear # no range +:42,42vmap # no range +:42,42vmenu +:42,42vnew +:42,42vnoremap # no range +:42,42vnoremenu +:42,42vsplit +:42,42vunmap # no range +:42,42vunmenu # no range +:42,42wall # no range +:42,42while # no range +:42,42wincmd +:42,42windo +:42,42winpos # no range +:42,42winsize # no range +:42,42wnext +:42,42wNext +:42,42wprevious +:42,42wq +:42,42wqall # no range +:42,42write +:42,42wundo # no range +:42,42wviminfo # no range +:42,42xall # no range +:42,42xmapclear # no range +:42,42xmap # no range +:42,42xmenu +:42,42xnoremap # no range +:42,42xnoremenu +:42,42xrestore # no range +:42,42xunmap # no range +:42,42xunmenu # no range +:42,42yank +:42,42z + diff --git a/runtime/syntax/testdir/input/vim_comments.vim b/runtime/syntax/testdir/input/vim_comments.vim index 6c1f990a05..b9726e9601 100644 --- a/runtime/syntax/testdir/input/vim_comments.vim +++ b/runtime/syntax/testdir/input/vim_comments.vim @@ -53,6 +53,13 @@ echo "TOP" \ arg2 + +:"comment" +: "comment" +:"comment +: "comment + + " Issue: #13047 if !exists(":DiffOrig") diff --git a/runtime/syntax/testdir/input/vim_ex_append.vim b/runtime/syntax/testdir/input/vim_ex_append.vim new file mode 100644 index 0000000000..6f63f0f196 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_append.vim @@ -0,0 +1,199 @@ +" Vim :append command +" VIM_TEST_SETUP let g:vimsyn_folding = "T" +" VIM_TEST_SETUP setl fdc=2 fdl=999 fdm=syntax + +" NOTE: legacy Vim script only + + +append +. + +append! +. + +append | line0 +. + +append! | line0 +. + +append +line1 +line2 +. + +append! +line1 +line2 +. + +append " comment +line1 +line2 +. + +append! " comment +line1 +line2 +. + +append | line0 +line1 +line2 +. + +append! | line0 +line1 +line2 +. + +append | " line0 of input text +line1 +line2 +. + +append! | " line0 of input text +line1 +line2 +. + +append | echo "line0 of input text" +line0 +line2 +. + +append! | echo "line0 of input text" +line1 +line2 +. + + +" empty first line + + +append + +. + +append! + +. + +append + +line2 +. + +append! + +line2 +. + +append " comment + +line2 +. + +append! " comment + +line2 +. + +append | line0 + +line2 +. + +append! | line0 + +line2 +. + +append | " line0 of input text + +line2 +. + +append! | " line0 of input text + +line2 +. + +append | echo "line0 of input text" + +line2 +. + +append! | echo "line0 of input text" + +line2 +. + + +" no early termination +" NOTE: 'autoindent' end marker not supported + +append +. + . + . +. + +function Foo() + append +. + . + . +. + + append! +. + . + . +. + + append " comment +. + . + . +. + + append! " comment +. + . + . +. + + append | line0 +. + . + . +. + + append! | line0 +. + . + . +. + + append + endfunction +. + append! + ndfunction +. + append " comment + endfunction +. + append! " comment + endfunction +. + append | line0 + endfunction +. + append! | line0 + endfuncion +. +endfunction + + diff --git a/runtime/syntax/testdir/input/vim_ex_change.vim b/runtime/syntax/testdir/input/vim_ex_change.vim new file mode 100644 index 0000000000..b785bf1146 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_change.vim @@ -0,0 +1,277 @@ +" Vim :change command +" VIM_TEST_SETUP let g:vimsyn_folding = "T" +" VIM_TEST_SETUP setl fdc=2 fdl=999 fdm=syntax + +" NOTE: legacy Vim script only + + +change +. + +change 42 +. + +change! +. + +change | line0 +. + +change! | line0 +. + +change +line1 +line2 +. + +change 42 +line1 +line2 +. + +change! +line1 +line2 +. + +change " comment +line1 +line2 +. + +change 42 " comment +line1 +line2 +. + +change! " comment +line1 +line2 +. + +change | line0 +line1 +line2 +. + +change 42 | line0 +line1 +line2 +. + +change! | line0 +line1 +line2 +. + +change | " line0 of input text +line1 +line2 +. + +change 42 | " line0 of input text +line1 +line2 +. + +change! | " line0 of input text +line1 +line2 +. + +change | echo "line0 of input text" +line0 +line2 +. + +change 42 | echo "line0 of input text" +line0 +line2 +. + +change! | echo "line0 of input text" +line1 +line2 +. + + +" empty first line + + +change + +. + +change 42 + +. + +change! + +. + +change + +line2 +. + +change 42 + +line2 +. + +change! + +line2 +. + +change " comment + +line2 +. + +change 42 " comment + +line2 +. + +change! " comment + +line2 +. + +change | line0 + +line2 +. + +change 42 | line0 + +line2 +. + +change! | line0 + +line2 +. + +change | " line0 of input text + +line2 +. + +change 42 | " line0 of input text + +line2 +. + +change! | " line0 of input text + +line2 +. + +change | echo "line0 of input text" + +line2 +. + +change 42 | echo "line0 of input text" + +line2 +. + +change! | echo "line0 of input text" + +line2 +. + + +" no early termination +" NOTE: 'autoindent' end marker not supported + +change +. + . + . +. + +function Foo() + change +. + . + . +. + + change 42 +. + . + . +. + + change! +. + . + . +. + + change " comment +. + . + . +. + + change 42 " comment +. + . + . +. + + change! " comment +. + . + . +. + + change | line0 +. + . + . +. + + change! | line0 +. + . + . +. + + change + endfunction +. + change 42 + endfunction +. + change! + endfunction +. + change " comment + endfunction +. + change 42 " comment + endfunction +. + change! " comment + endfunction +. + change | line0 + endfunction +. + change 42 | line0 + endfunction +. + change! | line0 + endfuncion +. +endfunction + + diff --git a/runtime/syntax/testdir/input/vim_ex_command_modifiers.vim b/runtime/syntax/testdir/input/vim_ex_command_modifiers.vim index 64b4782f69..08b7773639 100644 --- a/runtime/syntax/testdir/input/vim_ex_command_modifiers.vim +++ b/runtime/syntax/testdir/input/vim_ex_command_modifiers.vim @@ -34,7 +34,6 @@ vim9cmd echo "Foo" : aboveleft echo "Foo" - " FIXME: not a ternary operator ':' : aboveleft echo "Foo" :aboveleft echo "Foo" @@ -133,3 +132,187 @@ aboveleft \ vim9cmd \ echo "Foo" + +aboveleft 42print +belowright 42print +botright 42print +browse 42print +confirm 42print +filter /pattern/ 42print +filter! /pattern/ 42print +hide 42print +horizontal 42print +keepalt 42print +keepjumps 42print +keepmarks 42print +keeppatterns 42print +leftabove 42print +legacy 42print +lockmarks 42print +noautocmd 42print +noswapfile 42print +rightbelow 42print +sandbox 42print +silent 42print +silent! 42print +tab 42print +topleft 42print +unsilent 42print +verbose 42print +vertical 42print +vim9cmd 42print + +aboveleft :42print +belowright :42print +botright :42print +browse :42print +confirm :42print +filter /pattern/ :42print +filter! /pattern/ :42print +hide :42print +horizontal :42print +keepalt :42print +keepjumps :42print +keepmarks :42print +keeppatterns :42print +leftabove :42print +legacy :42print +lockmarks :42print +noautocmd :42print +noswapfile :42print +rightbelow :42print +sandbox :42print +silent :42print +silent! :42print +tab :42print +topleft :42print +unsilent :42print +verbose :42print +vertical :42print +vim9cmd :42print + + +silent :delete _ +silent $delete _ +silent :$delete _ + +lockmarks '[,']d _ + +silent keeppatterns %s/\v^%(%(([=`:.'"~^_*+#-])\1+\n)?.{1,2}\n([=`:.'"~^_*+#-])\2+)|%(%(([=`:.''"~^_*+#-])\3{2,}\n)?.{3,}\n([=`:.''"~^_*+#-])\4{2,})$/\=closure.Process(submatch(0))/gn + +def Vim9Context() + + silent copy + silent copy + silent copy = 99 + silent copy = 99 + silent g:copy = 99 + silent g:copy = 99 + silent copy() + silent copy() + silent call copy() + silent call copy() + silent Copy() + silent Copy() + silent call Copy() + silent call Copy() + silent Copy + silent Copy + silent Copy! + silent Copy! + silent Copy = 99 + silent Copy = 99 + silent g:Copy = 99 + silent g:Copy = 99 + + silent! copy + silent! copy + silent! copy = 99 + silent! copy = 99 + silent! g:copy = 99 + silent! g:copy = 99 + silent! copy() + silent! copy() + silent! call copy() + silent! call copy() + silent! Copy() + silent! Copy() + silent! call Copy() + silent! call Copy() + silent! Copy + silent! Copy + silent! Copy! + silent! Copy! + silent! Copy = 99 + silent! Copy = 99 + silent! g:Copy = 99 + silent! g:Copy = 99 + + filter pattern copy + filter pattern copy + filter pattern copy = 99 + filter pattern copy = 99 + filter pattern g:copy = 99 + filter pattern g:copy = 99 + filter pattern copy() + filter pattern copy() + filter pattern call copy() + filter pattern call copy() + filter pattern Copy() + filter pattern Copy() + filter pattern call Copy() + filter pattern call Copy() + filter pattern Copy + filter pattern Copy + filter pattern Copy! + filter pattern Copy! + filter pattern Copy = 99 + filter pattern Copy = 99 + filter pattern g:Copy = 99 + filter pattern g:Copy = 99 + + filter /pattern/ copy + filter /pattern/ copy + filter /pattern/ copy = 99 + filter /pattern/ copy = 99 + filter /pattern/ g:copy = 99 + filter /pattern/ g:copy = 99 + filter /pattern/ copy() + filter /pattern/ copy() + filter /pattern/ call copy() + filter /pattern/ call copy() + filter /pattern/ Copy() + filter /pattern/ Copy() + filter /pattern/ call Copy() + filter /pattern/ call Copy() + filter /pattern/ Copy + filter /pattern/ Copy + filter /pattern/ Copy! + filter /pattern/ Copy! + filter /pattern/ Copy = 99 + filter /pattern/ Copy = 99 + filter /pattern/ g:Copy = 99 + filter /pattern/ g:Copy = 99 + + silent wincmd = + silent wincmd = # comment + silent wincmd = | echo "..." + silent wincmd = 42 + +enddef + + +" Random test failures - now fixed + +" exe is error highighted +silent! exe (nr+1) . 'd _' +function Foo() + silent! exe (nr+1) . 'd _' +endfunction + +" execute is command not function +silent! execute (nr+1) . 'd _' +function Foo() + silent! execute (nr+1) . 'd _' +endfunction + diff --git a/runtime/syntax/testdir/input/vim_ex_commands.vim b/runtime/syntax/testdir/input/vim_ex_commands.vim index 96199acbb5..9343014a7b 100644 --- a/runtime/syntax/testdir/input/vim_ex_commands.vim +++ b/runtime/syntax/testdir/input/vim_ex_commands.vim @@ -1,18 +1,24 @@ " Ex commands -" START NOT MATCHED -:Next -:Print -:X -" END NOT MATCHED - :help :help : help - : help # FIXME + : help +:& +:~ :@ +" :* +:> +:< +:# +:= +:! + +:Next +:Print +:X :append text @@ -23,24 +29,22 @@ :all :amenu :anoremenu -:args :argadd :argdedupe :argdelete -:argedit :argdo +:argedit :argglobal :arglocal +:args :argument :ascii -:autocmd :augroup Foo :augroup END :aunmenu -:buffer -:bNext -:ball +:autocmd :badd +:ball :balt :bdelete :behave mswin @@ -50,23 +54,23 @@ :blast :bmodified :bnext +:bNext :botright :bprevious -:brewind :break :breakadd :breakdel :breaklist +:brewind :browse :bufdo +:buffer :buffers :bunload :bwipeout :change text . -:cNext -:cNfile :cabbrev :cabclear :cabove @@ -84,9 +88,9 @@ :cclose :cd :cdo -:cfdo :center :cexpr +:cfdo :cfile :cfirst :cgetbuffer @@ -104,61 +108,60 @@ :cmap :cmapclear :cmenu -:cnext :cnewer +:cnext +:cNext :cnfile -:cnoremap +:cNfile :cnoreabbrev +:cnoremap :cnoremenu -:copy :colder :colorscheme -:command :comclear +:command :compiler -:continue :confirm :const +:continue :copen -:cprevious +:copy :cpfile +:cprevious :cquit :crewind :cscope :cstag -:cunmap :cunabbrev +:cunmap :cunmenu :cwindow -:delete :debug :debuggreedy :def :defcompile :defer :delcommand +:delete :delfunction :delmarks -:diffupdate :diffget :diffoff :diffpatch :diffput :diffsplit :diffthis +:diffupdate :digraphs -:display :disassemble +:display :djump -:dl :dlist -:doautocmd :doautoall -:dp +:doautocmd :drop :dsearch :dsplit -:edit :earlier :echo :echoconsole @@ -167,13 +170,14 @@ :echomsg :echon :echowindow +:edit :else :elseif :emenu :enddef -:endif :endfor :endfunction +:endif :endtry :endwhile :enew @@ -186,20 +190,20 @@ :files :filetype :filter -:find :final :finally +:find :finish :first :fixdel :fold :foldclose -:folddoopen :folddoclosed +:folddoopen :foldopen :for foo in bar | endfor :function -:global/.../ +:global :goto :grep :grepadd @@ -211,8 +215,8 @@ :helpfind :helpgrep :helptags -:highlight :hide +:highlight :history :horizontal :insert @@ -227,32 +231,29 @@ :imapclear :imenu :import -:inoremap :inoreabbrev +:inoremap :inoremenu :intro :isearch :isplit -:iunmap :iunabbrev +:iunmap :iunmenu :join :jumps :k :keepalt -:keepmarks :keepjumps +:keepmarks :keeppatterns -:lNext -:lNfile -:list :labove -:laddexpr :laddbuffer +:laddexpr :laddfile :lafter -:last :language +:last :later :lbefore :lbelow @@ -263,12 +264,12 @@ :lclose :lcscope :ldo -:lfdo :left :leftabove :legacy :let :lexpr +:lfdo :lfile :lfirst :lgetbuffer @@ -278,15 +279,18 @@ :lgrepadd :lhelpgrep :lhistory +:list :ll :llast :llist :lmake :lmap :lmapclear -:lnext :lnewer +:lnext +:lNext :lnfile +:lNfile :lnoremap " :loadkeymap " disabled - runs until EOF :loadview @@ -294,23 +298,22 @@ :lockvar :lolder :lopen -:lprevious :lpfile +:lprevious :lrewind :ls :ltag -:lunmap :lua :luado :luafile +:lunmap :lvimgrep :lvimgrepadd :lwindow -:move -:mark :make :map :mapclear +:mark :marks :match :menu @@ -319,25 +322,26 @@ :mkexrc :mksession :mkspell -:mkvimrc :mkview +:mkvimrc :mode -:mzscheme +:move :mzfile +:mzscheme :nbclose :nbkey :nbstart -:next :new +:next :nmap :nmapclear :nmenu :nnoremap :nnoremenu :noautocmd -:noremap :nohlsearch :noreabbrev +:noremap :noremenu :normal :noswapfile @@ -345,13 +349,13 @@ :nunmap :nunmenu :oldfiles -:open :omap :omapclear :omenu :only :onoremap :onoremenu +:open :options :ounmap :ounmenu @@ -361,47 +365,47 @@ :pclose :pedit :perl -:print -:profdel -:profile -:promptfind -:promptrepl :perldo :pop :popup :ppop :preserve :previous +:print +:profdel +:profile +:promptfind +:promptrepl :psearch :ptag -:ptNext :ptfirst :ptjump :ptlast :ptnext +:ptNext :ptprevious :ptrewind :ptselect :put :pwd :py3 -:python3 :py3do :py3file -:python :pydo :pyfile -:pyx +:python +:python3 :pythonx +:pyx :pyxdo :pyxfile +:qall :quit :quitall -:qall :read :recover -:redo :redir +:redo :redraw :redrawstatus :redrawtabline @@ -418,23 +422,21 @@ :rundo :runtime :rviminfo -:substitute -:sNext +:sall :sandbox :sargument -:sall :saveas -:sbuffer -:sbNext :sball :sbfirst :sblast :sbmodified :sbnext +:sbNext :sbprevious :sbrewind -:scriptnames +:sbuffer :scriptencoding +:scriptnames :scriptversion :scscope :set @@ -444,18 +446,18 @@ :sfind :sfirst :shell -:simalt :sign :silent -:sleep -:sleep! +:simalt :slast +:sleep :smagic :smap :smapclear :smenu :smile :snext +:sNext :snomagic :snoremap :snoremenu @@ -471,26 +473,26 @@ :split :sprevious :srewind -:stop :stag -:startinsert :startgreplace +:startinsert :startreplace -:stopinsert :stjump +:stop +:stopinsert :stselect +:substitute :sunhide :sunmap :sunmenu :suspend :sview :swapname +:syncbind :syntax :syntime -:syncbind :t -:tNext -:tabNext +:tab :tabclose :tabdo :tabedit @@ -500,11 +502,11 @@ :tabmove :tabnew :tabnext +:tabNext :tabonly :tabprevious :tabrewind :tabs -:tab :tag :tags :tcd @@ -521,10 +523,11 @@ :tlmenu :tlnoremenu :tlunmenu -:tmapclear :tmap +:tmapclear :tmenu :tnext +:tNext :tnoremap :topleft :tprevious @@ -533,11 +536,10 @@ :tselect :tunmap :tunmenu +:unabbreviate :undo :undojoin :undolist -:unabbreviate -:unabbreviate :unhide :uniq :unlet @@ -546,16 +548,16 @@ :unmenu :unsilent :update -:vglobal/.../ -:version :verbose +:version :vertical +:vglobal +:view :vim9cmd :vimgrep :vimgrepadd :visual :viusage -:view :vmap :vmapclear :vmenu @@ -565,39 +567,57 @@ :vsplit :vunmap :vunmenu -:windo -:write -:wNext :wall :while -:winsize :wincmd +:windo :winpos +:winsize :wnext +:wNext :wprevious :wq :wqall +:write :wundo :wviminfo -:xit :xall -:xmapclear +:xit :xmap +:xmapclear :xmenu -:xrestore :xnoremap :xnoremenu +:xrestore :xunmap :xunmenu :yank :z call Foo()|help -call Foo() | help call Foo() |help call Foo()| help +call Foo() | help + +call Foo() |:help +call Foo() | :help +call Foo() |: help +call Foo() | : help + +call Foo() | & +call Foo() | ~ +call Foo() | @ +" call Foo() | :* +call Foo() | > +call Foo() | < +call Foo() | # +call Foo() | = +call Foo() | ! + +call Foo() | Next +call Foo() | Print +call Foo() | X -" FIXME call Foo() | append text . @@ -607,23 +627,22 @@ call Foo() | aboveleft call Foo() | all call Foo() | amenu call Foo() | anoremenu -call Foo() | args call Foo() | argadd call Foo() | argdedupe call Foo() | argdelete -call Foo() | argedit call Foo() | argdo +call Foo() | argedit call Foo() | argglobal call Foo() | arglocal +call Foo() | args call Foo() | argument call Foo() | ascii -call Foo() | autocmd -call Foo() | augroup Foo | augroup END +call Foo() | augroup Foo +call Foo() | augroup END call Foo() | aunmenu -call Foo() | buffer -call Foo() | bNext -call Foo() | ball +call Foo() | autocmd call Foo() | badd +call Foo() | ball call Foo() | balt call Foo() | bdelete call Foo() | behave mswin @@ -633,24 +652,23 @@ call Foo() | bfirst call Foo() | blast call Foo() | bmodified call Foo() | bnext +call Foo() | bNext call Foo() | botright call Foo() | bprevious -call Foo() | brewind call Foo() | break call Foo() | breakadd call Foo() | breakdel call Foo() | breaklist +call Foo() | brewind call Foo() | browse call Foo() | bufdo +call Foo() | buffer call Foo() | buffers call Foo() | bunload call Foo() | bwipeout -" FIXME call Foo() | change text . -call Foo() | cNext -call Foo() | cNfile call Foo() | cabbrev call Foo() | cabclear call Foo() | cabove @@ -668,9 +686,9 @@ call Foo() | cc call Foo() | cclose call Foo() | cd call Foo() | cdo -call Foo() | cfdo call Foo() | center call Foo() | cexpr +call Foo() | cfdo call Foo() | cfile call Foo() | cfirst call Foo() | cgetbuffer @@ -688,61 +706,60 @@ call Foo() | close call Foo() | cmap call Foo() | cmapclear call Foo() | cmenu -call Foo() | cnext call Foo() | cnewer +call Foo() | cnext +call Foo() | cNext call Foo() | cnfile -call Foo() | cnoremap +call Foo() | cNfile call Foo() | cnoreabbrev +call Foo() | cnoremap call Foo() | cnoremenu -call Foo() | copy call Foo() | colder call Foo() | colorscheme -call Foo() | command call Foo() | comclear +call Foo() | command call Foo() | compiler -call Foo() | continue call Foo() | confirm call Foo() | const +call Foo() | continue call Foo() | copen -call Foo() | cprevious +call Foo() | copy call Foo() | cpfile +call Foo() | cprevious call Foo() | cquit call Foo() | crewind call Foo() | cscope call Foo() | cstag -call Foo() | cunmap call Foo() | cunabbrev +call Foo() | cunmap call Foo() | cunmenu call Foo() | cwindow -call Foo() | delete call Foo() | debug call Foo() | debuggreedy call Foo() | def call Foo() | defcompile call Foo() | defer call Foo() | delcommand +call Foo() | delete call Foo() | delfunction call Foo() | delmarks -call Foo() | diffupdate call Foo() | diffget call Foo() | diffoff call Foo() | diffpatch call Foo() | diffput call Foo() | diffsplit call Foo() | diffthis +call Foo() | diffupdate call Foo() | digraphs -call Foo() | display call Foo() | disassemble +call Foo() | display call Foo() | djump -call Foo() | dl call Foo() | dlist -call Foo() | doautocmd call Foo() | doautoall -call Foo() | dp +call Foo() | doautocmd call Foo() | drop call Foo() | dsearch call Foo() | dsplit -call Foo() | edit call Foo() | earlier call Foo() | echo call Foo() | echoconsole @@ -751,13 +768,14 @@ call Foo() | echohl call Foo() | echomsg call Foo() | echon call Foo() | echowindow +call Foo() | edit call Foo() | else call Foo() | elseif call Foo() | emenu call Foo() | enddef -call Foo() | endif call Foo() | endfor call Foo() | endfunction +call Foo() | endif call Foo() | endtry call Foo() | endwhile call Foo() | enew @@ -770,20 +788,20 @@ call Foo() | file call Foo() | files call Foo() | filetype call Foo() | filter -call Foo() | find call Foo() | final call Foo() | finally +call Foo() | find call Foo() | finish call Foo() | first call Foo() | fixdel call Foo() | fold call Foo() | foldclose -call Foo() | folddoopen call Foo() | folddoclosed +call Foo() | folddoopen call Foo() | foldopen call Foo() | for foo in bar | endfor call Foo() | function -call Foo() | global/.../ +call Foo() | global call Foo() | goto call Foo() | grep call Foo() | grepadd @@ -795,11 +813,10 @@ call Foo() | helpclose call Foo() | helpfind call Foo() | helpgrep call Foo() | helptags -call Foo() | highlight call Foo() | hide +call Foo() | highlight call Foo() | history call Foo() | horizontal -" FIXME call Foo() | insert text . @@ -812,32 +829,29 @@ call Foo() | imap call Foo() | imapclear call Foo() | imenu call Foo() | import -call Foo() | inoremap call Foo() | inoreabbrev +call Foo() | inoremap call Foo() | inoremenu call Foo() | intro call Foo() | isearch call Foo() | isplit -call Foo() | iunmap call Foo() | iunabbrev +call Foo() | iunmap call Foo() | iunmenu call Foo() | join call Foo() | jumps call Foo() | k call Foo() | keepalt -call Foo() | keepmarks call Foo() | keepjumps +call Foo() | keepmarks call Foo() | keeppatterns -call Foo() | lNext -call Foo() | lNfile -call Foo() | list call Foo() | labove -call Foo() | laddexpr call Foo() | laddbuffer +call Foo() | laddexpr call Foo() | laddfile call Foo() | lafter -call Foo() | last call Foo() | language +call Foo() | last call Foo() | later call Foo() | lbefore call Foo() | lbelow @@ -848,12 +862,12 @@ call Foo() | lchdir call Foo() | lclose call Foo() | lcscope call Foo() | ldo -call Foo() | lfdo call Foo() | left call Foo() | leftabove call Foo() | legacy call Foo() | let call Foo() | lexpr +call Foo() | lfdo call Foo() | lfile call Foo() | lfirst call Foo() | lgetbuffer @@ -863,39 +877,41 @@ call Foo() | lgrep call Foo() | lgrepadd call Foo() | lhelpgrep call Foo() | lhistory +call Foo() | list call Foo() | ll call Foo() | llast call Foo() | llist call Foo() | lmake call Foo() | lmap call Foo() | lmapclear -call Foo() | lnext call Foo() | lnewer +call Foo() | lnext +call Foo() | lNext call Foo() | lnfile +call Foo() | lNfile call Foo() | lnoremap -" call Foo() | loadkeymap " disabled - runs until EOF +" :loadkeymap " disabled - runs until EOF call Foo() | loadview call Foo() | lockmarks call Foo() | lockvar call Foo() | lolder call Foo() | lopen -call Foo() | lprevious call Foo() | lpfile +call Foo() | lprevious call Foo() | lrewind call Foo() | ls call Foo() | ltag -call Foo() | lunmap call Foo() | lua call Foo() | luado call Foo() | luafile +call Foo() | lunmap call Foo() | lvimgrep call Foo() | lvimgrepadd call Foo() | lwindow -call Foo() | move -call Foo() | mark call Foo() | make call Foo() | map call Foo() | mapclear +call Foo() | mark call Foo() | marks call Foo() | match call Foo() | menu @@ -904,25 +920,26 @@ call Foo() | messages call Foo() | mkexrc call Foo() | mksession call Foo() | mkspell -call Foo() | mkvimrc call Foo() | mkview +call Foo() | mkvimrc call Foo() | mode -call Foo() | mzscheme +call Foo() | move call Foo() | mzfile +call Foo() | mzscheme call Foo() | nbclose call Foo() | nbkey call Foo() | nbstart -call Foo() | next call Foo() | new +call Foo() | next call Foo() | nmap call Foo() | nmapclear call Foo() | nmenu call Foo() | nnoremap call Foo() | nnoremenu call Foo() | noautocmd -call Foo() | noremap call Foo() | nohlsearch call Foo() | noreabbrev +call Foo() | noremap call Foo() | noremenu call Foo() | normal call Foo() | noswapfile @@ -930,13 +947,13 @@ call Foo() | number call Foo() | nunmap call Foo() | nunmenu call Foo() | oldfiles -call Foo() | open call Foo() | omap call Foo() | omapclear call Foo() | omenu call Foo() | only call Foo() | onoremap call Foo() | onoremenu +call Foo() | open call Foo() | options call Foo() | ounmap call Foo() | ounmenu @@ -946,47 +963,47 @@ call Foo() | packloadall call Foo() | pclose call Foo() | pedit call Foo() | perl -call Foo() | print -call Foo() | profdel -call Foo() | profile -call Foo() | promptfind -call Foo() | promptrepl call Foo() | perldo call Foo() | pop call Foo() | popup call Foo() | ppop call Foo() | preserve call Foo() | previous +call Foo() | print +call Foo() | profdel +call Foo() | profile +call Foo() | promptfind +call Foo() | promptrepl call Foo() | psearch call Foo() | ptag -call Foo() | ptNext call Foo() | ptfirst call Foo() | ptjump call Foo() | ptlast call Foo() | ptnext +call Foo() | ptNext call Foo() | ptprevious call Foo() | ptrewind call Foo() | ptselect call Foo() | put call Foo() | pwd call Foo() | py3 -call Foo() | python3 call Foo() | py3do call Foo() | py3file -call Foo() | python call Foo() | pydo call Foo() | pyfile -call Foo() | pyx +call Foo() | python +call Foo() | python3 call Foo() | pythonx +call Foo() | pyx call Foo() | pyxdo call Foo() | pyxfile +call Foo() | qall call Foo() | quit call Foo() | quitall -call Foo() | qall call Foo() | read call Foo() | recover -call Foo() | redo call Foo() | redir +call Foo() | redo call Foo() | redraw call Foo() | redrawstatus call Foo() | redrawtabline @@ -1003,23 +1020,21 @@ call Foo() | rubyfile call Foo() | rundo call Foo() | runtime call Foo() | rviminfo -call Foo() | substitute -call Foo() | sNext +call Foo() | sall call Foo() | sandbox call Foo() | sargument -call Foo() | sall call Foo() | saveas -call Foo() | sbuffer -call Foo() | sbNext call Foo() | sball call Foo() | sbfirst call Foo() | sblast call Foo() | sbmodified call Foo() | sbnext +call Foo() | sbNext call Foo() | sbprevious call Foo() | sbrewind -call Foo() | scriptnames +call Foo() | sbuffer call Foo() | scriptencoding +call Foo() | scriptnames call Foo() | scriptversion call Foo() | scscope call Foo() | set @@ -1029,18 +1044,18 @@ call Foo() | setlocal call Foo() | sfind call Foo() | sfirst call Foo() | shell -call Foo() | simalt call Foo() | sign call Foo() | silent -call Foo() | sleep -call Foo() | sleep! +call Foo() | simalt call Foo() | slast +call Foo() | sleep call Foo() | smagic call Foo() | smap call Foo() | smapclear call Foo() | smenu call Foo() | smile call Foo() | snext +call Foo() | sNext call Foo() | snomagic call Foo() | snoremap call Foo() | snoremenu @@ -1056,26 +1071,26 @@ call Foo() | spellwrong call Foo() | split call Foo() | sprevious call Foo() | srewind -call Foo() | stop call Foo() | stag -call Foo() | startinsert call Foo() | startgreplace +call Foo() | startinsert call Foo() | startreplace -call Foo() | stopinsert call Foo() | stjump +call Foo() | stop +call Foo() | stopinsert call Foo() | stselect +call Foo() | substitute call Foo() | sunhide call Foo() | sunmap call Foo() | sunmenu call Foo() | suspend call Foo() | sview call Foo() | swapname +call Foo() | syncbind call Foo() | syntax call Foo() | syntime -call Foo() | syncbind call Foo() | t -call Foo() | tNext -call Foo() | tabNext +call Foo() | tab call Foo() | tabclose call Foo() | tabdo call Foo() | tabedit @@ -1085,11 +1100,11 @@ call Foo() | tablast call Foo() | tabmove call Foo() | tabnew call Foo() | tabnext +call Foo() | tabNext call Foo() | tabonly call Foo() | tabprevious call Foo() | tabrewind call Foo() | tabs -call Foo() | tab call Foo() | tag call Foo() | tags call Foo() | tcd @@ -1106,10 +1121,11 @@ call Foo() | tlast call Foo() | tlmenu call Foo() | tlnoremenu call Foo() | tlunmenu -call Foo() | tmapclear call Foo() | tmap +call Foo() | tmapclear call Foo() | tmenu call Foo() | tnext +call Foo() | tNext call Foo() | tnoremap call Foo() | topleft call Foo() | tprevious @@ -1118,11 +1134,10 @@ call Foo() | try call Foo() | tselect call Foo() | tunmap call Foo() | tunmenu +call Foo() | unabbreviate call Foo() | undo call Foo() | undojoin call Foo() | undolist -call Foo() | unabbreviate -call Foo() | unabbreviate call Foo() | unhide call Foo() | uniq call Foo() | unlet @@ -1131,16 +1146,16 @@ call Foo() | unmap call Foo() | unmenu call Foo() | unsilent call Foo() | update -call Foo() | vglobal/.../ -call Foo() | version call Foo() | verbose +call Foo() | version call Foo() | vertical +call Foo() | vglobal +call Foo() | view call Foo() | vim9cmd call Foo() | vimgrep call Foo() | vimgrepadd call Foo() | visual call Foo() | viusage -call Foo() | view call Foo() | vmap call Foo() | vmapclear call Foo() | vmenu @@ -1150,34 +1165,33 @@ call Foo() | vnoremenu call Foo() | vsplit call Foo() | vunmap call Foo() | vunmenu -call Foo() | windo -call Foo() | write -call Foo() | wNext call Foo() | wall call Foo() | while -call Foo() | winsize call Foo() | wincmd +call Foo() | windo call Foo() | winpos +call Foo() | winsize call Foo() | wnext +call Foo() | wNext call Foo() | wprevious call Foo() | wq call Foo() | wqall +call Foo() | write call Foo() | wundo call Foo() | wviminfo -call Foo() | xit call Foo() | xall -call Foo() | xmapclear +call Foo() | xit call Foo() | xmap +call Foo() | xmapclear call Foo() | xmenu -call Foo() | xrestore call Foo() | xnoremap call Foo() | xnoremenu +call Foo() | xrestore call Foo() | xunmap call Foo() | xunmenu call Foo() | yank call Foo() | z - " Vim9-script only :abstract @@ -1194,17 +1208,48 @@ call Foo() | z :type :var -Foo() | abstract -Foo() | class -Foo() | endclass -Foo() | endenum -Foo() | endinterface -Foo() | enum -Foo() | export -Foo() | final -Foo() | interface -Foo() | public -Foo() | static -Foo() | type -Foo() | var +call Foo() | abstract +call Foo() | class +call Foo() | endclass +call Foo() | endenum +call Foo() | endinterface +call Foo() | enum +call Foo() | export +call Foo() | final +call Foo() | interface +call Foo() | public +call Foo() | static +call Foo() | type +call Foo() | var + + +" User commands + +Foobar +Foobar! +Foobar123 +Foobar123! +Foo123bar +Foo123bar! + +:Foobar +:Foobar! +:Foobar123 +:Foobar123! +:Foo123bar +:Foo123bar! + +call Foo() | Foobar +call Foo() | Foobar! +call Foo() | Foobar123 +call Foo() | Foobar123! +call Foo() | Foo123bar +call Foo() | Foo123bar! + +call Foo() | :Foobar +call Foo() | :Foobar! +call Foo() | :Foobar123 +call Foo() | :Foobar123! +call Foo() | :Foo123bar +call Foo() | :Foo123bar! diff --git a/runtime/syntax/testdir/input/vim_ex_debuggreedy.vim b/runtime/syntax/testdir/input/vim_ex_debuggreedy.vim index 27c93a0e6c..5606d13cf5 100644 --- a/runtime/syntax/testdir/input/vim_ex_debuggreedy.vim +++ b/runtime/syntax/testdir/input/vim_ex_debuggreedy.vim @@ -23,12 +23,12 @@ endfunction def Bar() debuggreedy - 0debuggreedy + :0debuggreedy debuggreedy # comment - 0debuggreedy # comment + :0debuggreedy # comment debuggreedy | echo "Foo" - 0debuggreedy | echo "Foo" + :0debuggreedy | echo "Foo" enddef diff --git a/runtime/syntax/testdir/input/vim_ex_delete.vim b/runtime/syntax/testdir/input/vim_ex_delete.vim new file mode 100644 index 0000000000..6a8efbd201 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_delete.vim @@ -0,0 +1,115 @@ +" Vim :delete command + + +delete + + +" print flags + + +" :delete | :list + +dl +del " :delete only +dell +delel +deletl +deletel + +" :delete | :print + +dp +dep +delp +delep +deletp +deletep + +" :delete | :number + +d# +de# +del# +dele# +delet# +delete# + +" after register and count args + +delete l l +delete p p +delete a # + +delete ll +delete pp +delete a# + +delete 42 l +delete 42 p +delete 42 # + +delete 42l +delete 42p +delete 42# + +delete l 42 l +delete p 42 p +delete a 42 # + +delete l42l +delete p42p +delete a42# + +" multiple, any order, optional whitespace + +delete l p # lp# ll pp ## + + +" registers and count + +delete l +delete p +delete _ +delete \" + +delete_ +delete\" + +delete a +delete 42 +delete a 42 +delete a42 + +delete_ +delete42 +delete_42 +delete _42 +delete _ 42 + +delete\" +delete42 +delete\"42 +delete \"42 +delete \" 42 + + +" trailing bar and tail comment + +delete | echo "..." +delete| echo "..." +delete a | echo "..." +delete a| echo "..." +delete 42 | echo "..." +delete 42| echo "..." +deletel | echo "..." +deletel| echo "..." + +delete " comment +delete" comment +delete a " comment +delete a" comment +delete 42 " comment +delete 42" comment +deletel " comment +deletel" comment + diff --git a/runtime/syntax/testdir/input/vim_ex_echo.vim b/runtime/syntax/testdir/input/vim_ex_echo.vim index 7715df1cbc..8b401f6cec 100644 --- a/runtime/syntax/testdir/input/vim_ex_echo.vim +++ b/runtime/syntax/testdir/input/vim_ex_echo.vim @@ -36,6 +36,12 @@ echo "\ comment \ 42 +echo "Foo" + \| echo "bar" + +echo "Foo"| + \ echo "bar" + " Trailing bar and comments diff --git a/runtime/syntax/testdir/input/vim_ex_equals.vim b/runtime/syntax/testdir/input/vim_ex_equals.vim new file mode 100644 index 0000000000..23ca12dc66 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_equals.vim @@ -0,0 +1,32 @@ +" Vim := command + + += += l +> p +> # + += lp# + += | echo "..." += " comment += l | echo "..." += l " comment + + +def Vim9Context() + # FIXME: differentiate operator and command when operators are contained + # = + := + := l + := p + := # + + := lp# + + := | echo "..." + := # comment + := l | echo "..." + := l # comment +enddef + diff --git a/runtime/syntax/testdir/input/vim_ex_eval.vim b/runtime/syntax/testdir/input/vim_ex_eval.vim index e4f629337d..6e0b8adbf4 100644 --- a/runtime/syntax/testdir/input/vim_ex_eval.vim +++ b/runtime/syntax/testdir/input/vim_ex_eval.vim @@ -12,7 +12,7 @@ eval "Foo"->append(0) | echo "Foo" echo "Foo" | eval "Foo"->append(0) -eval "Foo"->append(0) " comment +eval "Foo"->append(0) | " comment def Vim9Context() eval "Foo"->append(0) # comment diff --git a/runtime/syntax/testdir/input/vim_ex_global.vim b/runtime/syntax/testdir/input/vim_ex_global.vim new file mode 100644 index 0000000000..59453c51f2 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_global.vim @@ -0,0 +1,42 @@ +" Vim :global and :v commands + + +global/foo/echo "..." +global!/foo/echo "..." +vglobal/foo/echo "..." + +global /foo/ echo "..." +global! /foo/ echo "..." +vglobal /foo/ echo "..." + +" docs state ! is not allowed as the delimiter but it works +global!!foo!echo "..." +global! !foo! echo "..." + +" command with range +global/./.,/^$/join + +" recursive +global/found/v/not\%(found\)/echo "..." + + +def Vim9Context() + global/foo/echo "..." + global!/foo/echo "..." + vglobal/foo/echo "..." + + global /foo/ echo "..." + global! /foo/ echo "..." + vglobal /foo/ echo "..." + + # docs state ! is not allowed as the delimiter but it works + global!!foo!echo "..." + global! !foo! echo "..." + + # command with range + global/./.,/^$/join + + # recursive + global/found/v/not\%(found\)/echo "..." +enddef + diff --git a/runtime/syntax/testdir/input/vim_ex_insert.vim b/runtime/syntax/testdir/input/vim_ex_insert.vim new file mode 100644 index 0000000000..996ceeb55c --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_insert.vim @@ -0,0 +1,199 @@ +" Vim :insert command +" VIM_TEST_SETUP let g:vimsyn_folding = "T" +" VIM_TEST_SETUP setl fdc=2 fdl=999 fdm=syntax + +" NOTE: legacy Vim script only + + +insert +. + +insert! +. + +insert | line0 +. + +insert! | line0 +. + +insert +line1 +line2 +. + +insert! +line1 +line2 +. + +insert " comment +line1 +line2 +. + +insert! " comment +line1 +line2 +. + +insert | line0 +line1 +line2 +. + +insert! | line0 +line1 +line2 +. + +insert | " line0 of input text +line1 +line2 +. + +insert! | " line0 of input text +line1 +line2 +. + +insert | echo "line0 of input text" +line0 +line2 +. + +insert! | echo "line0 of input text" +line1 +line2 +. + + +" empty first line + + +insert + +. + +insert! + +. + +insert + +line2 +. + +insert! + +line2 +. + +insert " comment + +line2 +. + +insert! " comment + +line2 +. + +insert | line0 + +line2 +. + +insert! | line0 + +line2 +. + +insert | " line0 of input text + +line2 +. + +insert! | " line0 of input text + +line2 +. + +insert | echo "line0 of input text" + +line2 +. + +insert! | echo "line0 of input text" + +line2 +. + + +" no early termination +" NOTE: 'autoindent' end marker not supported + +insert +. + . + . +. + +function Foo() + insert +. + . + . +. + + insert! +. + . + . +. + + insert " comment +. + . + . +. + + insert! " comment +. + . + . +. + + insert | line0 +. + . + . +. + + insert! | line0 +. + . + . +. + + insert + endfunction +. + insert! + ndfunction +. + insert " comment + endfunction +. + insert! " comment + endfunction +. + insert | line0 + endfunction +. + insert! | line0 + endfuncion +. +endfunction + + diff --git a/runtime/syntax/testdir/input/vim_ex_leftshift.vim b/runtime/syntax/testdir/input/vim_ex_leftshift.vim new file mode 100644 index 0000000000..bc03f85dab --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_leftshift.vim @@ -0,0 +1,87 @@ +" Vim :< command + +< +<< +<<< + +< < +< < < + +< 42 +<< 42 +<<< 42 + +< l +< p +< # +<< l +<< p +<< # + +< lp# +<< lp# + +< 42 l +< 42 p +< 42 # +<< 42 l +<< 42 p +<< 42 # + +< 42 lp# +<< 42 lp# + +< | echo "..." +< " comment +< < | echo "..." +< < " comment +< 42 | echo "..." +< 42 " comment +< l | echo "..." +< l " comment + + +def Vim9Context() + # FIXME: differentiate operator and command when operators are contained + # < + :< + :< < + :< << + + :< < + :< < < + + :< 42 + :< < 42 + :< << 42 + + :< l + :< p + :< # + :< < l + :< < p + :< < # + + :< lp# + :< < lp# + + :< 42 l + :< 42 p + :< 42 # + :< < 42 l + :< < 42 p + :< < 42 # + + :< 42 lp# + :<< 42 lp# + + :< | echo "..." + :< # comment + :< < | echo "..." + :< < # comment + :< 42 | echo "..." + :< 42 # comment + :< l | echo "..." + :< l # comment +enddef + diff --git a/runtime/syntax/testdir/input/vim_ex_mark.vim b/runtime/syntax/testdir/input/vim_ex_mark.vim index 31df3b2684..b71cdd2a7d 100644 --- a/runtime/syntax/testdir/input/vim_ex_mark.vim +++ b/runtime/syntax/testdir/input/vim_ex_mark.vim @@ -183,8 +183,7 @@ endfunction mark " mark ^ mark . -" TODO: matches as vimFunc -" mark ( +mark ( mark ) mark { mark } @@ -194,8 +193,7 @@ mark 9 k" k^ k. -" TODO: matches as vimFunc -" k( +k( k) k{ k} @@ -205,8 +203,7 @@ k9 k " k ^ k . -" TODO: matches as vimFunc -" k ( +k ( k ) k { k } diff --git a/runtime/syntax/testdir/input/vim_ex_packadd.vim b/runtime/syntax/testdir/input/vim_ex_packadd.vim new file mode 100644 index 0000000000..e454986aba --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_packadd.vim @@ -0,0 +1,20 @@ +" Vim :packadd command + + +packadd foo/bar +packadd foo/bar " comment +packadd foo/bar | echo "..." +packadd! foo/bar +packadd! foo/bar " comment +packadd! foo/bar | echo "..." + + +def Vim9Context() + packadd foo/bar + packadd foo/bar # comment + packadd foo/bar | echo "..." + packadd! foo/bar + packadd! foo/bar # comment + packadd! foo/bar | echo "..." +enddef + diff --git a/runtime/syntax/testdir/input/vim_ex_pound.vim b/runtime/syntax/testdir/input/vim_ex_pound.vim new file mode 100644 index 0000000000..708bb6f7e5 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_pound.vim @@ -0,0 +1,92 @@ +" Vim :# and :number commands + + +# +# 42 +# l +# p +# # + +# lp# + +# 42 l +# 42 p +# 42 # + +# 42 lp# + + +# | echo "..." +# " comment +# 42 | echo "..." +# 42 " comment +# l | echo "..." +# l " comment + + +number +number 42 +number l +number p +number # + +number lp# + +number 42 l +number 42 p +number 42 # + +number 42 lp# + +number | echo "..." +number " comment +number 42 | echo "..." +number 42 " comment +number l | echo "..." +number l " comment + +def Vim9Context() + :# + :# 42 + :# l + :# p + :# # + + :# lp# + + :# 42 l + :# 42 p + :# 42 # + + :# 42 lp# + + :# | echo "..." + :# # comment + :# 42 | echo "..." + :# 42 # comment + :# l | echo "..." + :# l # comment + + + number + number 42 + number l + number p + number # + + number lp# + + number 42 l + number 42 p + number 42 # + + number 42 lp# + + number | echo "..." + number # comment + number 42 | echo "..." + number 42 # comment + number l | echo "..." + number l # comment +enddef + diff --git a/runtime/syntax/testdir/input/vim_ex_range.vim b/runtime/syntax/testdir/input/vim_ex_range.vim index 88e7ad4715..2ffeefcb24 100644 --- a/runtime/syntax/testdir/input/vim_ex_range.vim +++ b/runtime/syntax/testdir/input/vim_ex_range.vim @@ -1,23 +1,453 @@ " Ex command ranges +" VIM_TEST_SETUP hi link vimAddressSeparator Todo +" VIM_TEST_SETUP hi link vimAddressOffset Type +" 1addr + +.print +$print +42print +'aprint +'kprint +'zprint +'Aprint +'Kprint +'Zprint +'0print +'9print +'[print +']print +'{print +'}print +'(print +')print +'print +'`print +''print +'"print +'^print +'.print +/foo\/bar/print +?foo\?bar?print +:\/print +:\?print +:\&print ++print +-print ++42print +-42print + + +" 2addr + +" implicit line1 '.' and line2 '.' + +,print +,,print +,,,print + +;print +;;print +;;;print + +,;print +;,print +,;,print +;,;print + + +" implicit line2 '.' + +.,print +$,print +42,print +'a,print +'k,print +'z,print +'A,print +'K,print +'Z,print +'0,print +'9,print +'[,print +'],print +'{,print +'},print +'(,print +'),print +'<,print +'>,print +'`,print +'',print +'",print +'^,print +'.,print +/foo\/bar/,print +?foo\?bar?,print +:\/,print +:\?,print +:\&,print ++,print +-,print ++42,print +-42,print + +.;print +$;print +42;print +'a;print +'k;print +'z;print +'A;print +'K;print +'Z;print +'0;print +'9;print +'[;print +'];print +'{;print +'};print +'(;print +');print +'<;print +'>;print +'`;print +'';print +'";print +'^;print +'.;print +/foo\/bar/;print +?foo\?bar?;print +:\/;print +:\?;print +:\&;print ++;print +-;print ++42;print +-42;print + +" implicit line1 '.' + +,.print +,$print +,42print +,'aprint +,'kprint +,'zprint +,'Aprint +,'Kprint +,'Zprint +,'0print +,'9print +,'[print +,']print +,'{print +,'}print +,'(print +,')print +,'print +,'`print +,''print +,'"print +,'^print +,'.print +,/foo\/bar/print +,?foo\?bar?print +,\/print +,\?print +,\&print +,+print +,-print +,+42print +,-42print + +;.print +;$print +;42print +;'aprint +;'kprint +;'zprint +;'Aprint +;'Kprint +;'Zprint +;'0print +;'9print +;'[print +;']print +;'{print +;'}print +;'(print +;')print +;'print +;'`print +;''print +;'"print +;'^print +;'.print +;/foo\/bar/print +;?foo\?bar?print +;\/print +;\?print +;\&print +;+print +;-print +;+42print +;-42print + +.,.print +.,$print +.,42print +.,'aprint +.,'kprint +.,'zprint +.,'Aprint +.,'Kprint +.,'Zprint +.,'0print +.,'9print +.,'[print +.,']print +.,'{print +.,'}print +.,'(print +.,')print +.,'print +.,'`print +.,''print +.,'"print +.,'^print +.,'.print +.,/foo\/bar/print +.,?foo\?bar?print +.,\/print +.,\?print +.,\&print +.,+print +.,-print +.,+42print +.,-42print + +.;.print +.;$print +.;42print +.;'aprint +.;'kprint +.;'zprint +.;'Aprint +.;'Kprint +.;'Zprint +.;'0print +.;'9print +.;'[print +.;']print +.;'{print +.;'}print +.;'(print +.;')print +.;'print +.;'`print +.;''print +.;'"print +.;'^print +.;'.print +.;/foo\/bar/print +.;?foo\?bar?print +.;\/print +.;\?print +.;\&print +.;+print +.;-print +.;+42print +.;-42print + +" special 2addr + +%print +*print + +" paired marks + '<,'>print '(,')print '{,'}print '[,']print -:'<,'>print -:'(,')print -:'{,'}print -:'[,']print -echo | '<,'>print -echo | '(,')print -echo | '{,'}print -echo | '[,']print +" offsets + +" :help :range-offset + +:-11;+1 print +:-----------,-10 print +:?Each line?-;+ print +:'{+,'{+2 print +:'{+1;')-1 print -" bare mark ranges +" sign-less positive offsets +.13print +42,.13print +.13,.13print +42 13print +42,42 13print +42 13,42 13print +/foo\/bar/13print +42,/foo\/bar/13print +/foo\/bar/13,/foo\/bar/13print +*13print + +" , separator + +.+13,.+13print +.+13,$+13print +.+13,42+13print +.+13,'a+13print +.+13,'k+13print +.+13,'z+13print +.+13,'A+13print +.+13,'K+13print +.+13,'Z+13print +.+13,'0+13print +.+13,'9+13print +.+13,'[+13print +.+13,']+13print +.+13,'{+13print +.+13,'}+13print +.+13,'(+13print +.+13,')+13print +.+13,'<+13print +.+13,'>+13print +.+13,'`+13print +.+13,''+13print +.+13,'"+13print +.+13,'^+13print +.+13,'.+13print +.+13,/foo\/bar/+13print +.+13,?foo\?bar?+13print +.+13,\/+13print +.+13,\?+13print +.+13,\&+13print +.+13,++13print +.+13,-+13print +.+13,+42+13print +.+13,-42+13print + +.-13,.-13print +.-13,$-13print +.-13,42-13print +.-13,'a-13print +.-13,'k-13print +.-13,'z-13print +.-13,'A-13print +.-13,'K-13print +.-13,'Z-13print +.-13,'0-13print +.-13,'9-13print +.-13,'[-13print +.-13,']-13print +.-13,'{-13print +.-13,'}-13print +.-13,'(-13print +.-13,')-13print +.-13,'<-13print +.-13,'>-13print +.-13,'`-13print +.-13,''-13print +.-13,'"-13print +.-13,'^-13print +.-13,'.-13print +.-13,/foo\/bar/-13print +.-13,?foo\?bar?-13print +.+13,\/-13print +.+13,\?-13print +.+13,\&-13print +.+13,+-13print +.+13,--13print +.+13,+42-13print +.+13,-42-13print + +" ; separator + +.+13;.+13print +.+13;$+13print +.+13;42+13print +.+13;'a+13print +.+13;'k+13print +.+13;'z+13print +.+13;'A+13print +.+13;'K+13print +.+13;'Z+13print +.+13;'0+13print +.+13;'9+13print +.+13;'[+13print +.+13;']+13print +.+13;'{+13print +.+13;'}+13print +.+13;'(+13print +.+13;')+13print +.+13;'<+13print +.+13;'>+13print +.+13;'`+13print +.+13;''+13print +.+13;'"+13print +.+13;'^+13print +.+13;'.+13print +.+13;/foo\/bar/+13print +.+13;?foo\?bar?+13print +.+13;\/print +.+13;\?print +.+13;\&print +.+13;++13print +.+13;-+13print +.+13;+42+13print +.+13;-42+13print + +.-13;.-13print +.-13;$-13print +.-13;42-13print +.-13;'a-13print +.-13;'k-13print +.-13;'z-13print +.-13;'A-13print +.-13;'K-13print +.-13;'Z-13print +.-13;'0-13print +.-13;'9-13print +.-13;'[-13print +.-13;']-13print +.-13;'{-13print +.-13;'}-13print +.-13;'(-13print +.-13;')-13print +.-13;'<-13print +.-13;'>-13print +.-13;'`-13print +.-13;''-13print +.-13;'"-13print +.-13;'^-13print +.-13;'.-13print +.-13;/foo\/bar/-13print +.-13;?foo\?bar?-13print +.-13;\/print +.-13;\?print +.-13;\&print +.-13;+-13print +.-13;--13print +.-13;+42-13print +.-13;-42-13print + + +" bare ranges + +. +$ +42 'a 'k 'z @@ -39,9 +469,21 @@ echo | '[,']print '" '^ '. +/foo\/bar/ +/foo\/bar +?foo\?bar? +?foo\?bar +:\/ +:\? +:\& ++ +- ++42 +-42 - :'a -: 'a +:. +:$ +:42 :'a :'k :'z @@ -63,28 +505,1277 @@ echo | '[,']print :'" :'^ :'. +:/foo\/bar/ +:/foo\/bar +:?foo\?bar? +:?foo\?bar +:\/ +:\? +:\& +:+ +:- +:+42 +:-42 + +echo "..." | . +echo "..." | $ +echo "..." | 42 +echo "..." | 'a +echo "..." | 'k +echo "..." | 'z +echo "..." | 'A +echo "..." | 'K +echo "..." | 'Z +echo "..." | '0 +echo "..." | '9 +echo "..." | '[ +echo "..." | '] +echo "..." | '{ +echo "..." | '} +echo "..." | '( +echo "..." | ') +echo "..." | '< +echo "..." | '> +echo "..." | '` +echo "..." | '' +echo "..." | '" +echo "..." | '^ +echo "..." | '. +echo "..." | /foo\/bar/ +echo "..." | /foo\/bar +echo "..." | ?foo\?bar? +echo "..." | ?foo\?bar +echo "..." | \/ +echo "..." | \? +echo "..." | \& +echo "..." | + +echo "..." | - +echo "..." | +42 +echo "..." | -42 + +echo "..." | :. +echo "..." | :$ +echo "..." | :42 +echo "..." | :'a +echo "..." | :'k +echo "..." | :'z +echo "..." | :'A +echo "..." | :'K +echo "..." | :'Z +echo "..." | :'0 +echo "..." | :'9 +echo "..." | :'[ +echo "..." | :'] +echo "..." | :'{ +echo "..." | :'} +echo "..." | :'( +echo "..." | :') +echo "..." | :'< +echo "..." | :'> +echo "..." | :'` +echo "..." | :'' +echo "..." | :'" +echo "..." | :'^ +echo "..." | :'. +echo "..." | :/foo\/bar/ +echo "..." | :/foo\/bar +echo "..." | :?foo\?bar? +echo "..." | :?foo\?bar +echo "..." | :\/ +echo "..." | :\? +echo "..." | :\& +echo "..." | :+ +echo "..." | :- +echo "..." | :+42 +echo "..." | -42 + + +" range (with whitespace) + +1 match +2 match +3 match + +42,42 & +42,42 ~ +42,42 @ +" 42,42 * +42,42 > +42,42 < +42,42 # +42,42 = +42,42 ! + +42,42 Next +42,42 Print +42,42 X + +42,42 append + text +. +42,42 abbreviate +42,42 abclear +42,42 aboveleft +42,42 all +42,42 amenu +42,42 anoremenu +42,42 argadd +42,42 argdedupe +42,42 argdelete +42,42 argdo +42,42 argedit +42,42 argglobal +42,42 arglocal +42,42 args +42,42 argument +42,42 ascii +42,42 augroup Foo +42,42 augroup END +42,42 aunmenu +42,42 autocmd +42,42 badd +42,42 ball +42,42 balt +42,42 bdelete +42,42 behave mswin +42,42 behave xterm +42,42 belowright +42,42 bfirst +42,42 blast +42,42 bmodified +42,42 bnext +42,42 bNext +42,42 botright +42,42 bprevious +42,42 break +42,42 breakadd +42,42 breakdel +42,42 breaklist +42,42 brewind +42,42 browse +42,42 bufdo +42,42 buffer +42,42 buffers +42,42 bunload +42,42 bwipeout +42,42 change + text +. +42,42 cabbrev +42,42 cabclear +42,42 cabove +42,42 caddbuffer +42,42 caddexpr +42,42 caddfile +42,42 cafter +42,42 call +42,42 catch +42,42 cbefore +42,42 cbelow +42,42 cbottom +42,42 cbuffer +42,42 cc +42,42 cclose +42,42 cd +42,42 cdo +42,42 center +42,42 cexpr +42,42 cfdo +42,42 cfile +42,42 cfirst +42,42 cgetbuffer +42,42 cgetexpr +42,42 cgetfile +42,42 changes +42,42 chdir +42,42 checkpath +42,42 checktime +42,42 chistory +42,42 clast +42,42 clearjumps +42,42 clist +42,42 close +42,42 cmap +42,42 cmapclear +42,42 cmenu +42,42 cnewer +42,42 cnext +42,42 cNext +42,42 cnfile +42,42 cNfile +42,42 cnoreabbrev +42,42 cnoremap +42,42 cnoremenu +42,42 colder +42,42 colorscheme +42,42 comclear +42,42 command +42,42 compiler +42,42 confirm +42,42 const +42,42 continue +42,42 copen +42,42 copy +42,42 cpfile +42,42 cprevious +42,42 cquit +42,42 crewind +42,42 cscope +42,42 cstag +42,42 cunabbrev +42,42 cunmap +42,42 cunmenu +42,42 cwindow +42,42 debug +42,42 debuggreedy +42,42 def +42,42 defcompile +42,42 defer +42,42 delcommand +42,42 delete +42,42 delfunction +42,42 delmarks +42,42 diffget +42,42 diffoff +42,42 diffpatch +42,42 diffput +42,42 diffsplit +42,42 diffthis +42,42 diffupdate +42,42 digraphs +42,42 disassemble +42,42 display +42,42 djump +42,42 dlist +42,42 doautoall +42,42 doautocmd +42,42 drop +42,42 dsearch +42,42 dsplit +42,42 earlier +42,42 echo +42,42 echoconsole +42,42 echoerr +42,42 echohl +42,42 echomsg +42,42 echon +42,42 echowindow +42,42 edit +42,42 else +42,42 elseif +42,42 emenu +42,42 enddef +42,42 endfor +42,42 endfunction +42,42 endif +42,42 endtry +42,42 endwhile +42,42 enew +42,42 eval +42,42 ex +42,42 execute +42,42 exit +42,42 exusage +42,42 file +42,42 files +42,42 filetype +42,42 filter +42,42 final +42,42 finally +42,42 find +42,42 finish +42,42 first +42,42 fixdel +42,42 fold +42,42 foldclose +42,42 folddoclosed +42,42 folddoopen +42,42 foldopen +42,42 for foo in bar | endfor +42,42 function +42,42 global +42,42 goto +42,42 grep +42,42 grepadd +42,42 gui +42,42 gvim +42,42 hardcopy +42,42 help +42,42 helpclose +42,42 helpfind +42,42 helpgrep +42,42 helptags +42,42 hide +42,42 highlight +42,42 history +42,42 horizontal +42,42 insert + text +. +42,42 iabbrev +42,42 iabclear +42,42 if +42,42 ijump +42,42 ilist +42,42 imap +42,42 imapclear +42,42 imenu +42,42 import +42,42 inoreabbrev +42,42 inoremap +42,42 inoremenu +42,42 intro +42,42 isearch +42,42 isplit +42,42 iunabbrev +42,42 iunmap +42,42 iunmenu +42,42 join +42,42 jumps +42,42 k +42,42 keepalt +42,42 keepjumps +42,42 keepmarks +42,42 keeppatterns +42,42 labove +42,42 laddbuffer +42,42 laddexpr +42,42 laddfile +42,42 lafter +42,42 language +42,42 last +42,42 later +42,42 lbefore +42,42 lbelow +42,42 lbottom +42,42 lbuffer +42,42 lcd +42,42 lchdir +42,42 lclose +42,42 lcscope +42,42 ldo +42,42 left +42,42 leftabove +42,42 legacy +42,42 let +42,42 lexpr +42,42 lfdo +42,42 lfile +42,42 lfirst +42,42 lgetbuffer +42,42 lgetexpr +42,42 lgetfile +42,42 lgrep +42,42 lgrepadd +42,42 lhelpgrep +42,42 lhistory +42,42 list +42,42 ll +42,42 llast +42,42 llist +42,42 lmake +42,42 lmap +42,42 lmapclear +42,42 lnewer +42,42 lnext +42,42 lNext +42,42 lnfile +42,42 lNfile +42,42 lnoremap +" 42,42 loadkeymap +42,42 loadview +42,42 lockmarks +42,42 lockvar +42,42 lolder +42,42 lopen +42,42 lpfile +42,42 lprevious +42,42 lrewind +42,42 ls +42,42 ltag +42,42 lua +42,42 luado +42,42 luafile +42,42 lunmap +42,42 lvimgrep +42,42 lvimgrepadd +42,42 lwindow +42,42 make +42,42 map +42,42 mapclear +42,42 mark +42,42 marks +42,42 match +42,42 menu +42,42 menutranslate +42,42 messages +42,42 mkexrc +42,42 mksession +42,42 mkspell +42,42 mkview +42,42 mkvimrc +42,42 mode +42,42 move +42,42 mzfile +42,42 mzscheme +42,42 nbclose +42,42 nbkey +42,42 nbstart +42,42 new +42,42 next +42,42 nmap +42,42 nmapclear +42,42 nmenu +42,42 nnoremap +42,42 nnoremenu +42,42 noautocmd +42,42 nohlsearch +42,42 noreabbrev +42,42 noremap +42,42 noremenu +42,42 normal +42,42 noswapfile +42,42 number +42,42 nunmap +42,42 nunmenu +42,42 oldfiles +42,42 omap +42,42 omapclear +42,42 omenu +42,42 only +42,42 onoremap +42,42 onoremenu +42,42 open +42,42 options +42,42 ounmap +42,42 ounmenu +42,42 ownsyntax +42,42 packadd +42,42 packloadall +42,42 pclose +42,42 pedit +42,42 perl +42,42 perldo +42,42 pop +42,42 popup +42,42 ppop +42,42 preserve +42,42 previous +42,42 print +42,42 profdel +42,42 profile +42,42 promptfind +42,42 promptrepl +42,42 psearch +42,42 ptag +42,42 ptfirst +42,42 ptjump +42,42 ptlast +42,42 ptnext +42,42 ptNext +42,42 ptprevious +42,42 ptrewind +42,42 ptselect +42,42 put +42,42 pwd +42,42 py3 +42,42 py3do +42,42 py3file +42,42 pydo +42,42 pyfile +42,42 python +42,42 python3 +42,42 pythonx +42,42 pyx +42,42 pyxdo +42,42 pyxfile +42,42 qall +42,42 quit +42,42 quitall +42,42 read +42,42 recover +42,42 redir +42,42 redo +42,42 redraw +42,42 redrawstatus +42,42 redrawtabline +42,42 registers +42,42 resize +42,42 retab +42,42 return +42,42 rewind +42,42 right +42,42 rightbelow +42,42 ruby +42,42 rubydo +42,42 rubyfile +42,42 rundo +42,42 runtime +42,42 rviminfo +42,42 sall +42,42 sandbox +42,42 sargument +42,42 saveas +42,42 sball +42,42 sbfirst +42,42 sblast +42,42 sbmodified +42,42 sbnext +42,42 sbNext +42,42 sbprevious +42,42 sbrewind +42,42 sbuffer +42,42 scriptencoding +42,42 scriptnames +42,42 scriptversion +42,42 scscope +42,42 set +42,42 setfiletype +42,42 setglobal +42,42 setlocal +42,42 sfind +42,42 sfirst +42,42 shell +42,42 sign +42,42 silent +42,42 simalt +42,42 slast +42,42 sleep +42,42 sleep! +42,42 smagic +42,42 smap +42,42 smapclear +42,42 smenu +42,42 smile +42,42 snext +42,42 sNext +42,42 snomagic +42,42 snoremap +42,42 snoremenu +42,42 sort +42,42 source +42,42 spelldump +42,42 spellgood +42,42 spellinfo +42,42 spellrare +42,42 spellrepall +42,42 spellundo +42,42 spellwrong +42,42 split +42,42 sprevious +42,42 srewind +42,42 stag +42,42 startgreplace +42,42 startinsert +42,42 startreplace +42,42 stjump +42,42 stop +42,42 stopinsert +42,42 stselect +42,42 substitute +42,42 sunhide +42,42 sunmap +42,42 sunmenu +42,42 suspend +42,42 sview +42,42 swapname +42,42 syncbind +42,42 syntax +42,42 syntime +42,42 t +42,42 tab +42,42 tabclose +42,42 tabdo +42,42 tabedit +42,42 tabfind +42,42 tabfirst +42,42 tablast +42,42 tabmove +42,42 tabnew +42,42 tabnext +42,42 tabNext +42,42 tabonly +42,42 tabprevious +42,42 tabrewind +42,42 tabs +42,42 tag +42,42 tags +42,42 tcd +42,42 tchdir +42,42 tcl +42,42 tcldo +42,42 tclfile +42,42 tearoff +42,42 terminal +42,42 tfirst +42,42 throw +42,42 tjump +42,42 tlast +42,42 tlmenu +42,42 tlnoremenu +42,42 tlunmenu +42,42 tmap +42,42 tmapclear +42,42 tmenu +42,42 tnext +42,42 tNext +42,42 tnoremap +42,42 topleft +42,42 tprevious +42,42 trewind +42,42 try +42,42 tselect +42,42 tunmap +42,42 tunmenu +42,42 unabbreviate +42,42 undo +42,42 undojoin +42,42 undolist +42,42 unhide +42,42 unlet +42,42 unlockvar +42,42 unmap +42,42 unmenu +42,42 unsilent +42,42 update +42,42 verbose +42,42 version +42,42 vertical +42,42 vglobal +42,42 view +42,42 vim9cmd +42,42 vimgrep +42,42 vimgrepadd +42,42 visual +42,42 viusage +42,42 vmap +42,42 vmapclear +42,42 vmenu +42,42 vnew +42,42 vnoremap +42,42 vnoremenu +42,42 vsplit +42,42 vunmap +42,42 vunmenu +42,42 wall +42,42 while +42,42 wincmd +42,42 windo +42,42 winpos +42,42 winsize +42,42 wnext +42,42 wNext +42,42 wprevious +42,42 wq +42,42 wqall +42,42 write +42,42 wundo +42,42 wviminfo +42,42 xall +42,42 xit +42,42 xmap +42,42 xmapclear +42,42 xmenu +42,42 xnoremap +42,42 xnoremenu +42,42 xrestore +42,42 xunmap +42,42 xunmenu +42,42 yank +42,42 z + + +" range + +1match +2match +3match + +42,42& +42,42~ +42,42@ +" 42,42* +42,42> +42,42< +42,42# +42,42= +42,42! + +42,42Next +42,42Print +42,42X " no range -echo |'a -echo| 'a -echo | 'a -echo | 'k -echo | 'z -echo | 'A -echo | 'K -echo | 'Z -echo | '0 -echo | '9 -echo | '[ -echo | '] -echo | '{ -echo | '} -echo | '( -echo | ') -echo | '< -echo | '> -echo | '` -echo | '' -echo | '" -echo | '^ -echo | '. +42,42append + text +. +42,42abbreviate " no range +42,42abclear " no range +42,42aboveleft " no range +42,42all +42,42amenu +42,42anoremenu +42,42argadd +42,42argdedupe " no range +42,42argdelete +42,42argdo +42,42argedit +42,42argglobal " no range +42,42arglocal " no range +42,42args " no range +42,42argument +42,42ascii " no range +42,42augroup END " no range +42,42augroup Foo " no range +42,42aunmenu " no range +42,42autocmd " no range +42,42badd " no range +42,42ball +42,42balt " no range +42,42bdelete +42,42behave mswin " no range +42,42behave xterm " no range +42,42belowright " no range +42,42bfirst " no range +42,42blast +42,42bmodified +42,42bnext +42,42bNext +42,42botright " no range +42,42bprevious +42,42breakadd " no range +42,42breakdel " no range +42,42breaklist " no range +42,42break " no range +42,42brewind +42,42browse " no range +42,42bufdo +42,42buffer +42,42buffers " no range +42,42bunload +42,42bwipeout +42,42change + text +. +42,42cabbrev " no range +42,42cabclear " no range +42,42cabove +42,42caddbuffer +42,42caddexpr " no range +42,42caddfile " no range +42,42cafter +42,42call +42,42catch " no range +42,42cbefore +42,42cbelow +42,42cbottom " no range +42,42cbuffer +42,42cc +42,42cclose " no range +42,42cd " no range +42,42cdo +42,42center +42,42cexpr " no range +42,42cfdo +42,42cfile " no range +42,42cfirst +42,42cgetbuffer +42,42cgetexpr " no range +42,42cgetfile " no range +42,42changes " no range +42,42chdir " no range +42,42checkpath " no range +42,42checktime +42,42chistory +42,42clast +42,42clearjumps " no range +42,42clist " no range +42,42close +42,42cmapclear " no range +42,42cmap " no range +42,42cmenu +42,42cnewer +42,42cnext +42,42cNext +42,42cnfile +42,42cNfile +42,42cnoreabbrev " no range +42,42cnoremap " no range +42,42cnoremenu +42,42colder +42,42colorscheme " no range +42,42comclear " no range +42,42command " no range +42,42compiler " no range +42,42confirm " no range +42,42const " no range +42,42continue " no range +42,42copen +42,42copy +42,42cpfile +42,42cprevious +42,42cquit +42,42crewind +42,42cscope " no range +42,42cstag " no range +42,42cunabbrev " no range +42,42cunmap " no range +42,42cunmenu " no range +42,42cwindow +42,42debuggreedy +42,42debug " no range +42,42defcompile " no range +42,42defer " no range +42,42def " no range +42,42delcommand " no range +42,42delete +42,42delfunction " no range +42,42delmarks " no range +42,42diffget +42,42diffoff " no range +42,42diffpatch " no range +42,42diffput +42,42diffsplit " no range +42,42diffthis " no range +42,42diffupdate " no range +42,42digraphs " no range +42,42disassemble " no range +42,42display " no range +42,42djump +42,42dlist +42,42doautoall " no range +42,42doautocmd " no range +42,42drop " no range +42,42dsearch +42,42dsplit +42,42earlier " no range +42,42echoconsole " no range +42,42echoerr " no range +42,42echohl " no range +42,42echomsg " no range +42,42echon " no range +42,42echo " no range +42,42echowindow " no range +42,42edit " no range +42,42elseif " no range +42,42else " no range +42,42emenu +42,42enddef " no range +42,42endfor " no range +42,42endfunction " no range +42,42endif " no range +42,42endtry " no range +42,42endwhile " no range +42,42enew " no range +42,42eval " no range +42,42execute " no range +42,42exit +42,42ex " no range +42,42exusage " no range +42,42file +42,42files " no range +42,42filetype " no range +42,42filter " no range +42,42finally " no range +42,42final " no range +42,42find +42,42finish " no range +42,42first " no range +42,42fixdel " no range +42,42fold +42,42foldclose +42,42folddoclosed +42,42folddoopen +42,42foldopen +42,42for " no range +42,42function " no range +42,42global +42,42goto +42,42grep +42,42grepadd +42,42gui " no range +42,42gvim " no range +42,42hardcopy +42,42helpclose " no range +42,42helpfind " no range +42,42helpgrep " no range +42,42help " no range +42,42helptags " no range +42,42hide +42,42highlight " no range +42,42history " no range +42,42horizontal " no range +42,42insert + text +. +42,42iabbrev " no range +42,42iabclear " no range +42,42if " no range +42,42ijump +42,42ilist +42,42imapclear " no range +42,42imap " no range +42,42imenu +42,42import " no range +42,42inoreabbrev " no range +42,42inoremap " no range +42,42inoremenu +42,42intro " no range +42,42isearch +42,42isplit +42,42iunabbrev " no range +42,42iunmap " no range +42,42iunmenu " no range +42,42join +42,42jumps " no range +42,42k +42,42keepalt " no range +42,42keepjumps " no range +42,42keepmarks " no range +42,42keeppatterns " no range +42,42labove +42,42laddbuffer +42,42laddexpr " no range +42,42laddfile " no range +42,42lafter +42,42language " no range +42,42last " no range +42,42later " no range +42,42lbefore +42,42lbelow +42,42lbottom " no range +42,42lbuffer +42,42lcd " no range +42,42lchdir " no range +42,42lclose +42,42lcscope " no range +42,42ldo +42,42left +42,42leftabove " no range +42,42legacy " no range +42,42let " no range +42,42lexpr " no range +42,42lfdo +42,42lfile " no range +42,42lfirst +42,42lgetbuffer +42,42lgetexpr " no range +42,42lgetfile " no range +42,42lgrep +42,42lgrepadd +42,42lhelpgrep " no range +42,42lhistory +42,42list +42,42ll +42,42llast +42,42llist " no range +42,42lmake " norange +42,42lmapclear " no range +42,42lmap " no range +42,42lnewer +42,42lnext +42,42lNext +42,42lnfile +42,42lNfile +42,42lnoremap " no range +" 42,42loadkeymap " no range +42,42loadview " no range +42,42lockmarks " no range +42,42lockvar " no range +42,42lolder +42,42lopen +42,42lpfile +42,42lprevious +42,42lrewind +42,42ls " no range +42,42ltag " no range +42,42lua +42,42luado +42,42luafile +42,42lunmap " no range +42,42lvimgrep +42,42lvimgrepadd +42,42lwindow +42,42make " norange +42,42mapclear " no range +42,42map " no range +42,42mark +42,42marks " no range +42,42match +42,42menu +42,42menutranslate " no range +42,42messages +42,42mkexrc " no range +42,42mksession " no range +42,42mkspell " no range +42,42mkview " no range +42,42mkvimrc " no range +42,42mode " no range +42,42move +42,42mzfile +42,42mzscheme +42,42nbclose " no range +42,42nbkey " no range +42,42nbstart " no range +42,42new +42,42next +42,42nmapclear " no range +42,42nmap " no range +42,42nmenu +42,42nnoremap " no range +42,42nnoremenu +42,42noautocmd " no range +42,42nohlsearch " no range +42,42noreabbrev " no range +42,42noremap " no range +42,42noremenu +42,42normal +42,42noswapfile " no range +42,42number +42,42nunmap " no range +42,42nunmenu " no range +42,42oldfiles " no range +42,42omapclear " no range +42,42omap " no range +42,42omenu +42,42only +42,42onoremap " no range +42,42onoremenu +42,42open +42,42options " no range +42,42ounmap " no range +42,42ounmenu " no range +42,42ownsyntax " no range +42,42packadd " no range +42,42packloadall " no range +42,42pclose " no range +42,42pedit " no range +42,42perl +42,42perldo +42,42pop +42,42popup " no range +42,42ppop +42,42preserve " no range +42,42previous +42,42print +42,42profdel " no range +42,42profile " no range +42,42promptfind " no range +42,42promptrepl " no range +42,42psearch +42,42ptag +42,42ptfirst +42,42ptjump " no range +42,42ptlast " no range +42,42ptnext +42,42ptNext +42,42ptprevious +42,42ptrewind +42,42ptselect " no range +42,42put +42,42pwd " no range +42,42py3 +42,42py3do +42,42py3file +42,42pydo +42,42pyfile +42,42python +42,42python3 +42,42pythonx +42,42pyx +42,42pyxdo +42,42pyxfile +42,42qall " no range +42,42quit +42,42quitall " no range +42,42read +42,42recover " no range +42,42redir " no range +42,42redo " no range +42,42redraw " no range +42,42redrawstatus " no range +42,42redrawtabline " no range +42,42registers " no range +42,42resize +42,42retab +42,42return " no range +42,42rewind " no range +42,42right +42,42rightbelow " no range +42,42ruby +42,42rubydo +42,42rubyfile +42,42rundo " no range +42,42runtime " no range +42,42rviminfo " no range +42,42sall +42,42sandbox " no range +42,42sargument +42,42saveas " no range +42,42sball +42,42sbfirst " no range +42,42sblast " no range +42,42sbmodified +42,42sbnext +42,42sbNext +42,42sbprevious +42,42sbrewind " no range +42,42sbuffer +42,42scriptencoding " no range +42,42scriptnames +42,42scriptversion " no range +42,42scscope " no range +42,42setfiletype " no range +42,42setglobal " no range +42,42setlocal " no range +42,42set " no range +42,42sfind +42,42sfirst " no range +42,42shell " no range +42,42sign +42,42silent " no range +42,42simalt " no range +42,42slast " no range +42,42sleep +42,42sleep! +42,42smagic +42,42smapclear " no range +42,42smap " no range +42,42smenu +42,42smile " no range +42,42snext +42,42sNext +42,42snomagic +42,42snoremap " no range +42,42snoremenu +42,42sort +42,42source +42,42spelldump " no range +42,42spellgood +42,42spellinfo " no range +42,42spellrare +42,42spellrepall " no range +42,42spellundo +42,42spellwrong +42,42split +42,42sprevious +42,42srewind " no range +42,42stag +42,42startgreplace " no range +42,42startinsert " no range +42,42startreplace " no range +42,42stjump " no range +42,42stopinsert " no range +42,42stop " no range +42,42stselect " no range +42,42substitute +42,42sunhide +42,42sunmap " no range +42,42sunmenu " no range +42,42suspend " no range +42,42sview +42,42swapname " no range +42,42syncbind " no range +42,42syntax " no range +42,42syntime " no range +42,42t +42,42tab +42,42tabclose +42,42tabdo +42,42tabedit +42,42tabfind +42,42tabfirst " no range +42,42tablast " no range +42,42tabmove +42,42tabnew +42,42tabnext +42,42tabNext +42,42tabonly +42,42tabprevious +42,42tabrewind " no range +42,42tabs " no range +42,42tag +42,42tags " no range +42,42tcd " no range +42,42tchdir " no range +42,42tcl +42,42tcldo +42,42tclfile +42,42tearoff +42,42terminal +42,42tfirst +42,42throw " no range +42,42tjump " no range +42,42tlast " no range +42,42tlmenu +42,42tlnoremenu +42,42tlunmenu " no range +42,42tmapclear " no range +42,42tmap " no range +42,42tmenu +42,42tnext +42,42tNext +42,42tnoremap " no range +42,42topleft " no range +42,42tprevious +42,42trewind +42,42try " no range +42,42tselect " no range +42,42tunmap " no range +42,42tunmenu " no range +42,42unabbreviate " no range +42,42undo +42,42undojoin " no range +42,42undolist " no range +42,42unhide +42,42unlet " no range +42,42unlockvar " no range +42,42unmap " no range +42,42unmenu " no range +42,42unsilent " no range +42,42update +42,42verbose +42,42version " no range +42,42vertical " no range +42,42vglobal +42,42view " no range +42,42vim9cmd " no range +42,42vimgrep +42,42vimgrepadd +42,42visual " no range +42,42viusage " no range +42,42vmapclear " no range +42,42vmap " no range +42,42vmenu +42,42vnew +42,42vnoremap " no range +42,42vnoremenu +42,42vsplit +42,42vunmap " no range +42,42vunmenu " no range +42,42wall " no range +42,42while " no range +42,42wincmd +42,42windo +42,42winpos " no range +42,42winsize " no range +42,42wnext +42,42wNext +42,42wprevious +42,42wq +42,42wqall " no range +42,42write +42,42wundo " no range +42,42wviminfo " no range +42,42xall " no range +42,42xit +42,42xmapclear " no range +42,42xmap " no range +42,42xmenu +42,42xnoremap " no range +42,42xnoremenu +42,42xrestore " no range +42,42xunmap " no range +42,42xunmenu " no range +42,42yank +42,42z diff --git a/runtime/syntax/testdir/input/vim_ex_rightshift.vim b/runtime/syntax/testdir/input/vim_ex_rightshift.vim new file mode 100644 index 0000000000..30ed41e17c --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_rightshift.vim @@ -0,0 +1,86 @@ +" Vim :> command + +> +>> +>>> + +> > +> > > + +> 42 +>> 42 +>>> 42 + +> l +> p +> # +>> l +>> p +>> # + +> lp# +>> lp# + +> 42 l +> 42 p +> 42 # +>> 42 l +>> 42 p +>> 42 # + +> 42 lp# +>> 42 lp# + +> | echo "..." +> " comment +> > | echo "..." +> > " comment +> 42 | echo "..." +> 42 " comment +> l | echo "..." +> l " comment + + +def Vim9Context() + # FIXME: differentiate operator and command when operators are contained + # > + :> + :> > + :> >> + + :> > + :> > > + + :> 42 + :> > 42 + :> >> 42 + + :> l + :> p + :> # + :> > l + :> > p + :> > # + + :> lp# + :> > lp# + + :> 42 l + :> 42 p + :> 42 # + :> > 42 l + :> > 42 p + :> > 42 # + + :> 42 lp# + :>> 42 lp# + + :> | echo "..." + :> # comment + :> > | echo "..." + :> > # comment + :> 42 | echo "..." + :> 42 # comment + :> l | echo "..." + :> l # comment +enddef diff --git a/runtime/syntax/testdir/input/vim_ex_runtime.vim b/runtime/syntax/testdir/input/vim_ex_runtime.vim new file mode 100644 index 0000000000..212cc2214c --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_runtime.vim @@ -0,0 +1,44 @@ +" Vim :runtime command + + +runtime plugin/**/foo.vim +runtime START plugin/**/foo.vim +runtime OPT plugin/**/foo.vim +runtime PACK plugin/**/foo.vim +runtime ALL plugin/**/foo.vim + +runtime! plugin/**/foo.vim +runtime! START plugin/**/foo.vim +runtime! OPT plugin/**/foo.vim +runtime! PACK plugin/**/foo.vim +runtime! ALL plugin/**/foo.vim + +runtime plugin/**/foo.vim + "\ comment + \ plugin/**/bar.vim + +runtime plugin/**/foo.vim " comment +runtime plugin/**/foo.vim | echo "..." + + +def Vim9Context() + runtime plugin/**/foo.vim + runtime START plugin/**/foo.vim + runtime OPT plugin/**/foo.vim + runtime PACK plugin/**/foo.vim + runtime ALL plugin/**/foo.vim + + runtime! plugin/**/foo.vim + runtime! START plugin/**/foo.vim + runtime! OPT plugin/**/foo.vim + runtime! PACK plugin/**/foo.vim + runtime! ALL plugin/**/foo.vim + + runtime plugin/**/foo.vim + #\ comment + \ plugin/**/bar.vim + + runtime plugin/**/foo.vim # comment + runtime plugin/**/foo.vim | echo "..." +enddef + diff --git a/runtime/syntax/testdir/input/vim_ex_substitute.vim b/runtime/syntax/testdir/input/vim_ex_substitute.vim index 983b39d044..1cd5c1aaaf 100644 --- a/runtime/syntax/testdir/input/vim_ex_substitute.vim +++ b/runtime/syntax/testdir/input/vim_ex_substitute.vim @@ -50,8 +50,7 @@ s$/$//$ " comment s%/%//% " comment s&/&//& " comment s'/'//' " comment -" FIXME - matches vimUserFunc -" s(/(//( " comment +s(/(//( " comment s)/)//) " comment s*/*//* " comment s+/+//+ " comment @@ -84,8 +83,7 @@ s $/$//$ " comment s %/%//% " comment s &/&//& " comment s '/'//' " comment -" FIXME - matches vimUserFunc -" s (/(//( " comment +s (/(//( " comment s )/)//) " comment s */*//* " comment s +/+//+ " comment @@ -144,18 +142,30 @@ sg42 sgi42 :sgi42 -" FIXME + +" :& and :~ + & && ~ ~& -" FIXME +& 42 +&& 42 +~ 42 +~& 42 + &cegiInp#lr &&cegiInp#lr ~cegiInp#lr ~&cegiInp#lr +&cegiInp#lr 42 +&&cegiInp#lr 42 +~cegiInp#lr 42 +~&cegiInp#lr 42 + + " 2 and 3 letter repeat-previous variants :sc | :sce | :scg | :sci | :scI | :scn | :scp | :scl | @@ -198,9 +208,6 @@ s | echo "Foo" " Issue #13883 -str[s] -str(s) - def Test() str[s] str(s) diff --git a/runtime/syntax/testdir/input/vim_ex_wincmd.vim b/runtime/syntax/testdir/input/vim_ex_wincmd.vim index 68fac3ae44..5066703b78 100644 --- a/runtime/syntax/testdir/input/vim_ex_wincmd.vim +++ b/runtime/syntax/testdir/input/vim_ex_wincmd.vim @@ -59,9 +59,14 @@ def Vim9Context() var wincmd = 42 wincmd = 42 :wincmd = + + # KNOWN: incorrectly match as the Ex command rather than a variable wincmd = # comment - wincmd = | echo "Foo" - # KNOWN: incorrectly matches as the Ex command rather than a variable + 42 wincmd = + 42 + + # E1143: Empty expression + wincmd = | echo "Foo" enddef diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 60e584dccb..b645649383 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Jun 27 +" Last Change: 2026 Aug 02 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -34,32 +34,70 @@ syn cluster vimCommentGroup contains=vimTodo,@Spell " regular vim commands {{{2 " GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand contained', END_STR='nextgroup=vimBang' -syn keyword vimCommand contained al[l] ar[gs] arga[dd] argd[elete] argded[upe] arge[dit] argg[lobal] argl[ocal] argu[ment] as[cii] b[uffer] bN[ext] ba[ll] bad[d] balt bd[elete] bf[irst] bl[ast] bm[odified] bn[ext] bp[revious] br[ewind] brea[k] buffers bun[load] bw[ipeout] cN[ext] cNf[ile] cabo[ve] cad[dbuffer] cadde[xpr] caddf[ile] caf[ter] cb[uffer] cbe[fore] cbel[ow] cbo[ttom] cc ccl[ose] ce[nter] cex[pr] cf[ile] cfir[st] cg[etfile] cgetb[uffer] cgete[xpr] changes che[ckpath] checkt[ime] chi[story] cl[ist] clip[reset] cla[st] clo[se] cle[arjumps] cn[ext] cnew[er] cnf[ile] col[der] colo[rscheme] comc[lear] comp[iler] con[tinue] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] delm[arks] defc[ompile] di[splay] dif[fupdate] diffg[et] diffo[ff] nextgroup=vimBang -syn keyword vimCommand contained 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] em[enu] endfo[r] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files fin[d] fina[lly] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] foldo[pen] g[lobal] go[to] gu[i] gv[im] helpc[lose] helpf[ind] helpt[ags] ha[rdcopy] ij[ump] il[ist] int[ro] ip[ut] is[earch] isp[lit] ju[mps] l[ist] lN[ext] lNf[ile] la[st] lab[ove] lad[dexpr] laddb[uffer] laddf[ile] laf[ter] lat[er] lb[uffer] lbe[fore] lbel[ow] lbo[ttom] lcl[ose] lcs[cope] le[ft] lex[pr] lf[ile] lfir[st] lg[etfile] lgetb[uffer] lgete[xpr] lhi[story] ll lla[st] lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] lockv[ar] lol[der] lop[en] lp[revious] nextgroup=vimBang -syn keyword vimCommand contained lpf[ile] lr[ewind] lt[ag] lw[indow] ls m[ove] marks mes[sages] mk[exrc] mks[ession] mksp[ell] mkv[imrc] mkvie[w] mod[e] n[ext] nb[key] nbc[lose] nbs[tart] noh[lsearch] nu[mber] o[pen] ol[dfiles] on[ly] opt[ions] ow[nsyntax] p[rint] pa[ckadd] packl[oadall] pb[uffer] pc[lose] ped[it] po[p] pp[op] pre[serve] prev[ious] ps[earch] pt[ag] ptN[ext] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] q[uit] quita[ll] qa[ll] r[ead] rec[over] red[o] redr[aw] redraws[tatus] redrawt[abline] redrawtabp[anel] reg[isters] res[ize] ret[ab] rew[ind] ri[ght] ru[ntime] rund[o] rv[iminfo] sN[ext] sa[rgument] sal[l] sav[eas] sb[uffer] sbN[ext] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbp[revious] sbr[ewind] scr[iptnames] nextgroup=vimBang -syn keyword vimCommand contained scripte[ncoding] scriptv[ersion] scs[cope] setf[iletype] sf[ind] sfir[st] sh[ell] sim[alt] sig[n] sla[st] sn[ext] so[urce] spe[llgood] spelld[ump] spelli[nfo] spellr[epall] spellra[re] spellu[ndo] spellw[rong] spr[evious] sre[wind] st[op] sta[g] star[tinsert] startg[replace] startr[eplace] stopi[nsert] stj[ump] sts[elect] sun[hide] sus[pend] sv[iew] sync[bind] smi[le] t tN[ext] ta[g] tags tabc[lose] tabe[dit] tabf[ind] tabfir[st] tabm[ove] tabl[ast] tabn[ext] tabnew tabo[nly] tabp[revious] tabN[ext] tabr[ewind] tabs te[aroff] tf[irst] tj[ump] tl[ast] tn[ext] tp[revious] tr[ewind] try ts[elect] u[ndo] undoj[oin] undol[ist] unh[ide] up[date] v[global] ve[rsion] vi[sual] vie[w] viu[sage] vne[w] vs[plit] w[rite] wN[ext] wa[ll] wi[nsize] nextgroup=vimBang -syn keyword vimCommand contained winp[os] wl[restore] 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 nextgroup=vimBang - -" Lower priority :syn-match to allow for :command/function() distinction -" :chdir is handled specially elsewhere -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang -syn match vimCommand "\" nextgroup=vimBang - -" GEN_SYN_VIM: vimCommand modifier, START_STR='syn keyword vimCommandModifier', END_STR='skipwhite nextgroup=vimCommandModifierBang,@vimCmdList' -syn keyword vimCommandModifier abo[veleft] bel[owright] bo[tright] hid[e] hor[izontal] kee[pmarks] keepj[umps] keepp[atterns] keepa[lt] lefta[bove] leg[acy] loc[kmarks] noa[utocmd] nos[wapfile] rightb[elow] san[dbox] sil[ent] tab to[pleft] uns[ilent] verb[ose] vert[ical] vim9[cmd] skipwhite nextgroup=vimCommandModifierBang,@vimCmdList -" :filter is handled specially elsewhere -syn match vimCommandModifierBang contained "\a\@1<=!" skipwhite nextgroup=@vimCmdList - -" Lower priority :syn-match to allow for :command/function() distinction -syn match vimCommand "\" skipwhite nextgroup=vimCommandModifierBang,@vimCmdList -syn match vimCommand "\" skipwhite nextgroup=vimCommandModifierBang,@vimCmdList - -" Lower priority for _new_ to distinguish constructors from the command. -syn match vimCommand contained "\(\@!" -syn match vimCommand contained "\" +syn keyword vimCommand contained al[l] ar[gs] arga[dd] argd[elete] argded[upe] arge[dit] argg[lobal] argl[ocal] argu[ment] as[cii] bN[ext] ba[ll] bad[d] balt bd[elete] bf[irst] bl[ast] bm[odified] bn[ext] bp[revious] br[ewind] brea[k] buffers bun[load] bw[ipeout] cN[ext] cNf[ile] cabo[ve] cad[dbuffer] cadde[xpr] caddf[ile] caf[ter] cb[uffer] cbe[fore] cbel[ow] cbo[ttom] cc ccl[ose] ce[nter] cex[pr] cf[ile] cfir[st] cg[etfile] cgetb[uffer] cgete[xpr] changes che[ckpath] checkt[ime] chi[story] cl[ist] clip[reset] cla[st] clo[se] cle[arjumps] cn[ext] cnew[er] cnf[ile] col[der] colo[rscheme] comc[lear] comp[iler] con[tinue] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] delm[arks] defc[ompile] di[splay] dif[fupdate] diffg[et] diffo[ff] diffp[atch] nextgroup=vimBang +syn keyword vimCommand contained diffpu[t] diffs[plit] difft[his] dig[raphs] disa[ssemble] dj[ump] dli[st] dr[op] ds[earch] dsp[lit] e[dit] ea[rlier] em[enu] endfo[r] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files fin[d] fina[lly] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] foldo[pen] go[to] gu[i] gv[im] helpc[lose] helpf[ind] helpt[ags] ha[rdcopy] ij[ump] il[ist] int[ro] ip[ut] is[earch] isp[lit] ju[mps] l[ist] lN[ext] lNf[ile] la[st] lab[ove] lad[dexpr] laddb[uffer] laddf[ile] laf[ter] lat[er] lb[uffer] lbe[fore] lbel[ow] lbo[ttom] lcl[ose] lcs[cope] le[ft] lex[pr] lf[ile] lfir[st] lg[etfile] lgetb[uffer] lgete[xpr] lhi[story] ll lla[st] lli[st] lne[xt] lnew[er] lnf[ile] lo[adview] lol[der] lop[en] lp[revious] lpf[ile] lr[ewind] lt[ag] lw[indow] nextgroup=vimBang +syn keyword vimCommand contained ls m[ove] marks mes[sages] mk[exrc] mks[ession] mksp[ell] mkv[imrc] mkvie[w] mod[e] n[ext] nb[key] nbc[lose] nbs[tart] new noh[lsearch] o[pen] ol[dfiles] on[ly] opt[ions] ow[nsyntax] p[rint] packl[oadall] pb[uffer] pc[lose] ped[it] po[p] pp[op] pre[serve] prev[ious] ps[earch] pt[ag] ptN[ext] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] q[uit] quita[ll] qa[ll] r[ead] rec[over] red[o] redr[aw] redraws[tatus] redrawt[abline] redrawtabp[anel] reg[isters] res[ize] ret[ab] rew[ind] ri[ght] rund[o] rv[iminfo] sN[ext] sa[rgument] sal[l] sav[eas] sb[uffer] sbN[ext] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbp[revious] sbr[ewind] scr[iptnames] scripte[ncoding] scriptv[ersion] scs[cope] setf[iletype] nextgroup=vimBang +syn keyword vimCommand contained sf[ind] sfir[st] sh[ell] sim[alt] sig[n] sla[st] sn[ext] so[urce] spe[llgood] spelld[ump] spelli[nfo] spellr[epall] spellra[re] spellu[ndo] spellw[rong] spr[evious] sre[wind] st[op] sta[g] star[tinsert] startg[replace] startr[eplace] stopi[nsert] stj[ump] sts[elect] sun[hide] sus[pend] sv[iew] sync[bind] smi[le] tN[ext] ta[g] tags tabc[lose] tabe[dit] tabf[ind] tabfir[st] tabm[ove] tabl[ast] tabn[ext] tabnew tabo[nly] tabp[revious] tabN[ext] tabr[ewind] tabs te[aroff] tf[irst] tj[ump] tl[ast] tn[ext] tp[revious] tr[ewind] try ts[elect] u[ndo] undoj[oin] undol[ist] unh[ide] up[date] ve[rsion] vi[sual] vie[w] viu[sage] vne[w] vs[plit] wN[ext] wa[ll] wi[nsize] winp[os] wl[restore] wn[ext] wp[revious] wq wqa[ll] wu[ndo] wv[iminfo] nextgroup=vimBang +syn keyword vimCommand contained x[it] xa[ll] xr[estore] y[ank] nextgroup=vimBang +syn match vimCommand_ contained "a\%(l\%[l]\|rga\%[dd]\|rgd\%[elete]\|rge\%[dit]\|rgu\%[ment]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "b\%(N\%[ext]\|a\%[ll]\|d\%[elete]\|f\%[irst]\|l\%[ast]\|m\%[odified]\|n\%[ext]\|p\%[revious]\|r\%[ewind]\|un\%[load]\|w\%[ipeout]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "c\%(N\%[ext]\|Nf\%[ile]\|abo\%[ve]\|ad\%[dbuffer]\|af\%[ter]\|b\%[uffer]\|be\%[fore]\|bel\%[ow]\|c\|e\%[nter]\|fir\%[st]\|getb\%[uffer]\|heckt\%[ime]\|hi\%[story]\|la\%[st]\|lo\%[se]\|n\%[ext]\|new\%[er]\|nf\%[ile]\|ol\%[der]\|ope\%[n]\|p\%[revious]\|pf\%[ile]\|q\%[uit]\|r\%[ewind]\|w\%[indow]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "d\%(iffg\%[et]\|iffpu\%[t]\|j\%[ump]\|li\%[st]\|s\%[earch]\|sp\%[lit]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "e\%(m\%[enu]\|xi\%[t]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "f\%(\%[ile]\|in\%[d]\|o\%[ld]\|oldc\%[lose]\|oldo\%[pen]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "go\%[to]\>" nextgroup=vimBang +syn match vimCommand_ contained "ha\%[rdcopy]\>" nextgroup=vimBang +syn match vimCommand_ contained "i\%(j\%[ump]\|l\%[ist]\|p\%[ut]\|s\%[earch]\|sp\%[lit]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "l\%(\%[ist]\|N\%[ext]\|Nf\%[ile]\|ab\%[ove]\|addb\%[uffer]\|af\%[ter]\|b\%[uffer]\|be\%[fore]\|bel\%[ow]\|cl\%[ose]\|e\%[ft]\|fir\%[st]\|getb\%[uffer]\|hi\%[story]\|l\|la\%[st]\|ne\%[xt]\|new\%[er]\|nf\%[ile]\|ol\%[der]\|op\%[en]\|p\%[revious]\|pf\%[ile]\|r\%[ewind]\|w\%[indow]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "m\%(\%[ove]\|es\%[sages]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "n\%(\%[ext]\|ew\)\>" nextgroup=vimBang +syn match vimCommand_ contained "o\%(\%[pen]\|n\%[ly]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "p\%(\%[rint]\|b\%[uffer]\|o\%[p]\|p\%[op]\|rev\%[ious]\|s\%[earch]\|t\%[ag]\|tN\%[ext]\|tf\%[irst]\|tn\%[ext]\|tp\%[revious]\|tr\%[ewind]\|u\%[t]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "q\%[uit]\>" nextgroup=vimBang +syn match vimCommand_ contained "r\%(\%[ead]\|es\%[ize]\|et\%[ab]\|i\%[ght]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "s\%(N\%[ext]\|a\%[rgument]\|al\%[l]\|b\%[uffer]\|bN\%[ext]\|ba\%[ll]\|bm\%[odified]\|bn\%[ext]\|bp\%[revious]\|cr\%[iptnames]\|f\%[ind]\|ig\%[n]\|n\%[ext]\|o\%[urce]\|pe\%[llgood]\|pellra\%[re]\|pellu\%[ndo]\|pellw\%[rong]\|pr\%[evious]\|ta\%[g]\|un\%[hide]\|v\%[iew]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "t\%(N\%[ext]\|a\%[g]\|abc\%[lose]\|abe\%[dit]\|abf\%[ind]\|abm\%[ove]\|abn\%[ext]\|abnew\|abo\%[nly]\|abp\%[revious]\|abN\%[ext]\|f\%[irst]\|n\%[ext]\|p\%[revious]\|r\%[ewind]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "u\%(\%[ndo]\|nh\%[ide]\|p\%[date]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "v\%(ne\%[w]\|s\%[plit]\)\>" nextgroup=vimBang +syn match vimCommand_ contained "w\%(N\%[ext]\|n\%[ext]\|p\%[revious]\|q\)\>" nextgroup=vimBang +syn match vimCommand_ contained "x\%[it]\>" nextgroup=vimBang +syn match vimCommand_ contained "y\%[ank]\>" nextgroup=vimBang + +" lower priority :syn-match to allow for :command/function() distinction +" :chdir and :delete is handled specially elsewhere +syn match vimCommand contained "\" nextgroup=vimBang +syn match vimCommand_ contained "co\%[py]\>" nextgroup=vimBang +syn match vimCommand contained "\" nextgroup=vimBang +syn match vimCommand_ contained "j\%[oin]\>" nextgroup=vimBang +syn match vimCommand contained "\" nextgroup=vimBang +syn match vimCommand_ contained "sp\%[lit]\>" nextgroup=vimBang +syn match vimCommand contained "\" nextgroup=vimBang + +" commands starting with uppercase letter +syn keyword vimCommand contained N[ext] nextgroup=vimBang +syn match vimCommand_ contained "N\%[ext]\>" nextgroup=vimBang +syn keyword vimCommand contained P[rint] +syn match vimCommand_ contained "P\%[rint]\>" +syn keyword vimCommand contained X + +" GEN_SYN_VIM: vimCommand modifier, START_STR='syn keyword vimCommandModifier contained', END_STR='skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func' +syn keyword vimCommandModifier contained abo[veleft] bel[owright] bo[tright] hid[e] hor[izontal] kee[pmarks] keepj[umps] keepp[atterns] keepa[lt] lefta[bove] leg[acy] loc[kmarks] noa[utocmd] nos[wapfile] rightb[elow] san[dbox] sil[ent] tab to[pleft] uns[ilent] verb[ose] vert[ical] vim9[cmd] skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func +syn match vimCommandModifier_ contained "hid\%[e]\>" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func +syn match vimCommandModifier_ contained "tab\>" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func +syn match vimCommandModifier_ contained "verb\%[ose]\>" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func +" modifiers supporting bang, :filter is handled specially elsewhere +syn keyword vimCommandModifier contained sil[ent] skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + +syn match vimCommandModifierBang contained "\a\@1<=!" skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + +" lower priority :syn-match to allow for :command/function() distinction +syn match vimCommandModifier contained "\" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func +syn match vimCommandModifier contained "\" skipwhite skipnl nextgroup=vimCommandModifierBang,@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + +syn match vimCommandModifierContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func contains=vimLeadingWhitespace +syn match vimCommandModifierContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimCommandModifierContinue contains=vimLeadingWhitespace +syn cluster vimCommandModifierContinue contains=vimCommandModifierContinue,vimCommandModifierContinueComment + 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 @@ -138,7 +176,7 @@ syn keyword vimAutoEvent contained FilterWritePost FilterWritePre FocusGained Fo syn keyword vimAutoEvent contained WinLeave WinNew WinNewPre WinResized WinScrolled skipwhite nextgroup=vimAutoEventSep,@vimAutocmdPattern syn keyword vimAutoEvent contained User skipwhite nextgroup=vimUserAutoEvent -syn match vimUserAutoEvent contained "\<\h\w*\>" skipwhite nextgroup=vimUserAutoEventSep,vimAutocmdMod,vimAutocmdBlock +syn match vimUserAutoEvent contained "\<\h\w*\>" skipwhite skipnl nextgroup=vimUserAutoEventSep,vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc " Highlight commonly used Groupnames {{{2 " GEN_SYN_VIM: vimGroup, START_STR='syn keyword vimGroup contained', END_STR='' @@ -290,7 +328,7 @@ Vim9 syn keyword vim9Boolean true false " Numbers {{{2 " ======= syn case ignore -syn match vimNumber "\<\d\+\%('\d\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets,vimGlobal,vimSubst1 +syn match vimNumber "\<\d\+\%('\d\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets syn match vimNumber "\<\d\+\%('\d\+\)*\.\d\+\%(e[+-]\=\d\+\)\=" skipwhite nextgroup=@vimComment syn match vimNumber "\<0b[01]\+\%('[01]\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets syn match vimNumber "\<0o\=\o\+\%('\o\+\)*" skipwhite nextgroup=@vimComment,vimSubscriptBrackets @@ -299,16 +337,8 @@ syn match vimNumber '\<0z\>' skipwhite nextgroup=@vimComment syn match vimNumber '\<0z\%(\x\x\)\+\%(\.\%(\x\x\)\+\)*' skipwhite nextgroup=@vimComment,vimSubscriptBrackets syn case match -" All vimCommands are contained by vimIsCommand. {{{2 -syn cluster vimCmdList contains=vimAbb,vimAddress,vimAt,vimAutocmd,vimAugroup,vimBehave,vimBreakadd,vimBreakdel,vimBreaklist,vimCall,vimCatch,vimCd,vimCommandModifier,vimConst,vimDoautocmd,vimDebug,vimDebuggreedy,vimDef,vimDefFold,vimDefer,vimDelcommand,vimDelFunction,vimDoCommand,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimEval,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimExMark,vimFiletype,vimFor,vimFunction,vimFunctionFold,vimGrep,vimGrepAdd,vimGlobal,vimHelp,vimHelpgrep,vimHighlight,vimHistory,vimImport,vimLanguage,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimProfdel,vimProfile,vimPrompt,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimSyntime,vimSynColor,vimSynLink,vimTerminal,vimThrow,vimUniq,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimWincmd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl -syn cluster vim9CmdList contains=vim9Abstract,vim9Class,vim9Const,vim9Enum,vim9Export,vim9Final,vim9For,vim9Interface,vim9Type,vim9Var -syn match vimCmdSep "\\\@1" nextgroup=vimBang contains=vimCommand -syn match vimBang contained "!" -syn match vimWhitespace contained "\s\+" - +" Variables {{{2 +" ========= syn region vimSubscriptBrackets contained \ matchgroup=vimSubscriptBracket \ start="\[" @@ -328,202 +358,205 @@ syn match vimFBVar contained "\<[bwglsta]:\h[a-zA-Z0-9#_]*\>" nextgroup=vim syn match vimVarScope contained "\<[bwglstav]:" syn match vimVimVar contained "\<[bwglstav]:\%(\h\|\d\)\@!" nextgroup=vimSubscriptBrackets,vimSubscriptDot -syn match vimVarNameError contained "\<\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot " just abort highlighting rather than match nextgroup? +syn match vimVarNameError contained "\<\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot " TODO: just abort highlighting rather than match nextgroup? syn match vimVimVar "\" contains=vim9Super,vim9This - -Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+[-+/*%]\==" contains=vimVar,@vimSpecialVar -Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+=<<" skipwhite nextgroup=vimLetHeredoc contains=vimVar,@vimSpecialVar -Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+\.\.=" contains=vimVar,@vimSpecialVar - -Vim9 syn match vim9LhsRegister "@["0-9\-a-zA-Z#=*+_/]\ze\s\+\%(\.\.\)\==" - syn cluster vimExprList contains=@vimSpecialVar,@vimFunc,vimNumber,vimOper,vimOperParen,vimLambda,vimString,vimVar,@vim9ExprList syn cluster vim9ExprList contains=vim9Boolean,vim9LambdaParams,vim9Null -" 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="^\.$" extend - syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=c\%[hange]$" matchgroup=vimCommand end="^\.$" extend - syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=i\%[nsert]$" matchgroup=vimCommand end="^\.$" extend -endif +" Commands {{{2 +syn cluster vimCmdList contains=@vim9CmdList,@vimExUserCmdList,vimAbb,vimAt,vimAugroup,vimAutocmd,vimBehave,vimBreakadd,vimBreakdel,vimBreaklist,vimBuffer,vimCall,vimCatch,vimCd,vimCommand,vimCommandModifier,vimConst,vimCopy,vimDebug,vimDebuggreedy,vimDef,vimDefFold,vimDefer,vimDelcommand,vimDelete,vimDelfunction,vimDoCommand,vimDoautocmd,vimTextInputFold,@vimEcho,vimElse,vimElseif,vimEnddef,vimEndfunction,vimEndif,vimEquals,vimEval,vimExFilter,vimExecute,vimExtCmd,vimFiletype,vimFor,vimFunction,vimFunctionFold,vimGlobal,vimGrep,vimGrepadd,vimHelp,vimHelpgrep,vimHighlight,vimHistory,vimIf,vimImport,vimLanguage,vimLet,vimLoadkeymap,vimLockvar,vimLua,vimMake,vimMap,vimMark,vimMatch,vimMenu,vimMenutranslate,vimMzScheme,vimNormal,vimPackadd,vimPerl,vimPound,vimProfdel,vimProfile,vimPrompt,vimPython,vimPython3,vimPythonX,vimRedir,vimReturn,vimRuby,vimRuntime,vimSet,vimShiftLeft,vimShiftRight,vimSleep,vimSort,vimSubst,vimSynColor,vimSynLink,vimSyntax,vimSyntime,vimTcl,vimTerminal,vimThrow,vimUniq,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimUsrCmd,vimVimgrep,vimVimgrepadd,vimWhile,vimWincmd,vimWrite +syn cluster vim9CmdList contains=vim9Abstract,vim9ClassBody,vim9Const,vim9EnumBody,vim9Export,vim9Final,vim9For,vim9InterfaceBody,vim9Type,vim9Var,vim9Wincmd -" Behave! {{{2 -" ======= -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror") - syn match vimBehaveError contained "[^ ]\+" -endif -syn match vimBehave "\" nextgroup=vimBehaveBang,vimBehaveModel,vimBehaveError skipwhite -syn match vimBehaveBang contained "\a\@1<=!" nextgroup=vimBehaveModel skipwhite -syn keyword vimBehaveModel contained mswin xterm +syn match vimCmdStart contained ":\+" skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList,vimComment +syn match vimCount contained "\d\+" +syn match vimBang contained "!" +syn match vimPrintFlag contained "[lp#]" skipwhite nextgroup=vimPrintFlag,vimComment,vimCmdSep -" Break* commands {{{2 -" =============== -syn keyword vimBreakaddFunc contained func skipwhite nextgroup=vimBreakpointFunctionLine,vimBreakpointFunction -syn keyword vimBreakaddFile contained file skipwhite nextgroup=vimBreakpointFileLine,vimBreakpointFilename -syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn keyword vimBreakaddExpr contained expr skipwhite nextgroup=@vimExprList +syn match vimWhitespace contained "\s\+" +syn match vimLeadingWhitespace contained "^\s\+" -syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +" :range {{{3 +syn match vimRange contained "[*%]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand -syn cluster vimBreakpointArg contains=vimBreakaddFunc,vimBreakaddFile,vimBreakaddHere,vimBreakaddExpr +syn region vimAddressPattern contained + \ matchgroup=Delimiter + \ start="/" + \ skip=+\\/\|\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ end="/" + \ skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand + \ contains=vimAddressSlashEscape,@vimContinue,@vimSubstList +syn match vimAddressSlashEscape contained "\\/" +syn region vimAddressPattern contained + \ matchgroup=Delimiter + \ start="?" + \ skip=+\\?\|\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ end="?" + \ skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand + \ contains=vimAddressQuestionEscape,@vimContinue,@vimSubstList +syn match vimAddressQuestionEscape contained "\\?" -syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointFunctionLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFunction -syn match vimBreakpointFileLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFilename +syn match vimAddressOffset contained "[+-]\%(\d\+\)\=\|\d\+" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,@vimCommand_ +syn match vimAddress contained "\%#=1\d\+" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,@vimCommand_ +syn match vimAddress contained "\%#=1[.$]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand +syn match vimAddress contained "\%#=1'[[\]<>'`"^.(){}]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand +syn match vimAddress contained "\%#=1'[a-zA-Z0-9]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,@vimCommand_ +" NOTE: needs leading ':' to distinguish \/ from line continuation in Vim script +syn match vimAddress contained "\%#=1\\[/?&]" skipwhite nextgroup=vimAddressOffset,vimAddressSeparator,vimCmdStart,@vimCmdList,vimCommand -syn keyword vimBreakadd breaka[dd] skipwhite nextgroup=@vimBreakpointArg -syn keyword vimBreakdel breakd[el] skipwhite nextgroup=@vimBreakpointArg,vimBreakpointNumber,vimBreakpointGlob -syn keyword vimBreaklist breakl[ist] skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimAddressSeparator contained "\%#=1[,;]" skipwhite nextgroup=vimAddress,vimAddressPattern,vimAddressOffset,vimCmdStart,@vimCmdList,vimCommand,vimAddressSeparator -" Call {{{2 -" ==== -syn match vimCall "\" skipwhite nextgroup=vimVar,@vimFunc +syn cluster vimRange contains=vimRange,vimAddress,vimAddressPattern,vimAddressOffset,vimAddressSeparator -" Cd: {{{2 +" :@ {{{3 " == -" GEN_SYN_VIM: vimCommand cd, START_STR='syn keyword vimCd', END_STR='skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep' -syn keyword vimCd cd lc[d] lch[dir] tc[d] tch[dir] skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep -syn match vimCd "\" skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep -syn region vimCdArg contained - \ start=+["#|]\@!\S+ - \ end="\ze\s*$" - \ end=+\ze\s*\\\@1" contains=vimCount - -" Defer {{{2 -" ===== -syn match vimDefer "\" skipwhite nextgroup=@vimFunc,vim9LambdaParams +" TODO: needs to be limited to after a ':' in Vim9, otherwise a comment +if s:vim9script + syn match vimPound contained ":\@1<=#" skipwhite nextgroup=vimPoundCount,vimPrintFlag +else + syn match vimPound contained "#" skipwhite nextgroup=vimPoundCount,vimPrintFlag +endif +syn keyword vimPound contained nu[mber] skipwhite nextgroup=vimPoundCount,vimPrintFlag +syn match vimPound_ contained "nu\%[mber]\>" skipwhite nextgroup=vimPoundCount,vimPrintFlag +syn match vimPoundCount contained "\d\+" skipwhite nextgroup=vimPrintFlag -" *Do commands {{{2 -" ============ -syn match vimDoCommandBang contained "\a\@1<=!" skipwhite nextgroup=@vimCmdList +" := {{{3 +" == +syn match vimEquals contained "=" skipwhite nextgroup=vimPrintFlag -syn keyword vimDoCommand argdo bufd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList -syn keyword vimDoCommand tabd[o] wind[o] skipwhite nextgroup=@vimCmdList -syn keyword vimDoCommand cdo cfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList -syn keyword vimDoCommand ld[o] lfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList -syn keyword vimDoCommand foldd[oopen] folddoc[losed] skipwhite nextgroup=@vimCmdList +" :>, :< {{{3 +" ====== -" Exception Handling {{{2 -syn keyword vimThrow th[row] skipwhite nextgroup=@vimExprList -syn keyword vimCatch cat[ch] skipwhite nextgroup=vimCatchPattern -syn region vimCatchPattern contained matchgroup=Delimiter start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" skip="\\\\\|\\\z1" end="\z1" contains=@vimSubstList oneline +syn match vimShiftLeft contained "<\%(line\)\@!" skipwhite nextgroup=vimShiftLeftPlus,vimShiftLeftCount,vimPrintFlag +syn match vimShiftLeftPlus contained "<" skipwhite nextgroup=vimShiftLeftPlus,vimShiftLeftCount,vimPrintFlag +syn match vimShiftLeftCount contained "\d\+" skipwhite nextgroup=vimPrintFlag -" Export {{{2 -" ====== -if s:vim9script - syn keyword vim9Export export skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vim9Def,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var -endif +syn match vimShiftRight contained ">" skipwhite nextgroup=vimShiftRightPlus,vimShiftRightCount,vimPrintFlag +syn match vimShiftRightPlus contained ">" skipwhite nextgroup=vimShiftRightPlus,vimShiftRightCount,vimPrintFlag +syn match vimShiftRightCount contained "\d\+" skipwhite nextgroup=vimPrintFlag -" Filetypes {{{2 -" ========= -syn match vimFiletype "\]" skipwhite nextgroup=vimHistoryRange,vimCmdSep,vimComment,vim9Comment -syn match vimHistoryRange contained "-\=\<\d\+\>\%(\s*,\)\=" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn match vimHistoryRange contained ",\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn match vimHistoryRange contained "-\=\<\d\+\s*,\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment +" :append, :change, :insert {{{3 +" ========================= +" (buftype != nofile test avoids having append, change, insert show up in the command window) -" Import {{{2 -" ====== -syn keyword vimImportAutoload contained autoload skipwhite nextgroup=vimImportFilename -if s:vim9script - syn region vimImportFilename contained - \ start="\S" - \ skip=+\%#=1 - "\ continuation operators at SOL - \\n\%(\s*#.*\n\)*\s*\%([[:punct:]]\+\&[^#"'(]\) - \\| - "\ continuation operators at EOL - \\%(\%([[:punct:]]\+\&[^#"')]\)\s*\%(#.*\)\=\)\@<=$ - \\| - \\n\%(\s*#.*\n\)*\s*as\s - \\| - \\%(^\s*#.*\)\@<=$ - \\| - \\n\s*\%(\\\|#\\ \) - \+ - \ matchgroup=vimCommand - \ end="\s\+\zsas\ze\s\+\h" - \ matchgroup=NONE - \ end="$" - \ skipwhite nextgroup=vimImportName - \ contains=@vim9Continue,@vimExprList,vim9Comment - \ transparent -else - syn region vimImportFilename contained - \ start="\S" - \ skip=+\n\s*\%(\\\|"\\ \)+ +if &buftype != 'nofile' + syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand_ contained "a\%[ppend]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand_ contained "c\%[hange]\>" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimCommand_ contained "i\%[nsert]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + + syn match vimChangeCount contained "\d\+" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimChangeBang contained + \ "\a\@1<=!" + \ skipwhite skipnl skipempty nextgroup=vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar + + syn match vimTextInputBang contained "\a\@1<=!" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar + syn match vimTextInputText contained "|\@1<=.*" skipnl skipempty nextgroup=@vimTextInputText + syn region vimTextInputText contained + \ start="^." \ matchgroup=vimCommand - \ end="\s\+\zsas\ze\s\+\h" - \ matchgroup=NONE - \ end="$" - \ skipwhite nextgroup=vimImportName - \ contains=@vimContinue,@vimExprList - \ transparent + \ end="^\.$" + \ extend + " NOTE: 'autoindent' end marker not supported + syn match vimTextInputEnd contained "^\.$" + syn cluster vimTextInputText contains=vimTextInputText,vimTextInputEnd + + syn match vimTextInputComment contained + \ /".*/ + \ skipnl skipempty nextgroup=@vimTextInputText + syn match vimTextInputBar contained + \ "\s*\zs|" + \ nextgroup=@vimTextInputText + + if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'T' + " excludes "extend" option, handled by wrapper + syn region vimTextInputText contained + \ start="^." + \ matchgroup=vimCommand + \ end="^\.$" + syn region vimTextInputFold contained + \ start="\" + \ start="\" + \ start="\" + \ end="^\.$" + \ contains=vimCommand + \ extend fold keepend transparent + syn region vimTextInputFold_ contained + \ start="a\%[ppend]\>" + \ start="c\%[hange]\>" + \ start="i\%[nsert]\>" + \ end="^\.$" + \ contains=vimCommand_ + \ extend fold keepend transparent + endif endif -syn match vimImportName contained "\%(\" skipwhite nextgroup=@vimComment -syn match vimImport "\" skipwhite nextgroup=vimImportAutoload,vimImportFilename - -" Language {{{2 -" ======== -syn keyword vimLanguage lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimSep,vimComment,vim9Comment -syn keyword vimLanguageCategory contained col[late] cty[pe] mes[sages] tim[e] skipwhite nextgroup=@vimLanguageName -" [language[_territory][.codeset][@modifier]] and the reserved "C" and "POSIX" -syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimSep,vimComment,vim9Comment -syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimSep,vimComment,vim9Comment -syn cluster vimLanguageName contains=vimLanguageName,vimLanguageNameReserved +" :argdo, :bufdo, :tabdo, :windo, :cdo, :cfdo, :ldo, :lfdo, :folddoopen, :folddoclosed {{{3 +" ===================================================================================== +syn match vimDoCommandBang contained "\a\@1<=!" skipwhite nextgroup=@vimCmdList -" 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,vimString,vimSubst,vimRegister,vimCmplxRepeat,vimNotation,vimCtrlChar,vimContinue +syn keyword vimDoCommand contained argdo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "argdo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained bufdo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "bufdo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained tabd[o] skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "tabdo\=\>" skipwhite nextgroup=@vimCmdList +syn keyword vimDoCommand contained windo skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "windo\>" skipwhite nextgroup=@vimCmdList + +syn keyword vimDoCommand contained cdo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "cdo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained cfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "cfdo\=\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList + +syn keyword vimDoCommand contained ldo skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "ldo\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn keyword vimDoCommand contained lfd[o] skipwhite nextgroup=vimDoCommandBang,@vimCmdList +syn match vimDoCommand_ contained "lfdo\=\>" skipwhite nextgroup=vimDoCommandBang,@vimCmdList + +syn keyword vimDoCommand contained foldd[oopen] skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "foldd\%[oopen]\>" skipwhite nextgroup=@vimCmdList +syn keyword vimDoCommand contained folddoc[losed] skipwhite nextgroup=@vimCmdList +syn match vimDoCommand_ contained "folddoc\%[losed]\>" skipwhite nextgroup=@vimCmdList + +" :augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{3 +" ======== : Trade-off: Increasing synclines with slower editing vs augroup END error checking. +syn cluster vimAugroupList contains=@vimFunc,vimLineStart,vimContinue,vimCmdSep,vimLineComment,vimSpecFile,vimOper,vimNumber,vimOperParen,@vimComment,vimString,vimNotation,vimCtrlChar " define -VimFolda syn region vimAugroup +VimFolda syn region vimAugroup contained \ start="\\ze\s\+\%([eE][nN][dD]\%($\|[[:space:]|"#]\)\)\@!\S" \ matchgroup=vimAugroupKey \ end="\\ze\s*\%(["|]\|$\)" skipwhite nextgroup=vimCmdSep,vimComment contains=vimAugroupKey -Vim9 syn match vimAugroup "\\ze\s*\%([#|]\|$\)" skipwhite nextgroup=vimCmdSep,vim9Comment contains=vimAugroupKey +VimL syn match vimAugroup contained "\\ze\s*\%(["|]\|$\)" skipwhite nextgroup=vimCmdSep,vimComment contains=vimAugroupKey +Vim9 syn match vimAugroup contained "\\ze\s*\%([#|]\|$\)" skipwhite nextgroup=vimCmdSep,vim9Comment contains=vimAugroupKey -" Operators: {{{2 -" ========= -syn cluster vimOperGroup contains=@vimContinue,@vimExprList,vim9Comment,vim9LineComment,vimContinueString -syn match vimOper "\a\@=\|<=\|=\~\|!\~\|>\|<\)[?#]\=" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile -syn match vimOper "\" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile -syn match vimOper "\" skipwhite nextgroup=@vimExprList -syn region vimLambda contained - \ matchgroup=vimLambdaBrace - \ start=+{\ze[[:space:][:alnum:]_.,]*\%(\n\s*\%(\\[[:space:][:alnum:]_.,]*\|"\\ .*\)\)*->+ - \ skip=+\n\s*\%(\\\|"\\ \)+ - \ end="}" end="$" - \ contains=@vimContinue,@vimExprList,vimLambdaParams -syn match vimLambdaParams contained "\%({\n\=\)\@1<=\_.\{-}\%(->\)\@=" nextgroup=vimLambdaOperator contains=@vimContinue,vimFunctionParam +syn match vimAutocmdGroup contained "\%(\\["|[:space:]]\|[^"|[:space:]]\)\+" skipwhite nextgroup=vimAutoEvent,vimAutoEventGlob +syn match vimAutocmdBang contained "\a\@1<=!" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob -syn match vim9LambdaOperator contained "=>" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment -syn match vim9LambdaParen contained "[()]" -syn match vim9LambdaParams contained - \ "(\%(\" - \ skipwhite nextgroup=vim9LambdaOperator - \ contains=@vim9Continue,vimDefParam,vim9LambdaParen,vim9LambdaReturnType -syn region vim9LambdaReturnType contained start=")\@1<=:\s" end="\ze\s*#" end="\ze\s*=>" contains=@vim9Continue,@vimType transparent -syn region vim9LambdaBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList +" TODO: cleaner handling of | in pattern position +" : match pattern items in addition to wildcards +syn region vimAutocmdPattern contained + \ start="|\@!\S" + \ skip="\\\\\|\\[,[:space:]]" + \ end="\ze[,[:space:]]" + \ end="$" + \ skipwhite skipnl nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc + \ contains=vimEnvvar,@vimWildcard,vimAutocmdPatternEscape +syn match vimAutocmdBufferPattern contained "" skipwhite skipnl nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc +syn match vimAutocmdPatternSep contained "," skipwhite skipnl nextgroup=@vimAutocmdPattern,@vimAutocmdContinue +" trailing pattern separator comma allowed +syn match vimAutocmdPatternSep contained ",\ze\s\+" skipwhite skipnl nextgroup=vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc +syn match vimAutocmdPatternEscape contained "\\." +syn cluster vimAutocmdPattern contains=vimAutocmdPattern,vimAutocmdBufferPattern -syn match vim9LambdaOperatorComment contained "#.*" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment +" TODO: Vim9 requires '++' prefix +syn match vimAutocmdMod contained "\%(++\)\=\" skipwhite skipnl nextgroup=vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc +syn match vimAutocmdMod contained "++once\>" skipwhite skipnl nextgroup=vimAutocmdMod,vimAutocmdBlock,@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc -" Functions: Tag is provided for those who wish to highlight tagged functions {{{2 -" ========= -syn cluster vimFunctionBodyCommon contains=@vimCmdList,vimCmplxRepeat,vimContinue,vimCtrlChar,vimDef,vimFBVar,vimFunction,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegister,vimSpecFile,vimString,vimSubst,vimFunctionFold,vimDefFold,vimCmdSep -syn cluster vimFunctionBodyList contains=@vimFunctionBodyCommon,vimComment,vimLineComment,vimInsert,vimConst,vimLet,vimSearch -syn cluster vimDefBodyList contains=@vimFunctionBodyCommon,vim9Comment,vim9LineComment,vim9Block,vim9Const,vim9Final,vim9Var,vim9Null,vim9Boolean,vim9For,vim9LhsVariable,vim9LhsVariableList,vim9LhsRegister,vim9Search,@vimSpecialVar,@vim9Func +" higher priority than vimAutocmdGroup, assume no group is so named +syn match vimAutoEventGlob contained "*" skipwhite nextgroup=@vimAutocmdPattern +syn match vimAutoEventSep contained "\a\@1<=," nextgroup=vimAutoEvent +syn match vimUserAutoEventSep contained "\a\@1<=," nextgroup=vimUserAutoEvent -syn region vimFunctionPattern contained - \ matchgroup=vimOper - \ start="/" - \ end="$" - \ contains=@vimSubstList +syn keyword vimAutocmd contained au[tocmd] skipwhite nextgroup=vimAutocmdBang,vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob -syn match vimFunctionBang contained "\a\@1<=!" skipwhite nextgroup=vimFunctionName -syn match vimDefBang contained "\a\@1<=!" skipwhite nextgroup=vimDefName -syn match vimFunctionSID contained "\c" -syn match vimFunctionScope contained "\<[bwglstav]:" -syn match vimFunctionName contained - \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" - \ skipwhite nextgroup=vimFunctionParams,vimCmdSep,vimComment,vim9Comment - \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag -syn match vimDefName contained - \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" - \ nextgroup=vimDefTypeParams,vimDefParams,vimCmdSep,vimComment,vim9Comment - \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag +syn match vimAutocmdContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimAutocmdContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func,@vimFunc contains=vimLeadingWhitespace +syn match vimAutocmdContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimAutocmdContinue contains=vimLeadingWhitespace +syn cluster vimAutocmdContinue contains=vimAutocmdContinue,vimAutocmdContinueComment -syn match vimFunction "\" skipwhite nextgroup=vimFunctionBang,vimFunctionName,vimFunctionPattern,vimCmdSep,vimComment -syn match vimDef "\" skipwhite nextgroup=vimDefBang,vimDefName,vimFunctionPattern,vimCmdSep,vimComment +syn match vimDoautocmdMod contained "" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent +syn keyword vimDoautocmd contained do[autocmd] skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent +syn keyword vimDoautocmd contained doautoa[ll] skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent -syn region vimFunctionComment contained - \ start=+".*+ - \ skip=+\n\s*\%(\\\|"\\ \)+ - \ end="$" - \ skipwhite skipempty nextgroup=vimFunctionBody,vimEndfunction -syn region vimDefComment contained - \ start="#.*" - \ skip=+\n\s*\%(\\\|#\\ \)+ - \ end="$" - \ skipwhite skipempty nextgroup=vimDefBody,vimEnddef +" :behave {{{3 +" ======= +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror") + syn match vimBehaveError contained "[^ ]\+" +endif +syn keyword vimBehave contained be[have] nextgroup=vimBehaveBang,vimBehaveModel,vimBehaveError skipwhite +syn match vimBehaveBang contained "\a\@1<=!" nextgroup=vimBehaveModel skipwhite +syn keyword vimBehaveModel contained mswin xterm -syn region vimFunctionParams contained - \ matchgroup=Delimiter - \ start="(" - \ skip=+\n\s*\%(\\\|"\\ \)+ - \ end=")" - \ skipwhite skipempty nextgroup=vimFunctionBody,vimFunctionComment,vimEndfunction,vimFunctionMod,vim9CommentError - \ contains=vimFunctionParam,vimOperParen,@vimContinue -syn region vimDefParams contained - \ matchgroup=Delimiter - \ start="(" - \ end=")" - \ skipwhite skipempty nextgroup=vimDefBody,vimDefComment,vimEnddef,vimReturnType,vimCommentError - \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals,vimOperParen -syn region vimDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vimDefParams - \ contains=vim9DefTypeParam -syn match vimFunctionParam contained "\<\h\w*\>\|\.\.\." skipwhite nextgroup=vimFunctionParamEquals -syn match vimDefParam contained "\<\h\w*\>" skipwhite nextgroup=vimParamType,vimFunctionParamEquals -syn match vim9DefTypeParam contained "\<\u\w*\>" +" :breakadd, :breakdel, :breaklist {{{3 +" ================================ +syn keyword vimBreakaddFunc contained func skipwhite nextgroup=vimBreakpointFunctionLine,vimBreakpointFunction +syn keyword vimBreakaddFile contained file skipwhite nextgroup=vimBreakpointFileLine,vimBreakpointFilename +syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn keyword vimBreakaddExpr contained expr skipwhite nextgroup=@vimExprList -syn match vimFunctionParamEquals contained "=" skipwhite nextgroup=@vimExprList -syn match vimFunctionMod contained "\<\%(abort\|closure\|dict\|range\)\>" skipwhite skipempty nextgroup=vimFunctionBody,vimFunctionComment,vimEndfunction,vimFunctionMod,vim9CommentError +syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn region vimFunctionBody contained - \ start="^." - \ matchgroup=vimCommand - \ end="\" - \ skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError - \ contains=@vimFunctionBodyList -syn region vimDefBody contained - \ start="^." - \ matchgroup=vimCommand - \ end="\" - \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError - \ contains=@vimDefBodyList +syn cluster vimBreakpointArg contains=vimBreakaddFunc,vimBreakaddFile,vimBreakaddHere,vimBreakaddExpr -syn match vimEndfunction "\" skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError -syn match vimEnddef "\" skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError +syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointFunctionLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFunction +syn match vimBreakpointFileLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFilename -if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vimFunctionFold - \ start="\" skipwhite nextgroup=vimDelfunctionBang,vimFunctionName +" :buffer {{{3 +" ======= +" lower priority than [wtb]: Vim9 scoped variables at SOL +syn match vimBuffer contained "\" nextgroup=vimBang +syn match vimBuffer_ contained "b\%[uffer]\>" nextgroup=vimBang -" Types: {{{2 +" :call {{{3 " ===== +syn keyword vimCall contained cal[l] skipwhite nextgroup=vimVar,@vimFunc +syn match vimCall_ contained "call\=\>" skipwhite nextgroup=vimVar,@vimFunc -syn region vimReturnType contained - \ start=")\@1<=:\%(\s\|\n\)\@=" - \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + - \ end="$" - \ matchgroup=vim9Comment - "\ allow for legacy script tail comment error - \ end="\ze[#"]" - \ skipwhite skipempty nextgroup=vimDefBody,vimDefComment,vimEnddef,vimCommentError - \ contains=@vim9Continue,@vimType - \ transparent -syn match vimParamType contained ":\s" skipwhite skipnl nextgroup=@vimType contains=vimTypeSep - -syn match vimTypeSep contained ":\%(\s\|\n\)\@=" skipwhite nextgroup=@vimType -syn keyword vimType contained blob bool channel float job number string void -syn keyword vimTypeAny contained any -syn match vimTypeObject contained "\" skipwhite nextgroup=vimCdBang,vimCdArg,vimComment,vim9Comment,vimCmdSep +syn region vimCdArg contained + \ start=+["#|]\@!\S+ + \ end="\ze\s*$" + \ end=+\ze\s*\\\@1" -syn region vimCompoundType contained matchgroup=vimType start="\" -syn cluster vimType contains=vimType,vimTypeAny,vimTypeObject,vimCompoundType,vimUserType +syn match vimCdBang contained "\a\@1<=!" skipwhite nextgroup=vimCdArg,vimComment,vim9Comment,vimCmdSep -" Classes, Enums And Interfaces: {{{2 -" ============================= +" :command {{{3 +" ======== +syn cluster vimUserCmdList contains=@vimCmdList,vimComment,vimCtrlChar,vimEscapeBrace,@vimFunc,vimNotation,vimNumber,vimOper,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange,@vim9Lhs,vimCmdSep -if s:vim9script +syn match vimUserCmd contained "\!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang +syn match vimUserCmd contained +\!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang - " Methods {{{3 - syn match vim9MethodDef contained "\" skipwhite nextgroup=vim9MethodDefName,vim9ConstructorDefName - syn match vim9MethodDefName contained "\<\h\w*\>" nextgroup=vim9MethodDefParams,vim9MethodDefTypeParams contains=@vim9MethodName - syn region vim9MethodDefParams contained - \ matchgroup=Delimiter start="(" end=")" - \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vim9MethodDefReturnType,vimCommentError - \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals - syn region vim9MethodDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vim9MethodDefParams - \ contains=vim9DefTypeParam +syn region vimUserCmdAttrs contained + \ start="-\l" + \ start=+^\s*\%(\\\|["#]\\ \)+ + \ end="\ze\s\u" + \ skipwhite nextgroup=vimUserCmdName + \ contains=@vimContinue,vimUserCmdAttr,vimUserCmdAttrError + \ transparent +syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)" +syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr +syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrComplete,vimUserCmdError +syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber +syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs +syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey +syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange +syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey - syn match vim9ConstructorDefName contained "\<_\=new\w*\>" - \ nextgroup=vim9ConstructorDefParams,vim9ConstuctorDefTypeParams - \ contains=@vim9MethodName - syn match vim9ConstructorDefParam contained "\<\%(this\.\)\=\h\w*\>" - \ skipwhite nextgroup=vimParamType,vimFunctionParamEquals - \ contains=vim9This,vimOper - syn region vim9ConstructorDefParams contained - \ matchgroup=Delimiter start="(" end=")" - \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError - \ contains=vim9ConstructorDefParam,vim9Comment,vimFunctionParamEquals - syn region vim9ConstuctorDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vim9ConstructorDefParams - \ contains=vim9DefTypeParam +syn match vimUserCmdAttrNargs contained "[01*?+]" +syn match vimUserCmdAttrRange contained "%" - syn region vim9MethodDefReturnType contained - \ start=")\@1<=:\%(\s\|\n\)\@=" - \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + - \ end="$" - \ matchgroup=vim9Comment - \ end="\ze#" - \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError - \ contains=@vim9Continue,vimType,vimTypeSep - \ transparent +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror") + syn match vimUserCmdError contained "\S\+\>" +endif - syn region vim9MethodDefComment contained - \ start="#.*" - \ skip=+\n\s*\%(\\\|#\\ \)+ - \ end="$" - \ skipwhite skipempty nextgroup=vim9MethodDefBody,vimEnddef +syn case ignore +syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister] - syn region vim9MethodDefBody contained - \ start="^.\=" matchgroup=vimCommand end="\" - \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError - \ contains=@vim9MethodDefBodyList +" GEN_SYN_VIM: vimUserCmdAttrComplete, START_STR='syn keyword vimUserCmdAttrComplete contained', END_STR='' +syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype filetypecmd function help highlight history keymap locale mapclear mapping menu messages option packadd retab runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var +syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var +syn keyword vimUserCmdAttrComplete contained custom customlist nextgroup=vimUserCmdAttrCompleteFunc,vimUserCmdError +syn match vimUserCmdAttrCompleteFunc contained ",\%([bwglstav]:\|<[sS][iI][dD]>\)\=\h\w*\%([.#]\h\w*\)*"hs=s+1 nextgroup=vimUserCmdError contains=vimVarScope,vimFunctionSID - syn cluster vim9MethodDefBodyList contains=@vimDefBodyList,vim9This,vim9Super +" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR='' +syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win +syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win +syn match vimUserCmdAttrAddr contained "?" +syn case match - if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") - syn match vim9MethodNameError contained "\<[a-z0-9]\i\>" - endif - syn match vim9MethodName contained "\<_\=new\w*\>" - syn keyword vim9MethodName contained empty len string +syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock,vimUserCmdReplacement +syn match vimUserCmdName contained +\<\u[[:alnum:]]*\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdBlock,vimUserCmdReplacement +syn region vimUserCmdReplacement contained + \ start="\S" + \ start=+^\s*\%(\\\|["#]\\ \)+ + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue,@vimUserCmdList,vimComFilter + \ keepend +syn region vimUserCmdBlock contained + \ matchgroup=vimSep + \ start="{" + \ end="^\s*\zs}" + \ contains=@vimDefBodyList,@vimUserCmdList - syn cluster vim9MethodName contains=vim9MethodName,vim9MethodNameError +syn keyword vimDelcommand contained delc[ommand] skipwhite nextgroup=vimDelcommandAttr,vimDelcommandName +syn match vimDelcommandAttr contained "-buffer\>" skipwhite nextgroup=vimDelcommandName +syn match vimDelcommandName contained "\<\u[[:alnum:]]*\>" - if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vim9MethodDefFold contained - \ start="\%(^\s*\%(:\=static\s\+\)\=\)\@16<=:\=def\s\+\h\w*[<(]" - \ end="^\s*:\=enddef\>" - \ contains=vim9MethodDef - \ fold keepend extend transparent - endif +" :copy (special handling for :t only) {{{3 +" ===== +" lower priority than [wtb]: Vim9 scoped variables at SOL +syn match vimCopy contained "\" nextgroup=vimBang +syn match vimCopy_ contained "t\>" nextgroup=vimBang - syn cluster vim9MethodDef contains=vim9MethodDef,vim9MethodDefFold +" :debug {{{3 +" ====== +syn keyword vimDebug contained deb[ug] skipwhite nextgroup=@vimCmdList - " Classes {{{3 - syn cluster vim9ClassBodyList contains=vim9Abstract,vim9Class,vim9Comment,vim9LineComment,@vim9Continue,@vimExprList,vim9Extends,vim9Implements,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Super,vim9Var +" :debuggreedy {{{3 +" ============ +syn keyword vimDebuggreedy contained debugg[reedy] +syn match vimDebuggreedy_ contained "debugg\%[reedy]\>" - syn match vim9Class contained "\" skipwhite nextgroup=vim9ClassName - syn match vim9ClassName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends,vim9Implements - syn match vim9SuperClass contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Implements - syn match vim9ImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9InterfaceListComma,vim9Extends - syn match vim9InterfaceListComma contained "," skipwhite skipnl nextgroup=vim9ImplementedInterface - syn keyword vim9Abstract abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef - syn keyword vim9Extends contained extends skipwhite skipnl nextgroup=vim9SuperClass - syn keyword vim9Implements contained implements skipwhite skipnl nextgroup=vim9ImplementedInterface - syn keyword vim9Public contained public - syn keyword vim9Static contained static - " FIXME: don't match as dictionary keys, remove when operators are not - " shared between Vim9 and legacy script - syn match vim9This contained "\.\@1:\@!" - " super must be followed by '.' - syn match vim9Super contained "\.\@1" matchgroup=vimCommand end="\" contains=@vim9ClassBodyList transparent +" :delete {{{3 +" ======= +" TODO: handle Vim9 +syn keyword vimDelete contained d[elete] skipwhite nextgroup=vimDeleteRegister,vimDeleteCount,vimPrintFlag +syn match vimDelete_ contained "d\%[elete]\>" skipwhite nextgroup=vimDeleteRegister,vimDeleteCount,vimPrintFlag - " Enums {{{3 - syn cluster vim9EnumBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Enum,@vimExprList,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Var +syn match vimDelete contained "\\|#\)" nextgroup=vimPrintFlag +syn match vimDelete_ contained "d\%[elete]\ze\%([lp]\+\>\|#\)" nextgroup=vimPrintFlag +" :del is :delete only, not :delete | :list +syn match vimDelete contained "\" +syn match vimDelete_ contained "del\>" - syn match vim9Enum contained "\" skipwhite nextgroup=vim9EnumName +syn match vimDelete contained "\\)" nextgroup=vimDeleteRegister,vimDeleteCount +syn match vimDelete_ contained "d\%[elete]\ze\%(_\|\d\+\>\)" nextgroup=vimDeleteRegister,vimDeleteCount - syn match vim9EnumName contained "\<\u\w*\>" skipwhite skipempty nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements - syn match vim9EnumNameTrailing contained "\S.*" - syn region vim9EnumNameComment contained - \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" - \ skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue - \ contains=@vimCommentGroup,vimCommentString - " vim9EnumName's "skipempty" should only apply to comments and enum values and not implements clauses - syn match vim9EnumNameEmpty contained "^" skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue - " allow line continuation between enum name and "implements" - syn match vim9EnumNameContinue contained - \ "^\s*\\" - \ skipwhite skipnl nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements - \ contains=vimWhitespace - syn match vim9EnumNameContinueComment contained - \ "^\s*#\\ .*" - \ skipwhite skipnl nextgroup=vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue - \ contains=vimWhitespace - syn cluster vim9EnumNameContinue contains=vim9EnumNameContinue,vim9EnumNameContinueComment +syn match vimDeleteRegister contained +[-*+_]\|\\"+ skipwhite nextgroup=vimDeleteCount,vimPrintFlag +syn match vimDeleteRegister contained +\<\a+ skipwhite nextgroup=vimDeleteCount,vimPrintFlag - " enforce enum value list location - syn match vim9EnumValue contained "\<\a\w*\>" nextgroup=vim9EnumValueTypeArgs,vim9EnumValueArgList,vim9EnumValueListComma,vim9Comment - syn match vim9EnumValueListComma contained "," skipwhite skipempty nextgroup=vim9EnumValue,vim9EnumValueListCommaComment - syn region vim9EnumValueListCommaComment contained - \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" - \ skipwhite skipempty nextgroup=vim9EnumValueListCommaComment,vim9EnumValue - \ contains=@vimCommentGroup,vimCommentString - syn region vim9EnumValueTypeArgs contained - \ matchgroup=Delimiter - \ start="<\ze\a" - \ end=">" - \ nextgroup=vim9EnumValueArgList - \ contains=@vimType - \ oneline - syn region vim9EnumValueArgList contained - \ matchgroup=vimParenSep start="(" end=")" - \ nextgroup=vim9EnumValueListComma - \ contains=@vimExprList,vimContinueString,vim9Comment +syn match vimDeleteCount contained "\d\+" skipwhite nextgroup=vimPrintFlag - syn keyword vim9EnumImplements contained implements skipwhite nextgroup=vim9EnumImplementedInterface - syn match vim9EnumImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9EnumInterfaceListComma,vim9EnumImplementedInterfaceComment,vim9EnumValue - syn match vim9EnumInterfaceListComma contained "," skipwhite nextgroup=vim9EnumImplementedInterface - syn region vim9EnumImplementedInterfaceComment contained - \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" - \ skipwhite skipempty nextgroup=vim9EnumImplementedInterfaceComment,vim9EnumValue - \ contains=@vimCommentGroup,vimCommentString +" :echo, :execute {{{3 +" =============== +" NOTE: No trailing legacy script comments - VimFolde syn region vim9EnumBody start="\" matchgroup=vimCommand end="\" contains=@vim9EnumBodyList transparent +syn region vimEcho contained + \ matchgroup=vimCommand + \ start="\" + \ start="\" + \ start="\" + \ start="\" + \ start="\" + "\ TODO: default to \ + \ start="\" + \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ excludenl end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimExprList,vim9Comment + \ transparent - " Interfaces {{{3 - " TODO: limit to decl only - no init values - syn cluster vim9InterfaceBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Extends,vim9Interface,vim9AbstractDef,vim9Var +syn match vimEchohl contained "\" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchohlNone +syn case ignore +syn keyword vimEchohlNone contained none +syn case match - syn match vim9Interface contained "\" skipwhite nextgroup=vim9InterfaceName - syn match vim9InterfaceName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends +syn cluster vimEcho contains=vimEcho,vimEchohl - syn keyword vim9AbstractDef contained def skipwhite nextgroup=vim9AbstractDefName - syn match vim9AbstractDefName contained "\<\h\w*\>" skipwhite nextgroup=vim9AbstractDefParams,vim9AbstractDefTypeParams contains=@vim9MethodName - syn region vim9AbstractDefParams contained - \ matchgroup=Delimiter start="(" end=")" - \ skipwhite skipnl nextgroup=vimDefComment,vim9AbstractDefReturnType,vimCommentError - \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals - syn region vim9AbstractDefReturnType contained - \ start=")\@1<=:\s" end="$" matchgroup=vim9Comment end="\ze[#"]" - \ skipwhite skipnl nextgroup=vimDefComment,vimCommentError - \ contains=vimTypeSep - \ transparent - syn region vim9AbstractDefTypeParams contained - \ matchgroup=Delimiter - \ start="<" - \ end=">" - \ nextgroup=vim9AbstractDefParams - \ contains=vim9DefTypeParam - - VimFoldi syn region vim9InterfaceBody start="\" matchgroup=vimCommand end="\" contains=@vim9InterfaceBodyList transparent - - " Type Aliases {{{3 - syn match vim9Type "\" skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError - syn match vim9TypeAlias contained "\<\u\w*\>" skipwhite nextgroup=vim9TypeEquals - syn match vim9TypeEquals contained "=" skipwhite nextgroup=@vimType - if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_notypealiaserror") - syn match vim9TypeAliasError contained "\<\l\w*\>" skipwhite nextgroup=vim9TypeEquals - endif -endif +syn region vimExecute contained + \ matchgroup=vimCommand + \ start="\" + \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ excludenl end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimExprList,vim9Comment + \ transparent -" Blocks: {{{2 -" ====== -Vim9 syn region vim9Block - \ matchgroup=vimSep - \ start="{\ze\s*\%($\|[#|]\)" - \ end="^\s*\zs}" - \ skipwhite nextgroup=vim9Comment,vimCmdSep - \ contains=@vimDefBodyList +syn region vimEval contained + \ matchgroup=vimCommand + \ start="\" + \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ excludenl end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimExprList,vim9Comment,vimComment + \ transparent -" Keymaps: {{{2 +" :filter {{{3 " ======= +syn keyword vimExFilter contained filt[er] skipwhite nextgroup=vimExFilterBang,vimExFilterPattern +syn region vimExFilterPattern contained + \ start="[[:ident:]]" + \ end="\ze[[:space:]\n]" + \ skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + \ contains=@vimSubstList + \ oneline +syn region vimExFilterPattern contained + \ matchgroup=Delimiter + \ start="\z([^[:space:][:ident:]|"]\)" + \ skip="\\\\\|\\\z1" + \ end="\z1" + \ skipwhite skipnl nextgroup=@vimCommandModifierContinue,vimCmdStart,@vimRange,@vimCmdList,@vim9Lhs,@vim9Func + \ contains=@vimSubstList + \ oneline +syn match vimExFilterBang contained "\a\@1<=!" skipwhite nextgroup=vimExFilterPattern -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 +" :catch, :throw {{{3 +" ============== +syn keyword vimThrow contained th[row] skipwhite nextgroup=@vimExprList +syn keyword vimCatch contained cat[ch] skipwhite nextgroup=vimCatchPattern +syn region vimCatchPattern contained matchgroup=Delimiter start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" skip="\\\\\|\\\z1" end="\z1" contains=@vimSubstList oneline -" TODO: remove when :" comment is matched in parts as "ex-colon comment" --djk +" :export {{{3 +" ======= if s:vim9script - syn match vim9KeymapLineComment "#.*" contained contains=@vimCommentGroup,vimCommentString,vim9CommentTitle -else - syn match vimKeymapLineComment +".*+ contained contains=@vimCommentGroup,vimCommentString,vimCommentTitle + syn keyword vim9Export export skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vimDef,vimDefFold,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var endif -syn cluster vimKeymapLineComment contains=vim9\=KeymapLineComment - -syn region vimLoadkeymap matchgroup=vimCommand start="\" end="\%$" contains=vimKeymapStart - -" Special Filenames, Modifiers, Extension Removal: {{{2 -" =============================================== -syn match vimSpecFile "" 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 - -syn match vimSpecFile contained "%[ \t:]"me=e-1 nextgroup=vimSpecFileMod -syn match vimSpecFile contained excludenl "%$" nextgroup=vimSpecFileMod -syn match vimSpecFile contained "%<"me=e-1 nextgroup=vimSpecFileMod - -" User-Specified Commands: {{{2 -" ======================= -syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,@vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange -syn match vimUserCmd "\!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang -syn match vimUserCmd +\!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang +" :filetype {{{3 +" ========= +syn match vimFiletype contained "\" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrComplete,vimUserCmdError -syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber -syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs -syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange -syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey -syn match vimUserCmdAttrNargs contained "[01*?+]" -syn match vimUserCmdAttrRange contained "%" +syn match vim9ForInComment contained "#.*" skipwhite skipempty nextgroup=vim9ForInComment,@vimExprList -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror") - syn match vimUserCmdError contained "\S\+\>" -endif +syn match vimForInContinue contained "^\s*\zs\\" skipwhite skipnl nextgroup=@vimForInContinue,@vimExprList contains=vimLeadingWhitespace +syn match vimForInContinueComment contained '^\s*\zs["#]\\ .*' skipwhite skipnl nextgroup=@vimForInContinue,@vimExprList contains=vimLeadingWhitespace +syn cluster vimForInContinue contains=vimForInContinue,vimForInContinueComment -syn case ignore -syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister] +" :global, :vglobal {{{3 +" ================= +" TODO: [:.-] should only be removed for Vim9 +" : docs state ! is not allowed as a pattern delimiter but it works +syn region vimGlobalPattern contained + \ matchgroup=Delimiter + \ start=+\z([^[:space:][:alnum:]\\"|:.-]\)+ + \ skip="\\." + \ end="\z1" + \ skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList + \ contains=@vimSubstList +syn match vimGlobal contained "g\%[lobal]\>!\=[:.-]\@!" skipwhite nextgroup=vimGlobalPattern contains=vimBang +syn match vimGlobal contained "v\%[global]\>!\=[:.-]\@!" skipwhite nextgroup=vimGlobalPattern contains=vimBang -" GEN_SYN_VIM: vimUserCmdAttrComplete, START_STR='syn keyword vimUserCmdAttrComplete contained', END_STR='' -syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype filetypecmd function help highlight history keymap locale mapclear mapping menu messages option packadd retab runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var -syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var -syn keyword vimUserCmdAttrComplete contained custom customlist nextgroup=vimUserCmdAttrCompleteFunc,vimUserCmdError -syn match vimUserCmdAttrCompleteFunc contained ",\%([bwglstav]:\|<[sS][iI][dD]>\)\=\h\w*\%([.#]\h\w*\)*"hs=s+1 nextgroup=vimUserCmdError contains=vimVarScope,vimFunctionSID +" :grep, :make {{{3 +" ============ +" | is the command separator, escaped with \| all other backslashes are passed through literally, no tail comments +syn keyword vimGrep contained gr[ep] lgr[ep] skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn match vimGrep_ contained "l\=gr\%[ep]\>" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn keyword vimGrepadd contained grepa[dd] lgrepa[dd] skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn match vimGrepadd_ contained "l\=grepa\%[dd]\>" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep +syn region vimGrepArgs contained + \ start="|\@!\S" + \ skip=+\n\s*\%(\\\|[#"]\\ \)+ + \ end="\ze|" + \ end="$" + "\ TODO: include vimSpecFile + \ nextgroup=vimCmdSep + \ contains=vimGrepBarEscape +syn match vimGrepBarEscape contained "\\|" +syn match vimGrepBang contained "\a\@1<=!" skipwhite nextgroup=vimGrepArgs,vimCmdSep -" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR='' -syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win -syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win -syn match vimUserCmdAttrAddr contained "?" -syn case match +syn keyword vimMake contained mak[e] lmak[e] skipwhite nextgroup=vimMakeBang,vimMakeArgs,vimCmdSep +syn region vimMakeArgs contained + \ start="|\@!\S" + \ skip=+\n\s*\%(\\\|[#"]\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + "\ TODO: include vimSpecFile + \ contains=vimMakeBarEscape +syn match vimMakeBarEscape contained "\\|" +syn match vimMakeBang contained "\a\@1<=!" skipwhite nextgroup=vimMakeArgs,vimCmdSep -syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock,vimUserCmdReplacement -syn match vimUserCmdName contained +\<\u[[:alnum:]]*\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdBlock,vimUserCmdReplacement -syn region vimUserCmdReplacement contained +" :help, :helpgrep, :lhelpgrep {{{3 +" ============================ +syn keyword vimHelp contained h[elp] skipwhite nextgroup=vimHelpBang,vimHelpArg,vimHelpEndCommand +" TODO: match wildcards, ignoring exceptions? +syn region vimHelpArg contained \ start="\S" - \ start=+^\s*\%(\\\|["#]\\ \)+ - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - \ end="$" - \ contains=@vimContinue,@vimUserCmdList,vimComFilter - \ keepend -syn region vimUserCmdBlock contained - \ matchgroup=vimSep - \ start="{" - \ end="^\s*\zs}" - \ contains=@vimDefBodyList,@vimUserCmdList + \ matchgroup=Special + \ end="\%(@\a\a\)\=\ze\s*\%($\|\%x0d\|\%x00\||[^|]\)" + \ skipwhite nextgroup=vimHelpEndCommand + \ oneline +syn match vimHelpBang contained "\a\@1<=!" skipwhite nextgroup=vimHelpArg,vimHelpEndCommand +syn match vimHelpEndCommand contained "\ze|[^|]" skipwhite nextgroup=vimCmdSep +syn match vimHelpEndCommand contained "\%x0d\|\%x00" skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList,vimFunc,vim9Block,@vim9Lhs -syn match vimDelcommand "\" skipwhite nextgroup=vimDelcommandAttr,vimDelcommandName -syn match vimDelcommandAttr contained "-buffer\>" skipwhite nextgroup=vimDelcommandName -syn match vimDelcommandName contained "\<\u[[:alnum:]]*\>" +syn keyword vimHelpgrep contained helpg[rep] lh[elpgrep] skipwhite nextgroup=vimHelpgrepPattern +syn region vimHelpgrepPattern contained + \ start="\S" + \ matchgroup=Special + \ end="@\a\a\>" + \ end="$" + \ contains=@vimSubstList + \ oneline -" Lower Priority Comments: after some vim commands... {{{2 -" ======================= -if get(g:, "vimsyn_comment_strings", 1) - syn region vimCommentString contained oneline start='\S\s\+"'ms=e end='"' extend +" :highlight {{{3 +" ========== +syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,@vimComment +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror") + syn match vimHiCtermError contained "\D\i*" endif +syn keyword vimHighlight contained hi[ghlight] skipwhite nextgroup=vimHiBang,@vimHighlightCluster +syn match vimHiBang contained "\a\@1<=!" skipwhite nextgroup=@vimHighlightCluster -if s:vim9script - syn cluster vimComment contains=vim9Comment -else - syn cluster vimComment contains=vimComment -endif +syn case ignore +" Conceal is a generated low-priority match +syn match vimHiGroup contained "\%(\\)\@!\i\+" +syn keyword vimHiNone contained NONE +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 "\" +syn case match -VimL syn region vimComment +syn match vimHiFontname contained "[a-zA-Z\-*]\+" +syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'" +syn match vimHiGuiRgb contained "#\x\{6}" + +" :highlight {group} {key}={arg} ... {{{3 +syn cluster vimHiCluster contains=vimGroup,vimHLGroup,vimHiGroup,vimHiNone,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiCtermfont,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation,vimComment,vim9Comment +syn region vimHiKeyList contained + \ start="\i\+" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" \ excludenl - \ start=+"+ - \ skip=+\n\s*\%(\\\|"\\ \)+ \ end="$" - \ contains=@vimCommentGroup,vimCommentString - \ extend -Vim9 syn region vim9Comment + \ nextgroup=vimCmdSep + \ 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 {{{3 +syn keyword vimHiClear contained clear skipwhite nextgroup=vimGroup,vimHLGroup,vimHiGroup + +" :highlight link {{{3 +" see tst24 (hi def vs hi) (Jul 06, 2018) +"syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\\|\\)" end="$" contains=vimHiGroup,vimGroup,vimHLGroup,vimNotation +" TODO: simplify and allow line continuations --djk +syn region vimHiLink contained + \ matchgroup=Type + \ start="\%(\\|\\)" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" \ excludenl - \ start="\%#=1\s\@1<=#\%({\@!\|{{\)" - \ skip="\n\s*\%(\\\|#\\ \)" \ end="$" - \ contains=@vimCommentGroup,vimCommentString - \ extend + \ nextgroup=vimCmdSep + \ contains=@vimContinue,@vimHiCluster -syn match vim9CommentError contained "#.*" -syn match vimCommentError contained +".*+ +" :history {{{3 +" ======== +" TODO: handle Vim9 "history" variable assignment (like `:wincmd =`, but a common variable name) +syn keyword vimHistory contained his[tory] skipwhite nextgroup=vimHistoryName,vimHistoryRange,vimCmdSep,vimComment,vim9Comment +syn keyword vimHistoryName contained c[md] s[earch] e[xpr] i[nput] d[ebug] a[ll] skipwhite nextgroup=vimHistoryRange,vimCmdSep,vimComment,vim9Comment +syn match vimHistoryName contained "[:/?=@>]" skipwhite nextgroup=vimHistoryRange,vimCmdSep,vimComment,vim9Comment +syn match vimHistoryRange contained "-\=\<\d\+\>\%(\s*,\)\=" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment +syn match vimHistoryRange contained ",\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment +syn match vimHistoryRange contained "-\=\<\d\+\s*,\s*-\=\d\+\>" skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -" Environment Variables: {{{2 -" ===================== -syn match vimEnvvar "\$\I\i*" -syn match vimEnvvar "\${\I\i*}" +" :if, :else, :elseif, :endif {{{3 +" =========================== +syn keyword vimIf contained if skipwhite nextgroup=@vimExprList,vimNotation +syn keyword vimElseif contained elsei[f] skipwhite nextgroup=@vimExprList,vimNotation +syn keyword vimElse contained el[se] skipwhite nextgroup=vimComment,vim9Comment +syn keyword vimEndif contained en[dif] skipwhite nextgroup=vimComment,vim9Comment -" Strings {{{2 +" :import {{{3 " ======= +syn keyword vimImportAutoload contained autoload skipwhite nextgroup=vimImportFilename +if s:vim9script + syn region vimImportFilename contained + \ start="\S" + \ skip=+\%#=1 + "\ continuation operators at SOL + \\n\%(\s*#.*\n\)*\s*\%([[:punct:]]\+\&[^#"'(]\) + \\| + "\ continuation operators at EOL + \\%(\%([[:punct:]]\+\&[^#"')]\)\s*\%(#.*\)\=\)\@<=$ + \\| + \\n\%(\s*#.*\n\)*\s*as\s + \\| + \\%(^\s*#.*\)\@<=$ + \\| + \\n\s*\%(\\\|#\\ \) + \+ + \ matchgroup=vimCommand + \ end="\s\+\zsas\ze\s\+\h" + \ matchgroup=NONE + \ end="$" + \ skipwhite nextgroup=vimImportName + \ contains=@vim9Continue,@vimExprList,vim9Comment + \ transparent +else + syn region vimImportFilename contained + \ start="\S" + \ skip=+\n\s*\%(\\\|"\\ \)+ + \ matchgroup=vimCommand + \ end="\s\+\zsas\ze\s\+\h" + \ matchgroup=NONE + \ end="$" + \ skipwhite nextgroup=vimImportName + \ contains=@vimContinue,@vimExprList + \ transparent +endif +syn match vimImportName contained "\%(\" skipwhite nextgroup=@vimComment +syn keyword vimImport contained imp[ort] skipwhite nextgroup=vimImportAutoload,vimImportFilename -" In-String Specials: -" 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 matchgroup=vimString start=+[^a-zA-Z\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringGroup extend -syn region vimString oneline matchgroup=vimString start=+[^a-zA-Z\\@]'+lc=1 end=+'+ nextgroup=vimSubscriptBrackets contains=vimQuoteEscape extend -"syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup " see tst45.vim - -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 match vimQuoteEscape contained "''" +" :language {{{3 +" ========= +syn keyword vimLanguage contained lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimSep,vimComment,vim9Comment +syn keyword vimLanguageCategory contained col[late] cty[pe] mes[sages] tim[e] skipwhite nextgroup=@vimLanguageName -syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape extend -syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup extend -syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList -syn match vimStringInterpolationBrace contained "{{" -syn match vimStringInterpolationBrace contained "}}" -syn cluster vimStringInterpolation contains=vimStringInterpolationExpr,vimStringInterpolationBrace +" [language[_territory][.codeset][@modifier]] and the reserved "C" and "POSIX" +syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimSep,vimComment,vim9Comment +syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimSep,vimComment,vim9Comment +syn cluster vimLanguageName contains=vimLanguageName,vimLanguageNameReserved -syn region vimContinueString contained matchgroup=vimContinueString start=+"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,@vimStringGroup -syn region vimContinueString contained matchgroup=vimContinueString start=+'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,vimQuoteEscape -syn region vimContinueString contained matchgroup=vimContinueString start=+$"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,@vimStringInterpolation,@vimStringGroup -syn region vimContinueString contained matchgroup=vimContinueString start=+$'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment contains=@vimContinue,@vimStringInterpolation,vimQuoteEscape +" :loadkeymap {{{3 +" =========== -" 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]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount -syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat -syn match vimSubst "^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount -syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount -syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat -syn match vimSubst1 contained "\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount -syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags -" & and # after :s are always pattern delimiters not flags -syn match vimSubstFlags contained "[&cegiIlnpr#]\+" skipwhite nextgroup=vimSubstCount -syn match vimSubstCount contained "\d\+\>" -" 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="\\\@" skipwhite nextgroup=vimLockvarVars +syn region vimLockvarVars contained + \ start="\h" skip=+\n\s*\%(\\\|"\\ \)\|^\s*"\\ + end="$" end="\ze[|"]" + \ nextgroup=vimCmdSep,vimComment + \ contains=@vimContinue,vimVar -" Mark: {{{2 +" :map {{{3 " ==== -VimL syn match vimExMark "\\|[[\]<>'`]\)\@=" nextgroup=@vimMarkArg -VimL syn match vimExMark "\" skipwhite nextgroup=@vimMarkArg -syn match vimExMark "\" skipwhite nextgroup=@vimMarkArg +" GEN_SYN_VIM: vimCommand map, START_STR='syn keyword vimMap contained', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs' +syn keyword vimMap contained cm[ap] cno[remap] im[ap] ino[remap] lm[ap] ln[oremap] nm[ap] nn[oremap] om[ap] ono[remap] smap snor[emap] tma[p] tno[remap] vm[ap] vn[oremap] xm[ap] xn[oremap] skipwhite nextgroup=vimMapMod,vimMapLhs +syn match vimMap contained "\" skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs +syn keyword vimMap contained no[remap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs +" GEN_SYN_VIM: vimCommand mapclear, START_STR='syn keyword vimMap contained', END_STR='skipwhite nextgroup=vimMapMod' +syn keyword vimMap contained cmapc[lear] imapc[lear] lmapc[lear] nmapc[lear] omapc[lear] smapc[lear] tmapc[lear] vmapc[lear] xmapc[lear] skipwhite nextgroup=vimMapMod +syn keyword vimMap contained mapc[lear] skipwhite nextgroup=vimMapBang,vimMapMod +" GEN_SYN_VIM: vimCommand unmap, START_STR='syn keyword vimUnmap contained', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs' +syn keyword vimUnmap contained cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] sunm[ap] tunma[p] vu[nmap] xu[nmap] skipwhite nextgroup=vimMapMod,vimMapLhs +syn keyword vimUnmap contained unm[ap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs + +syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite nextgroup=vimMapRhs +syn match vimMapLhs contained +\%(.\|\S\)\+\ze\s*\n\s*\%(\\\|["#]\\ \)+ contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite skipnl nextgroup=vimMapRhsContinue + +syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs +syn match vimMapMod contained "\%#=1<\%(buffer\|expr\|nowait\|script\|silent\|special\|unique\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs +syn region vimMapRhs contained + \ start="\S" + \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader +syn region vimMapRhsContinue contained + \ start=+^\s*\%(\\\|["#]\\ \)+ + \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader +syn match vimMapLeader contained "\%#=1\c<\%(local\)\=leader>" contains=vimMapLeaderKey +syn keyword vimMapModKey contained buffer expr nowait script silent special unique +syn case ignore +syn keyword vimMapLeaderKey contained leader localleader +syn case match + +" :mark {{{3 +" ===== +VimL syn match vimMark contained "\\|[[\]<>'`]\)\@=" nextgroup=@vimMarkArg +VimL syn match vimMark_ contained "k\%([a-zA-Z0-9]\>\|[[\]<>'`]\)\@=" nextgroup=@vimMarkArg +VimL syn keyword vimMark contained k skipwhite nextgroup=@vimMarkArg +VimL syn match vimMark_ contained "k\>" skipwhite nextgroup=@vimMarkArg +syn keyword vimMark contained ma[rk] skipwhite nextgroup=@vimMarkArg +syn match vimMark_ contained "ma\%[rk]\>" skipwhite nextgroup=@vimMarkArg syn match vimMarkArg contained "[a-zA-Z]\>\|[[\]<>'`]" skipwhite nextgroup=vimCmdSep,vimComment syn match vimMarkArgError contained "["^.(){}0-9]" syn cluster vimMarkArg contains=vimMarkArg,vimMarkArgError -" Marks, Registers, Addresses, Filters: {{{2 -syn match vimMark "'[a-zA-Z0-9]\ze\s*$" -syn match vimMark "'[[\]{}()<>'`"^.]\ze\s*$" -syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1 -syn match vimMark "'[[\]{}()<>'`"^.]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1 -syn match vimMark ",\zs'[[\]{}()<>'`"^.]" nextgroup=vimFilter,vimMarkNumber,vimSubst1 -syn match vimMark "[!,:]\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 '@"' -syn match vimLetRegister contained '@["@0-9\-a-zA-Z:.%#=*+~_/]' +" :match {{{3 +" ====== +syn keyword vimMatch contained mat[ch] skipwhite nextgroup=vimMatchGroup,vimMatchNone +syn match vimMatch_ contained "mat\%[ch]\>" skipwhite nextgroup=vimMatchGroup,vimMatchNone -syn match vimAddress ",\zs[.$]" skipwhite nextgroup=vimSubst1 -syn match vimAddress "%\ze\a" skipwhite nextgroup=vimString,vimSubst1 +" conflicts with :match +" syn keyword vimMatch contained mat[ch] skipwhite nextgroup=vimMatchGroup,vimMatchNone +syn match vimMatchGroup contained "[[:alnum:]._-]\+" skipwhite nextgroup=vimMatchPattern +syn case ignore +syn keyword vimMatchNone contained none +syn case match +syn region vimMatchPattern contained + \ matchgroup=Delimiter + \ start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" + \ skip="\\\\\|\\\z1" + \ end="\z1" + \ contains=@vimSubstList + \ oneline -syn match vimFilter "^!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile -syn match vimFilter contained "!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile -syn match vimComFilter contained "|!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile +" :menu {{{3 +" ===== +" NOTE: tail comments disallowed +" GEN_SYN_VIM: vimCommand menu, START_STR='syn keyword vimMenu contained', END_STR='skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus' +syn keyword vimMenu contained 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 match vimMenu_ contained "a\%(m\%[enu]\|n\%[oremenu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "c\%(me\%[nu]\|noreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "i\%(me\%[nu]\|noreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "me\%[nu]\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "n\%(me\%[nu]\|noreme\%[nu]\|oreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "o\%(me\%[nu]\|noreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "s\%(me\%[nu]\|noreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "t\%(lm\%[enu]\|ln\%[oremenu]\|m\%[enu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "v\%(me\%[nu]\|noreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn match vimMenu_ contained "x\%(me\%[nu]\|noreme\%[nu]\)\>" skipwhite nextgroup=vimMenuBang,vimMenuMod,vimMenuName,vimMenuPriority,vimMenuStatus +syn keyword vimMenu contained popu[p] skipwhite nextgroup=vimMenuBang,vimMenuName +syn region vimMenuRhs contained + \ start="|\@!\S" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ end="\ze|" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimNotation +syn region vimMenuRhsContinue contained + \ start=+^\s*\%(\\\|"\\ \)+ + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ end="\ze|" + \ nextgroup=vimCmdSep + \ contains=@vimContinue,vimNotation +syn match vimMenuName "\.\@!\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation skipwhite nextgroup=vimCmdSep,vimMenuRhs +syn match vimMenuName +\.\@!\%(\\\s\|\S\)\+\ze\s*\n\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 -" Complex Repeats: (:h complex-repeat) {{{2 -" =============== -syn match vimCmplxRepeat '[^a-zA-Z_/\\()]q[0-9a-zA-Z"]\>'lc=1 +syn region vimMenutranslate contained + \ matchgroup=vimCommand + \ start="\" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ end="\ze|" + \ matchgroup=vimMenuClear + \ end="\!\=" skipwhite nextgroup=vimNormalArg contains=vimBang +syn match vimNormal contained "norm\%[al]\>!\=" skipwhite nextgroup=vimNormalArg contains=vimBang +syn region vimNormalArg contained + \ start="\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue + +" :packadd {{{3 +" ======== +syn keyword vimPackadd contained pa[ckadd] skipwhite nextgroup=vimPackaddBang,vimPackaddArg,vimComment,vim9Comment,vimCmdSep +syn region vimPackaddArg contained + \ start=+["#|]\@!\S+ + \ end="\ze\s*$" + \ end=+\ze\s*\\\@1>\=" skipwhite nextgroup=vimRedirFile +syn region vimRedirFile contained + \ start="\S" + \ matchgroup=Normal + \ end="\s*$" + \ end="\s*\ze[|"]" + \ nextgroup=vimCmdSep,vimComment + \ contains=vimSpecFile +syn match vimRedirRegisterOperator contained ">>\=" +syn match vimRedirRegister contained "@[a-zA-Z*+"]" nextgroup=vimRedirRegisterOperator +syn match vimRedirVariableOperator contained "=>>\=" skipwhite nextgroup=vimVar +syn keyword vimRedirEnd contained END + +" :return {{{3 +" ======= +syn keyword vimReturn contained ret[urn] skipwhite nextgroup=@vimExprList,vimNotation + +" :runtime {{{3 +" ======== +syn keyword vimRuntime contained ru[ntime] skipwhite nextgroup=vimRuntimeBang,vimRuntimeWhere,vimRuntimeArgs +syn keyword vimRuntimeWhere contained + \ START OPT PACK ALL + \ skipwhite nextgroup=vimRuntimeArgs +syn region vimRuntimeArgs contained + \ start=+["#|]\@!\S+ + \ skip=+\s*\n\s*\%(\\\|["#]\\ \)\|^\s*["#]\\ + + \ end="\ze\s*$" + \ end=+\ze\s*\\\@1" skipwhite nextgroup=vimSetBang,vimCmdSep,vimComment,vimSetArgs +" :set {{{3 +" ==== +syn keyword vimSet contained setl[ocal] setg[lobal] se[t] skipwhite nextgroup=vimSetBang,vimCmdSep,vimComment,vimSetArgs syn region vimSetComment contained start=+"+ skip=+\n\s*\%(\\\||"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString extend -syn match vimSetCmdSep contained "|" skipwhite nextgroup=@vimCmdList,vimSubst1,@vimFunc +syn match vimSetCmdSep contained "|" skipwhite nextgroup=@vimCmdList,@vimFunc syn match vimSetEscape contained "\\\%(\\[|"]\|.\)" syn match vimSetBarEscape contained "\\|" syn match vimSetQuoteEscape contained +\\"+ @@ -1215,338 +1369,325 @@ syn keyword vimSetTermcap contained termcap syn match vimSetSep contained "[,:]" syn match vimSetMod contained "\a\@1<=\%(&vim\=\|[!&?<]\)" -" Variable Declarations: {{{2 -" ===================== -VimL syn keyword vimLet let skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar -VimL syn keyword vimConst cons[t] skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar -syn region vimVarList contained - \ start="\[" end="]" - \ skipwhite nextgroup=vimLetHeredoc - \ contains=@vimContinue,@vimSpecialVar,vimVar -syn match vimLetVar contained "\<\%([bwglstav]:\)\=\h[a-zA-Z0-9#_]*\>\ze\%(\[.*]\)\=\s*=<<" skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc contains=vimVarScope,vimSubscriptBrackets -hi link vimLetVar vimVar -syn region vimLetVarSubscript contained - \ matchgroup=vimSubscriptBracket - \ start="\S\@1<=\[" - \ end="]" - \ skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc - \ contains=@vimExprList +" :sleep {{{3 +" ====== +syn keyword vimSleep contained sl[eep] skipwhite nextgroup=vimSleepBang,vimSleepArg +syn match vimSleep_ contained "sl\%[eep]\>" skipwhite nextgroup=vimSleepBang,vimSleepArg +syn match vimSleepBang contained "\a\@1<=!" skipwhite nextgroup=vimSleepArg +syn match vimSleepArg contained "\<\%(\d\+\)\=m\=\>" -syn keyword vimUnlet unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars -syn match vimUnletBang contained "\a\@1<=!" skipwhite nextgroup=vimUnletVars -syn region vimUnletVars contained - \ start="$\I\|\h" skip=+\n\s*\%(\\\|["#]\\ \)\|^\s*["#]\\ + end="$" end=+\ze\s*[|"#]+ - \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment - \ contains=@vimContinue,vimEnvvar,vimVar,vimVimVar +" :sort {{{3 +" ===== +syn keyword vimSort contained sor[t] skipwhite nextgroup=vimSortBang,@vimSortOptions,vimSortPattern,vimCmdSep +syn match vimSort_ contained "sort\=\>" skipwhite nextgroup=vimSortBang,@vimSortOptions,vimSortPattern,vimCmdSep +syn match vimSortBang contained "\a\@1<=!" skipwhite nextgroup=@vimSortOptions,vimSortPattern,vimCmdSep +syn match vimSortOptionsError contained "\a\+" +syn match vimSortOptions contained "\<[ilur]*[nfxob]\=[ilur]*\>" skipwhite nextgroup=vimSortPattern,vimCmdSep +syn region vimSortPattern contained + \ matchgroup=Delimiter + \ start="\z([^[:space:][:alpha:]|]\)" + \ skip="\\\\\|\\\z1" + \ end="\z1" + \ skipwhite nextgroup=@vimSortOptions,vimCmdSep + \ contains=@vimSubstList + \ oneline -" TODO: type error after register or environment variables (strings) -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop - \ end="^\z1\=\z2$" - \ extend -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="=<<\%(\s*\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop end="^\z1$" - \ extend -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop - \ end="^\z1\=\z2$" - \ contains=@vimStringInterpolation - \ extend -VimFoldh syn region vimLetHeredoc contained - \ matchgroup=vimLetHeredocStart - \ start="=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)" - \ matchgroup=vimLetHeredocStop - \ end="^\z1$" - \ contains=@vimStringInterpolation - \ extend +syn cluster vimSortOptions contains=vimSortOptions,vimSortOptionsError -Vim9 syn keyword vim9Const const skipwhite nextgroup=vim9Variable,vim9VariableList -Vim9 syn keyword vim9Final final skipwhite nextgroup=vim9Variable,vim9VariableList -Vim9 syn keyword vim9Var var skipwhite nextgroup=vim9Variable,vim9VariableList +" :substitute {{{3 +" =========== +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 contained "\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount +syn match vimSubst contained "\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat +syn match vimSubst contained "\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount +syn match vimSubst_ contained "\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>" skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount +syn match vimSubst_ contained "\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@=" skipwhite nextgroup=vimSubstPat +syn match vimSubst_ contained "\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@=" skipwhite nextgroup=vimSubstCount +syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags +" & and # after :s are always pattern delimiters not flags +syn match vimSubstFlags contained "[&cegiIlnpr#]\+" skipwhite nextgroup=vimSubstCount +syn match vimSubstCount contained "\d\+\>" +" 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="\\\@" skipwhite nextgroup=vim9VariableTypeSep,vimLetHeredoc,vimOper -syn region vim9VariableList contained start="\[" end="]" contains=@vimContinue,@vimSpecialVar,vim9Variable skipwhite nextgroup=vimLetHeredoc +" TODO: flags, unlike count, must follow immediately +syn match vimSubst contained "&&\=" skipwhite nextgroup=vimSubstFlags,vimSubstCount +syn match vimSubst contained "\~&\=" skipwhite nextgroup=vimSubstFlags,vimSubstCount -syn match vim9VariableTypeSep contained "\S\@1<=:\%(\s\|\n\)\@=" skipwhite nextgroup=@vim9VariableType -syn keyword vim9VariableType contained blob bool channel float job number string void skipwhite nextgroup=vimLetHeredoc -syn keyword vim9VariableTypeAny contained any skipwhite nextgroup=vimLetHeredoc -syn match vim9VariableTypeObject contained "\" skipwhite nextgroup=vimLetHeredoc -syn region vim9VariableCompoundType contained - \ matchgroup=vim9VariableType - \ start="\" skipwhite nextgroup=vimLetHeredoc +" two and three letter variants (matched as :s + flags, count may follow immediately) +syn match vimSubst contained "\" skipwhite nextgroup=vimLockvarVars -syn region vimLockvarVars contained - \ start="\h" skip=+\n\s*\%(\\\|"\\ \)\|^\s*"\\ + end="$" end="\ze[|"]" - \ nextgroup=vimCmdSep,vimComment - \ contains=@vimContinue,vimVar +" :syntax {{{3 +" ======= +syn region vimGroupList contained + \ start="\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + "\ need to consume the whitespace + \ end="\s"he=e-1 + \ end="$" + \ contains=@vimGroupListContinue,vimGroupSpecial,vimGroupListContinueComma +syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP +syn match vimGroupListComma contained "," +syn match vimGroupListContinueComma contained "\s\+,\s*\|,\s\+" contains=vimGroupListComma +syn match vimGroupListContinueComma contained "\s*,\s*\%(\n\s*\%(\\\s\+\|["#]\\ .*\)\)\+" contains=@vimGroupListContinue,vimGroupListComma -hi def link vimLockvar vimCommand -hi def link vimUnlockvar vimCommand -hi def link vimLockvarBang vimBang -hi def link vimLockvarDepth vimNumber +syn match vimGroupListEquals contained "=" skipwhite skipnl nextgroup=vimGroupListContinueStart,vimGroupList +" the first continuation line does not terminate the list at whitepace after \ +syn match vimGroupListContinueStart contained "^\%(\s*["#]\\ .*\n\)*\s*\\\s\+" skipwhite nextgroup=vimGroupList contains=@vimGroupListContinue transparent -" For: {{{2 -" === -" handles Vim9 and legacy for now -syn region vimFor - \ matchgroup=vimCommand - \ start="\" end="\" - \ skipwhite skipnl nextgroup=@vimForInContinue,vim9ForInComment,@vimExprList - \ contains=@vimContinue,vimVar,vimVarList,vim9Variable,vim9VariableList - \ transparent +syn match vimGroupListContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimGroupListContinue,vimGroupListContinueComma contains=vimWhitespace +syn match vimGroupListContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimGroupListContinue contains=vimWhitespace +syn cluster vimGroupListContinue contains=vimGroupListContinue,vimGroupListContinueComment -syn match vim9ForInComment contained "#.*" skipwhite skipempty nextgroup=vimForInComment,@vimExprList +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror") + syn match vimSynError contained "\i\+" +endif +syn match vimSynContains contained "\" skipwhite nextgroup=vimGroupListEquals +syn match vimSynContainedin contained "\" skipwhite nextgroup=vimGroupListEquals +syn match vimSynNextgroup contained "\" skipwhite nextgroup=vimGroupListEquals +if has("conceal") + " no whitespace allowed after '=' + syn match vimSynCchar contained "\" skipwhite nextgroup=vimGroupListEquals +syn match vimGroupRem contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimWildcardBraceComma contained "," -syn region vimWildcardBrace contained - \ matchgroup=vimWildcard - \ start="{" - \ end="}" - \ contains=vimWildcardEscape,vimWildcardBrace,vimWildcardBraceComma,vimWildcardQuestion,vimWildcardStar,vimWildcardBracket - \ oneline +" :syntax conceal {{{3 +syn match vimSynType contained "\" skipwhite nextgroup=vimSynConceal,vimSynConcealError +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynconcealerror") + syn match vimSynConcealError contained "\i\+" +endif +syn keyword vimSynConceal contained on off -syn match vimWildcardIntervalNumber contained "\d\+" -syn match vimWildcardInterval contained "\\\\\\{\d\+\%(,\d\+\)\=\\}" contains=vimWildcardIntervalNumber +" :syntax foldlevel {{{3 +syn keyword vimSynType contained foldlevel skipwhite nextgroup=vimSynFoldlevel,vimSynFoldlevelError +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynfoldlevelerror") + syn match vimSynFoldlevelError contained "\i\+" +endif +syn keyword vimSynFoldlevel contained start minimum +" :syntax iskeyword {{{3 +syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimSynIskeyword +syn keyword vimSynIskeyword contained clear +syn match vimSynIskeyword contained "\S\+" contains=vimSynIskeywordSep +syn match vimSynIskeywordSep contained "," -syn match vimWildcardBracket contained "\[\%(\^\=]\=\%(\\.\|\[\([:.=]\)[^:.=]\+\1]\|[^][:space:]]\)*\)\@>]" - \ contains=vimWildcardBracketStart,vimWildcardEscape +" :syntax include {{{3 +syn keyword vimSynType contained include skipwhite nextgroup=vimSynIncludeCluster +syn match vimSynIncludeCluster contained "@[_a-zA-Z0-9]\+\>" -syn match vimWildcardBracketCharacter contained "." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd -syn match vimWildcardBracketRightBracket contained "]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -syn match vimWildcardBracketHyphen contained "-]\@!" nextgroup=@vimWildcardBracketCharacter -syn match vimWildcardBracketEscape contained "\\." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd -syn match vimWildcardBracketCharacterClass contained "\[:[^:]\+:]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -syn match vimWildcardBracketEquivalenceClass contained "\[=[^=]\+=]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -syn match vimWildcardBracketCollatingSymbol contained "\[\.[^.]\+\.]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +" :syntax keyword {{{3 +syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynContainedin,vimSynKeyError +syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion +syn region vimSynKeyRegion contained + \ keepend + \ matchgroup=vimGroupName + \ start="\h\w*\>" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimSynKeyGroup +syn match vimSynKeyOpt contained "\%#=1\<\%(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>" +syn match vimSynKeyError contained "\" -syn match vimWildcardBracketStart contained "\[" nextgroup=vimWildcardBracketCaret,vimWildcardBracketRightBracket,@vimWildcardBracketCharacter -syn match vimWildcardBracketCaret contained "\^" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketRightBracket -syn match vimWildcardBracketEnd contained "]" -syn cluster vimWildcardBracketCharacter contains=vimWildcardBracketCharacter,vimWildcardBracketEscape,vimWildcardBracketCharacterClass,vimWildcardBracketEquivalenceClass,vimWildcardBracketCollatingSymbol +" :syntax match {{{3 +syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=@vimSynMtchGroup +syn match vimSynMtchOpt contained "\%#=1\<\%(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>" -syn match vimWildcardEscape contained "\\." +" :syntax {{{3 +syn keyword vimSynType contained enable list manual off on reset -syn cluster vimWildcard contains=vimWildcardQuestion,vimWildcardStar,vimWildcardBrace,vimWildcardBracket,vimWildcardInterval +" :syntax region {{{3 +syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation +syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ 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*\%(\\\|"\\ \)/ 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 '"[^"]\+$' -" Autocmd and Doauto{cmd,all}: {{{2 -" =========================== +" :syntax spell {{{3 +syn keyword vimSynType contained spell skipwhite nextgroup=vimSynSpell,vimSynSpellError +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynspellerror") + syn match vimSynSpellError contained "\i\+" +endif +syn keyword vimSynSpell contained default notoplevel toplevel -" TODO: explicitly match the {cmd} arg rather than bailing out to TOP -syn region vimAutocmdBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList +" :syntax sync {{{3 +syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncClear,vimSyncMatch,vimSyncError,vimSyncRegion,vimSyncArgs +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncerror") + syn match vimSyncError contained "\i\+" +endif -syn match vimAutocmdGroup contained "\%(\\["|[:space:]]\|[^"|[:space:]]\)\+" skipwhite nextgroup=vimAutoEvent,vimAutoEventGlob -syn match vimAutocmdBang contained "\a\@1<=!" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob +syn region vimSyncArgs contained + \ start="\S" + \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ + \ end="\ze|" + \ end="$" + \ nextgroup=vimCmdSep + \ contains=vimSyncLines,vimSyncLinebreak,vimSyncLinecont,vimSyncFromstart,vimSyncCcomment -" TODO: cleaner handling of | in pattern position -" : match pattern items in addition to wildcards -syn region vimAutocmdPattern contained - \ start="|\@!\S" - \ skip="\\\\\|\\[,[:space:]]" - \ end="\ze[,[:space:]]" - \ end="$" - \ skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimFunc - \ contains=vimEnvvar,@vimWildcard,vimAutocmdPatternEscape -syn match vimAutocmdBufferPattern contained "" skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimFunc -" trailing pattern separator comma allowed -syn match vimAutocmdPatternSep contained "," skipwhite nextgroup=@vimAutocmdPattern,vimAutocmdMod,vimAutocmdBlock -syn match vimAutocmdPatternEscape contained "\\." -syn cluster vimAutocmdPattern contains=vimAutocmdPattern,vimAutocmdBufferPattern - -" TODO: Vim9 requires '++' prefix -syn match vimAutocmdMod contained "\%(++\)\=\" skipwhite nextgroup=vimAutocmdMod,vimAutocmdBlock -syn match vimAutocmdMod contained "++once\>" skipwhite nextgroup=vimAutocmdMod,vimAutocmdBlock - -" higher priority than vimAutocmdGroup, assume no group is so named -syn match vimAutoEventGlob contained "*" skipwhite nextgroup=@vimAutocmdPattern -syn match vimAutoEventSep contained "\a\@1<=," nextgroup=vimAutoEvent -syn match vimUserAutoEventSep contained "\a\@1<=," nextgroup=vimUserAutoEvent +syn keyword vimSyncCcomment contained ccomment skipwhite nextgroup=vimGroupName +syn keyword vimSyncClear contained clear skipwhite nextgroup=vimSyncGroupName +syn keyword vimSyncFromstart contained fromstart +syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName +syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynRegion +syn match vimSyncLinebreak contained "\" skipwhite nextgroup=vimSyncKey +syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup +syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup +syn match vimSyncGroup contained "\<\h\w*\>" skipwhite nextgroup=vimSynRegPat,vimSyncNone +syn keyword vimSyncNone contained NONE -syn match vimAutocmd "\" skipwhite nextgroup=vimAutocmdBang,vimAutocmdGroup,vimAutoEvent,vimAutoEventGlob +" :syntime {{{3 +" ======== +syn keyword vimSyntimeArg contained on off clear report skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep +syn keyword vimSyntime contained synti[me] skipwhite nextgroup=vimSyntimeArg +" :terminal {{{3 +" ========= +syn match vimTerminal contained "\" skipwhite nextgroup=vimTerminalOptions,vimTerminalCommand +syn match vimTerminal contained +\\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimTerminalOptions,vimTerminalCommand,@vimTerminalContinue +syn match vimTerminal_ contained "ter\%[minal]\>" skipwhite nextgroup=vimTerminalOptions,vimTerminalCommand +syn match vimTerminal_ contained +ter\%[minal]\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimTerminalOptions,vimTerminalCommand,@vimTerminalContinue -syn match vimDoautocmdMod contained "" skipwhite nextgroup=vimAutocmdGroup,vimAutoEvent -syn match vimDoautocmd "\" skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent -syn match vimDoautocmd "\" skipwhite nextgroup=vimDoautocmdMod,vimAutocmdGroup,vimAutoEvent +syn match vimTerminalContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimLeadingWhitespace +syn match vimTerminalContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimLeadingWhitespace +syn cluster vimTerminalContinue contains=vimTerminalContinue,vimTerminalContinueComment -" Echo And Execute: -- prefer strings! {{{2 -" ================ -" NOTE: No trailing comments +syn region vimTerminalCommand contained + \ start="\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue -syn region vimEcho - \ matchgroup=vimCommand - \ start="\" - \ start="\" - \ start="\" - \ start="\" - \ start="\" - \ start="\" - \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ excludenl end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,@vimExprList,vim9Comment +syn region vimTerminalOptions contained + \ start="++" + \ skip=/\s\+++\|\%(\n\|^\)\s*\%(\\\|["#]\\ \)/ + \ end="\s" + \ end="$" + \ skipwhite nextgroup=vimTerminalCommand + \ contains=@vimContinue,vimTerminalOption \ transparent -syn match vimEchohl "\" 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="\" - \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ excludenl end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,@vimExprList,vim9Comment - \ transparent +syn match vimTerminalOption contained "++\%(\%(no\)\=close\|open\|curwin\|hidden\|norestore\|shell\)\>" +syn match vimTerminalOption contained "++kill=" nextgroup=vimTerminalKillOptionArg +syn match vimTerminalOption contained "++\%(rows\|cols\)=" nextgroup=vimTerminalSizeOptionArg +syn match vimTerminalOption contained "++eof=" nextgroup=vimTerminalEofOptionArg +syn match vimTerminalOption contained "++type=" nextgroup=vimTerminalTypeOptionArg +syn match vimTerminalOption contained "++api=" nextgroup=vimTerminalApiOptionArg -syn region vimEval - \ matchgroup=vimCommand - \ start="\" - \ skip=+\\|\|||\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ excludenl end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,@vimExprList,vim9Comment,vimComment - \ transparent +syn match vimTerminalApiOptionArg contained "\<\S\+\>" +syn match vimTerminalEofOptionArg contained "\<\S\+\>" +syn match vimTerminalSizeOptionArg contained "\<\d\+\>" +syn keyword vimTerminalKillOptionArg contained term hup quit int kill +syn match vimTerminalKillOptionArg contained "\<\d\+\>" +syn keyword vimTerminalTypeOptionArg contained conpty winpty -" Filter: {{{2 -" ====== -syn match vimExFilter "\" skipwhite nextgroup=vimExFilterBang,vimExFilterPattern -syn region vimExFilterPattern contained - \ start="[[:ident:]]" - \ end="\ze[[:space:]\n]" - \ skipwhite nextgroup=@vimCmdList - \ contains=@vimSubstList - \ oneline -syn region vimExFilterPattern contained +" :uniq {{{3 +" ===== +syn keyword vimUniq contained uni[q] skipwhite nextgroup=vimUniqBang,@vimUniqOptions,vimUniqPattern,vimCmdSep +syn match vimUniq_ contained "\" skipwhite nextgroup=vimUniqBang,@vimUniqOptions,vimUniqPattern,vimCmdSep +syn match vimUniqBang contained "\a\@1<=!" skipwhite nextgroup=@vimUniqOptions,vimUniqPattern,vimCmdSep +syn match vimUniqOptionsError contained "\a\+" +syn match vimUniqOptions contained "\<[ilur]*\>" skipwhite nextgroup=vimUniqPattern,vimCmdSep +syn region vimUniqPattern contained \ matchgroup=Delimiter - \ start="\z([^[:space:][:ident:]|"]\)" + \ start="\z([^[:space:][:alpha:]|]\)" \ skip="\\\\\|\\\z1" \ end="\z1" - \ skipwhite nextgroup=@vimCmdList + \ skipwhite nextgroup=@vimUniqOptions,vimCmdSep \ contains=@vimSubstList \ oneline -syn match vimExFilterBang contained "\a\@1<=!" skipwhite nextgroup=vimExFilterPattern - -" Grep and Make: {{{2 -" ============= -" | is the command separator, escaped with \| all other backslashes are passed through literally, no tail comments -syn match vimGrep "\" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep -syn match vimGrepadd "\" skipwhite nextgroup=vimGrepBang,vimGrepArgs,vimCmdSep -syn region vimGrepArgs contained - \ start="|\@!\S" - \ skip=+\n\s*\%(\\\|[#"]\\ \)+ - \ matchgroup=vimCmdSep - \ end="|" - \ end="$" - "\ TODO: include vimSpecFile - \ contains=vimGrepBarEscape -syn match vimGrepBarEscape contained "\\|" -syn match vimGrepBang contained "\a\@1<=!" skipwhite nextgroup=vimGrepArgs,vimCmdSep - -syn match vimMake "\" skipwhite nextgroup=vimMakeBang,vimMakeArgs,vimCmdSep -syn region vimMakeArgs contained - \ start="|\@!\S" - \ skip=+\n\s*\%(\\\|[#"]\\ \)+ - \ matchgroup=vimCmdSep - \ end="|" - \ end="$" - "\ TODO: include vimSpecFile - \ contains=vimMakeBarEscape -syn match vimMakeBarEscape contained "\\|" -syn match vimMakeBang contained "\a\@1<=!" skipwhite nextgroup=vimMakeArgs,vimCmdSep - -" Help*: {{{2 -" ===== -syn match vimHelp "\" skipwhite nextgroup=vimHelpBang,vimHelpArg,vimHelpNextCommand -" TODO: match wildcards, ignoring exceptions? -syn region vimHelpArg contained - \ start="\S" - \ matchgroup=Special - \ end="\%(@\a\a\)\=\ze\s*\%($\|\%x0d\|\%x00\||[^|]\)" - \ oneline -syn match vimHelpNextCommand contained "\ze|[^|]" skipwhite nextgroup=vimCmdSep -syn match vimHelpBang contained "\a\@1<=!" skipwhite nextgroup=vimHelpArg,vimHelpNextCommand -syn match vimHelpgrep "\" skipwhite nextgroup=vimHelpgrepBang,vimHelpgrepPattern -syn region vimHelpgrepPattern contained - \ start="\S" - \ matchgroup=Special - \ end="@\a\a\>" - \ end="$" - \ contains=@vimSubstList - \ oneline +syn cluster vimUniqOptions contains=vimUniqOptions,vimUniqOptionsError -" Vimgrep: {{{2 -" ======= -syn match vimVimgrep "\" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern -syn match vimVimgrepadd "\" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +" :vimgrep, lvimgrep, :vimgrepadd, :lvimgrepadd {{{3 +" ============================================= +syn keyword vimVimgrep contained vim[grep] lv[imgrep] skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +syn keyword vimVimgrepadd contained vimgrepa[dd] lvimgrepa[dd] skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +syn match vimVimgrep_ contained "l\=vim\%[grep]\>" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern +syn match vimVimgrepadd_ contained "l\=vimgrepa\%[dd]\>" skipwhite nextgroup=vimVimgrepBang,vimVimgrepPattern syn match vimVimgrepBang contained "\a\@1<=!" skipwhite nextgroup=vimVimgrepPattern syn region vimVimgrepPattern contained \ start="[[:ident:]]" @@ -1566,496 +1707,718 @@ syn match vimVimgrepEscape contained "\\\%(\\|\|.\)" syn match vimVimgrepBarEscape contained "\\|" syn region vimVimgrepFile contained \ start="|\@!\S" - \ matchgroup=vimCmdSep - \ end="|" + \ end="\ze|" \ end="\ze\s" \ end="$" \ skipwhite nextgroup=vimVimgrepFile \ contains=vimSpecFile,vimVimgrepEscape,vimVimgrepBarEscape -syn match vimVimgrepFlags contained "\<[gjf]\{,3\}\>" skipwhite nextgroup=vimVimgrepfile +syn match vimVimgrepFlags contained "\<[gjf]\{,3\}\>" skipwhite nextgroup=vimVimgrepFile -" Maps: {{{2 -" ==== -" GEN_SYN_VIM: vimCommand map, START_STR='syn keyword vimMap', END_STR='skipwhite nextgroup=vimMapMod,vimMapLhs' -syn keyword vimMap cm[ap] cno[remap] im[ap] ino[remap] lm[ap] ln[oremap] nm[ap] nn[oremap] om[ap] ono[remap] smap snor[emap] tma[p] tno[remap] vm[ap] vn[oremap] xm[ap] xn[oremap] skipwhite nextgroup=vimMapMod,vimMapLhs -syn match vimMap "\" skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs -syn keyword vimMap no[remap] 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=vimMapMod,vimMapLhs' -syn keyword vimUnmap cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] sunm[ap] tunma[p] vu[nmap] xu[nmap] skipwhite nextgroup=vimMapMod,vimMapLhs -syn keyword vimUnmap unm[ap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs - -syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite nextgroup=vimMapRhs -syn match vimMapLhs contained "\%(.\|\S\)\+\ze\s*$" contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite skipnl nextgroup=vimMapRhsContinue -syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs -syn match vimMapMod contained "\%#=1<\%(buffer\|expr\|nowait\|script\|silent\|special\|unique\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs -syn region vimMapRhs contained - \ start="\S" - \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader -syn region vimMapRhsContinue contained - \ start=+^\s*\%(\\\|["#]\\ \)+ - \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ - \ end="\ze|" - \ end="$" - \ nextgroup=vimCmdSep - \ contains=@vimContinue,vimCtrlChar,vimNotation,vimMapLeader -syn match vimMapLeader contained "\%#=1\c<\%(local\)\=leader>" contains=vimMapLeaderKey -syn keyword vimMapModKey contained buffer expr nowait script silent special unique -syn case ignore -syn keyword vimMapLeaderKey contained leader localleader -syn case match +" :while {{{3 +" ====== +syn keyword vimWhile contained wh[ile] skipwhite nextgroup=@vimExprList,vimNotation -" 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 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*\%(\\\|"\\ \)+ end="$" matchgroup=vimSep end="|" -syn region vimMenuRhsContinue contained contains=@vimContinue,vimNotation start=+^\s*\%(\\\|"\\ \)+ skip=+\\\\\|\\|\|\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 +" :wincmd {{{3 +" ======= +syn keyword vimWincmd contained winc[md] skipwhite nextgroup=vimWincmdArg +syn match vimWincmd_ contained "winc\%[md]\>" skipwhite nextgroup=vimWincmdArg +" TODO: consider extracting this list from the help file +syn match vimWincmdArg contained + \ "\<[sSvnqojkhlwWtbpPrRxKJHLTfFz]\>\|[\^:=\-+_<>|\]}]\|\" + \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn region vimMenutranslate - \ matchgroup=vimCommand start="\" - \ skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ - \ end="$" matchgroup=vimCmdSep end="|" matchgroup=vimMenuClear end="\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg -" If, While and Return: {{{2 -" ==================== -syn match vimNotFunc "\%#=1\<\%(if\|el\%[seif]\|retu\%[rn]\|while\)\>" skipwhite nextgroup=@vimExprList,vimNotation -syn match vimElse "\" skipwhite nextgroup=vimComment,vim9Comment -syn match vimEndif "\" skipwhite nextgroup=vimComment,vim9Comment +" :write {{{3 +" ====== +" lower priority than [wtb]: Vim9 scoped variables at SOL +syn match vimWrite contained "\" nextgroup=vimBang +syn match vimWrite_ contained "w\%[rite]\>" nextgroup=vimBang -" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2 -" ====================== -syn case ignore -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([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 +" :z {{{3 +" == +syn match vimCommand_ contained "z[-+^.=]\=\>" +syn match vimCommand contained "\" -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(net\|dec\|jsb\|pterm\|urxvt\|sgr\)mouse>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(left\|middle\|right\)\%(mouse\|drag\|release\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}left\%(mouse\|release\)nm>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}x[12]\%(mouse\|drag\|release\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}sgrmouserelease>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}mouse\%(up\|down\|move\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}scrollwheel\%(up\|down\|right\|left\)>" contains=vimBracket +" Operators: {{{2 +" ========= +syn cluster vimOperGroup contains=@vimContinue,@vimExprList,vim9Comment,vim9LineComment,vimContinueString +syn match vimOper "\a\@=\|<=\|=\~\|!\~\|>\|<\)[?#]\=" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile +syn match vimOper "\" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList,vimContinueString,vimSpecFile +syn match vimOper "\\)\=<\%(sid\|nop\|nul\|lt\|drop\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%(snr\|plug\|cursorhold\|ignore\|cmd\|scriptcmd\|focus\%(gained\|lost\)\)>" contains=vimBracket -" syn match vimNotation contained '\%(\\\|\)\=[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket -syn match vimNotation contained '\%#=1\%(\\\|\)\=<\%([fq]-\)\=\%(line[12]\|count\|bang\|reg\|args\|mods\|lt\)>' contains=vimBracket skipwhite nextgroup=vimSubst1 -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([cas]file\|abuf\|amatch\|cexpr\|cword\|cWORD\|client\|stack\|script\|sf\=lnum\)>" contains=vimBracket -syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket +syn match vimOperContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList contains=vimLeadingWhitespace +syn match vimOperContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimOperContinue,@vimExprList contains=vimLeadingWhitespace +syn cluster vimOperContinue contains=vimOperContinue,vimOperContinueComment -syn match vimBracket contained "[\\<>]" -syn case match +" Lambda Expressions: {{{2 +" ================== +syn match vimLambdaOperator contained "->" skipwhite nextgroup=@vimExprList +syn region vimLambda contained + \ matchgroup=vimLambdaBrace + \ start=+{\ze[[:space:][:alnum:]_.,]*\%(\n\s*\%(\\[[:space:][:alnum:]_.,]*\|"\\ .*\)\)*->+ + \ skip=+\n\s*\%(\\\|"\\ \)+ + \ end="}" end="$" + \ contains=@vimContinue,@vimExprList,vimLambdaParams +syn match vimLambdaParams contained "\%({\n\=\)\@1<=\_.\{-}\%(->\)\@=" nextgroup=vimLambdaOperator contains=@vimContinue,vimFunctionParam -" User Command Highlighting: {{{2 -syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' +syn match vim9LambdaOperator contained "=>" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment +syn match vim9LambdaParen contained "[()]" +syn match vim9LambdaParams contained + \ "(\%(\" + \ skipwhite nextgroup=vim9LambdaOperator + \ contains=@vim9Continue,vimDefParam,vim9LambdaParen,vim9LambdaReturnType +syn region vim9LambdaReturnType contained start=")\@1<=:\s" end="\ze\s*#" end="\ze\s*=>" contains=@vim9Continue,@vimType transparent +syn region vim9LambdaBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList -" Vim user commands +syn match vim9LambdaOperatorComment contained "#.*" skipwhite skipempty nextgroup=@vimExprList,vim9LambdaBlock,vim9LambdaOperatorComment -" Compiler plugins -syn match vimCompilerSet "\" skipwhite nextgroup=vimSetArgs +" Functions: Tag is provided for those who wish to highlight tagged functions {{{2 +" ========= +syn cluster vimFunctionBodyCommon contains=vimContinue,vimCtrlChar,vimDef,vimFBVar,vimFunction,vimNumber,vimOper,vimOperParen,vimSpecFile,vimString,vimFunctionFold,vimDefFold,vimCmdSep +syn cluster vimFunctionBodyList contains=@vimFunctionBodyCommon,vimLineStart,vimComment,vimConst,vimLet +syn cluster vimDefBodyList contains=@vimFunctionBodyCommon,vim9LineStart,vim9Comment,vim9Const,vim9Final,vim9Var,vim9Null,vim9Boolean,vim9For,@vimSpecialVar,@vim9Func,vim9LhsVariable_,vim9Wincmd -" runtime/makemenu.vim -syn match vimSynMenu "\" skipwhite nextgroup=vimSynMenuPath -syn match vimSynMenuPath contained ".*\ze:" nextgroup=vimSynMenuColon contains=vimMenuNotation -syn match vimSynMenuColon contained ":" nextgroup=vimSynMenuName -syn match vimSynMenuName contained "\w\+" +syn region vimFunctionPattern contained + \ matchgroup=vimOper + \ start="/" + \ end="$" + \ contains=@vimSubstList -" runtime/syntax/syncolor.vim -syn match vimSynColor "\" skipwhite nextgroup=vimSynColorGroup -syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyList contains=vimGroup -syn match vimSynLink "\" skipwhite nextgroup=vimSynLinkGroup -syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup +syn match vimFunctionBang contained "\a\@1<=!" skipwhite nextgroup=vimFunctionName +syn match vimDefBang contained "\a\@1<=!" skipwhite nextgroup=vimDefName +syn match vimFunctionSID contained "\c" +syn match vimFunctionScope contained "\<[bwglstav]:" +syn match vimFunctionName contained + \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" + \ skipwhite nextgroup=vimFunctionParams,vimCmdSep,vimComment,vim9Comment + \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag +syn match vimDefName contained + \ "\%(<[sS][iI][dD]>\|[bwglstav]:\)\=\%([[:alnum:]_#.]\+\|{.\{-1,}}\)\+" + \ nextgroup=vimDefTypeParams,vimDefParams,vimCmdSep,vimComment,vim9Comment + \ contains=vimFunctionError,vimFunctionScope,vimFunctionSID,Tag -syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu +syn match vimFunction contained "\" skipwhite nextgroup=vimFunctionBang,vimFunctionName,vimFunctionPattern,vimCmdSep,vimComment +syn match vimDef contained "\" skipwhite nextgroup=vimDefBang,vimDefName,vimFunctionPattern,vimCmdSep,vimComment -" Errors And Warnings: {{{2 -" ==================== -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") - syn match vimFunctionError contained "[[:space:]!]\@1<=\<[a-z0-9]\w\{-}\ze\s*(" - syn match vimFunctionError contained "\%(<[sS][iI][dD]>\|[sg]:\)\d\w\{-}\ze\s*(" - syn match vimElseIfErr "\" - syn match vimBufnrWarn /\\|\.\.\." skipwhite nextgroup=vimFunctionParamEquals +syn match vimDefParam contained "\<\h\w*\>" skipwhite nextgroup=vimParamType,vimFunctionParamEquals +syn match vim9DefTypeParam contained "\<\u\w*\>" + +syn match vimFunctionParamEquals contained "=" skipwhite nextgroup=@vimExprList +syn match vimFunctionMod contained "\<\%(abort\|closure\|dict\|range\)\>" skipwhite skipempty nextgroup=vimFunctionBody,vimFunctionComment,vimEndfunction,vimFunctionMod,vim9CommentError + +syn region vimFunctionBody contained + \ start="^." + \ matchgroup=vimCommand + \ end="\" + \ skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError + \ contains=@vimFunctionBodyList +syn region vimDefBody contained + \ start="^." + \ matchgroup=vimCommand + \ end="\" + \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError + \ contains=@vimDefBodyList + +syn keyword vimEndfunction contained endf[unction] skipwhite nextgroup=vimCmdSep,vimComment,vim9CommentError +syn keyword vimEnddef contained enddef skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError + +if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' + syn region vimFunctionFold + \ start="\" skipwhite nextgroup=vimMatchGroup,vimMatchNone contains=vimCount -syn match vimMatchGroup contained "[[:alnum:]._-]\+" skipwhite nextgroup=vimMatchPattern -syn case ignore -syn keyword vimMatchNone contained none -syn case match -syn region vimMatchPattern contained - \ matchgroup=Delimiter - \ start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)" - \ skip="\\\\\|\\\z1" - \ end="\z1" - \ contains=@vimSubstList + +syn region vimReturnType contained + \ start=")\@1<=:\%(\s\|\n\)\@=" + \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + + \ end="$" + \ matchgroup=vim9Comment + "\ allow for legacy script tail comment error + \ end="\ze[#"]" + \ skipwhite skipempty nextgroup=vimDefBody,vimDefComment,vimEnddef,vimCommentError + \ contains=@vim9Continue,@vimType + \ transparent +syn match vimParamType contained ":\s" skipwhite skipnl nextgroup=@vimType contains=vimTypeSep + +syn match vimTypeSep contained ":\%(\s\|\n\)\@=" skipwhite nextgroup=@vimType +syn keyword vimType contained blob bool channel float job number string void +syn keyword vimTypeAny contained any +syn match vimTypeObject contained "\" +syn region vimCompoundType contained matchgroup=vimType start="\" + +syn cluster vimType contains=vimType,vimTypeAny,vimTypeObject,vimCompoundType,vimUserType + +" Classes, Enums And Interfaces: {{{2 +" ============================= + +if s:vim9script + + " Methods {{{3 + syn match vim9MethodDef contained "\" skipwhite nextgroup=vim9MethodDefName,vim9ConstructorDefName + syn match vim9MethodDefName contained "\<\h\w*\>" nextgroup=vim9MethodDefParams,vim9MethodDefTypeParams contains=@vim9MethodName + syn region vim9MethodDefParams contained + \ matchgroup=Delimiter start="(" end=")" + \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vim9MethodDefReturnType,vimCommentError + \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals + syn region vim9MethodDefTypeParams contained + \ matchgroup=Delimiter + \ start="<" + \ end=">" + \ nextgroup=vim9MethodDefParams + \ contains=vim9DefTypeParam + + syn match vim9ConstructorDefName contained "\<_\=new\w*\>" + \ nextgroup=vim9ConstructorDefParams,vim9ConstuctorDefTypeParams + \ contains=@vim9MethodName + syn match vim9ConstructorDefParam contained "\<\%(this\.\)\=\h\w*\>" + \ skipwhite nextgroup=vimParamType,vimFunctionParamEquals + \ contains=vim9This,vimOper + syn region vim9ConstructorDefParams contained + \ matchgroup=Delimiter start="(" end=")" + \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError + \ contains=vim9ConstructorDefParam,vim9Comment,vimFunctionParamEquals + syn region vim9ConstuctorDefTypeParams contained + \ matchgroup=Delimiter + \ start="<" + \ end=">" + \ nextgroup=vim9ConstructorDefParams + \ contains=vim9DefTypeParam + + syn region vim9MethodDefReturnType contained + \ start=")\@1<=:\%(\s\|\n\)\@=" + \ skip=+\n\s*\%(\\\|#\\ \)\|^\s*#\\ + + \ end="$" + \ matchgroup=vim9Comment + \ end="\ze#" + \ skipwhite skipnl nextgroup=vim9MethodDefBody,vim9MethodDefComment,vimEnddef,vimCommentError + \ contains=@vim9Continue,vimType,vimTypeSep + \ transparent + + syn region vim9MethodDefComment contained + \ start="#.*" + \ skip=+\n\s*\%(\\\|#\\ \)+ + \ end="$" + \ skipwhite skipempty nextgroup=vim9MethodDefBody,vimEnddef + + syn region vim9MethodDefBody contained + \ start="^.\=" matchgroup=vimCommand end="\" + \ skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError + \ contains=@vim9MethodDefBodyList + + syn cluster vim9MethodDefBodyList contains=@vimDefBodyList,vim9This,vim9Super + + if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") + syn match vim9MethodNameError contained "\<[a-z0-9]\i\>" + endif + syn match vim9MethodName contained "\<_\=new\w*\>" + syn keyword vim9MethodName contained empty len string + + syn cluster vim9MethodName contains=vim9MethodName,vim9MethodNameError + + if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' + syn region vim9MethodDefFold contained + \ start="\%(^\s*\%(:\=static\s\+\)\=\)\@16<=:\=def\s\+\h\w*[<(]" + \ end="^\s*:\=enddef\>" + \ contains=vim9MethodDef + \ fold keepend extend transparent + endif + + syn cluster vim9MethodDef contains=vim9MethodDef,vim9MethodDefFold + + " Classes {{{3 + syn cluster vim9ClassBodyList contains=vim9Abstract,vim9Class,vim9Comment,vim9LineComment,@vim9Continue,@vimExprList,vim9Extends,vim9Implements,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Super,vim9Var + + syn match vim9Class contained "\" skipwhite nextgroup=vim9ClassName + syn match vim9ClassName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends,vim9Implements + syn match vim9SuperClass contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Implements + syn match vim9ImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9InterfaceListComma,vim9Extends + syn match vim9InterfaceListComma contained "," skipwhite skipnl nextgroup=vim9ImplementedInterface + syn keyword vim9Abstract abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef + syn keyword vim9Extends contained extends skipwhite skipnl nextgroup=vim9SuperClass + syn keyword vim9Implements contained implements skipwhite skipnl nextgroup=vim9ImplementedInterface + syn keyword vim9Public contained public + syn keyword vim9Static contained static + " FIXME: don't match as dictionary keys, remove when operators are not + " shared between Vim9 and legacy script + syn match vim9This contained "\.\@1:\@!" + " super must be followed by '.' + syn match vim9Super contained "\.\@1" matchgroup=vimCommand end="\" contains=@vim9ClassBodyList transparent + + " Enums {{{3 + syn cluster vim9EnumBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Enum,@vimExprList,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Var + + syn match vim9Enum contained "\" skipwhite nextgroup=vim9EnumName + + syn match vim9EnumName contained "\<\u\w*\>" skipwhite skipempty nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements + syn match vim9EnumNameTrailing contained "\S.*" + syn region vim9EnumNameComment contained + \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" + \ skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue + \ contains=@vimCommentGroup,vimCommentString + " vim9EnumName's "skipempty" should only apply to comments and enum values and not implements clauses + syn match vim9EnumNameEmpty contained "^" skipwhite skipempty nextgroup=vim9EnumNameComment,vim9EnumValue + " allow line continuation between enum name and "implements" + syn match vim9EnumNameContinue contained + \ "^\s*\\" + \ skipwhite skipnl nextgroup=vim9EnumNameTrailing,vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue,vim9EnumImplements + \ contains=vimLeadingWhitespace + syn match vim9EnumNameContinueComment contained + \ "^\s*#\\ .*" + \ skipwhite skipnl nextgroup=vim9EnumNameEmpty,vim9EnumNameComment,@vim9EnumNameContinue + \ contains=vimLeadingWhitespace + syn cluster vim9EnumNameContinue contains=vim9EnumNameContinue,vim9EnumNameContinueComment + + " enforce enum value list location + syn match vim9EnumValue contained "\<\a\w*\>" nextgroup=vim9EnumValueTypeArgs,vim9EnumValueArgList,vim9EnumValueListComma,vim9Comment + syn match vim9EnumValueListComma contained "," skipwhite skipempty nextgroup=vim9EnumValue,vim9EnumValueListCommaComment + syn region vim9EnumValueListCommaComment contained + \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" + \ skipwhite skipempty nextgroup=vim9EnumValueListCommaComment,vim9EnumValue + \ contains=@vimCommentGroup,vimCommentString + syn region vim9EnumValueTypeArgs contained + \ matchgroup=Delimiter + \ start="<\ze\a" + \ end=">" + \ nextgroup=vim9EnumValueArgList + \ contains=@vimType + \ oneline + syn region vim9EnumValueArgList contained + \ matchgroup=vimParenSep start="(" end=")" + \ nextgroup=vim9EnumValueListComma + \ contains=@vimExprList,vimContinueString,vim9Comment + + syn keyword vim9EnumImplements contained implements skipwhite nextgroup=vim9EnumImplementedInterface + syn match vim9EnumImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9EnumInterfaceListComma,vim9EnumImplementedInterfaceComment,vim9EnumValue + syn match vim9EnumInterfaceListComma contained "," skipwhite nextgroup=vim9EnumImplementedInterface + syn region vim9EnumImplementedInterfaceComment contained + \ start="#" skip="\n\s*\%(\\\|#\\ \)" end="$" + \ skipwhite skipempty nextgroup=vim9EnumImplementedInterfaceComment,vim9EnumValue + \ contains=@vimCommentGroup,vimCommentString + + VimFolde syn region vim9EnumBody start="\" matchgroup=vimCommand end="\" contains=@vim9EnumBodyList transparent + + " Interfaces {{{3 + " TODO: limit to decl only - no init values + syn cluster vim9InterfaceBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Extends,vim9Interface,vim9AbstractDef,vim9Var + + syn match vim9Interface contained "\" skipwhite nextgroup=vim9InterfaceName + syn match vim9InterfaceName contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9Extends + + syn keyword vim9AbstractDef contained def skipwhite nextgroup=vim9AbstractDefName + syn match vim9AbstractDefName contained "\<\h\w*\>" skipwhite nextgroup=vim9AbstractDefParams,vim9AbstractDefTypeParams contains=@vim9MethodName + syn region vim9AbstractDefParams contained + \ matchgroup=Delimiter start="(" end=")" + \ skipwhite skipnl nextgroup=vimDefComment,vim9AbstractDefReturnType,vimCommentError + \ contains=vimDefParam,vim9Comment,vimFunctionParamEquals + syn region vim9AbstractDefReturnType contained + \ start=")\@1<=:\s" end="$" matchgroup=vim9Comment end="\ze[#"]" + \ skipwhite skipnl nextgroup=vimDefComment,vimCommentError + \ contains=vimTypeSep + \ transparent + syn region vim9AbstractDefTypeParams contained + \ matchgroup=Delimiter + \ start="<" + \ end=">" + \ nextgroup=vim9AbstractDefParams + \ contains=vim9DefTypeParam + + VimFoldi syn region vim9InterfaceBody start="\" matchgroup=vimCommand end="\" contains=@vim9InterfaceBodyList transparent + + " Type Aliases {{{3 + syn match vim9Type "\" skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError + syn match vim9TypeAlias contained "\<\u\w*\>" skipwhite nextgroup=vim9TypeEquals + syn match vim9TypeEquals contained "=" skipwhite nextgroup=@vimType + if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_notypealiaserror") + syn match vim9TypeAliasError contained "\<\l\w*\>" skipwhite nextgroup=vim9TypeEquals + endif +endif -" Normal: {{{2 +" Blocks: {{{2 " ====== -syn match vimNormal "\!\=" skipwhite nextgroup=vimNormalArg contains=vimBang -syn region vimNormalArg contained start="\S" skip=+\n\s*\%(\\\|["#]\\ \)+ end="$" contains=@vimContinue +syn region vim9Block contained + \ matchgroup=vimSep + \ start="{\ze\s*\%($\|[#|]\)" + \ end="^\s*\zs}" + \ skipwhite nextgroup=vim9Comment,vimCmdSep + \ contains=@vimDefBodyList -" Profile: {{{2 -" ======= -syn match vimProfileBang contained "\a\@1<=!" skipwhite nextgroup=vimProfileArg -syn keyword vimProfileArg contained start skipwhite nextgroup=vimProfilePattern -syn keyword vimProfileArg contained func skipwhite nextgroup=vimProfilePattern -syn keyword vimProfileArg contained file skipwhite nextgroup=vimProfilePattern -syn keyword vimProfileArg contained stop pause skipwhite nextgroup=vimCmdSep,@vimComment -syn keyword vimProfileArg contained continue dump skipwhite nextgroup=vimCmdSep,@vimComment -" TODO: match file pattern -syn region vimProfilePattern contained - \ start="\S" - \ skip=+\\[|"#]+ - \ end="$" end=+\ze\s*[|"#]+ - \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment -syn match vimProfile "\" skipwhite nextgroup=vimProfileBang,vimProfileArg +" Special Filenames, Modifiers, Extension Removal: {{{2 +" =============================================== +syn match vimSpecFile "" nextgroup=vimSpecFileMod +syn match vimSpecFile "<\([acs]file\|amatch\|abuf\)>" nextgroup=vimSpecFileMod +syn match vimSpecFile "\s%[ \t:]"ms=s+1,me=e-1 nextgroup=vimSpecFileMod +syn match vimSpecFile "\s%$"ms=s+1 nextgroup=vimSpecFileMod +syn match vimSpecFile "\s%<"ms=s+1,me=e-1 nextgroup=vimSpecFileMod +syn match vimSpecFile "#\d\+\|[#%]<\>" nextgroup=vimSpecFileMod +syn match vimSpecFileMod "\(:[phtre]\)\+" contained -syn keyword vimProfdelArg contained func skipwhite nextgroup=vimProfilePattern -syn keyword vimProfdelArg contained file skipwhite nextgroup=vimProfilePattern -syn keyword vimProfdelArg contained here skipwhite nextgroup=vimCmdSep,@vimComment -syn match vimProfdel "\" skipwhite nextgroup=vimProfdelArg +syn match vimSpecFile contained "%[ \t:]"me=e-1 nextgroup=vimSpecFileMod +syn match vimSpecFile contained excludenl "%$" nextgroup=vimSpecFileMod +syn match vimSpecFile contained "%<"me=e-1 nextgroup=vimSpecFileMod -" Prompt{find,repl}: {{{2 -" ================= -syn region vimPromptArg contained - \ start="\S" - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - \ end="$" - \ contains=@vimContinue -syn keyword vimPrompt promptf[ind] promptr[epl] skipwhite nextgroup=vimPromptArg +" Lower Priority Comments: after some vim commands... {{{2 +" ======================= +if get(g:, "vimsyn_comment_strings", 1) + syn region vimCommentString contained oneline start='\S\s\+"'ms=e end='"' extend +endif -" Redir: {{{2 -" ===== -syn match vimRedir "\" skipwhite nextgroup=vimRedirBang,vimRedirFileOperator,vimRedirVariableOperator,vimRedirRegister,vimRedirEnd -syn match vimRedirBang contained "\a\@1<=!" skipwhite nextgroup=vimRedirFileOperator +if s:vim9script + syn cluster vimComment contains=vim9Comment +else + syn cluster vimComment contains=vimComment +endif -syn match vimRedirFileOperator contained ">>\=" skipwhite nextgroup=vimRedirFile -syn region vimRedirFile contained - \ start="\S" - \ matchgroup=Normal - \ end="\s*$" - \ end="\s*\ze[|"]" - \ nextgroup=vimCmdSep,vimComment - \ contains=vimSpecFile -syn match vimRedirRegisterOperator contained ">>\=" -syn match vimRedirRegister contained "@[a-zA-Z*+"]" nextgroup=vimRedirRegisterOperator -syn match vimRedirVariableOperator contained "=>>\=" skipwhite nextgroup=vimVar -syn keyword vimRedirEnd contained END +VimL syn region vimComment + \ excludenl + \ start=+"+ + \ skip=+\n\s*\%(\\\|"\\ \)+ + \ end="$" + \ contains=@vimCommentGroup,vimCommentString + \ extend +Vim9 syn region vim9Comment + \ excludenl + \ start="\%#=1\s\@1<=#\%({\@!\|{{\)" + \ skip="\n\s*\%(\\\|#\\ \)" + \ end="$" + \ contains=@vimCommentGroup,vimCommentString + \ extend -" Sleep: {{{2 -" ===== -syn keyword vimSleep sl[eep] skipwhite nextgroup=vimSleepBang,vimSleepArg -syn match vimSleepBang contained "\a\@1<=!" skipwhite nextgroup=vimSleepArg -syn match vimSleepArg contained "\<\%(\d\+\)\=m\=\>" +syn match vim9CommentError contained "#.*" +syn match vimCommentError contained +".*+ -" Sort: {{{2 -" ==== -syn match vimSort "\" skipwhite nextgroup=vimSortBang,@vimSortOptions,vimSortPattern,vimCmdSep -syn match vimSortBang contained "\a\@1<=!" skipwhite nextgroup=@vimSortOptions,vimSortPattern,vimCmdSep -syn match vimSortOptionsError contained "\a\+" -syn match vimSortOptions contained "\<[ilur]*[nfxob]\=[ilur]*\>" skipwhite nextgroup=vimSortPattern,vimCmdSep -syn region vimSortPattern contained - \ matchgroup=Delimiter - \ start="\z([^[:space:][:alpha:]|]\)" - \ skip="\\\\\|\\\z1" - \ end="\z1" - \ skipwhite nextgroup=@vimSortOptions,vimCmdSep - \ contains=@vimSubstList - \ oneline +" Environment Variables: {{{2 +" ===================== +syn match vimEnvvar "\$\I\i*" +syn match vimEnvvar "\${\I\i*}" -syn cluster vimSortOptions contains=vimSortOptions,vimSortOptionsError +" Strings {{{2 +" ======= -" Terminal: {{{2 -" ======== -syn match vimTerminal "\" skipwhite nextgroup=vimTerminalOptions,vimTerminalCommand -syn match vimTerminal +\\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimTerminalOptions,vimTerminalCommand,@vimTerminalContinue +" In-String Specials: +" 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 matchgroup=vimString start=+[^a-zA-Z\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringGroup extend +syn region vimString oneline matchgroup=vimString start=+[^a-zA-Z\\@]'+lc=1 end=+'+ nextgroup=vimSubscriptBrackets contains=vimQuoteEscape extend +"syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup " see tst45.vim -syn match vimTerminalContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimWhitespace -syn match vimTerminalContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimTerminalContinue,vimTerminalOptions,vimTerminalCommand contains=vimWhitespace -syn cluster vimTerminalContinue contains=vimTerminalContinue,vimTerminalContinueComment +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 match vimQuoteEscape contained "''" -syn region vimTerminalCommand contained - \ start="\S" - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - \ end="$" - \ contains=@vimContinue +syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape extend +syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup extend +syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList +syn match vimStringInterpolationBrace contained "{{" +syn match vimStringInterpolationBrace contained "}}" +syn cluster vimStringInterpolation contains=vimStringInterpolationExpr,vimStringInterpolationBrace -syn region vimTerminalOptions contained - \ start="++" - \ skip=/\s\+++\|\%(\n\|^\)\s*\%(\\\|["#]\\ \)/ - \ end="\s" - \ end="$" - \ skipwhite nextgroup=vimTerminalCommand - \ contains=@vimContinue,vimTerminalOption - \ transparent +syn region vimContinueString contained matchgroup=vimContinueString start=+"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,@vimStringGroup +syn region vimContinueString contained matchgroup=vimContinueString start=+'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,vimQuoteEscape +syn region vimContinueString contained matchgroup=vimContinueString start=+$"+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+"+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,@vimStringInterpolation,@vimStringGroup +syn region vimContinueString contained matchgroup=vimContinueString start=+$'+ skip=+\n\s*\%(\\\|["#]\\ \)+ end=+'+ end="$" skipwhite nextgroup=vimSubscriptBrackets,vimComment,vimOper contains=@vimContinue,@vimStringInterpolation,vimQuoteEscape -syn match vimTerminalOption contained "++\%(\%(no\)\=close\|open\|curwin\|hidden\|norestore\|shell\)\>" -syn match vimTerminalOption contained "++kill=" nextgroup=vimTerminalKillOptionArg -syn match vimTerminalOption contained "++\%(rows\|cols\)=" nextgroup=vimTerminalSizeOptionArg -syn match vimTerminalOption contained "++eof=" nextgroup=vimTerminalEofOptionArg -syn match vimTerminalOption contained "++type=" nextgroup=vimTerminalTypeOptionArg -syn match vimTerminalOption contained "++api=" nextgroup=vimTerminalApiOptionArg +" Registers, Addresses, Filters: {{{2 +syn match vimLetRegister contained '@["@0-9\-a-zA-Z:.%#=*+~_/]' -syn match vimTerminalApiOptionArg contained "\<\S\+\>" -syn match vimTerminalEofOptionArg contained "\<\S\+\>" -syn match vimTerminalSizeOptionArg contained "\<\d\+\>" -syn keyword vimTerminalKillOptionArg contained term hup quit int kill -syn match vimTerminalKillOptionArg contained "\<\d\+\>" -syn keyword vimTerminalTypeOptionArg contained conpty winpty +" TODO: match this as a contained ex command +syn match vimFilter "^!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile +syn match vimFilter contained "!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile +syn match vimComFilter contained "|!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile -" Uniq: {{{2 -" ==== -syn match vimUniq "\" skipwhite nextgroup=vimUniqBang,@vimUniqOptions,vimUniqPattern,vimCmdSep -syn match vimUniqBang contained "\a\@1<=!" skipwhite nextgroup=@vimUniqOptions,vimUniqPattern,vimCmdSep -syn match vimUniqOptionsError contained "\a\+" -syn match vimUniqOptions contained "\<[ilur]*\>" skipwhite nextgroup=vimUniqPattern,vimCmdSep -syn region vimUniqPattern contained - \ matchgroup=Delimiter - \ start="\z([^[:space:][:alpha:]|]\)" - \ skip="\\\\\|\\\z1" - \ end="\z1" - \ skipwhite nextgroup=@vimUniqOptions,vimCmdSep - \ contains=@vimSubstList - \ oneline +" Variable Declarations: {{{2 +" ===================== +VimL syn keyword vimLet contained let skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar +VimL syn keyword vimConst contained cons[t] skipwhite nextgroup=@vimSpecialVar,vimVar,vimVarList,vimLetVar +syn region vimVarList contained + \ start="\[" end="]" + \ skipwhite nextgroup=vimLetHeredoc + \ contains=@vimContinue,@vimSpecialVar,vimVar +syn match vimLetVar contained "\<\%([bwglstav]:\)\=\h[a-zA-Z0-9#_]*\>\ze\%(\[.*]\)\=\s*=<<" skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc contains=vimVarScope,vimSubscriptBrackets -syn cluster vimUniqOptions contains=vimUniqOptions,vimUniqOptionsError +syn region vimLetVarSubscript contained + \ matchgroup=vimSubscriptBracket + \ start="\S\@1<=\[" + \ end="]" + \ skipwhite nextgroup=vimLetVarSubscript,vimLetHeredoc + \ contains=@vimExprList -" Wincmd: {{{2 -" ====== -syn match vimWincmd "\" skipwhite nextgroup=vimWincmdArg -" TODO: consider extracting this list from the help file -syn match vimWincmdArg contained - \ "\<[sSvnqojkhlwWtbpPrRxKJHLTfFz]\>\|[\^:=\-+_<>|\]}]\|\" +syn keyword vimUnlet contained unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars +syn match vimUnletBang contained "\a\@1<=!" skipwhite nextgroup=vimUnletVars +syn region vimUnletVars contained + \ start="$\I\|\h" skip=+\n\s*\%(\\\|["#]\\ \)\|^\s*["#]\\ + end="$" end=+\ze\s*[|"#]+ \ skipwhite nextgroup=vimCmdSep,vimComment,vim9Comment + \ contains=@vimContinue,vimEnvvar,vimVar,vimVimVar -" only handles oneline assignments -Vim9 syn match vimWincmd "\s\=\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg +" TODO: type error after register or environment variables (strings) +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop + \ end="^\z1\=\z2$" + \ extend +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="=<<\%(\s*\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop end="^\z1$" + \ extend +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop + \ end="^\z1\=\z2$" + \ contains=@vimStringInterpolation + \ extend +VimFoldh syn region vimLetHeredoc contained + \ matchgroup=vimLetHeredocStart + \ start="=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)" + \ matchgroup=vimLetHeredocStop + \ end="^\z1$" + \ contains=@vimStringInterpolation + \ extend -" Syntax: {{{2 -"======= -syn region vimGroupList contained - \ start="\S" - \ skip=+\n\s*\%(\\\|["#]\\ \)+ - "\ need to consume the whitespace - \ end="\s"he=e-1 - \ end="$" - \ contains=@vimGroupListContinue,vimGroupSpecial,vimGroupListContinueComma -syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP -syn match vimGroupListComma contained "," -syn match vimGroupListContinueComma contained "\s\+,\s*\|,\s\+" contains=vimGroupListComma -syn match vimGroupListContinueComma contained "\s*,\s*\%(\n\s*\%(\\\s\+\|["#]\\ .*\)\)\+" contains=@vimGroupListContinue,vimGroupListComma +Vim9 syn keyword vim9Const contained const skipwhite nextgroup=vim9Variable,vim9VariableList +Vim9 syn keyword vim9Final contained final skipwhite nextgroup=vim9Variable,vim9VariableList +Vim9 syn keyword vim9Var contained var skipwhite nextgroup=vim9Variable,vim9VariableList -syn match vimGroupListEquals contained "=" skipwhite skipnl nextgroup=vimGroupListContinueStart,vimGroupList -" the first continuation line does not terminate the list at whitepace after \ -syn match vimGroupListContinueStart contained "^\%(\s*["#]\\ .*\n\)*\s*\\\s\+" skipwhite nextgroup=vimGroupList contains=@vimGroupListContinue transparent +syn match vim9Variable contained "\<\h\w*\>" skipwhite nextgroup=vim9VariableTypeSep,vimLetHeredoc,vimOper +syn region vim9VariableList contained start="\[" end="]" contains=@vimContinue,@vimSpecialVar,vim9Variable skipwhite nextgroup=vimLetHeredoc + +syn match vim9VariableTypeSep contained "\S\@1<=:\%(\s\|\n\)\@=" skipwhite nextgroup=@vim9VariableType +syn keyword vim9VariableType contained blob bool channel float job number string void skipwhite nextgroup=vimLetHeredoc +syn keyword vim9VariableTypeAny contained any skipwhite nextgroup=vimLetHeredoc +syn match vim9VariableTypeObject contained "\" skipwhite nextgroup=vimLetHeredoc +syn region vim9VariableCompoundType contained + \ matchgroup=vim9VariableType + \ start="\" skipwhite nextgroup=vimLetHeredoc -syn match vimGroupListContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimGroupListContinue,vimGroupListContinueComma contains=vimWhitespace -syn match vimGroupListContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimGroupListContinue contains=vimWhitespace -syn cluster vimGroupListContinue contains=vimGroupListContinue,vimGroupListContinueComment +syn cluster vim9VariableType contains=vim9VariableType,vim9VariableTypeAny,vim9VariableTypeObject,vim9VariableCompoundType,vim9VariableUserType -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror") - syn match vimSynError contained "\i\+" -endif -syn match vimSynContains contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimSynContainedin contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimSynNextgroup contained "\" skipwhite nextgroup=vimGroupListEquals -if has("conceal") - " no whitespace allowed after '=' - syn match vimSynCchar contained "\" contains=vimCommand skipwhite nextgroup=vimSynType,@vimComment -syn cluster vimFunctionBodyList add=vimSyntax +syn match vimWildcardQuestion contained "?" +syn match vimWildcardStar contained "*" -" 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 +syn match vimWildcardBraceComma contained "," +syn region vimWildcardBrace contained + \ matchgroup=vimWildcard + \ start="{" + \ end="}" + \ contains=vimWildcardEscape,vimWildcardBrace,vimWildcardBraceComma,vimWildcardQuestion,vimWildcardStar,vimWildcardBracket + \ oneline -" Syntax: clear {{{2 -syn keyword vimSynType contained clear +syn match vimWildcardIntervalNumber contained "\d\+" +syn match vimWildcardInterval contained "\\\\\\{\d\+\%(,\d\+\)\=\\}" contains=vimWildcardIntervalNumber -" Syntax: cluster {{{2 -syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName -syn region vimClusterName contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="$\||" contains=@vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError -syn match vimGroupAdd contained "\" skipwhite nextgroup=vimGroupListEquals -syn match vimGroupRem contained "\" skipwhite nextgroup=vimGroupListEquals -" Syntax: conceal {{{2 -syn match vimSynType contained "\" skipwhite nextgroup=vimSynConceal,vimSynConcealError -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynconcealerror") - syn match vimSynConcealError contained "\i\+" -endif -syn keyword vimSynConceal contained on off +syn match vimWildcardBracket contained "\[\%(\^\=]\=\%(\\.\|\[\([:.=]\)[^:.=]\+\1]\|[^][:space:]]\)*\)\@>]" + \ contains=vimWildcardBracketStart,vimWildcardEscape -" Syntax: foldlevel {{{2 -syn keyword vimSynType contained foldlevel skipwhite nextgroup=vimSynFoldlevel,vimSynFoldlevelError -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynfoldlevelerror") - syn match vimSynFoldlevelError contained "\i\+" -endif -syn keyword vimSynFoldlevel contained start minimum +syn match vimWildcardBracketCharacter contained "." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd +syn match vimWildcardBracketRightBracket contained "]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +syn match vimWildcardBracketHyphen contained "-]\@!" nextgroup=@vimWildcardBracketCharacter +syn match vimWildcardBracketEscape contained "\\." nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketHyphen,vimWildcardBracketEnd +syn match vimWildcardBracketCharacterClass contained "\[:[^:]\+:]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +syn match vimWildcardBracketEquivalenceClass contained "\[=[^=]\+=]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd +syn match vimWildcardBracketCollatingSymbol contained "\[\.[^.]\+\.]" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketEnd -" Syntax: iskeyword {{{2 -syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimSynIskeyword -syn keyword vimSynIskeyword contained clear -syn match vimSynIskeyword contained "\S\+" contains=vimSynIskeywordSep -syn match vimSynIskeywordSep contained "," +syn match vimWildcardBracketStart contained "\[" nextgroup=vimWildcardBracketCaret,vimWildcardBracketRightBracket,@vimWildcardBracketCharacter +syn match vimWildcardBracketCaret contained "\^" nextgroup=@vimWildcardBracketCharacter,vimWildcardBracketRightBracket +syn match vimWildcardBracketEnd contained "]" -" Syntax: include {{{2 -syn keyword vimSynType contained include skipwhite nextgroup=vimSynIncludeCluster -syn match vimSynIncludeCluster contained "@[_a-zA-Z0-9]\+\>" +syn cluster vimWildcardBracketCharacter contains=vimWildcardBracketCharacter,vimWildcardBracketEscape,vimWildcardBracketCharacterClass,vimWildcardBracketEquivalenceClass,vimWildcardBracketCollatingSymbol -" Syntax: keyword {{{2 -syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynContainedin,vimSynKeyError -syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion -syn region vimSynKeyRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=@vimSynKeyGroup -syn match vimSynKeyOpt contained "\%#=1\<\%(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>" -syn match vimSynKeyError contained "\" +syn match vimWildcardEscape contained "\\." -" Syntax: match {{{2 -syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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=vimCmdSep end="|\|$" contains=@vimSynMtchGroup -syn match vimSynMtchOpt contained "\%#=1\<\%(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>" +syn cluster vimWildcard contains=vimWildcardQuestion,vimWildcardStar,vimWildcardBrace,vimWildcardBracket,vimWildcardInterval -" Syntax: off and on {{{2 -syn keyword vimSynType contained enable list manual off on reset +" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2 +" ====================== +syn case ignore +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([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 -" Syntax: region {{{2 -syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation -syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,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*\%(\\\|"\\ \)+ matchgroup=vimCmdSep 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*\%(\\\|"\\ \)/ 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 '"[^"]\+$' +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(net\|dec\|jsb\|pterm\|urxvt\|sgr\)mouse>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}\%(left\|middle\|right\)\%(mouse\|drag\|release\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}left\%(mouse\|release\)nm>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}x[12]\%(mouse\|drag\|release\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}sgrmouserelease>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}mouse\%(up\|down\|move\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd2-4]-\)\{0,4}scrollwheel\%(up\|down\|right\|left\)>" contains=vimBracket -" Syntax: spell {{{2 -syn keyword vimSynType contained spell skipwhite nextgroup=vimSynSpell,vimSynSpellError -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynspellerror") - syn match vimSynSpellError contained "\i\+" -endif -syn keyword vimSynSpell contained default notoplevel toplevel +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%(sid\|nop\|nul\|lt\|drop\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%(snr\|plug\|cursorhold\|ignore\|cmd\|scriptcmd\|focus\%(gained\|lost\)\)>" contains=vimBracket +" syn match vimNotation contained '\%(\\\|\)\=[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket +syn match vimNotation contained '\%#=1\%(\\\|\)\=<\%([fq]-\)\=\%(line[12]\|count\|bang\|reg\|args\|mods\|lt\)>' contains=vimBracket skipwhite nextgroup=vimSubst +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([cas]file\|abuf\|amatch\|cexpr\|cword\|cWORD\|client\|stack\|script\|sf\=lnum\)>" contains=vimBracket +syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd]-\)\{0,4}char-\%(\d\+\|0\o\+\|0x\x\+\)>" contains=vimBracket -" Syntax: sync {{{2 -" ============ -syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncClear,vimSyncMatch,vimSyncError,vimSyncRegion,vimSyncArgs -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncerror") - syn match vimSyncError contained "\i\+" -endif +syn match vimBracket contained "[\\<>]" +syn case match -syn region vimSyncArgs contained start="\S" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=vimSyncLines,vimSyncLinebreak,vimSyncLinecont,vimSyncFromstart,vimSyncCcomment +" User Command Highlighting: {{{2 +" syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' +" syn match vimUsrCmd contained '\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' nextgroup=vimBang +syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:space:]]\|$\)\@=' nextgroup=vimBang -syn keyword vimSyncCcomment contained ccomment skipwhite nextgroup=vimGroupName -syn keyword vimSyncClear contained clear skipwhite nextgroup=vimSyncGroupName -syn keyword vimSyncFromstart contained fromstart -syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName -syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynRegion -syn match vimSyncLinebreak contained "\" skipwhite nextgroup=vimSyncKey -syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup -syn match vimSyncKey contained "\" skipwhite nextgroup=vimSyncGroup -syn match vimSyncGroup contained "\<\h\w*\>" skipwhite nextgroup=vimSynRegPat,vimSyncNone -syn keyword vimSyncNone contained NONE +" Vim user commands -" Syntime: {{{2 -" ======= -syn keyword vimSyntimeArg contained on off clear report skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep -syn keyword vimSyntime synti[me] skipwhite nextgroup=vimSyntimeArg -" Additional IsCommand: here by reasons of precedence {{{2 -" ==================== -syn match vimIsCommand "\s*\a\+" transparent contains=vimCommand,vimNotation +" Compiler plugins +syn match vimCompilerSet "\" skipwhite nextgroup=vimSetArgs -" Highlighting: {{{2 -" ============ -syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,@vimComment -if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror") - syn match vimHiCtermError contained "\D\i*" -endif -syn match vimHighlight "\" skipwhite nextgroup=vimHiBang,@vimHighlightCluster -syn match vimHiBang contained "\a\@1<=!" skipwhite nextgroup=@vimHighlightCluster +" runtime/makemenu.vim +syn match vimSynMenu "\" skipwhite nextgroup=vimSynMenuPath +syn match vimSynMenuPath contained ".*\ze:" nextgroup=vimSynMenuColon contains=vimMenuNotation +syn match vimSynMenuColon contained ":" nextgroup=vimSynMenuName +syn match vimSynMenuName contained "\w\+" -syn case ignore -" Conceal is a generated low-priority match -syn match vimHiGroup contained "\%(\\)\@!\i\+" -syn keyword vimHiNone contained NONE -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 "\" -syn case match +" runtime/syntax/syncolor.vim +syn match vimSynColor "\" skipwhite nextgroup=vimSynColorGroup +syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyList contains=vimGroup +syn match vimSynLink "\" skipwhite nextgroup=vimSynLinkGroup +syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup -syn match vimHiFontname contained "[a-zA-Z\-*]\+" -syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'" -syn match vimHiGuiRgb contained "#\x\{6}" +syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu -" Highlighting: hi group key=arg ... {{{2 -syn cluster vimHiCluster contains=vimGroup,vimHLGroup,vimHiGroup,vimHiNone,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiCtermfont,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation,vimComment,vim9comment -syn region vimHiKeyList contained start="\i\+" skip=+\\\\\|\\|\|\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 +" Errors And Warnings: {{{2 +" ==================== +if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") + syn match vimFunctionError contained "[[:space:]!]\@1<=\<[a-z0-9]\w\{-}\ze\s*(" + syn match vimFunctionError contained "\%(<[sS][iI][dD]>\|[sg]:\)\d\w\{-}\ze\s*(" + syn match vimElseIfErr "\" + syn match vimBufnrWarn /\" skipwhite nextgroup=vimLuaHeredoc,vimLuaStatement +syn match vimLua_ contained "luado\>" skipwhite nextgroup=vimLuaStatement +syn match vimLua_ contained "luafile\>" syn region vimLuaStatement contained \ start="\S" @@ -2127,8 +2493,10 @@ if s:interfaces =~# 'm' let &l:isk = s:iskKeep endif -syn keyword vimMzScheme mz[scheme] skipwhite nextgroup=vimMzSchemeHeredoc,vimMzSchemeStatement -syn keyword vimMzScheme mzf[ile] +syn keyword vimMzScheme contained mz[scheme] skipwhite nextgroup=vimMzSchemeHeredoc,vimMzSchemeStatement +syn keyword vimMzScheme contained mzf[ile] +syn match vimMzScheme_ contained "mz\%[scheme]\>" skipwhite nextgroup=vimMzSchemeHeredoc,vimMzSchemeStatement +syn match vimMzScheme_ contained "mzf\%[ile]\>" syn region vimMzSchemeStatement contained \ start="\S" @@ -2166,8 +2534,10 @@ if s:interfaces =~# 'p' unlet b:current_syntax endif -syn keyword vimPerl pe[rl] skipwhite nextgroup=vimPerlHeredoc,vimPerlStatement -syn keyword vimPerl perld[o] skipwhite nextgroup=vimPerlStatement +syn keyword vimPerl contained pe[rl] skipwhite nextgroup=vimPerlHeredoc,vimPerlStatement +syn keyword vimPerl contained perld[o] skipwhite nextgroup=vimPerlStatement +syn match vimPerl_ contained "pe\%[rl]\>" skipwhite nextgroup=vimPerlHeredoc,vimPerlStatement +syn match vimPerl_ contained "perld\%[o]\>" skipwhite nextgroup=vimPerlStatement syn region vimPerlStatement contained \ start="\S" @@ -2203,9 +2573,12 @@ if s:interfaces =~# 'P' unlet b:current_syntax endif -syn keyword vimPython py[thon] skipwhite nextgroup=vimPythonHeredoc,vimPythonStatement -syn keyword vimPython pydo skipwhite nextgroup=vimPythonStatement -syn keyword vimPython pyfile +syn keyword vimPython contained py[thon] skipwhite nextgroup=vimPythonHeredoc,vimPythonStatement +syn keyword vimPython contained pydo skipwhite nextgroup=vimPythonStatement +syn keyword vimPython contained pyfile +syn match vimPython__ contained "py\%[thon]\>" skipwhite nextgroup=vimPythonHeredoc,vimPythonStatement +syn match vimPython__ contained "pydo\>" skipwhite nextgroup=vimPythonStatement +syn match vimPython__ contained "pyfile\>" syn region vimPythonStatement contained \ start="\S" @@ -2243,9 +2616,13 @@ if s:interfaces =~# 'P' unlet b:current_syntax endif -syn keyword vimPython3 python3 py3 skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement -syn keyword vimPython3 py3do skipwhite nextgroup=vimPython3Statement -syn keyword vimPython3 py3file +syn keyword vimPython3 contained python3 py3 skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement +syn keyword vimPython3 contained py3do skipwhite nextgroup=vimPython3Statement +syn keyword vimPython3 contained py3file +syn match vimPython3__ contained "python3\>" skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement +syn match vimPython3__ contained "py3\>" skipwhite nextgroup=vimPython3Heredoc,vimPython3Statement +syn match vimPython3__ contained "py3do\>" skipwhite nextgroup=vimPython3Statement +syn match vimPython3__ contained "py3file\>" syn region vimPython3Statement contained \ start="\S" @@ -2286,9 +2663,13 @@ if s:interfaces =~# 'P' endif endif -syn keyword vimPythonX pythonx pyx skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement -syn keyword vimPythonX pyxdo skipwhite nextgroup=vimPythonXStatement -syn keyword vimPythonX pyxfile +syn keyword vimPythonX contained pythonx pyx skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement +syn keyword vimPythonX contained pyxdo skipwhite nextgroup=vimPythonXStatement +syn keyword vimPythonX contained pyxfile +syn match vimPythonX__ contained "pythonx\>" skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement +syn match vimPythonX__ contained "pyx\>" skipwhite nextgroup=vimPythonXHeredoc,vimPythonXStatement +syn match vimPythonX__ contained "pyxdo\>" skipwhite nextgroup=vimPythonXStatement +syn match vimPythonX__ contained "pyxfile\>" syn region vimPythonXStatement contained \ start="\S" @@ -2326,9 +2707,12 @@ if s:interfaces =~# 'r' unlet b:current_syntax endif -syn keyword vimRuby rub[y] skipwhite nextgroup=vimRubyHeredoc,vimRubyStatement -syn keyword vimRuby rubyd[o] skipwhite nextgroup=vimRubyStatement -syn keyword vimRuby rubyf[ile] +syn keyword vimRuby contained rub[y] skipwhite nextgroup=vimRubyHeredoc,vimRubyStatement +syn keyword vimRuby contained rubyd[o] skipwhite nextgroup=vimRubyStatement +syn keyword vimRuby contained rubyf[ile] +syn match vimRuby_ contained "rub[y]\=\>" skipwhite nextgroup=vimRubyHeredoc,vimRubyStatement +syn match vimRuby_ contained "rubydo\=\>" skipwhite nextgroup=vimRubyStatement +syn match vimRuby_ contained "rubyf\%[ile]\>" syn region vimRubyStatement contained \ start="\S" @@ -2365,9 +2749,12 @@ if s:interfaces =~# 't' unlet b:current_syntax endif -syn keyword vimTcl tcl skipwhite nextgroup=vimTclHeredoc,vimTclStatement -syn keyword vimTcl tcld[o] skipwhite nextgroup=vimTclStatement -syn keyword vimTcl tclf[ile] +syn keyword vimTcl contained tcl skipwhite nextgroup=vimTclHeredoc,vimTclStatement +syn keyword vimTcl contained tcld[o] skipwhite nextgroup=vimTclStatement +syn keyword vimTcl contained tclf[ile] +syn match vimTcl_ contained "tcl\>" skipwhite nextgroup=vimTclHeredoc,vimTclStatement +syn match vimTcl_ contained "tcld\%[o]\>" skipwhite nextgroup=vimTclStatement +syn match vimTcl_ contained "tclf\%[ile]\>" syn region vimTclStatement contained \ start="\S" \ skip=+\n\s*\%(\\\|["#]\\ \)+ @@ -2399,48 +2786,19 @@ VimFoldt syn region vimTclHeredoc contained \ contains=@vimTclScript unlet s:interfaces -" Function Call Highlighting: {{{2 -" (following Gautam Iyer's suggestion) -" ========================== -syn match vimFunc contained "\<\l\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimFuncName -" dict-key only -syn match vimUserFuncKey contained "\%(\l\|\d\)\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName -syn match vimUserFunc contained "\<[[:upper:]_]\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName,vim9Super,vim9This -syn match vimUserFunc contained "\<\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen contains=vimVarScope -syn match vimUserFunc contained "\%(\<[sgbwtlav]:\|<[sS][iI][dD]>\)\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation - -Vim9 syn match vim9UserFunc "^\s*\zs\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This -Vim9 syn match vim9UserFunc "^\s*\zs\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimVarScope -Vim9 syn match vim9Func "^\s*\zs\l\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimFuncName - -syn cluster vimFunc contains=vimFunc,vimUserFunc -syn cluster vim9Func contains=vim9Func,vim9UserFunc - -syn region vim9TypeArgs contained - \ matchgroup=Delimiter - \ start="<\ze\a" - \ end=">" - \ nextgroup=vimOperParen - \ contains=@vimType - \ oneline - " Beginners - Patterns that involve ^ {{{2 " ========= -Vim9 syn region vim9LineComment start=+^[ \t:]*\zs#.*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend -VimL syn region vimLineComment start=+^[ \t:]*\zs".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle extend +syn cluster vimCommand_ contains=vimCommand_,vim\u\w\+_ + +Vim9 syn region vim9LineComment contained start=+\%#=1#\%({\@!\|{{\).*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend +VimL syn region vimLineComment contained start=+".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle extend syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup syn match vim9CommentTitle '#\s*\%([sS]:\|\h\w*#\)\=\%([A-DF-Z]\w*\|E\%(\d\{1,4}\>\)\@!\w*\)\(\s\+\u\w*\)*:'hs=s+1 contained contains=vim9CommentTitleLeader,vimTodo,@vimCommentGroup -" allowed anywhere in the file -if !s:vim9script - syn match vimShebangError "^\s*\zs#!.*" display -endif -syn match vimShebang "\%^#!.*" display - -syn match vimContinue "^\s*\zs\\" -syn match vimContinueComment '^\s*\zs["#]\\ .*' extend -syn match vim9ContinueComment "^\s*\zs#\\ .*" extend +syn match vimContinue "^\s*\zs\\" contains=vimLeadingWhitespace "skipwhite nextgroup=vimCmdSep +syn match vimContinueComment '^\s*\zs["#]\\ .*' extend contains=vimLeadingWhitespace +syn match vim9ContinueComment "^\s*\zs#\\ .*" extend contains=vimLeadingWhitespace syn cluster vimContinue contains=vimContinue,vimContinueComment syn cluster vim9Continue contains=vimContinue,vim9ContinueComment @@ -2450,21 +2808,95 @@ syn region vimString start="^\s*\\'" end="'" oneline keepend contains=vimQuoteEs syn match vimCommentTitleLeader '"\s\+'ms=s+1 contained syn match vim9CommentTitleLeader '#\s\+'ms=s+1 contained -" Searches And Globals: {{{2 -" ==================== -VimL syn match vimSearch '^\s*[/?].*' contains=vimSearchDelim -syn match vimSearchDelim '^\s*\zs[/?]\|[/?]$' contained -Vim9 syn match vim9Search '^\s*:[/?].*' contains=vim9SearchDelim -syn match vim9SearchDelim '^\s*\zs:[/?]\|[/?]$' contained contains=vimCmdSep -syn region vimGlobal matchgroup=Statement start='\" contains=vimVar,vimVarScope,@vimSpecialVar,vimEnvvar,vim9Super,vim9This +Vim9 syn match vim9LhsVariable contained transparent "\s\=\%([bwgstv]:\|&\%([lg]:\)\=\|\$\)\=\h[a-zA-Z0-9#_]*\ze\[" nextgroup=vimSubscriptBrackets contains=vimVar,vimVarScope,@vimSpecialVar,vimEnvvar +" TODO: remove these in favour of funccall handling? +Vim9 syn match vim9LhsVariable contained transparent "\s\=\%([bwgtv]:\|&\%([lg]:\)\=\|\$\)\=\h[a-zA-Z0-9#_]*\ze\." nextgroup=vimSubscriptDot contains=vimVar,vimVarScope,@vimSpecialVar,vimEnvvar,vim9Super,vim9This + +Vim9 syn match vim9LhsVariableList contained "\[\_[^]]\+]\ze\s\+[-+/*%]\==" contains=vimVar,@vimSpecialVar +Vim9 syn match vim9LhsVariableList contained "\[\_[^]]\+]\ze\s\+=<<" skipwhite nextgroup=vimLetHeredoc contains=vimVar,@vimSpecialVar +Vim9 syn match vim9LhsVariableList contained "\[\_[^]]\+]\ze\s\+\.\.=" contains=vimVar,@vimSpecialVar + +Vim9 syn match vim9LhsRegister contained "@["0-9\-a-zA-Z#=*+_/]\ze\s\+\%(\.\.\)\==" + +syn cluster vim9Lhs contains=vim9Lhs.* + +" TODO: Useless expressions like "string" at SOL? +" : Continue shouldn't be included here. +VimL syn match vimLineStart "^" skipwhite nextgroup=vimCmdStart,@vimRange,@vimCmdList,@vimContinue,vimComment,vimLineComment + " FIXME: continued expressions +Vim9 syn match vim9LineStart "^" skipwhite nextgroup=vimCmdStart,@vimCmdList,@vim9Continue,vimCmdSep,vim9Comment,vim9LineComment,vim9Block,vim9Lhs.*,@vim9Func ,vimOperParen,vimOper,vim9Boolean,vim9Null,vimNumber,vimString + +syn match vimCmdSep "\\\@1" contains=vimVar,vim9Super,vim9This,vimWhitespace +Vim9 syn match vim9LhsVariable_ "^\s*\h\w*\ze\s\+=<<" skipwhite nextgroup=vimLetHeredoc contains=vimVar,vim9Super,vim9This,vimWhitespace +" rename vim9LhsFunctionCall? +Vim9 syn match vim9UserFunc "^\s*\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This,vimWhitespace +Vim9 syn match vim9UserFunc "^\s*\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimVarScope,vimWhitespace +Vim9 syn match vim9Func "^\s*\l\w*\ze(" skipwhite nextgroup=vimOperParen contains=vimFuncName,vimWhitespace + +Vim9 syn match vim9Wincmd contained "\s\=\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg contains=vimWhitespace +Vim9 syn match vim9Wincmd "^\s*\\ze\s\+=\s*\%([#|]\|$\)" skipwhite nextgroup=vimWincmdArg contains=vimWhitespace + +" allowed anywhere in the file +if !s:vim9script + syn match vimShebangError "^\s*\zs#!.*" display +endif +syn match vimShebang "\%^#!.*" display + + +" Function Call Highlighting: {{{2 +" (following Gautam Iyer's suggestion) +" ========================== +syn match vimFunc contained "\<\l\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimFuncName +" dict-key only +syn match vimUserFuncKey contained "\%(\l\|\d\)\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName +syn match vimUserFunc contained "\<[[:upper:]_]\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vim9MethodName,vim9Super,vim9This +syn match vimUserFunc contained "\<\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen contains=vimVarScope +syn match vimUserFunc contained "\%(\<[sgbwtlav]:\|<[sS][iI][dD]>\)\h\w*\ze\%(\s*(\|<.*>(\)" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation + +Vim9 syn match vim9UserFunc contained "\s\=\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen,vim9TypeArgs contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This,vimWhitespace +Vim9 syn match vim9UserFunc contained "\s\=\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze[(<]" skipwhite nextgroup=vimOperParen contains=vimVarScope,vimWhitespace +Vim9 syn match vim9Func contained "\l\w*\ze(" skipwhite nextgroup=vimOperParen contains=vimFuncName +" higher priority for matches in command position +Vim9 syn match vim9FuncWrap contained "\s\+\l\w*\ze(" contains=vim9Func transparent + +syn cluster vimFunc contains=vimFunc,vimUserFunc +syn cluster vim9Func contains=vim9FuncWrap,vim9UserFunc + +syn region vim9TypeArgs contained + \ matchgroup=Delimiter + \ start="<\ze\a" + \ end=">" + \ nextgroup=vimOperParen + \ contains=@vimType + \ oneline " Vim9 script Regions: {{{2 " ================== if s:vim9script - syn cluster vimLegacyTop contains=TOP,vim9LegacyHeader,vim9Comment,vim9LineComment - VimFoldH syn region vim9LegacyHeader start="\%^" end="^\ze\s*vim9s\%[cript]\>" contains=@vimLegacyTop,vimComment,vimLineComment + syn cluster vimLegacyTop contains=TOP,vim9LegacyHeader,vim9LineStart,vim9Comment + VimFoldH syn region vim9LegacyHeader start="\%^" end="^\ze\s*vim9s\%[cript]\>" contains=@vimLegacyTop,vimLineStart,vimComment syn keyword vim9Vim9ScriptArg noclear contained syn keyword vim9Vim9Script vim9s[cript] nextgroup=vim9Vim9ScriptArg skipwhite @@ -2515,7 +2947,10 @@ if !exists("skip_vim_syntax_inits") endif hi def link vimAbb vimCommand - hi def link vimAddress vimMark + hi def link vimAddress Constant + hi def link vimAddressOffset Type + hi def link vimAddressSlashEscape Special + hi def link vimAddressQuestionEscape Special hi def link vimAt vimCommand hi def link vimAtArg Special hi def link vimAugroupBang vimBang @@ -2523,6 +2958,8 @@ if !exists("skip_vim_syntax_inits") hi def link vimAugroupKey vimCommand hi def link vimAutocmd vimCommand hi def link vimAutocmdBang vimBang + hi def link vimAutocmdContinue vimContinue + hi def link vimAutocmdContinueComment vimContinueComment hi def link vimAutocmdPatternEscape Special hi def link vimAutoEvent Type hi def link vimAutoEventGlob Type @@ -2542,14 +2979,24 @@ if !exists("skip_vim_syntax_inits") hi def link vimBreakadd vimCommand hi def link vimBreakdel vimCommand hi def link vimBreaklist vimCommand + hi def link vimBuffer vimCommand + hi def link vimBuffer_ vimBuffer hi def link vimCall vimCommand + hi def link vimCall_ vimCall hi def link vimCatch vimCommand + hi def link vimChangeBang vimBang + hi def link vimChangeCount vimCount hi def link vimCd vimCommand hi def link vimCdBang vimBang - hi def link vimCmplxRepeat SpecialChar + hi def link vimCmdSepContinue vimContinue + hi def link vimCmdSepContinueComment vimContinueComment hi def link vimCommand Statement + hi def link vimCommand_ vimCommand hi def link vimCommandModifier vimCommand + hi def link vimCommandModifier_ vimCommandModifier hi def link vimCommandModifierBang vimBang + hi def link vimCommandModifierContinue vimContinue + hi def link vimCommandModifierContinueComment vimContinueComment hi def link vimComment Comment hi def link vimCommentError vimError hi def link vimCommentString vimString @@ -2559,10 +3006,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimContinue Special hi def link vimContinueComment vimComment hi def link vimContinueString vimString + hi def link vimCopy vimCommand + hi def link vimCopy_ vimCopy hi def link vimCount Number hi def link vimCtrlChar SpecialChar hi def link vimDebug vimCommand hi def link vimDebuggreedy vimCommand + hi def link vimDebuggreedy_ vimDebuggreedy hi def link vimDef vimCommand hi def link vimDefBang vimBang hi def link vimDefComment vim9Comment @@ -2570,16 +3020,26 @@ if !exists("skip_vim_syntax_inits") hi def link vimDefParam vimVar hi def link vimDelcommand vimCommand hi def link vimDelcommandAttr vimUserCmdAttr + hi def link vimDelete vimCommand + hi def link vimDelete_ vimDelete + hi def link vimDeleteCount Number + hi def link vimDeleteRegister Constant hi def link vimDelfunction vimCommand hi def link vimDelfunctionBang vimBang hi def link vimDoautocmd vimCommand hi def link vimDoautocmdMod Special hi def link vimDoCommand vimCommand + hi def link vimDoCommand_ vimDoCommand hi def link vimDoCommandBang vimBang + hi def link vimTextInputBang vimBang + hi def link vimTextInputComment vimComment + hi def link vimTextInputEnd vimCommand + hi def link vimTextInputText String hi def link vimEcho vimCommand hi def link vimEchohlNone vimGroup hi def link vimEchohl vimCommand hi def link vimElse vimCommand + hi def link vimElseif vimCommand hi def link vimElseIfErr Error hi def link vimEndfunction vimCommand hi def link vimEnddef vimCommand @@ -2587,10 +3047,10 @@ if !exists("skip_vim_syntax_inits") hi def link vimEnvvar PreProc hi def link vimError Error hi def link vimEscape Special + hi def link vimEquals vimCommand hi def link vimEval vimCommand hi def link vimExFilter vimCommand hi def link vimExFilterBang vimBang - hi def link vimExMark vimCommand hi def link vimFBVar vimVar hi def link vimFgBgAttrib vimHiAttrib hi def link vimFuncEcho vimCommand @@ -2608,8 +3068,11 @@ if !exists("skip_vim_syntax_inits") hi def link vimFunctionParamEquals vimOper hi def link vimFunctionScope vimVarScope hi def link vimFunctionSID vimNotation + hi def link vimGlobal vimCommand hi def link vimGrep vimCommand + hi def link vimGrep_ vimGrep hi def link vimGrepadd vimCommand + hi def link vimGrepadd_ vimGrepadd hi def link vimGrepBang vimBang hi def link vimGroup Type hi def link vimGroupAdd vimSynOption @@ -2643,10 +3106,10 @@ if !exists("skip_vim_syntax_inits") hi def link vimHLGroup vimGroup hi def link vimHistory vimCommand hi def link vimHistoryName Special + hi def link vimIf vimCommand hi def link vimImport vimCommand hi def link vimImportAutoload Special hi def link vimImportAs vimImport - hi def link vimInsert vimString hi def link vim9KeymapLineComment vimKeymapLineComment hi def link vimKeymapLineComment vimComment hi def link vimKeymapTailComment vimComment @@ -2660,8 +3123,14 @@ if !exists("skip_vim_syntax_inits") hi def link vimLetHeredocStart Special hi def link vimLetHeredocStop Special hi def link vimLetRegister vimRegister + hi def link vimLetVar vimVar hi def link vimLineComment vimComment + hi def link vimLoadkeymap vimCommand + hi def link vimLockvar vimCommand + hi def link vimLockvarBang vimBang + hi def link vimLockvarDepth vimNumber hi def link vimLua vimCommand + hi def link vimLua_ vimLua hi def link vimMake vimCommand hi def link vimMakeadd vimCommand hi def link vimMakeBang vimBang @@ -2671,9 +3140,10 @@ if !exists("skip_vim_syntax_inits") hi def link vimMapModKey vimFunctionSID hi def link vimMapMod vimBracket hi def link vimMap vimCommand - hi def link vimMark Number - hi def link vimMarkNumber vimNumber + hi def link vimMark vimCommand + hi def link vimMark_ vimMark hi def link vimMatch vimCommand + hi def link vimMatch_ vimMatch hi def link vimMatchGroup vimGroup hi def link vimMatchNone vimGroup hi def link vimMenuBang vimBang @@ -2681,6 +3151,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimMenuMod vimMapMod hi def link vimMenuName PreProc hi def link vimMenu vimCommand + hi def link vimMenu_ vimMenu hi def link vimMenuNotation vimNotation hi def link vimMenuPriority Number hi def link vimMenuStatus Special @@ -2688,10 +3159,10 @@ if !exists("skip_vim_syntax_inits") hi def link vim9MethodName vimFuncName hi def link vimMtchComment vimComment hi def link vimMzScheme vimCommand + hi def link vimMzScheme_ vimMzScheme hi def link vimNonText NonText hi def link vimNormal 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 @@ -2701,6 +3172,8 @@ if !exists("skip_vim_syntax_inits") hi def link vimOption PreProc hi def link vimOptionVar Identifier hi def link vimOptionVarName Identifier + hi def link vimPackadd vimCommand + hi def link vimPackaddBang vimBang hi def link vimParenSep Delimiter hi def link vimPatSepErr vimError hi def link vimPatSepR vimPatSep @@ -2709,7 +3182,11 @@ if !exists("skip_vim_syntax_inits") hi def link vimPatSepZ vimPatSep hi def link vimPattern Type hi def link vimPerl vimCommand - hi def link vimPlainMark vimMark + hi def link vimPerl_ vimPerl + hi def link vimPound vimCommand + hi def link vimPound_ vimPound + hi def link vimPoundCount Number + hi def link vimPrintFlag Special hi def link vimProfile vimCommand hi def link vimProfileArg vimSpecial hi def link vimProfileBang vimBang @@ -2719,7 +3196,11 @@ if !exists("skip_vim_syntax_inits") hi def link vimPython vimCommand hi def link vimPython3 vimCommand hi def link vimPythonX vimCommand + hi def link vimPython__ vimPython + hi def link vimPython3__ vimPython3 + hi def link vimPythonX__ vimPythonX hi def link vimQuoteEscape vimEscape + hi def link vimRange Constant hi def link vimRedir vimCommand hi def link vimRedirBang vimBang hi def link vimRedirFileOperator vimOper @@ -2728,12 +3209,15 @@ if !exists("skip_vim_syntax_inits") hi def link vimRedirEnd Special hi def link vimRedirRegister vimRegister hi def link vimRegister SpecialChar + hi def link vimReturn vimCommand hi def link vimRuby vimCommand + hi def link vimRuby_ vimRuby + hi def link vimRuntime vimCommand + hi def link vimRuntimeBang vimBang + hi def link vimRuntimeWhere Special hi def link vimScriptDelim Comment hi def link vimScriptHeredocStart vimLetHeredocStart hi def link vimScriptHeredocStop vimLetHeredocStop - hi def link vimSearch vimString - hi def link vimSearchDelim Delimiter hi def link vimSep Delimiter hi def link vimSet vimCommand hi def link vimSetAll vimOption @@ -2743,10 +3227,18 @@ if !exists("skip_vim_syntax_inits") hi def link vimSetSep vimSep hi def link vimSetTermcap vimOption hi def link vimShebang PreProc + hi def link vimShiftLeftCount Number + hi def link vimShiftLeftPlus Special + hi def link vimShiftLeft vimCommand + hi def link vimShiftRightCount Number + hi def link vimShiftRightPlus Special + hi def link vimShiftRight vimCommand hi def link vimSleep vimCommand + hi def link vimSleep_ vimSleep hi def link vimSleepArg Constant hi def link vimSleepBang vimBang hi def link vimSort vimCommand + hi def link vimSort_ vimSort hi def link vimSortBang vimBang hi def link vimSortOptions Special hi def link vimSpecFile Identifier @@ -2756,13 +3248,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimString String hi def link vimStringEnd vimString hi def link vimStringInterpolationBrace vimEscape - hi def link vimSubst1 vimSubst hi def link vimSubstCount Number 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 vimSubst_ vimSubst hi def link vimSynCase Type hi def link vimSyncCcomment Type hi def link vimSynCchar vimSynOption @@ -2800,7 +3292,9 @@ if !exists("skip_vim_syntax_inits") hi def link vimSyntime vimCommand hi def link vimSyntimeArg vimSpecial hi def link vimTcl vimCommand + hi def link vimTcl_ vimTcl hi def link vimTerminal vimCommand + hi def link vimTerminal_ vimCommand hi def link vimTerminalContinue vimContinue hi def link vimTerminalContinueComment vimContinueComment hi def link vimTerminalOption vimSpecial @@ -2814,10 +3308,12 @@ if !exists("skip_vim_syntax_inits") hi def link vimTypeObject vimType hi def link vimTypeObjectBracket vimTypeObject hi def link vimUniq vimCommand + hi def link vimUniq_ vimUniq hi def link vimUniqBang vimBang hi def link vimUniqOptions Special hi def link vimUnlet vimCommand hi def link vimUnletBang vimBang + hi def link vimUnlockvar vimCommand hi def link vimUnmap vimMap hi def link vimUserCmd vimCommand hi def link vimUserCmdAttrAddr vimSpecial @@ -2836,22 +3332,25 @@ if !exists("skip_vim_syntax_inits") hi def link vimVarKey vimVar hi def link vimVarScope Identifier hi def link vimVimgrep vimCommand + hi def link vimVimgrep_ vimVimgrep hi def link vimVimgrepadd vimCommand + hi def link vimVimgrepadd_ vimVimgrepadd hi def link vimVimgrepBang vimBang hi def link vimVimgrepFlags Special hi def link vimVimVar Identifier hi def link vimVimVarName Identifier hi def link vimWarn WarningMsg + hi def link vimWhile vimCommand hi def link vimWildcard Special hi def link vimWildcardBraceComma vimWildcard hi def link vimWildcardBracket vimWildcard hi def link vimWildcardBracketCaret vimWildcard hi def link vimWildcardBracketCharacter Normal hi def link vimWildcardBracketCharacter Normal - hi def link vimWildcardBracketCharacterClass vimWildCard - hi def link vimWildcardBracketCollatingSymbol vimWildCard + hi def link vimWildcardBracketCharacterClass vimWildcard + hi def link vimWildcardBracketCollatingSymbol vimWildcard hi def link vimWildcardBracketEnd vimWildcard - hi def link vimWildcardBracketEquivalenceClass vimWildCard + hi def link vimWildcardBracketEquivalenceClass vimWildcard hi def link vimWildcardBracketEscape vimWildcard hi def link vimWildcardBracketHyphen vimWildcard hi def link vimWildcardBracketRightBracket vimWildcardBracketCharacter @@ -2861,6 +3360,8 @@ if !exists("skip_vim_syntax_inits") hi def link vimWildcardQuestion vimWildcard hi def link vimWildcardStar vimWildcard hi def link vimWinCmd vimCommand + hi def link vimWrite vimCommand + hi def link vimWrite_ vimWrite hi def link vim9Abstract vimCommand hi def link vim9Boolean Boolean @@ -2897,8 +3398,6 @@ if !exists("skip_vim_syntax_inits") hi def link vim9MethodNameError vimFunctionError hi def link vim9Null Constant hi def link vim9Public vimCommand - hi def link vim9Search vimString - hi def link vim9SearchDelim Delimiter hi def link vim9Static vimCommand hi def link vim9Super Identifier hi def link vim9This Identifier @@ -2912,12 +3411,15 @@ if !exists("skip_vim_syntax_inits") hi def link vim9Var vimCommand hi def link vim9Vim9ScriptArg Special hi def link vim9Vim9Script vimCommand + hi def link vim9Wincmd vimWincmd + hi def link vimWincmd_ vimWincmd hi def link vimCompilerSet vimCommand hi def link vimSynColor vimCommand hi def link vimSynLink vimCommand hi def link vimSynMenu vimCommand hi def link vimSynMenuPath vimMenuName + endif " Current Syntax Variable: {{{2 diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim index 6df015be1d..c0dc861a8d 100644 --- a/src/testdir/test_statusline.vim +++ b/src/testdir/test_statusline.vim @@ -301,7 +301,7 @@ func Test_statusline() let s:expected_curbuf = string(bufnr('')) let s:expected_curwin = string(win_getid()) set statusline=%{SyntaxItem()} - call assert_match('^vimNumber\s*$', s:get_statusline()) + call assert_match('^vimAddress\s*$', s:get_statusline()) s/^/"/ call assert_match('^vimLineComment\s*$', s:get_statusline()) syntax off diff --git a/src/version.c b/src/version.c index cba6e9a4f5..e4cc44927c 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 910, /**/ 909, /**/ From 5a1124e4f59fafa0c774db956ae1e86bdd259442 Mon Sep 17 00:00:00 2001 From: Bogdan Barbu Date: Tue, 4 Aug 2026 21:11:56 +0000 Subject: [PATCH 292/647] runtime(c): compound literal braces are highlighted as errors Problem: Braces in C compound literals and initializers inside parentheses and brackets are highlighted as errors. Solution: Recognize those initializer blocks while preserving syntax recovery for malformed parentheses. fixes: #18709 closes: #20842 Signed-off-by: Bogdan Barbu Signed-off-by: Christian Brabandt --- runtime/syntax/c.vim | 13 +++++++++--- .../testdir/dumps/c_initializer_00.dump | 20 +++++++++++++++++++ runtime/syntax/testdir/input/c_initializer.c | 18 +++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/c_initializer_00.dump create mode 100644 runtime/syntax/testdir/input/c_initializer.c diff --git a/runtime/syntax/c.vim b/runtime/syntax/c.vim index 6838109520..9b18c2b8a1 100644 --- a/runtime/syntax/c.vim +++ b/runtime/syntax/c.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: C " Maintainer: The Vim Project -" Last Change: 2026 Jun 01 +" Last Change: 2026 Jul 25 " Former Maintainer: Bram Moolenaar " Quit when a (custom) syntax file was already loaded @@ -138,7 +138,7 @@ endif " This should be before cErrInParen to avoid problems with #define ({ xxx }) if exists("c_curly_error") syn match cCurlyError "}" - syn region cBlock start="{" end="}" contains=ALLBUT,cBadBlock,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell fold + syn region cBlock start="{" end="}" contains=ALLBUT,cBadBlock,cCurlyError,cInitBlock,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell fold else syn region cBlock start="{" end="}" transparent fold endif @@ -146,7 +146,7 @@ endif " Catch errors caused by wrong parenthesis and brackets. " Also accept <% for {, %> for }, <: for [ and :> for ] (C99) " But avoid matching <::. -syn cluster cParenGroup contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserLabel,cBitField,cOctalZero,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom +syn cluster cParenGroup contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserLabel,cBitField,cOctalZero,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cBadParenBlock if exists("c_no_curly_error") if s:in_cpp_family && !exists("cpp_no_cpp11") syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell @@ -198,8 +198,15 @@ endif if s:ft ==# 'c' || exists("cpp_no_cpp11") syn region cBadBlock keepend start="{" end="}" contained containedin=cParen,cBracket,cBadBlock transparent fold + if !exists("c_no_curly_error") && !exists("c_no_bracket_error") + " Do not mistake an unmatched ')' followed by a block for a compound literal. + syn region cBadParenBlock keepend transparent start=')\_s*\ze\%({\|<%\)' matchgroup=cErrInBracket end='}\|%>' contained containedin=cBracket,cBadBlock contains=ALLBUT,cBlock,cBadBlock,cInitBlock,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell + endif endif +" Compound literals and initializers may appear inside parentheses or brackets. +syn region cInitBlock transparent matchgroup=cInitBlock start='\%([)=]\_s*\)\@<=\%({\|<%\)' end='}\|%>' contained containedin=cParen,cBracket,cBadBlock contains=ALLBUT,cBlock,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell,cInitBlock fold + "integer number, or floating point number without a dot and with "f". syn case ignore syn match cNumbers display transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalError,cOctal diff --git a/runtime/syntax/testdir/dumps/c_initializer_00.dump b/runtime/syntax/testdir/dumps/c_initializer_00.dump new file mode 100644 index 0000000000..426a1e9582 --- /dev/null +++ b/runtime/syntax/testdir/dumps/c_initializer_00.dump @@ -0,0 +1,20 @@ +>/+0#0000e05#ffffff0@1| |C|o|m|p|o|u|n|d| |l|i|t|e|r|a|l|s| |a|n|d| |i|n|i|t|i|a|l|i|z|e|r|s| |i|n|s|i|d|e| |e|x|p|r|e|s@1|i|o|n|s| +0#0000000&@18 +|v+0#00e0003&|o|i|d| +0#0000000&|t|e|s|t|(|v+0#00e0003&|o|i|d|)+0#0000000&| @59 +|{| @73 +@4|i+0#00e0003&|n|t| +0#0000000&|a|[|(|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1|)|{| |4+0#e000002&|2| +0#0000000&|}|.|b|a|r|]|;| @40 +@4|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1| |b| |=| |(@1|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1|)|{| |}|)|;| @37 +@4|_+0#af5f00255&|S|t|a|t|i|c|_|a|s@1|e|r|t|(+0#0000000&|s+0#af5f00255&|i|z|e|o|f| +0#0000000&|(|i+0#00e0003&|n|t| +0#0000000&|[|]|)|{| |1+0#e000002&|,+0#0000000&| |2+0#e000002&|,+0#0000000&| |3+0#e000002&| +0#0000000&|}| |=@1| |3+0#e000002&| +0#0000000&|*| |s+0#af5f00255&|i|z|e|o|f| +0#0000000&|(|i+0#00e0003&|n|t|)+0#0000000&|,| |"+0#e000002&@1|)+0#0000000&|;| @3 +@4|f+0#af5f00255&|o|r| +0#0000000&|(|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1| |i| |=| |{| |}|;@1|)| |b+0#af5f00255&|r|e|a|k|;+0#0000000&| @37 +@4|i+0#00e0003&|n|t| +0#0000000&|c|[|(|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1|)| |<|%| |4+0#e000002&|2| +0#0000000&|%|>|.|b|a|r|]|;| @37 +@4|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1| |d| |=| |(@1|s+0#00e0003&|t|r|u|c|t| +0#0000000&|f|o@1|)| |<|%| |%|>|)|;| @34 +@4|f|(@1|i+0#00e0003&|n|t| +0#0000000&|[|2+0#e000002&|]+0#0000000&|[|2+0#e000002&|]+0#0000000&|)|{@1| |1+0#e000002&|,+0#0000000&| |2+0#e000002&| +0#0000000&|}|,| |{| |3+0#e000002&|,+0#0000000&| |4+0#e000002&| +0#0000000&|}@1|)|;| @34 +@4|s|y|s|c|a|l@1|(|S|Y|S|_|c|l|o|c|k|_|s|e|t@1|i|m|e|,| |C|L|O|C|K|_|R|E|A|L|T|I|M|E|,| @28 +@8|t|v| |?| |&|(@1|s+0#00e0003&|t|r|u|c|t| +0#0000000&|t|i|m|e|s|p|e|c|)|{| |.|t|v|_|s|e|c| |=| |t|v|-|>|t|v|_|s|e|c|,| @19 +@12|.|t|v|_|n|s|e|c| |=| |t|v|-|>|t|v|_|u|s|e|c| |*| |1+0#e000002&|0@2| +0#0000000&|}|)| |:| |0+0#e000002&|)+0#0000000&|;| @24 +@4|f|(@1|s+0#00e0003&|t|r|u|c|t| +0#0000000&|t|i|m|e|s|p|e|c|)| @51 +@6|<|%| |.|t|v|_|s|e|c| |=| |0+0#e000002&| +0#0000000&|%|>|)|;| @49 +@4|i+0#00e0003&|n|t| +0#0000000&|e|[|)+0#ffffff16#ff404010|{| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&|}+0#ffffff16#ff404010|.+0#0000000#ffffff0|b|a|r|]|;| @51 +@4|f|(|a| |{+0#ffffff16#ff404010| +0#0000000#ffffff0|1+0#e000002&| +0#0000000&|}+0#ffffff16#ff404010|)+0#0000000#ffffff0|;| |f|(|a|,| |{+0#ffffff16#ff404010| +0#0000000#ffffff0|1+0#e000002&| +0#0000000&|}+0#ffffff16#ff404010|)+0#0000000#ffffff0|;| @46 +|}| @73 +|~+0#4040ff13&| @73 +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/input/c_initializer.c b/runtime/syntax/testdir/input/c_initializer.c new file mode 100644 index 0000000000..a64747d46d --- /dev/null +++ b/runtime/syntax/testdir/input/c_initializer.c @@ -0,0 +1,18 @@ +// Compound literals and initializers inside expressions +void test(void) +{ + int a[(struct foo){ 42 }.bar]; + struct foo b = ((struct foo){ }); + _Static_assert(sizeof (int []){ 1, 2, 3 } == 3 * sizeof (int), ""); + for (struct foo i = { };;) break; + int c[(struct foo) <% 42 %>.bar]; + struct foo d = ((struct foo) <% %>); + f((int [2][2]){{ 1, 2 }, { 3, 4 }}); + syscall(SYS_clock_settime, CLOCK_REALTIME, + tv ? &((struct timespec){ .tv_sec = tv->tv_sec, + .tv_nsec = tv->tv_usec * 1000 }) : 0); + f((struct timespec) + <% .tv_sec = 0 %>); + int e[){ 42 }.bar]; + f(a { 1 }); f(a, { 1 }); +} From 1b45edb6056da97a9da70e769d7f4919a9039879 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 5 Aug 2026 18:34:20 +0000 Subject: [PATCH 293/647] patch 9.2.0911: makefiles do not build hardcopy_postscript.c Problem: A recent commit moved the original content of hardcopy.c into hardcopy_postscript.c, but the makefiles were not updated to compile and link the new source file, causing build failures on Windows and other systems (after 9.2.0898). Solution: Add hardcopy_postscript.c to the makefiles, hardcopy_pango.c is only built with GTK/cairo/pango (using autoconf), so the Win32/Amiga/VMS makefiles do not need it (Wei Tang). related: #20648 closes: #20944 Signed-off-by: Wei Tang Signed-off-by: Christian Brabandt --- src/Make_ami.mak | 1 + src/Make_cyg_ming.mak | 3 +++ src/Make_mvc.mak | 3 +++ src/Make_vms.mms | 6 ++++++ src/version.c | 2 ++ 5 files changed, 15 insertions(+) diff --git a/src/Make_ami.mak b/src/Make_ami.mak index 8f02dbbec1..7bd0bcf25d 100644 --- a/src/Make_ami.mak +++ b/src/Make_ami.mak @@ -128,6 +128,7 @@ SRC += \ getchar.c \ gc.c \ hardcopy.c \ + hardcopy_postscript.c \ hashtab.c \ help.c \ highlight.c \ diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index 0fcfb94c28..4a533b2b7c 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -834,6 +834,7 @@ OBJ = \ $(OUTDIR)/gc.o \ $(OUTDIR)/gui_xim.o \ $(OUTDIR)/hardcopy.o \ + $(OUTDIR)/hardcopy_postscript.o \ $(OUTDIR)/hashtab.o \ $(OUTDIR)/help.o \ $(OUTDIR)/highlight.o \ @@ -1324,6 +1325,8 @@ $(OUTDIR)/ex_docmd.o: ex_docmd.c $(INCL) ex_cmdidxs.h $(OUTDIR)/hardcopy.o: hardcopy.c $(INCL) version.h +$(OUTDIR)/hardcopy_postscript.o: hardcopy_postscript.c $(INCL) version.h + $(OUTDIR)/misc1.o: misc1.c $(INCL) version.h $(OUTDIR)/normal.o: normal.c $(INCL) nv_cmdidxs.h nv_cmds.h diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 8d3bb1861f..92b6f4066a 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -729,6 +729,7 @@ OBJ = \ $(OUTDIR)\gc.obj \ $(OUTDIR)\gui_xim.obj \ $(OUTDIR)\hardcopy.obj \ + $(OUTDIR)\hardcopy_postscript.obj \ $(OUTDIR)\hashtab.obj \ $(OUTDIR)\help.obj \ $(OUTDIR)\highlight.obj \ @@ -1622,6 +1623,8 @@ $(OUTDIR)/gui_xim.obj: $(OUTDIR) gui_xim.c $(INCL) $(OUTDIR)/hardcopy.obj: $(OUTDIR) hardcopy.c $(INCL) version.h +$(OUTDIR)/hardcopy_postscript.obj: $(OUTDIR) hardcopy_postscript.c $(INCL) version.h + $(OUTDIR)/hashtab.obj: $(OUTDIR) hashtab.c $(INCL) $(OUTDIR)/help.obj: $(OUTDIR) help.c $(INCL) diff --git a/src/Make_vms.mms b/src/Make_vms.mms index 446e36a289..53ee680dbc 100644 --- a/src/Make_vms.mms +++ b/src/Make_vms.mms @@ -536,6 +536,7 @@ SRC = \ gc.c \ gui_xim.c \ hardcopy.c \ + hardcopy_postscript.c \ hashtab.c \ help.c \ highlight.c \ @@ -676,6 +677,7 @@ OBJ = \ [.$(DEST)]gc.obj \ [.$(DEST)]gui_xim.obj \ [.$(DEST)]hardcopy.obj \ + [.$(DEST)]hardcopy_postscript.obj \ [.$(DEST)]hashtab.obj \ [.$(DEST)]help.obj \ [.$(DEST)]highlight.obj \ @@ -1170,6 +1172,10 @@ lua_env : ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h option.h ex_cmds.h proto.h \ errors.h globals.h version.h +[.$(DEST)]hardcopy_postscript.obj : hardcopy_postscript.c vim.h [.$(DEST)]config.h feature.h os_unix.h \ + ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ + gui.h beval.h option.h ex_cmds.h proto.h \ + errors.h globals.h version.h [.$(DEST)]hashtab.obj : hashtab.c vim.h [.$(DEST)]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h option.h ex_cmds.h proto.h \ diff --git a/src/version.c b/src/version.c index e4cc44927c..e65bb14ea2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 911, /**/ 910, /**/ From be85db01f1ca977e29c7f593293d6459b0b84b5e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 5 Aug 2026 18:52:06 +0000 Subject: [PATCH 294/647] patch 9.2.0912: hardcopy: prototypes are hand-written instead of generated Problem: The prototypes for the pango and PostScript hardcopy functions are written by hand in hardcopy_pango.h and hardcopy_postscript.h, instead of being generated into proto/ like for every other source file. Solution: Generate proto/hardcopy_pango.pro and proto/hardcopy_postscript.pro, include them from proto.h and drop the hand-written declarations. hardcopy_pango.h only held prototypes and is removed; hardcopy_postscript.h keeps its defines and the mbfont_opts declaration. closes: #20946 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- Filelist | 3 ++- src/Make_mvc.mak | 2 ++ src/Makefile | 8 +++++-- src/hardcopy.c | 3 --- src/hardcopy_pango.c | 1 - src/hardcopy_postscript.h | 13 ----------- src/proto.h | 6 +++++ .../hardcopy_pango.pro} | 22 ++----------------- src/proto/hardcopy_postscript.pro | 14 ++++++++++++ src/version.c | 2 ++ 10 files changed, 34 insertions(+), 40 deletions(-) rename src/{hardcopy_pango.h => proto/hardcopy_pango.pro} (57%) create mode 100644 src/proto/hardcopy_postscript.pro diff --git a/Filelist b/Filelist index 7a2f1219ba..945c87e031 100644 --- a/Filelist +++ b/Filelist @@ -95,7 +95,6 @@ SRC_ALL = \ src/hardcopy.c \ src/hardcopy.h \ src/hardcopy_pango.c \ - src/hardcopy_pango.h \ src/hardcopy_postscript.c \ src/hardcopy_postscript.h \ src/hashtab.c \ @@ -316,6 +315,8 @@ SRC_ALL = \ src/proto/gui.pro \ src/proto/gui_beval.pro \ src/proto/hardcopy.pro \ + src/proto/hardcopy_pango.pro \ + src/proto/hardcopy_postscript.pro \ src/proto/hashtab.pro \ src/proto/help.pro \ src/proto/highlight.pro \ diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 92b6f4066a..1b91f5b292 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -1990,6 +1990,8 @@ proto.h: \ proto/gc.pro \ proto/gui_xim.pro \ proto/hardcopy.pro \ + proto/hardcopy_pango.pro \ + proto/hardcopy_postscript.pro \ proto/hashtab.pro \ proto/help.pro \ proto/highlight.pro \ diff --git a/src/Makefile b/src/Makefile index a8a046da7f..04917c0641 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1927,6 +1927,8 @@ PROTO_FILES = \ proto/gui_gtk_gresources.pro \ proto/gui_xim.pro \ proto/hardcopy.pro \ + proto/hardcopy_pango.pro \ + proto/hardcopy_postscript.pro \ proto/hashtab.pro \ proto/help.pro \ proto/highlight.pro \ @@ -4109,12 +4111,12 @@ objects/hardcopy.o: auto/osdef.h hardcopy.c vim.h protodef.h auto/config.h featu ascii.h keymap.h termdefs.h macros.h option.h beval.h \ structs.h regexp.h gui.h libvterm/include/vterm.h \ libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ - globals.h errors.h version.h hardcopy.h hardcopy_pango.h hardcopy_postscript.h + globals.h errors.h version.h hardcopy.h hardcopy_postscript.h objects/hardcopy_pango.o: auto/osdef.h hardcopy_pango.c vim.h protodef.h auto/config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h option.h beval.h \ structs.h regexp.h gui.h libvterm/include/vterm.h \ libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ - globals.h errors.h hardcopy.h hardcopy_pango.h + globals.h errors.h hardcopy.h objects/hardcopy_postscript.o: auto/osdef.h hardcopy_postscript.c vim.h protodef.h auto/config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h option.h beval.h \ structs.h regexp.h gui.h libvterm/include/vterm.h \ @@ -4850,6 +4852,8 @@ proto/gui_beval.pro: gui_beval.c proto/gui_gtk_gresources.pro: auto/gui_gtk_gresources.c proto/gui_xim.pro: gui_xim.c proto/hardcopy.pro: hardcopy.c +proto/hardcopy_pango.pro: hardcopy_pango.c +proto/hardcopy_postscript.pro: hardcopy_postscript.c proto/hashtab.pro: hashtab.c proto/help.pro: help.c proto/highlight.pro: highlight.c diff --git a/src/hardcopy.c b/src/hardcopy.c index d7f2298950..8387deabb8 100644 --- a/src/hardcopy.c +++ b/src/hardcopy.c @@ -20,9 +20,6 @@ #ifdef FEAT_POSTSCRIPT # include "hardcopy_postscript.h" #endif -#ifdef FEAT_PRINT_PANGO -# include "hardcopy_pango.h" -#endif /* * To implement printing on a platform, the following functions must be diff --git a/src/hardcopy_pango.c b/src/hardcopy_pango.c index e3d46a57b7..29c6118b8a 100644 --- a/src/hardcopy_pango.c +++ b/src/hardcopy_pango.c @@ -21,7 +21,6 @@ #ifdef FEAT_PRINT_PANGO #include "hardcopy.h" -#include "hardcopy_pango.h" #include #include diff --git a/src/hardcopy_postscript.h b/src/hardcopy_postscript.h index fe41df8f87..1134889c29 100644 --- a/src/hardcopy_postscript.h +++ b/src/hardcopy_postscript.h @@ -24,19 +24,6 @@ extern option_table_T mbfont_opts[OPT_MBFONT_NUM_OPTIONS]; -void mch_print_cleanup(void); -int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); -int mch_print_begin(prt_settings_T *psettings); -void mch_print_end(prt_settings_T *psettings); -int mch_print_end_page(void); -int mch_print_begin_page(char_u *str); -int mch_print_blank_page(void); -void mch_print_start_line(int margin, int page_line); -int mch_print_text_out(char_u *textp, int len); -void mch_print_set_font(int iBold, int iItalic, int iUnderline); -void mch_print_set_bg(long_u bgcol); -void mch_print_set_fg(long_u fgcol); - #endif #endif diff --git a/src/proto.h b/src/proto.h index a06b82622c..fa0ca9cc2c 100644 --- a/src/proto.h +++ b/src/proto.h @@ -98,6 +98,12 @@ extern int _stricoll(char *a, char *b); # include "gc.pro" # include "gui_xim.pro" # include "hardcopy.pro" +# ifdef FEAT_PRINT_PANGO +# include "hardcopy_pango.pro" +# endif +# ifdef FEAT_POSTSCRIPT +# include "hardcopy_postscript.pro" +# endif # include "hashtab.pro" # include "help.pro" # include "highlight.pro" diff --git a/src/hardcopy_pango.h b/src/proto/hardcopy_pango.pro similarity index 57% rename from src/hardcopy_pango.h rename to src/proto/hardcopy_pango.pro index 26a4c227a6..072faa55a9 100644 --- a/src/hardcopy_pango.h +++ b/src/proto/hardcopy_pango.pro @@ -1,19 +1,4 @@ -/* vi:set ts=8 sts=4 sw=4 noet: - * - * VIM - Vi IMproved by Bram Moolenaar - * - * Do ":help uganda" in Vim to read copying and usage conditions. - * Do ":help credits" in Vim to see a list of people who contributed. - * See README.txt for an overview of the Vim source code. - */ - -#ifndef HARDCOPY_PANGO_H -#define HARDCOPY_PANGO_H - -#include "vim.h" - -#if defined(FEAT_PRINT_PANGO) - +/* hardcopy_pango.c */ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); int mch_print_begin(prt_settings_T *psettings); void mch_print_end(prt_settings_T *psettings); @@ -26,7 +11,4 @@ void mch_print_set_font(int bold, int italic, int underline); void mch_print_set_bg(long_u bgcol); void mch_print_set_fg(long_u fgcol); void mch_print_cleanup(void); - -#endif - -#endif +/* vim: set ft=c : */ diff --git a/src/proto/hardcopy_postscript.pro b/src/proto/hardcopy_postscript.pro new file mode 100644 index 0000000000..70d7bb8649 --- /dev/null +++ b/src/proto/hardcopy_postscript.pro @@ -0,0 +1,14 @@ +/* hardcopy_postscript.c */ +void mch_print_cleanup(void); +int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); +int mch_print_begin(prt_settings_T *psettings); +void mch_print_end(prt_settings_T *psettings); +int mch_print_end_page(void); +int mch_print_begin_page(char_u *str); +int mch_print_blank_page(void); +void mch_print_start_line(int margin, int page_line); +int mch_print_text_out(char_u *textp, int len); +void mch_print_set_font(int iBold, int iItalic, int iUnderline); +void mch_print_set_bg(long_u bgcol); +void mch_print_set_fg(long_u fgcol); +/* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index e65bb14ea2..ef0edee5ec 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 912, /**/ 911, /**/ From d1bfcd17c4db302b70ddd585bfcc7fa046baba35 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 5 Aug 2026 18:58:22 +0000 Subject: [PATCH 295/647] patch 9.2.0913: statusline: cell below the vertical separator keeps the old highlight Problem: When 'statusline' is set, the cell below a vertical separator keeps the highlight of the previous status line update and only catches up on the next key press (dougaak). Solution: Also update that cell when the status line of the current window is redrawn while showing the ruler (Hirohito Higashi). related: #20182 fixes: #20948 closes: #20949 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/drawscreen.c | 15 ++++++-- ...est_statusline_vsep_borrow_hl_mode_01.dump | 6 ++++ ...est_statusline_vsep_borrow_hl_mode_02.dump | 6 ++++ src/testdir/test_statusline.vim | 34 +++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_01.dump create mode 100644 src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_02.dump diff --git a/src/drawscreen.c b/src/drawscreen.c index d85ae57dce..d0e3a83734 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -651,6 +651,8 @@ win_redr_status(win_T *wp, int ignore_pum UNUSED) * over the join without changing visible characters. * - Cells where the vsep char is drawn (stl_connected == FALSE) are left * untouched so the VertSplit highlight is preserved. + * Called for every cursor movement, thus only cells whose attribute changed + * are written to the screen. */ static void borrow_stl_vsep_hl(void) @@ -713,10 +715,14 @@ borrow_stl_vsep_hl(void) for (int r = start; r < end; r++) { - unsigned dst_off = LineOffset[r] + dst_col; + unsigned dst_off = LineOffset[r] + dst_col; + sattr_T attr = ScreenAttrs[LineOffset[r] + src_col]; - ScreenAttrs[dst_off] = ScreenAttrs[LineOffset[r] + src_col]; - screen_char(dst_off, r, dst_col); + if (ScreenAttrs[dst_off] != attr) + { + ScreenAttrs[dst_off] = attr; + screen_char(dst_off, r, dst_col); + } } } } @@ -759,7 +765,10 @@ showruler(int always) } #if defined(FEAT_STL_OPT) if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height) + { redraw_custom_statusline(curwin); + borrow_stl_vsep_hl(); + } else #endif win_redr_ruler(curwin, always, FALSE); diff --git a/src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_01.dump b/src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_01.dump new file mode 100644 index 0000000000..57439b32cf --- /dev/null +++ b/src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_01.dump @@ -0,0 +1,6 @@ +|a+0&#ffffff0@2| @35||+1&&>a+0&&@2| @34 +|b@2| @35||+1&&|b+0&&@2| @34 +|~+0#4040ff13&| @37||+1#0000000&|~+0#4040ff13&| @36 +|~| @37||+1#0000000&|~+0#4040ff13&| @36 +|N+2(ff4011|O|R|M|A|L| @32| +0&&|N|O|R|M|A|L| @31 +| +0#0000000#ffffff0@77 diff --git a/src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_02.dump b/src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_02.dump new file mode 100644 index 0000000000..27e3a9b168 --- /dev/null +++ b/src/testdir/dumps/Test_statusline_vsep_borrow_hl_mode_02.dump @@ -0,0 +1,6 @@ +|a+0&#ffffff0@2| @35||+1&&>a+0&&@2| @34 +|b@2| @35||+1&&|b+0&&@2| @34 +|~+0#4040ff13&| @37||+1#0000000&|~+0#4040ff13&| @36 +|~| @37||+1#0000000&|~+0#4040ff13&| @36 +|N+2(ff4011|O|R|M|A|L| @32| +0#ff404010#ffff4012|I|N|S|E|R|T| @31 +|-+2#0000000#ffffff0@1| |I|N|S|E|R|T| |-@1| +0&&@65 diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim index c0dc861a8d..ad182fcf36 100644 --- a/src/testdir/test_statusline.vim +++ b/src/testdir/test_statusline.vim @@ -1091,4 +1091,38 @@ func Test_statusline_vsep_borrow_hl() call StopVimInTerminal(buf) endfunc +func Test_statusline_vsep_borrow_hl_mode_change() + CheckScreendump + + " With 'statusline' set, a mode change repaints the status line through + " showruler(). The vsep cell must follow without another key press. + let lines =<< trim END + hi User1 ctermfg=Red ctermbg=Yellow + hi User2 ctermfg=Blue ctermbg=Green + set laststatus=2 + func MyStl() + return mode() ==# 'i' ? '%1*INSERT' : '%2*NORMAL' + endfunc + set statusline=%!MyStl() + call setline(1, ['aaa', 'bbb']) + vsplit + wincmd w + END + call writefile(lines, 'XTest_statusline_vsep_mode', 'D') + + let buf = RunVimInTerminal('-S XTest_statusline_vsep_mode', + \ {'rows': 6, 'cols': 78}) + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_statusline_vsep_borrow_hl_mode_01', {}) + + call term_sendkeys(buf, "i") + call VerifyScreenDump(buf, 'Test_statusline_vsep_borrow_hl_mode_02', {}) + + " Leaving Insert mode restores the state of the first dump. + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_statusline_vsep_borrow_hl_mode_01', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index ef0edee5ec..a5145fff9f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 913, /**/ 912, /**/ From c44f35ca1a4d8c0c78f327800fe2677c91c6cecb Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 5 Aug 2026 19:05:25 +0000 Subject: [PATCH 296/647] patch 9.2.0914: diff: undo after :diffget into an empty buffer leaves a line behind Problem: After :diffget into an empty buffer, undo does not restore the empty buffer, the last line stays behind (Narendran Gopalakrishnan) Solution: Include the empty line of the empty buffer in the undo information, it is deleted once the first line was obtained (Hirohito Higashi). fixes: #20950 closes: #20951 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/diff.c | 6 +++++- src/testdir/test_diffmode.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/diff.c b/src/diff.c index b38513693e..4836922c91 100644 --- a/src/diff.c +++ b/src/diff.c @@ -4240,8 +4240,12 @@ ex_diffgetput(exarg_T *eap) dfree = NULL; lnum = dp->df_lnum[idx_to]; count = dp->df_count[idx_to]; + // The empty line of an empty buffer is deleted below, include it in + // the undo information, otherwise undo leaves a line behind. + linenr_T undo_bot = lnum + count + (count == 0 && BUFEMPTY() ? 1 : 0); + if (dp->df_lnum[idx_cur] + dp->df_count[idx_cur] > eap->line1 + off - && u_save(lnum - 1, lnum + count) != FAIL) + && u_save(lnum - 1, undo_bot) != FAIL) { // Inside the specified range and saving for undo worked. start_skip = 0; diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim index 1a78407565..7fc4a32483 100644 --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -250,6 +250,24 @@ func Test_diffget_diffput() %bwipe! endfunc +" Undo after getting lines into an empty buffer must leave it empty again +func Test_diffget_undo_empty_buffer() + enew! + diffthis + new + call setline(1, ['1', '2']) + diffthis + + wincmd p + normal do + call assert_equal(['1', '2'], getline(1, '$')) + undo + call assert_equal([''], getline(1, '$')) + + windo diffoff + %bwipe! +endfunc + " Test putting two changes from one buffer to another func Test_diffput_two() new a diff --git a/src/version.c b/src/version.c index a5145fff9f..1931bc906f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 914, /**/ 913, /**/ From 8c93e2d50dacabcd66cc4cb9573da497e98d3c26 Mon Sep 17 00:00:00 2001 From: Bogdan Barbu Date: Wed, 5 Aug 2026 19:14:54 +0000 Subject: [PATCH 297/647] runtime(make): variables in make target lists use wrong highlighting Problem: Variables in make target lists are highlighted as targets when the prerequisite list is non-empty. Solution: Match target lists separately from prerequisite regions so that contained identifiers are highlighted correctly. Add regression test. closes: #20947 Signed-off-by: Bogdan Barbu Signed-off-by: Christian Brabandt --- runtime/syntax/make.vim | 17 ++++++++++------- runtime/syntax/testdir/dumps/make_01_00.dump | 18 +++++++++--------- runtime/syntax/testdir/input/make_01.mak | 4 ++-- runtime/syntax/testdir/input/setup/make_01.vim | 1 + 4 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 runtime/syntax/testdir/input/setup/make_01.vim diff --git a/runtime/syntax/make.vim b/runtime/syntax/make.vim index 530b41e0e9..23bdd090f0 100644 --- a/runtime/syntax/make.vim +++ b/runtime/syntax/make.vim @@ -3,13 +3,14 @@ " Maintainer: This runtime file is looking for a new maintainer. " Previous Maintainer: Claudio Fleiner , Roland Hieber " URL: https://github.com/vim/vim/blob/master/runtime/syntax/make.vim -" Last Change: 2022 Nov 06 +" Last Change: 2026 Aug 05 " 2025 Apr 15 by Vim project: rework Make flavor detection (#17089) " 2025 Oct 12 by Vim project: update makeDefine highlighting (#18403) " 2025 Oct 25 by Vim project: update makeTargetinDefine highlighting (#18570) " 2025 Dec 23 by Vim project: fix too greedy match (#18938) " 2025 Dec 23 by Vim project: wrong highlight with paranthesis inside quotes (#18818) " 2026 Apr 17 by Vim project: wrong highlight $ inside quotes (#19986) +" 2026 Aug 05 by Vim project: highlight variables in non-empty target lists " quit when a syntax file was already loaded if exists("b:current_syntax") @@ -66,18 +67,20 @@ syn match makeConfig "@[A-Za-z0-9_]\+@" syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:$"me=e-1 syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:[^=]"me=e-2 -syn region makeTargetinDefine transparent matchgroup=makeTargetinDefine - \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1 - \ end="[^\\]$" - \ keepend +syn match makeTargetinDefine "^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}\ze[^:=]" + \ contains=makeIdent,makeSpecTarget,makeComment syn match makeTargetinDefine "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$" \ contains=makeIdent,makeSpecTarget,makeComment -syn region makeTarget transparent matchgroup=makeTarget - \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1 +" Match prerequisites separately so identifiers can match inside target lists. +syn region makePrerequisites contained transparent + \ start="."rs=e-1 \ end="[^\\]$" \ keepend contains=makeIdent,makeSpecTarget,makeNextLine,makeComment,makeDString \ skipnl nextGroup=makeCommands +syn match makeTarget "^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}\ze[^:=]" + \ contains=makeIdent,makeSpecTarget,makeComment + \ nextgroup=makePrerequisites skipwhite syn match makeTarget "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$" \ contains=makeIdent,makeSpecTarget,makeComment \ skipnl nextgroup=makeCommands,makeCommandError diff --git a/runtime/syntax/testdir/dumps/make_01_00.dump b/runtime/syntax/testdir/dumps/make_01_00.dump index cf31afb973..78d8f29041 100644 --- a/runtime/syntax/testdir/dumps/make_01_00.dump +++ b/runtime/syntax/testdir/dumps/make_01_00.dump @@ -1,20 +1,20 @@ >#+0#0000e05#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@65 @75 -|a+0#00e0e07&| |=+0#0000000&| |b| @69 -|$+0#00e0e07&|(|a|)| |=+0#0000000&| |1| @66 +|a+0#0000001#ffff4012| |=+0#0000000#ffffff0| |b| @69 +|$+0#0000001#ffff4012|(|a|)| |=+0#0000000#ffffff0| |1| @66 @75 -|$+0#00e0e07&|(|a|)|:@1| +0#0000000&@68 +|$+0#0000001#ffff4012|(|a|)|:+0#00e0e07#ffffff0@1| +0#0000000&@68 | +0#e000e06&@7|@|e+0#e000002&|c|h|o| |d|o|u|b|l|e|-|c|o|l|o|n| |r|u|l|e| +0#0000000&@43 @75 -|$+0#00e0e07&|(|a|)| |++0#0000000&|=| |o|u|t|p|u|t| @60 -@75 +|$+0#0000001#ffff4012|(|a|)|:+0#00e0e07#ffffff0| +0#0000000&|p|r|e|r|e|q|u|i|s|i|t|e| @56 +|$+0#0000001#ffff4012|(|a|)| |++0#0000000#ffffff0|=| |o|u|t|p|u|t| @60 |d+0#e000e06&|e|f|i|n|e| |s|a|y| +0#0000000&@64 -| +0#e000e06&@7|e|c|h|o| |$+0#00e0e07&|1| +0#0000000&@59 +|$+0#0000001#ffff4012|(|a|)|:+0#00e0e07#ffffff0| +0#e000e06&|p|r|e|r|e|q|u|i|s|i|t|e| +0#0000000&@56 +| +0#e000e06&@7|e|c|h|o| |$+0#0000001#ffff4012|1| +0#0000000#ffffff0@59 |e+0#e000e06&|n|d|e|f| +0#0000000&@69 -@75 |d+0#00e0e07&|e|f|a|u|l|t|:| +0#0000000&@66 -| +0#e000002&@7|$+0#00e0e07&|(|c+0#af5f00255&|a|l@1| +0#00e0e07&|s|a|y|,|"+0#e000002&|H|e|l@1|o| |(|w|o|r|l|d|)|!|"|)+0#00e0e07&| +0#0000000&@38 +| +0#e000002&@7|$+0#0000001#ffff4012|(|c+0#af5f00255#ffffff0|a|l@1| +0#0000001#ffff4012|s|a|y|,|"+0#e000002#ffffff0|H|e|l@1|o| |(|w|o|r|l|d|)|!|"|)+0#0000001#ffff4012| +0#0000000#ffffff0@38 @75 |f+0#00e0e07&|o@1|:| +0#0000000&@70 -| +0#e000002&@7|e|c|h|o| |"|b|a|r|$+0#00e0e07&@1|"+0#e000002&| |b|a|z| +0#0000000&@50 +| +0#e000002&@7|e|c|h|o| |"|b|a|r|$+0#0000001#ffff4012@1|"+0#e000002#ffffff0| |b|a|z| +0#0000000&@50 @57|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/input/make_01.mak b/runtime/syntax/testdir/input/make_01.mak index 082972a59c..6e2e4cd0b4 100644 --- a/runtime/syntax/testdir/input/make_01.mak +++ b/runtime/syntax/testdir/input/make_01.mak @@ -6,12 +6,12 @@ $(a) = 1 $(a):: @echo double-colon rule +$(a): prerequisite $(a) += output - define say +$(a): prerequisite echo $1 endef - default: $(call say,"Hello (world)!") diff --git a/runtime/syntax/testdir/input/setup/make_01.vim b/runtime/syntax/testdir/input/setup/make_01.vim new file mode 100644 index 0000000000..28ba95c006 --- /dev/null +++ b/runtime/syntax/testdir/input/setup/make_01.vim @@ -0,0 +1 @@ +highlight link makeIdent Todo From bd127c602deb480dd9fc7007e8e5a50897646122 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 5 Aug 2026 19:29:01 +0000 Subject: [PATCH 298/647] patch 9.2.0915: tests: two terminal tests in test_popupwin fail on FreeBSD Problem: Two terminal tests in test_popupwin fail on FreeBSD, where the shell echoes the typed character more than once (neil). Solution: Only assert the start of the terminal line. fixes: #20955 closes: #20957 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_popupwin.vim | 8 +++++--- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 6826731090..61af5e050a 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -3076,11 +3076,12 @@ func Test_popupwin_terminal_buffer() call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))}) call WaitForAssert({-> assert_equal('', term_getline(termbuf, '.'))}) - " When typing a character, the cursor is after it. + " When typing a character, the cursor is after it. Some shells echo it + " more than once. call feedkeys("x", 'xt') call term_wait(termbuf) redraw - call WaitForAssert({-> assert_equal('x', term_getline(termbuf, '.'))}) + call WaitForAssert({-> assert_match('^x', term_getline(termbuf, '.'))}) call feedkeys("\", 'xt') " Check this doesn't crash @@ -5480,10 +5481,11 @@ func Test_popup_opacity_terminal_no_freeze() " Before the fix typing froze Vim: redraw under an opacity popup raised " must_redraw every cycle, trapping terminal_loop in its redraw loop. + " Some shells echo the character more than once. call feedkeys('x', 'xt') call term_wait(termbuf) redraw - call WaitForAssert({-> assert_equal('x', term_getline(termbuf, '.'))}) + call WaitForAssert({-> assert_match('^x', term_getline(termbuf, '.'))}) call feedkeys("\", 'xt') call feedkeys("exit\", 'xt') diff --git a/src/version.c b/src/version.c index 1931bc906f..cca2e3afa7 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 915, /**/ 914, /**/ From c6350f0e28a0ca9b4afffb22d0cd88a363b7816c Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 6 Aug 2026 18:32:38 +0000 Subject: [PATCH 299/647] patch 9.2.0916: configure: honor `--disable-hardcopy-pango` with GTK UI Problem: The configure script enables Pango hardcopy automatically when the GTK GUI is selected, even when the user explicitly specified `--disable-hardcopy-pango` (after v9.2.0898). Solution: Only enable Pango hardcopy by default when the option was not explicitly specified, verify that pango library is at least v1.44 (Wei Tang, Hirohito Higashi) fixes: #20952 closes: #20945 Co-Authored-by: Hirohito Higashi Signed-off-by: Wei Tang Signed-off-by: Christian Brabandt --- runtime/doc/version9.txt | 6 ++++- src/auto/configure | 52 ++++++++++++++++++++++++++++------------ src/configure.ac | 48 +++++++++++++++++++++++++------------ src/version.c | 2 ++ 4 files changed, 77 insertions(+), 31 deletions(-) diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 4db123621e..330b552db9 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 02 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52741,6 +52741,10 @@ Highlighting: ~ |hl-PopupBorder| Popup window border. |hl-PopupTitle| Popup window title. +Configure Switches: ~ + +--enable-hardcopy-pango Enable the pango |:hardcopy| backend |pango-printing| + ============================================================================== PATCHES *patches-9.3* *bug-fixes-9.3* *patches-after-9.2* diff --git a/src/auto/configure b/src/auto/configure index a47cb58d2a..312ab6f6c6 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -1553,7 +1553,7 @@ Optional Features: --disable-gtktest Do not try to compile and run a test GTK program --disable-icon-cache-update update disabled --disable-desktop-database-update update disabled - --enable-hardcopy-pango Use Pango and Cairo for improved hardcopy printing. default=yes when GTK GUI enabled + --enable-hardcopy-pango Use Pango 1.44 or later and Cairo for improved hardcopy printing. default=yes when GTK GUI enabled --disable-largefile omit support for large files --disable-canberra Do not use libcanberra. --disable-libsodium Do not use libsodium. @@ -9274,13 +9274,19 @@ fi printf %s "checking for pango... " >&6; } have_pango="no" if "$PKG_CONFIG" --exists 'pango' && "$PKG_CONFIG" --exists 'pangocairo'; then - have_pango="yes" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + if "$PKG_CONFIG" --exists 'pango >= 1.44'; then + have_pango="yes" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - PANGO_CFLAGS=`$PKG_CONFIG --cflags-only-other pango pangocairo` - PANGO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I pango pangocairo` - PANGO_LIBS=`$PKG_CONFIG --libs pango pangocairo` + PANGO_CFLAGS=`$PKG_CONFIG --cflags-only-other pango pangocairo` + PANGO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I pango pangocairo` + PANGO_LIBS=`$PKG_CONFIG --libs pango pangocairo` + else + have_pango="old" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, version 1.44 or later is required" >&5 +printf "%s\n" "no, version 1.44 or later is required" >&6; } + fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } @@ -11545,25 +11551,41 @@ printf %s "checking --enable-hardcopy-pango argument... " >&6; } if test ${enable_hardcopy_pango+y} then : enableval=$enable_hardcopy_pango; +else case e in #( + e) enable_hardcopy_pango="auto" ;; +esac fi -if test "x$have_pango" = "xno" || test "x$have_cairo" = "xno"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, Pango or Cairo not found" >&5 +if test "x$have_pango" != "xyes" || test "x$have_cairo" = "xno"; then + if test "$fail_if_missing" = "yes" -a "$enable_hardcopy_pango" = "yes"; then + as_fn_error $? "could not configure hardcopy-pango" "$LINENO" 5 + fi + enable_hardcopy_pango="no" + if test "x$have_pango" = "xold"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, Pango is older than 1.44" >&5 +printf "%s\n" "no, Pango is older than 1.44" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, Pango or Cairo not found" >&5 printf "%s\n" "no, Pango or Cairo not found" >&6; } + fi else - if test "x$GUITYPE" = "xGTK" || test "x$GUITYPE" = "xGTK4"; then - enable_hardcopy_pango="yes" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, GTK GUI enabled" >&5 + if test "x$enable_hardcopy_pango" = "xauto"; then + if test "x$GUITYPE" = "xGTK" || test "x$GUITYPE" = "xGTK4"; then + enable_hardcopy_pango="yes" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, GTK GUI enabled" >&5 printf "%s\n" "yes, GTK GUI enabled" >&6; } - else - if test "$enable_hardcopy_pango" = "yes"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } else + enable_hardcopy_pango="no" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi + elif test "$enable_hardcopy_pango" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi diff --git a/src/configure.ac b/src/configure.ac index 2fdc516372..75035d754d 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -2493,12 +2493,18 @@ fi AC_MSG_CHECKING(for pango) have_pango="no" if "$PKG_CONFIG" --exists 'pango' && "$PKG_CONFIG" --exists 'pangocairo'; then - have_pango="yes" - AC_MSG_RESULT([yes]) +dnl pango_font_metrics_get_height() requires Pango 1.44. + if "$PKG_CONFIG" --exists 'pango >= 1.44'; then + have_pango="yes" + AC_MSG_RESULT([yes]) - PANGO_CFLAGS=`$PKG_CONFIG --cflags-only-other pango pangocairo` - PANGO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I pango pangocairo` - PANGO_LIBS=`$PKG_CONFIG --libs pango pangocairo` + PANGO_CFLAGS=`$PKG_CONFIG --cflags-only-other pango pangocairo` + PANGO_CPPFLAGS=`$PKG_CONFIG --cflags-only-I pango pangocairo` + PANGO_LIBS=`$PKG_CONFIG --libs pango pangocairo` + else + have_pango="old" + AC_MSG_RESULT([no, version 1.44 or later is required]) + fi else AC_MSG_RESULT(no) fi @@ -3153,21 +3159,33 @@ AC_SUBST(UPDATE_DESKTOP_DATABASE) AC_MSG_CHECKING(--enable-hardcopy-pango argument) AC_ARG_ENABLE(hardcopy-pango, - [ --enable-hardcopy-pango Use Pango and Cairo for improved hardcopy printing. [default=yes when GTK GUI enabled]], - ,, enable_hardcopy_pango="no") + [ --enable-hardcopy-pango Use Pango 1.44 or later and Cairo for improved hardcopy printing. [default=yes when GTK GUI enabled]], + [], + [enable_hardcopy_pango="auto"]) -if test "x$have_pango" = "xno" || test "x$have_cairo" = "xno"; then - AC_MSG_RESULT([no, Pango or Cairo not found]) -else - if test "x$GUITYPE" = "xGTK" || test "x$GUITYPE" = "xGTK4"; then - enable_hardcopy_pango="yes" - AC_MSG_RESULT([yes, GTK GUI enabled]) +if test "x$have_pango" != "xyes" || test "x$have_cairo" = "xno"; then + if test "$fail_if_missing" = "yes" -a "$enable_hardcopy_pango" = "yes"; then + AC_MSG_ERROR([could not configure hardcopy-pango]) + fi + enable_hardcopy_pango="no" + if test "x$have_pango" = "xold"; then + AC_MSG_RESULT([no, Pango is older than 1.44]) else - if test "$enable_hardcopy_pango" = "yes"; then - AC_MSG_RESULT([yes]) + AC_MSG_RESULT([no, Pango or Cairo not found]) + fi +else + if test "x$enable_hardcopy_pango" = "xauto"; then + if test "x$GUITYPE" = "xGTK" || test "x$GUITYPE" = "xGTK4"; then + enable_hardcopy_pango="yes" + AC_MSG_RESULT([yes, GTK GUI enabled]) else + enable_hardcopy_pango="no" AC_MSG_RESULT([no]) fi + elif test "$enable_hardcopy_pango" = "yes"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) fi fi diff --git a/src/version.c b/src/version.c index cca2e3afa7..78b210fdbc 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 916, /**/ 915, /**/ From bfc760467864846b5091c5c5768c53b97cc8b5a7 Mon Sep 17 00:00:00 2001 From: Aliaksei Budavei <0x000c70@gmail.com> Date: Thu, 6 Aug 2026 18:56:02 +0000 Subject: [PATCH 300/647] runtime(sh): Do not conflate comments and function declarations in Bash Bash identifiers declared in scripts cannot have a leading "#" in their names. And neither "namespace" nor "function" can be followed by a newline before an identifier. related: #20878 Co-authored-by: Christoffer Aasted Co-authored-by: Doug Kearns Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt --- runtime/syntax/sh.vim | 19 ++++++---- .../testdir/dumps/sh_functions_bash_00.dump | 4 +- .../testdir/dumps/sh_functions_bash_01.dump | 2 +- .../testdir/dumps/sh_functions_bash_02.dump | 10 ++--- .../testdir/dumps/sh_functions_bash_03.dump | 6 +-- .../testdir/dumps/sh_functions_bash_04.dump | 18 ++++----- .../testdir/dumps/sh_functions_bash_05.dump | 38 +++++++++---------- .../testdir/dumps/sh_functions_bash_06.dump | 20 ++++++++++ .../testdir/dumps/sh_functions_bash_07.dump | 20 ++++++++++ .../syntax/testdir/input/sh_functions_bash.sh | 36 +++++++++++++++++- 10 files changed, 125 insertions(+), 48 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/sh_functions_bash_06.dump create mode 100644 runtime/syntax/testdir/dumps/sh_functions_bash_07.dump diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim index 52d50df853..90a712a00a 100644 --- a/runtime/syntax/sh.vim +++ b/runtime/syntax/sh.vim @@ -3,7 +3,7 @@ " Maintainer: This runtime file is looking for a new maintainer. " Previous Maintainers: Charles E. Campbell " Lennart Schultz -" Last Change: 2026 Jul 25 by Vim Project +" Last Change: 2026 Aug 06 by Vim Project " Version: 208 " Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH " For options and settings, please use: :help ft-sh-syntax @@ -258,7 +258,7 @@ syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial syn cluster shDerefVarList contains=shDerefOffset,shDerefOp,shDerefVarArray,shDerefOpError syn cluster shEchoList contains=shArithmetic,shBracketExpr,shCommandSub,shCommandSubBQ,shDerefVarArray,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote syn cluster shExprList1 contains=shBracketExpr,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq -syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest,shFunctionNameError +syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest,shFunctionNameAssignError syn cluster shFunctionCmds contains=shFor,shCaseEsac,shIf,shRepeat,shDblBrace,shDblParen if exists("b:is_ksh88") || exists("b:is_mksh") " Offer "shFunctionCmds" as is. @@ -284,7 +284,7 @@ if exists("b:is_kornshell") || exists("b:is_bash") endif syn cluster shPPSLeftList contains=shAlias,shArithmetic,shBracketExpr,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=shBracketExpr,@shCommandSubList,shCommandSubBQ,shSubshare,shValsub,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator,shFunctionNameError +syn cluster shSubShList contains=shBracketExpr,@shCommandSubList,shCommandSubBQ,shSubshare,shValsub,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator,shFunctionNameAssignError syn cluster shTestList contains=shArithmetic,shBracketExpr,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,shSubshare,shValsub,shArithmetic @@ -632,12 +632,13 @@ endif " KornShell namespace: {{{1 if exists("b:is_kornshell") && !exists("b:is_ksh88") && !exists("b:is_mksh") - syn keyword shFunctionKey namespace skipwhite skipnl nextgroup=shNamespaceOne + syn keyword shFunctionKey namespace skipwhite nextgroup=shNamespaceOne endif " Functions: {{{1 if !exists("b:is_posix") - syn keyword shFunctionKey function skipwhite skipnl nextgroup=shDoError,shIfError,shFunctionTwo,shFunctionFour,shFunctionCmdTwo + syn match shFunctionKeyDelim "\s\+" contained transparent nextgroup=shDoError,shIfError,shFunctionNameCommentError,shFunctionTwo,shFunctionFour,shFunctionCmdTwo + syn match shFunctionKey "\|&$;\t ]\+\)\+\)\@>\ze\s*\%(\%(()\ze\)\=\)\@>\_s*((\@!" contained skipwhite skipnl nextgroup=shFunctionSubSh contains=shFunctionParens " Claim empty array assignments. syn match shArrayEmptyDecl "\%#=1\ze\%(\<\h\w*=\)\@>()" transparent nextgroup=shVariable + " Claim commented out function declaration headers. + syn match shFunctionComment "^\s*\zs\ze#" transparent nextgroup=shComment if !exists("g:sh_no_error") - syn match shFunctionNameError "\%#=1\%(\%(\<\h\w*\)\@>=\)\%(\%(\w\+\)\@>=\=\)\+()" skipwhite skipnl nextgroup=shExpr,shSubSh + syn match shFunctionNameAssignError "\%#=1\%(\%(\<\h\w*\)\@>=\)\%(\%(\w\+\)\@>=\=\)\+()" skipwhite skipnl nextgroup=shExpr,shSubSh + syn match shFunctionNameCommentError "#" contained endif elseif exists("b:is_ksh88") " AT&T ksh88 @@ -954,7 +958,8 @@ if !exists("skip_sh_syntax_inits") hi def link shParenError Error hi def link shTestError Error if exists("b:is_bash") - hi def link shFunctionNameError Error + hi def link shFunctionNameAssignError Error + hi def link shFunctionNameCommentError Error endif if exists("b:is_kornshell") || exists("b:is_posix") hi def link shDTestError Error diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_00.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_00.dump index e78273f4f3..0eab07508d 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_00.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_00.dump @@ -1,8 +1,8 @@ | +0#0000e05#a8a8a8255@1>#+0&#ffffff0|!|/|b|i|n|/|b|a|s|h| +0#0000000&@61 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s|e|t|l|o|c|a|l| |f|e|n| |f|d|c|=|2| |f|d|l|=|8| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@20 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |g|:|s|h|_|f|o|l|d|_|e|n|a|b|l|e|d| |=| |1| |+| |2| |+| |4| +0#0000000&@22 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |s|h|F|u|n|c|t|i|o|n|E|x|p|r|R|e|g|i|o|n| |T|o|d|o| +0#0000000&@15 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |s|h|F|u|n|c|t|i|o|n|S|u|b|S|h|R|e|g|i|o|n| |T|o|d|o| +0#0000000&@14 | +0#0000e05#a8a8a8255@1|t+0#af5f00255#ffffff0|y|p|e|s|e|t| +0#0000000&|-+0#e000e06&|i| +0#0000000&|n+0#00e0e07&|=+0#0000000&|0+0#e000002&| +0#0000000&@58 | +0#0000e05#a8a8a8255@1|d+0#00e0e07#ffffff0|o@1|s|i|e|(+0#e000e06&|)| +0#0000000&|(+0#e000e06&@1|n+0#0000000&|++0#af5f00255&|=|1+0#e000002&|)+0#e000e06&@1|;+0#0000000&| |d|o@1|s|i|e| @47 | +0#0000e05#a8a8a8255@1|d+0#00e0e07#ffffff0|o|n|e@1|(+0#e000e06&|)| +0#0000000&|[+0#e000e06&@1| +0#0000000&|-+0#af5f00255&|n| +0#0000000&|$+0#e000e06&|#| +0#0000000&|]+0#e000e06&@1|;+0#0000000&| |d|o|n|e@1| @46 diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_01.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_01.dump index aba361e65e..cb780d087e 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_01.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_01.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|o|r| +0#0000000&|x| |i+0#af5f00255&|n| +0#0000000&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&@60 |-+0#0000e05#a8a8a8255| |d+0#af5f00255#ffffff0|o| +0#0000000&@70 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|:| @67 -@57|1|9|,|1| @9|1|6|%| +@57|1|9|,|1| @9|1@1|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump index 8901e58ac3..349680a558 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump @@ -10,11 +10,11 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |i+0#af5f00255#ffffff0|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&@62 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|!+0#00e0e07&|?|#|(+0#e000e06&|)| +0#0000000&@54 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|(+0#af5f00255&| +0#0000000&@67 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|@+0#00e0e07&|α|!| +0#0000000&|{+0#e000e06&| +0#0000000&@50 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|(+0#0000001#ffff4012| +0#0000000#ffffff0@67 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|@+0#00e0e07&|α|!| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@50 |3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@11|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@51 -|3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|}+0#e000e06&| +0#0000000&@63 +|3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|}+0#0000001#ffff4012| +0#0000000#ffffff0@63 |2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|@|α|!+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@56 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|)+0#af5f00255&| +0#0000000&@67 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|)+0#0000001#ffff4012| +0#0000000#ffffff0@67 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|v|a|l| +0#0000000&|!+0#af5f00255&|?+0#0000000&|\+0#e000e06&|#| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|"|$|1|\|"|"+0#af5f00255&| +0#0000000&@50 -@57|3|7|,|1| @9|4|0|%| +@57|3|7|,|1| @9|2|8|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump index 98fcc942e8..c81798152a 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump @@ -2,8 +2,8 @@ ||+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|i| +0#0000000&@70 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|n+0#00e0e07#ffffff0|a|m|e|s|p|a|c|e| |(+0#e000e06&|)| +0#0000000&@60 -|-+0#0000e05#a8a8a8255| |{+0#e000e06#ffffff0| +0#0000000&|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|#|;+0#af5f00255&| +0#0000000&@62 -||+0#0000e05#a8a8a8255| >}+0#e000e06#ffffff0|;+0#0000000&| |n|a|m|e|s|p|a|c|e| |$+0#e000e06&|@| +0#0000000&@57 +|-+0#0000e05#a8a8a8255| |{+0#0000001#ffff4012| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|#|;+0#af5f00255&| +0#0000000&@62 +||+0#0000e05#a8a8a8255| >}+0#0000001#ffff4012|;+0#0000000#ffffff0| |n|a|m|e|s|p|a|c|e| |$+0#e000e06&|@| +0#0000000&@57 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |W|h|e|t|h|e|r| |"|=|"| |b|e|l|o|n|g|s| |t|o| |a| |n|a|m|e| |o|r| |d|e|l|i|m|i|t|s| |a| |n|a|m|e| |d|e|p|e|n|d|s| |o|n| |w|h|e|t|h|e|r| +0#0000000&@3 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |t|h|e| |r|e|s|e|r|v|e|d| |w|o|r|d| |"|f|u|n|c|t|i|o|n|"| |i|s| |p|r|e|s|e|n|t|,| |i|f| |s|o|,| |t|h|e|n| |"|=|"| |i|s| |p|a|r|t| |o|f| +0#0000000&@3 @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|x+0#00e0e07&|s|=+0#0000000&|(+0#e000e06&|)| +0#0000000&@63 | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|{| +0#0000000&@67 | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@7|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |2+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1| +0#0000000&@39 -@57|5@1|,|1| @9|6|3|%| +@57|5@1|,|1| @9|4@1|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump index d1be88c7d3..73488d28aa 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump @@ -4,17 +4,17 @@ | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|}| +0#0000000&@67 | +0#0000e05#a8a8a8255@1|)+0#e000e06#ffffff0| +0#0000000&@71 | +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 -|-+0#0000e05#a8a8a8255| |i+0#00e0e07#ffffff0|δ|=|(+0#e000e06&|)| +0#0000000&|(+0#af5f00255&| +0#0000000&@65 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|=+0#00e0e07&|i|d|=|(+0#e000e06&|)| +0#0000000&|{+0#e000e06&| +0#0000000&@60 +|-+0#0000e05#a8a8a8255| |i+0#00e0e07#ffffff0|δ|=|(+0#e000e06&|)| +0#0000000&|(+0#0000001#ffff4012| +0#0000000#ffffff0@65 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|=+0#00e0e07&|i|d|=|(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@60 |2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|=+0#00e0e07&@2|(+0#e000e06&|)| +0#0000000&@59 |2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|*|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i|;| +0#0000000&|=+0#af5f00255&@2| +0#0000000&|$+0#e000e06&|*| +0#0000000&@34 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}+0#e000e06&|;+0#af5f00255&| +0#0000000&|=+0#af5f00255&|i|d|=| +0#0000000&|$+0#e000e06&|*| +0#0000000&@58 -||+0#0000e05#a8a8a8255| |)+0#af5f00255#ffffff0|;+0#0000000&| |i+0#af5f00255&|d|=| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&@54 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}+0#0000001#ffff4012|;+0#af5f00255#ffffff0| +0#0000000&|=+0#af5f00255&|i|d|=| +0#0000000&|$+0#e000e06&|*| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |)+0#0000001#ffff4012|;+0#0000000#ffffff0| |i+0#af5f00255&|d|=| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&@54 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -|-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|(+0#e000e06&|)| +0#0000000&|(+0#af5f00255&| +0#0000000&@57 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f| +0#0000000&|{+0#e000e06&| +0#0000000&@54 +|-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|(+0#e000e06&|)| +0#0000000&|(+0#0000001#ffff4012| +0#0000000#ffffff0@57 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@54 |2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f|=| +0#0000000&@51 |2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|*|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i|;| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&|\+0#e000e06&|=| +0#0000000&|$+0#e000e06&|*| +0#0000000&@31 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}+0#e000e06&|;+0#af5f00255&| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&| |$+0#e000e06&|*| +0#0000000&@58 -||+0#0000e05#a8a8a8255| |)+0#af5f00255#ffffff0|;+0#0000000&| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 -@57|7|3|,|0|-|1| @7|8|7|%| +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}+0#0000001#ffff4012|;+0#af5f00255#ffffff0| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&| |$+0#e000e06&|*| +0#0000000&@58 +||+0#0000e05#a8a8a8255| |)+0#0000001#ffff4012|;+0#0000000#ffffff0| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 +@57|7|3|,|0|-|1| @7|6|1|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump index 9b805c1891..bf354f4741 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump @@ -1,20 +1,20 @@ -||+0#0000e05#a8a8a8255| |)+0#af5f00255#ffffff0|;+0#0000000&| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 +||+0#0000e05#a8a8a8255| |)+0#0000001#ffff4012|;+0#0000000#ffffff0| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |P|a|r|e|n|s| |a|r|e| |n|o|t| |e|s|c|a|p|e|d|,| |h|e|n|c|e| |t|h|i|s| |i|s| |i|n|v|a|l|i|d| |v|a|r|i|a|b|l|e| |a|s@1|i|g|n|m|e|n|t|.| +0#0000000&@4 -| +0#0000e05#a8a8a8255@1|f+0#ffffff16#ff404010|=|f|(|)| +0#0000000#ffffff0@67 -| +0#0000e05#a8a8a8255@1|{+0#e000e06#ffffff0| +0#0000000&@71 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3>f+0#ffffff16#ff404010|=|f|=|(|)| +0#0000000#ffffff0@62 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|(+0#af5f00255&| +0#0000000&@67 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|f+0#ffffff16#ff404010|=|f|=|f|(|)| +0#0000000#ffffff0@57 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|:|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i| +0#0000000&@48 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|)+0#af5f00255&| +0#0000000&@67 -| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|9|1|,|5| @9|B|o|t| +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0|f|u|n|c|t|i|o|n|(|)| |{| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| @2|e|c|h|o| |"|$|1|"| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0|}| +0#0000000&@70 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|u|n|c|t|i|o|n| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@53 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|s+0#af5f00255&|e|t| +0#00e0e07&|-@1| |$+0#e000e06&|{|*|/+0#af5f00255&|\+0#0000000&| @56 +||+0#0000e05#a8a8a8255| |#+0#0000000#ffffff0|.|/+0#af5f00255&|}+0#e000e06&| +0#0000000&@68 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|s+0#af5f00255&|e|t| +0#00e0e07&|-@1| |`+0#e000e06&|p+0#af5f00255&|r|i|n|t|f| +0#e000e06&|%|\| +0#0000000&@51 +||+0#0000e05#a8a8a8255| |#+0&#ffffff0|.|f|\| @1|$|*| |2|>|/|d|e|v|/|n|u|l@1|`+0#e000e06&|;+0#af5f00255&|:+0#0000000&| |#+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E|:+0#0000e05#ffffff0| |N|o|t| |a| |c|o|m@1|e|n|t| |(|%|\|)| +0#0000000&@21 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|s+0#af5f00255&|e|t| +0#00e0e07&|-@1| |$+0#e000e06&|{|*|%+0#af5f00255&|.+0#0000000&|}+0#e000e06&| +0#0000000&@55 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|l+0#af5f00255&|o|c|a|l| +0#0000000&|I+0#e000e06&|F|S|=+0#af5f00255&|++0#0000000&| @57 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@2|"+0#af5f00255&|$+0#e000e06&|{|*|\+0#ffffff16#ff404010| +0#0000000#ffffff0@54 +||+0#0000e05#a8a8a8255| |#+0#ffffff16#ff404010|f|u|n|c|t|i|o|n|(|)|}+0#e000e06#ffffff0|"+0#af5f00255&|)+0#e000e06&| |/| |$|{|\+0#ffffff16#ff404010| +0#0000000#ffffff0@52 +||+0#0000e05#a8a8a8255| |#+0#ffffff16#ff404010|}+0#e000e06#ffffff0| |+| |1+0#e000002&|6|\+0#e000e06&| +0#0000000&@64 +||+0#0000e05#a8a8a8255| |#+0&#ffffff0|0|\| +0#0000000&@69 +||+0#0000e05#a8a8a8255| |)+0#e000e06#ffffff0@1|;+0#af5f00255&|:+0#0000000&| |#+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E|:+0#0000e05#ffffff0| |N|o|t| |a| |c|o|m@1|e|n|t| |(|1|6|\|)| +0#0000000&@39 +||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|f|u+0#e000002&|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|$+0#e000e06&|@| +0#0000000&@50 +@57|9|1|,|0|-|1| @7|7@1|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump new file mode 100644 index 0000000000..7fb4a39704 --- /dev/null +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump @@ -0,0 +1,20 @@ +||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|f|u+0#e000002&|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|$+0#e000e06&|@| +0#0000000&@50 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n| |(+0#e000e06&|)| +0#0000000&|{+0#e000e06&| +0#0000000&@41 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0|;+0#0000000&| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|f+0#e000002&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@40 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|-+0#0000e05#a8a8a8255| |f+0#00e0e07#ffffff0|u|n|c|t|i|o|n|#| |(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@58 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 +||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |f|u|n|c|t|i|o|n|#| |"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@55 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |P|a|r|e|n|s| |a|r|e| |n|o|t| |e|s|c|a|p|e|d|,| |h|e|n|c|e| |t|h|i|s| |i|s| |i|n|v|a|l|i|d| |v|a|r|i|a|b|l|e| |a|s@1|i|g|n|m|e|n|t|.| +0#0000000&@4 +| +0#0000e05#a8a8a8255@1|f+0#ffffff16#ff404010|=|f|(|)| +0#0000000#ffffff0@67 +| +0#0000e05#a8a8a8255@1|{+0#e000e06#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f+0#ffffff16#ff404010|=|f|=|(|)| +0#0000000#ffffff0@62 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|(+0#af5f00255&| +0#0000000&@67 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|f+0#ffffff16#ff404010|=|f|=|f|(|)| +0#0000000#ffffff0@57 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|:|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i| +0#0000000&@48 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|)+0#af5f00255&| +0#0000000&@67 +| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 +@57|1|0|9|,|0|-|1| @6|9|4|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump new file mode 100644 index 0000000000..7dea3a44df --- /dev/null +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |I|d|e|n|t|i|f|i|e|r|s| |c|a|n@1|o|t| |h|a|v|e| |a| |l|e|a|d|i|n|g| |"|#|"| |i|n| |t|h|e|i|r| |n|a|m|e|s| |u|n|l|e|s@1| |t|h|e| |s|h|e|l@1| +0#0000000&@1 +| +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |o|p|t|i|o|n| |"|i|n|t|e|r|a|c|t|i|v|e|_|c|o|m@1|e|n|t|s|"| |i|s| |u|n|s|e|t| |a|n|d| |i|s| |i|n| |e|f@1|e|c|t|.| +0#0000000&@14 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|#+0#ffffff16#ff404010|f+0#0000000#ffffff0|u|n|c|t|i|o|n|(+0#e000e06&|)| +0#0000000&|{+0#e000e06&| +0#0000000&@50 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3>e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|2|7|,|5| @8|B|o|t| diff --git a/runtime/syntax/testdir/input/sh_functions_bash.sh b/runtime/syntax/testdir/input/sh_functions_bash.sh index 714d2a74b3..2a1c4ec616 100644 --- a/runtime/syntax/testdir/input/sh_functions_bash.sh +++ b/runtime/syntax/testdir/input/sh_functions_bash.sh @@ -1,8 +1,8 @@ #!/bin/bash # VIM_TEST_SETUP setlocal fen fdc=2 fdl=8 fdm=syntax # VIM_TEST_SETUP let g:sh_fold_enabled = 1 + 2 + 4 - - +# VIM_TEST_SETUP highlight link shFunctionExprRegion Todo +# VIM_TEST_SETUP highlight link shFunctionSubShRegion Todo typeset -i n=0 doosie() ((n+=1)); doosie donee() [[ -n $# ]]; donee @@ -85,6 +85,32 @@ function f=() ( }; f\=f $* ); f= f\= f= f= +#function() { +# echo "$1" +#} + +function function { + set -- ${*/\ +#./} + set -- `printf %\ +#.f\ $* 2>/dev/null`;: # FIXME: Not a comment (%\) + set -- ${*%.} + local IFS=+ + echo $((("${*\ +#function()}") / ${\ +#} + 16\ +#0\ +));: # FIXME: Not a comment (16\) +}; eval "\function" $@ + +function function#function () { + echo "$1" +}; eval "function#function" "$1" + +function# () { + echo "$1" +}; function# "$1" + # Parens are not escaped, hence this is invalid variable assignment. f=f() { @@ -94,3 +120,9 @@ f=f() if :; then :; fi ) } + +# Identifiers cannot have a leading "#" in their names unless the shell +# option "interactive_comments" is unset and is in effect. +function #function() { + echo "$1" +} From 90e8cb0094508e9e6932adcf42f5003251c47c26 Mon Sep 17 00:00:00 2001 From: Aliaksei Budavei <0x000c70@gmail.com> Date: Thu, 6 Aug 2026 18:58:42 +0000 Subject: [PATCH 301/647] runtime(sh): Fix shFunctionTwo and shFunctionFour definitions for Bash Claim e.g. "function f () { :; }" as shFunctionTwo while observing that parentheses after the function name are optional when the "function" word is used and do not delimit its body if the latter follows them in "{}" (which should not be taken for granted with limited backtracking). closes: #20878 Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt --- runtime/syntax/sh.vim | 8 ++++++-- runtime/syntax/testdir/dumps/sh_functions_bash_06.dump | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim index 90a712a00a..901923b0d3 100644 --- a/runtime/syntax/sh.vim +++ b/runtime/syntax/sh.vim @@ -651,9 +651,13 @@ if exists("b:is_bash") syn match shFunctionCmdOne "\%#=1^\s*\zs\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\s*()\ze\_s*\%(\%(for\|case\|select\|if\|while\|until\)\>\|\[\[\s\|((\)" skipwhite skipnl nextgroup=@shFunctionCmds contains=shFunctionParens syn match shFunctionCmdTwo "\%#=1\%(\%(\<\k\+\>\|[^()<>|&$;\t ]\+\)\+\)\@>\ze\s*\%(()\ze\)\=\_s*\%(\<\%(for\|case\|select\|if\|while\|until\)\>\|\[\[\s\|((\)" contained skipwhite skipnl nextgroup=@shFunctionCmds contains=shFunctionParens syn match shFunctionOne "\%#=1^\s*\zs\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\s*()\ze\_s*{" skipwhite skipnl nextgroup=shFunctionExpr contains=shFunctionParens - syn match shFunctionTwo "\%#=1\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\ze\s*\%(()\ze\)\=\_s*{" contained skipwhite skipnl nextgroup=shFunctionExpr contains=shFunctionParens syn match shFunctionThree "\%#=1^\s*\zs\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\s*()\ze\_s*((\@!" skipwhite skipnl nextgroup=shFunctionSubSh contains=shFunctionParens - syn match shFunctionFour "\%#=1\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\ze\s*\%(\%(()\ze\)\=\)\@>\_s*((\@!" contained skipwhite skipnl nextgroup=shFunctionSubSh contains=shFunctionParens + " Proof against future changes by inducing priority-driven "backtracking" + " between shFunctionFour (goes before) and shFunctionTwo (goes after) so + " that e.g. "function f () {}" is still claimed by shFunctionTwo (observe + " "f[[:blank:]]()"). + syn match shFunctionFour "\%#=1\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\ze\%(\%(\s*()\ze\)\=\)\@>\_s*((\@!" contained skipwhite skipnl nextgroup=shFunctionSubSh contains=shFunctionParens + syn match shFunctionTwo "\%#=1\%(\%(\<\k\+\|[^()<>|&$;\t ]\+\)\+\)\@>\ze\%(\%(\s*()\ze\)\=\)\@>\_s*{" contained skipwhite skipnl nextgroup=shFunctionExpr contains=shFunctionParens " Claim empty array assignments. syn match shArrayEmptyDecl "\%#=1\ze\%(\<\h\w*=\)\@>()" transparent nextgroup=shVariable " Claim commented out function declaration headers. diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump index 7fb4a39704..8ce19c9131 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump @@ -1,8 +1,8 @@ ||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|f|u+0#e000002&|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|$+0#e000e06&|@| +0#0000000&@50 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n| |(+0#e000e06&|)| +0#0000000&|{+0#e000e06&| +0#0000000&@41 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 -| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0|;+0#0000000&| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|f+0#e000002&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@40 +|-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n| |(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@41 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 +||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|f+0#e000002&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@40 | +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#00e0e07#ffffff0|u|n|c|t|i|o|n|#| |(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@58 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 From c0a19bc25efa6cc760e9629a1f7d1b985a03cb1d Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Thu, 6 Aug 2026 19:12:56 +0000 Subject: [PATCH 302/647] patch 9.2.0917: :quitall not allowed in the command-line window Problem: :quitall not allowed in the command-line window. Solution: Synchronise the command definition with that of the :qall alias, adding EX_CMDWIN and EX_LOCK_OK (Doug Kearns). closes: #20959 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- src/ex_cmds.h | 2 +- src/testdir/test_cmdwin.vim | 4 ++++ src/version.c | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 5dfb824764..a440483427 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -1271,7 +1271,7 @@ EXCMD(CMD_quit, "quit", ex_quit, EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_WINDOWS), EXCMD(CMD_quitall, "quitall", ex_quit_all, - EX_BANG|EX_TRLBAR, + EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_qall, "qall", ex_quit_all, EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, diff --git a/src/testdir/test_cmdwin.vim b/src/testdir/test_cmdwin.vim index 360dc67bb8..f5399f76de 100644 --- a/src/testdir/test_cmdwin.vim +++ b/src/testdir/test_cmdwin.vim @@ -171,6 +171,10 @@ func Test_cmdwin_jump_to_win() set modified call assert_fails('call feedkeys("q/:qall\", "xt")', ['E37:', 'E162:']) close! + new + set modified + call assert_fails('call feedkeys("q/:quitall\", "xt")', ['E37:', 'E162:']) + close! call feedkeys("q/:close\", "xt") call assert_equal(1, winnr('$')) call feedkeys("q/:exit\", "xt") diff --git a/src/version.c b/src/version.c index 78b210fdbc..5be07d868e 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 917, /**/ 916, /**/ From 1ae09867ff36a85b0328d43fb5672067fb5b3409 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 6 Aug 2026 19:23:04 +0000 Subject: [PATCH 303/647] patch 9.2.0918: screen: fill char with a zero low byte is stored as a NUL cell Problem: Using a multibyte fill character whose lower byte is zero, such as U+2500 for a popup border or 'fillchars', stores a NUL in ScreenLines[]. That marks the cell as the right half of a double-width character, and the GUI reports E340 when the window is resized (iranoan). Solution: Store 0x80 instead of the truncated character code, like fold_line() already does (Hirohito Higashi) related: vim-jp/issues#1460 closes: #20960 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/screen.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/screen.c b/src/screen.c index 07a237b0c6..201238c94d 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1233,6 +1233,7 @@ screen_line( { ScreenLinesUC[off_to] = c; ScreenLinesC[0][off_to] = 0; + ScreenLines[off_to] = 0x80; // avoid storing zero } else ScreenLinesUC[off_to] = 0; @@ -3081,6 +3082,7 @@ screen_fill( { ScreenLinesUC[off] = c; ScreenLinesC[0][off] = 0; + ScreenLines[off] = 0x80; // avoid storing zero } else ScreenLinesUC[off] = 0; diff --git a/src/version.c b/src/version.c index 5be07d868e..749988b251 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 918, /**/ 917, /**/ From 1989e9922a0ac2fddb0085b490bc10cd232ca598 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 6 Aug 2026 19:38:04 +0000 Subject: [PATCH 304/647] patch 9.2.0919: screen: the wrong array is copied into ScreenCols on a resize Problem: When the screen is resized without clearing, screenalloc() copies ScreenAttrs[] into the new ScreenCols[] instead of using ScreenCols[], so the virtual columns are replaced by attribute values. Since colnr_T is twice the size of sattr_T it also reads twice the intended number of bytes. Solution: Copy from ScreenCols[]. closes: #20961 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/screen.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/screen.c b/src/screen.c index 201238c94d..b4cf42ee6d 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3448,7 +3448,7 @@ screenalloc(int doclear) ScreenAttrs + LineOffset[old_row], (size_t)len * sizeof(sattr_T)); mch_memmove(new_ScreenCols + new_LineOffset[new_row], - ScreenAttrs + LineOffset[old_row], + ScreenCols + LineOffset[old_row], (size_t)len * sizeof(colnr_T)); } } diff --git a/src/version.c b/src/version.c index 749988b251..a3bf4a35a3 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 919, /**/ 918, /**/ From a1e2198a2ca8bbddcad69ade8629f371bcb4cf1f Mon Sep 17 00:00:00 2001 From: Bogdan Barbu Date: Thu, 6 Aug 2026 20:16:23 +0000 Subject: [PATCH 305/647] patch 9.2.0920: filetype: json-ld files are not recognized Problem: filetype: json-ld files are not recognized Solution: Detect *.jsonld files as jsonld filetype, include filetype, indent and syntax plugins (Bogdan Barbu). Reference: https://www.w3.org/TR/json-ld11/ closes: #20954 Signed-off-by: Bogdan Barbu Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 4 +- runtime/ftplugin/jsonld.vim | 10 +++++ runtime/indent/jsonld.vim | 6 +++ runtime/makemenu.vim | 3 +- runtime/synmenu.vim | 31 ++++++++-------- runtime/syntax/jsonld.vim | 31 ++++++++++++++++ runtime/syntax/testdir/dumps/jsonld_00.dump | 20 ++++++++++ runtime/syntax/testdir/dumps/jsonld_01.dump | 20 ++++++++++ runtime/syntax/testdir/dumps/jsonld_02.dump | 20 ++++++++++ runtime/syntax/testdir/input/jsonld.jsonld | 41 +++++++++++++++++++++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 + 12 files changed, 172 insertions(+), 17 deletions(-) create mode 100644 runtime/ftplugin/jsonld.vim create mode 100644 runtime/indent/jsonld.vim create mode 100644 runtime/syntax/jsonld.vim create mode 100644 runtime/syntax/testdir/dumps/jsonld_00.dump create mode 100644 runtime/syntax/testdir/dumps/jsonld_01.dump create mode 100644 runtime/syntax/testdir/dumps/jsonld_02.dump create mode 100644 runtime/syntax/testdir/input/jsonld.jsonld diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 398e2ae26b..6a20675f0c 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Jul 30 +# Last Change: 2026 Aug 06 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -2326,6 +2326,8 @@ const ft_from_ext = { "webmanifest": "json", # JSON Lines "jsonl": "jsonl", + # JSON-LD + "jsonld": "jsonld", # Jsonnet "jsonnet": "jsonnet", "libsonnet": "jsonnet", diff --git a/runtime/ftplugin/jsonld.vim b/runtime/ftplugin/jsonld.vim new file mode 100644 index 0000000000..bb4dde21c2 --- /dev/null +++ b/runtime/ftplugin/jsonld.vim @@ -0,0 +1,10 @@ +" Vim filetype plugin +" Language: JSON-LD +" Maintainer: The Vim Project +" Last Change: 2026 Aug 06 + +if exists('b:did_ftplugin') + finish +endif + +runtime! ftplugin/json.vim diff --git a/runtime/indent/jsonld.vim b/runtime/indent/jsonld.vim new file mode 100644 index 0000000000..96b9b06146 --- /dev/null +++ b/runtime/indent/jsonld.vim @@ -0,0 +1,6 @@ +" Vim indent file +" Language: JSON-LD +" Maintainer: The Vim Project +" Last Change: 2026 Aug 06 + +runtime! indent/json.vim diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 7ebf595063..98d88e6223 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -2,7 +2,7 @@ vim9script # Script to define the syntax menu in synmenu.vim # Maintainer: The Vim Project -# Last Change: 2026 Aug 03 +# Last Change: 2026 Aug 06 # Former Maintainer: Bram Moolenaar # This is used by "make menu" in the src directory. @@ -384,6 +384,7 @@ SynMenu HIJK.JJdescription:jjdescription SynMenu HIJK.Jovial:jovial SynMenu HIJK.JQ:jq SynMenu HIJK.JSON.JSON:json +SynMenu HIJK.JSON.JSON-LD:jsonld SynMenu HIJK.JSON.JSON5:json5 SynMenu HIJK.JSON.JSONC:jsonc SynMenu HIJK.Julia:julia diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index b744857ec3..b2259b930e 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -2,7 +2,7 @@ " This file is normally sourced from menu.vim. " " Maintainer: The Vim Project -" Last Change: 2025 Mar 09 +" Last Change: 2026 Aug 06 " Former Maintainer: Bram Moolenaar " Define the SetSyn function, used for the Syntax menu entries. @@ -365,20 +365,21 @@ an 50.50.780 &Syntax.HIJK.JJdescription :cal SetSyn("jjdescription") an 50.50.790 &Syntax.HIJK.Jovial :cal SetSyn("jovial") an 50.50.800 &Syntax.HIJK.JQ :cal SetSyn("jq") an 50.50.810 &Syntax.HIJK.JSON.JSON :cal SetSyn("json") -an 50.50.820 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5") -an 50.50.830 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc") -an 50.50.840 &Syntax.HIJK.Julia :cal SetSyn("julia") -an 50.50.850 &Syntax.HIJK.Just :cal SetSyn("just") -an 50.50.870 &Syntax.HIJK.Karel :cal SetSyn("karel") -an 50.50.880 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") -an 50.50.890 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") -an 50.50.900 &Syntax.HIJK.Kdl :cal SetSyn("kdl") -an 50.50.910 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") -an 50.50.920 &Syntax.HIJK.Kitty :cal SetSyn("kitty") -an 50.50.930 &Syntax.HIJK.Kivy :cal SetSyn("kivy") -an 50.50.940 &Syntax.HIJK.KixTart :cal SetSyn("kix") -an 50.50.950 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin") -an 50.50.960 &Syntax.HIJK.Krl :cal SetSyn("krl") +an 50.50.820 &Syntax.HIJK.JSON.JSON-LD :cal SetSyn("jsonld") +an 50.50.830 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5") +an 50.50.840 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc") +an 50.50.850 &Syntax.HIJK.Julia :cal SetSyn("julia") +an 50.50.860 &Syntax.HIJK.Just :cal SetSyn("just") +an 50.50.880 &Syntax.HIJK.Karel :cal SetSyn("karel") +an 50.50.890 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") +an 50.50.900 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") +an 50.50.910 &Syntax.HIJK.Kdl :cal SetSyn("kdl") +an 50.50.920 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") +an 50.50.930 &Syntax.HIJK.Kitty :cal SetSyn("kitty") +an 50.50.940 &Syntax.HIJK.Kivy :cal SetSyn("kivy") +an 50.50.950 &Syntax.HIJK.KixTart :cal SetSyn("kix") +an 50.50.960 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin") +an 50.50.970 &Syntax.HIJK.Krl :cal SetSyn("krl") an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace") an 50.60.110 &Syntax.L.LambdaProlog :cal SetSyn("lprolog") an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte") diff --git a/runtime/syntax/jsonld.vim b/runtime/syntax/jsonld.vim new file mode 100644 index 0000000000..3b933b0ec2 --- /dev/null +++ b/runtime/syntax/jsonld.vim @@ -0,0 +1,31 @@ +" Vim syntax file +" Language: JSON-LD +" Maintainer: The Vim Project +" Last Change: 2026 Aug 06 +" Reference: https://www.w3.org/TR/json-ld11/ + +if !exists('main_syntax') + if exists('b:current_syntax') + finish + endif + let main_syntax = 'jsonld' +endif + +runtime! syntax/json.vim +unlet! b:current_syntax + +" Match reserved keywords only when they occupy a complete JSON string. The +" negative lookbehind excludes an escaped quote inside a longer string. +syn match jsonldKeyword /\C\%(\\"\)\@{+0#e000e06#ffffff0| +0#0000000&@73 +@2|"|k+0#af5f00255&|e|y|w|o|r|d|s|A|s|K|e|y|s|"+0#0000000&|:| |{+0#e000e06&| +0#0000000&@53 +@4|"|@+0#e000e06&|b|a|s|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|c|o|n|t|a|i|n|e|r|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @36 +@4|"|@+0#e000e06&|c|o|n|t|e|x|t|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|d|i|r|e|c|t|i|o|n|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @33 +@4|"|@+0#e000e06&|g|r|a|p|h|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|i|d|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @42 +@4|"|@+0#e000e06&|i|m|p|o|r|t|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|i|n|c|l|u|d|e|d|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @35 +@4|"|@+0#e000e06&|i|n|d|e|x|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|j|s|o|n|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @40 +@4|"|@+0#e000e06&|l|a|n|g|u|a|g|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|l|i|s|t|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @37 +@4|"|@+0#e000e06&|n|e|s|t|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|n|o|n|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @41 +@4|"|@+0#e000e06&|p|r|e|f|i|x|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|p|r|o|p|a|g|a|t|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @34 +@4|"|@+0#e000e06&|p|r|o|t|e|c|t|e|d|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|r|e|v|e|r|s|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @33 +@4|"|@+0#e000e06&|s|e|t|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|t|y|p|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @42 +@4|"|@+0#e000e06&|v|a|l|u|e|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| |"|@+0#e000e06&|v|e|r|s|i|o|n|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @37 +@4|"|@+0#e000e06&|v|o|c|a|b|"+0#0000000&|:| |n+0#00e0e07&|u|l@1| +0#0000000&@56 +@2|}+0#e000e06&|,+0#0000000&| @70 +@2|"|k+0#af5f00255&|e|y|w|o|r|d|s|A|s|V|a|l|u|e|s|"+0#0000000&|:| |[+0#e000e06&| +0#0000000&@51 +@4|"|@+0#e000e06&|b|a|s|e|"+0#0000000&|,| |"|@+0#e000e06&|c|o|n|t|a|i|n|e|r|"+0#0000000&|,| |"|@+0#e000e06&|c|o|n|t|e|x|t|"+0#0000000&|,| |"|@+0#e000e06&|d|i|r|e|c|t|i|o|n|"+0#0000000&|,| @22 +@4|"|@+0#e000e06&|g|r|a|p|h|"+0#0000000&|,| |"|@+0#e000e06&|i|d|"+0#0000000&|,| |"|@+0#e000e06&|i|m|p|o|r|t|"+0#0000000&|,| |"|@+0#e000e06&|i|n|c|l|u|d|e|d|"+0#0000000&|,| @30 +@4|"|@+0#e000e06&|i|n|d|e|x|"+0#0000000&|,| |"|@+0#e000e06&|j|s|o|n|"+0#0000000&|,| |"|@+0#e000e06&|l|a|n|g|u|a|g|e|"+0#0000000&|,| |"|@+0#e000e06&|l|i|s|t|"+0#0000000&|,| @30 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/jsonld_01.dump b/runtime/syntax/testdir/dumps/jsonld_01.dump new file mode 100644 index 0000000000..0115416e92 --- /dev/null +++ b/runtime/syntax/testdir/dumps/jsonld_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@3|"|@+0#e000e06&|v|o|c|a|b|"+0#0000000&|:| |n+0#00e0e07&|u|l@1| +0#0000000&@56 +@2|}+0#e000e06&|,+0#0000000&| @70 +@2|"|k+0#af5f00255&|e|y|w|o|r|d|s|A|s|V|a|l|u|e|s|"+0#0000000&|:| |[+0#e000e06&| +0#0000000&@51 +@4|"|@+0#e000e06&|b|a|s|e|"+0#0000000&|,| |"|@+0#e000e06&|c|o|n|t|a|i|n|e|r|"+0#0000000&|,| |"|@+0#e000e06&|c|o|n|t|e|x|t|"+0#0000000&|,| |"|@+0#e000e06&|d|i|r|e|c|t|i|o|n|"+0#0000000&|,| @22 +@4|"|@+0#e000e06&|g|r|a|p|h|"+0#0000000&|,| |"|@+0#e000e06&|i|d|"+0#0000000&|,| |"|@+0#e000e06&|i|m|p|o|r|t|"+0#0000000&|,| |"|@+0#e000e06&|i|n|c|l|u|d|e|d|"+0#0000000&|,| @30 +@4>"|@+0#e000e06&|i|n|d|e|x|"+0#0000000&|,| |"|@+0#e000e06&|j|s|o|n|"+0#0000000&|,| |"|@+0#e000e06&|l|a|n|g|u|a|g|e|"+0#0000000&|,| |"|@+0#e000e06&|l|i|s|t|"+0#0000000&|,| @30 +@4|"|@+0#e000e06&|n|e|s|t|"+0#0000000&|,| |"|@+0#e000e06&|n|o|n|e|"+0#0000000&|,| |"|@+0#e000e06&|p|r|e|f|i|x|"+0#0000000&|,| |"|@+0#e000e06&|p|r|o|p|a|g|a|t|e|"+0#0000000&|,| @28 +@4|"|@+0#e000e06&|p|r|o|t|e|c|t|e|d|"+0#0000000&|,| |"|@+0#e000e06&|r|e|v|e|r|s|e|"+0#0000000&|,| |"|@+0#e000e06&|s|e|t|"+0#0000000&|,| |"|@+0#e000e06&|t|y|p|e|"+0#0000000&|,| @28 +@4|"|@+0#e000e06&|v|a|l|u|e|"+0#0000000&|,| |"|@+0#e000e06&|v|e|r|s|i|o|n|"+0#0000000&|,| |"|@+0#e000e06&|v|o|c|a|b|"+0#0000000&| @40 +@2|]+0#e000e06&|,+0#0000000&| @70 +@2|"|n+0#af5f00255&|e|a|r|M|i|s@1|e|s|"+0#0000000&|:| |{+0#e000e06&| +0#0000000&@57 +@4|"|@+0#af5f00255&|i|d|e|n|t|i|f|i|e|r|"+0#0000000&|:| |"|@+0#e000002&|t|h|i|n|g|"+0#0000000&|,| @46 +@4|"|@+0#af5f00255&|I|D|"+0#0000000&|:| |"|p+0#e000002&|r|e|f|i|x|@|i|d|"+0#0000000&|,| @51 +@4|"|e+0#af5f00255&|s|c|a|p|e|d|Q|u|o|t|e|"+0#0000000&|:| |"|p+0#e000002&|r|e|f|i|x|\+0#e000e06&|"|@+0#e000002&|i|d|"+0#0000000&|,| @40 +@4|"|@+0#af5f00255&|\|u|0@1|6|9|d|"+0#0000000&|:| |"|@+0#e000002&|\+0#e000e06&|u|0@1|6|9|d+0#e000002&|"+0#0000000&|,| @47 +@4|"|i+0#af5f00255&|d|e|n|t|i|f|i|e|r|"+0#0000000&|:| |"|@+0#e000e06&|i|d|"+0#0000000&|,| @50 +@4|"|i+0#af5f00255&|r|i|"+0#0000000&|:| |"|h+0#e000002&|t@1|p|s|:|/@1|e|x|a|m|p|l|e|.|c|o|m|/|@|i|d|"+0#0000000&|,| @37 +@4|"|c+0#af5f00255&|o|m|p|a|c|t|I|r|i|"+0#0000000&|:| |"|s+0#e000002&|c|h|e|m|a|:|n|a|m|e|"+0#0000000&|,| @42 +@4|"|b+0#af5f00255&|l|a|n|k|N|o|d|e|"+0#0000000&|:| |"|_+0#e000002&|:|n|o|d|e|"+0#0000000&| @49 +@57|1|9|,|5| @9|5|9|%| diff --git a/runtime/syntax/testdir/dumps/jsonld_02.dump b/runtime/syntax/testdir/dumps/jsonld_02.dump new file mode 100644 index 0000000000..3c1f89d12e --- /dev/null +++ b/runtime/syntax/testdir/dumps/jsonld_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@3|"|b+0#af5f00255&|l|a|n|k|N|o|d|e|"+0#0000000&|:| |"|_+0#e000002&|:|n|o|d|e|"+0#0000000&| @49 +@2|}+0#e000e06&|,+0#0000000&| @70 +@2|"|o+0#af5f00255&|r|d|i|n|a|r|y|J|s|o|n|"+0#0000000&|:| |{+0#e000e06&| +0#0000000&@55 +@4|"|s+0#af5f00255&|t|r|i|n|g|"+0#0000000&|:| |"|t+0#e000002&|e|x|t|"+0#0000000&|,| @53 +@4|"|n+0#af5f00255&|u|m|b|e|r|"+0#0000000&|:| |-+0#e000002&|1|2|.|5|e|+|2|,+0#0000000&| @51 +@4>"|b+0#af5f00255&|o@1|l|e|a|n|"+0#0000000&|:| |t+0#e000002&|r|u|e|,+0#0000000&| @54 +@4|"|n+0#af5f00255&|o|t|h|i|n|g|"+0#0000000&|:| |n+0#00e0e07&|u|l@1|,+0#0000000&| @54 +@4|"|a+0#af5f00255&|r@1|a|y|"+0#0000000&|:| |[+0#e000e06&|f+0#e000002&|a|l|s|e|,+0#0000000&| |0+0#e000002&|,+0#0000000&| |"|v+0#e000002&|a|l|u|e|"+0#0000000&|]+0#e000e06&| +0#0000000&@42 +@2|}+0#e000e06&| +0#0000000&@71 +|}+0#e000e06&| +0#0000000&@73 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|7|,|5| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/jsonld.jsonld b/runtime/syntax/testdir/input/jsonld.jsonld new file mode 100644 index 0000000000..b0bf8f7b6d --- /dev/null +++ b/runtime/syntax/testdir/input/jsonld.jsonld @@ -0,0 +1,41 @@ +{ + "keywordsAsKeys": { + "@base": null, "@container": null, + "@context": null, "@direction": null, + "@graph": null, "@id": null, + "@import": null, "@included": null, + "@index": null, "@json": null, + "@language": null, "@list": null, + "@nest": null, "@none": null, + "@prefix": null, "@propagate": null, + "@protected": null, "@reverse": null, + "@set": null, "@type": null, + "@value": null, "@version": null, + "@vocab": null + }, + "keywordsAsValues": [ + "@base", "@container", "@context", "@direction", + "@graph", "@id", "@import", "@included", + "@index", "@json", "@language", "@list", + "@nest", "@none", "@prefix", "@propagate", + "@protected", "@reverse", "@set", "@type", + "@value", "@version", "@vocab" + ], + "nearMisses": { + "@identifier": "@thing", + "@ID": "prefix@id", + "escapedQuote": "prefix\"@id", + "@\u0069d": "@\u0069d", + "identifier": "@id", + "iri": "https://example.com/@id", + "compactIri": "schema:name", + "blankNode": "_:node" + }, + "ordinaryJson": { + "string": "text", + "number": -12.5e+2, + "boolean": true, + "nothing": null, + "array": [false, 0, "value"] + } +} diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 59020deae2..428f7580bf 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -432,6 +432,7 @@ def s:GetFilenameChecks(): dict> json5: ['file.json5'], jsonc: ['file.jsonc', '.babelrc', '.eslintrc', '.jsfmtrc', '.jshintrc', '.jscsrc', '.vsconfig', '.hintrc', '.swrc', 'jsconfig.json', 'osquery.conf', 'tsconfig.json', 'tsconfig.test.json', 'tsconfig-test.json', '.luaurc', 'bun.lock', expand("$HOME/.config/VSCodium/User/settings.json"), '/home/user/.config/waybar/config' ], jsonl: ['file.jsonl'], + jsonld: ['file.jsonld'], jsonnet: ['file.jsonnet', 'file.libsonnet'], jsp: ['file.jsp'], julia: ['file.jl'], diff --git a/src/version.c b/src/version.c index a3bf4a35a3..674e2fbad5 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 920, /**/ 919, /**/ From b77d4da3da5c91b2e7ae4bdff606f31a80fb7b7d Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 7 Aug 2026 19:47:24 +0000 Subject: [PATCH 306/647] patch 9.2.0921: test: terminal tests fail on FreeBSD Problem: terminal test fail on FreeBSD: the shell enables its line editor when interactive on a terminal, which echoes the typed command a second time and shifts the output down by one line, so getline(2) returns "exit" instead of the value. Solution: Point $ENV to a startup file that turns the line editor off in Run_shell_in_terminal(). POSIX shells read it at startup and it produces no output of its own; shells that do not use $ENV ignore it (neil). closes: #20972 Signed-off-by: neil Signed-off-by: Christian Brabandt --- src/testdir/util/term_util.vim | 20 +++++++++++++++++++- src/version.c | 2 ++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/testdir/util/term_util.vim b/src/testdir/util/term_util.vim index afb44c8dbb..d362976847 100644 --- a/src/testdir/util/term_util.vim +++ b/src/testdir/util/term_util.vim @@ -181,11 +181,29 @@ endfunc " Open a terminal with a shell, assign the job to g:job and return the buffer " number. +" Some shells turn on a line editor when they are interactive on a +" terminal; FreeBSD /bin/sh does. The editor redraws the line the +" terminal has already echoed, so a command can land in the buffer +" twice and shift everything below it. POSIX shells read $ENV at +" startup and it produces no output of its own; shells that do not +" use $ENV ignore the variable. +let s:shell_env_file = '' + +func s:ShellStartupFile() + if s:shell_env_file == '' || !filereadable(s:shell_env_file) + let s:shell_env_file = tempname() + call writefile(['set +o emacs 2>/dev/null', 'set +o vi 2>/dev/null'], s:shell_env_file) + endif + return s:shell_env_file +endfunc + func Run_shell_in_terminal(options) if has('win32') let buf = term_start([&shell, '/D', '/k'], a:options) else - let buf = term_start(&shell, a:options) + let options = copy(a:options) + let options.env = extend({'ENV': s:ShellStartupFile()}, get(a:options, 'env', {})) + let buf = term_start(&shell, options) endif let g:test_is_flaky = 1 diff --git a/src/version.c b/src/version.c index 674e2fbad5..0986404464 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 921, /**/ 920, /**/ From 2c0318d2854418d26032352ab1152b598642e38a Mon Sep 17 00:00:00 2001 From: Rochish Manda <28740792+Rochish-Manda@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:55:47 +0000 Subject: [PATCH 307/647] runtime(doc): fix typo in netrw help file closes: #20968 Signed-off-by: Rochish Manda <28740792+Rochish-Manda@users.noreply.github.com> Signed-off-by: Christian Brabandt --- runtime/doc/pi_netrw.txt | 2 +- runtime/pack/dist/opt/netrw/doc/netrw.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/pi_netrw.txt b/runtime/doc/pi_netrw.txt index e3c06852cc..9a0533bc4f 100644 --- a/runtime/doc/pi_netrw.txt +++ b/runtime/doc/pi_netrw.txt @@ -2609,7 +2609,7 @@ your browsing preferences. (see also: |netrw-settings|) otherwise "dir" *g:netrw_glob_escape* ='[]*?`{~$' (unix) - ='[]*?`{$' (windows + ='[]*?`{$' (windows) These characters in directory names are escaped before applying glob() diff --git a/runtime/pack/dist/opt/netrw/doc/netrw.txt b/runtime/pack/dist/opt/netrw/doc/netrw.txt index 6fe5c5ebee..cd00cbe794 100644 --- a/runtime/pack/dist/opt/netrw/doc/netrw.txt +++ b/runtime/pack/dist/opt/netrw/doc/netrw.txt @@ -2609,7 +2609,7 @@ your browsing preferences. (see also: |netrw-settings|) otherwise "dir" *g:netrw_glob_escape* ='[]*?`{~$' (unix) - ='[]*?`{$' (windows + ='[]*?`{$' (windows) These characters in directory names are escaped before applying glob() From 60e57c8c22457e20d050041f985d1957825b0a6d Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Fri, 7 Aug 2026 20:01:34 +0000 Subject: [PATCH 308/647] patch 9.2.0922: Wayland: modeless selection not redrawn Problem: Modeless mouse selection on Wayland may not redraw while Vim is waiting for input, causing the selection highlight to lag behind mouse movement (lilydjwg). Solution: Flush pending GUI updates while a modeless selection is in progress (Christoffer Aasted). * X11 was not affected. * Tested FEAT_TINY, 'clipboard', 'mouse' settings. fixes: #20969 closes: #20971 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 6 ++++++ src/version.c | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 6b56a1ee5c..2e60484ee0 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -6909,7 +6909,13 @@ gui_mch_wait_for_chars(long wtime) * situations, sort of race condition). */ if (!input_available()) + { g_main_context_iteration(NULL, TRUE); +#ifdef GDK_WINDOWING_WAYLAND + if (gui.is_wayland && clip_star.state == SELECT_IN_PROGRESS) + gui_may_flush(); +#endif + } // Got char, return immediately if (input_available()) diff --git a/src/version.c b/src/version.c index 0986404464..5f5600db74 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 922, /**/ 921, /**/ From a05bd64c1dcde65006997efe0ff5ae6b8a9aa382 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 7 Aug 2026 20:09:30 +0000 Subject: [PATCH 309/647] patch 9.2.0923: tabpage: closing a tab page loses the alternate tab page Problem: Closing the current tab page resets the alternate tab page, even when that is another tab page which still exists, so that CTRL-Tab stops working (igorlfs). Solution: Restore the last used tab page after entering another one to close the current one (Hirohito Higashi). related: #20965 closes: #20973 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_tabpage.vim | 17 +++++++++++++++++ src/version.c | 2 ++ src/window.c | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim index 05c5669673..e3749cf042 100644 --- a/src/testdir/test_tabpage.vim +++ b/src/testdir/test_tabpage.vim @@ -942,6 +942,23 @@ func Test_lastused_tabpage() tabonly! endfunc +" Closing a tab page must keep the last used tab page when it is another one. +func Test_lastused_tabpage_close() + tabonly! + tabnew + tabnew + tabfirst + tablast + call assert_equal(1, tabpagenr('#')) + + tabclose + call assert_equal(1, tabpagenr('#')) + call feedkeys("g\", "xt") + call assert_equal(1, tabpagenr()) + + tabonly! +endfunc + " Test for tabpage allocation failure func Test_tabpage_alloc_failure() call test_alloc_fail(GetAllocId('newtabpage_tvars'), 0, 0) diff --git a/src/version.c b/src/version.c index 5f5600db74..d1a1f6689e 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 923, /**/ 922, /**/ diff --git a/src/window.c b/src/window.c index 8ac5b8f5ea..4d4cfab448 100644 --- a/src/window.c +++ b/src/window.c @@ -2665,6 +2665,7 @@ close_last_window_tabpage( return FALSE; buf_T *old_curbuf = curbuf; + tabpage_T *save_lastused = lastused_tabpage; /* * Closing the last window in a tab page. First go to another tab @@ -2682,6 +2683,11 @@ close_last_window_tabpage( // to the other tab page. if (valid_tabpage(prev_curtab) && prev_curtab->tp_firstwin == win) win_close_othertab(win, free_buf, prev_curtab); + + // Entering the other tab page made the closed one the last used tab page. + // Restore the previous one when it is still there. + if (valid_tabpage(save_lastused) && save_lastused != curtab) + lastused_tabpage = save_lastused; #ifdef FEAT_JOB_CHANNEL entering_window(curwin); #endif From a6be0d496a03261bb3c81dcfd1189fbec89c1352 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 7 Aug 2026 20:12:39 +0000 Subject: [PATCH 310/647] CI: Add Github runner for Cygwin Vim can be built for Cygwin with the Unix Makefile, but nothing covers it. The Windows runner builds with MSVC and MinGW only, and the Cirrus CI job that was removed in 0abffbff ran FreeBSD alone. Add a GitHub Actions workflow that configures and builds under Cygwin. It runs once per day instead of per push, and skips the run when nothing was committed since the previous one, because the Cygwin runner is slow. Only the tiny test suite, the unit tests and the libvterm tests are run: the script tests need sockets, PowerShell, network access and POSIX file permissions, which do not behave the same under Cygwin. closes: #20970 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- .github/workflows/ci-cygwin.yml | 118 ++++++++++++++++++++++++++++++++ Filelist | 1 + 2 files changed, 119 insertions(+) create mode 100644 .github/workflows/ci-cygwin.yml diff --git a/.github/workflows/ci-cygwin.yml b/.github/workflows/ci-cygwin.yml new file mode 100644 index 0000000000..e4737967b5 --- /dev/null +++ b/.github/workflows/ci-cygwin.yml @@ -0,0 +1,118 @@ +name: CI for Cygwin + +on: + schedule: + - cron: '30 23 * * *' # Run once per day, Cygwin runners are slow + workflow_dispatch: + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + # Skip the run when nothing was committed since the previous one. + check: + runs-on: ubuntu-24.04 + + outputs: + changed: ${{ steps.check.outputs.changed }} + + steps: + - name: Look for commits in the last day + id: check + env: + GH_TOKEN: ${{ github.token }} + run: | + date=$(gh api "repos/${{ github.repository }}/commits?sha=${{ github.ref_name }}" \ + --jq '.[0].commit.committer.date') + if [ "$(date -d "${date}" +%s)" -gt "$(date -d '25 hours ago' +%s)" ]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + + cygwin: + needs: check + if: needs.check.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' + + runs-on: windows-2022 + + env: + # Keep Cygwin out of the Windows PATH: the post-checkout cleanup would + # run Cygwin's git on a Windows path and fail. A login shell sets up + # the Cygwin PATH, CHERE_INVOKING keeps it in the workspace. + CHERE_INVOKING: 1 + CYGWIN_NOWINPATH: 1 + SRCDIR: ./src + TERM: xterm + + defaults: + run: + shell: C:\cygwin\bin\bash.exe --login -eo pipefail -o igncr '{0}' + + strategy: + fail-fast: false + matrix: + features: [tiny, normal, huge] + + steps: + # Cygwin cannot run shell scripts checked out with CRLF line endings. + - name: Set up git + shell: pwsh + run: git config --global core.autocrlf input + + - name: Checkout repository from GitHub + uses: actions/checkout@v7.0.1 + + - name: Install Cygwin + uses: cygwin/cygwin-install-action@v6 + with: + add-to-path: false + packages: >- + diffutils + gcc-core + gettext-devel + libiconv-devel + libncurses-devel + libtool + make + + - name: Set up environment + run: | + ( + echo "NPROC=$(getconf _NPROCESSORS_ONLN)" + # The script tests need sockets, PowerShell, network access and + # POSIX file permissions, which do not work the same under Cygwin. + case "${{ matrix.features }}" in + tiny) + echo "TEST=testtiny" + ;; + *) + echo "TEST=unittests test_libvterm" + ;; + esac + ) >> "${GITHUB_ENV}" + + - name: Configure + run: | + ./configure --with-features=${{ matrix.features }} --disable-gui + + - name: Build + timeout-minutes: 20 + run: | + make -j"${NPROC}" + + - name: Check version + run: | + "${SRCDIR}"/vim --version + + # Run the tests from the src directory: the top level Makefile also runs + # the indent and syntax tests, which the Linux runner already covers. + - name: Test + timeout-minutes: 40 + run: | + cd "${SRCDIR}" + make ${TEST} + + - name: Upload failed test artifacts + if: ${{ !cancelled() }} + uses: ./.github/actions/test_artifacts diff --git a/Filelist b/Filelist index 945c87e031..ca9e8a7b99 100644 --- a/Filelist +++ b/Filelist @@ -8,6 +8,7 @@ SRC_ALL = \ .github/MAINTAINERS \ .github/ISSUE_TEMPLATE/bug_report.yml \ .github/ISSUE_TEMPLATE/feature_request.md \ + .github/workflows/ci-cygwin.yml \ .github/workflows/ci-linux.yml \ .github/workflows/ci-linux_asan.yml \ .github/workflows/ci-macos.yml \ From 26a1e90a57eeed352fda62f3f4477415392a6a02 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 7 Aug 2026 20:17:03 +0000 Subject: [PATCH 311/647] patch 9.2.0924: tests: Test_termwinscroll() fails on FreeBSD Problem: tests: Test_termwinscroll() fails on FreeBSD Solution: Explicitly disable line-editor feature (neil). closes: #20966 Supported by AI. Signed-off-by: neil Signed-off-by: Christian Brabandt --- src/testdir/test_terminal2.vim | 5 +++++ src/version.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/testdir/test_terminal2.vim b/src/testdir/test_terminal2.vim index 41ef3c5f66..6223869d21 100644 --- a/src/testdir/test_terminal2.vim +++ b/src/testdir/test_terminal2.vim @@ -224,6 +224,11 @@ func Test_termwinscroll() exe 'set termwinscroll=' . &lines let buf = term_start('/bin/sh') call TermWait(buf) + " Some shells enable a line editor when interactive on a terminal, + " which echoes the typed line a second time; "+o" is a no-op on + " shells that have none. + call feedkeys("set +o emacs\", 'xt') + call TermWait(buf) for i in range(1, &lines) call feedkeys("echo " . i . "\", 'xt') call WaitForAssert({-> assert_match(string(i), term_getline(buf, term_getcursor(buf)[0] - 1))}) diff --git a/src/version.c b/src/version.c index d1a1f6689e..c0bd293658 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 924, /**/ 923, /**/ From e2dcefa0d8c03a7d2ebda67207e3d1392ae0c402 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 7 Aug 2026 20:22:20 +0000 Subject: [PATCH 312/647] patch 9.2.0925: crash when getcompletiontype() gets a NULL string Problem: Crash when getcompletiontype()/getcompletion() gets a NULL string (dvaave2025). Solution: Do not write the NUL terminator in set_cmd_context() when the cursor column is at or past the end of the string, since the string may be a read-only literal. fixes: #20963 closes: #20964 Supported by AI. Signed-off-by: Christian Brabandt --- src/cmdexpand.c | 14 ++++++++++---- src/testdir/test_cmdline.vim | 5 +++++ src/version.c | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 34edf25ef0..98ce6259f5 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -3133,11 +3133,16 @@ set_cmd_context( int old_char = NUL; char_u *nextcomm; - // Avoid a UMR warning from Purify, only save the character if it has been - // written before. + // Only save and overwrite the character when it is not the NUL terminator + // already. "str" may be a read-only empty string: tv_get_string() falls + // back to a "" literal for a NULL string or on a type error, and writing + // at "col" would then crash. + // This also avoids a UMR warning from Purify. if (col < len) + { old_char = str[col]; - str[col] = NUL; + str[col] = NUL; + } nextcomm = str; #ifdef FEAT_EVAL @@ -3168,7 +3173,8 @@ set_cmd_context( xp->xp_line = str; xp->xp_col = col; - str[col] = old_char; + if (col < len) + str[col] = old_char; } /* diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index a83dcb973c..68e66918cc 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -1024,6 +1024,11 @@ func Test_getcompletiontype() call assert_equal('var', getcompletiontype('let v:n')) call assert_equal('function', getcompletiontype('call tag')) call assert_equal('help', getcompletiontype('help ')) + " must not write into a read-only empty string + call assert_equal('command', getcompletiontype(test_null_string())) + call assert_equal(getcompletion('', 'cmdline'), + \ getcompletion(test_null_string(), 'cmdline')) + call assert_fails('call getcompletion([], "cmdline")', 'E730:') endfunc func Test_multibyte_expression() diff --git a/src/version.c b/src/version.c index c0bd293658..4e1ff82f62 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 925, /**/ 924, /**/ From e0b81136c76a5ab2203eb6f6ece0225f2565e42e Mon Sep 17 00:00:00 2001 From: Bogdan Barbu Date: Sat, 8 Aug 2026 17:11:42 +0000 Subject: [PATCH 313/647] runtime(doc): DocBook syntax variable scopes are not clearly documented Problem: DocBook syntax variable scopes of docbk_type and docbk_ver are not clearly documented: docbk_type uses the wrong scope (it should be buffer-local) and docbk_ver also has an undocumented buffer-local version. Solution: Correct the docbk_type examples and describe the docbk_ver precedence. closes: #20977 Signed-off-by: Bogdan Barbu Signed-off-by: Christian Brabandt --- runtime/doc/syntax.txt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 80f9baa4a9..577229ae37 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 02 +*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1407,18 +1407,20 @@ are using the "b:docbk_type" variable should be set. Vim does this for you automatically if it can recognize the type. When Vim can't guess it the type defaults to XML. You can set the type manually: > - :let docbk_type = "sgml" + :let b:docbk_type = "sgml" or: > - :let docbk_type = "xml" + :let b:docbk_type = "xml" You need to do this before loading the syntax file, which is complicated. Simpler is setting the filetype to "docbkxml" or "docbksgml": > :set filetype=docbksgml or: > :set filetype=docbkxml -You can specify the DocBook version: > - :let docbk_ver = 3 -When not set 4 is used. +You can specify the DocBook version for the current buffer: > + :let b:docbk_ver = 3 +When "b:docbk_ver" is not set, "g:docbk_ver" is used as a global fallback: > + :let g:docbk_ver = 3 +When neither variable is set, version 4 is used. DOSBATCH *dosbatch.vim* *ft-dosbatch-syntax* From 9b41cf6386bc0afd1bf5eca396adfdd488e617d0 Mon Sep 17 00:00:00 2001 From: Torben Leth Date: Sat, 8 Aug 2026 17:24:06 +0000 Subject: [PATCH 314/647] patch 9.2.0926: filetype: Business Central files are not recognized Problem: filetype: Business Central files are not recognized Solution: Add filetype detection logic for *.al files to detect perl or use either perl or al filetype (Torben Leth). Reference: https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-dev-overview closes: #20975 Supported by AI. Signed-off-by: Torben Leth Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 30 +++++++++++++++++++- runtime/doc/filetype.txt | 3 +- runtime/filetype.vim | 7 +++-- src/testdir/test_filetype.vim | 53 ++++++++++++++++++++++++++++++++++- src/version.c | 2 ++ 5 files changed, 90 insertions(+), 5 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 6a20675f0c..bf8a0cc36c 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Aug 06 +# Last Change: 2026 Aug 08 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -41,6 +41,34 @@ export def Check_inp() endif enddef +# AL (Microsoft Dynamics 365 Business Central) or Perl AutoLoader +export def FTal() + if exists("g:filetype_al") + exe "setf " .. g:filetype_al + return + endif + + # AL sources declare an object as " " at the start of a + # line, optionally preceded by namespace and using declarations. Perl + # AutoLoader chunks match neither. Matching a bare keyword anywhere would + # be wrong: table, page and report are ordinary English words, so the object + # name must follow. The match is case sensitive because AL tooling emits + # lowercase keywords, while prose in Perl comments is usually capitalised. + for lnum in range(1, min([line("$"), 200])) + var line = getline(lnum) + if line =~# '^\s*\%(codeunit\|page\|pageextension\|pagecustomization\|table\|tableextension\|' .. + 'report\|reportextension\|xmlport\|query\|enum\|enumextension\|profile\|profileextension\|' .. + 'controladdin\|interface\|permissionset\|permissionsetextension\|entitlement\)\>\s\+\%(\d\|"\|\u\)' + || line =~# '^\s*dotnet\s*$' + || line =~# '^\s*\%(namespace\|using\)\s\+[[:alnum:]._]\+\s*;' + setf al + return + endif + endfor + + setf perl +enddef + # Erlang Application Resource Files (*.app.src is matched by extension) # See: https://erlang.org/doc/system/applications export def FTapp() diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt index f37865ee5f..8437531a81 100644 --- a/runtime/doc/filetype.txt +++ b/runtime/doc/filetype.txt @@ -1,4 +1,4 @@ -*filetype.txt* For Vim version 9.2. Last change: 2026 Jul 01 +*filetype.txt* For Vim version 9.2. Last change: 2026 Aug 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -138,6 +138,7 @@ what kind of file it is. This doesn't always work. A number of global variables can be used to overrule the filetype used for certain extensions: file name variable ~ + *.al g:filetype_al *.app g:filetype_app *.as g:filetype_as *.asa g:filetype_asa |ft-aspperl-syntax| diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 01a5130227..36b052ca36 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: The Vim Project -" Last Change: 2026 Jul 18 +" Last Change: 2026 Aug 08 " Former Maintainer: Bram Moolenaar " If the filetype can be detected from extension or file name(the final path component), @@ -862,7 +862,10 @@ if has("fname_case") else au BufNewFile,BufRead *.pl call dist#ft#FTpl() endif -au BufNewFile,BufRead *.plx,*.al,*.psgi setf perl +au BufNewFile,BufRead *.plx,*.psgi setf perl + +" Perl AutoLoader or AL (Dynamics 365 Business Central) +au BufNewFile,BufRead *.al call dist#ft#FTal() " Perl, XPM or XPM2 au BufNewFile,BufRead *.pm diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 428f7580bf..893e3d8d0c 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -635,7 +635,7 @@ def s:GetFilenameChecks(): dict> pcmk: ['file.pcmk'], pdf: ['file.pdf'], pem: ['file.pem', 'file.cer', 'file.crt', 'file.csr'], - perl: ['file.plx', 'file.al', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc', '.latexmkrc', 'latexmkrc'], + perl: ['file.plx', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc', '.latexmkrc', 'latexmkrc'], pf: ['pf.conf'], pfmain: ['main.cf', 'main.cf.proto'], php: ['file.php', 'file.php9', 'file.phtml', 'file.ctp', 'file.phpt', 'file.theme'], @@ -1268,6 +1268,57 @@ endfunc " Keep sorted. """"""""""""""""""""""""""""""""""""""""""""""""" +func Test_al_file() + filetype on + + " AL object declaration + call writefile(['codeunit 50100 "My Codeunit"', '{', '}'], 'Xfile.al', 'D') + split Xfile.al + call assert_equal('al', &filetype) + bwipe! + + " AL namespace and using declarations before the object + call writefile(['namespace Microsoft.Sales;', '', 'using Microsoft.Foundation;'], 'Xfile.al') + split Xfile.al + call assert_equal('al', &filetype) + bwipe! + + " Perl AutoLoader chunk + call writefile(['# NOTE: Derived from blib/lib/Net/SSLeay.pm.', 'package Net::SSLeay;', 'sub do_https {'], 'Xfile.al') + split Xfile.al + call assert_equal('perl', &filetype) + bwipe! + + " AL DotNet alias object, which is a bare keyword on its own line + call writefile(['dotnet', '{', ' assembly("mscorlib")', '}'], 'Xfile.al') + split Xfile.al + call assert_equal('al', &filetype) + bwipe! + + " Perl code containing AL object kinds as ordinary words + call writefile(['sub value {', ' my $table = shift;', ' # report page interface', '}'], 'Xfile.al') + split Xfile.al + call assert_equal('perl', &filetype) + bwipe! + + " Perl documentation containing AL object kinds at the start of a line + call writefile(['package Foo;', '=pod', 'Table of contents', 'using the -x option', 'table of contents follows'], 'Xfile.al') + split Xfile.al + call assert_equal('perl', &filetype) + bwipe! + + " Test dist#ft#FTal() + + let g:filetype_al = 'perl' + call writefile(['codeunit 50100 "My Codeunit"'], 'Xfile.al') + split Xfile.al + call assert_equal('perl', &filetype) + bwipe! + unlet g:filetype_al + + filetype off +endfunc + " Since dist#ft#FTm4() looks around for configure.ac " the test needs to isolate itself in a fresh temporary project tree, " so that no configure.ac from another test (or from the repo root) diff --git a/src/version.c b/src/version.c index 4e1ff82f62..b0c9b0deb9 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 926, /**/ 925, /**/ From 08178626192ef0155e39658167ad63f46764f96b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Aug 2026 17:50:06 +0000 Subject: [PATCH 315/647] CI: Bump github/codeql-action Bumps the github-actions group with 1 update in the / directory: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 4.37.3 to 4.37.4 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.37.3...v4.37.4) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.37.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... closes: #20974 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 01e3a960b2..04b24ede24 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.3 + uses: github/codeql-action/init@v4.37.4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.37.3 + uses: github/codeql-action/autobuild@v4.37.4 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.3 + uses: github/codeql-action/analyze@v4.37.4 From a33e5da9f55a00fbfaef1ec2476fe0dd0758ac1d Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sat, 8 Aug 2026 17:59:27 +0000 Subject: [PATCH 316/647] runtime(doc): Improve :help expr-number closes: #20956 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/doc/eval.txt | 53 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index dffeb3859f..222dbcc2a2 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 9.2. Last change: 2026 May 31 +*eval.txt* For Vim version 9.2. Last change: 2026 Aug 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1704,35 +1704,64 @@ number number number constant *expr-number* *0x* *hex-number* *0o* *octal-number* *binary-number* -Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B) -and Octal (starting with 0, 0o or 0O). +Integer numbers can be written in multiple forms: + + {N} decimal + 0x{N} or 0X{N} hexadecimal + 0o{N} or 0O{N} octal + 0{N} octal (decimal in |scriptversion-4| and |Vim9|) + 0b{N} or 0B{N} binary + +{N} is a sequence of decimal digits (0-9), hexadecimal digits (0-9, a-f and +A-F), octal digits (0-7) or binary digits (0 or 1). + +Note: A leading "-" or "+" is not part of the number, it is the unary operator +|expr9| applied to it. Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get 0xffffffffffffffff. +In |scriptversion-4| and in |Vim9| script, single quotes may appear between digits +to improve readability; these are ignored. + +Examples: + 0xDEAD + 57005 + 0b1101111010101101 + 0o157255 + 0xBE'EF |scriptversion-4| and |Vim9| + 48'879 |scriptversion-4| and |Vim9| + 0o137'357 |scriptversion-4| and |Vim9| + 0b1011'1110'1110'1111 |scriptversion-4| and |Vim9| + *floating-point-format* Floating point numbers can be written in two forms: - [-+]{N}.{M} - [-+]{N}.{M}[eE][-+]{exp} + {N}.{M} + {N}.{M}[eE][-+]{exp} -{N} and {M} are numbers. Both {N} and {M} must be present and can only -contain digits, except that in |Vim9| script in {N} single quotes between -digits are ignored. -[-+] means there is an optional plus or minus sign. +{N} and {M} are sequences of decimal digits. In |scriptversion-1| (the default) +{N} and {M} must be present. In |scriptversion-2| or higher and in |Vim9| script +{N} is optional. {exp} is the exponent, power of 10. Only a decimal point is accepted, not a comma. No matter what the current locale is. +In |scriptversion-4| and in |Vim9| script, single quotes may appear between the +digits in {N} to improve readability; these are ignored. + Examples: 123.456 - +0.0001 + 0.0001 55.0 - -0.123 + 0.123 1.234e03 1.0E-6 - -3.1416e+88 + 3.1416e+88 + + .123 |scriptversion-2| and |Vim9| + 123'456.0 |scriptversion-4| and |Vim9| These are INVALID: 3. empty {M} From 7fe5cb35f988774745750f89d8adf215c060f57b Mon Sep 17 00:00:00 2001 From: Emilien Breton Date: Sun, 9 Aug 2026 15:07:19 +0000 Subject: [PATCH 317/647] patch 9.2.0927: curswant not set on 8g8 Problem: curswant not set on 8g8 Solution: Set curswant, adjust tests (Emilien Breton) closes: #20979 Signed-off-by: Emilien Breton Signed-off-by: Christian Brabandt --- src/mbyte.c | 1 + src/testdir/test_normal.vim | 6 +++--- src/version.c | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mbyte.c b/src/mbyte.c index db58ad5d3c..54ee229a1a 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -4461,6 +4461,7 @@ utf_find_illegal(void) curwin->w_cursor.col += l; } } + curwin->w_set_curswant = TRUE; goto theend; } p += len; diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index d61796a936..ee529980c8 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -2900,7 +2900,7 @@ func Test_normal_8g8() " With invalid byte. call setline(1, "___\xff___") norm! 1G08g8g - call assert_equal([0, 1, 4, 0, 1], getcurpos()) + call assert_equal([0, 1, 4, 0, 4], getcurpos()) " With invalid byte before the cursor. call setline(1, "___\xff___") @@ -2910,12 +2910,12 @@ func Test_normal_8g8() " With truncated sequence. call setline(1, "___\xE2\x82___") norm! 1G08g8g - call assert_equal([0, 1, 4, 0, 1], getcurpos()) + call assert_equal([0, 1, 4, 0, 4], getcurpos()) " With overlong sequence. call setline(1, "___\xF0\x82\x82\xAC___") norm! 1G08g8g - call assert_equal([0, 1, 4, 0, 1], getcurpos()) + call assert_equal([0, 1, 4, 0, 4], getcurpos()) " With valid utf8. call setline(1, "café") diff --git a/src/version.c b/src/version.c index b0c9b0deb9..f7e3dbc2ae 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 927, /**/ 926, /**/ From e684321fccf4a99bfec821f5b868c76d346e5c31 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 10 Aug 2026 18:31:42 +0000 Subject: [PATCH 318/647] patch 9.2.0928: MinGW: tests hang when Vim is built with coverage enabled Problem: When building with MinGW and COVERAGE=yes the tests hang: a command started from Vim never returns, although the child process has already exited. Solution: Do not build vimrun.exe with coverage instrumentation. fixes: #20976 closes: #20991 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/Make_cyg_ming.mak | 4 +++- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index 4a533b2b7c..f0e6856c46 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -1163,8 +1163,10 @@ endif all: $(MAIN_TARGET) vimrun.exe xxd/xxd.exe tee/tee.exe install.exe uninstall.exe GvimExt/gvimext.dll +# Coverage instrumentation makes _wsystem() in vimrun hang, and vimrun is not +# part of Vim itself, so never instrument it. vimrun.exe: vimrun.c - $(CC) $(CFLAGS) -o vimrun.exe vimrun.c $(LIB) + $(CC) $(filter-out --coverage,$(CFLAGS)) -o vimrun.exe vimrun.c $(LIB) install.exe: dosinst.c dosinst.h version.h $(CC) $(CFLAGS) -o install.exe dosinst.c $(LIB) -lole32 -luuid diff --git a/src/version.c b/src/version.c index f7e3dbc2ae..ccd80f56b0 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 928, /**/ 927, /**/ From 6163d99a32a559e0a5387989f09c43c7870c249f Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 10 Aug 2026 18:36:35 +0000 Subject: [PATCH 319/647] runtime(doc): Improve :help expr-number, mention unary +/- - Mention unary +/- use in both integer and floating-point descriptions. - Add "0b" binary prefix tag to match existing "0o" and "0x" tags. closes: #20997 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/doc/eval.txt | 14 +++++++++----- runtime/doc/tags | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 222dbcc2a2..b8f6219e45 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 9.2. Last change: 2026 Aug 08 +*eval.txt* For Vim version 9.2. Last change: 2026 Aug 10 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1703,7 +1703,7 @@ number ------ number number constant *expr-number* - *0x* *hex-number* *0o* *octal-number* *binary-number* + *0x* *hex-number* *0o* *octal-number* *0b* *binary-number* Integer numbers can be written in multiple forms: {N} decimal @@ -1715,9 +1715,6 @@ Integer numbers can be written in multiple forms: {N} is a sequence of decimal digits (0-9), hexadecimal digits (0-9, a-f and A-F), octal digits (0-7) or binary digits (0 or 1). -Note: A leading "-" or "+" is not part of the number, it is the unary operator -|expr9| applied to it. - Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get 0xffffffffffffffff. @@ -1725,6 +1722,9 @@ truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get In |scriptversion-4| and in |Vim9| script, single quotes may appear between digits to improve readability; these are ignored. +A leading "+" or "-" is not part of an integer literal. E.g., -123 is an +expression, the unary operator |expr-unary--| applied to the number 123. + Examples: 0xDEAD 57005 @@ -1751,6 +1751,10 @@ locale is. In |scriptversion-4| and in |Vim9| script, single quotes may appear between the digits in {N} to improve readability; these are ignored. +A leading "+" or "-" is not part of a floating point literal. E.g., -1.0e-3 +is an expression, the unary operator |expr-unary--| applied to the float 1.0e-3. +The "-" in the exponent is part of the literal. + Examples: 123.456 0.0001 diff --git a/runtime/doc/tags b/runtime/doc/tags index e83116386d..afb7a36267 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -1955,6 +1955,7 @@ $quote eval.txt /*$quote* 09.2 usr_09.txt /*09.2* 09.3 usr_09.txt /*09.3* 09.4 usr_09.txt /*09.4* +0b eval.txt /*0b* 0o eval.txt /*0o* 0x eval.txt /*0x* 10.1 usr_10.txt /*10.1* From 9aba04ff7a3205147a465c7214d666f13ff8b447 Mon Sep 17 00:00:00 2001 From: Shane Harper Date: Mon, 10 Aug 2026 18:47:11 +0000 Subject: [PATCH 320/647] patch 9.2.0929: incorrect completion for 'pumopt' and 'pumborder' Problem: Incorrect completions are offered for the 'pumopt' and 'pumborder' options. Solution: Fix expand_set_pumborder() and expand_set_pumopt() to only offer valid completions (Shane Harper). The "single", "double" and "round" border styles aren't offered when they cannot be used: 'encoding' must be "utf-8" and 'ambiwidth' must be "single" to use them. "custom:" is now offered instead of "custom". For 'pumopt', previously sub-option names were incorrectly offered as the only possible completions for a sub-option value. No completions are offered for the values of 'pumopt' sub-options that take a number. Offering all of the integers from 0 to 100 for "opacity:" wouldn't be useful. related: #20676 closes: #20910 Signed-off-by: Shane Harper Signed-off-by: Christian Brabandt --- src/optionstr.c | 43 ++++++++++++++++++++++++++---------- src/testdir/test_options.vim | 26 ++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/optionstr.c b/src/optionstr.c index 59a5a7e1d1..9a275ef850 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -1131,10 +1131,8 @@ did_set_ambiwidth(optset_T *args UNUSED) return check_chars_options(); } -#if defined(FEAT_TABPANEL) || defined(FEAT_DIFF) || defined(FEAT_PROP_POPUP) - // "name" must be a string literal, the length is computed at compile time. -# define completing_value_for_subopt(args, name) \ +#define completing_value_for_subopt(args, name) \ completing_value_for_subopt_len(args, name, (int)STRLEN_LITERAL(name)) /* @@ -1155,7 +1153,6 @@ completing_value_for_subopt_len(optexpand_T *args, char *name, int len) return STRNCMP(colon - len, name, len) == 0; } -#endif int expand_set_ambiwidth(optexpand_T *args, int *numMatches, char_u ***matches) @@ -3921,9 +3918,29 @@ did_set_pumopt(optset_T *args) return e_invalid_argument; } + static char_u * +get_pum_border_style(expand_T *xp UNUSED, int idx) +{ + static char *styles[] = {"ascii", "custom:", "single", "double", "round"}; + return idx < ((enc_utf8 && *p_ambw == 's') ? (int)ARRAY_LENGTH(styles) : 2) + ? (char_u *)styles[idx] : NULL; +} + int expand_set_pumopt(optexpand_T *args, int *numMatches, char_u ***matches) { + expand_T *xp = args->oe_xp; + + if (xp->xp_pattern > args->oe_set_arg && *(xp->xp_pattern-1) == ':') + { + if (completing_value_for_subopt(args, "border")) + { + return expand_set_opt_generic( + args, get_pum_border_style, numMatches, matches); + } + return FAIL; + } + static char *(p_pumopt_values[]) = {"border:", "height:", "width:", "maxwidth:", "opacity:", "shadow", "margin", NULL}; return expand_set_opt_string( @@ -3996,17 +4013,19 @@ did_set_pumborder(optset_T *args) return e_invalid_argument; } + static char_u * +get_pumborder_token(expand_T *xp, int idx) +{ + return idx == 0 ? (char_u *)"margin" + : idx == 1 ? (char_u *)"shadow" + : get_pum_border_style(xp, idx - 2); +} + int expand_set_pumborder(optexpand_T *args, int *numMatches, char_u ***matches) { - static char *(p_pb_values[]) = {"single", "double", "round", "ascii", - "custom", "shadow", "margin", NULL}; - return expand_set_opt_string( - args, - p_pb_values, - ARRAY_LENGTH(p_pb_values) - 1, - numMatches, - matches); + return expand_set_opt_generic( + args, get_pumborder_token, numMatches, matches); } #if defined(FEAT_STL_OPT) diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index 93d0e61442..4754ce32c0 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -820,6 +820,32 @@ func Test_set_completion_string_values() set ww& endfunc +func Test_set_pumopt_and_pumborder_completion() + let Chk = {cmd, completions -> + \ assert_equal(sort(completions), + \ sort(getcompletion(cmd, 'cmdline')))} + + " opacity can be any integer from 0 to 100; no completions are offered. + call Chk('set pumopt=opacity:', []) + + set encoding=utf-8 ambiwidth=single + call Chk('set pumborder=', + \ ['ascii', 'custom:', 'double', 'margin', 'round', 'shadow', 'single']) + call Chk('set pumborder=s', ['shadow', 'single']) + call Chk('set pumopt=shadow,border:', + \ ['ascii', 'custom:', 'double', 'round', 'single']) + + for [&encoding, &ambiwidth] in + \ [['utf-8', 'double'], ['latin1', 'single'], ['latin1', 'double']] + call Chk('set pumborder=', ['ascii', 'custom:', 'margin', 'shadow']) + call Chk('set pumborder=s', ['shadow']) + call Chk('set pumopt=shadow,border:', ['ascii', 'custom:']) + endfor + + set encoding& + set ambiwidth& +endfunc + func Test_set_option_errors() call assert_fails('set scroll=-1', 'E49:') call assert_fails('set backupcopy=', 'E474:') diff --git a/src/version.c b/src/version.c index ccd80f56b0..e0bd6e1e05 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 929, /**/ 928, /**/ From 2e8c81ea093ca84fa8402cb140422d5338bbb6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Sch=C3=B6nberger?= Date: Mon, 10 Aug 2026 18:58:53 +0000 Subject: [PATCH 321/647] runtime(strace): highlight stack trace as comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit strace supports printing a complete stack trace for each syscall using the `-k` (`--stack-trace`) flag. Highlight the trace as a comment. closes: #20998 Signed-off-by: Josef Schönberger Signed-off-by: Christian Brabandt --- runtime/syntax/strace.vim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runtime/syntax/strace.vim b/runtime/syntax/strace.vim index 20516a1853..e4a64bee2a 100644 --- a/runtime/syntax/strace.vim +++ b/runtime/syntax/strace.vim @@ -2,6 +2,7 @@ " Language: strace output " Maintainer: David Necas (Yeti) " Last Change: 2022 Jan 29 +" 2026 Aug 10 by Vim Project: highlight strack trace as comment #20998 " Setup " quit when a syntax file was already loaded @@ -29,11 +30,13 @@ syn match straceSysCallEmbed "\w\+" contained syn keyword stracePID pid contained syn match straceOperator "[-+=*/!%&|:,]" syn region straceComment start="/\*" end="\*/" oneline +syn match straceStackTrace "^ *> .*$" " Define the default highlighting hi def link straceComment Comment hi def link straceVerbosed Comment +hi def link straceStackTrace Comment hi def link stracePID PreProc hi def link straceNumber Number hi def link straceNumberRHS Type From 8b77af5bb72915bbf9cc284b9b7e244b41305098 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 10 Aug 2026 19:26:02 +0000 Subject: [PATCH 322/647] runtime(vim): Update base syntax, contain more ex commands - Contain some straggler ex commands - Fix some typos vimSep -> vimCmdSep closes: #20995 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 64 +- .../dumps/vim9_ex_commands_contained_00.dump | 20 + .../dumps/vim9_ex_commands_contained_01.dump | 20 + .../dumps/vim9_ex_commands_contained_02.dump | 20 + .../dumps/vim9_ex_commands_contained_03.dump | 20 + .../dumps/vim9_ex_commands_contained_04.dump | 20 + .../dumps/vim9_ex_commands_contained_05.dump | 20 + .../dumps/vim9_ex_commands_contained_06.dump | 20 + .../dumps/vim9_ex_commands_contained_07.dump | 20 + .../dumps/vim9_ex_commands_contained_08.dump | 20 + .../dumps/vim9_ex_commands_contained_09.dump | 20 + .../dumps/vim9_ex_commands_contained_10.dump | 20 + .../dumps/vim9_ex_commands_contained_11.dump | 20 + .../dumps/vim9_ex_commands_contained_12.dump | 20 + .../dumps/vim9_ex_commands_contained_13.dump | 20 + .../dumps/vim9_ex_commands_contained_14.dump | 20 + .../dumps/vim9_ex_commands_contained_15.dump | 20 + .../dumps/vim9_ex_commands_contained_16.dump | 20 + .../dumps/vim9_ex_commands_contained_17.dump | 20 + .../dumps/vim9_ex_commands_contained_18.dump | 20 + .../dumps/vim9_ex_commands_contained_19.dump | 20 + .../dumps/vim9_ex_commands_contained_20.dump | 20 + .../dumps/vim9_ex_commands_contained_21.dump | 20 + .../dumps/vim9_ex_commands_contained_22.dump | 20 + .../dumps/vim9_ex_commands_contained_23.dump | 20 + .../dumps/vim9_ex_commands_contained_24.dump | 20 + .../dumps/vim9_ex_commands_contained_25.dump | 20 + .../dumps/vim9_ex_commands_contained_26.dump | 20 + .../dumps/vim9_ex_commands_contained_27.dump | 20 + .../dumps/vim9_ex_commands_contained_28.dump | 20 + .../dumps/vim9_ex_commands_contained_29.dump | 20 + .../dumps/vim9_ex_commands_contained_30.dump | 20 + .../dumps/vim9_ex_commands_contained_31.dump | 20 + .../dumps/vim9_ex_commands_contained_32.dump | 20 + .../dumps/vim9_ex_commands_contained_33.dump | 20 + .../dumps/vim9_ex_commands_contained_34.dump | 20 + .../dumps/vim_ex_commands_contained_00.dump | 20 + .../dumps/vim_ex_commands_contained_01.dump | 20 + .../dumps/vim_ex_commands_contained_02.dump | 20 + .../dumps/vim_ex_commands_contained_03.dump | 20 + .../dumps/vim_ex_commands_contained_04.dump | 20 + .../dumps/vim_ex_commands_contained_05.dump | 20 + .../dumps/vim_ex_commands_contained_06.dump | 20 + .../dumps/vim_ex_commands_contained_07.dump | 20 + .../dumps/vim_ex_commands_contained_08.dump | 20 + .../dumps/vim_ex_commands_contained_09.dump | 20 + .../dumps/vim_ex_commands_contained_10.dump | 20 + .../dumps/vim_ex_commands_contained_11.dump | 20 + .../dumps/vim_ex_commands_contained_12.dump | 20 + .../dumps/vim_ex_commands_contained_13.dump | 20 + .../dumps/vim_ex_commands_contained_14.dump | 20 + .../dumps/vim_ex_commands_contained_15.dump | 20 + .../dumps/vim_ex_commands_contained_16.dump | 20 + .../dumps/vim_ex_commands_contained_17.dump | 20 + .../dumps/vim_ex_commands_contained_18.dump | 20 + .../dumps/vim_ex_commands_contained_19.dump | 20 + .../dumps/vim_ex_commands_contained_20.dump | 20 + .../dumps/vim_ex_commands_contained_21.dump | 20 + .../dumps/vim_ex_commands_contained_22.dump | 20 + .../dumps/vim_ex_commands_contained_23.dump | 20 + .../dumps/vim_ex_commands_contained_24.dump | 20 + .../dumps/vim_ex_commands_contained_25.dump | 20 + .../dumps/vim_ex_commands_contained_26.dump | 20 + .../dumps/vim_ex_commands_contained_27.dump | 20 + .../dumps/vim_ex_commands_contained_28.dump | 20 + .../dumps/vim_ex_commands_contained_29.dump | 20 + .../dumps/vim_ex_commands_contained_30.dump | 20 + .../dumps/vim_ex_commands_contained_31.dump | 20 + .../dumps/vim_ex_commands_contained_32.dump | 20 + .../dumps/vim_ex_commands_contained_33.dump | 20 + .../dumps/vim_ex_commands_contained_34.dump | 20 + .../input/vim9_ex_commands_contained.vim | 611 +++++++++++++++++ .../input/vim_ex_commands_contained.vim | 612 ++++++++++++++++++ runtime/syntax/vim.vim | 64 +- 74 files changed, 2701 insertions(+), 50 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_13.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_14.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_15.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_16.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_17.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_18.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_19.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_20.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_21.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_22.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_23.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_24.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_25.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_26.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_27.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_28.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_29.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_30.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_31.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_32.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_33.dump create mode 100644 runtime/syntax/testdir/dumps/vim9_ex_commands_contained_34.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_04.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_05.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_06.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_07.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_08.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_09.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_10.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_11.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_12.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_13.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_14.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_15.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_16.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_17.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_18.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_19.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_20.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_21.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_22.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_23.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_24.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_25.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_26.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_27.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_28.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_29.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_30.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_31.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_32.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_33.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_commands_contained_34.dump create mode 100644 runtime/syntax/testdir/input/vim9_ex_commands_contained.vim create mode 100644 runtime/syntax/testdir/input/vim_ex_commands_contained.vim diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 3a60b31eec..aae2864a7e 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 02 +" Last Change: 2026 Aug 08 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -487,7 +487,7 @@ syn match vimAugroupBang contained "\a\@1<=!" skipwhite nextgroup=vimAugroupName syn keyword vimAugroupKey contained aug[roup] skipwhite nextgroup=vimAugroupBang,vimAugroupName,vimAugroupEnd " remove -syn match vimAugroup "\\ze\s*\%(["|]\|$\)" skipwhite nextgroup=vimCmdSep,vimComment contains=vimAugroupKey @@ -550,22 +550,22 @@ syn keyword vimBehaveModel contained mswin xterm " ================================ syn keyword vimBreakaddFunc contained func skipwhite nextgroup=vimBreakpointFunctionLine,vimBreakpointFunction syn keyword vimBreakaddFile contained file skipwhite nextgroup=vimBreakpointFileLine,vimBreakpointFilename -syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep syn keyword vimBreakaddExpr contained expr skipwhite nextgroup=@vimExprList -syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep +syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep syn cluster vimBreakpointArg contains=vimBreakaddFunc,vimBreakaddFile,vimBreakaddHere,vimBreakaddExpr -syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep +syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep syn match vimBreakpointFunctionLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFunction syn match vimBreakpointFileLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFilename syn keyword vimBreakadd contained breaka[dd] skipwhite nextgroup=@vimBreakpointArg syn keyword vimBreakdel contained breakd[el] skipwhite nextgroup=@vimBreakpointArg,vimBreakpointNumber,vimBreakpointGlob -syn keyword vimBreaklist contained breakl[ist] skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn keyword vimBreaklist contained breakl[ist] skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep " :buffer {{{3 " ======= @@ -773,7 +773,8 @@ syn region vimCatchPattern contained matchgroup=Delimiter start="\z([!#$%&'()*+, " :export {{{3 " ======= if s:vim9script - syn keyword vim9Export export skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vimDef,vimDefFold,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var + syn keyword vim9Export export contained + \ skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vimDef,vimDefFold,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var endif " :filetype {{{3 @@ -997,12 +998,12 @@ syn keyword vimImport contained imp[ort] skipwhite nextgroup=vimImportAutoload, " :language {{{3 " ========= -syn keyword vimLanguage contained lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimSep,vimComment,vim9Comment +syn keyword vimLanguage contained lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimCmdSep,vimComment,vim9Comment syn keyword vimLanguageCategory contained col[late] cty[pe] mes[sages] tim[e] skipwhite nextgroup=@vimLanguageName " [language[_territory][.codeset][@modifier]] and the reserved "C" and "POSIX" -syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimSep,vimComment,vim9Comment -syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimSep,vimComment,vim9Comment +syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimCmdSep,vimComment,vim9Comment +syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimCmdSep,vimComment,vim9Comment syn cluster vimLanguageName contains=vimLanguageName,vimLanguageNameReserved " :loadkeymap {{{3 @@ -1788,14 +1789,14 @@ syn keyword vimEndfunction contained endf[unction] skipwhite nextgroup=vimCmdSep syn keyword vimEnddef contained enddef skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vimFunctionFold + syn region vimFunctionFold contained \ start="\" skipwhite skipnl nextgroup=vim9Implements syn match vim9ImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9InterfaceListComma,vim9Extends syn match vim9InterfaceListComma contained "," skipwhite skipnl nextgroup=vim9ImplementedInterface - syn keyword vim9Abstract abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef + syn keyword vim9Abstract contained abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef syn keyword vim9Extends contained extends skipwhite skipnl nextgroup=vim9SuperClass syn keyword vim9Implements contained implements skipwhite skipnl nextgroup=vim9ImplementedInterface syn keyword vim9Public contained public @@ -1937,7 +1938,12 @@ if s:vim9script " super must be followed by '.' syn match vim9Super contained "\.\@1" matchgroup=vimCommand end="\" contains=@vim9ClassBodyList transparent + VimFoldc syn region vim9ClassBody contained + \ start="\" + \ matchgroup=vimCommand + \ end="\" + \ contains=@vim9ClassBodyList + \ transparent " Enums {{{3 syn cluster vim9EnumBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Enum,@vimExprList,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Var @@ -1990,7 +1996,12 @@ if s:vim9script \ skipwhite skipempty nextgroup=vim9EnumImplementedInterfaceComment,vim9EnumValue \ contains=@vimCommentGroup,vimCommentString - VimFolde syn region vim9EnumBody start="\" matchgroup=vimCommand end="\" contains=@vim9EnumBodyList transparent + VimFolde syn region vim9EnumBody contained + \ start="\" + \ matchgroup=vimCommand + \ end="\" + \ contains=@vim9EnumBodyList + \ transparent " Interfaces {{{3 " TODO: limit to decl only - no init values @@ -2017,10 +2028,15 @@ if s:vim9script \ nextgroup=vim9AbstractDefParams \ contains=vim9DefTypeParam - VimFoldi syn region vim9InterfaceBody start="\" matchgroup=vimCommand end="\" contains=@vim9InterfaceBodyList transparent + VimFoldi syn region vim9InterfaceBody contained + \ start="\" + \ matchgroup=vimCommand + \ end="\" + \ contains=@vim9InterfaceBodyList + \ transparent " Type Aliases {{{3 - syn match vim9Type "\" skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError + syn keyword vim9Type contained ty[pe] skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError syn match vim9TypeAlias contained "\<\u\w*\>" skipwhite nextgroup=vim9TypeEquals syn match vim9TypeEquals contained "=" skipwhite nextgroup=@vimType if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_notypealiaserror") @@ -2289,25 +2305,23 @@ syn match vimBracket contained "[\\<>]" syn case match " User Command Highlighting: {{{2 -" syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' -" syn match vimUsrCmd contained '\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' nextgroup=vimBang syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:space:]]\|$\)\@=' nextgroup=vimBang " Vim user commands " Compiler plugins -syn match vimCompilerSet "\" skipwhite nextgroup=vimSetArgs +syn keyword vimCompilerSet contained CompilerSet skipwhite nextgroup=vimSetArgs " runtime/makemenu.vim -syn match vimSynMenu "\" skipwhite nextgroup=vimSynMenuPath +syn keyword vimSynMenu contained SynMenu skipwhite nextgroup=vimSynMenuPath syn match vimSynMenuPath contained ".*\ze:" nextgroup=vimSynMenuColon contains=vimMenuNotation syn match vimSynMenuColon contained ":" nextgroup=vimSynMenuName syn match vimSynMenuName contained "\w\+" " runtime/syntax/syncolor.vim -syn match vimSynColor "\" skipwhite nextgroup=vimSynColorGroup +syn keyword vimSynColor contained SynColor skipwhite nextgroup=vimSynColorGroup syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyList contains=vimGroup -syn match vimSynLink "\" skipwhite nextgroup=vimSynLinkGroup +syn keyword vimSynLink contained SynLink skipwhite nextgroup=vimSynLinkGroup syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_00.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_00.dump new file mode 100644 index 0000000000..56895455b0 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_00.dump @@ -0,0 +1,20 @@ +>v+0#af5f00255#ffffff0|i|m|9|s|c|r|i|p|t| +0#0000000&@64 +|#+0#0000e05&| |V|i|m|9| |E|x| |c|o|m@1|a|n|d| |c|o|n|t|a|i|n|m|e|n|t| +0#0000000&@45 +@75 +@75 +|f|a|k|e| |&+0#00e0e07&| +0#0000000&@68 +|f|a|k|e| |~| @68 +|f|a|k|e| |@| @68 +|#+0#0000e05&| |:|*| +0#0000000&@70 +|f|a|k|e| |>+0#af5f00255&| +0#0000000&@68 +|f|a|k|e| |<+0#af5f00255&| +0#0000000&@68 +|f|a|k|e| |#+0#0000e05&| +0#0000000&@68 +|f|a|k|e| |=+0#af5f00255&| +0#0000000&@68 +|f|a|k|e| |!+0#af5f00255&| +0#0000000&@68 +@75 +|f|a|k|e| |N|e|x|t| @65 +|f|a|k|e| |X| @68 +@75 +|f|a|k|e| |a|b@1|r|e|v|i|a|t|e| @59 +|f|a|k|e| |a|b|c|l|e|a|r| @62 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_01.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_01.dump new file mode 100644 index 0000000000..c8159c8c5d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|f|a|k|e| |N|e|x|t| @65 +|f|a|k|e| |X| @68 +@75 +|f|a|k|e| |a|b@1|r|e|v|i|a|t|e| @59 +>f|a|k|e| |a|b|c|l|e|a|r| @62 +|f|a|k|e| |a|b|o|v|e|l|e|f|t| @60 +|f|a|k|e| |a|b|s|t|r|a|c|t| @61 +|f|a|k|e| |a|l@1| @66 +|f|a|k|e| |a|m|e|n|u| @64 +|f|a|k|e| |a|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |a|r|g|a|d@1| @63 +|f|a|k|e| |a|r|g|d|e|d|u|p|e| @60 +|f|a|k|e| |a|r|g|d|e|l|e|t|e| @60 +|f|a|k|e| |a|r|g|d|o| @64 +|f|a|k|e| |a|r|g|e|d|i|t| @62 +|f|a|k|e| |a|r|g@1|l|o|b|a|l| @60 +|f|a|k|e| |a|r|g|l|o|c|a|l| @61 +|f|a|k|e| |a|r|g|s| @65 +@57|1|9|,|1| @10|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_02.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_02.dump new file mode 100644 index 0000000000..597a75231f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_02.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |a|r|g|s| @65 +|f|a|k|e| |a|r|g|u|m|e|n|t| @61 +|f|a|k|e| |a|s|c|i@1| @64 +|f|a|k|e| |a|u|g|r|o|u|p| |F|o@1| @58 +|f|a|k|e| |a+0#ffffff16#ff404010|u|g|r|o|u|p| |E|N|D| +0#0000000#ffffff0@58 +>f|a|k|e| |a|u|n|m|e|n|u| @62 +|f|a|k|e| |a|u|t|o|c|m|d| @62 +|f|a|k|e| |b|a|d@1| @65 +|f|a|k|e| |b|a|l@1| @65 +|f|a|k|e| |b|a|l|t| @65 +|f|a|k|e| |b|d|e|l|e|t|e| @62 +|f|a|k|e| |b|e|h|a|v|e| |m|s|w|i|n| @57 +|f|a|k|e| |b|e|h|a|v|e| |x|t|e|r|m| @57 +|f|a|k|e| |b|e|l|o|w|r|i|g|h|t| @59 +|f|a|k|e| |b|f|i|r|s|t| @63 +|f|a|k|e| |b|l|a|s|t| @64 +|f|a|k|e| |b|m|o|d|i|f|i|e|d| @60 +|f|a|k|e| |b|n|e|x|t| @64 +|f|a|k|e| |b|N|e|x|t| @64 +@57|3|7|,|1| @10|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_03.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_03.dump new file mode 100644 index 0000000000..68626e1e0b --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_03.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |b|N|e|x|t| @64 +|f|a|k|e| |b|o|t|r|i|g|h|t| @61 +|f|a|k|e| |b|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |b|r|e|a|k| @64 +|f|a|k|e| |b|r|e|a|k|a|d@1| @61 +>f|a|k|e| |b|r|e|a|k|d|e|l| @61 +|f|a|k|e| |b|r|e|a|k|l|i|s|t| @60 +|f|a|k|e| |b|r|e|w|i|n|d| @62 +|f|a|k|e| |b|r|o|w|s|e| @63 +|f|a|k|e| |b|u|f|d|o| @64 +|f|a|k|e| |b|u|f@1|e|r| @63 +|f|a|k|e| |b|u|f@1|e|r|s| @62 +|f|a|k|e| |b|u|n|l|o|a|d| @62 +|f|a|k|e| |b|w|i|p|e|o|u|t| @61 +|f|a|k|e| |c|a|b@1|r|e|v| @62 +|f|a|k|e| |c|a|b|c|l|e|a|r| @61 +|f|a|k|e| |c|a|b|o|v|e| @63 +|f|a|k|e| |c|a|d@1|b|u|f@1|e|r| @59 +|f|a|k|e| |c|a|d@1|e|x|p|r| @61 +@57|5@1|,|1| @10|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_04.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_04.dump new file mode 100644 index 0000000000..eb614f0edd --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_04.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|a|d@1|e|x|p|r| @61 +|f|a|k|e| |c|a|d@1|f|i|l|e| @61 +|f|a|k|e| |c|a|f|t|e|r| @63 +|f|a|k|e| |c|a|l@1| @65 +|f|a|k|e| |c|a|t|c|h| @64 +>f|a|k|e| |c|b|e|f|o|r|e| @62 +|f|a|k|e| |c|b|e|l|o|w| @63 +|f|a|k|e| |c|b|o|t@1|o|m| @62 +|f|a|k|e| |c|b|u|f@1|e|r| @62 +|f|a|k|e| |c@1| @67 +|f|a|k|e| |c@1|l|o|s|e| @63 +|f|a|k|e| |c|d| @67 +|f|a|k|e| |c|d|o| @66 +|f|a|k|e| |c|e|n|t|e|r| @63 +|f|a|k|e| |c|e|x|p|r| @64 +|f|a|k|e| |c|f|d|o| @65 +|f|a|k|e| |c|f|i|l|e| @64 +|f|a|k|e| |c|f|i|r|s|t| @63 +|f|a|k|e| |c|g|e|t|b|u|f@1|e|r| @59 +@57|7|3|,|1| @9|1@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_05.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_05.dump new file mode 100644 index 0000000000..9c74dd5457 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_05.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|g|e|t|b|u|f@1|e|r| @59 +|f|a|k|e| |c|g|e|t|e|x|p|r| @61 +|f|a|k|e| |c|g|e|t|f|i|l|e| @61 +|f|a|k|e| |c|h|a|n|g|e|s| @62 +|f|a|k|e| |c|h|d|i|r| @64 +>f|a|k|e| |c|h|e|c|k|p|a|t|h| @60 +|f|a|k|e| |c|h|e|c|k|t|i|m|e| @60 +|f|a|k|e| |c|h|i|s|t|o|r|y| @61 +|f|a|k|e| |c|l|a|s@1| @64 +|f|a|k|e| |c|l|a|s|t| @64 +|f|a|k|e| |c|l|e|a|r|j|u|m|p|s| @59 +|f|a|k|e| |c|l|i|s|t| @64 +|f|a|k|e| |c|l|o|s|e| @64 +|f|a|k|e| |c|m|a|p| @65 +|f|a|k|e| |c|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |c|m|e|n|u| @64 +|f|a|k|e| |c|n|e|w|e|r| @63 +|f|a|k|e| |c|n|e|x|t| @64 +|f|a|k|e| |c|N|e|x|t| @64 +@57|9|1|,|1| @9|1|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_06.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_06.dump new file mode 100644 index 0000000000..658d48978f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_06.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|N|e|x|t| @64 +|f|a|k|e| |c|n|f|i|l|e| @63 +|f|a|k|e| |c|N|f|i|l|e| @63 +|f|a|k|e| |c|n|o|r|e|a|b@1|r|e|v| @58 +|f|a|k|e| |c|n|o|r|e|m|a|p| @61 +>f|a|k|e| |c|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |c|o|l|d|e|r| @63 +|f|a|k|e| |c|o|l|o|r|s|c|h|e|m|e| @58 +|f|a|k|e| |c|o|m|c|l|e|a|r| @61 +|f|a|k|e| |c|o|m@1|a|n|d| @62 +|f|a|k|e| |c|o|m|p|i|l|e|r| @61 +|f|a|k|e| |c|o|n|f|i|r|m| @62 +|f|a|k|e| |c|o|n|s|t| @64 +|f|a|k|e| |c|o|n|t|i|n|u|e| @61 +|f|a|k|e| |c|o|p|e|n| @64 +|f|a|k|e| |c|o|p|y| @65 +|f|a|k|e| |c|p|f|i|l|e| @63 +|f|a|k|e| |c|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |c|q|u|i|t| @64 +@57|1|0|9|,|1| @8|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_07.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_07.dump new file mode 100644 index 0000000000..ceb57e2a54 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_07.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|q|u|i|t| @64 +|f|a|k|e| |c|r|e|w|i|n|d| @62 +|f|a|k|e| |c|s|c|o|p|e| @63 +|f|a|k|e| |c|s|t|a|g| @64 +|f|a|k|e| |c|u|n|a|b@1|r|e|v| @60 +>f|a|k|e| |c|u|n|m|a|p| @63 +|f|a|k|e| |c|u|n|m|e|n|u| @62 +|f|a|k|e| |c|w|i|n|d|o|w| @62 +|f|a|k|e| |d|e|b|u|g| @64 +|f|a|k|e| |d|e|b|u|g@1|r|e@1|d|y| @58 +|f|a|k|e| |d|e|f| @66 +|f|a|k|e| |d|e|f|c|o|m|p|i|l|e| @59 +|f|a|k|e| |d|e|f|e|r| @64 +|f|a|k|e| |d|e|l|c|o|m@1|a|n|d| @59 +|f|a|k|e| |d|e|l|e|t|e| @63 +|f|a|k|e| |d|e|l|f|u|n|c|t|i|o|n| @58 +|f|a|k|e| |d|e|l|m|a|r|k|s| @61 +|f|a|k|e| |d|i|f@1|g|e|t| @62 +|f|a|k|e| |d|i|f@1|o|f@1| @62 +@57|1|2|7|,|1| @8|2|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_08.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_08.dump new file mode 100644 index 0000000000..bca5e73256 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_08.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |d|i|f@1|o|f@1| @62 +|f|a|k|e| |d|i|f@1|p|a|t|c|h| @60 +|f|a|k|e| |d|i|f@1|p|u|t| @62 +|f|a|k|e| |d|i|f@1|s|p|l|i|t| @60 +|f|a|k|e| |d|i|f@1|t|h|i|s| @61 +>f|a|k|e| |d|i|f@1|u|p|d|a|t|e| @59 +|f|a|k|e| |d|i|g|r|a|p|h|s| @61 +|f|a|k|e| |d|i|s|a|s@1|e|m|b|l|e| @58 +|f|a|k|e| |d|i|s|p|l|a|y| @62 +|f|a|k|e| |d|j|u|m|p| @64 +|f|a|k|e| |d|l|i|s|t| @64 +|f|a|k|e| |d|o|a|u|t|o|a|l@1| @60 +|f|a|k|e| |d|o|a|u|t|o|c|m|d| @60 +|f|a|k|e| |d|r|o|p| @65 +|f|a|k|e| |d|s|e|a|r|c|h| @62 +|f|a|k|e| |d|s|p|l|i|t| @63 +|f|a|k|e| |e|a|r|l|i|e|r| @62 +|f|a|k|e| |e|c|h|o| @65 +|f|a|k|e| |e|c|h|o|c|o|n|s|o|l|e| @58 +@57|1|4|5|,|1| @8|2|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_09.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_09.dump new file mode 100644 index 0000000000..45aa63a40e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_09.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |e|c|h|o|c|o|n|s|o|l|e| @58 +|f|a|k|e| |e|c|h|o|e|r@1| @62 +|f|a|k|e| |e|c|h|o|h|l| @63 +|f|a|k|e| |e|c|h|o|m|s|g| @62 +|f|a|k|e| |e|c|h|o|n| @64 +>f|a|k|e| |e|c|h|o|w|i|n|d|o|w| @59 +|f|a|k|e| |e|d|i|t| @65 +|f|a|k|e| |e|l|s|e| @65 +|f|a|k|e| |e|l|s|e|i|f| @63 +|f|a|k|e| |e|m|e|n|u| @64 +|f|a|k|e| |e|n|d|c|l|a|s@1| @61 +|f|a|k|e| |e|n|d@1|e|f| @63 +|f|a|k|e| |e|n|d|e|n|u|m| @62 +|f|a|k|e| |e|n|d|f|o|r| @63 +|f|a|k|e| |e|n|d|f|u|n|c|t|i|o|n| @58 +|f|a|k|e| |e|n|d|i|f| @64 +|f|a|k|e| |e|n|d|i|n|t|e|r|f|a|c|e| @57 +|f|a|k|e| |e|n|d|t|r|y| @63 +|f|a|k|e| |e|n|d|w|h|i|l|e| @61 +@57|1|6|3|,|1| @8|2|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_10.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_10.dump new file mode 100644 index 0000000000..76347243fd --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_10.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |e|n|d|w|h|i|l|e| @61 +|f|a|k|e| |e|n|e|w| @65 +|f|a|k|e| |e|n|u|m| @65 +|f|a|k|e| |e|v|a|l| @65 +|f|a|k|e| |e|x| @67 +>f|a|k|e| |e|x|e|c|u|t|e| @62 +|f|a|k|e| |e|x|i|t| @65 +|f|a|k|e| |e|x|p|o|r|t| @63 +|f|a|k|e| |e|x|u|s|a|g|e| @62 +|f|a|k|e| |f|i|l|e| @65 +|f|a|k|e| |f|i|l|e|s| @64 +|f|a|k|e| |f|i|l|e|t|y|p|e| @61 +|f|a|k|e| |f|i|l|t|e|r| @63 +|f|a|k|e| |f|i|n|a|l| @64 +|f|a|k|e| |f|i|n|a|l@1|y| @62 +|f|a|k|e| |f|i|n|d| @65 +|f|a|k|e| |f|i|n|i|s|h| @63 +|f|a|k|e| |f|i|r|s|t| @64 +|f|a|k|e| |f|i|x|d|e|l| @63 +@57|1|8|1|,|1| @8|2|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_11.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_11.dump new file mode 100644 index 0000000000..e381b04bb5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_11.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |f|i|x|d|e|l| @63 +|f|a|k|e| |f|o|l|d| @65 +|f|a|k|e| |f|o|l|d|c|l|o|s|e| @60 +|f|a|k|e| |f|o|l|d@1|o|c|l|o|s|e|d| @57 +|f|a|k|e| |f|o|l|d@1|o@1|p|e|n| @59 +>f|a|k|e| |f|o|l|d|o|p|e|n| @61 +|f|a|k|e| |f|o|r| @66 +|f|a|k|e| |f|u|n|c|t|i|o|n| @61 +|f|a|k|e| |g|l|o|b|a|l| @63 +|f|a|k|e| |g|o|t|o| @65 +|f|a|k|e| |g|r|e|p| @65 +|f|a|k|e| |g|r|e|p|a|d@1| @62 +|f|a|k|e| |g|u|i| @66 +|f|a|k|e| |g|v|i|m| @65 +|f|a|k|e| |h|a|r|d|c|o|p|y| @61 +|f|a|k|e| |h|e|l|p| @65 +|f|a|k|e| |h|e|l|p|c|l|o|s|e| @60 +|f|a|k|e| |h|e|l|p|f|i|n|d| @61 +|f|a|k|e| |h|e|l|p|g|r|e|p| @61 +@57|1|9@1|,|1| @8|3|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_12.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_12.dump new file mode 100644 index 0000000000..a802621f15 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_12.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |h|e|l|p|g|r|e|p| @61 +|f|a|k|e| |h|e|l|p|t|a|g|s| @61 +|f|a|k|e| |h|i|d|e| @65 +|f|a|k|e| |h|i|g|h|l|i|g|h|t| @60 +|f|a|k|e| |h|i|s|t|o|r|y| @62 +>f|a|k|e| |h|o|r|i|z|o|n|t|a|l| @59 +|f|a|k|e| |i|a|b@1|r|e|v| @62 +|f|a|k|e| |i|a|b|c|l|e|a|r| @61 +|f|a|k|e| |i|f| @67 +|f|a|k|e| |i|j|u|m|p| @64 +|f|a|k|e| |i|l|i|s|t| @64 +|f|a|k|e| |i|m|a|p| @65 +|f|a|k|e| |i|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |i|m|e|n|u| @64 +|f|a|k|e| |i|m|p|o|r|t| @63 +|f|a|k|e| |i|n|o|r|e|a|b@1|r|e|v| @58 +|f|a|k|e| |i|n|o|r|e|m|a|p| @61 +|f|a|k|e| |i|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |i|n|t|e|r|f|a|c|e| @60 +@57|2|1|7|,|1| @8|3|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_13.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_13.dump new file mode 100644 index 0000000000..414bfc9946 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_13.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |i|n|t|e|r|f|a|c|e| @60 +|f|a|k|e| |i|n|t|r|o| @64 +|f|a|k|e| |i|s|e|a|r|c|h| @62 +|f|a|k|e| |i|s|p|l|i|t| @63 +|f|a|k|e| |i|u|n|a|b@1|r|e|v| @60 +>f|a|k|e| |i|u|n|m|a|p| @63 +|f|a|k|e| |i|u|n|m|e|n|u| @62 +|f|a|k|e| |j|o|i|n| @65 +|f|a|k|e| |j|u|m|p|s| @64 +|f|a|k|e| |k|e@1|p|a|l|t| @62 +|f|a|k|e| |k|e@1|p|j|u|m|p|s| @60 +|f|a|k|e| |k|e@1|p|m|a|r|k|s| @60 +|f|a|k|e| |k|e@1|p@1|a|t@1|e|r|n|s| @57 +|f|a|k|e| |l|a|b|o|v|e| @63 +|f|a|k|e| |l|a|d@1|b|u|f@1|e|r| @59 +|f|a|k|e| |l|a|d@1|e|x|p|r| @61 +|f|a|k|e| |l|a|d@1|f|i|l|e| @61 +|f|a|k|e| |l|a|f|t|e|r| @63 +|f|a|k|e| |l|a|n|g|u|a|g|e| @61 +@57|2|3|5|,|1| @8|3|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_14.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_14.dump new file mode 100644 index 0000000000..d8f013d881 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_14.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|a|n|g|u|a|g|e| @61 +|f|a|k|e| |l|a|s|t| @65 +|f|a|k|e| |l|a|t|e|r| @64 +|f|a|k|e| |l|b|e|f|o|r|e| @62 +|f|a|k|e| |l|b|e|l|o|w| @63 +>f|a|k|e| |l|b|o|t@1|o|m| @62 +|f|a|k|e| |l|b|u|f@1|e|r| @62 +|f|a|k|e| |l|c|d| @66 +|f|a|k|e| |l|c|h|d|i|r| @63 +|f|a|k|e| |l|c|l|o|s|e| @63 +|f|a|k|e| |l|c|s|c|o|p|e| @62 +|f|a|k|e| |l|d|o| @66 +|f|a|k|e| |l|e|f|t| @65 +|f|a|k|e| |l|e|f|t|a|b|o|v|e| @60 +|f|a|k|e| |l|e|g|a|c|y| @63 +|f|a|k|e| |l|e|x|p|r| @64 +|f|a|k|e| |l|f|d|o| @65 +|f|a|k|e| |l|f|i|l|e| @64 +|f|a|k|e| |l|f|i|r|s|t| @63 +@57|2|5|3|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_15.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_15.dump new file mode 100644 index 0000000000..b8652266da --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_15.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|f|i|r|s|t| @63 +|f|a|k|e| |l|g|e|t|b|u|f@1|e|r| @59 +|f|a|k|e| |l|g|e|t|e|x|p|r| @61 +|f|a|k|e| |l|g|e|t|f|i|l|e| @61 +|f|a|k|e| |l|g|r|e|p| @64 +>f|a|k|e| |l|g|r|e|p|a|d@1| @61 +|f|a|k|e| |l|h|e|l|p|g|r|e|p| @60 +|f|a|k|e| |l|h|i|s|t|o|r|y| @61 +|f|a|k|e| |l|i|s|t| @65 +|f|a|k|e| |l@1| @67 +|f|a|k|e| |l@1|a|s|t| @64 +|f|a|k|e| |l@1|i|s|t| @64 +|f|a|k|e| |l|m|a|k|e| @64 +|f|a|k|e| |l|m|a|p| @65 +|f|a|k|e| |l|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |l|n|e|w|e|r| @63 +|f|a|k|e| |l|n|e|x|t| @64 +|f|a|k|e| |l|N|e|x|t| @64 +|f|a|k|e| |l|n|f|i|l|e| @63 +@57|2|7|1|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_16.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_16.dump new file mode 100644 index 0000000000..1e005f31f3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_16.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|n|f|i|l|e| @63 +|f|a|k|e| |l|N|f|i|l|e| @63 +|f|a|k|e| |l|n|o|r|e|m|a|p| @61 +|f|a|k|e| |l|o|a|d|k|e|y|m|a|p| @59 +|f|a|k|e| |l|o|a|d|v|i|e|w| @61 +>f|a|k|e| |l|o|c|k|m|a|r|k|s| @60 +|f|a|k|e| |l|o|c|k|v|a|r| @62 +|f|a|k|e| |l|o|l|d|e|r| @63 +|f|a|k|e| |l|o|p|e|n| @64 +|f|a|k|e| |l|p|f|i|l|e| @63 +|f|a|k|e| |l|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |l|r|e|w|i|n|d| @62 +|f|a|k|e| |l|s| @67 +|f|a|k|e| |l|t|a|g| @65 +|f|a|k|e| |l|u|a| @66 +|f|a|k|e| |l|u|a|d|o| @64 +|f|a|k|e| |l|u|a|f|i|l|e| @62 +|f|a|k|e| |l|u|n|m|a|p| @63 +|f|a|k|e| |l|v|i|m|g|r|e|p| @61 +@57|2|8|9|,|1| @8|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_17.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_17.dump new file mode 100644 index 0000000000..9e62915b85 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_17.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|v|i|m|g|r|e|p| @61 +|f|a|k|e| |l|v|i|m|g|r|e|p|a|d@1| @58 +|f|a|k|e| |l|w|i|n|d|o|w| @62 +|f|a|k|e| |m|a|k|e| @65 +|f|a|k|e| |m|a|p| @66 +>f|a|k|e| |m|a|p|c|l|e|a|r| @61 +|f|a|k|e| |m|a|r|k| @65 +|f|a|k|e| |m|a|r|k|s| @64 +|f|a|k|e| |m|a|t|c|h| @64 +|f|a|k|e| |m|e|n|u| @65 +|f|a|k|e| |m|e|n|u|t|r|a|n|s|l|a|t|e| @56 +|f|a|k|e| |m|e|s@1|a|g|e|s| @61 +|f|a|k|e| |m|k|e|x|r|c| @63 +|f|a|k|e| |m|k|s|e|s@1|i|o|n| @60 +|f|a|k|e| |m|k|s|p|e|l@1| @62 +|f|a|k|e| |m|k|v|i|e|w| @63 +|f|a|k|e| |m|k|v|i|m|r|c| @62 +|f|a|k|e| |m|o|v|e| @65 +|f|a|k|e| |m|z|f|i|l|e| @63 +@57|3|0|7|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_18.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_18.dump new file mode 100644 index 0000000000..0f7966c8e6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_18.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |m|z|f|i|l|e| @63 +|f|a|k|e| |m|z|s|c|h|e|m|e| @61 +|f|a|k|e| |n|b|c|l|o|s|e| @62 +|f|a|k|e| |n|b|k|e|y| @64 +|f|a|k|e| |n|b|s|t|a|r|t| @62 +>f|a|k|e| |n|e|w| @66 +|f|a|k|e| |n|e|x|t| @65 +|f|a|k|e| |n|m|a|p| @65 +|f|a|k|e| |n|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |n|m|e|n|u| @64 +|f|a|k|e| |n@1|o|r|e|m|a|p| @61 +|f|a|k|e| |n@1|o|r|e|m|e|n|u| @60 +|f|a|k|e| |n|o|a|u|t|o|c|m|d| @60 +|f|a|k|e| |n|o|h|l|s|e|a|r|c|h| @59 +|f|a|k|e| |n|o|r|e|a|b@1|r|e|v| @59 +|f|a|k|e| |n|o|r|e|m|a|p| @62 +|f|a|k|e| |n|o|r|e|m|e|n|u| @61 +|f|a|k|e| |n|o|r|m|a|l| @63 +|f|a|k|e| |n|o|s|w|a|p|f|i|l|e| @59 +@57|3|2|5|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_19.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_19.dump new file mode 100644 index 0000000000..8c2ed226ea --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_19.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |n|o|s|w|a|p|f|i|l|e| @59 +|f|a|k|e| |n|u|m|b|e|r| @63 +|f|a|k|e| |n|u|n|m|a|p| @63 +|f|a|k|e| |n|u|n|m|e|n|u| @62 +|f|a|k|e| |o|l|d|f|i|l|e|s| @61 +>f|a|k|e| |o|m|a|p| @65 +|f|a|k|e| |o|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |o|m|e|n|u| @64 +|f|a|k|e| |o|n|l|y| @65 +|f|a|k|e| |o|n|o|r|e|m|a|p| @61 +|f|a|k|e| |o|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |o|p|t|i|o|n|s| @62 +|f|a|k|e| |o|u|n|m|a|p| @63 +|f|a|k|e| |o|u|n|m|e|n|u| @62 +|f|a|k|e| |o|w|n|s|y|n|t|a|x| @60 +|f|a|k|e| |p|a|c|k|a|d@1| @62 +|f|a|k|e| |p|a|c|k|l|o|a|d|a|l@1| @58 +|f|a|k|e| |p|c|l|o|s|e| @63 +|f|a|k|e| |p|e|d|i|t| @64 +@57|3|4|3|,|1| @8|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_20.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_20.dump new file mode 100644 index 0000000000..12757b3c14 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_20.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |p|e|d|i|t| @64 +|f|a|k|e| |p|e|r|l| @65 +|f|a|k|e| |p|e|r|l|d|o| @63 +|f|a|k|e| |p|o|p| @66 +|f|a|k|e| |p|o|p|u|p| @64 +>f|a|k|e| |p@1|o|p| @65 +|f|a|k|e| |p|r|e|s|e|r|v|e| @61 +|f|a|k|e| |p|r|e|v|i|o|u|s| @61 +|f|a|k|e| |p|r|i|n|t| @64 +|f|a|k|e| |p|r|o|f|d|e|l| @62 +|f|a|k|e| |p|r|o|f|i|l|e| @62 +|f|a|k|e| |p|r|o|m|p|t|f|i|n|d| @59 +|f|a|k|e| |p|r|o|m|p|t|r|e|p|l| @59 +|f|a|k|e| |p|s|e|a|r|c|h| @62 +|f|a|k|e| |p|t|a|g| @65 +|f|a|k|e| |p|t|f|i|r|s|t| @62 +|f|a|k|e| |p|t|j|u|m|p| @63 +|f|a|k|e| |p|t|l|a|s|t| @63 +|f|a|k|e| |p|t|n|e|x|t| @63 +@57|3|6|1|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_21.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_21.dump new file mode 100644 index 0000000000..86d8aabe2c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_21.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |p|t|n|e|x|t| @63 +|f|a|k|e| |p|t|N|e|x|t| @63 +|f|a|k|e| |p|t|p|r|e|v|i|o|u|s| @59 +|f|a|k|e| |p|t|r|e|w|i|n|d| @61 +|f|a|k|e| |p|t|s|e|l|e|c|t| @61 +>f|a|k|e| |p|u|t| @66 +|f|a|k|e| |p|w|d| @66 +|f|a|k|e| |p|y|3| @66 +|f|a|k|e| |p|y|3|d|o| @64 +|f|a|k|e| |p|y|3|f|i|l|e| @62 +|f|a|k|e| |p|y|d|o| @65 +|f|a|k|e| |p|y|f|i|l|e| @63 +|f|a|k|e| |p|y|t|h|o|n| @63 +|f|a|k|e| |p|y|t|h|o|n|3| @62 +|f|a|k|e| |p|y|t|h|o|n|x| @62 +|f|a|k|e| |p|y|x| @66 +|f|a|k|e| |p|y|x|d|o| @64 +|f|a|k|e| |p|y|x|f|i|l|e| @62 +|f|a|k|e| |q|a|l@1| @65 +@57|3|7|9|,|1| @8|6|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_22.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_22.dump new file mode 100644 index 0000000000..06b96db774 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_22.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |q|a|l@1| @65 +|f|a|k|e| |q|u|i|t| @65 +|f|a|k|e| |q|u|i|t|a|l@1| @62 +|f|a|k|e| |r|e|a|d| @65 +|f|a|k|e| |r|e|c|o|v|e|r| @62 +>f|a|k|e| |r|e|d|i|r| @64 +|f|a|k|e| |r|e|d|o| @65 +|f|a|k|e| |r|e|d|r|a|w| @63 +|f|a|k|e| |r|e|d|r|a|w|s|t|a|t|u|s| @57 +|f|a|k|e| |r|e|d|r|a|w|t|a|b|l|i|n|e| @56 +|f|a|k|e| |r|e|g|i|s|t|e|r|s| @60 +|f|a|k|e| |r|e|s|i|z|e| @63 +|f|a|k|e| |r|e|t|a|b| @64 +|f|a|k|e| |r|e|t|u|r|n| @63 +|f|a|k|e| |r|e|w|i|n|d| @63 +|f|a|k|e| |r|i|g|h|t| @64 +|f|a|k|e| |r|i|g|h|t|b|e|l|o|w| @59 +|f|a|k|e| |r|u|b|y| @65 +|f|a|k|e| |r|u|b|y|d|o| @63 +@57|3|9|7|,|1| @8|6@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_23.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_23.dump new file mode 100644 index 0000000000..36f1801eb3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_23.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |r|u|b|y|d|o| @63 +|f|a|k|e| |r|u|b|y|f|i|l|e| @61 +|f|a|k|e| |r|u|n|d|o| @64 +|f|a|k|e| |r|u|n|t|i|m|e| @62 +|f|a|k|e| |r|v|i|m|i|n|f|o| @61 +>f|a|k|e| |s|a|l@1| @65 +|f|a|k|e| |s|a|n|d|b|o|x| @62 +|f|a|k|e| |s|a|r|g|u|m|e|n|t| @60 +|f|a|k|e| |s|a|v|e|a|s| @63 +|f|a|k|e| |s|b|a|l@1| @64 +|f|a|k|e| |s|b|f|i|r|s|t| @62 +|f|a|k|e| |s|b|l|a|s|t| @63 +|f|a|k|e| |s|b|m|o|d|i|f|i|e|d| @59 +|f|a|k|e| |s|b|n|e|x|t| @63 +|f|a|k|e| |s|b|N|e|x|t| @63 +|f|a|k|e| |s|b|p|r|e|v|i|o|u|s| @59 +|f|a|k|e| |s|b|r|e|w|i|n|d| @61 +|f|a|k|e| |s|b|u|f@1|e|r| @62 +|f|a|k|e| |s|c|r|i|p|t|e|n|c|o|d|i|n|g| @55 +@57|4|1|5|,|1| @8|6|9|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_24.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_24.dump new file mode 100644 index 0000000000..ba19ac161e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_24.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|c|r|i|p|t|e|n|c|o|d|i|n|g| @55 +|f|a|k|e| |s|c|r|i|p|t|n|a|m|e|s| @58 +|f|a|k|e| |s|c|r|i|p|t|v|e|r|s|i|o|n| @56 +|f|a|k|e| |s|c|s|c|o|p|e| @62 +|f|a|k|e| |s|e|t| @66 +>f|a|k|e| |s|e|t|f|i|l|e|t|y|p|e| @58 +|f|a|k|e| |s|e|t|g|l|o|b|a|l| @60 +|f|a|k|e| |s|e|t|l|o|c|a|l| @61 +|f|a|k|e| |s|f|i|n|d| @64 +|f|a|k|e| |s|f|i|r|s|t| @63 +|f|a|k|e| |s|h|e|l@1| @64 +|f|a|k|e| |s|i|g|n| @65 +|f|a|k|e| |s|i|l|e|n|t| @63 +|f|a|k|e| |s|i|m|a|l|t| @63 +|f|a|k|e| |s|l|a|s|t| @64 +|f|a|k|e| |s|l|e@1|p| @64 +|f|a|k|e| |s|m|a|g|i|c| @63 +|f|a|k|e| |s|m|a|p| @65 +|f|a|k|e| |s|m|a|p|c|l|e|a|r| @60 +@57|4|3@1|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_25.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_25.dump new file mode 100644 index 0000000000..0d4ed75af4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_25.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |s|m|e|n|u| @64 +|f|a|k|e| |s|m|i|l|e| @64 +|f|a|k|e| |s|n|e|x|t| @64 +|f|a|k|e| |s|N|e|x|t| @64 +>f|a|k|e| |s|n|o|m|a|g|i|c| @61 +|f|a|k|e| |s|n|o|r|e|m|a|p| @61 +|f|a|k|e| |s|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |s|o|r|t| @65 +|f|a|k|e| |s|o|u|r|c|e| @63 +|f|a|k|e| |s|p|e|l@1|d|u|m|p| @60 +|f|a|k|e| |s|p|e|l@1|g|o@1|d| @60 +|f|a|k|e| |s|p|e|l@1|i|n|f|o| @60 +|f|a|k|e| |s|p|e|l@1|r|a|r|e| @60 +|f|a|k|e| |s|p|e|l@1|r|e|p|a|l@1| @58 +|f|a|k|e| |s|p|e|l@1|u|n|d|o| @60 +|f|a|k|e| |s|p|e|l@1|w|r|o|n|g| @59 +|f|a|k|e| |s|p|l|i|t| @64 +|f|a|k|e| |s|p|r|e|v|i|o|u|s| @60 +@57|4|5|1|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_26.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_26.dump new file mode 100644 index 0000000000..89cf3c6bd6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_26.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |s|r|e|w|i|n|d| @62 +|f|a|k|e| |s|t|a|g| @65 +|f|a|k|e| |s|t|a|r|t|g|r|e|p|l|a|c|e| @56 +|f|a|k|e| |s|t|a|r|t|i|n|s|e|r|t| @58 +>f|a|k|e| |s|t|a|r|t|r|e|p|l|a|c|e| @57 +|f|a|k|e| |s|t|j|u|m|p| @63 +|f|a|k|e| |s|t|o|p| @65 +|f|a|k|e| |s|t|o|p|i|n|s|e|r|t| @59 +|f|a|k|e| |s|t|s|e|l|e|c|t| @61 +|f|a|k|e| |s|u|b|s|t|i|t|u|t|e| @59 +|f|a|k|e| |s|u|n|h|i|d|e| @62 +|f|a|k|e| |s|u|n|m|a|p| @63 +|f|a|k|e| |s|u|n|m|e|n|u| @62 +|f|a|k|e| |s|u|s|p|e|n|d| @62 +|f|a|k|e| |s|v|i|e|w| @64 +|f|a|k|e| |s|w|a|p|n|a|m|e| @61 +|f|a|k|e| |s|y|n|c|b|i|n|d| @61 +|f|a|k|e| |s|y|n|t|a|x| @63 +@57|4|6|9|,|1| @8|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_27.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_27.dump new file mode 100644 index 0000000000..6e286d8961 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_27.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|y|n|t|a|x| @63 +|f|a|k|e| |s|y|n|t|i|m|e| @62 +|f|a|k|e| |t|a|b| @66 +|f|a|k|e| |t|a|b|c|l|o|s|e| @61 +|f|a|k|e| |t|a|b|d|o| @64 +>f|a|k|e| |t|a|b|e|d|i|t| @62 +|f|a|k|e| |t|a|b|f|i|n|d| @62 +|f|a|k|e| |t|a|b|f|i|r|s|t| @61 +|f|a|k|e| |t|a|b|l|a|s|t| @62 +|f|a|k|e| |t|a|b|m|o|v|e| @62 +|f|a|k|e| |t|a|b|n|e|w| @63 +|f|a|k|e| |t|a|b|n|e|x|t| @62 +|f|a|k|e| |t|a|b|N|e|x|t| @62 +|f|a|k|e| |t|a|b|o|n|l|y| @62 +|f|a|k|e| |t|a|b|p|r|e|v|i|o|u|s| @58 +|f|a|k|e| |t|a|b|r|e|w|i|n|d| @60 +|f|a|k|e| |t|a|b|s| @65 +|f|a|k|e| |t|a|g| @66 +|f|a|k|e| |t|a|g|s| @65 +@57|4|8|7|,|1| @8|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_28.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_28.dump new file mode 100644 index 0000000000..c54f76ed98 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_28.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |t|a|g|s| @65 +|f|a|k|e| |t|c|d| @66 +|f|a|k|e| |t|c|h|d|i|r| @63 +|f|a|k|e| |t|c|l| @66 +|f|a|k|e| |t|c|l|d|o| @64 +>f|a|k|e| |t|c|l|f|i|l|e| @62 +|f|a|k|e| |t|e|a|r|o|f@1| @62 +|f|a|k|e| |t|e|r|m|i|n|a|l| @61 +|f|a|k|e| |t|f|i|r|s|t| @63 +|f|a|k|e| |t|h|r|o|w| @64 +|f|a|k|e| |t|j|u|m|p| @64 +|f|a|k|e| |t|l|a|s|t| @64 +|f|a|k|e| |t|l|m|e|n|u| @63 +|f|a|k|e| |t|l|n|o|r|e|m|e|n|u| @59 +|f|a|k|e| |t|l|u|n|m|e|n|u| @61 +|f|a|k|e| |t|m|a|p| @65 +|f|a|k|e| |t|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |t|m|e|n|u| @64 +|f|a|k|e| |t|n|e|x|t| @64 +@57|5|0|5|,|1| @8|8|4|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_29.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_29.dump new file mode 100644 index 0000000000..ab70cd1090 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_29.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |t|n|e|x|t| @64 +|f|a|k|e| |t|N|e|x|t| @64 +|f|a|k|e| |t|n|o|r|e|m|a|p| @61 +|f|a|k|e| |t|o|p|l|e|f|t| @62 +|f|a|k|e| |t|p|r|e|v|i|o|u|s| @60 +>f|a|k|e| |t|r|e|w|i|n|d| @62 +|f|a|k|e| |t|r|y| @66 +|f|a|k|e| |t|s|e|l|e|c|t| @62 +|f|a|k|e| |t|u|n|m|a|p| @63 +|f|a|k|e| |t|u|n|m|e|n|u| @62 +|f|a|k|e| |t|y|p|e| @65 +|f|a|k|e| |u|n|a|b@1|r|e|v|i|a|t|e| @57 +|f|a|k|e| |u|n|d|o| @65 +|f|a|k|e| |u|n|d|o|j|o|i|n| @61 +|f|a|k|e| |u|n|d|o|l|i|s|t| @61 +|f|a|k|e| |u|n|h|i|d|e| @63 +|f|a|k|e| |u|n|i|q| @65 +|f|a|k|e| |u|n|l|e|t| @64 +|f|a|k|e| |u|n|l|o|c|k|v|a|r| @60 +@57|5|2|3|,|1| @8|8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_30.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_30.dump new file mode 100644 index 0000000000..57f88a5b5d --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_30.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |u|n|l|o|c|k|v|a|r| @60 +|f|a|k|e| |u|n|m|a|p| @64 +|f|a|k|e| |u|n|m|e|n|u| @63 +|f|a|k|e| |u|n|s|i|l|e|n|t| @61 +|f|a|k|e| |u|p|d|a|t|e| @63 +>f|a|k|e| |v|a|r| @66 +|f|a|k|e| |v|e|r|b|o|s|e| @62 +|f|a|k|e| |v|e|r|s|i|o|n| @62 +|f|a|k|e| |v|e|r|t|i|c|a|l| @61 +|f|a|k|e| |v|g|l|o|b|a|l| @62 +|f|a|k|e| |v|i|e|w| @65 +|f|a|k|e| |v|i|m|9|c|m|d| @62 +|#+0#0000e05&| |:|v|i|m|9|s|c|r|i|p|t| +0#0000000&@61 +|f|a|k|e| |v|i|m|g|r|e|p| @62 +|f|a|k|e| |v|i|m|g|r|e|p|a|d@1| @59 +|f|a|k|e| |v|i|s|u|a|l| @63 +|f|a|k|e| |v|i|u|s|a|g|e| @62 +|f|a|k|e| |v|m|a|p| @65 +|f|a|k|e| |v|m|a|p|c|l|e|a|r| @60 +@57|5|4|1|,|1| @8|9|0|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_31.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_31.dump new file mode 100644 index 0000000000..9883ff713f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_31.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |v|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |v|m|e|n|u| @64 +|f|a|k|e| |v|n|e|w| @65 +|f|a|k|e| |v|n|o|r|e|m|a|p| @61 +|f|a|k|e| |v|n|o|r|e|m|e|n|u| @60 +>f|a|k|e| |v|s|p|l|i|t| @63 +|f|a|k|e| |v|u|n|m|a|p| @63 +|f|a|k|e| |v|u|n|m|e|n|u| @62 +|f|a|k|e| |w|a|l@1| @65 +|f|a|k|e| |w|h|i|l|e| @64 +|f|a|k|e| |w|i|n|c|m|d| @63 +|f|a|k|e| |w|i|n|d|o| @64 +|f|a|k|e| |w|i|n|p|o|s| @63 +|f|a|k|e| |w|i|n|s|i|z|e| @62 +|f|a|k|e| |w|n|e|x|t| @64 +|f|a|k|e| |w|N|e|x|t| @64 +|f|a|k|e| |w|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |w|q| @67 +|f|a|k|e| |w|q|a|l@1| @64 +@57|5@1|9|,|1| @8|9|3|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_32.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_32.dump new file mode 100644 index 0000000000..68c96f0630 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_32.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |w|q|a|l@1| @64 +|f|a|k|e| |w|r|i|t|e| @64 +|f|a|k|e| |w|u|n|d|o| @64 +|f|a|k|e| |w|v|i|m|i|n|f|o| @61 +|f|a|k|e| |x|a|l@1| @65 +>f|a|k|e| |x|m|a|p| @65 +|f|a|k|e| |x|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |x|m|e|n|u| @64 +|f|a|k|e| |x|n|o|r|e|m|a|p| @61 +|f|a|k|e| |x|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |x|r|e|s|t|o|r|e| @61 +|f|a|k|e| |x|u|n|m|a|p| @63 +|f|a|k|e| |x|u|n|m|e|n|u| @62 +|f|a|k|e| |y|a|n|k| @65 +|f|a|k|e| |z| @68 +@75 +@75 +|#+0#0000e05&| |L|e|g|a|c|y|-|s|c|r|i|p|t| |o|n|l|y| +0#0000000&@54 +@75 +@57|5|7@1|,|1| @8|9|6|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_33.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_33.dump new file mode 100644 index 0000000000..ec1eb76a80 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_33.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +|f|a|k|e| |P|r|i|n|t| @64 +|f|a|k|e| |a|p@1|e|n|d| @63 +|f|a|k|e| |c|h|a|n|g|e| @63 +|f|a|k|e| |i|n|s|e|r|t| @63 +>f|a|k|e| |k| @68 +|f|a|k|e| |l|e|t| @66 +|f|a|k|e| |m|o|d|e| @65 +|f|a|k|e| |o|p|e|n| @65 +|f|a|k|e| |t| @68 +|f|a|k|e| |x|i|t| @66 +@75 +@75 +|#+0#0000e05&| |U|s|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@59 +@75 +|f|a|k|e| |F|o@1|b|a|r| @63 +|f|a|k|e| |F|o@1|b|a|r|!| @62 +|f|a|k|e| |F|o@1|b|a|r|1|2|3| @60 +|f|a|k|e| |F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@59 +@57|5|9|5|,|1| @8|9@1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_34.dump b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_34.dump new file mode 100644 index 0000000000..7aa56f3b79 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_ex_commands_contained_34.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@59 +|f|a|k|e| |F|o@1|1|2|3|b|a|r| @60 +|f|a|k|e| |F|o@1|1|2|3|b|a|r|!| @59 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|6|1@1|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_00.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_00.dump new file mode 100644 index 0000000000..d9b0e06c4c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_00.dump @@ -0,0 +1,20 @@ +>#+0#af5f00255#ffffff0| +0#0000000&|E|x| |c|o|m@1|a|n|d| |c|o|n|t|a|i|n|m|e|n|t| @50 +@75 +@75 +|f|a|k|e| |&+0#00e0e07&| +0#0000000&@68 +|f|a|k|e| |~| @68 +|f|a|k|e| |@| @68 +|"+0#0000e05&| |:|*| +0#0000000&@70 +|f|a|k|e| |>+0#af5f00255&| +0#0000000&@68 +|f|a|k|e| |<+0#af5f00255&| +0#0000000&@68 +|f|a|k|e| |#| @68 +|f|a|k|e| |=+0#af5f00255&| +0#0000000&@68 +|f|a|k|e| |!+0#af5f00255&| +0#0000000&@68 +@75 +|f|a|k|e| |N|e|x|t| @65 +|f|a|k|e| |P|r|i|n|t| @64 +|f|a|k|e| |X| @68 +@75 +|f|a|k|e| |a|p@1|e|n|d| @63 +|f|a|k|e| |a|b@1|r|e|v|i|a|t|e| @59 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_01.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_01.dump new file mode 100644 index 0000000000..2f78633da7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_01.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |N|e|x|t| @65 +|f|a|k|e| |P|r|i|n|t| @64 +|f|a|k|e| |X| @68 +@75 +|f|a|k|e| |a|p@1|e|n|d| @63 +>f|a|k|e| |a|b@1|r|e|v|i|a|t|e| @59 +|f|a|k|e| |a|b|c|l|e|a|r| @62 +|f|a|k|e| |a|b|o|v|e|l|e|f|t| @60 +|f|a|k|e| |a|l@1| @66 +|f|a|k|e| |a|m|e|n|u| @64 +|f|a|k|e| |a|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |a|r|g|a|d@1| @63 +|f|a|k|e| |a|r|g|d|e|d|u|p|e| @60 +|f|a|k|e| |a|r|g|d|e|l|e|t|e| @60 +|f|a|k|e| |a|r|g|d|o| @64 +|f|a|k|e| |a|r|g|e|d|i|t| @62 +|f|a|k|e| |a|r|g@1|l|o|b|a|l| @60 +|f|a|k|e| |a|r|g|l|o|c|a|l| @61 +|f|a|k|e| |a|r|g|s| @65 +@57|1|9|,|1| @10|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_02.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_02.dump new file mode 100644 index 0000000000..597a75231f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_02.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |a|r|g|s| @65 +|f|a|k|e| |a|r|g|u|m|e|n|t| @61 +|f|a|k|e| |a|s|c|i@1| @64 +|f|a|k|e| |a|u|g|r|o|u|p| |F|o@1| @58 +|f|a|k|e| |a+0#ffffff16#ff404010|u|g|r|o|u|p| |E|N|D| +0#0000000#ffffff0@58 +>f|a|k|e| |a|u|n|m|e|n|u| @62 +|f|a|k|e| |a|u|t|o|c|m|d| @62 +|f|a|k|e| |b|a|d@1| @65 +|f|a|k|e| |b|a|l@1| @65 +|f|a|k|e| |b|a|l|t| @65 +|f|a|k|e| |b|d|e|l|e|t|e| @62 +|f|a|k|e| |b|e|h|a|v|e| |m|s|w|i|n| @57 +|f|a|k|e| |b|e|h|a|v|e| |x|t|e|r|m| @57 +|f|a|k|e| |b|e|l|o|w|r|i|g|h|t| @59 +|f|a|k|e| |b|f|i|r|s|t| @63 +|f|a|k|e| |b|l|a|s|t| @64 +|f|a|k|e| |b|m|o|d|i|f|i|e|d| @60 +|f|a|k|e| |b|n|e|x|t| @64 +|f|a|k|e| |b|N|e|x|t| @64 +@57|3|7|,|1| @10|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_03.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_03.dump new file mode 100644 index 0000000000..ae95c39a95 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_03.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |b|N|e|x|t| @64 +|f|a|k|e| |b|o|t|r|i|g|h|t| @61 +|f|a|k|e| |b|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |b|r|e|a|k| @64 +|f|a|k|e| |b|r|e|a|k|a|d@1| @61 +>f|a|k|e| |b|r|e|a|k|d|e|l| @61 +|f|a|k|e| |b|r|e|a|k|l|i|s|t| @60 +|f|a|k|e| |b|r|e|w|i|n|d| @62 +|f|a|k|e| |b|r|o|w|s|e| @63 +|f|a|k|e| |b|u|f|d|o| @64 +|f|a|k|e| |b|u|f@1|e|r| @63 +|f|a|k|e| |b|u|f@1|e|r|s| @62 +|f|a|k|e| |b|u|n|l|o|a|d| @62 +|f|a|k|e| |b|w|i|p|e|o|u|t| @61 +|f|a|k|e| |c|h|a|n|g|e| @63 +|f|a|k|e| |c|a|b@1|r|e|v| @62 +|f|a|k|e| |c|a|b|c|l|e|a|r| @61 +|f|a|k|e| |c|a|b|o|v|e| @63 +|f|a|k|e| |c|a|d@1|b|u|f@1|e|r| @59 +@57|5@1|,|1| @10|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_04.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_04.dump new file mode 100644 index 0000000000..45ae9dbc00 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_04.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|a|d@1|b|u|f@1|e|r| @59 +|f|a|k|e| |c|a|d@1|e|x|p|r| @61 +|f|a|k|e| |c|a|d@1|f|i|l|e| @61 +|f|a|k|e| |c|a|f|t|e|r| @63 +|f|a|k|e| |c|a|l@1| @65 +>f|a|k|e| |c|a|t|c|h| @64 +|f|a|k|e| |c|b|e|f|o|r|e| @62 +|f|a|k|e| |c|b|e|l|o|w| @63 +|f|a|k|e| |c|b|o|t@1|o|m| @62 +|f|a|k|e| |c|b|u|f@1|e|r| @62 +|f|a|k|e| |c@1| @67 +|f|a|k|e| |c@1|l|o|s|e| @63 +|f|a|k|e| |c|d| @67 +|f|a|k|e| |c|d|o| @66 +|f|a|k|e| |c|e|n|t|e|r| @63 +|f|a|k|e| |c|e|x|p|r| @64 +|f|a|k|e| |c|f|d|o| @65 +|f|a|k|e| |c|f|i|l|e| @64 +|f|a|k|e| |c|f|i|r|s|t| @63 +@57|7|3|,|1| @9|1@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_05.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_05.dump new file mode 100644 index 0000000000..5037beaf33 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_05.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|f|i|r|s|t| @63 +|f|a|k|e| |c|g|e|t|b|u|f@1|e|r| @59 +|f|a|k|e| |c|g|e|t|e|x|p|r| @61 +|f|a|k|e| |c|g|e|t|f|i|l|e| @61 +|f|a|k|e| |c|h|a|n|g|e|s| @62 +>f|a|k|e| |c|h|d|i|r| @64 +|f|a|k|e| |c|h|e|c|k|p|a|t|h| @60 +|f|a|k|e| |c|h|e|c|k|t|i|m|e| @60 +|f|a|k|e| |c|h|i|s|t|o|r|y| @61 +|f|a|k|e| |c|l|a|s|t| @64 +|f|a|k|e| |c|l|e|a|r|j|u|m|p|s| @59 +|f|a|k|e| |c|l|i|s|t| @64 +|f|a|k|e| |c|l|o|s|e| @64 +|f|a|k|e| |c|m|a|p| @65 +|f|a|k|e| |c|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |c|m|e|n|u| @64 +|f|a|k|e| |c|n|e|w|e|r| @63 +|f|a|k|e| |c|n|e|x|t| @64 +|f|a|k|e| |c|N|e|x|t| @64 +@57|9|1|,|1| @9|1|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_06.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_06.dump new file mode 100644 index 0000000000..658d48978f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_06.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|N|e|x|t| @64 +|f|a|k|e| |c|n|f|i|l|e| @63 +|f|a|k|e| |c|N|f|i|l|e| @63 +|f|a|k|e| |c|n|o|r|e|a|b@1|r|e|v| @58 +|f|a|k|e| |c|n|o|r|e|m|a|p| @61 +>f|a|k|e| |c|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |c|o|l|d|e|r| @63 +|f|a|k|e| |c|o|l|o|r|s|c|h|e|m|e| @58 +|f|a|k|e| |c|o|m|c|l|e|a|r| @61 +|f|a|k|e| |c|o|m@1|a|n|d| @62 +|f|a|k|e| |c|o|m|p|i|l|e|r| @61 +|f|a|k|e| |c|o|n|f|i|r|m| @62 +|f|a|k|e| |c|o|n|s|t| @64 +|f|a|k|e| |c|o|n|t|i|n|u|e| @61 +|f|a|k|e| |c|o|p|e|n| @64 +|f|a|k|e| |c|o|p|y| @65 +|f|a|k|e| |c|p|f|i|l|e| @63 +|f|a|k|e| |c|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |c|q|u|i|t| @64 +@57|1|0|9|,|1| @8|1|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_07.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_07.dump new file mode 100644 index 0000000000..ceb57e2a54 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_07.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|q|u|i|t| @64 +|f|a|k|e| |c|r|e|w|i|n|d| @62 +|f|a|k|e| |c|s|c|o|p|e| @63 +|f|a|k|e| |c|s|t|a|g| @64 +|f|a|k|e| |c|u|n|a|b@1|r|e|v| @60 +>f|a|k|e| |c|u|n|m|a|p| @63 +|f|a|k|e| |c|u|n|m|e|n|u| @62 +|f|a|k|e| |c|w|i|n|d|o|w| @62 +|f|a|k|e| |d|e|b|u|g| @64 +|f|a|k|e| |d|e|b|u|g@1|r|e@1|d|y| @58 +|f|a|k|e| |d|e|f| @66 +|f|a|k|e| |d|e|f|c|o|m|p|i|l|e| @59 +|f|a|k|e| |d|e|f|e|r| @64 +|f|a|k|e| |d|e|l|c|o|m@1|a|n|d| @59 +|f|a|k|e| |d|e|l|e|t|e| @63 +|f|a|k|e| |d|e|l|f|u|n|c|t|i|o|n| @58 +|f|a|k|e| |d|e|l|m|a|r|k|s| @61 +|f|a|k|e| |d|i|f@1|g|e|t| @62 +|f|a|k|e| |d|i|f@1|o|f@1| @62 +@57|1|2|7|,|1| @8|2|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_08.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_08.dump new file mode 100644 index 0000000000..bca5e73256 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_08.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |d|i|f@1|o|f@1| @62 +|f|a|k|e| |d|i|f@1|p|a|t|c|h| @60 +|f|a|k|e| |d|i|f@1|p|u|t| @62 +|f|a|k|e| |d|i|f@1|s|p|l|i|t| @60 +|f|a|k|e| |d|i|f@1|t|h|i|s| @61 +>f|a|k|e| |d|i|f@1|u|p|d|a|t|e| @59 +|f|a|k|e| |d|i|g|r|a|p|h|s| @61 +|f|a|k|e| |d|i|s|a|s@1|e|m|b|l|e| @58 +|f|a|k|e| |d|i|s|p|l|a|y| @62 +|f|a|k|e| |d|j|u|m|p| @64 +|f|a|k|e| |d|l|i|s|t| @64 +|f|a|k|e| |d|o|a|u|t|o|a|l@1| @60 +|f|a|k|e| |d|o|a|u|t|o|c|m|d| @60 +|f|a|k|e| |d|r|o|p| @65 +|f|a|k|e| |d|s|e|a|r|c|h| @62 +|f|a|k|e| |d|s|p|l|i|t| @63 +|f|a|k|e| |e|a|r|l|i|e|r| @62 +|f|a|k|e| |e|c|h|o| @65 +|f|a|k|e| |e|c|h|o|c|o|n|s|o|l|e| @58 +@57|1|4|5|,|1| @8|2|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_09.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_09.dump new file mode 100644 index 0000000000..7fd1dae513 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_09.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |e|c|h|o|c|o|n|s|o|l|e| @58 +|f|a|k|e| |e|c|h|o|e|r@1| @62 +|f|a|k|e| |e|c|h|o|h|l| @63 +|f|a|k|e| |e|c|h|o|m|s|g| @62 +|f|a|k|e| |e|c|h|o|n| @64 +>f|a|k|e| |e|c|h|o|w|i|n|d|o|w| @59 +|f|a|k|e| |e|d|i|t| @65 +|f|a|k|e| |e|l|s|e| @65 +|f|a|k|e| |e|l|s|e|i|f| @63 +|f|a|k|e| |e|m|e|n|u| @64 +|f|a|k|e| |e|n|d@1|e|f| @63 +|f|a|k|e| |e|n|d|f|o|r| @63 +|f|a|k|e| |e|n|d|f|u|n|c|t|i|o|n| @58 +|f|a|k|e| |e|n|d|i|f| @64 +|f|a|k|e| |e|n|d|t|r|y| @63 +|f|a|k|e| |e|n|d|w|h|i|l|e| @61 +|f|a|k|e| |e|n|e|w| @65 +|f|a|k|e| |e|v|a|l| @65 +|f|a|k|e| |e|x| @67 +@57|1|6|3|,|1| @8|2|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_10.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_10.dump new file mode 100644 index 0000000000..4a8e7514fe --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_10.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |e|x| @67 +|f|a|k|e| |e|x|e|c|u|t|e| @62 +|f|a|k|e| |e|x|i|t| @65 +|f|a|k|e| |e|x|u|s|a|g|e| @62 +|f|a|k|e| |f|i|l|e| @65 +>f|a|k|e| |f|i|l|e|s| @64 +|f|a|k|e| |f|i|l|e|t|y|p|e| @61 +|f|a|k|e| |f|i|l|t|e|r| @63 +|f|a|k|e| |f|i|n|a|l| @64 +|f|a|k|e| |f|i|n|a|l@1|y| @62 +|f|a|k|e| |f|i|n|d| @65 +|f|a|k|e| |f|i|n|i|s|h| @63 +|f|a|k|e| |f|i|r|s|t| @64 +|f|a|k|e| |f|i|x|d|e|l| @63 +|f|a|k|e| |f|o|l|d| @65 +|f|a|k|e| |f|o|l|d|c|l|o|s|e| @60 +|f|a|k|e| |f|o|l|d@1|o|c|l|o|s|e|d| @57 +|f|a|k|e| |f|o|l|d@1|o@1|p|e|n| @59 +|f|a|k|e| |f|o|l|d|o|p|e|n| @61 +@57|1|8|1|,|1| @8|2|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_11.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_11.dump new file mode 100644 index 0000000000..dec937c0bd --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_11.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |f|o|l|d|o|p|e|n| @61 +|f|a|k|e| |f|o|r| @66 +|f|a|k|e| |f|u|n|c|t|i|o|n| @61 +|f|a|k|e| |g|l|o|b|a|l| @63 +|f|a|k|e| |g|o|t|o| @65 +>f|a|k|e| |g|r|e|p| @65 +|f|a|k|e| |g|r|e|p|a|d@1| @62 +|f|a|k|e| |g|u|i| @66 +|f|a|k|e| |g|v|i|m| @65 +|f|a|k|e| |h|a|r|d|c|o|p|y| @61 +|f|a|k|e| |h|e|l|p| @65 +|f|a|k|e| |h|e|l|p|c|l|o|s|e| @60 +|f|a|k|e| |h|e|l|p|f|i|n|d| @61 +|f|a|k|e| |h|e|l|p|g|r|e|p| @61 +|f|a|k|e| |h|e|l|p|t|a|g|s| @61 +|f|a|k|e| |h|i|d|e| @65 +|f|a|k|e| |h|i|g|h|l|i|g|h|t| @60 +|f|a|k|e| |h|i|s|t|o|r|y| @62 +|f|a|k|e| |h|o|r|i|z|o|n|t|a|l| @59 +@57|1|9@1|,|1| @8|3|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_12.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_12.dump new file mode 100644 index 0000000000..95d072cf5e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_12.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |h|o|r|i|z|o|n|t|a|l| @59 +|f|a|k|e| |i|n|s|e|r|t| @63 +|f|a|k|e| |i|a|b@1|r|e|v| @62 +|f|a|k|e| |i|a|b|c|l|e|a|r| @61 +|f|a|k|e| |i|f| @67 +>f|a|k|e| |i|j|u|m|p| @64 +|f|a|k|e| |i|l|i|s|t| @64 +|f|a|k|e| |i|m|a|p| @65 +|f|a|k|e| |i|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |i|m|e|n|u| @64 +|f|a|k|e| |i|m|p|o|r|t| @63 +|f|a|k|e| |i|n|o|r|e|a|b@1|r|e|v| @58 +|f|a|k|e| |i|n|o|r|e|m|a|p| @61 +|f|a|k|e| |i|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |i|n|t|r|o| @64 +|f|a|k|e| |i|s|e|a|r|c|h| @62 +|f|a|k|e| |i|s|p|l|i|t| @63 +|f|a|k|e| |i|u|n|a|b@1|r|e|v| @60 +|f|a|k|e| |i|u|n|m|a|p| @63 +@57|2|1|7|,|1| @8|3|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_13.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_13.dump new file mode 100644 index 0000000000..e7929c8911 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_13.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |i|u|n|m|a|p| @63 +|f|a|k|e| |i|u|n|m|e|n|u| @62 +|f|a|k|e| |j|o|i|n| @65 +|f|a|k|e| |j|u|m|p|s| @64 +|f|a|k|e| |k| @68 +>f|a|k|e| |k|e@1|p|a|l|t| @62 +|f|a|k|e| |k|e@1|p|j|u|m|p|s| @60 +|f|a|k|e| |k|e@1|p|m|a|r|k|s| @60 +|f|a|k|e| |k|e@1|p@1|a|t@1|e|r|n|s| @57 +|f|a|k|e| |l|a|b|o|v|e| @63 +|f|a|k|e| |l|a|d@1|b|u|f@1|e|r| @59 +|f|a|k|e| |l|a|d@1|e|x|p|r| @61 +|f|a|k|e| |l|a|d@1|f|i|l|e| @61 +|f|a|k|e| |l|a|f|t|e|r| @63 +|f|a|k|e| |l|a|n|g|u|a|g|e| @61 +|f|a|k|e| |l|a|s|t| @65 +|f|a|k|e| |l|a|t|e|r| @64 +|f|a|k|e| |l|b|e|f|o|r|e| @62 +|f|a|k|e| |l|b|e|l|o|w| @63 +@57|2|3|5|,|1| @8|3|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_14.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_14.dump new file mode 100644 index 0000000000..bd8df848e3 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_14.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|b|e|l|o|w| @63 +|f|a|k|e| |l|b|o|t@1|o|m| @62 +|f|a|k|e| |l|b|u|f@1|e|r| @62 +|f|a|k|e| |l|c|d| @66 +|f|a|k|e| |l|c|h|d|i|r| @63 +>f|a|k|e| |l|c|l|o|s|e| @63 +|f|a|k|e| |l|c|s|c|o|p|e| @62 +|f|a|k|e| |l|d|o| @66 +|f|a|k|e| |l|e|f|t| @65 +|f|a|k|e| |l|e|f|t|a|b|o|v|e| @60 +|f|a|k|e| |l|e|g|a|c|y| @63 +|f|a|k|e| |l|e|t| @66 +|f|a|k|e| |l|e|x|p|r| @64 +|f|a|k|e| |l|f|d|o| @65 +|f|a|k|e| |l|f|i|l|e| @64 +|f|a|k|e| |l|f|i|r|s|t| @63 +|f|a|k|e| |l|g|e|t|b|u|f@1|e|r| @59 +|f|a|k|e| |l|g|e|t|e|x|p|r| @61 +|f|a|k|e| |l|g|e|t|f|i|l|e| @61 +@57|2|5|3|,|1| @8|4|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_15.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_15.dump new file mode 100644 index 0000000000..4c3e50cdbb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_15.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|g|e|t|f|i|l|e| @61 +|f|a|k|e| |l|g|r|e|p| @64 +|f|a|k|e| |l|g|r|e|p|a|d@1| @61 +|f|a|k|e| |l|h|e|l|p|g|r|e|p| @60 +|f|a|k|e| |l|h|i|s|t|o|r|y| @61 +>f|a|k|e| |l|i|s|t| @65 +|f|a|k|e| |l@1| @67 +|f|a|k|e| |l@1|a|s|t| @64 +|f|a|k|e| |l@1|i|s|t| @64 +|f|a|k|e| |l|m|a|k|e| @64 +|f|a|k|e| |l|m|a|p| @65 +|f|a|k|e| |l|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |l|n|e|w|e|r| @63 +|f|a|k|e| |l|n|e|x|t| @64 +|f|a|k|e| |l|N|e|x|t| @64 +|f|a|k|e| |l|n|f|i|l|e| @63 +|f|a|k|e| |l|N|f|i|l|e| @63 +|f|a|k|e| |l|n|o|r|e|m|a|p| @61 +|f|a|k|e| |l|o|a|d|k|e|y|m|a|p| @59 +@57|2|7|1|,|1| @8|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_16.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_16.dump new file mode 100644 index 0000000000..67b5e79dcb --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_16.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |l|o|a|d|k|e|y|m|a|p| @59 +|f|a|k|e| |l|o|a|d|v|i|e|w| @61 +|f|a|k|e| |l|o|c|k|m|a|r|k|s| @60 +|f|a|k|e| |l|o|c|k|v|a|r| @62 +|f|a|k|e| |l|o|l|d|e|r| @63 +>f|a|k|e| |l|o|p|e|n| @64 +|f|a|k|e| |l|p|f|i|l|e| @63 +|f|a|k|e| |l|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |l|r|e|w|i|n|d| @62 +|f|a|k|e| |l|s| @67 +|f|a|k|e| |l|t|a|g| @65 +|f|a|k|e| |l|u|a| @66 +|f|a|k|e| |l|u|a|d|o| @64 +|f|a|k|e| |l|u|a|f|i|l|e| @62 +|f|a|k|e| |l|u|n|m|a|p| @63 +|f|a|k|e| |l|v|i|m|g|r|e|p| @61 +|f|a|k|e| |l|v|i|m|g|r|e|p|a|d@1| @58 +|f|a|k|e| |l|w|i|n|d|o|w| @62 +|f|a|k|e| |m|a|k|e| @65 +@57|2|8|9|,|1| @8|4|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_17.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_17.dump new file mode 100644 index 0000000000..34978cfb81 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_17.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |m|a|k|e| @65 +|f|a|k|e| |m|a|p| @66 +|f|a|k|e| |m|a|p|c|l|e|a|r| @61 +|f|a|k|e| |m|a|r|k| @65 +|f|a|k|e| |m|a|r|k|s| @64 +>f|a|k|e| |m|a|t|c|h| @64 +|f|a|k|e| |m|e|n|u| @65 +|f|a|k|e| |m|e|n|u|t|r|a|n|s|l|a|t|e| @56 +|f|a|k|e| |m|e|s@1|a|g|e|s| @61 +|f|a|k|e| |m|k|e|x|r|c| @63 +|f|a|k|e| |m|k|s|e|s@1|i|o|n| @60 +|f|a|k|e| |m|k|s|p|e|l@1| @62 +|f|a|k|e| |m|k|v|i|e|w| @63 +|f|a|k|e| |m|k|v|i|m|r|c| @62 +|f|a|k|e| |m|o|d|e| @65 +|f|a|k|e| |m|o|v|e| @65 +|f|a|k|e| |m|z|f|i|l|e| @63 +|f|a|k|e| |m|z|s|c|h|e|m|e| @61 +|f|a|k|e| |n|b|c|l|o|s|e| @62 +@57|3|0|7|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_18.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_18.dump new file mode 100644 index 0000000000..6dc9ba5a8c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_18.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |n|b|c|l|o|s|e| @62 +|f|a|k|e| |n|b|k|e|y| @64 +|f|a|k|e| |n|b|s|t|a|r|t| @62 +|f|a|k|e| |n|e|w| @66 +|f|a|k|e| |n|e|x|t| @65 +>f|a|k|e| |n|m|a|p| @65 +|f|a|k|e| |n|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |n|m|e|n|u| @64 +|f|a|k|e| |n@1|o|r|e|m|a|p| @61 +|f|a|k|e| |n@1|o|r|e|m|e|n|u| @60 +|f|a|k|e| |n|o|a|u|t|o|c|m|d| @60 +|f|a|k|e| |n|o|h|l|s|e|a|r|c|h| @59 +|f|a|k|e| |n|o|r|e|a|b@1|r|e|v| @59 +|f|a|k|e| |n|o|r|e|m|a|p| @62 +|f|a|k|e| |n|o|r|e|m|e|n|u| @61 +|f|a|k|e| |n|o|r|m|a|l| @63 +|f|a|k|e| |n|o|s|w|a|p|f|i|l|e| @59 +|f|a|k|e| |n|u|m|b|e|r| @63 +|f|a|k|e| |n|u|n|m|a|p| @63 +@57|3|2|5|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_19.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_19.dump new file mode 100644 index 0000000000..16bd3c9570 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_19.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |n|u|n|m|a|p| @63 +|f|a|k|e| |n|u|n|m|e|n|u| @62 +|f|a|k|e| |o|l|d|f|i|l|e|s| @61 +|f|a|k|e| |o|m|a|p| @65 +|f|a|k|e| |o|m|a|p|c|l|e|a|r| @60 +>f|a|k|e| |o|m|e|n|u| @64 +|f|a|k|e| |o|n|l|y| @65 +|f|a|k|e| |o|n|o|r|e|m|a|p| @61 +|f|a|k|e| |o|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |o|p|e|n| @65 +|f|a|k|e| |o|p|t|i|o|n|s| @62 +|f|a|k|e| |o|u|n|m|a|p| @63 +|f|a|k|e| |o|u|n|m|e|n|u| @62 +|f|a|k|e| |o|w|n|s|y|n|t|a|x| @60 +|f|a|k|e| |p|a|c|k|a|d@1| @62 +|f|a|k|e| |p|a|c|k|l|o|a|d|a|l@1| @58 +|f|a|k|e| |p|c|l|o|s|e| @63 +|f|a|k|e| |p|e|d|i|t| @64 +|f|a|k|e| |p|e|r|l| @65 +@57|3|4|3|,|1| @8|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_20.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_20.dump new file mode 100644 index 0000000000..7b012d9284 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_20.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |p|e|r|l| @65 +|f|a|k|e| |p|e|r|l|d|o| @63 +|f|a|k|e| |p|o|p| @66 +|f|a|k|e| |p|o|p|u|p| @64 +|f|a|k|e| |p@1|o|p| @65 +>f|a|k|e| |p|r|e|s|e|r|v|e| @61 +|f|a|k|e| |p|r|e|v|i|o|u|s| @61 +|f|a|k|e| |p|r|i|n|t| @64 +|f|a|k|e| |p|r|o|f|d|e|l| @62 +|f|a|k|e| |p|r|o|f|i|l|e| @62 +|f|a|k|e| |p|r|o|m|p|t|f|i|n|d| @59 +|f|a|k|e| |p|r|o|m|p|t|r|e|p|l| @59 +|f|a|k|e| |p|s|e|a|r|c|h| @62 +|f|a|k|e| |p|t|a|g| @65 +|f|a|k|e| |p|t|f|i|r|s|t| @62 +|f|a|k|e| |p|t|j|u|m|p| @63 +|f|a|k|e| |p|t|l|a|s|t| @63 +|f|a|k|e| |p|t|n|e|x|t| @63 +|f|a|k|e| |p|t|N|e|x|t| @63 +@57|3|6|1|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_21.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_21.dump new file mode 100644 index 0000000000..420f493801 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_21.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |p|t|N|e|x|t| @63 +|f|a|k|e| |p|t|p|r|e|v|i|o|u|s| @59 +|f|a|k|e| |p|t|r|e|w|i|n|d| @61 +|f|a|k|e| |p|t|s|e|l|e|c|t| @61 +|f|a|k|e| |p|u|t| @66 +>f|a|k|e| |p|w|d| @66 +|f|a|k|e| |p|y|3| @66 +|f|a|k|e| |p|y|3|d|o| @64 +|f|a|k|e| |p|y|3|f|i|l|e| @62 +|f|a|k|e| |p|y|d|o| @65 +|f|a|k|e| |p|y|f|i|l|e| @63 +|f|a|k|e| |p|y|t|h|o|n| @63 +|f|a|k|e| |p|y|t|h|o|n|3| @62 +|f|a|k|e| |p|y|t|h|o|n|x| @62 +|f|a|k|e| |p|y|x| @66 +|f|a|k|e| |p|y|x|d|o| @64 +|f|a|k|e| |p|y|x|f|i|l|e| @62 +|f|a|k|e| |q|a|l@1| @65 +|f|a|k|e| |q|u|i|t| @65 +@57|3|7|9|,|1| @8|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_22.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_22.dump new file mode 100644 index 0000000000..28e7e50c17 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_22.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |q|u|i|t| @65 +|f|a|k|e| |q|u|i|t|a|l@1| @62 +|f|a|k|e| |r|e|a|d| @65 +|f|a|k|e| |r|e|c|o|v|e|r| @62 +|f|a|k|e| |r|e|d|i|r| @64 +>f|a|k|e| |r|e|d|o| @65 +|f|a|k|e| |r|e|d|r|a|w| @63 +|f|a|k|e| |r|e|d|r|a|w|s|t|a|t|u|s| @57 +|f|a|k|e| |r|e|d|r|a|w|t|a|b|l|i|n|e| @56 +|f|a|k|e| |r|e|g|i|s|t|e|r|s| @60 +|f|a|k|e| |r|e|s|i|z|e| @63 +|f|a|k|e| |r|e|t|a|b| @64 +|f|a|k|e| |r|e|t|u|r|n| @63 +|f|a|k|e| |r|e|w|i|n|d| @63 +|f|a|k|e| |r|i|g|h|t| @64 +|f|a|k|e| |r|i|g|h|t|b|e|l|o|w| @59 +|f|a|k|e| |r|u|b|y| @65 +|f|a|k|e| |r|u|b|y|d|o| @63 +|f|a|k|e| |r|u|b|y|f|i|l|e| @61 +@57|3|9|7|,|1| @8|6|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_23.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_23.dump new file mode 100644 index 0000000000..36763c762a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_23.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |r|u|b|y|f|i|l|e| @61 +|f|a|k|e| |r|u|n|d|o| @64 +|f|a|k|e| |r|u|n|t|i|m|e| @62 +|f|a|k|e| |r|v|i|m|i|n|f|o| @61 +|f|a|k|e| |s|a|l@1| @65 +>f|a|k|e| |s|a|n|d|b|o|x| @62 +|f|a|k|e| |s|a|r|g|u|m|e|n|t| @60 +|f|a|k|e| |s|a|v|e|a|s| @63 +|f|a|k|e| |s|b|a|l@1| @64 +|f|a|k|e| |s|b|f|i|r|s|t| @62 +|f|a|k|e| |s|b|l|a|s|t| @63 +|f|a|k|e| |s|b|m|o|d|i|f|i|e|d| @59 +|f|a|k|e| |s|b|n|e|x|t| @63 +|f|a|k|e| |s|b|N|e|x|t| @63 +|f|a|k|e| |s|b|p|r|e|v|i|o|u|s| @59 +|f|a|k|e| |s|b|r|e|w|i|n|d| @61 +|f|a|k|e| |s|b|u|f@1|e|r| @62 +|f|a|k|e| |s|c|r|i|p|t|e|n|c|o|d|i|n|g| @55 +|f|a|k|e| |s|c|r|i|p|t|n|a|m|e|s| @58 +@57|4|1|5|,|1| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_24.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_24.dump new file mode 100644 index 0000000000..75045d4e9a --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_24.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|c|r|i|p|t|n|a|m|e|s| @58 +|f|a|k|e| |s|c|r|i|p|t|v|e|r|s|i|o|n| @56 +|f|a|k|e| |s|c|s|c|o|p|e| @62 +|f|a|k|e| |s|e|t| @66 +|f|a|k|e| |s|e|t|f|i|l|e|t|y|p|e| @58 +>f|a|k|e| |s|e|t|g|l|o|b|a|l| @60 +|f|a|k|e| |s|e|t|l|o|c|a|l| @61 +|f|a|k|e| |s|f|i|n|d| @64 +|f|a|k|e| |s|f|i|r|s|t| @63 +|f|a|k|e| |s|h|e|l@1| @64 +|f|a|k|e| |s|i|g|n| @65 +|f|a|k|e| |s|i|l|e|n|t| @63 +|f|a|k|e| |s|i|m|a|l|t| @63 +|f|a|k|e| |s|l|a|s|t| @64 +|f|a|k|e| |s|l|e@1|p| @64 +|f|a|k|e| |s|m|a|g|i|c| @63 +|f|a|k|e| |s|m|a|p| @65 +|f|a|k|e| |s|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |s|m|e|n|u| @64 +@57|4|3@1|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_25.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_25.dump new file mode 100644 index 0000000000..6ec506349f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_25.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|m|e|n|u| @64 +|f|a|k|e| |s|m|i|l|e| @64 +|f|a|k|e| |s|n|e|x|t| @64 +|f|a|k|e| |s|N|e|x|t| @64 +|f|a|k|e| |s|n|o|m|a|g|i|c| @61 +>f|a|k|e| |s|n|o|r|e|m|a|p| @61 +|f|a|k|e| |s|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |s|o|r|t| @65 +|f|a|k|e| |s|o|u|r|c|e| @63 +|f|a|k|e| |s|p|e|l@1|d|u|m|p| @60 +|f|a|k|e| |s|p|e|l@1|g|o@1|d| @60 +|f|a|k|e| |s|p|e|l@1|i|n|f|o| @60 +|f|a|k|e| |s|p|e|l@1|r|a|r|e| @60 +|f|a|k|e| |s|p|e|l@1|r|e|p|a|l@1| @58 +|f|a|k|e| |s|p|e|l@1|u|n|d|o| @60 +|f|a|k|e| |s|p|e|l@1|w|r|o|n|g| @59 +|f|a|k|e| |s|p|l|i|t| @64 +|f|a|k|e| |s|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |s|r|e|w|i|n|d| @62 +@57|4|5|1|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_26.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_26.dump new file mode 100644 index 0000000000..e95ea1fa84 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_26.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|r|e|w|i|n|d| @62 +|f|a|k|e| |s|t|a|g| @65 +|f|a|k|e| |s|t|a|r|t|g|r|e|p|l|a|c|e| @56 +|f|a|k|e| |s|t|a|r|t|i|n|s|e|r|t| @58 +|f|a|k|e| |s|t|a|r|t|r|e|p|l|a|c|e| @57 +>f|a|k|e| |s|t|j|u|m|p| @63 +|f|a|k|e| |s|t|o|p| @65 +|f|a|k|e| |s|t|o|p|i|n|s|e|r|t| @59 +|f|a|k|e| |s|t|s|e|l|e|c|t| @61 +|f|a|k|e| |s|u|b|s|t|i|t|u|t|e| @59 +|f|a|k|e| |s|u|n|h|i|d|e| @62 +|f|a|k|e| |s|u|n|m|a|p| @63 +|f|a|k|e| |s|u|n|m|e|n|u| @62 +|f|a|k|e| |s|u|s|p|e|n|d| @62 +|f|a|k|e| |s|v|i|e|w| @64 +|f|a|k|e| |s|w|a|p|n|a|m|e| @61 +|f|a|k|e| |s|y|n|c|b|i|n|d| @61 +|f|a|k|e| |s|y|n|t|a|x| @63 +|f|a|k|e| |s|y|n|t|i|m|e| @62 +@57|4|6|9|,|1| @8|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_27.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_27.dump new file mode 100644 index 0000000000..d527ca9a90 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_27.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |s|y|n|t|i|m|e| @62 +|f|a|k|e| |t| @68 +|f|a|k|e| |t|a|b| @66 +|f|a|k|e| |t|a|b|c|l|o|s|e| @61 +|f|a|k|e| |t|a|b|d|o| @64 +>f|a|k|e| |t|a|b|e|d|i|t| @62 +|f|a|k|e| |t|a|b|f|i|n|d| @62 +|f|a|k|e| |t|a|b|f|i|r|s|t| @61 +|f|a|k|e| |t|a|b|l|a|s|t| @62 +|f|a|k|e| |t|a|b|m|o|v|e| @62 +|f|a|k|e| |t|a|b|n|e|w| @63 +|f|a|k|e| |t|a|b|n|e|x|t| @62 +|f|a|k|e| |t|a|b|N|e|x|t| @62 +|f|a|k|e| |t|a|b|o|n|l|y| @62 +|f|a|k|e| |t|a|b|p|r|e|v|i|o|u|s| @58 +|f|a|k|e| |t|a|b|r|e|w|i|n|d| @60 +|f|a|k|e| |t|a|b|s| @65 +|f|a|k|e| |t|a|g| @66 +|f|a|k|e| |t|a|g|s| @65 +@57|4|8|7|,|1| @8|8|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_28.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_28.dump new file mode 100644 index 0000000000..c54f76ed98 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_28.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |t|a|g|s| @65 +|f|a|k|e| |t|c|d| @66 +|f|a|k|e| |t|c|h|d|i|r| @63 +|f|a|k|e| |t|c|l| @66 +|f|a|k|e| |t|c|l|d|o| @64 +>f|a|k|e| |t|c|l|f|i|l|e| @62 +|f|a|k|e| |t|e|a|r|o|f@1| @62 +|f|a|k|e| |t|e|r|m|i|n|a|l| @61 +|f|a|k|e| |t|f|i|r|s|t| @63 +|f|a|k|e| |t|h|r|o|w| @64 +|f|a|k|e| |t|j|u|m|p| @64 +|f|a|k|e| |t|l|a|s|t| @64 +|f|a|k|e| |t|l|m|e|n|u| @63 +|f|a|k|e| |t|l|n|o|r|e|m|e|n|u| @59 +|f|a|k|e| |t|l|u|n|m|e|n|u| @61 +|f|a|k|e| |t|m|a|p| @65 +|f|a|k|e| |t|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |t|m|e|n|u| @64 +|f|a|k|e| |t|n|e|x|t| @64 +@57|5|0|5|,|1| @8|8|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_29.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_29.dump new file mode 100644 index 0000000000..2d68e4ca27 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_29.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |t|n|e|x|t| @64 +|f|a|k|e| |t|N|e|x|t| @64 +|f|a|k|e| |t|n|o|r|e|m|a|p| @61 +|f|a|k|e| |t|o|p|l|e|f|t| @62 +|f|a|k|e| |t|p|r|e|v|i|o|u|s| @60 +>f|a|k|e| |t|r|e|w|i|n|d| @62 +|f|a|k|e| |t|r|y| @66 +|f|a|k|e| |t|s|e|l|e|c|t| @62 +|f|a|k|e| |t|u|n|m|a|p| @63 +|f|a|k|e| |t|u|n|m|e|n|u| @62 +|f|a|k|e| |u|n|a|b@1|r|e|v|i|a|t|e| @57 +|f|a|k|e| |u|n|d|o| @65 +|f|a|k|e| |u|n|d|o|j|o|i|n| @61 +|f|a|k|e| |u|n|d|o|l|i|s|t| @61 +|f|a|k|e| |u|n|h|i|d|e| @63 +|f|a|k|e| |u|n|i|q| @65 +|f|a|k|e| |u|n|l|e|t| @64 +|f|a|k|e| |u|n|l|o|c|k|v|a|r| @60 +|f|a|k|e| |u|n|m|a|p| @64 +@57|5|2|3|,|1| @8|8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_30.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_30.dump new file mode 100644 index 0000000000..d6d3b19aa6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_30.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |u|n|m|a|p| @64 +|f|a|k|e| |u|n|m|e|n|u| @63 +|f|a|k|e| |u|n|s|i|l|e|n|t| @61 +|f|a|k|e| |u|p|d|a|t|e| @63 +|f|a|k|e| |v|e|r|b|o|s|e| @62 +>f|a|k|e| |v|e|r|s|i|o|n| @62 +|f|a|k|e| |v|e|r|t|i|c|a|l| @61 +|f|a|k|e| |v|g|l|o|b|a|l| @62 +|f|a|k|e| |v|i|e|w| @65 +|f|a|k|e| |v|i|m|9|c|m|d| @62 +|f|a|k|e| |v|i|m|g|r|e|p| @62 +|f|a|k|e| |v|i|m|g|r|e|p|a|d@1| @59 +|f|a|k|e| |v|i|s|u|a|l| @63 +|f|a|k|e| |v|i|u|s|a|g|e| @62 +|f|a|k|e| |v|m|a|p| @65 +|f|a|k|e| |v|m|a|p|c|l|e|a|r| @60 +|f|a|k|e| |v|m|e|n|u| @64 +|f|a|k|e| |v|n|e|w| @65 +|f|a|k|e| |v|n|o|r|e|m|a|p| @61 +@57|5|4|1|,|1| @8|9|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_31.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_31.dump new file mode 100644 index 0000000000..35eecaa44f --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_31.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |v|n|o|r|e|m|a|p| @61 +|f|a|k|e| |v|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |v|s|p|l|i|t| @63 +|f|a|k|e| |v|u|n|m|a|p| @63 +|f|a|k|e| |v|u|n|m|e|n|u| @62 +>f|a|k|e| |w|a|l@1| @65 +|f|a|k|e| |w|h|i|l|e| @64 +|f|a|k|e| |w|i|n|c|m|d| @63 +|f|a|k|e| |w|i|n|d|o| @64 +|f|a|k|e| |w|i|n|p|o|s| @63 +|f|a|k|e| |w|i|n|s|i|z|e| @62 +|f|a|k|e| |w|n|e|x|t| @64 +|f|a|k|e| |w|N|e|x|t| @64 +|f|a|k|e| |w|p|r|e|v|i|o|u|s| @60 +|f|a|k|e| |w|q| @67 +|f|a|k|e| |w|q|a|l@1| @64 +|f|a|k|e| |w|r|i|t|e| @64 +|f|a|k|e| |w|u|n|d|o| @64 +|f|a|k|e| |w|v|i|m|i|n|f|o| @61 +@57|5@1|9|,|1| @8|9|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_32.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_32.dump new file mode 100644 index 0000000000..6aca4879e1 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_32.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |w|v|i|m|i|n|f|o| @61 +|f|a|k|e| |x|a|l@1| @65 +|f|a|k|e| |x|i|t| @66 +|f|a|k|e| |x|m|a|p| @65 +|f|a|k|e| |x|m|a|p|c|l|e|a|r| @60 +>f|a|k|e| |x|m|e|n|u| @64 +|f|a|k|e| |x|n|o|r|e|m|a|p| @61 +|f|a|k|e| |x|n|o|r|e|m|e|n|u| @60 +|f|a|k|e| |x|r|e|s|t|o|r|e| @61 +|f|a|k|e| |x|u|n|m|a|p| @63 +|f|a|k|e| |x|u|n|m|e|n|u| @62 +|f|a|k|e| |y|a|n|k| @65 +|f|a|k|e| |z| @68 +@75 +@75 +|"+0#0000e05&| |V|i|m|9|-|s|c|r|i|p|t| |o|n|l|y| +0#0000000&@56 +@75 +|f|a|k|e| |a|b|s|t|r|a|c|t| @61 +|f|a|k|e| |c|l|a|s@1| @64 +@57|5|7@1|,|1| @8|9|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_33.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_33.dump new file mode 100644 index 0000000000..ee7120fa77 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_33.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |c|l|a|s@1| @64 +|f|a|k|e| |e|n|d|c|l|a|s@1| @61 +|f|a|k|e| |e|n|d|i|n|t|e|r|f|a|c|e| @57 +|f|a|k|e| |e|n|d|e|n|u|m| @62 +|f|a|k|e| |e|n|u|m| @65 +>f|a|k|e| |e|x|p|o|r|t| @63 +|f|a|k|e| |f|i|n|a|l| @64 +|f|a|k|e| |i|n|t|e|r|f|a|c|e| @60 +|f|a|k|e| |p|u|b|l|i|c| @63 +|f|a|k|e| |s|t|a|t|i|c| @63 +|f|a|k|e| |t|y|p|e| @65 +|f|a|k|e| |v|a|r| @66 +@75 +@75 +|"+0#0000e05&| |U|s|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@59 +@75 +|f|a|k|e| |F|o@1|b|a|r| @63 +|f|a|k|e| |F|o@1|b|a|r|!| @62 +|f|a|k|e| |F|o@1|b|a|r|1|2|3| @60 +@57|5|9|5|,|1| @8|9@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_commands_contained_34.dump b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_34.dump new file mode 100644 index 0000000000..c98e074852 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_commands_contained_34.dump @@ -0,0 +1,20 @@ +|f+0&#ffffff0|a|k|e| |F|o@1|b|a|r|1|2|3| @60 +|f|a|k|e| |F|o@1|b|a|r|1|2|3|!+0#af5f00255&| +0#0000000&@59 +|f|a|k|e| |F|o@1|1|2|3|b|a|r| @60 +|f|a|k|e| |F|o@1|1|2|3|b|a|r|!| @59 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|6|1|2|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/input/vim9_ex_commands_contained.vim b/runtime/syntax/testdir/input/vim9_ex_commands_contained.vim new file mode 100644 index 0000000000..f730a90122 --- /dev/null +++ b/runtime/syntax/testdir/input/vim9_ex_commands_contained.vim @@ -0,0 +1,611 @@ +vim9script +# Vim9 Ex command containment + + +fake & +fake ~ +fake @ +# :* +fake > +fake < +fake # +fake = +fake ! + +fake Next +fake X + +fake abbreviate +fake abclear +fake aboveleft +fake abstract +fake all +fake amenu +fake anoremenu +fake argadd +fake argdedupe +fake argdelete +fake argdo +fake argedit +fake argglobal +fake arglocal +fake args +fake argument +fake ascii +fake augroup Foo +fake augroup END +fake aunmenu +fake autocmd +fake badd +fake ball +fake balt +fake bdelete +fake behave mswin +fake behave xterm +fake belowright +fake bfirst +fake blast +fake bmodified +fake bnext +fake bNext +fake botright +fake bprevious +fake break +fake breakadd +fake breakdel +fake breaklist +fake brewind +fake browse +fake bufdo +fake buffer +fake buffers +fake bunload +fake bwipeout +fake cabbrev +fake cabclear +fake cabove +fake caddbuffer +fake caddexpr +fake caddfile +fake cafter +fake call +fake catch +fake cbefore +fake cbelow +fake cbottom +fake cbuffer +fake cc +fake cclose +fake cd +fake cdo +fake center +fake cexpr +fake cfdo +fake cfile +fake cfirst +fake cgetbuffer +fake cgetexpr +fake cgetfile +fake changes +fake chdir +fake checkpath +fake checktime +fake chistory +fake class +fake clast +fake clearjumps +fake clist +fake close +fake cmap +fake cmapclear +fake cmenu +fake cnewer +fake cnext +fake cNext +fake cnfile +fake cNfile +fake cnoreabbrev +fake cnoremap +fake cnoremenu +fake colder +fake colorscheme +fake comclear +fake command +fake compiler +fake confirm +fake const +fake continue +fake copen +fake copy +fake cpfile +fake cprevious +fake cquit +fake crewind +fake cscope +fake cstag +fake cunabbrev +fake cunmap +fake cunmenu +fake cwindow +fake debug +fake debuggreedy +fake def +fake defcompile +fake defer +fake delcommand +fake delete +fake delfunction +fake delmarks +fake diffget +fake diffoff +fake diffpatch +fake diffput +fake diffsplit +fake diffthis +fake diffupdate +fake digraphs +fake disassemble +fake display +fake djump +fake dlist +fake doautoall +fake doautocmd +fake drop +fake dsearch +fake dsplit +fake earlier +fake echo +fake echoconsole +fake echoerr +fake echohl +fake echomsg +fake echon +fake echowindow +fake edit +fake else +fake elseif +fake emenu +fake endclass +fake enddef +fake endenum +fake endfor +fake endfunction +fake endif +fake endinterface +fake endtry +fake endwhile +fake enew +fake enum +fake eval +fake ex +fake execute +fake exit +fake export +fake exusage +fake file +fake files +fake filetype +fake filter +fake final +fake finally +fake find +fake finish +fake first +fake fixdel +fake fold +fake foldclose +fake folddoclosed +fake folddoopen +fake foldopen +fake for +fake function +fake global +fake goto +fake grep +fake grepadd +fake gui +fake gvim +fake hardcopy +fake help +fake helpclose +fake helpfind +fake helpgrep +fake helptags +fake hide +fake highlight +fake history +fake horizontal +fake iabbrev +fake iabclear +fake if +fake ijump +fake ilist +fake imap +fake imapclear +fake imenu +fake import +fake inoreabbrev +fake inoremap +fake inoremenu +fake interface +fake intro +fake isearch +fake isplit +fake iunabbrev +fake iunmap +fake iunmenu +fake join +fake jumps +fake keepalt +fake keepjumps +fake keepmarks +fake keeppatterns +fake labove +fake laddbuffer +fake laddexpr +fake laddfile +fake lafter +fake language +fake last +fake later +fake lbefore +fake lbelow +fake lbottom +fake lbuffer +fake lcd +fake lchdir +fake lclose +fake lcscope +fake ldo +fake left +fake leftabove +fake legacy +fake lexpr +fake lfdo +fake lfile +fake lfirst +fake lgetbuffer +fake lgetexpr +fake lgetfile +fake lgrep +fake lgrepadd +fake lhelpgrep +fake lhistory +fake list +fake ll +fake llast +fake llist +fake lmake +fake lmap +fake lmapclear +fake lnewer +fake lnext +fake lNext +fake lnfile +fake lNfile +fake lnoremap +fake loadkeymap +fake loadview +fake lockmarks +fake lockvar +fake lolder +fake lopen +fake lpfile +fake lprevious +fake lrewind +fake ls +fake ltag +fake lua +fake luado +fake luafile +fake lunmap +fake lvimgrep +fake lvimgrepadd +fake lwindow +fake make +fake map +fake mapclear +fake mark +fake marks +fake match +fake menu +fake menutranslate +fake messages +fake mkexrc +fake mksession +fake mkspell +fake mkview +fake mkvimrc +fake move +fake mzfile +fake mzscheme +fake nbclose +fake nbkey +fake nbstart +fake new +fake next +fake nmap +fake nmapclear +fake nmenu +fake nnoremap +fake nnoremenu +fake noautocmd +fake nohlsearch +fake noreabbrev +fake noremap +fake noremenu +fake normal +fake noswapfile +fake number +fake nunmap +fake nunmenu +fake oldfiles +fake omap +fake omapclear +fake omenu +fake only +fake onoremap +fake onoremenu +fake options +fake ounmap +fake ounmenu +fake ownsyntax +fake packadd +fake packloadall +fake pclose +fake pedit +fake perl +fake perldo +fake pop +fake popup +fake ppop +fake preserve +fake previous +fake print +fake profdel +fake profile +fake promptfind +fake promptrepl +fake psearch +fake ptag +fake ptfirst +fake ptjump +fake ptlast +fake ptnext +fake ptNext +fake ptprevious +fake ptrewind +fake ptselect +fake put +fake pwd +fake py3 +fake py3do +fake py3file +fake pydo +fake pyfile +fake python +fake python3 +fake pythonx +fake pyx +fake pyxdo +fake pyxfile +fake qall +fake quit +fake quitall +fake read +fake recover +fake redir +fake redo +fake redraw +fake redrawstatus +fake redrawtabline +fake registers +fake resize +fake retab +fake return +fake rewind +fake right +fake rightbelow +fake ruby +fake rubydo +fake rubyfile +fake rundo +fake runtime +fake rviminfo +fake sall +fake sandbox +fake sargument +fake saveas +fake sball +fake sbfirst +fake sblast +fake sbmodified +fake sbnext +fake sbNext +fake sbprevious +fake sbrewind +fake sbuffer +fake scriptencoding +fake scriptnames +fake scriptversion +fake scscope +fake set +fake setfiletype +fake setglobal +fake setlocal +fake sfind +fake sfirst +fake shell +fake sign +fake silent +fake simalt +fake slast +fake sleep +fake smagic +fake smap +fake smapclear +fake smenu +fake smile +fake snext +fake sNext +fake snomagic +fake snoremap +fake snoremenu +fake sort +fake source +fake spelldump +fake spellgood +fake spellinfo +fake spellrare +fake spellrepall +fake spellundo +fake spellwrong +fake split +fake sprevious +fake srewind +fake stag +fake startgreplace +fake startinsert +fake startreplace +fake stjump +fake stop +fake stopinsert +fake stselect +fake substitute +fake sunhide +fake sunmap +fake sunmenu +fake suspend +fake sview +fake swapname +fake syncbind +fake syntax +fake syntime +fake tab +fake tabclose +fake tabdo +fake tabedit +fake tabfind +fake tabfirst +fake tablast +fake tabmove +fake tabnew +fake tabnext +fake tabNext +fake tabonly +fake tabprevious +fake tabrewind +fake tabs +fake tag +fake tags +fake tcd +fake tchdir +fake tcl +fake tcldo +fake tclfile +fake tearoff +fake terminal +fake tfirst +fake throw +fake tjump +fake tlast +fake tlmenu +fake tlnoremenu +fake tlunmenu +fake tmap +fake tmapclear +fake tmenu +fake tnext +fake tNext +fake tnoremap +fake topleft +fake tprevious +fake trewind +fake try +fake tselect +fake tunmap +fake tunmenu +fake type +fake unabbreviate +fake undo +fake undojoin +fake undolist +fake unhide +fake uniq +fake unlet +fake unlockvar +fake unmap +fake unmenu +fake unsilent +fake update +fake var +fake verbose +fake version +fake vertical +fake vglobal +fake view +fake vim9cmd +# :vim9script +fake vimgrep +fake vimgrepadd +fake visual +fake viusage +fake vmap +fake vmapclear +fake vmenu +fake vnew +fake vnoremap +fake vnoremenu +fake vsplit +fake vunmap +fake vunmenu +fake wall +fake while +fake wincmd +fake windo +fake winpos +fake winsize +fake wnext +fake wNext +fake wprevious +fake wq +fake wqall +fake write +fake wundo +fake wviminfo +fake xall +fake xmap +fake xmapclear +fake xmenu +fake xnoremap +fake xnoremenu +fake xrestore +fake xunmap +fake xunmenu +fake yank +fake z + + +# Legacy-script only + +fake Print +fake append +fake change +fake insert +fake k +fake let +fake mode +fake open +fake t +fake xit + + +# User commands + +fake Foobar +fake Foobar! +fake Foobar123 +fake Foobar123! +fake Foo123bar +fake Foo123bar! + diff --git a/runtime/syntax/testdir/input/vim_ex_commands_contained.vim b/runtime/syntax/testdir/input/vim_ex_commands_contained.vim new file mode 100644 index 0000000000..eb33a44d78 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_commands_contained.vim @@ -0,0 +1,612 @@ +# Ex command containment + + +fake & +fake ~ +fake @ +" :* +fake > +fake < +fake # +fake = +fake ! + +fake Next +fake Print +fake X + +fake append +fake abbreviate +fake abclear +fake aboveleft +fake all +fake amenu +fake anoremenu +fake argadd +fake argdedupe +fake argdelete +fake argdo +fake argedit +fake argglobal +fake arglocal +fake args +fake argument +fake ascii +fake augroup Foo +fake augroup END +fake aunmenu +fake autocmd +fake badd +fake ball +fake balt +fake bdelete +fake behave mswin +fake behave xterm +fake belowright +fake bfirst +fake blast +fake bmodified +fake bnext +fake bNext +fake botright +fake bprevious +fake break +fake breakadd +fake breakdel +fake breaklist +fake brewind +fake browse +fake bufdo +fake buffer +fake buffers +fake bunload +fake bwipeout +fake change +fake cabbrev +fake cabclear +fake cabove +fake caddbuffer +fake caddexpr +fake caddfile +fake cafter +fake call +fake catch +fake cbefore +fake cbelow +fake cbottom +fake cbuffer +fake cc +fake cclose +fake cd +fake cdo +fake center +fake cexpr +fake cfdo +fake cfile +fake cfirst +fake cgetbuffer +fake cgetexpr +fake cgetfile +fake changes +fake chdir +fake checkpath +fake checktime +fake chistory +fake clast +fake clearjumps +fake clist +fake close +fake cmap +fake cmapclear +fake cmenu +fake cnewer +fake cnext +fake cNext +fake cnfile +fake cNfile +fake cnoreabbrev +fake cnoremap +fake cnoremenu +fake colder +fake colorscheme +fake comclear +fake command +fake compiler +fake confirm +fake const +fake continue +fake copen +fake copy +fake cpfile +fake cprevious +fake cquit +fake crewind +fake cscope +fake cstag +fake cunabbrev +fake cunmap +fake cunmenu +fake cwindow +fake debug +fake debuggreedy +fake def +fake defcompile +fake defer +fake delcommand +fake delete +fake delfunction +fake delmarks +fake diffget +fake diffoff +fake diffpatch +fake diffput +fake diffsplit +fake diffthis +fake diffupdate +fake digraphs +fake disassemble +fake display +fake djump +fake dlist +fake doautoall +fake doautocmd +fake drop +fake dsearch +fake dsplit +fake earlier +fake echo +fake echoconsole +fake echoerr +fake echohl +fake echomsg +fake echon +fake echowindow +fake edit +fake else +fake elseif +fake emenu +fake enddef +fake endfor +fake endfunction +fake endif +fake endtry +fake endwhile +fake enew +fake eval +fake ex +fake execute +fake exit +fake exusage +fake file +fake files +fake filetype +fake filter +fake final +fake finally +fake find +fake finish +fake first +fake fixdel +fake fold +fake foldclose +fake folddoclosed +fake folddoopen +fake foldopen +fake for +fake function +fake global +fake goto +fake grep +fake grepadd +fake gui +fake gvim +fake hardcopy +fake help +fake helpclose +fake helpfind +fake helpgrep +fake helptags +fake hide +fake highlight +fake history +fake horizontal +fake insert +fake iabbrev +fake iabclear +fake if +fake ijump +fake ilist +fake imap +fake imapclear +fake imenu +fake import +fake inoreabbrev +fake inoremap +fake inoremenu +fake intro +fake isearch +fake isplit +fake iunabbrev +fake iunmap +fake iunmenu +fake join +fake jumps +fake k +fake keepalt +fake keepjumps +fake keepmarks +fake keeppatterns +fake labove +fake laddbuffer +fake laddexpr +fake laddfile +fake lafter +fake language +fake last +fake later +fake lbefore +fake lbelow +fake lbottom +fake lbuffer +fake lcd +fake lchdir +fake lclose +fake lcscope +fake ldo +fake left +fake leftabove +fake legacy +fake let +fake lexpr +fake lfdo +fake lfile +fake lfirst +fake lgetbuffer +fake lgetexpr +fake lgetfile +fake lgrep +fake lgrepadd +fake lhelpgrep +fake lhistory +fake list +fake ll +fake llast +fake llist +fake lmake +fake lmap +fake lmapclear +fake lnewer +fake lnext +fake lNext +fake lnfile +fake lNfile +fake lnoremap +fake loadkeymap +fake loadview +fake lockmarks +fake lockvar +fake lolder +fake lopen +fake lpfile +fake lprevious +fake lrewind +fake ls +fake ltag +fake lua +fake luado +fake luafile +fake lunmap +fake lvimgrep +fake lvimgrepadd +fake lwindow +fake make +fake map +fake mapclear +fake mark +fake marks +fake match +fake menu +fake menutranslate +fake messages +fake mkexrc +fake mksession +fake mkspell +fake mkview +fake mkvimrc +fake mode +fake move +fake mzfile +fake mzscheme +fake nbclose +fake nbkey +fake nbstart +fake new +fake next +fake nmap +fake nmapclear +fake nmenu +fake nnoremap +fake nnoremenu +fake noautocmd +fake nohlsearch +fake noreabbrev +fake noremap +fake noremenu +fake normal +fake noswapfile +fake number +fake nunmap +fake nunmenu +fake oldfiles +fake omap +fake omapclear +fake omenu +fake only +fake onoremap +fake onoremenu +fake open +fake options +fake ounmap +fake ounmenu +fake ownsyntax +fake packadd +fake packloadall +fake pclose +fake pedit +fake perl +fake perldo +fake pop +fake popup +fake ppop +fake preserve +fake previous +fake print +fake profdel +fake profile +fake promptfind +fake promptrepl +fake psearch +fake ptag +fake ptfirst +fake ptjump +fake ptlast +fake ptnext +fake ptNext +fake ptprevious +fake ptrewind +fake ptselect +fake put +fake pwd +fake py3 +fake py3do +fake py3file +fake pydo +fake pyfile +fake python +fake python3 +fake pythonx +fake pyx +fake pyxdo +fake pyxfile +fake qall +fake quit +fake quitall +fake read +fake recover +fake redir +fake redo +fake redraw +fake redrawstatus +fake redrawtabline +fake registers +fake resize +fake retab +fake return +fake rewind +fake right +fake rightbelow +fake ruby +fake rubydo +fake rubyfile +fake rundo +fake runtime +fake rviminfo +fake sall +fake sandbox +fake sargument +fake saveas +fake sball +fake sbfirst +fake sblast +fake sbmodified +fake sbnext +fake sbNext +fake sbprevious +fake sbrewind +fake sbuffer +fake scriptencoding +fake scriptnames +fake scriptversion +fake scscope +fake set +fake setfiletype +fake setglobal +fake setlocal +fake sfind +fake sfirst +fake shell +fake sign +fake silent +fake simalt +fake slast +fake sleep +fake smagic +fake smap +fake smapclear +fake smenu +fake smile +fake snext +fake sNext +fake snomagic +fake snoremap +fake snoremenu +fake sort +fake source +fake spelldump +fake spellgood +fake spellinfo +fake spellrare +fake spellrepall +fake spellundo +fake spellwrong +fake split +fake sprevious +fake srewind +fake stag +fake startgreplace +fake startinsert +fake startreplace +fake stjump +fake stop +fake stopinsert +fake stselect +fake substitute +fake sunhide +fake sunmap +fake sunmenu +fake suspend +fake sview +fake swapname +fake syncbind +fake syntax +fake syntime +fake t +fake tab +fake tabclose +fake tabdo +fake tabedit +fake tabfind +fake tabfirst +fake tablast +fake tabmove +fake tabnew +fake tabnext +fake tabNext +fake tabonly +fake tabprevious +fake tabrewind +fake tabs +fake tag +fake tags +fake tcd +fake tchdir +fake tcl +fake tcldo +fake tclfile +fake tearoff +fake terminal +fake tfirst +fake throw +fake tjump +fake tlast +fake tlmenu +fake tlnoremenu +fake tlunmenu +fake tmap +fake tmapclear +fake tmenu +fake tnext +fake tNext +fake tnoremap +fake topleft +fake tprevious +fake trewind +fake try +fake tselect +fake tunmap +fake tunmenu +fake unabbreviate +fake undo +fake undojoin +fake undolist +fake unhide +fake uniq +fake unlet +fake unlockvar +fake unmap +fake unmenu +fake unsilent +fake update +fake verbose +fake version +fake vertical +fake vglobal +fake view +fake vim9cmd +fake vimgrep +fake vimgrepadd +fake visual +fake viusage +fake vmap +fake vmapclear +fake vmenu +fake vnew +fake vnoremap +fake vnoremenu +fake vsplit +fake vunmap +fake vunmenu +fake wall +fake while +fake wincmd +fake windo +fake winpos +fake winsize +fake wnext +fake wNext +fake wprevious +fake wq +fake wqall +fake write +fake wundo +fake wviminfo +fake xall +fake xit +fake xmap +fake xmapclear +fake xmenu +fake xnoremap +fake xnoremenu +fake xrestore +fake xunmap +fake xunmenu +fake yank +fake z + + +" Vim9-script only + +fake abstract +fake class +fake endclass +fake endinterface +fake endenum +fake enum +fake export +fake final +fake interface +fake public +fake static +fake type +fake var + + +" User commands + +fake Foobar +fake Foobar! +fake Foobar123 +fake Foobar123! +fake Foo123bar +fake Foo123bar! + diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index b645649383..34dec27728 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 02 +" Last Change: 2026 Aug 10 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -569,7 +569,7 @@ syn match vimAugroupBang contained "\a\@1<=!" skipwhite nextgroup=vimAugroupName syn keyword vimAugroupKey contained aug[roup] skipwhite nextgroup=vimAugroupBang,vimAugroupName,vimAugroupEnd " remove -syn match vimAugroup "\\ze\s*\%(["|]\|$\)" skipwhite nextgroup=vimCmdSep,vimComment contains=vimAugroupKey @@ -632,22 +632,22 @@ syn keyword vimBehaveModel contained mswin xterm " ================================ syn keyword vimBreakaddFunc contained func skipwhite nextgroup=vimBreakpointFunctionLine,vimBreakpointFunction syn keyword vimBreakaddFile contained file skipwhite nextgroup=vimBreakpointFileLine,vimBreakpointFilename -syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn keyword vimBreakaddHere contained here skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep syn keyword vimBreakaddExpr contained expr skipwhite nextgroup=@vimExprList -syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointGlob contained "*" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep +syn match vimBreakpointNumber contained "\<\d\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep syn cluster vimBreakpointArg contains=vimBreakaddFunc,vimBreakaddFile,vimBreakaddHere,vimBreakaddExpr -syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep -syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn match vimBreakpointFunction contained "\<\%(\*\|\w\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep +syn match vimBreakpointFilename contained "\<\%(\*\|\f\)\+\>" skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep syn match vimBreakpointFunctionLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFunction syn match vimBreakpointFileLine contained "\<\d\+\>" skipwhite nextgroup=vimBreakpointFilename syn keyword vimBreakadd contained breaka[dd] skipwhite nextgroup=@vimBreakpointArg syn keyword vimBreakdel contained breakd[el] skipwhite nextgroup=@vimBreakpointArg,vimBreakpointNumber,vimBreakpointGlob -syn keyword vimBreaklist contained breakl[ist] skipwhite nextgroup=vimComment,vim9Comment,vimSep +syn keyword vimBreaklist contained breakl[ist] skipwhite nextgroup=vimComment,vim9Comment,vimCmdSep " :buffer {{{3 " ======= @@ -858,7 +858,8 @@ syn region vimCatchPattern contained matchgroup=Delimiter start="\z([!#$%&'()*+, " :export {{{3 " ======= if s:vim9script - syn keyword vim9Export export skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vimDef,vimDefFold,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var + syn keyword vim9Export export contained + \ skipwhite nextgroup=vim9Abstract,vim9ClassBody,vim9Const,vimDef,vimDefFold,vim9EnumBody,vim9Final,vim9InterfaceBody,vim9Type,vim9Var endif " :filetype {{{3 @@ -1082,12 +1083,12 @@ syn keyword vimImport contained imp[ort] skipwhite nextgroup=vimImportAutoload, " :language {{{3 " ========= -syn keyword vimLanguage contained lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimSep,vimComment,vim9Comment +syn keyword vimLanguage contained lan[guage] skipwhite nextgroup=@vimLanguageName,vimLanguageCategory,vimCmdSep,vimComment,vim9Comment syn keyword vimLanguageCategory contained col[late] cty[pe] mes[sages] tim[e] skipwhite nextgroup=@vimLanguageName " [language[_territory][.codeset][@modifier]] and the reserved "C" and "POSIX" -syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimSep,vimComment,vim9Comment -syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimSep,vimComment,vim9Comment +syn match vimLanguageName contained "[[:alnum:]][[:alnum:]._@-]*[[:alnum:]]" nextgroup=vimCmdSep,vimComment,vim9Comment +syn keyword vimLanguageNameReserved contained C POSIX nextgroup=vimCmdSep,vimComment,vim9Comment syn cluster vimLanguageName contains=vimLanguageName,vimLanguageNameReserved " :loadkeymap {{{3 @@ -1887,14 +1888,14 @@ syn keyword vimEndfunction contained endf[unction] skipwhite nextgroup=vimCmdSep syn keyword vimEnddef contained enddef skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vimFunctionFold + syn region vimFunctionFold contained \ start="\" skipwhite skipnl nextgroup=vim9Implements syn match vim9ImplementedInterface contained "\<\u\w*\>" skipwhite skipnl nextgroup=vim9InterfaceListComma,vim9Extends syn match vim9InterfaceListComma contained "," skipwhite skipnl nextgroup=vim9ImplementedInterface - syn keyword vim9Abstract abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef + syn keyword vim9Abstract contained abstract skipwhite skipnl nextgroup=vim9ClassBody,vim9AbstractDef syn keyword vim9Extends contained extends skipwhite skipnl nextgroup=vim9SuperClass syn keyword vim9Implements contained implements skipwhite skipnl nextgroup=vim9ImplementedInterface syn keyword vim9Public contained public @@ -2036,7 +2037,12 @@ if s:vim9script " super must be followed by '.' syn match vim9Super contained "\.\@1" matchgroup=vimCommand end="\" contains=@vim9ClassBodyList transparent + VimFoldc syn region vim9ClassBody contained + \ start="\" + \ matchgroup=vimCommand + \ end="\" + \ contains=@vim9ClassBodyList + \ transparent " Enums {{{3 syn cluster vim9EnumBodyList contains=vim9Comment,vim9LineComment,@vim9Continue,vim9Enum,@vimExprList,@vim9MethodDef,vim9Public,vim9Static,vim9Const,vim9Final,vim9This,vim9Var @@ -2089,7 +2095,12 @@ if s:vim9script \ skipwhite skipempty nextgroup=vim9EnumImplementedInterfaceComment,vim9EnumValue \ contains=@vimCommentGroup,vimCommentString - VimFolde syn region vim9EnumBody start="\" matchgroup=vimCommand end="\" contains=@vim9EnumBodyList transparent + VimFolde syn region vim9EnumBody contained + \ start="\" + \ matchgroup=vimCommand + \ end="\" + \ contains=@vim9EnumBodyList + \ transparent " Interfaces {{{3 " TODO: limit to decl only - no init values @@ -2116,10 +2127,15 @@ if s:vim9script \ nextgroup=vim9AbstractDefParams \ contains=vim9DefTypeParam - VimFoldi syn region vim9InterfaceBody start="\" matchgroup=vimCommand end="\" contains=@vim9InterfaceBodyList transparent + VimFoldi syn region vim9InterfaceBody contained + \ start="\" + \ matchgroup=vimCommand + \ end="\" + \ contains=@vim9InterfaceBodyList + \ transparent " Type Aliases {{{3 - syn match vim9Type "\" skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError + syn keyword vim9Type contained ty[pe] skipwhite nextgroup=vim9TypeAlias,vim9TypeAliasError syn match vim9TypeAlias contained "\<\u\w*\>" skipwhite nextgroup=vim9TypeEquals syn match vim9TypeEquals contained "=" skipwhite nextgroup=@vimType if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_notypealiaserror") @@ -2388,25 +2404,23 @@ syn match vimBracket contained "[\\<>]" syn case match " User Command Highlighting: {{{2 -" syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' -" syn match vimUsrCmd contained '\u\%(\w*\)\@>\%([<.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' nextgroup=vimBang syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:space:]]\|$\)\@=' nextgroup=vimBang " Vim user commands " Compiler plugins -syn match vimCompilerSet "\" skipwhite nextgroup=vimSetArgs +syn keyword vimCompilerSet contained CompilerSet skipwhite nextgroup=vimSetArgs " runtime/makemenu.vim -syn match vimSynMenu "\" skipwhite nextgroup=vimSynMenuPath +syn keyword vimSynMenu contained SynMenu skipwhite nextgroup=vimSynMenuPath syn match vimSynMenuPath contained ".*\ze:" nextgroup=vimSynMenuColon contains=vimMenuNotation syn match vimSynMenuColon contained ":" nextgroup=vimSynMenuName syn match vimSynMenuName contained "\w\+" " runtime/syntax/syncolor.vim -syn match vimSynColor "\" skipwhite nextgroup=vimSynColorGroup +syn keyword vimSynColor contained SynColor skipwhite nextgroup=vimSynColorGroup syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyList contains=vimGroup -syn match vimSynLink "\" skipwhite nextgroup=vimSynLinkGroup +syn keyword vimSynLink contained SynLink skipwhite nextgroup=vimSynLinkGroup syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu From 280bdc5d0d803378380db34701828f122c7f798e Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Mon, 10 Aug 2026 19:28:53 +0000 Subject: [PATCH 323/647] runtime(colors): update colorschemes changes: - habamax, lunaperche, wildcharm: bold PmenuMatch/PmenuMatchSel - catppuccin: softer VertSplit and PmenuBorder, fix Spell* - habamax: less contrast for Constant (yellowish instead of red) - the rest: update PmenuKind/PmenuExtra for non-colored term closes: #20996 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/colors/catppuccin.vim | 40 +++++++------ runtime/colors/habamax.vim | 30 +++++----- runtime/colors/lunaperche.vim | 27 +++++---- runtime/colors/novum.vim | 6 +- runtime/colors/quiet.vim | 12 ++-- runtime/colors/retrobox.vim | 27 +++++---- runtime/colors/sorbet.vim | 8 +-- runtime/colors/unokai.vim | 6 +- runtime/colors/wildcharm.vim | 103 ++++++++++++++++------------------ runtime/colors/zaibatsu.vim | 8 +-- 10 files changed, 141 insertions(+), 126 deletions(-) diff --git a/runtime/colors/catppuccin.vim b/runtime/colors/catppuccin.vim index 94a0a7c06c..b3873bc70c 100644 --- a/runtime/colors/catppuccin.vim +++ b/runtime/colors/catppuccin.vim @@ -3,9 +3,9 @@ " Author: The Catppuccin Community " Maintainer: Mao-Yining " URL: https://github.com/vim/colorschemes -" Last Change: 2026 Jun 12 +" Last Change: 2026 Jul 21 -" Generated by Colortemplate v3.0.0-rc2 +" Generated by Colortemplate v3.0.0-rc1 hi clear let g:colors_name = 'catppuccin' @@ -78,8 +78,8 @@ if &background == 'dark' hi NonText guifg=#6c7086 guibg=NONE guisp=NONE gui=NONE ctermfg=59 ctermbg=NONE cterm=NONE term=NONE hi Operator guifg=#89dceb guibg=NONE guisp=NONE gui=NONE ctermfg=116 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#9399b2 guibg=#181825 guisp=NONE gui=NONE ctermfg=103 ctermbg=232 cterm=NONE term=reverse - hi PmenuBorder guifg=#89b4fa guibg=#181825 guisp=NONE gui=NONE ctermfg=111 ctermbg=232 cterm=NONE term=NONE - hi PmenuExtra guifg=#6c7086 guibg=#181825 guisp=NONE gui=NONE ctermfg=59 ctermbg=232 cterm=NONE term=NONE + hi PmenuBorder guifg=#b4befe guibg=#181825 guisp=NONE gui=NONE ctermfg=147 ctermbg=232 cterm=NONE term=NONE + hi PmenuExtra guifg=#6c7086 guibg=#181825 guisp=NONE gui=NONE ctermfg=59 ctermbg=232 cterm=NONE term=reverse hi PmenuExtraSel guifg=#6c7086 guibg=#313244 guisp=NONE gui=bold ctermfg=59 ctermbg=236 cterm=bold term=bold hi PmenuMatch guifg=#cdd6f4 guibg=NONE guisp=NONE gui=bold ctermfg=189 ctermbg=NONE cterm=bold term=bold hi PmenuMatchSel guifg=#cdd6f4 guibg=NONE guisp=NONE gui=bold ctermfg=189 ctermbg=NONE cterm=bold term=bold @@ -119,7 +119,7 @@ if &background == 'dark' hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#f9e2af guibg=NONE guisp=NONE gui=NONE ctermfg=222 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline - hi VertSplit guifg=#89b4fa guibg=NONE guisp=NONE gui=NONE ctermfg=111 ctermbg=NONE cterm=NONE term=NONE + hi VertSplit guifg=#b4befe guibg=NONE guisp=NONE gui=NONE ctermfg=147 ctermbg=NONE cterm=NONE term=NONE hi VertSplitNC guifg=#11111b guibg=NONE guisp=NONE gui=NONE ctermfg=16 ctermbg=NONE cterm=NONE term=NONE hi Visual guifg=NONE guibg=#45475a guisp=NONE gui=NONE ctermfg=240 ctermbg=189 cterm=reverse term=reverse hi VisualNOS guifg=NONE guibg=#45475a guisp=NONE gui=bold ctermfg=NONE ctermbg=240 cterm=bold term=NONE @@ -161,6 +161,10 @@ if &background == 'dark' if s:tgc || s:t_Co >= 256 if s:tgc hi QuickFixLine cterm=NONE + hi SpellBad guifg=#f38ba8 guibg=NONE ctermfg=211 ctermbg=NONE cterm=underline + hi SpellCap guifg=#f9e2af guibg=NONE ctermfg=222 ctermbg=NONE cterm=underline + hi SpellLocal guifg=#89b4fa guibg=NONE ctermfg=111 ctermbg=NONE cterm=underline + hi SpellRare guifg=#a6e3a1 guibg=NONE ctermfg=114 ctermbg=NONE cterm=underline hi Visual cterm=NONE endif finish @@ -209,7 +213,7 @@ if &background == 'dark' hi NonText ctermfg=Grey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Grey ctermbg=DarkGrey cterm=NONE - hi PmenuBorder ctermfg=Blue ctermbg=DarkGrey cterm=NONE + hi PmenuBorder ctermfg=LightGrey ctermbg=DarkGrey cterm=NONE hi PmenuExtra ctermfg=Grey ctermbg=DarkGrey cterm=NONE hi PmenuExtraSel ctermfg=Grey ctermbg=DarkYellow cterm=bold hi PmenuMatch ctermfg=White ctermbg=NONE cterm=bold @@ -250,7 +254,7 @@ if &background == 'dark' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=LightGrey ctermbg=NONE cterm=NONE hi VertSplitNC ctermfg=Grey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=Black cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=Black cterm=bold @@ -334,7 +338,7 @@ if &background == 'dark' hi NonText ctermfg=Grey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Grey ctermbg=DarkGrey cterm=NONE - hi PmenuBorder ctermfg=Blue ctermbg=DarkGrey cterm=NONE + hi PmenuBorder ctermfg=LightGrey ctermbg=DarkGrey cterm=NONE hi PmenuExtra ctermfg=Grey ctermbg=DarkGrey cterm=NONE hi PmenuExtraSel ctermfg=Grey ctermbg=DarkYellow cterm=bold hi PmenuMatch ctermfg=White ctermbg=NONE cterm=bold @@ -375,7 +379,7 @@ if &background == 'dark' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=LightGrey ctermbg=NONE cterm=NONE hi VertSplitNC ctermfg=Grey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=Black cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=Black cterm=bold @@ -476,8 +480,8 @@ if &background == 'light' hi NonText guifg=#9ca0b0 guibg=NONE guisp=NONE gui=NONE ctermfg=247 ctermbg=NONE cterm=NONE term=NONE hi Operator guifg=#04a5e5 guibg=NONE guisp=NONE gui=NONE ctermfg=39 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#7c7f93 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=103 ctermbg=255 cterm=NONE term=reverse - hi PmenuBorder guifg=#1e66f5 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=27 ctermbg=255 cterm=NONE term=NONE - hi PmenuExtra guifg=#9ca0b0 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=247 ctermbg=255 cterm=NONE term=NONE + hi PmenuBorder guifg=#7287fd guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=69 ctermbg=255 cterm=NONE term=NONE + hi PmenuExtra guifg=#9ca0b0 guibg=#e6e9ef guisp=NONE gui=NONE ctermfg=247 ctermbg=255 cterm=NONE term=reverse hi PmenuExtraSel guifg=#9ca0b0 guibg=#ccd0da guisp=NONE gui=bold ctermfg=247 ctermbg=253 cterm=bold term=bold hi PmenuMatch guifg=#4c4f69 guibg=NONE guisp=NONE gui=bold ctermfg=236 ctermbg=NONE cterm=bold term=bold hi PmenuMatchSel guifg=#4c4f69 guibg=NONE guisp=NONE gui=bold ctermfg=236 ctermbg=NONE cterm=bold term=bold @@ -517,7 +521,7 @@ if &background == 'light' hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#df8e1d guibg=NONE guisp=NONE gui=NONE ctermfg=172 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline - hi VertSplit guifg=#1e66f5 guibg=NONE guisp=NONE gui=NONE ctermfg=27 ctermbg=NONE cterm=NONE term=NONE + hi VertSplit guifg=#7287fd guibg=NONE guisp=NONE gui=NONE ctermfg=69 ctermbg=NONE cterm=NONE term=NONE hi VertSplitNC guifg=#dce0e8 guibg=NONE guisp=NONE gui=NONE ctermfg=254 ctermbg=NONE cterm=NONE term=NONE hi Visual guifg=NONE guibg=#bcc0cc guisp=NONE gui=NONE ctermfg=250 ctermbg=236 cterm=reverse term=reverse hi VisualNOS guifg=NONE guibg=#bcc0cc guisp=NONE gui=bold ctermfg=NONE ctermbg=250 cterm=bold term=NONE @@ -559,6 +563,10 @@ if &background == 'light' if s:tgc || s:t_Co >= 256 if s:tgc hi QuickFixLine cterm=NONE + hi SpellBad guifg=#d20f39 guibg=NONE ctermfg=161 ctermbg=NONE cterm=underline + hi SpellCap guifg=#df8e1d guibg=NONE ctermfg=172 ctermbg=NONE cterm=underline + hi SpellLocal guifg=#1e66f5 guibg=NONE ctermfg=27 ctermbg=NONE cterm=underline + hi SpellRare guifg=#40a02b guibg=NONE ctermfg=34 ctermbg=NONE cterm=underline hi Visual cterm=NONE endif finish @@ -607,7 +615,7 @@ if &background == 'light' hi NonText ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Black ctermbg=Grey cterm=NONE - hi PmenuBorder ctermfg=Blue ctermbg=Grey cterm=NONE + hi PmenuBorder ctermfg=DarkBlue ctermbg=Grey cterm=NONE hi PmenuExtra ctermfg=DarkGrey ctermbg=Grey cterm=NONE hi PmenuExtraSel ctermfg=DarkGrey ctermbg=Grey cterm=bold hi PmenuMatch ctermfg=Black ctermbg=NONE cterm=bold @@ -648,7 +656,7 @@ if &background == 'light' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=DarkBlue ctermbg=NONE cterm=NONE hi VertSplitNC ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=White cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=White cterm=bold @@ -732,7 +740,7 @@ if &background == 'light' hi NonText ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Operator ctermfg=Cyan ctermbg=NONE cterm=NONE hi Pmenu ctermfg=Black ctermbg=Grey cterm=NONE - hi PmenuBorder ctermfg=Blue ctermbg=Grey cterm=NONE + hi PmenuBorder ctermfg=DarkBlue ctermbg=Grey cterm=NONE hi PmenuExtra ctermfg=DarkGrey ctermbg=Grey cterm=NONE hi PmenuExtraSel ctermfg=DarkGrey ctermbg=Grey cterm=bold hi PmenuMatch ctermfg=Black ctermbg=NONE cterm=bold @@ -773,7 +781,7 @@ if &background == 'light' hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=Yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline - hi VertSplit ctermfg=Blue ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=DarkBlue ctermbg=NONE cterm=NONE hi VertSplitNC ctermfg=DarkGrey ctermbg=NONE cterm=NONE hi Visual ctermfg=Blue ctermbg=White cterm=bold,reverse hi VisualNOS ctermfg=NONE ctermbg=White cterm=bold diff --git a/runtime/colors/habamax.vim b/runtime/colors/habamax.vim index ccc99278c2..6ebe8a3d17 100644 --- a/runtime/colors/habamax.vim +++ b/runtime/colors/habamax.vim @@ -3,7 +3,7 @@ " Author: Maxim Kim " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Jun 10 +" Last Change: 2026 Aug 07 " Generated by Colortemplate v3.0.0-rc1 @@ -20,12 +20,9 @@ let g:terminal_ansi_colors = ['#1c1c1c', '#af5f5f', '#5faf5f', '#af875f', '#5f87 hi! link CurSearch IncSearch hi! link CursorLineFold FoldColumn hi! link CursorLineSign FoldColumn -hi! link Float Number -hi! link Function Identifier hi! link LineNrAbove LineNr hi! link LineNrBelow LineNr hi! link MessageWindow Pmenu -hi! link Number Constant hi! link PopupNotification Normal hi! link PopupSelected PmenuSel hi! link PreInsert NonText @@ -51,8 +48,12 @@ hi! link asciidoctorTitle htmlH1 hi! link javaScriptFunction Statement hi! link javaScriptIdentifier Statement hi! link lspDiagVirtualTextError Removed -hi! link markdownHeadingRule Special +hi! link markdownCodeDelimiter Special +hi! link markdownHeadingDelimiter Type +hi! link markdownHeadingRule Type +hi! link markdownId String hi! link markdownLinkText String +hi! link markdownListMarker PreProc hi! link markdownUrl Underlined hi! link rstSection htmlH1 hi! link rubyDefine Statement @@ -70,11 +71,11 @@ hi! link yamlBlockMappingKey Statement hi Normal guifg=#c7c7c7 guibg=#1c1c1c guisp=NONE gui=NONE ctermfg=251 ctermbg=234 cterm=NONE term=NONE hi Added guifg=#5fd75f guibg=NONE guisp=NONE gui=NONE ctermfg=77 ctermbg=NONE cterm=NONE term=NONE hi Changed guifg=#ffaf5f guibg=NONE guisp=NONE gui=NONE ctermfg=215 ctermbg=NONE cterm=NONE term=NONE -hi Character guifg=#87d787 guibg=NONE guisp=NONE gui=NONE ctermfg=114 ctermbg=NONE cterm=NONE term=NONE +hi Character guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE cterm=NONE term=NONE hi ColorColumn guifg=NONE guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=reverse hi Comment guifg=#767676 guibg=NONE guisp=NONE gui=NONE ctermfg=243 ctermbg=NONE cterm=NONE term=bold hi Conceal guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE -hi Constant guifg=#d75f87 guibg=NONE guisp=NONE gui=NONE ctermfg=168 ctermbg=NONE cterm=NONE term=NONE +hi Constant guifg=#d7af87 guibg=NONE guisp=NONE gui=NONE ctermfg=180 ctermbg=NONE cterm=NONE term=NONE hi Cursor guifg=#000000 guibg=#dadada guisp=NONE gui=NONE ctermfg=16 ctermbg=253 cterm=NONE term=reverse hi CursorColumn guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=NONE hi CursorLine guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=underline @@ -100,12 +101,12 @@ hi MoreMsg guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE hi NonText guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=reverse hi PmenuBorder guifg=#767676 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=243 ctermbg=237 cterm=NONE term=NONE -hi PmenuExtra guifg=#767676 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=243 ctermbg=237 cterm=NONE term=NONE +hi PmenuExtra guifg=#767676 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=243 ctermbg=237 cterm=NONE term=reverse hi PmenuExtraSel guifg=#9e9e9e guibg=#585858 guisp=NONE gui=NONE ctermfg=247 ctermbg=240 cterm=NONE term=NONE -hi PmenuKind guifg=#5f8787 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=66 ctermbg=237 cterm=NONE term=NONE +hi PmenuKind guifg=#5f8787 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=66 ctermbg=237 cterm=NONE term=reverse hi PmenuKindSel guifg=#5f8787 guibg=#585858 guisp=NONE gui=NONE ctermfg=66 ctermbg=240 cterm=NONE term=NONE -hi PmenuMatch guifg=#ffaf5f guibg=NONE guisp=NONE gui=NONE ctermfg=215 ctermbg=NONE cterm=NONE term=NONE -hi PmenuMatchSel guifg=#ffaf5f guibg=NONE guisp=NONE gui=NONE ctermfg=215 ctermbg=NONE cterm=NONE term=NONE +hi PmenuMatch guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold +hi PmenuMatchSel guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold hi PmenuSbar guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=reverse hi PmenuSel guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=bold hi PmenuShadow guifg=#767676 guibg=#121212 guisp=NONE gui=NONE ctermfg=243 ctermbg=233 cterm=NONE term=NONE @@ -174,7 +175,7 @@ if s:t_Co >= 16 hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi Comment ctermfg=NONE ctermbg=NONE cterm=bold hi Conceal ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Constant ctermfg=yellow ctermbg=NONE cterm=NONE hi Cursor ctermfg=black ctermbg=white cterm=NONE hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline @@ -261,7 +262,7 @@ if s:t_Co >= 8 hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi Comment ctermfg=NONE ctermbg=NONE cterm=bold hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE - hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE hi Cursor ctermfg=black ctermbg=white cterm=NONE hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline @@ -344,9 +345,6 @@ if s:t_Co >= 0 hi CurSearch term=reverse hi CursorLineFold term=underline hi CursorLineSign term=underline - hi Float term=NONE - hi Function term=NONE - hi Number term=NONE hi StatusLineTerm term=bold,reverse hi StatusLineTermNC term=bold,underline hi Terminal term=NONE diff --git a/runtime/colors/lunaperche.vim b/runtime/colors/lunaperche.vim index a069587b3e..5c2cc2903c 100644 --- a/runtime/colors/lunaperche.vim +++ b/runtime/colors/lunaperche.vim @@ -2,7 +2,7 @@ " Description: White(perchè il sole)/Black(la luna perchè?) background colorscheme. " Author: Maxim Kim " URL: https://www.github.com/vim/colorschemes -" Last Change: 2026 Jun 10 +" Last Change: 2026 Jul 28 " Generated by Colortemplate v3.0.0-rc1 @@ -57,8 +57,12 @@ hi! link javaScriptFunction Statement hi! link javaScriptIdentifier Statement hi! link javaStorageClass Statement hi! link javaType Statement -hi! link markdownHeadingDelimiter Special +hi! link markdownCodeDelimiter Special +hi! link markdownHeadingDelimiter Type +hi! link markdownHeadingRule Type +hi! link markdownId String hi! link markdownLinkText String +hi! link markdownListMarker PreProc hi! link markdownUrl Underlined hi! link phpComparison Normal hi! link phpDefine Statement @@ -135,10 +139,10 @@ if &background == 'dark' hi NonText guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=reverse hi PmenuBorder guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE - hi PmenuExtra guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE + hi PmenuExtra guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=reverse hi PmenuExtraSel guifg=#767676 guibg=#4e4e4e guisp=NONE gui=NONE ctermfg=243 ctermbg=239 cterm=NONE term=NONE - hi PmenuKind guifg=#ff5f5f guibg=#303030 guisp=NONE gui=NONE ctermfg=203 ctermbg=236 cterm=NONE term=NONE - hi PmenuKindSel guifg=#ff5f5f guibg=#4e4e4e guisp=NONE gui=NONE ctermfg=203 ctermbg=239 cterm=NONE term=NONE + hi PmenuKind guifg=#af875f guibg=#303030 guisp=NONE gui=NONE ctermfg=137 ctermbg=236 cterm=NONE term=reverse + hi PmenuKindSel guifg=#af875f guibg=#4e4e4e guisp=NONE gui=NONE ctermfg=137 ctermbg=239 cterm=NONE term=NONE hi PmenuMatch guifg=#d787d7 guibg=NONE guisp=NONE gui=NONE ctermfg=176 ctermbg=NONE cterm=NONE term=NONE hi PmenuMatchSel guifg=#d787d7 guibg=NONE guisp=NONE gui=NONE ctermfg=176 ctermbg=NONE cterm=NONE term=NONE hi PmenuSbar guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse @@ -180,6 +184,7 @@ if &background == 'dark' hi WildMenu guifg=#000000 guibg=#ffd787 guisp=NONE gui=bold ctermfg=16 ctermbg=222 cterm=bold term=bold hi debugBreakpoint guifg=#5fafaf guibg=NONE guisp=NONE gui=reverse ctermfg=73 ctermbg=NONE cterm=reverse term=reverse hi debugPC guifg=#5f87af guibg=NONE guisp=NONE gui=reverse ctermfg=67 ctermbg=NONE cterm=reverse term=reverse + hi htmlH1 guifg=#ffffff guibg=NONE guisp=NONE gui=bold ctermfg=231 ctermbg=NONE cterm=bold term=bold if s:tgc || s:t_Co >= 256 if s:tgc @@ -267,6 +272,7 @@ if &background == 'dark' hi WildMenu ctermfg=black ctermbg=yellow cterm=bold hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse + hi htmlH1 ctermfg=white ctermbg=NONE cterm=bold finish endif @@ -346,6 +352,7 @@ if &background == 'dark' hi WildMenu ctermfg=black ctermbg=darkyellow cterm=bold hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse + hi htmlH1 ctermfg=white ctermbg=NONE cterm=bold finish endif @@ -399,10 +406,10 @@ if &background == 'light' hi NonText guifg=#9e9e9e guibg=NONE guisp=NONE gui=NONE ctermfg=247 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=254 cterm=NONE term=reverse hi PmenuBorder guifg=#767676 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=243 ctermbg=254 cterm=NONE term=NONE - hi PmenuExtra guifg=#767676 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=243 ctermbg=254 cterm=NONE term=NONE + hi PmenuExtra guifg=#767676 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=243 ctermbg=254 cterm=NONE term=reverse hi PmenuExtraSel guifg=#767676 guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=243 ctermbg=251 cterm=NONE term=NONE - hi PmenuKind guifg=#af0000 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=124 ctermbg=254 cterm=NONE term=NONE - hi PmenuKindSel guifg=#af0000 guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=124 ctermbg=251 cterm=NONE term=NONE + hi PmenuKind guifg=#af5f00 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=130 ctermbg=254 cterm=NONE term=reverse + hi PmenuKindSel guifg=#af5f00 guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=130 ctermbg=251 cterm=NONE term=NONE hi PmenuMatch guifg=#af00af guibg=NONE guisp=NONE gui=NONE ctermfg=127 ctermbg=NONE cterm=NONE term=NONE hi PmenuMatchSel guifg=#af00af guibg=NONE guisp=NONE gui=NONE ctermfg=127 ctermbg=NONE cterm=NONE term=NONE hi PmenuSbar guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse @@ -500,8 +507,8 @@ if &background == 'light' hi PmenuBorder ctermfg=NONE ctermbg=grey cterm=NONE hi PmenuExtra ctermfg=black ctermbg=grey cterm=NONE hi PmenuExtraSel ctermfg=black ctermbg=darkcyan cterm=NONE - hi PmenuKind ctermfg=darkred ctermbg=grey cterm=NONE - hi PmenuKindSel ctermfg=darkred ctermbg=darkcyan cterm=NONE + hi PmenuKind ctermfg=darkyellow ctermbg=grey cterm=NONE + hi PmenuKindSel ctermfg=darkyellow ctermbg=darkcyan cterm=NONE hi PmenuMatch ctermfg=darkmagenta ctermbg=NONE cterm=NONE hi PmenuMatchSel ctermfg=darkmagenta ctermbg=NONE cterm=NONE hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE diff --git a/runtime/colors/novum.vim b/runtime/colors/novum.vim index d1b92e0e46..75195d83b7 100644 --- a/runtime/colors/novum.vim +++ b/runtime/colors/novum.vim @@ -2,7 +2,7 @@ " Description: port of nvim dev_theme " Author: Charan Mandati " License: Vim License (see `:help license`)` -" Last Change: 2026 Jun 17 +" Last Change: 2026 Jul 21 " Generated by Colortemplate v3.0.0-rc1 @@ -282,6 +282,8 @@ if &background == 'dark' hi Ignore term=NONE hi IncSearch term=bold,reverse,underline hi Number term=NONE + hi PmenuExtra term=reverse + hi PmenuKind term=reverse hi PmenuSbar term=reverse hi StatusLineTerm term=bold,reverse hi StatusLineTermNC term=bold,underline @@ -522,6 +524,8 @@ if &background == 'light' hi Ignore term=NONE hi IncSearch term=bold,reverse,underline hi Number term=NONE + hi PmenuExtra term=reverse + hi PmenuKind term=reverse hi PmenuSbar term=reverse hi StatusLineTerm term=bold,reverse hi StatusLineTermNC term=bold,underline diff --git a/runtime/colors/quiet.vim b/runtime/colors/quiet.vim index f1872b783c..feb2a14030 100644 --- a/runtime/colors/quiet.vim +++ b/runtime/colors/quiet.vim @@ -4,9 +4,9 @@ " Maintainer: Maxence Weynans " URL: https://github.com/vim/colorschemes " License: Vim License (see `:help license`)` -" Last Change: 2025 Oct 08 +" Last Change: 2026 Jul 21 -" Generated by Colortemplate v3.0.0-beta10 +" Generated by Colortemplate v3.0.0-rc1 hi clear let g:colors_name = 'quiet' @@ -83,9 +83,9 @@ if &background == 'dark' hi MoreMsg guifg=#dadada guibg=NONE guisp=NONE gui=NONE ctermfg=253 ctermbg=NONE cterm=NONE term=NONE hi NonText guifg=#707070 guibg=NONE guisp=NONE gui=NONE ctermfg=242 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=reverse - hi PmenuExtra guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=NONE + hi PmenuExtra guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=reverse hi PmenuExtraSel guifg=#000000 guibg=#dadada guisp=NONE gui=NONE ctermfg=16 ctermbg=253 cterm=NONE term=NONE - hi PmenuKind guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=bold ctermfg=16 ctermbg=248 cterm=bold term=bold + hi PmenuKind guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=bold ctermfg=16 ctermbg=248 cterm=bold term=reverse hi PmenuKindSel guifg=#000000 guibg=#dadada guisp=NONE gui=bold ctermfg=16 ctermbg=253 cterm=bold term=bold hi PmenuMatch guifg=#d7005f guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=161 ctermbg=248 cterm=NONE term=NONE hi PmenuMatchSel guifg=#d7005f guibg=#dadada guisp=NONE gui=bold ctermfg=161 ctermbg=253 cterm=bold term=bold @@ -321,9 +321,9 @@ if &background == 'light' hi MoreMsg guifg=#000000 guibg=NONE guisp=NONE gui=NONE ctermfg=16 ctermbg=NONE cterm=NONE term=NONE hi NonText guifg=#626262 guibg=NONE guisp=NONE gui=NONE ctermfg=241 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=reverse - hi PmenuExtra guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=NONE + hi PmenuExtra guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=reverse hi PmenuExtraSel guifg=#d7d7d7 guibg=#000000 guisp=NONE gui=NONE ctermfg=188 ctermbg=16 cterm=NONE term=NONE - hi PmenuKind guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=bold ctermfg=16 ctermbg=248 cterm=bold term=bold + hi PmenuKind guifg=#000000 guibg=#a8a8a8 guisp=NONE gui=bold ctermfg=16 ctermbg=248 cterm=bold term=reverse hi PmenuKindSel guifg=#d7d7d7 guibg=#000000 guisp=NONE gui=bold ctermfg=188 ctermbg=16 cterm=bold term=bold hi PmenuMatch guifg=#d70000 guibg=#a8a8a8 guisp=NONE gui=NONE ctermfg=160 ctermbg=248 cterm=NONE term=NONE hi PmenuMatchSel guifg=#d70000 guibg=#000000 guisp=NONE gui=bold ctermfg=160 ctermbg=16 cterm=bold term=bold diff --git a/runtime/colors/retrobox.vim b/runtime/colors/retrobox.vim index e904210df8..6f851b88a2 100644 --- a/runtime/colors/retrobox.vim +++ b/runtime/colors/retrobox.vim @@ -2,7 +2,7 @@ " Description: Retro groove color scheme similar to gruvbox originally designed by morhetz " Author: Maxim Kim , ported from gruvbox8 of Lifepillar " URL: https://www.github.com/vim/colorschemes -" Last Change: 2026 Jun 10 +" Last Change: 2026 Jul 28 " Generated by Colortemplate v3.0.0-rc1 @@ -27,7 +27,12 @@ hi! link Tag Special hi! link Terminal Normal hi! link VisualNOS Visual hi! link lCursor Cursor +hi! link markdownCodeDelimiter Special +hi! link markdownHeadingDelimiter Type +hi! link markdownHeadingRule Type +hi! link markdownId String hi! link markdownLinkText String +hi! link markdownListMarker PreProc hi! link markdownUrl Underlined if &background == 'dark' @@ -77,10 +82,10 @@ if &background == 'dark' hi Operator guifg=#8ec07c guibg=NONE guisp=NONE gui=NONE ctermfg=107 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#3c3836 guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=reverse hi PmenuBorder guifg=#a89984 guibg=#3c3836 guisp=NONE gui=NONE ctermfg=102 ctermbg=237 cterm=NONE term=NONE - hi PmenuExtra guifg=#a89984 guibg=#3c3836 guisp=NONE gui=NONE ctermfg=102 ctermbg=237 cterm=NONE term=NONE + hi PmenuExtra guifg=#a89984 guibg=#3c3836 guisp=NONE gui=NONE ctermfg=102 ctermbg=237 cterm=NONE term=reverse hi PmenuExtraSel guifg=#a89984 guibg=#504945 guisp=NONE gui=NONE ctermfg=102 ctermbg=239 cterm=NONE term=NONE - hi PmenuKind guifg=#fb5944 guibg=#3c3836 guisp=NONE gui=NONE ctermfg=203 ctermbg=237 cterm=NONE term=NONE - hi PmenuKindSel guifg=#fb5944 guibg=#504945 guisp=NONE gui=NONE ctermfg=203 ctermbg=239 cterm=NONE term=NONE + hi PmenuKind guifg=#fabd2f guibg=#3c3836 guisp=NONE gui=NONE ctermfg=214 ctermbg=237 cterm=NONE term=reverse + hi PmenuKindSel guifg=#fabd2f guibg=#504945 guisp=NONE gui=NONE ctermfg=214 ctermbg=239 cterm=NONE term=NONE hi PmenuMatch guifg=#d3869b guibg=NONE guisp=NONE gui=NONE ctermfg=175 ctermbg=NONE cterm=NONE term=NONE hi PmenuMatchSel guifg=#d3869b guibg=NONE guisp=NONE gui=NONE ctermfg=175 ctermbg=NONE cterm=NONE term=NONE hi PmenuSbar guifg=NONE guibg=#3c3836 guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=reverse @@ -183,8 +188,8 @@ if &background == 'dark' hi PmenuBorder ctermfg=Black ctermbg=White cterm=NONE hi PmenuExtra ctermfg=DarkGray ctermbg=White cterm=NONE hi PmenuExtraSel ctermfg=DarkGray ctermbg=Black cterm=NONE - hi PmenuKind ctermfg=DarkRed ctermbg=White cterm=NONE - hi PmenuKindSel ctermfg=DarkRed ctermbg=Black cterm=NONE + hi PmenuKind ctermfg=Yellow ctermbg=White cterm=NONE + hi PmenuKindSel ctermfg=Yellow ctermbg=Black cterm=NONE hi PmenuMatch ctermfg=Black ctermbg=White cterm=bold hi PmenuMatchSel ctermfg=Black ctermbg=White cterm=bold,reverse hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE @@ -390,10 +395,10 @@ if &background == 'light' hi Operator guifg=#427b58 guibg=NONE guisp=NONE gui=NONE ctermfg=29 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=237 ctermbg=187 cterm=NONE term=reverse hi PmenuBorder guifg=#7c6f64 guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=237 ctermbg=187 cterm=NONE term=NONE - hi PmenuExtra guifg=#7c6f64 guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=243 ctermbg=187 cterm=NONE term=NONE + hi PmenuExtra guifg=#7c6f64 guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=243 ctermbg=187 cterm=NONE term=reverse hi PmenuExtraSel guifg=#3c3836 guibg=#bdae93 guisp=NONE gui=NONE ctermfg=237 ctermbg=144 cterm=NONE term=NONE - hi PmenuKind guifg=#9d0006 guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=124 ctermbg=187 cterm=NONE term=NONE - hi PmenuKindSel guifg=#9d0006 guibg=#bdae93 guisp=NONE gui=NONE ctermfg=124 ctermbg=144 cterm=NONE term=NONE + hi PmenuKind guifg=#b57614 guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=172 ctermbg=187 cterm=NONE term=reverse + hi PmenuKindSel guifg=#b57614 guibg=#bdae93 guisp=NONE gui=NONE ctermfg=172 ctermbg=144 cterm=NONE term=NONE hi PmenuMatch guifg=#8f3f71 guibg=NONE guisp=NONE gui=NONE ctermfg=126 ctermbg=NONE cterm=NONE term=NONE hi PmenuMatchSel guifg=#8f3f71 guibg=NONE guisp=NONE gui=NONE ctermfg=126 ctermbg=NONE cterm=NONE term=NONE hi PmenuSbar guifg=NONE guibg=#e5d4b1 guisp=NONE gui=NONE ctermfg=NONE ctermbg=187 cterm=NONE term=reverse @@ -496,8 +501,8 @@ if &background == 'light' hi PmenuBorder ctermfg=Black ctermbg=Grey cterm=NONE hi PmenuExtra ctermfg=DarkGray ctermbg=Grey cterm=NONE hi PmenuExtraSel ctermfg=DarkGray ctermbg=NONE cterm=NONE - hi PmenuKind ctermfg=DarkRed ctermbg=Grey cterm=NONE - hi PmenuKindSel ctermfg=DarkRed ctermbg=NONE cterm=NONE + hi PmenuKind ctermfg=Yellow ctermbg=Grey cterm=NONE + hi PmenuKindSel ctermfg=Yellow ctermbg=NONE cterm=NONE hi PmenuMatch ctermfg=Black ctermbg=Grey cterm=bold hi PmenuMatchSel ctermfg=Black ctermbg=NONE cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=Grey cterm=NONE diff --git a/runtime/colors/sorbet.vim b/runtime/colors/sorbet.vim index 3e45c1500f..9a10a84963 100644 --- a/runtime/colors/sorbet.vim +++ b/runtime/colors/sorbet.vim @@ -4,9 +4,9 @@ " Maintainer: Maxence Weynans " URL: https://github.com/vim/colorschemes " License: Vim License (see `:help license`)` -" Last Change: 2025 Oct 08 +" Last Change: 2026 Jul 21 -" Generated by Colortemplate v3.0.0-beta10 +" Generated by Colortemplate v3.0.0-rc1 set background=dark @@ -81,9 +81,9 @@ hi ModeMsg guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE hi MoreMsg guifg=#dadada guibg=NONE guisp=NONE gui=NONE ctermfg=253 ctermbg=NONE cterm=NONE term=NONE hi NonText guifg=#707070 guibg=NONE guisp=NONE gui=NONE ctermfg=242 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=#000000 guibg=#a6a8b1 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=reverse -hi PmenuExtra guifg=#000000 guibg=#a6a8b1 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=NONE +hi PmenuExtra guifg=#000000 guibg=#a6a8b1 guisp=NONE gui=NONE ctermfg=16 ctermbg=248 cterm=NONE term=reverse hi PmenuExtraSel guifg=#000000 guibg=#d7d7ff guisp=NONE gui=NONE ctermfg=16 ctermbg=189 cterm=NONE term=NONE -hi PmenuKind guifg=#000000 guibg=#a6a8b1 guisp=NONE gui=bold ctermfg=16 ctermbg=248 cterm=bold term=bold +hi PmenuKind guifg=#000000 guibg=#a6a8b1 guisp=NONE gui=bold ctermfg=16 ctermbg=248 cterm=bold term=reverse hi PmenuKindSel guifg=#000000 guibg=#d7d7ff guisp=NONE gui=bold ctermfg=16 ctermbg=189 cterm=bold term=bold hi PmenuMatch guifg=#d7005f guibg=#a6a8b1 guisp=NONE gui=NONE ctermfg=161 ctermbg=248 cterm=NONE term=NONE hi PmenuMatchSel guifg=#d7005f guibg=#d7d7ff guisp=NONE gui=bold ctermfg=161 ctermbg=189 cterm=bold term=bold diff --git a/runtime/colors/unokai.vim b/runtime/colors/unokai.vim index 7c85cba568..45ccf7a114 100644 --- a/runtime/colors/unokai.vim +++ b/runtime/colors/unokai.vim @@ -2,7 +2,7 @@ " Description: Color scheme similar to Monokai originally created by Wimer Hazenberg for TextMate " Author: k-37 <60838818+k-37@users.noreply.github.com> " URL: https://github.com/vim/colorschemes -" Last Change: 2026 May 07 +" Last Change: 2026 Jul 21 " Generated by Colortemplate v3.0.0-rc1 @@ -72,9 +72,9 @@ hi ModeMsg guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE c hi MoreMsg guifg=#81af24 guibg=NONE guisp=NONE gui=NONE ctermfg=106 ctermbg=NONE cterm=NONE term=NONE hi NonText guifg=#8a8a8a guibg=NONE guisp=NONE gui=NONE ctermfg=245 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=reverse -hi PmenuExtra guifg=#bababa guibg=#585858 guisp=NONE gui=NONE ctermfg=250 ctermbg=240 cterm=NONE term=NONE +hi PmenuExtra guifg=#bababa guibg=#585858 guisp=NONE gui=NONE ctermfg=250 ctermbg=240 cterm=NONE term=reverse hi PmenuExtraSel guifg=#bababa guibg=#8a8a8a guisp=NONE gui=NONE ctermfg=250 ctermbg=245 cterm=NONE term=NONE -hi PmenuKind guifg=#80beb5 guibg=#585858 guisp=NONE gui=NONE ctermfg=73 ctermbg=240 cterm=NONE term=NONE +hi PmenuKind guifg=#80beb5 guibg=#585858 guisp=NONE gui=NONE ctermfg=73 ctermbg=240 cterm=NONE term=reverse hi PmenuKindSel guifg=#80beb5 guibg=#8a8a8a guisp=NONE gui=NONE ctermfg=73 ctermbg=245 cterm=NONE term=NONE hi PmenuMatch guifg=#ffaf5f guibg=#585858 guisp=NONE gui=NONE ctermfg=215 ctermbg=240 cterm=NONE term=NONE hi PmenuMatchSel guifg=#ffaf5f guibg=#8a8a8a guisp=NONE gui=NONE ctermfg=215 ctermbg=245 cterm=NONE term=NONE diff --git a/runtime/colors/wildcharm.vim b/runtime/colors/wildcharm.vim index ce217b49b0..b28dbba5e2 100644 --- a/runtime/colors/wildcharm.vim +++ b/runtime/colors/wildcharm.vim @@ -1,9 +1,9 @@ " Name: Wild Charm -" Description: Vibrant and playful, at least one popular AI thinks it is. +" Description: Vibrant and playful. " Author: Maxim Kim " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Jun 24 +" Last Change: 2026 Aug 07 " Generated by Colortemplate v3.0.0-rc1 @@ -16,12 +16,9 @@ let s:tgc = has('termguicolors') && &termguicolors hi! link CurSearch IncSearch hi! link CursorLineFold FoldColumn hi! link CursorLineSign FoldColumn -hi! link Float Number -hi! link Function Identifier hi! link LineNrAbove LineNr hi! link LineNrBelow LineNr hi! link MessageWindow PMenu -hi! link Number Constant hi! link PopupNotification Normal hi! link PreInsert NonText hi! link StatusLineTerm Statusline @@ -29,7 +26,12 @@ hi! link StatusLineTermNC StatuslineNC hi! link TabPanel Normal hi! link TabPanelFill Normal hi! link Terminal Normal +hi! link markdownCodeDelimiter Special +hi! link markdownHeadingDelimiter Type +hi! link markdownHeadingRule Type +hi! link markdownId String hi! link markdownLinkText String +hi! link markdownListMarker PreProc hi! link markdownUrl Underlined if &background == 'dark' @@ -41,7 +43,7 @@ if &background == 'dark' hi ColorColumn guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=reverse hi Comment guifg=#767676 guibg=NONE guisp=NONE gui=NONE ctermfg=243 ctermbg=NONE cterm=NONE term=bold hi Conceal guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE - hi Constant guifg=#ff5f87 guibg=NONE guisp=NONE gui=NONE ctermfg=204 ctermbg=NONE cterm=NONE term=NONE + hi Constant guifg=#00d75f guibg=NONE guisp=NONE gui=NONE ctermfg=41 ctermbg=NONE cterm=NONE term=NONE hi CursorColumn guifg=NONE guibg=#262626 guisp=NONE gui=NONE ctermfg=NONE ctermbg=235 cterm=NONE term=NONE hi CursorLine guifg=NONE guibg=#262626 guisp=NONE gui=NONE ctermfg=NONE ctermbg=235 cterm=NONE term=underline hi CursorLineNr guifg=#ffffff guibg=NONE guisp=NONE gui=bold ctermfg=231 ctermbg=NONE cterm=bold term=bold @@ -57,7 +59,7 @@ if &background == 'dark' hi Folded guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE hi Identifier guifg=#ff87ff guibg=NONE guisp=NONE gui=NONE ctermfg=213 ctermbg=NONE cterm=NONE term=NONE hi Ignore guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=NONE - hi IncSearch guifg=NONE guibg=#5f431f guisp=NONE gui=NONE ctermfg=214 ctermbg=16 cterm=reverse term=bold,reverse,underline + hi IncSearch guifg=NONE guibg=#7f531f guisp=NONE gui=NONE ctermfg=214 ctermbg=16 cterm=reverse term=bold,reverse,underline hi LineNr guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi MatchParen guifg=#ff00af guibg=NONE guisp=NONE gui=bold ctermfg=199 ctermbg=NONE cterm=bold term=bold,underline hi ModeMsg guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold @@ -65,12 +67,12 @@ if &background == 'dark' hi NonText guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=reverse hi PmenuBorder guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE - hi PmenuExtra guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE + hi PmenuExtra guifg=#767676 guibg=#303030 guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=reverse hi PmenuExtraSel guifg=#767676 guibg=#585858 guisp=NONE gui=NONE ctermfg=243 ctermbg=240 cterm=NONE term=NONE - hi PmenuKind guifg=#ff5f87 guibg=#303030 guisp=NONE gui=NONE ctermfg=204 ctermbg=236 cterm=NONE term=NONE - hi PmenuKindSel guifg=#ff5f87 guibg=#585858 guisp=NONE gui=NONE ctermfg=204 ctermbg=240 cterm=NONE term=NONE - hi PmenuMatch guifg=#d787d7 guibg=NONE guisp=NONE gui=NONE ctermfg=176 ctermbg=NONE cterm=NONE term=NONE - hi PmenuMatchSel guifg=#d787d7 guibg=NONE guisp=NONE gui=NONE ctermfg=176 ctermbg=NONE cterm=NONE term=NONE + hi PmenuKind guifg=#00afaf guibg=#303030 guisp=NONE gui=NONE ctermfg=37 ctermbg=236 cterm=NONE term=reverse + hi PmenuKindSel guifg=#00afaf guibg=#585858 guisp=NONE gui=NONE ctermfg=37 ctermbg=240 cterm=NONE term=NONE + hi PmenuMatch guifg=#ffffff guibg=NONE guisp=NONE gui=bold ctermfg=231 ctermbg=NONE cterm=bold term=bold + hi PmenuMatchSel guifg=#ffffff guibg=NONE guisp=NONE gui=bold ctermfg=231 ctermbg=NONE cterm=bold term=bold hi PmenuSbar guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi PmenuSel guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=bold hi PmenuShadow guifg=#767676 guibg=#121212 guisp=NONE gui=NONE ctermfg=243 ctermbg=233 cterm=NONE term=NONE @@ -93,7 +95,6 @@ if &background == 'dark' hi Statement guifg=#00afff guibg=NONE guisp=NONE gui=NONE ctermfg=39 ctermbg=NONE cterm=NONE term=NONE hi StatusLine guifg=#9e9e9e guibg=#000000 guisp=NONE gui=bold,reverse ctermfg=247 ctermbg=16 cterm=bold,reverse term=bold,reverse hi StatusLineNC guifg=#767676 guibg=#000000 guisp=NONE gui=reverse ctermfg=243 ctermbg=16 cterm=reverse term=bold,underline - hi String guifg=#00d75f guibg=NONE guisp=NONE gui=NONE ctermfg=41 ctermbg=NONE cterm=NONE term=NONE hi TabLine guifg=#000000 guibg=#767676 guisp=NONE gui=NONE ctermfg=16 ctermbg=243 cterm=NONE term=bold,underline hi TabLineFill guifg=#000000 guibg=#767676 guisp=NONE gui=NONE ctermfg=16 ctermbg=243 cterm=NONE term=NONE hi TabLineSel guifg=#000000 guibg=#9e9e9e guisp=NONE gui=bold ctermfg=16 ctermbg=247 cterm=bold term=bold,reverse @@ -101,7 +102,7 @@ if &background == 'dark' hi TitleBar guifg=#ffffff guibg=#3c3c3c guisp=NONE gui=NONE ctermfg=231 ctermbg=237 cterm=NONE term=NONE hi TitleBarNC guifg=#767676 guibg=#2c2c2c guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE hi Todo guifg=#ffffff guibg=NONE guisp=NONE gui=bold ctermfg=231 ctermbg=NONE cterm=bold term=bold,reverse - hi ToolbarButton guifg=#000000 guibg=#d0d0d0 guisp=NONE gui=NONE ctermfg=16 ctermbg=252 cterm=NONE term=bold,reverse + hi ToolbarButton guifg=#000000 guibg=#00afaf guisp=NONE gui=NONE ctermfg=16 ctermbg=37 cterm=NONE term=bold,reverse hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#ffaf00 guibg=NONE guisp=NONE gui=NONE ctermfg=214 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline @@ -113,6 +114,7 @@ if &background == 'dark' hi WildMenu guifg=#000000 guibg=#ffaf00 guisp=NONE gui=NONE ctermfg=16 ctermbg=214 cterm=NONE term=bold hi debugBreakpoint guifg=#00afaf guibg=NONE guisp=NONE gui=reverse ctermfg=37 ctermbg=NONE cterm=reverse term=reverse hi debugPC guifg=#0087d7 guibg=NONE guisp=NONE gui=reverse ctermfg=32 ctermbg=NONE cterm=reverse term=reverse + hi htmlH1 guifg=#ffffff guibg=NONE guisp=NONE gui=bold ctermfg=231 ctermbg=NONE cterm=bold term=bold if has('gui_running') || s:tgc hi Cursor guifg=#000000 guibg=#ffffff guisp=NONE gui=NONE cterm=NONE @@ -136,7 +138,7 @@ if &background == 'dark' hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE - hi Constant ctermfg=red ctermbg=NONE cterm=NONE + hi Constant ctermfg=green ctermbg=NONE cterm=NONE hi CursorColumn ctermfg=black ctermbg=yellow cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline hi CursorLineNr ctermfg=white ctermbg=NONE cterm=bold @@ -162,8 +164,8 @@ if &background == 'dark' hi PmenuBorder ctermfg=NONE ctermbg=grey cterm=NONE hi PmenuExtra ctermfg=darkgrey ctermbg=grey cterm=NONE hi PmenuExtraSel ctermfg=black ctermbg=darkyellow cterm=NONE - hi PmenuKind ctermfg=darkred ctermbg=grey cterm=NONE - hi PmenuKindSel ctermfg=darkred ctermbg=darkyellow cterm=NONE + hi PmenuKind ctermfg=darkcyan ctermbg=grey cterm=NONE + hi PmenuKindSel ctermfg=darkcyan ctermbg=darkyellow cterm=NONE hi PmenuMatch ctermfg=black ctermbg=grey cterm=bold hi PmenuMatchSel ctermfg=black ctermbg=darkyellow cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE @@ -188,7 +190,6 @@ if &background == 'dark' hi Statement ctermfg=blue ctermbg=NONE cterm=NONE hi StatusLine ctermfg=grey ctermbg=black cterm=bold,reverse hi StatusLineNC ctermfg=darkgrey ctermbg=black cterm=reverse - hi String ctermfg=green ctermbg=NONE cterm=NONE hi TabLine ctermfg=black ctermbg=darkgrey cterm=NONE hi TabLineFill ctermfg=black ctermbg=darkgrey cterm=NONE hi TabLineSel ctermfg=black ctermbg=grey cterm=bold @@ -196,7 +197,7 @@ if &background == 'dark' hi TitleBar ctermfg=white ctermbg=black cterm=NONE hi TitleBarNC ctermfg=darkgrey ctermbg=black cterm=NONE hi Todo ctermfg=NONE ctermbg=NONE cterm=bold - hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=darkcyan cterm=NONE hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=yellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline @@ -208,6 +209,7 @@ if &background == 'dark' hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse + hi htmlH1 ctermfg=white ctermbg=NONE cterm=bold finish endif @@ -218,7 +220,7 @@ if &background == 'dark' hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi Comment ctermfg=NONE ctermbg=NONE cterm=bold hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE - hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline hi CursorLineNr ctermfg=black ctermbg=NONE cterm=bold @@ -270,7 +272,6 @@ if &background == 'dark' hi Statement ctermfg=darkblue ctermbg=NONE cterm=NONE hi StatusLine ctermfg=grey ctermbg=black cterm=bold,reverse hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE - hi String ctermfg=darkgreen ctermbg=NONE cterm=NONE hi TabLine ctermfg=black ctermbg=grey cterm=NONE hi TabLineFill ctermfg=grey ctermbg=grey cterm=NONE hi TabLineSel ctermfg=grey ctermbg=black cterm=bold,reverse @@ -278,7 +279,7 @@ if &background == 'dark' hi TitleBar ctermfg=white ctermbg=black cterm=NONE hi TitleBarNC ctermfg=darkgrey ctermbg=black cterm=NONE hi Todo ctermfg=NONE ctermbg=NONE cterm=bold - hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse + hi ToolbarButton ctermfg=darkcyan ctermbg=black cterm=bold,reverse hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=darkyellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline @@ -290,6 +291,7 @@ if &background == 'dark' hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse + hi htmlH1 ctermfg=white ctermbg=NONE cterm=bold finish endif @@ -299,9 +301,6 @@ if &background == 'dark' hi CursorIM term=NONE hi CursorLineFold term=underline hi CursorLineSign term=underline - hi Float term=NONE - hi Function term=NONE - hi Number term=NONE hi StatusLineTerm term=bold,reverse hi StatusLineTermNC term=bold,underline hi Terminal term=NONE @@ -312,7 +311,7 @@ if &background == 'dark' endif if &background == 'light' - let g:terminal_ansi_colors = ['#000000', '#af0000', '#008700', '#af5f00', '#005faf', '#870087', '#008787', '#8a8a8a', '#808080', '#d70000', '#5faf5f', '#d78700', '#0087d7', '#af00af', '#00afaf', '#ffffff'] + let g:terminal_ansi_colors = ['#000000', '#af0000', '#008700', '#af5f00', '#005faf', '#870087', '#008f9f', '#8a8a8a', '#808080', '#d70000', '#5faf5f', '#d78700', '#0087d7', '#af00af', '#00afaf', '#ffffff'] hi Normal guifg=#000000 guibg=#ffffff guisp=NONE gui=NONE ctermfg=16 ctermbg=231 cterm=NONE term=NONE hi Added guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE cterm=NONE term=NONE @@ -320,7 +319,7 @@ if &background == 'light' hi ColorColumn guifg=NONE guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=254 cterm=NONE term=reverse hi Comment guifg=#8a8a8a guibg=NONE guisp=NONE gui=NONE ctermfg=245 ctermbg=NONE cterm=NONE term=bold hi Conceal guifg=#a8a8a8 guibg=NONE guisp=NONE gui=NONE ctermfg=248 ctermbg=NONE cterm=NONE term=NONE - hi Constant guifg=#af0000 guibg=NONE guisp=NONE gui=NONE ctermfg=124 ctermbg=NONE cterm=NONE term=NONE + hi Constant guifg=#008700 guibg=NONE guisp=NONE gui=NONE ctermfg=28 ctermbg=NONE cterm=NONE term=NONE hi CursorColumn guifg=NONE guibg=#eeeeee guisp=NONE gui=NONE ctermfg=NONE ctermbg=255 cterm=NONE term=NONE hi CursorLine guifg=NONE guibg=#eeeeee guisp=NONE gui=NONE ctermfg=NONE ctermbg=255 cterm=NONE term=underline hi CursorLineNr guifg=#000000 guibg=NONE guisp=NONE gui=bold ctermfg=16 ctermbg=NONE cterm=bold term=bold @@ -344,12 +343,12 @@ if &background == 'light' hi NonText guifg=#a8a8a8 guibg=NONE guisp=NONE gui=NONE ctermfg=248 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=254 cterm=NONE term=reverse hi PmenuBorder guifg=#808080 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=240 ctermbg=254 cterm=NONE term=NONE - hi PmenuExtra guifg=#808080 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=240 ctermbg=254 cterm=NONE term=NONE + hi PmenuExtra guifg=#808080 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=240 ctermbg=254 cterm=NONE term=reverse hi PmenuExtraSel guifg=#808080 guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=240 ctermbg=251 cterm=NONE term=NONE - hi PmenuKind guifg=#d70000 guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=160 ctermbg=254 cterm=NONE term=NONE - hi PmenuKindSel guifg=#d70000 guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=160 ctermbg=251 cterm=NONE term=NONE - hi PmenuMatch guifg=#870087 guibg=NONE guisp=NONE gui=NONE ctermfg=90 ctermbg=NONE cterm=NONE term=NONE - hi PmenuMatchSel guifg=#870087 guibg=NONE guisp=NONE gui=NONE ctermfg=90 ctermbg=NONE cterm=NONE term=NONE + hi PmenuKind guifg=#008f9f guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=30 ctermbg=254 cterm=NONE term=reverse + hi PmenuKindSel guifg=#008f9f guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=30 ctermbg=251 cterm=NONE term=NONE + hi PmenuMatch guifg=#000000 guibg=NONE guisp=NONE gui=bold ctermfg=16 ctermbg=NONE cterm=bold term=bold + hi PmenuMatchSel guifg=#000000 guibg=NONE guisp=NONE gui=bold ctermfg=16 ctermbg=NONE cterm=bold term=bold hi PmenuSbar guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi PmenuSel guifg=NONE guibg=#c6c6c6 guisp=NONE gui=NONE ctermfg=NONE ctermbg=251 cterm=NONE term=bold hi PmenuShadow guifg=#808080 guibg=#303030 guisp=NONE gui=NONE ctermfg=240 ctermbg=236 cterm=NONE term=NONE @@ -357,40 +356,39 @@ if &background == 'light' hi Popup guifg=NONE guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=NONE ctermbg=254 cterm=NONE term=NONE hi PopupBorder guifg=#8a8a8a guibg=#e4e4e4 guisp=NONE gui=NONE ctermfg=245 ctermbg=254 cterm=NONE term=NONE hi PopupTitle guifg=#808080 guibg=#e4e4e4 guisp=NONE gui=bold ctermfg=240 ctermbg=254 cterm=bold term=bold - hi PreProc guifg=#008787 guibg=NONE guisp=NONE gui=NONE ctermfg=30 ctermbg=NONE cterm=NONE term=NONE + hi PreProc guifg=#008f9f guibg=NONE guisp=NONE gui=NONE ctermfg=30 ctermbg=NONE cterm=NONE term=NONE hi Question guifg=#870087 guibg=NONE guisp=NONE gui=NONE ctermfg=90 ctermbg=NONE cterm=NONE term=standout hi QuickFixLine guifg=NONE guibg=#e7cfe7 guisp=NONE gui=NONE ctermfg=16 ctermbg=182 cterm=NONE term=NONE hi Removed guifg=#d70000 guibg=NONE guisp=NONE gui=NONE ctermfg=160 ctermbg=NONE cterm=NONE term=NONE hi Search guifg=NONE guibg=#e7f3e7 guisp=NONE gui=NONE ctermfg=28 ctermbg=231 cterm=reverse term=reverse hi SignColumn guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse - hi Special guifg=#5f00d7 guibg=NONE guisp=NONE gui=NONE ctermfg=56 ctermbg=NONE cterm=NONE term=NONE + hi Special guifg=#8700ef guibg=NONE guisp=NONE gui=NONE ctermfg=93 ctermbg=NONE cterm=NONE term=NONE hi SpecialKey guifg=#a8a8a8 guibg=NONE guisp=NONE gui=NONE ctermfg=248 ctermbg=NONE cterm=NONE term=bold hi SpellBad guifg=NONE guibg=NONE guisp=#af0000 gui=undercurl ctermfg=160 ctermbg=NONE cterm=underline term=underline - hi SpellCap guifg=NONE guibg=NONE guisp=#008787 gui=undercurl ctermfg=30 ctermbg=NONE cterm=underline term=underline + hi SpellCap guifg=NONE guibg=NONE guisp=#008f9f gui=undercurl ctermfg=30 ctermbg=NONE cterm=underline term=underline hi SpellLocal guifg=NONE guibg=NONE guisp=#008700 gui=undercurl ctermfg=28 ctermbg=NONE cterm=underline term=underline hi SpellRare guifg=NONE guibg=NONE guisp=#af00af gui=undercurl ctermfg=127 ctermbg=NONE cterm=underline term=underline hi Statement guifg=#005faf guibg=NONE guisp=NONE gui=NONE ctermfg=25 ctermbg=NONE cterm=NONE term=NONE hi StatusLine guifg=#ffffff guibg=#5f5f5f guisp=NONE gui=bold ctermfg=231 ctermbg=59 cterm=bold term=bold,reverse - hi StatusLineNC guifg=#000000 guibg=#d0d0d0 guisp=NONE gui=NONE ctermfg=16 ctermbg=252 cterm=NONE term=bold,underline - hi String guifg=#008700 guibg=NONE guisp=NONE gui=NONE ctermfg=28 ctermbg=NONE cterm=NONE term=NONE - hi TabLine guifg=#000000 guibg=#d0d0d0 guisp=NONE gui=NONE ctermfg=16 ctermbg=252 cterm=NONE term=bold,underline - hi TabLineFill guifg=#d0d0d0 guibg=#d0d0d0 guisp=NONE gui=NONE ctermfg=252 ctermbg=252 cterm=NONE term=NONE + hi StatusLineNC guifg=#ffffff guibg=#878787 guisp=NONE gui=NONE ctermfg=231 ctermbg=102 cterm=NONE term=bold,underline + hi TabLine guifg=#ffffff guibg=#878787 guisp=NONE gui=NONE ctermfg=231 ctermbg=102 cterm=NONE term=bold,underline + hi TabLineFill guifg=#878787 guibg=#878787 guisp=NONE gui=NONE ctermfg=102 ctermbg=102 cterm=NONE term=NONE hi TabLineSel guifg=#5f5f5f guibg=#ffffff guisp=NONE gui=bold,reverse ctermfg=59 ctermbg=231 cterm=bold,reverse term=bold,reverse hi Title guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=NONE hi TitleBar guifg=#000000 guibg=#ececec guisp=NONE gui=NONE ctermfg=16 ctermbg=255 cterm=NONE term=NONE hi TitleBarNC guifg=#808080 guibg=#f5f5f5 guisp=NONE gui=NONE ctermfg=240 ctermbg=255 cterm=NONE term=NONE hi Todo guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold,reverse - hi ToolbarButton guifg=#ffffff guibg=#5f5f5f guisp=NONE gui=NONE ctermfg=231 ctermbg=59 cterm=NONE term=bold,reverse + hi ToolbarButton guifg=#ffffff guibg=#008f9f guisp=NONE gui=NONE ctermfg=231 ctermbg=30 cterm=NONE term=bold,reverse hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#af5f00 guibg=NONE guisp=NONE gui=NONE ctermfg=130 ctermbg=NONE cterm=NONE term=NONE hi Underlined guifg=NONE guibg=NONE guisp=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline term=underline hi VertSplit guifg=#5f5f5f guibg=#5f5f5f guisp=NONE gui=NONE ctermfg=59 ctermbg=59 cterm=NONE term=NONE - hi VertSplitNC guifg=#d0d0d0 guibg=#d0d0d0 guisp=NONE gui=NONE ctermfg=252 ctermbg=252 cterm=NONE term=NONE + hi VertSplitNC guifg=#878787 guibg=#878787 guisp=NONE gui=NONE ctermfg=102 ctermbg=102 cterm=NONE term=NONE hi Visual guifg=NONE guibg=#bfdfff guisp=NONE gui=NONE ctermfg=32 ctermbg=231 cterm=reverse term=reverse hi VisualNOS guifg=#ffffff guibg=#005faf guisp=NONE gui=NONE ctermfg=231 ctermbg=25 cterm=NONE term=NONE hi WarningMsg guifg=#af5f00 guibg=NONE guisp=NONE gui=NONE ctermfg=130 ctermbg=NONE cterm=NONE term=standout hi WildMenu guifg=#ffffff guibg=#d78700 guisp=NONE gui=NONE ctermfg=231 ctermbg=172 cterm=NONE term=bold - hi debugBreakpoint guifg=#008787 guibg=NONE guisp=NONE gui=reverse ctermfg=30 ctermbg=NONE cterm=reverse term=reverse + hi debugBreakpoint guifg=#008f9f guibg=NONE guisp=NONE gui=reverse ctermfg=30 ctermbg=NONE cterm=reverse term=reverse hi debugPC guifg=#005faf guibg=NONE guisp=NONE gui=reverse ctermfg=25 ctermbg=NONE cterm=reverse term=reverse if has('gui_running') || s:tgc @@ -415,7 +413,7 @@ if &background == 'light' hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE hi Conceal ctermfg=darkgrey ctermbg=NONE cterm=NONE - hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE hi CursorColumn ctermfg=black ctermbg=yellow cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline hi CursorLineNr ctermfg=black ctermbg=NONE cterm=bold @@ -441,8 +439,8 @@ if &background == 'light' hi PmenuBorder ctermfg=black ctermbg=grey cterm=NONE hi PmenuExtra ctermfg=darkgrey ctermbg=grey cterm=NONE hi PmenuExtraSel ctermfg=black ctermbg=darkyellow cterm=NONE - hi PmenuKind ctermfg=darkred ctermbg=grey cterm=NONE - hi PmenuKindSel ctermfg=darkred ctermbg=darkyellow cterm=NONE + hi PmenuKind ctermfg=darkcyan ctermbg=grey cterm=NONE + hi PmenuKindSel ctermfg=darkcyan ctermbg=darkyellow cterm=NONE hi PmenuMatch ctermfg=black ctermbg=grey cterm=bold hi PmenuMatchSel ctermfg=black ctermbg=darkyellow cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE @@ -466,16 +464,15 @@ if &background == 'light' hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline hi Statement ctermfg=darkblue ctermbg=NONE cterm=NONE hi StatusLine ctermfg=white ctermbg=darkgrey cterm=bold - hi StatusLineNC ctermfg=black ctermbg=lightgrey cterm=NONE - hi String ctermfg=darkgreen ctermbg=NONE cterm=NONE - hi TabLine ctermfg=black ctermbg=lightgrey cterm=NONE + hi StatusLineNC ctermfg=white ctermbg=lightgrey cterm=NONE + hi TabLine ctermfg=white ctermbg=lightgrey cterm=NONE hi TabLineFill ctermfg=lightgrey ctermbg=lightgrey cterm=NONE hi TabLineSel ctermfg=darkgrey ctermbg=white cterm=bold,reverse hi Title ctermfg=NONE ctermbg=NONE cterm=bold hi TitleBar ctermfg=black ctermbg=white cterm=NONE hi TitleBarNC ctermfg=darkgrey ctermbg=white cterm=NONE hi Todo ctermfg=NONE ctermbg=NONE cterm=bold - hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=NONE + hi ToolbarButton ctermfg=white ctermbg=darkcyan cterm=NONE hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=darkyellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline @@ -497,7 +494,7 @@ if &background == 'light' hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi Comment ctermfg=NONE ctermbg=NONE cterm=bold hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE - hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline hi CursorLineNr ctermfg=black ctermbg=NONE cterm=bold @@ -549,7 +546,6 @@ if &background == 'light' hi Statement ctermfg=darkblue ctermbg=NONE cterm=NONE hi StatusLine ctermfg=grey ctermbg=black cterm=bold hi StatusLineNC ctermfg=grey ctermbg=black cterm=NONE - hi String ctermfg=darkgreen ctermbg=NONE cterm=NONE hi TabLine ctermfg=grey ctermbg=black cterm=NONE hi TabLineFill ctermfg=black ctermbg=black cterm=NONE hi TabLineSel ctermfg=black ctermbg=grey cterm=bold,reverse @@ -557,7 +553,7 @@ if &background == 'light' hi TitleBar ctermfg=black ctermbg=white cterm=NONE hi TitleBarNC ctermfg=darkgrey ctermbg=white cterm=NONE hi Todo ctermfg=NONE ctermbg=NONE cterm=bold - hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold + hi ToolbarButton ctermfg=darkcyan ctermbg=black cterm=bold hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE hi Type ctermfg=darkyellow ctermbg=NONE cterm=NONE hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline @@ -578,9 +574,6 @@ if &background == 'light' hi CursorIM term=NONE hi CursorLineFold term=underline hi CursorLineSign term=underline - hi Float term=NONE - hi Function term=NONE - hi Number term=NONE hi StatusLineTerm term=bold,reverse hi StatusLineTermNC term=bold,underline hi Terminal term=NONE diff --git a/runtime/colors/zaibatsu.vim b/runtime/colors/zaibatsu.vim index 96d5a77fd5..cc9d792850 100644 --- a/runtime/colors/zaibatsu.vim +++ b/runtime/colors/zaibatsu.vim @@ -3,9 +3,9 @@ " Author: Romain Lafourcade " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2025 Oct 08 +" Last Change: 2026 Jul 21 -" Generated by Colortemplate v3.0.0-beta10 +" Generated by Colortemplate v3.0.0-rc1 set background=dark @@ -86,8 +86,8 @@ hi ModeMsg guifg=#0e0024 guibg=#87ff00 guisp=NONE gui=NONE ctermfg=16 ctermbg=11 hi MoreMsg guifg=#87ffff guibg=NONE guisp=NONE gui=NONE ctermfg=123 ctermbg=NONE cterm=NONE term=NONE hi NonText guifg=#878092 guibg=#0e0024 guisp=NONE gui=NONE ctermfg=103 ctermbg=16 cterm=NONE term=NONE hi Pmenu guifg=#0e0024 guibg=#ffffff guisp=NONE gui=NONE ctermfg=16 ctermbg=231 cterm=NONE term=reverse -hi PmenuExtra guifg=#878092 guibg=#ffffff guisp=NONE gui=NONE ctermfg=103 ctermbg=231 cterm=NONE term=NONE -hi PmenuKind guifg=#878092 guibg=#ffffff guisp=NONE gui=NONE ctermfg=103 ctermbg=231 cterm=NONE term=NONE +hi PmenuExtra guifg=#878092 guibg=#ffffff guisp=NONE gui=NONE ctermfg=103 ctermbg=231 cterm=NONE term=reverse +hi PmenuKind guifg=#878092 guibg=#ffffff guisp=NONE gui=NONE ctermfg=103 ctermbg=231 cterm=NONE term=reverse hi PmenuMatch guifg=#d700ff guibg=#ffffff guisp=NONE gui=NONE ctermfg=165 ctermbg=231 cterm=NONE term=NONE hi PmenuMatchSel guifg=#d700ff guibg=#afafff guisp=NONE gui=NONE ctermfg=165 ctermbg=147 cterm=NONE term=NONE hi PmenuSbar guifg=#d7d5db guibg=#d7d5db guisp=NONE gui=NONE ctermfg=189 ctermbg=189 cterm=NONE term=reverse From 5156deba71b471375d2c9158fd7eefe4301e3cec Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 10 Aug 2026 19:36:32 +0000 Subject: [PATCH 324/647] patch 9.2.0930: floating point exception when displaying pum Problem: floating point exception when displaying pum (dvaave2025) Solution: Verify that curwin->w_width > 0 fixes: #20985 closes: #20994 Supported by AI. Signed-off-by: Christian Brabandt --- src/popupmenu.c | 5 ++++- src/testdir/test_popup.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/popupmenu.c b/src/popupmenu.c index 36000d9bf0..47f9b297f7 100644 --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -363,7 +363,10 @@ pum_display( { int wcol = pum_wcol >= 0 ? pum_wcol : curwin->w_wcol; // w_wcol includes virtual text "above". - wcol %= curwin->w_width; + if (curwin->w_width > 0) + wcol %= curwin->w_width; + else + wcol = 0; #ifdef FEAT_CONCEAL // w_wcol does not account for text concealed before the cursor; // shift by the offset win_line() recorded for the cursor line so the diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index a4bba3f310..f5f2f1a7b7 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -2734,4 +2734,24 @@ func Test_popup_sandbox() call assert_fails('sandbox call popup_setoptions(1, {})', 'E48:') endfunc +func Test_pum_display_with_zero_width_window() + " Force curwin to width 0 (like Test_window_minimal_size does for + " win_ensure_size itself), then start completion via a non-typed, + " stuffed key sequence so KeyTyped stays FALSE and the repair is + " skipped. pum_display() must not divide by curwin->w_width in that + " state (would SIGFPE). + set winminwidth=0 + vert new + call win_execute(win_getid(2), 'wincmd |') + call assert_equal(0, winwidth(0)) + + call setline(1, ['foo', 'foobar', 'foo']) + call feedkeys("A\\", 'x') + call assert_equal(0, winwidth(0)) + + bwipe! + bwipe! + set winminwidth& +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index e0bd6e1e05..ccd788a595 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 930, /**/ 929, /**/ From 1b7bd58115a5e7b788d01c51b90025ce58246c67 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 10 Aug 2026 20:08:09 +0000 Subject: [PATCH 325/647] patch 9.2.0931: the GTK4 GUI is still experimental and untested by CI Problem: the GTK4 GUI is still experimental and untested by CI Solution: Stabilize the GTK4 code, Fix a few minor issues, include a GTK4 CI job (Foxe Chen). closes: #20920 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- .github/actions/build_vim_on_linux/action.yml | 11 ++- .github/workflows/ci-linux.yml | 9 +- .github/workflows/ci-linux_asan.yml | 2 + Filelist | 1 + ci/setup-weston.sh | 17 ++++ runtime/doc/gui_x11.txt | 10 +- runtime/doc/options.txt | 7 +- runtime/doc/tags | 1 + runtime/doc/version9.txt | 7 +- src/Makefile | 4 +- src/auto/configure | 3 + src/config.mk.in | 1 + src/configure.ac | 2 + src/evalfunc.c | 2 +- src/gui.h | 19 ++-- src/gui_beval.c | 3 +- src/gui_gtk4.c | 91 +++++++++++++------ src/gui_gtk4_cb.c | 6 +- src/gui_gtk4_da.c | 6 +- src/gui_gtk4_f.c | 5 +- src/gui_gtk4_menu.c | 2 +- src/gui_gtk4_tb.c | 8 +- src/gui_xim.c | 6 +- src/option.h | 2 +- src/optiondefs.h | 2 +- src/testdir/test_gui.vim | 4 + src/testdir/test_gui_init.vim | 2 + src/testdir/test_startup.vim | 6 +- src/testdir/util/check.vim | 5 +- src/testdir/util/gen_opt_test.vim | 6 +- src/version.c | 2 + 31 files changed, 183 insertions(+), 69 deletions(-) create mode 100644 ci/setup-weston.sh diff --git a/.github/actions/build_vim_on_linux/action.yml b/.github/actions/build_vim_on_linux/action.yml index c6486cd34f..6006f5ec86 100644 --- a/.github/actions/build_vim_on_linux/action.yml +++ b/.github/actions/build_vim_on_linux/action.yml @@ -88,7 +88,6 @@ runs: sudo cp ci/pinned-pkgs /etc/apt/preferences.d/pinned-pkgs echo '::endgroup::' - # TODO: switch to GTK4 GUI - name: Install packages shell: bash run: | @@ -103,6 +102,8 @@ runs: wayland-utils \ libgtk-3-dev:${{ inputs.architecture }} \ libgtk-3-bin:${{ inputs.architecture }} \ + libgtk-4-dev:${{ inputs.architecture }} \ + libgtk-4-bin:${{ inputs.architecture }} \ desktop-file-utils \ libc6-dbgsym:${{ inputs.architecture }} \ libtool-bin \ @@ -125,6 +126,8 @@ runs: libxcb1-dbgsym:${{ inputs.architecture }} \ libgtk-3-bin-dbgsym:${{ inputs.architecture }} \ libgtk-3-0t64-dbgsym:${{ inputs.architecture }} \ + libgtk-4-bin-dbgsym:${{ inputs.architecture }} \ + libgtk-4-0t64-dbgsym:${{ inputs.architecture }} \ libglib2.0-0t64-dbgsym:${{ inputs.architecture }} \ libglib2.0-bin-dbgsym:${{ inputs.architecture }} \ libglib2.0-dev-bin-dbgsym:${{ inputs.architecture }} \ @@ -233,6 +236,9 @@ runs: if ${{ contains(fromJSON(inputs.extra), 'testgui') }}; then echo "TEST=-C src testgui" fi + if ${{ contains(fromJSON(inputs.extra), 'use_gtk4') }}; then + CONFOPT="${CONFOPT} --enable-gui=gtk4" + fi if ${{ contains(fromJSON(inputs.extra), 'unittests') }}; then echo "TEST=unittests" fi @@ -266,6 +272,9 @@ runs: sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 sudo usermod -a -G audio "${USER}" sudo bash ci/setup-xvfb.sh + if ${{ contains(fromJSON(inputs.extra), 'use_gtk4') }}; then + sudo bash ci/setup-weston.sh + fi echo '::endgroup::' - name: Check autoconf diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 015d9d698a..e91a267ac5 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -27,6 +27,8 @@ jobs: LOG_DIR: ${{ github.workspace }}/logs TERM: xterm DISPLAY: ":99" + WAYLAND_DISPLAY: "/tmp/weston_sock" + GTK_A11Y: "none" DEBIAN_FRONTEND: noninteractive strategy: @@ -65,6 +67,11 @@ jobs: coverage: true interface: dynamic extra: [uchar, testgui] + - features: huge + compiler: gcc + coverage: true + interface: dynamic + extra: [uchar, testgui, use_gtk4] - features: huge compiler: gcc coverage: true @@ -100,7 +107,7 @@ jobs: coverage: ${{ matrix.coverage }} - name: Test - timeout-minutes: 20 + timeout-minutes: 30 run: make ${SHADOWOPT} ${TEST} # Enable to debug failing tests live and ssh into the CI runners diff --git a/.github/workflows/ci-linux_asan.yml b/.github/workflows/ci-linux_asan.yml index 45f69b1e78..cbba1c05a7 100644 --- a/.github/workflows/ci-linux_asan.yml +++ b/.github/workflows/ci-linux_asan.yml @@ -25,6 +25,8 @@ jobs: LOG_DIR: ${{ github.workspace }}/logs TERM: xterm DISPLAY: ":99" + WAYLAND_DISPLAY: "/tmp/weston_sock" + GTK_A11Y: "none" DEBIAN_FRONTEND: noninteractive strategy: diff --git a/Filelist b/Filelist index ca9e8a7b99..30971bacde 100644 --- a/Filelist +++ b/Filelist @@ -31,6 +31,7 @@ SRC_ALL = \ ci/if_feat_check.vim \ ci/lychee.toml \ ci/setup-xvfb.sh \ + ci/setup-weston.sh \ ci/remove_snap.sh \ ci/ddebs.list \ ci/pinned-pkgs \ diff --git a/ci/setup-weston.sh b/ci/setup-weston.sh new file mode 100644 index 0000000000..f9f7d4a53f --- /dev/null +++ b/ci/setup-weston.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +apt-get install -y weston + +cat </etc/systemd/system/weston.service +[Unit] +Description=Weston Compositor Service +After=network.target +[Service] +ExecStart=/usr/bin/weston --backend=headless --fake-seat --width=5000 --height=5000 --socket=/tmp/weston_sock +[Install] +WantedBy=multi-user.target +EOT + +systemctl enable weston.service +systemctl start weston.service diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index 3bb469cecd..f199801ee2 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -1,4 +1,4 @@ -*gui_x11.txt* For Vim version 9.2. Last change: 2026 Jul 27 +*gui_x11.txt* For Vim version 9.2. Last change: 2026 Aug 10 VIM REFERENCE MANUAL by Bram Moolenaar @@ -304,7 +304,7 @@ If a name is used that exists on other systems, but not in X11, the default "arrow" pointer is used. ============================================================================== -5. GTK version *gui-gtk* *GTK+* *GTK* *GTK3* +5. GTK version *gui-gtk* *GTK+* *GTK* *GTK3* *GTK4* The GTK version of the GUI works a little bit different. @@ -680,7 +680,11 @@ X11R5 with a library for X11R6 probably doesn't work (although the linking won't give an error message, Vim will crash later). *gui-wayland* -Support for the Wayland display server protocol has landed in patch 9.1.0064. +Support for the Wayland display server protocol has landed in patch 9.1.0064, +for the GTK3 GUI. It is recommended to use the GTK4 GUI if you want a better +Wayland experience however, as the GTK3 GUI is heavily built around X11 +specific features and API calls. + Note: The Wayland protocol is subject to some restrictions, so the following functions won't work: |getwinpos()|, |getwinposx()|, |getwinposy()| and the diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 521446ada5..869cc9f984 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 04 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 10 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4494,7 +4494,7 @@ A jump table for the options with a short description can be found at |Q_op|. *'guiheadroom'* *'ghr'* 'guiheadroom' 'ghr' number (default 50) global - {only for GTK and X11 GUI} + {only for GTK and X11 GUI, except GTK4 GUI} The number of pixels subtracted from the screen height when fitting the GUI window on the screen. Set this before the GUI is started, e.g., in your |gvimrc| file. When zero, the whole screen height will @@ -5030,6 +5030,9 @@ A jump table for the options with a short description can be found at |Q_op|. < "S-space" means shift+space. This is the activation key for kinput2 + canna (Japanese), and ami (Korean). + Note that when using the GTK4 GUI, this option is not supported. The + only valid value for this option will be an empty string. + *'imcmdline'* *'imc'* *'noimcmdline'* *'noimc'* 'imcmdline' 'imc' boolean (default off) global diff --git a/runtime/doc/tags b/runtime/doc/tags index afb7a36267..92279726b6 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -5740,6 +5740,7 @@ GNOME gui_x11.txt /*GNOME* GTK gui_x11.txt /*GTK* GTK+ gui_x11.txt /*GTK+* GTK3 gui_x11.txt /*GTK3* +GTK4 gui_x11.txt /*GTK4* GUI gui.txt /*GUI* GUI-X11 gui_x11.txt /*GUI-X11* GUIEnter autocmd.txt /*GUIEnter* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 330b552db9..ef371b569f 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -52587,10 +52587,11 @@ work in progress. GUI ~ ----- -- Added support for the GTK 4 GUI (via patch 9.2.0501). Enable with - `--enable-gui=gtk4` configure switch at build time. +- Added support for the GTK 4 GUI (via patch 9.2.0501), stablized as of + patch 9.2.0931. Enable with `--enable-gui=gtk4` configure switch at build + time. - Add support for fullscreen mode in the GTK UI |'go-s'|. -- Enable native printing diaglog for the GTK4 UI using pango library, see +- Enable native printing dialog for the GTK4 UI using pango library, see |pango-printing|. Popups ~ diff --git a/src/Makefile b/src/Makefile index 04917c0641..98baecf6f4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1924,7 +1924,6 @@ PROTO_FILES = \ proto/gc.pro \ proto/getchar.pro \ proto/gui_beval.pro \ - proto/gui_gtk_gresources.pro \ proto/gui_xim.pro \ proto/hardcopy.pro \ proto/hardcopy_pango.pro \ @@ -2025,6 +2024,7 @@ PROTO_FILES = \ proto/wayland.pro \ proto/winclip.pro \ proto/window.pro \ + $(GRESOURCE_PRO) \ $(ALL_GUI_PRO) # Default target is making the executable and tools @@ -4546,7 +4546,7 @@ objects/gui_gtk4.o: auto/osdef.h gui_gtk4.c vim.h protodef.h auto/config.h featu ascii.h keymap.h termdefs.h macros.h option.h beval.h \ structs.h regexp.h gui.h libvterm/include/vterm.h \ libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \ - globals.h errors.h gui_gtk4_f.h auto/gui_gtk_gresources.h \ + globals.h errors.h gui_gtk4_f.h \ gui_gtk4_cb.h gui_gtk4_da.h gui_gtk4_tb.h gui_gtk4_menu.h objects/gui_gtk4_f.o: auto/osdef.h gui_gtk4_f.c vim.h protodef.h auto/config.h feature.h \ os_unix.h ascii.h keymap.h termdefs.h macros.h option.h \ diff --git a/src/auto/configure b/src/auto/configure index 312ab6f6c6..4e92948f4f 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -664,6 +664,7 @@ PANGO_CPPFLAGS PANGO_CFLAGS PANGO_LIBS GRESOURCE_OBJ +GRESOURCE_PRO GRESOURCE_SRC UPDATE_DESKTOP_DATABASE GTK_UPDATE_ICON_CACHE @@ -11388,6 +11389,7 @@ printf "%s\n" "usable." >&6; } printf "%s\n" "#define USE_GRESOURCE 1" >>confdefs.h GRESOURCE_SRC="auto/gui_gtk_gresources.c" + GRESOURCE_PRO="proto/gui_gtk_gresources.pro" GRESOURCE_OBJ="objects/gui_gtk_gresources.o" fi else @@ -11545,6 +11547,7 @@ fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking --enable-hardcopy-pango argument" >&5 printf %s "checking --enable-hardcopy-pango argument... " >&6; } # Check whether --enable-hardcopy-pango was given. diff --git a/src/config.mk.in b/src/config.mk.in index 06a77aed69..76e5a2ff72 100644 --- a/src/config.mk.in +++ b/src/config.mk.in @@ -176,6 +176,7 @@ GTK_LIBNAME = @GTK_LIBNAME@ GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ GRESOURCE_SRC = @GRESOURCE_SRC@ +GRESOURCE_PRO = @GRESOURCE_PRO@ GRESOURCE_OBJ = @GRESOURCE_OBJ@ GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@ diff --git a/src/configure.ac b/src/configure.ac index 75035d754d..a3d06d0e8e 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -3112,6 +3112,7 @@ if test "x$GUITYPE" = "xGTK"; then AC_MSG_RESULT([usable.]) AC_DEFINE(USE_GRESOURCE) GRESOURCE_SRC="auto/gui_gtk_gresources.c" + GRESOURCE_PRO="proto/gui_gtk_gresources.pro" GRESOURCE_OBJ="objects/gui_gtk_gresources.o" fi else @@ -3153,6 +3154,7 @@ if test "x$GUITYPE" = "xGTK"; then fi AC_SUBST(GLIB_COMPILE_RESOURCES) AC_SUBST(GRESOURCE_SRC) +AC_SUBST(GRESOURCE_PRO) AC_SUBST(GRESOURCE_OBJ) AC_SUBST(GTK_UPDATE_ICON_CACHE) AC_SUBST(UPDATE_DESKTOP_DATABASE) diff --git a/src/evalfunc.c b/src/evalfunc.c index 74ca2716ec..23dc21e95c 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -7186,7 +7186,7 @@ f_has(typval_T *argvars, typval_T *rettv) #endif }, {"gui_gtk2", -#if defined(FEAT_GUI_GTK) && !defined(USE_GTK3) +#if defined(FEAT_GUI_GTK) && !defined(USE_GTK3) && !defined(USE_GTK4) 1 #else 0 diff --git a/src/gui.h b/src/gui.h index 653937cfe6..5be8d0fd9b 100644 --- a/src/gui.h +++ b/src/gui.h @@ -15,15 +15,7 @@ # ifdef VMS # include "gui_gtk_vms.h" # endif -# ifdef USE_GTK4 -// Types used in proto files but not available without X11 headers -typedef void *Widget; -typedef void *XtAppContext; -typedef void Display; -typedef unsigned long Window; -typedef unsigned long Atom; -typedef GdkEvent GdkEventKey; // GTK4: GdkEventKey merged into GdkEvent -# else +# ifndef USE_GTK4 # include # endif # pragma GCC diagnostic push @@ -33,6 +25,15 @@ typedef GdkEvent GdkEventKey; // GTK4: GdkEventKey merged into GdkEvent # endif # include # pragma GCC diagnostic pop +# ifdef USE_GTK4 +// Types used in proto files but not available without X11 headers +typedef void *Widget; +typedef void *XtAppContext; +typedef void Display; +typedef unsigned long Window; +typedef unsigned long Atom; +typedef GdkEvent GdkEventKey; // GTK4: GdkEventKey merged into GdkEvent +# endif #endif #ifdef FEAT_GUI_HAIKU diff --git a/src/gui_beval.c b/src/gui_beval.c index c7357fb30c..4e86bca8de 100644 --- a/src/gui_beval.c +++ b/src/gui_beval.c @@ -169,6 +169,7 @@ gui_mch_destroy_beval_area(BalloonEval *beval) if (beval->vts) vim_free(beval->vts); # endif + vim_free(beval->msg); vim_free(beval); } # endif @@ -303,7 +304,7 @@ removeEventHandler(BalloonEval *beval) # ifdef USE_GTK4 static gboolean -event_cb(GtkEventController *controller, GdkEvent *event, BalloonEval *beval) +event_cb(GtkEventController *controller UNUSED, GdkEvent *event, BalloonEval *beval) { int type = gdk_event_get_event_type(event); diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 40fa89d896..c2f2564e6f 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -258,7 +258,9 @@ static int query_pointer_pos(int *x, int *y, GdkModifierType *state); static void mainwin_fullscreened_cb(GObject *obj, GParamSpec *pspec, gpointer user_data); static void drawarea_realize_cb(GtkWidget *widget, gpointer data); static void drawarea_unrealize_cb(GtkWidget *widget, gpointer data); +#if defined(FEAT_IMAGE) static void scale_factor_cb(GdkSurface *surface, GParamSpec *pspec, void *udata); +#endif static void clipboard_changed_cb(GdkClipboard *clipboard, gpointer user_data); #ifdef FEAT_MENU static void show_menubar_popover(void); @@ -732,6 +734,7 @@ gui_mch_open(void) guicolor_T bg_pixel = INVALCOLOR; guint pixel_width; guint pixel_height; + long columns = Columns, rows = Rows; if (gui.geom != NULL) { @@ -741,12 +744,12 @@ gui_mch_open(void) mask = vim_parse_geometry((char *)gui.geom, &w, &h); if (mask & WidthValue) - Columns = w; + columns = Columns = w; if (mask & HeightValue) { if (p_window > (long)h - 1 || !option_was_set((char_u *)"window")) p_window = h - 1; - Rows = h; + rows = Rows = h; } limit_screen_size(); @@ -763,6 +766,12 @@ gui_mch_open(void) pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); + + pixel_width += get_menu_tool_width(); + pixel_height += get_menu_tool_height(); + + // Dimensions may be smaller because of client side decorations, we handle + // that after we present the window. gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), pixel_width, pixel_height); @@ -795,8 +804,15 @@ gui_mch_open(void) G_CALLBACK(mainwin_destroy_cb), NULL); // Resize is handled by GtkForm's size_allocate callback. - // Not sure if this needed but still do it I guess? - gtk_widget_set_visible(gui.mainwin, TRUE); + gtk_window_present(GTK_WINDOW(gui.mainwin)); + + // Update so that we get the "gui.decor_height", which we can then use to + // set the exact dimensions of the window. + gui_mch_update(); + Columns = columns; + Rows = rows; + gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), + pixel_width, pixel_height + gui.decor_height); // Make sure the drawing area gets keyboard focus. gtk_widget_grab_focus(gui.drawarea); @@ -951,6 +967,8 @@ gui_mch_set_shellsize(int width, int height, height += gui.decor_height; gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), width, height); + + gui_mch_update(); } void @@ -1290,9 +1308,13 @@ gui_mch_init_font(char_u *font_name, int fontset UNUSED) ascii_glyph_table_init(); // im window position depends on cursor size which depends on font metrics - // update the position after we've initialized font - im_set_position(gui.row, gui.col); - + // update the position after we've initialized font. Make sure to not go out + // of bounds of the screen. + { + int im_row = gui.row < screen_Rows ? gui.row : screen_Rows - 1; + int im_col = gui.col < screen_Columns ? gui.col : screen_Columns - 1; + im_set_position(im_row, im_col); + } return OK; } @@ -1952,7 +1974,7 @@ static double prev_mouse_y = -1.0; static GdkModifierType cur_state = 0; static timeout_cb_type -mouse_repeat_timer_cb(gpointer data) +mouse_repeat_timer_cb(gpointer data UNUSED) { int x, y; @@ -2130,6 +2152,7 @@ focus_out_event(GtkEventControllerFocus *controller UNUSED, static void drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) { +#if defined(FEAT_IMAGE) // Use GdkSurface, as that handles fractional scale values. GdkSurface *surface = gtk_native_get_surface( gtk_widget_get_native(gui.drawarea)); @@ -2139,7 +2162,7 @@ drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) popup_update_scale(old); g_signal_connect(G_OBJECT(surface), "notify::scale", G_CALLBACK(scale_factor_cb), NULL); - +#endif gui_mch_new_colors(); } @@ -2151,18 +2174,18 @@ drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) #endif } +#if defined(FEAT_IMAGE) static void scale_factor_cb(GdkSurface *surface, GParamSpec *pspec UNUSED, void *udata UNUSED) { -#if defined(FEAT_IMAGE) double old = gui.scale; gui.scale = gdk_surface_get_scale(surface); popup_update_scale(old); -#endif } +#endif typedef enum { @@ -2334,7 +2357,7 @@ gui_gtk_set_dnd_targets(void) * Handle textual DND data. Note that this does not finish the drop. */ static void -drop_read_text(GdkDrop *drop, char_u *text) +drop_read_text(GdkDrop *drop UNUSED, char_u *text) { GdkModifierType state; char_u dropkey[6] = { @@ -3080,7 +3103,7 @@ on_tab_reordered( * Handle selecting an item in the tab line popup menu. */ static void -tabline_menu_event_cb(VimMenuItem *item, VimMenuItemEvent event, void *udata) +tabline_menu_event_cb(VimMenuItem *item UNUSED, VimMenuItemEvent event, void *udata) { if (event == VIM_MENU_ITEM_CLICKED) send_tabline_menu_event(tabpage_hover, GPOINTER_TO_INT(udata)); @@ -3399,7 +3422,7 @@ get_menu_tool_height(void) int height = 0; - for (int i = 0; i < ARRAY_LENGTH(widgets); i++) + for (int i = 0; i < (int)ARRAY_LENGTH(widgets); i++) { GtkRequisition min; GtkRequisition nat; @@ -3690,6 +3713,9 @@ static int last_text_area_h = 0; * ============================================================ */ +#ifdef FEAT_MENU + +# ifdef FEAT_TOOLBAR /* * Icon name table for toolbar buttons. * Must match toolbar_names[] in menu.c. @@ -3774,10 +3800,11 @@ create_toolbar_icon(vimmenu_T *menu) return image; } +# endif static void menu_button_clicked_cb( - VimMenuItem *item, + VimMenuItem *item UNUSED, VimMenuItemEvent event, vimmenu_T *menu) { @@ -3870,7 +3897,7 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx) { vimmenu_T *parent = menu->parent; -#ifdef FEAT_TOOLBAR +# ifdef FEAT_TOOLBAR if (parent != NULL && menu_is_toolbar(parent->name)) { if (menu_is_separator(menu->name)) @@ -3904,7 +3931,7 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx) } return; } -#endif +# endif // Menu items (non-toolbar) if (parent == NULL || parent->submenu_id == NULL) @@ -3969,16 +3996,22 @@ gui_mch_destroy_menu(vimmenu_T *menu) // For toolbar buttons and separators, remove from the toolbar box. if (menu->parent != NULL && menu_is_toolbar(menu->parent->name)) { - vim_toolbar_remove(VIM_TOOLBAR(gui.toolbar), menu->id); - menu->id = NULL; + if (menu->id != NULL) + { + vim_toolbar_remove(VIM_TOOLBAR(gui.toolbar), menu->id); + menu->id = NULL; + } return; } // For popup menus, unparent the menu as well if (menu->name[0] == ']' || menu_is_popup(menu->name)) - gtk_widget_unparent(menu->submenu_id); - else if (menu->parent == NULL) - // Remove from menubar + { + if (menu->submenu_id != NULL) + gtk_widget_unparent(menu->submenu_id); + } + else if (menu->parent == NULL && menu->id != NULL) + // Remove from menubar, if not NULL. vim_menu_bar_remove(VIM_MENU_BAR(gui.menubar), menu->id); // "menu->id" is NULL for window toolbar else if (menu->id != NULL) @@ -4029,6 +4062,8 @@ show_menubar_popover(void) gtk_popover_popup(GTK_POPOVER(menu)); } +#endif // FEAT_MENU + /* * ============================================================ * Scrollbar functions @@ -4473,7 +4508,7 @@ typedef struct } DialogState; static void -dialog_button_clicked_cb(GtkButton *button, DialogButtonState *state) +dialog_button_clicked_cb(GtkButton *button UNUSED, DialogButtonState *state) { *state->response = state->but_idx; *state->done = TRUE; @@ -4481,9 +4516,9 @@ dialog_button_clicked_cb(GtkButton *button, DialogButtonState *state) static gboolean dialog_key_pressed_cb( - GtkEventControllerKey *controller, + GtkEventControllerKey *controller UNUSED, guint keyval, - guint keycode, + guint keycode UNUSED, GdkModifierType state, DialogState *dstate) { @@ -4499,7 +4534,7 @@ dialog_key_pressed_cb( } static gboolean -dialog_close_request_cb(GtkWindow *win, gboolean *win_closed) +dialog_close_request_cb(GtkWindow *win UNUSED, gboolean *win_closed) { *win_closed = TRUE; return FALSE; @@ -4798,9 +4833,9 @@ entry_changed_cb(GtkWidget *entry, GtkWidget *dialog) static gboolean find_key_pressed_cb( - GtkEventControllerKey *controller, + GtkEventControllerKey *controller UNUSED, guint keyval, - guint keycode, + guint keycode UNUSED, GdkModifierType state, SharedFindReplace *frdp) { diff --git a/src/gui_gtk4_cb.c b/src/gui_gtk4_cb.c index e627ebeda8..5a3a438001 100644 --- a/src/gui_gtk4_cb.c +++ b/src/gui_gtk4_cb.c @@ -55,7 +55,7 @@ vim_content_provider_class_init(VimContentProviderClass *class) } static void -vim_content_provider_init(VimContentProvider *self) +vim_content_provider_init(VimContentProvider *self UNUSED) { } @@ -76,7 +76,7 @@ vim_content_provider_ref_formats(GdkContentProvider *cp UNUSED) // html if user specified 'html' in 'clipboard' option. GdkContentFormatsBuilder *builder = gdk_content_formats_builder_new(); - for (int i = 0; i < SUPPORTED_MIMES_LEN; i++) + for (size_t i = 0; i < SUPPORTED_MIMES_LEN; i++) { if (STRCMP(supported_mimes[i], "text/html") == 0 && !clip_html) continue; @@ -190,7 +190,7 @@ vim_content_provider_write_mime_type_async( static gboolean vim_content_provider_write_mime_type_finish( - GdkContentProvider *cp, + GdkContentProvider *cp UNUSED, GAsyncResult *result, GError **error) { diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 80d3044cb5..330706e865 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -162,7 +162,9 @@ struct _VimDrawArea #endif }; +#ifdef FEAT_IMAGE_GDK static void draw_image_free(DrawImage *dimg); +#endif static void draw_row_init(DrawRow *drow, int row, int cols); static void draw_row_clear(DrawRow *drow); static void draw_row_dirty_layer(DrawRow *drow, DrawLayerType dlayer_t); @@ -1034,6 +1036,7 @@ draw_row_render_text(DrawRow *drow, VimDrawArea *da) empty_cells++; continue; } +#if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SIGN_ICONS) else if (dglyphs->font == NULL) { // Add sign icon @@ -1055,6 +1058,7 @@ draw_row_render_text(DrawRow *drow, VimDrawArea *da) // loop continue; } +#endif else if (dglyphs->font != cur_font || cur_fg != dglyphs->fg_color) { FLUSH_NODE(); @@ -1157,7 +1161,7 @@ draw_row_render_special(DrawRow *drow, VimDrawArea *da) { dlayer->node = gsk_container_node_new(nodes, 2); // gsk_container_node_new() takes its own ref - for (int i = 0; i < ARRAY_LENGTH(nodes); i++) + for (int i = 0; i < (int)ARRAY_LENGTH(nodes); i++) gsk_render_node_unref(nodes[i]); } diff --git a/src/gui_gtk4_f.c b/src/gui_gtk4_f.c index 56949d9971..195749d2a5 100644 --- a/src/gui_gtk4_f.c +++ b/src/gui_gtk4_f.c @@ -81,9 +81,8 @@ vim_form_class_init(VimFormClass *class) } static void -vim_form_init(VimForm *self) +vim_form_init(VimForm *self UNUSED) { - } GtkWidget * @@ -229,7 +228,7 @@ vim_form_size_allocate( GtkWidget *widget, int width, int height, - int baseline) + int baseline UNUSED) { VimForm *self = VIM_FORM(widget); diff --git a/src/gui_gtk4_menu.c b/src/gui_gtk4_menu.c index 4abb38624c..7b534b255f 100644 --- a/src/gui_gtk4_menu.c +++ b/src/gui_gtk4_menu.c @@ -881,7 +881,7 @@ vim_menu_init(VimMenu *self) // Set all shortcut controllers in the window to not require a modifier for // mnemonics. controllers = gtk_widget_observe_controllers(GTK_WIDGET(self)); - for (int i = 0; i < g_list_model_get_n_items(controllers); i++) + for (guint i = 0; i < g_list_model_get_n_items(controllers); i++) { controller = g_list_model_get_item(controllers, i); if (GTK_IS_SHORTCUT_CONTROLLER(controller)) diff --git a/src/gui_gtk4_tb.c b/src/gui_gtk4_tb.c index 1971a4728e..d2091f6ea7 100644 --- a/src/gui_gtk4_tb.c +++ b/src/gui_gtk4_tb.c @@ -303,7 +303,11 @@ vim_toolbar_set_style(VimToolbar *self, int style, int iconsize) void vim_toolbar_remove(VimToolbar *self, GtkWidget *item) { - gtk_box_remove(GTK_BOX(self->strip),item); + if (gtk_widget_get_parent(item) == self->strip) + gtk_box_remove(GTK_BOX(self->strip), item); + else + gtk_box_remove(GTK_BOX(self->overflow_box), item); + self->items = g_list_remove(self->items, item); g_object_unref(item); gtk_widget_queue_allocate(GTK_WIDGET(self)); @@ -327,8 +331,10 @@ vim_toolbar_move_item_to( from = overflow ? GTK_BOX(self->strip) : GTK_BOX(self->overflow_box); + g_object_ref(item); gtk_box_remove(from, item); gtk_box_append(to, item); + g_object_unref(item); if (GTK_IS_SEPARATOR(item)) gtk_widget_set_visible(item, !overflow); diff --git a/src/gui_xim.c b/src/gui_xim.c index 0700ce41a5..184945583c 100644 --- a/src/gui_xim.c +++ b/src/gui_xim.c @@ -189,12 +189,10 @@ static int im_preedit_cursor = 0; // cursor offset in characters static int im_preedit_trailing = 0; // number of characters after cursor static unsigned long im_commit_handler_id = 0; -# ifdef USE_GTK4 +# ifndef USE_GTK4 static unsigned int im_activatekey_keyval = GDK_KEY_VoidSymbol; -# else -static unsigned int im_activatekey_keyval = GDK_VoidSymbol; -# endif static unsigned int im_activatekey_state = 0; +# endif static GtkWidget *preedit_window = NULL; static GtkWidget *preedit_label = NULL; diff --git a/src/option.h b/src/option.h index 326b48b630..e92bd5f0d6 100644 --- a/src/option.h +++ b/src/option.h @@ -688,7 +688,7 @@ EXTERN int p_guipty; // 'guipty' #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) EXTERN char_u *p_guiligatures; // 'guiligatures' #endif -#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) +#if (defined(FEAT_GUI_GTK) && !defined(USE_GTK4)) || defined(FEAT_GUI_X11) EXTERN long p_ghr; // 'guiheadroom' #endif #ifdef CURSOR_SHAPE diff --git a/src/optiondefs.h b/src/optiondefs.h index 187747368a..10fbd82e0f 100644 --- a/src/optiondefs.h +++ b/src/optiondefs.h @@ -1278,7 +1278,7 @@ static struct vimoption options[] = {"guiheadroom", "ghr", P_NUM|P_VI_DEF, -#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) +#if (defined(FEAT_GUI_GTK) && !defined(USE_GTK4)) || defined(FEAT_GUI_X11) (char_u *)&p_ghr, PV_NONE, NULL, NULL, #else (char_u *)NULL, PV_NONE, NULL, NULL, diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim index 83c43b1174..0652d3de61 100644 --- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -119,6 +119,9 @@ endfunc func Test_quoteplus() CheckX11BasedGui + " Doesn't work with GTK4 GUI, because theres no CUT BUFFER in Wayland, meaning + " when the GVim that is launched exits, the clipboard is also cleared as well. + CheckNotFeature gui_gtk4 let g:test_is_flaky = 1 @@ -667,6 +670,7 @@ endfunc func Test_set_guiheadroom() CheckX11BasedGui + CheckNotFeature gui_gtk4 " Since this script is to be read together with '-U NONE', the default " value must be preserved. diff --git a/src/testdir/test_gui_init.vim b/src/testdir/test_gui_init.vim index 1a60a49ec5..d5d1d05784 100644 --- a/src/testdir/test_gui_init.vim +++ b/src/testdir/test_gui_init.vim @@ -21,6 +21,7 @@ gui -f func Test_set_guiheadroom() CheckX11BasedGui + CheckNotFeature gui_gtk4 " The 'expected' value must be consistent with the value specified with " gui_init.vim. @@ -35,6 +36,7 @@ endfunc func Test_set_guioptions_for_p() CheckX11BasedGui + CheckNotFeature gui_gtk4 sleep 200ms " Check if the 'p' option is included. diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim index bb8d86d7ed..04e4447b05 100644 --- a/src/testdir/test_startup.vim +++ b/src/testdir/test_startup.vim @@ -461,6 +461,7 @@ endfunc " Test the --echo-wid argument (for GTK GUI only). func Test_echo_wid() CheckCanRunGui + CheckNotFeature gui_gtk4 CheckFeature gui_gtk if RunVim([], [], '-g --echo-wid -cq >Xtest_echo_wid') @@ -475,6 +476,7 @@ endfunction " Test the -reverse and +reverse arguments (for GUI only). func Test_reverse() CheckCanRunGui + CheckNotFeature gui_gtk4 CheckAnyOf Feature:gui_gtk Feature:gui_motif let after =<< trim [CODE] @@ -1427,7 +1429,9 @@ func Test_progname() " Class: XmCascadeButton " Illegal mnemonic character; Could not convert X KEYSYM to a keycode " So don't check that stderr is empty with GUI Motif. - if run_with_gui && !has('gui_motif') + " + " GTK4 also can output warnings, so don't do it as well + if run_with_gui && !has('gui_motif') && !has('gui_gtk4') call assert_equal('', stdout_stderr, progname) endif call assert_equal(expectations[progname], readfile('Xprogname_out'), progname) diff --git a/src/testdir/util/check.vim b/src/testdir/util/check.vim index c69d399441..47fea7edf3 100644 --- a/src/testdir/util/check.vim +++ b/src/testdir/util/check.vim @@ -301,7 +301,10 @@ endfunc " Command to check for X11 based GUI command CheckX11BasedGui call CheckX11BasedGui() func CheckX11BasedGui() - if !g:x11_based_gui + " GTK4 is technically not X11 based, but many tests still apply to it. However + " don't set g:x11_based_gui to true, because some tests (such as windowid) + " don't apply to GTK4. + if !g:x11_based_gui && !has('gui_gtk4') throw 'Skipped: requires X11 based GUI' endif endfunc diff --git a/src/testdir/util/gen_opt_test.vim b/src/testdir/util/gen_opt_test.vim index f5d71ad185..738e76e944 100644 --- a/src/testdir/util/gen_opt_test.vim +++ b/src/testdir/util/gen_opt_test.vim @@ -237,7 +237,7 @@ let test_values = { \ ['xxx', 'a,b']], \ 'helplang': [['', 'de', 'de,it'], ['xxx']], \ 'highlight': [['', 'e:Error'], ['xxx']], - \ 'imactivatekey': [['', 'S-space'], ['xxx']], + \ 'imactivatekey': [[''], ['xxx']], \ 'isfname': [['', '@', '@,48-52'], ['xxx', '@48']], \ 'isident': [['', '@', '@,48-52'], ['xxx', '@48']], \ 'iskeyword': [['', '@', '@,48-52'], ['xxx', '@48']], @@ -395,6 +395,10 @@ let test_values = { \ 'otherstring': [['', 'xxx'], []], \} +if !has('gui_gtk4') + let test_values['imactivatekey'] = [['', 'S-space'], ['xxx']] +endif + if !has('clipboard') " If +clipboard isn't enabled but +clipboard_provider is, then 'clipboard' is " limited to "unnamed" and "unnamedplus" diff --git a/src/version.c b/src/version.c index ccd788a595..41fe299eea 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 931, /**/ 930, /**/ From cab0901f121d0fab74c9a42bb90583d59b3d3c21 Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Mon, 10 Aug 2026 20:17:42 +0000 Subject: [PATCH 326/647] patch 9.2.0932: NFA engine fallback can double free the compiled program Problem: When the automatic regexp engine falls back to the backtracking engine in vim_regexec_string(), the compiled program is freed before the replacement is compiled; when saving the pattern fails from being out of memory the caller's "regprog" is left pointing to freed memory and is freed again. Solution: Free the previous program only after compiling the replacement succeeded, like vim_regexec_multi() already does (Samuel Schlesinger). closes: #20986 Co-Authored-By: Claude Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/regexp.c | 12 ++++++++++-- src/version.c | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/regexp.c b/src/regexp.c index 7f52f9a955..6da2e66a77 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -3114,15 +3114,23 @@ vim_regexec_string( char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern); p_re = BACKTRACKING_ENGINE; - vim_regfree(rmp->regprog); if (pat != NULL) { + regprog_T *prev_prog = rmp->regprog; + #ifdef FEAT_EVAL report_re_switch(pat); #endif rmp->regprog = vim_regcomp(pat, re_flags); - if (rmp->regprog != NULL) + if (rmp->regprog == NULL) + { + // Somehow compiling the pattern failed now, put back the + // previous one to avoid "regprog" becoming NULL. + rmp->regprog = prev_prog; + } + else { + vim_regfree(prev_prog); rmp->regprog->re_in_use = TRUE; result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl); rmp->regprog->re_in_use = FALSE; diff --git a/src/version.c b/src/version.c index 41fe299eea..a33437590f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 932, /**/ 931, /**/ From d03735e8d29a228e6a37300335983101edb69431 Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Mon, 10 Aug 2026 20:46:08 +0000 Subject: [PATCH 327/647] patch 9.2.0933: u_read_undo() leaks the file name when the undo file owner differs Problem: When the owner of an undo file differs from the owner of the text file and the current user, u_read_undo() returns without freeing the file name it allocated with u_get_undo_file_name(). Solution: Free the file name before returning (Samuel Schlesinger). Every other exit of the function frees it under the "theend" label; this early return sits before the file pointer is initialized, so it cannot use that label. closes: #20987 Co-Authored-By: Claude Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/undo.c | 1 + src/version.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/undo.c b/src/undo.c index 06efd92301..748b38054d 100644 --- a/src/undo.c +++ b/src/undo.c @@ -1881,6 +1881,7 @@ u_read_undo(char_u *name, char_u *hash, char_u *orig_name UNUSED) file_name); verbose_leave(); } + vim_free(file_name); return; } # endif diff --git a/src/version.c b/src/version.c index a33437590f..81a7d542c4 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 933, /**/ 932, /**/ From 02bf0893d536449548f91b75817748a5e25219c0 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 11 Aug 2026 17:45:16 +0000 Subject: [PATCH 328/647] runtime(doc): clarify diff_filler() function fixes: #20990 Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 1f14e75281..d88d5deac6 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Jul 25 +*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 11 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2526,7 +2526,12 @@ diff_filler({lnum}) *diff_filler()* display but don't exist in the buffer. {lnum} is used like with |getline()|. Thus "." is the current line, "'m" mark m, etc. - Returns 0 if the current window is not in diff mode. + + To get the filler lines after the last buffer line, use: > + echo diff_filler(line('$')+1) +< + Returns 0 if the current window is not in diff mode or filler + lines have been disabled using 'diffopt'. Can also be used as a |method|: > GetLnum()->diff_filler() From 11fca33162ad2e6a6365dbf6202fb1af0f21b7cb Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Tue, 11 Aug 2026 18:03:33 +0000 Subject: [PATCH 329/647] patch 9.2.0934: filetype: hlsl files are not recognized Problem: filetype: hlsl files are not recognized Solution: Detect *.hlsl files hlsl filetype, include ftplugin, indent and syntax plugins, update gvim menu (Maxim Kim) Note to Neovim devs: runtime files are in vim9script closes: #20993 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 3 + runtime/autoload/dist/ft.vim | 4 +- runtime/ftplugin/hlsl.vim | 20 +++++ runtime/indent/hlsl.vim | 14 ++++ runtime/makemenu.vim | 1 + runtime/synmenu.vim | 141 +++++++++++++++++----------------- runtime/syntax/hlsl.vim | 116 ++++++++++++++++++++++++++++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 + 9 files changed, 231 insertions(+), 71 deletions(-) create mode 100644 runtime/ftplugin/hlsl.vim create mode 100644 runtime/indent/hlsl.vim create mode 100644 runtime/syntax/hlsl.vim diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 9b221eb7a2..93646aba4b 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -222,6 +222,7 @@ runtime/ftplugin/haredoc.vim @selenebun runtime/ftplugin/hcl.vim @gpanders runtime/ftplugin/heex.vim @cvincent runtime/ftplugin/hgcommit.vim @k-takata +runtime/ftplugin/hlsl.vim @habamax runtime/ftplugin/hlsplaylist.vim @avidseeker runtime/ftplugin/hog.vim @wtfbbqhax runtime/ftplugin/html.vim @dkearns @@ -410,6 +411,7 @@ runtime/indent/haml.vim @tpope runtime/indent/handlebars.vim @sukima runtime/indent/hare.vim @selenebun runtime/indent/hcl.vim @gpanders +runtime/indent/hlsl.vim @habamax runtime/indent/hog.vim @wtfbbqhax runtime/indent/idlang.vim @dkearns runtime/indent/j.vim @glts @@ -589,6 +591,7 @@ runtime/syntax/help_ru.vim @RestorerZ runtime/syntax/hgcommit.vim @k-takata runtime/syntax/hip.vim @Young-TW runtime/syntax/hitest.vim @lacygoill +runtime/syntax/hlsl.vim @habamax runtime/syntax/hog.vim @wtfbbqhax runtime/syntax/hollywood.vim @sodero runtime/syntax/html.vim @dkearns diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index bf8a0cc36c..c346bd1397 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Aug 08 +# Last Change: 2026 Aug 10 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -2208,6 +2208,8 @@ const ft_from_ext = { "hbs": "handlebars", # Hare "ha": "hare", + # HLSL + "hlsl": "hlsl", # Haskell "hs": "haskell", "hsc": "haskell", diff --git a/runtime/ftplugin/hlsl.vim b/runtime/ftplugin/hlsl.vim new file mode 100644 index 0000000000..4af365ca78 --- /dev/null +++ b/runtime/ftplugin/hlsl.vim @@ -0,0 +1,20 @@ +vim9script +# Language: HLSL (High-Level Shader Language) +# Maintainer: Maxim Kim +# Last Change: 2026 Aug 11 + +if exists("b:did_ftplugin") + finish +endif +b:did_ftplugin = 1 + +var undo_opts = "setl commentstring< comments<" + +setlocal commentstring=//\ %s +setlocal comments= + +if exists('b:undo_ftplugin') + b:undo_ftplugin ..= "|" .. undo_opts +else + b:undo_ftplugin = undo_opts +endif diff --git a/runtime/indent/hlsl.vim b/runtime/indent/hlsl.vim new file mode 100644 index 0000000000..f4428536b1 --- /dev/null +++ b/runtime/indent/hlsl.vim @@ -0,0 +1,14 @@ +vim9script +# Language: HLSL (High-Level Shader Language) +# Maintainer: Maxim Kim +# Last Change: 2026 Aug 11 + +if exists('b:did_indent') + finish +endif +b:did_indent = 1 + +setlocal autoindent cindent +setlocal cinoptions& + +b:undo_indent = 'setl ai< ci< cino<' diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 98d88e6223..3497a773f5 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -330,6 +330,7 @@ SynMenu HIJK.Hex\ dump.XXD:xxd SynMenu HIJK.Hex\ dump.Intel\ MCS51:hex SynMenu HIJK.Hg\ commit:hgcommit SynMenu HIJK.HIP:hip +SynMenu HIJK.HLSL:hlsl SynMenu HIJK.HLSPlaylist:hlsplaylist SynMenu HIJK.Hollywood:hollywood SynMenu HIJK.HTML.HTML:html diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index b2259b930e..93bd5731c1 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -2,7 +2,7 @@ " This file is normally sourced from menu.vim. " " Maintainer: The Vim Project -" Last Change: 2026 Aug 06 +" Last Change: 2026 Aug 11 " Former Maintainer: Bram Moolenaar " Define the SetSyn function, used for the Syntax menu entries. @@ -311,75 +311,76 @@ an 50.50.220 &Syntax.HIJK.Hex\ dump.XXD :cal SetSyn("xxd") an 50.50.230 &Syntax.HIJK.Hex\ dump.Intel\ MCS51 :cal SetSyn("hex") an 50.50.240 &Syntax.HIJK.Hg\ commit :cal SetSyn("hgcommit") an 50.50.250 &Syntax.HIJK.HIP :cal SetSyn("hip") -an 50.50.260 &Syntax.HIJK.HLSPlaylist :cal SetSyn("hlsplaylist") -an 50.50.270 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") -an 50.50.280 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") -an 50.50.290 &Syntax.HIJK.HTML.HTMLAngular :cal SetSyn("htmlangular") -an 50.50.300 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") -an 50.50.310 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby") -an 50.50.320 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah") -an 50.50.330 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango") -an 50.50.340 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs") -an 50.50.350 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos") -an 50.50.360 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml") -an 50.50.370 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf") -an 50.50.380 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess") -an 50.50.390 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb") -an 50.50.400 &Syntax.HIJK.Hyprlang :cal SetSyn("hyprlang") -an 50.50.420 &Syntax.HIJK.I3Config :cal SetSyn("i3config") -an 50.50.430 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu") -an 50.50.440 &Syntax.HIJK.Icon :cal SetSyn("icon") -an 50.50.450 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl") -an 50.50.460 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl") -an 50.50.470 &Syntax.HIJK.Idris2 :cal SetSyn("idris2") -an 50.50.480 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent") -an 50.50.490 &Syntax.HIJK.Inform :cal SetSyn("inform") -an 50.50.500 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl") -an 50.50.510 &Syntax.HIJK.Initng :cal SetSyn("initng") -an 50.50.520 &Syntax.HIJK.Inittab :cal SetSyn("inittab") -an 50.50.530 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss") -an 50.50.540 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat") -an 50.50.550 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog") -an 50.50.560 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt") -an 50.50.570 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog") -an 50.50.580 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog") -an 50.50.590 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog") -an 50.50.600 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd") -an 50.50.610 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang") -an 50.50.620 &Syntax.HIJK.Ipkg :cal SetSyn("ipkg") -an 50.50.630 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter") -an 50.50.650 &Syntax.HIJK.J :cal SetSyn("j") -an 50.50.660 &Syntax.HIJK.JAL :cal SetSyn("jal") -an 50.50.670 &Syntax.HIJK.JAM :cal SetSyn("jam") -an 50.50.680 &Syntax.HIJK.Jargon :cal SetSyn("jargon") -an 50.50.690 &Syntax.HIJK.Java.Java :cal SetSyn("java") -an 50.50.700 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc") -an 50.50.710 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp") -an 50.50.720 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties") -an 50.50.730 &Syntax.HIJK.JavaScript :cal SetSyn("javascript") -an 50.50.740 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact") -an 50.50.750 &Syntax.HIJK.Jess :cal SetSyn("jess") -an 50.50.760 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph") -an 50.50.770 &Syntax.HIJK.Jinja :cal SetSyn("jinja") -an 50.50.780 &Syntax.HIJK.JJdescription :cal SetSyn("jjdescription") -an 50.50.790 &Syntax.HIJK.Jovial :cal SetSyn("jovial") -an 50.50.800 &Syntax.HIJK.JQ :cal SetSyn("jq") -an 50.50.810 &Syntax.HIJK.JSON.JSON :cal SetSyn("json") -an 50.50.820 &Syntax.HIJK.JSON.JSON-LD :cal SetSyn("jsonld") -an 50.50.830 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5") -an 50.50.840 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc") -an 50.50.850 &Syntax.HIJK.Julia :cal SetSyn("julia") -an 50.50.860 &Syntax.HIJK.Just :cal SetSyn("just") -an 50.50.880 &Syntax.HIJK.Karel :cal SetSyn("karel") -an 50.50.890 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") -an 50.50.900 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") -an 50.50.910 &Syntax.HIJK.Kdl :cal SetSyn("kdl") -an 50.50.920 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") -an 50.50.930 &Syntax.HIJK.Kitty :cal SetSyn("kitty") -an 50.50.940 &Syntax.HIJK.Kivy :cal SetSyn("kivy") -an 50.50.950 &Syntax.HIJK.KixTart :cal SetSyn("kix") -an 50.50.960 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin") -an 50.50.970 &Syntax.HIJK.Krl :cal SetSyn("krl") +an 50.50.260 &Syntax.HIJK.HLSL :cal SetSyn("hlsl") +an 50.50.270 &Syntax.HIJK.HLSPlaylist :cal SetSyn("hlsplaylist") +an 50.50.280 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood") +an 50.50.290 &Syntax.HIJK.HTML.HTML :cal SetSyn("html") +an 50.50.300 &Syntax.HIJK.HTML.HTMLAngular :cal SetSyn("htmlangular") +an 50.50.310 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4") +an 50.50.320 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby") +an 50.50.330 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah") +an 50.50.340 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango") +an 50.50.350 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs") +an 50.50.360 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos") +an 50.50.370 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml") +an 50.50.380 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf") +an 50.50.390 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess") +an 50.50.400 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb") +an 50.50.410 &Syntax.HIJK.Hyprlang :cal SetSyn("hyprlang") +an 50.50.430 &Syntax.HIJK.I3Config :cal SetSyn("i3config") +an 50.50.440 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu") +an 50.50.450 &Syntax.HIJK.Icon :cal SetSyn("icon") +an 50.50.460 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl") +an 50.50.470 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl") +an 50.50.480 &Syntax.HIJK.Idris2 :cal SetSyn("idris2") +an 50.50.490 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent") +an 50.50.500 &Syntax.HIJK.Inform :cal SetSyn("inform") +an 50.50.510 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl") +an 50.50.520 &Syntax.HIJK.Initng :cal SetSyn("initng") +an 50.50.530 &Syntax.HIJK.Inittab :cal SetSyn("inittab") +an 50.50.540 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss") +an 50.50.550 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat") +an 50.50.560 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog") +an 50.50.570 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt") +an 50.50.580 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog") +an 50.50.590 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog") +an 50.50.600 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog") +an 50.50.610 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd") +an 50.50.620 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang") +an 50.50.630 &Syntax.HIJK.Ipkg :cal SetSyn("ipkg") +an 50.50.640 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter") +an 50.50.660 &Syntax.HIJK.J :cal SetSyn("j") +an 50.50.670 &Syntax.HIJK.JAL :cal SetSyn("jal") +an 50.50.680 &Syntax.HIJK.JAM :cal SetSyn("jam") +an 50.50.690 &Syntax.HIJK.Jargon :cal SetSyn("jargon") +an 50.50.700 &Syntax.HIJK.Java.Java :cal SetSyn("java") +an 50.50.710 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc") +an 50.50.720 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp") +an 50.50.730 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties") +an 50.50.740 &Syntax.HIJK.JavaScript :cal SetSyn("javascript") +an 50.50.750 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact") +an 50.50.760 &Syntax.HIJK.Jess :cal SetSyn("jess") +an 50.50.770 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph") +an 50.50.780 &Syntax.HIJK.Jinja :cal SetSyn("jinja") +an 50.50.790 &Syntax.HIJK.JJdescription :cal SetSyn("jjdescription") +an 50.50.800 &Syntax.HIJK.Jovial :cal SetSyn("jovial") +an 50.50.810 &Syntax.HIJK.JQ :cal SetSyn("jq") +an 50.50.820 &Syntax.HIJK.JSON.JSON :cal SetSyn("json") +an 50.50.830 &Syntax.HIJK.JSON.JSON-LD :cal SetSyn("jsonld") +an 50.50.840 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5") +an 50.50.850 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc") +an 50.50.860 &Syntax.HIJK.Julia :cal SetSyn("julia") +an 50.50.870 &Syntax.HIJK.Just :cal SetSyn("just") +an 50.50.890 &Syntax.HIJK.Karel :cal SetSyn("karel") +an 50.50.900 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig") +an 50.50.910 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript") +an 50.50.920 &Syntax.HIJK.Kdl :cal SetSyn("kdl") +an 50.50.930 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt") +an 50.50.940 &Syntax.HIJK.Kitty :cal SetSyn("kitty") +an 50.50.950 &Syntax.HIJK.Kivy :cal SetSyn("kivy") +an 50.50.960 &Syntax.HIJK.KixTart :cal SetSyn("kix") +an 50.50.970 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin") +an 50.50.980 &Syntax.HIJK.Krl :cal SetSyn("krl") an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace") an 50.60.110 &Syntax.L.LambdaProlog :cal SetSyn("lprolog") an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte") diff --git a/runtime/syntax/hlsl.vim b/runtime/syntax/hlsl.vim new file mode 100644 index 0000000000..e6fe49a969 --- /dev/null +++ b/runtime/syntax/hlsl.vim @@ -0,0 +1,116 @@ +vim9script +# Language: HLSL (High-Level Shader Language) +# Maintainer: Maxim Kim +# Last Change: 2026 Aug 11 +# https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-reference + +if exists("b:current_syntax") + finish +endif + +var expanded_types = [ + 'float', 'double', 'int', 'uint', 'bool', + 'min10float', 'min16float', 'min12int', 'min16int', 'min16uint', + 'float16_t', 'int16_t', 'uint16_t', 'uint64_t', 'int64_t', + 'vector', 'matrix' +] + +# float1, float2 ... +# ... +# int1x1, int1x2 ... +exe $"syn keyword hlslType {expanded_types->join()}" +range(1, 4)->foreach((_, idxN) => { + var typeN = expanded_types->mapnew((_, type) => type .. idxN)->join() + exe $"syn keyword hlslType {typeN}" + range(1, 4)->foreach((_, idxM) => { + var typeNxM = expanded_types + ->mapnew((_, type) => $"{type}{idxN}x{idxM}")->join() + exe $"syn keyword hlslType {typeNxM}" + }) +}) +syn keyword hlslType void dword half string texture sampler +syn keyword hlslType extern nointerpolation precise shared groupshared static +syn keyword hlslType uniform export extern volatile const row_major column_major +syn keyword hlslType struct linear centroid noperspective sample +syn keyword hlslType typedef namespace class interface enum +syn keyword hlslType snorm unorm +syn keyword hlslType vertexfragment pixelfragment +syn keyword hlslType point line lineadj triangle triangleadj +syn keyword hlslType technique10 technique11 +syn keyword hlslType cbuffer tbuffer +syn keyword hlslType Buffer StructuredBuffer AppendStructuredBuffer +syn keyword hlslType ByteAddressBuffer ConsumeStructuredBuffer +syn keyword hlslType Texture1D Texture2D Texture3D Texture1DArray Texture2DArray +syn keyword hlslType Texture2DMS Texture2DMSArray +syn keyword hlslType TextureCube TextureCubeArray +syn keyword hlslType RWBuffer RWByteAddressBuffer RWStructuredBuffer +syn keyword hlslType RWTexture1D RWTexture1DArray RWTexture2D +syn keyword hlslType RWTexture2DArray RWTexture3D +syn keyword hlslType PointStream LineStream TriangleStream +syn keyword hlslType SamplerState SamplerComparisonState +syn keyword hlslType RasterizerState DepthStencilState BlendState +syn keyword hlslType OutputPatch InputPatch +# TODO: only recognize it in function parameter list +syn keyword hlslType in out inout + +# legacy +syn keyword hlslType sampler2D + +syn keyword hlslCondition if else switch case default +syn keyword hlslRepeat while for do break continue +syn keyword hlslStatement return discard compile compile_fragment packoffset +syn keyword hlslStatement pass register fxgroup +syn keyword hlslConstant true false NULL + +# simplified Semantic highlighting: SV_POSITION, SV_TARGET etc +syn match hlslSemantic /:\s*\zs\k\+/ + +# POSITIONT BINORMAL[n] BLENDINDICES[n] BLENDWEIGHT[n] COLOR[n] NORMAL[n] +# POSITION[n] PSIZE[n] TANGENT[n] TEXCOORD[n] + +# SV_ClipDistance[n] SV_CullDistance[n] SV_Coverage SV_Depth +# SV_DepthGreaterEqual SV_DepthLessEqual SV_DispatchThreadID SV_DomainLocation +# SV_GroupID SV_GroupIndex SV_GroupThreadID SV_GSInstanceID SV_InnerCoverage +# SV_InsideTessFactor SV_InstanceID SV_IsFrontFace SV_OutputControlPointID +# SV_Position SV_PrimitiveID SV_RenderTargetArrayIndex SV_SampleIndex +# SV_StencilRef SV_Target[n], where 0 <= n <= 7 SV_TessFactor SV_VertexID +# SV_ViewportArrayIndex SV_ShadingRate + +syntax match hlslInteger "\v-?<[0-9]+%(_[0-9]+)*[uUlL]?>" display +syntax match hlslFloat "\v-?<[0-9]+%(_[0-9]+)*%(\.[0-9]+%(_[0-9]+)*)%([eE][+-]=[0-9]+%(_[0-9]+)*)=[hHfFlL]?>" display +syntax match hlslHex "\v<0[xX][0-9A-Fa-f]+%(_[0-9A-Fa-f]+)*[uUlL]?>" display +syntax match hlslOct "\v<0[oO][0-7]+%(_[0-7]+)*[uUlL]?>" display +syntax cluster hlslNumber contains=hlslInteger,hlslFloat,hlslHex,hlslOct + +syntax region hlslChar start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=hlslEscape +syntax region hlslString start=+"+ skip=+\\\\\|\\'+ end=+"+ contains=hlslEscape +syntax match hlslEscape display contained /\\\([abefnrtv\\'"]\|\o\{3}\|x\x\{2}\|u\x\{4}\|U\x\{8}\)/ + +# TODO: better preproc +syn region hlslPreProc start=/^\s*\zs#/ end=/$/ contains=@hlslNumber,hlslString,hlslChar,@hlslComment + +syntax match hlslTodo "TODO" contained +syntax match hlslTodo "XXX" contained +syntax match hlslTodo "FIXME" contained +syntax region hlslLineComment start=/\/\// end=/$/ contains=@Spell,hlslTodo +syntax region hlslBlockComment start=/\/\*/ end=/\*\// contains=@Spell,hlslTodo +syntax cluster hlslComment contains=hlslLineComment,hlslBlockComment + +hi def link hlslType Type +hi def link hlslStatement Statement +hi def link hlslCondition Statement +hi def link hlslRepeat Statement +hi def link hlslInteger Number +hi def link hlslFloat Float +hi def link hlslHex Number +hi def link hlslOct Number +hi def link hlslLineComment Comment +hi def link hlslBlockComment Comment +hi def link hlslTodo Todo +hi def link hlslChar Character +hi def link hlslString String +hi def link hlslEscape Special +hi def link hlslPreProc PreProc +hi def link hlslSemantic Identifier + +b:current_syntax = "hlsl" diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 893e3d8d0c..0b8f5a2a40 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -381,6 +381,7 @@ def s:GetFilenameChecks(): dict> hgcommit: ['hg-editor-file.txt'], hip: ['file.hip'], hjson: ['file.hjson'], + hlsl: ['file.hlsl'], hlsplaylist: ['file.m3u', 'file.m3u8'], hog: ['file.hog', 'snort.conf', 'vision.conf'], hollywood: ['file.hws'], diff --git a/src/version.c b/src/version.c index 81a7d542c4..3401ba30b0 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 934, /**/ 933, /**/ From fccf613c8f5b550797c08a45a768e14adefd882f Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Tue, 11 Aug 2026 18:16:45 +0000 Subject: [PATCH 330/647] patch 9.2.0935: reading an undo file is slow with many undo headers Problem: Reading an undo file resolves every stored sequence number with a linear scan over all headers, making loading quadratic in the number of undo states. Solution: Sort uhp_table on uh_seq once and resolve each reference with a binary search; the duplicate uh_seq check becomes a single pass over the sorted table (Samuel Schlesinger). At the default 'undolevels' of 1000 the quadratic cost is not measurable; it takes 'undolevels' in the tens of thousands to matter. Loading an undo file with 20000 states and 50 alternate branches with :rundo goes from 1.49s to 0.11s (min of 3, macOS arm64), with the same undotree(). Also make old_idx/new_idx/cur_idx and the loop index "i" long instead of short/int: they index uhp_table, whose length num_head is a long read from the file. A short index truncated above 32767 headers, making the restored b_u_oldhead/b_u_newhead/b_u_curhead pointers wrong in exactly the many-headers case this change is about. Add tests: a round-trip test with alternate branches that compares the entries of the tree and the text at every sequence number, a corruption test with a duplicated uh_seq, and a test for reading an undo file with zero headers, which is written when only the line for the "U" command is saved. closes: #20942 Co-Authored-By: Claude Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/testdir/test_undo.vim | 139 ++++++++++++++++++++++++++++++++++++ src/undo.c | 143 +++++++++++++++++++++----------------- src/version.c | 2 + 3 files changed, 222 insertions(+), 62 deletions(-) diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim index 21b9dcfdab..0b3e8cc93a 100644 --- a/src/testdir/test_undo.vim +++ b/src/testdir/test_undo.vim @@ -1004,4 +1004,143 @@ func Test_corrupted_undofile() let &undofile = _uf endfunc +" Test that an undo file with alternate branches round-trips: the tree +" structure and the text at every sequence number survive :wundo + :rundo. +func Test_undofile_branches() + CheckFeature persistent_undo + let save_ul = &undolevels + defer execute('let &undolevels = ' .. save_ul) + new Xubranches.txt + setl noswapfile + set ul=100 + call setline(1, 'a') + for i in range(5) + let &undolevels = &undolevels + call setline(1, 'main' .. i) + endfor + " create two alternate branches + silent undo 3 + let &undolevels = &undolevels + call setline(1, 'branch-a') + silent undo 2 + let &undolevels = &undolevels + call setline(1, 'branch-b') + + write + defer delete('Xubranches.txt') + wundo! Xubranches.undo + defer delete('Xubranches.undo') + let tree_before = undotree() + " remember the text at every undo state + let texts = {} + for seq in range(1, tree_before.seq_last) + exe 'silent undo ' .. seq + let texts[seq] = getline(1) + endfor + bwipe! + + edit Xubranches.txt + setl noswapfile + rundo Xubranches.undo + let tree_after = undotree() + call assert_equal(tree_before.seq_last, tree_after.seq_last) + " every field of the entries, including times and save numbers, must + " round-trip through the undo file exactly + call assert_equal(tree_before.entries, tree_after.entries) + for [seq, text] in items(texts) + exe 'silent undo ' .. seq + call assert_equal(text, getline(1), 'text at undo state ' .. seq) + endfor + + bwipe! +endfunc + +" Test that a duplicated sequence number in an undo file is detected. +func Test_undofile_duplicate_seq() + CheckFeature persistent_undo + let save_ul = &undolevels + defer execute('let &undolevels = ' .. save_ul) + new Xudupseq.txt + setl noswapfile + set ul=100 + call setline(1, 'one') + let &undolevels = &undolevels + call setline(1, 'two') + let &undolevels = &undolevels + call setline(1, 'three') + write + defer delete('Xudupseq.txt') + wundo! Xudupseq.undo + defer delete('Xudupseq.undo') + + " Overwrite the uh_seq of the second header with that of the first. A + " header starts with the magic bytes 0x5f 0xd0, followed by four 4-byte + " header references and then the 4-byte uh_seq. Require the references + " and uh_seq to be small numbers, so that a timestamp that happens to + " contain the magic bytes is not mistaken for a header. + let blob = readfile('Xudupseq.undo', 'B') + let headers = [] + for i in range(len(blob) - 22) + if blob[i] == 0x5f && blob[i + 1] == 0xd0 + let ok = v:true + for field in range(5) + let off = i + 2 + field * 4 + if blob[off] != 0 || blob[off + 1] != 0 || blob[off + 2] != 0 + \ || blob[off + 3] > 8 + let ok = v:false + break + endif + endfor + if ok + call add(headers, i) + endif + endif + endfor + call assert_true(len(headers) >= 2, 'found undo file headers') + let first = headers[0] + 18 + let second = headers[1] + 18 + " Check that the detected headers are the intended ones before patching + " any bytes: the headers are written oldest first, so the first two carry + " sequence numbers 1 and 2. + call assert_equal(0z00000001, blob[first : first + 3]) + call assert_equal(0z00000002, blob[second : second + 3]) + let blob[second : second + 3] = blob[first : first + 3] + call writefile(blob, 'Xudupseq.undo') + call assert_fails('rundo Xudupseq.undo', 'E825:') + + bwipe! +endfunc + +" Test reading an undo file with zero undo headers, which is written when +" only the line for the "U" command is saved, e.g. with 'undolevels' -1. +func Test_undofile_zero_headers() + CheckFeature persistent_undo + let save_ul = &undolevels + defer execute('let &undolevels = ' .. save_ul) + " The buffer must not collect any undo header, so create the file on disk + " directly and only change the buffer with 'undolevels' already negative. + call writefile(['hello', 'world'], 'Xuzero.txt', 'D') + set undolevels=-1 + edit Xuzero.txt + normal! x + wundo! Xuzero.undo + defer delete('Xuzero.undo') + bwipe! + + " Make the same change so that the buffer text matches the hash stored in + " the undo file, then read the undo file back. + edit Xuzero.txt + normal! x + let v:errmsg = '' + " a silent rejection of the undo file gives a warning, not an error + let v:warningmsg = '' + rundo Xuzero.undo + call assert_equal('', v:errmsg) + call assert_equal('', v:warningmsg) + normal! U + call assert_equal('hello', getline(1)) + + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/undo.c b/src/undo.c index 748b38054d..5dc154cc2e 100644 --- a/src/undo.c +++ b/src/undo.c @@ -1816,6 +1816,44 @@ u_write_undo( vim_free(file_name); } +/* + * Compare undo headers on the sequence number, for sorting uhp_table in + * u_read_undo(). + */ + static int +uhp_seq_cmp(const void *v1, const void *v2) +{ + const u_header_T *u1 = *(u_header_T **)v1; + const u_header_T *u2 = *(u_header_T **)v2; + + return u1->uh_seq == u2->uh_seq ? 0 : u1->uh_seq > u2->uh_seq ? 1 : -1; +} + +/* + * Find the header with sequence number "seq" in "uhp_table", which has + * "num_head" entries and is sorted on uh_seq. + * Return the table index of the header or -1 when not found. + */ + static long +uhp_table_find(u_header_T **uhp_table, long num_head, long seq) +{ + long lo = 0; + long hi = num_head - 1; + + while (lo <= hi) + { + long mid = lo + (hi - lo) / 2; + + if (uhp_table[mid]->uh_seq < seq) + lo = mid + 1; + else if (uhp_table[mid]->uh_seq > seq) + hi = mid - 1; + else + return mid; + } + return -1; +} + /* * Load the undo tree from an undo file. * If "name" is not NULL use it as the undo file name. This also means being @@ -1837,10 +1875,10 @@ u_read_undo(char_u *name, char_u *hash, char_u *orig_name UNUSED) long old_header_seq, new_header_seq, cur_header_seq; long seq_last, seq_cur; long last_save_nr = 0; - short old_idx = -1, new_idx = -1, cur_idx = -1; + long old_idx = -1, new_idx = -1, cur_idx = -1; long num_read_uhps = 0; time_t seq_time; - int i, j; + long i; int c; u_header_T *uhp; u_header_T **uhp_table = NULL; @@ -2067,69 +2105,49 @@ u_read_undo(char_u *name, char_u *hash, char_u *orig_name UNUSED) # define SET_FLAG(j) # endif - // We have put all of the headers into a table. Now we iterate through the - // table and swizzle each sequence number we have stored in uh_*_seq into - // a pointer corresponding to the header with that sequence number. - for (i = 0; i < num_head; i++) + // We have put all of the headers into a table. Each header stores the + // sequence numbers of the headers it links to; resolve those into + // pointers. Sort the table on uh_seq once, so that every lookup is a + // binary search instead of a linear scan, which would be quadratic + // overall. Every entry is non-NULL: a header that failed to + // unserialize or a count mismatch was an error above. + if (num_head > 0) + qsort(uhp_table, (size_t)num_head, sizeof(u_header_T *), uhp_seq_cmp); + + // In the sorted table two headers with the same uh_seq are neighbours. + for (i = 0; i < num_head - 1; i++) { - uhp = uhp_table[i]; - if (uhp == NULL) - continue; - for (j = 0; j < num_head; j++) - if (uhp_table[j] != NULL && i != j - && uhp_table[i]->uh_seq == uhp_table[j]->uh_seq) - { - corruption_error("duplicate uh_seq", file_name); - goto error; - } + if (uhp_table[i]->uh_seq == uhp_table[i + 1]->uh_seq) { - int seq = uhp->uh_next.seq; - uhp->uh_next.ptr = NULL; - for (j = 0; j < num_head; j++) - if (uhp_table[j] != NULL && i != j - && uhp_table[j]->uh_seq == seq) - { - uhp->uh_next.ptr = uhp_table[j]; - SET_FLAG(j); - break; - } - } - { - int seq = uhp->uh_prev.seq; - uhp->uh_prev.ptr = NULL; - for (j = 0; j < num_head; j++) - if (uhp_table[j] != NULL && i != j - && uhp_table[j]->uh_seq == seq) - { - uhp->uh_prev.ptr = uhp_table[j]; - SET_FLAG(j); - break; - } - } - { - int seq = uhp->uh_alt_next.seq; - uhp->uh_alt_next.ptr = NULL; - for (j = 0; j < num_head; j++) - if (uhp_table[j] != NULL && i != j - && uhp_table[j]->uh_seq == seq) - { - uhp->uh_alt_next.ptr = uhp_table[j]; - SET_FLAG(j); - break; - } - } - { - int seq = uhp->uh_alt_prev.seq; - uhp->uh_alt_prev.ptr = NULL; - for (j = 0; j < num_head; j++) - if (uhp_table[j] != NULL && i != j - && uhp_table[j]->uh_seq == seq) - { - uhp->uh_alt_prev.ptr = uhp_table[j]; - SET_FLAG(j); - break; - } + corruption_error("duplicate uh_seq", file_name); + goto error; } + } + + // Resolve the sequence number "link".seq into a pointer to the header + // with that number. A number that does not match any header, including + // zero (written for a NULL pointer) and the own sequence number of the + // header "hidx", resolves to NULL. +# define SWIZZLE_SEQ(link, hidx) \ + do { \ + long fidx = uhp_table_find(uhp_table, num_head, (link).seq); \ + \ + if (fidx >= 0 && fidx != (hidx)) \ + { \ + (link).ptr = uhp_table[fidx]; \ + SET_FLAG(fidx); \ + } \ + else \ + (link).ptr = NULL; \ + } while (0) + + for (i = 0; i < num_head; i++) + { + uhp = uhp_table[i]; + SWIZZLE_SEQ(uhp->uh_next, i); + SWIZZLE_SEQ(uhp->uh_prev, i); + SWIZZLE_SEQ(uhp->uh_alt_next, i); + SWIZZLE_SEQ(uhp->uh_alt_prev, i); if (old_header_seq > 0 && old_idx < 0 && uhp->uh_seq == old_header_seq) { old_idx = i; @@ -2146,6 +2164,7 @@ u_read_undo(char_u *name, char_u *hash, char_u *orig_name UNUSED) SET_FLAG(i); } } +# undef SWIZZLE_SEQ // Now that we have read the undo info successfully, free the current undo // info and use the info from the file. diff --git a/src/version.c b/src/version.c index 3401ba30b0..45ddeda961 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 935, /**/ 934, /**/ From 5f54b1dc4cc87e7825f7585dc73a488e67985915 Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Tue, 11 Aug 2026 18:28:47 +0000 Subject: [PATCH 331/647] patch 9.2.0936: stringifying a list or dict can free the item being iterated Problem: match(), matchstr(), matchend(), matchlist() and matchstrpos() over a list, join() of a list, and string() or :echo of a list or dict stringify each item while iterating over the container. For an object item this runs the user-defined string() method, which can remove the item the loop is standing on, or grow a dict so its hash table is reallocated, leaving the loop reading freed memory. Solution: Lock the container while iterating, so a change from the string() method fails with E741 instead of corrupting the iterator, the same way filter(), map(), sort() and reduce() already do. For a dict also hash_lock() it, so growing it cannot reallocate the hash table, mirroring the dict path of filter()/map() (Samuel Schlesinger). find_some_match() in evalfunc.c, list_join_inner() in list.c and dict2string() in dict.c each iterated a container while calling echo_string(); list_reduce() was the existing pattern they were missing. Add tests: match() and matchstr() over a list, join() and string() of a list, and string() of a dict, each with an object whose string() method mutates the container; every one crashes an unpatched Vim. closes: #21001 Co-Authored-By: Claude Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/dict.c | 12 +++++ src/evalfunc.c | 13 ++++++ src/list.c | 11 +++++ src/testdir/test_functions.vim | 83 ++++++++++++++++++++++++++++++++++ src/version.c | 2 + 5 files changed, 121 insertions(+) diff --git a/src/dict.c b/src/dict.c index 5531cc72a0..029fcfe789 100644 --- a/src/dict.c +++ b/src/dict.c @@ -809,12 +809,22 @@ dict2string(typval_T *tv, int copyID, int restore_copyID) char_u *s; dict_T *d; int todo; + int prev_lock; if ((d = tv->vval.v_dict) == NULL) return NULL; ga_init2(&ga, sizeof(char), 80); ga_append(&ga, '{'); + // Lock the dictionary, so that user code that echo_string_core() below + // may invoke, such as the string() method of an object, cannot remove + // an item or add one and cause the hash table to be reallocated while + // we are iterating over it. + prev_lock = d->dv_lock; + if (d->dv_lock == 0) + d->dv_lock = VAR_LOCKED; + hash_lock(&d->dv_hashtab); + todo = (int)d->dv_hashtab.ht_used; FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo) { @@ -845,6 +855,8 @@ dict2string(typval_T *tv, int copyID, int restore_copyID) } } + hash_unlock(&d->dv_hashtab); + d->dv_lock = prev_lock; if (todo > 0) { vim_free(ga.ga_data); diff --git a/src/evalfunc.c b/src/evalfunc.c index 23dc21e95c..472b2fe02a 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -9256,6 +9256,7 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type) list_T *l = NULL; listitem_T *li = NULL; long idx = 0; + int prev_lock = 0; char_u *tofree = NULL; // Make 'cpoptions' empty, the 'l' flag should not be used here. @@ -9358,6 +9359,16 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type) { regmatch.rm_ic = p_ic; + // Lock the list, so that the item the loop is standing on cannot + // be freed by user code that echo_string() below may invoke: the + // string() method of an object could remove the item. + if (l != NULL) + { + prev_lock = l->lv_lock; + if (l->lv_lock == 0) + l->lv_lock = VAR_LOCKED; + } + for (;;) { if (l != NULL) @@ -9460,6 +9471,8 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type) rettv->vval.v_number += (varnumber_T)(str - expr); } } + if (l != NULL) + l->lv_lock = prev_lock; vim_regfree(regmatch.regprog); } diff --git a/src/list.c b/src/list.c index e400cb096f..82243c82bb 100644 --- a/src/list.c +++ b/src/list.c @@ -1528,6 +1528,7 @@ list_join_inner( join_T *p; long sumlen = 0; int first = TRUE; + int prev_lock; char_u *tofree; char_u numbuf[NUMBUFLEN]; listitem_T *item; @@ -1536,12 +1537,21 @@ list_join_inner( // Stringify each item in the list. CHECK_LIST_MATERIALIZE(l); + // Lock the list, so that the item the loop is standing on cannot be + // freed by user code that echo_string_core() below may invoke: the + // string() method of an object could remove the item. + prev_lock = l->lv_lock; + if (l->lv_lock == 0) + l->lv_lock = VAR_LOCKED; for (item = l->lv_first; item != NULL && !got_int; item = item->li_next) { s.string = echo_string_core(&item->li_tv, &tofree, numbuf, copyID, echo_style, restore_copyID, !echo_style); if (s.string == NULL) + { + l->lv_lock = prev_lock; return FAIL; + } s.length = STRLEN(s.string); sumlen += (long)s.length; @@ -1565,6 +1575,7 @@ list_join_inner( if (did_echo_string_emsg) // recursion error, bail out break; } + l->lv_lock = prev_lock; // Allocate result buffer with its total size, avoid re-allocation and // multiple copy operations. Add 2 for a tailing ']' and NUL. diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 2f2a7fc5f6..3aec6c5240 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -1253,6 +1253,89 @@ func Test_matchstrpos() call assert_equal(['', -1, -1], matchstrpos(test_null_list(), '\a')) endfunc +" While match() iterates over a list, stringifying an item can run the +" string() method of an object, which must not be able to free the item +" the loop is standing on. +func Test_match_list_changed_while_matching() + let lines =<< trim END + vim9script + class C + def string(): string + if !g:removed + g:removed = true + remove(g:mlist, 0) + endif + return 'nostring' + enddef + endclass + g:mlist = [C.new(), C.new(), C.new()] + END + call writefile(lines, 'Xmatchmutate.vim', 'D') + let g:removed = v:false + source Xmatchmutate.vim + call assert_fails('call match(g:mlist, "xyz")', 'E741:') + call assert_equal(3, len(g:mlist)) + let g:removed = v:false + call assert_fails('call matchstr(g:mlist, "xyz")', 'E741:') + call assert_equal(3, len(g:mlist)) + unlet g:mlist g:removed +endfunc + +" Same for join() and string(): stringifying an item can run the string() +" method of an object, which must not be able to free the item the loop is +" standing on. +func Test_join_list_changed_while_stringified() + let lines =<< trim END + vim9script + class C + def string(): string + if !g:removed + g:removed = true + remove(g:jlist, 0) + endif + return 'nostring' + enddef + endclass + g:jlist = [C.new(), C.new(), C.new()] + END + call writefile(lines, 'Xjoinmutate.vim', 'D') + let g:removed = v:false + source Xjoinmutate.vim + call assert_fails('call join(g:jlist, ",")', 'E741:') + call assert_equal(3, len(g:jlist)) + let g:removed = v:false + call assert_fails('call string(g:jlist)', 'E741:') + call assert_equal(3, len(g:jlist)) + unlet g:jlist g:removed +endfunc + +" Same for a dict: stringifying a value can run the string() method of an +" object, which must not be able to remove an item and free it, or grow the +" dict and reallocate the hash table, while it is being iterated over. +func Test_dict_changed_while_stringified() + let lines =<< trim END + vim9script + class C + def string(): string + if !g:removed + g:removed = true + for k in keys(g:d) + remove(g:d, k) + endfor + endif + return 'nostring' + enddef + endclass + g:d = {'a': C.new(), 'b': C.new(), 'c': C.new()} + END + call writefile(lines, 'Xdictmutate.vim', 'D') + let g:removed = v:false + source Xdictmutate.vim + call assert_fails('call string(g:d)', 'E741:') + call assert_equal(3, len(g:d)) + unlet g:d g:removed +endfunc + " Test for matchstrlist() func Test_matchstrlist() let lines =<< trim END diff --git a/src/version.c b/src/version.c index 45ddeda961..2cbf92a2e2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 936, /**/ 935, /**/ From c8c59db9dfdc2db5f17aa0a78ea1464f035bdf5e Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Tue, 11 Aug 2026 19:03:55 +0000 Subject: [PATCH 332/647] patch 9.2.0937: sort() with a numeric option converts each item on every comparison Problem: sort() with "n", "N" or "f" converts an item to its number on every comparison. For "n" that is a tv2string() plus strtod() per comparison, so sorting a list of numbers turns each number into a string and back O(n log n) times, dwarfing the sort. Solution: Compute the numeric key of each item once, before the sort, and compare the stored key (Samuel Schlesinger). Only the builtin numeric compare modes are affected; uniq(), which passes a bare list item to the compare function, and the string and user-function paths are unchanged. Sorting a list of 100000 numbers (min of 3, macOS arm64): - sort(l, 'n'): 0.205s -> 0.017s - sort(l, 'N'): 0.017s -> 0.010s - sort(l, 'f'): 0.014s -> 0.010s The result is identical, including that a string is still treated as 0 in "n" mode and that "N" keeps full 64-bit precision. Add Test_sort_numeric_precomputed(): a large shuffled list sorted with "n", mixed integers and floats, int64 values beyond the exact range of a double for "N", and uniq() over the non-precomputed path. closes: #21003 Co-Authored-By: Claude Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/list.c | 85 +++++++++++++++++++++++++++++++++++++-- src/testdir/test_sort.vim | 31 ++++++++++++++ src/version.c | 2 + 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/src/list.c b/src/list.c index 82243c82bb..7926128743 100644 --- a/src/list.c +++ b/src/list.c @@ -2077,6 +2077,14 @@ typedef struct { listitem_T *item; int idx; + // Sort key precomputed once per item for the numeric compare modes, so + // item_compare() does not convert the value on every comparison. Only + // valid when sortinfo->item_compare_keys_ready is set (the sort() path); + // uniq() passes a bare listitem_T pointer and must not read this. + union { + varnumber_T inum; // for item_compare_numbers ("N") + double fnum; // for item_compare_numeric ("n") and _float ("f") + } key; } sortItem_T; // struct storing information about current sort @@ -2092,6 +2100,7 @@ typedef struct dict_T *item_compare_selfdict; int item_compare_func_err; int item_compare_keep_zero; + int item_compare_keys_ready; // ptrs[].key is precomputed } sortinfo_T; static sortinfo_T *sortinfo = NULL; #define ITEM_COMPARE_FAIL 999 @@ -2117,20 +2126,35 @@ item_compare(const void *s1, const void *s2) if (sortinfo->item_compare_numbers) { - varnumber_T v1 = tv_to_number(tv1); - varnumber_T v2 = tv_to_number(tv2); + varnumber_T v1 = sortinfo->item_compare_keys_ready + ? si1->key.inum : tv_to_number(tv1); + varnumber_T v2 = sortinfo->item_compare_keys_ready + ? si2->key.inum : tv_to_number(tv2); return v1 == v2 ? 0 : v1 > v2 ? 1 : -1; } if (sortinfo->item_compare_float) { - float_T v1 = tv_get_float(tv1); - float_T v2 = tv_get_float(tv2); + float_T v1 = sortinfo->item_compare_keys_ready + ? si1->key.fnum : tv_get_float(tv1); + float_T v2 = sortinfo->item_compare_keys_ready + ? si2->key.fnum : tv_get_float(tv2); return v1 == v2 ? 0 : v1 > v2 ? 1 : -1; } + if (sortinfo->item_compare_numeric && sortinfo->item_compare_keys_ready) + { + double n1 = si1->key.fnum; + double n2 = si2->key.fnum; + + res = n1 == n2 ? 0 : n1 > n2 ? 1 : -1; + if (res == 0 && !sortinfo->item_compare_keep_zero) + res = si1->idx > si2->idx ? 1 : -1; + return res; + } + // tv2string() puts quotes around a string and allocates memory. Don't do // that for string variables. Use a single quote when comparing with a // non-string to do what the docs promise. @@ -2240,6 +2264,51 @@ item_compare2(const void *s1, const void *s2) return res; } +/* + * Precompute the numeric sort key of each item, so that item_compare() can + * compare the stored value instead of converting the item on every one of the + * O(n log n) comparisons. Only for the builtin numeric compare modes; each + * key is computed exactly as item_compare() would have, once per item. + */ + static void +sort_compute_keys(sortItem_T *ptrs, long len, sortinfo_T *info) +{ + long i; + + if (info->item_compare_numbers) + { + for (i = 0; i < len; ++i) + ptrs[i].key.inum = tv_to_number(&ptrs[i].item->li_tv); + } + else if (info->item_compare_float) + { + for (i = 0; i < len; ++i) + ptrs[i].key.fnum = tv_get_float(&ptrs[i].item->li_tv); + } + else // info->item_compare_numeric + { + for (i = 0; i < len; ++i) + { + typval_T *tv = &ptrs[i].item->li_tv; + + // A string is compared as a single quote in numeric mode, which + // strtod() reads as 0; only numbers contribute a value. + if (tv->v_type == VAR_STRING) + ptrs[i].key.fnum = 0.0; + else + { + char_u numbuf[NUMBUFLEN]; + char_u *tofree = NULL; + char_u *p = tv2string(tv, &tofree, numbuf, 0); + + ptrs[i].key.fnum = p == NULL ? 0.0 : strtod((char *)p, NULL); + vim_free(tofree); + } + } + } + info->item_compare_keys_ready = TRUE; +} + /* * sort() List "l" */ @@ -2268,6 +2337,13 @@ do_sort(list_T *l, sortinfo_T *info) info->item_compare_func_err = FALSE; info->item_compare_keep_zero = FALSE; + info->item_compare_keys_ready = FALSE; + // For the builtin numeric compares, precompute each item's key once + // instead of converting it on every comparison. + if (info->item_compare_func == NULL && info->item_compare_partial == NULL + && (info->item_compare_numbers || info->item_compare_float + || info->item_compare_numeric)) + sort_compute_keys(ptrs, len, info); // test the compare function if ((info->item_compare_func != NULL || info->item_compare_partial != NULL) @@ -2369,6 +2445,7 @@ parse_sort_uniq_args(typval_T *argvars, sortinfo_T *info) info->item_compare_func = NULL; info->item_compare_partial = NULL; info->item_compare_selfdict = NULL; + info->item_compare_keys_ready = FALSE; if (argvars[1].v_type == VAR_UNKNOWN) return OK; diff --git a/src/testdir/test_sort.vim b/src/testdir/test_sort.vim index 1c60e8e42a..8ec89f25a5 100644 --- a/src/testdir/test_sort.vim +++ b/src/testdir/test_sort.vim @@ -53,6 +53,9 @@ func Test_sort_numeric() call assert_equal([3, 13, 28], sort([13, 28, 3], 'n')) " strings are not sorted call assert_equal(['13', '28', '3'], sort(['13', '28', '3'], 'n')) + " a string sorts as 0 in "n" mode, even a numeric-looking one + call assert_equal(['a', 0, 1], sort([1, 'a', 0], 'n')) + call assert_equal(['10', 2], sort([2, '10'], 'n')) endfunc func Test_sort_numbers() @@ -66,6 +69,34 @@ func Test_sort_float() call assert_equal([0.28, 3, 13.5], sort([13.5, 0.28, 3], 'f')) endfunc +" The numeric compare modes precompute a sort key per item; exercise that on +" larger lists (many comparisons), with mixed int/float, negatives, and +" int64 values that do not fit in a double for 'N'. +func Test_sort_numeric_precomputed() + " 'n' on a large shuffled list, compared against the known order. + let expected = range(500) + let shuffled = copy(expected) + " deterministic shuffle + let s = 7 + for i in range(len(shuffled) - 1, 1, -1) + let s = (s * 1103515245 + 12345) % 2147483648 + let j = s % (i + 1) + let [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]] + endfor + call assert_equal(expected, sort(shuffled, 'n')) + + " 'n' with mixed integers and floats and negatives. + call assert_equal([-3, -1.5, 0, 0.5, 2, 7.25], sort([7.25, -1.5, 2, 0, -3, 0.5], 'n')) + + " 'N' with int64 values beyond the exact range of a double: keys must not + " be rounded through a double. + call assert_equal([9007199254740992, 9007199254740993, 9007199254740994], + \ sort([9007199254740994, 9007199254740992, 9007199254740993], 'N')) + + " uniq() uses the non-precomputed path; it must still work. + call assert_equal([1, 2, 3], uniq(sort([3, 1, 2, 2, 3, 1], 'n'))) +endfunc + func Test_sort_nested() " test ability to call sort() from a compare function call assert_equal([1, 3, 5], sort([3, 1, 5], 'Compare1')) diff --git a/src/version.c b/src/version.c index 2cbf92a2e2..a5cb9e1ddd 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 937, /**/ 936, /**/ From 2045a20d4bf604c47828bfc22d2da25f0294bc01 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 11 Aug 2026 19:10:19 +0000 Subject: [PATCH 333/647] patch 9.2.0938: cursorbind: cursor in the other window is not updated after undo Problem: In diff mode with 'cursorbind' the cursor in the other window is not updated after an undo that changes which lines correspond. Solution: Also check whether the text changed before skipping the update (Hirohito Higashi). fixes: #20982 related: #13219 related: #13210 closes: #21004 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/move.c | 10 +++++++++- src/testdir/test_diffmode.vim | 25 +++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/move.c b/src/move.c index 6e7921cc2b..635e63eb28 100644 --- a/src/move.c +++ b/src/move.c @@ -3408,11 +3408,19 @@ pagescroll(int dir, long count, int half) do_check_cursorbind(void) { static win_T *prev_curwin = NULL; + static buf_T *prev_curbuf = NULL; + static varnumber_T prev_changedtick = 0; static pos_T prev_cursor = {0, 0, 0}; - if (curwin == prev_curwin && EQUAL_POS(curwin->w_cursor, prev_cursor)) + // Nothing to do when the cursor didn't move and the text didn't change. + // After a change the corresponding line in a diff may be different. + if (curwin == prev_curwin && curbuf == prev_curbuf + && CHANGEDTICK(curbuf) == prev_changedtick + && EQUAL_POS(curwin->w_cursor, prev_cursor)) return; prev_curwin = curwin; + prev_curbuf = curbuf; + prev_changedtick = CHANGEDTICK(curbuf); prev_cursor = curwin->w_cursor; linenr_T line = curwin->w_cursor.lnum; diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim index 7fc4a32483..7165e19d87 100644 --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -3646,4 +3646,29 @@ func Test_diffput_to_empty_buf() call StopVimInTerminal(buf) endfunc +" Undo can change which lines correspond in a diff. 'cursorbind' must update +" the other window even when the cursor here did not move. +func Test_diff_cursorbind_after_undo() + call setline(1, ['x', 'y', 'c', 'd']) + let w1 = win_getid() + new + call setline(1, ['p', 'q', 'c', 'd']) + let w2 = win_getid() + windo diffthis + call win_gotoid(w1) + + normal! 2dd + call assert_equal(1, line('.', w1)) + call assert_equal(1, line('.', w2)) + normal! jk + call assert_equal(1, line('.', w1)) + call assert_equal(3, line('.', w2)) + + normal! u + call assert_equal(1, line('.', w1)) + call assert_equal(1, line('.', w2)) + + %bw! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a5cb9e1ddd..48a1faf0fb 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 938, /**/ 937, /**/ From 0cdcd95cc2f6a000aafe084f31299cc69affc139 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 11 Aug 2026 19:16:00 +0000 Subject: [PATCH 334/647] patch 9.2.0939: mbyte: wrong cell count for an overlong UTF-8 sequence Problem: An overlong UTF-8 encoding of an unprintable ASCII character is displayed as but counted as two screen cells, so that the cursor ends up in the wrong position when editing the line. Solution: Count four cells for an unprintable overlong sequence. fixes: #20988 closes: #21005 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/mbyte.c | 4 ++-- src/testdir/test_utf8.vim | 16 ++++++++++++++++ src/version.c | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mbyte.c b/src/mbyte.c index 54ee229a1a..e196f30cae 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -1645,7 +1645,7 @@ utf_ptr2cells( return 4; // If the char is ASCII it must be an overlong sequence. if (c < 0x80) - return char2cells(c); + return vim_isprintc(c) ? char2cells(c) : 4; return utf_char2cells(c); } return 1; @@ -1689,7 +1689,7 @@ utf_ptr2cells_len(char_u *p, int size) return 4; // If the char is ASCII it must be an overlong sequence. if (c < 0x80) - return char2cells(c); + return vim_isprintc(c) ? char2cells(c) : 4; return utf_char2cells(c); } return 1; diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim index a0cd5bd79f..3070d4cc4b 100644 --- a/src/testdir/test_utf8.vim +++ b/src/testdir/test_utf8.vim @@ -372,4 +372,20 @@ func Test_print_overlong() bwipe! endfunc +" The cell count of an overlong encoded character must match what is drawn. +func Test_overlong_utf8_cells() + call assert_equal(4, strdisplaywidth("\xc0\x81")) " <01> + call assert_equal(4, strdisplaywidth("\xe0\x80\x81")) " <01>, three bytes + call assert_equal(4, strdisplaywidth("\xc1\xbf")) " <7f> + call assert_equal(4, strdisplaywidth("\xc0\x89")) " <09>, not a Tab + + new + call setline(1, "\xc1\x81\xc0\x81\xc0\x80") + call assert_equal('A<01><00>', ScreenLines(1, 9)[0]) + normal! $ + call assert_equal(5, col('.')) + call assert_equal([6, 9], virtcol('.', v:true)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 48a1faf0fb..6405f229e6 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 939, /**/ 938, /**/ From 67eee0fc0d7e680ce0837f088e490c1c43258297 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 11 Aug 2026 19:21:08 +0000 Subject: [PATCH 335/647] patch 9.2.0940: GTK4: columns are lost when a scrollbar appears Problem: With the GTK4 GUI the shell loses columns every time a window is split, so that the text area keeps getting narrower. Solution: Ignore a size allocation that was computed before the size that was last asked for, instead of computing Rows and Columns from the old size together with the new base size. closes: #21006 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui.h | 7 +++++++ src/gui_gtk4.c | 7 +++++++ src/gui_gtk4_f.c | 14 ++++++++++++++ src/version.c | 2 ++ 4 files changed, 30 insertions(+) diff --git a/src/gui.h b/src/gui.h index 5be8d0fd9b..280215515b 100644 --- a/src/gui.h +++ b/src/gui.h @@ -505,6 +505,13 @@ typedef struct Gui #if defined(FEAT_GUI_GTK) && defined(USE_GTK4) int decor_height; + // Size of the form widget last asked for with gui_mch_set_shellsize(). + // "pending_form_skip" counts how many allocations that do not answer it + // may still be ignored. + int pending_form_w; + int pending_form_h; + int pending_form_skip; + // Used for clipboard functionality in GTK4 GUI GdkContentProvider *regular_provider; GdkContentProvider *primary_provider; diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index c2f2564e6f..d128a6b999 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -959,6 +959,13 @@ gui_mch_set_shellsize(int width, int height, int base_width UNUSED, int base_height UNUSED, int direction UNUSED) { + // Remember the size the form widget is supposed to get. An allocation + // that arrives before the compositor has answered this request still has + // the previous size and must not be used. + gui.pending_form_w = width; + gui.pending_form_h = height; + gui.pending_form_skip = 1; + width += get_menu_tool_width(); height += get_menu_tool_height(); diff --git a/src/gui_gtk4_f.c b/src/gui_gtk4_f.c index 195749d2a5..e61092c669 100644 --- a/src/gui_gtk4_f.c +++ b/src/gui_gtk4_f.c @@ -216,7 +216,21 @@ vim_form_resize_idle_cb(VimForm *self) goto exit; if (self->last_width > 1 && self->last_height > 1) + { + // Ignore an allocation that does not answer the size that was last + // asked for: it was computed before the request and using it would + // compute Rows and Columns from the old size together with the new + // base size, losing columns. Give up after one allocation in case + // the request is never answered exactly. + if (gui.pending_form_w > 0 + && (self->last_width != gui.pending_form_w + || self->last_height != gui.pending_form_h) + && --gui.pending_form_skip >= 0) + goto exit; + + gui.pending_form_w = 0; gui_resize_shell(self->last_width, self->last_height); + } exit: g_object_unref(self); diff --git a/src/version.c b/src/version.c index 6405f229e6..5ea5c96e22 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 940, /**/ 939, /**/ From ed5302530bf379b295db2d1eb5731d4ce5173fbb Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 11 Aug 2026 19:27:07 +0000 Subject: [PATCH 336/647] patch 9.2.0941: tests: clipboard tests fail in the GUI when the terminal has no clipboard Problem: Tests that need the clipboard in a Vim started with RunVimInTerminal() are not skipped when only the Vim running the tests has a clipboard, which is always the case in the GUI. Solution: Add CheckClipboardInTerminal to ask a Vim started the same way whether it can use the clipboard. (Hirohito Higashi). closes: #21008 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/testdir/test_hlsearch.vim | 1 + src/testdir/test_popupwin.vim | 1 + src/testdir/util/check.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 23 insertions(+) diff --git a/src/testdir/test_hlsearch.vim b/src/testdir/test_hlsearch.vim index 8bf7f0aaeb..df54b8b892 100644 --- a/src/testdir/test_hlsearch.vim +++ b/src/testdir/test_hlsearch.vim @@ -95,6 +95,7 @@ func Test_hlsearch_clipboard() CheckScreendump CheckRunVimInTerminal CheckFeature clipboard_working + CheckClipboardInTerminal let lines =<< trim END set incsearch hlsearch diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 61af5e050a..e751d82dcd 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -921,6 +921,7 @@ endfunc func Test_popup_select() CheckScreendump CheckFeature clipboard_working + CheckClipboardInTerminal " create a popup with some text to be selected let lines =<< trim END diff --git a/src/testdir/util/check.vim b/src/testdir/util/check.vim index 47fea7edf3..7400563f5c 100644 --- a/src/testdir/util/check.vim +++ b/src/testdir/util/check.vim @@ -193,6 +193,25 @@ func CheckRunVimInTerminal() endif endfunc +" Command to check that the Vim started by RunVimInTerminal() can use the +" clipboard. Checking 'clipboard_working' of the Vim that runs the tests is +" not enough: in the GUI that Vim always has a clipboard, while the Vim +" started in a terminal window may not have one. +command CheckClipboardInTerminal call CheckClipboardInTerminal() +func CheckClipboardInTerminal() + if !exists('s:clipboard_in_terminal') + call delete('Xclipcheck') + " "-v" is needed because in a GUI test run the command from "vimcmd" + " starts the GUI, which always has a clipboard. + call RunVim([], ['call writefile([has("clipboard_working")], "Xclipcheck")', 'qall!'], '-v') + let s:clipboard_in_terminal = filereadable('Xclipcheck') && readfile('Xclipcheck')->get(0, '0') == '1' + call delete('Xclipcheck') + endif + if !s:clipboard_in_terminal + throw 'Skipped: Vim in a terminal window cannot use the clipboard' + endif +endfunc + " Command to check that we can run the GUI command CheckCanRunGui call CheckCanRunGui() func CheckCanRunGui() diff --git a/src/version.c b/src/version.c index 5ea5c96e22..103220d09f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 941, /**/ 940, /**/ From a26ac23fe0df4da7e5068048546126df0f044ff2 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Tue, 11 Aug 2026 19:37:38 +0000 Subject: [PATCH 337/647] patch 9.2.0942: test: test_mksession_winpos() fails on GTK4 UI Problem: test: test_mksession_winpos() fails on GTK4 UI Solution: Skip the test on GTK4, since winpos is not supported there (Foxe Chen) closes: #21010 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/testdir/test_mksession.vim | 1 + src/version.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index c11e8b849c..5c191fffcd 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -1106,6 +1106,7 @@ endfunc func Test_mksession_winpos() " Only applicable in GUI Vim CheckGui + CheckNotFeature gui_gtk4 " window position does not work in gtk4 gui set sessionoptions+=winpos mksession! Xtest_mks.out diff --git a/src/version.c b/src/version.c index 103220d09f..ee33eafee2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 942, /**/ 941, /**/ From 59a4bab99f7943eef017a3dda858b08caa4082c7 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Tue, 11 Aug 2026 19:42:18 +0000 Subject: [PATCH 338/647] patch 9.2.0943: test: test_hardcopy fails on GTK4 UI Problem: test: test_hardcopy fails on GTK4 UI, because it opens a dialog Solution: Use :hardcopy! to skip the dialog, set GDK_DEBUG=no-portals environment variable (Foxe Chen) closes: #21009 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- .github/workflows/ci-linux.yml | 1 + .github/workflows/ci-linux_asan.yml | 1 + src/testdir/test_hardcopy.vim | 6 +++--- src/version.c | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index e91a267ac5..57e197a61b 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -29,6 +29,7 @@ jobs: DISPLAY: ":99" WAYLAND_DISPLAY: "/tmp/weston_sock" GTK_A11Y: "none" + GDK_DEBUG: "no-portals" DEBIAN_FRONTEND: noninteractive strategy: diff --git a/.github/workflows/ci-linux_asan.yml b/.github/workflows/ci-linux_asan.yml index cbba1c05a7..2b92ba1b21 100644 --- a/.github/workflows/ci-linux_asan.yml +++ b/.github/workflows/ci-linux_asan.yml @@ -27,6 +27,7 @@ jobs: DISPLAY: ":99" WAYLAND_DISPLAY: "/tmp/weston_sock" GTK_A11Y: "none" + GDK_DEBUG: "no-portals" DEBIAN_FRONTEND: noninteractive strategy: diff --git a/src/testdir/test_hardcopy.vim b/src/testdir/test_hardcopy.vim index 62065139c7..94a2526372 100644 --- a/src/testdir/test_hardcopy.vim +++ b/src/testdir/test_hardcopy.vim @@ -118,7 +118,7 @@ func Test_printexpr() set printexpr=PrintFile(v:fname_in) help help - hardcopy dummy args + hardcopy! dummy args call assert_equal(['Test printexpr: dummy args'], \ readfile('Xhardcopy_printexpr')) call delete('Xhardcopy_printexpr') @@ -129,7 +129,7 @@ func Test_printexpr() return 1 endfunc set printexpr=PrintFails(v:fname_in) - call assert_fails('hardcopy', 'E365:') + call assert_fails('hardcopy!', 'E365:') " Using a script-local function func s:NewPrintExpr() @@ -175,7 +175,7 @@ func Test_empty_buffer() HasPostscript new - call assert_equal("\nNo text to be printed", execute('hardcopy')) + call assert_equal("\nNo text to be printed", execute('hardcopy!')) bwipe endfunc diff --git a/src/version.c b/src/version.c index ee33eafee2..320a46c3ff 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 943, /**/ 942, /**/ From c6b041c6391e0a6211458af22f669ef5f4457487 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 11 Aug 2026 19:49:28 +0000 Subject: [PATCH 339/647] CI: Keep the GTK4 job from affecting the other jobs The GTK4 job added in 9.2.0931 timed out after 30 minutes on every run. The tests did not hang, they were retried: 82 test functions failed under GTK4 against two in the otherwise identical GTK3 job, and runtest.vim runs a flaky test up to five times with a sleep in between. Raising the Test step timeout from 20 to 30 minutes for this made it apply to every other job as well. Once the columns are no longer lost when a window is split the job needs about sixteen minutes, so put the limit back to 20. Twelve tests still fail, among them Test_hlsearch_clipboard and Test_popup_select, which need a working clipboard; this is the only job that runs a Wayland compositor. Let the job fail without failing the workflow until that is sorted out. The Build step stays blocking, so a broken GTK4 build is still reported. Also drop coverage from the job. The GTK3 job runs the same "make testgui" with coverage enabled, so the instrumentation only makes this job slower. closes: #21007 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- .github/workflows/ci-linux.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 57e197a61b..841acb96ae 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -70,7 +70,6 @@ jobs: extra: [uchar, testgui] - features: huge compiler: gcc - coverage: true interface: dynamic extra: [uchar, testgui, use_gtk4] - features: huge @@ -108,7 +107,11 @@ jobs: coverage: ${{ matrix.coverage }} - name: Test - timeout-minutes: 30 + timeout-minutes: 20 + # The GTK4 GUI is not stable enough yet to block the other jobs: it + # is the only job that runs a Wayland compositor, which makes + # 'clipboard' behave differently. + continue-on-error: ${{ contains(matrix.extra, 'use_gtk4') }} run: make ${SHADOWOPT} ${TEST} # Enable to debug failing tests live and ssh into the CI runners From d563075a6514b2e24088bd05409782694765a3a4 Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Wed, 12 Aug 2026 18:27:13 +0000 Subject: [PATCH 340/647] patch 9.2.0944: test: tests fail when checking for GTK4 feature Problem: test: tests fail when checking for GTK4 feature (after v9.2.0942) Solution: Remove trailing comment, mark a few tests flaky when running in GTK4 UI, disable error messages when connecting to socket server, skip Test_win_gotoid_in_mapping in GTK4 UI (Foxe Chen). closes: #21015 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/socketserver.c | 2 ++ src/testdir/test_gui.vim | 10 ++++++++++ src/testdir/test_mksession.vim | 3 ++- src/testdir/test_vim9_builtin.vim | 1 + src/version.c | 2 ++ 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/socketserver.c b/src/socketserver.c index e693123e13..99ba2e3fc0 100644 --- a/src/socketserver.c +++ b/src/socketserver.c @@ -486,7 +486,9 @@ socketserver_get_path( if (new) { emsg_silent++; + emsg_off++; channel = channel_open_unix((char *)buf, NULL); + emsg_off--; emsg_silent--; if (channel != NULL) diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim index 0652d3de61..2c609af177 100644 --- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -1929,6 +1929,11 @@ func Test_geometry_exact_size() CheckCanRunGui CheckFeature gui_gtk + if has('gui_gtk4') + " Wayland is kinda finicky + let g:test_is_flaky = 1 + endif + let after =<< trim [CODE] call writefile([string(&columns), string(&lines)], 'Xtest_geomsize') qall @@ -1955,6 +1960,11 @@ func Test_tabnew_tabclose_size_stable() CheckCanRunGui CheckFeature gui_gtk + if has('gui_gtk4') + " Wayland is kinda finicky + let g:test_is_flaky = 1 + endif + let after =<< trim [CODE] let cols0 = &columns let rows0 = &lines diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 5c191fffcd..2405289b75 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -1106,7 +1106,8 @@ endfunc func Test_mksession_winpos() " Only applicable in GUI Vim CheckGui - CheckNotFeature gui_gtk4 " window position does not work in gtk4 gui + " Window position does not work in gtk4 gui + CheckNotFeature gui_gtk4 set sessionoptions+=winpos mksession! Xtest_mks.out diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 7df789657a..350a790fbd 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -5150,6 +5150,7 @@ enddef func Test_win_gotoid_in_mapping() CheckScreendump + CheckClipboardInTerminal " requires a working clipboard and this doesn't work on MacOS if has('clipboard_working') && !has('mac') diff --git a/src/version.c b/src/version.c index 320a46c3ff..6c636db9aa 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 944, /**/ 943, /**/ From 90a9a8c7523741f4a9cd091a0f1727902e8c9340 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Wed, 12 Aug 2026 18:35:51 +0000 Subject: [PATCH 341/647] runtime(algol68): Update syntax, fix syncing Use "fromstart" syncing. Pragment regions are delimited by shared start/end tokens which render other syncing types largely useless. A sync point located in the middle of a multiline comment cannot distinguish the end token from a start token and the erroneously created region runs to EOF. closes: #21032 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/algol68.vim | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/runtime/syntax/algol68.vim b/runtime/syntax/algol68.vim index 41b9797c51..9ad46066fe 100644 --- a/runtime/syntax/algol68.vim +++ b/runtime/syntax/algol68.vim @@ -3,14 +3,12 @@ " Version: 0.4 " Maintainer: Janis Papanagnou " Previous Maintainer: NevilleD.ALGOL_68@sgr-a.net -" Last Change: 2026 Jun 13 +" Last Change: 2026 Aug 12 if exists("b:current_syntax") finish endif -syn sync minlines=250 maxlines=500 - " Algol68 Final Report, unrevised syn keyword algol68PreProc PRIORITY syn keyword algol68Operator BTB CTB CONJ QUOTE CT CTAB EITHER SIGN @@ -487,6 +485,9 @@ if !exists("algol68_no_preludes") endif +" pragment regions with matching start/end tokens necessitate a full parse +syn sync fromstart + " Define the default highlighting. hi def link algol68Boolean Boolean hi def link algol68Comment Comment From 722f4292e55d48520b7e32cabb4b8640293d0977 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 18:38:28 +0000 Subject: [PATCH 342/647] patch 9.2.0945: sort() with a numeric option can be improved Problem: The comments on the precomputed sort keys explain the code by contrasting it with the previous implementation, and one of them exceeds 80 columns (after v9.2.0937). Solution: Drop the redundant comments and shorten the union member ones (Hirohito Higashi). related: #21003 closes: #21030 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/list.c | 22 +++++++++------------- src/version.c | 2 ++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/list.c b/src/list.c index 7926128743..7d57b125c4 100644 --- a/src/list.c +++ b/src/list.c @@ -2077,13 +2077,12 @@ typedef struct { listitem_T *item; int idx; - // Sort key precomputed once per item for the numeric compare modes, so - // item_compare() does not convert the value on every comparison. Only - // valid when sortinfo->item_compare_keys_ready is set (the sort() path); - // uniq() passes a bare listitem_T pointer and must not read this. + // Sort key precomputed once per item for the numeric compare modes. + // Only valid when sortinfo->item_compare_keys_ready is set (the sort() + // path); uniq() passes a bare listitem_T pointer and must not read this. union { - varnumber_T inum; // for item_compare_numbers ("N") - double fnum; // for item_compare_numeric ("n") and _float ("f") + varnumber_T inum; // for "N" + double fnum; // for "n" and "f" } key; } sortItem_T; @@ -2265,10 +2264,8 @@ item_compare2(const void *s1, const void *s2) } /* - * Precompute the numeric sort key of each item, so that item_compare() can - * compare the stored value instead of converting the item on every one of the - * O(n log n) comparisons. Only for the builtin numeric compare modes; each - * key is computed exactly as item_compare() would have, once per item. + * Precompute the numeric sort key of each item. Only for the builtin numeric + * compare modes; each key is computed exactly as item_compare() would have. */ static void sort_compute_keys(sortItem_T *ptrs, long len, sortinfo_T *info) @@ -2292,7 +2289,7 @@ sort_compute_keys(sortItem_T *ptrs, long len, sortinfo_T *info) typval_T *tv = &ptrs[i].item->li_tv; // A string is compared as a single quote in numeric mode, which - // strtod() reads as 0; only numbers contribute a value. + // strtod() reads as 0. if (tv->v_type == VAR_STRING) ptrs[i].key.fnum = 0.0; else @@ -2338,8 +2335,7 @@ do_sort(list_T *l, sortinfo_T *info) info->item_compare_func_err = FALSE; info->item_compare_keep_zero = FALSE; info->item_compare_keys_ready = FALSE; - // For the builtin numeric compares, precompute each item's key once - // instead of converting it on every comparison. + if (info->item_compare_func == NULL && info->item_compare_partial == NULL && (info->item_compare_numbers || info->item_compare_float || info->item_compare_numeric)) diff --git a/src/version.c b/src/version.c index 6c636db9aa..7eb3acd629 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 945, /**/ 944, /**/ From 2efa9e317955057433b8aada30f3e91f9bdaffd0 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 18:53:42 +0000 Subject: [PATCH 343/647] patch 9.2.0946: GTK2/3: mouse move starts Visual selection after a dialog Problem: In GTK2/GTK3, when a dialog pops up while a mouse button is pressed, moving the mouse afterwards starts a Visual selection without any button being held down. Solution: Forget about the pressed mouse button when another widget shadows the text area with a grab, since the button release event goes to that widget (Hirohito Higashi). fixes: #20907 closes: #21014 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 16 ++++++++++++++++ src/version.c | 2 ++ 2 files changed, 18 insertions(+) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 2e60484ee0..571f938173 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -2222,6 +2222,20 @@ button_release_event(GtkWidget *widget UNUSED, return TRUE; } +/* + * Another widget, e.g. a modal dialog, was shadowing us with a GTK grab. The + * button release went to that widget, thus forget about the pressed button to + * avoid that the next mouse move is taken for a drag. + */ + static void +grab_notify_event(GtkWidget *widget UNUSED, + gboolean was_grabbed, + gpointer data UNUSED) +{ + if (!was_grabbed) + dragging_button_state = 0; +} + #ifdef FEAT_DND ///////////////////////////////////////////////////////////////////////////// @@ -4228,6 +4242,8 @@ gui_mch_init(void) G_CALLBACK(button_press_event), NULL); g_signal_connect(G_OBJECT(gui.drawarea), "button-release-event", G_CALLBACK(button_release_event), NULL); + g_signal_connect(G_OBJECT(gui.drawarea), "grab-notify", + G_CALLBACK(grab_notify_event), NULL); g_signal_connect(G_OBJECT(gui.drawarea), "scroll-event", G_CALLBACK(scroll_event), NULL); diff --git a/src/version.c b/src/version.c index 7eb3acd629..7d7635c045 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 946, /**/ 945, /**/ From 62cf642965fb18387dea70c27575eeb0804508be Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 19:05:26 +0000 Subject: [PATCH 344/647] patch 9.2.0947: GTK4: screen is cleared when moving the mouse after startup Problem: In GTK4, moving the mouse over the window right after startup clears the screen, including the intro message. Solution: Keep the cached contents of the drawing area in sync with the size Vim is going to draw (Hirohito Higashi). fixes: #21016 closes: #21021 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui.c | 4 ++++ src/version.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/gui.c b/src/gui.c index e2b3b40218..a1867753de 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1864,6 +1864,10 @@ gui_set_shellsize( limit_screen_size(); gui.num_cols = Columns; gui.num_rows = Rows; +#ifdef USE_GTK4 + // Keep the drawing area in sync with the size Vim is going to draw. + gui_gtk4_update_size(); +#endif min_width = base_width + MIN_COLUMNS * gui.char_width; min_height = base_height + MIN_LINES * gui.char_height; diff --git a/src/version.c b/src/version.c index 7d7635c045..3b27eab8b9 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 947, /**/ 946, /**/ From 9a5aa22e769f57433698d4e3ea044a85cd737e0c Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 19:11:17 +0000 Subject: [PATCH 345/647] patch 9.2.0948: GTK4: mouse move starts Visual selection after a dialog Problem: In GTK4, when a dialog pops up while a mouse button is pressed, moving the mouse afterwards starts a Visual selection without any button being held down. Solution: Forget about the pressed mouse button when a mouse move reports that no button is down, since the button release event may have gone to another widget (Hirohito Higashi). related: #20907 related: #21014 closes: #21022 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 27 +++++++++++++++++++++------ src/version.c | 2 ++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index d128a6b999..5b31e587ba 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -1896,9 +1896,11 @@ modifiers_gdk2mouse(guint state) return modifiers; } +// GdkModifierType has no mask covering the mouse buttons only. +#define ANY_BUTTON_MASK (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK \ + | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK) + // Track which mouse button is currently pressed for drag detection. -// GtkEventControllerMotion's modifier state may not include button masks -// on all backends (e.g. Wayland), so we track it ourselves. // -1 means no button is pressed (MOUSE_LEFT is 0x00, so can't use 0). static int mouse_pressed_button = -1; @@ -2019,15 +2021,28 @@ mouse_repeat_timer_cb(gpointer data UNUSED) motion_notify_event(GtkEventControllerMotion *controller UNUSED, double x, double y, gpointer data UNUSED) { + GdkEvent *event = gtk_event_controller_get_current_event( + GTK_EVENT_CONTROLLER(controller)); + + // The button release event may have gone to another widget, e.g. a modal + // dialog. Forget about the pressed button when no button is down anymore, + // otherwise moving the mouse would be taken for a drag. + if (mouse_pressed_button >= 0 && event != NULL + && !(gdk_event_get_modifier_state(event) & ANY_BUTTON_MASK)) + { + if (motion_repeat_timer != 0) + { + timeout_remove(motion_repeat_timer); + motion_repeat_timer = 0; + } + mouse_pressed_button = -1; + } + if (mouse_pressed_button >= 0) { GdkModifierType state; - GdkEvent *event; int w, h; - event = gtk_event_controller_get_current_event( - GTK_EVENT_CONTROLLER(controller)); - if (event != NULL) { cur_state = state = gdk_event_get_modifier_state(event); diff --git a/src/version.c b/src/version.c index 3b27eab8b9..e1d22170ad 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 948, /**/ 947, /**/ From 64dd63da9a2ee271f3e727b6502f505b0e29e76e Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 12 Aug 2026 19:43:37 +0000 Subject: [PATCH 346/647] patch 9.2.0949: GDK_KEY_VoidSymbol might be undefined Problem: Build fails because GDK_KEY_VoidSymbol is undefined (Hisashi T Fujinaka, after v9.2.0931) Solution: Define GDK_KEY_VoidSymbol as GDK_VoidSymbol when not already defined, before using it for the non-GTK4 case. closes: #21024 Signed-off-by: Christian Brabandt --- src/gui_xim.c | 3 +++ src/version.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/gui_xim.c b/src/gui_xim.c index 184945583c..ebd72f6a06 100644 --- a/src/gui_xim.c +++ b/src/gui_xim.c @@ -190,6 +190,9 @@ static int im_preedit_trailing = 0; // number of characters after cursor static unsigned long im_commit_handler_id = 0; # ifndef USE_GTK4 +# ifndef GDK_KEY_VoidSymbol +# define GDK_KEY_VoidSymbol GDK_VoidSymbol +# endif static unsigned int im_activatekey_keyval = GDK_KEY_VoidSymbol; static unsigned int im_activatekey_state = 0; # endif diff --git a/src/version.c b/src/version.c index e1d22170ad..ffe735bba7 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 949, /**/ 948, /**/ From fe65307d49b482ffdd4c81ce46352ee091e2c67b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 19:47:43 +0000 Subject: [PATCH 347/647] patch 9.2.0950: transstr() can be improved (after 9.2.0906) Problem: transstr() has comments that do not add anything to what the code says, and it casts a length to int only to cast it back to size_t. Solution: Drop the comments and keep the length in a size_t (Hirohito Higashi). related: #20925 closes: #21026 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/charset.c | 7 ++----- src/testdir/test_functions.vim | 1 - src/version.c | 2 ++ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/charset.c b/src/charset.c index 3be32f5fb4..8a8b930c3d 100644 --- a/src/charset.c +++ b/src/charset.c @@ -383,8 +383,6 @@ transstr(char_u *s) if (res == NULL) return NULL; - // Keep a tail pointer to append to, appending with STRCAT would make - // this loop quadratic. char_u *d = res; p = s; @@ -395,7 +393,6 @@ transstr(char_u *s) c = (*mb_ptr2char)(p); if (vim_isprintc(c)) { - // append printable multi-byte char mch_memmove(d, p, (size_t)l); d += l; } @@ -409,9 +406,9 @@ transstr(char_u *s) else { char_u *trs = transchar_byte(*p++); - int trs_len = (int)STRLEN(trs); + size_t trs_len = STRLEN(trs); - mch_memmove(d, trs, (size_t)trs_len); + mch_memmove(d, trs, trs_len); d += trs_len; } } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 3aec6c5240..c49d9dba0c 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -253,7 +253,6 @@ func Test_strtrans() call assert_equal('^A^_^?', strtrans("\x01\x1f\x7f")) " an unprintable byte above 0x7f uses the meta notation call assert_equal('| ', strtrans("\xa0")) - " a printable high byte is unchanged call assert_equal("\xe9", strtrans("\xe9")) call assert_equal("x^B\xe9| y", strtrans("x\x02\xe9\xa0y")) set encoding=utf-8 diff --git a/src/version.c b/src/version.c index ffe735bba7..18210eb028 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 950, /**/ 949, /**/ From 4fa6895ad203d14e3db4365a451d68006a01b548 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Wed, 12 Aug 2026 20:03:01 +0000 Subject: [PATCH 348/647] patch 9.2.0951: GTK3: cursor does no longer blink Problem: GTK3: cursor does no longer blink (presuku, after v9.2.0897) Solution: simplify code, use gui_may_flush() (Christoffer Aasted) fixes: #20983 closes: #21019 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui_gtk_x11.c | 12 +++--------- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 571f938173..b178aecdaa 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -986,9 +986,7 @@ gui_mch_stop_blink(int may_call_gui_update_cursor) if (blink_state == BLINK_OFF && may_call_gui_update_cursor) { gui_update_cursor(TRUE, FALSE); -#if !GTK_CHECK_VERSION(3,0,0) - gui_mch_flush(); -#endif + gui_may_flush(); } blink_state = BLINK_NONE; } @@ -1008,9 +1006,7 @@ blink_cb(gpointer data UNUSED) blink_state = BLINK_ON; blink_timer = timeout_add(blink_ontime, blink_cb, NULL); } -#if !GTK_CHECK_VERSION(3,0,0) - gui_mch_flush(); -#endif + gui_may_flush(); return FALSE; // don't happen again } @@ -1033,9 +1029,7 @@ gui_mch_start_blink(void) blink_timer = timeout_add(blink_waittime, blink_cb, NULL); blink_state = BLINK_ON; gui_update_cursor(TRUE, FALSE); -#if !GTK_CHECK_VERSION(3,0,0) - gui_mch_flush(); -#endif + gui_may_flush(); } } diff --git a/src/version.c b/src/version.c index 18210eb028..31df22a94f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 951, /**/ 950, /**/ From 1af17441296d8e621661b5d04ce58d7c70198b38 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 20:08:18 +0000 Subject: [PATCH 349/647] patch 9.2.0952: locking a container while stringifying can be improved Problem: The comments on locking a list or dict while stringifying its items say the same thing three times over, and at more length than the existing comments on the same construct (after v9.2.0936). Solution: Shorten them. related: #21001 closes: #21029 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/dict.c | 6 ++---- src/evalfunc.c | 5 ++--- src/list.c | 5 ++--- src/testdir/test_functions.vim | 9 +++------ src/version.c | 2 ++ 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/dict.c b/src/dict.c index 029fcfe789..4558272acb 100644 --- a/src/dict.c +++ b/src/dict.c @@ -816,10 +816,8 @@ dict2string(typval_T *tv, int copyID, int restore_copyID) ga_init2(&ga, sizeof(char), 80); ga_append(&ga, '{'); - // Lock the dictionary, so that user code that echo_string_core() below - // may invoke, such as the string() method of an object, cannot remove - // an item or add one and cause the hash table to be reallocated while - // we are iterating over it. + // Lock the dict, the string() method of an object item could remove an + // item or make the hashtab resize while we iterate over it. prev_lock = d->dv_lock; if (d->dv_lock == 0) d->dv_lock = VAR_LOCKED; diff --git a/src/evalfunc.c b/src/evalfunc.c index 472b2fe02a..1b8cce9da4 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -9359,9 +9359,8 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type) { regmatch.rm_ic = p_ic; - // Lock the list, so that the item the loop is standing on cannot - // be freed by user code that echo_string() below may invoke: the - // string() method of an object could remove the item. + // Lock the list, the string() method of an object item could remove + // the item the loop is standing on. if (l != NULL) { prev_lock = l->lv_lock; diff --git a/src/list.c b/src/list.c index 7d57b125c4..cf5374de2a 100644 --- a/src/list.c +++ b/src/list.c @@ -1537,9 +1537,8 @@ list_join_inner( // Stringify each item in the list. CHECK_LIST_MATERIALIZE(l); - // Lock the list, so that the item the loop is standing on cannot be - // freed by user code that echo_string_core() below may invoke: the - // string() method of an object could remove the item. + // Lock the list, the string() method of an object item could remove the + // item the loop is standing on. prev_lock = l->lv_lock; if (l->lv_lock == 0) l->lv_lock = VAR_LOCKED; diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index c49d9dba0c..7052ad171f 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -1280,9 +1280,7 @@ func Test_match_list_changed_while_matching() unlet g:mlist g:removed endfunc -" Same for join() and string(): stringifying an item can run the string() -" method of an object, which must not be able to free the item the loop is -" standing on. +" Same for join() and string(). func Test_join_list_changed_while_stringified() let lines =<< trim END vim9script @@ -1308,9 +1306,8 @@ func Test_join_list_changed_while_stringified() unlet g:jlist g:removed endfunc -" Same for a dict: stringifying a value can run the string() method of an -" object, which must not be able to remove an item and free it, or grow the -" dict and reallocate the hash table, while it is being iterated over. +" Same for a dict, where the item can also be added and reallocate the +" hash table. func Test_dict_changed_while_stringified() let lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index 31df22a94f..b082b2d76b 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 952, /**/ 951, /**/ From 4dde4afa1d188d92aa7ae91db43956bd83aad758 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 20:17:36 +0000 Subject: [PATCH 350/647] patch 9.2.0953: insert completion code can be improved Problem: The duplicate-check hashtab in insexpand.c has comments that do not add anything to what the code says (after v9.2.0909). Solution: Drop the redundant comments. related: #20926 closes: #21027 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/insexpand.c | 14 +++++--------- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/insexpand.c b/src/insexpand.c index b12f69eb0b..203ea6fc3a 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -137,11 +137,9 @@ static compl_T *compl_shown_match = NULL; static compl_T *compl_old_match = NULL; // Hashtab with the strings of the matches in the list above, except the -// original-text entries. Used to make the duplicate check O(1) instead of -// a scan of the whole list. Each entry owns a copy of the string and -// counts the matches with that string, so that when matches were added -// with "adup" the entry remains until the last match with the string is -// removed. +// original-text entries. Each entry owns a copy of the string and counts +// the matches with that string, so that when matches were added with "adup" +// the entry remains until the last match with the string is removed. typedef struct { int cse_count; // number of matches with this string @@ -155,8 +153,7 @@ static hashtab_T compl_strings_ht; /* * Count the string of a new match in the duplicate-check hashtab. - * "hash" is the hash of "str" when it is not zero, saving hashing the - * string again. + * "hash" is the hash of "str" when it is not zero. */ static void compl_strings_add(char_u *str, size_t len, hash_T hash) @@ -967,8 +964,7 @@ ins_compl_add( // If the same match is already present, don't add it. if (compl_first_match != NULL && !adup && compl_strings_ht.ht_used > 0) { - // Use a stack buffer for the NUL-terminated key when it fits, so - // that rejecting a duplicate does not allocate memory. + // The key must be NUL terminated. char_u keybuf[128]; char_u *key; hashitem_T *hi; diff --git a/src/version.c b/src/version.c index b082b2d76b..656e088083 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 953, /**/ 952, /**/ From ecfea491aa964311a42f888277da7911c9d6900d Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 20:21:43 +0000 Subject: [PATCH 351/647] patch 9.2.0954: u_read_undo() can be improved (after 9.2.0935) Problem: u_read_undo() has comments that do not add anything to what the code says (afte rv9.2.0935). Solution: Drop the redundant comments (Hirohito Higashi). related: #20942 closes: #21028 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/undo.c | 7 ++----- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/undo.c b/src/undo.c index 5dc154cc2e..24407edaff 100644 --- a/src/undo.c +++ b/src/undo.c @@ -1817,8 +1817,7 @@ u_write_undo( } /* - * Compare undo headers on the sequence number, for sorting uhp_table in - * u_read_undo(). + * Compare undo headers on the sequence number, for sorting uhp_table. */ static int uhp_seq_cmp(const void *v1, const void *v2) @@ -2107,9 +2106,7 @@ u_read_undo(char_u *name, char_u *hash, char_u *orig_name UNUSED) // We have put all of the headers into a table. Each header stores the // sequence numbers of the headers it links to; resolve those into - // pointers. Sort the table on uh_seq once, so that every lookup is a - // binary search instead of a linear scan, which would be quadratic - // overall. Every entry is non-NULL: a header that failed to + // pointers. Every entry is non-NULL: a header that failed to // unserialize or a count mismatch was an error above. if (num_head > 0) qsort(uhp_table, (size_t)num_head, sizeof(u_header_T *), uhp_seq_cmp); diff --git a/src/version.c b/src/version.c index 656e088083..1955674ae6 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 954, /**/ 953, /**/ From fa96c9ea30f5679e91fef54a2181af8a65ba9ba5 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 21:40:50 +0000 Subject: [PATCH 352/647] patch 9.2.0955: tests: terminal tests are flaky Problem: Test_terminal_aucmd_on_close() is flaky on MS-Windows: the tests that wait for a terminal window to close use a timeout shorter than the default, which is not enough when starting a process is slow. When the wait fails the test aborts with E121 and leaves an autocommand behind for the following tests. Test_terminal_unwraps() checks the buffer contents without waiting for the job to finish. Solution: Use the default timeout of WaitForAssert(), initialize the variable checked after the wait, and wait for the buffer to hold the unwrapped line. closes: #21039 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_terminal.vim | 35 +++++++++++++++++------------------ src/version.c | 2 ++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim index 096904e111..706fb1ebca 100644 --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -692,24 +692,21 @@ endfunc func s:get_sleep_cmd() if s:python != '' let cmd = s:python . " test_short_sleep.py" - " 500 was not enough for Travis - let waittime = 900 else echo 'This will take five seconds...' - let waittime = 2000 if has('win32') let cmd = $windir . '\system32\timeout.exe 1' else let cmd = 'sleep 1' endif endif - return [cmd, waittime] + return cmd endfunc func Test_terminal_finish_open_close() call assert_equal(1, winnr('$')) - let [cmd, waittime] = s:get_sleep_cmd() + let cmd = s:get_sleep_cmd() " shell terminal closes automatically terminal @@ -718,7 +715,7 @@ func Test_terminal_finish_open_close() " Wait for the shell to display a prompt call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) call StopShellInTerminal(buf) - call WaitForAssert({-> assert_equal(1, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(1, winnr('$'))}) " shell terminal that does not close automatically terminal ++noclose @@ -734,32 +731,32 @@ func Test_terminal_finish_open_close() exe 'terminal ++close ' . cmd call assert_equal(2, winnr('$')) wincmd p - call WaitForAssert({-> assert_equal(1, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(1, winnr('$'))}) call term_start(cmd, {'term_finish': 'close'}) call assert_equal(2, winnr('$')) wincmd p - call WaitForAssert({-> assert_equal(1, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(1, winnr('$'))}) call assert_equal(1, winnr('$')) exe 'terminal ++open ' . cmd close! - call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(2, winnr('$'))}) bwipe call term_start(cmd, {'term_finish': 'open'}) close! - call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(2, winnr('$'))}) bwipe exe 'terminal ++hidden ++open ' . cmd call assert_equal(1, winnr('$')) - call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(2, winnr('$'))}) bwipe call term_start(cmd, {'term_finish': 'open', 'hidden': 1}) call assert_equal(1, winnr('$')) - call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(2, winnr('$'))}) bwipe call assert_fails("call term_start(cmd, {'term_opencmd': 'open'})", 'E475:') @@ -769,7 +766,7 @@ func Test_terminal_finish_open_close() call term_start(cmd, {'term_finish': 'open', 'term_opencmd': '4split | buffer %d | let g:result = "opened the buffer in a window"'}) close! - call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(2, winnr('$'))}) call assert_equal(4, winheight(0)) call assert_equal('opened the buffer in a window', g:result) unlet g:result @@ -1233,6 +1230,7 @@ func Test_terminal_composing_unicode() endfunc func Test_terminal_aucmd_on_close() + let s:called = 0 fun Nop() let s:called = 1 endfun @@ -1242,14 +1240,14 @@ func Test_terminal_aucmd_on_close() au BufWinLeave * call Nop() aug END - let [cmd, waittime] = s:get_sleep_cmd() + let cmd = s:get_sleep_cmd() call assert_equal(1, winnr('$')) new call setline(1, ['one', 'two']) exe 'term ++close ' . cmd wincmd p - call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) + call WaitForAssert({-> assert_equal(2, winnr('$'))}) call assert_equal(1, s:called) bwipe! @@ -2498,9 +2496,10 @@ func Test_terminal_unwraps() call assert_equal('14+15', l) call TermWait(buf) - " It should appear as a single buffer line in vim - let lastline = getline('$') - call assert_equal('1+2+3+4+5+6+7+8+9+10+11+12+13+14+15', lastline) + " It should appear as a single buffer line in vim, once the job finished and + " the contents were moved to the buffer. + call WaitForAssert({-> assert_equal( + \ '1+2+3+4+5+6+7+8+9+10+11+12+13+14+15', getline('$'))}) bwipe! endfunc diff --git a/src/version.c b/src/version.c index 1955674ae6..4a6e48ce48 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 955, /**/ 954, /**/ From fc6288f517c02ac66f6e83a57dc0e515a540b7a1 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 12 Aug 2026 21:45:46 +0000 Subject: [PATCH 353/647] patch 9.2.0956: GTK4: crash when the window is resized while redrawing Problem: In GTK4, Vim may crash when the window is resized while the cursor is displayed. Solution: Remember the number of cells the cursor covers when the cursor is set, instead of deriving it from the drawing position when the snapshot is taken (Hirohito Higashi). fixes: #21037 closes: #21038 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4_da.c | 7 +++++-- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 330706e865..d7e460254a 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -133,6 +133,7 @@ typedef struct gboolean draw; // If cursor should be drawn int width; int height; + int n_cells; // Cells covered, 2 for a double width character GdkRGBA bg_color; GdkRGBA fg_color; } DrawCursor; @@ -1598,6 +1599,9 @@ vim_draw_area_set_cursor(VimDrawArea *self, int w, int h) self->cursor.draw = TRUE; self->cursor.width = w; self->cursor.height = h; + // Remember this now: the snapshot runs later, when the drawing position + // has moved on. + self->cursor.n_cells = 1 + mb_lefthalve(gui.cursor_row, gui.cursor_col); self->cursor.bg_color = *gui.bgcolor; self->cursor.fg_color = *gui.fgcolor; } @@ -1873,8 +1877,7 @@ vim_draw_area_snapshot_cursor( if (cursor->width <= 0 && cursor->height <= 0) { - // Double width if double width character - w += gui.char_width * (1 + mb_lefthalve(gui.row, gui.col)); + w += gui.char_width * cursor->n_cells; h = gui.char_height; } diff --git a/src/version.c b/src/version.c index 4a6e48ce48..2be3c231f2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 956, /**/ 955, /**/ From 95e8f2e9324c06a5c687109481c840118d76eb20 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Thu, 13 Aug 2026 18:09:22 +0000 Subject: [PATCH 354/647] runtime(doc): v:windowid is x11 only closes: #21036 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- runtime/doc/eval.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index b8f6219e45..fe3545e3d5 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 9.2. Last change: 2026 Aug 10 +*eval.txt* For Vim version 9.2. Last change: 2026 Aug 13 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3056,7 +3056,7 @@ v:wayland_display If this is empty, then Vim is not connected to any display. *v:windowid* *windowid-variable* -v:windowid When any X11/Wayland based GUI is running or when running in a +v:windowid When any X11 based GUI is running or when running in a terminal and Vim connects to the X server (|-X|) this will be set to the window ID. When an MS-Windows GUI is running this will be set to the From b4b3a62a41d0088a789898916b5ffe1b7b6829bc Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 13 Aug 2026 18:14:48 +0000 Subject: [PATCH 355/647] runtime(doc): mark the GTK4 GUI as still experimental related: #20920 fixes: #21042 Signed-off-by: Christian Brabandt --- runtime/doc/version9.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index ef371b569f..ab0e93657d 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 06 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 13 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52587,9 +52587,8 @@ work in progress. GUI ~ ----- -- Added support for the GTK 4 GUI (via patch 9.2.0501), stablized as of - patch 9.2.0931. Enable with `--enable-gui=gtk4` configure switch at build - time. +- Added experimental support for the GTK 4 GUI (via patch 9.2.0501 and many + following), enable with `--enable-gui=gtk4` configure switch at build time. - Add support for fullscreen mode in the GTK UI |'go-s'|. - Enable native printing dialog for the GTK4 UI using pango library, see |pango-printing|. From e402d1c443ec9f542df0503d765a09c32eabd7b4 Mon Sep 17 00:00:00 2001 From: Emilien Breton Date: Thu, 13 Aug 2026 18:30:55 +0000 Subject: [PATCH 356/647] runtime(doc): improve documentation for |v_gF| Signed-off-by: Christian Brabandt --- runtime/doc/editing.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt index c1fadf71ce..5d00c8363c 100644 --- a/runtime/doc/editing.txt +++ b/runtime/doc/editing.txt @@ -1,4 +1,4 @@ -*editing.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*editing.txt* For Vim version 9.2. Last change: 2026 Aug 13 VIM REFERENCE MANUAL by Bram Moolenaar @@ -338,15 +338,20 @@ CTRL-^ Edit the alternate file. Mostly the alternate file is character. " line " is also recognized, like it is used in the output of `:verbose command UserCmd` White space between the filename, the separator and - the number are ignored. + the number is ignored. Examples: eval.c:10 ~ eval.c @ 20 ~ eval.c (30) ~ eval.c 40 ~ + eval.c line 50 ~ *v_gF* -{Visual}[count]gF Same as "v_gf". +{Visual}[count]gF Same as "v_gf", but if a colon and a number appear + immediately after the end of the selected text, + then the cursor is positioned on that line in the + file. Unlike |gF|, only a colon is recognized as + separator. These commands are used to start editing a single file. This means that the file is read into the buffer and the current file name is set. The file that From 21e5e76bac307d860fb7cae7a9c0f2e80305a6fb Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Thu, 13 Aug 2026 18:37:58 +0000 Subject: [PATCH 357/647] runtime(vim): Update base syntax, match user-command args - Trailing bar and tail comments are not explicitly supported. The command is matched to EOL. - In Vim9 script the following always matches as an assignment: UserCommand = 2 Use a leading colon to force matching the user command: :UserCommand = 2 - Add highlighting for utility commands VimFold\a, Vim9, and VimL. fixes: #20854 closes: #21035 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 28 ++++++-- .../testdir/dumps/vim_ex_command_08.dump | 4 +- .../testdir/dumps/vim_ex_user_command_00.dump | 20 ++++++ .../testdir/dumps/vim_ex_user_command_01.dump | 20 ++++++ .../testdir/dumps/vim_ex_user_command_02.dump | 20 ++++++ .../testdir/dumps/vim_ex_user_command_03.dump | 20 ++++++ .../vim_predefined_user_commands_00.dump | 10 +-- .../vim_predefined_user_commands_01.dump | 30 ++++----- .../testdir/input/vim_ex_user_command.vim | 66 +++++++++++++++++++ .../input/vim_predefined_user_commands.vim | 12 +++- runtime/syntax/vim.vim | 28 ++++++-- 11 files changed, 225 insertions(+), 33 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/vim_ex_user_command_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_user_command_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_user_command_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_ex_user_command_03.dump create mode 100644 runtime/syntax/testdir/input/vim_ex_user_command.vim diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index aae2864a7e..7a72878eaf 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 08 +" Last Change: 2026 Aug 12 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -2305,7 +2305,16 @@ syn match vimBracket contained "[\\<>]" syn case match " User Command Highlighting: {{{2 -syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:space:]]\|$\)\@=' nextgroup=vimBang +" Note: assumes command runs to EOL, no explicit | support + +syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:blank:]]\|$\)\@=' skipwhite nextgroup=vimUsrCmdBang,vimUsrCmdArgs +syn match vimUsrCmd_ contained '\%#=1\%(\%(N\%[ext]\|P\%[rint]\|X\)\>\)\@!\u[[:alnum:]]*\%([![:blank:]]\|$\)\@=' skipwhite nextgroup=vimUsrCmdBang,vimUsrCmdArgs +syn match vimUsrCmdBang contained "\w\@1<=!" skipwhite nextgroup=vimUsrCmdArgs +syn region vimUsrCmdArgs contained + \ start="\s\zs\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue " Vim user commands @@ -2324,7 +2333,12 @@ syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyLis syn keyword vimSynLink contained SynLink skipwhite nextgroup=vimSynLinkGroup syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup -syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu +" runtime/syntax/vim.vim +syn keyword vimVim9 contained Vim9 skipwhite nextgroup=vimSyntax +syn keyword vimVimL contained VimL skipwhite nextgroup=vimSyntax +syn match vimVimFold contained "\" skipwhite nextgroup=vimSyntax + +syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu,vimVimFold,vimVim9,vimVimL " Errors And Warnings: {{{2 " ==================== @@ -3243,6 +3257,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimUserCmdKey vimCommand hi def link vimUserFunc Normal hi def link vimUserFuncKey vimUserFunc + hi def link vimUsrCmdBang vimBang hi def link vimVar Normal hi def link vimVarKey vimVar hi def link vimVarScope Identifier @@ -3330,10 +3345,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimWincmd_ vimWincmd hi def link vimCompilerSet vimCommand - hi def link vimSynColor vimCommand - hi def link vimSynLink vimCommand + hi def link vimSynColor vimCommand + hi def link vimSynLink vimCommand hi def link vimSynMenu vimCommand hi def link vimSynMenuPath vimMenuName + hi def link vimVimFold vimCommand + hi def link vimVim9 vimCommand + hi def link vimVimL vimCommand endif diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump index 63a768760d..702da91b69 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump @@ -6,8 +6,8 @@ > @74 |"+0#0000e05&| |I|s@1|u|e| |#|1|7|0@1|1| |(|W|r|o|n|g| |v|i|m|U|s|e|r|C|m|d|A|t@1|r|E|r@1|o|r| |h|i|g|h|l|i|g|h|t|i|n|g| |i|n| |v|i|m|.|v|i|m|)| +0#0000000&@8 @75 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|f+0#00e0003&|i|l|e| +0#0000000&|M+0#0000001#ffff4012|a|k|e| +0#0000000#ffffff0|A|s|y|n|c|R|u|n| |-+0#af5f00255&|p+0#00e0e07&|r|o|g|r|a|m|=+0#af5f00255&|m+0#00e0e07&|a|k|e| +0#0000000&|@| |<+0#e000e06&|a|r|g|s|> -| +0#0000000&@74 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|f+0#00e0003&|i|l|e| +0#0000000&|M+0#0000001#ffff4012|a|k|e| +0#0000000#ffffff0|A|s|y|n|c|R|u|n| |-|p|r|o|g|r|a|m|=|m|a|k|e| |@| |<|a|r|g|s|> +| @74 @75 |"+0#0000e05&| |I|s@1|u|e| |#|1|7|3|2|6| |(|s|y|n|t|a|x| |h|i|g|h|l|i|g|h|t|i|n|g| |b|r|e|a|k|s| |w|i|t|h| |c|o|m|p|l|e|x| |:|s| |c|o|m|a|m|n|d|)| +0#0000000&@7 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_user_command_00.dump b/runtime/syntax/testdir/dumps/vim_ex_user_command_00.dump new file mode 100644 index 0000000000..e3bd2a9482 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_user_command_00.dump @@ -0,0 +1,20 @@ +>"+0#0000e05#ffffff0| |V|i|m| |u|s|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@55 +|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|U|s|r|C|m|d| |v|i|m|C|o|m@1|a|n|d| +0#0000000&@29 +|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|U|s|r|C|m|d|_| |v|i|m|C|o|m@1|a|n|d| +0#0000000&@28 +|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|U|s|r|C|m|d|A|r|g|s| |T|o|d|o| +0#0000000&@31 +@75 +|F+0#af5f00255&|o@1| +0#0000000&@71 +|:|F+0#af5f00255&|o@1| +0#0000000&@70 +|4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@69 +|:|4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@68 +@75 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |F+0#af5f00255&|o@1| +0#0000000&@58 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|F+0#af5f00255&|o@1| +0#0000000&@57 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@56 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@55 +@75 +|F+0#af5f00255&|o@1|!| +0#0000000&@70 +|F+0#af5f00255&|o@1|!| +0#0000000&|a+0#0000001#ffff4012|r|g|1| +0#0000000#ffffff0@65 +| +0#0000001#ffff4012@4|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@59 +| +0#0000001#ffff4012@5|\+0#e000e06#ffffff0| +0#0000001#ffff4012|a|r|g|2| +0#0000000#ffffff0@62 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_user_command_01.dump b/runtime/syntax/testdir/dumps/vim_ex_user_command_01.dump new file mode 100644 index 0000000000..d492cbdaa4 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_user_command_01.dump @@ -0,0 +1,20 @@ +|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@55 +@75 +|F+0#af5f00255&|o@1|!| +0#0000000&@70 +|F+0#af5f00255&|o@1|!| +0#0000000&|a+0#0000001#ffff4012|r|g|1| +0#0000000#ffffff0@65 +| +0#0000001#ffff4012@4|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@59 +| +0#0000001#ffff4012@5>\+0#e000e06#ffffff0| +0#0000001#ffff4012|a|r|g|2| +0#0000000#ffffff0@62 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@64 +@75 +|F+0#af5f00255&|o@1| +0#0000000&|a+0#0000001#ffff4012|r|g|1| +0#0000000#ffffff0@66 +| +0#0000001#ffff4012@3|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@60 +| +0#0000001#ffff4012@3|\+0#e000e06#ffffff0| +0#0000001#ffff4012|a|r|g|2| +0#0000000#ffffff0@64 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@64 +@75 +|F+0#af5f00255&|o@1| +0#0000000&||+0#0000001#ffff4012| |t|r|a|i|l|i|n|g| |b|a|r| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000#ffffff0@42 +|F+0#af5f00255&|o@1| +0#0000000&|"+0#0000001#ffff4012| |t|a|i|l| |c|o|m@1|e|n|t|s| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000#ffffff0@41 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +@2|F+0#af5f00255&|o@1| +0#0000000&@69 +@2|:|F+0#af5f00255&|o@1| +0#0000000&@68 +@57|1|9|,|7| @9|2|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_user_command_02.dump b/runtime/syntax/testdir/dumps/vim_ex_user_command_02.dump new file mode 100644 index 0000000000..e4967ed774 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_user_command_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|:|F+0#af5f00255&|o@1| +0#0000000&@68 +@2|:|4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@66 +@75 +@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |F+0#af5f00255&|o@1| +0#0000000&@56 +@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|F+0#af5f00255&|o@1| +0#0000000&@55 +@2>e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|4+0#e000002&|2|F+0#af5f00255&|o@1| +0#0000000&@53 +@75 +@2|F+0#af5f00255&|o@1|!| +0#0000000&@68 +@2|F+0#af5f00255&|o@1|!| +0#0000000&|a+0#0000001#ffff4012|r|g|1| +0#0000000#ffffff0@63 +| +0#0000001#ffff4012@6|#+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@57 +| +0#0000001#ffff4012@7|\+0#e000e06#ffffff0| +0#0000001#ffff4012|a|r|g|2| +0#0000000#ffffff0@60 +@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@62 +@75 +@2|F+0#af5f00255&|o@1| +0#0000000&|a+0#0000001#ffff4012|r|g|1| +0#0000000#ffffff0@64 +| +0#0000001#ffff4012@5|#+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@58 +| +0#0000001#ffff4012@5|\+0#e000e06#ffffff0| +0#0000001#ffff4012|a|r|g|2| +0#0000000#ffffff0@62 +@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@62 +@75 +@2|F+0#af5f00255&|o@1| +0#0000000&||+0#0000001#ffff4012| |t|r|a|i|l|i|n|g| |b|a|r| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000#ffffff0@40 +@57|3|7|,|3| @9|6|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_user_command_03.dump b/runtime/syntax/testdir/dumps/vim_ex_user_command_03.dump new file mode 100644 index 0000000000..276e9445f6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_ex_user_command_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@1|F+0#af5f00255&|o@1| +0#0000000&||+0#0000001#ffff4012| |t|r|a|i|l|i|n|g| |b|a|r| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000#ffffff0@40 +@2|F+0#af5f00255&|o@1| +0#0000000&|#+0#0000001#ffff4012| |t|a|i|l| |c|o|m@1|e|n|t|s| |n|o|t| |s|u|p@1|o|r|t|e|d| +0#0000000#ffffff0@39 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +@75 +>"+0#0000e05&| |I|s@1|u|e| |#|2|0|8|5|4| |(|C|u|s|t|o|m| |c|o|m@1|a|n|d| |c|a|l@1| |w|i|t|h| |t|h|e| |d|o|t| |i|n| |t|h|e| |e|n|d| |b|r|e|a|k|s| |n|e|x|t| +0#0000000&@3 +|"+0#0000e05&| @2|h|i|g|h|l|i|g|h|t|i|n|g|)| +0#0000000&@57 +@75 +|d+0#af5f00255&|e|f| +0#0000000&|R|u|n|O|d|i|n|(+0#e000e06&|)| +0#0000000&@61 +@4|u+0#af5f00255&|p|d|a|t|e| +0#0000000&@64 +@4|i+0#af5f00255&|f| +0#0000000&|!+0#af5f00255&|e+0#00e0e07&|x|i|s|t|s|(+0#e000e06&|"+0#e000002&|$|W|S|L|_|D|I|S|T|R|O|_|N|A|M|E|"|)+0#e000e06&| +0#0000000&@40 +@8|T+0#af5f00255&|e|r|m|!| +0#0000000&|o+0#0000001#ffff4012|d|i|n| |r|u|n| |.| +0#0000000#ffffff0@50 +@4|e+0#af5f00255&|l|s|e| +0#0000000&@66 +@8|T+0#af5f00255&|e|r|m|!| +0#0000000&|o+0#0000001#ffff4012|d|i|n| |r|u|n| |.| |-|t|h|r|e|a|d|-|c|o|u|n|t|:|1| +0#0000000#ffffff0@34 +@4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 +|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 +@75 +|~+0#4040ff13&| @73 +|~| @73 +| +0#0000000&@56|5@1|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_predefined_user_commands_00.dump b/runtime/syntax/testdir/dumps/vim_predefined_user_commands_00.dump index 8d0e81c230..86058c12ac 100644 --- a/runtime/syntax/testdir/dumps/vim_predefined_user_commands_00.dump +++ b/runtime/syntax/testdir/dumps/vim_predefined_user_commands_00.dump @@ -1,20 +1,20 @@ >"+0#0000e05#ffffff0| |V|i|m| |p|r|e|d|e|f|i|n|e|d| |u|s|e|r| |c|o|m@1|a|n|d|s| +0#0000000&@44 @75 @75 -|"+0#0000e05&| |:|C|o|m|p|i|l|e|r|S|e|t| |-| |r|u|n|t|i|m|e|/|c|o|m|p|i|l|e|r|/| +0#0000000&@40 +|"+0#0000e05&| |:|C|o|m|p|i|l|e|r|S|e|t| |-| |r|u|n|t|i|m|e|/|c|o|m|p|i|l|e|r|/|*|.|v|i|m| +0#0000000&@35 @75 |C+0#af5f00255&|o|m|p|i|l|e|r|S|e|t| +0#0000000&|m+0#e000e06&|a|k|e|p|r|g|=+0#af5f00255&|a+0#0000000&|n|t| @51 |C+0#af5f00255&|o|m|p|i|l|e|r|S|e|t| +0#0000000&|e+0#e000e06&|r@1|o|r|f|o|r|m|a|t|=+0#af5f00255&|\+0#0000000&| |%|#|[|%|.|%|#|]|\| |%|#|%|f|:+0#e000e06&|%+0#0000000&|l|:+0#e000e06&|%+0#0000000&|v|:+0#e000e06&|%+0#0000000&|*|\@1|d|:+0#e000e06&|%+0#0000000&|*|\@1|d|:+0#e000e06&|\+0#0000000&| |%|t|%|[|%|^|:+0#e000e06&|]+0#0000000&|%|#|:+0#e000e06&|%+0#0000000&|m|,+0#e000e06& | +0#0000000&@3|\+0#e000e06&|%+0#0000000&|A|\| |%|#|[|%|.|%|#|]|\| |%|f|:+0#e000e06&|%+0#0000000&|l|:+0#e000e06&|\+0#0000000&| |%|m|,+0#e000e06&|%+0#0000000&|-|Z|\| |%|#|[|%|.|%|#|]|\| |%|p|^|,+0#e000e06&|%+0#0000000&|C|\| |%|#|[|%|.|%|#|]|\| |%|#|%|m| @7 @75 +|"+0#0000e05&| |:|S|y|n|C|o|l|o|r| |-| |r|u|n|t|i|m|e|/|s|y|n|m|e|n|u|.|v|i|m| +0#0000000&@41 +@75 +|S+0#af5f00255&|y|n|C|o|l|o|r| +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|=+0#0000000&|N+0#e000e06&|O|N|E| +0#0000000&|c+0#00e0003&|t|e|r|m|f|g|=+0#0000000&|C+0#e000002&|y|a|n| +0#0000000&|c+0#00e0003&|t|e|r|m|b|g|=+0#0000000&|N+0#e000e06&|O|N|E| +0#0000000&|g+0#00e0003&|u|i|=+0#0000000&|N+0#e000e06&|O|N|E| +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|b|g|=+0#0000000&|N+0#e000e06&|O|N|E| +0#0000000&@52 @75 |"+0#0000e05&| |:|S|y|n|M|e|n|u| |-| |r|u|n|t|i|m|e|/|m|a|k|e|m|e|n|u|.|v|i|m| +0#0000000&@41 @75 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|2|p|s|\| |c|o|n|f|i|g|:+0#0000000&|a|2|p|s| @46 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|a|p|:+0#0000000&|a@1|p| @56 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|A|P|/|4|:+0#0000000&|a|b|a|p| @52 -|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|b|a|q|u|s|:+0#0000000&|a|b|a|q|u|s| @50 -|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|C|\| |m|u|s|i|c|\| |n|o|t|a|t|i|o|n|:+0#0000000&|a|b|c| @39 -|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|E|L|:+0#0000000&|a|b|e|l| @54 -|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|c|e|D|B|\| |m|o|d|e|l|:+0#0000000&|a|c|e|d|b| @45 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump b/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump index 39475638f0..9347802723 100644 --- a/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump +++ b/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump @@ -1,20 +1,20 @@ -|S+0#af5f00255#ffffff0|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|a|p|:+0#0000000&|a@1|p| @56 -|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|A|P|/|4|:+0#0000000&|a|b|a|p| @52 +| +0&#ffffff0@74 +|"+0#0000e05&| |:|S|y|n|M|e|n|u| |-| |r|u|n|t|i|m|e|/|m|a|k|e|m|e|n|u|.|v|i|m| +0#0000000&@41 +@75 +|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|2|p|s|\| |c|o|n|f|i|g|:+0#0000000&|a|2|p|s| @46 +|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|a|p|:+0#0000000&|a@1|p| @56 +>S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|A|P|/|4|:+0#0000000&|a|b|a|p| @52 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|b|a|q|u|s|:+0#0000000&|a|b|a|q|u|s| @50 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|C|\| |m|u|s|i|c|\| |n|o|t|a|t|i|o|n|:+0#0000000&|a|b|c| @39 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|B|E|L|:+0#0000000&|a|b|e|l| @54 ->S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|c|e|D|B|\| |m|o|d|e|l|:+0#0000000&|a|c|e|d|b| @45 +|S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|c|e|D|B|\| |m|o|d|e|l|:+0#0000000&|a|c|e|d|b| @45 |S+0#af5f00255&|y|n|M|e|n|u| +0#e000e06&|A|B|.|A|d|a|:+0#0000000&|a|d|a| @56 @75 -|~+0#4040ff13&| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|9|,|1| @9|B|o|t| +|"+0#0000e05&| |:|V|i|m|F|o|l|d|\|a|,| |:|V|i|m|9|,| |:|V|i|m|L| |-| |r|u|n|t|i|m|e|/|s|y|n|t|a|x|/|v|i|m|.|v|i|m| +0#0000000&@23 +@75 +|V+0#af5f00255&|i|m|F|o|l|d|a| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|v|i|m|F|o@1| |s+0#00e0003&|t|a|r|t|=|"+0#e000002&|f|o@1|"| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|b|a|r|"| +0#0000000&@23 +@75 +|V+0#af5f00255&|i|m|9| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|v|i|m|9|F|o@1| |f|o@1| |n+0#e000e06&|e|x|t|g|r|o|u|p|=|v+0#0000000&|i|m|9|C|o|m@1|e|n|t| @21 +|V+0#af5f00255&|i|m|L| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|v|i|m|F|o@1| @1|f|o@1| |n+0#e000e06&|e|x|t|g|r|o|u|p|=|v+0#0000000&|i|m|C|o|m@1|e|n|t| @22 +@75 +@57|1|8|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/vim_ex_user_command.vim b/runtime/syntax/testdir/input/vim_ex_user_command.vim new file mode 100644 index 0000000000..900d567e63 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_ex_user_command.vim @@ -0,0 +1,66 @@ +" Vim user commands +" VIM_TEST_SETUP hi link vimUsrCmd vimCommand +" VIM_TEST_SETUP hi link vimUsrCmd_ vimCommand +" VIM_TEST_SETUP hi link vimUsrCmdArgs Todo + +Foo +:Foo +42Foo +:42Foo + +echo "..." | Foo +echo "..." | :Foo +echo "..." | 42Foo +echo "..." | :42Foo + +Foo! +Foo! arg1 + "\ comment + \ arg2 +echo "..." + +Foo arg1 + "\ comment + \ arg2 +echo "..." + +Foo | trailing bar not supported +Foo " tail comments not supported + +def Vim9Context() + Foo + :Foo + :42Foo + + echo "..." | Foo + echo "..." | :Foo + echo "..." | :42Foo + + Foo! + Foo! arg1 + #\ comment + \ arg2 + echo "..." + + Foo arg1 + #\ comment + \ arg2 + echo "..." + + Foo | trailing bar not supported + Foo # tail comments not supported +enddef + + +" Issue #20854 (Custom command call with the dot in the end breaks next +" highlighting) + +def RunOdin() + update + if !exists("$WSL_DISTRO_NAME") + Term! odin run . + else + Term! odin run . -thread-count:1 + endif +enddef + diff --git a/runtime/syntax/testdir/input/vim_predefined_user_commands.vim b/runtime/syntax/testdir/input/vim_predefined_user_commands.vim index 8b178909a1..653d66a3b2 100644 --- a/runtime/syntax/testdir/input/vim_predefined_user_commands.vim +++ b/runtime/syntax/testdir/input/vim_predefined_user_commands.vim @@ -1,12 +1,15 @@ " Vim predefined user commands -" :CompilerSet - runtime/compiler/ +" :CompilerSet - runtime/compiler/*.vim CompilerSet makeprg=ant CompilerSet errorformat=\ %#[%.%#]\ %#%f:%l:%v:%*\\d:%*\\d:\ %t%[%^:]%#:%m, \%A\ %#[%.%#]\ %f:%l:\ %m,%-Z\ %#[%.%#]\ %p^,%C\ %#[%.%#]\ %#%m +" :SynColor - runtime/synmenu.vim + +SynColor Comment term=bold cterm=NONE ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#80a0ff guibg=NONE " :SynMenu - runtime/makemenu.vim @@ -19,3 +22,10 @@ SynMenu AB.ABEL:abel SynMenu AB.AceDB\ model:acedb SynMenu AB.Ada:ada +" :VimFold\a, :Vim9, :VimL - runtime/syntax/vim.vim + +VimFolda syntax region vimFoo start="foo" end="bar" + +Vim9 syntax keyword vim9Foo foo nextgroup=vim9Comment +VimL syntax keyword vimFoo foo nextgroup=vimComment + diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 34dec27728..21c9d3b568 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 10 +" Last Change: 2026 Aug 12 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -2404,7 +2404,16 @@ syn match vimBracket contained "[\\<>]" syn case match " User Command Highlighting: {{{2 -syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:space:]]\|$\)\@=' nextgroup=vimBang +" Note: assumes command runs to EOL, no explicit | support + +syn match vimUsrCmd contained '\%#=1\<\u[[:alnum:]]*\%([![:blank:]]\|$\)\@=' skipwhite nextgroup=vimUsrCmdBang,vimUsrCmdArgs +syn match vimUsrCmd_ contained '\%#=1\%(\%(N\%[ext]\|P\%[rint]\|X\)\>\)\@!\u[[:alnum:]]*\%([![:blank:]]\|$\)\@=' skipwhite nextgroup=vimUsrCmdBang,vimUsrCmdArgs +syn match vimUsrCmdBang contained "\w\@1<=!" skipwhite nextgroup=vimUsrCmdArgs +syn region vimUsrCmdArgs contained + \ start="\s\zs\S" + \ skip=+\n\s*\%(\\\|["#]\\ \)+ + \ end="$" + \ contains=@vimContinue " Vim user commands @@ -2423,7 +2432,12 @@ syn match vimSynColorGroup contained "\<\h\w*\>" skipwhite nextgroup=vimHiKeyLis syn keyword vimSynLink contained SynLink skipwhite nextgroup=vimSynLinkGroup syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup -syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu +" runtime/syntax/vim.vim +syn keyword vimVim9 contained Vim9 skipwhite nextgroup=vimSyntax +syn keyword vimVimL contained VimL skipwhite nextgroup=vimSyntax +syn match vimVimFold contained "\" skipwhite nextgroup=vimSyntax + +syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu,vimVimFold,vimVim9,vimVimL " Errors And Warnings: {{{2 " ==================== @@ -3342,6 +3356,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimUserCmdKey vimCommand hi def link vimUserFunc Normal hi def link vimUserFuncKey vimUserFunc + hi def link vimUsrCmdBang vimBang hi def link vimVar Normal hi def link vimVarKey vimVar hi def link vimVarScope Identifier @@ -3429,10 +3444,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimWincmd_ vimWincmd hi def link vimCompilerSet vimCommand - hi def link vimSynColor vimCommand - hi def link vimSynLink vimCommand + hi def link vimSynColor vimCommand + hi def link vimSynLink vimCommand hi def link vimSynMenu vimCommand hi def link vimSynMenuPath vimMenuName + hi def link vimVimFold vimCommand + hi def link vimVim9 vimCommand + hi def link vimVimL vimCommand endif From 7807dd22793da0e826618c0ca9c6210bbc1ea3f5 Mon Sep 17 00:00:00 2001 From: Fionn Fitzmaurice Date: Thu, 13 Aug 2026 18:41:59 +0000 Subject: [PATCH 358/647] patch 9.2.0957: filetype: ArgoCD config file is not recognized Problem: filetype: ArgoCD configuration file is not recognized Solution: Detect */argocd/config as yaml filetype (Fionn Fitzmaurice). Reference: https://argo-cd.readthedocs.io/en/latest/user-guide/commands/argocd_configure/#options-inherited-from-parent-commands closes: #21031 Signed-off-by: Fionn Fitzmaurice Signed-off-by: Christian Brabandt --- runtime/filetype.vim | 5 ++++- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 36b052ca36..7241efb45e 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: The Vim Project -" Last Change: 2026 Aug 08 +" Last Change: 2026 Aug 13 " Former Maintainer: Bram Moolenaar " If the filetype can be detected from extension or file name(the final path component), @@ -125,6 +125,9 @@ au BufNewFile,BufRead *.demo,*.dm{1,2,3,t},*.wxm,maxima-init.mac setf maxima " ObjectScript routine or assembly au BufNewFile,BufRead *.mac call dist#ft#FTmac() +" Argo CD configuration +au BufNewFile,BufRead */argocd/config setf yaml + " Assembly (all kinds) " *.lst is not pure assembly, it has two extra columns (address, byte codes) " *.[sS], *.[aA] usually Assembly - GNU diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 0b8f5a2a40..eb13b52e25 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -1007,7 +1007,7 @@ def s:GetFilenameChecks(): dict> xslt: ['file.xsl', 'file.xslt'], yacc: ['file.yy', 'file.yxx', 'file.y++'], yaml: ['file.yaml', 'file.yml', 'file.eyaml', 'file.kyaml', 'file.kyml', 'any/.bundle/config', '.clangd', '.clang-format', '.clang-tidy', 'file.mplstyle', 'matplotlibrc', 'yarn.lock', - '/home/user/.kube/config', '/home/user/.kube/kuberc', '.condarc', 'condarc', '.mambarc', 'mambarc', 'pixi.lock', 'buf.lock', 'file.ksy'], + '/home/user/.kube/config', '/home/user/.kube/kuberc', '.condarc', 'condarc', '.mambarc', 'mambarc', 'pixi.lock', 'buf.lock', 'file.ksy', 'any/argocd/config'], yang: ['file.yang'], yara: ['file.yara', 'file.yar'], yuck: ['file.yuck'], diff --git a/src/version.c b/src/version.c index 2be3c231f2..bfe2259433 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 957, /**/ 956, /**/ From 5d41506eb4895fbf0b6ccf4067c7f6e3c8ac568b Mon Sep 17 00:00:00 2001 From: Aliaksei Budavei <0x000c70@gmail.com> Date: Thu, 13 Aug 2026 18:51:53 +0000 Subject: [PATCH 359/647] runtime(sh): Selectively suppress matching syntax errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As a refinement upon "g:sh_no_error", support not matching particular classes of syntax errors. Look up syntax rule names and list them with: ‐----------------------------------------------------------- let g:sh_no_error_rules = ["shCurlyError", "shParenError"] ‐----------------------------------------------------------- closes: #20935 Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt --- runtime/doc/syntax.txt | 15 +- runtime/syntax/sh.vim | 138 ++++++++++-------- .../testdir/dumps/sh_functions_bash_00.dump | 10 +- .../testdir/dumps/sh_functions_bash_01.dump | 14 +- .../testdir/dumps/sh_functions_bash_02.dump | 16 +- .../testdir/dumps/sh_functions_bash_03.dump | 16 +- .../testdir/dumps/sh_functions_bash_04.dump | 16 +- .../testdir/dumps/sh_functions_bash_05.dump | 18 +-- .../testdir/dumps/sh_functions_bash_06.dump | 16 +- .../testdir/dumps/sh_functions_bash_07.dump | 16 +- .../syntax/testdir/input/sh_functions_bash.sh | 5 + 11 files changed, 150 insertions(+), 130 deletions(-) diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 577229ae37..1f63ccd4ab 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 08 +*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 13 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3707,12 +3707,15 @@ reduce this, the "sh_maxlines" internal variable can be set. Example: > The default is to use the twice sh_minlines. Set it to a smaller number to speed up displaying. The disadvantage is that highlight errors may appear. -syntax/sh.vim tries to flag certain problems as errors; usually things like -unmatched "]", "done", "fi", etc. If you find the error handling problematic -for your purposes, you may suppress such error highlighting by putting -the following line in your .vimrc: > +Unmatched "]", "done", "fi", etc., are highlighted as errors by default. If +you find this error handling problematic, you may suppress it with: > - let g:sh_no_error= 1 + let g:sh_no_error = 1 +< +As a refinement, you may suppress particular classes of errors by looking up +their syntax rule names and listing them with: > + + let g:sh_no_error_rules = ["shCurlyError", "shParenError"] < *sh-embed* *sh-awk* diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim index 901923b0d3..162a7750c9 100644 --- a/runtime/syntax/sh.vim +++ b/runtime/syntax/sh.vim @@ -3,7 +3,7 @@ " Maintainer: This runtime file is looking for a new maintainer. " Previous Maintainers: Charles E. Campbell " Lennart Schultz -" Last Change: 2026 Aug 06 by Vim Project +" Last Change: 2026 Aug 13 by Vim Project " Version: 208 " Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH " For options and settings, please use: :help ft-sh-syntax @@ -189,6 +189,30 @@ else com! -nargs=* ShFoldIfDoFor endif +" Set up syntax error commands for shell {{{1 +" ====================================== +if exists("g:sh_no_error_rules") && type(g:sh_no_error_rules) == type([]) + fun! s:ScanAndCondExecSynErrCmd(idx, cmd) abort + let parts = matchlist(a:cmd, '\(\(\S\+\)\s\+\(\S\+\)\s*\)\{2}') + " Do nothing for matchable names listed in "g:sh_no_error_rules". + if len(parts) < a:idx || index(g:sh_no_error_rules, parts[a:idx]) < 0 + exec a:cmd + endif + endfun +elseif exists("g:sh_no_error") + fun! s:ScanAndCondExecSynErrCmd(_, __) abort + endfun +else + fun! s:ScanAndCondExecSynErrCmd(_, cmd) abort + exec a:cmd + endfun +endif + +" Read shFooError from "syn match shFooError ''" etc. +com! -nargs=+ ShDefSynErrRule call s:ScanAndCondExecSynErrCmd(2, ) +" Read shFooError from "hi def link shFooError Error". +com! -nargs=+ ShLinkSynErrGroup call s:ScanAndCondExecSynErrCmd(3, ) + " Generate bracket expression items {{{1 " ================================= " Note that the following function can be invoked as many times as necessary @@ -323,20 +347,18 @@ endif " Error Codes: {{{1 " ============ -if !exists("g:sh_no_error") - syn match shDoError "\" - syn match shIfError "\" - syn match shInError "\" - syn match shCaseError ";;" - syn match shEsacError "\" - syn match shCurlyError "}" - syn match shParenError ")" - syn match shOK '\.\(done\|fi\|in\|esac\)' - if exists("b:is_kornshell") || exists("b:is_bash") - syn match shDTestError "]]" - endif - syn match shTestError "]" +ShDefSynErrRule syn match shDoError "\" +ShDefSynErrRule syn match shIfError "\" +ShDefSynErrRule syn match shInError "\" +ShDefSynErrRule syn match shCaseError ";;" +ShDefSynErrRule syn match shEsacError "\" +ShDefSynErrRule syn match shCurlyError "}" +ShDefSynErrRule syn match shParenError ")" +ShDefSynErrRule syn match shOK '\.\%(done\|fi\|in\|esac\)' +if exists("b:is_kornshell") || exists("b:is_bash") + ShDefSynErrRule syn match shDTestError "]]" endif +ShDefSynErrRule syn match shTestError "]" " Options: {{{1 " ==================== @@ -427,8 +449,8 @@ ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\" en syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_ksh88")) syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained -elseif !exists("g:sh_no_error") - syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained +else + ShDefSynErrRule syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained endif syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained @@ -472,8 +494,8 @@ if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix") syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList syn match shSkipInitWS contained "^\s\+" syn region shArithParen matchgroup=shArithRegion contained start="(" end=")" contains=@shArithParenList -elseif !exists("g:sh_no_error") - syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList +else + ShDefSynErrRule syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList endif syn region shCmdParenRegion matchgroup=shCmdSubRegion start="((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList @@ -534,9 +556,9 @@ if exists("b:is_bash") || exists("b:is_kornshell") syn match shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial nextgroup=shSpecialNxt syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial nextgroup=shSpecialNxt -elseif !exists("g:sh_no_error") - syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial - syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial +else + ShDefSynErrRule syn region shExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial + ShDefSynErrRule syn region shExDoubleQuote matchgroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial endif syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart,shSpecialSQ syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@()" transparent nextgroup=shVariable " Claim commented out function declaration headers. syn match shFunctionComment "^\s*\zs\ze#" transparent nextgroup=shComment - - if !exists("g:sh_no_error") - syn match shFunctionNameAssignError "\%#=1\%(\%(\<\h\w*\)\@>=\)\%(\%(\w\+\)\@>=\=\)\+()" skipwhite skipnl nextgroup=shExpr,shSubSh - syn match shFunctionNameCommentError "#" contained - endif + ShDefSynErrRule syn match shFunctionNameAssignError "\%#=1\%(\%(\<\h\w*\)\@>=\)\%(\%(\w\+\)\@>=\=\)\+()" skipwhite skipnl nextgroup=shExpr,shSubSh + ShDefSynErrRule syn match shFunctionNameCommentError "#" contained elseif exists("b:is_ksh88") " AT&T ksh88 syn match shFunctionCmdOne "^\s*\zs\h\w*\s*()\ze\_s*\%(\%(for\|case\|select\|if\|while\|until\)\>\|\[\[\s\|((\)" skipwhite skipnl nextgroup=@shFunctionCmds contains=shFunctionParens @@ -695,17 +714,13 @@ else syn match shFunctionFour "\<\h\w*\>\s*()\ze\_s*(" contained skipwhite skipnl nextgroup=shFunctionSubSh contains=shFunctionParens endif -if !exists("g:sh_no_error") - syn match shDoError "\d+0#af5f00255#ffffff0|o|n|e| +0#0000000&@68 | +0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|e|n|c|e| @66 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|w+0#00e0e07#ffffff0|h|i|l|e|s|(+0#e000e06&|)| +0#0000000&|w+0#af5f00255&|h|i|l|e| |f|a|l|s|e|;| |d|o| +0#0000000&|:|;+0#af5f00255&| +0#0000000&|d+0#af5f00255&|o|n|e|;+0#0000000&| |w|h|i|l|e|s| @32 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -|-+0#0000e05#a8a8a8255| >e+0#00e0e07#ffffff0|l|s|e|w|h|e|r|e|(+0#e000e06&|)| +0#0000000&|i+0#af5f00255&|f| |:+0#0000000&| @56 +|-+0#0000e05#a8a8a8255| |e+0#00e0e07#ffffff0|l|s|e|w|h|e|r|e|(+0#e000e06&|)| +0#0000000&|i+0#af5f00255&|f| |:+0#0000000&| @56 ||+0#0000e05#a8a8a8255| |t+0#af5f00255#ffffff0|h|e|n| +0#0000000&|:|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i|;+0#0000000&| |e|l|s|e|w|h|e|r|e| @51 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |s+0#00e0e07#ffffff0|e|l|e|c|t|o|r|(+0#e000e06&|)| +0#0000000&|s+0#af5f00255&|e|l|e|c|t| |x+0#0000000&| |i+0#af5f00255&|n| +0#0000000&|1+0#e000002&| +0#0000000&|2+0#e000002&|;+0#0000000&| |d+0#af5f00255&|o| +0#0000000&@42 @@ -12,9 +17,4 @@ | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|e|l|e|c|t|o|r| |0+0#e000002&|<+0#af5f00255&|/+0#0000000&|d|e|v|/|n|u|l@1| |2+0#e000002&|>+0#af5f00255&|/+0#0000000&|d|e|v|/|n|u|l@1| ||@1| |:| @35 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|c+0#00e0e07#ffffff0|a|s|e|d|(+0#e000e06&|)| +0#0000000&|c+0#af5f00255&|a|s|e| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|#|"+0#af5f00255&| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|*|)+0#af5f00255&| +0#0000000&|:|;+0#af5f00255&@1| +0#0000000&|e+0#af5f00255&|s|a|c|;+0#0000000&| |c|a|s|e|d| @33 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 -| +0#0000e05#a8a8a8255@1|f+0#00e0e07#ffffff0|o|r|e|(+0#e000e06&|)| +0#0000000&@66 -| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|o|r| +0#0000000&|x| |i+0#af5f00255&|n| +0#0000000&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&@60 -|-+0#0000e05#a8a8a8255| |d+0#af5f00255#ffffff0|o| +0#0000000&@70 -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|:| @67 @57|1|9|,|1| @9|1@1|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump index 349680a558..53bb1a60b7 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_02.dump @@ -1,9 +1,14 @@ -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|:| @67 +| +0#0000e05#a8a8a8255@1|c+0#00e0e07#ffffff0|a|s|e|d|(+0#e000e06&|)| +0#0000000&|c+0#af5f00255&|a|s|e| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|#|"+0#af5f00255&| +0#0000000&|i+0#af5f00255&|n| +0#0000000&|*|)+0#af5f00255&| +0#0000000&|:|;+0#af5f00255&@1| +0#0000000&|e+0#af5f00255&|s|a|c|;+0#0000000&| |c|a|s|e|d| @33 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|f+0#00e0e07#ffffff0|o|r|e|(+0#e000e06&|)| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|o|r| +0#0000000&|x| |i+0#af5f00255&|n| +0#0000000&|1+0#e000002&| +0#0000000&|2+0#e000002&| +0#0000000&@60 +|-+0#0000e05#a8a8a8255| |d+0#af5f00255#ffffff0|o| +0#0000000&@70 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3>:| @67 ||+0#0000e05#a8a8a8255| |d+0#af5f00255#ffffff0|o|n|e| +0#0000000&@68 | +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o|r|e| @68 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|i+0#00e0e07#ffffff0|f@1|y|(+0#e000e06&|)| +0#0000000&|f+0#af5f00255&|o|r| |(@1|;@1|)@1| +0#0000000&@55 -|-+0#0000e05#a8a8a8255| >d+0#af5f00255#ffffff0|o| +0#0000000&@70 +|-+0#0000e05#a8a8a8255| |d+0#af5f00255#ffffff0|o| +0#0000000&@70 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|b+0#af5f00255&|r|e|a|k| +0#0000000&@63 ||+0#0000e05#a8a8a8255| |d+0#af5f00255#ffffff0|o|n|e| +0#0000000&@68 | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|f@1|y| @68 @@ -12,9 +17,4 @@ ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|!+0#00e0e07&|?|#|(+0#e000e06&|)| +0#0000000&@54 |-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|(+0#0000001#ffff4012| +0#0000000#ffffff0@67 |-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|@+0#00e0e07&|α|!| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@50 -|3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@11|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@51 -|3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|}+0#0000001#ffff4012| +0#0000000#ffffff0@63 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|@|α|!+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@56 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|)+0#0000001#ffff4012| +0#0000000#ffffff0@67 -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|v|a|l| +0#0000000&|!+0#af5f00255&|?+0#0000000&|\+0#e000e06&|#| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|"|$|1|\|"|"+0#af5f00255&| +0#0000000&@50 -@57|3|7|,|1| @9|2|8|%| +@57|3|7|,|5| @9|2|7|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump index c81798152a..9cce6dfd5a 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_03.dump @@ -1,9 +1,14 @@ -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|v|a|l| +0#0000000&|!+0#af5f00255&|?+0#0000000&|\+0#e000e06&|#| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|"|$|1|\|"|"+0#af5f00255&| +0#0000000&@50 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|@+0#00e0e07&|α|!| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@50 +|3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@11|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@51 +|3+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|}+0#0000001#ffff4012| +0#0000000#ffffff0@63 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|@|α|!+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@56 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|)+0#0000001#ffff4012| +0#0000000#ffffff0@67 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3>e+0#af5f00255&|v|a|l| +0#0000000&|!+0#af5f00255&|?+0#0000000&|\+0#e000e06&|#| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|"|$|1|\|"|"+0#af5f00255&| +0#0000000&@50 ||+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|i| +0#0000000&@70 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|n+0#00e0e07#ffffff0|a|m|e|s|p|a|c|e| |(+0#e000e06&|)| +0#0000000&@60 |-+0#0000e05#a8a8a8255| |{+0#0000001#ffff4012| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|#|;+0#af5f00255&| +0#0000000&@62 -||+0#0000e05#a8a8a8255| >}+0#0000001#ffff4012|;+0#0000000#ffffff0| |n|a|m|e|s|p|a|c|e| |$+0#e000e06&|@| +0#0000000&@57 +||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |n|a|m|e|s|p|a|c|e| |$+0#e000e06&|@| +0#0000000&@57 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |W|h|e|t|h|e|r| |"|=|"| |b|e|l|o|n|g|s| |t|o| |a| |n|a|m|e| |o|r| |d|e|l|i|m|i|t|s| |a| |n|a|m|e| |d|e|p|e|n|d|s| |o|n| |w|h|e|t|h|e|r| +0#0000000&@3 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |t|h|e| |r|e|s|e|r|v|e|d| |w|o|r|d| |"|f|u|n|c|t|i|o|n|"| |i|s| |p|r|e|s|e|n|t|,| |i|f| |s|o|,| |t|h|e|n| |"|=|"| |i|s| |p|a|r|t| |o|f| +0#0000000&@3 @@ -12,9 +17,4 @@ | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |"|=|"|;| |o|t|h|e|r|w|i|s|e|,| |"|=|"| |i|s| |p|a|r|t| |o|f| |t|h|e| |f|u|n|c|t|i|o|n| |n|a|m|e| |w|h|e|n| |t|h|i|s| |n|a|m|e| |h|a|s| +0#0000000&@3 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |o|n|e| |o|r| |m|o|r|e| |s|u|p@1|o|r|t|e|d| |N|O|N|-|a|l|p|h|a|n|u|m|e|r|i|c| |(|o|r| |"|_|"|)| |c|h|a|r|a|c|t|e|r|s| |b|e|f|o|r|e| |"|=|"|.| +0#0000000& | +0#0000e05#a8a8a8255@1|x+0#00e0e07#ffffff0|s|=+0#0000000&|(+0#e000e06&|)| +0#0000000&@67 -| +0#0000e05#a8a8a8255@1|(+0#e000e06#ffffff0| +0#0000000&@71 -| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |1+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1| +0#0000000&@43 -| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|x+0#00e0e07&|s|=+0#0000000&|(+0#e000e06&|)| +0#0000000&@63 -| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|{| +0#0000000&@67 -| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@7|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |2+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1| +0#0000000&@39 -@57|5@1|,|1| @9|4@1|%| +@57|5@1|,|5| @9|4|2|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump index 73488d28aa..c382653cd1 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_04.dump @@ -1,9 +1,14 @@ -| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@7|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |2+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1| +0#0000000&@39 +| +0#0000e05#a8a8a8255@1|x+0#00e0e07#ffffff0|s|=+0#0000000&|(+0#e000e06&|)| +0#0000000&@67 +| +0#0000e05#a8a8a8255@1|(+0#e000e06#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |1+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1| +0#0000000&@43 +| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|x+0#00e0e07&|s|=+0#0000000&|(+0#e000e06&|)| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|{| +0#0000000&@67 +| +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@7>e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |2+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1| +0#0000000&@39 | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@7|x+0#00e0e07&|s|=+0#0000000&|(+0#e000e06&|)| +0#0000000&@59 | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@7|i+0#af5f00255&|f| |:+0#e000e06&|;+0#af5f00255&| +0#e000e06&|t+0#af5f00255&|h|e|n| +0#e000e06&|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@1| |3+0#e000002&| +0#e000e06&|+| |$|{|#|x|s|[|*+0#0000000&|]+0#e000e06&|}| |)@1|;+0#af5f00255&| +0#e000e06&|f+0#af5f00255&|i| +0#0000000&@24 | +0#0000e05#a8a8a8255@1| +0#e000e06#ffffff0@3|}| +0#0000000&@67 | +0#0000e05#a8a8a8255@1|)+0#e000e06#ffffff0| +0#0000000&@71 -| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |i+0#00e0e07#ffffff0|δ|=|(+0#e000e06&|)| +0#0000000&|(+0#0000001#ffff4012| +0#0000000#ffffff0@65 |-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|=+0#00e0e07&|i|d|=|(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@60 |2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|=+0#00e0e07&@2|(+0#e000e06&|)| +0#0000000&@59 @@ -12,9 +17,4 @@ ||+0#0000e05#a8a8a8255| |)+0#0000001#ffff4012|;+0#0000000#ffffff0| |i+0#af5f00255&|d|=| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&|i|δ|=+0#af5f00255&| +0#0000000&@54 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|(+0#e000e06&|)| +0#0000000&|(+0#0000001#ffff4012| +0#0000000#ffffff0@57 -|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@54 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f|=| +0#0000000&@51 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|*|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i|;| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&|\+0#e000e06&|=| +0#0000000&|$+0#e000e06&|*| +0#0000000&@31 -|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}+0#0000001#ffff4012|;+0#af5f00255#ffffff0| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&| |$+0#e000e06&|*| +0#0000000&@58 -||+0#0000e05#a8a8a8255| |)+0#0000001#ffff4012|;+0#0000000#ffffff0| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 -@57|7|3|,|0|-|1| @7|6|1|%| +@57|7|3|,|9| @9|5|8|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump index bf354f4741..32d12a03ab 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_05.dump @@ -1,9 +1,14 @@ -||+0#0000e05#a8a8a8255| |)+0#0000001#ffff4012|;+0#0000000#ffffff0| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 +|-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|(+0#e000e06&|)| +0#0000000&|(+0#0000001#ffff4012| +0#0000000#ffffff0@57 +|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@54 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|=|f|=| +0#0000000&@51 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|*|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i|;| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&|\+0#e000e06&|=| +0#0000000&|$+0#e000e06&|*| +0#0000000&@31 +|2+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}+0#0000001#ffff4012|;+0#af5f00255#ffffff0| +0#0000000&|f|\+0#e000e06&|=|f+0#0000000&| |$+0#e000e06&|*| +0#0000000&@58 +||+0#0000e05#a8a8a8255| >)+0#0000001#ffff4012|;+0#0000000#ffffff0| |f+0#00e0e07&|=+0#0000000&| |f|\|=+0#af5f00255&| +0#0000000&|f+0#00e0e07&|=+0#0000000&| |f+0#00e0e07&|=+0#0000000&| @57 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0|f|u|n|c|t|i|o|n|(|)| |{| +0#0000000&@59 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| @2|e|c|h|o| |"|$|1|"| +0#0000000&@59 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0|}| +0#0000000&@70 -| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|u|n|c|t|i|o|n| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@53 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|s+0#af5f00255&|e|t| +0#00e0e07&|-@1| |$+0#e000e06&|{|*|/+0#af5f00255&|\+0#0000000&| @56 ||+0#0000e05#a8a8a8255| |#+0#0000000#ffffff0|.|/+0#af5f00255&|}+0#e000e06&| +0#0000000&@68 @@ -11,10 +16,5 @@ ||+0#0000e05#a8a8a8255| |#+0&#ffffff0|.|f|\| @1|$|*| |2|>|/|d|e|v|/|n|u|l@1|`+0#e000e06&|;+0#af5f00255&|:+0#0000000&| |#+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E|:+0#0000e05#ffffff0| |N|o|t| |a| |c|o|m@1|e|n|t| |(|%|\|)| +0#0000000&@21 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|s+0#af5f00255&|e|t| +0#00e0e07&|-@1| |$+0#e000e06&|{|*|%+0#af5f00255&|.+0#0000000&|}+0#e000e06&| +0#0000000&@55 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|l+0#af5f00255&|o|c|a|l| +0#0000000&|I+0#e000e06&|F|S|=+0#af5f00255&|++0#0000000&| @57 -||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@2|"+0#af5f00255&|$+0#e000e06&|{|*|\+0#ffffff16#ff404010| +0#0000000#ffffff0@54 -||+0#0000e05#a8a8a8255| |#+0#ffffff16#ff404010|f|u|n|c|t|i|o|n|(|)|}+0#e000e06#ffffff0|"+0#af5f00255&|)+0#e000e06&| |/| |$|{|\+0#ffffff16#ff404010| +0#0000000#ffffff0@52 -||+0#0000e05#a8a8a8255| |#+0#ffffff16#ff404010|}+0#e000e06#ffffff0| |+| |1+0#e000002&|6|\+0#e000e06&| +0#0000000&@64 -||+0#0000e05#a8a8a8255| |#+0&#ffffff0|0|\| +0#0000000&@69 -||+0#0000e05#a8a8a8255| |)+0#e000e06#ffffff0@1|;+0#af5f00255&|:+0#0000000&| |#+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E|:+0#0000e05#ffffff0| |N|o|t| |a| |c|o|m@1|e|n|t| |(|1|6|\|)| +0#0000000&@39 -||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|f|u+0#e000002&|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|$+0#e000e06&|@| +0#0000000&@50 -@57|9|1|,|0|-|1| @7|7@1|%| +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@2|"+0#af5f00255&|$+0#e000e06&|{|*|\| +0#0000000&@54 +@57|9|1|,|1| @9|7|4|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump index 8ce19c9131..f0e7db401f 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_06.dump @@ -1,9 +1,14 @@ -||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|f|u+0#e000002&|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|$+0#e000e06&|@| +0#0000000&@50 +||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|$+0#e000e06&|(@2|"+0#af5f00255&|$+0#e000e06&|{|*|\| +0#0000000&@54 +||+0#0000e05#a8a8a8255| |#+0#e000e06#ffffff0|f|u|n|c|t|i|o|n|(|)|}|"+0#af5f00255&|)+0#e000e06&| |/| |$|{|\| +0#0000000&@52 +||+0#0000e05#a8a8a8255| |#+0#e000e06#ffffff0|}| |+| |1+0#e000002&|6|\+0#e000e06&| +0#0000000&@64 +||+0#0000e05#a8a8a8255| |#+0&#ffffff0|0|\| +0#0000000&@69 +||+0#0000e05#a8a8a8255| |)+0#e000e06#ffffff0@1|;+0#af5f00255&|:+0#0000000&| |#+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E|:+0#0000e05#ffffff0| |N|o|t| |a| |c|o|m@1|e|n|t| |(|1|6|\|)| +0#0000000&@39 +||+0#0000e05#a8a8a8255| >}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|\+0#e000e06&|f|u+0#e000002&|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|$+0#e000e06&|@| +0#0000000&@50 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|f+0#00e0e07&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n| |(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@41 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 ||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |e+0#af5f00255&|v|a|l| +0#0000000&|"+0#af5f00255&|f+0#e000002&|u|n|c|t|i|o|n|#|f|u|n|c|t|i|o|n|"+0#af5f00255&| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@40 -| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 |-+0#0000e05#a8a8a8255| |f+0#00e0e07#ffffff0|u|n|c|t|i|o|n|#| |(+0#e000e06&|)| +0#0000000&|{+0#0000001#ffff4012| +0#0000000#ffffff0@58 ||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 ||+0#0000e05#a8a8a8255| |}+0#0000001#ffff4012|;+0#0000000#ffffff0| |f|u|n|c|t|i|o|n|#| |"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@55 @@ -12,9 +17,4 @@ | +0#0000e05#a8a8a8255@1|f+0#ffffff16#ff404010|=|f|(|)| +0#0000000#ffffff0@67 | +0#0000e05#a8a8a8255@1|{+0#e000e06#ffffff0| +0#0000000&@71 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f+0#ffffff16#ff404010|=|f|=|(|)| +0#0000000#ffffff0@62 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|(+0#af5f00255&| +0#0000000&@67 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|f+0#ffffff16#ff404010|=|f|=|f|(|)| +0#0000000#ffffff0@57 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|:|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i| +0#0000000&@48 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|)+0#af5f00255&| +0#0000000&@67 -| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 -@57|1|0|9|,|0|-|1| @6|9|4|%| +@57|1|0|9|,|1| @8|9|0|%| diff --git a/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump b/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump index 7dea3a44df..656794a863 100644 --- a/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump +++ b/runtime/syntax/testdir/dumps/sh_functions_bash_07.dump @@ -1,9 +1,14 @@ -| +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|f+0#ffffff16#ff404010|=|f|=|(|)| +0#0000000#ffffff0@62 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|(+0#af5f00255&| +0#0000000&@67 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|f+0#ffffff16#ff404010|=|f|=|f|(|)| +0#0000000#ffffff0@57 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@7|i+0#af5f00255&|f| |:+0#0000000&|;+0#af5f00255&| +0#0000000&|t+0#af5f00255&|h|e|n| +0#0000000&|:|;+0#af5f00255&| +0#0000000&|f+0#af5f00255&|i| +0#0000000&@48 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|)+0#af5f00255&| +0#0000000&@67 +| +0#0000e05#a8a8a8255@1>}+0#e000e06#ffffff0| +0#0000000&@71 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |I|d|e|n|t|i|f|i|e|r|s| |c|a|n@1|o|t| |h|a|v|e| |a| |l|e|a|d|i|n|g| |"|#|"| |i|n| |t|h|e|i|r| |n|a|m|e|s| |u|n|l|e|s@1| |t|h|e| |s|h|e|l@1| +0#0000000&@1 | +0#0000e05#a8a8a8255@1|#+0&#ffffff0| |o|p|t|i|o|n| |"|i|n|t|e|r|a|c|t|i|v|e|_|c|o|m@1|e|n|t|s|"| |i|s| |u|n|s|e|t| |a|n|d| |i|s| |i|n| |e|f@1|e|c|t|.| +0#0000000&@14 | +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|#+0#ffffff16#ff404010|f+0#0000000#ffffff0|u|n|c|t|i|o|n|(+0#e000e06&|)| +0#0000000&|{+0#e000e06&| +0#0000000&@50 -| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3>e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|e+0#af5f00255&|c|h|o| +0#e000002&|"+0#af5f00255&|$+0#e000e06&|1|"+0#af5f00255&| +0#0000000&@59 | +0#0000e05#a8a8a8255@1|}+0#e000e06#ffffff0| +0#0000000&@71 |~+0#4040ff13&| @73 |~| @73 @@ -12,9 +17,4 @@ |~| @73 |~| @73 |~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|2|7|,|5| @8|B|o|t| +| +0#0000000&@56|1|2|7|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/input/sh_functions_bash.sh b/runtime/syntax/testdir/input/sh_functions_bash.sh index 2a1c4ec616..d91905640d 100644 --- a/runtime/syntax/testdir/input/sh_functions_bash.sh +++ b/runtime/syntax/testdir/input/sh_functions_bash.sh @@ -3,6 +3,11 @@ # VIM_TEST_SETUP let g:sh_fold_enabled = 1 + 2 + 4 # VIM_TEST_SETUP highlight link shFunctionExprRegion Todo # VIM_TEST_SETUP highlight link shFunctionSubShRegion Todo +# VIM_TEST_SETUP let g:sh_no_error_rules = ['shDerefWordError'] + + + + typeset -i n=0 doosie() ((n+=1)); doosie donee() [[ -n $# ]]; donee From a0f057dacf53d8733f98e43a472854d6d71b6173 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 16 Aug 2026 15:38:18 +0000 Subject: [PATCH 360/647] runtime(doc): Tweak documentation style a bit closes: #21061 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/eval.txt | 19 ++++++++++--------- runtime/doc/options.txt | 5 +++-- runtime/doc/print.txt | 8 ++++---- runtime/doc/version9.txt | 6 +++--- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index fe3545e3d5..d2b5bb478f 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 9.2. Last change: 2026 Aug 13 +*eval.txt* For Vim version 9.2. Last change: 2026 Aug 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1703,7 +1703,8 @@ number ------ number number constant *expr-number* - *0x* *hex-number* *0o* *octal-number* *0b* *binary-number* + *0x* *hex-number* *0o* *octal-number* + *0b* *binary-number* Integer numbers can be written in multiple forms: {N} decimal @@ -1719,8 +1720,8 @@ Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get 0xffffffffffffffff. -In |scriptversion-4| and in |Vim9| script, single quotes may appear between digits -to improve readability; these are ignored. +In |scriptversion-4| and in |Vim9| script, single quotes may appear between +digits to improve readability; these are ignored. A leading "+" or "-" is not part of an integer literal. E.g., -123 is an expression, the unary operator |expr-unary--| applied to the number 123. @@ -1741,9 +1742,9 @@ Floating point numbers can be written in two forms: {N}.{M} {N}.{M}[eE][-+]{exp} -{N} and {M} are sequences of decimal digits. In |scriptversion-1| (the default) -{N} and {M} must be present. In |scriptversion-2| or higher and in |Vim9| script -{N} is optional. +{N} and {M} are sequences of decimal digits. In |scriptversion-1| (the +default) {N} and {M} must be present. In |scriptversion-2| or higher and in +|Vim9| script {N} is optional. {exp} is the exponent, power of 10. Only a decimal point is accepted, not a comma. No matter what the current locale is. @@ -1752,8 +1753,8 @@ In |scriptversion-4| and in |Vim9| script, single quotes may appear between the digits in {N} to improve readability; these are ignored. A leading "+" or "-" is not part of a floating point literal. E.g., -1.0e-3 -is an expression, the unary operator |expr-unary--| applied to the float 1.0e-3. -The "-" in the exponent is part of the literal. +is an expression, the unary operator |expr-unary--| applied to the float +1.0e-3. The "-" in the exponent is part of the literal. Examples: 123.456 diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 869cc9f984..64ab681230 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 10 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7344,7 +7344,8 @@ A jump table for the options with a short description can be found at |Q_op|. emoji might be rendered beyond the bounding box of drawing cell. - Other render types are currently not supported. See also 'guiligatures'. + Other render types are currently not supported. See also + 'guiligatures'. *'report'* 'report' number (default 2) diff --git a/runtime/doc/print.txt b/runtime/doc/print.txt index 392ad26878..3d5b8bdceb 100644 --- a/runtime/doc/print.txt +++ b/runtime/doc/print.txt @@ -1,4 +1,4 @@ -*print.txt* For Vim version 9.2. Last change: 2026 Aug 02 +*print.txt* For Vim version 9.2. Last change: 2026 Aug 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -404,8 +404,8 @@ of |:hardcopy|: first line on a new page. format:postscript (default) Output format: Postscript - format:{name} Output format from this table (only used when compiled - with |+pango| feature): + format:{name} Output format from this table: + {only available when compiled with |+pango| feature} {name} meaning ~ postscript Generate Postscript pdf Generate Adobe PDF @@ -739,7 +739,7 @@ If Vim is compiled with |+pango|, then it will render pages using Pango (a text handling library), and Cairo (a graphics library). The benefit of this is that Unicode is fully supported. Postscript files will still be generated using Cairo. Additionally, PDF files can be emitted as well, see the -"format" key in |popt-option| +"format" key in |popt-option|. When using the GTK GUI, |+pango| is always enabled and used. On terminal builds of Vim, "--enable-hardcopy-pango" must be passed to the configure diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index ab0e93657d..f38fe16939 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 13 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52590,7 +52590,7 @@ GUI ~ - Added experimental support for the GTK 4 GUI (via patch 9.2.0501 and many following), enable with `--enable-gui=gtk4` configure switch at build time. - Add support for fullscreen mode in the GTK UI |'go-s'|. -- Enable native printing dialog for the GTK4 UI using pango library, see +- Enable native printing dialog for the GTK4 UI using Pango library, see |pango-printing|. Popups ~ @@ -52743,7 +52743,7 @@ Highlighting: ~ Configure Switches: ~ ---enable-hardcopy-pango Enable the pango |:hardcopy| backend |pango-printing| +--enable-hardcopy-pango Enable the Pango |:hardcopy| backend |pango-printing| ============================================================================== PATCHES *patches-9.3* *bug-fixes-9.3* From d4703e569d655c2db1642425ec649edeeaa57751 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 16 Aug 2026 15:42:56 +0000 Subject: [PATCH 361/647] patch 9.2.0958: Vim9: wrong type for the rest of a tuple in an unpack assignment Problem: In an unpack assignment the variable after the ";" gets the type of the whole tuple instead of the type of the remaining items. When the assigned value has type "any" it even gets a list type, so that a tuple cannot be assigned to it later (Mao-Yining). Solution: Give the variable the type of the remaining items. Keep "any" when it is not known whether a list or a tuple is assigned (Hirohito Higashi). fixes: #21057 fixes: #21058 closes: #21059 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/vim9.txt | 11 ++++++- src/testdir/test_tuple.vim | 41 ++++++++++++++++++++++++ src/testdir/test_vim9_disassemble.vim | 1 + src/version.c | 2 ++ src/vim9compile.c | 5 +++ src/vim9instr.c | 45 +++++++++++++++++++++++++++ src/vim9type.c | 3 +- 7 files changed, 106 insertions(+), 2 deletions(-) diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index be987bf021..e69b62acd7 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.2. Last change: 2026 Jul 29 +*vim9.txt* For Vim version 9.2. Last change: 2026 Aug 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -583,6 +583,15 @@ possible. Each variable can have a type or infer it from the value: > Use this only when there is a list with values, declaring one variable per line is much easier to read and change later. +The type of a variable that does not have a declared type is the type of the +value it gets. The variable after the ";" gets the remaining items: for a +list this is a list of the same member type, for a tuple this is a tuple of +the types of the remaining items: > + var [v1; v2] = [1, 2, 3] # v2 has type list + var [v3; v4] = (1, 'a', true) # v4 has type tuple +When the value has type "any" the item types are not known and every variable +gets type "any". + Constants ~ *vim9-const* *vim9-final* diff --git a/src/testdir/test_tuple.vim b/src/testdir/test_tuple.vim index ace890c040..00428a5b00 100644 --- a/src/testdir/test_tuple.vim +++ b/src/testdir/test_tuple.vim @@ -632,6 +632,47 @@ func Test_multi_assign_from_tuple() END call v9.CheckSourceSuccess(lines) + " The rest gets the type of the remaining items, not of the whole tuple + let lines =<< trim END + vim9script + def Fn() + var t: tuple, list> = ({}, []) + var [a; b] = t + assert_equal('tuple>', typename(b)) + b = ([],) + enddef + Fn() + END + call v9.CheckSourceSuccess(lines) + + " The rest of a tuple literal also gets the remaining item types + let lines =<< trim END + vim9script + def Fn() + var [a; b] = (true, false, true) + assert_equal((false, true), b) + assert_equal('tuple', typename(b)) + enddef + Fn() + END + call v9.CheckSourceSuccess(lines) + + " The rest of a value with type "any" can be a tuple + let lines =<< trim END + vim9script + var d: dict, list>> + def Fn(): tuple, list> + return ({}, []) + enddef + def Test() + var [a; b] = d->get('a', (-1, {}, [])) + b = Fn() + assert_equal('tuple, list>', typename(b)) + enddef + Test() + END + call v9.CheckSourceSuccess(lines) + let lines =<< trim END VAR [v1, v2] = ('a', 'b', 'c') END diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index 759226a417..88e794ec79 100644 --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -656,6 +656,7 @@ def Test_disassemble_list_assign() '\d\+ CHECKTYPE string stack\[-1\] var 2\_s*' .. '\d\+ STORE $1\_s*' .. '\d\+ SLICE 2\_s*' .. + '\d\+ CHECKTYPE list stack\[-1\] var 3\_s*' .. '\d\+ STORE $2\_s*' .. '\d\+ RETURN void', res) diff --git a/src/version.c b/src/version.c index bfe2259433..9be27f5a33 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 958, /**/ 957, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 65d7580f90..2aeef40959 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3060,6 +3060,11 @@ compile_assign_list_check_rhs_type(cctx_T *cctx, cac_T *cac) TYPECHK_TUPLE_OK, -1, 0, cctx, FALSE, FALSE) == FAIL) return FAIL; + // The check accepts both a list and a tuple. Keep "any", making it a list + // would reject a tuple later on. + if (stacktype->tt_type == VAR_ANY) + set_type_on_stack(cctx, &t_any, 0); + if (stacktype->tt_type == VAR_TUPLE) { if (stacktype->tt_argcount != 1) diff --git a/src/vim9instr.c b/src/vim9instr.c index 5e9ab38b7b..069818b350 100644 --- a/src/vim9instr.c +++ b/src/vim9instr.c @@ -1089,6 +1089,43 @@ generate_GETITEM(cctx_T *cctx, int index, int with_op) return push_type_stack(cctx, item_type); } +/* + * Set the type of the tuple that is left after dropping the first "count" + * items of the tuple with type "type". + */ + static void +set_tuple_slice_type_on_stack(type_T *type, int count, cctx_T *cctx) +{ + garray_T tuple_types_ga; + + // The item types are only known for a tuple with a fixed number of items. + if ((type->tt_flags & TTFLAG_VARARGS) || type->tt_argcount <= count) + { + set_type_on_stack(cctx, &t_tuple_any, 0); + return; + } + + ga_init2(&tuple_types_ga, sizeof(type_T *), 10); + + for (int i = count; i < type->tt_argcount; i++) + { + if (ga_grow(&tuple_types_ga, 1) == FAIL) + { + ga_clear(&tuple_types_ga); + set_type_on_stack(cctx, &t_tuple_any, 0); + return; + } + ((type_T **)tuple_types_ga.ga_data)[tuple_types_ga.ga_len] = + type->tt_args[i]; + tuple_types_ga.ga_len++; + } + + set_type_on_stack(cctx, + get_tuple_type(&tuple_types_ga, cctx->ctx_type_list), 0); + + ga_clear(&tuple_types_ga); +} + /* * Generate an ISN_SLICE instruction with "count". */ @@ -1096,11 +1133,19 @@ generate_GETITEM(cctx_T *cctx, int index, int with_op) generate_SLICE(cctx_T *cctx, int count) { isn_T *isn; + type_T *type; RETURN_OK_IF_SKIP(cctx); if ((isn = generate_instr(cctx, ISN_SLICE)) == NULL) return FAIL; isn->isn_arg.number = count; + + // Slicing a tuple leaves a tuple with the remaining item types, not the + // type of the whole tuple. + type = get_type_on_stack(cctx, 0); + if (type->tt_type == VAR_TUPLE) + set_tuple_slice_type_on_stack(type, count, cctx); + return OK; } diff --git a/src/vim9type.c b/src/vim9type.c index dfa6686a98..49179c722d 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -2373,7 +2373,8 @@ get_item_type(type_T *type) return type->tt_args[0]; } - return type->tt_member; + // For "any" the item type is not known. + return type->tt_member == NULL ? &t_any : type->tt_member; } /* From 381da9f8590ed26d1f577f6abd4cd91d01b7624b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Aug 2026 15:53:20 +0000 Subject: [PATCH 362/647] CI: Bump github/codeql-action Bumps the github-actions group with 1 update in the / directory: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 4.37.4 to 4.37.6 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.37.4...v4.37.6) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.37.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... closes: #21054 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 04b24ede24..64bdb95daf 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.4 + uses: github/codeql-action/init@v4.37.6 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.37.4 + uses: github/codeql-action/autobuild@v4.37.6 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.4 + uses: github/codeql-action/analyze@v4.37.6 From 0912ec20b8e847f0d96be65e7689989edc056b15 Mon Sep 17 00:00:00 2001 From: h-east Date: Mon, 17 Aug 2026 04:29:58 +0900 Subject: [PATCH 363/647] tests: Test_xrestore() is flaky and cannot recover Problem: Test_xrestore() fails on CI and the retry fails as well, because the retry runs in the same Vim and the connection to the X server was not restored. Solution: Restore the display in a "finally" block. Wait for the selection to become available instead of failing with E353. Co-Authored-By: Claude Opus 5 (1M context) --- src/testdir/test_paste.vim | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim index bd87e3be7e..0daa5fe589 100644 --- a/src/testdir/test_paste.vim +++ b/src/testdir/test_paste.vim @@ -176,6 +176,9 @@ endfunc func CheckCopyPaste() call setline(1, ['copy this', '']) normal 1G0"*y$ + " The selection may not be available right away after connecting to the X + " server, the put below would then throw E353. + call WaitForAssert({-> assert_equal('copy this', getreg('*'))}) normal j"*p call assert_equal('copy this', getline(2)) endfunc @@ -186,15 +189,20 @@ func Test_xrestore() let display = $DISPLAY new - call CheckCopyPaste() - - xrestore - call CheckCopyPaste() - - exe "xrestore " .. display - call CheckCopyPaste() - - bwipe! + " Restore the display even when a check fails, otherwise the retry runs + " without a connection to the X server. + try + call CheckCopyPaste() + + xrestore + call CheckCopyPaste() + + exe "xrestore " .. display + call CheckCopyPaste() + finally + exe "xrestore " .. display + bwipe! + endtry endfunc " Test for 'pastetoggle' From 4e0cd139cbcd1f481957fef4d1a36d91f3c90cc6 Mon Sep 17 00:00:00 2001 From: h-east Date: Mon, 17 Aug 2026 04:38:22 +0900 Subject: [PATCH 364/647] Revert "tests: Test_xrestore() is flaky and cannot recover" This reverts commit 0912ec20b8e847f0d96be65e7689989edc056b15. --- src/testdir/test_paste.vim | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim index 0daa5fe589..bd87e3be7e 100644 --- a/src/testdir/test_paste.vim +++ b/src/testdir/test_paste.vim @@ -176,9 +176,6 @@ endfunc func CheckCopyPaste() call setline(1, ['copy this', '']) normal 1G0"*y$ - " The selection may not be available right away after connecting to the X - " server, the put below would then throw E353. - call WaitForAssert({-> assert_equal('copy this', getreg('*'))}) normal j"*p call assert_equal('copy this', getline(2)) endfunc @@ -189,20 +186,15 @@ func Test_xrestore() let display = $DISPLAY new - " Restore the display even when a check fails, otherwise the retry runs - " without a connection to the X server. - try - call CheckCopyPaste() - - xrestore - call CheckCopyPaste() - - exe "xrestore " .. display - call CheckCopyPaste() - finally - exe "xrestore " .. display - bwipe! - endtry + call CheckCopyPaste() + + xrestore + call CheckCopyPaste() + + exe "xrestore " .. display + call CheckCopyPaste() + + bwipe! endfunc " Test for 'pastetoggle' From 9ce68018125e13cd365c68105245872b79d80c9c Mon Sep 17 00:00:00 2001 From: h-east Date: Mon, 17 Aug 2026 17:46:22 +0900 Subject: [PATCH 365/647] buffered listener cannot obtain the text of a change Problem: A callback added with listener_add() is given the line numbers of a change but not the text. When changes are buffered, two changes to the same line do not change the line count and are reported together, so getbufline() can only return the result of the second one. Solution: Let listener_add() take a Dictionary of options and add a "text" option, which stores the resulting text in each item of the list of changes. The text is copied when the change is recorded, so it is not affected by later changes. Invoke the callback early when a lot of text has been recorded, to bound the memory used. Co-Authored-By: Claude Opus 5 (1M context) --- runtime/doc/builtin.txt | 47 ++++++++-- src/change.c | 81 +++++++++++++++- src/evalfunc.c | 19 +++- src/proto/typval.pro | 1 + src/structs.h | 2 + src/testdir/test_listener.vim | 147 ++++++++++++++++++++++++++++++ src/testdir/test_vim9_builtin.vim | 1 + src/typval.c | 12 +++ 8 files changed, 298 insertions(+), 12 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index d88d5deac6..44ebf952f7 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -390,7 +390,7 @@ lispindent({lnum}) Number Lisp indent for line {lnum} list2blob({list}) Blob turn {list} of numbers into a Blob list2str({list} [, {utf8}]) String turn {list} of numbers into a String list2tuple({list}) Tuple turn {list} of items into a tuple -listener_add({callback} [, {buf} [, {unbuffered}]]) +listener_add({callback} [, {buf} [, {options}]]) Number add a callback to listen to changes listener_flush([{buf}]) none invoke listener callbacks listener_remove({id}) Number remove a listener callback @@ -6811,7 +6811,7 @@ list2tuple({list}) *list2tuple()* Return type: tuple<{type}> (depending on the given |List|) -listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* +listener_add({callback} [, {buf} [, {options}]]) *listener_add()* Add a callback function that will be invoked when changes have been made to buffer {buf}. {buf} refers to a buffer name or number. For the accepted @@ -6848,6 +6848,8 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* the change; one if unknown or the whole line was affected; this is a byte index, first character has a value of one. + text only present when the "text" option is set, + see below When lines are inserted (not when a line is split, e.g. by typing CR in Insert mode) the values are: lnum line above which the new line is added @@ -6866,7 +6868,15 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* added 0 col first column with a change or 1 - When {unbuffered} is |FALSE| or not provided the {callback} is + {options} is a Dictionary with these optional entries: + unbuffered invoke the {callback} for every single change + instead of for a batch of changes + text include the resulting text in each item of + "changes" + For backwards compatibility {options} may also be a |Boolean|, + which is then used for the "unbuffered" entry. + + When "unbuffered" is |FALSE| or not provided the {callback} is invoked: 1. Just before the screen is updated. @@ -6874,6 +6884,7 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* 3. When a change is being made that changes the line count in a way that causes a line number in the list of changes to become invalid. + 4. When "text" is set and a lot of text has been recorded. The entries are in the order the changes were made, thus the most recent change is at the end. @@ -6881,10 +6892,10 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* Because of the third reason for triggering a callback listed above, the line numbers passed to the callback are not guaranteed to be valid. In particular, the end value can be - greater than line('$') + 1. If this is a problem then make - {unbuffered} |TRUE|. + greater than line('$') + 1. If this is a problem then set + "unbuffered". - When {unbuffered} is |TRUE| the {callback} is invoked for every + When "unbuffered" is |TRUE| the {callback} is invoked for every single change. The changes list only holds a single dictionary and the "start", "end" and "added" values in the dictionary are the same as the corresponding callback @@ -6892,6 +6903,30 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* invoked, but later changes may make them invalid, thus keeping a copy for later might not work. + *listener-text* + When "text" is set each item in "changes" gets a "text" entry, + a List with the lines that occupy the changed region right + after that change was made: the lines "lnum" up to but not + including "end" plus "added". This List is empty when the + change only deleted lines. Together with "lnum", "end" and + "added" the item then fully describes the change: replace the + lines "lnum" up to but not including "end" with "text". + + The text is copied at the moment the change is recorded, so it + is not affected by later changes. Without it a buffered + {callback} cannot reliably obtain the text of a change: two + changes to the same line do not change the line count and are + reported together, and by then |getbufline()| can only return + the result of the second one. Setting "unbuffered" avoids + that as well, but then the {callback} is invoked for every + single change, which is expensive for a command that changes + many lines. + + Setting "text" costs a copy of the changed lines for every + change. To keep the memory used by a long sequence of changes + bounded, the {callback} is also invoked when a lot of text has + been recorded. + The {callback} is invoked with the text locked, see |textlock|. If you do need to make changes to the buffer, use a timer to do this later |timer_start()|. diff --git a/src/change.c b/src/change.c index c9e27c1949..4ce587c8ff 100644 --- a/src/change.c +++ b/src/change.c @@ -207,6 +207,7 @@ clean_listener_list(buf_T *buf, listener_T **list, bool all) { list_unref(buf->b_recorded_changes); buf->b_recorded_changes = NULL; + buf->b_recorded_text_size = 0; } } } @@ -267,6 +268,60 @@ check_recorded_changes( } } +// Amount of recorded text after which the listeners are invoked, to bound the +// memory used by a long sequence of changes. +#define LISTENER_TEXT_MAX (4 * 1024 * 1024) + +/* + * Return true when any listener in "list" asked for the resulting text. + */ + static bool +listeners_want_text(listener_T *list) +{ + listener_T *lnr; + + for (lnr = list; lnr != NULL; lnr = lnr->lr_next) + if (lnr->lr_text) + return true; + return false; +} + +/* + * Store in "dict" the text that occupies the changed region right after the + * change: the lines from "lnum" up to but not including "lnume" + "xtra". + * Returns the number of bytes stored. + */ + static size_t +add_change_text( + buf_T *buf, + dict_T *dict, + linenr_T lnum, + linenr_T lnume, + long xtra) +{ + list_T *l = list_alloc(); + linenr_T below = lnume + xtra; // line below the changed region + size_t size = 0; + + if (l == NULL) + return 0; + if (dict_add_list(dict, "text", l) == FAIL) + { + list_free(l); + return 0; + } + + if (below > buf->b_ml.ml_line_count + 1) + below = buf->b_ml.ml_line_count + 1; + for (linenr_T lp = lnum < 1 ? 1 : lnum; lp < below; ++lp) + { + if (list_append_string(l, ml_get_buf(buf, lp, FALSE), -1) == FAIL) + break; + size += (size_t)ml_get_buf_len(buf, lp) + 1; + } + return size; +} + /* * Record a change for listeners added with listener_add(). * Always for the current buffer. @@ -306,8 +361,14 @@ may_record_change( dict_add_number(dict, "end", (varnumber_T)lnume); dict_add_number(dict, "added", (varnumber_T)xtra); dict_add_number(dict, "col", (varnumber_T)col + 1); + if (listeners_want_text(curbuf->b_listener)) + curbuf->b_recorded_text_size += + add_change_text(curbuf, dict, lnum, lnume, xtra); list_append_dict(curbuf->b_recorded_changes, dict); + + if (curbuf->b_recorded_text_size > LISTENER_TEXT_MAX) + invoke_listeners(curbuf); } /* @@ -319,7 +380,8 @@ f_listener_add(typval_T *argvars, typval_T *rettv) callback_T callback; listener_T *lnr; buf_T *buf = curbuf; - int unbuffered = 0; + bool unbuffered = false; + bool want_text = false; if (check_secure()) return; @@ -332,7 +394,7 @@ f_listener_add(typval_T *argvars, typval_T *rettv) if (in_vim9script() && ( check_for_opt_buffer_arg(argvars, 1) == FAIL - || check_for_opt_bool_arg(argvars, 2) == FAIL)) + || check_for_opt_bool_or_dict_arg(argvars, 2) == FAIL)) return; callback = get_callback(&argvars[0]); @@ -347,8 +409,15 @@ f_listener_add(typval_T *argvars, typval_T *rettv) free_callback(&callback); return; } - if (argvars[2].v_type != VAR_UNKNOWN) - unbuffered = (int)tv_get_bool(&argvars[2]); + if (argvars[2].v_type == VAR_DICT) + { + dict_T *d = argvars[2].vval.v_dict; + + unbuffered = dict_get_bool(d, "unbuffered", false); + want_text = dict_get_bool(d, "text", false); + } + else if (argvars[2].v_type != VAR_UNKNOWN) + unbuffered = tv_get_bool(&argvars[2]); } lnr = ALLOC_CLEAR_ONE(listener_T); @@ -377,6 +446,7 @@ f_listener_add(typval_T *argvars, typval_T *rettv) set_callback(&lnr->lr_callback, &callback); + lnr->lr_text = want_text; lnr->lr_id = ++next_listener_id; rettv->vval.v_number = lnr->lr_id; } @@ -573,6 +643,8 @@ invoke_sync_listeners( dict_add_number(dict, "end", (varnumber_T)end); dict_add_number(dict, "added", (varnumber_T)added); dict_add_number(dict, "col", (varnumber_T)col + 1); + if (listeners_want_text(buf->b_sync_listener)) + (void)add_change_text(buf, dict, start, end, added); list_append_dict(recorded_changes, dict); invoke_listener_set( @@ -616,6 +688,7 @@ invoke_listeners(buf_T *buf) list_unref(buf->b_recorded_changes); buf->b_recorded_changes = NULL; + buf->b_recorded_text_size = 0; } /* diff --git a/src/evalfunc.c b/src/evalfunc.c index 1b8cce9da4..5fbfa4ab92 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -412,6 +412,20 @@ arg_bool_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) return FAIL; } +/* + * Check "type" is a bool or a dict of 'any'. + */ + static int +arg_bool_or_dict_any( + type_T *type, + type_T *decl_type UNUSED, + argcontext_T *context) +{ + if (type->tt_type == VAR_DICT || type_any_or_unknown(type)) + return OK; + return check_arg_type(&t_bool, type, context); +} + /* * Check "type" is a list of 'any' or a blob. */ @@ -1301,7 +1315,8 @@ static argcheck_T arg2_string_or_list_number[] = {arg_string_or_list_any, arg_nu static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr}; static argcheck_T arg2_blob_dict[] = {arg_blob, arg_dict_any}; static argcheck_T arg2_list_or_tuple_string[] = {arg_list_or_tuple, arg_string}; -static argcheck_T arg3_any_buffer_bool[] = {arg_any, arg_buffer, arg_bool}; +static argcheck_T arg3_any_buffer_bool_or_dict[] = { + arg_any, arg_buffer, arg_bool_or_dict_any}; static argcheck_T arg3_any_list_dict[] = {arg_any, arg_list_any, arg_dict_any}; static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum}; static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number}; @@ -2515,7 +2530,7 @@ static const funcentry_T global_functions[] = ret_string, f_list2str}, {"list2tuple", 1, 1, FEARG_1, arg1_list_any, ret_tuple_any, f_list2tuple}, - {"listener_add", 1, 3, FEARG_2, arg3_any_buffer_bool, + {"listener_add", 1, 3, FEARG_2, arg3_any_buffer_bool_or_dict, ret_number, f_listener_add}, {"listener_flush", 0, 1, FEARG_1, arg1_buffer, ret_void, f_listener_flush}, diff --git a/src/proto/typval.pro b/src/proto/typval.pro index fcd9cd1c4c..1b5eb2905c 100644 --- a/src/proto/typval.pro +++ b/src/proto/typval.pro @@ -20,6 +20,7 @@ int check_for_float_or_nr_arg(typval_T *args, int idx); int check_for_bool_arg(typval_T *args, int idx); int check_for_opt_bool_arg(typval_T *args, int idx); int check_for_opt_bool_or_number_arg(typval_T *args, int idx); +int check_for_opt_bool_or_dict_arg(typval_T *args, int idx); int check_for_blob_arg(typval_T *args, int idx); int check_for_list_arg(typval_T *args, int idx); int check_for_nonnull_list_arg(typval_T *args, int idx); diff --git a/src/structs.h b/src/structs.h index fdba4ee835..6a26648c88 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2973,6 +2973,7 @@ struct listener_S { listener_T *lr_next; int lr_id; + bool lr_text; // include the resulting text in each change callback_T lr_callback; }; @@ -3633,6 +3634,7 @@ struct file_buffer listener_T *b_listener; // Listeners accepting buffered reports. listener_T *b_sync_listener; // Listeners requiring unbuffered reports. list_T *b_recorded_changes; + size_t b_recorded_text_size; // bytes of text held by the above #endif #ifdef FEAT_PROP_POPUP bool b_has_textprop; // true when text props were added diff --git a/src/testdir/test_listener.vim b/src/testdir/test_listener.vim index 6b91e8d046..c8d89802e6 100644 --- a/src/testdir/test_listener.vim +++ b/src/testdir/test_listener.vim @@ -801,6 +801,153 @@ func Test_listener_blockwise_paste() bwipe! endfunc +func s:StoreChanges(l) + call add(s:changes, deepcopy(a:l)) +endfunc + +" The "text" option makes each change self-contained. +func Test_listener_text() + new + call setline(1, ['one', 'two', 'three']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{text: v:true}) + + " Two changes to the same line do not change the line count, so they are + " reported together. Each one still carries the text it resulted in. + call setline(1, 'first') + call setline(1, 'second') + call listener_flush() + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0, 'text': ['first']}, + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0, 'text': ['second']}]], + \ s:changes) + + " Inserted lines are reported as the text that was inserted. + let s:changes = [] + call append(1, ['a', 'b']) + call listener_flush() + call assert_equal([[ + \ {'lnum': 2, 'end': 2, 'col': 1, 'added': 2, 'text': ['a', 'b']}]], + \ s:changes) + + " Deleting lines leaves an empty text. + let s:changes = [] + 2,3del + call listener_flush() + call assert_equal([[ + \ {'lnum': 2, 'end': 4, 'col': 1, 'added': -2, 'text': []}]], + \ s:changes) + + " Deleting and inserting at the same spot keeps both entries apart. + let s:changes = [] + call setline(1, ['one', 'two', 'three']) + call listener_flush() + let s:changes = [] + 1del + call append(0, 'zero') + call listener_flush() + call assert_equal([ + \ [{'lnum': 1, 'end': 2, 'col': 1, 'added': -1, 'text': []}], + \ [{'lnum': 1, 'end': 1, 'col': 1, 'added': 1, 'text': ['zero']}]], + \ s:changes) + + call listener_remove(id) + bwipe! +endfunc + +" Deleting every line and undoing it are each reported as one change. +func Test_listener_text_whole_buffer() + new + call setline(1, range(1, 3000)->map({_, v -> 'line ' .. v})) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{text: v:true}) + let &undolevels = &undolevels + + " Nothing is left, so no text is copied. + %delete _ + call listener_flush() + call assert_equal([[ + \ {'lnum': 1, 'end': 3001, 'col': 1, 'added': -3000, 'text': []}]], + \ s:changes) + + " The undo restores all the lines, so they are all copied. + let s:changes = [] + undo + call listener_flush() + call assert_equal(1, len(s:changes)) + call assert_equal(1, len(s:changes[0])) + let change = s:changes[0][0] + call assert_equal(1, change.lnum) + call assert_equal(2, change.end) + call assert_equal(2999, change.added) + call assert_equal(3000, len(change.text)) + call assert_equal('line 1', change.text[0]) + call assert_equal('line 3000', change.text[-1]) + + call listener_remove(id) + bwipe! +endfunc + +" The "text" option also applies to an unbuffered listener. +func Test_listener_text_unbuffered() + new + call setline(1, ['one', 'two', 'three']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{unbuffered: v:true, text: v:true}) + + call setline(2, 'two two') + call assert_equal([[ + \ {'lnum': 2, 'end': 3, 'col': 1, 'added': 0, 'text': ['two two']}]], + \ s:changes) + + call listener_remove(id) + bwipe! +endfunc + +" Without the "text" option there is no "text" entry. +func Test_listener_no_text_by_default() + new + call setline(1, ['one', 'two']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{unbuffered: v:true}) + + call setline(1, 'one one') + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) + + call listener_remove(id) + bwipe! +endfunc + +" The third argument keeps accepting a Boolean. +func Test_listener_options_argument() + new + call setline(1, ['one', 'two']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, bufnr(), v:true) + call setline(1, 'one one') + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) + call listener_remove(id) + + " An empty Dictionary is the same as not passing the argument. + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, bufnr(), {}) + call setline(1, 'one two') + call assert_equal([], s:changes) + call listener_flush() + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) + call listener_remove(id) + + call assert_fails('call listener_add("Foo", bufnr(), [])', 'E745:') + bwipe! +endfunc + func Test_listener_add_in_sandbox() call assert_fails( \ 'sandbox call redraw_listener_add({"on_start": function("tr")})', diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 350a790fbd..49ab862d1f 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -2657,6 +2657,7 @@ enddef def Test_listener_add() v9.CheckSourceDefAndScriptFailure(['listener_add("1", true)'], ['E1013: Argument 2: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 2']) + v9.CheckSourceDefAndScriptFailure(['listener_add("1", 1, [1])'], ['E1013: Argument 3: type mismatch, expected bool but got list', 'E1212: Bool required for argument 3']) enddef def Test_listener_flush() diff --git a/src/typval.c b/src/typval.c index f704f039cd..6a4947d8aa 100644 --- a/src/typval.c +++ b/src/typval.c @@ -577,6 +577,18 @@ check_for_opt_bool_or_number_arg(typval_T *args, int idx) return check_for_bool_or_number_arg(args, idx); } +/* + * Check for an optional bool or dict argument at 'idx'. + * Return FAIL if the type is wrong. + */ + int +check_for_opt_bool_or_dict_arg(typval_T *args, int idx) +{ + if (args[idx].v_type == VAR_UNKNOWN || args[idx].v_type == VAR_DICT) + return OK; + return check_for_bool_arg(args, idx); +} + /* * Give an error and return FAIL unless "args[idx]" is a blob. */ From 3cd5d1d1aa8effbef32f8b6a4d0f4ade9acdcef6 Mon Sep 17 00:00:00 2001 From: h-east Date: Mon, 17 Aug 2026 17:48:28 +0900 Subject: [PATCH 366/647] Revert "buffered listener cannot obtain the text of a change" This reverts commit 9ce68018125e13cd365c68105245872b79d80c9c. --- runtime/doc/builtin.txt | 47 ++-------- src/change.c | 81 +--------------- src/evalfunc.c | 19 +--- src/proto/typval.pro | 1 - src/structs.h | 2 - src/testdir/test_listener.vim | 147 ------------------------------ src/testdir/test_vim9_builtin.vim | 1 - src/typval.c | 12 --- 8 files changed, 12 insertions(+), 298 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 44ebf952f7..d88d5deac6 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -390,7 +390,7 @@ lispindent({lnum}) Number Lisp indent for line {lnum} list2blob({list}) Blob turn {list} of numbers into a Blob list2str({list} [, {utf8}]) String turn {list} of numbers into a String list2tuple({list}) Tuple turn {list} of items into a tuple -listener_add({callback} [, {buf} [, {options}]]) +listener_add({callback} [, {buf} [, {unbuffered}]]) Number add a callback to listen to changes listener_flush([{buf}]) none invoke listener callbacks listener_remove({id}) Number remove a listener callback @@ -6811,7 +6811,7 @@ list2tuple({list}) *list2tuple()* Return type: tuple<{type}> (depending on the given |List|) -listener_add({callback} [, {buf} [, {options}]]) *listener_add()* +listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* Add a callback function that will be invoked when changes have been made to buffer {buf}. {buf} refers to a buffer name or number. For the accepted @@ -6848,8 +6848,6 @@ listener_add({callback} [, {buf} [, {options}]]) *listener_add()* the change; one if unknown or the whole line was affected; this is a byte index, first character has a value of one. - text only present when the "text" option is set, - see below When lines are inserted (not when a line is split, e.g. by typing CR in Insert mode) the values are: lnum line above which the new line is added @@ -6868,15 +6866,7 @@ listener_add({callback} [, {buf} [, {options}]]) *listener_add()* added 0 col first column with a change or 1 - {options} is a Dictionary with these optional entries: - unbuffered invoke the {callback} for every single change - instead of for a batch of changes - text include the resulting text in each item of - "changes" - For backwards compatibility {options} may also be a |Boolean|, - which is then used for the "unbuffered" entry. - - When "unbuffered" is |FALSE| or not provided the {callback} is + When {unbuffered} is |FALSE| or not provided the {callback} is invoked: 1. Just before the screen is updated. @@ -6884,7 +6874,6 @@ listener_add({callback} [, {buf} [, {options}]]) *listener_add()* 3. When a change is being made that changes the line count in a way that causes a line number in the list of changes to become invalid. - 4. When "text" is set and a lot of text has been recorded. The entries are in the order the changes were made, thus the most recent change is at the end. @@ -6892,10 +6881,10 @@ listener_add({callback} [, {buf} [, {options}]]) *listener_add()* Because of the third reason for triggering a callback listed above, the line numbers passed to the callback are not guaranteed to be valid. In particular, the end value can be - greater than line('$') + 1. If this is a problem then set - "unbuffered". + greater than line('$') + 1. If this is a problem then make + {unbuffered} |TRUE|. - When "unbuffered" is |TRUE| the {callback} is invoked for every + When {unbuffered} is |TRUE| the {callback} is invoked for every single change. The changes list only holds a single dictionary and the "start", "end" and "added" values in the dictionary are the same as the corresponding callback @@ -6903,30 +6892,6 @@ listener_add({callback} [, {buf} [, {options}]]) *listener_add()* invoked, but later changes may make them invalid, thus keeping a copy for later might not work. - *listener-text* - When "text" is set each item in "changes" gets a "text" entry, - a List with the lines that occupy the changed region right - after that change was made: the lines "lnum" up to but not - including "end" plus "added". This List is empty when the - change only deleted lines. Together with "lnum", "end" and - "added" the item then fully describes the change: replace the - lines "lnum" up to but not including "end" with "text". - - The text is copied at the moment the change is recorded, so it - is not affected by later changes. Without it a buffered - {callback} cannot reliably obtain the text of a change: two - changes to the same line do not change the line count and are - reported together, and by then |getbufline()| can only return - the result of the second one. Setting "unbuffered" avoids - that as well, but then the {callback} is invoked for every - single change, which is expensive for a command that changes - many lines. - - Setting "text" costs a copy of the changed lines for every - change. To keep the memory used by a long sequence of changes - bounded, the {callback} is also invoked when a lot of text has - been recorded. - The {callback} is invoked with the text locked, see |textlock|. If you do need to make changes to the buffer, use a timer to do this later |timer_start()|. diff --git a/src/change.c b/src/change.c index 4ce587c8ff..c9e27c1949 100644 --- a/src/change.c +++ b/src/change.c @@ -207,7 +207,6 @@ clean_listener_list(buf_T *buf, listener_T **list, bool all) { list_unref(buf->b_recorded_changes); buf->b_recorded_changes = NULL; - buf->b_recorded_text_size = 0; } } } @@ -268,60 +267,6 @@ check_recorded_changes( } } -// Amount of recorded text after which the listeners are invoked, to bound the -// memory used by a long sequence of changes. -#define LISTENER_TEXT_MAX (4 * 1024 * 1024) - -/* - * Return true when any listener in "list" asked for the resulting text. - */ - static bool -listeners_want_text(listener_T *list) -{ - listener_T *lnr; - - for (lnr = list; lnr != NULL; lnr = lnr->lr_next) - if (lnr->lr_text) - return true; - return false; -} - -/* - * Store in "dict" the text that occupies the changed region right after the - * change: the lines from "lnum" up to but not including "lnume" + "xtra". - * Returns the number of bytes stored. - */ - static size_t -add_change_text( - buf_T *buf, - dict_T *dict, - linenr_T lnum, - linenr_T lnume, - long xtra) -{ - list_T *l = list_alloc(); - linenr_T below = lnume + xtra; // line below the changed region - size_t size = 0; - - if (l == NULL) - return 0; - if (dict_add_list(dict, "text", l) == FAIL) - { - list_free(l); - return 0; - } - - if (below > buf->b_ml.ml_line_count + 1) - below = buf->b_ml.ml_line_count + 1; - for (linenr_T lp = lnum < 1 ? 1 : lnum; lp < below; ++lp) - { - if (list_append_string(l, ml_get_buf(buf, lp, FALSE), -1) == FAIL) - break; - size += (size_t)ml_get_buf_len(buf, lp) + 1; - } - return size; -} - /* * Record a change for listeners added with listener_add(). * Always for the current buffer. @@ -361,14 +306,8 @@ may_record_change( dict_add_number(dict, "end", (varnumber_T)lnume); dict_add_number(dict, "added", (varnumber_T)xtra); dict_add_number(dict, "col", (varnumber_T)col + 1); - if (listeners_want_text(curbuf->b_listener)) - curbuf->b_recorded_text_size += - add_change_text(curbuf, dict, lnum, lnume, xtra); list_append_dict(curbuf->b_recorded_changes, dict); - - if (curbuf->b_recorded_text_size > LISTENER_TEXT_MAX) - invoke_listeners(curbuf); } /* @@ -380,8 +319,7 @@ f_listener_add(typval_T *argvars, typval_T *rettv) callback_T callback; listener_T *lnr; buf_T *buf = curbuf; - bool unbuffered = false; - bool want_text = false; + int unbuffered = 0; if (check_secure()) return; @@ -394,7 +332,7 @@ f_listener_add(typval_T *argvars, typval_T *rettv) if (in_vim9script() && ( check_for_opt_buffer_arg(argvars, 1) == FAIL - || check_for_opt_bool_or_dict_arg(argvars, 2) == FAIL)) + || check_for_opt_bool_arg(argvars, 2) == FAIL)) return; callback = get_callback(&argvars[0]); @@ -409,15 +347,8 @@ f_listener_add(typval_T *argvars, typval_T *rettv) free_callback(&callback); return; } - if (argvars[2].v_type == VAR_DICT) - { - dict_T *d = argvars[2].vval.v_dict; - - unbuffered = dict_get_bool(d, "unbuffered", false); - want_text = dict_get_bool(d, "text", false); - } - else if (argvars[2].v_type != VAR_UNKNOWN) - unbuffered = tv_get_bool(&argvars[2]); + if (argvars[2].v_type != VAR_UNKNOWN) + unbuffered = (int)tv_get_bool(&argvars[2]); } lnr = ALLOC_CLEAR_ONE(listener_T); @@ -446,7 +377,6 @@ f_listener_add(typval_T *argvars, typval_T *rettv) set_callback(&lnr->lr_callback, &callback); - lnr->lr_text = want_text; lnr->lr_id = ++next_listener_id; rettv->vval.v_number = lnr->lr_id; } @@ -643,8 +573,6 @@ invoke_sync_listeners( dict_add_number(dict, "end", (varnumber_T)end); dict_add_number(dict, "added", (varnumber_T)added); dict_add_number(dict, "col", (varnumber_T)col + 1); - if (listeners_want_text(buf->b_sync_listener)) - (void)add_change_text(buf, dict, start, end, added); list_append_dict(recorded_changes, dict); invoke_listener_set( @@ -688,7 +616,6 @@ invoke_listeners(buf_T *buf) list_unref(buf->b_recorded_changes); buf->b_recorded_changes = NULL; - buf->b_recorded_text_size = 0; } /* diff --git a/src/evalfunc.c b/src/evalfunc.c index 5fbfa4ab92..1b8cce9da4 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -412,20 +412,6 @@ arg_bool_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) return FAIL; } -/* - * Check "type" is a bool or a dict of 'any'. - */ - static int -arg_bool_or_dict_any( - type_T *type, - type_T *decl_type UNUSED, - argcontext_T *context) -{ - if (type->tt_type == VAR_DICT || type_any_or_unknown(type)) - return OK; - return check_arg_type(&t_bool, type, context); -} - /* * Check "type" is a list of 'any' or a blob. */ @@ -1315,8 +1301,7 @@ static argcheck_T arg2_string_or_list_number[] = {arg_string_or_list_any, arg_nu static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr}; static argcheck_T arg2_blob_dict[] = {arg_blob, arg_dict_any}; static argcheck_T arg2_list_or_tuple_string[] = {arg_list_or_tuple, arg_string}; -static argcheck_T arg3_any_buffer_bool_or_dict[] = { - arg_any, arg_buffer, arg_bool_or_dict_any}; +static argcheck_T arg3_any_buffer_bool[] = {arg_any, arg_buffer, arg_bool}; static argcheck_T arg3_any_list_dict[] = {arg_any, arg_list_any, arg_dict_any}; static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum}; static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number}; @@ -2530,7 +2515,7 @@ static const funcentry_T global_functions[] = ret_string, f_list2str}, {"list2tuple", 1, 1, FEARG_1, arg1_list_any, ret_tuple_any, f_list2tuple}, - {"listener_add", 1, 3, FEARG_2, arg3_any_buffer_bool_or_dict, + {"listener_add", 1, 3, FEARG_2, arg3_any_buffer_bool, ret_number, f_listener_add}, {"listener_flush", 0, 1, FEARG_1, arg1_buffer, ret_void, f_listener_flush}, diff --git a/src/proto/typval.pro b/src/proto/typval.pro index 1b5eb2905c..fcd9cd1c4c 100644 --- a/src/proto/typval.pro +++ b/src/proto/typval.pro @@ -20,7 +20,6 @@ int check_for_float_or_nr_arg(typval_T *args, int idx); int check_for_bool_arg(typval_T *args, int idx); int check_for_opt_bool_arg(typval_T *args, int idx); int check_for_opt_bool_or_number_arg(typval_T *args, int idx); -int check_for_opt_bool_or_dict_arg(typval_T *args, int idx); int check_for_blob_arg(typval_T *args, int idx); int check_for_list_arg(typval_T *args, int idx); int check_for_nonnull_list_arg(typval_T *args, int idx); diff --git a/src/structs.h b/src/structs.h index 6a26648c88..fdba4ee835 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2973,7 +2973,6 @@ struct listener_S { listener_T *lr_next; int lr_id; - bool lr_text; // include the resulting text in each change callback_T lr_callback; }; @@ -3634,7 +3633,6 @@ struct file_buffer listener_T *b_listener; // Listeners accepting buffered reports. listener_T *b_sync_listener; // Listeners requiring unbuffered reports. list_T *b_recorded_changes; - size_t b_recorded_text_size; // bytes of text held by the above #endif #ifdef FEAT_PROP_POPUP bool b_has_textprop; // true when text props were added diff --git a/src/testdir/test_listener.vim b/src/testdir/test_listener.vim index c8d89802e6..6b91e8d046 100644 --- a/src/testdir/test_listener.vim +++ b/src/testdir/test_listener.vim @@ -801,153 +801,6 @@ func Test_listener_blockwise_paste() bwipe! endfunc -func s:StoreChanges(l) - call add(s:changes, deepcopy(a:l)) -endfunc - -" The "text" option makes each change self-contained. -func Test_listener_text() - new - call setline(1, ['one', 'two', 'three']) - let s:changes = [] - let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, - \ bufnr(), #{text: v:true}) - - " Two changes to the same line do not change the line count, so they are - " reported together. Each one still carries the text it resulted in. - call setline(1, 'first') - call setline(1, 'second') - call listener_flush() - call assert_equal([[ - \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0, 'text': ['first']}, - \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0, 'text': ['second']}]], - \ s:changes) - - " Inserted lines are reported as the text that was inserted. - let s:changes = [] - call append(1, ['a', 'b']) - call listener_flush() - call assert_equal([[ - \ {'lnum': 2, 'end': 2, 'col': 1, 'added': 2, 'text': ['a', 'b']}]], - \ s:changes) - - " Deleting lines leaves an empty text. - let s:changes = [] - 2,3del - call listener_flush() - call assert_equal([[ - \ {'lnum': 2, 'end': 4, 'col': 1, 'added': -2, 'text': []}]], - \ s:changes) - - " Deleting and inserting at the same spot keeps both entries apart. - let s:changes = [] - call setline(1, ['one', 'two', 'three']) - call listener_flush() - let s:changes = [] - 1del - call append(0, 'zero') - call listener_flush() - call assert_equal([ - \ [{'lnum': 1, 'end': 2, 'col': 1, 'added': -1, 'text': []}], - \ [{'lnum': 1, 'end': 1, 'col': 1, 'added': 1, 'text': ['zero']}]], - \ s:changes) - - call listener_remove(id) - bwipe! -endfunc - -" Deleting every line and undoing it are each reported as one change. -func Test_listener_text_whole_buffer() - new - call setline(1, range(1, 3000)->map({_, v -> 'line ' .. v})) - let s:changes = [] - let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, - \ bufnr(), #{text: v:true}) - let &undolevels = &undolevels - - " Nothing is left, so no text is copied. - %delete _ - call listener_flush() - call assert_equal([[ - \ {'lnum': 1, 'end': 3001, 'col': 1, 'added': -3000, 'text': []}]], - \ s:changes) - - " The undo restores all the lines, so they are all copied. - let s:changes = [] - undo - call listener_flush() - call assert_equal(1, len(s:changes)) - call assert_equal(1, len(s:changes[0])) - let change = s:changes[0][0] - call assert_equal(1, change.lnum) - call assert_equal(2, change.end) - call assert_equal(2999, change.added) - call assert_equal(3000, len(change.text)) - call assert_equal('line 1', change.text[0]) - call assert_equal('line 3000', change.text[-1]) - - call listener_remove(id) - bwipe! -endfunc - -" The "text" option also applies to an unbuffered listener. -func Test_listener_text_unbuffered() - new - call setline(1, ['one', 'two', 'three']) - let s:changes = [] - let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, - \ bufnr(), #{unbuffered: v:true, text: v:true}) - - call setline(2, 'two two') - call assert_equal([[ - \ {'lnum': 2, 'end': 3, 'col': 1, 'added': 0, 'text': ['two two']}]], - \ s:changes) - - call listener_remove(id) - bwipe! -endfunc - -" Without the "text" option there is no "text" entry. -func Test_listener_no_text_by_default() - new - call setline(1, ['one', 'two']) - let s:changes = [] - let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, - \ bufnr(), #{unbuffered: v:true}) - - call setline(1, 'one one') - call assert_equal([[ - \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) - - call listener_remove(id) - bwipe! -endfunc - -" The third argument keeps accepting a Boolean. -func Test_listener_options_argument() - new - call setline(1, ['one', 'two']) - let s:changes = [] - let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, bufnr(), v:true) - call setline(1, 'one one') - call assert_equal([[ - \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) - call listener_remove(id) - - " An empty Dictionary is the same as not passing the argument. - let s:changes = [] - let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, bufnr(), {}) - call setline(1, 'one two') - call assert_equal([], s:changes) - call listener_flush() - call assert_equal([[ - \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) - call listener_remove(id) - - call assert_fails('call listener_add("Foo", bufnr(), [])', 'E745:') - bwipe! -endfunc - func Test_listener_add_in_sandbox() call assert_fails( \ 'sandbox call redraw_listener_add({"on_start": function("tr")})', diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 49ab862d1f..350a790fbd 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -2657,7 +2657,6 @@ enddef def Test_listener_add() v9.CheckSourceDefAndScriptFailure(['listener_add("1", true)'], ['E1013: Argument 2: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 2']) - v9.CheckSourceDefAndScriptFailure(['listener_add("1", 1, [1])'], ['E1013: Argument 3: type mismatch, expected bool but got list', 'E1212: Bool required for argument 3']) enddef def Test_listener_flush() diff --git a/src/typval.c b/src/typval.c index 6a4947d8aa..f704f039cd 100644 --- a/src/typval.c +++ b/src/typval.c @@ -577,18 +577,6 @@ check_for_opt_bool_or_number_arg(typval_T *args, int idx) return check_for_bool_or_number_arg(args, idx); } -/* - * Check for an optional bool or dict argument at 'idx'. - * Return FAIL if the type is wrong. - */ - int -check_for_opt_bool_or_dict_arg(typval_T *args, int idx) -{ - if (args[idx].v_type == VAR_UNKNOWN || args[idx].v_type == VAR_DICT) - return OK; - return check_for_bool_arg(args, idx); -} - /* * Give an error and return FAIL unless "args[idx]" is a blob. */ From 58e44cfbcafa5b2067316b56d22964623341981a Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Mon, 17 Aug 2026 17:54:47 +0000 Subject: [PATCH 367/647] runtime(odin): update syntax, indent - syntax: highlight attributes, e.g. @static, @(static), @(someattribute ....) - indent: fix incorrect case: indent if previous case: has oneliner as `if ... do ...` closes: #21067 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/indent/odin.vim | 6 ++++-- runtime/indent/testdir/odin.in | 2 +- runtime/indent/testdir/odin.ok | 2 +- runtime/syntax/odin.vim | 15 +++++++++------ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/runtime/indent/odin.vim b/runtime/indent/odin.vim index e7bc4b5417..7b24ad2187 100644 --- a/runtime/indent/odin.vim +++ b/runtime/indent/odin.vim @@ -4,7 +4,7 @@ vim9script # Language: Odin # Maintainer: Maxim Kim # Website: https://github.com/habamax/vim-odin -# Last Change: 2026-06-28 +# Last Change: 2026 Aug 17 if exists("b:did_indent") finish @@ -109,7 +109,9 @@ def GetOdinIndent(lnum: number): number endfor elseif pline =~ '{[^{]*}\s*$' && line !~ '^\s*[})]\s*$' # https://github.com/habamax/vim-odin/issues/2 indent = pindent - elseif line !~ '^\s*}' && pline =~ '^\s*\%(if\|for\).*\s\+do\%(\s\+\|$\)' # https://github.com/habamax/vim-odin/issues/15 + elseif line !~ '^\s*}' + && line !~ '^\s*case\s\+.\{-}:' + && pline =~ '^\s*\%(if\|for\).*\s\+do\%(\s\+\|$\)' # https://github.com/habamax/vim-odin/issues/15 indent = pindent elseif pline =~ '^\s*}\s*$' # https://github.com/habamax/vim-odin/issues/3 # Find line with opening { and check if there is a label: diff --git a/runtime/indent/testdir/odin.in b/runtime/indent/testdir/odin.in index 22e358fa67..faf1b25cc1 100644 --- a/runtime/indent/testdir/odin.in +++ b/runtime/indent/testdir/odin.in @@ -1317,7 +1317,7 @@ switch f { case .A: fmt.println("HITHER") case .B: -fmt.println("NEVER") +if true do fmt.println("NEVER") case .C: fmt.println("FOREVER") } diff --git a/runtime/indent/testdir/odin.ok b/runtime/indent/testdir/odin.ok index 2e0aba77a7..47494b5bca 100644 --- a/runtime/indent/testdir/odin.ok +++ b/runtime/indent/testdir/odin.ok @@ -1317,7 +1317,7 @@ implicit_selector_expression :: proc() { case .A: fmt.println("HITHER") case .B: - fmt.println("NEVER") + if true do fmt.println("NEVER") case .C: fmt.println("FOREVER") } diff --git a/runtime/syntax/odin.vim b/runtime/syntax/odin.vim index ce961a59fa..e8aa1f875e 100644 --- a/runtime/syntax/odin.vim +++ b/runtime/syntax/odin.vim @@ -4,7 +4,7 @@ vim9script # Language: Odin # Maintainer: Maxim Kim # Website: https://github.com/habamax/vim-odin -# Last Change: 2026-06-01 +# Last Change: 2026 Aug 16 if exists("b:current_syntax") finish @@ -55,11 +55,13 @@ syntax match odinEscape display contained /\\\([abefnrtv\\'"]\|\o\{3}\|x\x\{2}\| syntax match odinProcedure "\v<\w*>(\s*::\s*proc)@=" -syntax match odinAttribute "@\ze\<\w\+\>" display -syntax region odinAttribute +syntax match odinAttribute "@" display nextgroup=odinAttributeName,odinAttributeBraces +syntax match odinAttributeName "\<\w\+\>" display contained +syntax region odinAttributeBraces \ matchgroup=odinAttribute - \ start="@\ze(" end="\ze)" + \ start="(\w\+" end=")" \ transparent oneline + \ contained syntax match odinInteger "\v-?<[0-9]+%(_[0-9]+)*>" display syntax match odinFloat "\v-?<[0-9]+%(_[0-9]+)*%(\.[0-9]+%(_[0-9]+)*)%([eE][+-]=[0-9]+%(_[0-9]+)*)=" display @@ -98,13 +100,14 @@ highlight def link odinBlockComment Comment highlight def link odinTodo Todo -highlight def link odinAttribute Statement +highlight def link odinAttribute PreProc +highlight def link odinAttributeName odinAttribute 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 odinInteger Number highlight def link odinHex Number highlight def link odinOct Number highlight def link odinBin Number From d8b0e5bd4a8072675668eb16402d065e9f9903b3 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 17 Aug 2026 18:53:47 +0000 Subject: [PATCH 368/647] patch 9.2.0959: tests: Test_xrestore() is flaky and cannot recover Problem: Test_xrestore() fails on CI and the retry fails as well, because the retry runs in the same Vim and the connection to the X server was not restored. Solution: Restore the display in a "finally" block. Wait for the selection to become available instead of failing with E353. closes: #21066 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_paste.vim | 26 +++++++++++++++++--------- src/version.c | 2 ++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim index bd87e3be7e..0daa5fe589 100644 --- a/src/testdir/test_paste.vim +++ b/src/testdir/test_paste.vim @@ -176,6 +176,9 @@ endfunc func CheckCopyPaste() call setline(1, ['copy this', '']) normal 1G0"*y$ + " The selection may not be available right away after connecting to the X + " server, the put below would then throw E353. + call WaitForAssert({-> assert_equal('copy this', getreg('*'))}) normal j"*p call assert_equal('copy this', getline(2)) endfunc @@ -186,15 +189,20 @@ func Test_xrestore() let display = $DISPLAY new - call CheckCopyPaste() - - xrestore - call CheckCopyPaste() - - exe "xrestore " .. display - call CheckCopyPaste() - - bwipe! + " Restore the display even when a check fails, otherwise the retry runs + " without a connection to the X server. + try + call CheckCopyPaste() + + xrestore + call CheckCopyPaste() + + exe "xrestore " .. display + call CheckCopyPaste() + finally + exe "xrestore " .. display + bwipe! + endtry endfunc " Test for 'pastetoggle' diff --git a/src/version.c b/src/version.c index 9be27f5a33..65bfaa6f09 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 959, /**/ 958, /**/ From cd59994c455a20d39d5cc41b4978ecfd2bf4be2e Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 17 Aug 2026 19:05:55 +0000 Subject: [PATCH 369/647] patch 9.2.0960: double-free in string_reduce() Problem: string_reduce() copies *rettv into argv[0] before calling eval_expr_typval(). When the evaluator fails early, rettv is never reset and still aliases argv[0] v_string. clear_tv(&argv[0]) frees it, leaving rettv dangling and when in vim9script get_func_tv() frees it again (Ave Dva). Solution: Set rettv->v_type = VAR_UNKNOWN like what is done in list_reduce() and tuple_reduce(), use tv_get_string_strict() in f_reduce() closes: #21048 Supported by AI. Signed-off-by: Christian Brabandt --- src/list.c | 2 +- src/strings.c | 5 +++++ src/testdir/test_listdict.vim | 8 ++++++++ src/version.c | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/list.c b/src/list.c index cf5374de2a..0ea2e13bd1 100644 --- a/src/list.c +++ b/src/list.c @@ -3472,7 +3472,7 @@ f_reduce(typval_T *argvars, typval_T *rettv) else if (argvars[1].v_type == VAR_PARTIAL) func_name = partial_name(argvars[1].vval.v_partial); else - func_name = tv_get_string(&argvars[1]); + func_name = tv_get_string_strict(&argvars[1]); if (func_name == NULL || *func_name == NUL) { emsg(_(e_missing_function_argument)); diff --git a/src/strings.c b/src/strings.c index 71f9d83e21..fa24586c11 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1043,9 +1043,14 @@ string_reduce( for ( ; *p != NUL; p += len) { argv[0] = *rettv; + rettv->v_type = VAR_UNKNOWN; + len = copy_first_char_to_tv(p, &argv[1]); if (len < 0) + { + *rettv = argv[0]; break; + } r = eval_expr_typval(expr, TRUE, argv, 2, fc, rettv); diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim index 31b5f268d7..88c2e07bd6 100644 --- a/src/testdir/test_listdict.vim +++ b/src/testdir/test_listdict.vim @@ -1115,6 +1115,14 @@ func Test_reduce() " should not crash call assert_fails('echo reduce([1], test_null_function())', 'E1132:') call assert_fails('echo reduce([1], test_null_partial())', 'E1132:') + + " did cause double free + function! OuterReduce() + vim9 echo reduce('ab', 42) + endfunction + call assert_fails('call OuterReduce()', 'E1024:') + call assert_fails("echo reduce('ab', 'NoSuchFunc')", 'E117:') + delfunc OuterReduce endfunc " splitting a string to a List using split() diff --git a/src/version.c b/src/version.c index 65bfaa6f09..19542bdde4 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 960, /**/ 959, /**/ From 9d1f0081c74bd32ccde2bc66a4702eef7101d4fe Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 17 Aug 2026 19:22:08 +0000 Subject: [PATCH 370/647] patch 9.2.0961: base64_encode() gives wrong result for a zero byte Problem: base64_encode() encodes a zero byte in the last group as padding. Solution: Decide the padding from the number of remaining input bytes, refactor the code and move to misc2.c (Foxe Chen). related: #21018 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/evalfunc.c | 147 +------------------------------- src/misc2.c | 149 +++++++++++++++++++++++++++++++++ src/proto/misc2.pro | 3 + src/testdir/test_functions.vim | 3 + src/version.c | 2 + 5 files changed, 160 insertions(+), 144 deletions(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index 1b8cce9da4..92a3163544 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3716,148 +3716,6 @@ f_balloon_split(typval_T *argvars, typval_T *rettv UNUSED) # endif #endif -// Base64 character set -static const char_u base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -// Base64 decoding table (initialized in init_base64_dec_table() below) -static char_u base64_dec_table[256]; - -/* - * Initialize the base64 decoding table - */ - static void -init_base64_dec_table(void) -{ - static int base64_dec_tbl_initialized = FALSE; - - if (base64_dec_tbl_initialized) - return; - - // Unsupported characters are set to 0xFF - vim_memset(base64_dec_table, 0xFF, sizeof(base64_dec_table)); - - // Initialize the index for the base64 alphabets - for (size_t i = 0; i < sizeof(base64_table) - 1; i++) - base64_dec_table[(char_u)base64_table[i]] = (char_u)i; - - // base64 padding character - base64_dec_table['='] = 0; - - base64_dec_tbl_initialized = TRUE; -} - -/* - * Encode the bytes in "blob" using base-64 encoding. - */ - static char_u * -base64_encode(blob_T *blob) -{ - size_t input_len = blob->bv_ga.ga_len; - size_t encoded_len = ((input_len + 2) / 3) * 4; - char_u *data = blob->bv_ga.ga_data; - - char_u *encoded = alloc(encoded_len + 1); - if (encoded == NULL) - return NULL; - - size_t i, j; - for (i = 0, j = 0; i < input_len;) - { - int_u octet_a = i < input_len ? data[i++] : 0; - int_u octet_b = i < input_len ? data[i++] : 0; - int_u octet_c = i < input_len ? data[i++] : 0; - - int_u triple = (octet_a << 16) | (octet_b << 8) | octet_c; - - encoded[j++] = base64_table[(triple >> 18) & 0x3F]; - encoded[j++] = base64_table[(triple >> 12) & 0x3F]; - encoded[j++] = (!octet_b && i >= input_len) ? '=' - : base64_table[(triple >> 6) & 0x3F]; - encoded[j++] = (!octet_c && i >= input_len) ? '=' - : base64_table[triple & 0x3F]; - } - encoded[j] = NUL; - - return encoded; -} - -/* - * Decode the string "data" using base-64 encoding. - */ - static void -base64_decode(const char_u *data, blob_T *blob) -{ - size_t input_len = STRLEN(data); - - if (input_len == 0) - return; - - if (input_len % 4 != 0) - { - // Invalid input length - semsg(_(e_invalid_argument_str), data); - return; - } - - init_base64_dec_table(); - - size_t decoded_len = (input_len / 4) * 3; - if (data[input_len - 1] == '=') - decoded_len--; - if (data[input_len - 2] == '=') - decoded_len--; - - size_t i, j; - for (i = 0, j = 0; i < input_len;) - { - int_u sextet_a = base64_dec_table[(char_u)data[i++]]; - int_u sextet_b = base64_dec_table[(char_u)data[i++]]; - int_u sextet_c = base64_dec_table[(char_u)data[i++]]; - int_u sextet_d = base64_dec_table[(char_u)data[i++]]; - - if (sextet_a == 0xFF || sextet_b == 0xFF || sextet_c == 0xFF - || sextet_d == 0xFF) - { - // Invalid character - semsg(_(e_invalid_argument_str), data); - ga_clear(&blob->bv_ga); - return; - } - - int_u triple = (sextet_a << 18) | (sextet_b << 12) - | (sextet_c << 6) | sextet_d; - - if (j < decoded_len) - { - ga_append(&blob->bv_ga, (triple >> 16) & 0xFF); - j++; - } - if (j < decoded_len) - { - ga_append(&blob->bv_ga, (triple >> 8) & 0xFF); - j++; - } - if (j < decoded_len) - { - ga_append(&blob->bv_ga, triple & 0xFF); - j++; - } - - if (j == decoded_len) - { - // Check for invalid padding bytes (based on the - // "Base64 Malleability in Practice" ACM paper). - if ((data[input_len - 2] == '=' && ((sextet_b & 0xF) != 0)) - || ((data[input_len - 1] == '=') && ((sextet_c & 0x3) != 0))) - { - semsg(_(e_invalid_argument_str), data); - ga_clear(&blob->bv_ga); - return; - } - } - } -} - /* * "base64_decode(string)" function */ @@ -3872,7 +3730,7 @@ f_base64_decode(typval_T *argvars, typval_T *rettv) char_u *str = tv_get_string_chk(&argvars[0]); if (str != NULL) - base64_decode(str, rettv->vval.v_blob); + base64_decode(str, STRLEN(str), &rettv->vval.v_blob->bv_ga); } /* @@ -3889,7 +3747,8 @@ f_base64_encode(typval_T *argvars, typval_T *rettv) blob_T *blob = argvars->vval.v_blob; if (blob != NULL) - rettv->vval.v_string = base64_encode(blob); + rettv->vval.v_string = + base64_encode(blob->bv_ga.ga_data, blob->bv_ga.ga_len); } /* diff --git a/src/misc2.c b/src/misc2.c index 25dab5ed13..a33591cc4b 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -3316,3 +3316,152 @@ mergesort_list( return head; } + +static const char_u base64_table[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static char_u base64_dec_table[256]; + +#define BASE64_ENCODED_LEN(len) ((((len) + 2) / 3) * 4 + 1) + +/* + * Initialize the base64 decoding table + */ + static void +init_base64_dec_table(void) +{ + static int base64_dec_tbl_initialized = FALSE; + + if (base64_dec_tbl_initialized) + return; + + vim_memset(base64_dec_table, 0xFF, sizeof(base64_dec_table)); + for (size_t i = 0; i < sizeof(base64_table) - 1; i++) + base64_dec_table[(char_u)base64_table[i]] = (char_u)i; + base64_dec_table['='] = 0; + + base64_dec_tbl_initialized = TRUE; +} + +/* + * Base64 encode "src[len]" into caller-supplied "dst", which must have room for + * at least BASE64_ENCODED_LEN(len) bytes (NUL terminated). Returns the number + * of bytes written, excluding the NUL. + */ + long +base64_encode_buf(char_u *dst, const char_u *src, size_t len) +{ + size_t i, j; + + for (i = 0, j = 0; i < len;) + { + size_t remaining = len - i; + + int_u octet_a = src[i++]; + int_u octet_b = remaining > 1 ? src[i++] : 0; + int_u octet_c = remaining > 2 ? src[i++] : 0; + + int_u triple = (octet_a << 16) | (octet_b << 8) | octet_c; + + dst[j++] = base64_table[(triple >> 18) & 0x3F]; + dst[j++] = base64_table[(triple >> 12) & 0x3F]; + dst[j++] = remaining > 1 + ? base64_table[(triple >> 6) & 0x3F] + : '='; + dst[j++] = remaining > 2 + ? base64_table[triple & 0x3F] + : '='; + } + + dst[j] = NUL; + return (long)j; +} + +/* + * Base64-encode "data[len]". Returns an allocated NUL-terminated string, or + * NULL on OOM. Caller frees with vim_free(). + */ + char_u * +base64_encode(const char_u *data, size_t len) +{ + char_u *encoded = alloc(BASE64_ENCODED_LEN(len)); + + if (encoded == NULL) + return NULL; + base64_encode_buf(encoded, data, len); + return encoded; +} + +/* + * Decode base64 text "data[len]" (len must be a multiple of 4) into growarray + * "out" (appended byte-by-byte, e.g. a blob's bv_ga). Returns OK on success and + * FAIL on failure. + */ + int +base64_decode(const char_u *data, size_t len, garray_T *out) +{ + if (len == 0) + return OK; + + if (len % 4 != 0) + { + semsg(_(e_invalid_argument_str), data); + return FAIL; + } + + init_base64_dec_table(); + + size_t decoded_len = (len / 4) * 3; + if (data[len - 1] == '=') + decoded_len--; + if (data[len - 2] == '=') + decoded_len--; + + size_t i, j; + for (i = 0, j = 0; i < len;) + { + int_u sextet_a = base64_dec_table[(char_u)data[i++]]; + int_u sextet_b = base64_dec_table[(char_u)data[i++]]; + int_u sextet_c = base64_dec_table[(char_u)data[i++]]; + int_u sextet_d = base64_dec_table[(char_u)data[i++]]; + + if (sextet_a == 0xFF || sextet_b == 0xFF || sextet_c == 0xFF + || sextet_d == 0xFF) + { + semsg(_(e_invalid_argument_str), data); + ga_clear(out); + return FAIL; + } + + int_u triple = (sextet_a << 18) | (sextet_b << 12) + | (sextet_c << 6) | sextet_d; + + if (j < decoded_len) + { + ga_append(out, (triple >> 16) & 0xFF); + j++; + } + if (j < decoded_len) + { + ga_append(out, (triple >> 8) & 0xFF); + j++; + } + if (j < decoded_len) + { + ga_append(out, triple & 0xFF); + j++; + } + + if (j == decoded_len) + { + if ((data[len - 2] == '=' && ((sextet_b & 0xF) != 0)) + || ((data[len - 1] == '=') && ((sextet_c & 0x3) != 0))) + { + semsg(_(e_invalid_argument_str), data); + ga_clear(out); + return FAIL; + } + } + } + return OK; +} diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro index af779259a7..95a5a8fd40 100644 --- a/src/proto/misc2.pro +++ b/src/proto/misc2.pro @@ -66,4 +66,7 @@ int cmp_keyvalue_value_n(const void *a, const void *b); int cmp_keyvalue_value_i(const void *a, const void *b); int cmp_keyvalue_value_ni(const void *a, const void *b); void *mergesort_list(void *head, void *(*get_next)(void *), void (*set_next)(void *, void *), void *(*get_prev)(void *), void (*set_prev)(void *, void *), int (*compare)(const void *, const void *)); +long base64_encode_buf(char_u *dst, const char_u *src, size_t len); +char_u *base64_encode(const char_u *data, size_t len); +int base64_decode(const char_u *data, size_t len, garray_T *out); /* vim: set ft=c : */ diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 7052ad171f..e3693c9136 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -4601,6 +4601,9 @@ func Test_base64_encoding() call assert_equal(0z00, base64_decode("====")) call assert_equal(0z, base64_decode("")) + #" a zero byte in the last group is not padding + call assert_equal('AQAC', base64_encode(0z010002)) + #" Test for invalid padding call assert_equal('Hello', g:Blob2Str(base64_decode("SGVsbG8="))) call assert_fails('call base64_decode("SGVsbG9=")', 'E475:') diff --git a/src/version.c b/src/version.c index 19542bdde4..2033abfa4d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 961, /**/ 960, /**/ From 89caa43b7882e34067e0ea8e3d64a7d29581744a Mon Sep 17 00:00:00 2001 From: Foxe Chen Date: Mon, 17 Aug 2026 20:21:28 +0000 Subject: [PATCH 371/647] patch 9.2.0962: popup images are not using the kitty protocol properly Problem: The kitty image backend re-encodes and retransmits the whole image on every redraw, since the transmit and the placement are sent as a single "a=T" sequence built by popup_encode_image(). Solution: Transmit the image once with "a=t" and send only a placement "a=p" on each redraw, cropping via the protocol's x/y/w/h instead of re-cropping the pixel data (Foxe Chen). closes: #21018 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/kitty.c | 216 ++++++++++++++---------------------- src/popupwin.c | 245 ++++++++++++++++++++++------------------- src/proto/kitty.pro | 5 +- src/proto/popupwin.pro | 1 - src/screen.c | 5 - src/structs.h | 10 +- src/version.c | 2 + 7 files changed, 225 insertions(+), 259 deletions(-) diff --git a/src/kitty.c b/src/kitty.c index 2b46b1454c..279eba842b 100644 --- a/src/kitty.c +++ b/src/kitty.c @@ -13,163 +13,136 @@ * The popup's image bytes are sent in 4096-byte chunks of base64 * inside `\e_G...;\e\\` envelopes. * Spec: https://sw.kovidgoyal.net/kitty/graphics-protocol/ - * No external dependency; the base64 alphabet is inlined here. + * Base64 encoding is shared with misc2 base64_encode()/decode() */ #include "vim.h" #if defined(FEAT_IMAGE_KITTY) || defined(PROTO) -static const char_u kitty_b64_table[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +// Max base64 chars per envelope, per the kitty graphics protocol. +#define KITTY_CHUNK_B64 4096 +// Source bytes that encode into KITTY_CHUNK_B64 base64 chars. +#define KITTY_CHUNK_SRC (KITTY_CHUNK_B64 * 3 / 4) +// header + base64 chunk + "\033\\" trailer + NUL. Use 128 extra bytes padding +// for header, should be more than enough. +#define KITTY_BUF_SIZE (128 + KITTY_CHUNK_B64 + 2 + 1) /* - * Append a NUL-terminated string to "ga". Returns OK / FAIL so the caller - * can abort on allocation failure (unlike ga_concat(), which silently no-ops - * and would leave a truncated, invalid kitty APC sequence behind). + * Return the kitty image id to use for window id "id". Kitty image ids are + * global to the terminal, so mix in the process id: another Vim in the same + * terminal would otherwise use the same ids and its "a=d,d=I" would free our + * image data. */ static int -kitty_ga_concat(garray_T *ga, const char_u *s) +kitty_image_id(int id) { - int len = (int)STRLEN(s); + static int base = 0; - if (len == 0) - return OK; - if (ga_grow(ga, len) == FAIL) - return FAIL; - mch_memmove((char_u *)ga->ga_data + ga->ga_len, s, (size_t)len); - ga->ga_len += len; - return OK; + if (base == 0) + base = (((int)mch_get_pid() & 0x7fff) + 1) << 16; + return base | (id & 0xffff); } /* - * Append base64-encoded bytes from "src[len]" to growarray "ga". - * Returns OK / FAIL so the caller can propagate OOM. + * Transmit an RGB(A) image to the terminal (does not display it!). It will + * have an id of "id", so that it can be placed later. */ - static int -kitty_b64_append(garray_T *ga, char_u *src, long len) + int +kitty_transmit(image_rgb_T *img, int id) { - long i; - long out_len = ((len + 2) / 3) * 4; - char_u *dst; - - if (out_len == 0) - return OK; - if (ga_grow(ga, (int)out_len) == FAIL) - return FAIL; - dst = (char_u *)ga->ga_data + ga->ga_len; - for (i = 0; i < len; i += 3) - { - unsigned a = src[i]; - unsigned b = (i + 1 < len) ? src[i + 1] : 0; - unsigned c = (i + 2 < len) ? src[i + 2] : 0; - unsigned triple = (a << 16) | (b << 8) | c; - - *dst++ = kitty_b64_table[(triple >> 18) & 0x3f]; - *dst++ = kitty_b64_table[(triple >> 12) & 0x3f]; - *dst++ = (i + 1 < len) - ? kitty_b64_table[(triple >> 6) & 0x3f] : '='; - *dst++ = (i + 2 < len) - ? kitty_b64_table[triple & 0x3f] : '='; - } - ga->ga_len += (int)out_len; - return OK; -} + static char buf[KITTY_BUF_SIZE]; -/* - * Encode an RGB(A) image into a kitty graphics protocol APC sequence. - * Returns a malloced char_u* containing the full sequence - * (one or more `\e_G...\e\\` envelopes), or NULL on OOM. - * - * The sequence is emitted with `a=T` (transmit + display), `q=2` (no - * status responses), `f=24` for RGB or `f=32` for RGBA, and chunked - * via `m=1`/`m=0` so the per-envelope payload stays under kitty's - * 4096-byte limit. When "id" is non-zero it is sent as `i=` so - * the resulting placement can later be removed via kitty_delete(). - * "zindex" is sent as `z=` so overlapping placements stack in - * popup zindex order no matter in which order they were (re)created. - */ - char_u * -kitty_encode(image_rgb_T *img, int id, int zindex) -{ - garray_T ga; long pix_bytes; long payload_len; - long b64_total; long offset = 0; int fmt; int first = TRUE; - char_u hdr[80]; if (img == NULL || img->data == NULL || img->width <= 0 || img->height <= 0) - return NULL; + return FAIL; pix_bytes = img->has_alpha ? 4 : 3; payload_len = (long)img->width * img->height * pix_bytes; - b64_total = ((payload_len + 2) / 3) * 4; fmt = img->has_alpha ? 32 : 24; - ga_init2(&ga, 1, (int)b64_total + 256); - - // Emit one envelope per 4096 base64 chars. The first envelope - // carries the full geometry/format header; later envelopes only - // need the chunk-continuation marker `m=`. - while (offset < b64_total) + // Emit one envelope per KITTY_CHUNK_SRC source bytes (= 4096 base64 + // chars). The first envelope carries the full geometry/format + // header; later envelopes only need the chunk-continuation marker + // `m=`. + while (offset < payload_len) { - long this_chunk = b64_total - offset; + long this_chunk = payload_len - offset; int more; + int hdr_len; + long b64_len; - if (this_chunk > 4096) - this_chunk = 4096; - more = (offset + this_chunk < b64_total); + if (this_chunk > KITTY_CHUNK_SRC) + this_chunk = KITTY_CHUNK_SRC; + more = (offset + this_chunk < payload_len); if (first) { - if (id != 0) - vim_snprintf((char *)hdr, sizeof(hdr), - "\033_Ga=T,f=%d,s=%d,v=%d,i=%d,z=%d,q=2,m=%d;", - fmt, img->width, img->height, id, zindex, - more ? 1 : 0); - else - vim_snprintf((char *)hdr, sizeof(hdr), - "\033_Ga=T,f=%d,s=%d,v=%d,z=%d,q=2,m=%d;", - fmt, img->width, img->height, zindex, more ? 1 : 0); + hdr_len = vim_snprintf(buf, sizeof(buf), + "\033_Ga=t,i=%d,f=%d,s=%d,v=%d,q=2,m=%d;", + kitty_image_id(id), fmt, img->width, + img->height, more ? 1 : 0); first = FALSE; } else - { - vim_snprintf((char *)hdr, sizeof(hdr), - "\033_Gm=%d;", more ? 1 : 0); - } - if (kitty_ga_concat(&ga, hdr) == FAIL) - goto fail; + hdr_len = vim_snprintf(buf, sizeof(buf), "\033_Gm=%d;", + more ? 1 : 0); - // Encode the matching slice of the source bytes. Each base64 - // chunk consumes (this_chunk / 4) base64 quartets, which means - // (this_chunk * 3 / 4) source bytes. - { - long src_offset = offset * 3 / 4; - long src_len = this_chunk * 3 / 4; + b64_len = base64_encode_buf((char_u *)buf + hdr_len, + img->data + offset, this_chunk); - if (src_offset + src_len > payload_len) - src_len = payload_len - src_offset; - if (kitty_b64_append(&ga, img->data + src_offset, src_len) == FAIL) - goto fail; - } - - if (kitty_ga_concat(&ga, (char_u *)"\033\\") == FAIL) - goto fail; + buf[hdr_len + b64_len] = '\033'; + buf[hdr_len + b64_len + 1] = '\\'; + buf[hdr_len + b64_len + 2] = NUL; + out_str((char_u *)buf); offset += this_chunk; } - if (ga_append(&ga, NUL) == FAIL) - goto fail; - return (char_u *)ga.ga_data; + out_flush(); + return OK; +} + +/* + * Place the image with the given id, which should have already been + * transmitted. Its placement id will always be its image id, so that the image + * is moved if it was previously placed. + */ + void +kitty_place(int id, int row, int col, int src_x, int src_y, int w, int h, int z) +{ + vim_snprintf((char *)IObuff, IOSIZE, + "\033_Ga=p,i=%d,p=%d,x=%d,y=%d,w=%d,h=%d,z=%d,q=2\033\\", + kitty_image_id(id), kitty_image_id(id), src_x, src_y, w, h, z); + + term_windgoto(row, col); + out_str((char_u *)IObuff); + screen_start(); + setcursor_mayforce(TRUE); + out_flush(); +} + +/* + * Delete image placement with image id "id" (which is also its placement id). + * If "del_data" is true, then its data will be freed by the terminal (see + * https://sw.kovidgoyal.net/kitty/graphics-protocol/#deleting-images). + */ + void +kitty_delete(int id, bool del_data) +{ + char d_key = del_data ? 'I' : 'i'; + + vim_snprintf((char *)IObuff, IOSIZE, + "\033_Ga=d,d=%c,i=%d,p=%d,q=2\033\\", d_key, kitty_image_id(id), + kitty_image_id(id)); -fail: - ga_clear(&ga); - return NULL; + out_str((char_u *)IObuff); + out_flush(); } /* @@ -240,25 +213,4 @@ kitty_probe_parse(char *buf, int n) return strstr(buf, "_Gi=31;OK") != NULL; } -/* - * Build a kitty "delete image" APC sequence for the placement created - * by kitty_encode() with the matching `id`. The caller must - * vim_free() the returned buffer. Returns NULL on OOM or id <= 0. - * - * Sequence: `\e_Ga=d,i=,q=2\e\\` - * a=d -> action: delete - * i= -> image id (target placement) - * q=2 -> suppress status reply - */ - char_u * -kitty_delete(int id) -{ - char_u buf[40]; - - if (id <= 0) - return NULL; - vim_snprintf((char *)buf, sizeof(buf), "\033_Ga=d,i=%d,q=2\033\\", id); - return vim_strsave(buf); -} - #endif // FEAT_IMAGE_KITTY || PROTO diff --git a/src/popupwin.c b/src/popupwin.c index 07e0b90e27..cbfe72f970 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -119,7 +119,7 @@ static void redraw_overlapped_opacity_popups(int winrow, int wincol, int height, int width, int leftoff, int zindex); static void redraw_win_under_opacity_popup(win_T *wp); #ifdef FEAT_IMAGE_KITTY -static void popup_image_clear_kitty(win_T *wp); +static void popup_image_clear_kitty(win_T *wp, bool del_data); #endif // GDI and cairo paint the image straight into the window, so the area has to // be redrawn when the popup goes away. GTK4 keeps a list of images to render @@ -974,7 +974,7 @@ apply_general_options(win_T *wp, dict_T *dict) || wp->w_popup_image_w > 0 || wp->w_popup_image_h > 0) { # ifdef FEAT_IMAGE_KITTY - popup_image_clear_kitty(wp); + popup_image_clear_kitty(wp, true); # endif # ifdef FEAT_IMAGE_GDK if (gui.in_use) @@ -993,7 +993,6 @@ apply_general_options(win_T *wp, dict_T *dict) wp->w_popup_image_seq_crop_y = 0; wp->w_popup_image_seq_cells_w = 0; wp->w_popup_image_seq_cells_h = 0; - wp->w_popup_image_emit_valid = false; # endif # if defined(FEAT_IMAGE_GDI) || defined(FEAT_IMAGE_CAIRO) || defined(FEAT_IMAGE_GDK) # ifdef FEAT_GUI @@ -1054,9 +1053,6 @@ apply_general_options(win_T *wp, dict_T *dict) # ifdef FEAT_IMAGE_SIXEL VIM_CLEAR(wp->w_popup_image_seq); wp->w_popup_image_seq_h = -1; -# endif -# ifdef FEAT_IMAGE_KITTY - wp->w_popup_image_emit_valid = false; # endif if (wp->w_popup_image_data != NULL) { @@ -1771,7 +1767,7 @@ popup_compute_clip(win_T *wp, popup_clip_T *cl) cl->eff_width = cl->eff_left_extra + w + cl->eff_right_extra; } -#ifdef FEAT_IMAGE_SIXEL +#if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) /* * Re-encode the popup's sixel image so its pixel rows fit above the bottom of * the screen. Many sixel-capable terminals scroll the screen when an image @@ -1896,12 +1892,12 @@ popup_image_backend(void) return detected; } +# ifdef FEAT_IMAGE_SIXEL static void popup_encode_image(win_T *wp) { image_rgb_T si; int target_w, target_h; - int backend; int cell_x = 8; int cell_y = 16; int crop_top_px, crop_bot_px; @@ -1912,30 +1908,28 @@ popup_encode_image(win_T *wp) if (wp->w_popup_image_data == NULL || wp->w_popup_image_w <= 0 || wp->w_popup_image_h <= 0) return; -# ifdef FEAT_GUI +# ifdef FEAT_GUI // The GUI backend renders the image from the device bitmap, not from a // terminal escape sequence -- skip the encoder entirely in that case. if (gui.in_use) return; -# endif - - backend = popup_image_backend(); +# endif -# if defined(UNIX) || defined(MSWIN) || defined(VMS) || defined(AMIGA) +# if defined(UNIX) || defined(MSWIN) || defined(VMS) || defined(AMIGA) { struct cellsize cs; cs.cs_xpixel = -1; cs.cs_ypixel = -1; -# if defined(UNIX) || defined(MSWIN) +# if defined(UNIX) || defined(MSWIN) mch_calc_cell_size(&cs); -# endif +# endif if (cs.cs_xpixel > 0) cell_x = cs.cs_xpixel; if (cs.cs_ypixel > 0) cell_y = cs.cs_ypixel; } -# endif +# endif // For "clipwindow" popups, crop the image to the portion that lies inside // the host window. popup_compute_clip() turns topoff/bottomoff/leftclip/ @@ -1953,7 +1947,6 @@ popup_encode_image(win_T *wp) { VIM_CLEAR(wp->w_popup_image_seq); wp->w_popup_image_seq_h = 0; - wp->w_popup_image_emit_valid = false; return; } @@ -1981,11 +1974,10 @@ popup_encode_image(win_T *wp) target_h = host_avail_h; } - if (backend != IMAGE_BACKEND_KITTY) { // Reserve the bottom-most cell row to keep the sixel image away // from the edge that triggers scrolling on terminals with sixel- - // scrolling enabled. Kitty has no such scroll trigger. + // scrolling enabled. int sixel_cells = Rows - 1 - img_top_row; int sixel_cap = sixel_cells > 0 ? sixel_cells * cell_y : 0; @@ -2005,19 +1997,17 @@ popup_encode_image(win_T *wp) { VIM_CLEAR(wp->w_popup_image_seq); wp->w_popup_image_seq_h = 0; - wp->w_popup_image_emit_valid = false; return; } + // already encoded for this geometry if (wp->w_popup_image_seq != NULL && wp->w_popup_image_seq_w == target_w && wp->w_popup_image_seq_h == target_h && wp->w_popup_image_seq_crop_x == crop_left_px - && wp->w_popup_image_seq_crop_y == crop_top_px - && wp->w_popup_image_seq_zindex == wp->w_zindex) - return; // already encoded for this geometry and zindex + && wp->w_popup_image_seq_crop_y == crop_top_px) + return; VIM_CLEAR(wp->w_popup_image_seq); - wp->w_popup_image_emit_valid = false; // The sixel/kitty encoders read data tightly packed as width*height // pixels. When the source row width changes (left or right clipped), @@ -2052,15 +2042,8 @@ popup_encode_image(win_T *wp) si.width = target_w; si.height = target_h; si.has_alpha = wp->w_popup_image_alpha; -# ifdef FEAT_IMAGE_KITTY - if (backend == IMAGE_BACKEND_KITTY) - // Use the popup's window-id as the kitty image id so that - // popup_image_clear_kitty() can target the placement when the - // popup is later hidden or closed. - wp->w_popup_image_seq = kitty_encode(&si, wp->w_id, wp->w_zindex); - else -# endif - wp->w_popup_image_seq = sixel_encode(&si); + + wp->w_popup_image_seq = sixel_encode(&si); vim_free(crop_buf); @@ -2072,7 +2055,6 @@ popup_encode_image(win_T *wp) wp->w_popup_image_seq_crop_y = crop_top_px; wp->w_popup_image_seq_cells_w = (target_w + cell_x - 1) / cell_x; wp->w_popup_image_seq_cells_h = (target_h + cell_y - 1) / cell_y; - wp->w_popup_image_seq_zindex = wp->w_zindex; } else { @@ -2081,7 +2063,8 @@ popup_encode_image(win_T *wp) wp->w_popup_image_seq_cells_h = 0; } } -#endif +# endif // FEAT_IMAGE_SIXEL +#endif // FEAT_IMAGE_SIXEL || FEAT_IMAGE_KITTY #ifdef FEAT_IMAGE /* @@ -2420,7 +2403,7 @@ popup_adjust_position(win_T *wp) #ifdef FEAT_IMAGE_KITTY // Kitty placements need to be deleted explicitly before // the popup goes hidden -- see popup_hide(). - popup_image_clear_kitty(wp); + popup_image_clear_kitty(wp, false); #endif #ifdef FEAT_IMAGE_GDK if (gui.in_use) @@ -2962,7 +2945,7 @@ popup_adjust_position(win_T *wp) { #ifdef FEAT_IMAGE_KITTY // delete the kitty placement before hiding, like popup_hide() - popup_image_clear_kitty(wp); + popup_image_clear_kitty(wp, false); #endif #ifdef FEAT_IMAGE_GDK if (gui.in_use) @@ -4344,7 +4327,7 @@ popup_hide(win_T *wp) // Sixel pixels disappear when the cells underneath are redrawn, but // a kitty placement persists until explicitly deleted -- send the // delete APC before hiding so the image goes away with the popup. - popup_image_clear_kitty(wp); + popup_image_clear_kitty(wp, false); #endif #ifdef FEAT_IMAGE_GDK if (gui.in_use) @@ -4556,7 +4539,7 @@ popup_free(win_T *wp) #ifdef FEAT_IMAGE_KITTY // Remove the kitty placement before win_free_popup() invalidates wp. - popup_image_clear_kitty(wp); + popup_image_clear_kitty(wp, true); #endif #ifdef FEAT_IMAGE_GDK if (gui.in_use) @@ -6940,7 +6923,7 @@ popup_image_gui_clip( || defined(FEAT_IMAGE_GDI) || defined(FEAT_IMAGE_CAIRO) \ || defined(FEAT_IMAGE_GDK) static void -popup_invalidate_prev_image_rect(win_T *wp, popup_clip_T *cl) +popup_invalidate_prev_image_rect(win_T *wp, popup_clip_T *cl UNUSED) { int old_row, old_col, old_cells_w, old_cells_h; int new_row = 0, new_col = 0, new_cells_w = 0, new_cells_h = 0; @@ -6978,7 +6961,7 @@ popup_invalidate_prev_image_rect(win_T *wp, popup_clip_T *cl) new_cells_h = (draw_h + cell_y - 1) / cell_y; } # endif -# if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) +# if defined(FEAT_IMAGE_SIXEL) # if defined(FEAT_GUI) && (defined(FEAT_IMAGE_GDI) || defined(FEAT_IMAGE_CAIRO)) \ || defined(FEAT_IMAGE_GDK) else @@ -7066,6 +7049,7 @@ popup_emit_image(win_T *wp) // leaving the image stuck on screen until the cell is overwritten. if (wp->w_popup_flags & POPF_HIDDEN) return; + row = wp->w_winrow + wp->w_popup_border[0] + wp->w_popup_padding[0]; col = wp->w_wincol + wp->w_popup_border[3] + wp->w_popup_padding[3]; @@ -7097,14 +7081,92 @@ popup_emit_image(win_T *wp) return; } # endif -# if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) -# ifdef FEAT_GUI +# ifdef FEAT_GUI // GUI builds without a GUI image backend (e.g. Motif) reach here when // gui.in_use is true; emitting sixel/kitty escape sequences via out_str() // would print them as raw text on the GUI canvas, so bail out. if (gui.in_use) return; +# endif +# ifdef FEAT_IMAGE_KITTY + if (popup_image_backend() == IMAGE_BACKEND_KITTY) + { + popup_clip_T cl; + int cell_x = 8; + int cell_y = 16; + int visible_w; + int visible_h; + int src_x, src_y, w, h; + + if (row < 0 || col < 0) + return; + +# if defined(UNIX) || defined(MSWIN) || defined(VMS) || defined(AMIGA) + { + struct cellsize cs; + + cs.cs_xpixel = -1; + cs.cs_ypixel = -1; +# if defined(UNIX) || defined(MSWIN) + mch_calc_cell_size(&cs); +# endif + if (cs.cs_xpixel > 0) + cell_x = cs.cs_xpixel; + if (cs.cs_ypixel > 0) + cell_y = cs.cs_ypixel; + } # endif + popup_compute_clip(wp, &cl); + + visible_w = wp->w_width - cl.clip_left_content - cl.clip_right_content; + visible_h = wp->w_height - cl.clip_top_content - cl.clip_bot_content; + + if (visible_w <= 0 || visible_h <= 0) + return; + + row += cl.clip_top_content; + col += cl.clip_left_content; + + src_x = cl.clip_left_content * cell_x; + src_y = cl.clip_top_content * cell_y; + w = wp->w_popup_image_w - src_x - cl.clip_right_content * cell_x; + h = wp->w_popup_image_h - src_y - cl.clip_bot_content * cell_y; + + // Clamp to the popup's actual visible cell box in pixels, so the + // crop can never claim more cells than the popup has + if (w > visible_w * cell_x) + w = visible_w * cell_x; + if (h > visible_h * cell_y) + h = visible_h * cell_y; + + if (w <= 0 || h <= 0) + return; + + // Transmit the image to the terminal if it hasn't already + if (!wp->w_popup_image_transmit) + { + image_rgb_T si; + + si.data = wp->w_popup_image_data; + si.width = wp->w_popup_image_w; + si.height = wp->w_popup_image_h; + si.has_alpha = wp->w_popup_image_alpha; + + if (kitty_transmit(&si, wp->w_id) == FAIL) + return; + wp->w_popup_image_transmit = true; + } + kitty_place(wp->w_id, row, col, src_x, src_y, w, h, wp->w_zindex); + + wp->w_popup_image_emit_row = row; + wp->w_popup_image_emit_col = col; + wp->w_popup_image_emit_cells_w = (w + cell_x - 1) / cell_x; + wp->w_popup_image_emit_cells_h = (h + cell_y - 1) / cell_y; + wp->w_popup_image_px_dirty = false; + return; + } +# endif +# ifdef FEAT_IMAGE_SIXEL if (wp->w_popup_image_seq == NULL) return; // For "clipwindow" popups the encoded sequence already covers only the @@ -7120,18 +7182,6 @@ popup_emit_image(win_T *wp) } if (row < 0 || col < 0) return; -# ifdef FEAT_IMAGE_KITTY - // A kitty placement persists on the terminal and is drawn above the - // text layer, so when it is already showing at this position there is - // nothing to repair: skip the (potentially multi-MB) retransmission. - // The flag is reset when the image is re-encoded, the placement is - // deleted, or the terminal screen is cleared. - if (popup_image_backend() == IMAGE_BACKEND_KITTY - && wp->w_popup_image_emit_valid - && wp->w_popup_image_emit_row == row - && wp->w_popup_image_emit_col == col) - return; -# endif // Hide the cursor across the move + image emit, then restore it to // the current text-cursor position before showing it; otherwise the // cursor can briefly flicker below its scrolled-to position because @@ -7153,33 +7203,28 @@ popup_emit_image(win_T *wp) // including cells that a higher zindex popup draws on top of this image. // Invalidate those cells in ScreenLines so the higher popup's draw, // later in this same update_popups() walk, actually rewrites them to - // the terminal instead of skipping them as unchanged. Not needed for - // kitty, where the placement is layered by its z= value instead. -# ifdef FEAT_IMAGE_KITTY - if (popup_image_backend() != IMAGE_BACKEND_KITTY) -# endif + // the terminal instead of skipping them as unchanged. + + for (int rr = row; rr < row + wp->w_popup_image_seq_cells_h; ++rr) { - for (int rr = row; rr < row + wp->w_popup_image_seq_cells_h; ++rr) - { - if (rr < 0 || rr >= screen_Rows) - continue; + if (rr < 0 || rr >= screen_Rows) + continue; - int off_base = LineOffset[rr]; + int off_base = LineOffset[rr]; - for (int cc = col; cc < col + wp->w_popup_image_seq_cells_w; ++cc) - { - if (cc < 0 || cc >= screen_Columns) - continue; - if (popup_mask[rr * screen_Columns + cc] <= wp->w_zindex) - continue; + for (int cc = col; cc < col + wp->w_popup_image_seq_cells_w; ++cc) + { + if (cc < 0 || cc >= screen_Columns) + continue; + if (popup_mask[rr * screen_Columns + cc] <= wp->w_zindex) + continue; - int off = off_base + cc; + int off = off_base + cc; - ScreenLines[off] = ' '; - if (enc_utf8 && ScreenLinesUC != NULL) - ScreenLinesUC[off] = 0; - ScreenAttrs[off] = -1; - } + ScreenLines[off] = ' '; + if (enc_utf8 && ScreenLinesUC != NULL) + ScreenLinesUC[off] = 0; + ScreenAttrs[off] = -1; } } @@ -7192,39 +7237,32 @@ popup_emit_image(win_T *wp) wp->w_popup_image_emit_col = col; wp->w_popup_image_emit_cells_w = wp->w_popup_image_seq_cells_w; wp->w_popup_image_emit_cells_h = wp->w_popup_image_seq_cells_h; - wp->w_popup_image_emit_valid = true; wp->w_popup_image_px_dirty = false; # endif } # ifdef FEAT_IMAGE_KITTY /* - * Send a kitty `a=d,i=` APC to remove the placement made for "wp" - * by an earlier kitty_encode(). Called when the popup goes away (via - * popup_hide / popup_close / textprop scrolling out of view), because - * unlike sixel pixels -- which the next text overwrite clears -- kitty - * placements persist until explicitly deleted. + * Remove the kitty image placement for "wp". Called when the popup goes + * away. + * When "del_data" is true the terminal also frees the transmitted image. */ static void -popup_image_clear_kitty(win_T *wp) +popup_image_clear_kitty(win_T *wp, bool del_data) { - char_u *seq; - # ifdef FEAT_GUI if (gui.in_use) return; # endif + if (wp == NULL || wp->w_popup_image_data == NULL || wp->w_id <= 0) return; + if (popup_image_backend() != IMAGE_BACKEND_KITTY) return; - seq = kitty_delete(wp->w_id); - if (seq == NULL) - return; - out_str(seq); - out_flush(); - vim_free(seq); - wp->w_popup_image_emit_valid = false; + kitty_delete(wp->w_id, del_data); + if (del_data) + wp->w_popup_image_transmit = false; } # endif @@ -7251,27 +7289,6 @@ popup_image_clear_gui(win_T *wp) } # endif -# if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) -/* - * Called after the terminal screen has been cleared: kitty deletes - * placements that intersect the erased area, so the cached "already on - * screen" state no longer holds and the next popup_emit_image() must - * retransmit. - */ - void -popup_images_invalidate(void) -{ - win_T *wp; - tabpage_T *tp; - - FOR_ALL_POPUPWINS(wp) - wp->w_popup_image_emit_valid = false; - FOR_ALL_TABPAGES(tp) - FOR_ALL_POPUPWINS_IN_TAB(tp, wp) - wp->w_popup_image_emit_valid = false; -} -# endif - /* * Re-paint every popup's image after the rest of the screen update has * settled. Only needed for the GUI, where the cursor redraw and other diff --git a/src/proto/kitty.pro b/src/proto/kitty.pro index 8c2970c7d1..001e79c311 100644 --- a/src/proto/kitty.pro +++ b/src/proto/kitty.pro @@ -1,5 +1,6 @@ /* kitty.c */ -char_u *kitty_encode(image_rgb_T *img, int id, int zindex); +int kitty_transmit(image_rgb_T *img, int id); +void kitty_place(int id, int row, int col, int src_x, int src_y, int w, int h, int z); +void kitty_delete(int id, bool del_data); int kitty_probe_parse(char *buf, int n); -char_u *kitty_delete(int id); /* vim: set ft=c : */ diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro index 758695c35f..f29aef9d08 100644 --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -60,7 +60,6 @@ void may_update_popup_mask(int type); void may_update_popup_position(void); int popup_get_base_screen_cell(int row, int col, schar_T *linep, int *attrp, u8char_T *ucp); void popup_set_base_screen_cell(int row, int col, schar_T line, int attr, u8char_T uc); -void popup_images_invalidate(void); void update_popup_images(void); void update_popup_images_rect(int left, int top, int right, int bottom); void update_popups(void (*win_update)(win_T *wp)); diff --git a/src/screen.c b/src/screen.c index b4cf42ee6d..662bc0ed70 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3636,11 +3636,6 @@ screenclear2(int doclear) if (suppressed_cells != NULL) vim_memset(suppressed_cells, 0, (size_t)suppressed_rows * suppressed_cols); -#endif -#if defined(FEAT_IMAGE_SIXEL) || defined(FEAT_IMAGE_KITTY) - // Clearing the display removes kitty image placements; force the - // next redraw to retransmit popup images. - popup_images_invalidate(); #endif } else diff --git a/src/structs.h b/src/structs.h index fdba4ee835..d41cd182b4 100644 --- a/src/structs.h +++ b/src/structs.h @@ -4277,7 +4277,7 @@ struct window_S // visible under the new frame's transparent pixels. bool w_popup_image_px_dirty; # ifdef FEAT_IMAGE_SIXEL - char_u *w_popup_image_seq; // cached sixel DCS sequence (terminal) + char_u *w_popup_image_seq; // cached sixel DCS sequence int w_popup_image_seq_w; // pixel width of cached seq int w_popup_image_seq_h; // pixel height used for cached seq; // -1 means cache is invalid @@ -4285,10 +4285,10 @@ struct window_S int w_popup_image_seq_crop_y; // pixel offset (top) into source int w_popup_image_seq_cells_w; // cell width spanning seq pixels int w_popup_image_seq_cells_h; // cell height spanning seq pixels - int w_popup_image_seq_zindex; // zindex encoded into seq (kitty z=) - bool w_popup_image_emit_valid; // true while the kitty placement - // emitted at w_popup_image_emit_* - // is still on the terminal +# endif +# ifdef FEAT_IMAGE_KITTY + bool w_popup_image_transmit; // If image has been transmitted to + // terminal # endif # ifdef FEAT_IMAGE_GDI // Pre-built Windows GUI image cache. The bitmap is a 32-bit top-down diff --git a/src/version.c b/src/version.c index 2033abfa4d..a5c38c915f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 962, /**/ 961, /**/ From 6ac008db969677304ba888854e5d44a32ce79853 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 17 Aug 2026 20:29:53 +0000 Subject: [PATCH 372/647] patch 9.2.0963: crash when sound-folding a crafted spell file Problem: A SAL rule longer than MAXWLEN is silently truncated to an empty lead. set_sal_first() then reorders the sl_sal entries by their index byte and can move the terminating sentinel out of the last slot, so spell_soundfold_wsal() reads past the end of the array, e.g. when soundfold() or spellsuggest() is used (Erick Alex). Solution: Bound the sound-folding loops against sl_sal.ga_len. closes: #21076 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Christian Brabandt --- src/spell.c | 5 +++-- src/testdir/test_spell_utf8.vim | 13 +++++++++++++ src/version.c | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/spell.c b/src/spell.c index de807d9053..f1cfdd8c24 100644 --- a/src/spell.c +++ b/src/spell.c @@ -3356,7 +3356,7 @@ spell_soundfold_sal(slang_T *slang, char_u *inword, char_u *res) if (n >= 0) { // check all rules for the same letter - for (; (s = smp[n].sm_lead)[0] == c; ++n) + for (; n < slang->sl_sal.ga_len && (s = smp[n].sm_lead)[0] == c; ++n) { // Quickly skip entries that don't match the word. Most // entries are less than three chars, optimize for that. @@ -3646,7 +3646,8 @@ spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res) // Check all rules for the same index byte. // If c is 0x300 need extra check for the end of the array, as // (c & 0xff) is NUL. - for (; ((ws = smp[n].sm_lead_w)[0] & 0xff) == (c & 0xff) + for (; n < slang->sl_sal.ga_len + && ((ws = smp[n].sm_lead_w)[0] & 0xff) == (c & 0xff) && ws[0] != NUL; ++n) { // Quickly skip entries that don't match the word. Most diff --git a/src/testdir/test_spell_utf8.vim b/src/testdir/test_spell_utf8.vim index fa9284be15..a24bdc47a3 100644 --- a/src/testdir/test_spell_utf8.vim +++ b/src/testdir/test_spell_utf8.vim @@ -827,5 +827,18 @@ func Test_spell_suggest_too_long() bwipe! endfunc +" A SAL rule that is too long to case-fold must not move the sentinel entry +" out of its last position in the sl_sal array. +func Test_spellfile_long_sal_rule() + call writefile(['1', 'ab'], 'Xlongsal.dic', 'D') + call writefile(['SAL ' .. repeat('w', 299) .. ' a', + \ "SAL a\u00e9 a"], 'Xlongsal.aff', 'D') + mkspell! Xlongsal Xlongsal + set spelllang=Xlongsal.utf-8.spl spell + " must not crash + call soundfold('ab') + set spelllang& spell& + call delete('Xlongsal.utf-8.spl') +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a5c38c915f..56e866a621 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 963, /**/ 962, /**/ From 2e6a408f3bc2b5dd83f883c56729cf57fe520762 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 17 Aug 2026 20:35:13 +0000 Subject: [PATCH 373/647] patch 9.2.0964: 'isprint' is applied to the leading byte of a character Problem: Excluding a value with 'isprint' also breaks the display of unrelated characters whose leading byte has that value. After ":set isprint+=^226" the character U+222B is displayed as "<" (Emilien Breton). Solution: Apply 'isprint' to the character value only, not to the leading byte of its UTF-8 encoding (Hirohito Higashi). fixes: #21053 closes: #21055 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/drawline.c | 5 +++-- src/testdir/test_utf8.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/drawline.c b/src/drawline.c index c799291ba6..edd5ef6ea5 100644 --- a/src/drawline.c +++ b/src/drawline.c @@ -3325,8 +3325,9 @@ win_line( } } - // Handling of non-printable characters. - if (!vim_isprintc(c)) + // Handling of non-printable characters. 'isprint' does not apply + // to a UTF-8 leading byte, the character was checked above. + if (!vim_isprintc(c) && !(enc_utf8 && c >= 0x80)) { // when getting a character from the file, we may have to // turn it into something else on the way to putting it diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim index 3070d4cc4b..34bd9a8012 100644 --- a/src/testdir/test_utf8.vim +++ b/src/testdir/test_utf8.vim @@ -388,4 +388,22 @@ func Test_overlong_utf8_cells() bwipe! endfunc +func Test_isprint_leading_byte() + new + let save_isprint = &isprint + " 226 is the leading byte of U+222B, which must not be affected. + set isprint+=^226 + call setline(1, "∫") + redraw + call assert_equal("∫", ScreenLines(1, 1)[0]) + + " U+00E2 has the character value 226 and is still excluded. + call setline(1, "â") + redraw + call assert_equal('', ScreenLines(1, 4)[0]) + + let &isprint = save_isprint + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 56e866a621..bd636ef462 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 964, /**/ 963, /**/ From 5a0e4889d185dd2cb9c3c7049b726160393ef7c6 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Mon, 17 Aug 2026 20:49:08 +0000 Subject: [PATCH 374/647] patch 9.2.0965: GTK4: blurry text rendering Problem: The GTK4 GUI rounds the character width up instead of to the nearest pixel, and adjacent row nodes leave a one pixel seam because their boundaries are not snapped to device pixels. Solution: Round the character width to the nearest pixel and overlap adjacent row nodes by one pixel (Christoffer Aasted). closes: #21013 Signed-off-by: Christoffer Aasted Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 2 +- src/gui_gtk4_da.c | 6 +++--- src/version.c | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 5b31e587ba..90e3e86038 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -1303,7 +1303,7 @@ gui_mch_init_font(char_u *font_name, int fontset UNUSED) pango_layout_get_size(layout, &width, NULL); g_object_unref(layout); - gui.char_width = (width / 2 + PANGO_SCALE - 1) / PANGO_SCALE; + gui.char_width = (width / 2 + PANGO_SCALE / 2) / PANGO_SCALE; if (gui.char_width <= 0) gui.char_width = 8; diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index d7e460254a..6eb9798e27 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -694,8 +694,8 @@ draw_layer_get_texture( // Scale texture to actual size node = gsk_texture_scale_node_new(texture, - &GRAPHENE_RECT_INIT(FILL_X(0), FILL_Y(row), - (da->n_cols + bleed) * gui.char_width, gui.char_height), + &GRAPHENE_RECT_INIT(FILL_X(0), FILL_Y(row), + (da->n_cols + bleed) * gui.char_width, gui.char_height + bleed), GSK_SCALING_FILTER_NEAREST); if (bleed) { @@ -704,7 +704,7 @@ draw_layer_get_texture( new = gsk_clip_node_new(node, &GRAPHENE_RECT_INIT(FILL_X(0), FILL_Y(row), da->n_cols * gui.char_width + da->bleed_right, - gui.char_height)); + gui.char_height + 1)); gsk_render_node_unref(node); node = new; } diff --git a/src/version.c b/src/version.c index bd636ef462..ae56e26a87 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 965, /**/ 964, /**/ From 795ee041f14e547e83a64deb346d1630a35284b7 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Mon, 17 Aug 2026 20:55:16 +0000 Subject: [PATCH 375/647] patch 9.2.0966: GTK4: window opens two lines too small Problem: On startup the GUI window is the height of the window decorations too small, so it shows two lines less than 'lines'. It only gets the right size after the first pointer event. Solution: Also request the shell size on the form widget, so that GTK derives the window height from it with the decorations included. Drop the request again once the size was given, so that the window can still be made smaller (Hirohito Higashi). closes: #21045 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- src/gui_gtk4.c | 56 +++++++++++++++++++++++++++++++----------------- src/gui_gtk4_f.c | 14 ++++++++++++ src/version.c | 2 ++ 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index 90e3e86038..a876264b42 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -256,6 +256,7 @@ static void mainwin_destroy_cb(GObject *object, gpointer data); static gboolean delete_event_cb(GtkWindow *window, gpointer data); static int query_pointer_pos(int *x, int *y, GdkModifierType *state); static void mainwin_fullscreened_cb(GObject *obj, GParamSpec *pspec, gpointer user_data); +static void set_form_size(int width, int height); static void drawarea_realize_cb(GtkWidget *widget, gpointer data); static void drawarea_unrealize_cb(GtkWidget *widget, gpointer data); #if defined(FEAT_IMAGE) @@ -770,11 +771,6 @@ gui_mch_open(void) pixel_width += get_menu_tool_width(); pixel_height += get_menu_tool_height(); - // Dimensions may be smaller because of client side decorations, we handle - // that after we present the window. - gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), - pixel_width, pixel_height); - if (foreground_argument != NULL) fg_pixel = gui_get_color((char_u *)foreground_argument); if (fg_pixel == INVALCOLOR) @@ -804,15 +800,16 @@ gui_mch_open(void) G_CALLBACK(mainwin_destroy_cb), NULL); // Resize is handled by GtkForm's size_allocate callback. + set_form_size((int)pixel_width - get_menu_tool_width(), + (int)pixel_height - get_menu_tool_height()); + gtk_window_present(GTK_WINDOW(gui.mainwin)); - // Update so that we get the "gui.decor_height", which we can then use to - // set the exact dimensions of the window. + // Undo the 80x24 clamp above, gui_init() asks for this size next. Drain + // the pending allocation before that, or gui_resize_shell() overwrites it. gui_mch_update(); Columns = columns; Rows = rows; - gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), - pixel_width, pixel_height + gui.decor_height); // Make sure the drawing area gets keyboard focus. gtk_widget_grab_focus(gui.drawarea); @@ -953,12 +950,19 @@ gui_gtk_init_decor_height(void) gui.decor_height = h; } - void -gui_mch_set_shellsize(int width, int height, - int min_width UNUSED, int min_height UNUSED, - int base_width UNUSED, int base_height UNUSED, - int direction UNUSED) +/* + * Ask for the form widget, and thus the shell, to become "width" by "height" + * pixels. + */ + static void +set_form_size(int width, int height) { + // Nothing to do when the form widget already has this size: no allocation + // would follow and the size request below would never be dropped. + if (gtk_widget_get_width(gui.formwin) == width + && gtk_widget_get_height(gui.formwin) == height) + return; + // Remember the size the form widget is supposed to get. An allocation // that arrives before the compositor has answered this request still has // the previous size and must not be used. @@ -966,14 +970,26 @@ gui_mch_set_shellsize(int width, int height, gui.pending_form_h = height; gui.pending_form_skip = 1; - width += get_menu_tool_width(); - height += get_menu_tool_height(); - // GtkWindow default size also includes client side decorations, so must - // include it also. - height += gui.decor_height; + // include it also. It also keeps the natural width of the toolbar from + // deciding the width. + gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), + width + get_menu_tool_width(), + height + get_menu_tool_height() + gui.decor_height); + + // The window drops a request made while it is being presented, and + // "gui.decor_height" is not known before that. A size request on the form + // widget is honoured then; it is dropped again once the size was given. + gtk_widget_set_size_request(gui.formwin, width, height); +} - gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), width, height); + void +gui_mch_set_shellsize(int width, int height, + int min_width UNUSED, int min_height UNUSED, + int base_width UNUSED, int base_height UNUSED, + int direction UNUSED) +{ + set_form_size(width, height); gui_mch_update(); } diff --git a/src/gui_gtk4_f.c b/src/gui_gtk4_f.c index e61092c669..f056657798 100644 --- a/src/gui_gtk4_f.c +++ b/src/gui_gtk4_f.c @@ -228,7 +228,21 @@ vim_form_resize_idle_cb(VimForm *self) && --gui.pending_form_skip >= 0) goto exit; + int req_w, req_h; + gui.pending_form_w = 0; + + // The size request that Vim made has been answered. Keep the size and + // drop the request, otherwise the window could not be made smaller. + gtk_widget_get_size_request(GTK_WIDGET(self), &req_w, &req_h); + if (req_w != -1 || req_h != -1) + { + gtk_window_set_default_size(GTK_WINDOW(gui.mainwin), + gtk_widget_get_width(gui.mainwin), + gtk_widget_get_height(gui.mainwin)); + gtk_widget_set_size_request(GTK_WIDGET(self), -1, -1); + } + gui_resize_shell(self->last_width, self->last_height); } diff --git a/src/version.c b/src/version.c index ae56e26a87..c387ee67a6 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 966, /**/ 965, /**/ From 6025ea9e029b0681df37ee19e0d3992fb7f4d7fd Mon Sep 17 00:00:00 2001 From: XiaowenHu96 Date: Mon, 17 Aug 2026 21:01:37 +0000 Subject: [PATCH 376/647] patch 9.2.0967: hit-enter prompt eats keys from a running mapping Problem: The hit-enter prompt fires whenever a message scrolls the screen. When this happens while a mapping is being processed, it consumes the mapping's next key, causing unexpected behavior for users. Solution: Similar to what 9.1.1969 did for stuffed characters, skip the hit-enter prompt when there are still keys pending from a mapping in the typeahead buffer. related: neovim/neovim#38298 related: neovim/neovim#20635 related: neovim/neovim#30890 closes: #20753 AI assisted. Signed-off-by: XiaowenHu96 Signed-off-by: Christian Brabandt --- src/message.c | 10 ++++++---- src/testdir/test_messages.vim | 27 +++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/message.c b/src/message.c index de56ddcb93..1eecb053a1 100644 --- a/src/message.c +++ b/src/message.c @@ -1287,10 +1287,12 @@ wait_return(int redraw) c = CAR; // no need for a return in ex mode got_int = FALSE; } - else if (!stuff_empty()) - // When there are stuffed characters, the next stuffed character will - // dismiss the hit-enter prompt immediately and have to be put back, so - // instead just don't show the hit-enter prompt at all. + else if (!stuff_empty() || !typebuf_typed()) + // When there are stuffed characters or pending mapped characters, the + // next character will dismiss the hit-enter prompt immediately. A + // stuffed character then has to be put back, while a mapped character + // may even be swallowed (e.g. "g" treated as a message-scrollback key), + // so instead just don't show the hit-enter prompt at all. c = CAR; else { diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim index 2e5a16e4b8..b628a28e82 100644 --- a/src/testdir/test_messages.vim +++ b/src/testdir/test_messages.vim @@ -813,6 +813,33 @@ func Test_long_formatprg_no_hit_enter() call StopVimInTerminal(buf) endfunc +" A message shown while a mapping is still being processed must not raise a +" hit-enter prompt that eats the mapping's remaining keys. +func Test_hit_enter_no_eat_mapped_keys() + CheckRunVimInTerminal + + let lines =<< trim END + set ruler + call setline(1, range(1, 20)) + " The 8-line :echo scrolls the screen and would raise a hit-enter prompt; + " the mapping then runs "gg" to move the cursor to line 1. + nnoremap X :echo "a\nb\nc\nd\ne\nf\ng\nh"gg + normal! 10G + END + call writefile(lines, 'XtestHitEnterMap', 'D') + let buf = RunVimInTerminal('-S XtestHitEnterMap', #{rows: 10}) + call WaitForAssert({-> assert_match('10,1', term_getline(buf, 10))}) + + call term_sendkeys(buf, "X") + " Without the fix the hit-enter prompt eats the mapping's "g" keys and the + " cursor stays put. With the fix "gg" runs and moves the cursor to line 1. + call WaitForAssert({-> assert_match('1,1', term_getline(buf, 10))}) + call assert_notmatch('Press ENTER', term_getline(buf, 10)) + + " clean up + call StopVimInTerminal(buf) +endfunc + " Test that fileinfo is shown after deleting the last listed buffer with :bd func Test_fileinfo_after_last_bd() CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index c387ee67a6..0476994203 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 967, /**/ 966, /**/ From 0b7700e1ab7a74c900da086e221172abd54657e2 Mon Sep 17 00:00:00 2001 From: chrnz008 Date: Mon, 17 Aug 2026 21:15:13 +0000 Subject: [PATCH 377/647] runtime(doc): add PREVENT LOADING section for pi_getscript.txt closes: #21040 Signed-off-by: chrnz008 Signed-off-by: Christian Brabandt --- runtime/doc/pi_getscript.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/runtime/doc/pi_getscript.txt b/runtime/doc/pi_getscript.txt index 756d9e83dc..a543d237ba 100644 --- a/runtime/doc/pi_getscript.txt +++ b/runtime/doc/pi_getscript.txt @@ -1,4 +1,4 @@ -*pi_getscript.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*pi_getscript.txt* For Vim version 9.2. Last change: 2026 Aug 17 > GETSCRIPT REFERENCE MANUAL by Charles E. Campbell < @@ -79,6 +79,14 @@ work. (edit GetLatestVimScripts.dat to install your own personal list of desired plugins -- see |GetLatestVimScripts_dat|) + PREVENT LOADING + +If you want to use plugins, but for some reason don't wish to use getscript, +then you can avoid loading the getscript plugin by adding the following to +your |vimrc|: > + + :let g:loaded_getscriptPlugin = 1 +< ============================================================================== 3. GetLatestVimScripts Usage *glvs-usage* *:GLVS* From 068657ffc9c0e8168c70d75f84dbd7fcf0e25c74 Mon Sep 17 00:00:00 2001 From: Shay Hill Date: Mon, 17 Aug 2026 21:20:00 +0000 Subject: [PATCH 378/647] runtime(vimlogo): remove coincident lines and reshade vimlogo.svg Remove coincident lines and stroke attributes from vimlogo.svg to facilitate printing, vinyl, and document conversion. Re-shade diamond bevels with an NPR shader, preserving original face color. closes: #21050 Signed-off-by: Shay Hill Signed-off-by: Christian Brabandt --- runtime/vimlogo.svg | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/runtime/vimlogo.svg b/runtime/vimlogo.svg index 2ed9ef69ee..31b56f45de 100644 --- a/runtime/vimlogo.svg +++ b/runtime/vimlogo.svg @@ -1,15 +1,15 @@ - + - - vimlogo 1.1.0 + + vimlogo 1.3.0 Shay Hill The classic Vim logo. - https://www.github.com/ShayHill/vimlogo + https://www.github.com/ShayHill/vim_logo https://github.com/vim/vim @@ -19,26 +19,14 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + From 1d14eea969cc3f962bed78ab75b48064fc6c5fc0 Mon Sep 17 00:00:00 2001 From: Mao-Yining Date: Mon, 17 Aug 2026 21:24:35 +0000 Subject: [PATCH 379/647] runtime(doc): Add clipboard provider example for WSL Referencing mattn/vim-wslclip. Signed-off-by: Mao-Yining Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- runtime/doc/eval.txt | 17 ++++++++++++++++- runtime/doc/tags | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index d2b5bb478f..cedb60d283 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 9.2. Last change: 2026 Aug 16 +*eval.txt* For Vim version 9.2. Last change: 2026 Aug 17 VIM REFERENCE MANUAL by Bram Moolenaar @@ -5442,4 +5442,19 @@ Below is a sample script that makes use of the clipboard provider feature: >vim \ } set clipmethod^=test < + *clipboard-providers-wsl* +For Windows WSL, try this script: >vim9 + vim9script + + var Copy = (_, _, lines: list) => system('wl-copy', lines) + var Paste = (_) => ('', systemlist('wl-paste --no-newline') + ->map((_, v) => v->trim("\r", 2))) + + v:clipproviders["wslclip"] = { + available: () => executable('wl-copy') && executable('wl-paste'), + copy: { "*": Copy, "+": Copy }, + paste: { "*": Paste, "+": Paste } + } + set clipmethod^=wslclip + vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/runtime/doc/tags b/runtime/doc/tags index 92279726b6..41e7a10723 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -6752,6 +6752,7 @@ clipboard-providers-no-clipboard eval.txt /*clipboard-providers-no-clipboard* clipboard-providers-paste eval.txt /*clipboard-providers-paste* clipboard-providers-plus eval.txt /*clipboard-providers-plus* clipboard-providers-textlock eval.txt /*clipboard-providers-textlock* +clipboard-providers-wsl eval.txt /*clipboard-providers-wsl* clipboard-unnamed options.txt /*clipboard-unnamed* clipboard-unnamedplus options.txt /*clipboard-unnamedplus* clojure-indent indent.txt /*clojure-indent* From 21e9249838018d5c06973ca17d0b51697b997d33 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 17:52:21 +0000 Subject: [PATCH 380/647] patch 9.2.0968: status line height is wrong after exchanging or rotating windows Problem: Exchanging windows with CTRL-W x or rotating them with CTRL-W r leaves a window with the status line height of the other one, so with 'statuslineopt' the windows in a row no longer line up. Solution: Keep the total height of each window when the status line height is exchanged, and compute the height needed for the status line of each window afterwards. closes: #21079 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_statusline.vim | 125 ++++++++++++++++++++++++++++++++ src/version.c | 2 + src/window.c | 20 +++++ 3 files changed, 147 insertions(+) diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim index ad182fcf36..0010bb182a 100644 --- a/src/testdir/test_statusline.vim +++ b/src/testdir/test_statusline.vim @@ -894,6 +894,131 @@ func Test_statusline_click_multiple_regions() let &laststatus = save_ls endfunc +func StlExchangeEnter() + let &l:statusline = 'one%@two%@three' +endfunc + +func StlExchangeLeave() + setlocal statusline< +endfunc + +" Rows used by the status line of window "nr", derived from where the window +" ends on the screen. +func s:StlHeight(nr) + return &lines - &cmdheight - win_screenpos(a:nr)[0] - winheight(a:nr) + 1 +endfunc + +" Exchanging two windows keeps the status line height with the window. +func Test_statuslineopt_win_exchange() + let save_stlo = &statuslineopt + let save_stl = &statusline + let save_ls = &laststatus + set laststatus=2 + set statusline=global + set statuslineopt=maxheight:3 + + augroup TestStlExchange + autocmd! + autocmd WinEnter * call StlExchangeEnter() + autocmd WinLeave * call StlExchangeLeave() + augroup END + + new + only + call StlExchangeEnter() + vsplit + redraw + + " The current window needs three rows for its status line, the other one. + call assert_equal(1, winnr()) + call assert_equal(3, s:StlHeight(1)) + call assert_equal(1, s:StlHeight(2)) + + " Exchanging puts the cursor in the other window, which then is the one + " needing three rows. + wincmd x + redraw + call assert_equal(1, winnr()) + call assert_equal(3, s:StlHeight(1)) + call assert_equal(1, s:StlHeight(2)) + + augroup TestStlExchange + autocmd! + augroup END + augroup! TestStlExchange + delfunc StlExchangeEnter + delfunc StlExchangeLeave + only + bwipe! + let &laststatus = save_ls + let &statusline = save_stl + let &statuslineopt = save_stlo +endfunc + +" Exchanging two windows keeps a fixed status line height with the window. +func Test_statuslineopt_fixed_win_exchange() + let save_stlo = &statuslineopt + let save_ls = &laststatus + set laststatus=2 + + new + only + vsplit + setlocal statuslineopt=fixedheight,maxheight:3 + redraw + + " Only the current window has a local 'statuslineopt'. + call assert_equal(1, winnr()) + call assert_equal(3, s:StlHeight(1)) + call assert_equal(1, s:StlHeight(2)) + + " The window that was exchanged keeps needing three rows. + wincmd x + redraw + call assert_equal(1, winnr()) + call assert_equal(1, s:StlHeight(1)) + call assert_equal(3, s:StlHeight(2)) + + only + bwipe! + let &laststatus = save_ls + let &statuslineopt = save_stlo +endfunc + +" Rotating windows keeps a fixed status line height with the window. +func Test_statuslineopt_fixed_win_rotate() + let save_stlo = &statuslineopt + let save_ls = &laststatus + set laststatus=2 + + new + only + vsplit + setlocal statuslineopt=fixedheight,maxheight:3 + redraw + + call assert_equal(1, winnr()) + call assert_equal(3, s:StlHeight(1)) + call assert_equal(1, s:StlHeight(2)) + + " Rotating moves the window that needs three rows to the other position. + wincmd r + redraw + call assert_equal(1, s:StlHeight(1)) + call assert_equal(3, s:StlHeight(2)) + + " Rotating back restores it. + wincmd r + redraw + call assert_equal(3, s:StlHeight(1)) + call assert_equal(1, s:StlHeight(2)) + + only + bwipe! + let &laststatus = save_ls + let &statuslineopt = save_stlo +endfunc + " Click on a region in any row of a multi-line statusline (issue #20116). func Test_statusline_click_multiline() let save_mouse = &mouse diff --git a/src/version.c b/src/version.c index 0476994203..0115e9423e 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 968, /**/ 967, /**/ diff --git a/src/window.c b/src/window.c index 4d4cfab448..b2ed04e4d1 100644 --- a/src/window.c +++ b/src/window.c @@ -1905,7 +1905,14 @@ win_exchange(long Prenum) else frame_append(frp2, wp->w_frame); } + // Keep the total height of each window the same, so that the frames keep + // their height; the status line height is computed below. temp = curwin->w_status_height; + if (temp != wp->w_status_height) + { + win_new_height(curwin, curwin->w_height + temp - wp->w_status_height); + win_new_height(wp, wp->w_height + wp->w_status_height - temp); + } curwin->w_status_height = wp->w_status_height; wp->w_status_height = temp; temp = curwin->w_vsep_width; @@ -1918,6 +1925,9 @@ win_exchange(long Prenum) frame_fix_width(wp); win_comp_pos(); // recompute window positions +#if defined(FEAT_STL_OPT) + frame_change_statusline_height(); +#endif if (wp->w_buffer != curbuf) reset_VIsual_and_resel(); @@ -1993,7 +2003,14 @@ win_rotate(int upwards, int count) } // exchange status height and vsep width of old and new last window + // Keep the total height of each window the same, so that the frames + // keep their height; the status line height is computed below. n = wp2->w_status_height; + if (n != wp1->w_status_height) + { + win_new_height(wp2, wp2->w_height + n - wp1->w_status_height); + win_new_height(wp1, wp1->w_height + wp1->w_status_height - n); + } wp2->w_status_height = wp1->w_status_height; wp1->w_status_height = n; frame_fix_height(wp1); @@ -2007,6 +2024,9 @@ win_rotate(int upwards, int count) // recompute w_winrow and w_wincol for all windows win_comp_pos(); } +#if defined(FEAT_STL_OPT) + frame_change_statusline_height(); +#endif redraw_all_later(UPD_NOT_VALID); } From 08c74ce09a9269b93b01ff2289683ad63f396fba Mon Sep 17 00:00:00 2001 From: Matthias Bruns Date: Tue, 18 Aug 2026 18:27:16 +0000 Subject: [PATCH 381/647] patch 9.2.0969: runtime(shaderslang): matchit % breaks on braces Problem: b:match_words groups "{" with the if/for/while/switch keywords and "}" with "break" which breaks % matching on braces Solution: Drop the brace and bracket groups, matchit appends 'matchpairs' by itself (Matthias Bruns). matchit counts every alternative in a group instead of pairing the alternatives with each other. Listing `{` alongside the if, for, while, switch, struct and class keywords therefore makes a line such as `for (...) {` count as two openers, and listing `break` alongside `}` lets a brace pair with a break statement. As a result % on the opening brace of a function does not move at all, and % on `switch (x) {` jumps to `break;` instead of the closing brace. Braces and brackets do not need to be listed: matchit appends 'matchpairs' to b:match_words by itself. Drop them and leave the preprocessor group unchanged. closes: #21064 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Matthias Bruns Signed-off-by: Christian Brabandt --- runtime/ftplugin/shaderslang.vim | 9 +++------ src/testdir/test_plugin_matchit.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/runtime/ftplugin/shaderslang.vim b/runtime/ftplugin/shaderslang.vim index f3d1ab8c1c..900bc6dd9b 100644 --- a/runtime/ftplugin/shaderslang.vim +++ b/runtime/ftplugin/shaderslang.vim @@ -1,7 +1,7 @@ " Vim filetype plugin file " Language: Slang " Maintainer: Austin Shijo -" Last Change: 2025 Jan 05 +" Last Change: 2026 Aug 16 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -28,12 +28,9 @@ setlocal commentstring=//\ %s setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,:// " When the matchit plugin is loaded, this makes the % command skip parens and -" braces in comments properly, and adds support for shader-specific keywords +" braces in comments properly if exists("loaded_matchit") - " Add common shader control structures - let b:match_words = '{\|^\s*\<\(if\|for\|while\|switch\|struct\|class\)\>:}\|^\s*\,' .. - \ '^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>,' .. - \ '\[:\]' + let b:match_words = '^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>' let b:match_skip = 's:comment\|string\|character\|special' let b:match_ignorecase = 0 let b:undo_ftplugin ..= " | unlet! b:match_skip b:match_words b:match_ignorecase" diff --git a/src/testdir/test_plugin_matchit.vim b/src/testdir/test_plugin_matchit.vim index 1c8144278d..cbff2a6da0 100644 --- a/src/testdir/test_plugin_matchit.vim +++ b/src/testdir/test_plugin_matchit.vim @@ -55,4 +55,22 @@ func Test_html_matchit_tag_multiline_attributes() bwipe! endfunc +func Test_shaderslang_matchit_switch_break() + call s:Setup(['void main() {', ' switch (x) {', ' case 1:', + \ ' break;', ' }', '}'], 'shaderslang') + call assert_equal(5, s:PercentTo([2, 14])) + call assert_equal(2, s:PercentTo([5, 3])) + bwipe! +endfunc + +func Test_shaderslang_matchit_loop_break() + call s:Setup(['void f() {', ' for (int i = 0; i < 4; ++i) {', + \ ' if (i == 2)', ' break;', ' total += i;', ' }', + \ ' int after = 1;', '}'], 'shaderslang') + call assert_equal(8, s:PercentTo([1, 10])) + call assert_equal(6, s:PercentTo([2, 31])) + call assert_equal(2, s:PercentTo([6, 3])) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 0115e9423e..7f82d187bf 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 969, /**/ 968, /**/ From 6362cc82bbf01b498da37036ec76ffa987b85e4e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 19:34:57 +0000 Subject: [PATCH 382/647] patch 9.2.0970: buffered listener cannot obtain the text of a change Problem: A callback added with listener_add() is given the line numbers of a change but not the text. When changes are buffered, two changes to the same line do not change the line count and are reported together, so getbufline() can only return the result of the second one. Solution: Let listener_add() take a Dictionary of options and add a "text" option, which stores the resulting text in each item of the list of changes. The text is copied when the change is recorded, so it is not affected by later changes. Invoke the callback early when a lot of text has been recorded, to bound the memory used. related: #19621 closes: #21071 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 59 ++++++++-- runtime/doc/tags | 1 + src/change.c | 90 ++++++++++++++- src/evalfunc.c | 19 +++- src/proto/typval.pro | 1 + src/structs.h | 2 + src/testdir/test_listener.vim | 179 ++++++++++++++++++++++++++++++ src/testdir/test_vim9_builtin.vim | 1 + src/typval.c | 12 ++ src/version.c | 2 + 10 files changed, 353 insertions(+), 13 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index d88d5deac6..11934bcfca 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 11 +*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -390,7 +390,7 @@ lispindent({lnum}) Number Lisp indent for line {lnum} list2blob({list}) Blob turn {list} of numbers into a Blob list2str({list} [, {utf8}]) String turn {list} of numbers into a String list2tuple({list}) Tuple turn {list} of items into a tuple -listener_add({callback} [, {buf} [, {unbuffered}]]) +listener_add({callback} [, {buf} [, {options}]]) Number add a callback to listen to changes listener_flush([{buf}]) none invoke listener callbacks listener_remove({id}) Number remove a listener callback @@ -6811,7 +6811,7 @@ list2tuple({list}) *list2tuple()* Return type: tuple<{type}> (depending on the given |List|) -listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* +listener_add({callback} [, {buf} [, {options}]]) *listener_add()* Add a callback function that will be invoked when changes have been made to buffer {buf}. {buf} refers to a buffer name or number. For the accepted @@ -6848,6 +6848,8 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* the change; one if unknown or the whole line was affected; this is a byte index, first character has a value of one. + text only present when the "text" option is set + for at least one listener, see below When lines are inserted (not when a line is split, e.g. by typing CR in Insert mode) the values are: lnum line above which the new line is added @@ -6866,7 +6868,15 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* added 0 col first column with a change or 1 - When {unbuffered} is |FALSE| or not provided the {callback} is + {options} is a Dictionary with these optional entries: + unbuffered invoke the {callback} for every single change + instead of for a batch of changes + text include the resulting text as a |List| of + Strings in each item of "changes" + For backwards compatibility {options} may also be a |Boolean|, + which is then used for the "unbuffered" entry. + + When "unbuffered" is |FALSE| or not provided the {callback} is invoked: 1. Just before the screen is updated. @@ -6874,17 +6884,23 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* 3. When a change is being made that changes the line count in a way that causes a line number in the list of changes to become invalid. + 4. When "text" is set and a lot of text has been recorded. The entries are in the order the changes were made, thus the most recent change is at the end. + Reasons three and four make the {callback} run while another + command is executing, carrying the changes made before it. Do + not assume that what a {callback} receives was caused by the + command that is running. + Because of the third reason for triggering a callback listed above, the line numbers passed to the callback are not guaranteed to be valid. In particular, the end value can be - greater than line('$') + 1. If this is a problem then make - {unbuffered} |TRUE|. + greater than line('$') + 1. If this is a problem then set + "unbuffered". - When {unbuffered} is |TRUE| the {callback} is invoked for every + When "unbuffered" is |TRUE| the {callback} is invoked for every single change. The changes list only holds a single dictionary and the "start", "end" and "added" values in the dictionary are the same as the corresponding callback @@ -6892,6 +6908,35 @@ listener_add({callback} [, {buf} [, {unbuffered}]]) *listener_add()* invoked, but later changes may make them invalid, thus keeping a copy for later might not work. + *listener-text* + When "text" is set each item in "changes" gets a "text" entry, + a List with the lines that occupy the changed region right + after that change was made: the lines "lnum" up to but not + including "end" plus "added". This List is empty when the + change only deleted lines. Together with "lnum", "end" and + "added" the item then fully describes the change: replace the + lines "lnum" up to but not including "end" with "text". + + The text is copied at the moment the change is recorded, so it + is not affected by later changes. Without it a buffered + {callback} cannot reliably obtain the text of a change: two + changes to the same line do not change the line count and are + reported together, and by then |getbufline()| can only return + the result of the second one. Setting "unbuffered" avoids + that as well, but then the {callback} is invoked for every + single change, which is expensive for a command that changes + many lines. + + Setting "text" costs a copy of the changed lines for every + change. To keep the memory used by a long sequence of changes + bounded, the {callback} is also invoked when a lot of text has + been recorded. + + The recorded changes are kept per buffer and shared by all + listeners for that buffer. Therefore, when at least one + listener for the buffer sets "text", every {callback} for that + buffer gets the "text" entry. + The {callback} is invoked with the text locked, see |textlock|. If you do need to make changes to the buffer, use a timer to do this later |timer_start()|. diff --git a/runtime/doc/tags b/runtime/doc/tags index 41e7a10723..a8ff635fef 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -8942,6 +8942,7 @@ list-repeat windows.txt /*list-repeat* list2blob() builtin.txt /*list2blob()* list2str() builtin.txt /*list2str()* list2tuple() builtin.txt /*list2tuple()* +listener-text builtin.txt /*listener-text* listener_add() builtin.txt /*listener_add()* listener_flush() builtin.txt /*listener_flush()* listener_remove() builtin.txt /*listener_remove()* diff --git a/src/change.c b/src/change.c index c9e27c1949..7edbd9b8d8 100644 --- a/src/change.c +++ b/src/change.c @@ -207,6 +207,7 @@ clean_listener_list(buf_T *buf, listener_T **list, bool all) { list_unref(buf->b_recorded_changes); buf->b_recorded_changes = NULL; + buf->b_recorded_text_size = 0; } } } @@ -267,6 +268,68 @@ check_recorded_changes( } } +// Amount of recorded text after which the listeners are invoked, to bound the +// memory used by a long sequence of changes. +# define LISTENER_TEXT_MAX (4 * 1024 * 1024) + +/* + * Return true when any listener in "list" asked for the resulting text. + */ + static bool +listeners_want_text(listener_T *list) +{ + listener_T *lnr; + + for (lnr = list; lnr != NULL; lnr = lnr->lr_next) + if (lnr->lr_text) + return true; + return false; +} + +/* + * Store in "dict" the text that occupies the changed region right after the + * change: the lines from "lnum" up to but not including "lnume" + "xtra". + * Returns the number of bytes stored. + */ + static size_t +add_change_text( + buf_T *buf, + dict_T *dict, + linenr_T lnum, + linenr_T lnume, + long xtra) +{ + list_T *l = list_alloc(); + linenr_T below = lnume + xtra; // line below the changed region + size_t size = 0; + + if (l == NULL) + return 0; + + if (below > buf->b_ml.ml_line_count + 1) + below = buf->b_ml.ml_line_count + 1; + for (linenr_T lp = lnum < 1 ? 1 : lnum; lp < below; ++lp) + { + char_u *line = ml_get_buf(buf, lp, FALSE); + colnr_T len = ml_get_buf_len(buf, lp); + + // Rather than storing a part of the text, store none of it. + if (list_append_string(l, line, len) == FAIL) + { + list_free(l); + return 0; + } + size += (size_t)len + 1; + } + + if (dict_add_list(dict, "text", l) == FAIL) + { + list_free(l); + return 0; + } + return size; +} + /* * Record a change for listeners added with listener_add(). * Always for the current buffer. @@ -306,8 +369,15 @@ may_record_change( dict_add_number(dict, "end", (varnumber_T)lnume); dict_add_number(dict, "added", (varnumber_T)xtra); dict_add_number(dict, "col", (varnumber_T)col + 1); + if (listeners_want_text(curbuf->b_listener)) + curbuf->b_recorded_text_size += + add_change_text(curbuf, dict, lnum, lnume, xtra); list_append_dict(curbuf->b_recorded_changes, dict); + + // Invoking the listeners resets the size, do not try while they are busy. + if (!recursive && curbuf->b_recorded_text_size > LISTENER_TEXT_MAX) + invoke_listeners(curbuf); } /* @@ -319,7 +389,8 @@ f_listener_add(typval_T *argvars, typval_T *rettv) callback_T callback; listener_T *lnr; buf_T *buf = curbuf; - int unbuffered = 0; + bool unbuffered = false; + bool want_text = false; if (check_secure()) return; @@ -332,7 +403,7 @@ f_listener_add(typval_T *argvars, typval_T *rettv) if (in_vim9script() && ( check_for_opt_buffer_arg(argvars, 1) == FAIL - || check_for_opt_bool_arg(argvars, 2) == FAIL)) + || check_for_opt_bool_or_dict_arg(argvars, 2) == FAIL)) return; callback = get_callback(&argvars[0]); @@ -347,8 +418,15 @@ f_listener_add(typval_T *argvars, typval_T *rettv) free_callback(&callback); return; } - if (argvars[2].v_type != VAR_UNKNOWN) - unbuffered = (int)tv_get_bool(&argvars[2]); + if (argvars[2].v_type == VAR_DICT) + { + dict_T *d = argvars[2].vval.v_dict; + + unbuffered = dict_get_bool(d, "unbuffered", false); + want_text = dict_get_bool(d, "text", false); + } + else if (argvars[2].v_type != VAR_UNKNOWN) + unbuffered = tv_get_bool(&argvars[2]); } lnr = ALLOC_CLEAR_ONE(listener_T); @@ -377,6 +455,7 @@ f_listener_add(typval_T *argvars, typval_T *rettv) set_callback(&lnr->lr_callback, &callback); + lnr->lr_text = want_text; lnr->lr_id = ++next_listener_id; rettv->vval.v_number = lnr->lr_id; } @@ -573,6 +652,8 @@ invoke_sync_listeners( dict_add_number(dict, "end", (varnumber_T)end); dict_add_number(dict, "added", (varnumber_T)added); dict_add_number(dict, "col", (varnumber_T)col + 1); + if (listeners_want_text(buf->b_sync_listener)) + (void)add_change_text(buf, dict, start, end, added); list_append_dict(recorded_changes, dict); invoke_listener_set( @@ -616,6 +697,7 @@ invoke_listeners(buf_T *buf) list_unref(buf->b_recorded_changes); buf->b_recorded_changes = NULL; + buf->b_recorded_text_size = 0; } /* diff --git a/src/evalfunc.c b/src/evalfunc.c index 92a3163544..6820cd8c90 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -412,6 +412,20 @@ arg_bool_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) return FAIL; } +/* + * Check "type" is a bool or a dict of 'any'. + */ + static int +arg_bool_or_dict_any( + type_T *type, + type_T *decl_type UNUSED, + argcontext_T *context) +{ + if (type->tt_type == VAR_DICT || type_any_or_unknown(type)) + return OK; + return check_arg_type(&t_bool, type, context); +} + /* * Check "type" is a list of 'any' or a blob. */ @@ -1301,7 +1315,8 @@ static argcheck_T arg2_string_or_list_number[] = {arg_string_or_list_any, arg_nu static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr}; static argcheck_T arg2_blob_dict[] = {arg_blob, arg_dict_any}; static argcheck_T arg2_list_or_tuple_string[] = {arg_list_or_tuple, arg_string}; -static argcheck_T arg3_any_buffer_bool[] = {arg_any, arg_buffer, arg_bool}; +static argcheck_T arg3_any_buffer_bool_or_dict[] = { + arg_any, arg_buffer, arg_bool_or_dict_any}; static argcheck_T arg3_any_list_dict[] = {arg_any, arg_list_any, arg_dict_any}; static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum}; static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number}; @@ -2515,7 +2530,7 @@ static const funcentry_T global_functions[] = ret_string, f_list2str}, {"list2tuple", 1, 1, FEARG_1, arg1_list_any, ret_tuple_any, f_list2tuple}, - {"listener_add", 1, 3, FEARG_2, arg3_any_buffer_bool, + {"listener_add", 1, 3, FEARG_2, arg3_any_buffer_bool_or_dict, ret_number, f_listener_add}, {"listener_flush", 0, 1, FEARG_1, arg1_buffer, ret_void, f_listener_flush}, diff --git a/src/proto/typval.pro b/src/proto/typval.pro index fcd9cd1c4c..1b5eb2905c 100644 --- a/src/proto/typval.pro +++ b/src/proto/typval.pro @@ -20,6 +20,7 @@ int check_for_float_or_nr_arg(typval_T *args, int idx); int check_for_bool_arg(typval_T *args, int idx); int check_for_opt_bool_arg(typval_T *args, int idx); int check_for_opt_bool_or_number_arg(typval_T *args, int idx); +int check_for_opt_bool_or_dict_arg(typval_T *args, int idx); int check_for_blob_arg(typval_T *args, int idx); int check_for_list_arg(typval_T *args, int idx); int check_for_nonnull_list_arg(typval_T *args, int idx); diff --git a/src/structs.h b/src/structs.h index d41cd182b4..984acc1d9e 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2973,6 +2973,7 @@ struct listener_S { listener_T *lr_next; int lr_id; + bool lr_text; // include the resulting text in each change callback_T lr_callback; }; @@ -3633,6 +3634,7 @@ struct file_buffer listener_T *b_listener; // Listeners accepting buffered reports. listener_T *b_sync_listener; // Listeners requiring unbuffered reports. list_T *b_recorded_changes; + size_t b_recorded_text_size; // bytes of text held by the above #endif #ifdef FEAT_PROP_POPUP bool b_has_textprop; // true when text props were added diff --git a/src/testdir/test_listener.vim b/src/testdir/test_listener.vim index 6b91e8d046..b981fd72d1 100644 --- a/src/testdir/test_listener.vim +++ b/src/testdir/test_listener.vim @@ -801,6 +801,185 @@ func Test_listener_blockwise_paste() bwipe! endfunc +func s:StoreChanges(l) + call add(s:changes, deepcopy(a:l)) +endfunc + +" The "text" option makes each change self-contained. +func Test_listener_text() + new + call setline(1, ['one', 'two', 'three']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{text: v:true}) + + " Two changes to the same line do not change the line count, so they are + " reported together. Each one still carries the text it resulted in. + call setline(1, 'first') + call setline(1, 'second') + call listener_flush() + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0, 'text': ['first']}, + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0, 'text': ['second']}]], + \ s:changes) + + " Inserted lines are reported as the text that was inserted. + let s:changes = [] + call append(1, ['a', 'b']) + call listener_flush() + call assert_equal([[ + \ {'lnum': 2, 'end': 2, 'col': 1, 'added': 2, 'text': ['a', 'b']}]], + \ s:changes) + + " Deleting lines leaves an empty text. + let s:changes = [] + 2,3del + call listener_flush() + call assert_equal([[ + \ {'lnum': 2, 'end': 4, 'col': 1, 'added': -2, 'text': []}]], + \ s:changes) + + " Deleting and inserting at the same spot keeps both entries apart. + let s:changes = [] + call setline(1, ['one', 'two', 'three']) + call listener_flush() + let s:changes = [] + 1del + call append(0, 'zero') + call listener_flush() + call assert_equal([ + \ [{'lnum': 1, 'end': 2, 'col': 1, 'added': -1, 'text': []}], + \ [{'lnum': 1, 'end': 1, 'col': 1, 'added': 1, 'text': ['zero']}]], + \ s:changes) + + call listener_remove(id) + bwipe! +endfunc + +" Deleting every line and undoing it are each reported as one change. +func Test_listener_text_whole_buffer() + new + call setline(1, range(1, 3000)->map({_, v -> 'line ' .. v})) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{text: v:true}) + let &undolevels = &undolevels + + " Nothing is left, so no text is copied. + %delete _ + call listener_flush() + call assert_equal([[ + \ {'lnum': 1, 'end': 3001, 'col': 1, 'added': -3000, 'text': []}]], + \ s:changes) + + " The undo restores all the lines, so they are all copied. + let s:changes = [] + undo + call listener_flush() + call assert_equal(1, len(s:changes)) + call assert_equal(1, len(s:changes[0])) + let change = s:changes[0][0] + call assert_equal(1, change.lnum) + call assert_equal(2, change.end) + call assert_equal(2999, change.added) + call assert_equal(3000, len(change.text)) + call assert_equal('line 1', change.text[0]) + call assert_equal('line 3000', change.text[-1]) + + call listener_remove(id) + bwipe! +endfunc + +" A lot of recorded text invokes the callback without waiting for a flush. +func Test_listener_text_size_limit() + new + call setline(1, 'one') + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{text: v:true}) + + " Below the limit the change is only reported when flushed. + call setline(1, repeat('x', 1024 * 1024)) + call assert_equal([], s:changes) + call listener_flush() + call assert_equal(1, len(s:changes)) + + " Above the limit the callback is invoked right away. + let s:changes = [] + call setline(1, repeat('y', 5 * 1024 * 1024)) + call assert_equal(1, len(s:changes)) + call assert_equal(1, len(s:changes[0])) + call assert_equal(5 * 1024 * 1024, len(s:changes[0][0].text[0])) + + " The size is reset, so the next change waits for a flush again. + let s:changes = [] + call setline(1, 'small') + call assert_equal([], s:changes) + call listener_flush() + call assert_equal(1, len(s:changes)) + + call listener_remove(id) + bwipe! +endfunc + +" The "text" option also applies to an unbuffered listener. +func Test_listener_text_unbuffered() + new + call setline(1, ['one', 'two', 'three']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{unbuffered: v:true, text: v:true}) + + call setline(2, 'two two') + call assert_equal([[ + \ {'lnum': 2, 'end': 3, 'col': 1, 'added': 0, 'text': ['two two']}]], + \ s:changes) + + call listener_remove(id) + bwipe! +endfunc + +" Without the "text" option there is no "text" entry. +func Test_listener_no_text_by_default() + new + call setline(1, ['one', 'two']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, + \ bufnr(), #{unbuffered: v:true}) + + call setline(1, 'one one') + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) + + call listener_remove(id) + bwipe! +endfunc + +" The third argument keeps accepting a Boolean. +func Test_listener_options_argument() + new + call setline(1, ['one', 'two']) + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, bufnr(), v:true) + call setline(1, 'one one') + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) + call listener_remove(id) + + " An empty Dictionary is the same as not passing the argument. + let s:changes = [] + let id = listener_add({b, s, e, a, l -> s:StoreChanges(l)}, bufnr(), {}) + call setline(1, 'one two') + call assert_equal([], s:changes) + call listener_flush() + call assert_equal([[ + \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}]], s:changes) + call listener_remove(id) + + call assert_fails('call listener_add("Foo", bufnr(), [])', 'E745:') + bwipe! +endfunc + func Test_listener_add_in_sandbox() call assert_fails( \ 'sandbox call redraw_listener_add({"on_start": function("tr")})', diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 350a790fbd..49ab862d1f 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -2657,6 +2657,7 @@ enddef def Test_listener_add() v9.CheckSourceDefAndScriptFailure(['listener_add("1", true)'], ['E1013: Argument 2: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 2']) + v9.CheckSourceDefAndScriptFailure(['listener_add("1", 1, [1])'], ['E1013: Argument 3: type mismatch, expected bool but got list', 'E1212: Bool required for argument 3']) enddef def Test_listener_flush() diff --git a/src/typval.c b/src/typval.c index f704f039cd..6a4947d8aa 100644 --- a/src/typval.c +++ b/src/typval.c @@ -577,6 +577,18 @@ check_for_opt_bool_or_number_arg(typval_T *args, int idx) return check_for_bool_or_number_arg(args, idx); } +/* + * Check for an optional bool or dict argument at 'idx'. + * Return FAIL if the type is wrong. + */ + int +check_for_opt_bool_or_dict_arg(typval_T *args, int idx) +{ + if (args[idx].v_type == VAR_UNKNOWN || args[idx].v_type == VAR_DICT) + return OK; + return check_for_bool_arg(args, idx); +} + /* * Give an error and return FAIL unless "args[idx]" is a blob. */ diff --git a/src/version.c b/src/version.c index 7f82d187bf..921e578204 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 970, /**/ 969, /**/ From be1616190eb6ed00aaef4ddfb6c835019c1453bc Mon Sep 17 00:00:00 2001 From: Samuel Schlesinger Date: Tue, 18 Aug 2026 19:41:13 +0000 Subject: [PATCH 383/647] patch 9.2.0971: "=~" and the match functions compile their pattern on every call Problem: "=~", match(), matchstr(), matchlist(), matchbufline(), matchstrlist() and split() compile their pattern on every call. A script matching a list of items against one pattern compiles it once per item, which can dwarf the cost of the match itself. Solution: Keep the compiled program of the last pattern in a cache (Samuel Schlesinger). The cache owns the program only between uses: eval_regcomp() hands it to the caller and empties the cache, and eval_regfree() adopts the program the caller ends up with, so the automatic engine falling back to the backtracking engine, which frees the original program, needs no special handling and vim_regfree() is unchanged. The key covers the pattern, 'encoding' and 'regexpengine', sampled when compiling; when user code run from a nested evaluation changes an option in the key, or re-enters the compile/free pair, the program is freed instead of cached. Patterns whose compilation depends on state outside the key are not cached: "~", bracket classes, the cursor-relative atoms \%.l, \%.c and \%.v, and a "\%#=" engine prefix. 'ignorecase' applies at execution time as before. Benchmarks (min of 3, macOS arm64, uncached to cached): filter() of 100000 items with a plugin-sized pattern 0.211s to 0.048s; a generated 200-branch alternation over 10000 items 0.455s to 0.037s, and with 'regexpengine' 1 forcing the backtracking engine 0.851s to 0.021s; a short inline pattern over 100000 items 0.109s to 0.061s. closes: #20941 Co-Authored-By: Claude Signed-off-by: Samuel Schlesinger Signed-off-by: Christian Brabandt --- src/alloc.c | 1 + src/eval.c | 176 +++++++++++++++++++++++++++++++- src/evalfunc.c | 16 +-- src/proto/eval.pro | 3 + src/testdir/test_eval_stuff.vim | 61 +++++++++++ src/version.c | 2 + 6 files changed, 249 insertions(+), 10 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index d6eb6f29c1..69d484018f 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -447,6 +447,7 @@ free_all_mem(void) free_signs(); # endif # ifdef FEAT_EVAL + free_eval_regcomp_cache(); set_expr_line(NULL, NULL); # endif # ifdef FEAT_DIFF diff --git a/src/eval.c b/src/eval.c index d5373c0991..759c4acb4f 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3188,6 +3188,178 @@ set_context_for_expression( xp->xp_pattern = arg; } +/* + * Cache with the compiled program of the last pattern used by + * pattern_match() and the match functions. Script loops often evaluate the + * same pattern many times; reusing the program avoids compiling it for + * every evaluation. The cache owns the program only between uses: + * eval_regcomp() hands it to the caller and empties the cache, and + * eval_regfree() adopts the program the caller ends up with. Thus when + * executing replaced the program (the automatic engine falling back to + * backtracking frees the original) no freed program is left behind in the + * cache. + * Adopting the caller's program also means that after a fallback the + * backtracking program stays cached until the pattern or an option in the + * key changes; the automatic engine is not tried again for it. + * The cache must only be used where the pattern is compiled with + * RE_MAGIC + RE_STRING and 'cpoptions' made empty, as every caller here + * does; both functions check these conditions and fall back to plain + * compilation and freeing when they do not hold. + * eval_prog_pat and eval_prog_enc are non-NULL whenever eval_prog_cache is + * non-NULL. + */ +static regprog_T *eval_prog_cache = NULL; +static char_u *eval_prog_pat = NULL; // pattern it was compiled for +static char_u *eval_prog_enc = NULL; // 'encoding' when compiled +static long eval_prog_re; // 'regexpengine' when compiled +// State sampled by eval_regcomp() for the eval_regfree() call that gives the +// program back: user code run in between, e.g. an object's string() method +// invoked by match() on a list, can change these options, and then the +// program must not be cached under the changed values. eval_compile_enc is +// only ever compared against p_enc, never dereferenced. +static long eval_compile_re; +static char_u *eval_compile_enc; +static int eval_prog_busy = 0; // programs eval_regcomp() handed out + // that were not given back yet +static int eval_prog_reentered = FALSE; // eval_regcomp() ran while + // a program was handed out + +/* + * Return true when compiling "pat" depends on more state than the cache key + * covers: "~" is replaced with the previous substitute string, bracket + * classes like [:alpha:], [=a=] and [.a.] can depend on the locale, the + * cursor-relative atoms \%.l, \%.c and \%.v compile the current cursor + * position into the program, and a "\%#=" engine prefix makes vim_regcomp() + * report E864 for a bad value on every compilation. The check is + * intentionally over-approximate, e.g. a literal "~" or "%." also matches; + * such a pattern is compiled every time, which is never wrong. + */ + static bool +eval_prog_volatile(char_u *pat) +{ + char_u *p; + + if (STRNCMP(pat, "\\%#=", 4) == 0) + return true; + for (p = pat; *p != NUL; ++p) + if (*p == '~' + || (p[0] == '[' && (p[1] == ':' || p[1] == '=' || p[1] == '.')) + || (p[0] == '%' && (p[1] == '.' + || ((p[1] == '<' || p[1] == '>') && p[2] == '.')))) + return true; + return false; +} + +/* + * Compile pattern "pat" like vim_regcomp(pat, RE_MAGIC + RE_STRING) would, + * but reuse the cached program when it was compiled for the same pattern. + * Free the result with eval_regfree(), not with vim_regfree(). + */ + regprog_T * +eval_regcomp(char_u *pat) +{ + regprog_T *prog; + + // Sample the option state the key covers, eval_regfree() checks that it + // did not change while the caller was using the program. + eval_compile_re = p_re; + eval_compile_enc = p_enc; + if (eval_prog_busy > 0) + // The samples above no longer describe the program already handed + // out: its eval_regfree() must drop it instead of caching it. + eval_prog_reentered = TRUE; + + if (eval_prog_cache != NULL + && *p_cpo == NUL + && eval_prog_cache->re_flags == RE_MAGIC + RE_STRING + && eval_prog_re == p_re + && STRCMP(eval_prog_pat, pat) == 0 + && STRCMP(eval_prog_enc, p_enc) == 0) + { + prog = eval_prog_cache; + // The caller now owns the program, eval_regfree() adopts the + // program the caller ends up with. + eval_prog_cache = NULL; + } + else + prog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + if (prog != NULL) + ++eval_prog_busy; // paired with the eval_regfree() call + return prog; +} + +/* + * Free program "prog", obtained with eval_regcomp() for pattern "pat", by + * keeping it in the cache for the next use. "pat" must be the same string + * the program was compiled for and must still be valid. + */ + void +eval_regfree(char_u *pat, regprog_T *prog) +{ + int reentered = eval_prog_reentered; + + if (eval_prog_busy > 0 && --eval_prog_busy == 0) + eval_prog_reentered = FALSE; + if (prog == NULL) + return; + if (reentered || *p_cpo != NUL + || eval_compile_re != p_re || eval_compile_enc != p_enc) + { + // 'cpoptions' is not empty, an option in the cache key changed, or + // another program was handed out while the caller was using this + // one: the samples may not describe this program, do not cache it. + vim_regfree(prog); + return; + } + if (eval_prog_pat == NULL || STRCMP(eval_prog_pat, pat) != 0 + || STRCMP(eval_prog_enc, p_enc) != 0) + { + char_u *pat_copy; + char_u *enc_copy; + + // A cached pattern is known not to be volatile, thus the scan is + // only needed when installing a new key. + if (eval_prog_volatile(pat)) + { + // compiling depends on state the cache key does not cover + vim_regfree(prog); + return; + } + pat_copy = vim_strsave(pat); + enc_copy = vim_strsave(p_enc); + if (pat_copy == NULL || enc_copy == NULL) + { + vim_free(pat_copy); + vim_free(enc_copy); + vim_regfree(prog); + return; + } + vim_free(eval_prog_pat); + vim_free(eval_prog_enc); + eval_prog_pat = pat_copy; + eval_prog_enc = enc_copy; + } + // On a cache miss eval_regcomp() left the previous program in the + // cache, and a nested evaluation may have stored another one: keep the + // most recent program. + vim_regfree(eval_prog_cache); + eval_prog_cache = prog; + eval_prog_re = eval_compile_re; +} + +#if defined(EXITFREE) || defined(PROTO) + void +free_eval_regcomp_cache(void) +{ + vim_regfree(eval_prog_cache); + eval_prog_cache = NULL; + VIM_CLEAR(eval_prog_pat); + VIM_CLEAR(eval_prog_enc); + eval_prog_busy = 0; + eval_prog_reentered = FALSE; +} +#endif + /* * Return TRUE if "pat" matches "text". * Does not use 'cpo' and always uses 'magic'. @@ -3202,12 +3374,12 @@ pattern_match(char_u *pat, char_u *text, int ic) // avoid 'l' flag in 'cpoptions' save_cpo = p_cpo; p_cpo = empty_option; - regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + regmatch.regprog = eval_regcomp(pat); if (regmatch.regprog != NULL) { regmatch.rm_ic = ic; matches = vim_regexec_nl(®match, text, (colnr_T)0); - vim_regfree(regmatch.regprog); + eval_regfree(pat, regmatch.regprog); } p_cpo = save_cpo; return matches; diff --git a/src/evalfunc.c b/src/evalfunc.c index 6820cd8c90..bf8f00f7ac 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -9228,7 +9228,7 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type) goto theend; } - regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + regmatch.regprog = eval_regcomp(pat); if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; @@ -9346,7 +9346,7 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type) } if (l != NULL) l->lv_lock = prev_lock; - vim_regfree(regmatch.regprog); + eval_regfree(pat, regmatch.regprog); } theend: @@ -9520,7 +9520,7 @@ f_matchbufline(typval_T *argvars, typval_T *rettv) save_cpo = p_cpo; p_cpo = empty_option; - regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + regmatch.regprog = eval_regcomp(pat); if (regmatch.regprog == NULL) goto theend; regmatch.rm_ic = p_ic; @@ -9535,7 +9535,7 @@ f_matchbufline(typval_T *argvars, typval_T *rettv) } cleanup: - vim_regfree(regmatch.regprog); + eval_regfree(pat, regmatch.regprog); theend: p_cpo = save_cpo; @@ -9611,7 +9611,7 @@ f_matchstrlist(typval_T *argvars, typval_T *rettv) save_cpo = p_cpo; p_cpo = empty_option; - regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + regmatch.regprog = eval_regcomp(pat); if (regmatch.regprog == NULL) goto theend; regmatch.rm_ic = p_ic; @@ -9650,7 +9650,7 @@ f_matchstrlist(typval_T *argvars, typval_T *rettv) } cleanup: - vim_regfree(regmatch.regprog); + eval_regfree(pat, regmatch.regprog); theend: p_cpo = save_cpo; @@ -12200,7 +12200,7 @@ f_split(typval_T *argvars, typval_T *rettv) if (typeerr) goto theend; - regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + regmatch.regprog = eval_regcomp(pat); if (regmatch.regprog != NULL) { regmatch.rm_ic = FALSE; @@ -12232,7 +12232,7 @@ f_split(typval_T *argvars, typval_T *rettv) str = regmatch.endp[0]; } - vim_regfree(regmatch.regprog); + eval_regfree(pat, regmatch.regprog); } theend: diff --git a/src/proto/eval.pro b/src/proto/eval.pro index 2a0312175d..4481109814 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -34,6 +34,9 @@ void skip_for_lines(void *fi_void, evalarg_T *evalarg); int next_for_item(void *fi_void, char_u *arg); void free_for_info(void *fi_void); void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx); +regprog_T *eval_regcomp(char_u *pat); +void eval_regfree(char_u *pat, regprog_T *prog); +void free_eval_regcomp_cache(void); int pattern_match(char_u *pat, char_u *text, int ic); char_u *eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext); char_u *eval_next_line(char_u *arg, evalarg_T *evalarg); diff --git a/src/testdir/test_eval_stuff.vim b/src/testdir/test_eval_stuff.vim index e1afbfbe2c..69f9b26a6a 100644 --- a/src/testdir/test_eval_stuff.vim +++ b/src/testdir/test_eval_stuff.vim @@ -1385,4 +1385,65 @@ func Test_clipboard_provider_recursive() unlet g:vim_copy_recursive endfunc +" Test that caching the compiled pattern of "=~" and the match functions +" does not change the semantics. +func Test_eval_pattern_cache() + let save_ic = &ignorecase + defer execute('let &ignorecase = ' .. save_ic) + + " "~" in a pattern stands for the previous substitute string, a compiled + " program must not be reused across a :substitute + new + call setline(1, 'one') + s/one/AAA/ + call assert_true('xAAAy' =~ 'x~y') + call assert_false('xBBBy' =~ 'x~y') + call setline(1, 'AAA') + s/AAA/BBB/ + call assert_true('xBBBy' =~ 'x~y') + call assert_false('xAAAy' =~ 'x~y') + bwipe! + + " 'ignorecase' is applied at execution time, also with a cached program + set noignorecase + call assert_false('ABC' =~ 'abc') + set ignorecase + call assert_true('ABC' =~ 'abc') + call assert_true('ABC' =~ 'abc') + set noignorecase + call assert_false('ABC' =~ 'abc') + + " changing 'regexpengine' compiles the pattern again + for re in [0, 1, 2] + exe 'set re=' .. re + call assert_true('abc123' =~ 'a\+bc\d\+') + call assert_false('xyz' =~ 'a\+bc\d\+') + endfor + set re& + + " \%.l, \%.c and \%.v compile the current cursor position into the + " program, such a pattern must not be reused after the cursor moved + new + call setline(1, 'abcdef') + call cursor(1, 4) + call assert_true('abcdef' =~# '\%.cd') + call cursor(1, 2) + call assert_false('abcdef' =~# '\%.cd') + call assert_true('abcdef' =~# '\%.cb') + bwipe! + + " when the automatic engine replaces the program by falling back to the + " backtracking engine, the replaced program is the one that is kept + call test_override('nfa_fail', 1) + defer test_override('nfa_fail', 0) + for i in range(3) + call assert_true('fallback' =~ 'fall\%(back\)\?') + call assert_false('nomatch' =~ 'fall\%(back\)\?') + endfor + call test_override('nfa_fail', 0) + for i in range(3) + call assert_true('fallback' =~ 'fall\%(back\)\?') + endfor +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 921e578204..c03f5e5450 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 971, /**/ 970, /**/ From bad0490bfb340bd4c59399903323c02c4bfbc5e3 Mon Sep 17 00:00:00 2001 From: Bakudankun Date: Tue, 18 Aug 2026 20:22:38 +0000 Subject: [PATCH 384/647] patch 9.2.0972: extend() family does not accept a blob Problem: extend() family does not accept a blob type Solution: Implement missing blob functionality (Bakudankun). closes: #20958 Co-authored-by: Hirohito Higashi Signed-off-by: Bakudankun Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 47 ++++----- runtime/doc/eval.txt | 10 +- runtime/doc/tags | 1 + runtime/doc/usr_41.txt | 19 +++- runtime/doc/version9.txt | 5 +- runtime/doc/vim9.txt | 4 +- src/blob.c | 158 ++++++++++++++++++++++++++---- src/errors.h | 4 + src/eval.c | 16 ++- src/evalfunc.c | 50 ++++------ src/list.c | 6 +- src/po/vim.pot | 5 +- src/proto/blob.pro | 3 +- src/testdir/test_listdict.vim | 87 +++++++++++++++- src/testdir/test_tuple.vim | 4 +- src/testdir/test_vim9_builtin.vim | 39 ++++++-- src/version.c | 2 + src/vim9execute.c | 6 +- src/vim9instr.c | 3 +- 19 files changed, 367 insertions(+), 102 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 11934bcfca..737cac1fee 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -187,12 +187,12 @@ expand({expr} [, {nosuf} [, {list}]]) expandcmd({string} [, {options}]) String expand {string} like with `:edit` extend({expr1}, {expr2} [, {expr3}]) - List/Dict + List/Dict/Blob insert items of {expr2} into {expr1} extendnew({expr1}, {expr2} [, {expr3}]) - List/Dict - like |extend()| but creates a new List - or Dictionary + List/Dict/Blob + like |extend()| but creates a new + List, Dictionary or Blob feedkeys({string} [, {mode}]) none add key sequence to typeahead buffer filecopy({from}, {to}) Number |TRUE| if copying file {from} to {to} worked @@ -633,8 +633,8 @@ simplify({filename}) String simplify filename as much as possible sin({expr}) Float sine of {expr} sinh({expr}) Float hyperbolic sine of {expr} slice({expr}, {start} [, {end}]) - String/List/Blob - slice of a String, List or Blob + String/List/Blob/Tuple + slice of a String, List, Blob or Tuple sort({list} [, {how} [, {dict}]]) List sort {list}, compare with {how} sound_clear() none stop playing all sounds @@ -3130,24 +3130,27 @@ expandcmd({string} [, {options}]) *expandcmd()* extend({expr1}, {expr2} [, {expr3}]) *extend()* - {expr1} and {expr2} must be both |Lists| or both - |Dictionaries|. + {expr1} and {expr2} must be both |Lists|, |Dictionaries| or + |Blobs|. - If they are |Lists|: Append {expr2} to {expr1}. + If they are |Lists| or |Blobs|: Append {expr2} to {expr1}. If {expr3} is given insert the items of {expr2} before the - item with index {expr3} in {expr1}. When {expr3} is zero + item with index/byte {expr3} in {expr1}. When {expr3} is zero insert before the first item. When {expr3} is equal to len({expr1}) then {expr2} is appended. Examples: > :echo sort(extend(mylist, [7, 5])) :call extend(mylist, [2, 3], 1) -< When {expr1} is the same List as {expr2} then the number of - items copied is equal to the original length of the List. +< When {expr1} is the same List or Blob as {expr2} then the + number of items copied is equal to the original length of the + List or the Blob. E.g., when {expr3} is 1 you get N new copies of the first item (where N is the original length of the List). - Use |add()| to concatenate one item to a list. To concatenate - two lists into a new list use the + operator: > + Use |add()| to concatenate one item to a list or a blob. + To concatenate two lists or blobs into a new one use the + + operator: > :let newlist = [1, 2, 3] + [4, 5] + :let newblob = 0z1122 + 0z3344 < If they are |Dictionaries|: Add all entries from {expr2} to {expr1}. @@ -3160,7 +3163,7 @@ extend({expr1}, {expr2} [, {expr3}]) *extend()* {expr1} is changed when {expr2} is not empty. If necessary make a copy of {expr1} first or use |extendnew()| to return a - new List/Dictionary. + new List/Dictionary/Blob. {expr2} remains unchanged. When {expr1} is locked and {expr2} is not empty the operation fails. @@ -3169,17 +3172,17 @@ extend({expr1}, {expr2} [, {expr3}]) *extend()* Can also be used as a |method|: > mylist->extend(otherlist) < - Return type: list<{type}> or dict<{type}> depending on {expr1} - and {expr2}, in case of error: |Number| + Return type: list<{type}>, dict<{type}> or blob depending on + {expr1} and {expr2}, in case of error: |Number| extendnew({expr1}, {expr2} [, {expr3}]) *extendnew()* Like |extend()| but instead of adding items to {expr1} a new - List or Dictionary is created and returned. {expr1} remains - unchanged. + List, Dictionary or Blob is created and returned. {expr1} + remains unchanged. - Return type: list<{type}> or dict<{type}> depending on {expr1} - and {expr2}, in case of error: |Number| + Return type: list<{type}>, dict<{type}> or blob depending on + {expr1} and {expr2}, in case of error: |Number| feedkeys({string} [, {mode}]) *feedkeys()* @@ -10731,7 +10734,7 @@ slice({expr}, {start} [, {end}]) *slice()* Can also be used as a |method|: > GetList()->slice(offset) < - Return type: list<{type}> or tuple<{type}> + Return type: |String|, list<{type}>, blob or tuple<{type}> sort({list} [, {how} [, {dict}]]) *sort()* *E702* diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index cedb60d283..c8f3aa6c24 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 9.2. Last change: 2026 Aug 17 +*eval.txt* For Vim version 9.2. Last change: 2026 Aug 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -993,8 +993,10 @@ Two blobs can be concatenated with the "+" operator: > :let longblob = myblob + 0z4455 :let longblob = 0z4455 + myblob < -A blob can be concatenated with another one in-place using |:let+=|: > +A blob can be concatenated with another one in-place using |:let+=| or +|extend()|: > :let myblob += 0z6677 + :call extend(myblob, 0z6677) < See |blob-modification| below for more about changing a blob in-place. @@ -1039,9 +1041,11 @@ To change part of a blob you can specify the first and last byte to be modified. The value must have the same number of bytes in the range: > :let blob[3:5] = 0z334455 -To add items to a Blob in-place, you can use |:let+=| (|blob-concatenation|): > +To add items to a Blob in-place, you can use |:let+=| or |extend()| +(|blob-concatenation|): > :let blobA = 0z1122 :let blobA += 0z3344 + :call extend(blobA, 0z5566) < When two variables refer to the same Blob, changing one Blob in-place will cause the referenced Blob to be changed in-place: > diff --git a/runtime/doc/tags b/runtime/doc/tags index a8ff635fef..ca5828a1e5 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -4790,6 +4790,7 @@ E1576 tagsrch.txt /*E1576* E1577 options.txt /*E1577* E1578 spell.txt /*E1578* E158 sign.txt /*E158* +E1581 vim9.txt /*E1581* E159 sign.txt /*E159* E16 cmdline.txt /*E16* E160 sign.txt /*E160* diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index cb816a0cb2..c1ecf81b20 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1,4 +1,4 @@ -*usr_41.txt* For Vim version 9.2. Last change: 2026 Jun 09 +*usr_41.txt* For Vim version 9.2. Last change: 2026 Aug 18 VIM USER MANUAL by Bram Moolenaar @@ -921,11 +921,28 @@ Floating point computation: *float-functions* isnan() check for not a number Blob manipulation: *blob-functions* + get() get a byte without error for wrong index + len() number of bytes in a Blob + empty() check if Blob is empty + insert() insert a byte somewhere in a Blob + add() append a byte to a Blob + extend() append a Blob to a Blob + extendnew() make a new Blob and append bytes + remove() remove one or more bytes from a Blob + copy() make a copy of a Blob + filter() remove selected bytes from a Blob + map() change each byte of a Blob + mapnew() make a new Blob with changed bytes + foreach() apply function to Blob bytes + reduce() reduce a Blob to a value + slice() take a slice of a Blob blob2list() get a list of numbers from a blob list2blob() get a blob from a list of numbers reverse() reverse the order of numbers in a blob + string() String representation of a Blob index() index of a value in a Blob indexof() index in a Blob where an expression is true + repeat() repeat a Blob multiple times items() get List of Blob index-value pairs Other computation: *bitwise-function* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index f38fe16939..e2675c5f20 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 16 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52700,6 +52700,9 @@ Changed ~ - |serverlist()| can return a list of all available server names. - Improve visual appearance when the terminal does not support colors. - Improve diff highlighting for terminals with 256 or less colors. +- |listener_add()| accepts a Dictionary of options and can include the + resulting text of a change |listener-text|. +- |extend()| and |extendnew()| also accept |Blobs|. *added-9.3* diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index e69b62acd7..082b9ba85d 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.2. Last change: 2026 Aug 16 +*vim9.txt* For Vim version 9.2. Last change: 2026 Aug 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -495,7 +495,7 @@ And with autocommands: > Although using a :def function probably works better. *E1022* *E1103* *E1130* *E1131* *E1133* - *E1134* + *E1134* *E1581* Declaring a variable with a type but without an initializer will initialize to false (for bool), empty (for string, list, dict, etc.) or zero (for number, any, etc.). This matters especially when using the "any" type, the value will diff --git a/src/blob.c b/src/blob.c index ad2b02bbbc..3f7417409e 100644 --- a/src/blob.c +++ b/src/blob.c @@ -57,34 +57,37 @@ rettv_blob_set(typval_T *rettv, blob_T *b) ++b->bv_refcount; } - int -blob_copy(blob_T *from, typval_T *to) +/* + * Create a copy of a blob. + * The refcount of the new blob is set to 1. + * Returns NULL when "orig" is NULL or out of memory. + */ + blob_T * +blob_copy(blob_T *orig) { int len; + blob_T *copy; - to->v_type = VAR_BLOB; - to->v_lock = 0; - if (from == NULL) - { - to->vval.v_blob = NULL; - return OK; - } + if (orig == NULL) + return NULL; - if (rettv_blob_alloc(to) == FAIL) - return FAIL; + copy = blob_alloc(); + if (copy == NULL) + return NULL; + ++copy->bv_refcount; - len = from->bv_ga.ga_len; + len = orig->bv_ga.ga_len; if (len > 0) { - to->vval.v_blob->bv_ga.ga_data = - vim_memsave(from->bv_ga.ga_data, len); - if (to->vval.v_blob->bv_ga.ga_data == NULL) + copy->bv_ga.ga_data = + vim_memsave(orig->bv_ga.ga_data, len); + if (copy->bv_ga.ga_data == NULL) len = 0; } - to->vval.v_blob->bv_ga.ga_len = len; - to->vval.v_blob->bv_ga.ga_maxlen = len; + copy->bv_ga.ga_len = len; + copy->bv_ga.ga_maxlen = len; - return OK; + return copy; } void @@ -666,7 +669,9 @@ blob_filter_map( b_ret = b; if (filtermap == FILTERMAP_MAPNEW) { - if (blob_copy(b, rettv) == FAIL) + rettv->v_lock = 0; + rettv->vval.v_blob = blob_copy(b); + if (rettv->vval.v_blob == NULL) return; b_ret = rettv->vval.v_blob; } @@ -774,6 +779,121 @@ blob_insert_func(typval_T *argvars, typval_T *rettv) copy_tv(&argvars[0], rettv); } +/* + * Extend "b1" with "b2". "b1" must not be NULL. + * If "bef" is equal to the length of b1 append at the end, + * otherwise insert before this index. + * Caller must check that "bef" is valid. + * Returns FAIL when out of memory. + */ + static int +blob_extend(blob_T *b1, blob_T *b2, long bef) +{ + int len1, len2; + char_u *p1; + + // NULL blob is equivalent to an empty blob: nothing to do. + if (b2 == NULL || b2->bv_ga.ga_len == 0) + return OK; + + len1 = b1->bv_ga.ga_len; + len2 = b2->bv_ga.ga_len; + + if (ga_grow(&b1->bv_ga, len2) == FAIL) + return FAIL; + + p1 = (char_u *)b1->bv_ga.ga_data; + + if (b1 == b2) + { + // Inserting a blob into itself + mch_memmove(p1 + bef, p1, (size_t)len1); + if (bef < len1) + memcpy(p1 + bef + len1, p1 + bef * 2, (size_t)(len1 - bef)); + } + else + { + if (bef < len1) + mch_memmove(p1 + bef + len2, p1 + bef, (size_t)(len1 - bef)); + + memcpy(p1 + bef, b2->bv_ga.ga_data, (size_t)len2); + } + + b1->bv_ga.ga_len += len2; + + return OK; +} + +/* + * extend() a Blob. Append Blob argvars[1] to Blob argvars[0] before index + * argvars[3] and return the resulting blob in "rettv". "is_new" is TRUE for + * extendnew(). + */ + void +blob_extend_func( + typval_T *argvars, + char_u *arg_errmsg, + int is_new, + typval_T *rettv) +{ + blob_T *b1, *b2; + long before; + int error = FALSE; + + b1 = argvars[0].vval.v_blob; + if (b1 == NULL) + { + emsg(_(e_cannot_extend_null_blob)); + return; + } + if (is_new || !value_check_lock(b1->bv_lock, arg_errmsg, TRUE)) + { + if (is_new) + { + b1 = blob_copy(b1); + if (b1 == NULL) + return; + } + + b2 = argvars[1].vval.v_blob; + if (b2 == NULL) + goto theend; + + if (argvars[2].v_type != VAR_UNKNOWN) + { + before = (long)tv_get_number_chk(&argvars[2], &error); + if (error) + goto cleanup; // type error; errmsg already given + if (before < 0) + before = b1->bv_ga.ga_len + before; + if (before < 0 || before > b1->bv_ga.ga_len) + { + semsg(_(e_blob_index_out_of_range_nr), before); + goto cleanup; + } + } + else + before = b1->bv_ga.ga_len; + if (blob_extend(b1, b2, before) == FAIL) + goto cleanup; + +theend: + if (is_new) + { + rettv->v_type = VAR_BLOB; + rettv->v_lock = 0; + rettv->vval.v_blob = b1; + } + else + copy_tv(&argvars[0], rettv); + return; + +cleanup: + if (is_new) + blob_unref(b1); + } +} + /* * Implementation of reduce() for Blob "argvars[0]" using the function "expr" * starting with the optional initial value "argvars[2]" and return the result diff --git a/src/errors.h b/src/errors.h index 350ffe704d..b0e56608de 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3822,3 +3822,7 @@ EXTERN char e_completeopt_escape_cannot_be_used_with_nargs_underscore[] EXTERN char e_too_many_text_properties_on_a_single_line[] INIT(= N_("E1580: Too many text properties on a single line")); #endif +#ifdef FEAT_EVAL +EXTERN char e_cannot_extend_null_blob[] + INIT(= N_("E1581: Cannot extend a null blob")); +#endif diff --git a/src/eval.c b/src/eval.c index 759c4acb4f..bb6f452b0b 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2890,12 +2890,9 @@ eval_for_line( fi->fi_bi = 0; if (tv.vval.v_blob != NULL) { - typval_T btv; - // Make a copy, so that the iteration still works when the // blob is changed. - blob_copy(tv.vval.v_blob, &btv); - fi->fi_blob = btv.vval.v_blob; + fi->fi_blob = blob_copy(tv.vval.v_blob); } clear_tv(&tv); } @@ -7886,7 +7883,16 @@ item_copy( ret = FAIL; break; case VAR_BLOB: - ret = blob_copy(from->vval.v_blob, to); + to->v_type = VAR_BLOB; + to->v_lock = 0; + if (from->vval.v_blob == NULL) + to->vval.v_blob = NULL; + else + { + to->vval.v_blob = blob_copy(from->vval.v_blob); + if (to->vval.v_blob == NULL) + ret = FAIL; + } break; case VAR_DICT: to->v_type = VAR_DICT; diff --git a/src/evalfunc.c b/src/evalfunc.c index bf8f00f7ac..c2c2a6ab36 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -627,12 +627,16 @@ arg_string_or_blob( } /* - * Check "type" is a list of 'any' or a dict of 'any'. + * Check "type" is a list of 'any', a tuple of 'any' or dict of 'any'. */ static int -arg_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) +arg_list_or_tuple_or_dict( + type_T *type, + type_T *decl_type UNUSED, + argcontext_T *context) { if (type->tt_type == VAR_LIST + || type->tt_type == VAR_TUPLE || type->tt_type == VAR_DICT || type_any_or_unknown(type)) return OK; @@ -641,31 +645,17 @@ arg_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) } /* - * Check "type" is a list of 'any' or a dict of 'any'. And modifiable. + * Check "type" is a list of 'any', a dict of 'any' or a blob. */ static int -arg_list_or_dict_mod( +arg_list_or_dict_or_blob( type_T *type, - type_T *decl_type, + type_T *decl_type UNUSED, argcontext_T *context) -{ - if (arg_list_or_dict(type, decl_type, context) == FAIL) - return FAIL; - return arg_type_modifiable(type, context->arg_idx + 1); -} - -/* - * Check "type" is a list of 'any', a tuple of 'any' or dict of 'any'. - */ - static int -arg_list_or_tuple_or_dict( - type_T *type, - type_T *decl_type UNUSED, - argcontext_T *context) { if (type->tt_type == VAR_LIST - || type->tt_type == VAR_TUPLE || type->tt_type == VAR_DICT + || type->tt_type == VAR_BLOB || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); @@ -679,16 +669,12 @@ arg_list_or_tuple_or_dict( static int arg_list_or_dict_or_blob_mod( type_T *type, - type_T *decl_type UNUSED, + type_T *decl_type, argcontext_T *context) { - if (type->tt_type == VAR_LIST - || type->tt_type == VAR_DICT - || type->tt_type == VAR_BLOB - || type_any_or_unknown(type)) - return arg_type_modifiable(type, context->arg_idx + 1); - arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); - return FAIL; + if (arg_list_or_dict_or_blob(type, decl_type, context) == FAIL) + return FAIL; + return arg_type_modifiable(type, context->arg_idx + 1); } /* @@ -1107,7 +1093,7 @@ arg_extend3(type_T *type, type_T *decl_type, argcontext_T *context) { type_T *first_type = context->arg_types[context->arg_idx - 2].type_curr; - if (first_type->tt_type == VAR_LIST) + if (first_type->tt_type == VAR_LIST || first_type->tt_type == VAR_BLOB) return arg_number(type, decl_type, context); if (first_type->tt_type == VAR_DICT) return arg_string(type, decl_type, context); @@ -1359,8 +1345,8 @@ static argcheck_T arg13_cursor[] = {arg_cursor1, arg_number, arg_number}; static argcheck_T arg12_deepcopy[] = {arg_any, arg_bool}; static argcheck_T arg12_execute[] = {arg_string_or_list_string, arg_string}; static argcheck_T arg12_getchar[] = {arg_bool_or_nr, arg_dict_any}; -static argcheck_T arg23_extend[] = {arg_list_or_dict_mod, arg_same_as_prev, arg_extend3}; -static argcheck_T arg23_extendnew[] = {arg_list_or_dict, arg_same_struct_as_prev, arg_extend3}; +static argcheck_T arg23_extend[] = {arg_list_or_dict_or_blob_mod, arg_same_as_prev, arg_extend3}; +static argcheck_T arg23_extendnew[] = {arg_list_or_dict_or_blob, arg_same_struct_as_prev, arg_extend3}; static argcheck_T arg23_get[] = {arg_get1, arg_string_or_nr, arg_any}; static argcheck_T arg14_glob[] = {arg_string, arg_bool, arg_bool, arg_bool}; static argcheck_T arg25_globpath[] = {arg_string, arg_string, arg_bool, arg_bool, arg_bool}; @@ -1665,6 +1651,8 @@ ret_extend(int argcount, return &t_list_any; if (argtypes[0].type_curr->tt_type == VAR_DICT) return &t_dict_any; + if (argtypes[0].type_curr->tt_type == VAR_BLOB) + return &t_blob; } return argtypes[0].type_curr; } diff --git a/src/list.c b/src/list.c index 0ea2e13bd1..24efe6bcfc 100644 --- a/src/list.c +++ b/src/list.c @@ -3176,13 +3176,16 @@ extend(typval_T *argvars, typval_T *rettv, char_u *arg_errmsg, int is_new) type = argvars[0].vval.v_dict->dv_type; dict_extend_func(argvars, type, func_name, arg_errmsg, is_new, rettv); } + else if (argvars[0].v_type == VAR_BLOB && argvars[1].v_type == VAR_BLOB) + blob_extend_func(argvars, arg_errmsg, is_new, rettv); else - semsg(_(e_argument_of_str_must_be_list_or_dictionary), func_name); + semsg(_(e_argument_of_str_must_be_list_dictionary_or_blob), func_name); } /* * "extend(list, list [, idx])" function * "extend(dict, dict [, action])" function + * "extend(blob, blob [, idx])" function */ void f_extend(typval_T *argvars, typval_T *rettv) @@ -3195,6 +3198,7 @@ f_extend(typval_T *argvars, typval_T *rettv) /* * "extendnew(list, list [, idx])" function * "extendnew(dict, dict [, action])" function + * "extendnew(blob, blob [, idx])" function */ void f_extendnew(typval_T *argvars, typval_T *rettv) diff --git a/src/po/vim.pot b/src/po/vim.pot index 8f7f2e070f..fbf6c473f1 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-07-29 19:37+0000\n" +"POT-Creation-Date: 2026-08-18 20:22+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -8902,6 +8902,9 @@ msgstr "" msgid "E1580: Too many text properties on a single line" msgstr "" +msgid "E1581: Cannot extend a null blob" +msgstr "" + #. type of cmdline window or 0 #. result of cmdline window or 0 #. buffer of cmdline window or NULL diff --git a/src/proto/blob.pro b/src/proto/blob.pro index f24c268aeb..cd32dcba74 100644 --- a/src/proto/blob.pro +++ b/src/proto/blob.pro @@ -2,7 +2,7 @@ blob_T *blob_alloc(void); int rettv_blob_alloc(typval_T *rettv); void rettv_blob_set(typval_T *rettv, blob_T *b); -int blob_copy(blob_T *from, typval_T *to); +blob_T *blob_copy(blob_T *orig); void blob_free(blob_T *b); void blob_unref(blob_T *b); long blob_len(blob_T *b); @@ -23,6 +23,7 @@ void blob_add(typval_T *argvars, typval_T *rettv); void blob_remove(typval_T *argvars, typval_T *rettv, char_u *arg_errmsg); void blob_filter_map(blob_T *blob_arg, filtermap_T filtermap, typval_T *expr, char_u *arg_errmsg, typval_T *rettv); void blob_insert_func(typval_T *argvars, typval_T *rettv); +void blob_extend_func(typval_T *argvars, char_u *arg_errmsg, int is_new, typval_T *rettv); void blob_reduce(typval_T *argvars, typval_T *expr, typval_T *rettv); void blob_reverse(blob_T *b, typval_T *rettv); void f_blob2list(typval_T *argvars, typval_T *rettv); diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim index 88c2e07bd6..9a8f807ec1 100644 --- a/src/testdir/test_listdict.vim +++ b/src/testdir/test_listdict.vim @@ -1193,7 +1193,7 @@ func Test_listdict_compare_complex() call v9.CheckLegacyAndVim9Success(lines) endfunc -" Test for extending lists and dictionaries +" Test for extending lists, dictionaries and blobs func Test_listdict_extend() " Test extend() with lists @@ -1273,8 +1273,59 @@ func Test_listdict_extend() call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 1.2)", 'E475:') call assert_equal({'a': 'A', 'b': 'B'}, d) - call assert_fails("call extend([1, 2], 1)", 'E712:') - call assert_fails("call extend([1, 2], {})", 'E712:') + " Test extend() with blobs + + " Pass the same Blob to extend() + let lines =<< trim END + VAR b = 0z010203 + call assert_equal(0z010203010203, extend(b, b)) + call assert_equal(0z010203010203, b) + + LET b = 0z010203 + call assert_equal(0z010203040506, extend(b, 0z040506)) + call assert_equal(0z010203040506, b) + + LET b = 0z010203 + call extend(b, 0z040506, 0) + call assert_equal(0z040506010203, b) + + LET b = 0z010203 + call extend(b, 0z040506, 1) + call assert_equal(0z010405060203, b) + + LET b = 0z010203 + call extend(b, 0z040506, 3) + call assert_equal(0z010203040506, b) + + LET b = 0z010203 + call extend(b, 0z040506, -1) + call assert_equal(0z010204050603, b) + + LET b = 0z010203 + call extend(b, 0z040506, -3) + call assert_equal(0z040506010203, b) + + LET b = 0z010203 + call assert_equal(0z010203, b->extend(0z)) + call assert_equal(0z010203, b->extend(test_null_blob())) + call assert_equal(0z010203, b) + END + call v9.CheckLegacyAndVim9Success(lines) + + let b = 0z010203 + call assert_fails("call extend(b, 0z040506, 4)", 'E979:') + call assert_fails("call extend(b, 0z040506, -4)", 'E979:') + call assert_fails("call extend(b, 0z040506, 1.2)", 'E805:') + + lockvar b + call assert_fails("call extend(b, 0z040506)", 'E741:') + unlockvar b + + call assert_fails('call extend(test_null_blob(), test_null_blob())', 'E1581:') + call assert_fails('call extendnew(test_null_blob(), 0z01)', 'E1581:') + + call assert_fails("call extend([1, 2], 1)", 'E896:') + call assert_fails("call extend([1, 2], {})", 'E896:') " Extend g: dictionary with an invalid variable name call assert_fails("call extend(g:, {'-!' : 10})", 'E461:') @@ -1295,6 +1346,23 @@ func Test_listdict_extend() call assert_equal([1, 5, 7, 1, 5, 7], l) END call v9.CheckLegacyAndVim9Success(lines) + + " Extend a blob with itself. + let lines =<< trim END + VAR b = 0z010507 + call extend(b, b, 0) + call assert_equal(0z010507010507, b) + LET b = 0z010507 + call extend(b, b, 1) + call assert_equal(0z010105070507, b) + LET b = 0z010507 + call extend(b, b, 2) + call assert_equal(0z010501050707, b) + LET b = 0z010507 + call extend(b, b, 3) + call assert_equal(0z010507010507, b) + END + call v9.CheckLegacyAndVim9Success(lines) endfunc func Test_listdict_extendnew() @@ -1321,6 +1389,18 @@ func Test_listdict_extendnew() let d2['c'] = 'C' call assert_equal({'a': {'b': 'B'}, 'c': 'C'}, d2) call assert_equal({'a': {'b': 'B'}}, d) + + " Test extendnew() with blobs + let b = 0z010203 + call assert_equal(0z0102030405, extendnew(b, 0z0405)) + call assert_equal(0z010203, b) + lockvar b + call assert_equal(0z0102030405, extendnew(b, 0z0405)) + let b2 = extendnew(b, test_null_blob()) + call assert_equal(0z010203, b2) + let b2 += 0z04 + call assert_equal(0z01020304, b2) + call assert_equal(0z010203, b) endfunc func s:check_scope_dict(x, fixed) @@ -1606,6 +1686,7 @@ func Test_extendnew_leak() " This used to leak memory for i in range(100) | silent! call extendnew([], [], []) | endfor for i in range(100) | silent! call extendnew({}, {}, {}) | endfor + for i in range(100) | silent! call extendnew(0z, 0z, 0z) | endfor endfunc " Test for comparing deeply nested List/Dict values diff --git a/src/testdir/test_tuple.vim b/src/testdir/test_tuple.vim index 00428a5b00..de61fb09d9 100644 --- a/src/testdir/test_tuple.vim +++ b/src/testdir/test_tuple.vim @@ -1755,9 +1755,9 @@ func Test_tuple_extend() call extendnew(t, (4, 5)) END call v9.CheckSourceLegacyAndVim9Failure(lines, [ - \ 'E712: Argument of extend() must be a List or Dictionary', + \ 'E896: Argument of extend() must be a List, Dictionary or Blob', \ 'E1013: Argument 1: type mismatch, expected list but got tuple', - \ 'E712: Argument of extend() must be a List or Dictionary']) + \ 'E896: Argument of extend() must be a List, Dictionary or Blob']) endfunc " Test for filter() with a tuple diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 49ab862d1f..a32fe559ba 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -1162,6 +1162,11 @@ def Test_extend_arg_types() assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, 'keep')) assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, g:string_keep)) + assert_equal(0z010203, extend(0z0102, 0z03)) + assert_equal(0z030102, extend(0z0102, 0z03, 0)) + assert_equal(0z010302, extend(0z0102, 0z03, 1)) + assert_equal(0z010302, extend(0z0102, 0z03, g:number_one)) + # mix of types is OK without a declaration var res: list> @@ -1182,14 +1187,17 @@ def Test_extend_arg_types() END v9.CheckSourceDefAndScriptSuccess(lines) - v9.CheckSourceDefAndScriptFailure(['extend("a", 1)'], ['E1013: Argument 1: type mismatch, expected list but got string', 'E712: Argument of extend() must be a List or Dictionary']) - v9.CheckSourceDefAndScriptFailure(['extend([1, 2], 3)'], ['E1013: Argument 2: type mismatch, expected list but got number', 'E712: Argument of extend() must be a List or Dictionary']) + v9.CheckSourceDefAndScriptFailure(['extend("a", 1)'], ['E1013: Argument 1: type mismatch, expected list but got string', 'E896: Argument of extend() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extend([1, 2], 3)'], ['E1013: Argument 2: type mismatch, expected list but got number', 'E896: Argument of extend() must be a List, Dictionary or Blob']) v9.CheckSourceDefAndScriptFailure(['var ll = [1, 2]', 'extend(ll, ["x"])'], ['E1013: Argument 2: type mismatch, expected list but got list', 'E1013: Argument 2: type mismatch, expected list but got list']) v9.CheckSourceDefFailure(['extend([1, 2], [3], "x")'], 'E1013: Argument 3: type mismatch, expected number but got string') v9.CheckSourceDefFailure(['extend({a: 1}, 42)'], 'E1013: Argument 2: type mismatch, expected dict but got number') v9.CheckSourceDefFailure(['extend({a: 1}, {b: 2}, 1)'], 'E1013: Argument 3: type mismatch, expected string but got number') + v9.CheckSourceDefFailure(['extend(0z01, 42)'], 'E1013: Argument 2: type mismatch, expected blob but got number') + v9.CheckSourceDefFailure(['extend(0z01, 0z02, 1.1)'], 'E1013: Argument 3: type mismatch, expected number but got float') + v9.CheckSourceScriptFailure(['vim9script', 'var l = [1]', 'extend(l, ["b", 1])'], 'E1013: Argument 2: type mismatch, expected list but got list in extend()') enddef @@ -1305,6 +1313,19 @@ def Test_extend_const() END v9.CheckSourceDefSuccess(lines) + lines =<< trim END + const b = 0z0102 + extend(b, 0z03) + END + v9.CheckSourceDefFailure(lines, 'E1307: Argument 1: Trying to modify a const blob') + + lines =<< trim END + final b = 0z0102 + extend(b, 0z03) + assert_equal(0z010203, b) + END + v9.CheckSourceDefSuccess(lines) + # item in a for loop is final lines =<< trim END var l: list> = [{n: 1}] @@ -1318,11 +1339,15 @@ enddef def Test_extendnew() assert_equal([1, 2, 'a'], extendnew([1, 2], ['a'])) assert_equal({one: 1, two: 'a'}, extendnew({one: 1}, {two: 'a'})) - - v9.CheckSourceDefAndScriptFailure(['extendnew({a: 1}, 42)'], ['E1013: Argument 2: type mismatch, expected dict but got number', 'E712: Argument of extendnew() must be a List or Dictionary']) - v9.CheckSourceDefAndScriptFailure(['extendnew({a: 1}, [42])'], ['E1013: Argument 2: type mismatch, expected dict but got list', 'E712: Argument of extendnew() must be a List or Dictionary']) - v9.CheckSourceDefAndScriptFailure(['extendnew([1, 2], "x")'], ['E1013: Argument 2: type mismatch, expected list but got string', 'E712: Argument of extendnew() must be a List or Dictionary']) - v9.CheckSourceDefAndScriptFailure(['extendnew([1, 2], {x: 1})'], ['E1013: Argument 2: type mismatch, expected list but got dict', 'E712: Argument of extendnew() must be a List or Dictionary']) + assert_equal(0z010203, extendnew(0z0102, 0z03)) + + v9.CheckSourceDefAndScriptFailure(['extendnew({a: 1}, 42)'], ['E1013: Argument 2: type mismatch, expected dict but got number', 'E896: Argument of extendnew() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extendnew({a: 1}, [42])'], ['E1013: Argument 2: type mismatch, expected dict but got list', 'E896: Argument of extendnew() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extendnew([1, 2], "x")'], ['E1013: Argument 2: type mismatch, expected list but got string', 'E896: Argument of extendnew() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extendnew([1, 2], {x: 1})'], ['E1013: Argument 2: type mismatch, expected list but got dict', 'E896: Argument of extendnew() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extendnew(0z0102, "x")'], ['E1013: Argument 2: type mismatch, expected blob but got string', 'E896: Argument of extendnew() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extendnew(0z0102, [42])'], ['E1013: Argument 2: type mismatch, expected blob but got list', 'E896: Argument of extendnew() must be a List, Dictionary or Blob']) + v9.CheckSourceDefAndScriptFailure(['extendnew(0z0102, 0z03, 1.1)'], ['E1013: Argument 3: type mismatch, expected number but got float', 'E805: Using a Float as a Number']) enddef def Test_feedkeys() diff --git a/src/version.c b/src/version.c index c03f5e5450..68353e0baa 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 972, /**/ 971, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index c8790d634a..b72e5700b0 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2996,7 +2996,8 @@ execute_for(isn_T *iptr, ectx_T *ectx) // changed. if (idxtv->vval.v_number == -1 && blob != NULL) { - blob_copy(blob, ltv); + ltv->v_lock = 0; + ltv->vval.v_blob = blob_copy(blob); blob_unref(blob); blob = ltv->vval.v_blob; } @@ -4740,7 +4741,8 @@ exec_instructions(ectx_T *ectx) tv->vval.v_float = iptr->isn_arg.fnumber; break; case ISN_PUSHBLOB: - blob_copy(iptr->isn_arg.blob, tv); + tv->v_type = VAR_BLOB; + tv->vval.v_blob = blob_copy(iptr->isn_arg.blob); break; case ISN_PUSHFUNC: tv->v_type = VAR_FUNC; diff --git a/src/vim9instr.c b/src/vim9instr.c index 069818b350..a3e9243cac 100644 --- a/src/vim9instr.c +++ b/src/vim9instr.c @@ -1006,7 +1006,8 @@ generate_PUSHBLOB(cctx_T *cctx, blob_T *blob) isn_T *isn; RETURN_OK_IF_SKIP(cctx); - if ((isn = generate_instr_type(cctx, ISN_PUSHBLOB, &t_blob)) == NULL) + if ((isn = generate_instr_type2(cctx, ISN_PUSHBLOB, + &t_blob, &t_blob)) == NULL) return FAIL; isn->isn_arg.blob = blob; From 7a35445af1cccbc9e25ae9d04291efa9072262b7 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 20:31:12 +0000 Subject: [PATCH 385/647] patch 9.2.0973: Vim9: internal error when a class member is initialized with a closure Problem: Initializing an object variable with a closure gives an internal error when the constructor is called without arguments (Mao-Yining). Solution: Do not use "any" as the type of an argument that was not set, and do not copy such an argument when the stack is copied for a closure (Hirohito Higashi). fixes: #21069 closes: #21081 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_class.vim | 17 +++++++++++++++++ src/version.c | 2 ++ src/vim9execute.c | 10 +++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index 7d725e3745..eb108bcb9b 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -11887,4 +11887,21 @@ def Test_colon_whitespace() v9.CheckSourceSuccess(lines) enddef +" A closure in the initializer of an object variable, with the constructor +" called without arguments. +def Test_class_member_closure() + var lines =<< trim END + vim9script + class C + def F(): number + return 7 + enddef + var A = () => this.F() + endclass + var c = C.new() + assert_equal(7, c.A()) + END + v9.CheckSourceSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 68353e0baa..76a606456f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 973, /**/ 972, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index b72e5700b0..ddb6a5240f 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -887,7 +887,8 @@ handle_closure_in_use(ectx_T *ectx, int free_arguments) *(stack + idx) = *tv; tv->v_type = VAR_UNKNOWN; } - else + else if (tv->v_type != VAR_UNKNOWN) + // Skip an argument that was not set, the stack was cleared. copy_tv(tv, stack + idx); } // Skip the stack frame. @@ -5264,9 +5265,12 @@ exec_instructions(ectx_T *ectx) size_t argidx = ufunc->uf_def_args.ga_len + iptr->isn_arg.jumparg.jump_arg_off + STACK_FRAME_SIZE; - type_T *tuple = ufunc->uf_arg_types[argidx]; + type_T *type = ufunc->uf_arg_types[argidx]; CLEAR_POINTER(tv); - tv->v_type = tuple->tt_type; + // "any" is not a type a value can have, leave the + // argument marked as not set. + if (type->tt_type != VAR_ANY) + tv->v_type = type->tt_type; } if (iptr->isn_type == ISN_JUMP_IF_ARG_SET ? arg_set : !arg_set) From 08baca8abd55fb64c38db58927f91b04cad72e37 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 20:36:16 +0000 Subject: [PATCH 386/647] translation: the ja.euc-jp.po file is generated wrong on macOS Problem: The macOS CI job fails now and then on the check of ja.euc-jp.po. The iconv of macOS turns a backslash that follows a multibyte character into a fullwidth one, which breaks the escaping. The file in the repository is correct, it is only regenerated when a checkout leaves ja.po newer, which is why the failure comes and goes. Solution: Convert to EUC-JP-MS, which keeps the backslash and gives the same result otherwise. closes: #21082 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- src/po/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/po/Makefile b/src/po/Makefile index e63abd0ef0..cd0bd5e9d5 100644 --- a/src/po/Makefile +++ b/src/po/Makefile @@ -108,8 +108,11 @@ ja.sjis.po: ja.po sjiscorr: sjiscorr.c $(CC) -o sjiscorr sjiscorr.c +# Use EUC-JP-MS instead of EUC-JP: the iconv of macOS turns a backslash that +# follows a multibyte character into a fullwidth one for EUC-JP, which breaks +# the escaping in the po file. The result is the same for both names. ja.euc-jp.po: ja.po - iconv -f UTF-8 -t EUC-JP $? | \ + iconv -f UTF-8 -t EUC-JP-MS $? | \ $(SED) -e 's/charset=[uU][tT][fF]-8/charset=EUC-JP/' \ -e 's/# Original translations/# Generated from $?, DO NOT EDIT/' \ > $@ From 41ec8c6ed0a1837d2b56c704df122615b4b5a5bf Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 20:44:05 +0000 Subject: [PATCH 387/647] patch 9.2.0974: tests: Test_clientserver_serverlist_list() is flaky Problem: The test fails now and then, most often on MS-Windows. It uses the same server name as another test in the file, and Vim appends a number to the name when a server with that name is still running. The name is then checked with a match, which still succeeds, and with an exact comparison, which does not. Solution: Use a name of its own and check the list with a pattern, so that a number appended to the name does not matter. closes: #21083 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_clientserver.vim | 12 ++++++++---- src/version.c | 2 ++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index 8fa204ea5f..5ed063e1f5 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -671,14 +671,18 @@ func Test_clientserver_serverlist_list() " Don't use channel:2000, because previous tests use that and it may take a " while for the channel to fully close. - let actual = cmd .. ' --servername XVIMTEST' + " Use a name of its own: when a server of another test is still running Vim + " appends a number to the name. + let actual = cmd .. ' --servername XVIMSRVLIST' let job = job_start(actual, {'stoponexit': 'kill', 'out_io': 'null'}) - call WaitForAssert({-> assert_match('XVIMTEST', serverlist())}) + call WaitForAssert({-> assert_match('XVIMSRVLIST', serverlist())}) - call assert_equal('list', typename(serverlist(#{list: v:true}))) - call assert_true(serverlist(#{list: v:true})->index('XVIMTEST') != -1) + " Use a pattern, the name may have a number appended to it. + let servers = serverlist(#{list: v:true}) + call assert_equal('list', typename(servers)) + call assert_notequal(-1, match(servers, '^XVIMSRVLIST')) if has('win32') call job_stop(job, 'kill') diff --git a/src/version.c b/src/version.c index 76a606456f..2341e69910 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 974, /**/ 973, /**/ From 44a92018a5a9e6d947845c748ab3add7b2d8e7c3 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 20:50:15 +0000 Subject: [PATCH 388/647] patch 9.2.0975: Vim9: assignment to a member of an object member fails Problem: Using an operator on a member of an object that is itself a member of an object gives E909, and a plain assignment to it stores the value in the wrong member (Mao-Yining). Solution: When the last index is split off from the name, forget the member index found for the first name. The index is compiled before the variable, thus do not use the type that loading the variable produced. Load the member of an object like an expression does instead of indexing it (Hirohito Higashi). fixes: #21084 closes: #21085 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/proto/vim9expr.pro | 1 + src/testdir/test_vim9_class.vim | 61 +++++++++++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 21 ++++++++++-- src/vim9expr.c | 2 +- 5 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/proto/vim9expr.pro b/src/proto/vim9expr.pro index 4de1439179..055723ce4e 100644 --- a/src/proto/vim9expr.pro +++ b/src/proto/vim9expr.pro @@ -2,6 +2,7 @@ int generate_ppconst(cctx_T *cctx, ppconst_T *ppconst); void clear_ppconst(ppconst_T *ppconst); int compile_member(int is_slice, int *keeping_dict, cctx_T *cctx); +int compile_class_object_index(cctx_T *cctx, char_u **arg, type_T *type); int compile_load_scriptvar(cctx_T *cctx, char_u *name, char_u *start, char_u **end, imported_T *import); int compile_load(char_u **arg, size_t namelen, char_u *end_arg, cctx_T *cctx, int is_expr, int error); int compile_arguments(char_u **arg, cctx_T *cctx, int *argcount, ca_special_T special_fn); diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index eb108bcb9b..5875f64264 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -11904,4 +11904,65 @@ def Test_class_member_closure() v9.CheckSourceSuccess(lines) enddef +" Using a compound operator on an object variable of an object variable. +def Test_nested_object_member_op_assign() + var lines =<< trim END + vim9script + class A + public var n = 1 + public var s = 'x' + endclass + class B + var a: A = A.new() + def Add() + this.a.n += 2 + this.a.s ..= 'y' + enddef + endclass + var b = B.new() + b.Add() + assert_equal(3, b.a.n) + assert_equal('xy', b.a.s) + END + v9.CheckSourceSuccess(lines) + + # Also when the object is in a local variable. + lines =<< trim END + vim9script + class A + public var n = 1 + endclass + class B + var a: A = A.new() + endclass + def F(): number + var b = B.new() + b.a.n += 2 + return b.a.n + enddef + assert_equal(3, F()) + END + v9.CheckSourceSuccess(lines) + + # A plain assignment must use the last name, not the first one. + lines =<< trim END + vim9script + class A + public var n = 1 + public var s = 'x' + endclass + class B + var a: A = A.new() + def Set() + this.a.s = 'y' + enddef + endclass + var b = B.new() + b.Set() + assert_equal(1, b.a.n) + assert_equal('y', b.a.s) + END + v9.CheckSourceSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 2341e69910..fcb088bdbc 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 975, /**/ 974, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 2aeef40959..5f51fdf6d5 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2265,8 +2265,10 @@ compile_lhs_set_member_type( lhs->lhs_varlen = after - var_start; lhs->lhs_dest = dest_expr; // We don't know the type before evaluating the expression, - // use "any" until then. + // use "any" until then. The member index is for the first name, + // not for the last index. lhs->lhs_type = &t_any; + lhs->lhs_member_idx = -1; } int use_class = lhs->lhs_type != NULL @@ -2623,7 +2625,17 @@ compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx) if (lhs->lhs_has_index) { - int range = FALSE; + int range = FALSE; + type_T *type = get_type_on_stack(cctx, 0); + + // A member of an object or class is not obtained by indexing it. + if (type->tt_type == VAR_CLASS + || (type->tt_type == VAR_OBJECT && type != &t_object_any)) + { + char_u *p = var_start + lhs->lhs_varlen; + + return compile_class_object_index(cctx, &p, type); + } // Get member from list or dict. First compile the // index value. @@ -2673,7 +2685,10 @@ compile_assign_unlet( return FAIL; } - if (lhs->lhs_type == NULL || lhs->lhs_type == &t_any) + // For "expr[idx]" the index is compiled before the expression, thus the + // resulting type cannot be used here. + if (lhs->lhs_dest == dest_expr + || lhs->lhs_type == NULL || lhs->lhs_type == &t_any) { // Index on variable of unknown type: check at runtime. dest_type = VAR_ANY; diff --git a/src/vim9expr.c b/src/vim9expr.c index 7f47d82fb6..87a872f58c 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -347,7 +347,7 @@ inside_class_hierarchy(cctx_T *cctx_arg, class_T *cl) /* * Compile ".member" coming after an object or class. */ - static int + int compile_class_object_index(cctx_T *cctx, char_u **arg, type_T *type) { int m_idx; From a20071113aa9bec2d47924e6af0269b6e1929ac5 Mon Sep 17 00:00:00 2001 From: Amariah Kamau <110414493+AmariahAK@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:02:17 +0000 Subject: [PATCH 389/647] patch 9.2.0976: Vim9: line continuation for command arguments is undocumented Problem: Line continuation for command arguments such as :command and :autocmd is not documented (Ryosuke Akiyama). Solution: Document and test the required backslash form (Amariah Kamau). fixes: #21070 closes: #21073 Co-Authored-By: atlarix-agent Signed-off-by: Amariah Kamau <110414493+AmariahAK@users.noreply.github.com> Signed-off-by: Christian Brabandt --- runtime/doc/vim9.txt | 12 ++++++++++-- src/testdir/test_autocmd.vim | 18 ++++++++++++++++++ src/testdir/test_usercommands.vim | 18 ++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index 082b9ba85d..5054826848 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -914,8 +914,16 @@ Notes: echo [1, 2] [3, 4] - In some cases it is difficult for Vim to parse a command, especially when - commands are used as an argument to another command, such as `:windo`. In - those cases the line continuation with a backslash has to be used. + commands are used as an argument to another command, such as `:windo`, + `:command` or `:autocmd`. In those cases the line continuation with a + backslash has to be used. For example: > + command! Foo call Bar('x', { + \ 'key': 'value', + \ }) + autocmd BufWritePre * call Bar('x', { + \ 'key': 'value', + \ }) +< White space ~ diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index b76cec4f3f..1f33bd2b46 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -4070,6 +4070,24 @@ func Test_autocmd_with_block() augroup END endfunc +" Test for a backslash line continuation in an :autocmd command +func Test_autocmd_line_continuation() + let lines =<< trim END + vim9script + def Bar(label: string, value: any): void + g:result = [label, value] + enddef + autocmd BufWritePre * call Bar('x', { + \ 'key': 'value', + \ }) + doautocmd BufWritePre + assert_equal(['x', {'key': 'value'}], g:result) + END + call v9.CheckScriptSuccess(lines) + unlet g:result + au! BufWritePre +endfunc + " Test for a {} block at script level in an :autocmd nested in another one func Test_autocmd_nested_block() let lines =<< trim END diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim index 7f8fea4216..a615f35c04 100644 --- a/src/testdir/test_usercommands.vim +++ b/src/testdir/test_usercommands.vim @@ -927,6 +927,24 @@ func Test_usercmd_custom() delfunc T2 endfunc +" Test for a backslash line continuation in a :command replacement +func Test_usercmd_line_continuation() + let lines =<< trim END + vim9script + def Bar(label: string, value: any): void + g:result = [label, value] + enddef + command! Foo call Bar('x', { + \ 'key': 'value', + \ }) + Foo + assert_equal(['x', {'key': 'value'}], g:result) + END + call v9.CheckScriptSuccess(lines) + unlet g:result + delcommand Foo +endfunc + " Test for a {} block in a command nested in :command or :autocmd func Test_usercmd_nested_block() command DefineIt command DoNested { diff --git a/src/version.c b/src/version.c index fcb088bdbc..7b88e90e56 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 976, /**/ 975, /**/ From e3eb025930fc81a5c0921b08b5bdb01e88f82b25 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 18 Aug 2026 21:43:29 +0000 Subject: [PATCH 390/647] patch 9.2.0977: tests: test_terminal_visual_empty_listchars() is flaky Problem: tests: test_terminal_visual_empty_listchars() is flaky Solution: Use WaitForAssert (Hirohito Higashi). related: #21093 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_terminal3.vim | 10 +++++++--- src/version.c | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index cf87038ef1..67952bfb65 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1028,12 +1028,16 @@ func Test_terminal_visual_empty_listchars() \ ] call writefile(lines, 'XtermStart1', 'D') let buf = RunVimInTerminal('-S XtermStart1', #{rows: 15}) - call term_wait(buf) + " Wait for the job to finish, otherwise the keys go to the shell. + call WaitForAssert({-> assert_match('\[finished\]', term_getline(buf, 7))}) call term_sendkeys(buf, "V2k") + call term_wait(buf) call VerifyScreenDump(buf, 'Test_terminal_empty_listchars', {}) call term_sendkeys(buf, "\") call term_sendkeys(buf, ":set nu\") + call term_wait(buf) call term_sendkeys(buf, "ggV2j") + call term_wait(buf) call VerifyScreenDump(buf, 'Test_terminal_empty_listchars2', {}) call StopVimInTerminal(buf) @@ -1051,7 +1055,7 @@ func Test_terminal_normal_mode_colored_empty_line() \ 'Xterm_colored.sh', 'D') call writefile([':term sh ./Xterm_colored.sh'], 'XtermColored', 'D') let buf = RunVimInTerminal('-S XtermColored', #{rows: 10}) - call term_wait(buf) + call WaitForAssert({-> assert_match('\[finished\]', term_getline(buf, 5))}) call VerifyScreenDump(buf, 'Test_terminal_colored_empty_1', {}) " Enter Terminal-Normal mode: the empty lines must still be gray. @@ -1075,7 +1079,7 @@ func Test_terminal_visual_colored_empty_line() call writefile([':set listchars=', ':term sh ./Xterm_colored.sh'], \ 'XtermColored', 'D') let buf = RunVimInTerminal('-S XtermColored', #{rows: 10}) - call term_wait(buf) + call WaitForAssert({-> assert_match('\[finished\]', term_getline(buf, 5))}) call term_sendkeys(buf, "\NggVG") call term_wait(buf) diff --git a/src/version.c b/src/version.c index 7b88e90e56..2bea460a98 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 977, /**/ 976, /**/ From 5ae1ad12985399c57e53f6abccce25a6f616a5a4 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 19 Aug 2026 18:58:40 +0000 Subject: [PATCH 391/647] patch 9.2.0978: terminal: empty lines don't use the background color of hl-terminal Problem: In a terminal window the empty lines are drawn without the background color that was set with hl-terminal, while the lines with text do use it (bfrg). Solution: Stop clearing the window attribute on an empty line. The Visual selection is already combined into the first cell of such a line, so the background color can be kept (Hirohito Higashi). fixes: #21087 related: #17559 related: #20547 closes: #21093 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/drawline.c | 10 ------- src/proto/terminal.pro | 1 - src/terminal.c | 13 --------- .../dumps/Test_terminal_hl_empty_1.dump | 10 +++++++ .../dumps/Test_terminal_hl_empty_2.dump | 10 +++++++ .../dumps/Test_terminal_hl_empty_3.dump | 10 +++++++ src/testdir/test_terminal3.vim | 29 +++++++++++++++++++ src/version.c | 2 ++ 8 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 src/testdir/dumps/Test_terminal_hl_empty_1.dump create mode 100644 src/testdir/dumps/Test_terminal_hl_empty_2.dump create mode 100644 src/testdir/dumps/Test_terminal_hl_empty_3.dump diff --git a/src/drawline.c b/src/drawline.c index edd5ef6ea5..00afb6409b 100644 --- a/src/drawline.c +++ b/src/drawline.c @@ -2872,16 +2872,6 @@ win_line( #endif // no more cells to skip skip_cells = 0; -#ifdef FEAT_TERMINAL - if (term_show_buffer(wp->w_buffer) - && wlv.vcol == 0 - && wlv.win_attr == term_get_attr(wp, lnum, -1) - && wlv.win_attr == term_get_default_attr(wp)) - // Reset the attribute for an empty line with the - // default background, so a Visual selection shows; - // keep an explicitly set background color. - wlv.win_attr = 0; -#endif } if (has_mbyte) diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro index cc859dd6cb..6429ffadd5 100644 --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -36,7 +36,6 @@ int term_is_finished(buf_T *buf); int term_show_buffer(buf_T *buf); void term_change_in_curbuf(void); int term_get_attr(win_T *wp, linenr_T lnum, int col); -int term_get_default_attr(win_T *wp); void term_reset_hlfwin(win_T *wp); void term_update_hlfwin(win_T *wp); void term_update_hlfwin_all(void); diff --git a/src/terminal.c b/src/terminal.c index f136e1efbd..8bdaa1b4c1 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -4457,19 +4457,6 @@ term_get_attr(win_T *wp, linenr_T lnum, int col) return cell2attr(term, wp, &cellattr->attrs, &cellattr->fg, &cellattr->bg); } -/* - * Return the screen attribute for the terminal's default color. Used to tell - * whether a line's fill (background) is the default or was set explicitly. - */ - int -term_get_default_attr(win_T *wp) -{ - term_T *term = wp->w_buffer->b_term; - cellattr_T *cellattr = &term->tl_default_color; - - return cell2attr(term, wp, &cellattr->attrs, &cellattr->fg, &cellattr->bg); -} - /* * Convert a cterm color number 0 - 255 to RGB. * This is compatible with xterm. diff --git a/src/testdir/dumps/Test_terminal_hl_empty_1.dump b/src/testdir/dumps/Test_terminal_hl_empty_1.dump new file mode 100644 index 0000000000..460f1fb948 --- /dev/null +++ b/src/testdir/dumps/Test_terminal_hl_empty_1.dump @@ -0,0 +1,10 @@ +|o+0&#e000002|n|e| @71 +@75 +|t|w|o| @71 +> @74 +|!+2#ffffff16#00e0003|s|h| |-|c| |"|p|r|i|n|t|f| |'|o|n|e|\@1|n|\@1|n|t|w|o|\@1|n|\@1|n|'|"| |[|f|i|n|i|s|h|e|d|]| @9|4|,|0|-|1| @9|A|l@1 +| +0#0000000#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +| +0&&@74 diff --git a/src/testdir/dumps/Test_terminal_hl_empty_2.dump b/src/testdir/dumps/Test_terminal_hl_empty_2.dump new file mode 100644 index 0000000000..460f1fb948 --- /dev/null +++ b/src/testdir/dumps/Test_terminal_hl_empty_2.dump @@ -0,0 +1,10 @@ +|o+0&#e000002|n|e| @71 +@75 +|t|w|o| @71 +> @74 +|!+2#ffffff16#00e0003|s|h| |-|c| |"|p|r|i|n|t|f| |'|o|n|e|\@1|n|\@1|n|t|w|o|\@1|n|\@1|n|'|"| |[|f|i|n|i|s|h|e|d|]| @9|4|,|0|-|1| @9|A|l@1 +| +0#0000000#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +| +0&&@74 diff --git a/src/testdir/dumps/Test_terminal_hl_empty_3.dump b/src/testdir/dumps/Test_terminal_hl_empty_3.dump new file mode 100644 index 0000000000..4f146cc193 --- /dev/null +++ b/src/testdir/dumps/Test_terminal_hl_empty_3.dump @@ -0,0 +1,10 @@ +|o+0#0000001#a8a8a8255|n|e| +0#0000000#e000002@71 +| +0#0000001#a8a8a8255| +0#0000000#e000002@73 +|t+0#0000001#a8a8a8255|w|o| +0#0000000#e000002@71 +> @74 +|!+2#ffffff16#00e0003|s|h| |-|c| |"|p|r|i|n|t|f| |'|o|n|e|\@1|n|\@1|n|t|w|o|\@1|n|\@1|n|'|"| |[|f|i|n|i|s|h|e|d|]| @9|4|,|0|-|1| @9|A|l@1 +| +0#0000000#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +|-+2&&@1| |V|I|S|U|A|L| |L|I|N|E| |-@1| +0&&@46|4| @9 diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index 67952bfb65..ae773279eb 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1088,6 +1088,35 @@ func Test_terminal_visual_colored_empty_line() call StopVimInTerminal(buf) endfunc +func Test_terminal_hl_terminal_empty_line() + CheckScreendump + CheckRunVimInTerminal + CheckUnix + + " When a background color is set with hl-terminal the empty lines must use + " it as well, both while the job runs and in Terminal-Normal mode. + let lines = [ + \ 'highlight Terminal ctermbg=darkred', + \ 'set listchars=', + \ ':term sh -c "printf ''one\\n\\ntwo\\n\\n''"' + \ ] + call writefile(lines, 'XtermHlTerm', 'D') + let buf = RunVimInTerminal('-S XtermHlTerm', #{rows: 10}) + call WaitForAssert({-> assert_match('\[finished\]', term_getline(buf, 5))}) + call VerifyScreenDump(buf, 'Test_terminal_hl_empty_1', {}) + + call term_sendkeys(buf, "\N") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_terminal_hl_empty_2', {}) + + " The Visual selection must still show on the first cell of an empty line. + call term_sendkeys(buf, "ggVG") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_terminal_hl_empty_3', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_terminal_ansi_color_windows_cui() if !has('win32') || has('gui_running') throw 'Skipped: only for the Windows CUI' diff --git a/src/version.c b/src/version.c index 2bea460a98..326f1df474 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 978, /**/ 977, /**/ From f8799c5d0d5bad30e12ee1daa3034a2a58850690 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 19 Aug 2026 19:14:57 +0000 Subject: [PATCH 392/647] patch 9.2.0979: terminal: mouse stays enabled after Vim is killed with SIGTERM Problem: After Vim is killed with a deadly signal such as SIGTERM the mouse stays enabled in the terminal, so moving the mouse afterwards produces escape sequences in the shell (Dominik George). Solution: Switch the mouse off when exiting after a deadly signal. The terminal mode is restored with "full_screen" already reset, which makes settmode() return before it can do this (Hirohito Higashi). fixes: #21090 closes: #21095 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/misc1.c | 5 +++++ src/version.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/misc1.c b/src/misc1.c index 5927768a25..ed81b5ee0a 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -2295,6 +2295,11 @@ prepare_to_exit(void) { windgoto((int)Rows - 1, cmdline_col_off); + // When "full_screen" was reset, e.g. by deathtrap(), settmode() below + // returns without switching the mouse off, so do it here. + if (!full_screen) + mch_setmouse(FALSE); + /* * Switch terminal mode back now, so messages end up on the "normal" * screen (if there are two screens). diff --git a/src/version.c b/src/version.c index 326f1df474..257d312232 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 979, /**/ 978, /**/ From 4be03620b305282270e41643e5e860f95efa8f07 Mon Sep 17 00:00:00 2001 From: "J. Paulo Seibt" Date: Wed, 19 Aug 2026 19:41:34 +0000 Subject: [PATCH 393/647] patch 9.2.0980: runtime(netrw): prioritize g:netrw_home on Neovim Problem: runtime(netrw): g:netrw_home not respected on Neovim Solution: prioritize g:netrw_home for bookmarks and history directory setting, add tests (J. Paulo Seibt) related: neovim/neovim@5a78c5b closes: #21091 Signed-off-by: J. Paulo Seibt Signed-off-by: Christian Brabandt --- .../pack/dist/opt/netrw/autoload/netrw.vim | 8 ++-- src/testdir/test_plugin_netrw.vim | 40 +++++++++++++++++++ src/version.c | 2 + 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index d745fd36fa..0347ec497f 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Jul 23 +" Last Change: 2026 Aug 19 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -4459,10 +4459,10 @@ endfunction " s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2 function s:NetrwHome() - if has('nvim') - let home = netrw#fs#PathJoin(stdpath('state'), 'netrw') - elseif exists('g:netrw_home') + if exists('g:netrw_home') let home = expand(g:netrw_home) + elseif has('nvim') + let home = netrw#fs#PathJoin(stdpath('state'), 'netrw') elseif exists('$MYVIMDIR') let home = expand('$MYVIMDIR')->substitute('/$', '', '') else diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index 2530b0a70f..e6ce769ce0 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -196,6 +196,11 @@ function Test_NetrwMarkFile_match_pattern_rebuild() bw endfunction + +" Test the "home" directory used for bookmarks and history +function Test_NetrwHome() abort + return s:NetrwHome() +endfunction " }}} END @@ -912,4 +917,39 @@ func Test_netrw_open_no_dir_arg() bw! endfunc +func Test_netrw_home_setting() + let save_home = get(g:, 'netrw_home', '') + let dir = fnamemodify('XnetrwHome', ':p:h') + if has('win32') + let dir = substitute(dir, '/', '\\', 'g') + endif + + if has('nvim') + unlet! g:netrw_home + call assert_equal(netrw#fs#PathJoin(stdpath('state'), 'netrw'), Test_NetrwHome()) + endif + + let g:netrw_home = dir + call assert_equal(dir, Test_NetrwHome()) + call assert_true(isdirectory(dir)) + + " the value is expanded + let $NETRW_TEST_HOME = dir + let g:netrw_home = '$NETRW_TEST_HOME' + call assert_equal(dir, Test_NetrwHome()) + + " without the setting $MYVIMDIR is used + unlet g:netrw_home + let $MYVIMDIR = dir + call assert_equal(dir, Test_NetrwHome()) + + call delete(dir, 'd') + let $NETRW_TEST_HOME = '' + if empty(save_home) + unlet! g:netrw_home + else + let g:netrw_home = save_home + endif +endfunc + " vim:ts=8 sts=2 sw=2 et diff --git a/src/version.c b/src/version.c index 257d312232..e5ab4cc8aa 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 980, /**/ 979, /**/ From 9647ccc020d0dee86b4b8cfcaf32ee7a36b17d6b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 19 Aug 2026 20:21:57 +0000 Subject: [PATCH 394/647] patch 9.2.0981: substitute: wrong text after undo of a confirmed \r Problem: When a substitution is confirmed with the "c" flag and the replacement contains "\r", undo restores the whole original line while the lines already produced by earlier replacements stay, duplicating text (Masato Nishihata). Solution: Replace the line before the next confirmation prompt, so that the line split and the replacement it belongs to end up in the same undo block (Hirohito Higashi). fixes: #4798 closes: #21092 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/ex_cmds.c | 6 ++++++ src/testdir/test_substitute.vim | 23 +++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 31 insertions(+) diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 6a1715a6bd..20fcfb221d 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -4417,6 +4417,7 @@ ex_substitute(exarg_T *eap) int do_again; // do it again after joining lines int skip_match = FALSE; linenr_T sub_firstlnum; // nr of first sub line + bool did_split = false; // "\r" split the line #ifdef FEAT_PROP_POPUP int apc_flags = APC_SAVE_FOR_UNDO | APC_SUBSTITUTE; colnr_T total_added = 0; @@ -5124,6 +5125,7 @@ ex_substitute(exarg_T *eap) ++sub_firstlnum; ++lnum; ++line2; + did_split = true; // move the cursor to the new line, like Vi ++curwin->w_cursor.lnum; // copy the rest @@ -5166,9 +5168,12 @@ ex_substitute(exarg_T *eap) * match, otherwise "\@<=" won't work. * When the match starts below where we start searching also * need to replace the line first (using \zs after \n). + * When asking, undo is synced at every match, so a line split + * by "\r" must be replaced in the same undo block. */ if (lastone || nmatch_tl > 0 + || (subflags.do_ask && did_split) || (nmatch = vim_regexec_multi(®match, curwin, curbuf, sub_firstlnum, matchcol, NULL)) == 0 @@ -5247,6 +5252,7 @@ ex_substitute(exarg_T *eap) prev_matchcol = (colnr_T)(sub_firstline.length - prev_matchcol); copycol = 0; + did_split = false; } if (nmatch == -1 && !lastone) nmatch = vim_regexec_multi(®match, curwin, curbuf, diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim index 7108143863..eb60513bdc 100644 --- a/src/testdir/test_substitute.vim +++ b/src/testdir/test_substitute.vim @@ -1526,4 +1526,27 @@ func Test_substitute_expr_cpo() delfunc XSubExpr endfunc +" Test that undo after a confirmed substitution restores the state right +" before the confirmed match, also when "\r" splits the line (issue #4798) +func Test_sub_undo_after_confirm() + new + call setline(1, 'foofoo') + call feedkeys(":s/foo/bar\\r/gc\yy", 'xt') + call assert_equal(['bar', 'bar', ''], getline(1, '$')) + call feedkeys('u', 'xt') + call assert_equal(['bar', 'foo'], getline(1, '$')) + call feedkeys('u', 'xt') + call assert_equal(['foofoo'], getline(1, '$')) + bwipe! + + " Without "\r" all the matches in one line are still undone at once. + new + call setline(1, 'aXbXcXd') + call feedkeys(":s/X/-/gc\yyy", 'xt') + call assert_equal(['a-b-c-d'], getline(1, '$')) + call feedkeys('u', 'xt') + call assert_equal(['aXbXcXd'], getline(1, '$')) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index e5ab4cc8aa..b0a5d07189 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 981, /**/ 980, /**/ From be66c98572f6d1d9bfab63e318c48aa3c7bd38a6 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 19 Aug 2026 20:28:07 +0000 Subject: [PATCH 395/647] patch 9.2.0982: tests: test_substitute leaves swapfiles behind Problem: tests: test_substitute leaves swapfiles behind Solution: Close open buffer using :bw! Signed-off-by: Christian Brabandt --- src/testdir/test_substitute.vim | 12 ++++++------ src/version.c | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim index eb60513bdc..0fefcbcada 100644 --- a/src/testdir/test_substitute.vim +++ b/src/testdir/test_substitute.vim @@ -797,7 +797,7 @@ func Test_replace_with_tilde() call assert_equal('- Bug uuun "vPPPP" on this text:', getline(1)) s/o/~~~/ call assert_equal('- Bug uuun "vPPPP" uuuuuuuuun this text:', getline(1)) - close! + bw! endfunc func Test_replace_keeppatterns() @@ -835,7 +835,7 @@ one two exe "normal 0dn" call assert_equal('xyz bar', getline('.')) - close! + bw! endfunc func Test_sub_beyond_end() @@ -859,7 +859,7 @@ func Test_repeat_last_sub() let @/ = 'green' s//gray call assert_equal('red gray red orange red', getline(1)) - close! + bw! endfunc " Test for Vi compatible substitution: @@ -874,7 +874,7 @@ func Test_sub_vi_compatibility() let @/ = 'white' s\&green& call assert_equal('amber green yellow white green', getline(1)) - close! + bw! call assert_fails('vim9cmd s\/white/', 'E1270:') call assert_fails('vim9cmd s\?white?', 'E1270:') @@ -887,7 +887,7 @@ func Test_sub_expand_text() call setline(1, 'abcabcabcabcabcabcabcabc') s/b/\=repeat('B', 10)/g call assert_equal(repeat('aBBBBBBBBBBc', 8), getline(1)) - close! + bw! endfunc " Test for command failures when the last substitute pattern is not set. @@ -998,7 +998,7 @@ func Test_substitute_multiline_submatch() call setline(1, ['line1', 'line2', 'line3', 'line4']) %s/^line1\(\_.\+\)line4$/\=submatch(1)/ call assert_equal(['', 'line2', 'line3', ''], getline(1, '$')) - close! + bw! endfunc func Test_substitute_skipped_range() diff --git a/src/version.c b/src/version.c index b0a5d07189..28805352f7 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 982, /**/ 981, /**/ From 9388f50145e159cbb69fe0237b007f22cc9415db Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 19 Aug 2026 20:35:34 +0000 Subject: [PATCH 396/647] patch 9.2.0983: 'laststatus' is ignored when creating a full-height vertical split Problem: 'laststatus' is ignored when creating a full-height vertical split. With 'laststatus' zero, CTRL-W H, CTRL-W L and :vertical topleft/botright split all give the new window a status line, e.g. with "vim --clean -c 'set laststatus=0' -c 'sp|wincmd H'". Setting 'laststatus' to zero again makes it disappear. Solution: In win_split_ins(), only reserve a status line for the new full-height window when 'laststatus' is non-zero. fixes: #20999 closes: #21086 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- src/testdir/test_statusline.vim | 57 +++++++++++++++++++++++++++++++++ src/version.c | 2 ++ src/window.c | 9 ++++-- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim index 0010bb182a..71c703028c 100644 --- a/src/testdir/test_statusline.vim +++ b/src/testdir/test_statusline.vim @@ -1250,4 +1250,61 @@ func Test_statusline_vsep_borrow_hl_mode_change() call StopVimInTerminal(buf) endfunc +" Creating a full-height vertical split must not add a status line when +" 'laststatus' is zero. +func Test_window_cmd_ls0_splitmove() + set laststatus=0 + let avail = &lines - &cmdheight + + " CTRL-W H and CTRL-W L move a window into a full-height vertical split. + for cmd in ['H', 'L'] + split + exe 'wincmd ' .. cmd + call assert_equal([0, 0], + \ map(range(1, winnr('$')), 'avail - winheight(v:val)'), + \ 'wincmd ' .. cmd) + only! + endfor + + " The same when the full-height vertical split is created directly, which + " does not go through win_splitmove(). + for cmd in ['vert topleft new', 'vert botright new', + \ 'topleft vsplit', 'botright vsplit'] + exe cmd + call assert_equal([0, 0], + \ map(range(1, winnr('$')), 'avail - winheight(v:val)'), cmd) + only! + endfor + + " With a horizontal split next to it the new window still spans the full + " height; the status line between the stacked windows remains. + for cmd in ['split | split | wincmd H', 'split | vert topleft new'] + exe cmd + call assert_equal(0, avail - winheight(1), cmd .. ', left window') + call assert_equal(1, avail - winheight(2) - winheight(3), + \ cmd .. ', right column') + only! + endfor + + " The reverse still adds a status line to the upper window. + vsplit + wincmd K + call assert_equal(1, avail - winheight(1) - winheight(2)) + only! + + " With 'laststatus' set every window does get a status line. + for ls in [1, 2] + exe 'set laststatus=' .. ls + split + wincmd H + call assert_equal([1, 1], + \ map(range(1, winnr('$')), 'avail - winheight(v:val)'), + \ 'laststatus=' .. ls) + only! + endfor + + set laststatus&vim + %bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 28805352f7..cf15655d71 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 983, /**/ 982, /**/ diff --git a/src/window.c b/src/window.c index b2ed04e4d1..852a220354 100644 --- a/src/window.c +++ b/src/window.c @@ -1378,10 +1378,13 @@ win_split_ins( if (flags & (WSP_TOP | WSP_BOT)) { // set height and row of new window to full height + // no status line when 'laststatus' is zero + int stl_height = p_ls > 0 ? statusline_height(curfrp->fr_win) : 0; + wp->w_winrow = tabline_height(); - win_new_height(wp, curfrp->fr_height - - statusline_height(curfrp->fr_win) - WINBAR_HEIGHT(wp)); - wp->w_status_height = statusline_height(curfrp->fr_win); + win_new_height(wp, curfrp->fr_height - stl_height + - WINBAR_HEIGHT(wp)); + wp->w_status_height = stl_height; } else { From bce3eb1fae71671b39756a77c9b1db203311ba0c Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 19 Aug 2026 21:06:43 +0000 Subject: [PATCH 397/647] runtime(doc): clarify the 'findfunc' option Remove the note about "this function is called only once per :find command invocation". fixes: #21062 Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 64ab681230..08f286782c 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 16 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3986,7 +3986,6 @@ A jump table for the options with a short description can be found at |Q_op|. The function should return a List, which is handled similarly to the return value of a |:command-completion-customlist| function. - The function is called only once per |:find| command invocation. The function can process all the directories specified in 'path'. If a match is found, the function should return a |List| containing From 49bc61c685fd4710f695bc7c7a61add0e9316465 Mon Sep 17 00:00:00 2001 From: curbe454 Date: Wed, 19 Aug 2026 21:35:12 +0000 Subject: [PATCH 398/647] patch 9.2.0984: runtime(zip): cannot adjust zip command line Problem: runtime(zip): cannot adjust zip command line Solution: Add support for configuring the options to use, so users could optionally make use of 7zip instead of unzip (curbe454) closes: #20832 Signed-off-by: curbe454 Signed-off-by: Christian Brabandt --- runtime/autoload/zip.vim | 51 ++++++++++++++++----------------- runtime/doc/pi_zip.txt | 18 +++++++++--- src/testdir/test_plugin_zip.vim | 33 +++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 73 insertions(+), 31 deletions(-) diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim index 61e9807438..d016e57d1f 100644 --- a/runtime/autoload/zip.vim +++ b/runtime/autoload/zip.vim @@ -1,31 +1,10 @@ " zip.vim: Handles browsing zipfiles " AUTOLOAD PORTION -" Date: 2024 Aug 21 +" Date: 2026 Aug 19 " Version: 34 " Maintainer: This runtime file is looking for a new maintainer. " Former Maintainer: Charles E Campbell " Last Change: -" 2024 Jun 16 by Vim Project: handle whitespace on Windows properly (#14998) -" 2024 Jul 23 by Vim Project: fix 'x' command -" 2024 Jul 24 by Vim Project: use delete() function -" 2024 Jul 30 by Vim Project: fix opening remote zipfile -" 2024 Aug 04 by Vim Project: escape '[' in name of file to be extracted -" 2024 Aug 05 by Vim Project: workaround for the FreeBSD's unzip -" 2024 Aug 05 by Vim Project: clean-up and make it work with shellslash on Windows -" 2024 Aug 18 by Vim Project: correctly handle special globbing chars -" 2024 Aug 21 by Vim Project: simplify condition to detect MS-Windows -" 2025 Mar 11 by Vim Project: handle filenames with leading '-' correctly -" 2025 Jul 12 by Vim Project: drop ../ on write to prevent path traversal attacks -" 2025 Sep 22 by Vim Project: support PowerShell Core -" 2025 Dec 20 by Vim Project: use :lcd instead of :cd -" 2026 Feb 08 by Vim Project: use system() instead of :! -" 2026 Mar 08 by Vim Project: Make ZipUpdatePS() check for powershell -" 2026 Apr 01 by Vim Project: Detect more path traversal attacks -" 2026 Apr 05 by Vim Project: Detect more path traversal attacks -" 2026 Apr 14 by Vim Project: Detect more path traversal attacks on Windows -" 2026 Apr 15 by Vim Project: Detect more path traversal attacks on Windows -" 2026 Jun 20 by Vim Project: Fix wrong escaping for the powershell calls -" 2026 Jul 25 by Vim Project: Improved Compatibility for powershell 5 and pwsh 7 " License: Vim License (see vim's :help license) " Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, @@ -56,12 +35,30 @@ let s:NOTE = 0 if !exists("g:zip_zipcmd") let g:zip_zipcmd= "zip" endif +if !exists("g:zip_zipcmd_deleteopt") + let g:zip_zipcmd_deleteopt= "-d" +endif +if !exists("g:zip_zipcmd_updateopt") + let g:zip_zipcmd_updateopt= "-u" +endif + if !exists("g:zip_unzipcmd") let g:zip_unzipcmd= "unzip" endif +if !exists("g:zip_unzipcmd_browseopt") + let g:zip_unzipcmd_browseopt= "-Z1" +endif +if !exists("g:zip_unzipcmd_readopt") + let g:zip_unzipcmd_readopt= "-p" +endif + if !exists("g:zip_extractcmd") let g:zip_extractcmd= g:zip_unzipcmd endif +if !exists("g:zip_extractcmd_extractopt") + let g:zip_extractcmd_extractopt= "-o" +endif + if !exists("g:zip_pwsh") let g:zip_pwsh='' endif @@ -290,7 +287,7 @@ fun! zip#Browse(zipfile) \ '" Select a file with cursor and press ENTER']) keepj $ - let gnu_cmd = "keepj sil r! " . g:zip_unzipcmd . " -Z1 -- " . s:Escape(a:zipfile, 1) + let gnu_cmd = "keepj sil r! " . g:zip_unzipcmd . " " . g:zip_unzipcmd_browseopt . " -- " . s:Escape(a:zipfile, 1) let ps_cmd = 'keepj sil r! ' . s:ZipBrowsePS(a:zipfile) call s:TryExecGnuFallBackToPs(g:zip_unzipcmd, gnu_cmd, ps_cmd) @@ -374,7 +371,7 @@ fun! zip#Read(fname,mode) let temp = tempname() let fn = expand('%:p') - let gnu_cmd = g:zip_unzipcmd . ' -p -- ' . s:Escape(zipfile) . ' ' . s:Escape(fname) . ' > ' . s:Escape(temp) + let gnu_cmd = g:zip_unzipcmd . ' ' . g:zip_unzipcmd_readopt . ' -- ' . s:Escape(zipfile) . ' ' . s:Escape(fname) . ' > ' . s:Escape(temp) let gnu_cmd = 'call system(' . string(gnu_cmd) . ')' let ps_cmd = 'call system(' . string(s:ZipReadPS(zipfile, fname, temp)) . ')' call s:TryExecGnuFallBackToPs(g:zip_unzipcmd, gnu_cmd, ps_cmd) @@ -448,7 +445,7 @@ fun! zip#Write(fname) endif endif if fname =~ '^[.]\{1,2}/' - let gnu_cmd = g:zip_zipcmd . ' -d ' . s:Escape(fnamemodify(zipfile,":p")) . ' ' . s:Escape(fname) + let gnu_cmd = g:zip_zipcmd . ' ' . g:zip_zipcmd_deleteopt . ' ' . s:Escape(fnamemodify(zipfile,":p")) . ' ' . s:Escape(fname) let gnu_cmd = 'call system(' . string(gnu_cmd) . ')' let ps_cmd = $"call system({string(s:ZipDeleteFilePS(zipfile, fname))})" call s:TryExecGnuFallBackToPs(g:zip_zipcmd, gnu_cmd, ps_cmd) @@ -477,7 +474,7 @@ fun! zip#Write(fname) let fname = substitute(fname, '[', '[[]', 'g') endif - let gnu_cmd = g:zip_zipcmd . ' -u '. s:Escape(fnamemodify(zipfile,":p")) . ' ' . s:Escape(fname) + let gnu_cmd = g:zip_zipcmd . ' ' . g:zip_zipcmd_updateopt . ' ' . s:Escape(fnamemodify(zipfile,":p")) . ' ' . s:Escape(fname) let gnu_cmd = 'call system(''' . substitute(gnu_cmd, "'", "''", 'g') . ''')' let zip = fnamemodify(zipfile, ':p') let ps_cmd = s:ZipUpdatePS(zip, fname) @@ -581,7 +578,7 @@ fun! zip#Extract() endif " extract the file mentioned under the cursor - let gnu_cmd = g:zip_extractcmd . ' -o '. shellescape(b:zipfile) . ' ' . target + let gnu_cmd = g:zip_extractcmd . ' ' . g:zip_extractcmd_extractopt . ' ' . shellescape(b:zipfile) . ' ' . target let gnu_cmd = 'call system(' . string(gnu_cmd) . ')' let ps_cmd = 'call system(' . string(s:ZipExtractFilePS(b:zipfile, fname)) . ')' call s:TryExecGnuFallBackToPs(g:zip_extractcmd, gnu_cmd, ps_cmd) diff --git a/runtime/doc/pi_zip.txt b/runtime/doc/pi_zip.txt index 271fc11e98..341e2076f4 100644 --- a/runtime/doc/pi_zip.txt +++ b/runtime/doc/pi_zip.txt @@ -1,4 +1,4 @@ -*pi_zip.txt* For Vim version 9.2. Last change: 2026 Jul 30 +*pi_zip.txt* For Vim version 9.2. Last change: 2026 Aug 19 +====================+ | Zip File Interface | @@ -49,20 +49,30 @@ Copyright: Copyright (C) 2005-2015 Charles E Campbell *zip-copyright* automatically maximized when opened. *g:zip_unzipcmd* - Use this option to specify the program which does the duty of "unzip". - It's used during browsing. By default: > + Use these options to specify the program which does the duty of "unzip" and + the required argument switches. + It's used during browsing. By default: > let g:zip_unzipcmd= "unzip" + let g:zip_unzipcmd_browseopt= "-Z1" + let g:zip_unzipcmd_readopt= "-p" < + Note: a `--` is appended after the g:zip_unzipcmd_browseopt and + g:zip_unzipcmd_readopt settings to indicate the end of options. + *g:zip_zipcmd* - Use this option to specify the program which does the duty of "zip". + Use these options to specify the program which does the duty of "zip" and + the required argument switches. It's used during the writing (updating) of a file already in a zip file; by default: > let g:zip_zipcmd= "zip" + let g:zip_zipcmd_deleteopt= "-d" + let g:zip_zipcmd_updateopt= "-u" < *g:zip_extractcmd* This option specifies the program (and any options needed) used to extract a file from a zip archive. By default, > let g:zip_extractcmd= g:zip_unzipcmd + let g:zip_extractcmd_extractopt= "-o" < *g:zip_exec* For security reasons, one may prevent that Vim runs executables diff --git a/src/testdir/test_plugin_zip.vim b/src/testdir/test_plugin_zip.vim index c46a3efc0d..cba7851fe2 100644 --- a/src/testdir/test_plugin_zip.vim +++ b/src/testdir/test_plugin_zip.vim @@ -16,10 +16,21 @@ def CopyZipFile(source: string) enddef def g:Test_zip_basic() + ### Check load once + assert_true(!exists("g:loaded_zip"), "Test config: now the zip autoload should not be loaded.") + + ### Windows OS: PowerShell fallback should be manually set up + if &shell =~? 'cmd' + g:zip_pwsh = 'powershell' + endif + CopyZipFile("test.zip") defer delete("X.zip") e X.zip + ### Check load once + assert_true(exists("g:loaded_zip")) + ### Check header assert_match('^" zip\.vim version v\d\+', getline(1)) assert_match('^" Browsing zipfile .*/X\.zip', getline(2)) @@ -83,6 +94,11 @@ def g:Test_zip_basic() assert_equal("X.zip", @%) bw + ### Windows OS: PowerShell fallback + if has('win32') + return + endif + ### Check opening zip when "unzip" program is missing var save_zip_unzipcmd = g:zip_unzipcmd g:zip_unzipcmd = "/" @@ -138,6 +154,23 @@ def g:Test_zip_basic() bw enddef +def g:Test_zip_windows_powershell() + CheckMSWindows + ### TODO: add more test for powershell fallback + + ### Check opening an no zipfile + writefile(["qsdf"], "Xcorupt.zip", "D") + e! Xcorupt.zip + assert_equal("qsdf", getline(1)) + + bw + + ### Check no existing zipfile + assert_match('File not readable', execute("e Xnot_exists.zip")) + + bw +enddef + def g:Test_zip_glob_fname() CheckNotMSWindows # does not work on Windows, why? diff --git a/src/version.c b/src/version.c index cf15655d71..7d8f14d742 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 984, /**/ 983, /**/ From ee1517df53bc34f22f501c56ec6773df1fc0c484 Mon Sep 17 00:00:00 2001 From: Shay Hill Date: Wed, 19 Aug 2026 22:03:04 +0000 Subject: [PATCH 399/647] runtime(pov): nested pov comments break highlighting A line comment nested in a block comment (the comment plugin uses a block comment on every line) break syntax highlighting and shade the rest of the file as a comment. closes: #21109 Signed-off-by: Shay Hill Signed-off-by: Christian Brabandt --- runtime/syntax/pov.vim | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/runtime/syntax/pov.vim b/runtime/syntax/pov.vim index 87b2aa5804..5d1be9adf5 100644 --- a/runtime/syntax/pov.vim +++ b/runtime/syntax/pov.vim @@ -3,6 +3,7 @@ " Maintainer: David Necas (Yeti) " Last Change: 2011-04-23 " 2025 Apr 21 by Vim Project (deprecate render and statistics #17177) +" 2026 Aug 20 by Vim Project (allow nesting of different comments #21109) " Setup " quit when a syntax file was already loaded @@ -70,10 +71,10 @@ syn match povConsts "\<[tuvxyz]\>" syn match povDotItem "\.\@<=\(blue\|green\|gray\|filter\|red\|transmit\|hf\|t\|u\|v\|x\|y\|z\)\>" display " Comments -syn region povComment start="/\*" end="\*/" contains=povTodo,povComment -syn match povComment "//.*" contains=povTodo +syn region povBlockComment start="/\*" end="\*/" contains=povTodo,povBlockComment +syn match povLineComment "//.*" contains=povTodo syn match povCommentError "\*/" -syn sync ccomment povComment +syn sync ccomment povBlockComment syn sync minlines=50 syn keyword povTodo TODO FIXME XXX NOT contained syn cluster povPRIVATE add=povTodo @@ -105,7 +106,8 @@ syn match povBraceError "}" syn match povNumber "\(^\|\W\)\@<=[+-]\=\(\d\+\)\=\.\=\d\+\([eE][+-]\=\d\+\)\=" " Define the default highlighting -hi def link povComment Comment +hi def link povBlockComment Comment +hi def link povLineComment Comment hi def link povTodo Todo hi def link povNumber Number hi def link povString String From 3c8296fc4ff924ae2d05feab945b719e1cfafac3 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Wed, 19 Aug 2026 22:12:26 +0000 Subject: [PATCH 400/647] runtime(colors): update colorschemes closes: #21108 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/colors/desert.vim | 22 +++++++++++++++++----- runtime/colors/habamax.vim | 31 ++++++++++++++++--------------- runtime/colors/slate.vim | 22 +++++++++++++++++----- runtime/colors/wildcharm.vim | 5 +++-- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/runtime/colors/desert.vim b/runtime/colors/desert.vim index 02c6371b69..9e8e0fa7dc 100644 --- a/runtime/colors/desert.vim +++ b/runtime/colors/desert.vim @@ -4,9 +4,9 @@ " Maintainer: Original maintainer Hans Fugal " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Apr 24 +" Last Change: 2026 Aug 20 -" Generated by Colortemplate v3.0.0-rc1 +" Generated by Colortemplate v3.0.0-rc2 set background=dark @@ -53,14 +53,18 @@ hi Folded guifg=#eeee00 guibg=#4d4d4d guisp=NONE gui=NONE ctermfg=226 ctermbg=23 hi Identifier guifg=#89fb98 guibg=NONE guisp=NONE gui=NONE ctermfg=120 ctermbg=NONE cterm=NONE term=NONE hi Ignore guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=NONE hi IncSearch guifg=#f0e68c guibg=#cd853f guisp=NONE gui=NONE ctermfg=186 ctermbg=172 cterm=NONE term=bold,reverse,underline -hi LineNr guifg=#eeee00 guibg=NONE guisp=NONE gui=NONE ctermfg=226 ctermbg=NONE cterm=NONE term=NONE +hi LineNr guifg=#666666 guibg=NONE guisp=NONE gui=NONE ctermfg=241 ctermbg=NONE cterm=NONE term=NONE hi MatchParen guifg=#7f7f8c guibg=#bdb76b guisp=NONE gui=NONE ctermfg=242 ctermbg=143 cterm=NONE term=bold,underline hi ModeMsg guifg=#ffde9b guibg=NONE guisp=NONE gui=bold ctermfg=222 ctermbg=NONE cterm=bold term=bold hi MoreMsg guifg=#9acd32 guibg=NONE guisp=NONE gui=bold ctermfg=112 ctermbg=NONE cterm=bold term=NONE hi NonText guifg=#6dceeb guibg=#4d4d4d guisp=NONE gui=NONE ctermfg=81 ctermbg=239 cterm=NONE term=NONE hi Pmenu guifg=#ffffff guibg=#666666 guisp=NONE gui=NONE ctermfg=231 ctermbg=241 cterm=NONE term=reverse -hi PmenuMatch guifg=#ffa0a0 guibg=#666666 guisp=NONE gui=NONE ctermfg=217 ctermbg=241 cterm=NONE term=NONE -hi PmenuMatchSel guifg=#cd5c5c guibg=#f0e68c guisp=NONE gui=NONE ctermfg=167 ctermbg=186 cterm=NONE term=NONE +hi PmenuExtra guifg=#bdb76b guibg=#666666 guisp=NONE gui=NONE ctermfg=143 ctermbg=241 cterm=NONE term=reverse +hi PmenuExtraSel guifg=#333333 guibg=#f0e68c guisp=NONE gui=NONE ctermfg=236 ctermbg=186 cterm=NONE term=NONE +hi PmenuKind guifg=#f0e68c guibg=#666666 guisp=NONE gui=NONE ctermfg=186 ctermbg=241 cterm=NONE term=reverse +hi PmenuKindSel guifg=#333333 guibg=#f0e68c guisp=NONE gui=NONE ctermfg=236 ctermbg=186 cterm=NONE term=NONE +hi PmenuMatch guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold +hi PmenuMatchSel guifg=NONE guibg=#f0e68c guisp=NONE gui=bold ctermfg=NONE ctermbg=186 cterm=bold term=bold hi PmenuSbar guifg=NONE guibg=#333333 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=reverse hi PmenuSel guifg=#333333 guibg=#f0e68c guisp=NONE gui=NONE ctermfg=236 ctermbg=186 cterm=NONE term=bold hi PmenuThumb guifg=NONE guibg=#c2bfa5 guisp=NONE gui=NONE ctermfg=NONE ctermbg=144 cterm=NONE term=NONE @@ -136,6 +140,10 @@ if s:t_Co >= 16 hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold hi NonText ctermfg=blue ctermbg=NONE cterm=NONE hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuExtra ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuExtraSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuKind ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuKindSel ctermfg=black ctermbg=yellow cterm=NONE hi PmenuMatch ctermfg=NONE ctermbg=darkgrey cterm=bold hi PmenuMatchSel ctermfg=black ctermbg=yellow cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE @@ -206,6 +214,10 @@ if s:t_Co >= 8 hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuExtra ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuExtraSel ctermfg=black ctermbg=darkyellow cterm=NONE + hi PmenuKind ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuKindSel ctermfg=black ctermbg=darkyellow cterm=NONE hi PmenuMatch ctermfg=black ctermbg=darkcyan cterm=bold hi PmenuMatchSel ctermfg=black ctermbg=darkyellow cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE diff --git a/runtime/colors/habamax.vim b/runtime/colors/habamax.vim index 6ebe8a3d17..0e41b8ca27 100644 --- a/runtime/colors/habamax.vim +++ b/runtime/colors/habamax.vim @@ -3,9 +3,9 @@ " Author: Maxim Kim " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Aug 07 +" Last Change: 2026 Aug 19 -" Generated by Colortemplate v3.0.0-rc1 +" Generated by Colortemplate v3.0.0-rc2 set background=dark @@ -15,7 +15,7 @@ let g:colors_name = 'habamax' let s:t_Co = has('gui_running') ? 16777216 : str2nr(&t_Co) let s:tgc = has('termguicolors') && &termguicolors -let g:terminal_ansi_colors = ['#1c1c1c', '#af5f5f', '#5faf5f', '#af875f', '#5f87af', '#af87af', '#5f8787', '#9e9e9e', '#767676', '#d75f87', '#87d787', '#d7af87', '#5fafd7', '#d787d7', '#87afaf', '#c7c7c7'] +let g:terminal_ansi_colors = ['#1c1c1c', '#af5f5f', '#87af87', '#af875f', '#5f87af', '#af87af', '#5f8787', '#c7c7c7', '#767676', '#d75f87', '#87d787', '#d7af87', '#5fafd7', '#d787d7', '#87afaf', '#eeeeee'] hi! link CurSearch IncSearch hi! link CursorLineFold FoldColumn @@ -51,7 +51,8 @@ hi! link lspDiagVirtualTextError Removed hi! link markdownCodeDelimiter Special hi! link markdownHeadingDelimiter Type hi! link markdownHeadingRule Type -hi! link markdownId String +hi! link markdownId Constant +hi! link markdownIdDeclaration Constant hi! link markdownLinkText String hi! link markdownListMarker PreProc hi! link markdownUrl Underlined @@ -71,15 +72,15 @@ hi! link yamlBlockMappingKey Statement hi Normal guifg=#c7c7c7 guibg=#1c1c1c guisp=NONE gui=NONE ctermfg=251 ctermbg=234 cterm=NONE term=NONE hi Added guifg=#5fd75f guibg=NONE guisp=NONE gui=NONE ctermfg=77 ctermbg=NONE cterm=NONE term=NONE hi Changed guifg=#ffaf5f guibg=NONE guisp=NONE gui=NONE ctermfg=215 ctermbg=NONE cterm=NONE term=NONE -hi Character guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE cterm=NONE term=NONE +hi Character guifg=#87af87 guibg=NONE guisp=NONE gui=NONE ctermfg=108 ctermbg=NONE cterm=NONE term=NONE hi ColorColumn guifg=NONE guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=reverse hi Comment guifg=#767676 guibg=NONE guisp=NONE gui=NONE ctermfg=243 ctermbg=NONE cterm=NONE term=bold hi Conceal guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi Constant guifg=#d7af87 guibg=NONE guisp=NONE gui=NONE ctermfg=180 ctermbg=NONE cterm=NONE term=NONE -hi Cursor guifg=#000000 guibg=#dadada guisp=NONE gui=NONE ctermfg=16 ctermbg=253 cterm=NONE term=reverse +hi Cursor guifg=#1c1c1c guibg=#eeeeee guisp=NONE gui=NONE ctermfg=234 ctermbg=255 cterm=NONE term=reverse hi CursorColumn guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=NONE hi CursorLine guifg=NONE guibg=#303030 guisp=NONE gui=NONE ctermfg=NONE ctermbg=236 cterm=NONE term=underline -hi CursorLineNr guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold +hi CursorLineNr guifg=#eeeeee guibg=NONE guisp=NONE gui=bold ctermfg=255 ctermbg=NONE cterm=bold term=bold hi Debug guifg=#5f8787 guibg=NONE guisp=NONE gui=NONE ctermfg=66 ctermbg=NONE cterm=NONE term=NONE hi DiffAdd guifg=NONE guibg=#273923 guisp=NONE gui=NONE ctermfg=247 ctermbg=22 cterm=NONE term=reverse hi DiffChange guifg=NONE guibg=#37352f guisp=NONE gui=NONE ctermfg=247 ctermbg=237 cterm=NONE term=NONE @@ -97,7 +98,7 @@ hi IncSearch guifg=NONE guibg=#5a4a45 guisp=NONE gui=NONE ctermfg=215 ctermbg=23 hi LineNr guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi MatchParen guifg=#ff00af guibg=NONE guisp=NONE gui=bold ctermfg=199 ctermbg=NONE cterm=bold term=bold,underline hi ModeMsg guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=bold -hi MoreMsg guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE cterm=NONE term=NONE +hi MoreMsg guifg=#87af87 guibg=NONE guisp=NONE gui=NONE ctermfg=108 ctermbg=NONE cterm=NONE term=NONE hi NonText guifg=#585858 guibg=NONE guisp=NONE gui=NONE ctermfg=240 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=NONE ctermbg=237 cterm=NONE term=reverse hi PmenuBorder guifg=#767676 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=243 ctermbg=237 cterm=NONE term=NONE @@ -105,8 +106,8 @@ hi PmenuExtra guifg=#767676 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=243 ctermb hi PmenuExtraSel guifg=#9e9e9e guibg=#585858 guisp=NONE gui=NONE ctermfg=247 ctermbg=240 cterm=NONE term=NONE hi PmenuKind guifg=#5f8787 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=66 ctermbg=237 cterm=NONE term=reverse hi PmenuKindSel guifg=#5f8787 guibg=#585858 guisp=NONE gui=NONE ctermfg=66 ctermbg=240 cterm=NONE term=NONE -hi PmenuMatch guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold -hi PmenuMatchSel guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold +hi PmenuMatch guifg=#eeeeee guibg=NONE guisp=NONE gui=bold ctermfg=255 ctermbg=NONE cterm=bold term=bold +hi PmenuMatchSel guifg=#eeeeee guibg=NONE guisp=NONE gui=bold ctermfg=255 ctermbg=NONE cterm=bold term=bold hi PmenuSbar guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=reverse hi PmenuSel guifg=NONE guibg=#585858 guisp=NONE gui=NONE ctermfg=NONE ctermbg=240 cterm=NONE term=bold hi PmenuShadow guifg=#767676 guibg=#121212 guisp=NONE gui=NONE ctermfg=243 ctermbg=233 cterm=NONE term=NONE @@ -116,7 +117,7 @@ hi PopupBorder guifg=#767676 guibg=#3a3a3a guisp=NONE gui=NONE ctermfg=243 cterm hi PopupTitle guifg=#9e9e9e guibg=#3a3a3a guisp=NONE gui=bold ctermfg=247 ctermbg=237 cterm=bold term=bold hi PreProc guifg=#af875f guibg=NONE guisp=NONE gui=NONE ctermfg=137 ctermbg=NONE cterm=NONE term=NONE hi Question guifg=#d7af87 guibg=NONE guisp=NONE gui=NONE ctermfg=180 ctermbg=NONE cterm=NONE term=standout -hi QuickFixLine guifg=NONE guibg=#4f2f4f guisp=NONE gui=NONE ctermfg=251 ctermbg=53 cterm=NONE term=NONE +hi QuickFixLine guifg=NONE guibg=#4f2f4f guisp=NONE gui=NONE ctermfg=255 ctermbg=53 cterm=NONE term=NONE hi Removed guifg=#d75f5f guibg=NONE guisp=NONE gui=NONE ctermfg=167 ctermbg=NONE cterm=NONE term=NONE hi Search guifg=NONE guibg=#374a44 guisp=NONE gui=NONE ctermfg=114 ctermbg=234 cterm=reverse term=reverse hi SignColumn guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse @@ -129,14 +130,14 @@ hi SpellRare guifg=NONE guibg=NONE guisp=#d787d7 gui=undercurl ctermfg=176 cterm hi Statement guifg=#af87af guibg=NONE guisp=NONE gui=NONE ctermfg=139 ctermbg=NONE cterm=NONE term=NONE hi StatusLine guifg=#1c1c1c guibg=#9e9e9e guisp=NONE gui=NONE ctermfg=234 ctermbg=247 cterm=NONE term=bold,reverse hi StatusLineNC guifg=#1c1c1c guibg=#767676 guisp=NONE gui=NONE ctermfg=234 ctermbg=243 cterm=NONE term=bold,underline -hi String guifg=#5faf5f guibg=NONE guisp=NONE gui=NONE ctermfg=71 ctermbg=NONE cterm=NONE term=NONE +hi String guifg=#87af87 guibg=NONE guisp=NONE gui=NONE ctermfg=108 ctermbg=NONE cterm=NONE term=NONE hi TabLine guifg=#1c1c1c guibg=#767676 guisp=NONE gui=NONE ctermfg=234 ctermbg=243 cterm=NONE term=bold,underline hi TabLineFill guifg=#1c1c1c guibg=#767676 guisp=NONE gui=NONE ctermfg=234 ctermbg=243 cterm=NONE term=NONE hi TabLineSel guifg=#1c1c1c guibg=#9e9e9e guisp=NONE gui=bold ctermfg=234 ctermbg=247 cterm=bold term=bold,reverse hi Title guifg=NONE guibg=NONE guisp=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold term=NONE -hi TitleBar guifg=#dadada guibg=#3c3c3c guisp=NONE gui=NONE ctermfg=253 ctermbg=237 cterm=NONE term=NONE +hi TitleBar guifg=#eeeeee guibg=#3c3c3c guisp=NONE gui=NONE ctermfg=255 ctermbg=237 cterm=NONE term=NONE hi TitleBarNC guifg=#767676 guibg=#2c2c2c guisp=NONE gui=NONE ctermfg=243 ctermbg=236 cterm=NONE term=NONE -hi Todo guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold,reverse +hi Todo guifg=#eeeeee guibg=NONE guisp=NONE gui=bold ctermfg=255 ctermbg=NONE cterm=bold term=bold,reverse hi ToolbarButton guifg=#5f8787 guibg=#1c1c1c guisp=NONE gui=bold,reverse ctermfg=66 ctermbg=234 cterm=bold,reverse term=bold,reverse hi ToolbarLine guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE term=reverse hi Type guifg=#5f87af guibg=NONE guisp=NONE gui=NONE ctermfg=67 ctermbg=NONE cterm=NONE term=NONE @@ -149,7 +150,7 @@ hi WarningMsg guifg=#d75f87 guibg=NONE guisp=NONE gui=NONE ctermfg=168 ctermbg=N hi WildMenu guifg=#1c1c1c guibg=#d7af87 guisp=NONE gui=bold ctermfg=234 ctermbg=180 cterm=bold term=bold hi debugBreakpoint guifg=#1c1c1c guibg=#d75f87 guisp=NONE gui=NONE ctermfg=234 ctermbg=168 cterm=NONE term=NONE hi debugPC guifg=#1c1c1c guibg=#5f87af guisp=NONE gui=NONE ctermfg=234 ctermbg=67 cterm=NONE term=NONE -hi htmlH1 guifg=#dadada guibg=NONE guisp=NONE gui=bold ctermfg=253 ctermbg=NONE cterm=bold term=bold +hi htmlH1 guifg=#eeeeee guibg=NONE guisp=NONE gui=bold ctermfg=255 ctermbg=NONE cterm=bold term=bold hi lCursor guifg=#1c1c1c guibg=#5fff00 guisp=NONE gui=NONE ctermfg=234 ctermbg=82 cterm=NONE term=NONE if s:tgc || s:t_Co >= 256 diff --git a/runtime/colors/slate.vim b/runtime/colors/slate.vim index ce9d26900c..a649dde115 100644 --- a/runtime/colors/slate.vim +++ b/runtime/colors/slate.vim @@ -4,9 +4,9 @@ " Maintainer: Original maintainer Ralph Amissah " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Apr 27 +" Last Change: 2026 Aug 20 -" Generated by Colortemplate v3.0.0-rc1 +" Generated by Colortemplate v3.0.0-rc2 set background=dark @@ -59,8 +59,12 @@ hi MoreMsg guifg=#00875f guibg=NONE guisp=NONE gui=NONE ctermfg=29 ctermbg=NONE hi NonText guifg=#5f87d7 guibg=NONE guisp=NONE gui=NONE ctermfg=68 ctermbg=NONE cterm=NONE term=NONE hi Operator guifg=#d7875f guibg=NONE guisp=NONE gui=NONE ctermfg=173 ctermbg=NONE cterm=NONE term=NONE hi Pmenu guifg=NONE guibg=#4a4a4a guisp=NONE gui=NONE ctermfg=NONE ctermbg=239 cterm=NONE term=reverse -hi PmenuMatch guifg=#d7875f guibg=#4a4a4a guisp=NONE gui=NONE ctermfg=173 ctermbg=239 cterm=NONE term=NONE -hi PmenuMatchSel guifg=#d7875f guibg=#d7d787 guisp=NONE gui=NONE ctermfg=173 ctermbg=186 cterm=NONE term=NONE +hi PmenuExtra guifg=#afaf87 guibg=#4a4a4a guisp=NONE gui=NONE ctermfg=144 ctermbg=239 cterm=NONE term=reverse +hi PmenuExtraSel guifg=#262626 guibg=#d7d787 guisp=NONE gui=NONE ctermfg=235 ctermbg=186 cterm=NONE term=NONE +hi PmenuKind guifg=#ffd700 guibg=#4a4a4a guisp=NONE gui=NONE ctermfg=220 ctermbg=239 cterm=NONE term=reverse +hi PmenuKindSel guifg=#262626 guibg=#d7d787 guisp=NONE gui=NONE ctermfg=235 ctermbg=186 cterm=NONE term=NONE +hi PmenuMatch guifg=#d7875f guibg=NONE guisp=NONE gui=bold ctermfg=173 ctermbg=NONE cterm=bold term=bold +hi PmenuMatchSel guifg=NONE guibg=#d7d787 guisp=NONE gui=bold ctermfg=NONE ctermbg=186 cterm=bold term=bold hi PmenuSbar guifg=NONE guibg=#262626 guisp=NONE gui=NONE ctermfg=NONE ctermbg=235 cterm=NONE term=reverse hi PmenuSel guifg=#262626 guibg=#d7d787 guisp=NONE gui=NONE ctermfg=235 ctermbg=186 cterm=NONE term=bold hi PmenuThumb guifg=NONE guibg=#ffd700 guisp=NONE gui=NONE ctermfg=NONE ctermbg=220 cterm=NONE term=NONE @@ -140,6 +144,10 @@ if s:t_Co >= 16 hi NonText ctermfg=blue ctermbg=NONE cterm=NONE hi Operator ctermfg=red ctermbg=NONE cterm=NONE hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuExtra ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuExtraSel ctermfg=black ctermbg=darkmagenta cterm=NONE + hi PmenuKind ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuKindSel ctermfg=black ctermbg=darkmagenta cterm=NONE hi PmenuMatch ctermfg=black ctermbg=darkgrey cterm=bold hi PmenuMatchSel ctermfg=black ctermbg=darkmagenta cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE @@ -186,7 +194,7 @@ endif if s:t_Co >= 8 hi Normal ctermfg=grey ctermbg=black cterm=NONE hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE - hi Comment ctermfg=darkgray ctermbg=NONE cterm=bold + hi Comment ctermfg=grey ctermbg=NONE cterm=bold hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE hi Constant ctermfg=darkyellow ctermbg=NONE cterm=NONE hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline @@ -214,6 +222,10 @@ if s:t_Co >= 8 hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold hi Operator ctermfg=darkred ctermbg=NONE cterm=bold hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuExtra ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuExtraSel ctermfg=black ctermbg=darkyellow cterm=NONE + hi PmenuKind ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuKindSel ctermfg=black ctermbg=darkyellow cterm=NONE hi PmenuMatch ctermfg=black ctermbg=darkcyan cterm=bold hi PmenuMatchSel ctermfg=black ctermbg=darkyellow cterm=bold hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE diff --git a/runtime/colors/wildcharm.vim b/runtime/colors/wildcharm.vim index b28dbba5e2..5c4e6b2047 100644 --- a/runtime/colors/wildcharm.vim +++ b/runtime/colors/wildcharm.vim @@ -3,9 +3,9 @@ " Author: Maxim Kim " URL: https://github.com/vim/colorschemes " License: Same as Vim -" Last Change: 2026 Aug 07 +" Last Change: 2026 Aug 12 -" Generated by Colortemplate v3.0.0-rc1 +" Generated by Colortemplate v3.0.0-rc2 hi clear let g:colors_name = 'wildcharm' @@ -30,6 +30,7 @@ hi! link markdownCodeDelimiter Special hi! link markdownHeadingDelimiter Type hi! link markdownHeadingRule Type hi! link markdownId String +hi! link markdownIdDeclaration Constant hi! link markdownLinkText String hi! link markdownListMarker PreProc hi! link markdownUrl Underlined From fb4866a2dd58c4479418a9aea649db786e8750c6 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 20 Aug 2026 19:08:54 +0000 Subject: [PATCH 401/647] patch 9.2.0985: Multiline messages not visible when mapping starts cmdline Problem: Multiline messages exceeding 'cmdheight' not visible when a mapping starts cmdline immediately after it (after 9.2.0967). Solution: Revert patch 9.2.0967 and use a different solution (zeertzjq). fixes: #21098 closes: #21101 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- runtime/doc/message.txt | 5 ++++- src/message.c | 18 ++++++++---------- src/testdir/test_messages.vim | 27 ++++++++++++++++++++------- src/version.c | 2 ++ 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt index 6a39e3f013..28de28eddb 100644 --- a/runtime/doc/message.txt +++ b/runtime/doc/message.txt @@ -1,4 +1,4 @@ -*message.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*message.txt* For Vim version 9.2. Last change: 2026 Aug 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -854,6 +854,9 @@ and the screen is about to be redrawn: If you accidentally hit or and you want to see the displayed text then use |g<|. This only works when 'more' is set. +Keys that have not been typed dismiss the prompt and are handled as normal +commands. + To reduce the number of hit-enter prompts: - Set 'messagesopt'. - Set 'cmdheight' to 2 or higher. diff --git a/src/message.c b/src/message.c index 1eecb053a1..2a1461bbab 100644 --- a/src/message.c +++ b/src/message.c @@ -1287,12 +1287,10 @@ wait_return(int redraw) c = CAR; // no need for a return in ex mode got_int = FALSE; } - else if (!stuff_empty() || !typebuf_typed()) - // When there are stuffed characters or pending mapped characters, the - // next character will dismiss the hit-enter prompt immediately. A - // stuffed character then has to be put back, while a mapped character - // may even be swallowed (e.g. "g" treated as a message-scrollback key), - // so instead just don't show the hit-enter prompt at all. + else if (!stuff_empty()) + // When there are stuffed characters, the next stuffed character will + // dismiss the hit-enter prompt immediately and have to be put back, so + // instead just don't show the hit-enter prompt at all. c = CAR; else { @@ -1348,7 +1346,7 @@ wait_return(int redraw) // at the hit-enter prompt. Use CTRL-Y, because the same is // used in Cmdline-mode and it's harmless when there is no // selection. - if (c == Ctrl_Y && clip_star.state == SELECT_DONE) + if (KeyTyped && c == Ctrl_Y && clip_star.state == SELECT_DONE) { clip_copy_modeless_selection(TRUE); c = K_IGNORE; @@ -1361,7 +1359,7 @@ wait_return(int redraw) * screen, to avoid that typing one 'j' too many makes the * messages disappear. */ - if (p_more && !p_cp) + if (KeyTyped && p_more && !p_cp) { if (c == 'b' || c == Ctrl_B || c == 'k' || c == 'u' || c == 'g' || c == K_UP || c == K_PAGEUP) @@ -1421,8 +1419,8 @@ wait_return(int redraw) if (c == K_LEFTMOUSE || c == K_MIDDLEMOUSE || c == K_RIGHTMOUSE || c == K_X1MOUSE || c == K_X2MOUSE) (void)jump_to_mouse(MOUSE_SETPOS, NULL, 0); - else if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C - && c != 'q') + else if (!KeyTyped || (vim_strchr((char_u *)"\r\n ", c) == NULL + && c != Ctrl_C && c != 'q')) { // Put the character back in the typeahead buffer. Don't use // the stuff buffer, because lmaps wouldn't work. diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim index b628a28e82..1ab80294a8 100644 --- a/src/testdir/test_messages.vim +++ b/src/testdir/test_messages.vim @@ -813,29 +813,42 @@ func Test_long_formatprg_no_hit_enter() call StopVimInTerminal(buf) endfunc -" A message shown while a mapping is still being processed must not raise a -" hit-enter prompt that eats the mapping's remaining keys. -func Test_hit_enter_no_eat_mapped_keys() +" A message shown while a mapping is still being processed must not eat the +" mapping's remaining keys. +" If a mapping starts cmdline after multiline messages exceeding 'cmdheight', +" the messages should still be visible. +func Test_hit_enter_during_mapping() CheckRunVimInTerminal let lines =<< trim END set ruler call setline(1, range(1, 20)) - " The 8-line :echo scrolls the screen and would raise a hit-enter prompt; - " the mapping then runs "gg" to move the cursor to line 1. + " The 8-line :echo leads to a hit-enter prompt. nnoremap X :echo "a\nb\nc\nd\ne\nf\ng\nh"gg + nnoremap \b :echo "a\nb\nc\nd\ne\nf\ng\nh":b normal! 10G END call writefile(lines, 'XtestHitEnterMap', 'D') let buf = RunVimInTerminal('-S XtestHitEnterMap', #{rows: 10}) - call WaitForAssert({-> assert_match('10,1', term_getline(buf, 10))}) + call WaitForAssert({-> assert_match(' 10,1 ', term_getline(buf, 10))}) call term_sendkeys(buf, "X") " Without the fix the hit-enter prompt eats the mapping's "g" keys and the " cursor stays put. With the fix "gg" runs and moves the cursor to line 1. - call WaitForAssert({-> assert_match('1,1', term_getline(buf, 10))}) + call WaitForAssert({-> assert_match(' 1,1 ', term_getline(buf, 10))}) call assert_notmatch('Press ENTER', term_getline(buf, 10)) + call term_sendkeys(buf, '\b') + call WaitForAssert({-> assert_match('^:b ', term_getline(buf, 10))}) + call assert_match('^a *$', term_getline(buf, 2)) + call assert_match('^b *$', term_getline(buf, 3)) + call assert_match('^c *$', term_getline(buf, 4)) + call assert_match('^d *$', term_getline(buf, 5)) + call assert_match('^e *$', term_getline(buf, 6)) + call assert_match('^f *$', term_getline(buf, 7)) + call assert_match('^g *$', term_getline(buf, 8)) + call assert_match('^h *$', term_getline(buf, 9)) + " clean up call StopVimInTerminal(buf) endfunc diff --git a/src/version.c b/src/version.c index 7d8f14d742..535e5df2b5 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 985, /**/ 984, /**/ From 76f1eed3a5f8fe12a7b01725a99c582a95e69000 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 20 Aug 2026 19:35:57 +0000 Subject: [PATCH 402/647] runtime(doc): clarify how setbufvar() handles window options related: #21089 closes: #21104 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 737cac1fee..9effcec549 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 18 +*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -9984,9 +9984,13 @@ setbufline({buf}, {lnum}, {text}) *setbufline()* setbufvar({buf}, {varname}, {val}) *setbufvar()* Set option or local variable {varname} in buffer {buf} to {val}. - This also works for a global or local window option, but it - doesn't work for a global or local window variable. - For a local window option the global value is unchanged. + This also works for a global option or a window-local option, + but it doesn't work for a global or local window variable. A + window-local option is set in a window of the current tab page + that displays {buf}, and the global value is unchanged. When + no window in the current tab page displays {buf} the option is + not set and no error is given; use |setwinvar()| or + |win_execute()| for that. For the use of {buf}, see |bufname()| above. The {varname} argument is a string. Note that the variable name without "b:" must be used. From 5eaa0f4ddaeeb07868af5a30699f75d03f9f3d23 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Thu, 20 Aug 2026 19:56:26 +0000 Subject: [PATCH 403/647] patch 9.2.0986: long options are accepted with a trailing garbage Problem: long options are accepted with a trailing garbage Solution: Compare the whole option name instead of a prefix (Christoffer Aasted) closes: #21088 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/main.c | 10 +++++----- src/testdir/test_startup.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 95d0494a15..7b5f6aa4ce 100644 --- a/src/main.c +++ b/src/main.c @@ -1921,7 +1921,7 @@ early_arg_scan(mparm_T *parmp UNUSED) # endif } # ifdef FEAT_CLIENTSERVER_BACKENDS - else if (STRNICMP(argv[i], "--clientserver", 14) == 0) + else if (STRICMP(argv[i], "--clientserver") == 0) { char_u *arg; if (i == argc - 1) @@ -2263,13 +2263,13 @@ command_line_scan(mparm_T *parmp) argv_idx += 3; } # ifdef FEAT_CLIENTSERVER - else if (STRNICMP(argv[0] + argv_idx, "serverlist", 10) == 0) + else if (STRICMP(argv[0] + argv_idx, "serverlist") == 0) ; // already processed -- no arg - else if (STRNICMP(argv[0] + argv_idx, "servername", 10) == 0 - || STRNICMP(argv[0] + argv_idx, "serversend", 10) == 0 + else if (STRICMP(argv[0] + argv_idx, "servername") == 0 + || STRICMP(argv[0] + argv_idx, "serversend") == 0 // Don't put this under FEAT_CLIENTSERVER_BACKENDS, just // let it be ignored. Makes tests less complicated - || STRNICMP(argv[0] + argv_idx, "clientserver", 12) == 0 + || STRICMP(argv[0] + argv_idx, "clientserver") == 0 ) { // already processed -- snatch the following arg diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim index 04e4447b05..aaaf0bb410 100644 --- a/src/testdir/test_startup.vim +++ b/src/testdir/test_startup.vim @@ -985,6 +985,28 @@ func Test_v_argv() call assert_equal(['arg1', '--cmd', 'echo v:argv', '--cmd', 'q'']'], list[idx:]) endfunc +func Test_longopt_prefix_not_accepted() + CheckNotGui + CheckFeature clientserver + + let command = printf('%s -es -X -i NONE -n', GetVimCommand()) + for args in ['--serverlistx', + \ '--servername=XtestName', + \ '--serversend=foo', + \ '--clientserver=socket'] + let out = system($'{command} {args}') + call assert_notequal(0, v:shell_error, args) + call assert_match('Unknown option', out, args) + endfor + + " The documented forms still work. + for args in ['--servername XtestName --serverlist', + \ '--servername XtestName -c quit'] + call system($'{command} {args}') + call assert_equal(0, v:shell_error, args) + endfor +endfunc + " Test for the "-r" recovery mode option func Test_r_arg() " Can't catch the output of gvim. diff --git a/src/version.c b/src/version.c index 535e5df2b5..dab9b2df29 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 986, /**/ 985, /**/ From 6073903cda7b5838f3432b19a0e8293f494b4cd5 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 20 Aug 2026 20:10:56 +0000 Subject: [PATCH 404/647] patch 9.2.0987: heap-buffer-overflow in spell_suggest() Problem: Heap-buffer-overflow in spell_suggest() when the cursor is beyond the end of the line, because a SpellFileMissing autocommand changed the buffer (dvaave2025). Solution: parse_spelllang() may run autocommands, so validate the cursor position and re-take the saved position afterwards. fixes: #21097 closes: #21100 Supported by AI. Signed-off-by: Christian Brabandt --- src/spellsuggest.c | 3 +++ src/testdir/test_spell.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 24 insertions(+) diff --git a/src/spellsuggest.c b/src/spellsuggest.c index 866eedf31b..ec3f1efc65 100644 --- a/src/spellsuggest.c +++ b/src/spellsuggest.c @@ -484,6 +484,9 @@ spell_suggest(int count) parse_spelllang(curwin); curwin->w_p_spell = TRUE; } + // Autocommands may have changed the buffer and made the cursor invalid + check_cursor(); + prev_cursor = curwin->w_cursor; if (*curwin->w_s->b_p_spl == NUL) { diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim index bd8185a09c..c849df1dc2 100644 --- a/src/testdir/test_spell.vim +++ b/src/testdir/test_spell.vim @@ -1613,4 +1613,23 @@ func Test_spelldump_prefixtree_overflow() bwipe! endfunc +" This was using the cursor position from before a SpellFileMissing +" autocommand made the line shorter. +func Test_spell_file_missing_z_equal() + new + call setline(1, repeat('a', 40)) + call cursor(1, 30) + set spelllang=xy + au SpellFileMissing * call setline(1, 'ab') + + " The language cannot be loaded, so z= reports E756; the invalid cursor + " position was used before that error reached the script level. + silent! norm! z= + call assert_equal('ab', getline(1)) + + au! SpellFileMissing + set nospell spelllang=en + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index dab9b2df29..2242f7125f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 987, /**/ 986, /**/ From f2685bdf438ffa83013fd5e2330c854ec123455a Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 20 Aug 2026 20:27:16 +0000 Subject: [PATCH 405/647] patch 9.2.0988: tests: Test_terminal_csi_resize_oob() returns early Problem: Test_terminal_csi_resize_oob() returns early, so does not test what it was supposed to test (after v9.2.0569). Solution: Remove the stray "return" and enable the test. related: #21099 Signed-off-by: Christian Brabandt --- src/testdir/test_terminal3.vim | 1 - src/version.c | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index ae773279eb..7d67d6f688 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1338,7 +1338,6 @@ endfunc " This caused a Crash func Test_terminal_csi_resize_oob() - return CheckUnix CheckExecutable printf diff --git a/src/version.c b/src/version.c index 2242f7125f..a8698a9fdb 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 988, /**/ 987, /**/ From 785bb3e9b271eb377dbd4157ce281eac7f16a021 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 20 Aug 2026 20:46:08 +0000 Subject: [PATCH 406/647] patch 9.2.0989: libvterm: hang when rendering REP with no preceding char MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: When libvterm receives the REP control (CSI b) it repeats the preceding graphic character by advancing the cursor by "combine_width". When a graphic char was yet not printed, this resulted in an endless loop (Vadím Sukhomlínov). Solution: Ignore REP when no graphic character was printed yet, like xterm does. related: #21099 Signed-off-by: Christian Brabandt Co-Authored-By: Claude Opus 5 (1M context) --- src/libvterm/src/state.c | 7 +++++++ src/testdir/test_terminal3.vim | 23 +++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 32 insertions(+) diff --git a/src/libvterm/src/state.c b/src/libvterm/src/state.c index 70bce0a236..7a9732b581 100644 --- a/src/libvterm/src/state.c +++ b/src/libvterm/src/state.c @@ -1323,6 +1323,13 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha case 0x62: { // REP - ECMA-48 8.3.103 const int row_width = THISROWWIDTH(state); + + // ECMA-48 repeats the preceding graphic character; when none was + // printed yet "combine_width" is zero and the loop below would never + // advance the cursor. Ignore the control then, like xterm does. + if(state->combine_width < 1) + break; + count = CSI_ARG_COUNT(args[0]); col = state->pos.col + count; UBOUND(col, row_width); diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index 7d67d6f688..263e9ee34b 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1396,4 +1396,27 @@ func Test_terminal_negative_col_oob() endfor endfunc +" This caused a hang +func Test_terminal_rep_no_preceding_char() + CheckUnix + CheckExecutable printf + + " REP repeats the preceding graphic character. When none was printed yet + " the repeat width in libvterm is zero, so the cursor never reached the end + " column and Vim looped forever while rendering the sequence. + let buf = term_start([&shell, &shellcmdflag, 'printf "%s" ' .. shellescape("\[9b")], + \ #{term_rows: 10, term_cols: 40}) + call TermWait(buf) + " Getting here without a hang is the test. + call assert_true(bufexists(buf)) + exe 'bwipe! ' .. buf + + " REP after a graphic character still repeats it. + let buf = term_start([&shell, &shellcmdflag, 'printf "%s" ' .. shellescape("X\[4b")], + \ #{term_rows: 10, term_cols: 40}) + call TermWait(buf) + call WaitForAssert({-> assert_equal('XXXXX', term_getline(buf, 1))}) + exe 'bwipe! ' .. buf +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a8698a9fdb..840e5cf8bd 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 989, /**/ 988, /**/ From cb34d15aeae530d6803ef4aa0618ec5b430df911 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 20 Aug 2026 21:02:38 +0000 Subject: [PATCH 407/647] patch 9.2.0990: libvterm: crash when a scroll region outlives a resize MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: libvterms on_resize() clamps only the bottom and right edges of the scroll regions. When the terminal is made smaller, the top row can stay past the new last row. Every scroll after that builds a rectangle whose end row is before its start row, which inverts the clamping in scroll() and passes a negative height to memmove() as a huge size_t, so Vim crashes (Vadím Sukhomlínov). Solution: Clamp the near edges of the scroll regions on a resize too and drop a region that no longer makes sense. closes: #21099 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- src/libvterm/src/state.c | 22 ++++++++++++++++++++++ src/testdir/test_terminal3.vim | 27 +++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 51 insertions(+) diff --git a/src/libvterm/src/state.c b/src/libvterm/src/state.c index 7a9732b581..138e95d077 100644 --- a/src/libvterm/src/state.c +++ b/src/libvterm/src/state.c @@ -122,6 +122,13 @@ static void scroll(VTermState *state, VTermRect rect, int downward, int rightwar if(!downward && !rightward) return; + // A degenerate rectangle makes "rows" or "cols" below negative, which + // inverts the clamping of "downward" and "rightward" and results in a + // negative height being passed to memmove(). This happens when a scroll + // region survives a resize that made the terminal smaller. + if(rect.end_row <= rect.start_row || rect.end_col <= rect.start_col) + return; + rows = rect.end_row - rect.start_row; if(downward > rows) downward = rows; @@ -2171,6 +2178,21 @@ static int on_resize(int rows, int cols, void *user) if(state->scrollregion_right > -1) UBOUND(state->scrollregion_right, state->cols); + // The near edges need clamping as well, otherwise a scroll region that + // was set before the terminal was made smaller can start past the last + // row or column. Drop a region that no longer makes sense, just like + // DECSTBM and DECSLRM do when it is set. + UBOUND(state->scrollregion_top, state->rows); + UBOUND(state->scrollregion_left, state->cols); + if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) { + state->scrollregion_top = 0; + state->scrollregion_bottom = -1; + } + if(SCROLLREGION_RIGHT(state) <= state->scrollregion_left) { + state->scrollregion_left = 0; + state->scrollregion_right = -1; + } + VTermStateFields fields; fields.pos = state->pos; fields.lineinfos[0] = state->lineinfos[0]; diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index 263e9ee34b..353505c39c 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1419,4 +1419,31 @@ func Test_terminal_rep_no_preceding_char() exe 'bwipe! ' .. buf endfunc +" This caused a Crash +func Test_terminal_scrollregion_resize_oob() + CheckUnix + CheckExecutable printf + + " A scroll region set before the terminal was made smaller kept its old top + " row, since on_resize() only clamped the bottom row. Every scroll after + " that used a rectangle that ends before it starts, which made libvterm pass + " a negative size to memmove(). + + " Sequences: set the scroll region to rows 5-9, shrink the terminal to three + " rows with CSI 8 ; rows ; cols t, then + " 1 SU, 2 SD, 3 a line feed at the bottom of the stale region + let seqs = ["\[5;9r\[8;3;40t\[5S", + \ "\[5;9r\[8;3;40t\[5T", + \ "\[5;9r\[8;3;40t\n\n\n"] + + for seq in seqs + let buf = term_start([&shell, &shellcmdflag, 'printf "%s" ' .. shellescape(seq)], + \ #{term_rows: 10, term_cols: 40}) + call TermWait(buf) + " Getting here without a crash (and no ASAN report) is the test. + call assert_true(bufexists(buf)) + exe 'bwipe! ' .. buf + endfor +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 840e5cf8bd..a2040e4ebb 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 990, /**/ 989, /**/ From 775df1494afffb964f7c2225b197bac70e19a93f Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 20 Aug 2026 21:20:03 +0000 Subject: [PATCH 408/647] patch 9.2.0991: autocmd: events are triggered for what happened while they were ignored Problem: Events that are triggered by comparing the current state against a stored one are still reported once they are not ignored anymore. This shows up when a command sets 'eventignore', changes something and restores the option, since these events are only checked in the main loop, which does not run while a command executes. Solution: Move the checks done in the main loop into a function and also call it when 'eventignore' or 'eventignorewin' changes, with the old value in effect. What happened while an event was ignored is then not reported, and what happened before still is. fixes: #8641 closes: #21074 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 6 +- runtime/doc/version9.txt | 4 +- src/main.c | 164 ++++++++++++++++++++--------------- src/optionstr.c | 15 ++++ src/proto/main.pro | 1 + src/testdir/test_autocmd.vim | 163 ++++++++++++++++++++++++++++++++++ src/version.c | 2 + 7 files changed, 281 insertions(+), 74 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 08f286782c..ecccba92af 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 19 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3583,6 +3583,10 @@ A jump table for the options with a short description can be found at |Q_op|. To ignore all but some events, a "-" prefix can be used: > :set ei=all,-WinLeave < + Events that are triggered by comparing the current state against a + stored one, such as |CursorMoved| and |TextChanged|, are not triggered + afterwards for what happened while they were ignored. + *'eventignorewin'* *'eiw'* 'eventignorewin' 'eiw' string (default "") window-local diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index e2675c5f20..c0f746f2ca 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 18 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52703,6 +52703,8 @@ Changed ~ - |listener_add()| accepts a Dictionary of options and can include the resulting text of a change |listener-text|. - |extend()| and |extendnew()| also accept |Blobs|. +- events like |CursorMoved| are no longer triggered for what happened while + they were ignored with 'eventignore'. *added-9.3* diff --git a/src/main.c b/src/main.c index 7b5f6aa4ce..ba863a3f0c 100644 --- a/src/main.c +++ b/src/main.c @@ -1297,6 +1297,97 @@ work_pending(void) return op_pending() || !is_safe_now(); } +#ifdef FEAT_CONCEAL +static linenr_T conceal_old_cursor_line = 0; +static linenr_T conceal_new_cursor_line = 0; +static int conceal_update_lines = FALSE; +#endif + +/* + * Trigger the events that are not triggered where they happen, but by + * comparing the current state against the state stored when they were last + * triggered. Also updates what depends on the cursor having moved, which is + * not affected by 'eventignore'. + * Called from the main loop and when 'eventignore(win)' changes, so that what + * happened with an event ignored is not reported once it is not ignored + * anymore. + */ + void +may_trigger_deferred_events(void) +{ + static bool recursive = false; + + if (recursive) + return; + recursive = true; + +#ifdef FEAT_CONCEAL + if (curwin->w_p_cole == 0) + conceal_update_lines = FALSE; +#endif + + // Trigger CursorMoved if the cursor moved. + if (!finish_op && (has_cursormoved() +#ifdef FEAT_PROP_POPUP + || popup_visible +#endif +#ifdef FEAT_CONCEAL + || curwin->w_p_cole > 0 +#endif + ) && !EQUAL_POS(last_cursormoved, curwin->w_cursor)) + { + if (has_cursormoved()) + apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, FALSE, curbuf); +#ifdef FEAT_PROP_POPUP + if (popup_visible) + popup_check_cursor_pos(); +#endif +#ifdef FEAT_CONCEAL + if (curwin->w_p_cole > 0) + { + conceal_old_cursor_line = last_cursormoved.lnum; + conceal_new_cursor_line = curwin->w_cursor.lnum; + conceal_update_lines = TRUE; + } +#endif + last_cursormoved = curwin->w_cursor; + } + +#ifdef FEAT_CONCEAL + if (conceal_update_lines + && (conceal_old_cursor_line != conceal_new_cursor_line + || conceal_cursor_line(curwin) + || need_cursor_line_redraw)) + { + if (conceal_old_cursor_line != conceal_new_cursor_line + && conceal_old_cursor_line != 0 + && conceal_old_cursor_line <= curbuf->b_ml.ml_line_count) + redrawWinline(curwin, conceal_old_cursor_line); + redrawWinline(curwin, conceal_new_cursor_line); + curwin->w_valid &= ~VALID_CROW; + need_cursor_line_redraw = FALSE; + } +#endif + + // Trigger TextChanged if b:changedtick differs. + if (!finish_op && has_textchanged() + && curbuf->b_last_changedtick != CHANGEDTICK(curbuf)) + { + apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, FALSE, curbuf); + curbuf->b_last_changedtick = CHANGEDTICK(curbuf); + } + + // Ensure curwin->w_topline and curwin->w_leftcol are up to date before + // triggering a WinScrolled autocommand. + update_topline(); + validate_cursor(); + + if (!finish_op) + may_trigger_win_scrolled_resized(); + + recursive = false; +} + /* * Main loop: Execute Normal mode commands until exiting Vim. @@ -1313,12 +1404,6 @@ main_loop( oparg_T oa; // operator arguments oparg_T *prev_oap; // operator arguments volatile int previous_got_int = FALSE; // "got_int" was TRUE -#ifdef FEAT_CONCEAL - // these are static to avoid a compiler warning - static linenr_T conceal_old_cursor_line = 0; - static linenr_T conceal_new_cursor_line = 0; - static int conceal_update_lines = FALSE; -#endif prev_oap = current_oap; current_oap = &oa; @@ -1413,72 +1498,7 @@ main_loop( // locked, this would be a good time to handle the drop. handle_any_postponed_drop(); #endif -#ifdef FEAT_CONCEAL - if (curwin->w_p_cole == 0) - conceal_update_lines = FALSE; -#endif - - // Trigger CursorMoved if the cursor moved. - if (!finish_op && (has_cursormoved() -#ifdef FEAT_PROP_POPUP - || popup_visible -#endif -#ifdef FEAT_CONCEAL - || curwin->w_p_cole > 0 -#endif - ) - && !EQUAL_POS(last_cursormoved, curwin->w_cursor)) - { - if (has_cursormoved()) - apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, - FALSE, curbuf); -#ifdef FEAT_PROP_POPUP - if (popup_visible) - popup_check_cursor_pos(); -#endif -#ifdef FEAT_CONCEAL - if (curwin->w_p_cole > 0) - { - conceal_old_cursor_line = last_cursormoved.lnum; - conceal_new_cursor_line = curwin->w_cursor.lnum; - conceal_update_lines = TRUE; - } -#endif - last_cursormoved = curwin->w_cursor; - } - -#if defined(FEAT_CONCEAL) - if (conceal_update_lines - && (conceal_old_cursor_line != conceal_new_cursor_line - || conceal_cursor_line(curwin) - || need_cursor_line_redraw)) - { - if (conceal_old_cursor_line != conceal_new_cursor_line - && conceal_old_cursor_line != 0 - && conceal_old_cursor_line - <= curbuf->b_ml.ml_line_count) - redrawWinline(curwin, conceal_old_cursor_line); - redrawWinline(curwin, conceal_new_cursor_line); - curwin->w_valid &= ~VALID_CROW; - need_cursor_line_redraw = FALSE; - } -#endif - - // Trigger TextChanged if b:changedtick differs. - if (!finish_op && has_textchanged() - && curbuf->b_last_changedtick != CHANGEDTICK(curbuf)) - { - apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, FALSE, curbuf); - curbuf->b_last_changedtick = CHANGEDTICK(curbuf); - } - - // Ensure curwin->w_topline and curwin->w_leftcol are up to date - // before triggering a WinScrolled autocommand. - update_topline(); - validate_cursor(); - - if (!finish_op) - may_trigger_win_scrolled_resized(); + may_trigger_deferred_events(); // If nothing is pending and we are going to wait for the user to // type a character, trigger SafeState. diff --git a/src/optionstr.c b/src/optionstr.c index 9a275ef850..aec6fef55b 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -2411,9 +2411,24 @@ expand_set_encoding(optexpand_T *args, int *numMatches, char_u ***matches) did_set_eventignore(optset_T *args) { char_u **varp = (char_u **)args->os_varp; + char_u *oldval = args->os_oldval.string; + char_u *newval; if (check_ei(*varp) == FAIL) return e_invalid_argument; + + if (oldval == NULL || STRCMP(oldval, *varp) == 0) + return NULL; + + // Deal with the events that are triggered by comparing against a stored + // state, with the old value in effect: what happened while an event was + // ignored must not be reported once it is not ignored anymore, and what + // happened before must still be reported. + newval = *varp; + *varp = oldval; + may_trigger_deferred_events(); + *varp = newval; + return NULL; } diff --git a/src/proto/main.pro b/src/proto/main.pro index 7e4c50803e..025a9994f8 100644 --- a/src/proto/main.pro +++ b/src/proto/main.pro @@ -12,6 +12,7 @@ void state_no_longer_safe(char *reason); int get_was_safe_state(void); void may_trigger_safestateagain(void); int work_pending(void); +void may_trigger_deferred_events(void); void main_loop(int cmdwin, int noexmode); void getout_preserve_modified(int exitval); void getout(int exitval); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 1f33bd2b46..52cb334391 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -5951,6 +5951,169 @@ func Test_eventignore_subtract() %bw! endfunc +" A cursor move made while CursorMoved is ignored is not reported once the +" event is not ignored anymore. +func Test_eventignore_cursormoved() + CheckRunVimInTerminal + + let lines =<< trim END + call setline(1, range(1, 300)) + let g:moved = 0 + autocmd CursorMoved * let g:moved += 1 + + func MoveWhileIgnored() + set eventignore=all + call cursor(100, 1) + call cursor(200, 1) + set eventignore= + endfunc + + func MoveThenIgnore() + call cursor(50, 1) + set eventignore=all + set eventignore= + endfunc + + func MoveExWhileIgnored() + set eventignore=all + 100 + 200 + set eventignore= + endfunc + + " The move under "all" is not reported, the one under "WinEnter" is. + func MoveWithTwoStages() + set eventignore=all + call cursor(100, 1) + set eventignore=WinEnter + call cursor(200, 1) + set eventignore= + endfunc + END + call writefile(lines, 'XTest_eventignore_cm', 'D') + let buf = RunVimInTerminal('-S XTest_eventignore_cm', {'rows': 10}) + + " Reset the counter in the same command line as the move, so that the main + " loop only runs once the move has been made. + call term_sendkeys(buf, ":let g:moved = 0 | call MoveWhileIgnored()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'moved:' g:moved\") + call WaitForAssert({-> assert_match('^moved: 0\>', term_getline(buf, 10))}, 1000) + + " A move made before the event was ignored is still reported. + call term_sendkeys(buf, ":let g:moved = 0 | call MoveThenIgnore()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'moved:' g:moved\") + call WaitForAssert({-> assert_match('^moved: 1\>', term_getline(buf, 10))}, 1000) + + " Same as the first check, but moving with an Ex line address. + call term_sendkeys(buf, ":let g:moved = 0 | call MoveExWhileIgnored()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'moved:' g:moved\") + call WaitForAssert({-> assert_match('^moved: 0\>', term_getline(buf, 10))}, 1000) + + " Only the move made while CursorMoved was not ignored is reported. + call term_sendkeys(buf, ":let g:moved = 0 | call MoveWithTwoStages()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'moved:' g:moved\") + call WaitForAssert({-> assert_match('^moved: 1\>', term_getline(buf, 10))}, 1000) + + call StopVimInTerminal(buf) +endfunc + +" Same as Test_eventignore_cursormoved(), but driven from Python, which +" updates the screen after every command. +func Test_eventignore_cursormoved_python() + CheckFeature python3 + CheckRunVimInTerminal + + let lines =<< trim END + call setline(1, range(1, 300)) + let g:moved = 0 + autocmd CursorMoved * let g:moved += 1 + py3 << PYEOF + import vim + def Fun(): + vim.command('set ei=all') + vim.command('100') + vim.command('200') + vim.command('echom "set ei: line = " .. line(".")') + vim.command('set ei=') + PYEOF + END + call writefile(lines, 'XTest_eventignore_cm_py', 'D') + let buf = RunVimInTerminal('-S XTest_eventignore_cm_py', {'rows': 10}) + + call term_sendkeys(buf, ":let g:moved = 0 | py3 Fun()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'moved:' g:moved\") + call WaitForAssert({-> assert_match('^moved: 0\>', term_getline(buf, 10))}, 1000) + + call StopVimInTerminal(buf) +endfunc + +" The other events that are triggered by comparing against a stored value. +func Test_eventignore_deferred_events() + CheckRunVimInTerminal + + let lines =<< trim END + call setline(1, range(1, 300)) + let g:textchanged = 0 + let g:winscrolled = 0 + autocmd TextChanged * let g:textchanged += 1 + autocmd WinScrolled * let g:winscrolled += 1 + + func ChangeWhileIgnored() + set eventignore=all + call setline(1, 'changed') + set eventignore= + endfunc + + func ScrollWhileIgnored() + set eventignore=all + call winrestview({'topline': 100, 'lnum': 100}) + set eventignore= + endfunc + + func ChangeThenIgnore() + call setline(2, 'changed too') + set eventignore=all + set eventignore= + endfunc + + func ScrollThenIgnore() + call winrestview({'topline': 150, 'lnum': 150}) + set eventignore=all + set eventignore= + endfunc + END + call writefile(lines, 'XTest_eventignore_deferred', 'D') + let buf = RunVimInTerminal('-S XTest_eventignore_deferred', {'rows': 10}) + + call term_sendkeys(buf, ":let g:textchanged = 0 | call ChangeWhileIgnored()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'textchanged:' g:textchanged\") + call WaitForAssert({-> assert_match('^textchanged: 0\>', term_getline(buf, 10))}, 1000) + + call term_sendkeys(buf, ":let g:winscrolled = 0 | call ScrollWhileIgnored()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'winscrolled:' g:winscrolled\") + call WaitForAssert({-> assert_match('^winscrolled: 0\>', term_getline(buf, 10))}, 1000) + + " What happened before the events were ignored is still reported. + call term_sendkeys(buf, ":let g:textchanged = 0 | call ChangeThenIgnore()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'textchanged:' g:textchanged\") + call WaitForAssert({-> assert_match('^textchanged: 1\>', term_getline(buf, 10))}, 1000) + + call term_sendkeys(buf, ":let g:winscrolled = 0 | call ScrollThenIgnore()\") + call TermWait(buf) + call term_sendkeys(buf, ":echo 'winscrolled:' g:winscrolled\") + call WaitForAssert({-> assert_match('^winscrolled: 1\>', term_getline(buf, 10))}, 1000) + + call StopVimInTerminal(buf) +endfunc + func Test_VimResized_and_window_width_not_equalized() CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index a2040e4ebb..494d36f01a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 991, /**/ 990, /**/ From 2af3a6e151a9df5c3bce077e8a994f5bc79ec258 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 20 Aug 2026 21:26:07 +0000 Subject: [PATCH 409/647] patch 9.2.0992: popup filter gets the key at the hit-enter prompt Problem: When a popup with a filter is displayed and a message causes the hit-enter prompt, the key goes to the popup filter instead of the prompt. The closed popup then stays on the screen, since there is no redraw while the prompt is up. Solution: Do not invoke popup filters while Vim is waiting for a key at a prompt of its own. Adjust Test_popup_filter_win_execute_error(), which relied on the filter getting the key at the prompt (Hirohito Higashi). fixes: #21052 closes: #21068 related: #6999 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 7 ++++ .../dumps/Test_popupwin_hit_enter_1.dump | 15 ++++++++ .../dumps/Test_popupwin_hit_enter_2.dump | 15 ++++++++ .../dumps/Test_popupwin_win_execute.dump | 4 +-- src/testdir/test_popupwin.vim | 36 +++++++++++++++++-- src/version.c | 2 ++ 6 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/testdir/dumps/Test_popupwin_hit_enter_1.dump create mode 100644 src/testdir/dumps/Test_popupwin_hit_enter_2.dump diff --git a/src/popupwin.c b/src/popupwin.c index cbfe72f970..d44e845eea 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -5847,6 +5847,13 @@ popup_do_filter(int c) return FALSE; #endif + // Vim is waiting for a key at a prompt of its own, the key is not meant + // for a popup filter. MODE_HITRETURN includes MODE_NORMAL, thus the + // filter mode check below would match. + if (State == MODE_HITRETURN || State == MODE_ASKMORE + || State == MODE_CONFIRM || State == MODE_EXTERNCMD) + return FALSE; + if (recursive) return FALSE; recursive = TRUE; diff --git a/src/testdir/dumps/Test_popupwin_hit_enter_1.dump b/src/testdir/dumps/Test_popupwin_hit_enter_1.dump new file mode 100644 index 0000000000..34e2c11d54 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_hit_enter_1.dump @@ -0,0 +1,15 @@ +|4+0&#ffffff0| @73 +|5| @73 +|6| @73 +|7| @73 +|8| @2|o+0#0000001#ffd7ff255|n|e| +0#0000000#ffffff0@67 +|9| @73 +|1|0| @72 +|1@1| @72 +|1|2| @72 +|1|3| @72 +|1|4| @72 +|x@74 +@75 +| @74 +|P+0#00e0003&|r|e|s@1| |E|N|T|E|R| |o|r| |t|y|p|e| |c|o|m@1|a|n|d| |t|o| |c|o|n|t|i|n|u|e> +0#0000000&@35 diff --git a/src/testdir/dumps/Test_popupwin_hit_enter_2.dump b/src/testdir/dumps/Test_popupwin_hit_enter_2.dump new file mode 100644 index 0000000000..535cc2b00c --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_hit_enter_2.dump @@ -0,0 +1,15 @@ +>1+0&#ffffff0| @73 +|2| @73 +|3| @73 +|4| @73 +|5| @73 +|6| @73 +|7| @73 +|8| @2|o+0#0000001#ffd7ff255|n|e| +0#0000000#ffffff0@67 +|9| @73 +|1|0| @72 +|1@1| @72 +|1|2| @72 +|1|3| @72 +|1|4| @72 +@57|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_popupwin_win_execute.dump b/src/testdir/dumps/Test_popupwin_win_execute.dump index b890a28a61..d2d31c7d63 100644 --- a/src/testdir/dumps/Test_popupwin_win_execute.dump +++ b/src/testdir/dumps/Test_popupwin_win_execute.dump @@ -2,9 +2,9 @@ |~+0#4040ff13&| @73 |~| @73 |~| @73 -|~| @31|s+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| +0#4040ff13#ffffff0@32 |~| @73 |~| @73 |~| @73 |~| @73 -| +0#0000000&@56|0|,|0|-|1| @8|A|l@1| +|~| @73 +|E+0#ffffff16#e000002|1@1|7|:| |U|n|k|n|o|w|n| |f|u|n|c|t|i|o|n|:| |i|n|v|a|l|i|d|f|i|l|t|e|r| +0#0000000#ffffff0@19|0|,|0|-|1| @8|A|l@1| diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index e751d82dcd..4ee44ffbaf 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -1786,11 +1786,12 @@ func Test_popup_filter_win_execute_error() call writefile(lines, 'XtestPopupWinExecuteError', 'D') let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0}) + " The CR is consumed by the hit-enter prompt, the key after it reaches the + " popup filter. call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'}) call term_sendkeys(buf, "\") - call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'}) - call term_sendkeys(buf, "\") - call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'}) + call term_sendkeys(buf, "x") + call WaitFor({-> term_getline(buf, 10) =~ 'Unknown function: invalidfilter'}) call term_sendkeys(buf, "\") call term_sendkeys(buf, "\") call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {}) @@ -6283,4 +6284,33 @@ func Test_popupwin_textprop_redraw() call StopVimInTerminal(buf) endfunc +func Test_popup_no_filter_at_hit_enter() + CheckScreendump + + let lines =<< trim END + call setline(1, range(1, 20)) + func MyFilter(id, key) + call popup_close(a:id) + return 1 + endfunc + func ShowPopup() + call popup_create(['one'], #{line: 8, col: 5, filter: 'MyFilter'}) + redraw + echomsg repeat('x', &columns * 2) + endfunc + nnoremap call ShowPopup() + END + call writefile(lines, 'XtestPopupHitEnter', 'D') + let buf = RunVimInTerminal('-S XtestPopupHitEnter', #{rows: 15}) + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_popupwin_hit_enter_1', {}) + + " The key goes to the hit-enter prompt, not to the popup filter, thus the + " popup is still there. + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_popupwin_hit_enter_2', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 diff --git a/src/version.c b/src/version.c index 494d36f01a..efbbd9cc6a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 992, /**/ 991, /**/ From ba43008a2d6788eeb8ff78ae39dedd28598ae658 Mon Sep 17 00:00:00 2001 From: Peter Kenny Date: Fri, 21 Aug 2026 14:45:31 +0000 Subject: [PATCH 410/647] runtime(doc): Update vim9.txt revisions, standardizing SS1,3-7 closes: #20706 Signed-off-by: kennypete <64727695+kennypete@users.noreply.github.com> Signed-off-by: Christian Brabandt --- runtime/doc/index.txt | 4 +- runtime/doc/tags | 3 +- runtime/doc/vim9.txt | 2270 ++++++++++++++++++++++++----------------- 3 files changed, 1336 insertions(+), 941 deletions(-) diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index 310da6fab3..1829c82769 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1354,7 +1354,7 @@ tag command action ~ |:ex| :ex same as ":edit" |:execute| :exe[cute] execute result of expressions |:exit| :exi[t] same as ":xit" -|:export| :exp[ort] Vim9: export an item from a script +|:export| :export Vim9: export an item from a script |:exusage| :exu[sage] overview of Ex commands |:file| :f[ile] show or set the current file name |:files| :files list all files in the buffer list @@ -1398,7 +1398,7 @@ tag command action ~ |:imap| :im[ap] like ":map" but for Insert mode |:imapclear| :imapc[lear] like ":mapclear" but for Insert mode |:imenu| :ime[nu] add menu for Insert mode -|:import| :imp[ort] Vim9: import an item from another script +|:import| :import Vim9: import an item from another script |:inoremap| :ino[remap] like ":noremap" but for Insert mode |:inoreabbrev| :inorea[bbrev] like ":noreabbrev" but for Insert mode |:inoremenu| :inoreme[nu] like ":noremenu" but for Insert mode diff --git a/runtime/doc/tags b/runtime/doc/tags index ca5828a1e5..a7b4e5befe 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -2690,7 +2690,6 @@ $quote eval.txt /*$quote* :execute eval.txt /*:execute* :exi editing.txt /*:exi* :exit editing.txt /*:exit* -:exp vim9.txt /*:exp* :export vim9.txt /*:export* :exu helphelp.txt /*:exu* :exusage helphelp.txt /*:exusage* @@ -11712,6 +11711,7 @@ vim9-boolean vim9.txt /*vim9-boolean* vim9-class vim9class.txt /*vim9-class* vim9-class-type vim9.txt /*vim9-class-type* vim9-classes vim9.txt /*vim9-classes* +vim9-closure vim9.txt /*vim9-closure* vim9-const vim9.txt /*vim9-const* vim9-curly vim9.txt /*vim9-curly* vim9-debug repeat.txt /*vim9-debug* @@ -11743,6 +11743,7 @@ vim9-partial-declaration vim9.txt /*vim9-partial-declaration* vim9-rationale vim9.txt /*vim9-rationale* vim9-reload vim9.txt /*vim9-reload* vim9-s-namespace vim9.txt /*vim9-s-namespace* +vim9-s:var vim9.txt /*vim9-s:var* vim9-scopes vim9.txt /*vim9-scopes* vim9-string-index vim9.txt /*vim9-string-index* vim9-typealias-type vim9.txt /*vim9-typealias-type* diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index 5054826848..563119647f 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.2. Last change: 2026 Aug 18 +*vim9.txt* For Vim version 9.2. Last change: 2026 Aug 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7,8 +7,10 @@ Vim9 script commands and expressions. *Vim9* *vim9* Most expression help is in |eval.txt|. This file is about the new syntax and -features in Vim9 script. +features in Vim9 script, including more than 150 sourceable scripts. +For a short primer on Vim9 script, other resources may be helpful too, e.g., +https://learnxinyminutes.com/vim9script/. 1. What is Vim9 script? |Vim9-script| @@ -23,27 +25,28 @@ features in Vim9 script. ------------------------------------------------------------------------------ - NOTE: In this vim9.txt help file, the Vim9 script code blocks beginning - with `vim9script` (and individual lines starting with `vim9cmd`) are - Vim9 script syntax highlighted. Also, they are sourceable, meaning - you can run them to see what they output. To source them, use - `:'<,'>source` (see |:source-range|), which is done by visually - selecting the line(s) with |V| and typing `:so`. For example, try it - on the following Vim9 script: >vim9 - - vim9script - echowindow "Welcome to Vim9 script!" +NOTE: In this vim9.txt help file, the Vim9 script code blocks beginning with +`vim9script` (and individual lines starting with `vim9cmd`) are Vim9 script +syntax highlighted. Also, they are sourceable, meaning you can run them to +see what they output. To source them, use `:'<,'>source` (see |:source-range|), +which is done by visually selecting the line(s) with |V| and typing `:so`. +For example, try it on the following Vim9 script: +>vim9 + vim9script + echowindow "Welcome to Vim9 script!" +< +There are also code examples that should not be sourced - they explain +concepts that don't require a sourceable example. Such code blocks appear +in generic code syntax highlighting, like this: +> + def ThisFunction() # script-local + def g:ThatFunction() # global + export def Function() # for import and import autoload < - There are also code examples that should not be sourced - they - explain concepts that don't require a sourceable example. Such code - blocks appear in generic code syntax highlighting, like this: > - - def ThisFunction() # script-local - def g:ThatFunction() # global - export def Function() # for import and import autoload ============================================================================== + 1. What is Vim9 script? *Vim9-script* Vim script has been growing over time, while preserving backwards @@ -78,7 +81,7 @@ Vim9 script and legacy Vim script can be mixed. There is no requirement to rewrite old scripts, they keep working as before. You may want to use a few `:def` functions for code that needs to be fast. -:vim9[cmd] {cmd} *:vim9* *:vim9cmd* +:vim9[cmd] {cmd} *:vim9* *:vim9cmd* Evaluate and execute {cmd} using Vim9 script syntax, semantics, and behavior. Useful when typing a command, in a `:function`, or a legacy Vim script. @@ -86,61 +89,61 @@ rewrite old scripts, they keep working as before. You may want to use a few The following short example shows how a legacy Vim script command and a :vim9cmd (so Vim9 script context) may appear similar, though may differ not just syntactically, but also - semantically and behaviorally. >vim - - call popup_notification('entrée'[5:] - \ ->str2list()->string(), #{time: 7000}) - vim9cmd popup_notification('entrée'[5 :] - ->str2list()->string(), {time: 7000}) -< - Notes: 1) The reason for the different output is Vim9 script - uses character indexing whereas legacy Vim script - uses byte indexing - see |vim9-string-index|. - 2) Syntax is different too. In Vim9 script: - - The space in "[5 :]" is mandatory (see - |vim9-white-space|). - - Line continuation with "\" is not required. - - The "#" (to avoid putting quotes around dictionary - keys) is neither required nor allowed - see |#{}|. - - *E1164* + semantically and behaviorally. +>vim + call popup_notification('entrée'[5:] + \ ->str2list()->string(), #{time: 7000}) + vim9cmd popup_notification('entrée'[5 :] + ->str2list()->string(), {time: 7000}) +< + Notes: 1. The reason for the different output is Vim9 script + uses character indexing whereas legacy Vim script uses byte + indexing - see |vim9-string-index|. + 2. Syntax is different too. In Vim9 script: + - The space in "[5 :]" is mandatory (see |vim9-white-space|). + - Line continuation with "\" is not required. + - The "#" (to avoid putting quotes around dictionary keys) is + neither required nor allowed - see |#{}|. + + *E1164* `:vim9cmd` cannot stand alone; it must be followed by a command. -:leg[acy] {cmd} *:leg* *:legacy* +:leg[acy] {cmd} *:leg* *:legacy* Evaluate and execute {cmd} using legacy Vim script syntax, semantics, and behavior. It is only applicable in a Vim9 script or a `:def` function. Using an equivalent script to - the one, above (see its notes for why the output differs): >vim9 - - vim9script - # Legacy context - so, this creates a popup with [769, 101] - legacy call popup_notification('entrée'[5:] - \ ->str2list()->string(), #{time: 7000}) - # Vim9 script context - so, this creates a pop up with [101] - popup_notification('entrée'[5 :] - ->str2list()->string(), {time: 7000}) + the one, above (see its notes for why the output differs): +>vim9 + vim9script + # In legacy Vim script context the popup is [769, 101] + legacy call popup_notification('entrée'[5:] + \ ->str2list()->string(), #{time: 7000}) + # In Vim9 script context the popup is [101] + popup_notification('entrée'[5 :] + ->str2list()->string(), {time: 7000}) < - Vim9 script script-local variables may be used by prefixing + Vim9 script's script-local variables may be used by prefixing "s:", like in legacy Vim script. This example shows the difference in syntax: "k" for the script-local variable in - Vim9 script, "s:k" in the legacy Vim script context. >vim9 - - vim9script - var k: string = "Okay" - echo k - legacy echo s:k -< *E1189* + Vim9 script, "s:k" in the legacy Vim script context. +>vim9 + vim9script + var k: string = "Okay" + echo k + legacy echo s:k +< + *E1189* Using `:legacy` is not allowed in compiled Vim9 script - control flow contexts. For example: >vim9 - - vim9script - def F_1189() - if v:version == 900 - # E1189: Cannot use :legacy with this command: endif - legacy endif - enddef - F_1189() -< *E1234* + control flow contexts. For example: +>vim9 + vim9script + def F_1189() + if v:version == 900 + # E1189: Cannot use :legacy with this command: endif + legacy endif + enddef + F_1189() +< *E1234* `:legacy` cannot stand alone; it must be followed by a command. @@ -925,7 +928,6 @@ Notes: \ }) < - White space ~ *vim9-white-space* *E1004* *E1068* *E1069* *E1074* *E1127* *E1202* Vim9 script enforces proper use of white space. This is no longer allowed: > @@ -1147,7 +1149,7 @@ should be used. *false* *true* *null* *null_blob* *null_channel* *null_class* *null_dict* *null_function* *null_job* *null_list* *null_object* *null_partial* *null_string* - *E1034* *E1395* + *E1034* In Vim9 script one can use the following predefined values: > true false @@ -1335,15 +1337,15 @@ Using ++var or --var in an expression is not supported yet. the function follows in the next lines, until the matching `:enddef`. *E1073* - The {name} cannot be reused at the script-local level: >vim9 - + {name} cannot be reused at the script-local level: +>vim9 vim9script def F_1073() enddef - def F_1073() # E1073: Name already defined: ... + def F_1073() # E1073: Name already defined: vim9 - + declaration must provide a type. Example: +>vim9 vim9script def F_1077(x): void - # E1077: Missing argument type for x + # E1077: Missing argument type for x enddef < For the second form, because the declaration does not specify it, Vim infers the type. For both second and third forms, a default {value} applies when the - caller omits it. Examples: >vim9 - + caller omits it. Examples: +>vim9 vim9script def SecondForm(arg = "Hi"): void - echo $'2. arg is a "{arg->typename()}" type ' .. - $'and the default value of arg is "{arg}"' + echo $'2. arg is a "{arg->typename()}" type ' .. + $'and the default value of arg is "{arg}"' enddef SecondForm() def ThirdForm(arg2: number = 9): void - echo $'3. default value of arg2 is {arg2}' + echo $'3. default value of arg2 is {arg2}' enddef ThirdForm() < *E1123* Arguments in a builtin function called in a `:def` - function must have commas between arguments: >vim9 - + function must have commas between arguments: +>vim9 vim9script def F_1123(a: number, b: number): void - echo max(a b) - # E1123: Missing comma before argument: b) + echo max(a b) # E1123: Missing comma before ar... enddef F_1123(1, 2) < *E1003* *E1027* *E1096* The type of value used with `:return` must match {return-type}. When {return-type} is omitted or is "void" the function is not allowed to return - anything. Examples: >vim9 - + anything. Examples: +>vim9 vim9script def F_1003(): bool - return # E1003: Missing return value + return # E1003: Missing return value enddef F_1003() < >vim9 vim9script def F_1027(): bool - echo false # E1027: Missing return statement + echo false # E1027: Missing return statement enddef F_1027() < >vim9 vim9script def F_1096(): void - return false # E1096: Returning a value ... + return false # E1096: Returning a value in a f... enddef F_1096() < *E1056* *E1059* When ": {return-type}" is specified, {return-type} cannot be omitted (leaving a hanging colon). The ": " - also cannot be preceded by white space. Examples: >vim - + also cannot be preceded by white space. Examples: +>vim def F_1056(): - # E1056: Expected a type: + # E1056: Expected a type: enddef def F_1059() : bool - # E1059: No white space allowed before colon:... + # E1059: No white space allowed before colon: ...  enddef < The function will be compiled into instructions when @@ -1435,21 +1436,21 @@ Using ++var or --var in an expression is not supported yet. In Vim9 script, ! is not allowed because script-local functions cannot be deleted or redefined, though they can be removed by reloading the script. Also, nested - functions cannot use ! for redefinition. Examples: >vim - + functions cannot use ! for redefinition. Examples: +>vim " Legacy Vim script :def! example def! LegacyFunc() - echo "def! is allowed in a legacy Vim script" + echo "def! is allowed in a legacy Vim script" enddef call LegacyFunc() < >vim9 vim9script - def Func() - def! InnerFunc() - # E1117: Cannot use ! with nested :def - enddef + def F1117() + def! InnerFunc() + # E1117: Cannot use ! with nested :def + enddef enddef - Func() + F1117() < >vim9 vim9script def! F_477(): void # E477: No ! allowed @@ -1467,10 +1468,11 @@ Using ++var or --var in an expression is not supported yet. reported at https://github.com/vim/vim/issues as it could represent a gap in Vim's error reporting. - *:enddef* *E1057* *E1152* *E1173* + *:enddef* + *E1057* *E1152* *E1173* :enddef End of a function defined with `:def`. It should be on - a line by itself. Examples: >vim9 - + a line by itself. Examples: +>vim9 vim9script def MyFunc() echo 'Do Something' | enddef @@ -1483,69 +1485,111 @@ Using ++var or --var in an expression is not supported yet. < >vim9 vim9script def F_1152() - function X() - enddef # E1152: Mismatched enddef + function X() + enddef # E1152: Mismatched enddef enddef < You may also find this wiki useful. It was written by an early adopter of Vim9 script: https://github.com/lacygoill/wiki/blob/master/vim/vim9.md -If the script the `:def` function is defined in is Vim9 script, script-local -variables must be accessed without using the "s:" prefix. They must be -defined before the function is compiled and there is no way to avoid errors -(e.g., by using |exists()|) to conditionally skip undeclared variables. -For example: >vim9 - + *vim9-s:var* +When referencing a script-local variable, the context determines whether using +the "s:" prefix is either mandatory, optional, or gives |E1268|. The context +factors are whether the script version is Vim9 script or legacy Vim script and +whether the reference is at the script-local level, within a `:def` function, +or within a `:function`. The three rules are: + + 1. In a `:function`, "s:" is always mandatory. This is regardless of the + script type or the function's parent context (such as nested within + another function). Similarly, "s:" is also mandatory in the script-local + scope of a legacy Vim script. + 2. In a Vim9 script, "s:" always gives |E1268| when used in a `:def` function, + regardless of the function's parent context. Similarly, it gives E1268 in + the script-local scope of a Vim9 script. + 3. In a legacy Vim script, "s:" is optional in a `:def` function, regardless + of the function's parent context. + +The following three scripts demonstrate these rules: +>vim + " 1. In a :function, "s:" is always mandatory. It is also mandatory + " in a legacy Vim script's script-local scope + let s:MyVar = v:true + echo s:MyVar | " v:true + " echo MyVar (Would give E121: Undefined variable: MyVar) + vim9cmd echo MyVar # true + function! MyFunc() + echo s:MyVar | " v:true + " echo MyVar (Would give E121: Undefined variable: MyVar) + vim9cmd echo MyVar # true + endfunction + call MyFunc() +< >vim9 vim9script - def MyVim9def() - echo unus # Echoes 1 - # echo s:unus # This would be E1268 (Cannot use s: in Vim9) - if exists('duo') - # echo duo # This would be E1001 (Variable not found: duo) - endif + # 2. In a Vim9 script, "s:" gives E1268 when used in any :def function + # and in the script-local scope + var MyVar: bool = true + echo MyVar # true + # echo s:MyVar (Would give E1268: Cannot use s: in Vim9...) + legacy echo s:MyVar | # v:true + def MyFunc() + echo MyVar # true + # echo s:MyVar (Would give E1268: Cannot use s: in Vim9...) + legacy echo s:MyVar | # v:true enddef - var unus: number = 1 - MyVim9def() # MyVim9def is compiled ("duo" does not exist yet) - var duo: number = 2 -< -If the script the `:def` function is defined in is legacy Vim script, -script-local variables may be accessed with or without the "s:" prefix. -However, using "s:" may defer variable resolution to runtime, avoiding -compilation errors for variables that may not exist yet, as this example -explains: >vim - - " legacy Vim script - def! MyLegacyDef(): void - echo [unus, s:unus] # Echoes [1, 1] - # (If uncommented) First sourcing of 'echo s:duo' is E121 and - # causes a compilation error; subsequent sourcing echoes 2: - # echo s:duo - if exists("s:duo") - # First sourcing: skips echo; subsequent sourcing: echoes 2 - echo s:duo - endif - if exists("duo") - # (If uncommented) First sourcing of 'echo duo' is E1001 and - # causes a compilation error; subsequent sourcing echoes 2: - # echo duo - endif + MyFunc() +< >vim + " 3. In a legacy Vim script, "s:" is optional in a :def function + let s:MyVar = v:true + function! Outer() + def! MyFunc() + echo MyVar # true + echo s:MyVar # true + enddef + call MyFunc() + endfunction + call Outer() +< +Using |exists()|, which is evaluated at runtime, cannot be used conditionally +to skip undeclared variables, though |exists_compiled()|, which is evaluated at +compile time, may be used. For example: +>vim9 + vim9script + def MyDef() + if exists_compiled('MyVar') # evaluated at compile time + echo $"MyVar = {MyVar}" # MyVar = 1 + endif + if exists_compiled('MyVar2') # evaluated at compile time + echo $"MyVar2 = {MyVar2}" # not reached + else + echo "MyVar2 does not exist at compile time" + endif + if exists('MyVar') # evaluated at runtime + echo $"MyVar = {MyVar}" # MyVar = 1 + endif + if exists('MyVar2') # evaluated at runtime + # The following would give E1001: Variable not found: MyVar2 + # echo MyVar2 + else + echo "MyVar2 does not exist at runtime" + endif enddef - let s:unus = 1 - call MyLegacyDef() " Calls MyLegacyDef() and compiles if not already - let s:duo = 2 + var MyVar: number = 1 # Declared before MyDef() is compiled + MyDef() + var MyVar2: number = 2 # Declared after MyDef() is compiled +< < *E1269* Script-local variables in a Vim9 script must be declared at the script level. They cannot be created in a `:def` function and may not be declared -in a legacy function with the "s:" prefix. For example: >vim9 - +in a legacy function with the "s:" prefix. For example: +>vim9 vim9script function F_1269() - let s:i_wish = v:true + let s:i_wish = v:true endfunction F_1269() # E1269: Cannot create a Vim9 script variable in a function: s:i_wish < - *:defc* *:defcompile* + *:defc* *:defcompile* :defc[ompile] Compile functions and classes (|class-compile|) defined in the current script that were not compiled yet. This will report any errors found during @@ -1554,13 +1598,13 @@ in a legacy function with the "s:" prefix. For example: >vim9 Example: When the three lines (up to and including `enddef`) are sourced, there is no error because the Vim9 `:def` function is not compiled. However, if all - four lines are sourced, compilation fails: >vim9 - + four lines are sourced, compilation fails: +>vim9 vim9script def F_1027(): string enddef defcompile F_1027 # E1027: Missing return statement - +< :defc[ompile] MyClass Compile all methods in a class. (See |:disassemble| for an example.) @@ -1575,7 +1619,7 @@ in a legacy function with the "s:" prefix. For example: >vim9 {func} can also be "ClassName" to compile all functions and methods in a class. - *:disa* *:disassemble* + *:disa* *:disassemble* :disa[ssemble] {func} Show the instructions generated for {func}. This is for debugging and testing. If {func} is not found, error *E1061* occurs. @@ -1584,22 +1628,22 @@ in a legacy function with the "s:" prefix. For example: >vim9 The following example demonstrates using `:defcompile` with a |class| and `:disassemble` with a "ClassName.functionName" (positioning the cursor on - the last line of the visually sourced script): >vim9 - + the last line of the visually sourced script): +>vim9 vim9script class Line - var lnum: number - def new(this.lnum) - enddef - def SetLnum() - cursor(this.lnum, 52) - enddef + var lnum: number + def new(this.lnum) + enddef + def SetLnum() + cursor(this.lnum, 52) + enddef endclass defcompile Line disassemble Line.SetLnum var vlast: Line = Line.new(line("'>")) - vlast.SetLnum() # Cursor is positioned here->_ - + vlast.SetLnum() # Cursor is positioned here->_ +< :disa[ssemble] profile {func} Like `:disassemble` but with the instructions used for profiling. @@ -1608,104 +1652,105 @@ in a legacy function with the "s:" prefix. For example: >vim9 Like `:disassemble` but with the instructions used for debugging. - Note: For command line completion of {func}, script-local functions + Note: For command line completion of {func}, script-local functions are shown with their . Depending on options, including |wildmenumode()|, completion may work with "s:", "vim9 - +visible whereas the function-local constant "DEF_LOCAL" is not: +>vim9 vim9script const SCRIPT_LOCAL = ['A', 'script-local', 'list'] def MapList(scope: string): list - const DEF_LOCAL: list = ['A', 'def-local', 'list'] - if scope == 'script local' - return [1]->map('SCRIPT_LOCAL[v:val]') - else - return [1]->map('DEF_LOCAL[v:val]') - endif + const DEF_LOCAL: list = ['A', 'def-local', 'list'] + if scope == 'script-local' + return [1]->map('SCRIPT_LOCAL[v:val]') + else + return [1]->map('DEF_LOCAL[v:val]') + endif enddef - echo 'script local'->MapList() # Echoes ['script-local'] - echo 'def local'->MapList() # E121: Undefined variable: DEF_LOCAL + echo 'script-local'->MapList() # ['script-local'] + echo 'def-local'->MapList() # E121: Undefined variable: DEF_LOCAL < The map argument is a string expression, which is evaluated without the -function scope. Instead, in Vim9 script, use a lambda: >vim9 - +function scope. Instead, in Vim9 script, use a lambda: +>vim9 vim9script def MapList(): list - const DEF_LOCAL: list = ['A', 'def-local', 'list'] - return [1]->map((_, v) => DEF_LOCAL[v]) + const DEF_LOCAL: list = ['A', 'def-local', 'list'] + return [1]->map((_, v): string => DEF_LOCAL[v]) enddef - echo MapList() # Echoes ['def-local'] + echo MapList() # ['def-local'] < For commands that are not compiled, such as `:edit`, |backtick-expansion| can -be used and it can use the local scope. Example: >vim9 - +be used and it can use the local scope. Example: +>vim9 vim9script def EditNewBlah() - var fname: string = 'blah.txt' - split - edit `=fname` + var fname: string = 'blah.txt' + split + edit `=fname` enddef EditNewBlah() # A new split is created as buffer 'blah.txt' < + *vim9-closure* Closures defined in a loop can either share a variable or each have their own copy, depending on where the variable is declared. With a variable declared outside the loop, all closures reference the same shared variable. The following example demonstrates the consequences, with the "outloop" -variable existing only once: >vim9 - +variable existing only once: +>vim9 vim9script var flist: list def ClosureEg(n: number): void - var outloop: number = 0 # outloop is declared outside the loop! - for i in range(n) - outloop = i - flist[i] = (): number => outloop # Closures ref the same var - endfor - echo range(n)->map((i, _) => flist[i]()) + var outloop: number = 0 # outloop is declared outside the loop! + for i in range(n) + outloop = i + flist[i] = (): number => outloop # Closures ref the same var + endfor + echo range(n)->map((i, _): number => flist[i]()) enddef - ClosureEg(4) # Echoes [3, 3, 3, 3] + ClosureEg(4) # [3, 3, 3, 3] < All closures put in the list refer to the same instance, which, in the end, is 3. However, when the variable is declared inside the loop, each closure gets its -own copy, as shown in this example: >vim9 - +own copy, as shown in this example: +>vim9 vim9script var flist: list def ClosureEg(n: number): void - for i in range(n) - var inloop: number = i # inloop is declared inside the loop - flist[i] = (): number => inloop # Closures ref each inloop - endfor - echo range(n)->map((i, _) => flist[i]()) + for i in range(n) + var inloop: number = i # inloop is declared inside the loop + flist[i] = (): number => inloop # Closures ref each inloop + endfor + echo range(n)->map((i, _): number => flist[i]()) enddef - ClosureEg(4) # Echoes [0, 1, 2, 3] - + ClosureEg(4) # [0, 1, 2, 3] +< Another way to have a separate context for each closure is to call a -function to define it: >vim9 - +function to define it: +>vim9 vim9script def GetClosure(i: number): func - var infunc: number = i - return (): number => infunc + var infunc: number = i + return (): number => infunc enddef var flist: list def ClosureEg(n: number): void - for i in range(n) - flist[i] = GetClosure(i) - endfor - echo range(n)->map((i, _) => flist[i]()) + for i in range(n) + flist[i] = GetClosure(i) + endfor + echo range(n)->map((i, _): number => flist[i]()) enddef - ClosureEg(4) # Echoes [0, 1, 2, 3] + ClosureEg(4) # [0, 1, 2, 3] < *E1271* A closure must be compiled in the context that it is defined in, so that variables in that context can be found. This mostly happens correctly, @@ -1716,42 +1761,42 @@ function. In some situations, such as when a Vim9 closure which captures local variables is converted to a string and then executed, an error occurs. This happens because the string execution context cannot access the local variables from -the original context where the closure was defined. For example: >vim9 - +the original context where the closure was defined. For example: +>vim9 vim9script def F_1248(): void - var n: number - var F: func = () => { - n += 1 - } - try - execute printf("call %s()", F) - catch - echo v:exception - endtry + var n: number + var F: func = () => { + n += 1 + } + try + execute printf("call %s()", F) + catch + echo v:exception + endtry enddef F_1248() # Vim(call):E1248: Closure called from invalid context - +< In Vim9 script, a loop variable is invalid after the loop is closed. For example, this timer will echo 0 to 2 on separate lines. However, if -the variable "n" is used after the `:endfor`, that is an |E121| error: >vim9 - +the variable "n" is used after the `:endfor`, that is an |E121| error: +>vim9 vim9script for n in range(3) - var nr: number = n - timer_start(1000 * n, (_) => { - echowindow nr - }) + var nr: number = n + timer_start(1000 * n, (_) => { + echowindow nr + }) endfor try - echowindow n + echowindow n catch - echo v:exception + echo v:exception endtry < - Note: Using `:echowindow` is useful in a timer because messages go - into a popup and will not interfere with what the user is - doing when it triggers. + Note: Using `:echowindow` is useful in a timer because messages go + into a popup and will not interfere with what the user is doing when + it triggers. Converting a :function to a :def~ @@ -1771,7 +1816,8 @@ a `:def` function. The following are some of them: - If the function returns something, add the return type. (Ideally, add "void" if it does not return anything.) - Remove line continuation backslashes from places they are not required. -- Remove `let` for assigning values to |g:|, |b:|, |w:|, |t:|, or |l:| variables. +- Remove `let` for assigning values to global (|g:|), buffer (|b:|), + window (|w:|), tab (|t:|), and local (|l:|) variables. - Rewrite |lambda| expressions in Vim9 script syntax (see |vim9-lambda|). - Change comments to start with # (preceded by white space) instead of ". - Insert white space in expressions where required (see |vim9-white-space|). @@ -1779,38 +1825,38 @@ a `:def` function. The following are some of them: an |interpolated-string|.) The following legacy Vim script and Vim9 script examples demonstrate all -those differences. First, legacy Vim script: >vim - +those differences. First, legacy Vim script: +>vim let s:lnum=0 function Leg8(arg) abort - let l:pre=['Result', - \': '] - let b:arg=a:arg - let s:lnum+=2 - let b:arg*=4 - let l:result={pre->join(pre,'')}(l:pre) - return l:result.(b:arg+s:lnum)"no space before comment + let l:pre=['Result', + \': '] + let b:arg=a:arg + let s:lnum+=2 + let b:arg*=4 + let l:result={pre->join(pre,'')}(l:pre) + return l:result.(b:arg+s:lnum)"no space before comment endfunction call Leg8(10)->popup_notification(#{time: 3000})" Pops up 'Result: 42' - -The equivalent in Vim9 script: >vim9 - +< +The equivalent in Vim9 script: +>vim9 vim9script var lnum: number def Vim9(arg: number): string - final pre = ['Result', - ': '] - b:arg = arg - lnum += 2 - b:arg *= 4 - const RESULT: string = ((lpre) => join(lpre, ''))(pre) - return RESULT .. (b:arg + lnum) # space required before # comment + final pre = ['Result', + ': '] + b:arg = arg + lnum += 2 + b:arg *= 4 + const RESULT: string = ((lpre) => join(lpre, ''))(pre) + return RESULT .. (b:arg + lnum) # space required before # comment enddef - Vim9(10)->popup_notification({time: 3000}) # Pops up 'Result: 42' - -< Note: This example also demonstrates (outside the `:def` function): - - Removing "#" from the legacy |#{}| - see |vim9-literal-dict| - - Omitting `:call` (allowed, though unnecessary in Vim9 script) + Vim9(10)->popup_notification({time: 3000}) # Pops up 'Result: 42' +< + Note: This example also demonstrates (outside the `:def` function): + - Removing "#" from the legacy |#{}| - see |vim9-literal-dict|, and + - Omitting `:call` (allowed, though unnecessary in Vim9 script) Calling a :def function in an expr option ~ @@ -1819,86 +1865,87 @@ The value of a few options, such as 'foldexpr', is an expression that is evaluated to get a value. The evaluation can have quite a bit of overhead. One way to minimize the overhead, and also to keep the option value simple, is to define a compiled function and set the option to call it without -arguments. For example: >vim9 - +arguments. For example: +>vim9 vim9script def MyFoldFunc(): string - # This matches start of line (^), followed by a digit, a full stop - # a space or tab, an uppercase character, with an empty next line - return getline(v:lnum) =~ '^[[:digit:]]\.[[:blank:]][[:upper:]]' - && getline(v:lnum + 1)->empty() ? '>1' : '1' + # This matches start of line (^), followed by a digit, a full stop + # a space or tab, an uppercase character, with an empty next line + return getline(v:lnum) =~ '^[[:digit:]]\.[[:blank:]][[:upper:]]' + && getline(v:lnum + 1)->empty() ? '>1' : '1' enddef set foldexpr=MyFoldFunc() set foldmethod=expr - norm! zM + normal! zM < - Warning: This script creates and applies folds at the "Heading 1" level of - this vim9.txt help buffer. (You can use |zR|, in Normal mode, to - open all the folds after sourcing the script.) +Warning: This script creates and applies folds at the "Heading 1" level of +this vim9.txt help buffer. (You can use |zR|, in Normal mode, to open all the +folds after sourcing the script.) ============================================================================== -4. Types *vim9-types* +4. Types *vim9-types* The following types, each shown with its corresponding internal |v:t_TYPE| variable, are supported: - number |v:t_number| - string |v:t_string| - func |v:t_func| - func: {type} |v:t_func| - func({type}, ...) |v:t_func| - func({type}, ...): {type} |v:t_func| - list<{type}> |v:t_list| - dict<{type}> |v:t_dict| - float |v:t_float| - bool |v:t_bool| - none |v:t_none| - job |v:t_job| - channel |v:t_channel| - blob |v:t_blob| - class |v:t_class| - object |v:t_object| - typealias |v:t_typealias| - enum |v:t_enum| - enumvalue |v:t_enumvalue| - tuple<{type}> |v:t_tuple| - tuple<{type}, {type}, ...> |v:t_tuple| - tuple<...list<{type}>> |v:t_tuple| - tuple<{type}, ...list<{type}>> |v:t_tuple| + number |v:t_number| + string |v:t_string| + func |v:t_func| + func: {type} |v:t_func| + func({type}, ...) |v:t_func| + func({type}, ...): {type} |v:t_func| + list<{type}> |v:t_list| + dict<{type}> |v:t_dict| + float |v:t_float| + bool |v:t_bool| + none |v:t_none| + job |v:t_job| + channel |v:t_channel| + blob |v:t_blob| + class |v:t_class| + object |v:t_object| + typealias |v:t_typealias| + enum |v:t_enum| + enumvalue |v:t_enumvalue| + tuple<{type}> |v:t_tuple| + tuple<{type}, {type}, ...> |v:t_tuple| + tuple<...list<{type}>> |v:t_tuple| + tuple<{type}, ...list<{type}>> |v:t_tuple| void - *E1031* *E1186* + *E1031* *E1186* These types can be used in declarations, though no simple value can have the -"void" type. Trying to use a void as a value results in an error. Examples: >vim9 - +"void" type. Trying to use a void as a value results in an error. +Examples: +>vim9 vim9script def NoReturnValue(): void enddef try - const X: any = NoReturnValue() + const X: any = NoReturnValue() catch - echo v:exception # E1031: Cannot use void value - try - echo NoReturnValue() - catch - echo v:exception # E1186: Expression does not result in a ... - endtry + echo v:exception # E1031: Cannot use void value + try + echo NoReturnValue() + catch + echo v:exception # E1186: Expression does not result in a valu... + endtry endtry < *E1008* *E1009* *E1010* *E1012* Ill-formed declarations and mismatching types result in errors. The following -are examples of errors E1008, E1009, E1010, and E1012: >vim9 - - vim9cmd var l: list - vim9cmd var l: list - vim9cmd var l: list = ['42'] +are examples of errors E1008, E1009, E1010, and E1012: +>vim9 + vim9cmd var l_1008: list + vim9cmd var l_1009: list + vim9cmd var l_1012: list = ['42'] < There is no array type. Instead, use either a list or a tuple. Those types may also be literals (constants). In the following example, [5, 6] is a list -literal and (7, ) a tuple literal. The echoed list is a list literal too: >vim9 - +literal and (7, ) a tuple literal. The echoed list is a list literal too: +>vim9 vim9script var l: list = [1, 2] var t: tuple<...list> = (3, 4) @@ -1916,111 +1963,267 @@ tuple<...list> a variadic tuple with zero or more items of tuple> a tuple with an item of type |Number| followed by zero or more items of type |String| -Examples: > - var myTuple: tuple = (20,) - var myTuple: tuple = (30, 'vim') - var myTuple: tuple = (40, 1.1, true) - var myTuple: tuple<...list> = ('a', 'b', 'c') - var myTuple: tuple> = (3, 'a', 'b', 'c') +Examples: +>vim9 + vim9script + var t1: tuple = (20,) + var t2: tuple = (30, 'vim') + var t3: tuple = (40, 1.1, true) + var t4: tuple<...list> = ('a', 'b', 'c') + var t5: tuple> = (3, 'a', 'b', 'c', 'd') < - *variadic-tuple* *E1539* + *variadic-tuple* *E1539* A variadic tuple has zero or more items of the same type. The type of a -variadic tuple must end with a list type. Examples: > - var myTuple: tuple<...list> = (1, 2, 3) - var myTuple: tuple<...list> = ('a', 'b', 'c') - var myTuple: tuple<...list> = () -< - *vim9-func-declaration* *E1005* *E1007* - *vim9-partial-declaration* - *vim9-func-type* -A function (or partial) may be declared in the following ways: -func any kind of function reference, no type - checking for arguments or return value -func: void any number and type of arguments, no return - value -func: {type} any number and type of arguments with specific - return type - -func() function with no argument, does not return a - value -func(): void same -func(): {type} function with no argument and return type - -func({type}) function with argument type, does not return - a value -func({type}): {type} function with argument type and return type -func(?{type}) function with type of optional argument, does - not return a value -func(...list<{type}>) function with type of list for variable number - of arguments, does not return a value -func({type}, ?{type}, ...list<{type}>): {type} - function with: - - type of mandatory argument - - type of optional argument - - type of list for variable number of - arguments - - return type - -If the return type is "void" the function does not return a value. - +variadic tuple must end with a list type otherwise E1539 is given. Examples: +>vim9 + vim9script + var t6: tuple<...list> = (1, 2, 3) + var t7: tuple<...list> = ('a', 'b', 'c') + var t8: tuple<...list> = () + var tE: tuple<...any> = () # E1539: Variadic tuple must end with li... +< + *vim9-func-declaration* + *vim9-partial-declaration* + *vim9-func-type* +A function (or partial) may be declared in many ways, including: +> + func + func: void + func: {type} + func()[: void] + func(): {type} + func({type})[: void] + func({type}): {type} + func(?{type})[: void] + func(?{type}): {type} + func(...list<{type}>)[: void] + func(...list<{type}>): {type} + func({type}, ...list<{type}>)[: void] + func({type}, ...list<{type}>): {type} +< +If the return type is "void", the function does not return a value. All the +ways listed above are explained and demonstrated in the following examples, +all of which echo '9'. + +func + - any kind of function reference + - any type of return value or no return value +>vim9 + vim9script + const I = (n) => n + 1 + const F: func = I->function() + echo F(8) +< +func: void + - any number and type of arguments + - does not return a value +>vim9 + vim9script + def I(n: number): void + echo n + 1 + enddef + const F: func: void = I->function() + F(8) +< +func: {type} + - any number and type of arguments + - returns a typed value +>vim9 + vim9script + const I = (n): number => n + 1 + const F: func: number = I->function() + echo F(8) +< +func()[: void] + - no arguments + - does not return a value +>vim9 + vim9script + var n: number = 8 + def I(): void + echo n + 1 + enddef + const F: func(): void = I->function() + F() +< +func(): {type} + - no arguments + - returns a typed value +>vim9 + vim9script + var n: number = 8 + def I(): number + return n + 1 + enddef + const F: func(): number = I->function() + echo F() +< +func({type})[: void] + - typed argument + - does not return a value +>vim9 + vim9script + def I(n: number): void + echo n + 1 + enddef + const F: func(number): void = I->function() + F(8) +< +func({type}): {type} + - typed argument + - returns a typed value +>vim9 + vim9script + const I = (n: number): number => n + 1 + const F: func(number): number = I->function() + echo F(8) +< +func(?{type})[: void] + - optional typed argument + - does not return a value +>vim9 + vim9script + def I(n: number = 8): void + echo n + 1 + enddef + const F: func(?number): void = I->function() + F() +< +func(?{type}): {type} + - optional typed argument + - returns a typed value +>vim9 + vim9script + def I(n: number = 8): number + return n + 1 + enddef + const F: func(?number): number = I->function() + echo F() +< +func(...list<{type}>)[: void] + - typed list for variable number of arguments + - does not return a value +>vim9 + vim9script + def L(...l: list): void + echo l->reduce((x, y) => x + y) + enddef + const F: func(...list): void = L->function() + F(8, 0, 0, 1) +< +func(...list<{type}>): {type} + - typed list for variable number of arguments + - returns a typed value +>vim9 + vim9script + def L(...l: list): number + return l->reduce((x, y) => x + y) + enddef + const F: func(...list): number = L->function() + echo F(8, 0, 0, 1) +< +func({type}, ...list<{type}>)[: void] + - typed mandatory argument + - typed list for variable number of arguments + - does not return a value +>vim9 + vim9script + def D(a: float, ...l: list): void + echo (a + l->reduce((x, y) => x + y))->float2nr() + enddef + const F: func(float, ...list): void = D->function() + F(8.0, 0, 0, 1) +< +func({type}, ...list<{type}>): {type} + - typed mandatory argument + - typed list for variable number of arguments + - returns a typed value +>vim9 + vim9script + def D(a: float, ...l: list): number + return (a + l->reduce((x, y) => x + y))->float2nr() + enddef + const F: func(float, ...list): number = D->function() + echo F(8.0, 0, 0, 1) +< The reference can also be a |Partial|, in which case it stores extra arguments and/or a dictionary, which are not visible to the caller. Since they are called in the same way, the declaration is the same. This interactive example -prompts for a circle's radius and returns its area to two decimal places, -using a partial: >vim9 - +prompts for a circle's radius and returns its area using a partial: +>vim9 vim9script def CircleArea(pi: float, radius: float): float - return pi * radius->pow(2) + return pi * radius->pow(2) enddef const AREA: func(float): float = CircleArea->function([3.14]) const RADIUS: float = "Enter a radius value: "->input()->str2float() echo $"\nThe area of a circle with a radius of {RADIUS} is " .. - $"{AREA(RADIUS)} (π to two d.p.)" + $"{AREA(RADIUS)} (π to two d.p.)" +< + *E1005* +No more than 19 argument types may be used in a Funcref (one less than what is +allowed in a function, including a `:def` or lambda - see |E740|). Twenty or +more argument types gives E1005, as this example shows: +>vim9 + vim9script + var X: func + X = (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) => 0 + var F: func(any, any, any, any, any, any, any, any, any, any, any, + \ any, any, any, any, any, any, any, any, any): any = X->function() + # E1005: Too many argument types < - *vim9-typealias-type* + *E1007* +A mandatory argument may not come after an optional argument in a Funcref: +>vim9 + vim9script + def I(n: number, f: float): void + echo n + f + enddef + const F: func(?number, float) = I->function() + # E1007: Mandatory argument after optional argument +< + *vim9-typealias-type* Custom types (|typealias|) can be defined with `:type`. They must start with a capital letter (which avoids name clashes with either current or future builtin types) similar to user functions. This example creates a list of -perfect squares and reports on |type()| (14, a typealias) and the |typename()|: >vim9 - +perfect squares, reporting on |type()| (14, a typealias) and the |typename()|: +>vim9 vim9script type Ln = list final perfect_squares: Ln = [1, 4, 9, 16, 25] echo "Typename (Ln): " .. - $"type() is {Ln->type()} and typename() is {Ln->typename()}" + $"type() is {Ln->type()} and typename() is {Ln->typename()}" < - *E1105* -A typealias itself cannot be converted to a string: >vim9 - + *E1105* +A typealias itself cannot be converted to a string: +>vim9 vim9script type Ln = list const FAILS: func = (): string => { - echo $"{Ln}" # E1105: Cannot convert typealias to string - } -< - *vim9-class-type* *vim9-interface-type* + echo $"{Ln}" # E1105: Cannot convert typealias to string + } +< *vim9-class-type* *vim9-interface-type* *vim9-object-type* A |class|, |object|, and |interface| may all be used as types. The following interactive example prompts for a float value and returns the area of two different shapes. It also reports on the |type()| and |typename()| of the -classes, objects, and interface: >vim9 - +classes, objects, and interface: +>vim9 vim9script interface Shape - def InfoArea(): tuple + def InfoArea(): tuple endinterface class Circle implements Shape - var radius: float - def InfoArea(): tuple - return ('Circle (π × r²)', 3.141593 * this.radius->pow(2)) - enddef + var radius: float + def InfoArea(): tuple + return ('Circle (π × r²)', 3.141593 * this.radius->pow(2)) + enddef endclass class Square implements Shape - var side: float - def InfoArea(): tuple - return ('Square (s²)', this.side->pow(2)) - enddef + var side: float + def InfoArea(): tuple + return ('Square (s²)', this.side->pow(2)) + enddef endclass const INPUT: float = "Enter a float value: "->input()->str2float() echo "\nAreas of shapes:" @@ -2028,8 +2231,8 @@ classes, objects, and interface: >vim9 var mySquare: object = Square.new(INPUT) final shapes: list = [myCircle, mySquare] for shape in shapes - const [N: string, A: float] = shape.InfoArea() - echo $"\t- {N} has area of {A}" + const [N: string, A: float] = shape.InfoArea() + echo $"\t- {N} has area of {A}" endfor echo "\n\t\ttype()\ttypename()\n\t\t------\t----------" echo $"Circle\t\t{Circle->type()}\t{Circle->typename()}" @@ -2043,19 +2246,19 @@ classes, objects, and interface: >vim9 An |enum| may be used as a type (|v:t_enum|). Variables holding enum values have the enumvalue type (|v:t_enumvalue|) at runtime. The following interactive example prompts for a character and returns information about -either a square or a rhombus. It also reports on the |type()| and |typename()| -of the enum and enumvalue: >vim9 - +either a square or a rhombus. It also reports on the |type()| and the +|typename()| of the enum and enumvalue: +>vim9 vim9script enum Quad - Square('four', 'only'), - Rhombus('opposite', 'no') - var eq: string - var ra: string - def string(): string - return $"\nA {this.name} has " .. - $"{this.eq} equal sides and {this.ra} right angles\n\n" - enddef + Square('four', 'only'), + Rhombus('opposite', 'no') + var eq: string + var ra: string + def string(): string + return $"\nA {this.name} has " .. + $"{this.eq} equal sides and {this.ra} right angles\n\n" + enddef endenum echo "Rhombus (r) or Square (s)?" var myQuad: Quad = getcharstr() =~ '\c^R' ? Quad.Rhombus : Quad.Square @@ -2063,10 +2266,10 @@ of the enum and enumvalue: >vim9 echo $"Quad \t{Quad->type()} \t{Quad->typename()}" echo $"myQuad\t{myQuad->type()}\t{myQuad->typename()}" < - Notes: This script uses builtin method "string()" (|object-string()|). - The typename() of Quad and myQuad are the same ("enum") - whereas the type() is distinguished (myQuad returns 16, - enumvalue, whereas Quad returns 15, enum). + Notes: This uses builtin method "string()" - see |object-string()|. + The typename() of Quad and myQuad are the same ("enum") whereas + the type() is distinguished (myQuad returns 16, which is an EnumValue, + whereas Quad returns 15, which is an Enum). Variable types and type casting ~ *variable-types* @@ -2096,33 +2299,33 @@ The difference is demonstrated in the following example. With funcref variable "NTC", Vim infers the expression type "[1, b:two]" as list, then verifies whether it can be assigned to the list return type. With funcref variable "TC", the type cast means Vim first checks whether "b:two" is -a type: >vim9 - +a type: +>vim9 vim9script b:two = '2' const NTC: func = (): list => { - return [1, b:two] - } + return [1, b:two] + } disassemble NTC # 3 CHECKTYPE list stack [-1] try - NTC() + NTC() catch - echo v:exception .. "\n\n" # expected list but... + echo v:exception .. "\n\n" # E1012: Type mismatch; Expected list... endtry const TC: func = (): list => { - return [1, b:two] - } + return [1, b:two] + } disassemble TC # 2 CHECKTYPE number stack [-1] try - TC() + TC() catch - echo v:exception # expected number but got string + echo v:exception # E1012: Type mismatch; Expected number but got... endtry < - Note: Notice how the error messages differ, showing when - type checking occurs. + Note: Notice how the error messages differ, showing when type checking + occurs. - *E1104* + *E1104* The syntax of a type cast is "<{type}>". An error occurs if either the opening "<" (|E121|) or closing ">" (E1104) is omitted. Also, white space is not allowed either after the "<" (|E15|) or before the ">" (|E1068|), which @@ -2134,8 +2337,8 @@ function such as |string()| to convert to a string, or |str2nr()| to convert a string to a number. If type casting is applied to a chained expression, it must be compatible with -the final result. Examples: >vim9 - +the final result. Examples: +>vim9 vim9script # These type casts work echo >[3, 2, 1]->extend(['Go!']) @@ -2144,24 +2347,31 @@ the final result. Examples: >vim9 # This type cast fails echo [3, 2, 1]->extend(['Go!'])->string() < - *E1272* + *E1272* If a type is used in a context where types are not expected you can get E1272. For example: > :vim9cmd echo islocked('x: string') -< Note: This must be executed from Vim's command line, not sourced. +< Note: To see the error, this command must be executed from Vim's command + line, not sourced. - *E1363* + *E1363* *E1395* If a type is incomplete, such as when an object's class is unknown, E1363 -results. For example: >vim9 - +or E1395 are given. Examples: +>vim9 + vim9script + var E1363 = null_class.member # E1363: Incomplete type +< >vim9 vim9script - var E1363 = null_class.member # E1363: Incomplete type + def F1395(): void + echo null_class.member + enddef + F1395() # E1395: Using a null class < -Another null object-related error is |E1360|: >vim9 - +Another null object-related error is |E1360|: +>vim9 vim9script var obj = null_object - var E1360 = obj.MyMethod() # E1360: Using a null object + var E1360 = obj.MyMethod() # E1360: Using a null object < Type inference ~ @@ -2170,32 +2380,32 @@ Declaring types explicitly provides many benefits, including targeted type checking and clearer error messages. Nonetheless, Vim often can infer types automatically when they are omitted. For example, each of these variables' types are inferred, with the |type()| and |typename()| echoed showing those -inferred types: >vim9 - +inferred types: +>vim9 vim9script echo "\t type()\t typename()" - var b = true | echo $"{b} \t {b->type()} \t {b->typename()}" - var f = 4.2 | echo $"{f} \t {f->type()} \t {f->typename()}" - var l = [1, 2] | echo $"{l} \t {l->type()} \t {l->typename()}" - var n = 42 | echo $"{n} \t {n->type()} \t {n->typename()}" - var s = 'yes' | echo $"{s} \t {s->type()} \t {s->typename()}" - var t = (42, ) | echo $"{t} \t {t->type()} \t {t->typename()}" + var b = true | echo $"{b} \t {b->type()} \t {b->typename()}" + var f = 4.2 | echo $"{f} \t {f->type()} \t {f->typename()}" + var l = [1, 2] | echo $"{l} \t {l->type()} \t {l->typename()}" + var n = 42 | echo $"{n} \t {n->type()} \t {n->typename()}" + var s = 'yes' | echo $"{s} \t {s->type()} \t {s->typename()}" + var t = (42, ) | echo $"{t} \t {t->type()} \t {t->typename()}" < The type of a list, tuple, or dictionary is inferred from the common type of its values. When the values are all the same type, that type is used. If there is a mix of types, the "any" type is used. In the following example, -the echoed |typename()| for each literal demonstrates these points: >vim9 - +the echoed |typename()| for each literal demonstrates these points: +>vim9 vim9script - echo [1, 2]->typename() # list - echo [1, 'x']->typename() # list - echo {ints: [1, 2], bools: [false]}->typename() # dict> - echo (true, false)->typename() # tuple + echo [1, 2]->typename() # list + echo [1, 'x']->typename() # list + echo {ints: [1, 2], bools: [false]}->typename() # dict> + echo (true, false)->typename() # tuple < The common type of function references, when they do not all have the same number of arguments, is indicated with "(...)", meaning the number of -arguments is unequal. This script demonstrates a "list": >vim9 - +arguments is unequal. This script demonstrates a "list": +>vim9 vim9script def Foo(x: bool): void enddef @@ -2205,12 +2415,12 @@ arguments is unequal. This script demonstrates a "list": >vim9 echo funclist->typename() < Script-local variables in a Vim9 script are type checked. The type is -also checked for variables declared in a legacy function. For example: >vim9 - +also checked for variables declared in a legacy function. For example: +>vim9 vim9script var my_local = (1, 2) function Legacy() - let b:legacy = [1, 2] + let b:legacy = [1, 2] endfunction Legacy() echo $"{my_local} is type {my_local->type()} ({my_local->typename()})" @@ -2220,24 +2430,24 @@ also checked for variables declared in a legacy function. For example: >vim9 When a type is declared for a List, Tuple, or Dictionary, the type is attached to it. Similarly, if a type is not declared, the type Vim infers is attached. In either case, if an expression attempts to change the type, E1013 results. -This example has its type inferred and demonstrates E1013: >vim9 - +This example has its type inferred and demonstrates E1013: +>vim9 vim9script var lb = [true, true] # Two bools, so Vim infers list type - echo lb->typename() # Echoes list + echo lb->typename() # list lb->extend([0]) # E1013 Argument 2: type mismatch, ... < If you want a permissive list, either explicitly use or declare an -empty list initially (or both, i.e., `list = []`). Examples: >vim9 - +empty list initially (or both, i.e., `list = []`). Examples: +>vim9 vim9script final la: list = [] echo la->extend(['two', 1]) final le = [] echo le->extend(la) < -Similarly for a permissive dictionary: >vim9 - +Similarly for a permissive dictionary: +>vim9 vim9script final da: dict = {} echo da->extend({2: 2, 1: 'One'}) @@ -2245,8 +2455,8 @@ Similarly for a permissive dictionary: >vim9 echo de->extend(da)->string() < And, although tuples themselves are immutable, permissive tuple concatenation -can be achieved with either "any" or an empty tuple: >vim9 - +can be achieved with either "any" or an empty tuple: +>vim9 vim9script var t_any: tuple<...list> = (3, '2') t_any = t_any + (true, ) @@ -2256,155 +2466,158 @@ can be achieved with either "any" or an empty tuple: >vim9 echo t_dec_empty < If a list literal or dictionary literal is not bound to a variable, its type -may change, as this example shows: >vim9 - +may change, as this example shows: +>vim9 vim9script - echo [3, 2, 1]->typename() # list - echo [3, 2, 1]->extend(['Zero'])->typename() # list - echo {1: ['One']}->typename() # dict> - echo {1: ['One']}->extend({2: [2]})->typename() # dict> + echo [3, 2, 1]->typename() # list + echo [3, 2, 1]->extend(['Zero'])->typename() # list + echo {1: ['One']}->typename() # dict> + echo {1: ['One']}->extend({2: [2]})->typename() # dict> < Stricter type checking ~ - *type-checking* + *type-checking* In legacy Vim script, where a number was expected, a string would be automatically converted to a number. This was convenient for an actual number such as "123", but leads to unexpected problems (and no error message) if the string doesn't start with a number. Quite often this leads to hard-to-find -bugs. For example, in legacy Vim script this echoes "1": >vim - +bugs. For example, in legacy Vim script this echoes "1": +>vim echo 123 == '123' < -However, if an unintended space is included, "0" is echoed: >vim - +However, if an unintended space is included, "0" is echoed: +>vim echo 123 == ' 123' < - *E1206* + *E1206* In Vim9 script this has been made stricter. In most places it works just as before if the value used matches the expected type. For example, in both legacy Vim script and Vim9 script trying to use anything other than a -dictionary when it is required: >vim - +dictionary when it is required: +>vim echo [8, 9]->keys() - vim9cmd echo [8, 9]->keys() # E1206: Dictionary required + vim9cmd echo [8, 9]->keys() # E1206: Dictionary required < - *E1023* *E1024* *E1029* *E1030* - *E1174* *E1175* *E1210* *E1212* + *E1023* *E1024* *E1029* + *E1030* *E1174* *E1175* + *E1210* *E1212* However, sometimes there will be an error in Vim9 script, which breaks backwards compatibility. The following examples illustrate various places this happens. The legacy Vim script behavior, which does not fail, is shown first. It is followed by the error that occurs if the same command is used in Vim9 script. - - Using a number (except 0 or 1) where a bool is expected: >vim - +- Using a number (except 0 or 1) where a bool is expected: +>vim echo v:version ? v:true : v:false - vim9cmd echo v:version ? true : false # E1023: Using a Number as a... + vim9cmd echo v:version ? true : false # E1023: Using a Number as ... < - - Using a number where a string is expected: >vim - +- Using a number where a string is expected: +>vim echo filter([1, 2], 0) - vim9cmd echo filter([1, 2], 0) # E1024: Using a Number as a String + vim9cmd echo filter([1, 2], 0) # E1024: Using a Number as a String < - - Not using a number where a number is expected: >vim - - " In this example, Vim script treats v:false as 0 +- Not using a number where a number is expected: +>vim + " In this example, legacy Vim script treats v:false as 0 function Not1029() - let b:l = [42] | unlet b:l[v:false] + let b:l = [42] | unlet b:l[v:false] endfunction call Not1029() | echo b:l < >vim9 vim9script def E1029(): void - b:l = [42] | unlet b:l[false] + b:l = [42] | unlet b:l[false] enddef E1029() # E1029: Expected number but got bool < - - Using a string as a number: >vim - +- Using a string as a number: +>vim let b:l = [42] | unlet b:l['#'] | echo b:l - vim9cmd b:l = [42] | vim9cmd unlet b:l['#'] # E1030: Using a string... + vim9cmd b:l = [42] | vim9cmd unlet b:l['#'] # E1030: Using a string < - - Not using a string where an argument requires a string: >vim9 - +- Not using a string where an argument requires a string: +>vim9 echo substitute('Hallo', 'a', 'e', v:true) - vim9cmd echo substitute('Hallo', 'a', 'e', true) # E1174: String... + vim9cmd echo substitute('Hallo', 'a', 'e', true) # E1174: String ... < - - Using an empty string in an argument that requires a non-empty string: >vim9 - +- Using an empty string in an argument that requires a non-empty string: +>vim9 echo exepath('') - vim9cmd echo exepath('') # E1175: Non-empty string required for arg... + vim9cmd echo exepath('') # E1175: Non-empty string required for ar... < - - Not using a number when it is required: >vim - +- Not using a number when it is required: +>vim echo gettabinfo('a') vim9cmd echo gettabinfo('a') # E1210: Number required for argument 1 < - - Not using a bool when it is required: >vim - +- Not using a bool when it is required: +>vim echo char2nr('¡', 2) vim9cmd echo char2nr('¡', 2) # E1212: Bool required for argument 2 < - - Not using a number when a number is required (|E521|): >vim - +- Not using a number when a number is required (|E521|): +>vim let &laststatus='2' vim9cmd &laststatus = '2' < - - Not using a string when a string is required (|E928|): >vim - +- Not using a string when a string is required (|E928|): +>vim let &langmenu = 42 vim9cmd &langmenu = 42 # E928: String required < - - Comparing a |Special| with 'is' fails in some instances (|E1037|, |E1072|): >vim - - " 1 is echoed because these are both true +- Comparing a |Special| with "is" often fails (|E1037|, |E1072|): +>vim + " 1 is echoed because these are both true in legacy Vim script echo v:null is v:null && v:none is v:none - " 0 is echoed because all these expressions are false + " Similarly, 0 is echoed for these (false in legacy Vim script) echo v:none is v:null || v:none is 8 || v:true is v:none " All these are errors in Vim9 script - vim9cmd echo v:null is v:null # E1037: Cannot use 'is' with special - vim9cmd echo v:none is v:none # E1037: Cannot use 'is' with special - vim9cmd echo v:none is v:null # E1037: Cannot use 'is' with special - vim9cmd echo v:none is 8 # E1072: Cannot compare special with numb - vim9cmd echo v:true is v:none # E1072: Cannot compare bool with special + vim9cmd echo v:null is v:null # E1037: Cannot use 'is' with special + vim9cmd echo v:none is v:none # E1037: Cannot use 'is' with special + vim9cmd echo v:none is v:null # E1037: Cannot use 'is' with special + vim9cmd echo v:none is 8 # E1072: Cannot compare special wit... + vim9cmd echo v:true is v:none # E1072: Cannot compare bool with s... < - Note: Although the last two Vim9 script examples above error using - `v:none`, they return `false` using `null` (which is the same - as `v:null` - see |v:null|): >vim9 - - vim9script - echo null is 8 # false - echo true is null # false + Note: Although the last two Vim9 script examples above error with + `v:none`, they return `false` with `v:null` (which is the same as + `null` - see |v:null|): +>vim9 + vim9script + echo v:null is 8 # false + echo true is v:null # false < - - Using a string where a bool is required (|E1135|): >vim - +- Using a string where a bool is required (|E1135|): +>vim echo '42' ? v:true : v:false vim9cmd echo '42' ? true : false # E1135: Using a String as a Bool < - - Using a bool as a number (|E1138|): >vim - +- Using a bool as a number (|E1138|): +>vim let &laststatus=v:true vim9cmd &laststatus = true < One consequence is that the item type of a list or dict given to |map()| must not change when its type is either declared or inferred. For example, this -gives an error in Vim9 script, whereas in legacy Vim script it is allowed: >vim - - " legacy Vim script changes s:mylist to ['item 0', 'item 1'] +list's type is changed successfully in legacy Vim script: +>vim + " legacy Vim script changing list [0, 1] to ['item 0', 'item 1'] let s:mylist = [0, 1] call map(s:mylist, {i -> $"item {i}"}) echo s:mylist -< >vim9 +< +whereas in Vim9 script it gives |E1012|: +>vim9 vim9script - var mylist = [0, 1] # Vim infers mylist is list - map(mylist, (i, _) => $"item {i}") # E1012: type mismatch... + var mylist = [0, 1] # Vim infers mylist is list + map(mylist, (i, _) => $"item {i}") # E1012: Type mismatch; expected... < The error occurs because `map()` tries to modify the list elements to strings, which conflicts with the declared type. -Use |mapnew()| instead. It creates a new list, and Vim infers its type if it -is not specified. Inferred and declared types are shown in this example: >vim9 - +Use |mapnew()| instead. It creates a new list, and Vim infers its type when it +is not specified. Inferred and declared types are shown in this example: +>vim9 vim9script var mylist = [0, 1] var infer = mylist->mapnew((i, _) => $"item {i}") @@ -2415,10 +2628,10 @@ is not specified. Inferred and declared types are shown in this example: >vim9 The key concept here is, variables with declared or inferred types cannot have the types of the elements within their containers change. However, type "changes" are allowed for either: - - a container literal (not bound to a variable), or - - a container where |copy()| or |deepcopy()| is used in method chaining. -Both are demonstrated in this example: >vim9 - +- a container literal (not bound to a variable), or +- a container where |copy()| or |deepcopy()| is used in method chaining. +Both are demonstrated in this example: +>vim9 vim9script # list literal echo [1, 2]->map((_, v) => $"#{v}") @@ -2437,10 +2650,10 @@ not needed because the original list is unchanged (as "echo mylist" shows, above). If the item type was not declared or determined to be "", it will not -change, even if all items later become the same type. However, when `mapnew()` -is used, inference means that the new list will reflect the type(s) present. -For example: >vim9 - +change, even if all items later become the same type. However, when +`mapnew()` is used, inference means that the new list will reflect the type(s) +present. For example: +>vim9 vim9script # list var mylist = [1, '2'] # mixed types, i.e., list @@ -2452,87 +2665,87 @@ For example: >vim9 echo (newlist, newlist->typename()) # newlist is a list < Using |extend()| and |extendnew()| is similar, i.e., a list literal may use -the former, so, this is okay: >vim9 - - vim9cmd echo [1, 2]->extend(['3']) # [1, 2, 3] +the former, so, this is okay: +>vim9 + vim9cmd echo [1, 2]->extend(['3']) # [1, 2, '3'] < -whereas, this is not: >vim9 - +whereas, this is not: +>vim9 vim9script var mylist: list = [1, 2] - echo mylist->extend(['3']) # E1013: Argument 2: type mismatch + echo mylist->extend(['3']) # E1013: Argument 2: type mismatch < Using |extendnew()| is needed for extending an existing typed list, except where the extension matches the list's type (or it is "any"). For example, first extending with an element of the same type, then extending with a -different type: >vim9 - +different type: +>vim9 vim9script var mylist: list = [1, 2] mylist->extend([3]) - echo mylist->extendnew(['4']) # [1, 2, 3, '4'] - -< *E1158* + echo mylist->extendnew(['4']) # [1, 2, 3, '4'] +< + *E1158* Using |flatten()| is not allowed in Vim9 script, because it is intended always to change the type. This even applies to a list literal -(unlike |map()| and |extend()|). Instead, use |flattennew()|: >vim9 - +(unlike |map()| and |extend()|). Instead, use |flattennew()|: +>vim9 vim9cmd [1, [2, 3]]->flatten() # E1158: Cannot use flatten vim9cmd echo [1, [2, 3]]->flattennew() # [1, 2, 3] < Assigning to a funcref with specified arguments (see |vim9-func-declaration|) -involves strict type checking of the arguments. For example, this works: >vim9 - +involves strict type checking of the arguments. For example, this works: +>vim9 vim9script var F_name_age: func(string, number): string F_name_age = (n: string, a: number): string => $"Name: {n}, Age: {a}" echo F_name_age('Bob', 42) < -whereas this fails with error |E1012| (type mismatch): >vim9 - +whereas this fails with error |E1012| (type mismatch): +>vim9 vim9script var F_name_age: func(string, number): string F_name_age = (n: string, a: string): string => $"Name: {n}, Age: {a}" < If there is a variable number of arguments they must have the same type, as in -this example: >vim9 - +this example: +>vim9 vim9script var Fproduct: func(...list): number Fproduct = (...v: list): number => reduce(v, (a, b) => a * b) - echo Fproduct(3, 2, 4) # Echoes 24 + echo Fproduct(3, 2, 4) # 24 < -And may be used to accommodate mixed types: >vim9 - +And may be used to accommodate mixed types: +>vim9 vim9script var FlatSort: func(...list): any FlatSort = (...v: list) => flattennew(v)->sort('n') - echo FlatSort(true, [[[5, 3], 2], 4]) # Echoes [true, 2, 3, 4, 5] -< - Note: Using in a lambda does not avoid type checking of the - funcref. It remains constrained by the declared funcref's - type and, as these examples show, a runtime or compiling error - occurs when the types mismatch: >vim9 - - vim9script - var FuncSN: func(string): number - FuncSN = (v: any): number => v->str2nr() - echo FuncSN('162')->nr2char() # Echoes ¢ - echo FuncSN(162)->nr2char()) # E1013 (runtime error) + echo FlatSort(true, [[[5, 3], 2], 4]) # [true, 2, 3, 4, 5] +< + Note: Using in a lambda does not avoid type checking of the + funcref. It remains constrained by the declared funcref's type and, + as these examples show, a runtime or compiling error occurs when the + types mismatch: +>vim9 + vim9script + var FuncSN: func(string): number + FuncSN = (v: any): number => v->str2nr() + echo FuncSN('162')->nr2char() # ¢ + echo FuncSN(162)->nr2char() # E1013 (a runtime error) < >vim9 - vim9script - var FuncSN: func(string): number - FuncSN = (v: any): number => v->str2nr() - def FuncSNfail(): void - echo FuncSN('162')->nr2char() # No echo because ... - echo FuncSN(162)->nr2char() # Error while compiling - enddef - FuncSNfail() + vim9script + var FuncSN: func(string): number + FuncSN = (v: any): number => v->str2nr() + def FuncSNfail(): void + echo FuncSN('162')->nr2char() # No echo because ... + echo FuncSN(162)->nr2char() # E1013 (now, a compiling error) + enddef + FuncSNfail() < When the funcref has no arguments specified, there is no type checking. This example shows FlexArgs has a string argument the first time and a list the -following time: >vim9 - +following time: +>vim9 vim9script var FlexArgs: func: string FlexArgs = (s: string): string => $"It's countdown time {s}..." @@ -2540,40 +2753,40 @@ following time: >vim9 FlexArgs = (...values: list): string => join(values, ', ') echo FlexArgs('3', '2', '1', 'GO!') < - *E1211* *E1217* *E1218* *E1219* *E1220* - *E1221* *E1222* *E1223* *E1224* *E1225* - *E1226* *E1228* *E1235* *E1238* *E1251* - *E1253* *E1256* *E1297* *E1298* *E1301* - *E1528* *E1529* *E1530* *E1531* *E1534* + *E1211* *E1217* *E1218* *E1219* *E1220* + *E1221* *E1222* *E1223* *E1224* *E1225* + *E1226* *E1228* *E1235* *E1238* *E1251* + *E1253* *E1256* *E1297* *E1298* *E1301* + *E1528* *E1529* *E1530* *E1531* *E1534* Types are checked for most builtin functions to make it easier to spot mistakes. The following one-line |:vim9| commands, calling builtin functions, -demonstrate many of those type-checking errors: >vim9 - - vim9 9->list2blob() # E1211: List required for argume... - vim9 9->ch_close() # E1217: Channel or Job required ... - vim9 9->job_info() # E1218: Job required for argumen... - vim9 [9]->cos() # E1219: Float or Number required... - vim9 {}->remove([]) # E1220: String or Number require... +demonstrate many of those type-checking errors: +>vim9 + vim9 9->list2blob() # E1211: List required for argume... + vim9 9->ch_close() # E1217: Channel or Job required ... + vim9 9->job_info() # E1218: Job required for argumen... + vim9 [9]->cos() # E1219: Float or Number required... + vim9 {}->remove([]) # E1220: String or Number require... vim9 null_channel->ch_evalraw(9) # E1221: String or Blob required ... - vim9 9->col() # E1222: String or List required ... - vim9 9->complete_add() # E1223: String or Dictionary req... - vim9 setbufline(9, 9, {}) # E1224: String, Number or List r... - vim9 9->count(9) # E1225: String, List, Tuple or D... - vim9 9->add(9) # E1226: List or Blob required fo... - vim9 9->remove(9) # E1228: List, Dictionary, or Blo... - vim9 getcharstr('9') # E1235: Bool or number required ... - vim9 9->blob2list() # E1238: Blob required for argume... - vim9 9->filter(9) # E1251: List, Tuple, Dictionary,... - vim9 9->reverse() # E1253: String, List, Tuple or B... - vim9 9->call(9) # E1256: String or Function requi... - vim9 null_dict->winrestview() # E1297: Non-NULL Dictionary requ... + vim9 9->col() # E1222: String or List required ... + vim9 9->complete_add() # E1223: String or Dictionary req... + vim9 setbufline(9, 9, {}) # E1224: String, Number or List r... + vim9 9->count(9) # E1225: String, List, Tuple or D... + vim9 9->add(9) # E1226: List or Blob required fo... + vim9 9->remove(9) # E1228: List, Dictionary, or Blo... + vim9 getcharstr('9') # E1235: Bool or number required ... + vim9 9->blob2list() # E1238: Blob required for argume... + vim9 9->filter(9) # E1251: List, Tuple, Dictionary,... + vim9 9->reverse() # E1253: String, List, Tuple or B... + vim9 9->call(9) # E1256: String or Function requi... + vim9 null_dict->winrestview() # E1297: Non-NULL Dictionary requ... vim9 {}->prop_add_list(null_list) # E1298: Non-NULL List required f... - vim9 {}->repeat(9) # E1301: String, Number, List, Tu... - vim9 9->index(9) # E1528: List or Tuple or Blob re... - vim9 9->join() # E1529: List or Tuple required f... - vim9 9->max() # E1530: List or Tuple or Diction... - vim9 9->get(9) # E1531: Argument of get() must b... - vim9 9->tuple2list() # E1534: Tuple required for argum... + vim9 {}->repeat(9) # E1301: String, Number, List, Tu... + vim9 9->index(9) # E1528: List or Tuple or Blob re... + vim9 9->join() # E1529: List or Tuple required f... + vim9 9->max() # E1530: List or Tuple or Diction... + vim9 9->get(9) # E1531: Argument of get() must b... + vim9 9->tuple2list() # E1534: Tuple required for argum... < Reserved for future use: *E1227* *E1250* *E1252* E1227: List or Dictionary required for argument %d @@ -2592,54 +2805,56 @@ When declaring a variable without an initializer, an explicit type must be provided. Each category has different default initialization semantics. Primitives default to type-specific values. All primitives are empty but do -not equal `null`: >vim9 - - vim9script - var n: number | echo [n, n->empty(), n == null] # [0, 1, false] - var f: float | echo [f, f->empty(), f == null] # [0.0, 1, false] - var b: bool | echo [b, b->empty(), b == null] # [false, 1, false] -< -Containers default to an empty container. Only an empty string equals `null`: >vim9 - - vim9script - var s: string | echo [s, s->empty(), s == null] # ['', 1, true] - var z: blob | echo [z, z->empty(), z == null] # [0z, 1, false] - var l: list | echo [l, l->empty(), l == null] # [[], 1, false] - var t: tuple | echo [t, t->empty(), t == null] # [(), 1, false] - var d: dict | echo [d, d->empty(), d == null] # [{}, 1, false] -< -Specialized types default to equaling `null`: >vim9 - - vim9script - var F: func | echo [F, F == null] # [function(''), true] - var j: job | echo [j, j == null] # ['no process', true] - var c: channel | echo [c, c == null] # ['channel fail', true] - class Class - endclass - var o: Class | echo [o, o == null] # [object of [unknown], true] - enum Enum - endenum - var e: Enum | echo [e, e == null] # [object of [unknown], true] -< - Note: See |empty()| for explanations of empty job, empty channel, and - empty object types. +not equal `null`: +>vim9 + vim9script + var n: number | echo [n, n->empty(), n == null] # [0, 1, false] + var f: float | echo [f, f->empty(), f == null] # [0.0, 1, false] + var b: bool | echo [b, b->empty(), b == null] # [false, 1, false] +< +Containers default to an empty container. Only an empty string equals `null`: +>vim9 + vim9script + var s: string | echo [s, s->empty(), s == null] # ['', 1, true] + var z: blob | echo [z, z->empty(), z == null] # [0z, 1, false] + var l: list | echo [l, l->empty(), l == null] # [[], 1, false] + var t: tuple | echo [t, t->empty(), t == null] # [(), 1, false] + var d: dict | echo [d, d->empty(), d == null] # [{}, 1, false] +< +Specialized types default to equaling `null`: +>vim9 + vim9script + var F: func | echo [F, F == null] # [function(''), true] + var j: job | echo [j, j == null] # ['no process', true] + var c: channel | echo [c, c == null] # ['channel fail', true] + class Class + endclass + var o: Class | echo [o, o == null] # [object of [unknown], true] + enum Enum + endenum + var e: Enum | echo [e, e == null] # [object of [unknown], true] +< + Notes: (1) See |empty()| for explanations of empty job, empty channel, + and empty object types. (2) The `class`, `enum`, and `typealias` + types cannot be used as values, so cannot be compared to `null` (see + |E1405|, |E1421|, and |E1403| respectively). Vim does not have a familiar null value. Instead, it has various null_ predefined values including |null_string|, |null_list|, and |null_job|. Primitives do not have a null_. Typical use cases for null_ are: - - to clear a variable and release its resources, - - as a default for a parameter in a function definition (for an example, - see |null_blob|), or - - assigned to a container or specialized variable to set it to null - for later comparison (for an example, see |null-compare|). +- to clear a variable and release its resources, +- as a default for a parameter in a function definition (for an example, + see |null_blob|), or +- assigned to a container or specialized variable to set it to null + for later comparison (for an example, see |null-compare|). For a specialized variable, like `job`, null_ is used to clear the -resources. For example: >vim9 - +resources. For example: +>vim9 vim9script var mydate: list def Date(channel: channel, msg: string): void - mydate->add(msg) + mydate->add(msg) enddef var myjob = job_start([&shell, &shellcmdflag, 'date'], {out_cb: Date}) echo [myjob, myjob->job_status()] @@ -2650,30 +2865,31 @@ resources. For example: >vim9 echo myjob < For a container variable, resources may also be cleared by assigning an -empty container to the variable. For example: >vim9 - +empty container to the variable. For example: +>vim9 vim9script var perfect: list = [1, 4] perfect->extend([9, 16, 25]) perfect = [] echo perfect - +< Using an empty container, rather than null_, to clear a container variable may avoid null complications - see |null-anomalies|. The initialization semantics of container variables and specialized variables differ. For containers: - - An uninitialized container defaults to empty but does not equal `null` - (except for a uninitialized string). - - A container initialized to [], (), {}, "", or 0z is empty but does not - equal `null`. - - A container initialized as null_ defaults to empty and equals `null`. +- An uninitialized container defaults to empty but does not equal `null` + (except for an uninitialized string). +- A container initialized to [], (), {}, "", or 0z is empty but does not equal + `null`. +- A container initialized as null_ defaults to empty and it also equals + `null`. In the following example, the uninitialized list ("lu") and [] initialized list ("li") are equivalent and indistinguishable whereas "ln" is a null container, which is similar to, but not equivalent to, an empty container -(see |null-anomalies|). >vim9 - +(see |null-anomalies|). +>vim9 vim9script # uninitialized: empty container, not null var lu: list @@ -2686,8 +2902,8 @@ container, which is similar to, but not equivalent to, an empty container echo ['ln', $"empty={ln->empty()}", $"null={ln == null}"] < Specialized variables default to equaling null. These job initializations -are equivalent and indistinguishable: >vim9 - +are equivalent and indistinguishable: +>vim9 vim9script var j1: job var j2: job = null_job @@ -2695,8 +2911,8 @@ are equivalent and indistinguishable: >vim9 echo (j1 == j2) == (j2 == j3) # true (equivalent, indistinguishable) < When a list, tuple, or dict is declared, if the item type is not specified -it cannot be inferred. Consequently, the item type defaults to "any": >vim9 - +it cannot be inferred. Consequently, the item type defaults to "any": +>vim9 vim9script var [t1, t2] = [(), null_tuple] echo $'t1 is {t1->typename()} and t2 is {t2->typename()} too' @@ -2704,40 +2920,38 @@ it cannot be inferred. Consequently, the item type defaults to "any": >vim9 Tuples and functions (or partials) may be declared in various ways. See |tuple-type|, |variadic-tuple|, and |vim9-func-declaration|. - *null-compare* + *null-compare* For familiar null compare semantics, where an empty container is not equal to a null container, do not use null_ in a comparison. That is because, in Vim9 script, although null_ == `null`, comparing an: +- empty container to `null` is `false`, but +- empty container to null_ is `true`. - - empty container to `null` is `false`, but - - empty container to null_ is `true`. - -So, compare against `null`, not null_. For example: >vim9 - +So, compare against `null`, not null_. For example: +>vim9 vim9script var bonds: dict> = {g: ['007', '008'], o: ['007', '009']} def Search(query: string): list - return query == "\r" ? null_list : bonds->get(query, []) + return query == "\r" ? null_list : bonds->get(query, []) enddef echo "Goldfinger (g) or Octopussy (o)?: " const C: string = getcharstr() var result: list = C->Search() if result == null # <<< DO NOT USE null_list HERE! - echo "Error: Nothing was entered" + echo "Error: Nothing was entered" else - echo result->empty() ? $"No matches for '{C}'" : $"{result}" + echo result->empty() ? $"No matches for '{C}'" : $"{result}" endif < - NOTE: Using "result == null_list" instead of "result == null" would - fail to distinguish the error (nothing entered) and the valid - (nothing matched) result because [] == null_list whereas - [] != null. + Note: Using "result == null_list" instead of "result == null" would + fail to distinguish the error (nothing entered) and the valid + (nothing matched) result because [] == null_list whereas [] != null. Conceptually, think of the null_ construct as a hybrid/bridge between the general `null` and typed `empty` containers, having properties of both. In the following section there are details about comparison results. - *null-details* *null-anomalies* + *null-details* *null-anomalies* This section describes issues about using null and null_; included below are the enumerated results of null comparisons. In some cases, if familiar with vim9 null semantics, the programmer may choose to use null_ in @@ -2745,8 +2959,8 @@ comparisons and/or other situations. Elsewhere in the documentation it says, "often a null value is handled the same as an empty value, but not always". For example, you cannot add to a -null container: >vim9 - +null container: +>vim9 vim9script var le: list = [] le->add('Okay') # le is now ['Okay'] @@ -2754,103 +2968,103 @@ null container: >vim9 ln->add("E1130") # E1130: Cannot add to null list < As explained in |null-compare|, there is a non-transitive relationship among -`null`, null_ containers, and `empty`. To recap, for example: >vim9 - +`null`, null_ containers, and `empty`. To recap, for example: +>vim9 vim9cmd echo (null_dict == {}, null_dict == null, {} != null) < The exception is an uninitialized string. It is equal to `null` (and is the -same instance as `null_string`). The 'is' operator (|expr-is|) may be used to -determine whether a string is uninitialized: >vim9 - +same instance as `null_string`). The "is" operator (|expr-is|) may be used to +determine whether a string is uninitialized: +>vim9 vim9script var s: string - echo s == null_string # true - echo s is null_string # true (the same instance) - echo s == null # true (unexpected, perhaps) - echo s is null # false (not the same instance) + echo s == null_string # true + echo s is null_string # true (the same instance) + echo s == null # true (unexpected, perhaps) + echo s is null # false (not the same instance) < However, don't do the same for the other containers because, when evaluated -against their applicable null_ with 'is', they return `false`: >vim9 - +against their applicable null_ with "is", they return `false`: +>vim9 vim9script var d: dict - echo d == null_dict # true - echo d is null_dict # false (not the same instance) - echo d == null # false (as expected) - echo d is null # false (not the same instance) + echo d == null_dict # true + echo d is null_dict # false (not the same instance) + echo d == null # false (as expected) + echo d is null # false (not the same instance) < The key distinction here is an uninitialized string is implemented as `null_string`, while an uninitialized list, dict, tuple, or blob is implemented as an empty container ([], {}, (), and 0z respectively). So, those uninitialized types are equal to, but not the same instance as, -their null_ counterparts, as this example shows: >vim9 - +their null_ counterparts, as this example shows: +>vim9 vim9script var t: tuple - echo t == null_tuple # true - echo t is null_tuple # false - + echo t == null_tuple # true + echo t is null_tuple # false +< However, a variable initialized to the null_ is equal not only to the -null_, it is also equal to null. For example: >vim9 - +null_, it is also equal to null. For example: +>vim9 vim9script var t: tuple = null_tuple - echo t == null_tuple # true - echo t is null_tuple # true - echo t == null # true + echo t == null_tuple # true + echo t is null_tuple # true + echo t == null # true < An uninitialized container variable is not equal to null, except for an uninitialized string, which is explained in an example, above. So, these -all echo `true`: >vim9 - +all echo `true`: +>vim9 vim9script - var b: blob | echo b != null - var d: dict | echo d != null - var l: list | echo l != null - var t: tuple | echo t != null - var s: string | echo s == null - -An uninitialized specialized variable is equal to null so these all echo `true`: >vim9 - + var b: blob | echo b != null + var d: dict | echo d != null + var l: list | echo l != null + var t: tuple | echo t != null + var s: string | echo s == null +< +An uninitialized specialized variable is equal to null. So, these all +echo `true`: +>vim9 vim9script - var c: channel | echo c == null - var F: func | echo F == null - var j: job | echo j == null + var c: channel | echo c == null + var F: func | echo F == null + var j: job | echo j == null class Class endclass - var nc: Class | echo nc == null + var nc: Class | echo nc == null enum Enum endenum - var ne: Enum | echo ne == null + var ne: Enum | echo ne == null < - Note: the specialized variables, like job, default to null and - no specialized variable has a corresponding empty value. + Note: the specialized variables, like job, default to null and no + specialized variable has a corresponding empty value. A container variable initialized to empty equals null_, so these are all -`true`: >vim9 - +`true`: +>vim9 vim9script - var s: string = "" | echo s == null_string - var b: blob = 0z | echo b == null_blob - var l: list = [] | echo l == null_list - var t: tuple = () | echo t == null_tuple - var d: dict = {} | echo d == null_dict + var s: string = "" | echo s == null_string + var b: blob = 0z | echo b == null_blob + var l: list = [] | echo l == null_list + var t: tuple = () | echo t == null_tuple + var d: dict = {} | echo d == null_dict < However, a container variable initialized to empty does not equal null, so -these are all `true`: >vim9 - +these are all `true`: +>vim9 vim9script - var s: string = "" | echo s != null - var b: blob = 0z | echo b != null - var l: list = [] | echo l != null - var t: tuple = () | echo t != null - var d: dict = {} | echo d != null + var s: string = "" | echo s != null + var b: blob = 0z | echo b != null + var l: list = [] | echo l != null + var t: tuple = () | echo t != null + var d: dict = {} | echo d != null < ============================================================================== - *generic-functions* -5. Generic functions +5. Generic functions *generic-functions* A generic function allows using the same function with different type arguments, while retaining type checking for arguments and the return value. @@ -2862,24 +3076,24 @@ Declaration~ *E1553* *E1554* The type variables for a generic function are declared as its type parameters within angle brackets ("<" and ">"), directly after the function name. -Multiple type parameters are separated by commas: > - +Multiple type parameters are separated by commas: +> def[!] {funcname}<{type} [, {types}]>([arguments])[: {return-type}] - {function body} + {function body} enddef < *generic-function-example* These type parameters may then be used, like any other type, within the function signature and its body. The following example combines two lists -into a list of tuples: >vim9 - +into a list of tuples: +>vim9 vim9script def Zip(first: list, second: list): list> - const LEN: number = ([first->len(), second->len()])->min() - final result: list> = [] - for i in range(LEN) - result->add((first[i], second[i])) - endfor - return result + const LEN: number = ([first->len(), second->len()])->min() + final result: list> = [] + for i in range(LEN) + result->add((first[i], second[i])) + endfor + return result enddef var n: list = [61, 62, 63] var s: list = ['a', 'b', 'c'] @@ -2891,18 +3105,18 @@ into a list of tuples: >vim9 As in the preceding example, the convention is to use a single capital letter for a name (e.g., T, U, A, etc.). Although they may comprise more than one letter, names must start with a capital letter. In this example, "Ok" is -valid whereas "n" is not: >vim9 - +valid whereas "n" is not: +>vim9 vim9script def MyFail(): void enddef - # E1552: Type variable name must start with an uppercase letter: n... + # E1552: Type variable name must start with an uppercase letter: n>... < - *E1558* *E1560* + *E1558* *E1560* A function must be declared and used either as a generic function or as a regular function, but not both. The following Vim9 scripts demonstrate these -errors: >vim9 - +errors: +>vim9 vim9script My1558() # E1558: Unknown generic function: My1558 @@ -2913,9 +3127,9 @@ errors: >vim9 My1560() # E1560: Not a generic function: My1560 < - *E1561* -Type parameter names must not clash with other identifiers: >vim9 - + *E1561* +Type parameter names must not clash with other identifiers: +>vim9 vim9script def My1561(): D enddef @@ -2927,46 +3141,42 @@ Type parameter names must not clash with other identifiers: >vim9 endenum def My1041(): E enddef - # E0141: Redefining script item "E" + # E1041: Redefining script item: "E" < Calling a generic function~ - *generic-function-call* + *generic-function-call* To call a generic function, specify the concrete types in "<" and ">" -between the function name and the argument list: > - +between the function name and the argument list: +> MyFunc>() < - NOTE: There are several working examples in this section, which may - be sourced, including |generic-function-example|. + Note: There are several working examples in this section, which may be + sourced, including |generic-function-example|. - *E1555* *E1556* *E1557* *E1559* + *E1555* *E1556* *E1557* *E1559* The number of passed type arguments to the function must match the number of its declared type parameters. An empty type list is not allowed. -Examples: >vim9 - +Examples: +>vim9 vim9script def My1555<>(): void - enddef - # E1555: Empty type list specified for generic function ... + enddef # E1555: Empty type list specified for generic function 'vim9 vim9script def My1556(): void enddef - My1556() - # E1556: Too many types specified for generic function ... + My1556() # E1556: Too many types specified for generic... < >vim9 vim9script def My1557(): void enddef - My1557() - # E1557: Not enough types specified for generic function ... + My1557() # E1557: Not enough types specified for generic fun... < >vim9 vim9script def My1559(): T enddef - My1559() - # Vim(eval):E1559: Type arguments missing for generic function ... + My1559() # E1559: Type arguments missing for generic function 'vim9 +An example: +>vim9 vim9script def Outer(): void # Returns either the first item of a list or a default value def FirstOrDefault(lst: list, default: U): any return lst->len() > 0 ? lst[0] : default enddef - echo FirstOrDefault(['B', 'C'], false) # echos B - echo FirstOrDefault([], 42) # echos 42 + echo FirstOrDefault(['B', 'C'], false) # B + echo FirstOrDefault([], 42) # 42 enddef Outer() < Using a type variable as a type argument ~ -A type variable may also be passed as a type argument. For example: >vim9 - +A type variable may also be passed as a type argument. For example: +>vim9 vim9script # T is declared as a type parameter # It is used for the 'value' parameter and the return type def Id(value: T): T - return value + return value enddef # U is declared as a type parameter # It is used for the 'value' parameter and the return type def CallId(value: U): U - # U is a type variable passed/used as a type argument - return Id(value) + # U is a type variable passed/used as a type argument + return Id(value) enddef echo CallId('I am') .. ' ' .. CallId(42) - +< This is useful for complex data structures like dictionaries of lists or, -as in the following example, lists of dictionaries: >vim9 - +as in the following example, lists of dictionaries: +>vim9 vim9script def Flatten(x: list>): list - final result: list = [] - for inner in x - result->extend(inner) - endfor - return result + final result: list = [] + for inner in x + result->extend(inner) + endfor + return result enddef const ENGLISH: list> = [{1: 'one'}, {2: 'two'}] const MANDARIN: list> = [{1: '壹'}, {2: '贰'}] @@ -3035,20 +3246,20 @@ the function, "T" is a type variable referencing that type parameter. Generic class method~ -A Vim9 class method can be a generic function: >vim9 - +A Vim9 class method can be a generic function: +>vim9 vim9script class Config - var settings: dict - def Get(key: string): T - return this.settings[key] - enddef + var settings: dict + def Get(key: string): T + return this.settings[key] + enddef endclass var c: Config = Config.new({timeout: 30, debug: true}) echo c.Get('timeout') echo c.Get('debug') < - *E1432* *E1433* *E1434* + *E1432* *E1433* *E1434* A generic class method in a base class can be overridden by a generic method in a child class. The number of type variables must match between both methods. A concrete class method cannot be overridden by a generic method, @@ -3058,34 +3269,34 @@ and vice versa. Generic function reference~ A function reference (|Funcref|) can be a generic function. This allows for -creating factories of functions that operate on specific types: >vim9 - +creating factories of functions that operate on specific types: +>vim9 vim9script # Match a specified character in a string or the decimal value of the # character in a list. Note: '*' is decimal 42 (U+002A) var c: string = "*" var char_dec: tuple = (c, c->char2nr()->string()) def Matcher(pattern: string): func(T): bool - return (value: T): bool => match(value, pattern) >= 0 + return (value: T): bool => match(value, pattern) >= 0 enddef var StringMatch = Matcher(char_dec[0]) - echo "*+"->StringMatch() # true (has *) - echo ",-"->StringMatch() # false + echo "*+"->StringMatch() # true (has *) + echo ",-"->StringMatch() # false var ListMatch = Matcher>(char_dec[1]) - echo [42, 43]->ListMatch() # true (has 42) - echo [44, 45]->ListMatch() # false + echo [42, 43]->ListMatch() # true (has 42) + echo [44, 45]->ListMatch() # false < Compiling and Disassembling Generic functions~ The |:defcompile| command can be used to compile a generic function with a -specific list of concrete types: > - +specific list of concrete types: +> defcompile MyFunc, dict> < The |:disassemble| command can be used to list the instructions generated for -a generic function: > - +a generic function: +> disassemble MyFunc> disassemble MyFunc> < @@ -3093,18 +3304,17 @@ a generic function: > Limitations and Future Work~ Currently, Vim does not support: - - Type inference for type variables: All types must be explicitly specified - when calling a generic function. - - Type constraints: It's not possible to restrict a type variable to a - specific class or interface (e.g., `T extends SomeInterface`). - - Default type arguments: Providing a default type for a type parameter - when not explicitly specified. +- Type inference for type variables: All types must be explicitly specified + when calling a generic function. +- Type constraints: It's not possible to restrict a type variable to a + specific class or interface (e.g., `T extends SomeInterface`). +- Default type arguments: Providing a default type for a type parameter + when not explicitly specified. ============================================================================== -6. Namespace, Import and Export - *vim9script* *vim9-export* *vim9-import* - +6. Namespace, Import and Export *vim9script* + *vim9-export* *vim9-import* A Vim9 script can be written to be imported. This means that some items are intentionally exported, made available to other scripts. When the exporting script is imported in another script, these exported items can then be used in @@ -3123,26 +3333,39 @@ only for things that really are global. Namespace ~ *vim9-namespace* -To recognize a file that can be imported the `vim9script` statement must -appear as the first statement in the file (see |vim9-mix| for an exception). +To recognize a file that can be imported, the `vim9script` command must appear +as the first command in the file (though see |vim9-mix| for an exception). It tells Vim to interpret the script in its own namespace, instead of the -global namespace. If a file starts with: > +global namespace. Consider this script: +>vim9 vim9script var myvar = 'yes' -Then "myvar" will only exist in this file. While without `vim9script` it would -be available as `g:myvar` from any other script and function. +< +The variable "myvar" will only exist in this script's scope. That is +different from legacy Vim script where "let myvar" would make "myvar" +available to other scripts and functions (as `g:myvar`). *E1101* The variables at the file level are very much like the script-local "s:" variables in legacy Vim script, but the "s:" is omitted. And they cannot be deleted. - -In Vim9 script the global "g:" namespace can still be used as before. And the -"w:", "b:" and "t:" namespaces. These have in common that variables are not -declared, have no specific type and they can be deleted. *E1304* - + *E1304* +In Vim9 script the global (`g:`), buffer (`b:`), window (`w:`), and tab (`t:`) +namespaces can be used like in legacy Vim script. In Vim9 script, namespace +prefixed variables: +- are not declared +- have no specific type, and +- can be deleted. +If a namespace prefixed variable is declared, |E1016| is given. And, if a +type is specified, E1304 is given: +>vim9 + vim9cmd var b:fails: bool # E1016: Cannot declare a buffer va... + vim9cmd b:fails: bool = false # E1304: Cannot use type with this ... +< A side effect of `:vim9script` is that the 'cpoptions' option is set to the -Vim default value, like with: > +Vim default value, like with: +> :set cpo&vim +< One of the effects is that |line-continuation| is always enabled. The original value of 'cpoptions' is restored at the end of the script, while flags added or removed in the script are also added to or removed from the @@ -3150,29 +3373,29 @@ original value to get the same effect. The order of flags may change. In the |vimrc| file sourced on startup this does not happen. *vim9-mix* -There is one way to use both legacy and Vim9 syntax in one script file: >vim9 - - " _legacy Vim script_ comments here +There is one way to use both legacy and Vim9 syntax in one script file: +>vim9 + " _legacy Vim script_ comments are placed here if !has('vim9script') - " _legacy Vim script_ comments/commands here - finish + " _legacy Vim script_ comments and commands are placed here + finish endif vim9script # _Vim9 script_ commands/commands from here onwards echowindow $"has('vim9script') == {has('vim9script')}" < This allows for writing a script that takes advantage of the Vim9 script -syntax if possible, and prevents the vim9script command from throwing an -error if used in a version of Vim without 'vim9script'. +syntax if possible, and prevents the `vim9script` command from giving an +error if used in a version of Vim without Vim9 script. Note that Vim9 syntax changed before Vim 9 so that scripts using the current -syntax (such as "import from" instead of "import") might throw errors. +syntax (such as "import from" instead of "import") might give errors. To prevent these, a safer check may be |v:version| >= 900 instead (because "has('vim9script')" will return `v:true` back to Vim 8.2 with patch 3965). Sometimes it is prudent to cut off even later. Vim9 script's feature set continues to grow so, for example, if tuples are used (introduced in Vim 9.1 -patch 1232), a better condition is: >vim9 - +patch 1232), a better condition is: +>vim9 if !has('patch-9.1.1232') echowindow $"Fail: Vim does not have patch 9.1.1232" finish @@ -3181,78 +3404,130 @@ patch 1232), a better condition is: >vim9 echowindow $"Pass: version {v:versionlong}. Continuing ..." < Whichever vim-mix condition is used, it only works in one of two ways: - 1. The "if" statement evaluates to false, the commands up to `endif` are - skipped and `vim9script` is then the first command actually executed. - 2. The "if" statement evaluates to true, the commands up to `endif` are - executed and `finish` bails out before reaching `vim9script`. + 1. The "if" statement evaluates to false, the commands up to `endif` are + skipped and `vim9script` is then the first command actually executed. + 2. The "if" statement evaluates to true, the commands up to `endif` are + executed and `finish` bails out before reaching `vim9script`. Export ~ - *:export* *:exp* + *:export* Exporting an item can be written as: > - export const EXPORTED_CONST = 1234 - export var someValue = ... - export final someValue = ... - export const someValue = ... - export def MyFunc() ... + export var myvar ... + export const MYCONST ... + export final myvar ... + export def MyDef() ... + export function MyFunc() ... export class MyClass ... - export interface MyClass ... + export abstract class MyAbstractClass ... + export interface MyInterface ... export enum MyEnum ... -< *E1043* *E1044* -As this suggests, only constants, variables, `:def` functions, classes, -interfaces and enums can be exported. - + export type MyType ... +< *E1043* +As this suggests, variables, constants, functions, classes (including abstract +classes), interfaces, enums, and types can be exported. Trying to export +something else gives E1043: +>vim9 + vim9cmd export echo 0 # E1043: Invalid command after :export +< *E1042* -`:export` can only be used in Vim9 script, at the script level. - +`:export` can only be used in a Vim9 script scope. So, for example, although +exporting a `:function` is okay, trying to export an item within such a +function gives E1042: +>vim9 + vim9script + export function F1042() + export var b: bool + endfunction + F1042() # E1042: Export can only be used in vim9script +< + *E1044* +An invalid argument can give E1044: +>vim9 + vim9script + export def /a1044(): void + enddef # E1044: Export with invalid argument: ... +< Import ~ - *:import* *:imp* *E1094* *E1047* *E1262* - *E1048* *E1049* *E1053* *E1071* *E1088* *E1236* + *:import* The exported items can be imported in another script. The import syntax has -two forms. The simple form: > +two forms. The simpler form is: > import {filename} < Where {filename} is an expression that must evaluate to a string. In this form the filename should end in ".vim" and the portion before ".vim" will -become the script local name of the namespace. For example: > +become the script-local name of the namespace. For example: > import "myscript.vim" < This makes each exported item in "myscript.vim" available as "myscript.item". - *:import-as* *E1257* *E1261* -In case the name is long or ambiguous, this form can be used to specify -another name: > + + *E1094* +Importing is only allowed in the script-local scope. Trying to do so +elsewhere gives E1094; for example, from a `:function` or `:def` scope: +>vim9 + vim9script + def F1094(): void + import 'nah.vim' # E1094: Import can only be used in a script + enddef + F1094() +< + *E1053* *E1071* +Errors are given when either the {filename} is not found or it is invalid: +>vim9 + vim9cmd import 'e1053.vim' # E1053: Could not import "e1053.vim" + vim9cmd import false # E1071: Invalid string for :import: false +< + *:import-as* +When the name of the file is long, ambiguous (such as with filenames that are +the same but in different directories), or if you just want to use a distinct +structure for the name, this form can be used: > import {longfilename} as {name} < -In this form {name} becomes a specific script local name for the imported -namespace. Therefore {name} must consist of letters, digits and '_', like -|internal-variables|. The {longfilename} expression must evaluate to any -filename. For example: > - import "thatscript.vim.v2" as that -< *E1060* *E1258* *E1259* *E1260* -Then you can use "that.item", etc. You are free to choose the name "that". -Use something that will be recognized as referring to the imported script. -Avoid command names, command modifiers and builtin function names, because the -name will shadow them. It's better not to start the name with a capital -letter, since it can then also shadow global user commands and functions. -Also, you cannot use the name for something else in the script, such as a -function or variable name. - -In case the dot in the name is undesired, a local reference can be made for a +In this longer form, {name} becomes a specific script-local name for the +imported namespace. Therefore {name} must consist of letters, digits, or '_', +and cannot start with a digit, like |internal-variables|. The {longfilename} +expression must evaluate to an existing filename. + +The following script demonstrates using `:import-as`. It: +- Creates a constant, "TMP", for the {longfilename} of a temporary Vim9 script + file to import +- Writes a two-line Vim9 script to TMP +- Imports the Vim9 script file "as" the {name}, "that", and +- Echoes the result, showing the imported Vim9 script file's {longfilename} + and, on a separate line, the content of "that.myvar" (where "myvar" is an + exported variable in the imported script). +>vim9 + vim9script + const TMP: string = tempname() + ['vim9script', 'export var myvar: string = "YES!"']->writefile(TMP) + import TMP as that + echo $"Exported var 'myvar' in 'that' ({TMP}):\n" .. that.myvar +< +This example shows you can use "that.myvar", etc. You are free to choose the +name "that", or something that will be recognized as referring to the imported +script. It is best to avoid command names, command modifiers, and builtin +function names, because {name} will shadow any of those. It also is better to +begin the name with a lowercase letter because that avoids potential shadowing +of global user commands and functions. The {name} cannot be used for anything +else in the script, such as a function or variable name (see |E1213|), and it +cannot be assigned something else (see |E1258|). + +In case the "." in the name is undesired, a local reference can be made for a function: > - var LongFunc = that.LongFuncName + var LongDef = that.LongDefName This also works for constants: > - const MAXLEN = that.MAX_LEN_OF_NAME + const MAXLEN = that.MAXIMUM_LENGTH_OF_NAME This does not work for variables, since the value would be copied once and when changing the variable the copy will change, not the original variable. -You will need to use the full name, with the dot. +You need to use the full name (i.e., including the '.'). -`:import` can not be used in a function. Imported items are intended to exist -at the script level and only imported once. +Imported items are intended to exist at the script level and only be imported +once. Also, `:import` can not be used in a `:function` or `:def` - see |E1094|. -The script name after `import` can be: +The script name after `:import` can be: - A relative path, starting "." or "..". This finds a file relative to the location of the script file itself. This is useful to split up a large plugin into several files. @@ -3263,51 +3538,168 @@ The script name after `import` can be: longer and unique, to avoid loading the wrong file. Note that "after/import" is not used. -If the name does not end in ".vim" then the use of "as name" is required. +Once a Vim9 script file has been imported, the result is cached and it will +not be read again. -Once a Vim9 script file has been imported, the result is cached and used the -next time the same script is imported. It will not be read again. +Many syntax and other errors may be given when importing. Examples: -It is not allowed to import the same script twice, also when using two -different "as" names. - -When using the imported name the dot and the item name must be in the same -line, there can be no line break: > - echo that. - name # Error! - echo that - .name # Error! -< *import-map* + *E1047* +- Using an invalid "as" {name}: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i-cc + # E1047: Syntax error in import: i-cc +< + *E1048* +- Trying to use a non-existent item in an imported script: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc + echo i_cc.absent_item # E1048: Item not found in script: absent_item +< + *E1049* +- Trying to use a declared, but non-exported, item in an imported script: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc + echo i_cc.prepended # E1049: Item not exported in script: prepended +< + *E1060* +When using the imported name, the '.' and the item name must be contiguous. +So there can be neither white space nor a line break: +- After the '.' (see |E1074|), or +- Before the '.', for example: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc + echo i_cc .GetPath() # E1060: Expected dot after name: i_cc .Get... +< + *E1088* +- Attempting to have an imported script import itself: +>vim9 + vim9script + const TMP: string = $'{tempname()}.vim'->substitute('\\', '/', 'g') + var lines: list = ['vim9script', $'import "{TMP}" as e1088'] + lines->writefile(TMP) + import TMP # E1088: Script cannot import itself +< + *E1236* +- Trying to use the script itself: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as cc + cc() # E1236: Cannot use cc itself, it is imported +< + *E1257* +- Not using "as {name}" when the imported filename does not end in ".vim": +>vim9 + vim9script + const TMP: string = tempname() + ['vim9script']->writefile(TMP) + import TMP # E1257: Imported script must use "as" or end in .vim: ... +< + *E1258* +- Omitting the '.' after an imported name: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc + def F1258(): void + i_cc = + enddef + defcompile # E1258: No '.' after imported name: i_cc = +< + *E1259* +- Omitting the name after an imported name: +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc + def F1259(): void + i_cc.8 = 0 + enddef + defcompile # E1259: Missing name after imported name: i_cc.8 = 0 +< + *E1260* +- Attempting to `:unlet` an imported item: +>vim9 + vim9script + const TMP: string = tempname() + ['vim9script', 'export var b: bool']->writefile(TMP) + import TMP as e_unlet + unlet e_unlet.b # E1260: Cannot unlet an imported item: b +< + *E1261* +- Attempting to import the filename ".vim" without using "as". This script + writes the temporary file '.vim' to the operating system's applicable + temporary directory, then attempts to import it: +>vim9 + vim9script + const TMPDIR: string = tempname() + ->substitute('\\', '/', 'g') # Ensure Windows \ chars are / + ->substitute('/[^/]\+$', '/', '') # Remove the filename + ['vim9script']->writefile($'{TMPDIR}.vim') + echo $"Temporary import file name is: {TMPDIR}.vim" + import $'{TMPDIR}.vim' # E1261: Cannot import .vim without using "as" +< + *E1262* +- Trying to import the same script multiple times (including using different + "as" names): +>vim9 + vim9script + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc1 + import $'{$VIMRUNTIME}/autoload/ccomplete.vim' as i_cc2 + # E1262: Cannot import the same script twice: .../ccomplete.vim +< + *import-map* When you've imported a function from one script into a Vim9 script you can refer to the imported function in a mapping by prefixing it with ||: > noremap ,a :call name.Function() When the mapping is defined "name." will be replaced with and the script ID of the imported script. + An even simpler solution is using ||: > noremap ,a name.Function() Note that this does not work for variables, only for functions. - - *import-legacy* *legacy-import* -`:import` can also be used in legacy Vim script. The imported namespace still -becomes script-local, even when the "s:" prefix is not given. For example: > +This self-contained example demonstrates using , creating and +writing a temporary script, which is then imported and the function +"exported.MyDef()" mapped to a: +>vim9 + vim9script + const TMP: string = tempname() + ['vim9script', + 'export def MyDef(): void', + ' popup_notification("exported.MyDef() was called", {time: 4000})', + 'enddef']->writefile(TMP) + import TMP as exported + nnoremap a exported.MyDef() + # Now, pressing a calls exported.MyDef(), generating a popup +< + *import-legacy* *legacy-import* *:imp* +`:import`, including the shortened form `:imp`, can also be used in legacy Vim +script. The imported namespace still becomes script-local, even when the +"s:" prefix is not given. For example: > import "myfile.vim" call s:myfile.MyFunc() -And using the "as name" form: > - import "otherfile.vim9script" as that - call s:that.OtherFunc() - -However, the namespace cannot be resolved on its own: > - import "that.vim" - echo s:that - " ERROR: E1060: Expected dot after name: s:that +When using the "as name" form, the namespace cannot be resolved on its own +(see also |E1060|). This example demonstrates using `:imp` with `as` successfully, +then the error: +>vim + let s:tmp = $'{tempname()}.vim'->substitute('\\', '/', 'g') + call writefile(['vim9script', + \ 'export function L()', + \ ' return "Vim9 script exporting a :function"', + \ 'endfunction'], s:tmp) + imp s:tmp as iLegacy + echo s:iLegacy.L() |" echoes 'Vim9 script exporting a :function' + echo s:iLegacy |" E1060: Expected dot after name: s:iLegacy < This also affects the use of || in the legacy mapping context. Since || is only a valid prefix for a function and NOT for a namespace, you -cannot use it to scope a function in a script local namespace. Instead of -prefixing the function with || you should use ||. For example: +cannot use it to scope a function in a script-local namespace. Instead of +prefixing the function with || you should use ||. +For example: > noremap ,a :call s:that.OtherFunc() < @@ -3321,45 +3713,45 @@ defined. This does not apply to autoload imports, see the next section. Importing an autoload script ~ - *vim9-autoload* *import-autoload* + *vim9-autoload* *import-autoload* For optimal startup speed, loading scripts should be postponed until they are actually needed. Using the autoload mechanism is recommended: *E1264* 1. In the plugin, define user commands, functions and/or mappings - referring to items imported from an autoload script. > - + referring to items imported from an autoload script. +> import autoload 'for/search.vim' command -nargs=1 SearchForStuff search.Stuff() +< + This goes in .../plugin/anyname.vim. "anyname.vim" can be freely + chosen. The "SearchForStuff" command is now available to the user. -< This goes in .../plugin/anyname.vim. "anyname.vim" can be freely - chosen. The "SearchForStuff" command is now available to the user. - - The "autoload" argument to `:import` means that the script is not - loaded until one of the items is actually used. The script will be - found under the "autoload" directory in 'runtimepath' instead of the - "import" directory. Alternatively, either a relative or absolute - name can be used - see below. - - 2. In the autoload script put the bulk of the code. > + The "autoload" argument to `:import` means that the script is not + loaded until one of the items is actually used. The script will be + found under the "autoload" directory in 'runtimepath' instead of the + "import" directory. Alternatively, either a relative or absolute + name can be used - see below. + 2. In the autoload script put the bulk of the code. +> vim9script export def Stuff(arg: string): void ... +< + This goes in .../autoload/for/search.vim. -< This goes in .../autoload/for/search.vim. - - Putting the "search.vim" script under the "/autoload/for/" directory - has the effect that "for#search#" will be prefixed to every exported - item. The prefix is obtained from the file name, just as you would - add it manually in a legacy autoload script. Thus the exported - function can be found with "for#search#Stuff", but you would normally - use `import autoload` and not use the prefix (which has the side effect - of loading the autoload script when compiling a function that - encounters this name). + Putting the "search.vim" script under the "/autoload/for/" directory + has the effect that "for#search#" will be prefixed to every exported + item. The prefix is obtained from the file name, just as you would + add it manually in a legacy autoload script. Thus the exported + function can be found with "for#search#Stuff", but you would normally + use `import autoload` and not use the prefix (which has the side effect + of loading the autoload script when compiling a function that + encounters this name). - You can split up the functionality and import other scripts from the - autoload script as you like. This way you can share code between - plugins. + You can split up the functionality and import other scripts from the + autoload script as you like. This way you can share code between + plugins. Searching for the autoload script in all entries in 'runtimepath' can be a bit slow. If the plugin knows where the script is located, quite often a relative @@ -3409,7 +3801,9 @@ members. See |Dictionary-function|. In |Vim9| script you can have classes, objects, interfaces, and enums like in most popular object-oriented programming languages. Since this is a lot -of functionality, it is located in a separate help file: |vim9class.txt|. +of functionality, it is located in a separate help file, |vim9class.txt|, +though there are several sourceable examples within this help file too (at +|vim9-class-type|, |vim9-enum-type|, and elsewhere). ============================================================================== From ffce1ce58dd3d08110c35c8af61ad2555b344569 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 21 Aug 2026 15:05:33 +0000 Subject: [PATCH 411/647] patch 9.2.0993: runtime(netrw): error when parent dir of g:netrw_home doesn't exist Problem: netrw: error when parent dir of g:netrw_home doesn't exist. Solution: Use 'p' flag of mkdir() (zeertzjq). closes: #21113 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/netrw/autoload/netrw.vim | 4 ++-- src/testdir/test_plugin_netrw.vim | 10 +++++++++- src/version.c | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index 0347ec497f..d8a1c8aad4 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -1,7 +1,7 @@ " Creator: Charles E Campbell " Previous Maintainer: Luca Saccarola " Maintainer: This runtime file is looking for a new maintainer. -" Last Change: 2026 Aug 19 +" Last Change: 2026 Aug 21 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -4485,7 +4485,7 @@ function s:NetrwHome() if exists("g:netrw_mkdir") call system(g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home))) else - call mkdir(home) + call mkdir(home, 'p') endif endif diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index e6ce769ce0..db837aa8f7 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -919,9 +919,11 @@ endfunc func Test_netrw_home_setting() let save_home = get(g:, 'netrw_home', '') - let dir = fnamemodify('XnetrwHome', ':p:h') + let dir = fnamemodify('XnetrwHome', ':p') + let subdir = fnamemodify('XnetrwHomeParent/XnetrwHome', ':p') if has('win32') let dir = substitute(dir, '/', '\\', 'g') + let subdir = substitute(subdir, '/', '\\', 'g') endif if has('nvim') @@ -933,6 +935,10 @@ func Test_netrw_home_setting() call assert_equal(dir, Test_NetrwHome()) call assert_true(isdirectory(dir)) + let g:netrw_home = subdir + call assert_equal(subdir, Test_NetrwHome()) + call assert_true(isdirectory(subdir)) + " the value is expanded let $NETRW_TEST_HOME = dir let g:netrw_home = '$NETRW_TEST_HOME' @@ -944,6 +950,8 @@ func Test_netrw_home_setting() call assert_equal(dir, Test_NetrwHome()) call delete(dir, 'd') + call delete(subdir, 'd') + call delete(fnamemodify(subdir, ':h'), 'd') let $NETRW_TEST_HOME = '' if empty(save_home) unlet! g:netrw_home diff --git a/src/version.c b/src/version.c index efbbd9cc6a..4104545573 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 993, /**/ 992, /**/ From 6ccd0351a78be76eda9ed48fff19f52660a8971c Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Fri, 21 Aug 2026 15:09:36 +0000 Subject: [PATCH 412/647] runtime(odin): improve float number syntax - highlight exp numbers without decimal point, e.g. 12e-5 - highlight hex floats, e.g. 0hff3a001f - remove non-existent 0z number literals - do not highlight unary minus as a part of a number closes: #21107 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/syntax/odin.vim | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/runtime/syntax/odin.vim b/runtime/syntax/odin.vim index e8aa1f875e..d9327fdaea 100644 --- a/runtime/syntax/odin.vim +++ b/runtime/syntax/odin.vim @@ -4,7 +4,7 @@ vim9script # Language: Odin # Maintainer: Maxim Kim # Website: https://github.com/habamax/vim-odin -# Last Change: 2026 Aug 16 +# Last Change: 2026 Aug 21 if exists("b:current_syntax") finish @@ -63,10 +63,11 @@ syntax region odinAttributeBraces \ transparent oneline \ contained -syntax match odinInteger "\v-?<[0-9]+%(_[0-9]+)*>" display -syntax match odinFloat "\v-?<[0-9]+%(_[0-9]+)*%(\.[0-9]+%(_[0-9]+)*)%([eE][+-]=[0-9]+%(_[0-9]+)*)=" display +syntax match odinInteger "\v<[0-9]+%(_[0-9]+)*>" display +syntax match odinFloat "\v<[0-9]+%(_[0-9]+)*%(\.[0-9]+%(_[0-9]+)*)%([eE][+-]=[0-9]+%(_[0-9]+)*)=" display +syntax match odinFloat "\v<[0-9]+%(_[0-9]+)*[eE][+-]?[0-9]+%(_[0-9]+)*" display syntax match odinHex "\v<0[xX][0-9A-Fa-f]+%(_[0-9A-Fa-f]+)*>" display -syntax match odinDoz "\v<0[zZ][0-9A-Ba-b]+%(_[0-9A-Ba-b]+)*>" display +syntax match odinHexFloat "\v<0[hH][0-9A-Fa-f]+%(_[0-9A-Fa-f]+)*>" display syntax match odinOct "\v<0[oO][0-7]+%(_[0-7]+)*>" display syntax match odinBin "\v<0[bB][01]+%(_[01]+)*>" display @@ -107,10 +108,10 @@ highlight def link odinBool Boolean highlight def link odinNull Constant highlight def link odinUninitialized Constant highlight def link odinFloat Float +highlight def link odinHexFloat odinFloat highlight def link odinInteger Number highlight def link odinHex Number highlight def link odinOct Number highlight def link odinBin Number -highlight def link odinDoz Number b:current_syntax = "odin" From 8331682f802455c868fc52ba09f7a8472cd0feea Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Fri, 21 Aug 2026 15:26:57 +0000 Subject: [PATCH 413/647] runtime(css): Update ftplugin, disable auto-commenting Remove "ro" from 'formatoptions'. The universal selector "*" cannot be disambiguated from the 'comments' middle "*" pattern, causing spurious "*" characters to be inserted after selector lines. fixes: #15140 closes: #21125 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/ftplugin/css.vim | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/runtime/ftplugin/css.vim b/runtime/ftplugin/css.vim index 778a9e12d6..2427e85615 100644 --- a/runtime/ftplugin/css.vim +++ b/runtime/ftplugin/css.vim @@ -2,25 +2,22 @@ " Language: CSS " Maintainer: Doug Kearns " Previous Maintainer: Nikolai Weibull -" Last Change: 2020 Dec 21 -" 2024 Jun 02 by Riley Bruins ('commentstring') +" Contributors: Riley Bruins ('commentstring') +" Last Change: 2026 Aug 22 if exists("b:did_ftplugin") finish endif let b:did_ftplugin = 1 -let s:cpo_save = &cpo -set cpo&vim - let b:undo_ftplugin = "setl com< cms< inc< fo< ofu< isk<" setlocal comments=s1:/*,mb:*,ex:*/ commentstring=/*\ %s\ */ -setlocal formatoptions-=t formatoptions+=croql +" exclude "ro" - CSS universal selector "*" cannot be distinguished from +" 'comments' middle "*" pattern +setlocal formatoptions-=rot formatoptions+=cql setlocal omnifunc=csscomplete#CompleteCSS setlocal iskeyword+=- let &l:include = '^\s*@import\s\+\%(url(\)\=' -let &cpo = s:cpo_save -unlet s:cpo_save From 18c7f93bbe9ac41922412a3a5eb2296539000a90 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Fri, 21 Aug 2026 15:37:24 +0000 Subject: [PATCH 414/647] patch 9.2.0994: Vim9: No error for :open during compilation Problem: No error for :open during Vim9 compilation. Solution: Abort compilation with E1100, like other commands disallowed in Vim9 (Doug Kearns). closes: #21120 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_script.vim | 12 +++++++++++- src/version.c | 2 ++ src/vim9compile.c | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index c82c01a0fa..ad25a0a621 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2034,6 +2034,8 @@ def Test_no_insert_xit() v9.CheckDefExecFailure(['a = 1'], 'E1100:') v9.CheckDefExecFailure(['c = 1'], 'E1100:') v9.CheckDefExecFailure(['i = 1'], 'E1100:') + v9.CheckDefExecFailure(['k = 1'], 'E1100:') + v9.CheckDefExecFailure(['o = 1'], 'E1100:') v9.CheckDefExecFailure(['t = 1'], 'E1100:') v9.CheckDefExecFailure(['x = 1'], 'E1100:') @@ -2043,11 +2045,14 @@ def Test_no_insert_xit() v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:') v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:') + v9.CheckScriptFailure(['vim9script', 'k = 1'], 'E1100:') + v9.CheckScriptFailure(['vim9script', 'k'], 'E1100:') v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:') - v9.CheckScriptFailure(['vim9script', 't'], 'E1100:') v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') + v9.CheckScriptFailure(['vim9script', 't'], 'E1100:') v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') + v9.CheckScriptFailure(['vim9script', 'x'], 'E1100:') enddef def s:IfElse(what: number): string @@ -4845,6 +4850,11 @@ def Test_unsupported_commands() END v9.CheckDefAndScriptFailure(lines, 'E481:') + lines =<< trim END + o + END + v9.CheckDefAndScriptFailure(lines, 'E1100:') + lines =<< trim END t END diff --git a/src/version.c b/src/version.c index 4104545573..07c999989a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 994, /**/ 993, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 5f51fdf6d5..ab212ffb4a 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4777,6 +4777,7 @@ compile_def_function_body( case CMD_change: case CMD_insert: case CMD_k: + case CMD_open: case CMD_t: case CMD_xit: not_in_vim9(&ea); From b618f7ea13aeeae534d6e21e1a52775a9fd8b7b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2026 15:59:28 +0000 Subject: [PATCH 415/647] CI: Bump github/codeql-action Bumps the github-actions group with 1 update in the / directory: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 4.37.6 to 4.37.7 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.37.6...v4.37.7) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.37.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... closes: #21118 Signed-off-by: dependabot[bot] Signed-off-by: Christian Brabandt --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 64bdb95daf..4a6a69181d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.6 + uses: github/codeql-action/init@v4.37.7 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -59,7 +59,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.37.6 + uses: github/codeql-action/autobuild@v4.37.7 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -73,4 +73,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.6 + uses: github/codeql-action/analyze@v4.37.7 From b3526a91b82779c2d9e2f3ca330039143cc36862 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 22 Aug 2026 16:02:16 +0000 Subject: [PATCH 416/647] patch 9.2.0995: tests: no check that g:netrw_home has higher priority than $MYVIMDIR Problem: No check that g:netrw_home has higher priority than $MYVIMDIR. Solution: Set $MYVIMDIR to a different directory at the start of the test function. Also, s:NetrwHome() checks has('nvim') before exists('$MYVIMDIR'). This ordering does make sense as Nvim's docs have no mention of $MYVIMDIR. Match that in the test. closes: #21117 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/testdir/test_plugin_netrw.vim | 20 ++++++++++++-------- src/version.c | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/testdir/test_plugin_netrw.vim b/src/testdir/test_plugin_netrw.vim index db837aa8f7..22d317156a 100644 --- a/src/testdir/test_plugin_netrw.vim +++ b/src/testdir/test_plugin_netrw.vim @@ -920,15 +920,22 @@ endfunc func Test_netrw_home_setting() let save_home = get(g:, 'netrw_home', '') let dir = fnamemodify('XnetrwHome', ':p') + let vimdir = fnamemodify('XvimDir', ':p') let subdir = fnamemodify('XnetrwHomeParent/XnetrwHome', ':p') if has('win32') let dir = substitute(dir, '/', '\\', 'g') + let vimdir = substitute(vimdir, '/', '\\', 'g') let subdir = substitute(subdir, '/', '\\', 'g') endif - + let save_myvimdir = getenv('MYVIMDIR') + let $MYVIMDIR = vimdir + + unlet! g:netrw_home if has('nvim') - unlet! g:netrw_home call assert_equal(netrw#fs#PathJoin(stdpath('state'), 'netrw'), Test_NetrwHome()) + else + " without the setting $MYVIMDIR is used + call assert_equal(vimdir, Test_NetrwHome()) endif let g:netrw_home = dir @@ -944,15 +951,12 @@ func Test_netrw_home_setting() let g:netrw_home = '$NETRW_TEST_HOME' call assert_equal(dir, Test_NetrwHome()) - " without the setting $MYVIMDIR is used - unlet g:netrw_home - let $MYVIMDIR = dir - call assert_equal(dir, Test_NetrwHome()) - call delete(dir, 'd') + call delete(vimdir, 'd') call delete(subdir, 'd') call delete(fnamemodify(subdir, ':h'), 'd') - let $NETRW_TEST_HOME = '' + unlet $NETRW_TEST_HOME + call setenv('MYVIMDIR', save_myvimdir) if empty(save_home) unlet! g:netrw_home else diff --git a/src/version.c b/src/version.c index 07c999989a..e4aa7cd036 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 995, /**/ 994, /**/ From acb6c81823791b4c2a9e0e869c182dc33ea00e33 Mon Sep 17 00:00:00 2001 From: Mao-Yining Date: Sun, 23 Aug 2026 17:09:39 +0000 Subject: [PATCH 417/647] runtime(doc): fix return type of sign_placelist() closes: #21117 Signed-off-by: Mao-Yining Signed-off-by: Christian Brabandt --- runtime/doc/sign.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/sign.txt b/runtime/doc/sign.txt index 22233efb45..1bf7e42b51 100644 --- a/runtime/doc/sign.txt +++ b/runtime/doc/sign.txt @@ -1,4 +1,4 @@ -*sign.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*sign.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM REFERENCE MANUAL by Gordon Prieur @@ -690,7 +690,7 @@ sign_placelist({list}) *sign_placelist()* Can also be used as a |method|: > GetSignlist()->sign_placelist() < - Return type: |Number| + Return type: list or list sign_undefine([{name}]) *sign_undefine()* From b7e0c1cb346a78d1ba162821ef14dcbaf6725fd5 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 23 Aug 2026 17:22:13 +0000 Subject: [PATCH 418/647] runtime(doc): correct typo in bug report in version5.txt Vim v5 did not yet support the ++nested autocmd flag. That has only been introduced as part of patch v8.1.1113 Back then the flag was just called "nested". fixes: #21135 Signed-off-by: Christian Brabandt --- runtime/doc/version5.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/version5.txt b/runtime/doc/version5.txt index 0efbd5b82d..c65dd5b9ac 100644 --- a/runtime/doc/version5.txt +++ b/runtime/doc/version5.txt @@ -1,4 +1,4 @@ -*version5.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*version5.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4418,7 +4418,7 @@ Now map to , so that the user can override this. When compiling os_win32.c with MIN_FEAT the apply_autocmds() should not be used. (Aaron) -This autocommand looped forever: ":au FileChangedShell * ++nested e " +This autocommand looped forever: ":au FileChangedShell * nested e " Now FileChangeShell never nests. (Roemer) When evaluating an ":elseif" that was not going to matter anyway, ignore From 632abba51fa40fb59d8d5a3d60e36bf24272a4a3 Mon Sep 17 00:00:00 2001 From: Duane Hilton Date: Sun, 23 Aug 2026 18:04:51 +0000 Subject: [PATCH 419/647] runtime(doc): fix typos and grammar in CONTRIBUTING.md closes: #21131 Signed-off-by: Duane Hilton Signed-off-by: Christian Brabandt --- CONTRIBUTING.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41de1d0b50..5beafadda0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ If you create a pull request on GitHub it will be forwarded to the vim-dev mailing list. You can also send your patch there directly (but please note, the initial posting is subject to moderation). In that case an attachment with a unified diff format is preferred. -Information about the mailing list can be found [on the Vim website][0] +Information about the mailing list can be found [on the Vim website][0]. A pull request has the advantage that it will trigger the Continuous Integration tests, you will be warned of problems (you can ignore the coverage @@ -86,7 +86,7 @@ features). If you find a problem with one of these files or have a suggestion for improvement, please first try to contact the maintainer directly. -Look in the header of the file for the name, email address, github handle and/or +Look in the header of the file for the name, email address, GitHub handle and/or upstream repository. You may also check the [MAINTAINERS][11] file. The maintainer will take care of issues and send updates to the Vim project for @@ -113,10 +113,10 @@ PR with your changes against this repository here. For new filetypes, do not for - to add a new [filetype test][12] (keep it similar to the other filetype tests). - all configuration switches should be documented (check [filetype.txt][13] and/or [syntax.txt][14] for filetype and syntax plugins) -- add yourself as Maintainer to the top of file (again, keep the header similar to - other runtime files) +- add yourself as Maintainer to the top of the file (again, keep the header similar + to other runtime files) - add yourself to the [MAINTAINERS][11] file. -- add a guard `if has('vim9script')` if you like to maintain Neovim +- add a guard `if has('vim9script')` if you would like to maintain Neovim compatibility but want to use Vim9 script (or restrict yourself to legacy Vim script) @@ -147,9 +147,9 @@ For the recommended documentation style, please check [helphelp.txt][16]. # I have a question If you have some question on the style guide, please contact the [vim-dev][0] -mailing list. For other questions you can join [`#vim`][19], use the -[Vi Stack Exchange][8] website, the [vim-use][9] mailing list or make use of the -[discussion][10] feature here at github. +mailing list. For other questions you can join [`#vim`][19], use the +[Vi Stack Exchange][8] website, the [vim-use][9] mailing list or make use of the +[discussion][10] feature here at GitHub. [todo list]: https://github.com/vim/vim/blob/master/runtime/doc/todo.txt [0]: http://www.vim.org/maillist.php#vim-dev From 5ad47b07af72950624904a9ec0bc9f2d4ebc77a6 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 23 Aug 2026 18:24:17 +0000 Subject: [PATCH 420/647] patch 9.2.0996: debugger: crash when evaluating a variable in a :def function frame Problem: In the debugger ">up" and ">frame" select an older function call frame, but get_funccal_local_ht() and the related functions check current_funccal while returning a dictionary of the frame that get_funccal() selected. A :def function keeps its local variables on the vim9 stack, its funccall_T has no l: and a: dictionaries and is allocated cleared, so with such a frame selected the returned hashtab has a NULL ht_array and evaluating any variable name at the debug prompt crashes in hash_lookup(). Solution: Check the funccal that is actually used and return NULL when it has no l: variables, so that the variable is reported as undefined instead. closes: #21111 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- src/testdir/test_debugger.vim | 44 +++++++++++++++++++++++++++++++++++ src/userfunc.c | 43 ++++++++++++++++++++++++---------- src/version.c | 2 ++ 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim index aa014c4342..b18e0743e7 100644 --- a/src/testdir/test_debugger.vim +++ b/src/testdir/test_debugger.vim @@ -1121,6 +1121,50 @@ func Test_debug_def_and_legacy_function() call StopVimInTerminal(buf) endfunc +" Test for using "up" in the debugger to select the frame of a :def function +" and then evaluating a variable name +func Test_debug_backtrace_up_def_function() + CheckCWD + let file =<< trim END + vim9script + def g:DefFunc() + var defvar = 'in def' + g:LegacyFunc('arg') + enddef + + func g:LegacyFunc(text) + let legacyvar = 'in legacy' + echo legacyvar + endfunc + + breakadd func 2 g:LegacyFunc + END + call writefile(file, 'XtestDebugUp.vim', 'D') + + let buf = RunVimInTerminal('-S XtestDebugUp.vim', {}) + + call s:RunDbgCmd(buf, ':call DefFunc()', ['line 2: echo legacyvar']) + call s:RunDbgCmd(buf, 'echo legacyvar', ['in legacy']) + call s:RunDbgCmd(buf, 'echo l:legacyvar', ['in legacy']) + call s:RunDbgCmd(buf, 'echo a:text', ['arg']) + + " Move up to the frame of the :def function, the local variables of the + " legacy function are not available there. This used to crash. + call s:RunDbgCmd(buf, 'up') + call s:RunDbgCmd(buf, 'echo legacyvar', + \ ['E121: Undefined variable: legacyvar']) + call s:RunDbgCmd(buf, 'echo l:legacyvar', + \ ['E121: Undefined variable: l:legacyvar']) + call s:RunDbgCmd(buf, 'echo a:text', ['E121: Undefined variable: a:text']) + + " Back in the frame of the legacy function the variables are found again. + call s:RunDbgCmd(buf, 'down') + call s:RunDbgCmd(buf, 'echo legacyvar', ['in legacy']) + + call s:RunDbgCmd(buf, 'cont') + call StopVimInTerminal(buf) +endfunc + func Test_debug_def_function() CheckCWD let file =<< trim END diff --git a/src/userfunc.c b/src/userfunc.c index 0cc9e31e33..08f696fad2 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -7332,6 +7332,25 @@ get_funccal(void) return funccal; } +/* + * Get the function call environment to use for the l: and a: variables, based + * on the backtrace debug level. + * Returns NULL if there is no current funccal or when the selected funccal is + * for a :def function, which does not have l: and a: dictionaries. + */ + static funccall_T * +get_funccal_for_vars(void) +{ + funccall_T *funccal = NULL; + + if (current_funccal == NULL) + return NULL; + funccal = get_funccal(); + if (funccal == NULL || funccal->fc_l_vars.dv_refcount == 0) + return NULL; + return funccal; +} + /* * Return the hashtable used for local variables in the current funccal. * Return NULL if there is no current funccal. @@ -7339,9 +7358,9 @@ get_funccal(void) hashtab_T * get_funccal_local_ht(void) { - if (current_funccal == NULL || current_funccal->fc_l_vars.dv_refcount == 0) - return NULL; - return &get_funccal()->fc_l_vars.dv_hashtab; + funccall_T *funccal = get_funccal_for_vars(); + + return funccal == NULL ? NULL : &funccal->fc_l_vars.dv_hashtab; } /* @@ -7351,9 +7370,9 @@ get_funccal_local_ht(void) dictitem_T * get_funccal_local_var(void) { - if (current_funccal == NULL || current_funccal->fc_l_vars.dv_refcount == 0) - return NULL; - return &get_funccal()->fc_l_vars_var; + funccall_T *funccal = get_funccal_for_vars(); + + return funccal == NULL ? NULL : &funccal->fc_l_vars_var; } /* @@ -7363,9 +7382,9 @@ get_funccal_local_var(void) hashtab_T * get_funccal_args_ht(void) { - if (current_funccal == NULL || current_funccal->fc_l_vars.dv_refcount == 0) - return NULL; - return &get_funccal()->fc_l_avars.dv_hashtab; + funccall_T *funccal = get_funccal_for_vars(); + + return funccal == NULL ? NULL : &funccal->fc_l_avars.dv_hashtab; } /* @@ -7375,9 +7394,9 @@ get_funccal_args_ht(void) dictitem_T * get_funccal_args_var(void) { - if (current_funccal == NULL || current_funccal->fc_l_vars.dv_refcount == 0) - return NULL; - return &get_funccal()->fc_l_avars_var; + funccall_T *funccal = get_funccal_for_vars(); + + return funccal == NULL ? NULL : &funccal->fc_l_avars_var; } /* diff --git a/src/version.c b/src/version.c index e4aa7cd036..37e823d3d0 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 996, /**/ 995, /**/ From ef461d18e3729f6ef71e2d69e320fbcdf13acda2 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 23 Aug 2026 18:32:06 +0000 Subject: [PATCH 421/647] runtime(doc): fix typo in :h substitute-repeat fixes: #21136 Signed-off-by: Christian Brabandt --- runtime/doc/change.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt index bc0979c5f3..0424c7b7e5 100644 --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1,4 +1,4 @@ -*change.txt* For Vim version 9.2. Last change: 2026 Jun 26 +*change.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -915,7 +915,7 @@ either the first or second pattern in parentheses did not match, so either These commands repeat the previous `:substitute` command with the given flags. The first letter is always "s", followed by one or two of the possible flag -characters. For example `:sce` works like `:s///ce`. The table lists the +characters. For example ":sce" works like ":s ce". The table lists the possible combinations, not all flags are possible, because the command is short for another command. From 4025cec645e396e9bc7ca8083d3326c5040dedb9 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sun, 23 Aug 2026 18:35:06 +0000 Subject: [PATCH 422/647] runtime(vim): Update base syntax, allow Vim9 block terminators after :bar Allow Vim9 block terminators after |. While this usage is very unusual it breaks the block region termination. E.g., `{| echo "Foo" |}` closes: #21129 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 13 +++++++++--- .../syntax/testdir/dumps/vim9_blocks_01.dump | 2 +- .../syntax/testdir/dumps/vim9_blocks_02.dump | 8 ++++---- .../syntax/testdir/dumps/vim9_blocks_03.dump | 20 +++++++++++++++++++ .../testdir/dumps/vim_ex_autocmd_03.dump | 2 +- .../testdir/dumps/vim_ex_autocmd_04.dump | 8 ++++---- .../testdir/dumps/vim_ex_autocmd_05.dump | 12 +++++------ .../testdir/dumps/vim_ex_autocmd_06.dump | 8 ++++---- .../testdir/dumps/vim_ex_autocmd_07.dump | 10 +++++----- .../testdir/dumps/vim_ex_autocmd_08.dump | 10 +++++----- .../testdir/dumps/vim_ex_autocmd_09.dump | 10 +++++----- .../testdir/dumps/vim_ex_autocmd_10.dump | 12 +++++------ .../testdir/dumps/vim_ex_autocmd_11.dump | 8 ++++---- .../testdir/dumps/vim_ex_autocmd_12.dump | 12 +++++------ .../testdir/dumps/vim_ex_autocmd_13.dump | 10 +++++----- .../testdir/dumps/vim_ex_autocmd_14.dump | 12 +++++------ .../testdir/dumps/vim_ex_autocmd_15.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_01.dump | 6 +++--- .../testdir/dumps/vim_ex_command_02.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_03.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_04.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_05.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_06.dump | 10 +++++----- .../testdir/dumps/vim_ex_command_07.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_08.dump | 12 +++++------ .../testdir/dumps/vim_ex_command_09.dump | 14 ++++++------- .../testdir/dumps/vim_ex_command_10.dump | 14 ++++++------- .../testdir/dumps/vim_ex_command_11.dump | 12 +++++------ runtime/syntax/testdir/input/vim9_blocks.vim | 4 ++++ .../syntax/testdir/input/vim_ex_autocmd.vim | 2 ++ .../syntax/testdir/input/vim_ex_command.vim | 2 ++ runtime/syntax/vim.vim | 13 +++++++++--- 32 files changed, 180 insertions(+), 138 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/vim9_blocks_03.dump diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 7a72878eaf..975aead334 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 12 +" Last Change: 2026 Aug 22 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -497,7 +497,12 @@ Vim9 syn match vimAugroup contained "\\ze\s*\%([#|]\|$\)" skipwhi " ================================ " TODO: explicitly match the {cmd} arg rather than bailing out to TOP -syn region vimAutocmdBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList +syn region vimAutocmdBlock contained + \ matchgroup=vimSep + \ start="{\ze\s*\%($\|[#|]\)" + \ end="^\s*\zs}" + \ end="\%(\\\@|i+0#00e0e07&|t|e|m|s|(+0#e000e06&|)| +0#0000000&@63 +|{+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&|||}+0#e000e06&| +0#0000000&@58 +@75 @75 -|~+0#4040ff13&| @73 -| +0#0000000&@56|3|7|,|1| @9|B|o|t| +|#+0#0000e05&| |d|i|c|t|i|o|n|a|r|y| +0#0000000&@62 +@57|3|7|,|1| @9|9|1|%| diff --git a/runtime/syntax/testdir/dumps/vim9_blocks_03.dump b/runtime/syntax/testdir/dumps/vim9_blocks_03.dump new file mode 100644 index 0000000000..501f0e57d9 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim9_blocks_03.dump @@ -0,0 +1,20 @@ +|#+0#0000e05#ffffff0| |d|i|c|t|i|o|n|a|r|y| +0#0000000&@62 +@75 +|{+0#e000e06&|}|-+0#af5f00255&|>|i+0#00e0e07&|t|e|m|s|(+0#e000e06&|)| +0#0000000&@63 +> @74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|5|3|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_03.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_03.dump index c669cbb921..7e5eacf0ef 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_03.dump @@ -17,4 +17,4 @@ @2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@62 |}+0#e000e06&| +0#0000000&@73 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| |{+0#e000e06&| +0#0000000&@42 -@57|4|0|,|0|-|1| @7|1|5|%| +@57|4|0|,|0|-|1| @7|1|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_04.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_04.dump index 4f18da29ed..5957b1b229 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_04.dump @@ -3,7 +3,9 @@ @2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@62 |}+0#e000e06&| +0#0000000&@73 @75 -> @74 +>a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| |{+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&|||}+0#e000e06&| +0#0000000&@36 +@75 +@75 |"+0#0000e05&| |M|u|l|t|i|l|i|n|e| |{|c|m|d|}| |a|r|g| +0#0000000&@53 @75 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@42 @@ -15,6 +17,4 @@ @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@56 @75 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @53 -@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 -@57|5|8|,|0|-|1| @7|2|1|%| +@57|5|8|,|1| @9|2|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_05.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_05.dump index 1823bf05e2..9d4dec0aa0 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_05.dump @@ -1,9 +1,11 @@ -| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 +|a+0#af5f00255#ffffff0|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @53 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 +@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 +@6>"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@55 -> @74 +@75 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d|,+0#0000000&|B+0#00e0003&|u|f|N|e|w|F|i|l|e| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @42 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 @@ -15,6 +17,4 @@ @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 -@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@57|7|6|,|0|-|1| @7|2|9|%| +@57|7|6|,|7| @9|2|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_06.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_06.dump index 4c03fefed1..96f86241e5 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_06.dump @@ -1,9 +1,11 @@ | +0&#ffffff0@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@55 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @44 -@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 @6>"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@55 @@ -15,6 +17,4 @@ |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>|,|*|.+0#0000000&|v|i|m|,+0#e000e06&|*|.+0#0000000&|c| @2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@14 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t|,+0#e000e06&|<|b|u|f@1|e|r|>|,|*|.+0#0000000&|c| @2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@14 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t|,+0#e000e06&|*|.+0#0000000&|v|i|m|,+0#e000e06&|<|b|u|f@1|e|r|>| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@14 -@75 -|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|=|1|>|,|<|b|u|f@1|e|r|=|2|>|,|<|b|u|f@1|e|r|=|3|>| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@2 @57|9|4|,|7| @9|3|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump index f857a3c5db..8ff457492e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_07.dump @@ -1,9 +1,11 @@ -|a+0#af5f00255#ffffff0|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|=|1|>|,|<|b|u|f@1|e|r|=|2|>|,|<|b|u|f@1|e|r|=|3|>| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@2 +|a+0#af5f00255#ffffff0|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t|,+0#e000e06&|*|.+0#0000000&|v|i|m|,+0#e000e06&|<|b|u|f@1|e|r|>| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@14 @75 +|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|=|1|>|,|<|b|u|f@1|e|r|=|2|>|,|<|b|u|f@1|e|r|=|3|>| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@2 @75 -|"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|"|B|u|f|R|e|a|d|"| |a|n|d| |"+0#e000002&|*|"| +0#0000e05&|a|r|e| |v|a|l|i|d| |g|r|o|u|p| |n|a|m|e|s|,| |h|o|w|e|v|e|r|,| |:|h|e|l|p| |:|a|u|g|r|o|u|p| +0#0000000&@1 +@75 +>"+0#0000e05&| +0#0000000&|F+0#0000001#ffff4012|I|X|M|E|:+0#e000e06#ffffff0| +0#0000e05&|"|B|u|f|R|e|a|d|"| |a|n|d| |"+0#e000002&|*|"| +0#0000e05&|a|r|e| |v|a|l|i|d| |g|r|o|u|p| |n|a|m|e|s|,| |h|o|w|e|v|e|r|,| |:|h|e|l|p| |:|a|u|g|r|o|u|p| +0#0000000&@1 |"+0#0000e05&| |e|x|p|l|i|c|i|t|l|y| |d|i|r|e|c|t|s| |t|h|e| |u|s|e|r| |N|O|T| |t|o| |s|h|a|d|o|w| |e|v|e|n|t| |n|a|m|e|s| |w|i|t|h| |g|r|o|u|p| |n|a|m|e|s| +0#0000000&@2 ->a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e|c|h|o| |"+0#e000002&|F|o@1|"| +0#0000000&@18 +|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e|c|h|o| |"+0#e000002&|F|o@1|"| +0#0000000&@18 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|*+0#00e0003&| +0#0000000&@6|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| |++0#af5f00255&@1|o+0#0000000&|n|c|e| |++0#af5f00255&@1|n+0#0000000&|e|s|t|e|d| |e|c|h|o| |"+0#e000002&|F|o@1|"| +0#0000000&@18 @75 @75 @@ -15,6 +17,4 @@ |r|"| +0#0000000&@72 |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@6|++0#e000e06&@1|o|n|c|e| +0#0000000&|++0#e000e06&@1|n|e|s|t|e|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a |r|"| +0#0000000&@72 -|a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@9|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@6|++0#e000e06&@1|o|n|c|e| +0#0000000&|++0#e000e06&@1|n|e|s|t|e|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a -|r|"| +0#0000000&@72 @57|1@1|2|,|1| @8|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_08.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_08.dump index 59d0a40a9a..a9c3e00120 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_08.dump @@ -1,9 +1,11 @@ -|a+0#af5f00255#ffffff0|u|t|o|c|m|d|!| +0#0000000&@9|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@6|++0#e000e06&@1|o|n|c|e| +0#0000000&|++0#e000e06&@1|n|e|s|t|e|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a +|a+0#af5f00255#ffffff0|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@6|++0#e000e06&@1|o|n|c|e| +0#0000000&|++0#e000e06&@1|n|e|s|t|e|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a +|r|"| +0#0000000&@72 +|a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@9|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@6|++0#e000e06&@1|o|n|c|e| +0#0000000&|++0#e000e06&@1|n|e|s|t|e|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a |r|"| +0#0000000&@72 @75 -|a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@6|*+0#e000e06&|.+0#0000000&|t|x|t| @37 +>a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@6|*+0#e000e06&|.+0#0000000&|t|x|t| @37 |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@9|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@6|*+0#e000e06&|.+0#0000000&|t|x|t| @37 ->a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@43 +|a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@43 |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@9|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@43 @75 |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|*+0#00e0003&| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @49 @@ -15,6 +17,4 @@ |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@9|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@43 @75 |a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0@57 -|a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@66 -@75 @57|1|2|5|,|1| @8|5|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump index 48d204684c..14f767cdee 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_09.dump @@ -1,9 +1,11 @@ -| +0&#ffffff0@74 +|a+0#af5f00255#ffffff0|u|t|o|c|m|d|!| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0@57 +|a+0#af5f00255&|u|t|o|c|m|d|!| +0#0000000&@66 +@75 |"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |b|a|n|g| |-|>| |g|r|o|u|p| |"+0#e000002&|!|f|o@1|g|r|o|u|p|!|"| +0#0000000&@35 |a+0#af5f00255&|u|t|o|c|m|d|!|!+0#0000001#ffff4012|f|o@1|g|r|o|u|p|!| +0#0000000#ffffff0@56 -|"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |b|a|n|g| |-|>| |g|r|o|u|p| |"+0#e000002&|f|o@1|g|r|o|u|p|"| +0#0000000&@37 +>"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |b|a|n|g| |-|>| |g|r|o|u|p| |"+0#e000002&|f|o@1|g|r|o|u|p|"| +0#0000000&@37 |a+0#af5f00255&|u|t|o|c|m|d|!|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0@58 ->"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |b|a|n|g| |-|>| |e|v|e|n|t| +0#0000000&@48 +|"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |b|a|n|g| |-|>| |e|v|e|n|t| +0#0000000&@48 |a+0#af5f00255&|u|t|o|c|m|d|!|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@59 |"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |b|a|n|g| |-|>| |u|s|e|r| |e|v|e|n|t| +0#0000000&@43 |a+0#af5f00255&|u|t|o|c|m|d|!|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@53 @@ -15,6 +17,4 @@ |"+0#0000e05&| |c|o|m@1|a|n|d| |-|>| |g|r|o|u|p| |"+0#e000002&|B|u|f|R|e|a|d|"| +0#0000e05&|-|>| |e|v|e|n|t| |"+0#e000002&|B|u|f|R|e|a|d|"| +0#0000e05&|-|>| |p|a|t@1|e|r|n| +0#0000000&@16 |a+0#af5f00255&|u|t|o|c|m|d|!|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|B|u|f|R|e|a|d| |*+0#e000002&|.+0#af5f00255&|t+0#0000000&|x|t| @45 @75 -@75 -|"+0#0000e05&| |L|i|s|t| +0#0000000&@68 @57|1|4|3|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_10.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_10.dump index b35de96498..202584a43f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_10.dump @@ -1,9 +1,11 @@ -|"+0#0000e05#ffffff0| |L|i|s|t| +0#0000000&@68 +| +0&#ffffff0@74 +@75 +|"+0#0000e05&| |L|i|s|t| +0#0000000&@68 @75 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@6|*+0#e000e06&|.+0#0000000&|t|x|t| @38 -|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@9|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@6|*+0#e000e06&|.+0#0000000&|t|x|t| @38 +>a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@9|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@6|*+0#e000e06&|.+0#0000000&|t|x|t| @38 @75 ->a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|*+0#00e0003&| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @50 +|a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|*+0#00e0003&| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @50 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@9|*+0#00e0003&| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @50 @75 |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@50 @@ -15,6 +17,4 @@ |a+0#af5f00255&|u|t|o|c|m|d| +0#0000000&@67 @75 @75 -|"+0#0000e05&| |:|d|o|a|u|t|o|a|l@1| +0#0000000&@62 -@75 -@57|1|6|1|,|1| @8|6|5|%| +@57|1|6|1|,|1| @8|6|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_11.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_11.dump index 6a71d9d049..9ffe143432 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_11.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_11.dump @@ -1,9 +1,11 @@ | +0&#ffffff0@74 +|"+0#0000e05&| |:|d|o|a|u|t|o|a|l@1| +0#0000000&@62 +@75 |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@57 @75 -|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @51 +>d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @51 |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@48 ->d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@44 +|d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@44 @75 |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @29 @75 @@ -15,6 +17,4 @@ @75 |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@16 |d+0#af5f00255&|o|a|u|t|o|a|l@1| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@19 -@75 -@75 @57|1|7|9|,|1| @8|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_12.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_12.dump index 971dc181e6..5b36a82036 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_12.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_12.dump @@ -1,9 +1,11 @@ -| +0&#ffffff0@74 +|d+0#af5f00255#ffffff0|o|a|u|t|o|a|l@1| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@19 +@75 +@75 |"+0#0000e05&| |:|d|o|a|u|t|o|c|m|d| +0#0000000&@62 @75 -|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@57 +>d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@57 @75 ->d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @51 +|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @51 |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@48 |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&@44 @75 @@ -15,6 +17,4 @@ |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@38 @75 |d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@29 -@75 -|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@16 -@57|1|9|7|,|1| @8|8|0|%| +@57|1|9|7|,|1| @8|7|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_13.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_13.dump index 1d2ecbfaf5..c4727cdf6d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_13.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_13.dump @@ -1,9 +1,11 @@ -|d+0#af5f00255#ffffff0|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@16 -|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| ||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@17 +|d+0#af5f00255#ffffff0|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|U+0#00e0003&|s|e|r| +0#0000000&|F+0#e000e06&|o@1|E|v|e|n|t| +0#0000000&@29 @75 +|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@16 +|d+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|<+0#e000e06&|n|o|m|o|d|e|l|i|n|e|>| +0#0000000&|f+0#0000001#ffff4012|o@1|g|r|o|u|p| +0#0000000#ffffff0|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| ||| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@17 @75 -|"+0#0000e05&| |P|a|t@1|e|r|n|s| +0#0000000&@64 > @74 +|"+0#0000e05&| |P|a|t@1|e|r|n|s| +0#0000000&@64 +@75 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t| @56 @75 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|*+0#e000e06&| +0#0000000&@58 @@ -15,6 +17,4 @@ @75 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|t+0#0000000&|x|]+0#e000e06&|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @47 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|a+0#0000000&|-+0#e000e06&|z+0#0000000&|]+0#e000e06&|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @46 -|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&@1|:|a|l|p|h|a|:|]@1|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @40 -|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|[|:|p|u|n|c|t|:|]@1|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @39 @57|2|1|5|,|0|-|1| @6|8|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_14.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_14.dump index 765dccbc56..cbe232a894 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_14.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_14.dump @@ -1,9 +1,11 @@ -|a+0#af5f00255#ffffff0|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|[|:|p|u|n|c|t|:|]@1|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @39 +|a+0#af5f00255#ffffff0|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|a+0#0000000&|-+0#e000e06&|z+0#0000000&|]+0#e000e06&|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @46 +|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&@1|:|a|l|p|h|a|:|]@1|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @40 +|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|[|:|p|u|n|c|t|:|]@1|\@2|{|2+0#0000000&|\+0#e000e06&|}|t+0#0000000&| @39 @75 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|]+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @54 -|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|]+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @53 +>a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|]+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @53 @75 ->a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|t+0#0000000&|\+0#e000e06&|]@1|x+0#0000000&|t| @52 +|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|t+0#0000000&|\+0#e000e06&|]@1|x+0#0000000&|t| @52 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|t+0#0000000&|\+0#e000e06&|]@1|x+0#0000000&|t| @51 @75 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|[+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @54 @@ -15,6 +17,4 @@ |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|-+0#0000000&|t|-|]+0#e000e06&|x+0#0000000&|t| @52 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|-+0#0000000&|t|-|]+0#e000e06&|x+0#0000000&|t| @51 @75 -|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|\|^|]|x+0#0000000&|t| @53 -|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|^+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @53 -@57|2|3@1|,|1| @8|9|5|%| +@57|2|3@1|,|1| @8|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_autocmd_15.dump b/runtime/syntax/testdir/dumps/vim_ex_autocmd_15.dump index 5cebc2c44d..405c45bc67 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_autocmd_15.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_autocmd_15.dump @@ -1,9 +1,11 @@ -|a+0#af5f00255#ffffff0|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|^+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @53 +| +0&#ffffff0@74 +|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|\|^|]|x+0#0000000&|t| @53 +|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[+0#e000e06&|^|^+0#0000000&|]+0#e000e06&|x+0#0000000&|t| @53 @75 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|t|x|t|,+0#e000e06&|*|/+0#0000000&|*+0#e000e06&|.+0#0000000&|v|i|m| @48 -|a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|{+0#e000e06&|t+0#0000000&|x|t|,+0#e000e06&|v+0#0000000&|i|m|}+0#e000e06&| +0#0000000&@50 +>a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|{+0#e000e06&|t+0#0000000&|x|t|,+0#e000e06&|v+0#0000000&|i|m|}+0#e000e06&| +0#0000000&@50 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|{+0#e000e06&|t+0#0000000&|{+0#e000e06&|x+0#0000000&|,+0#e000e06&|t+0#0000000&|}+0#e000e06&|,|v+0#0000000&|{+0#e000e06&|i+0#0000000&|,+0#e000e06&|m+0#0000000&|}+0#e000e06&@1| +0#0000000&@44 -> @74 +@75 |"+0#0000e05&| |l|i|t|e|r|a|l| +0#0000000&@65 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[|]|x|t| @55 |a+0#af5f00255&|u| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|.+0#0000000&|[|\+0#e000e06&|]|x+0#0000000&|t| @54 @@ -15,6 +17,4 @@ |~| @73 |~| @73 |~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|2|5|1|,|0|-|1| @6|B|o|t| +| +0#0000000&@56|2|5|1|,|1| @8|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_01.dump b/runtime/syntax/testdir/dumps/vim_ex_command_01.dump index 78492c7f3d..482f0b7508 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_01.dump @@ -9,12 +9,12 @@ @2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@62 |}+0#e000e06&| +0#0000000&@73 @75 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|{+0#e000e06&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&|||}+0#e000e06&| +0#0000000&@45 +@75 |c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1 |p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@24 @75 |c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1 |p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@35 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 -@75 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|@+0#4040ff13&@2 -| +0#0000000&@56|1|9|,|1| @10|7|%| +@57|1|9|,|1| @10|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_02.dump b/runtime/syntax/testdir/dumps/vim_ex_command_02.dump index dd95498f4e..b78940bfa6 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_02.dump @@ -1,9 +1,11 @@ -|c+0#af5f00255#ffffff0|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1 +| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 +@75 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1 |p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@39 @6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63 -@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 +@6>\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 @75 ->c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1 |p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@35 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 @@ -15,6 +17,4 @@ @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 @75 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|1| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@21 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|2| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@17 -@57|3|4|,|1| @9|1|6|%| +@57|3|4|,|7| @9|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_03.dump b/runtime/syntax/testdir/dumps/vim_ex_command_03.dump index aa0e2f0c32..9802f1daec 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_03.dump @@ -1,9 +1,11 @@ -|c+0#af5f00255#ffffff0|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|2| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@17 +| +0&#ffffff0@74 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|1| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@21 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|2| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@17 @75 |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 -@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|f|u|n|c|t|i|o|n|)|"| +0#0000000&@26 +@2>c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|f|u|n|c|t|i|o|n|)|"| +0#0000000&@26 |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63 -> @74 +@75 |d+0#af5f00255&|e|f| +0#0000000&|F|o@1|2|(+0#e000e06&|)| +0#0000000&@64 @2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|d|e|f|)|"| +0#0000000&@31 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 @@ -15,6 +17,4 @@ @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&@61 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&@62 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&@59 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60 -@57|5|0|,|0|-|1| @7|2|4|%| +@57|5|0|,|3| @9|2|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_04.dump b/runtime/syntax/testdir/dumps/vim_ex_command_04.dump index c819f228cd..6e0e604584 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_04.dump @@ -1,9 +1,11 @@ -| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60 +| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&@59 +@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50 +@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 +@6>\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|k|e@1|p|s|c|r|i|p|t| +0#0000000&@55 -@6>\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63 +@6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 @75 @@ -15,6 +17,4 @@ @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 -@57|6|8|,|7| @9|3|5|%| +@57|6|8|,|7| @9|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_05.dump b/runtime/syntax/testdir/dumps/vim_ex_command_05.dump index d5cccc3289..16808301f6 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_05.dump @@ -1,9 +1,11 @@ -| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 +| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60 +@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|k|e@1|p|s|c|r|i|p|t| +0#0000000&@55 @6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63 -@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 +@6>\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56 -> @74 +@75 |c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&@66 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|a|d@1|r|=|l+0#00e0003&|i|n|e|s| +0#0000000&@55 @@ -15,6 +17,4 @@ @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60 -@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@57|8|6|,|0|-|1| @7|4|5|%| +@57|8|6|,|7| @9|4@1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_06.dump b/runtime/syntax/testdir/dumps/vim_ex_command_06.dump index ce8e796578..84e7b7c4d0 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_06.dump @@ -1,9 +1,11 @@ | +0&#ffffff0@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 +@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60 +@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60 +@6>\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 -@6>\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 +@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|k|e@1|p|s|c|r|i|p|t| +0#0000000&@55 @6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58 @@ -15,6 +17,4 @@ @75 @75 |"+0#0000e05&| |E|r@1|o|r|s| +0#0000000&@66 -@75 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#0000000#ffffff0|a|r|g|u|m|e|n|t|s| |-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| +0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8 -@57|1|0|4|,|7| @8|5@1|%| +@57|1|0|4|,|7| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_07.dump b/runtime/syntax/testdir/dumps/vim_ex_command_07.dump index e88760eaa3..18df719354 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_07.dump @@ -1,9 +1,11 @@ -|c+0#af5f00255#ffffff0|o|m@1|a|n|d|!| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#0000000#ffffff0|a|r|g|u|m|e|n|t|s| |-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| +0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8 +|"+0#0000e05#ffffff0| |E|r@1|o|r|s| +0#0000000&@66 @75 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#0000000#ffffff0|a|r|g|u|m|e|n|t|s| |-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| +0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8 @75 -|"+0#0000e05&| |D|e|l|e|t|e| +0#0000000&@66 @75 ->d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@60 +>"+0#0000e05&| |D|e|l|e|t|e| +0#0000000&@66 +@75 +|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@60 |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@52 @75 |d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47 @@ -15,6 +17,4 @@ |c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@66 |c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@53 -@75 -@75 -@57|1|2@1|,|1| @8|6|5|%| +@57|1|2@1|,|1| @8|6|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump index 702da91b69..ed60644c8b 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump @@ -1,9 +1,11 @@ -| +0&#ffffff0@74 +|c+0#af5f00255#ffffff0|o|m|c|l|e|a|r| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@53 +@75 +@75 |"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| |(|v|i|m|.|v|i|m| |s|y|n|t|a|x| |h|i|g|h|l|i|g|h|t|i|n|g| |b|r|o|k|e|n| |w|r|t| |s|y|s|t|e|m|(|)@1| +0#0000000&@10 @75 -|c+0#af5f00255&|o|m| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|c+0#af5f00255&|a|l@1| +0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#e000e06&|'+0#e000002&|l|s|'|)+0#e000e06&| +0#0000000&@49 +>c+0#af5f00255&|o|m| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|c+0#af5f00255&|a|l@1| +0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#e000e06&|'+0#e000002&|l|s|'|)+0#e000e06&| +0#0000000&@49 +@75 @75 -> @74 |"+0#0000e05&| |I|s@1|u|e| |#|1|7|0@1|1| |(|W|r|o|n|g| |v|i|m|U|s|e|r|C|m|d|A|t@1|r|E|r@1|o|r| |h|i|g|h|l|i|g|h|t|i|n|g| |i|n| |v|i|m|.|v|i|m|)| +0#0000000&@8 @75 |c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|f+0#00e0003&|i|l|e| +0#0000000&|M+0#0000001#ffff4012|a|k|e| +0#0000000#ffffff0|A|s|y|n|c|R|u|n| |-|p|r|o|g|r|a|m|=|m|a|k|e| |@| |<|a|r|g|s|> @@ -15,6 +17,4 @@ @4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|b|a|n|g|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&|!|"| +0#0000000&@52 @8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e|(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| @8 |"|•|"|,| |"|g|"|)|/+0#e000e06&|g|e| +0#0000000&@62 -@4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 -@4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|a|r|g|s|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&@1| +0#0000000&@53 -@57|1|4|0|,|0|-|1| @6|7|5|%| +@57|1|4|0|,|1| @8|7|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_09.dump b/runtime/syntax/testdir/dumps/vim_ex_command_09.dump index bc89f17530..709a488b79 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_09.dump @@ -1,9 +1,12 @@ -| +0&#ffffff0@3|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|a|r|g|s|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&@1| +0#0000000&@53 +| +0&#ffffff0@7|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e|(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| @8 +|"|•|"|,| |"|g|"|)|/+0#e000e06&|g|e| +0#0000000&@62 +@4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 +@4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|a|r|g|s|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&@1| +0#0000000&@53 @8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|!+0#af5f00255&|c+0#00e0e07&|o|l|u|m|n| +0#0000000&|-+0#af5f00255&|t+0#00e0e07&| +0#0000000&@40 -@4|e+0#af5f00255&|l|s|e| +0#0000000&@66 +@4>e+0#af5f00255&|l|s|e| +0#0000000&@66 @8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|!+0#af5f00255&|c+0#00e0e07&|o|l|u|m|n| +0#0000000&|-+0#af5f00255&|t+0#00e0e07&| +0#0000000&|-+0#af5f00255&|s+0#00e0e07&|'+0#0000000&|<+0#e000e06&|a|r|g|s|>|'+0#0000000&| @29 @4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 -@4>i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|b|a|n|g|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&|!|"| +0#0000000&@52 +@4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|b|a|n|g|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&|!|"| +0#0000000&@52 @8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|•+0#0000000&|/+0#e000e06&| +0#0000000&|/+0#e000e06&|g|e| +0#0000000&@42 @4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 |}+0#e000e06&| +0#0000000&@73 @@ -14,7 +17,4 @@ @75 |"+0#0000e05&| |U|n|r|e|p|o|r|t|e|d| |i|s@1|u|e| |(|:|m|a|p| |w|i|t|h| |t|r|a|i|l|i|n|g| |b|a|r| |i|n| |r|e|p|l|a|c|e|m|e|n|t| |t|e|x|t|)| +0#0000000&@11 @75 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@62 -@6|\+0#e000e06&| +0#0000000&|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| |r|h|s| ||| @53 -@6|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&|f|o@1| |b|a|r| ||| @46 -@57|1|5|7|,|5| @8|8|4|%| +@57|1|5|6|,|5| @8|8|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_10.dump b/runtime/syntax/testdir/dumps/vim_ex_command_10.dump index 5cc86bdcf2..fa68a4147d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_10.dump @@ -1,9 +1,12 @@ -| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&|f|o@1| |b|a|r| ||| @46 +| +0&#ffffff0@74 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@62 +@6|\+0#e000e06&| +0#0000000&|m+0#af5f00255&|a|p| +0#0000000&|l|h|s| |r|h|s| ||| @53 +@6|\+0#e000e06&| +0#0000000&|a+0#af5f00255&|b@1|r|e|v|i|a|t|e| +0#0000000&|f|o@1| |b|a|r| ||| @46 @6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 -@75 +> @74 @75 |"+0#0000e05&| |I|s@1|u|e| |#|1|8|4|1|4| |(|S|y|n|t|a|x| |g|r|o|u|p| |v|i|m|U|s|e|r|C|m|d|R|e|p|l|a|c|e|m|e|n|t| |l|a|c|k|i|n|g| |a| |k|e@1|p|e|n|d|?|)| +0#0000000&@4 -> @74 +@75 |d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 @2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|M+0#0000001#ffff4012|y|F|u|n|c|t|i|o|n| +0#0000000#ffffff0|M|y|F|u|n|c|(+0#e000e06&|)| +0#0000000&@44 @2|#+0#0000e05&| |I| |a|m| |a| |c|o|m@1|e|n|t| +0#0000000&@56 @@ -14,7 +17,4 @@ @75 |c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|M+0#0000001#ffff4012|y|F|u|n|c|t|i|o|n| +0#0000000#ffffff0|c+0#af5f00255&|a|l@1| +0#0000000&|M|y|F|u|n|c|(+0#e000e06&|)| +0#0000000&@41 |"+0#0000e05&| |I| |a|m| |a| |c|o|m@1|e|n|t| +0#0000000&@58 -@75 -|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|T+0#0000001#ffff4012|o|g@1|l|e|W|r|a|p| +0#0000000#ffffff0|s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&|w+0#e000e06&|r|a|p|!| +0#0000000&@40 -|"+0#0000e05&| |I| |a|m| |a| |c|o|m@1|e|n|t| |b|u|t| |I| |d|i|d|n|'|t| |g|e|t| |h|i|g|h|l|i|g|h|t|e|d| +0#0000000&@29 -@57|1|7|4|,|0|-|1| @6|9|4|%| +@57|1|7|3|,|0|-|1| @6|9|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_11.dump b/runtime/syntax/testdir/dumps/vim_ex_command_11.dump index 1e50b3f141..0514b852ab 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_11.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_11.dump @@ -1,9 +1,12 @@ -|"+0#0000e05#ffffff0| |I| |a|m| |a| |c|o|m@1|e|n|t| |b|u|t| |I| |d|i|d|n|'|t| |g|e|t| |h|i|g|h|l|i|g|h|t|e|d| +0#0000000&@29 +|"+0#0000e05#ffffff0| |I| |a|m| |a| |c|o|m@1|e|n|t| +0#0000000&@58 @75 +|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|T+0#0000001#ffff4012|o|g@1|l|e|W|r|a|p| +0#0000000#ffffff0|s+0#af5f00255&|e|t|l|o|c|a|l| +0#0000000&|w+0#e000e06&|r|a|p|!| +0#0000000&@40 +|"+0#0000e05&| |I| |a|m| |a| |c|o|m@1|e|n|t| |b|u|t| |I| |d|i|d|n|'|t| |g|e|t| |h|i|g|h|l|i|g|h|t|e|d| +0#0000000&@29 @75 +> @74 |"+0#0000e05&| |I|s@1|u|e| |#|1|8|4@1|8| |(|c|o|m@1|e|n|t| |f|o|r| |s|u|b|s|e|q|u|e|n|t| |c|o|m@1|a|n|d| |i|s| |n|o|t| |h|i|g|h|l|i|g|h|t|e|d|)| +0#0000000&@8 @75 ->d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 +|d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 @2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|1+0#00e0003&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|f+0#00e0003&|i|l|e| +0#0000000&|R+0#0000001#ffff4012|g| +0#0000000#ffffff0|:|t+0#af5f00255&|e|r|m| +0#0000000&|r|g| |<|a|r|g|s|>| @21 @2|#+0#0000e05&| |c|o|m@1|a|n|d|!| |-|n|a|r|g|s|=|1| |-|c|o|m|p|l|e|t|e|=|f|i|l|e| |R|g| |:|t|e|r|m| |+@1|s|h|e|l@1| |r|g| |<|a|r|g|s|>| +0#0000000&@11 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 @@ -14,7 +17,4 @@ |~| @73 |~| @73 |~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|9|2|,|1| @8|B|o|t| +| +0#0000000&@56|1|9|1|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/input/vim9_blocks.vim b/runtime/syntax/testdir/input/vim9_blocks.vim index 20a68fc5ab..ec448986ad 100644 --- a/runtime/syntax/testdir/input/vim9_blocks.vim +++ b/runtime/syntax/testdir/input/vim9_blocks.vim @@ -44,6 +44,10 @@ echo "Foo" | { | echo "Bar" var foo = 42 } | echo "Baz" +{| echo "Foo" |} + + # dictionary + {}->items() diff --git a/runtime/syntax/testdir/input/vim_ex_autocmd.vim b/runtime/syntax/testdir/input/vim_ex_autocmd.vim index 2216a427ec..8e43936cf7 100644 --- a/runtime/syntax/testdir/input/vim_ex_autocmd.vim +++ b/runtime/syntax/testdir/input/vim_ex_autocmd.vim @@ -55,6 +55,8 @@ autocmd foogroup BufRead *.txt { echo "Bar" } +autocmd BufRead *.txt {| echo "Foo" |} + " Multiline {cmd} arg diff --git a/runtime/syntax/testdir/input/vim_ex_command.vim b/runtime/syntax/testdir/input/vim_ex_command.vim index a2f01a708e..9b97a66dbe 100644 --- a/runtime/syntax/testdir/input/vim_ex_command.vim +++ b/runtime/syntax/testdir/input/vim_ex_command.vim @@ -22,6 +22,8 @@ command! Foo { echo "Baz" } +command! Foo {| echo "Foo" |} + command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register Foo echo "Foo" command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register Foo diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 21c9d3b568..9e553ef357 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 12 +" Last Change: 2026 Aug 22 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -579,7 +579,12 @@ Vim9 syn match vimAugroup contained "\\ze\s*\%([#|]\|$\)" skipwhi " ================================ " TODO: explicitly match the {cmd} arg rather than bailing out to TOP -syn region vimAutocmdBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList +syn region vimAutocmdBlock contained + \ matchgroup=vimSep + \ start="{\ze\s*\%($\|[#|]\)" + \ end="^\s*\zs}" + \ end="\%(\\\@ Date: Sun, 23 Aug 2026 18:47:52 +0000 Subject: [PATCH 423/647] patch 9.2.0997: ch_sendexpr() cannot answer a request named with a string id Problem: A request that a server named with a string cannot be answered, since ch_sendexpr() rejects an "id" that is not a Number. Solution: Require a Number only when Vim has to match a reply, which is with ch_evalexpr() or when a callback is given. Send the message as it is otherwise (Hirohito Higashi). fixes: #14091 fixes: #19003 closes: #21114 closes: #21126 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/channel.txt | 7 +++++++ runtime/doc/version9.txt | 5 +++-- src/channel.c | 25 ++++++++++++------------- src/testdir/test_channel.vim | 15 +++++++++++++-- src/version.c | 2 ++ 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt index 839dcc296e..ee0fe673bf 100644 --- a/runtime/doc/channel.txt +++ b/runtime/doc/channel.txt @@ -812,6 +812,13 @@ ch_sendexpr({handle}, {expr} [, {options}]) *ch_sendexpr()* If a response message is not expected for {expr}, then don't specify the "callback" item in {options}. + In "lsp" mode an "id" item in {expr} is sent as it is when no + response is expected, which is how a request from the server + is answered; it may be of any type the server used. When a + response is expected, with |ch_evalexpr()| or with the + "callback" item, Vim assigns the ID itself and the item must + be a |Number|. + Can also be used as a |method|: > GetChannel()->ch_sendexpr(expr) < diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index c0f746f2ca..768f9e12aa 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 20 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52705,7 +52705,8 @@ Changed ~ - |extend()| and |extendnew()| also accept |Blobs|. - events like |CursorMoved| are no longer triggered for what happened while they were ignored with 'eventignore'. - +- |ch_sendexpr()| accepts a non-Number "id" in "lsp" mode when no response is + expected, so a request from the server can be answered. *added-9.3* Added ~ diff --git a/src/channel.c b/src/channel.c index 0519a157be..3fc9120b31 100644 --- a/src/channel.c +++ b/src/channel.c @@ -5120,6 +5120,7 @@ ch_expr_common(typval_T *argvars, typval_T *rettv, int eval) { dict_T *d; dictitem_T *di; + char *key = ch_mode == CH_MODE_LSP ? "id" : "seq"; // return an empty dict by default if (rettv_dict_alloc(rettv) == FAIL) @@ -5129,22 +5130,20 @@ ch_expr_common(typval_T *argvars, typval_T *rettv, int eval) return; d = argvars[1].vval.v_dict; - if (ch_mode == CH_MODE_LSP) - di = dict_find(d, (char_u *)"id", -1); - else - di = dict_find(d, (char_u *)"seq", -1); - if (di != NULL && di->di_tv.v_type != VAR_NUMBER) + di = dict_find(d, (char_u *)key, -1); + if (argvars[2].v_type == VAR_DICT + && dict_has_key(argvars[2].vval.v_dict, "callback")) + callback_present = TRUE; + + // The id is what a reply is matched by, so it must be a number when + // one is waited for. + if (di != NULL && di->di_tv.v_type != VAR_NUMBER + && (ch_mode == CH_MODE_DAP || eval || callback_present)) { - // only number type is supported for the 'id' or 'seq' item - semsg(_(e_invalid_value_for_argument_str), - ch_mode == CH_MODE_LSP ? "id" : "seq"); + semsg(_(e_invalid_value_for_argument_str), key); return; } - if (argvars[2].v_type == VAR_DICT) - if (dict_has_key(argvars[2].vval.v_dict, "callback")) - callback_present = TRUE; - if (ch_mode == CH_MODE_DAP) { // DAP message always has a sequence number (id) @@ -5169,7 +5168,7 @@ ch_expr_common(typval_T *argvars, typval_T *rettv, int eval) // When sending an expression, if the message has an 'id' item, // then use it. id = 0; - if (di != NULL) + if (di != NULL && di->di_tv.v_type == VAR_NUMBER) id = di->di_tv.vval.v_number; } if (ch_mode == CH_MODE_LSP && !dict_has_key(d, "jsonrpc")) diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index f35a1b8556..6aab5b1667 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -2809,9 +2809,20 @@ func LspTests(port) " \ 'result': {'method': 'echo', 'jsonrpc': '2.0', " \ 'params': {'m': 'raw-message'}}}], g:lspNotif) + " Test for sending a message with a String id, which is what answering a + " request from a server that named it with one takes + let g:lspNotif = [] + call ch_sendexpr(ch, #{method: 'echo', id: 'e8a1-4c2f', + \ params: #{s: 'msg-with-string-id'}}) + " Send a ping to wait for all the notification messages to arrive + call assert_equal('alive', ch_evalexpr(ch, #{method: 'ping'}).result) + call assert_equal([#{jsonrpc: '2.0', result: + \ #{method: 'echo', jsonrpc: '2.0', id: 'e8a1-4c2f', + \ params: #{s: 'msg-with-string-id'}}}], g:lspNotif) + " Invalid arguments to ch_evalexpr() and ch_sendexpr() - call assert_fails('call ch_sendexpr(ch, #{method: "cookie", id: "cookie"})', - \ 'E475:') + call assert_fails('call ch_sendexpr(ch, #{method: "cookie", id: "cookie"},' + \ .. ' #{callback: "LspOtCb"})', 'E475:') call assert_fails('call ch_evalexpr(ch, #{method: "ping", id: [{}]})', 'E475:') call assert_fails('call ch_evalexpr(ch, [1, 2, 3])', 'E1206:') call assert_fails('call ch_sendexpr(ch, "abc")', 'E1206:') diff --git a/src/version.c b/src/version.c index 37e823d3d0..3c26d9443d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 997, /**/ 996, /**/ From 93112a775124889ce3ea8b93f87a2831ca0d96bf Mon Sep 17 00:00:00 2001 From: Shane Harper Date: Sun, 23 Aug 2026 19:01:15 +0000 Subject: [PATCH 424/647] patch 9.2.0998: Reject non-string-literal arguments to STRLEN_LITERAL Problem: STRLEN_LITERAL silently expands to an expression that doesn't determine a string's length if it's given a non-string-literal token. Solution: Modify STRLEN_LITERAL so that a non-string-literal argument produces a compile error (Shane Harper). Regarding character arrays: A compilation error will now be generated for the following: char s[64] = "12345"; int l = STRLEN_LITERAL(s); // previously l was assigned 63 (not 5). Had s been defined as: char s[] = "12345"; the original definition of STRLEN_LITERAL would have correctly determined the string length to be 5; however, the macro cannot distinguish a padded array like the first from an exactly-sized one like the second, so both are rejected. Supported by AI (Claude Sonnet 5). closes: #21122 Signed-off-by: Shane Harper Signed-off-by: Christian Brabandt --- src/ascii.h | 2 +- src/cmdexpand.c | 2 +- src/fileio.c | 4 ++-- src/filepath.c | 4 ++-- src/findfile.c | 2 +- src/help.c | 2 +- src/os_unix.c | 2 +- src/scriptfile.c | 2 +- src/structs.h | 7 +++++-- src/version.c | 2 ++ 10 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/ascii.h b/src/ascii.h index ec839704ed..5941b1b09c 100644 --- a/src/ascii.h +++ b/src/ascii.h @@ -87,6 +87,6 @@ # define PATHSEP psepc # define PATHSEPSTR pseps #else -# define PATHSEP '/' +# define PATHSEP ((char_u)'/') # define PATHSEPSTR "/" #endif diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 98ce6259f5..45a9a7dd4c 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -4135,7 +4135,7 @@ expand_shellcmd( // Do not match directories inside a $PATH item. flags &= ~EW_DIR; - seplen = !after_pathsep(s, e) ? STRLEN_LITERAL(PATHSEPSTR) : 0; + seplen = !after_pathsep(s, e) ? sizeof(PATHSEP) : 0; } // Make sure that the pathed pattern (ie the path and pattern concatenated diff --git a/src/fileio.c b/src/fileio.c index 255e1b33db..8326be11ce 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -5424,7 +5424,7 @@ vim_settempdir(char_u *tempdir) if (!after_pathsep(buf, buf + buflen)) { STRCPY(buf + buflen, PATHSEPSTR); - buflen += STRLEN_LITERAL(PATHSEPSTR); + buflen += sizeof(PATHSEP); } vim_tempdir = vim_strnsave(buf, buflen); # if defined(UNIX) && defined(HAVE_FLOCK) && defined(HAVE_DIRFD) @@ -5501,7 +5501,7 @@ vim_tempname( if (!after_pathsep(itmp, itmp + itmplen)) { STRCPY(itmp + itmplen, PATHSEPSTR); - itmplen += STRLEN_LITERAL(PATHSEPSTR); + itmplen += sizeof(PATHSEP); } # ifdef HAVE_MKDTEMP diff --git a/src/filepath.c b/src/filepath.c index 388ce7af17..32750eead2 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -3200,7 +3200,7 @@ vim_fnamencmp(char_u *x, char_u *y, size_t len) char_u * concat_fnames(char_u *fname1, size_t fname1len, char_u *fname2, size_t fname2len, int sep, string_T *ret) { - ret->string = alloc(fname1len + (sep ? STRLEN_LITERAL(PATHSEPSTR) : 0) + fname2len + 1); + ret->string = alloc(fname1len + (sep ? sizeof(PATHSEP) : 0) + fname2len + 1); if (ret->string == NULL) ret->length = 0; else @@ -3210,7 +3210,7 @@ concat_fnames(char_u *fname1, size_t fname1len, char_u *fname2, size_t fname2len if (sep && *ret->string != NUL && !after_pathsep(ret->string, ret->string + ret->length)) { STRCPY(ret->string + ret->length, PATHSEPSTR); - ret->length += STRLEN_LITERAL(PATHSEPSTR); + ret->length += sizeof(PATHSEP); } STRCPY(ret->string + ret->length, fname2); ret->length += fname2len; diff --git a/src/findfile.c b/src/findfile.c index af9523dcda..25ffd115d2 100644 --- a/src/findfile.c +++ b/src/findfile.c @@ -2678,7 +2678,7 @@ uniquefy_paths( continue; } - rel_pathsize = 1 + STRLEN_LITERAL(PATHSEPSTR) + STRLEN(short_name) + 1; + rel_pathsize = 1 + sizeof(PATHSEP) + STRLEN(short_name) + 1; rel_path = alloc(rel_pathsize); if (rel_path == NULL) goto theend; diff --git a/src/help.c b/src/help.c index c8155054d1..be4a7a0386 100644 --- a/src/help.c +++ b/src/help.c @@ -795,7 +795,7 @@ fix_help_buffer(void) if (*NameBuff != NUL && !after_pathsep(NameBuff, NameBuff + NameBufflen)) { STRCPY(NameBuff + NameBufflen, PATHSEPSTR); - NameBufflen += STRLEN_LITERAL(PATHSEPSTR); + NameBufflen += sizeof(PATHSEP); } #ifdef FEAT_MULTI_LANG STRCPY(NameBuff + NameBufflen, "doc/*.??[tx]"); diff --git a/src/os_unix.c b/src/os_unix.c index 5a6ccacc9c..ebdc8d04a2 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -2824,7 +2824,7 @@ mch_FullName( && STRCMP(fname, ".") != 0) { STRCPY(buf + buflen, PATHSEPSTR); - buflen += STRLEN_LITERAL(PATHSEPSTR); + buflen += sizeof(PATHSEP); } #endif } diff --git a/src/scriptfile.c b/src/scriptfile.c index c5f807562d..302fae91bb 100644 --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -667,7 +667,7 @@ do_in_path( && !after_pathsep(buf.string, buf.string + buf.length)) { STRCPY(buf.string + buf.length, PATHSEPSTR); - buf.length += STRLEN_LITERAL(PATHSEPSTR); + buf.length += sizeof(PATHSEP); } STRCPY(buf.string + buf.length, prefix); buf.length += prefixlen; diff --git a/src/structs.h b/src/structs.h index 984acc1d9e..2953ccb028 100644 --- a/src/structs.h +++ b/src/structs.h @@ -5472,8 +5472,11 @@ typedef struct { #endif } spellvars_T; -// Return the length of a string literal -#define STRLEN_LITERAL(s) (sizeof(s) - 1) +// Return the length of a string literal. +// This macro only computes a string's length for a string-literal token; for +// anything else, including a char*, compilation will fail (note "" following +// s). +#define STRLEN_LITERAL(s) (sizeof(s "") - 1) // Store a key/value (string) pair typedef struct diff --git a/src/version.c b/src/version.c index 3c26d9443d..d33f63fede 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 998, /**/ 997, /**/ From 46073443359365778d673eda255a90282060d7d7 Mon Sep 17 00:00:00 2001 From: thinca Date: Sun, 23 Aug 2026 19:24:57 +0000 Subject: [PATCH 425/647] patch 9.2.0999: serverlist() fails when there is no connection to the server Problem: Since patch 9.2.0818, serverlist() gives E240 instead of returning an empty result when the X11 clientserver backend cannot connect to the X server, e.g. on a Wayland-only system. This contradicts the documentation and patches 6.0.191 and 6.1.349, which deliberately removed that error message. On the failing path the return value is a Number as well. Solution: Do not give an error when the X server cannot be reached, but return an empty string, or an empty List when the "list" option is used. The "list" option now always results in a List when no server names are available, which is the type inconsistency that patch 9.2.0818 set out to fix. related: #20716 closes: #21124 Co-authored-by: Claude Signed-off-by: thinca Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 8 ++++++-- src/clientserver.c | 17 +++++++++-------- src/testdir/test_clientserver.vim | 18 +++++++++++------- src/testdir/test_vim9_builtin.vim | 12 ++++-------- src/version.c | 2 ++ 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 9effcec549..0228bcbd6a 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 20 +*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -9929,7 +9929,11 @@ server2client({clientid}, {string}) *server2client()* serverlist([{dict}]) *serverlist()* Return a list of available server names, one per line. When there are no servers or the information is not available - an empty string is returned. + an empty string is returned, or an empty |List| when the + "list" option below is used. + + When the server cannot be reached, no error will be given and + the result is an empty string or |List|. {only available when compiled with the |+clientserver| feature} If {dict} is given, then it is a |Dictionary| supporting the diff --git a/src/clientserver.c b/src/clientserver.c index 30aab970fe..9a099e7b0d 100644 --- a/src/clientserver.c +++ b/src/clientserver.c @@ -1284,18 +1284,19 @@ f_serverlist(typval_T *argvars UNUSED, typval_T *rettv) # ifdef FEAT_X11 if (clientserver_method == CLIENTSERVER_METHOD_X11) { - // This function fails if there is no X11 connection. - if (check_connection() == FAIL) - return; - // If the check_connection() function returns OK, it has already been - // confirmed within that function that make_connection() was called and - // that X_DISPLAY is not NULL. - list = serverGetVimNames(X_DISPLAY); + make_connection(); + if (X_DISPLAY != NULL) + list = serverGetVimNames(X_DISPLAY); } # endif # endif - if (use_list && list != NULL) + if (use_list) { + if (list == NULL) + { + (void)rettv_list_alloc(rettv); + return; + } list->lv_refcount++; rettv->v_type = VAR_LIST; rettv->vval.v_list = list; diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim index 5ed063e1f5..17ea44d41a 100644 --- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -708,20 +708,24 @@ func Test_clientserver_serverlist_without_x11() throw 'GetVimCommand() failed' endif - " This test verifies that serverlist() fails with error E240 when a + " This test verifies that serverlist() returns an empty result when a " connection to X11 cannot be established. It must be executed with the " CLIENTSERVER backend set to x11 and in a state where the X11 server is " unreachable. " " To achieve this, the `VIM_CLIENTSERVER` and `DISPLAY` environment - " variables must be unset before running Vim as a child process. Within the - " child process, `assert_fails()` and `v:errors` are used to confirm that - " E240 occurred; if E240 is raised as expected, `v:errors` remains empty, - " whereas if the call succeeds or a different error occurs, `v:errors` will - " contain one or more errors. + " variables must be unset before running Vim as a child process. The child + " process reports the number of `v:errors` as its exit code. The calls are + " wrapped in a try/catch, because an error would otherwise skip the + " assertion without adding anything to `v:errors`. call writefile([ - \ "call assert_fails('let x = serverlist()', 'E240:')", + \ "try", + \ " call assert_equal('', serverlist())", + \ " call assert_equal([], serverlist(#{list: v:true}))", + \ "catch", + \ " call add(v:errors, 'unexpected exception: ' .. v:exception)", + \ "endtry", \ "execute 'cq! ' .. len(v:errors)" \ ], 'Xtest', 'D') diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index a32fe559ba..adbb034954 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -3631,14 +3631,10 @@ def Test_remote_serverlist() v9.CheckSourceDefAndScriptFailure(['serverlist("")'], ['E1013: Argument 1: type mismatch, expected dict but got string', 'E1206: Dictionary required for argument 1']) v9.CheckSourceScriptFailure(['vim9script', 'serverlist({list: ""})'], 'E1135: Using a String as a Bool: ""') - try - var l: any = serverlist() - assert_equal(v:t_string, type(l)) - l = serverlist({'list': true}) - assert_equal(v:t_list, type(l)) - catch /E240:/ - # ignore no connection to the X server - endtry + var l: any = serverlist() + assert_equal(v:t_string, type(l)) + l = serverlist({'list': true}) + assert_equal(v:t_list, type(l)) enddef def Test_remove_literal_list() diff --git a/src/version.c b/src/version.c index d33f63fede..5e5717f9ae 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 999, /**/ 998, /**/ From 63d08d43862ed195da78cfb1bebe2c0ed02f80b7 Mon Sep 17 00:00:00 2001 From: Josep Puigdemont Date: Sun, 23 Aug 2026 19:40:54 +0000 Subject: [PATCH 426/647] runtime(doc): update :h write-plugin and readdir() example 1) The complete example plugin at :h write-plugin the end of the documentation didn't reflect the snippets provided during the tutorial. In most of the Add() function, interpolated strings are used, but the final result used concatenated strings. 2) The example provided in readdir() to get a list of files ending in ".txt" didn't properly escape the dot in the regular expression: readdir(dirname, {n -> n =~ '.txt$'}) This would match any file ending with "txt" that is at least 4 characters long, instead it should be: readdir(dirname, {n -> n =~ '\.txt$'}) closes: #21123 Signed-off-by: Josep Puigdemont Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 2 +- runtime/doc/usr_51.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 0228bcbd6a..f38a06657b 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -8798,7 +8798,7 @@ readdir({directory} [, {expr} [, {dict}]]) *readdir()* Each time {expr} is evaluated |v:val| is set to the entry name. When {expr} is a function the name is passed as the argument. For example, to get a list of files ending in ".txt": > - readdir(dirname, {n -> n =~ '.txt$'}) + readdir(dirname, {n -> n =~ '\.txt$'}) < To skip hidden and backup files: > readdir(dirname, {n -> n !~ '^\.\|\~$'}) < *E857* diff --git a/runtime/doc/usr_51.txt b/runtime/doc/usr_51.txt index e8fb68bced..2db3dd018e 100644 --- a/runtime/doc/usr_51.txt +++ b/runtime/doc/usr_51.txt @@ -1,4 +1,4 @@ -*usr_51.txt* For Vim version 9.2. Last change: 2026 Jun 03 +*usr_51.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM USER MANUAL by Bram Moolenaar @@ -346,8 +346,8 @@ Here is the resulting complete example: > 26 noremap Add :call Add(expand(""), true) 27 28 def Add(from: string, correct: bool) - 29 var to = input("type the correction for " .. from .. ": ") - 30 exe ":iabbrev " .. from .. " " .. to + 29 var to = input($"type the correction for {from}: ") + 30 exe $":iabbrev {from} {to}" 31 if correct | exe "normal viws\\" \b\e" | endif 32 count += 1 33 echo "you now have " .. count .. " corrections" From 937992b1438a341b8ab6b1cf67edcb01d94c133e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 23 Aug 2026 19:45:42 +0000 Subject: [PATCH 427/647] patch 9.2.1000: Vim9: listener_add() fails when given only a callback Problem: In Vim9 script, listener_add() given only a callback fails with "E1212: Bool required for argument 3". Solution: Check the third argument only when the second one is there. Without a second argument the third is not filled in, so what was checked was whatever happened to be in that slot (Hirohito Higashi). closes: #21116 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/change.c | 3 ++- src/testdir/test_listener.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/change.c b/src/change.c index 7edbd9b8d8..f8c0393057 100644 --- a/src/change.c +++ b/src/change.c @@ -403,7 +403,8 @@ f_listener_add(typval_T *argvars, typval_T *rettv) if (in_vim9script() && ( check_for_opt_buffer_arg(argvars, 1) == FAIL - || check_for_opt_bool_or_dict_arg(argvars, 2) == FAIL)) + || (argvars[1].v_type != VAR_UNKNOWN + && check_for_opt_bool_or_dict_arg(argvars, 2) == FAIL))) return; callback = get_callback(&argvars[0]); diff --git a/src/testdir/test_listener.vim b/src/testdir/test_listener.vim index b981fd72d1..7639f996dc 100644 --- a/src/testdir/test_listener.vim +++ b/src/testdir/test_listener.vim @@ -2,6 +2,8 @@ " listener_add() and listener_remove() " redraw_listener_add() and redraw_listener_remove() +import './util/vim9.vim' as v9 + func s:StoreList(s, e, a, l) let s:start = a:s let s:end = a:e @@ -991,4 +993,26 @@ func Test_listener_add_in_sandbox() call assert_fails('sandbox call listener_remove(1)', 'E48:') endfunc +" Using listener_add() with only the callback, from Vim9 script. The check on +" the third argument used to look at it even when the second one was not there. +func Test_listener_add_one_arg_vim9() + let lines =<< trim END + vim9script + var seen = 0 + def Listen(bufnr: number, start: number, end: number, added: number, + changes: list>) + seen += 1 + enddef + new + var id = listener_add(Listen) + assert_true(id > 0) + setline(1, 'x') + listener_flush() + assert_equal(1, seen) + listener_remove(id) + bwipe! + END + call v9.CheckScriptSuccess(lines) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 5e5717f9ae..92fdb20c6a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1000, /**/ 999, /**/ From 1c32cede0afdc9351d5887e2f25977d4fb964d9f Mon Sep 17 00:00:00 2001 From: glepnir Date: Sun, 23 Aug 2026 19:58:27 +0000 Subject: [PATCH 428/647] patch 9.2.1001: complete_info() does not report the item highlight groups Problem: complete_info() omits "abbr_hlgroup" and "kind_hlgroup". Solution: Keep the highlight group ID with the match instead of the resolved attribute and add both entries to the returned items (glepnir). closes: #21105 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 6 ++- runtime/doc/insert.txt | 8 ++-- src/insexpand.c | 42 ++++++++++++----- src/testdir/test_ins_complete.vim | 75 +++++++++++++++++++++---------- src/testdir/test_popup.vim | 10 ++--- src/version.c | 2 + 6 files changed, 98 insertions(+), 45 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index f38a06657b..c37b7b0d00 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -2063,8 +2063,10 @@ complete_info([{what}]) *complete_info()* the currently selected index item. items List of all completion candidates. Each item is a dictionary containing the entries "word", - "abbr", "menu", "kind", "info" and - "user_data". + "abbr", "menu", "kind", "info", "abbr_hlgroup", + "kind_hlgroup" and "user_data". The highlight + group entries hold the name that the item was + added with, or an empty string. See |complete-items|. matches Same as "items", but only returns items that are matching current query. If both "matches" diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt index f581d50cf8..18408dfe8d 100644 --- a/runtime/doc/insert.txt +++ b/runtime/doc/insert.txt @@ -1,4 +1,4 @@ -*insert.txt* For Vim version 9.2. Last change: 2026 Jul 22 +*insert.txt* For Vim version 9.2. Last change: 2026 Aug 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1264,13 +1264,15 @@ items: |hl-PmenuMatchSel| and |hl-PmenuMatch| highlight attributes in the popup menu to apply cterm and gui properties (with higher priority) like strikethrough - to the completion items abbreviation + to the completion items abbreviation. + The group can be defined later. kind_hlgroup an additional highlight group specifically for setting the highlight attributes of the completion kind. When this field is present, it will override the |hl-PmenuKind| highlight group, allowing for the customization of ctermfg and guifg properties for the - completion kind + completion kind. + The group can be defined later. match See "matches" in |complete_info()|. All of these except "icase", "equal", "dup" and "empty" must be a string. If diff --git a/src/insexpand.c b/src/insexpand.c index 203ea6fc3a..f63f4ff6bd 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -110,8 +110,8 @@ struct compl_S int cp_number; // sequence number int cp_score; // fuzzy match score or proximity score int cp_in_match_array; // collected by compl_match_array - int cp_user_abbr_hlattr; // highlight attribute for abbr - int cp_user_kind_hlattr; // highlight attribute for kind + int cp_user_abbr_hl_id; // highlight group ID for abbr + int cp_user_kind_hl_id; // highlight group ID for kind int cp_cpt_source_idx; // index of this match's source in 'cpt' option }; @@ -1047,8 +1047,8 @@ ins_compl_add( else match->cp_fname = NULL; match->cp_flags = flags; - match->cp_user_abbr_hlattr = user_hl ? user_hl[0] : -1; - match->cp_user_kind_hlattr = user_hl ? user_hl[1] : -1; + match->cp_user_abbr_hl_id = user_hl ? user_hl[0] : 0; + match->cp_user_kind_hl_id = user_hl ? user_hl[1] : 0; match->cp_score = score; match->cp_cpt_source_idx = cpt_sources_index; @@ -1742,6 +1742,20 @@ sort_compl_match_list(int (*compare)(const void *, const void *)) (void)ins_compl_make_cyclic(); } +/* + * Return the attribute for highlight group "hl_id", -1 when it has none. + */ + static int +get_user_highlight_attr(int hl_id) +{ + int attr; + + if (hl_id <= 0) + return -1; + attr = syn_id2attr(hl_id); + return attr > 0 ? attr : -1; +} + /* * Build a popup menu to show the completion matches. * Returns the popup menu entry that should be selected. Returns -1 if nothing @@ -1905,8 +1919,10 @@ ins_compl_build_pum(void) compl_match_array[i].pum_kind = compl->cp_text[CPT_KIND]; compl_match_array[i].pum_info = compl->cp_text[CPT_INFO]; compl_match_array[i].pum_cpt_source_idx = compl->cp_cpt_source_idx; - compl_match_array[i].pum_user_abbr_hlattr = compl->cp_user_abbr_hlattr; - compl_match_array[i].pum_user_kind_hlattr = compl->cp_user_kind_hlattr; + compl_match_array[i].pum_user_abbr_hlattr = + get_user_highlight_attr(compl->cp_user_abbr_hl_id); + compl_match_array[i].pum_user_kind_hlattr = + get_user_highlight_attr(compl->cp_user_kind_hl_id); compl_match_array[i++].pum_extra = compl->cp_text[CPT_MENU] != NULL ? compl->cp_text[CPT_MENU] : compl->cp_fname; match_next = compl->cp_match_next; @@ -3850,11 +3866,11 @@ expand_by_function(int type, char_u *base, callback_T *cb) #if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL) static inline int -get_user_highlight_attr(char_u *hlname) +get_user_highlight_id(char_u *hlname) { if (hlname != NULL && *hlname != NUL) - return syn_name2attr(hlname); - return -1; + return syn_check_group(hlname, STRLEN(hlname)); + return 0; } /* * Add a match to the list of matches from a typeval_T. @@ -3875,7 +3891,7 @@ ins_compl_add_tv(typval_T *tv, int dir, int fast) int status; char_u *user_abbr_hlname; char_u *user_kind_hlname; - int user_hl[2] = { -1, -1 }; + int user_hl[2] = { 0, 0 }; user_data.v_type = VAR_UNKNOWN; if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) @@ -3887,10 +3903,10 @@ ins_compl_add_tv(typval_T *tv, int dir, int fast) cptext[CPT_INFO] = dict_get_string(tv->vval.v_dict, "info", FALSE); user_abbr_hlname = dict_get_string(tv->vval.v_dict, "abbr_hlgroup", FALSE); - user_hl[0] = get_user_highlight_attr(user_abbr_hlname); + user_hl[0] = get_user_highlight_id(user_abbr_hlname); user_kind_hlname = dict_get_string(tv->vval.v_dict, "kind_hlgroup", FALSE); - user_hl[1] = get_user_highlight_attr(user_kind_hlname); + user_hl[1] = get_user_highlight_id(user_kind_hlname); dict_get_tv(tv->vval.v_dict, "user_data", &user_data); if (dict_get_string(tv->vval.v_dict, "icase", FALSE) != NULL @@ -4184,6 +4200,8 @@ fill_complete_info_dict(dict_T *di, compl_T *match, int add_match) dict_add_string(di, "menu", match->cp_text[CPT_MENU]); dict_add_string(di, "kind", match->cp_text[CPT_KIND]); dict_add_string(di, "info", match->cp_text[CPT_INFO]); + dict_add_string(di, "abbr_hlgroup", syn_id2name(match->cp_user_abbr_hl_id)); + dict_add_string(di, "kind_hlgroup", syn_id2name(match->cp_user_kind_hl_id)); if (add_match) dict_add_bool(di, "match", match->cp_in_match_array); if (match->cp_user_data.v_type == VAR_UNKNOWN) diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index a0ee08dc10..b83e605aae 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -576,15 +576,15 @@ func Test_completefunc_info() call assert_equal("matched{'preinserted_text': '', 'pum_visible': 0, 'mode': '', 'selected': -1, 'items': []}", getline(1)) %d call feedkeys("i\\\\=string(complete_info())\\", "tx") - call assert_equal("matched{'preinserted_text': '', 'pum_visible': 1, 'mode': 'function', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) + call assert_equal("matched{'preinserted_text': '', 'pum_visible': 1, 'mode': 'function', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) %d set complete=.,FCompleteTest call feedkeys("i\\\=string(complete_info())\\", "tx") - call assert_equal("matched{'preinserted_text': '', 'pum_visible': 1, 'mode': 'keyword', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) + call assert_equal("matched{'preinserted_text': '', 'pum_visible': 1, 'mode': 'keyword', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) %d set complete=.,F call feedkeys("i\\\=string(complete_info())\\", "tx") - call assert_equal("matched{'preinserted_text': '', 'pum_visible': 1, 'mode': 'keyword', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) + call assert_equal("matched{'preinserted_text': '', 'pum_visible': 1, 'mode': 'keyword', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) set completeopt& set complete& set completefunc& @@ -693,10 +693,10 @@ func CompleteInfoTestUserDefinedFn(mvmt, idx, noselect) set completeopt=menu,preview endif let items = "[" . - \ "{'word': 'foo', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, " . - \ "{'word': 'bar', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, " . - \ "{'word': 'baz', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, " . - \ "{'word': 'qux', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}" . + \ "{'word': 'foo', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, " . + \ "{'word': 'bar', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, " . + \ "{'word': 'baz', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, " . + \ "{'word': 'qux', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}" . \ "]" new set completefunc=CompleteInfoUserDefinedFn @@ -1955,7 +1955,7 @@ func Test_cpt_func_refresh_always_fail() let g:CallCount = 0 exe "normal! Gof\oo\=complete_info([\"items\", \"selected\"])\" call assert_equal('foo{''selected'': -1, ''items'': [{''word'': ''fooo1'', ''menu'': '''', ' - \ . '''user_data'': '''', ''info'': '''', ''kind'': '''', ''abbr'': ''''}]}', + \ . '''kind_hlgroup'': '''', ''abbr_hlgroup'': '''', ''user_data'': '''', ''info'': '''', ''kind'': '''', ''abbr'': ''''}]}', \ getline(2)) call assert_equal(3, g:CallCount) %d @@ -1971,7 +1971,7 @@ func Test_cpt_func_refresh_always_fail() let g:CallCount = 0 exe "normal! Gof\o\\=complete_info([\"items\", \"selected\"])\" call assert_equal('f{''selected'': -1, ''items'': [{''word'': ''fooo1'', ''menu'': '''', ' - \ . '''user_data'': '''', ''info'': '''', ''kind'': '''', ''abbr'': ''''}]}', + \ . '''kind_hlgroup'': '''', ''abbr_hlgroup'': '''', ''user_data'': '''', ''info'': '''', ''kind'': '''', ''abbr'': ''''}]}', \ getline(2)) call assert_equal(3, g:CallCount) %d @@ -1979,7 +1979,7 @@ func Test_cpt_func_refresh_always_fail() let g:CallCount = 0 exe "normal! Gof\oo\\=complete_info([\"items\", \"selected\"])\" call assert_equal('fo{''selected'': -1, ''items'': [{''word'': ''fooo1'', ''menu'': '''', ' - \ . '''user_data'': '''', ''info'': '''', ''kind'': '''', ''abbr'': ''''}]}', + \ . '''kind_hlgroup'': '''', ''abbr_hlgroup'': '''', ''user_data'': '''', ''info'': '''', ''kind'': '''', ''abbr'': ''''}]}', \ getline(2)) call assert_equal(3, g:CallCount) bw! @@ -4162,26 +4162,26 @@ func Test_complete_info_matches() call feedkeys("Go\\\\dd", 'tx') call assert_equal([ - \ {'word': 'aaa', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'aab', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'aba', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'abb', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aaa', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aab', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aba', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'abb', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, \], g:compl_info['matches']) call feedkeys("Goa\\b\\dd", 'tx') call assert_equal([ - \ {'word': 'aba', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'abb', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aba', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'abb', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, \], g:compl_info['matches']) " items and matches both in what let g:what = ['items', 'matches'] call feedkeys("Goa\\b\\dd", 'tx') call assert_equal([ - \ {'word': 'aaa', 'menu': '', 'user_data': '', 'match': v:false, 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'aab', 'menu': '', 'user_data': '', 'match': v:false, 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'aba', 'menu': '', 'user_data': '', 'match': v:true, 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'abb', 'menu': '', 'user_data': '', 'match': v:true, 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aaa', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'match': v:false, 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aab', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'match': v:false, 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'aba', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'match': v:true, 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'abb', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'match': v:true, 'info': '', 'kind': '', 'abbr': ''}, \], g:compl_info['items']) call assert_false(has_key(g:compl_info, 'matches')) @@ -4203,13 +4203,13 @@ func Test_complete_info_completed() inoremap =ShownInfo() call feedkeys("Go\\\\dd", 'tx') - call assert_equal({'word': 'aaa', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, g:compl_info['completed']) + call assert_equal({'word': 'aaa', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, g:compl_info['completed']) call feedkeys("Go\\\\\dd", 'tx') - call assert_equal({'word': 'aab', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, g:compl_info['completed']) + call assert_equal({'word': 'aab', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, g:compl_info['completed']) call feedkeys("Go\\\\\\\dd", 'tx') - call assert_equal({'word': 'abb', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, g:compl_info['completed']) + call assert_equal({'word': 'abb', 'menu': '', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, g:compl_info['completed']) set completeopt+=noselect call feedkeys("Go\\\\dd", 'tx') @@ -6727,4 +6727,33 @@ func Test_ins_complete_dedup() unlet g:compl_info endfunc +func Test_complete_info_hlgroup() + new + set completeopt& + func DoComplete() + call complete(1, [ + \ #{word: 'aaa', abbr_hlgroup: 'Title', kind_hlgroup: 'SpecialKey'}, + \ #{word: 'bbb', abbr_hlgroup: 'MyAbbr', kind_hlgroup: 'MyKind'}, + \ #{word: 'ccc'}]) + return '' + endfunc + func ShownItems() + let g:items = complete_info(['items']).items + return '' + endfunc + + call assert_false(hlexists('MyAbbr')) + call feedkeys("i\=DoComplete()\\=ShownItems()\\", 'tx') + call assert_equal(['Title', 'MyAbbr', ''], + \ map(copy(g:items), 'v:val.abbr_hlgroup')) + call assert_equal(['SpecialKey', 'MyKind', ''], + \ map(copy(g:items), 'v:val.kind_hlgroup')) + call assert_true(hlexists('MyAbbr')) + + unlet g:items + delfunc DoComplete + delfunc ShownItems + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index f5f2f1a7b7..a1d11b55f0 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -1161,11 +1161,11 @@ func Test_popup_complete_info_02() \ 'mode': 'function', \ 'pum_visible': 1, \ 'items': [ - \ {'word': 'Jan', 'menu': 'January', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'Feb', 'menu': 'February', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'Mar', 'menu': 'March', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'Apr', 'menu': 'April', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, - \ {'word': 'May', 'menu': 'May', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''} + \ {'word': 'Jan', 'menu': 'January', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'Feb', 'menu': 'February', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'Mar', 'menu': 'March', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'Apr', 'menu': 'April', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}, + \ {'word': 'May', 'menu': 'May', 'kind_hlgroup': '', 'abbr_hlgroup': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''} \ ], \ 'preinserted_text': '', \ 'selected': 0, diff --git a/src/version.c b/src/version.c index 92fdb20c6a..586d940fd2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1001, /**/ 1000, /**/ From cb89033630865290f41ffec0948529ada1daaff3 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 25 Aug 2026 18:53:43 +0000 Subject: [PATCH 429/647] runtime(doc): some Blob functions are missing from blob-functions blob2str(), str2blob(), base64_encode() and base64_decode() are only listed under string-functions and channel-functions. Also use "Blob" consistently and say "bytes" instead of "numbers" for reverse(). closes: #21148 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Christian Brabandt --- runtime/doc/usr_41.txt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index c1ecf81b20..05ca990d0d 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1,4 +1,4 @@ -*usr_41.txt* For Vim version 9.2. Last change: 2026 Aug 18 +*usr_41.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM USER MANUAL by Bram Moolenaar @@ -936,9 +936,13 @@ Blob manipulation: *blob-functions* foreach() apply function to Blob bytes reduce() reduce a Blob to a value slice() take a slice of a Blob - blob2list() get a list of numbers from a blob - list2blob() get a blob from a list of numbers - reverse() reverse the order of numbers in a blob + blob2list() get a list of numbers from a Blob + list2blob() get a Blob from a list of numbers + blob2str() get a list of strings from a Blob + str2blob() get a Blob from a list of strings + base64_encode() encode a Blob into a base64 String + base64_decode() decode a base64 String into a Blob + reverse() reverse the order of bytes in a Blob string() String representation of a Blob index() index of a value in a Blob indexof() index in a Blob where an expression is true From 1afe7ad1bb72f36a80f8e625b91d0e7506ce8985 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 25 Aug 2026 19:17:25 +0000 Subject: [PATCH 430/647] patch 9.2.1002: filetype: bazelrc files are not recognized Problem: filetype: bazelrc files are not recognized Solution: Detect *.bazelrc and tools/bazel.rc files as bazelrc filetype, include syntax und filetype plugins, update the menus (Barrett Ruth). closes: #21146 Signed-off-by: Barrett Ruth Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 2 + runtime/autoload/dist/ft.vim | 4 +- runtime/filetype.vim | 5 +- runtime/ftplugin/bazelrc.vim | 17 +++ runtime/makemenu.vim | 3 +- runtime/synmenu.vim | 23 ++-- runtime/syntax/bazelrc.vim | 123 +++++++++++++++++++ runtime/syntax/testdir/dumps/bazelrc_00.dump | 20 +++ runtime/syntax/testdir/dumps/bazelrc_01.dump | 20 +++ runtime/syntax/testdir/dumps/bazelrc_02.dump | 20 +++ runtime/syntax/testdir/input/bazelrc.bazelrc | 44 +++++++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 + 13 files changed, 270 insertions(+), 14 deletions(-) create mode 100644 runtime/ftplugin/bazelrc.vim create mode 100644 runtime/syntax/bazelrc.vim create mode 100644 runtime/syntax/testdir/dumps/bazelrc_00.dump create mode 100644 runtime/syntax/testdir/dumps/bazelrc_01.dump create mode 100644 runtime/syntax/testdir/dumps/bazelrc_02.dump create mode 100644 runtime/syntax/testdir/input/bazelrc.bazelrc diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 93646aba4b..26d79fc062 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -150,6 +150,7 @@ runtime/ftplugin/asy.vim @avidseeker runtime/ftplugin/autohotkey.vim @telemachus runtime/ftplugin/awk.vim @dkearns runtime/ftplugin/basic.vim @dkearns +runtime/ftplugin/bazelrc.vim @barrettruth runtime/ftplugin/beancount.vim @nathangrigg runtime/ftplugin/bicep.vim @scottmckendry runtime/ftplugin/bicep-params.vim @scottmckendry @@ -508,6 +509,7 @@ runtime/syntax/asy.vim @avidseeker runtime/syntax/autohotkey.vim @mmikeww runtime/syntax/awk.vim @dkearns runtime/syntax/basic.vim @dkearns +runtime/syntax/bazelrc.vim @barrettruth runtime/syntax/beancount.vim @nathangrigg runtime/syntax/bpftrace.vim @sgruszka runtime/syntax/bst.vim @tpope diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index c346bd1397..f28a89fc09 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Aug 10 +# Last Change: 2026 Aug 25 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -1851,6 +1851,8 @@ const ft_from_ext = { "ibi": "ibasic", # FreeBasic file (similar to QBasic) "fb": "freebasic", + # Bazel rc file + "bazelrc": "bazelrc", # Batch file for MSDOS. See dist#ft#FTsys for *.sys "bat": "dosbatch", # BC calculator diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 7241efb45e..46fca304cd 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: The Vim Project -" Last Change: 2026 Aug 13 +" Last Change: 2026 Aug 25 " Former Maintainer: Bram Moolenaar " If the filetype can be detected from extension or file name(the final path component), @@ -185,6 +185,9 @@ if has("fname_case") au BufNewFile,BufRead *.BUILD,BUILD,BUCK setf bzl endif +" Bazel rc file, the workspace location used before Bazel 0.17 +au BufNewFile,BufRead */tools/bazel.rc setf bazelrc + " Bundle config au BufNewFile,BufRead */.bundle/config setf yaml diff --git a/runtime/ftplugin/bazelrc.vim b/runtime/ftplugin/bazelrc.vim new file mode 100644 index 0000000000..7f763f712d --- /dev/null +++ b/runtime/ftplugin/bazelrc.vim @@ -0,0 +1,17 @@ +" Vim filetype plugin file +" Language: Bazel rc file +" Maintainer: Barrett Ruth +" Last Change: 2026 Aug 25 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +setlocal comments=:# +setlocal commentstring=#\ %s +setlocal formatoptions-=t formatoptions+=croql + +let b:undo_ftplugin = "setlocal com< cms< fo<" + +" vim: ts=8 diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 3497a773f5..1ac2a27acc 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -2,7 +2,7 @@ vim9script # Script to define the syntax menu in synmenu.vim # Maintainer: The Vim Project -# Last Change: 2026 Aug 06 +# Last Change: 2026 Aug 25 # Former Maintainer: Bram Moolenaar # This is used by "make menu" in the src directory. @@ -119,6 +119,7 @@ SynMenu AB.Basic.QBasic:basic SynMenu AB.Basic.Visual\ Basic:vb SynMenu AB.Bazaar\ commit\ file:bzr SynMenu AB.Bazel:bzl +SynMenu AB.Bazel\ rc\ file:bazelrc SynMenu AB.BC\ calculator:bc SynMenu AB.BDF\ font:bdf SynMenu AB.Beancount:beancount diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index 93bd5731c1..53d56772e1 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -106,17 +106,18 @@ an 50.10.740 &Syntax.AB.Basic.QBasic :cal SetSyn("basic") an 50.10.750 &Syntax.AB.Basic.Visual\ Basic :cal SetSyn("vb") an 50.10.760 &Syntax.AB.Bazaar\ commit\ file :cal SetSyn("bzr") an 50.10.770 &Syntax.AB.Bazel :cal SetSyn("bzl") -an 50.10.780 &Syntax.AB.BC\ calculator :cal SetSyn("bc") -an 50.10.790 &Syntax.AB.BDF\ font :cal SetSyn("bdf") -an 50.10.800 &Syntax.AB.Beancount :cal SetSyn("beancount") -an 50.10.810 &Syntax.AB.BibTeX.Bibliography\ database :cal SetSyn("bib") -an 50.10.820 &Syntax.AB.BibTeX.Bibliography\ Style :cal SetSyn("bst") -an 50.10.830 &Syntax.AB.BIND.BIND\ config :cal SetSyn("named") -an 50.10.840 &Syntax.AB.BIND.BIND\ zone :cal SetSyn("bindzone") -an 50.10.850 &Syntax.AB.Bitbake :cal SetSyn("bitbake") -an 50.10.860 &Syntax.AB.Blank :cal SetSyn("blank") -an 50.10.870 &Syntax.AB.Bpftrace :cal SetSyn("bpftrace") -an 50.10.880 &Syntax.AB.Bsdl :cal SetSyn("bsdl") +an 50.10.780 &Syntax.AB.Bazel\ rc\ file :cal SetSyn("bazelrc") +an 50.10.790 &Syntax.AB.BC\ calculator :cal SetSyn("bc") +an 50.10.800 &Syntax.AB.BDF\ font :cal SetSyn("bdf") +an 50.10.810 &Syntax.AB.Beancount :cal SetSyn("beancount") +an 50.10.820 &Syntax.AB.BibTeX.Bibliography\ database :cal SetSyn("bib") +an 50.10.830 &Syntax.AB.BibTeX.Bibliography\ Style :cal SetSyn("bst") +an 50.10.840 &Syntax.AB.BIND.BIND\ config :cal SetSyn("named") +an 50.10.850 &Syntax.AB.BIND.BIND\ zone :cal SetSyn("bindzone") +an 50.10.860 &Syntax.AB.Bitbake :cal SetSyn("bitbake") +an 50.10.870 &Syntax.AB.Blank :cal SetSyn("blank") +an 50.10.880 &Syntax.AB.Bpftrace :cal SetSyn("bpftrace") +an 50.10.890 &Syntax.AB.Bsdl :cal SetSyn("bsdl") an 50.20.100 &Syntax.C.C :cal SetSyn("c") an 50.20.110 &Syntax.C.C++ :cal SetSyn("cpp") an 50.20.120 &Syntax.C.C# :cal SetSyn("cs") diff --git a/runtime/syntax/bazelrc.vim b/runtime/syntax/bazelrc.vim new file mode 100644 index 0000000000..e7589eea86 --- /dev/null +++ b/runtime/syntax/bazelrc.vim @@ -0,0 +1,123 @@ +" Vim syntax file +" Language: Bazel rc file +" Maintainer: Barrett Ruth +" Last Change: 2026 Aug 25 +" Reference: https://bazel.build/run/bazelrc + +" quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif +let s:cpo_save = &cpo +set cpo&vim + +syn case match +syn iskeyword @,48-57,_,- + +" Comments {{{1 + +" Backslash-newline is removed from the whole file before it is split into +" lines, so a comment ending in one continues into the line below it. +syn region bazelrcComment + \ start=/#/ + \ skip=/\\$/ + \ end=/$/ + \ contains=bazelrcTodo,@Spell +syn keyword bazelrcTodo contained TODO FIXME XXX NOTE + +" Words {{{1 + +" Bazel joins a continued line onto the one above before splitting the file +" into lines, so what follows is a further option rather than a new command. +syn match bazelrcContinuation /\\$/ + \ skipnl + \ nextgroup=bazelrcContinued +syn match bazelrcContinued contained transparent /.*/ + \ contains=bazelrcComment,bazelrcContinuation,bazelrcEscape, + \ bazelrcFlag,bazelrcString + +" A backslash escape is absorbed before quoting is considered, so it applies +" inside single quotes too, and '\#' is a literal '#' rather than a comment. +syn match bazelrcEscape /\\./ +" A quote may open part-way through a word. An unterminated one is ignored +" rather than continued onto the line below. +syn region bazelrcString oneline + \ start=/'/ + \ skip=/\\./ + \ end=/'/ + \ contains=bazelrcEscape +syn region bazelrcString oneline + \ start=/"/ + \ skip=/\\./ + \ end=/"/ + \ contains=bazelrcEscape + +" Imports {{{1 + +syn match bazelrcImport /^\s*try-import-if-bazel-version\>/ + \ skipwhite + \ nextgroup=bazelrcVersion +syn match bazelrcImport /^\s*\%(try-\)\=import\>/ + \ skipwhite + \ nextgroup=bazelrcPath +" The comparison and the version it applies to are a single word. +syn match bazelrcVersion contained + \ /\%(<=\|>=\|==\|!=\|[<>~]\)[^ \t#]\+/ + \ skipwhite + \ nextgroup=bazelrcPath +syn match bazelrcPath contained + \ /\%(\\.\|[^ \t#]\)\+/ + \ contains=bazelrcEscape,bazelrcString,bazelrcWorkspace +" Substituted only as a prefix, and the trailing slash belongs to it. +syn match bazelrcWorkspace contained /\%(^\|\s\)\@1<=%workspace%\// + +" Commands and options {{{1 + +syn match bazelrcCommand + \ /^\s*\<\%(always\|aquery\|build\|canonicalize-flags\|clean\|common + \\|config\|coverage\|cquery\|dump\|fetch\|help\|info\|license + \\|mobile-install\|mod\|print_action\|query\|run\|shutdown\|startup + \\|test\|vendor\|version\)\>/ + \ nextgroup=bazelrcConfig +" A command is split on its first colon, so a config name may contain colons. +syn match bazelrcConfig contained /:[^ \t#]\+/ + +syn match bazelrcFlag /--[^ \t#=]*/ nextgroup=bazelrcValue +syn match bazelrcFlag /\%(^\|\s\)\@1<=-[a-zA-Z]\>/ + \ nextgroup=bazelrcValue +syn region bazelrcValue contained oneline + \ matchgroup=bazelrcOperator + \ start=/=/ + \ end=/\ze[ \t#]/ + \ end=/$/ + \ contains=bazelrcString,bazelrcEscape + +" Syncing {{{1 + +" A comment may continue onto the following line. +syn sync linebreaks=1 + +" Default Highlighting {{{1 + +hi def link bazelrcComment Comment +hi def link bazelrcTodo Todo +hi def link bazelrcContinuation Special +hi def link bazelrcEscape SpecialChar +hi def link bazelrcString String +hi def link bazelrcImport Include +hi def link bazelrcVersion Constant +hi def link bazelrcPath String +hi def link bazelrcWorkspace PreProc +hi def link bazelrcCommand Statement +hi def link bazelrcConfig Type +hi def link bazelrcFlag Identifier +hi def link bazelrcOperator Operator + +" }}} + +let b:current_syntax = "bazelrc" + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim: ts=8 fdm=marker: diff --git a/runtime/syntax/testdir/dumps/bazelrc_00.dump b/runtime/syntax/testdir/dumps/bazelrc_00.dump new file mode 100644 index 0000000000..e9732117ba --- /dev/null +++ b/runtime/syntax/testdir/dumps/bazelrc_00.dump @@ -0,0 +1,20 @@ +>#+0#0000e05#ffffff0| |B|a|z|e|l| |r|c| |f|i|l|e| +0#0000000&@59 +|#+0#0000e05&| |T+0#0000001#ffff4012|O|D|O| +0#0000e05#ffffff0|c|o|m@1|e|n|t|s| |a|r|e| |h|i|g|h|l|i|g|h|t|e|d| +0#0000000&@43 +@75 +|s+0#af5f00255&|t|a|r|t|u|p| +0#0000000&|-+0#00e0e07&@1|o|u|t|p|u|t|_|b|a|s|e|=+0#af5f00255&|/+0#0000000&|t|m|p|/|b|a|z|e|l| @42 +|c+0#af5f00255&|o|m@1|o|n| +0#0000000&|-+0#00e0e07&@1|e|n|a|b|l|e|_|p|l|a|t|f|o|r|m|_|s|p|e|c|i|f|i|c|_|c|o|n|f|i|g| +0#0000000&@34 +|a+0#af5f00255&|l|w|a|y|s| +0#0000000&|-+0#00e0e07&@1|a|n@1|o|u|n|c|e|_|r|c| +0#0000000&@54 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|j|o|b|s|=+0#af5f00255&|8+0#0000000&| |-+0#00e0e07&@1|v|e|r|b|o|s|e|_|f|a|i|l|u|r|e|s| +0#0000000&@41 +|t+0#af5f00255&|e|s|t| +0#0000000&|-+0#00e0e07&|c| +0#0000000&|d|b|g| |-+0#00e0e07&@1|t|e|s|t|_|e|n|v|=+0#af5f00255&|P+0#0000000&|A|T|H| @47 +|q+0#af5f00255&|u|e|r|y| +0#0000000&|-+0#00e0e07&@1|k|e@1|p|_|g|o|i|n|g| +0#0000000&@56 +@75 +|#+0#0000e05&| |A| |c|o|n|f|i|g| |n|a|m|e| |i|s| |e|v|e|r|y|t|h|i|n|g| |a|f|t|e|r| |t|h|e| |f|i|r|s|t| |c|o|l|o|n| +0#0000000&@23 +|b+0#af5f00255&|u|i|l|d|:+0#00e0003&|c|i| +0#0000000&|-+0#00e0e07&@1|r|e|m|o|t|e|_|c|a|c|h|e|=+0#af5f00255&|g+0#0000000&|r|p|c|s|:|/@1|c|a|c|h|e|.|e|x|a|m|p|l|e|.|c|o|m| |-+0#00e0e07&@1|c|o|n|f|i|g|=+0#af5f00255&|s+0#0000000&|t|r|i|c|t| @9 +|b+0#af5f00255&|u|i|l|d|:+0#00e0003&|s|t|r|i|c|t| +0#0000000&|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|W|a|l@1| |-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|W|e|r@1|o|r| @34 +|b+0#af5f00255&|u|i|l|d|:+0#00e0003&|f|o@1|:|b|a|r| +0#0000000&|-+0#00e0e07&@1|/@1|m|y|/|p|k|g|:|s|e|t@1|i|n|g|=+0#af5f00255&|1+0#0000000&| |-+0#00e0e07&@1|n|o|/@1|m|y|/|p|k|g|:|o|t|h|e|r| +0#0000000&@21 +|s+0#af5f00255&|t|a|r|t|u|p|:+0#00e0003&|l|i|n|u|x| +0#0000000&|-+0#00e0e07&@1|h|o|s|t|_|j|v|m|_|a|r|g|s|=+0#af5f00255&|-+0#0000000&|X|m|x|4|g| @38 +|c+0#af5f00255&|o|m@1|o|n|:+0#00e0003&|e|m|p|t|y| +0#0000000&@62 +@75 +|#+0#0000e05&| |Q|u|o|t|e|s| |m|a|y| |o|p|e|n| |p|a|r|t|-|w|a|y| |t|h|r|o|u|g|h| |a| |w|o|r|d| |a|n|d| |n|e@1|d| |n|o|t| |b|e| |c|l|o|s|e|d| +0#0000000&@10 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|'+0#e000002&|a| |b|'| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|"+0#e000002&|a|#|b|"| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|a+0#0000000&|"+0#e000002&|b| |c|"|d+0#0000000&| @22 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/bazelrc_01.dump b/runtime/syntax/testdir/dumps/bazelrc_01.dump new file mode 100644 index 0000000000..d72e8ebf36 --- /dev/null +++ b/runtime/syntax/testdir/dumps/bazelrc_01.dump @@ -0,0 +1,20 @@ +|b+0#af5f00255#ffffff0|u|i|l|d|:+0#00e0003&|f|o@1|:|b|a|r| +0#0000000&|-+0#00e0e07&@1|/@1|m|y|/|p|k|g|:|s|e|t@1|i|n|g|=+0#af5f00255&|1+0#0000000&| |-+0#00e0e07&@1|n|o|/@1|m|y|/|p|k|g|:|o|t|h|e|r| +0#0000000&@21 +|s+0#af5f00255&|t|a|r|t|u|p|:+0#00e0003&|l|i|n|u|x| +0#0000000&|-+0#00e0e07&@1|h|o|s|t|_|j|v|m|_|a|r|g|s|=+0#af5f00255&|-+0#0000000&|X|m|x|4|g| @38 +|c+0#af5f00255&|o|m@1|o|n|:+0#00e0003&|e|m|p|t|y| +0#0000000&@62 +@75 +|#+0#0000e05&| |Q|u|o|t|e|s| |m|a|y| |o|p|e|n| |p|a|r|t|-|w|a|y| |t|h|r|o|u|g|h| |a| |w|o|r|d| |a|n|d| |n|e@1|d| |n|o|t| |b|e| |c|l|o|s|e|d| +0#0000000&@10 +>b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|'+0#e000002&|a| |b|'| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|"+0#e000002&|a|#|b|"| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|a+0#0000000&|"+0#e000002&|b| |c|"|d+0#0000000&| @22 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|D|N|A|M|E|=|\+0#e000e06&|"|x+0#0000000&|\+0#e000e06&|"| +0#0000000&|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|D|S|P|A|C|E|=|a|\+0#e000e06&| |b+0#0000000&| @29 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|d|e|f|i|n|e|=+0#af5f00255&|"+0#0000000&|u|n|t|e|r|m|i|n|a|t|e|d| @46 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|j|o|b|s|=+0#af5f00255&|8+0#0000000&| @60 +@75 +|#+0#0000e05&| |A|n| |u|n|q|u|o|t|e|d| |#| |s|t|a|r|t|s| |a| |c|o|m@1|e|n|t|,| |w|i|t|h| |o|r| |w|i|t|h|o|u|t| |l|e|a|d|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@6 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|j|o|b|s|=+0#af5f00255&|4+0#0000000&| |#+0#0000e05&| |t|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| +0#0000000&@41 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|j|o|b|s|=+0#af5f00255&|2+0#0000000&|#+0#0000e05&| |n|o| |l|e|a|d|i|n|g| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@37 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|\+0#e000e06&|#|n+0#0000000&|o|t|a|c|o|m@1|e|n|t| @48 +@75 +|#+0#0000e05&| |A| |t|r|a|i|l|i|n|g| |b|a|c|k|s|l|a|s|h| |j|o|i|n|s| |t|h|e| |f|o|l@1|o|w|i|n|g| |l|i|n|e| +0#0000000&@27 +|b+0#af5f00255&|u|i|l|d| +0#0000000&|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|W|e|x|t|r|a| |\+0#e000e06&| +0#0000000&@52 +@6|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|W|p|e|d|a|n|t|i|c| |\+0#e000e06&| +0#0000000&@49 +@6|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|W|s|h|a|d|o|w| @53 +@57|1|9|,|1| @9|5|2|%| diff --git a/runtime/syntax/testdir/dumps/bazelrc_02.dump b/runtime/syntax/testdir/dumps/bazelrc_02.dump new file mode 100644 index 0000000000..7bb4ba1db5 --- /dev/null +++ b/runtime/syntax/testdir/dumps/bazelrc_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@5|-+0#00e0e07&@1|c|o|p|t|=+0#af5f00255&|-+0#0000000&|W|s|h|a|d|o|w| @53 +@75 +|#+0#0000e05&| |.@2|i|n|c|l|u|d|i|n|g| |i|n|s|i|d|e| |a| |c|o|m@1|e|n|t|,| |s|o| |t|h|i|s| |l|i|n|e| |i|s| |c|o|m@1|e|n|t|e|d| |t|o@1| |\| +0#0000000&@10 +|b+0#0000e05&|u|i|l|d| |-@1|t|h|i|s|_|l|i|n|e|_|i|s|_|p|a|r|t|_|o|f|_|t|h|e|_|c|o|m@1|e|n|t| +0#0000000&@34 +@75 +>i+0#e000e06&|m|p|o|r|t| +0#0000000&|/+0#e000002&|e|t|c|/|b|a|z|e|l|/|s|i|t|e|.|b|a|z|e|l|r|c| +0#0000000&@44 +|i+0#e000e06&|m|p|o|r|t| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|t+0#e000002&|o@1|l|s|/|f|l|a|g|s|.|b|a|z|e|l|r|c| +0#0000000&@36 +|t+0#e000e06&|r|y|-|i|m|p|o|r|t| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|u+0#e000002&|s|e|r|.|b|a|z|e|l|r|c| +0#0000000&@39 +|t+0#e000e06&|r|y|-|i|m|p|o|r|t|-|i|f|-|b|a|z|e|l|-|v|e|r|s|i|o|n| +0#0000000&|>+0#e000002&|=|7|.|0|.|0| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|c+0#e000002&|o|n|f|i|g|s|/|v|7|.|r|c| +0#0000000&@13 +|t+0#e000e06&|r|y|-|i|m|p|o|r|t|-|i|f|-|b|a|z|e|l|-|v|e|r|s|i|o|n| +0#0000000&|<+0#e000002&|8| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|c+0#e000002&|o|n|f|i|g|s|/|p|r|e|_|v|8|.|r|c| +0#0000000&@14 +|t+0#e000e06&|r|y|-|i|m|p|o|r|t|-|i|f|-|b|a|z|e|l|-|v|e|r|s|i|o|n| +0#0000000&|=+0#e000002&@1|6|.|3|.|2| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|c+0#e000002&|o|n|f|i|g|s|/|h|o|t|f|i|x|.|r|c| +0#0000000&@9 +|t+0#e000e06&|r|y|-|i|m|p|o|r|t|-|i|f|-|b|a|z|e|l|-|v|e|r|s|i|o|n| +0#0000000&|!+0#e000002&|=|7|.|0|.|1| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|c+0#e000002&|o|n|f|i|g|s|/|s|t|a|n|d|a|r|d|.|r|c| +0#0000000&@7 +|t+0#e000e06&|r|y|-|i|m|p|o|r|t|-|i|f|-|b|a|z|e|l|-|v|e|r|s|i|o|n| +0#0000000&|~+0#e000002&|8|.|1| +0#0000000&|%+0#e000e06&|w|o|r|k|s|p|a|c|e|%|/|c+0#e000002&|o|n|f|i|g|s|/|v|8|_|1|.|r|c| +0#0000000&@14 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|3|7|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/bazelrc.bazelrc b/runtime/syntax/testdir/input/bazelrc.bazelrc new file mode 100644 index 0000000000..dd6d42d3ff --- /dev/null +++ b/runtime/syntax/testdir/input/bazelrc.bazelrc @@ -0,0 +1,44 @@ +# Bazel rc file +# TODO comments are highlighted + +startup --output_base=/tmp/bazel +common --enable_platform_specific_config +always --announce_rc +build --jobs=8 --verbose_failures +test -c dbg --test_env=PATH +query --keep_going + +# A config name is everything after the first colon +build:ci --remote_cache=grpcs://cache.example.com --config=strict +build:strict --copt=-Wall --copt=-Werror +build:foo:bar --//my/pkg:setting=1 --no//my/pkg:other +startup:linux --host_jvm_args=-Xmx4g +common:empty + +# Quotes may open part-way through a word and need not be closed +build --define='a b' --define="a#b" --define=a"b c"d +build --copt=-DNAME=\"x\" --copt=-DSPACE=a\ b +build --define="unterminated +build --jobs=8 + +# An unquoted # starts a comment, with or without leading whitespace +build --jobs=4 # trailing comment +build --jobs=2# no leading whitespace +build --copt=\#notacomment + +# A trailing backslash joins the following line +build --copt=-Wextra \ + --copt=-Wpedantic \ + --copt=-Wshadow + +# ...including inside a comment, so this line is commented too \ +build --this_line_is_part_of_the_comment + +import /etc/bazel/site.bazelrc +import %workspace%/tools/flags.bazelrc +try-import %workspace%/user.bazelrc +try-import-if-bazel-version >=7.0.0 %workspace%/configs/v7.rc +try-import-if-bazel-version <8 %workspace%/configs/pre_v8.rc +try-import-if-bazel-version ==6.3.2 %workspace%/configs/hotfix.rc +try-import-if-bazel-version !=7.0.1 %workspace%/configs/standard.rc +try-import-if-bazel-version ~8.1 %workspace%/configs/v8_1.rc diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index eb13b52e25..8abaa61328 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -136,6 +136,7 @@ def s:GetFilenameChecks(): dict> b: ['file.mch', 'file.ref', 'file.imp'], basic: ['file.bas', 'file.bi', 'file.bm'], bass: ['file.bass'], + bazelrc: ['.bazelrc', 'user.bazelrc', 'file.bazelrc', '/tools/bazel.rc', 'any/tools/bazel.rc'], bc: ['file.bc'], bdf: ['file.bdf'], beancount: ['file.beancount', 'file.bean'], diff --git a/src/version.c b/src/version.c index 586d940fd2..4636427d33 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1002, /**/ 1001, /**/ From bad7c5a77d3ec33e5e7129a7785495337b2db7d4 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 25 Aug 2026 19:26:04 +0000 Subject: [PATCH 431/647] patch 9.2.1003: popup: border is not shown when the popup does not fit Problem: A popup with a border loses part of the border when it does not fit on the screen: the right border is missing when a scrollbar is added, and the left border is missing when "pos" is right aligned and "fixed" is set (Mao-Yining). Solution: Reserve a column for a scrollbar that is added after the width and the position were computed. For a right aligned popup with "fixed", scroll the text instead of moving the border off the screen (Hirohito Higashi). fixes: #21128 closes: #21145 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 18 +++++------ .../dumps/Test_popupwin_border_edge_1.dump | 16 ++++++++++ .../dumps/Test_popupwin_border_edge_2.dump | 16 ++++++++++ src/testdir/dumps/Test_popupwin_mask_4.dump | 16 +++++----- src/testdir/dumps/Test_popupwin_mask_5.dump | 6 ++-- src/testdir/test_popupwin.vim | 30 +++++++++++++++++++ src/version.c | 2 ++ 7 files changed, 84 insertions(+), 20 deletions(-) create mode 100644 src/testdir/dumps/Test_popupwin_border_edge_1.dump create mode 100644 src/testdir/dumps/Test_popupwin_border_edge_2.dump diff --git a/src/popupwin.c b/src/popupwin.c index d44e845eea..9c5d6e4dff 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1568,9 +1568,8 @@ popup_height(win_T *wp) int popup_width(win_T *wp) { - // w_leftcol is how many columns of the core are left of the screen // w_popup_rightoff is how many columns of the core are right of the screen - return wp->w_width + wp->w_leftcol + return wp->w_width + popup_extra_width(wp) + wp->w_popup_rightoff; } @@ -2766,13 +2765,10 @@ popup_adjust_position(win_T *wp) wp->w_wincol = leftoff; else if (wp->w_popup_fixed) { - // "col" specifies the right edge, but popup doesn't fit, skip some - // columns when displaying the window, minus left border and - // padding. - if (-leftoff > left_extra) - wp->w_leftcol = -leftoff - left_extra; + // "col" specifies the right edge, but the popup doesn't fit. + // Scroll the text instead of moving the border off the screen. + wp->w_leftcol = -leftoff; wp->w_width -= wp->w_leftcol; - wp->w_popup_leftoff = -leftoff; if (wp->w_width < 0) wp->w_width = 0; } @@ -2882,6 +2878,10 @@ popup_adjust_position(win_T *wp) wp->w_has_scrollbar = true; if (width_with_scrollbar > 0) wp->w_width = width_with_scrollbar; + else + // The width and the position were computed without the + // scrollbar, reserve a column for it. + ++extra_width; } } @@ -7881,7 +7881,7 @@ update_popups(void (*win_update)(win_T *wp)) if (do_padding && cl.eff_padding[1] > 0) { int pad_col_start = wincol + wp->w_popup_border[3] - + wp->w_popup_padding[3] + wp->w_width + wp->w_leftcol; + + wp->w_popup_padding[3] + wp->w_width; int pad_col_end = pad_col_start + wp->w_popup_padding[1]; if (screen_opacity_popup != NULL && saved_screen.lines != NULL) diff --git a/src/testdir/dumps/Test_popupwin_border_edge_1.dump b/src/testdir/dumps/Test_popupwin_border_edge_1.dump new file mode 100644 index 0000000000..47092e0313 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_border_edge_1.dump @@ -0,0 +1,16 @@ +>1+0&#ffffff0| @43 +|2| @43 +|3| @43 +|4| @43 +|5| @43 +|6| @43 +|7| @29|╔+0#0000001#ffd7ff255|═@11|╗ +|8+0#0000000#ffffff0| @29|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#0000001|║+0#0000001#ffd7ff255 +|9+0#0000000#ffffff0| @29|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#0000001|║+0#0000001#ffd7ff255 +|1+0#0000000#ffffff0|0| @28|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#0000001|║+0#0000001#ffd7ff255 +|1+0#0000000#ffffff0@1| @28|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#0000001|║+0#0000001#ffd7ff255 +|1+0#0000000#ffffff0|2| @28|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#0000001|║+0#0000001#ffd7ff255 +|1+0#0000000#ffffff0|3| @28|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255 +|1+0#0000000#ffffff0|4| @28|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255 +|1+0#0000000#ffffff0|5| @28|║+0#0000001#ffd7ff255| |a@8| | +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255 +| +0#0000000#ffffff0@26|1|,|1| |╚+0#0000001#ffd7ff255|═@11|╝ diff --git a/src/testdir/dumps/Test_popupwin_border_edge_2.dump b/src/testdir/dumps/Test_popupwin_border_edge_2.dump new file mode 100644 index 0000000000..ade1b5ceba --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_border_edge_2.dump @@ -0,0 +1,16 @@ +>1+0&#ffffff0| @43 +|2| @43 +|3| @43 +|4| @43 +|5| @43 +|6| @43 +|7| @43 +|╔+0#0000001#ffd7ff255|═@27|╗| +0#0000000#ffffff0@14 +|║+0#0000001#ffd7ff255| |a|b|c|d|e|f|g|h|i|j|a|b|c|d|e|f|g|h|i|j|a|b|c|d|e|f| |║| +0#0000000#ffffff0@14 +|║+0#0000001#ffd7ff255| |g|h|i|j|a|b|c|d|e|f|g|h|i|j| @12|║| +0#0000000#ffffff0@14 +|║+0#0000001#ffd7ff255| |a|b|c|d|e|f|g|h|i|j|a|b|c|d|e|f|g|h|i|j|a|b|c|d|e|f| |║| +0#0000000#ffffff0@14 +|║+0#0000001#ffd7ff255| |g|h|i|j|a|b|c|d|e|f|g|h|i|j| @12|║| +0#0000000#ffffff0@14 +|║+0#0000001#ffd7ff255| |a|b|c|d|e|f|g|h|i|j|a|b|c|d|e|f|g|h|i|j|a|b|c|d|e|f| |║| +0#0000000#ffffff0@14 +|║+0#0000001#ffd7ff255| |g|h|i|j|a|b|c|d|e|f|g|h|i|j| @12|║| +0#0000000#ffffff0@14 +|╚+0#0000001#ffd7ff255|═@27|╝| +0#0000000#ffffff0@14 +|:| @25|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_popupwin_mask_4.dump b/src/testdir/dumps/Test_popupwin_mask_4.dump index 0cf44d2c25..fe624c1b40 100644 --- a/src/testdir/dumps/Test_popupwin_mask_4.dump +++ b/src/testdir/dumps/Test_popupwin_mask_4.dump @@ -1,13 +1,13 @@ >1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -| +0&#e0e0e08@11|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|o+0&#e0e0e08|m|e| |5+0&#ffffff0|6|7|t+0&#e0e0e08| @3|1+0&#ffffff0@1|2|1|3|x+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|1|2|t+0&#e0e0e08|h|5+0&#ffffff0|6|7|l+0&#e0e0e08|i|n|e| |1+0&#ffffff0@1|2|1|3|y+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|1| +0&#e0e0e08@10|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +| +0&#e0e0e08|m|e| |t|e|7+0&#ffffff0|8|9| +0&#e0e0e08@2|1+0&#ffffff0@1|2|1|3|x+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +| +0&#e0e0e08|2+0&#ffffff0|3|4|e+0&#e0e0e08|r|7+0&#ffffff0|8|9|n+0&#e0e0e08|e| |1+0&#ffffff0@1|2|1|3|y+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 | +0&#e0e0e08@6|8+0&#ffffff0|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|═+0#0000001#ffd7ff255@10|X|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -| +0#0000001#ffd7ff255|2+0#0000000#ffffff0|3|4| +0#0000001#ffd7ff255@6|║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|t+0#0000001#ffd7ff255|2+0#0000000#ffffff0|3|4|e+0#0000001#ffd7ff255| |l|i|n|e| |║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -| +0#0000001#ffd7ff255@6|8+0#0000000#ffffff0|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|═+0#0000001#ffd7ff255@4|6+0#0000000#ffffff0|7|8|9|═+0#0000001#ffd7ff255@1|╝|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|1|2|═+0#0000001#ffd7ff255@8|X|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|║+0#0000001#ffd7ff255| @4|7+0#0000000#ffffff0|8|9| +0#0000001#ffd7ff255@1|║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|║+0#0000001#ffd7ff255| |o|n|e| |7+0#0000000#ffffff0|8|9|e+0#0000001#ffd7ff255| |║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|║+0#0000001#ffd7ff255| @5|8+0#0000000#ffffff0|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|╚+0#0000001#ffd7ff255|═|3+0#0000000#ffffff0|4|5|6|7|8|9|═+0#0000001#ffd7ff255@1|╝|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 |:| @55|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_popupwin_mask_5.dump b/src/testdir/dumps/Test_popupwin_mask_5.dump index 63ba30dea6..1b8b7435ab 100644 --- a/src/testdir/dumps/Test_popupwin_mask_5.dump +++ b/src/testdir/dumps/Test_popupwin_mask_5.dump @@ -7,7 +7,7 @@ |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|═+0#0000001#ffd7ff255@13|X|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -| +0&#e0e0e08@11|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| @4|2+0#0000000#ffffff0|9|3| +0#0000001#ffd7ff255@6|║|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|o+0&#e0e0e08|m|e| |5+0&#ffffff0|6|7|t+0&#e0e0e08| @3|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| |j|u|s|t|2+0#0000000#ffffff0|9|3|e+0#0000001#ffd7ff255| |l|i|n|e| |║|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 -|1|2|t+0&#e0e0e08|h|5+0&#ffffff0|6|7|l+0&#e0e0e08|i|n|e| |1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| @10|3+0#0000000#ffffff0|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +|1| +0&#e0e0e08@10|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| @4|2+0#0000000#ffffff0|9|3| +0#0000001#ffd7ff255@6|║|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +| +0&#e0e0e08|m|e| |t|e|7+0&#ffffff0|8|9| +0&#e0e0e08@2|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| |j|u|s|t|2+0#0000000#ffffff0|9|3|e+0#0000001#ffd7ff255| |l|i|n|e| |║|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 +| +0&#e0e0e08|2+0&#ffffff0|3|4|e+0&#e0e0e08|r|7+0&#ffffff0|8|9|n+0&#e0e0e08|e| |1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| @10|3+0#0000000#ffffff0|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2 | +0&#e0e0e08@6| +0&#ffffff0@33|╚+0#0000001#ffd7ff255|═| +0#0000000#ffffff0@2|═+0#0000001#ffd7ff255@4| +0#0000000#ffffff0@3|═+0#0000001#ffd7ff255@1|╝|,+0#0000000#ffffff0|1| @10|T|o|p| diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 4ee44ffbaf..b9d50e44ab 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -2309,6 +2309,36 @@ func Test_adjust_left_past_screen_width() %bwipe! endfunc +func Test_popupwin_border_at_screen_edge() + CheckScreendump + + let lines =<< trim END + call setline(1, range(1, 20)) + func ShowScrollbarPopup() + call popup_clear() + call popup_create(map(range(12), {-> repeat('a', 9)}), #{ + \ pos: 'botleft', line: 5, col: 33, fixed: v:true, + \ maxwidth: 80, padding: [0, 1, 0, 1], border: []}) + endfunc + func ShowRightAlignedPopup() + call popup_clear() + call popup_create(map(range(6), {-> repeat('abcdefghij', 4)}), #{ + \ pos: 'botright', line: 15, col: 30, fixed: v:true, + \ maxwidth: 80, padding: [0, 1, 0, 1], border: []}) + endfunc + call ShowScrollbarPopup() + END + call writefile(lines, 'XtestPopupBorderEdge', 'D') + let buf = RunVimInTerminal('-S XtestPopupBorderEdge', #{rows: 16, cols: 45}) + call VerifyScreenDump(buf, 'Test_popupwin_border_edge_1', {}) + + call term_sendkeys(buf, ":call ShowRightAlignedPopup()\") + call term_sendkeys(buf, ":\") + call VerifyScreenDump(buf, 'Test_popupwin_border_edge_2', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_popup_moved() new call test_override('char_avail', 1) diff --git a/src/version.c b/src/version.c index 4636427d33..38d66cf17b 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1003, /**/ 1002, /**/ From 1f56c351dedad288f79c89b6b6f64be762ec3b9b Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 25 Aug 2026 19:38:27 +0000 Subject: [PATCH 432/647] patch 9.2.1004: a completion function cannot tell why it was called Problem: A function used through 'omnifunc' or 'complete' is called the same way whether 'autocomplete' started the completion or a key asked for one, so it cannot answer differently. Solution: Report which of the two it is in complete_info() as "auto". It is returned only when asked for in {what}, so what complete_info() says by itself does not change (Hirohito Higashi). closes: #21143 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 8 ++++++- runtime/doc/version9.txt | 4 +++- src/edit.c | 6 +++++ src/insexpand.c | 36 +++++++++++++++++++++++++++- src/proto/insexpand.pro | 2 ++ src/testdir/test_ins_complete.vim | 39 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ 7 files changed, 94 insertions(+), 3 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index c37b7b0d00..6627469cdd 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 23 +*builtin.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2059,6 +2059,12 @@ complete_info([{what}]) *complete_info()* Returns a |Dictionary| with information about Insert mode completion. See |ins-completion|. The items are: + auto |TRUE| when Vim started this completion by + itself, which is what 'autocomplete' does, + and |FALSE| when a key asked for it, such as + |i_CTRL-X_CTRL-O|. A |complete-functions| + function can read this to tell the two apart. + Returned only when asked for in {what}. completed Return a dictionary containing the entries of the currently selected index item. items List of all completion candidates. Each item diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 768f9e12aa..6ecfd04c0e 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Aug 23 +*version9.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52707,6 +52707,8 @@ Changed ~ they were ignored with 'eventignore'. - |ch_sendexpr()| accepts a non-Number "id" in "lsp" mode when no response is expected, so a request from the server can be answered. +- |complete_info()| can distinguish between manual and automatic triggered + completions via the "auto" item. *added-9.3* Added ~ diff --git a/src/edit.c b/src/edit.c index 3b0cfcc882..029b402dc7 100644 --- a/src/edit.c +++ b/src/edit.c @@ -108,6 +108,7 @@ static int dont_sync_undo = FALSE; // CTRL-G U prevents syncing undo for update_screen(UPD_VALID); /* Show char (deletion) immediately */ \ out_flush(); \ ins_compl_enable_autocomplete(); \ + ins_compl_arm_autostart(); \ if (!ins_compl_arm_autocomplete_delay())\ goto docomplete; \ } while (0) @@ -631,6 +632,7 @@ edit( if (vim_isprintc(c)) { ins_compl_enable_autocomplete(); + ins_compl_arm_autostart(); ins_compl_init_get_longest(); #ifdef FEAT_RIGHTLEFT if (p_hkmap) @@ -678,8 +680,11 @@ edit( // Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. did_cursorhold = TRUE; if (c != K_CURSORHOLD && c != K_COMPLETE_DELAY) + { // Don't want delayed autocompletion from the previous key either. ins_compl_clear_autocomplete_delay(); + ins_compl_disarm_autostart(); + } #ifdef FEAT_RIGHTLEFT if (p_hkmap && KeyTyped) @@ -1189,6 +1194,7 @@ edit( // The completion may have been cleared while waiting, so re-enable // autocomplete to match a zero delay. ins_compl_enable_autocomplete(); + ins_compl_arm_autostart(); goto docomplete; #ifdef FEAT_GUI_MSWIN diff --git a/src/insexpand.c b/src/insexpand.c index f63f4ff6bd..2145fc199e 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -252,6 +252,8 @@ static buf_T *compl_curr_buf = NULL; // buf where completion is active // longer fixed timeout is used (COMPL_FUNC_TIMEOUT_MS or // COMPL_FUNC_TIMEOUT_NON_KW_MS). - girish static int compl_autocomplete = FALSE; // whether autocompletion is active +static bool compl_autostarted = false; // Vim started this completion +static bool compl_autostart_pending = false; // the trigger armed one static bool compl_autocomplete_pending = false; #ifdef ELAPSED_FUNC static elapsed_T compl_autocomplete_start_tv; // when the delay was armed @@ -2452,6 +2454,7 @@ ins_compl_clear(void) cpt_sources_clear(); compl_autocomplete = FALSE; compl_from_nonkeyword = FALSE; + compl_autostarted = false; compl_num_bests = 0; #ifdef FEAT_EVAL // clear v:completed_item @@ -2819,6 +2822,7 @@ ins_compl_restart(void) cpt_sources_clear(); compl_autocomplete = FALSE; compl_from_nonkeyword = FALSE; + compl_autostarted = false; compl_num_bests = 0; } @@ -3187,6 +3191,7 @@ ins_compl_stop(int c, int prev_mode, int retval) } compl_autocomplete = FALSE; compl_from_nonkeyword = FALSE; + compl_autostarted = false; compl_num_bests = 0; compl_ins_end_col = 0; @@ -4226,11 +4231,13 @@ get_complete_info(list_T *what_list, dict_T *retdict) # define CI_WHAT_COMPLETED 0x10 # define CI_WHAT_MATCHES 0x20 # define CI_WHAT_PREINSERTED_TEXT 0x40 +# define CI_WHAT_AUTO 0x80 # define CI_WHAT_ALL 0xff int what_flag; if (what_list == NULL) - what_flag = CI_WHAT_ALL & ~(CI_WHAT_MATCHES | CI_WHAT_COMPLETED); + what_flag = CI_WHAT_ALL + & ~(CI_WHAT_MATCHES | CI_WHAT_COMPLETED | CI_WHAT_AUTO); else { what_flag = 0; @@ -4253,6 +4260,8 @@ get_complete_info(list_T *what_list, dict_T *retdict) what_flag |= CI_WHAT_PREINSERTED_TEXT; else if (STRCMP(what, "matches") == 0) what_flag |= CI_WHAT_MATCHES; + else if (STRCMP(what, "auto") == 0) + what_flag |= CI_WHAT_AUTO; } } @@ -4267,6 +4276,9 @@ get_complete_info(list_T *what_list, dict_T *retdict) if (ret == OK && (what_flag & CI_WHAT_PUM_VISIBLE)) ret = dict_add_number(retdict, "pum_visible", pum_visible()); + if (ret == OK && (what_flag & CI_WHAT_AUTO)) + ret = dict_add_number(retdict, "auto", compl_autostarted); + if (ret == OK && (what_flag & CI_WHAT_PREINSERTED_TEXT)) { char_u *line = ml_get_curline(); @@ -7419,6 +7431,9 @@ ins_complete(int c, int enable_pum) if (!compl_started) { + // Only what the automatic trigger armed counts as started by Vim. + compl_autostarted = compl_autostart_pending; + compl_autostart_pending = false; if (ins_compl_start() == FAIL) return FAIL; } @@ -7502,6 +7517,25 @@ ins_compl_enable_autocomplete(void) #endif } +/* + * Remember that Vim is about to start a completion by itself, rather than + * because a key was typed to ask for one. + */ + void +ins_compl_arm_autostart(void) +{ + compl_autostart_pending = true; +} + +/* + * Forget what the automatic trigger armed, another key was typed since. + */ + void +ins_compl_disarm_autostart(void) +{ + compl_autostart_pending = false; +} + /* * Arm the 'autocompletedelay' timer when the delay is in effect. * Return true when the popup should be deferred, false to trigger it now. diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index ebc8e25ac4..254d6d1cae 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -76,6 +76,8 @@ void ins_compl_insert(int move_cursor, int insert_prefix); void ins_compl_check_keys(int frequency, int in_compl_func); int ins_complete(int c, int enable_pum); void ins_compl_enable_autocomplete(void); +void ins_compl_arm_autostart(void); +void ins_compl_disarm_autostart(void); bool ins_compl_arm_autocomplete_delay(void); void ins_compl_clear_autocomplete_delay(void); bool ins_compl_autocomplete_pending(void); diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index b83e605aae..b345a45e4d 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6756,4 +6756,43 @@ func Test_complete_info_hlgroup() bwipe! endfunc +" Test that complete_info() tells a completion Vim started by itself from one +" that a key asked for. +func Test_complete_info_auto() + call test_override("char_avail", 1) + new + func! AutoOmni(findstart, base) + if a:findstart + call add(g:auto, complete_info(['auto']).auto) + return col('.') - 1 + endif + return ['alpha', 'alphabet'] + endfunc + setlocal omnifunc=AutoOmni + setlocal complete=o + setlocal completeopt=menuone + call setline(1, ' al') + + " 'autocomplete' starts it, nothing was asked for. + setlocal autocomplete + let g:auto = [] + call feedkeys("A\", 'tx') + call assert_equal([1], g:auto) + + " The second call is the one CTRL-X CTRL-O asked for. + let g:auto = [] + call feedkeys("A\\\", 'tx') + call assert_equal([1, 0], g:auto) + + setlocal noautocomplete + let g:auto = [] + call feedkeys("A\\\", 'tx') + call assert_equal([0], g:auto) + + call test_override("ALL", 0) + unlet g:auto + delfunc AutoOmni + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/version.c b/src/version.c index 38d66cf17b..41ea63f514 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1004, /**/ 1003, /**/ From fd8aea135d146915e921699cd23887b654182810 Mon Sep 17 00:00:00 2001 From: Pranav Dwivedi Date: Tue, 25 Aug 2026 19:44:11 +0000 Subject: [PATCH 433/647] patch 9.2.1005: backupcopy=auto overwrites a file in place with umask Problem: backupcopy=auto overwrites a file in place when umask is restrictive. The probe treats permission restore as impossible and writes in place, keeping the same inode. Solution: When creating the probe file, open() applies umask, so a 0644 file becomes 0600 with umask 0077. Use fchmod() to fix the permissions of the probe (Pranav Dwivedi). closes: #21137 Signed-off-by: Pranav Dwivedi Signed-off-by: Christian Brabandt --- src/bufwrite.c | 7 ++++++- src/testdir/test_writefile.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/bufwrite.c b/src/bufwrite.c index 488ed94d92..51537010d6 100644 --- a/src/bufwrite.c +++ b/src/bufwrite.c @@ -1209,7 +1209,7 @@ buf_write( char_u tmp_fname[MAXPATHL]; int i; - // Check if we can create a file and set the owner/group to + // Check if we can create a file and set the owner/group/mode to // the ones from the original file. // First find a file name that doesn't exist yet (use some // arbitrary numbers). @@ -1239,6 +1239,11 @@ buf_write( # ifdef UNIX # ifdef HAVE_FCHOWN vim_ignored = fchown(fd, st_old.st_uid, st_old.st_gid); +# endif +# ifdef HAVE_FCHMOD + (void)mch_fsetperm(fd, perm); +# else + (void)mch_setperm(tmp_fname, perm); # endif if (mch_stat((char *)tmp_fname, &st) < 0 || st.st_uid != st_old.st_uid diff --git a/src/testdir/test_writefile.vim b/src/testdir/test_writefile.vim index cd427ad990..a2491f9300 100644 --- a/src/testdir/test_writefile.vim +++ b/src/testdir/test_writefile.vim @@ -997,4 +997,24 @@ func Test_write_with_xattr_support() bw! endfunc +func Test_backupcopy_auto_restrictive_umask() + CheckUnix + call writefile(['FOO'], 'Xumaskfile', 'D') + call setfperm('Xumaskfile', 'rw-r--r--') + let inode_before = systemlist('ls -i Xumaskfile')[0]->matchstr('^\s*\zs\d\+') + call writefile([ + \ 'set backupcopy=auto writebackup nobackup backupskip=', + \ 'edit Xumaskfile', + \ 'call setline(1, ["BAR"])', + \ 'write', + \ 'qall!' + \ ], 'Xumaskscript', 'D') + call system('umask 0077; ' .. GetVimCommand() .. ' -i NONE -n -S Xumaskscript') + call assert_equal(0, v:shell_error) + call assert_equal(['BAR'], readfile('Xumaskfile')) + call assert_equal('rw-r--r--', getfperm('Xumaskfile')) + call assert_notequal(inode_before, + \ systemlist('ls -i Xumaskfile')[0]->matchstr('^\s*\zs\d\+')) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 41ea63f514..e4c218c29b 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1005, /**/ 1004, /**/ From aabf101621dfd6683af44f4db14aa740775281d9 Mon Sep 17 00:00:00 2001 From: Mao-Yining Date: Tue, 25 Aug 2026 19:59:18 +0000 Subject: [PATCH 434/647] patch 9.2.1006: fold functions do not accept window id Problem: fold functions do not accept window id Solution: Add support for optional winid argument (Mao-Yining). closes: #21133 Signed-off-by: Mao-Yining Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 37 ++++++-- runtime/doc/version9.txt | 1 + src/evalfunc.c | 8 +- src/fold.c | 151 +++++++++++++++++++++--------- src/testdir/test_fold.vim | 93 +++++++++++++++++- src/testdir/test_vim9_builtin.vim | 4 + src/version.c | 2 + 7 files changed, 238 insertions(+), 58 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 6627469cdd..b13bf6b4f8 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -213,11 +213,13 @@ floor({expr}) Float round {expr} down fmod({expr1}, {expr2}) Float remainder of {expr1} / {expr2} fnameescape({fname}) String escape special characters in {fname} fnamemodify({fname}, {mods}) String modify file name -foldclosed({lnum}) Number first line of fold at {lnum} if closed -foldclosedend({lnum}) Number last line of fold at {lnum} if closed -foldlevel({lnum}) Number fold level at {lnum} +foldclosed({lnum} [, {winid}]) Number first line of fold at {lnum} if closed +foldclosedend({lnum} [, {winid}])) + Number last line of fold at {lnum} if closed +foldlevel({lnum} [, {winid}])) Number fold level at {lnum} foldtext() String line displayed for closed fold -foldtextresult({lnum}) String text for closed fold at {lnum} +foldtextresult({lnum} [, {winid}])) + String text for closed fold at {lnum} foreach({expr1}, {expr2}) List/Tuple/Dict/Blob/String for each item in {expr1} call {expr2} foreground() none bring the Vim window to the foreground @@ -3554,33 +3556,43 @@ fnamemodify({fname}, {mods}) *fnamemodify()* Return type: |String| -foldclosed({lnum}) *foldclosed()* +foldclosed({lnum} [, {winid}]) *foldclosed()* The result is a Number. If the line {lnum} is in a closed fold, the result is the number of the first line in that fold. If the line {lnum} is not in a closed fold, -1 is returned. {lnum} is used like with |getline()|. Thus "." is the current line, "'m" mark m, etc. + With the optional {winid} argument the values are obtained for + that window instead of the current window. If {winid} is + invalid, return -2. + Can also be used as a |method|: > GetLnum()->foldclosed() + GetLnum()->foldclosed(winid) < Return type: |Number| -foldclosedend({lnum}) *foldclosedend()* +foldclosedend({lnum} [, {winid}]) *foldclosedend()* The result is a Number. If the line {lnum} is in a closed fold, the result is the number of the last line in that fold. If the line {lnum} is not in a closed fold, -1 is returned. {lnum} is used like with |getline()|. Thus "." is the current line, "'m" mark m, etc. + With the optional {winid} argument the values are obtained for + that window instead of the current window. If {winid} is + invalid, return -2. + Can also be used as a |method|: > GetLnum()->foldclosedend() + GetLnum()->foldclosedend(winid) < Return type: |Number| -foldlevel({lnum}) *foldlevel()* +foldlevel({lnum} [, {winid}]) *foldlevel()* The result is a Number, which is the foldlevel of line {lnum} in the current buffer. For nested folds the deepest level is returned. If there is no fold at line {lnum}, zero is @@ -3592,8 +3604,13 @@ foldlevel({lnum}) *foldlevel()* {lnum} is used like with |getline()|. Thus "." is the current line, "'m" mark m, etc. + With the optional {winid} argument the values are obtained for + that window instead of the current window. If {winid} is + invalid, return -2. + Can also be used as a |method|: > GetLnum()->foldlevel() + GetLnum()->foldlevel(winid) < Return type: |Number| @@ -3619,7 +3636,7 @@ foldtext() *foldtext()* {not available when compiled without the |+folding| feature} -foldtextresult({lnum}) *foldtextresult()* +foldtextresult({lnum} [, {winid}]) *foldtextresult()* Returns the text that is displayed for the closed fold at line {lnum}. Evaluates 'foldtext' in the appropriate context. When there is no closed fold at {lnum} an empty string is @@ -3629,9 +3646,13 @@ foldtextresult({lnum}) *foldtextresult()* Useful when exporting folded text, e.g., to HTML. {not available when compiled without the |+folding| feature} + With the optional {winid} argument the values are obtained for + that window instead of the current window. If {winid} is + invalid, an empty string is returned. Can also be used as a |method|: > GetLnum()->foldtextresult() + GetLnum()->foldtextresult(winid) < Return type: |String| diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 6ecfd04c0e..bbc8573935 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -52709,6 +52709,7 @@ Changed ~ expected, so a request from the server can be answered. - |complete_info()| can distinguish between manual and automatic triggered completions via the "auto" item. +- fold functions take an optional {winid} parameter. *added-9.3* Added ~ diff --git a/src/evalfunc.c b/src/evalfunc.c index c2c2a6ab36..9083813de6 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2250,15 +2250,15 @@ static const funcentry_T global_functions[] = ret_string, f_fnameescape}, {"fnamemodify", 2, 2, FEARG_1, arg2_string, ret_string, f_fnamemodify}, - {"foldclosed", 1, 1, FEARG_1, arg1_lnum, + {"foldclosed", 1, 2, FEARG_1, arg2_lnum_number, ret_number, f_foldclosed}, - {"foldclosedend", 1, 1, FEARG_1, arg1_lnum, + {"foldclosedend", 1, 2, FEARG_1, arg2_lnum_number, ret_number, f_foldclosedend}, - {"foldlevel", 1, 1, FEARG_1, arg1_lnum, + {"foldlevel", 1, 2, FEARG_1, arg2_lnum_number, ret_number, f_foldlevel}, {"foldtext", 0, 0, 0, NULL, ret_string, f_foldtext}, - {"foldtextresult", 1, 1, FEARG_1, arg1_lnum, + {"foldtextresult", 1, 2, FEARG_1, arg2_lnum_number, ret_string, f_foldtextresult}, {"foreach", 2, 2, FEARG_1, arg2_foreach, ret_first_arg, f_foreach}, diff --git a/src/fold.c b/src/fold.c index 04698429d6..24e3defa82 100644 --- a/src/fold.c +++ b/src/fold.c @@ -241,31 +241,6 @@ hasFoldingWin( return TRUE; } -// foldLevel() {{{2 -# ifdef FEAT_EVAL -/* - * Return fold level at line number "lnum" in the current window. - */ - static int -foldLevel(linenr_T lnum) -{ - // While updating the folds lines between invalid_top and invalid_bot have - // an undefined fold level. Otherwise update the folds first. - if (invalid_top == (linenr_T)0) - checkupdate(curwin); - else if (lnum == prev_lnum && prev_lnum_lvl >= 0) - return prev_lnum_lvl; - else if (lnum >= invalid_top && lnum <= invalid_bot) - return -1; - - // Return quickly when there is no folding at all in this window. - if (!hasAnyFolding(curwin)) - return 0; - - return foldLevelWin(curwin, lnum); -} -# endif - // lineFolded() {{{2 /* * Low level function to check if a line is folded. Doesn't use any caching. @@ -3677,16 +3652,39 @@ foldclosed_both( int end UNUSED) { # ifdef FEAT_FOLDING - linenr_T lnum; + linenr_T lnum = 0; linenr_T first, last; + win_T *wp = curwin; - if (in_vim9script() && check_for_lnum_arg(argvars, 0) == FAIL) + if (in_vim9script() + && (check_for_lnum_arg(argvars, 0) == FAIL + || check_for_opt_number_arg(argvars, 1) == FAIL)) return; - lnum = tv_get_lnum(argvars); - if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) + if (argvars[1].v_type != VAR_UNKNOWN) { - if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL)) + tabpage_T *tp; + switchwin_T switchwin; + // use window specified in the second argument + wp = win_id2wp_tp(tv_get_number(&argvars[1]), &tp); + if (wp != NULL && tp != NULL) + { + if (switch_win(&switchwin, wp, tp, TRUE) == OK) + lnum = tv_get_lnum(argvars); + restore_win(&switchwin, TRUE); + } + else + { + rettv->vval.v_number = -2; + return; + } + } + else + lnum = tv_get_lnum(argvars); + + if (lnum >= 1 && lnum <= wp->w_buffer->b_ml.ml_line_count) + { + if (hasFoldingWin(wp, lnum, &first, &last, FALSE, NULL)) { if (end) rettv->vval.v_number = (varnumber_T)last; @@ -3717,6 +3715,28 @@ f_foldclosedend(typval_T *argvars, typval_T *rettv) foldclosed_both(argvars, rettv, TRUE); } +/* + * Return fold level at line number "lnum" in the current window. + */ + static int +foldLevel(linenr_T lnum) +{ + // While updating the folds lines between invalid_top and invalid_bot have + // an undefined fold level. Otherwise update the folds first. + if (invalid_top == (linenr_T)0) + checkupdate(curwin); + else if (lnum == prev_lnum && prev_lnum_lvl >= 0) + return prev_lnum_lvl; + else if (lnum >= invalid_top && lnum <= invalid_bot) + return -1; + + // Return quickly when there is no folding at all in this window. + if (!hasAnyFolding(curwin)) + return 0; + + return foldLevelWin(curwin, lnum); +} + /* * "foldlevel()" function */ @@ -3725,13 +3745,37 @@ f_foldlevel(typval_T *argvars UNUSED, typval_T *rettv UNUSED) { # ifdef FEAT_FOLDING linenr_T lnum; + switchwin_T switchwin; - if (in_vim9script() && check_for_lnum_arg(argvars, 0) == FAIL) + if (in_vim9script() + && (check_for_lnum_arg(argvars, 0) == FAIL + || check_for_opt_number_arg(argvars, 1) == FAIL)) return; - lnum = tv_get_lnum(argvars); - if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) - rettv->vval.v_number = foldLevel(lnum); + if (argvars[1].v_type != VAR_UNKNOWN) + { + tabpage_T *tp; + win_T *wp; + wp = win_id2wp_tp(tv_get_number(&argvars[1]), &tp); + if (wp != NULL && tp != NULL) + { + if (switch_win(&switchwin, wp, tp, TRUE) == OK) + { + lnum = tv_get_lnum(argvars); + if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) + rettv->vval.v_number = foldLevel(lnum); + } + restore_win(&switchwin, TRUE); + } + else + rettv->vval.v_number = -2; + } + else + { + lnum = tv_get_lnum(argvars); + if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) + rettv->vval.v_number = foldLevel(lnum); + } # endif } @@ -3806,34 +3850,51 @@ f_foldtext(typval_T *argvars UNUSED, typval_T *rettv) void f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv) { + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; + # ifdef FEAT_FOLDING - linenr_T lnum; + linenr_T lnum = 0; char_u *text; char_u buf[FOLD_TEXT_LEN]; foldinfo_T foldinfo; int fold_count; + win_T *wp = curwin; static int entered = FALSE; -# endif - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; - - if (in_vim9script() && check_for_lnum_arg(argvars, 0) == FAIL) + if (in_vim9script() + && (check_for_lnum_arg(argvars, 0) == FAIL + || check_for_opt_number_arg(argvars, 1) == FAIL)) return; -# ifdef FEAT_FOLDING if (entered) return; // reject recursive use entered = TRUE; - lnum = tv_get_lnum(argvars); + if (argvars[1].v_type != VAR_UNKNOWN) + { + tabpage_T *tp; + switchwin_T switchwin; + // use window specified in the second argument + wp = win_id2wp_tp(tv_get_number(&argvars[1]), &tp); + if (wp == NULL || tp == NULL) // wrong winid + { + entered = FALSE; + return; + } + if (switch_win(&switchwin, wp, tp, TRUE) == OK) + lnum = tv_get_lnum(argvars); + restore_win(&switchwin, TRUE); + } + else + lnum = tv_get_lnum(argvars); + // treat illegal types and illegal string values for {lnum} the same if (lnum < 0) lnum = 0; - fold_count = foldedCount(curwin, lnum, &foldinfo); + fold_count = foldedCount(wp, lnum, &foldinfo); if (fold_count > 0) { - text = get_foldtext(curwin, lnum, lnum + fold_count - 1, + text = get_foldtext(wp, lnum, lnum + fold_count - 1, &foldinfo, buf); if (text == buf) text = vim_strsave(text); diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim index 1c09719b13..c823c7c718 100644 --- a/src/testdir/test_fold.vim +++ b/src/testdir/test_fold.vim @@ -1462,10 +1462,20 @@ func Test_foldtextresult() call assert_equal('+-- 2 lines: two', foldtextresult(2)) setlocal foldtext= call assert_equal('+-- 2 lines folded ', foldtextresult(2)) + setlocal foldtext& + + let main_winid = win_getid() + tabnew + call assert_equal('', foldtextresult(1)) + call assert_equal('', foldtextresult(2, 9999)) " wrong winid + call assert_equal('+-- 2 lines: two', foldtextresult(2, main_winid)) + call win_execute(main_winid, 'setlocal foldtext=') + call assert_equal('+-- 2 lines folded ', foldtextresult(2, main_winid)) + call win_execute(main_winid, 'setlocal foldtext&') + bw! " tabnew " Fold text for a C comment fold %d _ - setlocal foldtext& call setline(1, ['', '/*', ' * Comment', ' */', '']) 2,4fold call assert_equal('+-- 3 lines: Comment', foldtextresult(2)) @@ -2143,4 +2153,85 @@ func Test_foldminlines_per_window() bwipe! endfunc +" Test for foldclosed(), foldclosedend() and foldlevel() with winid argument +func Test_foldclosed_with_winid() + " Create a main window with folds + new + call setline(1, [ + \ 'one', + \ ' two', + \ ' three', + \ ' four', + \ 'five', + \ ' six', + \ ' seven', + \ ' eight', + \ 'nine' + \ ]) + setlocal foldmethod=indent shiftwidth=2 foldenable + let main_winid = win_getid() + + call cursor(6, 0) " Test foldclosed('.') + " Split to create a second window showing the same buffer + vnew + + call assert_equal(2, foldclosed(2, main_winid)) + call assert_equal(6, foldclosed(6, main_winid)) + call assert_equal(6, foldclosed('.', main_winid)) + call assert_equal(-1, foldclosed(1, main_winid)) + call assert_equal(-1, foldclosed(5, main_winid)) + call assert_equal(0, foldlevel(1, main_winid)) + call assert_equal(1, foldlevel(2, main_winid)) + call assert_equal(1, foldlevel('.', main_winid)) + + call assert_equal(4, foldclosedend(2, main_winid)) + call assert_equal(8, foldclosedend(6, main_winid)) + call assert_equal(8, foldclosedend('.', main_winid)) + call assert_equal(-1, foldclosedend(1, main_winid)) + call assert_equal(-1, foldclosedend(5, main_winid)) + + " Test with an invalid window ID + call assert_equal(-2, foldclosed(2, 99999)) + call assert_equal(-2, foldclosedend(2, 99999)) + call assert_equal(-2, foldlevel(2, 99999)) + + " Test with invalid line number + call assert_equal(-1, foldclosed(100, main_winid)) + call assert_equal(-1, foldclosedend(100, main_winid)) + call assert_equal(-1, foldclosed(0, main_winid)) + call assert_equal(-1, foldclosedend(0, main_winid)) + + bwipe! " vnew + + tabnew + + call assert_equal(2, foldclosed(2, main_winid)) + call assert_equal(6, foldclosed(6, main_winid)) + call assert_equal(-1, foldclosed(1, main_winid)) + call assert_equal(-1, foldclosed(5, main_winid)) + call assert_equal(0, foldlevel(1, main_winid)) + call assert_equal(1, foldlevel(2, main_winid)) + call assert_equal(1, foldlevel('.', main_winid)) + + call assert_equal(4, foldclosedend(2, main_winid)) + call assert_equal(8, foldclosedend(6, main_winid)) + call assert_equal(-1, foldclosedend(1, main_winid)) + call assert_equal(-1, foldclosedend(5, main_winid)) + + " Test with an invalid window ID + call assert_equal(-2, foldclosed(2, 99999)) + call assert_equal(-2, foldclosedend(2, 99999)) + call assert_equal(-2, foldlevel(2, 99999)) + + " Test with invalid line number + call assert_equal(-1, foldclosed(100, main_winid)) + call assert_equal(-1, foldclosedend(100, main_winid)) + call assert_equal(-1, foldclosed(0, main_winid)) + call assert_equal(-1, foldclosedend(0, main_winid)) + + bwipe! " tabnew + + bwipe! " new +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index adbb034954..a2e414b0f5 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -1651,6 +1651,7 @@ enddef def Test_foldclosed() v9.CheckSourceDefAndScriptFailure(['foldclosed(function("min"))'], ['E1013: Argument 1: type mismatch, expected string but got func(...): unknown', 'E1220: String or Number required for argument 1']) + v9.CheckSourceDefAndScriptFailure(['foldclosed(".", "a")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) v9.CheckSourceDefExecAndScriptFailure(['foldclosed("")'], 'E1209: Invalid value for a line number') assert_equal(-1, foldclosed(1)) assert_equal(-1, foldclosed('$')) @@ -1658,6 +1659,7 @@ enddef def Test_foldclosedend() v9.CheckSourceDefAndScriptFailure(['foldclosedend(true)'], ['E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1']) + v9.CheckSourceDefAndScriptFailure(['foldclosedend(".", "a")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) v9.CheckSourceDefExecAndScriptFailure(['foldclosedend("")'], 'E1209: Invalid value for a line number') assert_equal(-1, foldclosedend(1)) assert_equal(-1, foldclosedend('w0')) @@ -1665,6 +1667,7 @@ enddef def Test_foldlevel() v9.CheckSourceDefAndScriptFailure(['foldlevel(0z10)'], ['E1013: Argument 1: type mismatch, expected string but got blob', 'E1220: String or Number required for argument 1']) + v9.CheckSourceDefAndScriptFailure(['foldlevel(".", "a")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) v9.CheckSourceDefExecAndScriptFailure(['foldlevel("")'], 'E1209: Invalid value for a line number') assert_equal(0, foldlevel(1)) assert_equal(0, foldlevel('.')) @@ -1672,6 +1675,7 @@ enddef def Test_foldtextresult() v9.CheckSourceDefAndScriptFailure(['foldtextresult(1.1)'], ['E1013: Argument 1: type mismatch, expected string but got float', 'E1220: String or Number required for argument 1']) + v9.CheckSourceDefAndScriptFailure(['foldtextresult(".", "a")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) v9.CheckSourceDefExecAndScriptFailure(['foldtextresult("")'], 'E1209: Invalid value for a line number') assert_equal('', foldtextresult(1)) assert_equal('', foldtextresult('.')) diff --git a/src/version.c b/src/version.c index e4c218c29b..9104f3c391 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1006, /**/ 1005, /**/ From 7e747229993bf784768fbb22b4bdd3a13dbb3d13 Mon Sep 17 00:00:00 2001 From: glepnir Date: Tue, 25 Aug 2026 20:10:40 +0000 Subject: [PATCH 435/647] patch 9.2.1007: fuzzy completion list wrongly sorted after complete() Problem: With 'completeopt' "fuzzy", a re-sort after complete() leaves the last match unsorted at the end of the list. Solution: Find the original text by its flag instead of assuming compl_shows_dir points at it. closes: #21103 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/insexpand.c | 74 ++++++++++++++++++------------- src/testdir/test_ins_complete.vim | 17 +++++++ src/version.c | 2 + 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/insexpand.c b/src/insexpand.c index 2145fc199e..e35fe54ca9 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -621,6 +621,23 @@ is_first_match(compl_T *match) return match == compl_first_match; } +/* + * Return the entry holding the original text, NULL if not found. + * It is the first item, or the last one for backward completion. + */ + static compl_T * +find_original_text_match(void) +{ + if (compl_first_match == NULL) + return NULL; + if (match_at_original_text(compl_first_match)) + return compl_first_match; + if (compl_first_match->cp_prev != NULL + && match_at_original_text(compl_first_match->cp_prev)) + return compl_first_match->cp_prev; + return NULL; +} + /* * Return TRUE when character "c" is part of the item currently being * completed. Used to decide whether to abandon complete mode when the menu @@ -1711,19 +1728,22 @@ set_fuzzy_score(void) } /* - * Sort completion matches, excluding the node that contains the leader. + * Sort completion matches, leaving the entry with the original text in place. */ static void sort_compl_match_list(int (*compare)(const void *, const void *)) { - compl_T *compl; + compl_T *orig_text; if (!compl_first_match || is_first_match(compl_first_match->cp_next)) return; - compl = compl_first_match->cp_prev; + orig_text = find_original_text_match(); + if (orig_text == NULL) + return; + ins_compl_make_linear(); - if (compl_shows_dir_forward()) + if (orig_text == compl_first_match) { compl_first_match->cp_next->cp_prev = NULL; compl_first_match->cp_next = mergesort_list(compl_first_match->cp_next, @@ -1732,14 +1752,16 @@ sort_compl_match_list(int (*compare)(const void *, const void *)) } else { - compl->cp_prev->cp_next = NULL; + compl_T *tail; + + orig_text->cp_prev->cp_next = NULL; compl_first_match = mergesort_list(compl_first_match, cp_get_next, cp_set_next, cp_get_prev, cp_set_prev, compare); - compl_T *tail = compl_first_match; + tail = compl_first_match; while (tail->cp_next != NULL) tail = tail->cp_next; - tail->cp_next = compl; - compl->cp_prev = tail; + tail->cp_next = orig_text; + orig_text->cp_prev = tail; } (void)ins_compl_make_cyclic(); } @@ -2832,30 +2854,20 @@ ins_compl_restart(void) static void ins_compl_set_original_text(char_u *str, size_t len) { + compl_T *match = find_original_text_match(); + char_u *p; + // Replace the original text entry. - // The CP_ORIGINAL_TEXT flag is either at the first item or might possibly - // be at the last item for backward completion - if (match_at_original_text(compl_first_match)) // safety check - { - char_u *p = vim_strnsave(str, len); - if (p != NULL) - { - VIM_CLEAR_STRING(compl_first_match->cp_str); - compl_first_match->cp_str.string = p; - compl_first_match->cp_str.length = len; - } - } - else if (compl_first_match->cp_prev != NULL - && match_at_original_text(compl_first_match->cp_prev)) - { - char_u *p = vim_strnsave(str, len); - if (p != NULL) - { - VIM_CLEAR_STRING(compl_first_match->cp_prev->cp_str); - compl_first_match->cp_prev->cp_str.string = p; - compl_first_match->cp_prev->cp_str.length = len; - } - } + if (match == NULL) + return; + + p = vim_strnsave(str, len); + if (p == NULL) + return; + + VIM_CLEAR_STRING(match->cp_str); + match->cp_str.string = p; + match->cp_str.length = len; } /* diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index b345a45e4d..c8a28961d7 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6795,4 +6795,21 @@ func Test_complete_info_auto() bwipe! endfunc +func Test_complete_fuzzy_resort() + new + set completeopt=menu,menuone,noselect,fuzzy + + inoremap call complete(1, ['xxxb', 'xb', 'b']) + call feedkeys("i\b\=string(map(complete_info(['items']).items, 'v:val.word'))\\", 'tx') + call assert_equal("b['b', 'xb', 'xxxb']", getline(1)) + + %d _ + call setline(1, ['xxxbar', 'xbar', 'bar']) + call feedkeys("Go\b\=string(map(complete_info(['items']).items, 'v:val.word'))\\", 'tx') + call assert_equal("b['bar', 'xbar', 'xxxbar']", getline('$')) + + bwipe! + set completeopt& +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/version.c b/src/version.c index 9104f3c391..218ee0cc8c 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1007, /**/ 1006, /**/ From 4b0b53e856d4df9ada397efd49bec5a78b943643 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 25 Aug 2026 20:18:37 +0000 Subject: [PATCH 436/647] patch 9.2.1008: Vim9: hang when a line break is used before "->(" Problem: In Vim9 script a line break before "->(" makes Vim hang and use up memory (SectionCotangentBundle) Solution: Consume the line break for "->(" as well, and skip white space after "->" in a compiled function too (Hirohito Higashi). fixes: #21144 closes: #21147 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/eval.c | 21 +++++++++++++++++---- src/testdir/test_vim9_expr.vim | 8 ++++++++ src/version.c | 2 ++ src/vim9expr.c | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/eval.c b/src/eval.c index bb6f452b0b..0d19330c7e 100644 --- a/src/eval.c +++ b/src/eval.c @@ -7591,6 +7591,21 @@ eval_isdictc(int c) return ASCII_ISALNUM(c) || c == '_'; } +/* + * Return true when "p" points to "->" followed by a method name or a lambda. + * Only called for Vim9 script. + */ + static bool +method_call_follows(char_u *p) +{ + if (p[0] != '-' || p[1] != '>') + return false; + + char_u *after = skipwhite(p + 2); + + return ASCII_ISALPHA(*after) || *after == '('; +} + /* * Handle: * - expr[expr], expr[expr:expr] subscript @@ -7619,7 +7634,7 @@ handle_subscript( while (ret == OK) { - // When at the end of the line and ".name" or "->{" or "->X" follows in + // When at the end of the line and ".name" or a method call follows in // the next line then consume the line break. p = eval_next_non_blank(*arg, evalarg, &getnext); if (getnext @@ -7627,9 +7642,7 @@ handle_subscript( && ((rettv->v_type == VAR_DICT && eval_isdictc(p[1])) || rettv->v_type == VAR_CLASS || rettv->v_type == VAR_OBJECT)) - || (p[0] == '-' && p[1] == '>' && (p[2] == '{' - || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2) - : p[2]))))) + || method_call_follows(p))) { *arg = eval_next_line(*arg, evalarg); p = *arg; diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 1062df185d..3613c1a2ea 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -3964,6 +3964,14 @@ def Test_expr9_method_call() var sorted = [3, 1, 2] -> sort() assert_equal([1, 2, 3], sorted) + + var nrs = [1, 2] + ->((x) => x)() + assert_equal([1, 2], nrs) + + nrs = [3, 4] + -> ((x) => x)() + assert_equal([3, 4], nrs) END v9.CheckDefAndScriptSuccess(lines) diff --git a/src/version.c b/src/version.c index 218ee0cc8c..80a2f16869 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1008, /**/ 1007, /**/ diff --git a/src/vim9expr.c b/src/vim9expr.c index 87a872f58c..46d978d443 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -2550,7 +2550,7 @@ compile_subscript( if (next != NULL && ((next[0] == '-' && next[1] == '>' && (next[2] == '{' - || next[2] == '(' + || *skipwhite(next + 2) == '(' || ASCII_ISALPHA(*skipwhite(next + 2)))) || (next[0] == '.' && eval_isdictc(next[1])))) { From 5cbadec2e63b0e38c7c1fe4ae9c07b07123299b8 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Tue, 25 Aug 2026 20:28:49 +0000 Subject: [PATCH 437/647] runtime(syntax): Add Regexp default highlight group Most syntax files currently use String or Normal for highlighting regular expression literals; these should have a dedicated group. closes: #21141 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/doc/syntax.txt | 3 ++- runtime/syntax/help.vim | 4 +++- runtime/syntax/syncolor.vim | 3 ++- runtime/syntax/vim.vim | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 1f63ccd4ab..f043001485 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 13 +*syntax.txt* For Vim version 9.2. Last change: 2026 Aug 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -230,6 +230,7 @@ you can see the actual color, except for "Ignore"): Character a character constant: 'c', '\n' Number a number constant: 234, 0xff Boolean a boolean constant: TRUE, false + Regexp a regular expression constant: /ab*c/ Float a floating point constant: 2.3e10 *Identifier any variable name diff --git a/runtime/syntax/help.vim b/runtime/syntax/help.vim index cd962886a6..9eae50a9a6 100644 --- a/runtime/syntax/help.vim +++ b/runtime/syntax/help.vim @@ -2,7 +2,7 @@ " Language: Vim help file " Maintainer: Doug Kearns " Former Maintainer: Bram Moolenaar -" Last Change: 2026 Aug 02 +" Last Change: 2026 Aug 24 " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") @@ -177,6 +177,7 @@ syn match helpString "\t[* ]String\t\+[a-z].*" syn match helpCharacter "\t[* ]Character\t\+[a-z].*" syn match helpNumber "\t[* ]Number\t\+[a-z].*" syn match helpBoolean "\t[* ]Boolean\t\+[a-z].*" +syn match helpRegexp "\t[* ]Regexp\t\+[a-z].*" syn match helpFloat "\t[* ]Float\t\+[a-z].*" syn match helpIdentifier "\t[* ]Identifier\t\+[a-z].*" syn match helpFunction "\t[* ]Function\t\+[a-z].*" @@ -271,6 +272,7 @@ hi def link helpString String hi def link helpCharacter Character hi def link helpNumber Number hi def link helpBoolean Boolean +hi def link helpRegexp Regexp hi def link helpFloat Float hi def link helpIdentifier Identifier hi def link helpFunction Function diff --git a/runtime/syntax/syncolor.vim b/runtime/syntax/syncolor.vim index 28324ebe29..2ccb0a4df8 100644 --- a/runtime/syntax/syncolor.vim +++ b/runtime/syntax/syncolor.vim @@ -1,6 +1,6 @@ " Vim syntax support file " Maintainer: The Vim Project -" Last Change: 2026 Jul 22 +" Last Change: 2026 Aug 24 " Former Maintainer: Bram Moolenaar " This file sets up the default methods for highlighting. @@ -72,6 +72,7 @@ SynLink String Constant SynLink Character Constant SynLink Number Constant SynLink Boolean Constant +SynLink Regexp Constant SynLink Float Number SynLink Function Identifier SynLink Conditional Statement diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 9e553ef357..2fb67f3688 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 22 +" Last Change: 2026 Aug 24 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -180,7 +180,7 @@ syn match vimUserAutoEvent contained "\<\h\w*\>" skipwhite skipnl nextgroup=vimU " Highlight commonly used Groupnames {{{2 " GEN_SYN_VIM: vimGroup, START_STR='syn keyword vimGroup contained', END_STR='' -syn keyword vimGroup contained Added Bold BoldItalic Boolean Changed Character Comment Conditional Constant Debug Define Delimiter Error Exception Float Function Identifier Ignore Include Italic Keyword Label Macro Number Operator PreCondit PreProc Removed Repeat Special SpecialChar SpecialComment Statement StorageClass String Structure Tag Todo Type Typedef Underlined +syn keyword vimGroup contained Added Bold BoldItalic Boolean Changed Character Comment Conditional Constant Debug Define Delimiter Error Exception Float Function Identifier Ignore Include Italic Keyword Label Macro Number Operator PreCondit PreProc Regexp Removed Repeat Special SpecialChar SpecialComment Statement StorageClass String Structure Tag Todo Type Typedef Underlined " Default highlighting groups {{{2 " GEN_SYN_VIM: vimHLGroup, START_STR='syn keyword vimHLGroup contained', END_STR='' From 303a153694d93e93620023835c64e4dc2122e3b2 Mon Sep 17 00:00:00 2001 From: glepnir Date: Tue, 25 Aug 2026 20:35:00 +0000 Subject: [PATCH 438/647] patch 9.2.1009: duplicate dict code in ins_compl_dict_alloc() Problem: ins_compl_dict_alloc() builds the same dict as fill_complete_info_dict(). Solution: Call fill_complete_info_dict() instead (glepnir). closes: #21140 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/insexpand.c | 13 ++----------- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/insexpand.c b/src/insexpand.c index e35fe54ca9..bae461b065 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -333,6 +333,7 @@ static void ins_compl_add_dict(dict_T *dict); static int get_userdefined_compl_info(colnr_T curs_col, callback_T *cb, int *startcol); static void get_cpt_func_completion_matches(callback_T *cb); static callback_T *get_callback_if_cpt_func(char_u *p, int idx); +static void fill_complete_info_dict(dict_T *di, compl_T *match, int add_match); #endif static int setup_cpt_sources(void); static int is_cpt_func_refresh_always(void); @@ -1509,17 +1510,7 @@ ins_compl_dict_alloc(compl_T *match) if (dict == NULL) return NULL; - - dict_add_string_len(dict, "word", match->cp_str.string, (int)match->cp_str.length); - dict_add_string(dict, "abbr", match->cp_text[CPT_ABBR]); - dict_add_string(dict, "menu", match->cp_text[CPT_MENU]); - dict_add_string(dict, "kind", match->cp_text[CPT_KIND]); - dict_add_string(dict, "info", match->cp_text[CPT_INFO]); - if (match->cp_user_data.v_type == VAR_UNKNOWN) - dict_add_string_len(dict, "user_data", (char_u *)"", 0); - else - dict_add_tv(dict, "user_data", &match->cp_user_data); - + fill_complete_info_dict(dict, match, FALSE); return dict; } diff --git a/src/version.c b/src/version.c index 80a2f16869..50a655d4d1 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1009, /**/ 1008, /**/ From 3e46ee723f2bc950950420c373816ee735424d6a Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 25 Aug 2026 20:48:38 +0000 Subject: [PATCH 439/647] patch 9.2.1010: compile error when folding feature is disabled Problem: compile error when folding feature is disabled (after: v9.2.1006, John Marriott) Solution: Add back missing ifdefs Signed-off-by: Christian Brabandt --- src/fold.c | 2 ++ src/version.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/fold.c b/src/fold.c index 24e3defa82..969886e0e1 100644 --- a/src/fold.c +++ b/src/fold.c @@ -3715,6 +3715,7 @@ f_foldclosedend(typval_T *argvars, typval_T *rettv) foldclosed_both(argvars, rettv, TRUE); } +# ifdef FEAT_FOLDING /* * Return fold level at line number "lnum" in the current window. */ @@ -3736,6 +3737,7 @@ foldLevel(linenr_T lnum) return foldLevelWin(curwin, lnum); } +# endif /* * "foldlevel()" function diff --git a/src/version.c b/src/version.c index 50a655d4d1..392e69d465 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1010, /**/ 1009, /**/ From 331d5d67028505c5b6043603a57d1e8497b922b5 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 25 Aug 2026 21:15:57 +0000 Subject: [PATCH 440/647] patch 9.2.1011: [security]: arbitrary Ex command execution during C omni-completion Problem: arbitrary Ex command execution during C omni-completion via tag file names (Yazan Balawneh) Solution: Escape the | for all returned tag files Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-r77m-8m55-rpr6 Signed-off-by: Christian Brabandt --- runtime/autoload/ccomplete.vim | 4 ++-- src/testdir/test_plugin_ccomplete.vim | 30 +++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim index 593789a84f..dfe154e469 100644 --- a/runtime/autoload/ccomplete.vim +++ b/runtime/autoload/ccomplete.vim @@ -3,7 +3,7 @@ vim9script noclear # Vim completion script # Language: C # Maintainer: The Vim Project -# Last Change: 2026 Feb 18 +# Last Change: 2026 Aug 25 # Rewritten in Vim9 script by github user lacygoill # Former Maintainer: Bram Moolenaar @@ -575,7 +575,7 @@ def StructMembers( # {{{1 # Todo: What about local structures? var fnames: string = tagfiles() - ->map((_, v: string) => escape(v, ' \#%')) + ->map((_, v: string) => escape(v, ' \#%|')) ->join() if fnames == '' return [] diff --git a/src/testdir/test_plugin_ccomplete.vim b/src/testdir/test_plugin_ccomplete.vim index c1754d17c1..92cca050f3 100644 --- a/src/testdir/test_plugin_ccomplete.vim +++ b/src/testdir/test_plugin_ccomplete.vim @@ -85,4 +85,34 @@ func Test_ccomplete_typeref_completion_still_works() let &tags = save_tags endfunc +" The tags file names from tagfiles() are executed +" via a single vimgrep command and trailing | does +" not cause code execution +func Test_ccomplete_no_exec_via_tagfile_name() + CheckUnix + let dir = "Xcc|&titlestring\t=\t'INJECTED'|ls\t" + call mkdir(dir, 'pR') + let tagsfile = dir .. '/tags' + call writefile(["!_TAG_FILE_SORTED\t0\t/0/", + \ "myvar\tmain.c\t/^x$/;\"\tv\ttyperef:struct:mystruct", + \ "alpha\tmain.c\t/^x$/;\"\tm\tstruct:mystruct", + \ ], tagsfile) + + let save_tags = &tags + let save_title = &titlestring + let &tags = fnamemodify(tagsfile, ':p') + set titlestring=orig + + new + call ccomplete#Complete(1, '') + call ccomplete#Complete(0, 'myvar.x') + + call assert_equal('orig', &titlestring, + \ 'tags file name was executed as an Ex command during omni-completion') + + bwipe! + let &tags = save_tags + let &titlestring = save_title +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 392e69d465..9d15a29b0d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1011, /**/ 1010, /**/ From adb877c3115ff7485bc7ea80fc3da6993b5b654b Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Tue, 25 Aug 2026 21:38:31 +0000 Subject: [PATCH 441/647] runtime(vim): Update base syntax, link pattern groups to Regexp - Link all pattern groups to the new Regexp highlight group - Highlight delimiters in :syntax command patterns closes: #21154 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 24 ++++++++++-- .../testdir/dumps/vim9_expressions_10.dump | 2 +- .../testdir/dumps/vim9_expressions_11.dump | 2 +- .../syntax/testdir/dumps/vim_ex_catch_00.dump | 18 ++++----- .../testdir/dumps/vim_ex_command_08.dump | 2 +- .../testdir/dumps/vim_ex_command_09.dump | 6 +-- .../dumps/vim_ex_command_modifiers_00.dump | 4 +- .../dumps/vim_ex_command_modifiers_02.dump | 4 +- .../dumps/vim_ex_command_modifiers_04.dump | 4 +- .../dumps/vim_ex_command_modifiers_05.dump | 2 +- .../dumps/vim_ex_command_modifiers_06.dump | 6 +-- .../dumps/vim_ex_command_modifiers_08.dump | 4 +- .../dumps/vim_ex_command_modifiers_09.dump | 4 +- .../dumps/vim_ex_command_modifiers_11.dump | 2 +- .../dumps/vim_ex_command_modifiers_14.dump | 22 +++++------ .../dumps/vim_ex_command_modifiers_15.dump | 36 +++++++++--------- .../dumps/vim_ex_command_modifiers_16.dump | 34 ++++++++--------- .../syntax/testdir/dumps/vim_ex_def_00.dump | 2 +- .../testdir/dumps/vim_ex_def_fold_00.dump | 2 +- .../testdir/dumps/vim_ex_filter_00.dump | 16 ++++---- .../testdir/dumps/vim_ex_function_00.dump | 2 +- .../dumps/vim_ex_function_fold_00.dump | 2 +- .../testdir/dumps/vim_ex_global_00.dump | 18 ++++----- .../testdir/dumps/vim_ex_global_01.dump | 18 ++++----- .../testdir/dumps/vim_ex_global_02.dump | 8 ++-- .../testdir/dumps/vim_ex_helpgrep_00.dump | 18 ++++----- .../syntax/testdir/dumps/vim_ex_match_00.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_match_01.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_match_02.dump | 4 +- .../syntax/testdir/dumps/vim_ex_match_03.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_01.dump | 2 +- .../syntax/testdir/dumps/vim_ex_range_02.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_05.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_06.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_07.dump | 2 +- .../syntax/testdir/dumps/vim_ex_range_08.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_09.dump | 2 +- .../syntax/testdir/dumps/vim_ex_range_10.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_12.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_14.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_16.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_range_17.dump | 2 +- .../syntax/testdir/dumps/vim_ex_range_18.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_20.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_22.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_24.dump | 4 +- .../syntax/testdir/dumps/vim_ex_range_26.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_range_28.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_range_30.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_range_32.dump | 8 ++-- .../syntax/testdir/dumps/vim_ex_sort_00.dump | 12 +++--- .../syntax/testdir/dumps/vim_ex_sort_01.dump | 12 +++--- .../syntax/testdir/dumps/vim_ex_sort_02.dump | 32 ++++++++-------- .../syntax/testdir/dumps/vim_ex_sort_03.dump | 18 ++++----- .../testdir/dumps/vim_ex_substitute_00.dump | 22 +++++------ .../testdir/dumps/vim_ex_substitute_01.dump | 22 +++++------ .../testdir/dumps/vim_ex_substitute_02.dump | 12 +++--- .../testdir/dumps/vim_ex_substitute_03.dump | 38 +++++++++---------- .../testdir/dumps/vim_ex_substitute_04.dump | 30 +++++++-------- .../testdir/dumps/vim_ex_substitute_05.dump | 36 +++++++++--------- .../testdir/dumps/vim_ex_substitute_06.dump | 12 +++--- .../testdir/dumps/vim_ex_syntax_03.dump | 12 +++--- .../testdir/dumps/vim_ex_syntax_04.dump | 8 ++-- .../testdir/dumps/vim_ex_syntax_05.dump | 12 +++--- .../testdir/dumps/vim_ex_syntax_06.dump | 6 +-- .../testdir/dumps/vim_ex_syntax_08.dump | 4 +- .../testdir/dumps/vim_ex_syntax_10.dump | 6 +-- .../testdir/dumps/vim_ex_syntax_18.dump | 4 +- .../testdir/dumps/vim_ex_syntax_19.dump | 2 +- .../testdir/dumps/vim_ex_syntax_21.dump | 8 ++-- .../testdir/dumps/vim_ex_syntax_22.dump | 10 ++--- .../syntax/testdir/dumps/vim_ex_throw_00.dump | 2 +- .../syntax/testdir/dumps/vim_ex_uniq_00.dump | 12 +++--- .../syntax/testdir/dumps/vim_ex_uniq_01.dump | 20 +++++----- .../testdir/dumps/vim_ex_vimgrep_00.dump | 16 ++++---- .../testdir/dumps/vim_ex_vimgrep_01.dump | 22 +++++------ .../testdir/dumps/vim_ex_vimgrep_02.dump | 22 +++++------ .../testdir/dumps/vim_ex_vimgrep_03.dump | 16 ++++---- .../testdir/dumps/vim_ex_vimgrep_04.dump | 2 +- .../testdir/dumps/vim_expressions_23.dump | 4 +- .../vim_predefined_user_commands_01.dump | 2 +- .../syntax/testdir/input/vim_ex_helpgrep.vim | 1 - runtime/syntax/vim.vim | 24 ++++++++++-- 83 files changed, 437 insertions(+), 402 deletions(-) diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 975aead334..8188d9c6ff 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 22 +" Last Change: 2026 Aug 26 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -1481,7 +1481,14 @@ syn region vimSynRegion contained 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*\%(\\\|"\\ \)/ end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg +syn region vimSynRegPat contained + \ matchgroup=Delimiter + \ start="\z([-`~!@#$%^&*_=+;:'",./?]\)" + \ skip=/\\\\\|\\\z1\|\n\s*\%(\\\|"\\ \)/ + \ end="\z1" + \ skipwhite nextgroup=vimSynPatMod,vimSynReg + \ contains=@vimSynRegPatGroup + \ extend 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\+" @@ -2884,6 +2891,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimAbb vimCommand hi def link vimAddress Constant + hi def link vimAddressPattern Regexp hi def link vimAddressOffset Type hi def link vimAddressSlashEscape Special hi def link vimAddressQuestionEscape Special @@ -2920,6 +2928,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimCall vimCommand hi def link vimCall_ vimCall hi def link vimCatch vimCommand + hi def link vimCatchPattern Regexp hi def link vimChangeBang vimBang hi def link vimChangeCount vimCount hi def link vimCd vimCommand @@ -2987,6 +2996,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimEval vimCommand hi def link vimExFilter vimCommand hi def link vimExFilterBang vimBang + hi def link vimExFilterPattern Regexp hi def link vimFBVar vimVar hi def link vimFgBgAttrib vimHiAttrib hi def link vimFuncEcho vimCommand @@ -3000,11 +3010,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimFunctionComment vimComment hi def link vimFuncName Function hi def link vimFunctionMod Special + hi def link vimFunctionPattern Regexp hi def link vimFunctionParam vimVar hi def link vimFunctionParamEquals vimOper hi def link vimFunctionScope vimVarScope hi def link vimFunctionSID vimNotation hi def link vimGlobal vimCommand + hi def link vimGlobalPattern Regexp hi def link vimGrep vimCommand hi def link vimGrep_ vimGrep hi def link vimGrepadd vimCommand @@ -3021,6 +3033,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimHelp vimCommand hi def link vimHelpBang vimBang hi def link vimHelpgrep vimCommand + hi def link vimHelpgrepPattern Regexp hi def link vimHiAttrib PreProc hi def link vimHiBang vimBang hi def link vimHiClear Type @@ -3082,6 +3095,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimMatch_ vimMatch hi def link vimMatchGroup vimGroup hi def link vimMatchNone vimGroup + hi def link vimMatchPattern Regexp hi def link vimMenuBang vimBang hi def link vimMenuClear Special hi def link vimMenuMod vimMapMod @@ -3177,6 +3191,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSort_ vimSort hi def link vimSortBang vimBang hi def link vimSortOptions Special + hi def link vimSortPattern Regexp hi def link vimSpecFile Identifier hi def link vimSpecFileMod vimSpecFile hi def link vimSpecial Type @@ -3187,6 +3202,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSubstCount Number hi def link vimSubstDelim Delimiter hi def link vimSubstFlags Special + hi def link vimSubstPat Regexp hi def link vimSubstSubstr SpecialChar hi def link vimSubstTwoBS vimString hi def link vimSubst vimCommand @@ -3221,7 +3237,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSynPatRange vimString hi def link vimSynReg Type hi def link vimSynRegOpt vimSynOption - hi def link vimSynRegPat vimString + hi def link vimSynRegPat Regexp hi def link vimSynSpell Type hi def link vimSyntax vimCommand hi def link vimSynType vimSpecial @@ -3247,6 +3263,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimUniq_ vimUniq hi def link vimUniqBang vimBang hi def link vimUniqOptions Special + hi def link vimUniqPattern Regexp hi def link vimUnlet vimCommand hi def link vimUnletBang vimBang hi def link vimUnlockvar vimCommand @@ -3274,6 +3291,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimVimgrepadd_ vimVimgrepadd hi def link vimVimgrepBang vimBang hi def link vimVimgrepFlags Special + hi def link vimVimgrepPattern Regexp hi def link vimVimVar Identifier hi def link vimVimVarName Identifier hi def link vimWarn WarningMsg diff --git a/runtime/syntax/testdir/dumps/vim9_expressions_10.dump b/runtime/syntax/testdir/dumps/vim9_expressions_10.dump index f5feca5ca2..d83a170c17 100644 --- a/runtime/syntax/testdir/dumps/vim9_expressions_10.dump +++ b/runtime/syntax/testdir/dumps/vim9_expressions_10.dump @@ -10,7 +10,7 @@ @75 |#+0#0000e05&| |I|s@1|u|e| |#|1|4@1|2|3| |(|v|i|m|.|v|i|m|:| |O|p|t| |o|u|t| |o|f| |v|i|m|S|e|a|r|c|h|*|)| +0#0000000&@27 @75 -|:|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @66 +|:|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@66 |c+0#af5f00255&|o|n|s|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#e000002&|a|l|s|e| +0#0000000&@46 @4|?+0#af5f00255&| +0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&@66 @4|)+0#e000e06&| +0#0000000&@69 diff --git a/runtime/syntax/testdir/dumps/vim9_expressions_11.dump b/runtime/syntax/testdir/dumps/vim9_expressions_11.dump index c9c79a3f11..c8f2831eb2 100644 --- a/runtime/syntax/testdir/dumps/vim9_expressions_11.dump +++ b/runtime/syntax/testdir/dumps/vim9_expressions_11.dump @@ -1,7 +1,7 @@ |e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&@63 @75 |d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65 -@2|:|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @64 +@2|:|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@64 @2|c+0#af5f00255&|o|n|s|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y|:+0#0000000&| |n+0#00e0003&|u|m|b|e|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|f+0#e000002&|a|l|s|e| +0#0000000&@44 @6>?+0#af5f00255&| +0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&@64 @6|)+0#e000e06&| +0#0000000&@67 diff --git a/runtime/syntax/testdir/dumps/vim_ex_catch_00.dump b/runtime/syntax/testdir/dumps/vim_ex_catch_00.dump index de76e72a25..6d4def6440 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_catch_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_catch_00.dump @@ -3,18 +3,18 @@ @75 |"+0#0000e05&| |:|h|e|l|p| |:|c|a|t|c|h| +0#0000000&@60 @75 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|:|I|n|t|e|r@1|u|p|t|$|/+0#e000e06&| +0#0000000&@8|"+0#0000e05&| |c|a|t|c|h| |i|n|t|e|r@1|u|p|t|s| |(|C|T|R|L|-|C|)| +0#0000000&@15 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|\+0#e000e06&|%|(|(+0#0000000&|\|a|\|+|)|\+0#e000e06&|)|\+0#0000000&|=|:|E|/+0#e000e06&| +0#0000000&@4|"+0#0000e05&| |c|a|t|c|h| |a|l@1| |V|i|m| |e|r@1|o|r|s| +0#0000000&@20 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|\+0#e000e06&|%|(|(+0#0000000&|\|a|\|+|)|\+0#e000e06&|)|\+0#0000000&|=|:|/+0#e000e06&| +0#0000000&@5|"+0#0000e05&| |c|a|t|c|h| |e|r@1|o|r|s| |a|n|d| |i|n|t|e|r@1|u|p|t|s| +0#0000000&@13 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|(|w|r|i|t|e|)|:|/+0#e000e06&| +0#0000000&@11|"+0#0000e05&| |c|a|t|c|h| |a|l@1| |e|r@1|o|r|s| |i|n| |:|w|r|i|t|e| +0#0000000&@14 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|\+0#e000e06&|%|(|(+0#0000000&|\|a|\|+|)|\+0#e000e06&|)|\+0#0000000&|=|:|E|1|2|3|:|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|a|t|c|h| |e|r@1|o|r| |E|1|2|3| +0#0000000&@24 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|m+0#0000000&|y|-|e|x|c|e|p|t|i|o|n|/+0#e000e06&| +0#0000000&@11|"+0#0000e05&| |c|a|t|c|h| |u|s|e|r| |e|x|c|e|p|t|i|o|n| +0#0000000&@20 -|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|.+0#0000000&|*|/+0#e000e06&| +0#0000000&@21|"+0#0000e05&| |c|a|t|c|h| |e|v|e|r|y|t|h|i|n|g| +0#0000000&@24 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|:|I|n|t|e|r@1|u|p|t|$|/+0#e000e06&| +0#0000000&@8|"+0#0000e05&| |c|a|t|c|h| |i|n|t|e|r@1|u|p|t|s| |(|C|T|R|L|-|C|)| +0#0000000&@15 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|\+0#e000e06&|%|(|(+0#e000002&|\|a|\|+|)|\+0#e000e06&|)|\+0#e000002&|=|:|E|/+0#e000e06&| +0#0000000&@4|"+0#0000e05&| |c|a|t|c|h| |a|l@1| |V|i|m| |e|r@1|o|r|s| +0#0000000&@20 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|\+0#e000e06&|%|(|(+0#e000002&|\|a|\|+|)|\+0#e000e06&|)|\+0#e000002&|=|:|/+0#e000e06&| +0#0000000&@5|"+0#0000e05&| |c|a|t|c|h| |e|r@1|o|r|s| |a|n|d| |i|n|t|e|r@1|u|p|t|s| +0#0000000&@13 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|(|w|r|i|t|e|)|:|/+0#e000e06&| +0#0000000&@11|"+0#0000e05&| |c|a|t|c|h| |a|l@1| |e|r@1|o|r|s| |i|n| |:|w|r|i|t|e| +0#0000000&@14 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|\+0#e000e06&|%|(|(+0#e000002&|\|a|\|+|)|\+0#e000e06&|)|\+0#e000002&|=|:|E|1|2|3|:|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|a|t|c|h| |e|r@1|o|r| |E|1|2|3| +0#0000000&@24 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|m+0#e000002&|y|-|e|x|c|e|p|t|i|o|n|/+0#e000e06&| +0#0000000&@11|"+0#0000e05&| |c|a|t|c|h| |u|s|e|r| |e|x|c|e|p|t|i|o|n| +0#0000000&@20 +|c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|.+0#e000002&|*|/+0#e000e06&| +0#0000000&@21|"+0#0000e05&| |c|a|t|c|h| |e|v|e|r|y|t|h|i|n|g| +0#0000000&@24 |c+0#af5f00255&|a|t|c|h| +0#0000000&@26|"+0#0000e05&| |s|a|m|e| |a|s| |/|.|*|/| +0#0000000&@28 @75 |"+0#0000e05&| |:|h|e|l|p| |:|t|r|y| +0#0000000&@62 @75 -|t+0#af5f00255&|r|y| +0#0000000&||| |s+0#af5f00255&|l|e@1|p| +0#0000000&|1+0#e000002&|0@1| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|:|I|n|t|e|r@1|u|p|t|$|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@24 -|t+0#af5f00255&|r|y| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|V|i|m|(|e|d|i|t|)|:|E|\|d|\|+|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|e|r@1|o|r|"| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@13 +|t+0#af5f00255&|r|y| +0#0000000&||| |s+0#af5f00255&|l|e@1|p| +0#0000000&|1+0#e000002&|0@1| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|:|I|n|t|e|r@1|u|p|t|$|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@24 +|t+0#af5f00255&|r|y| +0#0000000&||| |e+0#af5f00255&|d|i|t| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|V|i|m|(|e|d|i|t|)|:|E|\|d|\|+|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|e|r@1|o|r|"| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@13 @75 @57|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump index ed60644c8b..040c735b94 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump @@ -15,6 +15,6 @@ @75 |c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|?+0#00e0003&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|T+0#0000001#ffff4012|b| +0#0000000#ffffff0|{+0#e000e06&| +0#0000000&@38 @4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|b|a|n|g|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&|!|"| +0#0000000&@52 -@8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e|(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| @8 +@8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#e000002&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e|(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| @8 |"|•|"|,| |"|g|"|)|/+0#e000e06&|g|e| +0#0000000&@62 @57|1|4|0|,|1| @8|7|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_09.dump b/runtime/syntax/testdir/dumps/vim_ex_command_09.dump index 709a488b79..464d3c61ea 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_09.dump @@ -1,4 +1,4 @@ -| +0&#ffffff0@7|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e|(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| @8 +| +0&#ffffff0@7|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#e000002&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e|(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| @8 |"|•|"|,| |"|g|"|)|/+0#e000e06&|g|e| +0#0000000&@62 @4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 @4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|a|r|g|s|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&@1| +0#0000000&@53 @@ -7,11 +7,11 @@ @8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|!+0#af5f00255&|c+0#00e0e07&|o|l|u|m|n| +0#0000000&|-+0#af5f00255&|t+0#00e0e07&| +0#0000000&|-+0#af5f00255&|s+0#00e0e07&|'+0#0000000&|<+0#e000e06&|a|r|g|s|>|'+0#0000000&| @29 @4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 @4|i+0#af5f00255&|f| +0#0000000&|"+0#e000002&|<|b|a|n|g|>|"| +0#0000000&|=+0#af5f00255&@1| +0#0000000&|"+0#e000002&|!|"| +0#0000000&@52 -@8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|•+0#0000000&|/+0#e000e06&| +0#0000000&|/+0#e000e06&|g|e| +0#0000000&@42 +@8|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|•+0#e000002&|/+0#e000e06&| +0#0000000&|/+0#e000e06&|g|e| +0#0000000&@42 @4|e+0#af5f00255&|n|d|i|f| +0#0000000&@65 |}+0#e000e06&| +0#0000000&@73 @75 -|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|?+0#00e0003&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|T+0#0000001#ffff4012|b| +0#0000000#ffffff0|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e +|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|?+0#00e0003&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|T+0#0000001#ffff4012|b| +0#0000000#ffffff0|:|<+0#e000e06&|l|i|n|e|1|>|,+0#0000000&|<+0#e000e06&|l|i|n|e|2|>|s+0#af5f00255&|/+0#e000e06&|\+0#e000002&|v|"|[|^|"|]|*|"|/+0#e000e06&|\+0#0000000&|=|s|u|b|s|t|i|t|u|t|e |(|s|u|b|m|a|t|c|h|(|0|)|,| |"| |"|,| |"|•|"|,| |"|g|"|)|/+0#e000e06&|g|e| +0#0000000&@43 @75 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_00.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_00.dump index a6984d4c22..d3a9a697a1 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_00.dump @@ -8,8 +8,8 @@ |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 -|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |h+0#af5f00255&|i|d|e| +0#0000000&@13|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@46 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump index f43e9b2644..375ee4ede1 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_02.dump @@ -11,8 +11,8 @@ |:|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -|:|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 -|:|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +|:|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 +|:|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|h+0#af5f00255&|i|d|e| +0#0000000&@13|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 |:|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@45 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump index 381347259a..0ec2ef97de 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_04.dump @@ -9,8 +9,8 @@ |e+0#af5f00255&|c|h|o| +0#0000000&||| |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 -|e+0#af5f00255&|c|h|o| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 +|e+0#af5f00255&|c|h|o| +0#0000000&||| |f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |h+0#af5f00255&|i|d|e| +0#0000000&@13|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 |e+0#af5f00255&|c|h|o| +0#0000000&||| |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump index a05d373930..f18b5757b8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_05.dump @@ -16,5 +16,5 @@ |e+0#af5f00255&|c|h|o| +0#0000000&||| |v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&@10|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39 @75 @75 -|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|@+0#4040ff13&@2 +|a+0#af5f00255&|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|@+0#4040ff13&@2 | +0#0000000&@56|9|1|,|1| @9|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump index afe497e623..909b68b556 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_06.dump @@ -1,4 +1,4 @@ -|a+0#af5f00255#ffffff0|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1 +|a+0#af5f00255#ffffff0|b|o|v|e|l|e|f|t| +0#0000000&|b+0#af5f00255&|e|l|o|w|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1 |e|r|n|/+0#e000e06&| +0#0000000&|h+0#af5f00255&|i|d|e| +0#0000000&|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&|k+0#af5f00255&|e@1|p|j|u|m|p|s| +0#0000000&|k+0#af5f00255&|e@1|p|m|a|r|k|s| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&|l+0#af5f00255&|e|f|t|a|b|o|v|e| +0#0000000&|l+0#af5f00255&|e|g |a|c|y| +0#0000000&|l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&|n+0#af5f00255&|o|a|u|t|o|c|m|d| +0#0000000&|n+0#af5f00255&|o|s|w|a|p|f|i|l|e| +0#0000000&|r+0#af5f00255&|i|g|h|t|b|e|l|o|w| +0#0000000&|s+0#af5f00255&|a|n|d|b|o|x| +0#0000000&|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|t+0#af5f00255&|a|b| +0#0000000&|t+0#af5f00255&|o |p|l|e|f|t| +0#0000000&|u+0#af5f00255&|n|s|i|l|e|n|t| +0#0000000&|v+0#af5f00255&|e|r|b|o|s|e| +0#0000000&|v+0#af5f00255&|e|r|t|i|c|a|l| +0#0000000&|v+0#af5f00255&|i|m|9|c|m|d| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@24 @@ -7,8 +7,8 @@ @6|\+0#e000e06&| +0#0000000&|b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@58 @6|\+0#e000e06&| +0#0000000&|b+0#af5f00255&|r|o|w|s|e| +0#0000000&@60 @6|\+0#e000e06&| +0#0000000&|c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@59 -@6|\+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@49 -@6|\+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@49 +@6|\+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@49 +@6|\+0#e000e06&| +0#0000000&|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@49 @6|\+0#e000e06&| +0#0000000&|h+0#af5f00255&|i|d|e| +0#0000000&@62 @6|\+0#e000e06&| +0#0000000&|h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@56 @6|\+0#e000e06&| +0#0000000&|k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@59 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump index 1a20520f3b..7ab18fffd3 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_08.dump @@ -2,8 +2,8 @@ |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 ->f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 +>f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 |h+0#af5f00255&|i|d|e| +0#0000000&@13|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 |k+0#af5f00255&|e@1|p|a|l|t| +0#0000000&@10|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@49 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump index 12ee320eb6..0a04d9596f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_09.dump @@ -13,8 +13,8 @@ |b+0#af5f00255&|o|t|r|i|g|h|t| +0#0000000&@9|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 |b+0#af5f00255&|r|o|w|s|e| +0#0000000&@11|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 |c+0#af5f00255&|o|n|f|i|r|m| +0#0000000&@10|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 -|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 |h+0#af5f00255&|i|d|e| +0#0000000&@13|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 |h+0#af5f00255&|o|r|i|z|o|n|t|a|l| +0#0000000&@7|:|4+0#e000002&|2|p+0#af5f00255&|r|i|n|t| +0#0000000&@48 @57|1|6|0|,|1| @8|5|1|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump index e46b54724d..cbdac312ea 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_11.dump @@ -8,7 +8,7 @@ @75 |l+0#af5f00255&|o|c|k|m|a|r|k|s| +0#0000000&|'+0#e000002&|[|,+0#0000000&|'+0#e000002&|]|d+0#af5f00255&| +0#0000000&|_+0#e000002&| +0#0000000&@56 @75 -|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&|%+0#e000002&|s+0#af5f00255&|/+0#e000e06&|\+0#0000000&|v|^|%|(|%|(@1|[|=|`|:|.|'|"|~|^|_|*|+|#|-|]|)|\|1|+|\|n|)|?|.|{|1|,|2|}|\|n|(|[|=|`|:|.|'|"|~|^|_|*|+ +|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|k+0#af5f00255&|e@1|p@1|a|t@1|e|r|n|s| +0#0000000&|%+0#e000002&|s+0#af5f00255&|/+0#e000e06&|\+0#e000002&|v|^|%|(|%|(@1|[|=|`|:|.|'|"|~|^|_|*|+|#|-|]|)|\|1|+|\|n|)|?|.|{|1|,|2|}|\|n|(|[|=|`|:|.|'|"|~|^|_|*|+ |#|-|]|)|\|2|+|)|||%|(|%|(@1|[|=|`|:|.|'@1|"|~|^|_|*|+|#|-|]|)|\|3|{|2|,|}|\|n|)|?|.|{|3|,|}|\|n|(|[|=|`|:|.|'@1|"|~|^|_|*|+|#|-|]|)|\|4|{|2|,|}|)|$|/+0#e000e06& |\+0#0000000&|=|c|l|o|s|u|r|e|.|P|r|o|c|e|s@1|(|s|u|b|m|a|t|c|h|(|0|)@1|/+0#e000e06&|g|n| +0#0000000&@41 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump index 70a17b4d38..5889c87737 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_14.dump @@ -6,15 +6,15 @@ @2>s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@53 @2|s+0#af5f00255&|i|l|e|n|t|!| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@51 @75 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#af5f00255&|o|p|y| +0#0000000&@53 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#af5f00255&|o|p|y| +0#0000000&@51 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@48 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@51 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@49 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@53 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|c+0#af5f00255&|o|p|y| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@48 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 @57|2|4|8|,|3| @8|8|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump index f7f9d024f2..99b759a237 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_15.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@1|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@49 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y| @53 -@2>f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y| @51 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y|!+0#af5f00255&| +0#0000000&@52 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y|!+0#af5f00255&| +0#0000000&@50 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@48 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| |g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p|a|t@1|e|r|n| @2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +| +0&#ffffff0@1|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|C|o|p|y| @53 +@2>f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|C|o|p|y| @51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|C|o|p|y|!+0#af5f00255&| +0#0000000&@52 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|C|o|p|y|!+0#af5f00255&| +0#0000000&@50 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@48 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|p+0#e000002&|a|t@1|e|r|n| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 @75 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@51 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|o|p|y| +0#0000000&@49 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|o|p|y| +0#0000000&@51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|o|p|y| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 @57|2|6@1|,|3| @8|8|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump index f26a2f5f19..4e34c1eb6e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_command_modifiers_16.dump @@ -1,20 +1,20 @@ -| +0&#ffffff0@1|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@49 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@47 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@42 -@2>f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@49 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@47 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@42 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y| @51 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y| @49 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y|!+0#af5f00255&| +0#0000000&@50 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y|!+0#af5f00255&| +0#0000000&@48 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 -@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 +| +0&#ffffff0@1|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|c+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@47 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|c+0#00e0e07&|o|p|y|(+0#e000e06&|)| +0#0000000&@42 +@2>f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y|(+0#e000e06&|)| +0#0000000&@47 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|c+0#af5f00255&|a|l@1| +0#0000000&|C|o|p|y|(+0#e000e06&|)| +0#0000000&@42 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y| @51 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y| @49 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y|!+0#af5f00255&| +0#0000000&@50 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y|!+0#af5f00255&| +0#0000000&@48 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@46 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|C|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@44 +@2|f+0#af5f00255&|i|l|t|e|r| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@2|g+0#00e0e07&|:|C+0#0000000&|o|p|y| |=+0#af5f00255&| +0#0000000&|9+0#e000002&@1| +0#0000000&@42 @75 @2|s+0#af5f00255&|i|l|e|n|t| +0#0000000&|w+0#af5f00255&|i|n|c|m|d| +0#0000000&|=| @57 @57|2|8|4|,|3| @8|9|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_00.dump b/runtime/syntax/testdir/dumps/vim_ex_def_00.dump index 2f87f33053..105960c0c4 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_def_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_def_00.dump @@ -5,7 +5,7 @@ @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 +|d+0#af5f00255&|e|f| +0#0000000&|/+0#af5f00255&|F+0#e000002&|o@1|.|*| +0#0000000&@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 diff --git a/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump b/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump index cbf57d74a4..c424601b3e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_def_fold_00.dump @@ -7,7 +7,7 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&@69 | +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1| @65 -| +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&|/+0#af5f00255&|F+0#0000000&|o@1|.|*| @62 +| +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&|/+0#af5f00255&|F+0#e000002&|o@1|.|*| +0#0000000&@62 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 | +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@59 diff --git a/runtime/syntax/testdir/dumps/vim_ex_filter_00.dump b/runtime/syntax/testdir/dumps/vim_ex_filter_00.dump index 0aaf0eb6a0..66029a2424 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_filter_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_filter_00.dump @@ -2,17 +2,17 @@ |"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|C|m|d|S|e|p| |O|p|e|r|a|t|o|r| +0#0000000&@31 @75 @75 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @1|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@44 -|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @1|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@44 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@1|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@44 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@1|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@44 @75 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 -|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 @75 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|!+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|!+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 -|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|!+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|!+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|!+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|!+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|!+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|!+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&@43 @75 -|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@29 -|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@29 +|f+0#af5f00255&|i|l|t|e|r| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@29 +|f+0#af5f00255&|i|l|t|e|r|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|o+0#af5f00255&|l|d|f|i|l|e|s| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@29 @75 |~+0#4040ff13&| @73 |~| @73 diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_00.dump b/runtime/syntax/testdir/dumps/vim_ex_function_00.dump index e6f67d5b30..a493e54a14 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_function_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_function_00.dump @@ -5,7 +5,7 @@ @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 +|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|/+0#af5f00255&|F+0#e000002&|o@1|.|*| +0#0000000&@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 diff --git a/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump b/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump index 4fa7e437ae..322ca7ee96 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_function_fold_00.dump @@ -7,7 +7,7 @@ | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&@64 | +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1| @60 -| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|/+0#af5f00255&|F+0#0000000&|o@1|.|*| @57 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|/+0#af5f00255&|F+0#e000002&|o@1|.|*| +0#0000000&@57 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 | +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51 | +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@54 diff --git a/runtime/syntax/testdir/dumps/vim_ex_global_00.dump b/runtime/syntax/testdir/dumps/vim_ex_global_00.dump index 1996e7c0ee..46b1158a30 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_global_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_global_00.dump @@ -1,20 +1,20 @@ >"+0#0000e05#ffffff0| |V|i|m| |:|g|l|o|b|a|l| |a|n|d| |:|v| |c|o|m@1|a|n|d|s| +0#0000000&@45 @75 @75 -|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@53 -|g+0#af5f00255&|l|o|b|a|l|!|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 -|v+0#af5f00255&|g|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@53 +|g+0#af5f00255&|l|o|b|a|l|!|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|v+0#af5f00255&|g|l|o|b|a|l|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 @75 -|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@1|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 -|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 -|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@1|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 @75 |"+0#0000e05&| |d|o|c|s| |s|t|a|t|e| |!| |i|s| |n|o|t| |a|l@1|o|w|e|d| |a|s| |t|h|e| |d|e|l|i|m|i|t|e|r| |b|u|t| |i|t| |w|o|r|k|s| +0#0000000&@15 -|g+0#af5f00255&|l|o|b|a|l|!|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 -|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|g+0#af5f00255&|l|o|b|a|l|!|!+0#e000e06&|f+0#e000002&|o@1|!+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@52 +|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#e000002&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 @75 |"+0#0000e05&| |c|o|m@1|a|n|d| |w|i|t|h| |r|a|n|g|e| +0#0000000&@54 -|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#0000000&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#0000000&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@55 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#e000002&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#e000002&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@55 @75 |"+0#0000e05&| |r|e|c|u|r|s|i|v|e| +0#0000000&@63 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_global_01.dump b/runtime/syntax/testdir/dumps/vim_ex_global_01.dump index d7fbc31304..17f18ada5f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_global_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_global_01.dump @@ -1,20 +1,20 @@ -|g+0#af5f00255#ffffff0|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +|g+0#af5f00255#ffffff0|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#e000002&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 @75 |"+0#0000e05&| |c|o|m@1|a|n|d| |w|i|t|h| |r|a|n|g|e| +0#0000000&@54 -|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#0000000&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#0000000&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@55 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#e000002&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#e000002&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@55 @75 >"+0#0000e05&| |r|e|c|u|r|s|i|v|e| +0#0000000&@63 -|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o|u|n|d|/+0#e000e06&|v+0#af5f00255&|/+0#e000e06&|n+0#0000000&|o|t|\+0#e000e06&|%|(|f+0#0000000&|o|u|n|d|\+0#e000e06&|)|/|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@35 +|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#e000002&|o|u|n|d|/+0#e000e06&|v+0#af5f00255&|/+0#e000e06&|n+0#e000002&|o|t|\+0#e000e06&|%|(|f+0#e000002&|o|u|n|d|\+0#e000e06&|)|/|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@35 @75 @75 |d+0#af5f00255&|e|f| +0#0000000&|V|i|m|9|C|o|n|t|e|x|t|(+0#e000e06&|)| +0#0000000&@57 -@2|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@51 -@2|g+0#af5f00255&|l|o|b|a|l|!|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 -@2|v+0#af5f00255&|g|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@51 +@2|g+0#af5f00255&|l|o|b|a|l|!|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|v+0#af5f00255&|g|l|o|b|a|l|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 @75 -@2|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@1|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 -@2|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 -@2|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@2|g+0#af5f00255&|l|o|b|a|l| +0#0000000&@1|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@2|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@2|v+0#af5f00255&|g|l|o|b|a|l| +0#0000000&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 @75 @2|#+0#0000e05&| |d|o|c|s| |s|t|a|t|e| |!| |i|s| |n|o|t| |a|l@1|o|w|e|d| |a|s| |t|h|e| |d|e|l|i|m|i|t|e|r| |b|u|t| |i|t| |w|o|r|k|s| +0#0000000&@13 @57|1|9|,|1| @9|5|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_global_02.dump b/runtime/syntax/testdir/dumps/vim_ex_global_02.dump index 6951ede51c..4025582f0f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_global_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_global_02.dump @@ -1,12 +1,12 @@ | +0&#ffffff0@1|#+0#0000e05&| |d|o|c|s| |s|t|a|t|e| |!| |i|s| |n|o|t| |a|l@1|o|w|e|d| |a|s| |t|h|e| |d|e|l|i|m|i|t|e|r| |b|u|t| |i|t| |w|o|r|k|s| +0#0000000&@13 -@2|g+0#af5f00255&|l|o|b|a|l|!|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 -@2|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#0000000&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 +@2|g+0#af5f00255&|l|o|b|a|l|!|!+0#e000e06&|f+0#e000002&|o@1|!+0#e000e06&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@50 +@2|g+0#af5f00255&|l|o|b|a|l|!| +0#0000000&|!+0#e000e06&|f+0#e000002&|o@1|!+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@48 @75 @2|#+0#0000e05&| |c|o|m@1|a|n|d| |w|i|t|h| |r|a|n|g|e| +0#0000000&@52 -@2>g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#0000000&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#0000000&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@53 +@2>g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|.+0#e000002&|/+0#e000e06&|.+0#e000002&|,+0#0000000&|/+0#e000e06&|^+0#e000002&|$|/+0#e000e06&|j+0#af5f00255&|o|i|n| +0#0000000&@53 @75 @2|#+0#0000e05&| |r|e|c|u|r|s|i|v|e| +0#0000000&@61 -@2|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#0000000&|o|u|n|d|/+0#e000e06&|v+0#af5f00255&|/+0#e000e06&|n+0#0000000&|o|t|\+0#e000e06&|%|(|f+0#0000000&|o|u|n|d|\+0#e000e06&|)|/|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@33 +@2|g+0#af5f00255&|l|o|b|a|l|/+0#e000e06&|f+0#e000002&|o|u|n|d|/+0#e000e06&|v+0#af5f00255&|/+0#e000e06&|n+0#e000002&|o|t|\+0#e000e06&|%|(|f+0#e000002&|o|u|n|d|\+0#e000e06&|)|/|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@33 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 @75 |~+0#4040ff13&| @73 diff --git a/runtime/syntax/testdir/dumps/vim_ex_helpgrep_00.dump b/runtime/syntax/testdir/dumps/vim_ex_helpgrep_00.dump index 1e4b383439..ed5ee17bca 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_helpgrep_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_helpgrep_00.dump @@ -1,20 +1,20 @@ >"+0#0000e05#ffffff0| |V|i|m| |:|h|e|l|p|g|r|e|p| |c|o|m@1|a|n|d| +0#0000000&@51 -|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|H|e|l|p|g|r|e|p|P|a|t@1|e|r|n| |T|o|d|o| +0#0000000&@26 @75 @75 -|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|e|l|p| +0#0000000#ffffff0@60 -|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|e|l|p|@+0#e000e06#ffffff0|e|n| +0#0000000&@57 -|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|\+0#e000e06#ffffff0|%|(|e+0#0000001#ffff4012|l|p|\+0#e000e06#ffffff0|)|\+0#0000001#ffff4012|=| +0#0000000#ffffff0@53 +|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|e|l|p| +0#0000000&@60 +|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|e|l|p|@+0#e000e06&|e|n| +0#0000000&@57 +|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|\+0#e000e06&|%|(|e+0#e000002&|l|p|\+0#e000e06&|)|\+0#e000002&|=| +0#0000000&@53 @75 -|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|e|l|p| +0#0000000#ffffff0@59 -|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|e|l|p|@+0#e000e06#ffffff0|e|n| +0#0000000&@56 -|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|\+0#e000e06#ffffff0|%|(|e+0#0000001#ffff4012|l|p|\+0#e000e06#ffffff0|)|\+0#0000001#ffff4012|=| +0#0000000#ffffff0@52 +|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|e|l|p| +0#0000000&@59 +|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|e|l|p|@+0#e000e06&|e|n| +0#0000000&@56 +|l+0#af5f00255&|h|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|\+0#e000e06&|%|(|e+0#e000002&|l|p|\+0#e000e06&|)|\+0#e000002&|=| +0#0000000&@52 @75 @75 |"+0#0000e05&| |n|o| |t|a|i|l| |c|o|m@1|e|n|t| |o|r| |t|r|a|i|l|i|n|g| |b|a|r| +0#0000000&@41 @75 -|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|e|l|p| |"| |n|o|t| |a| |c|o|m@1|e|n|t| +0#0000000#ffffff0@44 -|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#0000001#ffff4012|h|e|l|p| ||| |n|o|t| |a| |c|o|m@1|a|n|d| +0#0000000#ffffff0@44 +|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|e|l|p| |"| |n|o|t| |a| |c|o|m@1|e|n|t| +0#0000000&@44 +|h+0#af5f00255&|e|l|p|g|r|e|p| +0#0000000&|:+0#e000002&|h|e|l|p| ||| |n|o|t| |a| |c|o|m@1|a|n|d| +0#0000000&@44 @75 |~+0#4040ff13&| @73 +|~| @73 | +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/runtime/syntax/testdir/dumps/vim_ex_match_00.dump b/runtime/syntax/testdir/dumps/vim_ex_match_00.dump index c36c8b08a7..24683d5bc3 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_match_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_match_00.dump @@ -1,19 +1,19 @@ >"+0#0000e05#ffffff0| |V|i|m| |:|m|a|t|c|h| |c|o|m@1|a|n|d| +0#0000000&@54 @75 @75 -|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@54 +|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@54 |m+0#af5f00255&|a|t|c|h| +0#0000000&@69 |m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@64 @75 -|1+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@53 +|1+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@53 |1+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 |1+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@63 @75 -|2+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@53 +|2+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@53 |2+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 |2+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@63 @75 -|3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@53 +|3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@53 |3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 |3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@63 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_match_01.dump b/runtime/syntax/testdir/dumps/vim_ex_match_01.dump index cfdaacb319..4e2c91a3dc 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_match_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_match_01.dump @@ -1,12 +1,12 @@ |2+0#e000002#ffffff0|m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@63 @75 -|3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@53 +|3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@53 |3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&@68 |3+0#e000002&|m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@63 > @74 -|1+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 -|2+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 -|3+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 +|1+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@52 +|2+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@52 +|3+0#e000002&| +0#0000000&|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@52 @75 @75 |"+0#0000e05&| |D|i|f@1|e|r|e|n|t|i|a|t|e| |m|a|t|c|h|(|)| |f|r|o|m| |:|m|a|t|c|h| +0#0000000&@39 diff --git a/runtime/syntax/testdir/dumps/vim_ex_match_02.dump b/runtime/syntax/testdir/dumps/vim_ex_match_02.dump index 1a8e7b65a3..688df7cbe3 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_match_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_match_02.dump @@ -5,14 +5,14 @@ |"+0#0000e05&| |C|o|n|t|a|i|n|i|n|g| |f|u|n|c|t|i|o|n|s| +0#0000000&@52 > @74 |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 -@2|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 +@2|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@52 @2|c+0#af5f00255&|a|l@1| +0#0000000&|m+0#00e0e07&|a|t|c|h|(+0#e000e06&|h+0#00e0e07&|a|y|s|t|a|c|k|,+0#0000000&| |'+0#e000002&|n|e@1|d|l|e|'|)+0#e000e06&| +0#0000000&@42 @2|c+0#af5f00255&|a|l@1| +0#0000000&|m+0#00e0e07&|a|t|c|h| +0#0000000&|(+0#e000e06&|h+0#00e0e07&|a|y|s|t|a|c|k|,+0#0000000&| |'+0#e000002&|n|e@1|d|l|e|'|)+0#e000e06&| +0#0000000&@41 |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 @2|#+0#0000e05&| |c|o|m@1|a|n|d| +0#0000000&@63 -@2|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@52 +@2|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@52 @2|#+0#0000e05&| +0#0000000&|E+0#e000e06&|r@1|o|r|:| +0#0000e05&|b|a|d| |:|m|a|t|c|h| |c|o|m@1|a|n|d| |-| |t|r|a|i|l|i|n|g| |c|h|a|r|a|c|t|e|r|s| +0#0000000&@23 @2|m+0#af5f00255&|a|t|c|h| +0#0000000&|(+0#e000e06&|h+0#00e0e07&|a|y|s|t|a|c|k|,+0#0000000&| |'+0#e000002&|n|e@1|d|l|e|'|)+0#e000e06&| +0#0000000&@46 @2|#+0#0000e05&| |f|u|n|c|t|i|o|n| +0#0000000&@62 diff --git a/runtime/syntax/testdir/dumps/vim_ex_match_03.dump b/runtime/syntax/testdir/dumps/vim_ex_match_03.dump index 002bbf6406..3385420188 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_match_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_match_03.dump @@ -5,11 +5,11 @@ @75 >"+0#0000e05&| |T|r|a|i|l|i|n|g| |b|a|r| |a|n|d| |c|o|m@1|e|n|t|s| +0#0000000&@47 @75 -|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41 +|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41 |m+0#af5f00255&|a|t|c|h| +0#0000000&@15||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41 |m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@10||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@41 @75 -|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@44 +|m+0#af5f00255&|a|t|c|h| +0#0000000&|F+0#00e0003&|o@1|G|r|o|u|p| +0#0000000&|/+0#e000e06&|F+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@44 |m+0#af5f00255&|a|t|c|h| +0#0000000&@15|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@44 |m+0#af5f00255&|a|t|c|h| +0#0000000&|n+0#00e0003&|o|n|e| +0#0000000&@10|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@44 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_01.dump b/runtime/syntax/testdir/dumps/vim_ex_range_01.dump index 6ba41bef14..a42794fc64 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_01.dump @@ -16,5 +16,5 @@ |'+0#e000002&|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 |'+0#e000002&|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 |'+0#e000002&|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@67 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 @57|1|9|,|1| @10|0|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_02.dump b/runtime/syntax/testdir/dumps/vim_ex_range_02.dump index d4462bd6a1..1fed5525b8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_02.dump @@ -1,5 +1,5 @@ -|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 -|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 +|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |:|\+0#e000002&|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |:|\+0#e000002&|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |:|\+0#e000002&|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_05.dump b/runtime/syntax/testdir/dumps/vim_ex_range_05.dump index f143082fe0..d12cf38350 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_05.dump @@ -1,6 +1,6 @@ |'+0#e000002#ffffff0|.|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 -|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 |:|\+0#e000002&|/|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 |:|\+0#e000002&|?|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 >:|\+0#e000002&|&|,+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_06.dump b/runtime/syntax/testdir/dumps/vim_ex_range_06.dump index 5e0780a6f0..c7aca984dc 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_06.dump @@ -15,6 +15,6 @@ |'+0#e000002&|"|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 |'+0#e000002&|^|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 |'+0#e000002&|.|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@66 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 -|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 @57|1|0|9|,|1| @9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_07.dump b/runtime/syntax/testdir/dumps/vim_ex_range_07.dump index ff51a38f59..04d5704491 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_07.dump @@ -1,4 +1,4 @@ -|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 +|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@58 |:|\+0#e000002&|/|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 |:|\+0#e000002&|?|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 |:|\+0#e000002&|&|;+0#0000001#ffff4012|p+0#af5f00255#ffffff0|r|i|n|t| +0#0000000&@65 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_08.dump b/runtime/syntax/testdir/dumps/vim_ex_range_08.dump index c54a2ba02d..acfcf02ab9 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_08.dump @@ -15,6 +15,6 @@ |,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 -|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 -|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 @57|1|4|5|,|1| @9|7|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_09.dump b/runtime/syntax/testdir/dumps/vim_ex_range_09.dump index fbace495a1..c3871e3767 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_09.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_09.dump @@ -1,4 +1,4 @@ -|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 |,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_10.dump b/runtime/syntax/testdir/dumps/vim_ex_range_10.dump index 01ca2d7d73..c15274e203 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_10.dump @@ -13,8 +13,8 @@ |;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 -|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 -|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 +|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 |;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 |;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 @57|1|8|1|,|1| @9|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_12.dump b/runtime/syntax/testdir/dumps/vim_ex_range_12.dump index 5d3efa1e88..802766ff04 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_12.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_12.dump @@ -11,8 +11,8 @@ |.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 -|.+0#e000002&|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|.+0#e000002&|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 |.+0#e000002&|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_14.dump b/runtime/syntax/testdir/dumps/vim_ex_range_14.dump index db82c4d822..5db8181529 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_14.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_14.dump @@ -9,8 +9,8 @@ |.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 -|.+0#e000002&|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|.+0#e000002&|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|.+0#e000002&|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 |.+0#e000002&|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 |.+0#e000002&|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@65 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_16.dump b/runtime/syntax/testdir/dumps/vim_ex_range_16.dump index fa0630ef7a..d3e9061192 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_16.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_16.dump @@ -2,7 +2,7 @@ @75 |:|-+0#00e0003&|1@1|;+0#0000001#ffff4012|++0#00e0003#ffffff0|1| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@61 |:|-+0#00e0003&@10|,+0#0000001#ffff4012|-+0#00e0003#ffffff0|1|0| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@52 -|:|?+0#e000e06&|E+0#0000000&|a|c|h| |l|i|n|e|?+0#e000e06&|-+0#00e0003&|;+0#0000001#ffff4012|++0#00e0003#ffffff0| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@53 +|:|?+0#e000e06&|E+0#e000002&|a|c|h| |l|i|n|e|?+0#e000e06&|-+0#00e0003&|;+0#0000001#ffff4012|++0#00e0003#ffffff0| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@53 >:|'+0#e000002&|{|++0#00e0003&|,+0#0000001#ffff4012|'+0#e000002#ffffff0|{|++0#00e0003&|2| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |:|'+0#e000002&|{|++0#00e0003&|1|;+0#0000001#ffff4012|'+0#e000002#ffffff0|)|-+0#00e0003&|1| +0#0000000&|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 @75 @@ -14,7 +14,7 @@ |4+0#e000002&|2| +0#0000000&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@64 |4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@61 |4+0#e000002&|2| +0#0000000&|1+0#00e0003&|3|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@58 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 -|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@54 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@44 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@57 +|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@54 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|1+0#00e0003&|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@44 @57|2|8|9|,|1| @8|1|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_17.dump b/runtime/syntax/testdir/dumps/vim_ex_range_17.dump index 98addcecfb..4c56ec2ae8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_17.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_17.dump @@ -1,4 +1,4 @@ -|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@44 +|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|1+0#00e0003&|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@44 |*+0#e000002&|1+0#00e0003&|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@66 @75 |"+0#0000e05&| |,| |s|e|p|a|r|a|t|o|r| +0#0000000&@61 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_18.dump b/runtime/syntax/testdir/dumps/vim_ex_range_18.dump index 01cc55c6b3..ede0e104b8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_18.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_18.dump @@ -9,8 +9,8 @@ |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 -|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 -|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_20.dump b/runtime/syntax/testdir/dumps/vim_ex_range_20.dump index ddc973e0d2..dd9bbc1e82 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_20.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_20.dump @@ -7,8 +7,8 @@ |.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|"|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|^|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|'+0#e000002#ffffff0|.|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 -|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 -|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|/|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|?|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|,+0#0000001#ffff4012|\+0#e000002#ffffff0|&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_22.dump b/runtime/syntax/testdir/dumps/vim_ex_range_22.dump index bebdd2dc3b..ca34d44454 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_22.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_22.dump @@ -7,8 +7,8 @@ |.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 -|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 -|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|++0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 |.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 |.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 |.+0#e000002&|++0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_24.dump b/runtime/syntax/testdir/dumps/vim_ex_range_24.dump index 9b6a4ad1fa..32a72aad7e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_24.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_24.dump @@ -5,8 +5,8 @@ |.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|"|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 >.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|^|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 |.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|'+0#e000002#ffffff0|.|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@59 -|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 -|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 +|.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&|-+0#00e0003&|1|3|p+0#af5f00255&|r|i|n|t| +0#0000000&@51 |.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|/|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 |.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|?|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 |.+0#e000002&|-+0#00e0003&|1|3|;+0#0000001#ffff4012|\+0#e000002#ffffff0|&|p+0#af5f00255&|r|i|n|t| +0#0000000&@62 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_26.dump b/runtime/syntax/testdir/dumps/vim_ex_range_26.dump index 803a16f0f8..8cfa136e00 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_26.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_26.dump @@ -6,10 +6,10 @@ >'+0#e000002&|"| +0#0000000&@72 |'+0#e000002&|^| +0#0000000&@72 |'+0#e000002&|.| +0#0000000&@72 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@64 -|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @65 -|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@64 -|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @65 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&| +0#0000000&@64 +|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&| +0#0000000&@64 +|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r| +0#0000000&@65 |:|\+0#e000002&|/| +0#0000000&@71 |:|\+0#e000002&|?| +0#0000000&@71 |:|\+0#e000002&|&| +0#0000000&@71 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_28.dump b/runtime/syntax/testdir/dumps/vim_ex_range_28.dump index f0d427200d..312b70ef0d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_28.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_28.dump @@ -6,10 +6,10 @@ >:|'+0#e000002&|"| +0#0000000&@71 |:|'+0#e000002&|^| +0#0000000&@71 |:|'+0#e000002&|.| +0#0000000&@71 -|:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@63 -|:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @64 -|:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@63 -|:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @64 +|:|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&| +0#0000000&@63 +|:|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r| +0#0000000&@64 +|:|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&| +0#0000000&@63 +|:|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r| +0#0000000&@64 |:|\+0#e000002&|/| +0#0000000&@71 |:|\+0#e000002&|?| +0#0000000&@71 |:|\+0#e000002&|&| +0#0000000&@71 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_30.dump b/runtime/syntax/testdir/dumps/vim_ex_range_30.dump index 3a6b83ab55..93d73b0342 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_30.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_30.dump @@ -6,10 +6,10 @@ >e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|"| +0#0000000&@59 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|^| +0#0000000&@59 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |'+0#e000002&|.| +0#0000000&@59 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@51 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @52 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@51 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @52 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&| +0#0000000&@51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r| +0#0000000&@52 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&| +0#0000000&@51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r| +0#0000000&@52 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |\+0#e000002&|/| +0#0000000&@59 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |\+0#e000002&|?| +0#0000000&@59 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |\+0#e000002&|&| +0#0000000&@59 diff --git a/runtime/syntax/testdir/dumps/vim_ex_range_32.dump b/runtime/syntax/testdir/dumps/vim_ex_range_32.dump index 115d9c4d70..7cbcd74e40 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_range_32.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_range_32.dump @@ -6,10 +6,10 @@ >e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|"| +0#0000000&@58 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|^| +0#0000000&@58 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|'+0#e000002&|.| +0#0000000&@58 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@50 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|/+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|/|b+0#0000000&|a|r| @51 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r|?+0#e000e06&| +0#0000000&@50 -|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|?+0#e000e06&|f+0#0000000&|o@1|\+0#e000e06&|?|b+0#0000000&|a|r| @51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r|/+0#e000e06&| +0#0000000&@50 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|/+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|/|b+0#e000002&|a|r| +0#0000000&@51 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r|?+0#e000e06&| +0#0000000&@50 +|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|?+0#e000e06&|f+0#e000002&|o@1|\+0#e000e06&|?|b+0#e000002&|a|r| +0#0000000&@51 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|\+0#e000002&|/| +0#0000000&@58 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|\+0#e000002&|?| +0#0000000&@58 |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&||| |:|\+0#e000002&|&| +0#0000000&@58 diff --git a/runtime/syntax/testdir/dumps/vim_ex_sort_00.dump b/runtime/syntax/testdir/dumps/vim_ex_sort_00.dump index e44a78c109..f571829e32 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_sort_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_sort_00.dump @@ -8,13 +8,13 @@ |s+0#af5f00255&|o|r|t| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&@65 |s+0#af5f00255&|o|r|t|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@65 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 @75 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_sort_01.dump b/runtime/syntax/testdir/dumps/vim_ex_sort_01.dump index a8b105d474..955beae888 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_sort_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_sort_01.dump @@ -1,11 +1,11 @@ -|s+0#af5f00255#ffffff0|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255#ffffff0|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 > @74 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@49 @75 |s+0#af5f00255&|o|r|t| +0#0000000&@1|n+0#e000e06&|i|l|u| +0#0000000&@64 |s+0#af5f00255&|o|r|t|!| +0#0000000&|n+0#e000e06&|i|l|u| +0#0000000&@64 diff --git a/runtime/syntax/testdir/dumps/vim_ex_sort_02.dump b/runtime/syntax/testdir/dumps/vim_ex_sort_02.dump index ce5dc8dea8..b93edba876 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_sort_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_sort_02.dump @@ -1,20 +1,20 @@ |s+0#af5f00255#ffffff0|o|r|t|!| +0#0000000&|b+0#e000e06&|i|l|u| +0#0000000&@64 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|n+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|n+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#e000e06&|i|l|u| +0#0000000&@49 ->s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|x+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|x+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|o+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|o+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#e000e06&|i|l|u| +0#0000000&@49 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|n+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|n+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#e000e06&|i|l|u| +0#0000000&@49 +>s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|x+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|x+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|o+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|o+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#e000e06&|i|l|u| +0#0000000&@49 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#e000e06&|i|l|u| +0#0000000&@49 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|n|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|n|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|f|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|f|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|x|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|x|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|n|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|n|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|f|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|f|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|x|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|x|i|l|u| +0#0000000&@48 @57|3|7|,|1| @9|6|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_sort_03.dump b/runtime/syntax/testdir/dumps/vim_ex_sort_03.dump index a5f9960652..eeb43ea513 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_sort_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_sort_03.dump @@ -1,17 +1,17 @@ -|s+0#af5f00255#ffffff0|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|x|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|o|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|o|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|b|i|l|u| +0#0000000&@48 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|b|i|l|u| +0#0000000&@48 +|s+0#af5f00255#ffffff0|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|x|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|o|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|o|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|b|i|l|u| +0#0000000&@48 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|b|i|l|u| +0#0000000&@48 > @74 |s+0#af5f00255&|o|r|t| +0#0000000&@1||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 |s+0#af5f00255&|o|r|t|!| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 @75 -|s+0#af5f00255&|o|r|t| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 -|s+0#af5f00255&|o|r|t|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|s+0#af5f00255&|o|r|t| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|s+0#af5f00255&|o|r|t|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 @75 |~+0#4040ff13&| @73 |~| @73 diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump index 08ab0b29e8..8e0bbd707d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump @@ -1,20 +1,20 @@ >"+0#0000e05#ffffff0| |V|i|m| |:|s|u|b|s|t|i|t|u|t|e| |c|o|m@1|a|n|d| +0#0000000&@49 @75 @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&@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 +|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#e000002&|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#e000002&|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 +|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#e000002&|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#e000002&|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 +|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#e000002&|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#e000002&|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 +|:|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#e000002&|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#e000002&|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 +|:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#e000002&|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#e000002&|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#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@57 @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 index 763a0f889e..2c599dc543 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump @@ -1,19 +1,19 @@ -|:+0&#ffffff0|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 +|:+0&#ffffff0|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#e000002&|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 +|:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#e000002&|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#e000002&|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 +>:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#e000002&|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#e000002&|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 +|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#e000002&|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#e000002&|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 +|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#e000002&|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#e000002&|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 +|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#e000002&|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#e000002&|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+0#00e0e07&|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 diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump index a5432760af..6e2e7dffbc 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump @@ -1,20 +1,20 @@ | +0&#ffffff0@74 |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 -@2|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 +@2|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#e000002&|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+0#00e0e07&|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 > @74 |d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65 -@2|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 +@2|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#e000002&|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+0#00e0e07&|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 @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 +|s+0#af5f00255&|!+0#e000e06&|/+0#e000002&|!+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#e000002&|#+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#e000002&|$+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#e000002&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57 @57|3|7|,|0|-|1| @7|1|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump index b904836f76..e39edb7fe8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump @@ -1,20 +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 -|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 +|s+0#af5f00255#ffffff0|%+0#e000e06&|/+0#e000002&|%+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#e000002&|&+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#e000002&|'+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#e000002&|(+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#e000002&|)+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#e000002&|*+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#e000002&|++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#e000002&|,+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#e000002&|-+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#e000002&|.+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#e000002&|/+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#e000002&|:+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#e000002&|;+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#e000002&|<+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#e000002&|=+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#e000002&|>+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#e000002&|?+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#e000002&|@+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#e000002&|[+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|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump index d9887a1a4e..fdbe2f2479 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump @@ -1,20 +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#ffffff0|[+0#e000e06&|/+0#e000002&|[+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 -|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#e000002&|]+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#e000002&|^+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#e000002&|_+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#e000002&|`+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#e000002&|{+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 +|s+0#af5f00255&|}+0#e000e06&|/+0#e000002&|}+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#e000002&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57 @75 -|s+0#af5f00255&| +0#0000000&|!+0#e000e06&|/+0#0000000&|!+0#e000e06&|/+0#0000000&@1|!+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|!+0#e000e06&|/+0#e000002&|!+0#e000e06&|/+0#0000000&@1|!+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |"+0#0000e05&| |s| |"+0#e000002&|/|"|/+0#0000e05&@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&@31 -|s+0#af5f00255&| +0#0000000&|#+0#e000e06&|/+0#0000000&|#+0#e000e06&|/+0#0000000&@1|#+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|$+0#e000e06&|/+0#0000000&|$+0#e000e06&|/+0#0000000&@1|$+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|%+0#e000e06&|/+0#0000000&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|&+0#e000e06&|/+0#0000000&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|(+0#e000e06&|/+0#0000000&|(+0#e000e06&|/+0#0000000&@1|(+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|#+0#e000e06&|/+0#e000002&|#+0#e000e06&|/+0#0000000&@1|#+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|$+0#e000e06&|/+0#e000002&|$+0#e000e06&|/+0#0000000&@1|$+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|%+0#e000e06&|/+0#e000002&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|&+0#e000e06&|/+0#e000002&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|'+0#e000e06&|/+0#e000002&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|(+0#e000e06&|/+0#e000002&|(+0#e000e06&|/+0#0000000&@1|(+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 @57|7|3|,|1| @9|3|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump index 693aca0b20..9cffbaf4fe 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0| +0#0000000&|(+0#e000e06&|/+0#0000000&|(+0#e000e06&|/+0#0000000&@1|(+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|,+0#e000e06&|/+0#0000000&|,+0#e000e06&|/+0#0000000&@1|,+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 ->s+0#af5f00255&| +0#0000000&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|.+0#e000e06&|/+0#0000000&|.+0#e000e06&|/+0#0000000&@1|.+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|/+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&@56 -|s+0#af5f00255&| +0#0000000&|:+0#e000e06&|/+0#0000000&|:+0#e000e06&|/+0#0000000&@1|:+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|;+0#e000e06&|/+0#0000000&|;+0#e000e06&|/+0#0000000&@1|;+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|<+0#e000e06&|/+0#0000000&|<+0#e000e06&|/+0#0000000&@1|<+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|=+0#e000e06&|/+0#0000000&|=+0#e000e06&|/+0#0000000&@1|=+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|>+0#e000e06&|/+0#0000000&|>+0#e000e06&|/+0#0000000&@1|>+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|?+0#e000e06&|/+0#0000000&|?+0#e000e06&|/+0#0000000&@1|?+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|@+0#e000e06&|/+0#0000000&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|[+0#e000e06&|/+0#0000000&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255#ffffff0| +0#0000000&|(+0#e000e06&|/+0#e000002&|(+0#e000e06&|/+0#0000000&@1|(+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|)+0#e000e06&|/+0#e000002&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|*+0#e000e06&|/+0#e000002&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|++0#e000e06&|/+0#e000002&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|,+0#e000e06&|/+0#e000002&|,+0#e000e06&|/+0#0000000&@1|,+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +>s+0#af5f00255&| +0#0000000&|-+0#e000e06&|/+0#e000002&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|.+0#e000e06&|/+0#e000002&|.+0#e000e06&|/+0#0000000&@1|.+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|/+0#e000e06&|X+0#e000002&|/+0#e000e06&|X+0#0000000&@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|:+0#e000e06&|/+0#e000002&|:+0#e000e06&|/+0#0000000&@1|:+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|;+0#e000e06&|/+0#e000002&|;+0#e000e06&|/+0#0000000&@1|;+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|<+0#e000e06&|/+0#e000002&|<+0#e000e06&|/+0#0000000&@1|<+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|=+0#e000e06&|/+0#e000002&|=+0#e000e06&|/+0#0000000&@1|=+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|>+0#e000e06&|/+0#e000002&|>+0#e000e06&|/+0#0000000&@1|>+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|?+0#e000e06&|/+0#e000002&|?+0#e000e06&|/+0#0000000&@1|?+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|@+0#e000e06&|/+0#e000002&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|[+0#e000e06&|/+0#e000002&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |"+0#0000e05&| |s| |\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41 -|s+0#af5f00255&| +0#0000000&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|]+0#e000e06&|/+0#e000002&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|^+0#e000e06&|/+0#e000002&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 @57|9|1|,|1| @9|4|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump index e57047b27a..601badea95 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump @@ -1,10 +1,10 @@ -|s+0#af5f00255#ffffff0| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255#ffffff0| +0#0000000&|^+0#e000e06&|/+0#e000002&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|_+0#e000e06&|/+0#e000002&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|`+0#e000e06&|/+0#e000002&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|{+0#e000e06&|/+0#e000002&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 |"+0#0000e05&| |s| |||/|||/@1||| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41 ->s+0#af5f00255&| +0#0000000&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 -|s+0#af5f00255&| +0#0000000&|~+0#e000e06&|/+0#0000000&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +>s+0#af5f00255&| +0#0000000&|}+0#e000e06&|/+0#e000002&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 +|s+0#af5f00255&| +0#0000000&|~+0#e000e06&|/+0#e000002&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56 @75 |s+0#af5f00255&|/+0#e000e06&@1|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62 |s+0#af5f00255&| +0#0000000&|/+0#e000e06&@1|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@61 diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump index cef4588620..6bc20af05f 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_03.dump @@ -6,15 +6,15 @@ > @74 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|c+0#00e0003&@1|o|m@1|e|n|t| +0#0000000&@54 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|c+0#00e0003&@1|o|m@1|e|n|t| +0#0000000&|F|o@1| @50 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|c+0#00e0003&@1|o|m@1|e|n|t| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n -|"| +0#0000000&@73 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|c+0#00e0003&@1|o|m@1|e|n|t| +0#0000000&|F|o@1| |m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t -@1|e|r|n|"| +0#0000000&@69 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|c+0#00e0003&@1|o|m@1|e|n|t| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n +|"+0#e000e06&| +0#0000000&@73 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|c+0#00e0003&@1|o|m@1|e|n|t| +0#0000000&|F|o@1| |m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t +@1|e|r|n|"+0#e000e06&| +0#0000000&@69 @75 |"+0#0000e05&| |:|s|y|n|-|s|y|n|c|-|f|r|o|m|s|t|a|r|t| +0#0000000&@53 @75 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|f+0#00e0003&|r|o|m|s|t|a|r|t| +0#0000000&@53 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|f+0#00e0003&|r|o|m|s|t|a|r|t| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t@1|e|r -|n|"| +0#0000000&@72 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|f+0#00e0003&|r|o|m|s|t|a|r|t| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t@1|e|r +|n|"+0#e000e06&| +0#0000000&@72 @75 @57|5@1|,|0|-|1| @7|1|3|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump index 0825ee3356..d90b8fd3d8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_04.dump @@ -2,17 +2,17 @@ |"+0#0000e05&| |:|s|y|n|-|s|y|n|c|-|l|i|n|e|b|r|e|a|k|s| +0#0000000&@52 @75 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&@50 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@7 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@7 > @74 |"+0#0000e05&| |:|s|y|n|-|s|y|n|c|-|l|i|n|e|c|o|n|t| +0#0000000&@54 @75 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@44 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&@7 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@44 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&@7 @75 |"+0#0000e05&| |:|s|y|n|-|s|y|n|c|-|(|m|i|n|||m|a|x|)|l|i|n|e|s| +0#0000000&@48 @75 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&@39 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@7 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|i|n|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|m+0#00e0003&|a|x|l|i|n|e|s|=|4+0#e000002&|2| +0#0000000&|l+0#00e0003&|i|n|e|b|r|e|a|k|s|=|1+0#e000002&| +0#0000000&|l+0#00e0003&|i|n|e|c|o|n|t| +0#0000000&|"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@7 |"+0#0000e05&| |o|b|s|o|l|e|t|e| +0#0000000&@64 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|l+0#00e0003&|i|n|e|s|=|4+0#e000002&|2| +0#0000000&@54 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump index 57afb7816a..7ebec8d61d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_05.dump @@ -1,15 +1,15 @@ |"+0#0000e05#ffffff0| |:|s|y|n|-|s|y|n|c| |s|y|n|c| |p|a|t@1|e|r|n|s| +0#0000000&@49 @75 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|h|e|r|e| +0#0000000&@1|t|e|s|t|F|o@1| |"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@14 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|t|h|e|r|e| +0#0000000&|t|e|s|t|B|a|r| |"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@14 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|h|e|r|e| +0#0000000&@1|N|O|N|E| |"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@17 ->s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|t|h|e|r|e| +0#0000000&|N|O|N|E| |"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@17 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|h|e|r|e| +0#0000000&@1|t|e|s|t|F|o@1| |"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@14 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|t|h|e|r|e| +0#0000000&|t|e|s|t|B|a|r| |"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@14 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|h|e|r|e| +0#0000000&@1|N|O|N|E| |"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@17 +>s+0#af5f00255&|y|n|t|a|x| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|S|y|n|c|M|a|t|c|h| |g+0#00e0003&|r|o|u|p|t|h|e|r|e| +0#0000000&|N|O|N|E| |"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@17 @75 |"+0#0000e05&| |:|s|y|n|-|s|y|n|c| |s|k|i|p| |g|r|o|u|p|s| +0#0000000&@51 @75 |s+0#af5f00255&|y|n| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|M|a|t|c|h| |"+0#e000002&|p|a|t@1|e|r|n|"| +0#0000000&@40 -|s+0#af5f00255&|y|n| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t|e|s|t|R|e|g|i|o|n| |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&@63 +|s+0#af5f00255&|y|n| +0#0000000&|s+0#00e0003&|y|n|c| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t|e|s|t|R|e|g|i|o|n| |s+0#00e0003&|t|a|r|t|=|"+0#e000e06&|s+0#e000002&|t|a|r|t|-|p|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000e06&|s+0#e000002&|k|i|p|-|p|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000e06&|e+0#e000002& +|n|d|-|p|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@63 @75 |"+0#0000e05&| |:|s|y|n|-|s|y|n|c|-|c|l|e|a|r| +0#0000000&@57 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump index 3bcb86e4e3..62bd114bd5 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_06.dump @@ -1,9 +1,9 @@ |"+0#0000e05#ffffff0| |t|a|i|l| |c|o|m@1|e|n|t|s| |a|r|e| |n|o|t| |e|x|p|l|i|c|i|t|l|y| |s|u|p@1|o|r|t|e|d| |b|y| |:|s|y|n|t|a|x|,| |s|e@1| |:|h|e|l|p| |:|c|o|m@1|e|n|t -|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|M|a|t|c|h| |"+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 +|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|M|a|t|c|h| |"+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|"+0#e000e06&| +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|e|s|t|K|e|y|w|o|r|d| |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|e|s|t|R|e|g|i|o|n| |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 +|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t|e|s|t|R|e|g|i|o|n| |s+0#00e0003&|t|a|r|t|=|"+0#e000e06&|s+0#e000002&|t|a|r|t|-|p|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000e06&|s+0#e000002&|k|i|p|-|p|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000e06&|e+0#e000002&|n|d|-|p|a +|t@1|e|r|n|"+0#e000e06&| +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 > @74 |"+0#0000e05&| |M|u|l|t|i|l|i|n|e| |c|o|m@1|a|n|d|s| +0#0000000&@54 @75 diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump index 744f23d907..c680a1058a 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_08.dump @@ -2,7 +2,7 @@ |s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|t|e|s|t|M|a|t|c|h| @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 +@6|\+0#e000e06&| +0#0000000&|/+0#e000e06&| +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 @@ -10,7 +10,7 @@ | +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 +| +0#e000002&@5|\+0#e000e06&|/| +0#0000000&@66 @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 diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_10.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_10.dump index 983f1d5faf..759cc09ed8 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_10.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_10.dump @@ -10,11 +10,11 @@ |s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t|e|s|t|R|e|g|i|o|n| @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#e000e06&| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000e06&|s+0#e000002&|t|a|r|t|-|p|a|t@1|e|r|n|"+0#e000e06&| +0#0000000&@45 @6|"+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#e000e06&| +0#0000000&|s+0#00e0003&|k|i|p|=|"+0#e000e06&|s+0#e000002&|k|i|p|-|p|a|t@1|e|r|n|"+0#e000e06&| +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#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000e06&|e+0#e000002&|n|d|-|p|a|t@1|e|r|n|"+0#e000e06&| +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 @57|1|7|6|,|7| @8|4|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_18.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_18.dump index e96cf04d38..ff9c048a1b 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_18.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_18.dump @@ -10,8 +10,8 @@ |s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|t|e|s|t|R|e|g|i|o|n| @53 @6|"+0#0000e05&|\| ||| |d|o|e|s| |n|o|t| |e|n|d| |t|h|e| |a|r|g|s| |r|e|g|i|o|n| +0#0000000&@35 @6|"+0#0000e05&|\| |s|t|a|r|t|=|"|f|o@1|\|||b|a|r|"| +0#0000000&@49 -@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000002&|s|t|a|r|t|"| +0#0000000&@53 -@6|\+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|e|n|d|"| +0#0000000&@57 +@6|\+0#e000e06&| +0#0000000&|s+0#00e0003&|t|a|r|t|=|"+0#e000e06&|s+0#e000002&|t|a|r|t|"+0#e000e06&| +0#0000000&@53 +@6|\+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000e06&|e+0#e000002&|n|d|"+0#e000e06&| +0#0000000&@57 @75 @75 |"+0#0000e05&| |I|s@1|u|e| |#|1|8|4|9|1| |(|T|w|o| |"+0#e000002&|)|"|s+0#0000e05&| |a|r|e| |i|n|c|o|r@1|e|c|t|l|y| |c|o|l|o|r|e|d| |'|v|i|m|O|p|e|r|E|r@1|o|r|'| |i|n| |s|y|n|t|a|x|/|m diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_19.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_19.dump index 34b80d9e2e..9f0b2437ae 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_19.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_19.dump @@ -1,6 +1,6 @@ | +0&#ffffff0@74 |s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&@6|m|a|i|l|H|e|a|d|e|r|K|e|y| @2|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|m+0#0000001#ffff4012|a|i|l|H|e|a|d|e|r|E|m|a|i|l|,|m|a|i|l|E|m|a|i -|l|,|@|N|o|S|p|e|l@1| +0#0000000#ffffff0|"+0#e000002&|\|v|(|^|(|\|>| |?|)|*|)|@|<|=|(|f|r|o|m|||r|e|p|l|y|-|t|o|)|:|.|*|$|"| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@22 +|l|,|@|N|o|S|p|e|l@1| +0#0000000#ffffff0|"+0#e000e06&|\+0#e000002&|v|(|^|(|\|>| |?|)|*|)|@|<|=|(|f|r|o|m|||r|e|p|l|y|-|t|o|)|:|.|*|$|"+0#e000e06&| +0#0000000&|f+0#e000e06&|o|l|d| +0#0000000&@22 @75 @75 >"+0#0000e05&| |I|s@1|u|e| |#|1|9|3|6@1| |(|h|i|g|h|l|i|g|h|t| |e|r@1|o|r| |f|o|r| |c|o|n|t|a|i|n|s| |e|l|e|m|e|n|t|s| |i|n| |a| |n|e|w| |l|i|n|e|)| +0#0000000&@6 diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_21.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_21.dump index 20477577ec..4f96aed5a1 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_21.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_21.dump @@ -6,15 +6,15 @@ > @74 |"+0#0000e05&| |E|x|a|m|p|l|e|s| |f|r|o|m| |d|i|s|t|r|i|b|u|t|e|d| |s|y|n|t|a|x| |f|i|l|e|s| +0#0000000&@34 @75 -|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&@2|s|l|r|n|r|c|C|o|l|o|r|I|n|i|t| @4|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"+0#e000002&|^|\|s|*|c|o|l|o|r|\|s|\|+|\|S|\|+|"| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&|n+0#e000e06&|e|x +|s+0#af5f00255&|y|n| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&@2|s|l|r|n|r|c|C|o|l|o|r|I|n|i|t| @4|c+0#e000e06&|o|n|t|a|i|n|e|d| +0#0000000&|"+0#e000e06&|^+0#e000002&|\|s|*|c|o|l|o|r|\|s|\|+|\|S|\|+|"+0#e000e06&| +0#0000000&|s+0#e000e06&|k|i|p|w|h|i|t|e| +0#0000000&|n+0#e000e06&|e|x |t|g|r|o|u|p|=|s+0#0000001#ffff4012|l|r|n|r|c|C|o|l|o|r|V|a|l|\|(|S|t|r|\|)|\|=| +0#0000000#ffffff0|c+0#e000e06&|o|n|t|a|i|n|s|=|s+0#0000001#ffff4012|l|r|n|r|c|C|o|l|o|r|\|(|O|b|j|\|||O|b|j|S|t|r|\|)|\|=| +0#0000000#ffffff0@6 -|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&@1|s|l|r|n|r|c|C|m|d|L|i|n|e| @6|m+0#e000e06&|a|t|c|h|g|r|o|u|p|=|s+0#0000000&|l|r|n|r|c|C|m|d| |s+0#00e0003&|t|a|r|t|=|"+0#e000002&|\|<|\+0#e000e06&|(|a+0#e000002&|u|t|o|b|a|u|d|\+0#e000e06&|||.+0#e000002& -@2|\+0#e000e06&|||v+0#e000002&|i|s|i|b|l|e|_|h|e|a|d|e|r|s|\+0#e000e06&|)|\+0#e000002&|>|"| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|$|"| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|s+0#0000001#ffff4012|l|r|n|r|c|\|(|S|t|r|i|n|g|\|||C|o|m@1|e|n|t|\|) +|s+0#af5f00255&|y|n| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&@1|s|l|r|n|r|c|C|m|d|L|i|n|e| @6|m+0#e000e06&|a|t|c|h|g|r|o|u|p|=|s+0#0000000&|l|r|n|r|c|C|m|d| |s+0#00e0003&|t|a|r|t|=|"+0#e000e06&|\+0#e000002&|<|\+0#e000e06&|(|a+0#e000002&|u|t|o|b|a|u|d|\+0#e000e06&|||.+0#e000002& +@2|\+0#e000e06&|||v+0#e000002&|i|s|i|b|l|e|_|h|e|a|d|e|r|s|\+0#e000e06&|)|\+0#e000002&|>|"+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000e06&|$+0#e000002&|"+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|s|=|s+0#0000001#ffff4012|l|r|n|r|c|\|(|S|t|r|i|n|g|\|||C|o|m@1|e|n|t|\|) | +0#0000000#ffffff0@74 |"+0#0000e05&| |:|s|y|n|t|a|x| |k|e|y|w|o|r|d| |—| |o|n|e|l|i|n|e| |a|c@1|e|p|t|e|d| |b|u|t| |m|e|a|n|i|n|g|l|e|s@1| +0#0000000&@22 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|T|e|s|t|K|w| |f|o@1| |b|a|r| |o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0@37 |s+0#af5f00255&|y|n|t|a|x| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|T|e|s|t|K|w|2| |o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0|b|a|z| |q|u@1|x| @35 @75 |"+0#0000e05&| |:|s|y|n|t|a|x| |m|a|t|c|h| |—| |o|n|e|l|i|n|e| |a|c@1|e|p|t|e|d| |b|u|t| |m|e|a|n|i|n|g|l|e|s@1| +0#0000000&@24 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|T|e|s|t|M|a|t|c|h| |/+0#e000002&|\|<|f|o@1|\|>|/| +0#0000000&|o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0@34 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|T|e|s|t|M|a|t|c|h| |/+0#e000e06&|\+0#e000002&|<|f|o@1|\|>|/+0#e000e06&| +0#0000000&|o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0@34 @57|3|7|2|,|0|-|1| @6|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_syntax_22.dump b/runtime/syntax/testdir/dumps/vim_ex_syntax_22.dump index 7c1765f636..b3e80a35bf 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_syntax_22.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_syntax_22.dump @@ -1,10 +1,10 @@ -|s+0#af5f00255#ffffff0|y|n|t|a|x| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|T|e|s|t|M|a|t|c|h| |/+0#e000002&|\|<|f|o@1|\|>|/| +0#0000000&|o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0@34 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|T|e|s|t|M|a|t|c|h|2| |o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0|/+0#e000002&|\|<|b|a|r|\|>|/| +0#0000000&@33 +|s+0#af5f00255#ffffff0|y|n|t|a|x| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|T|e|s|t|M|a|t|c|h| |/+0#e000e06&|\+0#e000002&|<|f|o@1|\|>|/+0#e000e06&| +0#0000000&|o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0@34 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|m+0#00e0003&|a|t|c|h| +0#0000000&|T|e|s|t|M|a|t|c|h|2| |o+0#ffffff16#ff404010|n|e|l|i|n|e| +0#0000000#ffffff0|/+0#e000e06&|\+0#e000002&|<|b|a|r|\|>|/+0#e000e06&| +0#0000000&@33 @75 |"+0#0000e05&| |:|s|y|n|t|a|x| |r|e|g|i|o|n| |—| |o|n|e|l|i|n|e| |i|s| |m|e|a|n|i|n|g|f|u|l| |h|e|r|e| +0#0000000&@29 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|T|e|s|t|R|e|g|i|o|n| |s+0#00e0003&|t|a|r|t|=|/+0#e000002&|{|/| +0#0000000&|e+0#00e0003&|n|d|=|/+0#e000002&|}|/| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&@24 ->s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|T|e|s|t|R|e|g|i|o|n|2| |o+0#e000e06&|n|e|l|i|n|e| +0#0000000&|s+0#00e0003&|t|a|r|t|=|/+0#e000002&|"|/| +0#0000000&|e+0#00e0003&|n|d|=|/+0#e000002&|"|/| +0#0000000&@23 -|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|T|e|s|t|R|e|g|i|o|n|3| |s+0#00e0003&|t|a|r|t|=|/+0#e000002&|\|/|\|*|/| +0#0000000&|e+0#00e0003&|n|d|=|/+0#e000002&|\|*|\|/@1| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|A|L@1| +0#0000000&@1 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|T|e|s|t|R|e|g|i|o|n| |s+0#00e0003&|t|a|r|t|=|/+0#e000e06&|{+0#e000002&|/+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|/+0#e000e06&|}+0#e000002&|/+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&@24 +>s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|T|e|s|t|R|e|g|i|o|n|2| |o+0#e000e06&|n|e|l|i|n|e| +0#0000000&|s+0#00e0003&|t|a|r|t|=|/+0#e000e06&|"+0#e000002&|/+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|/+0#e000e06&|"+0#e000002&|/+0#e000e06&| +0#0000000&@23 +|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|T|e|s|t|R|e|g|i|o|n|3| |s+0#00e0003&|t|a|r|t|=|/+0#e000e06&|\+0#e000002&|/|\|*|/+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|/+0#e000e06&|\+0#e000002&|*|\|/|/+0#e000e06&| +0#0000000&|o+0#e000e06&|n|e|l|i|n|e| +0#0000000&|c+0#e000e06&|o|n|t|a|i|n|e|d|i|n|=|A|L@1| +0#0000000&@1 |~+0#4040ff13&| @73 |~| @73 |~| @73 diff --git a/runtime/syntax/testdir/dumps/vim_ex_throw_00.dump b/runtime/syntax/testdir/dumps/vim_ex_throw_00.dump index a596aed7c9..9241206e58 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_throw_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_throw_00.dump @@ -3,7 +3,7 @@ @75 |"+0#0000e05&| |:|h|e|l|p| |:|t|h|r|o|w| +0#0000000&@60 @75 -|t+0#af5f00255&|r|y| +0#0000000&||| |t+0#af5f00255&|h|r|o|w| +0#0000000&|"+0#e000002&|o@1|p|s|"| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#0000000&|o@1|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|c|a|u|g|h|t|"| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@17 +|t+0#af5f00255&|r|y| +0#0000000&||| |t+0#af5f00255&|h|r|o|w| +0#0000000&|"+0#e000002&|o@1|p|s|"| +0#0000000&||| |c+0#af5f00255&|a|t|c|h| +0#0000000&|/+0#e000e06&|^+0#e000002&|o@1|/+0#e000e06&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|c|a|u|g|h|t|"| +0#0000000&||| |e+0#af5f00255&|n|d|t|r|y| +0#0000000&@17 @75 |~+0#4040ff13&| @73 |~| @73 diff --git a/runtime/syntax/testdir/dumps/vim_ex_uniq_00.dump b/runtime/syntax/testdir/dumps/vim_ex_uniq_00.dump index 146ff038ca..4a7327211b 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_uniq_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_uniq_00.dump @@ -8,13 +8,13 @@ |u+0#af5f00255&|n|i|q| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&@65 |u+0#af5f00255&|n|i|q|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@65 @75 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&@50 @75 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 @75 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 @75 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_uniq_01.dump b/runtime/syntax/testdir/dumps/vim_ex_uniq_01.dump index 5489eaa152..b07fcf6d1e 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_uniq_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_uniq_01.dump @@ -1,20 +1,20 @@ -|u+0#af5f00255#ffffff0|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|u+0#af5f00255#ffffff0|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&@49 @75 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@50 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|i+0#e000e06&|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@50 > @74 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@49 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&@49 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@49 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&@49 @75 |u+0#af5f00255&|n|i|q| +0#0000000&@1||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 |u+0#af5f00255&|n|i|q|!| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56 @75 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 @75 -|u+0#af5f00255&|n|i|q| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 -|u+0#af5f00255&|n|i|q|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|u+0#af5f00255&|n|i|q| +0#0000000&@1|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 +|u+0#af5f00255&|n|i|q|!| +0#0000000&|r+0#e000e06&|i|l|u| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@35 @75 |~+0#4040ff13&| @73 | +0#0000000&@56|1|9|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_00.dump b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_00.dump index b7862da29b..cacce3003d 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_00.dump @@ -4,17 +4,17 @@ |"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|V|i|m|g|r|e|p|B|a|r|E|s|c|a|p|e| |S|p|e|c|i|a|l| +0#0000000&@22 @75 @75 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@44 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@44 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@44 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@44 @75 -|v+0#af5f00255&|i|m|g|r|e|p|!| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 -|v+0#af5f00255&|i|m|g|r|e|p|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 +|v+0#af5f00255&|i|m|g|r|e|p|!| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 +|v+0#af5f00255&|i|m|g|r|e|p|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 @75 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 @75 |"+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r|,| |n|o| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@43 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|"|t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|"|t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 @75 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 @57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_01.dump b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_01.dump index 869a3b11df..bfeffcdaf2 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_01.dump @@ -1,20 +1,20 @@ | +0&#ffffff0@74 |"+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r|,| |n|o| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@43 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|"|t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|"|t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@26 @75 ->v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 +>v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@41 @75 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1|!| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1|!| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 @75 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@38 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@38 @75 |"+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r|,| |n|o| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@43 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@23 -|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|"|t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@23 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@23 +|v+0#af5f00255&|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|"|t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@23 @75 -|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 -|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 +|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 +|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 @57|1|9|,|1| @9|2|6|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_02.dump b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_02.dump index fefec2425b..70817bf8ad 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_02.dump @@ -1,20 +1,20 @@ -|l+0#af5f00255#ffffff0|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 +|l+0#af5f00255#ffffff0|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@43 @75 -|l+0#af5f00255&|v|i|m|g|r|e|p|!| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@42 -|l+0#af5f00255&|v|i|m|g|r|e|p|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@42 +|l+0#af5f00255&|v|i|m|g|r|e|p|!| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@42 +|l+0#af5f00255&|v|i|m|g|r|e|p|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@42 @75 ->l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 +>l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 @75 |"+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r|,| |n|o| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@43 -|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@25 -|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|"|t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@25 +|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@25 +|l+0#af5f00255&|v|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|"|t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@25 @75 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@40 @75 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1|!| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@39 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1|!| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@39 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1|!| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@39 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1|!| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@39 @75 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@37 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&|g|j|f| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0@37 @75 @57|3|7|,|1| @9|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_03.dump b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_03.dump index f77f5c4e5a..d1b7419230 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_03.dump @@ -1,20 +1,20 @@ | +0&#ffffff0@74 |"+0#0000e05&| |t|r|a|i|l|i|n|g| |b|a|r|,| |n|o| |t|a|i|l| |c|o|m@1|e|n|t| +0#0000000&@43 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|||t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@22 -|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&|"|t|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@22 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|||t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|\+0#e000e06#ffffff0|||a+0#0000001#ffff4012|\+0#e000e06#ffffff0|||r+0#0000001#ffff4012|.|t|x|t| +0#0000000#ffffff0||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@22 +|l+0#af5f00255&|v|i|m|g|r|e|p|a|d@1| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&|"|t|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|b+0#0000001#ffff4012|"|a|"|r|.|t|x|t| +0#0000000#ffffff0@2||+0#af5f00255&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@22 @75 > @74 |"+0#0000e05&| |f|i|l|e| |a|r|g|s| +0#0000000&@63 @75 |"+0#0000e05&| |m|u|l|t|i|p|l|e| |f|i|l|e|s| +0#0000000&@58 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0|b+0#0000001#ffff4012|a|r|.|t|x|t| +0#0000000#ffffff0@36 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0|b+0#0000001#ffff4012|a|r|.|t|x|t| +0#0000000#ffffff0@36 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0|b+0#0000001#ffff4012|a|r|.|t|x|t| +0#0000000#ffffff0@36 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|f+0#0000001#ffff4012|o@1|.|t|x|t| +0#0000000#ffffff0|b+0#0000001#ffff4012|a|r|.|t|x|t| +0#0000000#ffffff0@36 @75 |"+0#0000e05&| |w|i|l|d|c|a|r|d| |p|a|t@1|e|r|n|s| +0#0000000&@55 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|*+0#0000001#ffff4012@1|/|*|.|t|x|t| +0#0000000#ffffff0@43 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|*+0#0000001#ffff4012@1|/|*|.|t|x|t| +0#0000000#ffffff0@43 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|*+0#0000001#ffff4012@1|/|*|.|t|x|t| +0#0000000#ffffff0@43 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|*+0#0000001#ffff4012@1|/|*|.|t|x|t| +0#0000000#ffffff0@43 @75 |"+0#0000e05&| |s|p|e|c|i|a|l| |f|i|l|e|n|a|m|e| |c|h|a|r|a|c|t|e|r|s| +0#0000000&@45 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n| @2|%+0#00e0e07&| +0#0000000&@50 -|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|%+0#00e0e07&| +0#0000000&@50 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n| +0#0000000&@2|%+0#00e0e07&| +0#0000000&@50 +|v+0#af5f00255&|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|%+0#00e0e07&| +0#0000000&@50 @57|5@1|,|0|-|1| @7|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_04.dump b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_04.dump index df3f54fc03..36c3fb43a9 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_vimgrep_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_vimgrep_04.dump @@ -1,4 +1,4 @@ -|v+0#af5f00255#ffffff0|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#0000000&|a|\+0#e000e06&|%|(|t+0#0000000&@1|\+0#e000e06&|)|e+0#0000000&|r|n|/+0#e000e06&| +0#0000000&|%+0#00e0e07&| +0#0000000&@50 +|v+0#af5f00255#ffffff0|i|m|g|r|e|p| +0#0000000&|/+0#e000e06&|p+0#e000002&|a|\+0#e000e06&|%|(|t+0#e000002&@1|\+0#e000e06&|)|e+0#e000002&|r|n|/+0#e000e06&| +0#0000000&|%+0#00e0e07&| +0#0000000&@50 > @74 |~+0#4040ff13&| @73 |~| @73 diff --git a/runtime/syntax/testdir/dumps/vim_expressions_23.dump b/runtime/syntax/testdir/dumps/vim_expressions_23.dump index 5c3ed7180f..324e857809 100644 --- a/runtime/syntax/testdir/dumps/vim_expressions_23.dump +++ b/runtime/syntax/testdir/dumps/vim_expressions_23.dump @@ -6,7 +6,7 @@ > @74 |"+0#0000e05&| |I|s@1|u|e| |#|1|4@1|2|3| |(|v|i|m|.|v|i|m|:| |O|p|t| |o|u|t| |o|f| |v|i|m|S|e|a|r|c|h|*|)| +0#0000000&@27 @75 -|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @67 +|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@67 |l+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&|=+0#af5f00255&| +0#0000000&|0+0#e000002&| +0#0000000&@60 |\+0#e000e06&| +0#0000000&@2|?+0#af5f00255&| +0#0000000&|(+0#e000e06&|0+0#e000002&| +0#0000000&@66 |\+0#e000e06&| +0#0000000&@2|)+0#e000e06&| +0#0000000&@69 @@ -15,6 +15,6 @@ |e+0#af5f00255&|c|h|o| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +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|?+0#e000e06&|t+0#0000000&|r|u|t|h|y| @65 +@2|?+0#e000e06&|t+0#e000002&|r|u|t|h|y| +0#0000000&@65 @2|l+0#af5f00255&|e|t| +0#0000000&|t+0#00e0e07&|r|u|t|h|y| +0#0000000&|=+0#af5f00255&| +0#0000000&|0+0#e000002&| +0#0000000&@58 @57|4|0|6|,|0|-|1| @6|9|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump b/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump index 9347802723..c2c4e49b5e 100644 --- a/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump +++ b/runtime/syntax/testdir/dumps/vim_predefined_user_commands_01.dump @@ -12,7 +12,7 @@ @75 |"+0#0000e05&| |:|V|i|m|F|o|l|d|\|a|,| |:|V|i|m|9|,| |:|V|i|m|L| |-| |r|u|n|t|i|m|e|/|s|y|n|t|a|x|/|v|i|m|.|v|i|m| +0#0000000&@23 @75 -|V+0#af5f00255&|i|m|F|o|l|d|a| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|v|i|m|F|o@1| |s+0#00e0003&|t|a|r|t|=|"+0#e000002&|f|o@1|"| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000002&|b|a|r|"| +0#0000000&@23 +|V+0#af5f00255&|i|m|F|o|l|d|a| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|r+0#00e0003&|e|g|i|o|n| +0#0000000&|v|i|m|F|o@1| |s+0#00e0003&|t|a|r|t|=|"+0#e000e06&|f+0#e000002&|o@1|"+0#e000e06&| +0#0000000&|e+0#00e0003&|n|d|=|"+0#e000e06&|b+0#e000002&|a|r|"+0#e000e06&| +0#0000000&@23 @75 |V+0#af5f00255&|i|m|9| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|v|i|m|9|F|o@1| |f|o@1| |n+0#e000e06&|e|x|t|g|r|o|u|p|=|v+0#0000000&|i|m|9|C|o|m@1|e|n|t| @21 |V+0#af5f00255&|i|m|L| +0#0000000&|s+0#af5f00255&|y|n|t|a|x| +0#0000000&|k+0#00e0003&|e|y|w|o|r|d| +0#0000000&|v|i|m|F|o@1| @1|f|o@1| |n+0#e000e06&|e|x|t|g|r|o|u|p|=|v+0#0000000&|i|m|C|o|m@1|e|n|t| @22 diff --git a/runtime/syntax/testdir/input/vim_ex_helpgrep.vim b/runtime/syntax/testdir/input/vim_ex_helpgrep.vim index 8c686de073..a4c3ee0df5 100644 --- a/runtime/syntax/testdir/input/vim_ex_helpgrep.vim +++ b/runtime/syntax/testdir/input/vim_ex_helpgrep.vim @@ -1,5 +1,4 @@ " Vim :helpgrep command -" VIM_TEST_SETUP hi link vimHelpgrepPattern Todo helpgrep :help diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 2fb67f3688..c878d729d0 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 24 +" Last Change: 2026 Aug 26 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -1580,7 +1580,14 @@ syn region vimSynRegion contained 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*\%(\\\|"\\ \)/ end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg +syn region vimSynRegPat contained + \ matchgroup=Delimiter + \ start="\z([-`~!@#$%^&*_=+;:'",./?]\)" + \ skip=/\\\\\|\\\z1\|\n\s*\%(\\\|"\\ \)/ + \ end="\z1" + \ skipwhite nextgroup=vimSynPatMod,vimSynReg + \ contains=@vimSynRegPatGroup + \ extend 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\+" @@ -2983,6 +2990,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimAbb vimCommand hi def link vimAddress Constant + hi def link vimAddressPattern Regexp hi def link vimAddressOffset Type hi def link vimAddressSlashEscape Special hi def link vimAddressQuestionEscape Special @@ -3019,6 +3027,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimCall vimCommand hi def link vimCall_ vimCall hi def link vimCatch vimCommand + hi def link vimCatchPattern Regexp hi def link vimChangeBang vimBang hi def link vimChangeCount vimCount hi def link vimCd vimCommand @@ -3086,6 +3095,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimEval vimCommand hi def link vimExFilter vimCommand hi def link vimExFilterBang vimBang + hi def link vimExFilterPattern Regexp hi def link vimFBVar vimVar hi def link vimFgBgAttrib vimHiAttrib hi def link vimFuncEcho vimCommand @@ -3099,11 +3109,13 @@ if !exists("skip_vim_syntax_inits") hi def link vimFunctionComment vimComment hi def link vimFuncName Function hi def link vimFunctionMod Special + hi def link vimFunctionPattern Regexp hi def link vimFunctionParam vimVar hi def link vimFunctionParamEquals vimOper hi def link vimFunctionScope vimVarScope hi def link vimFunctionSID vimNotation hi def link vimGlobal vimCommand + hi def link vimGlobalPattern Regexp hi def link vimGrep vimCommand hi def link vimGrep_ vimGrep hi def link vimGrepadd vimCommand @@ -3120,6 +3132,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimHelp vimCommand hi def link vimHelpBang vimBang hi def link vimHelpgrep vimCommand + hi def link vimHelpgrepPattern Regexp hi def link vimHiAttrib PreProc hi def link vimHiBang vimBang hi def link vimHiClear Type @@ -3181,6 +3194,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimMatch_ vimMatch hi def link vimMatchGroup vimGroup hi def link vimMatchNone vimGroup + hi def link vimMatchPattern Regexp hi def link vimMenuBang vimBang hi def link vimMenuClear Special hi def link vimMenuMod vimMapMod @@ -3276,6 +3290,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSort_ vimSort hi def link vimSortBang vimBang hi def link vimSortOptions Special + hi def link vimSortPattern Regexp hi def link vimSpecFile Identifier hi def link vimSpecFileMod vimSpecFile hi def link vimSpecial Type @@ -3286,6 +3301,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSubstCount Number hi def link vimSubstDelim Delimiter hi def link vimSubstFlags Special + hi def link vimSubstPat Regexp hi def link vimSubstSubstr SpecialChar hi def link vimSubstTwoBS vimString hi def link vimSubst vimCommand @@ -3320,7 +3336,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSynPatRange vimString hi def link vimSynReg Type hi def link vimSynRegOpt vimSynOption - hi def link vimSynRegPat vimString + hi def link vimSynRegPat Regexp hi def link vimSynSpell Type hi def link vimSyntax vimCommand hi def link vimSynType vimSpecial @@ -3346,6 +3362,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimUniq_ vimUniq hi def link vimUniqBang vimBang hi def link vimUniqOptions Special + hi def link vimUniqPattern Regexp hi def link vimUnlet vimCommand hi def link vimUnletBang vimBang hi def link vimUnlockvar vimCommand @@ -3373,6 +3390,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimVimgrepadd_ vimVimgrepadd hi def link vimVimgrepBang vimBang hi def link vimVimgrepFlags Special + hi def link vimVimgrepPattern Regexp hi def link vimVimVar Identifier hi def link vimVimVarName Identifier hi def link vimWarn WarningMsg From a49991a2495fd63a64784a33c1aad4edda15e3fb Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Tue, 25 Aug 2026 21:45:52 +0000 Subject: [PATCH 442/647] runtime(doc): Docs should use use "regexp" not "regex" This leaves patch list text unaltered so that it doesn't differ from the commit history. closes: #21153 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/doc/helphelp.txt | 6 +++--- runtime/doc/insert.txt | 6 +++--- runtime/doc/options.txt | 4 ++-- runtime/doc/pattern.txt | 6 +++--- runtime/doc/todo.txt | 10 +++++----- runtime/doc/usr_02.txt | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/runtime/doc/helphelp.txt b/runtime/doc/helphelp.txt index 7ef2ff00bb..e70da1f3bd 100644 --- a/runtime/doc/helphelp.txt +++ b/runtime/doc/helphelp.txt @@ -1,4 +1,4 @@ -*helphelp.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*helphelp.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -299,10 +299,10 @@ the following pattern is used: > ^\w\+@\w\+:\f\+\$\s This is meant to match a default bash prompt. If it doesn't match your -prompt, you can change the regex with the `shell_prompt` key from the +prompt, you can change the regexp with the `shell_prompt` key from the `g:helptoc` dictionary variable: > - let g:helptoc = {'shell_prompt': 'regex matching your shell prompt'} + let g:helptoc = {'shell_prompt': 'regexp matching your shell prompt'} Tip: After inserting a pattern to look for with the `/` command, if you press instead of , you can then get more context for each remaining entry diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt index 18408dfe8d..07ec6d518d 100644 --- a/runtime/doc/insert.txt +++ b/runtime/doc/insert.txt @@ -1,4 +1,4 @@ -*insert.txt* For Vim version 9.2. Last change: 2026 Aug 23 +*insert.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1798,9 +1798,9 @@ autoload/syntaxcomplete.vim) to add items. Looking at the output from htmlArg,htmlTag,htmlTagName,javaScriptStatement,javaScriptGlobalObjects To pick up any JavaScript and HTML keyword syntax groups while editing a PHP -file, you can use 3 different regexs, one for each language. Or you can +file, you can use 3 different regexps, one for each language. Or you can simply restrict the include groups to a particular value, without using -a regex string: > +a regexp string: > let g:omni_syntax_group_include_php = 'php\w\+,javaScript\w\+,html\w\+' let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods' < diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index ecccba92af..a6de39886e 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 20 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -10522,7 +10522,7 @@ A jump table for the options with a short description can be found at |Q_op|. exacttext When this flag is present, search pattern completion (e.g., in |/|, |?|, |:s|, |:g|, |:v|, and |:vim|) shows exact buffer text as menu items, without - preserving regex artifacts like position + preserving regexp artifacts like position anchors (e.g., |/\<|). This provides more intuitive menu items that match the actual buffer text. However, searches may be less accurate since the diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt index 18d7a41120..3be2145250 100644 --- a/runtime/doc/pattern.txt +++ b/runtime/doc/pattern.txt @@ -1,4 +1,4 @@ -*pattern.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*pattern.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1370,7 +1370,7 @@ Suppose B is a base character and x and y are composing characters: ============================================================================== 9. Compare with Perl patterns *perl-patterns* -Vim's regexes are most similar to Perl's, in terms of what you can do. The +Vim's regexps are most similar to Perl's, in terms of what you can do. The difference between them is mostly just notation; here's a summary of where they differ: @@ -1401,7 +1401,7 @@ by giving you the \_ "modifier": put it in front of a . or a character class, and they will match newlines as well. Finally, these constructs are unique to Perl: -- execution of arbitrary code in the regex: (?{perl code}) +- execution of arbitrary code in the regexp: (?{perl code}) - conditional expressions: (?(condition)true-expr|false-expr) ...and these are unique to Vim: diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index ea57dfaabb..8ce7f1fdd6 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 9.2. Last change: 2026 Aug 03 +*todo.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1199,7 +1199,7 @@ Regexp problems: character, search fails. E.g. "รรีบ" in "การรีบรักใคร". (agguser, #2312) - [:space:] only matches ASCII spaces. Add [:white:] for all space-like characters, esp. including 0xa0. Use character class zero. -- Since 7.4.704 the old regex engine fails to match [[:print:]] in 0xf6. +- Since 7.4.704 the old regexp engine fails to match [[:print:]] in 0xf6. (Manuel Ortega, 2016 Apr 24) Test fails on Mac. Avoid using isalpha(), isalnum(), etc? Depends on LC_CTYPE @@ -1637,8 +1637,8 @@ Patch to support 'u' in interactive substitute. (Christian Brabandt, 2012 Sep Dialog is too big on Linux too. (David Fishburn, 2013 Sep 2) -- Add regex for 'paragraphs' and 'sections': 'parare' and 'sectre'. Combine - the two into a regex for searching. (Ned Konz) +- Add regexp for 'paragraphs' and 'sections': 'parare' and 'sectre'. + Combine the two into a regexp for searching. (Ned Konz) Patch by Christian Brabandt, 2013 Apr 20, unfinished. Bug: findfile("any", "file:///tmp;") does not work. @@ -6077,7 +6077,7 @@ From Elvis: From xvi: - CTRL-_ : swap 8th bit of character. -- Add egrep-like regex type, like xvi (Ned Konz) or Perl (Emmanuel Mogenet) +- Add egrep-like regexp type, like xvi (Ned Konz) or Perl (Emmanuel Mogenet) From vile: diff --git a/runtime/doc/usr_02.txt b/runtime/doc/usr_02.txt index 4f83a8f578..7ad54f5341 100644 --- a/runtime/doc/usr_02.txt +++ b/runtime/doc/usr_02.txt @@ -1,4 +1,4 @@ -*usr_02.txt* For Vim version 9.2. Last change: 2026 Feb 14 +*usr_02.txt* For Vim version 9.2. Last change: 2026 Aug 25 VIM USER MANUAL by Bram Moolenaar @@ -581,7 +581,7 @@ Summary: *help-summary* > starting with "z". 11) Regexp items always start with /. So to get help for the "\+" quantifier - in Vim regexes: > + in Vim regexps: > :help /\+ < If you need to know everything about regular expressions, start reading at: > From cc2b481c41205d5bcb8d0ef93eb10e72a9c2aa40 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 25 Aug 2026 21:50:47 +0000 Subject: [PATCH 443/647] patch 9.2.1012: tests: no enough testing for complete_info() "auto" Problem: tests: no enough testing for complete_info() "auto" (after v9.2.1004) Solution: Check triggering manual completion before 'autocompletedelay' expires (zeertzjq). related: #21143 closes: #21152 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/testdir/test_ins_complete.vim | 9 ++++++++- src/version.c | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index c8a28961d7..fce28362d8 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6764,7 +6764,7 @@ func Test_complete_info_auto() func! AutoOmni(findstart, base) if a:findstart call add(g:auto, complete_info(['auto']).auto) - return col('.') - 1 + return 4 endif return ['alpha', 'alphabet'] endfunc @@ -6784,6 +6784,13 @@ func Test_complete_info_auto() call feedkeys("A\\\", 'tx') call assert_equal([1, 0], g:auto) + " CTRL-X CTRL-O is typed before 'autocompletedelay' expires. + set autocompletedelay=100 + let g:auto = [] + call feedkeys("A\\\", 'tx') + call assert_equal([0], g:auto) + + set autocompletedelay& setlocal noautocomplete let g:auto = [] call feedkeys("A\\\", 'tx') diff --git a/src/version.c b/src/version.c index 9d15a29b0d..7c8d0ab148 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1012, /**/ 1011, /**/ From e4f51e505ae0d64c4797c89314ecff1be88135be Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 26 Aug 2026 20:33:48 +0000 Subject: [PATCH 444/647] patch 9.2.1013: [security]: out-of-bounds access in libvterm CSI 8 t resize Problem: [security]: With libvterm the CSI 8 ; rows ; cols t may use raw terminal values without validating bounds, causing an out-of-bounds access and heap-buffer-overflow (Yazan Balawneh). Solution: Clamp rows and columns to VTERM_MAX_COLS and VTERM_MAX_ROWS in on_resize. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-vfc7-mhvm-gjp8 related: v9.2.0569 Signed-off-by: Christian Brabandt --- src/libvterm/src/state.c | 6 ++++++ src/testdir/test_terminal3.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 27 insertions(+) diff --git a/src/libvterm/src/state.c b/src/libvterm/src/state.c index 138e95d077..be0e61dde2 100644 --- a/src/libvterm/src/state.c +++ b/src/libvterm/src/state.c @@ -2143,6 +2143,12 @@ static int on_resize(int rows, int cols, void *user) VTermState *state = user; VTermPos oldpos = state->pos; + if (cols > VTERM_MAX_COLS) + cols = VTERM_MAX_COLS; + + if (rows > VTERM_MAX_ROWS) + rows = VTERM_MAX_ROWS; + if(cols != state->cols) { unsigned char *newtabstops = vterm_allocator_malloc(state->vt, (cols + 7) / 8); if (newtabstops == NULL) diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim index 353505c39c..ca25b2252f 100644 --- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -1446,4 +1446,23 @@ func Test_terminal_scrollregion_resize_oob() endfor endfunc +" This caused a Crash +func Test_terminal_csi_resize() + CheckUnix + CheckExecutable cat + + " The escape sequence and the output must arrive in one burst + call writefile(["\[8;50000;200t"] + repeat(['x'], 3000), 'Xtermsize', 'D') + + let buf = term_start(['cat', 'Xtermsize'], #{term_rows: 20}) + call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))}) + call TermWait(buf) + + " clamped to VTERM_MAX_ROWS instead of 50,000 + call assert_equal([1000, 1], term_getcursor(buf)[0:1]) + call assert_true(bufexists(buf)) + + exe 'bwipe! ' .. buf +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 7c8d0ab148..92884de933 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1013, /**/ 1012, /**/ From e41756455701b9419f2493ab2e2e0f01557fe939 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Wed, 26 Aug 2026 21:09:27 +0000 Subject: [PATCH 445/647] patch 9.2.1014: [security]: overflow in undo file entry size check on 32-bit arch Problem: [security]: The check that guards the allocation of the line array in unserialize_uep() uses the size of a pointer instead of the size of the array element. On 32-bit systems the multiplication for the allocation can therefore overflow, so that a crafted undo file leads to an undersized allocation and an out-of-bounds write (Yazan Balawneh, after v8.1.0688). Solution: Use the size of undoline_T for the check, as that is what is allocated. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-cvc5-p4x9-3f9f related: v8.1.0688 Signed-off-by: Christian Brabandt --- src/undo.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/undo.c b/src/undo.c index 24407edaff..02e475d48e 100644 --- a/src/undo.c +++ b/src/undo.c @@ -1449,7 +1449,7 @@ unserialize_uep(bufinfo_T *bi, int *error, char_u *file_name) uep->ue_size = undo_read_4c(bi); if (uep->ue_size > 0) { - if (uep->ue_size < LONG_MAX / (int)sizeof(char_u *)) + if (uep->ue_size < LONG_MAX / (long)sizeof(undoline_T)) array = U_ALLOC_LINE(sizeof(undoline_T) * uep->ue_size); if (array == NULL) { diff --git a/src/version.c b/src/version.c index 92884de933..b8ad10924a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1014, /**/ 1013, /**/ From 44021be4852e665b06357d6739c4f00faa447b3d Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 27 Aug 2026 20:36:20 +0000 Subject: [PATCH 446/647] runtime(doc): Clarify the use of the terminal api Signed-off-by: Christian Brabandt --- runtime/doc/terminal.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index a16c123d1c..9a8df69e35 100644 --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -1,4 +1,4 @@ -*terminal.txt* For Vim version 9.2. Last change: 2026 Jun 26 +*terminal.txt* For Vim version 9.2. Last change: 2026 Aug 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -866,6 +866,8 @@ term_setapi({buf}, {expr}) *term_setapi()* < The default is "Tapi_". When {expr} is an empty string then no |terminal-api| function can be used for {buf}. + Setting the API only affects the "call" part, "drop" is always + allowed. When used as a method the base is used for {buf}: > GetBufnr()->term_setapi({expr}) @@ -1081,6 +1083,11 @@ The body is always a list, making it easy to find the end: ]<07>. The ]51;msg<07> sequence is reserved by xterm for "Emacs shell", which is similar to what we are doing here. +Note that any output appearing in a terminal window is checked for this +escape sequence, thus the job can make Vim open a file with the "drop" +command below. |term_setapi()| only restricts which functions the "call" +command may use, it does not affect the "drop" API. + Currently supported commands: call {funcname} {argument} From ccb39ad965fb432e1cc7ce9a7d1d2aca21c39300 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Thu, 27 Aug 2026 20:39:27 +0000 Subject: [PATCH 447/647] runtime(ed): Update syntax, add links to Regexp highlight group closes: #21167 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/ed.vim | 10 ++++- .../syntax/testdir/dumps/ed_addresses_00.dump | 8 ++-- .../syntax/testdir/dumps/ed_addresses_01.dump | 6 +-- .../syntax/testdir/dumps/ed_addresses_02.dump | 16 ++++---- .../syntax/testdir/dumps/ed_addresses_05.dump | 6 +-- .../syntax/testdir/dumps/ed_addresses_06.dump | 36 +++++++++--------- .../syntax/testdir/dumps/ed_addresses_07.dump | 14 +++---- .../syntax/testdir/dumps/ed_addresses_08.dump | 8 ++-- .../syntax/testdir/dumps/ed_addresses_09.dump | 8 ++-- .../syntax/testdir/dumps/ed_addresses_10.dump | 8 ++-- .../syntax/testdir/dumps/ed_addresses_11.dump | 6 +-- .../syntax/testdir/dumps/ed_addresses_12.dump | 12 +++--- .../syntax/testdir/dumps/ed_addresses_13.dump | 8 ++-- .../syntax/testdir/dumps/ed_addresses_14.dump | 12 +++--- .../syntax/testdir/dumps/ed_addresses_15.dump | 6 +-- .../syntax/testdir/dumps/ed_commands_02.dump | 6 +-- .../syntax/testdir/dumps/ed_commands_03.dump | 6 +-- .../syntax/testdir/dumps/ed_commands_05.dump | 2 +- .../syntax/testdir/dumps/ed_commands_06.dump | 8 ++-- .../syntax/testdir/dumps/ed_commands_09.dump | 8 ++-- .../syntax/testdir/dumps/ed_commands_10.dump | 6 +-- .../syntax/testdir/dumps/ed_commands_11.dump | 10 ++--- .../syntax/testdir/dumps/ed_commands_15.dump | 6 +-- .../syntax/testdir/dumps/ed_commands_16.dump | 6 +-- .../syntax/testdir/dumps/ed_commands_19.dump | 4 +- .../syntax/testdir/dumps/ed_commands_20.dump | 8 ++-- .../syntax/testdir/dumps/ed_commands_24.dump | 8 ++-- .../syntax/testdir/dumps/ed_commands_25.dump | 24 ++++++------ .../syntax/testdir/dumps/ed_commands_26.dump | 34 ++++++++--------- .../syntax/testdir/dumps/ed_commands_27.dump | 28 +++++++------- .../syntax/testdir/dumps/ed_commands_28.dump | 36 +++++++++--------- .../syntax/testdir/dumps/ed_commands_29.dump | 38 +++++++++---------- .../syntax/testdir/dumps/ed_commands_30.dump | 36 +++++++++--------- .../syntax/testdir/dumps/ed_commands_31.dump | 32 ++++++++-------- .../syntax/testdir/dumps/ed_commands_32.dump | 36 +++++++++--------- .../syntax/testdir/dumps/ed_commands_33.dump | 36 +++++++++--------- .../syntax/testdir/dumps/ed_commands_34.dump | 38 +++++++++---------- .../syntax/testdir/dumps/ed_commands_35.dump | 10 ++--- .../syntax/testdir/dumps/ed_commands_39.dump | 8 ++-- .../syntax/testdir/dumps/ed_commands_40.dump | 10 ++--- .../syntax/testdir/dumps/ed_commands_41.dump | 2 +- .../syntax/testdir/dumps/ed_commands_42.dump | 8 ++-- .../syntax/testdir/dumps/ed_commands_43.dump | 8 ++-- 43 files changed, 316 insertions(+), 310 deletions(-) diff --git a/runtime/syntax/ed.vim b/runtime/syntax/ed.vim index 393e225b0e..f2d0f4e703 100644 --- a/runtime/syntax/ed.vim +++ b/runtime/syntax/ed.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: ed(1) " Maintainer: Doug Kearns -" Last Change: 2026 Jul 30 +" Last Change: 2026 Aug 27 if exists("b:current_syntax") finish @@ -52,7 +52,7 @@ syn match edAddress_Pattern_Flag contained \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand syn match edRegex_BracketExpression contained - \ "\[\^\=\]\=\%(\[:.\{-}:\]\|\[\..\{-}\.\]\|\[=.\{-}=\]\|[^]]\)*\]" + \ /\[\^\=\]\=\%(\[:.\{-}:\]\|\[\..\{-}\.\]\|\[=.\{-}=\]\|[^]]\)*\]/ \ contains=NONE \ transparent syn match edRegex_SlashEscape contained @@ -522,6 +522,7 @@ syn sync fromstart hi def link edAddress Constant hi def link edAddressModifier_Offset Special hi def link edAddressModifier_Count Special +hi def link edAddress_Pattern Regexp hi def link edAddress_Pattern_Flag Special " commands (addresses) @@ -587,6 +588,7 @@ hi def link edCommand_ShellEscape_Arg_Command_FilenameEscape Special hi def link edCommand_ShellEscape_Arg_Command_BackslashEscape Special hi def link edCommand_ShellEscape_Arg_Previous Constant +hi def link edCommand_Substitute_Arg_Regexp Regexp hi def link edCommand_Substitute_Arg_Replacement_Escape Special hi def link edCommand_Substitute_Arg_Replacement_Newline Special hi def link edCommand_Substitute_Arg_Replacement_Match Special @@ -594,9 +596,13 @@ hi def link edCommand_Substitute_Arg_Replacement_Repeat Special hi def link edCommand_Substitute_Arg_Flag Special hi def link edCommand_Substitute_Arg_Count Special +hi def link edCommand_Global_Arg_Regexp Regexp hi def link edCommand_Global_Arg_Regexp_Flag Special +hi def link edCommand_InteractiveGlobal_Arg_Regexp Regexp hi def link edCommand_InteractiveGlobal_Arg_Regexp_Flag Special +hi def link edCommand_GlobalNotMatched_Arg_Regexp Regexp hi def link edCommand_GlobalNotMatched_Arg_Regexp_Flag Special +hi def link edCommand_InteractiveGlobalNotMatched_Arg_Regexp Regexp hi def link edCommand_InteractiveGlobalNotMatched_Arg_Regexp_Flag Special " line continuation diff --git a/runtime/syntax/testdir/dumps/ed_addresses_00.dump b/runtime/syntax/testdir/dumps/ed_addresses_00.dump index b319a91d49..ff8847b5e4 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_00.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_00.dump @@ -8,10 +8,10 @@ |$+0#e000002&| +0#0000000&@73 |4+0#e000002&|2| +0#0000000&@72 |'+0#e000002&|a| +0#0000000&@72 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@69 -|/+0#e000e06&|f+0#0000000&|o@1| @70 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@69 -|?+0#e000e06&|f+0#0000000&|o@1| @70 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@69 +|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@70 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@69 +|?+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@70 |++0#e000e06&| +0#0000000&@73 |-+0#e000e06&| +0#0000000&@73 |++0#e000e06&|4|2| +0#0000000&@71 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_01.dump b/runtime/syntax/testdir/dumps/ed_addresses_01.dump index 85a6826214..1bcc039e3c 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_01.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_01.dump @@ -1,4 +1,4 @@ -|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @70 +|?+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@70 |++0#e000e06&| +0#0000000&@73 |-+0#e000e06&| +0#0000000&@73 |++0#e000e06&|4|2| +0#0000000&@71 @@ -8,8 +8,8 @@ |$+0#e000002&|p+0#af5f00255&| +0#0000000&@72 |4+0#e000002&|2|p+0#af5f00255&| +0#0000000&@71 |'+0#e000002&|a|p+0#af5f00255&| +0#0000000&@71 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@68 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|p+0#af5f00255&| +0#0000000&@68 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@68 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|p+0#af5f00255&| +0#0000000&@68 |++0#e000e06&|p+0#af5f00255&| +0#0000000&@72 |-+0#e000e06&|p+0#af5f00255&| +0#0000000&@72 |++0#e000e06&|4|2|p+0#af5f00255&| +0#0000000&@70 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_02.dump b/runtime/syntax/testdir/dumps/ed_addresses_02.dump index 30ded8bfa6..51911bfc73 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_02.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_02.dump @@ -1,14 +1,14 @@ |#+0#0000e05#ffffff0| |p|a|t@1|e|r|n| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54 @75 -|/+0#e000e06&|\+0#0000000&|/|f|o@1|\|/|b|a|r|\|/|/+0#e000e06&| +0#0000000&@60 -|?+0#e000e06&|\+0#0000000&|?|f|o@1|\|?|b|a|r|\|?|?+0#e000e06&| +0#0000000&@60 -|/+0#e000e06&|\+0#0000000&|/|f|o@1|\|/|b|a|r|\|/| @61 ->?+0#e000e06&|\+0#0000000&|?|f|o@1|\|?|b|a|r|\|?| @61 +|/+0#e000e06&|\+0#e000002&|/|f|o@1|\|/|b|a|r|\|/|/+0#e000e06&| +0#0000000&@60 +|?+0#e000e06&|\+0#e000002&|?|f|o@1|\|?|b|a|r|\|?|?+0#e000e06&| +0#0000000&@60 +|/+0#e000e06&|\+0#e000002&|/|f|o@1|\|/|b|a|r|\|/| +0#0000000&@61 +>?+0#e000e06&|\+0#e000002&|?|f|o@1|\|?|b|a|r|\|?| +0#0000000&@61 @75 -|/+0#e000e06&|f+0#0000000&|o@1|[|/|]|b|a|r|/+0#e000e06&| +0#0000000&@63 -|?+0#e000e06&|f+0#0000000&|o@1|[|?|]|b|a|r|?+0#e000e06&| +0#0000000&@63 -|/+0#e000e06&|f+0#0000000&|o@1|[|/|]|b|a|r| @64 -|?+0#e000e06&|f+0#0000000&|o@1|[|?|]|b|a|r| @64 +|/+0#e000e06&|f+0#e000002&|o@1|[|/|]|b|a|r|/+0#e000e06&| +0#0000000&@63 +|?+0#e000e06&|f+0#e000002&|o@1|[|?|]|b|a|r|?+0#e000e06&| +0#0000000&@63 +|/+0#e000e06&|f+0#e000002&|o@1|[|/|]|b|a|r| +0#0000000&@64 +|?+0#e000e06&|f+0#e000002&|o@1|[|?|]|b|a|r| +0#0000000&@64 @75 @75 |#+0#0000e05&| |M|o|d|i|f|i|e|r|s| +0#0000000&@63 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_05.dump b/runtime/syntax/testdir/dumps/ed_addresses_05.dump index 0dc85e759b..15c589aaec 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_05.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_05.dump @@ -14,7 +14,7 @@ |'+0#e000002&|a|4+0#e000e06&|2|+|-| +0#0000000&@68 |'+0#e000002&|a|4+0#e000e06&|2|-|+| +0#0000000&@68 @75 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+| +0#0000000&@68 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-| +0#0000000&@68 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|+| +0#0000000&@68 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|-| +0#0000000&@68 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66 @57|9|1|,|1| @9|3@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_06.dump b/runtime/syntax/testdir/dumps/ed_addresses_06.dump index 5544a9a66e..88c75e7cd3 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_06.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_06.dump @@ -1,20 +1,20 @@ -|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2| +0#0000000&@66 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|-|4|2| +0#0000000&@65 ->/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|+|4|2| +0#0000000&@65 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2|-| +0#0000000&@65 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2|+| +0#0000000&@65 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2|+|-| +0#0000000&@65 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2|-|+| +0#0000000&@65 +|/+0#e000e06#ffffff0|f+0#e000002&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|-|4|2| +0#0000000&@66 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|+|-|4|2| +0#0000000&@65 +>/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|-|+|4|2| +0#0000000&@65 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|+|4|2|-| +0#0000000&@65 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|-|4|2|+| +0#0000000&@65 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|4|2|+|-| +0#0000000&@65 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|4|2|-|+| +0#0000000&@65 @75 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+| +0#0000000&@68 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-| +0#0000000&@68 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2| +0#0000000&@66 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2| +0#0000000&@66 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|-|4|2| +0#0000000&@65 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|+| +0#0000000&@68 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|-| +0#0000000&@68 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|+|4|2| +0#0000000&@66 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|-|4|2| +0#0000000&@66 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|+|-|4|2| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65 @57|1|0|9|,|1| @8|4|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_07.dump b/runtime/syntax/testdir/dumps/ed_addresses_07.dump index 6baee89ba4..052dced505 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_07.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_07.dump @@ -1,14 +1,14 @@ -|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2|-| +0#0000000&@65 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2|+| +0#0000000&@65 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2|+|-| +0#0000000&@65 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2|-|+| +0#0000000&@65 +|?+0#e000e06#ffffff0|f+0#e000002&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|+|4|2|-| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|-|4|2|+| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|4|2|+|-| +0#0000000&@65 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|4|2|-|+| +0#0000000&@65 > @74 |#+0#0000e05&| |c|o|u|n|t|s| +0#0000000&@66 @75 |.+0#e000002&|4+0#e000e06&|2| +0#0000000&@71 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2| +0#0000000&@67 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2| +0#0000000&@67 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|4|2| +0#0000000&@67 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|4|2| +0#0000000&@67 @75 |#+0#0000e05&| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@62 @75 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_08.dump b/runtime/syntax/testdir/dumps/ed_addresses_08.dump index 5ce19ca6b3..7839596702 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_08.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_08.dump @@ -11,10 +11,10 @@ |,+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@72 |,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@71 |,+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@71 -|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 -|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 -|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@68 -|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 +|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 +|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@69 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@68 +|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@69 |,+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@72 |,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72 @57|1|4|5|,|1| @8|5|4|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_09.dump b/runtime/syntax/testdir/dumps/ed_addresses_09.dump index 419467a93e..f023a8c92a 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_09.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_09.dump @@ -6,10 +6,10 @@ >;+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@72 |;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@71 |;+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@71 -|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 -|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 -|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@68 -|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @69 +|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 +|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@69 +|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@68 +|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@69 |;+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@72 |;+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72 |;+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@70 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_10.dump b/runtime/syntax/testdir/dumps/ed_addresses_10.dump index ddc9d9c175..18d93fa7dd 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_10.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_10.dump @@ -1,8 +1,8 @@ |$+0#e000002#ffffff0|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 |4+0#e000002&|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@71 |'+0#e000002&|a|,+0#0000001#ffff4012| +0#0000000#ffffff0@71 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68 >++0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 |-+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72 |++0#e000e06&|4|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@70 @@ -12,8 +12,8 @@ |$+0#e000002&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 |4+0#e000002&|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@71 |'+0#e000002&|a|;+0#0000001#ffff4012| +0#0000000#ffffff0@71 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68 |++0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 |-+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72 |++0#e000e06&|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_11.dump b/runtime/syntax/testdir/dumps/ed_addresses_11.dump index dc28282211..a35035151b 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_11.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_11.dump @@ -5,8 +5,8 @@ |$+0#e000002&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 >4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 |'+0#e000002&|a|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 |++0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 |-+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 |++0#e000e06&|4|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 @@ -16,5 +16,5 @@ |4+0#e000002&|2|,+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@70 |4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 |4+0#e000002&|2|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@69 -|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@66 @57|1|9@1|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_12.dump b/runtime/syntax/testdir/dumps/ed_addresses_12.dump index 92011c70fa..1f90d8f8bf 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_12.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_12.dump @@ -1,7 +1,7 @@ -|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66 -|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 -|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@66 -|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 +|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@67 +|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@67 |4+0#e000002&|2|,+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@70 >4+0#e000002&|2|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@70 |4+0#e000002&|2|,+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@68 @@ -11,8 +11,8 @@ |$+0#e000002&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 |4+0#e000002&|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 |'+0#e000002&|a|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66 |++0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 |-+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70 |++0#e000e06&|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_13.dump b/runtime/syntax/testdir/dumps/ed_addresses_13.dump index e377448054..bd71668a70 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_13.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_13.dump @@ -4,10 +4,10 @@ |4+0#e000002&|2|;+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@70 |4+0#e000002&|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69 >4+0#e000002&|2|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@69 -|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66 -|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 -|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@66 -|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @67 +|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@67 +|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@66 +|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#e000002&|o@1| +0#0000000&@67 |4+0#e000002&|2|;+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@70 |4+0#e000002&|2|;+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@70 |4+0#e000002&|2|;+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@68 diff --git a/runtime/syntax/testdir/dumps/ed_addresses_14.dump b/runtime/syntax/testdir/dumps/ed_addresses_14.dump index 142f98eeaa..1fa95010dd 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_14.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_14.dump @@ -2,10 +2,10 @@ |$+0#e000002&| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|$+0#e000002&| +0#0000000&@65 |4+0#e000002&|2| +0#0000000&@3|,+0#0000001#ffff4012| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&@64 |'+0#e000002&|a| +0#0000000&@3|,+0#0000001#ffff4012| +0#0000000#ffffff0|'+0#e000002&|a| +0#0000000&@64 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@61 ->?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1| @62 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1| @62 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@61 +>?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@61 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@62 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@62 |++0#e000e06&| @4|,+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&| +0#0000000&@65 |-+0#e000e06&| @4|,+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&| +0#0000000&@65 |++0#e000e06&|4|2| +0#0000000&@2|,+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&|4|2| +0#0000000&@63 @@ -15,6 +15,6 @@ |$+0#e000002&| +0#0000000&@4|;+0#0000001#ffff4012| +0#0000000#ffffff0|$+0#e000002&| +0#0000000&@65 |4+0#e000002&|2| +0#0000000&@3|;+0#0000001#ffff4012| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&@64 |'+0#e000002&|a| +0#0000000&@3|;+0#0000001#ffff4012| +0#0000000#ffffff0|'+0#e000002&|a| +0#0000000&@64 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@61 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@61 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@61 @57|2|5|3|,|1| @8|9|6|%| diff --git a/runtime/syntax/testdir/dumps/ed_addresses_15.dump b/runtime/syntax/testdir/dumps/ed_addresses_15.dump index eab6c80cc0..c48edcf4f0 100644 --- a/runtime/syntax/testdir/dumps/ed_addresses_15.dump +++ b/runtime/syntax/testdir/dumps/ed_addresses_15.dump @@ -1,6 +1,6 @@ -|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61 -|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1| @62 -|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1| @62 +|?+0#e000e06#ffffff0|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&@61 +|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@62 +|?+0#e000e06&|f+0#e000002&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@62 |++0#e000e06&| @4|;+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&| +0#0000000&@65 |-+0#e000e06&| @4|;+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&| +0#0000000&@65 >++0#e000e06&|4|2| +0#0000000&@2|;+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&|4|2| +0#0000000&@63 diff --git a/runtime/syntax/testdir/dumps/ed_commands_02.dump b/runtime/syntax/testdir/dumps/ed_commands_02.dump index 1eec762f79..8bb6756f20 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_02.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_02.dump @@ -10,11 +10,11 @@ @75 |#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1| @68 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 @57|3|7|,|0|-|1| @8|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_03.dump b/runtime/syntax/testdir/dumps/ed_commands_03.dump index 961ad63e62..94b8bece5e 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_03.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_03.dump @@ -1,13 +1,13 @@ -|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 >l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&|\+0#e000e06&| +0#0000000&@72 |p+0#af5f00255&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&| +0#0000000&@73 @75 diff --git a/runtime/syntax/testdir/dumps/ed_commands_05.dump b/runtime/syntax/testdir/dumps/ed_commands_05.dump index 716a2b23c0..ae1151c638 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_05.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_05.dump @@ -15,6 +15,6 @@ @75 |#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 @57|9|1|,|1| @9|1|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_06.dump b/runtime/syntax/testdir/dumps/ed_commands_06.dump index 892b101516..19abf921bd 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_06.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_06.dump @@ -1,18 +1,18 @@ |.+0#af5f00255#ffffff0| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1| @68 @75 ->g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +>g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&|\+0#e000e06&| +0#0000000&@72 |p+0#af5f00255&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|c+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&| +0#0000000&@73 @75 diff --git a/runtime/syntax/testdir/dumps/ed_commands_09.dump b/runtime/syntax/testdir/dumps/ed_commands_09.dump index 2a38adaf16..956c3ebf6b 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_09.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_09.dump @@ -7,13 +7,13 @@ @75 |g+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 |g+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@69 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 @75 |1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 |1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@65 @75 |g+0#af5f00255&|/+0#e000e06&@1|p+0#af5f00255&| +0#0000000&@70 |g+0#af5f00255&|/+0#e000e06&@1|\| +0#0000000&@70 diff --git a/runtime/syntax/testdir/dumps/ed_commands_10.dump b/runtime/syntax/testdir/dumps/ed_commands_10.dump index bb46632b2a..4d1838916f 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_10.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_10.dump @@ -9,9 +9,9 @@ |n+0#af5f00255&|\+0#e000e06&| +0#0000000&@72 |p+0#af5f00255&| +0#0000000&@73 @75 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@64 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@60 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\| +0#0000000&@64 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@64 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@60 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|\| +0#0000000&@64 |.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@69 @75 @75 diff --git a/runtime/syntax/testdir/dumps/ed_commands_11.dump b/runtime/syntax/testdir/dumps/ed_commands_11.dump index c29b6740fe..a33ca4a760 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_11.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_11.dump @@ -2,15 +2,15 @@ @75 |G+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 |G+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 -|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 ->G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|G+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@69 +>G+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 @75 |1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 |1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@65 @75 -|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|G+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 |d+0#af5f00255&| +0#0000000&@73 |&+0#af5f00255&| +0#0000000&@73 @75 diff --git a/runtime/syntax/testdir/dumps/ed_commands_15.dump b/runtime/syntax/testdir/dumps/ed_commands_15.dump index 94202461f4..49dc24e2c6 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_15.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_15.dump @@ -10,11 +10,11 @@ @75 |#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |.+0#af5f00255&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1| @68 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 @57|2|7|1|,|0|-|1| @6|3|2|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_16.dump b/runtime/syntax/testdir/dumps/ed_commands_16.dump index 08fd835400..1deb21841a 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_16.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_16.dump @@ -1,13 +1,13 @@ -|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66 >l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&|\+0#e000e06&| +0#0000000&@72 |p+0#af5f00255&| +0#0000000&@73 @75 -|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 +|g+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|i+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65 |l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67 |.+0#e000002&| +0#0000000&@73 @75 diff --git a/runtime/syntax/testdir/dumps/ed_commands_19.dump b/runtime/syntax/testdir/dumps/ed_commands_19.dump index d9ba8fef7f..51d2248258 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_19.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_19.dump @@ -9,8 +9,8 @@ |m+0#af5f00255&|$+0#e000002&| +0#0000000&@72 |.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|$+0#e000002&| +0#0000000&@69 @75 -|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64 -|.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61 +|m+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61 @75 |m+0#af5f00255&|l| +0#0000000&@72 |m+0#af5f00255&|n| +0#0000000&@72 diff --git a/runtime/syntax/testdir/dumps/ed_commands_20.dump b/runtime/syntax/testdir/dumps/ed_commands_20.dump index 2550a648ce..b67daec291 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_20.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_20.dump @@ -2,15 +2,15 @@ |m+0#af5f00255&|$+0#e000002&|n+0#af5f00255&| +0#0000000&@71 |m+0#af5f00255&|$+0#e000002&|p+0#af5f00255&| +0#0000000&@71 @75 -|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63 ->m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63 -|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63 +|m+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63 +>m+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63 +|m+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63 @75 |#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 @75 |m+0#af5f00255&|l|n|p| +0#0000000&@70 |m+0#af5f00255&|$+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69 -|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61 +|m+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61 @75 @75 |#+0#0000e05&| |N|u|m|b|e|r| |C|o|m@1|a|n|d| +0#0000000&@58 diff --git a/runtime/syntax/testdir/dumps/ed_commands_24.dump b/runtime/syntax/testdir/dumps/ed_commands_24.dump index 34560f697f..9bbaa8d056 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_24.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_24.dump @@ -10,11 +10,11 @@ |#+0#0000e05&| |S|u|b|s|t|i|t|u|t|e| |C|o|m@1|a|n|d| +0#0000000&@54 @75 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@64 -|.+0#e000002&|,+0#0000000&|.+0#e000002&|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@61 @75 |s+0#af5f00255&|/+0#e000e06&@1|b+0#0000000&|a|r| @68 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|b|a|z| @62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|b|a|z| @62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 @57|4|3@1|,|1| @8|5|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_25.dump b/runtime/syntax/testdir/dumps/ed_commands_25.dump index 6de5a8d2ef..903f96bcb9 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_25.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_25.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 |b|a|z| @71 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64 |b|a|z|/+0#e000e06&| +0#0000000&@70 @75 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|b+0#0000000&|a|z| @61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|b+0#0000000&|a|z| @61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63 |b|a|z| @71 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63 |b|a|z|/+0#e000e06&| +0#0000000&@70 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%| +0#0000000&@67 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%|/| +0#0000000&@66 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%| +0#0000000&@67 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%|/| +0#0000000&@66 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\|%| +0#0000000&@66 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\|%|/| +0#0000000&@65 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&@1| @66 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&@1|/+0#e000e06&| +0#0000000&@65 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|\|%| +0#0000000&@66 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|\|%|/| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&@1| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&@1|/+0#e000e06&| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&|a| @66 @57|4|5|1|,|1| @8|5@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_26.dump b/runtime/syntax/testdir/dumps/ed_commands_26.dump index eb0abdab1b..89536246d4 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_26.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_26.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a| @66 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|/+0#e000e06&| +0#0000000&@65 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#0000000&|%| @66 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#0000000&|%|/+0#e000e06&| +0#0000000&@65 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|%| @65 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|%|/+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&|a| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&|a|/+0#e000e06&| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#0000000&|%| @66 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|a+0#0000000&|%|/+0#e000e06&| +0#0000000&@65 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&|a|%| @65 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|%+0#0000000&|a|%|/+0#e000e06&| +0#0000000&@64 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|2|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|3|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|4|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|5|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|6|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|7|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|8|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|9|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|2|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|3|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|4|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|5|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|6|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|7|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|8|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|9|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|0+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|0+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 @57|4|6|9|,|1| @8|5|7|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_27.dump b/runtime/syntax/testdir/dumps/ed_commands_27.dump index 3d6656c14b..0369d70fcd 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_27.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_27.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|2+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|3+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|4+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|5+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|6+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|7+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|8+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|9+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|2+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|3+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|4+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|5+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|6+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|7+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|8+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|9+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58 @75 @75 |#+0#0000e05&| |f|l|a|g|s| +0#0000000&@67 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g| +0#0000000&@63 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62 @57|4|8|7|,|1| @8|5|9|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_28.dump b/runtime/syntax/testdir/dumps/ed_commands_28.dump index 55b31f8eaa..756968e1dc 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_28.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_28.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61 @57|5|0|5|,|1| @8|6|1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_29.dump b/runtime/syntax/testdir/dumps/ed_commands_29.dump index 61aa012142..4e4235a9ac 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_29.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_29.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 @57|5|2|3|,|1| @8|6|4|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_30.dump b/runtime/syntax/testdir/dumps/ed_commands_30.dump index b8cfdfea66..c7c8e5d40f 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_30.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_30.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l|p| +0#0000000&@60 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|g| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|g| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|g| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l|p| +0#0000000&@60 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60 @57|5|4|1|,|1| @8|6@1|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_31.dump b/runtime/syntax/testdir/dumps/ed_commands_31.dump index b481c08832..fee6f1d076 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_31.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_31.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|g| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g|n| +0#0000000&@60 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|g| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|g| +0#0000000&@60 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g|n| +0#0000000&@60 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|g| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|g| +0#0000000&@60 @75 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3| +0#0000000&@63 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62 @57|5@1|9|,|1| @8|6|8|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_32.dump b/runtime/syntax/testdir/dumps/ed_commands_32.dump index 1b06960392..9421410bb5 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_32.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_32.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61 @57|5|7@1|,|1| @8|7|0|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_33.dump b/runtime/syntax/testdir/dumps/ed_commands_33.dump index 99947733a6..d9a9862a9f 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_33.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_33.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l| +0#0000000&@61 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3| +0#0000000&@61 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l| +0#0000000&@61 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3| +0#0000000&@61 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61 @75 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60 @57|5|9|5|,|1| @8|7|3|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_34.dump b/runtime/syntax/testdir/dumps/ed_commands_34.dump index ec720d67a3..794477c97d 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_34.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_34.dump @@ -1,20 +1,20 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n|l| +0#0000000&@60 ->s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|3| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|3| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3|p| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|3| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|3| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n|l| +0#0000000&@60 +>s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3|p| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60 @57|6|1|3|,|1| @8|7|5|%| diff --git a/runtime/syntax/testdir/dumps/ed_commands_35.dump b/runtime/syntax/testdir/dumps/ed_commands_35.dump index eeb50e4a59..f447cf73e6 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_35.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_35.dump @@ -1,8 +1,8 @@ -|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3|n| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|3| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3|l| +0#0000000&@60 -|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|3| +0#0000000&@60 +|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3|n| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|3| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3|l| +0#0000000&@60 +|s+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|3| +0#0000000&@60 > @74 @75 |#+0#0000e05&| |r|e|p|e|a|t| |l|a|s|t| |s|u|b|s|t|i|t|u|t|e| +0#0000000&@50 diff --git a/runtime/syntax/testdir/dumps/ed_commands_39.dump b/runtime/syntax/testdir/dumps/ed_commands_39.dump index ce953910ed..f50cf383c8 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_39.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_39.dump @@ -5,10 +5,10 @@ @75 >#+0#0000e05&| |r|e|p|e|a|t| |l|a|s|t| |s|u|b|s|t|i|t|u|t|e| |f|l|a|g|s| |a|s| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@30 @75 -|s+0#af5f00255&|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&| +0#0000000&@64 -|s+0#af5f00255&|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&| +0#0000000&@64 -|s+0#af5f00255&|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&| +0#0000000&@64 -|s+0#af5f00255&|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|3+0#e000e06&|.+0#e000002&@2|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|g+0#e000e06&|.+0#e000002&@2|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|p+0#e000e06&|.+0#e000002&@2|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&| +0#0000000&@64 +|s+0#af5f00255&|r+0#e000e06&|.+0#e000002&@2|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&| +0#0000000&@64 @75 @75 |#+0#0000e05&| |C|o|p|y| |C|o|m@1|a|n|d| +0#0000000&@60 diff --git a/runtime/syntax/testdir/dumps/ed_commands_40.dump b/runtime/syntax/testdir/dumps/ed_commands_40.dump index 505c073400..0253d5de40 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_40.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_40.dump @@ -1,6 +1,6 @@ | +0&#ffffff0@74 -|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64 -|.+0#e000002&|,+0#0000000&|.+0#e000002&|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61 +|t+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64 +|.+0#e000002&|,+0#0000000&|.+0#e000002&|t+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61 @75 |t+0#af5f00255&|l| +0#0000000&@72 >t+0#af5f00255&|n| +0#0000000&@72 @@ -10,9 +10,9 @@ |t+0#af5f00255&|$+0#e000002&|n+0#af5f00255&| +0#0000000&@71 |t+0#af5f00255&|$+0#e000002&|p+0#af5f00255&| +0#0000000&@71 @75 -|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63 -|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63 -|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63 +|t+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63 +|t+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63 +|t+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63 @75 |#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62 @75 diff --git a/runtime/syntax/testdir/dumps/ed_commands_41.dump b/runtime/syntax/testdir/dumps/ed_commands_41.dump index 5dce3cd831..bd6fd7cf20 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_41.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_41.dump @@ -1,6 +1,6 @@ |t+0#af5f00255#ffffff0|l|n|p| +0#0000000&@70 |t+0#af5f00255&|$+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69 -|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61 +|t+0#af5f00255&|/+0#e000e06&|p+0#e000002&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61 @75 @75 >#+0#0000e05&| |U|n|d|o| |C|o|m@1|a|n|d| +0#0000000&@60 diff --git a/runtime/syntax/testdir/dumps/ed_commands_42.dump b/runtime/syntax/testdir/dumps/ed_commands_42.dump index d72a8794e6..5ac28883c1 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_42.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_42.dump @@ -4,13 +4,13 @@ @75 |v+0#af5f00255&|/+0#e000e06&| +0#0000000&@72 >v+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 -|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 -|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|v+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@69 +|v+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 @75 |1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 |1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@65 @75 @75 |#+0#0000e05&| |I|n|t|e|r|a|c|t|i|v|e| |G|l|o|b|a|l| |N|o|n|-|M|a|t|c|h|e|d| |C|o|m@1|a|n|d| +0#0000000&@34 diff --git a/runtime/syntax/testdir/dumps/ed_commands_43.dump b/runtime/syntax/testdir/dumps/ed_commands_43.dump index 4b34f8a0e7..48747477e5 100644 --- a/runtime/syntax/testdir/dumps/ed_commands_43.dump +++ b/runtime/syntax/testdir/dumps/ed_commands_43.dump @@ -1,12 +1,12 @@ |V+0#af5f00255#ffffff0|/+0#e000e06&| +0#0000000&@72 |V+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71 -|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69 -|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68 +|V+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@69 +|V+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@68 @75 >1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&| +0#0000000&@69 |1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66 -|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1| +0#0000000&@66 +|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#e000002&|o@1|/+0#e000e06&| +0#0000000&@65 @75 @75 |#+0#0000e05&| |W|r|i|t|e| |C|o|m@1|a|n|d| +0#0000000&@59 From 9d42657f804d18b8dd287558fc0fea0440a22770 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Thu, 27 Aug 2026 20:44:21 +0000 Subject: [PATCH 448/647] runtime(vim): Update base syntax, link straggler regexp groups Hi-link a few more straggler pattern groups to Regexp. closes: #21165 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 10 +++++----- runtime/syntax/vim.vim | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 8188d9c6ff..c14ed46e20 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 26 +" Last Change: 2026 Aug 27 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -3113,7 +3113,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimNonText NonText hi def link vimNormal vimCommand hi def link vimNotation Special - hi def link vimNotPatSep vimString + hi def link vimNotPatSep Regexp hi def link vimNumber Number hi def link vimOperError Error hi def link vimOper Operator @@ -3128,7 +3128,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimPatSepErr vimError hi def link vimPatSepR vimPatSep hi def link vimPatSep SpecialChar - hi def link vimPatSepZone vimString + hi def link vimPatSepZone Regexp hi def link vimPatSepZ vimPatSep hi def link vimPattern Type hi def link vimPerl vimCommand @@ -3204,7 +3204,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSubstFlags Special hi def link vimSubstPat Regexp hi def link vimSubstSubstr SpecialChar - hi def link vimSubstTwoBS vimString + hi def link vimSubstTwoBS Regexp hi def link vimSubst vimCommand hi def link vimSubst_ vimSubst hi def link vimSynCase Type @@ -3234,7 +3234,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSynNextgroup vimSynOption hi def link vimSynNotPatRange vimSynRegPat hi def link vimSynOption Special - hi def link vimSynPatRange vimString + hi def link vimSynPatRange Regexp hi def link vimSynReg Type hi def link vimSynRegOpt vimSynOption hi def link vimSynRegPat Regexp diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index c878d729d0..1877e8dc06 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 26 +" Last Change: 2026 Aug 27 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -3212,7 +3212,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimNonText NonText hi def link vimNormal vimCommand hi def link vimNotation Special - hi def link vimNotPatSep vimString + hi def link vimNotPatSep Regexp hi def link vimNumber Number hi def link vimOperError Error hi def link vimOper Operator @@ -3227,7 +3227,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimPatSepErr vimError hi def link vimPatSepR vimPatSep hi def link vimPatSep SpecialChar - hi def link vimPatSepZone vimString + hi def link vimPatSepZone Regexp hi def link vimPatSepZ vimPatSep hi def link vimPattern Type hi def link vimPerl vimCommand @@ -3303,7 +3303,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSubstFlags Special hi def link vimSubstPat Regexp hi def link vimSubstSubstr SpecialChar - hi def link vimSubstTwoBS vimString + hi def link vimSubstTwoBS Regexp hi def link vimSubst vimCommand hi def link vimSubst_ vimSubst hi def link vimSynCase Type @@ -3333,7 +3333,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimSynNextgroup vimSynOption hi def link vimSynNotPatRange vimSynRegPat hi def link vimSynOption Special - hi def link vimSynPatRange vimString + hi def link vimSynPatRange Regexp hi def link vimSynReg Type hi def link vimSynRegOpt vimSynOption hi def link vimSynRegPat Regexp From 964a495bef698368f4e200b1d22d63da27f47948 Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Thu, 27 Aug 2026 20:51:07 +0000 Subject: [PATCH 449/647] runtime(html): match plain tag and attribute names as keywords Problem: Several tag and attribute names are highlighted with regular expression alternations even though they are plain words. A :syn-match with an alternation is retried at nearly every position of every tag. Solution: Move the plain-word tag names (b, i, u, em, strong, head, body, title, h1-h6) and the "label", "href" and "title" attribute names into syn-keyword lists, leaving only the genuinely hyphenated names "accept-charset" and "http-equiv" as matches. Profiling a 6000-line HTML file with :syntime, the converted rules drop from a combined 0.044s to 0.004s, lowering total per-rule syntax time by about 15%. Highlighting is unchanged except that a bare valueless "href" attribute is now highlighted as an attribute, consistent with a bare "title", which already behaved that way. closes: #21155 Signed-off-by: Julien Voisin Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/html.vim | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/runtime/syntax/html.vim b/runtime/syntax/html.vim index 0e615b70fe..7c9f872676 100644 --- a/runtime/syntax/html.vim +++ b/runtime/syntax/html.vim @@ -6,6 +6,7 @@ " Last Change: 2023 Nov 28 " 2024 Jul 30 by Vim Project: increase syn-sync-minlines to 250 " 2025 May 10 by Vim Project: update comment +" 2026 Aug 26 by Vim Project: match plain tag/attribute names as keywords " See :help html.vim for some comments and a description of the options @@ -49,7 +50,7 @@ syn keyword htmlTagName contained input isindex kbd li link map menu syn keyword htmlTagName contained meta ol option param pre p samp span syn keyword htmlTagName contained select small strike sub sup syn keyword htmlTagName contained table td textarea th tr tt ul var xmp -syn match htmlTagName contained "\<\%(b\|i\|u\|h[1-6]\|em\|strong\|head\|body\|title\)\>" +syn keyword htmlTagName contained b i u em strong head body title h1 h2 h3 h4 h5 h6 " new html 4.0 tags syn keyword htmlTagName contained abbr acronym bdo button col colgroup @@ -80,15 +81,13 @@ syn keyword htmlArg contained align alink alt archive background bgcolor syn keyword htmlArg contained border bordercolor cellpadding syn keyword htmlArg contained cellspacing checked class clear code codebase color syn keyword htmlArg contained cols colspan content coords enctype face -syn keyword htmlArg contained gutter height hspace id +syn keyword htmlArg contained gutter height href hspace id syn keyword htmlArg contained link lowsrc marginheight syn keyword htmlArg contained marginwidth maxlength method name prompt -syn keyword htmlArg contained rel rev rows rowspan scrolling selected shape -syn keyword htmlArg contained size src start target text type url +syn keyword htmlArg contained rel rev role rows rowspan scrolling selected shape +syn keyword htmlArg contained size src start target text title type url syn keyword htmlArg contained usemap ismap valign value vlink vspace width wrap -syn match htmlArg contained "\<\%(http-equiv\|href\|title\)="me=e-1 - -syn keyword htmlArg contained role +syn match htmlArg contained "\" syn keyword htmlTagName contained marquee " html 4.0 arg names -syn match htmlArg contained "\<\%(accept-charset\|label\)\>" +syn match htmlArg contained "\" syn keyword htmlArg contained abbr accept accesskey axis char charoff charset syn keyword htmlArg contained cite classid codetype compact data datetime syn keyword htmlArg contained declare defer dir disabled for frame -syn keyword htmlArg contained headers hreflang lang language longdesc +syn keyword htmlArg contained headers hreflang label lang language longdesc syn keyword htmlArg contained multiple nohref nowrap object profile readonly syn keyword htmlArg contained rules scheme scope span standby style syn keyword htmlArg contained summary tabindex valuetype version From 53e627538652ebc4a9657bd80c2694c1405d1cf6 Mon Sep 17 00:00:00 2001 From: Rochish Manda <28740792+Rochish-Manda@users.noreply.github.com> Date: Thu, 27 Aug 2026 20:57:47 +0000 Subject: [PATCH 450/647] runtime(doc): Fix typo in previewpopup option closes: #21151 Signed-off-by: Rochish Manda <28740792+Rochish-Manda@users.noreply.github.com> Signed-off-by: Christian Brabandt --- runtime/doc/windows.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt index f0d9afaf1a..03ddab926e 100644 --- a/runtime/doc/windows.txt +++ b/runtime/doc/windows.txt @@ -1,4 +1,4 @@ -*windows.txt* For Vim version 9.2. Last change: 2026 May 01 +*windows.txt* For Vim version 9.2. Last change: 2026 Aug 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -969,7 +969,7 @@ settings. The option is a comma-separated list of values: Example: > :set previewpopup=height:10,width:60 - :set previewpopup=border:single,borderhilight:PmenuBorder + :set previewpopup=border:single,borderhighlight:PmenuBorder :set previewpopup=border:custom:─;│;─;│;┌;┐;┘;└ :set previewpopup=border:round,opacity:80 From 5ab969f719bb09555e90e8dff8c94fc37bcbf2ae Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 27 Aug 2026 21:14:34 +0000 Subject: [PATCH 451/647] patch 9.2.1015: Vim9: v:errmsg is set while looking ahead at a command Problem: In Vim9 script a line starting with a dict member is looked ahead at, to tell an assignment from an expression. Where the expression runs on into the next line the lookahead cannot follow it, and what it makes of that reaches "v:errmsg" and whatever is being redirected, though nothing is wrong and the function compiles. Solution: Turn error messages off around the lookahead instead of silencing them (Hirohito Higashi). closes: #21168 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/ex_docmd.c | 4 ++-- src/testdir/test_vim9_cmd.vim | 17 +++++++++++++++++ src/testdir/test_vim9_generics.vim | 8 ++++---- src/version.c | 2 ++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index f5771cb615..c7343d2901 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -3848,7 +3848,7 @@ find_ex_command( // name[idx].member = val // etc. eap->cmdidx = CMD_eval; - ++emsg_silent; + ++emsg_off; if (skip_expr(&after, NULL) == OK) { after = skipwhite(after); @@ -3857,7 +3857,7 @@ find_ex_command( && after[2] == '=')) eap->cmdidx = CMD_var; } - --emsg_silent; + --emsg_off; return eap->cmd; } diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index 8eaa2a875a..68623273ed 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -2251,4 +2251,21 @@ def Test_delfunction_dict_funcref() v9.CheckScriptSuccess(lines) enddef +" Looking ahead at a line that starts with a dict member, to tell an +" assignment from an expression, must not leave an error behind. +def Test_no_error_from_looking_ahead() + var lines =<< trim END + vim9script + var d = {Fn: (m: string) => 0} + def F(b: bool) + d.Fn(b ? 'one' + : 'two') + enddef + v:errmsg = '' + defcompile + assert_equal('', v:errmsg) + END + v9.CheckScriptSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/testdir/test_vim9_generics.vim b/src/testdir/test_vim9_generics.vim index 9aadd99cfd..c86c1e7c7e 100644 --- a/src/testdir/test_vim9_generics.vim +++ b/src/testdir/test_vim9_generics.vim @@ -1211,7 +1211,7 @@ def Test_generic_obj_method() var a = A.new() a.Fn<>() END - v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function '<>()'"]) + v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function 'Fn'"]) lines =<< trim END vim9script @@ -1295,7 +1295,7 @@ def Test_generic_obj_method_call_from_another_method() enddef defcompile END - v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function '<>()'"]) + v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function 'Fn'"]) lines =<< trim END vim9script @@ -1476,7 +1476,7 @@ def Test_generic_class_method() endclass A.Fn<>() END - v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function '<>()'"]) + v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function 'Fn'"]) lines =<< trim END vim9script @@ -1554,7 +1554,7 @@ def Test_generic_class_method_call_from_another_method() enddef defcompile END - v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function '<>()'"]) + v9.CheckSourceFailureList(lines, ["E1555: Empty type list specified for generic function 'Fn'"]) lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index b8ad10924a..fb880c7c12 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1015, /**/ 1014, /**/ From 6a47619bc29ae00bdcfbb12c2554b618d4054210 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 28 Aug 2026 16:49:52 +0000 Subject: [PATCH 452/647] patch 9.2.1016: tests: viminfo bar line length overflow test fails under ASAN Problem: Test_viminfo_len_overflow() triggers an ASAN abort when attempting a ~4GB allocation, before alloc() can return NULL Solution: Skip the test when running under ASAN. closes: #21170 Signed-off-by: Christian Brabandt --- src/testdir/test_viminfo.vim | 1 + src/version.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim index d95250a9ea..3d4034be1a 100644 --- a/src/testdir/test_viminfo.vim +++ b/src/testdir/test_viminfo.vim @@ -1385,6 +1385,7 @@ func Test_viminfo_len_one() endfunc func Test_viminfo_len_overflow() + CheckNotAsan let _viminfofile = &viminfofile let &viminfofile='' let viminfo_file = tempname() diff --git a/src/version.c b/src/version.c index fb880c7c12..a9ca24b4bb 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1016, /**/ 1015, /**/ From 7aecb2cca89cfd61741c0b2a3cf8cdac2ebf5e29 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 28 Aug 2026 16:53:32 +0000 Subject: [PATCH 453/647] patch 9.2.1017: heap-use-after-free in ml_open_file() Problem: A SwapExists autocmd can re-open the buffer being edited, causing ml_close() to free the memfile that ml_open_file() still holds a local pointer to, causing use-after-free. Solution: After findswapname() returns, verify that buf->b_ml.ml_mfp is still the same as the copy mfp we hold. closes: #21171 Signed-off-by: Christian Brabandt --- src/memline.c | 6 ++++++ src/version.c | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/memline.c b/src/memline.c index 2e0403d416..c5ef583e64 100644 --- a/src/memline.c +++ b/src/memline.c @@ -810,6 +810,12 @@ ml_open_file(buf_T *buf) // and creating it, another Vim creates the file. In that case the // creation will fail and we will use another directory. fname = findswapname(buf, &dirp, NULL); // allocates fname + // autocmd may have freed mfp, grr! + if (buf->b_ml.ml_mfp != mfp) + { + vim_free(fname); + return; + } if (dirp == NULL) break; // out of memory if (fname == NULL) diff --git a/src/version.c b/src/version.c index a9ca24b4bb..b4aff34729 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1017, /**/ 1016, /**/ From d4c8c66bed0615058073985627a15e9c1c01af06 Mon Sep 17 00:00:00 2001 From: mdspan Date: Fri, 28 Aug 2026 16:58:06 +0000 Subject: [PATCH 454/647] patch 9.2.1018: filetype: radvd config files are not recognized Problem: filetype: radvd config files are not recognized Solution: Detect radvd.conf as radvd filetype, include syntax and filetype plugins, add syntax tests, update the menus (mdspan). Reference: https://linux.die.net/man/5/radvd.conf closes: #21159 Signed-off-by: mdspan Signed-off-by: Christian Brabandt --- .github/MAINTAINERS | 2 + runtime/autoload/dist/ft.vim | 4 +- runtime/ftplugin/radvd.vim | 13 +++++ runtime/makemenu.vim | 3 +- runtime/synmenu.vim | 59 +++++++++---------- runtime/syntax/radvd.vim | 66 ++++++++++++++++++++++ runtime/syntax/testdir/dumps/radvd_00.dump | 20 +++++++ runtime/syntax/testdir/dumps/radvd_01.dump | 20 +++++++ runtime/syntax/testdir/dumps/radvd_02.dump | 20 +++++++ runtime/syntax/testdir/dumps/radvd_03.dump | 20 +++++++ runtime/syntax/testdir/input/radvd.radvd | 52 +++++++++++++++++ src/testdir/test_filetype.vim | 1 + src/version.c | 2 + 13 files changed, 251 insertions(+), 31 deletions(-) create mode 100644 runtime/ftplugin/radvd.vim create mode 100644 runtime/syntax/radvd.vim create mode 100644 runtime/syntax/testdir/dumps/radvd_00.dump create mode 100644 runtime/syntax/testdir/dumps/radvd_01.dump create mode 100644 runtime/syntax/testdir/dumps/radvd_02.dump create mode 100644 runtime/syntax/testdir/dumps/radvd_03.dump create mode 100644 runtime/syntax/testdir/input/radvd.radvd diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 26d79fc062..392d6b868f 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -311,6 +311,7 @@ runtime/ftplugin/python.vim @tpict runtime/ftplugin/qb64.vim @dkearns runtime/ftplugin/qml.vim @ChaseKnowlden runtime/ftplugin/racket.vim @benknoble +runtime/ftplugin/radvd.vim @mdspan runtime/ftplugin/rasi.vim @fymyte runtime/ftplugin/readline.vim @dkearns runtime/ftplugin/remind.vim @joereynolds @@ -684,6 +685,7 @@ runtime/syntax/pymanifest.vim @ObserverOfTime runtime/syntax/qb64.vim @dkearns runtime/syntax/qml.vim @ChaseKnowlden runtime/syntax/racket.vim @benknoble +runtime/syntax/radvd.vim @mdspan runtime/syntax/raml.vim @in3d runtime/syntax/rapid.vim @KnoP-01 runtime/syntax/rasi.vim @fymyte diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index f28a89fc09..93a80f4a74 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2026 Aug 25 +# Last Change: 2026 Aug 26 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -3444,6 +3444,8 @@ const ft_from_name = { "MANIFEST.in": "pymanifest", # QMLdir "qmldir": "qmldir", + # radvd(8) configuration + "radvd.conf": "radvd", # Ratpoison config/command files ".ratpoisonrc": "ratpoison", "ratpoisonrc": "ratpoison", diff --git a/runtime/ftplugin/radvd.vim b/runtime/ftplugin/radvd.vim new file mode 100644 index 0000000000..2af35656da --- /dev/null +++ b/runtime/ftplugin/radvd.vim @@ -0,0 +1,13 @@ +" Vim filetype plugin file +" Language: radvd configuration +" Maintainer: mdspan +" Last Change: 2026 Aug 27 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +setlocal comments=s1:/*,mb:*,ex:*/,://,:# commentstring=#\ %s + +let b:undo_ftplugin = "setl com< cms<" diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 1ac2a27acc..72d60e7ff9 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -2,7 +2,7 @@ vim9script # Script to define the syntax menu in synmenu.vim # Maintainer: The Vim Project -# Last Change: 2026 Aug 25 +# Last Change: 2026 Aug 26 # Former Maintainer: Bram Moolenaar # This is used by "make menu" in the src directory. @@ -605,6 +605,7 @@ SynMenu R.R.R\ noweb:rnoweb SynMenu R.Racc\ input:racc SynMenu R.Racket:racket SynMenu R.Radiance:radiance +SynMenu R.Radvd\ config:radvd SynMenu R.Raml:raml SynMenu R.Rapid:rapid SynMenu R.Rasi:rasi diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index 53d56772e1..a63ec50f6f 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -581,35 +581,36 @@ an 50.100.120 &Syntax.R.R.R\ noweb :cal SetSyn("rnoweb") an 50.100.130 &Syntax.R.Racc\ input :cal SetSyn("racc") an 50.100.140 &Syntax.R.Racket :cal SetSyn("racket") an 50.100.150 &Syntax.R.Radiance :cal SetSyn("radiance") -an 50.100.160 &Syntax.R.Raml :cal SetSyn("raml") -an 50.100.170 &Syntax.R.Rapid :cal SetSyn("rapid") -an 50.100.180 &Syntax.R.Rasi :cal SetSyn("rasi") -an 50.100.190 &Syntax.R.Ratpoison :cal SetSyn("ratpoison") -an 50.100.200 &Syntax.R.RCS.RCS\ log\ output :cal SetSyn("rcslog") -an 50.100.210 &Syntax.R.RCS.RCS\ file :cal SetSyn("rcs") -an 50.100.220 &Syntax.R.Readline\ config :cal SetSyn("readline") -an 50.100.230 &Syntax.R.Rebol :cal SetSyn("rebol") -an 50.100.240 &Syntax.R.ReDIF :cal SetSyn("redif") -an 50.100.250 &Syntax.R.Rego :cal SetSyn("rego") -an 50.100.260 &Syntax.R.Relax\ NG :cal SetSyn("rng") -an 50.100.270 &Syntax.R.Remind :cal SetSyn("remind") -an 50.100.280 &Syntax.R.Relax\ NG\ compact :cal SetSyn("rnc") -an 50.100.290 &Syntax.R.Renderman.Renderman\ Shader\ Lang :cal SetSyn("sl") -an 50.100.300 &Syntax.R.Renderman.Renderman\ Interface\ Bytestream :cal SetSyn("rib") -an 50.100.310 &Syntax.R.Requirements :cal SetSyn("requirements") -an 50.100.320 &Syntax.R.Resolv\.conf :cal SetSyn("resolv") -an 50.100.330 &Syntax.R.Reva\ Forth :cal SetSyn("reva") -an 50.100.340 &Syntax.R.Rexx :cal SetSyn("rexx") -an 50.100.350 &Syntax.R.Robots\.txt :cal SetSyn("robots") -an 50.100.360 &Syntax.R.RockLinux\ package\ desc\. :cal SetSyn("desc") -an 50.100.370 &Syntax.R.Rpcgen :cal SetSyn("rpcgen") -an 50.100.380 &Syntax.R.RPL/2 :cal SetSyn("rpl") -an 50.100.390 &Syntax.R.ReStructuredText :cal SetSyn("rst") -an 50.100.400 &Syntax.R.ReStructuredText\ with\ R\ statements :cal SetSyn("rrst") -an 50.100.410 &Syntax.R.Routeros :cal SetSyn("routeros") -an 50.100.420 &Syntax.R.RTF :cal SetSyn("rtf") -an 50.100.430 &Syntax.R.Ruby :cal SetSyn("ruby") -an 50.100.440 &Syntax.R.Rust :cal SetSyn("rust") +an 50.100.160 &Syntax.R.Radvd\ config :cal SetSyn("radvd") +an 50.100.170 &Syntax.R.Raml :cal SetSyn("raml") +an 50.100.180 &Syntax.R.Rapid :cal SetSyn("rapid") +an 50.100.190 &Syntax.R.Rasi :cal SetSyn("rasi") +an 50.100.200 &Syntax.R.Ratpoison :cal SetSyn("ratpoison") +an 50.100.210 &Syntax.R.RCS.RCS\ log\ output :cal SetSyn("rcslog") +an 50.100.220 &Syntax.R.RCS.RCS\ file :cal SetSyn("rcs") +an 50.100.230 &Syntax.R.Readline\ config :cal SetSyn("readline") +an 50.100.240 &Syntax.R.Rebol :cal SetSyn("rebol") +an 50.100.250 &Syntax.R.ReDIF :cal SetSyn("redif") +an 50.100.260 &Syntax.R.Rego :cal SetSyn("rego") +an 50.100.270 &Syntax.R.Relax\ NG :cal SetSyn("rng") +an 50.100.280 &Syntax.R.Remind :cal SetSyn("remind") +an 50.100.290 &Syntax.R.Relax\ NG\ compact :cal SetSyn("rnc") +an 50.100.300 &Syntax.R.Renderman.Renderman\ Shader\ Lang :cal SetSyn("sl") +an 50.100.310 &Syntax.R.Renderman.Renderman\ Interface\ Bytestream :cal SetSyn("rib") +an 50.100.320 &Syntax.R.Requirements :cal SetSyn("requirements") +an 50.100.330 &Syntax.R.Resolv\.conf :cal SetSyn("resolv") +an 50.100.340 &Syntax.R.Reva\ Forth :cal SetSyn("reva") +an 50.100.350 &Syntax.R.Rexx :cal SetSyn("rexx") +an 50.100.360 &Syntax.R.Robots\.txt :cal SetSyn("robots") +an 50.100.370 &Syntax.R.RockLinux\ package\ desc\. :cal SetSyn("desc") +an 50.100.380 &Syntax.R.Rpcgen :cal SetSyn("rpcgen") +an 50.100.390 &Syntax.R.RPL/2 :cal SetSyn("rpl") +an 50.100.400 &Syntax.R.ReStructuredText :cal SetSyn("rst") +an 50.100.410 &Syntax.R.ReStructuredText\ with\ R\ statements :cal SetSyn("rrst") +an 50.100.420 &Syntax.R.Routeros :cal SetSyn("routeros") +an 50.100.430 &Syntax.R.RTF :cal SetSyn("rtf") +an 50.100.440 &Syntax.R.Ruby :cal SetSyn("ruby") +an 50.100.450 &Syntax.R.Rust :cal SetSyn("rust") an 50.110.100 &Syntax.S-Sm.S-Lang :cal SetSyn("slang") an 50.110.110 &Syntax.S-Sm.Samba\ config :cal SetSyn("samba") an 50.110.120 &Syntax.S-Sm.SAS :cal SetSyn("sas") diff --git a/runtime/syntax/radvd.vim b/runtime/syntax/radvd.vim new file mode 100644 index 0000000000..5bad480176 --- /dev/null +++ b/runtime/syntax/radvd.vim @@ -0,0 +1,66 @@ +" Vim syntax file +" Language: radvd configuration +" Maintainer: mdspan +" Last Change: 2026 Aug 26 +" Reference: radvd.conf(5) + +if exists("b:current_syntax") + finish +endif + +" block keywords +syn keyword radvdBlock interface prefix route clients abro +syn keyword radvdBlock RDNSS DNSSL AdvRASrcAddress nat64prefix + +" interface options +syn keyword radvdOption IgnoreIfMissing AdvSendAdvert UnicastOnly +syn keyword radvdOption AdvRASolicitedUnicast MaxRtrAdvInterval +syn keyword radvdOption MinRtrAdvInterval MinDelayBetweenRAs +syn keyword radvdOption AdvManagedFlag AdvOtherConfigFlag AdvLinkMTU +syn keyword radvdOption AdvReachableTime AdvRetransTimer AdvCurHopLimit +syn keyword radvdOption AdvDefaultLifetime AdvDefaultPreference +syn keyword radvdOption AdvSourceLLAddress AdvHomeAgentFlag +syn keyword radvdOption AdvHomeAgentInfo HomeAgentLifetime +syn keyword radvdOption HomeAgentPreference AdvMobRtrSupportFlag +syn keyword radvdOption AdvIntervalOpt AdvCaptivePortalAPI + +" prefix options +syn keyword radvdOption AdvOnLink AdvAutonomous AdvRouterAddr +syn keyword radvdOption AdvValidLifetime AdvPreferredLifetime +syn keyword radvdOption DeprecatePrefix DecrementLifetimes +syn keyword radvdOption Base6Interface Base6to4Interface + +" route, RDNSS, DNSSL and abro options +syn keyword radvdOption AdvRouteLifetime AdvRoutePreference RemoveRoute +syn keyword radvdOption AdvRDNSSLifetime FlushRDNSS +syn keyword radvdOption AdvDNSSLLifetime FlushDNSSL +syn keyword radvdOption AdvVersionLow AdvVersionHigh AdvValidLifeTime + +" values +syn keyword radvdBool on off +syn keyword radvdPreference low medium high +syn keyword radvdInfinity infinity +syn match radvdNumber "\<\d\+\%(\.\d\+\)\=\>" +syn match radvdIPv6 "\%(\x\{1,4}\)\=\%(:\x\{0,4}\)\+\%(/\d\{1,3}\)\=" + +" delimiters +syn match radvdDelimiter "[{};]" + +" comments +syn keyword radvdTodo contained TODO FIXME XXX NOTE +syn match radvdComment "#.*$" contains=radvdTodo,@Spell +syn match radvdComment "//.*$" contains=radvdTodo,@Spell +syn region radvdComment start="/\*" end="\*/" contains=radvdTodo,@Spell + +hi def link radvdBlock Keyword +hi def link radvdOption Identifier +hi def link radvdBool Boolean +hi def link radvdPreference Constant +hi def link radvdInfinity Constant +hi def link radvdNumber Number +hi def link radvdIPv6 Constant +hi def link radvdDelimiter Delimiter +hi def link radvdTodo Todo +hi def link radvdComment Comment + +let b:current_syntax = "radvd" diff --git a/runtime/syntax/testdir/dumps/radvd_00.dump b/runtime/syntax/testdir/dumps/radvd_00.dump new file mode 100644 index 0000000000..8cbc7c8b16 --- /dev/null +++ b/runtime/syntax/testdir/dumps/radvd_00.dump @@ -0,0 +1,20 @@ +>#+0#0000e05#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |c|a|l@1| |D|e|f|e|r|R|e|n|a|m|i|n|g|T|e|s|t|F|i|l|e|T|o|(|'|r|a|d|v|d|.|c|o|n|f|'|)| +0#0000000&@15 +|#+0#0000e05&| |r|a|d|v|d| |c|o|n|f|i|g|u|r|a|t|i|o|n| +0#0000000&@53 +|#+0#0000e05&| |T+0#0000001#ffff4012|O|D|O| +0#0000e05#ffffff0|c|o|m@1|e|n|t|s| |a|r|e| |h|i|g|h|l|i|g|h|t|e|d| +0#0000000&@43 +@75 +|i+0#af5f00255&|n|t|e|r|f|a|c|e| +0#0000000&|e|t|h|0| @60 +|{+0#e000e06&| +0#0000000&@73 +@8|A+0#00e0e07&|d|v|S|e|n|d|A|d|v|e|r|t| +0#0000000&|o+0#e000002&|n|;+0#e000e06&| +0#0000000&@49 +@8|M+0#00e0e07&|i|n|R|t|r|A|d|v|I|n|t|e|r|v|a|l| +0#0000000&|3+0#e000002&|;+0#e000e06&| +0#0000000&@46 +@8|M+0#00e0e07&|a|x|R|t|r|A|d|v|I|n|t|e|r|v|a|l| +0#0000000&|1+0#e000002&|0|;+0#e000e06&| +0#0000000&@45 +@8|A+0#00e0e07&|d|v|D|e|f|a|u|l|t|P|r|e|f|e|r|e|n|c|e| +0#0000000&|l+0#e000002&|o|w|;+0#e000e06&| +0#0000000&@41 +@8|A+0#00e0e07&|d|v|H|o|m|e|A|g|e|n|t|F|l|a|g| +0#0000000&|o+0#e000002&|f@1|;+0#e000e06&| +0#0000000&@45 +@75 +@8|p+0#af5f00255&|r|e|f|i|x| +0#0000000&|2+0#e000002&|0@1|1|:|d|b|8|:|0|:|1|:@1|/|6|4| +0#0000000&@42 +@8|{+0#e000e06&| +0#0000000&@65 +@16|A+0#00e0e07&|d|v|O|n|L|i|n|k| +0#0000000&|o+0#e000002&|n|;+0#e000e06&| +0#0000000&@45 +@16|A+0#00e0e07&|d|v|A|u|t|o|n|o|m|o|u|s| +0#0000000&|o+0#e000002&|n|;+0#e000e06&| +0#0000000&@41 +@16|A+0#00e0e07&|d|v|R|o|u|t|e|r|A|d@1|r| +0#0000000&|o+0#e000002&|f@1|;+0#e000e06&| +0#0000000&@40 +@16|A+0#00e0e07&|d|v|V|a|l|i|d|L|i|f|e|t|i|m|e| +0#0000000&|i+0#e000002&|n|f|i|n|i|t|y|;+0#e000e06&| +0#0000000&@32 +@8|}+0#e000e06&|;| +0#0000000&@64 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/radvd_01.dump b/runtime/syntax/testdir/dumps/radvd_01.dump new file mode 100644 index 0000000000..7e1c41d283 --- /dev/null +++ b/runtime/syntax/testdir/dumps/radvd_01.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@7|{+0#e000e06&| +0#0000000&@65 +@16|A+0#00e0e07&|d|v|O|n|L|i|n|k| +0#0000000&|o+0#e000002&|n|;+0#e000e06&| +0#0000000&@45 +@16|A+0#00e0e07&|d|v|A|u|t|o|n|o|m|o|u|s| +0#0000000&|o+0#e000002&|n|;+0#e000e06&| +0#0000000&@41 +@16|A+0#00e0e07&|d|v|R|o|u|t|e|r|A|d@1|r| +0#0000000&|o+0#e000002&|f@1|;+0#e000e06&| +0#0000000&@40 +@16|A+0#00e0e07&|d|v|V|a|l|i|d|L|i|f|e|t|i|m|e| +0#0000000&|i+0#e000002&|n|f|i|n|i|t|y|;+0#e000e06&| +0#0000000&@32 +@8>}+0#e000e06&|;| +0#0000000&@64 +@75 +@8|/+0#0000e05&@1| |r|o|u|t|e| |w|i|t|h| |a| |p|r|e|f|e|r|e|n|c|e| +0#0000000&@40 +@8|r+0#af5f00255&|o|u|t|e| +0#0000000&|2+0#e000002&|0@1|1|:|d|b|8|:|0|:|2|:@1|/|6|4| +0#0000000&@43 +@8|{+0#e000e06&| +0#0000000&@65 +@16|A+0#00e0e07&|d|v|R|o|u|t|e|P|r|e|f|e|r|e|n|c|e| +0#0000000&|h+0#e000002&|i|g|h|;+0#e000e06&| +0#0000000&@34 +@16|A+0#00e0e07&|d|v|R|o|u|t|e|L|i|f|e|t|i|m|e| +0#0000000&|3+0#e000002&|6|0@1|;+0#e000e06&| +0#0000000&@36 +@8|}+0#e000e06&|;| +0#0000000&@64 +@75 +@8|/+0#0000e05&|*| |r|e|c|u|r|s|i|v|e| |D|N|S| |s|e|r|v|e|r| +0#0000000&@43 +| +0#0000e05&@8|*| |a|n|d| |s|e|a|r|c|h| |l|i|s|t| |*|/| +0#0000000&@45 +@8|R+0#af5f00255&|D|N|S@1| +0#0000000&|2+0#e000002&|0@1|1|:|d|b|8|:@1|3|5| +0#0000000&|2+0#e000002&|0@1|1|:|d|b|8|:@1|3|6| +0#0000000&@35 +@8|{+0#e000e06&| +0#0000000&@65 +@16|A+0#00e0e07&|d|v|R|D|N|S@1|L|i|f|e|t|i|m|e| +0#0000000&|3+0#e000002&|0|;+0#e000e06&| +0#0000000&@38 +@57|1|9|,|2|-|9| @7|3|9|%| diff --git a/runtime/syntax/testdir/dumps/radvd_02.dump b/runtime/syntax/testdir/dumps/radvd_02.dump new file mode 100644 index 0000000000..9344bce54e --- /dev/null +++ b/runtime/syntax/testdir/dumps/radvd_02.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@15|A+0#00e0e07&|d|v|R|D|N|S@1|L|i|f|e|t|i|m|e| +0#0000000&|3+0#e000002&|0|;+0#e000e06&| +0#0000000&@38 +@8|}+0#e000e06&|;| +0#0000000&@64 +@75 +@8|D+0#af5f00255&|N|S@1|L| +0#0000000&|b|r|a|n|c|h|.|e|x|a|m|p|l|e|.|c|o|m| |e|x|a|m|p|l|e|.|c|o|m| @30 +@8|{+0#e000e06&| +0#0000000&@65 +@16>F+0#00e0e07&|l|u|s|h|D|N|S@1|L| +0#0000000&|o+0#e000002&|f@1|;+0#e000e06&| +0#0000000&@43 +@8|}+0#e000e06&|;| +0#0000000&@64 +@75 +@8|c+0#af5f00255&|l|i|e|n|t|s| +0#0000000&@59 +@8|{+0#e000e06&| +0#0000000&@65 +@16|f+0#e000002&|e|8|0|:@1|2|1|f|:|1|6|f@1|:|f|e|0|6|:|3|a@1|b|;+0#e000e06&| +0#0000000&@33 +@16|f+0#e000002&|e|8|0|:@1|2|1|d|:|7|2|f@1|:|f|e|9|6|:|a@1|f@1|;+0#e000e06&| +0#0000000&@33 +@8|}+0#e000e06&|;| +0#0000000&@64 +@75 +@8|a+0#af5f00255&|b|r|o| +0#0000000&|f+0#e000002&|e|8|0|:@1|a| +0#0000000&@54 +@8|{+0#e000e06&| +0#0000000&@65 +@16|A+0#00e0e07&|d|v|V|e|r|s|i|o|n|L|o|w| +0#0000000&|1+0#e000002&|0|;+0#e000e06&| +0#0000000&@41 +@16|A+0#00e0e07&|d|v|V|e|r|s|i|o|n|H|i|g|h| +0#0000000&|2+0#e000002&|;+0#e000e06&| +0#0000000&@41 +@16|A+0#00e0e07&|d|v|V|a|l|i|d|L|i|f|e|T|i|m|e| +0#0000000&|2+0#e000002&|;+0#e000e06&| +0#0000000&@39 +@57|3|7|,|3|-|1|7| @6|9|3|%| diff --git a/runtime/syntax/testdir/dumps/radvd_03.dump b/runtime/syntax/testdir/dumps/radvd_03.dump new file mode 100644 index 0000000000..f05105e0d6 --- /dev/null +++ b/runtime/syntax/testdir/dumps/radvd_03.dump @@ -0,0 +1,20 @@ +| +0&#ffffff0@15|A+0#00e0e07&|d|v|V|a|l|i|d|L|i|f|e|T|i|m|e| +0#0000000&|2+0#e000002&|;+0#e000e06&| +0#0000000&@39 +@8|}+0#e000e06&|;| +0#0000000&@64 +>}+0#e000e06&|;| +0#0000000&@72 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|5|2|,|1| @9|B|o|t| diff --git a/runtime/syntax/testdir/input/radvd.radvd b/runtime/syntax/testdir/input/radvd.radvd new file mode 100644 index 0000000000..f6803a3a4e --- /dev/null +++ b/runtime/syntax/testdir/input/radvd.radvd @@ -0,0 +1,52 @@ +# VIM_TEST_SETUP call DeferRenamingTestFileTo('radvd.conf') +# radvd configuration +# TODO comments are highlighted + +interface eth0 +{ + AdvSendAdvert on; + MinRtrAdvInterval 3; + MaxRtrAdvInterval 10; + AdvDefaultPreference low; + AdvHomeAgentFlag off; + + prefix 2001:db8:0:1::/64 + { + AdvOnLink on; + AdvAutonomous on; + AdvRouterAddr off; + AdvValidLifetime infinity; + }; + + // route with a preference + route 2001:db8:0:2::/64 + { + AdvRoutePreference high; + AdvRouteLifetime 3600; + }; + + /* recursive DNS server + * and search list */ + RDNSS 2001:db8::35 2001:db8::36 + { + AdvRDNSSLifetime 30; + }; + + DNSSL branch.example.com example.com + { + FlushDNSSL off; + }; + + clients + { + fe80::21f:16ff:fe06:3aab; + fe80::21d:72ff:fe96:aaff; + }; + + abro fe80::a + { + AdvVersionLow 10; + AdvVersionHigh 2; + AdvValidLifeTime 2; + }; +}; diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 8abaa61328..d33dbdc259 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -691,6 +691,7 @@ def s:GetFilenameChecks(): dict> r: ['file.r', '.Rhistory', '.Rprofile', 'Rprofile', 'Rprofile.site'], racket: ['file.rkt', 'file.rktd', 'file.rktl'], radiance: ['file.rad', 'file.mat'], + radvd: ['radvd.conf', '/etc/radvd.conf', 'any/etc/radvd.conf'], raku: ['file.pm6', 'file.p6', 'file.t6', 'file.pod6', 'file.raku', 'file.rakumod', 'file.rakudoc', 'file.rakutest'], raml: ['file.raml'], rapid: ['file.sysx', 'file.Sysx', 'file.SysX', 'file.SYSx', 'file.SYSX', 'file.modx', 'file.Modx', 'file.ModX', 'file.MODx', 'file.MODX'], diff --git a/src/version.c b/src/version.c index b4aff34729..ad7f8b8e2d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1018, /**/ 1017, /**/ From c8e432b266149960f77ed1da2ec5ac33a71d7e96 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 28 Aug 2026 17:05:35 +0000 Subject: [PATCH 455/647] patch 9.2.1019: completion asked for during 'autocompletedelay' looks automatic Problem: A completion asked for with CTRL-X CTRL-O while 'autocompletedelay' is running is given the look of an automatic one, the implicit "noselect" among it. Solution: Turn autocompletion off where a typed key takes the completion over. A completion already on screen goes on being what it was (Hirohito Higashi). closes: #21158 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/edit.c | 3 +++ src/insexpand.c | 13 ++++++++-- src/proto/insexpand.pro | 1 + src/testdir/test_ins_complete.vim | 43 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/edit.c b/src/edit.c index 029b402dc7..697262976c 100644 --- a/src/edit.c +++ b/src/edit.c @@ -684,6 +684,9 @@ edit( // Don't want delayed autocompletion from the previous key either. ins_compl_clear_autocomplete_delay(); ins_compl_disarm_autostart(); + // A completion already on screen goes on being what it was. + if (!ins_compl_active()) + ins_compl_disable_autocomplete(); } #ifdef FEAT_RIGHTLEFT diff --git a/src/insexpand.c b/src/insexpand.c index bae461b065..bee5d9adf6 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -4232,8 +4232,8 @@ get_complete_info(list_T *what_list, dict_T *retdict) # define CI_WHAT_ITEMS 0x04 # define CI_WHAT_SELECTED 0x08 # define CI_WHAT_COMPLETED 0x10 -# define CI_WHAT_MATCHES 0x20 -# define CI_WHAT_PREINSERTED_TEXT 0x40 +# define CI_WHAT_MATCHES 0x20 +# define CI_WHAT_PREINSERTED_TEXT 0x40 # define CI_WHAT_AUTO 0x80 # define CI_WHAT_ALL 0xff int what_flag; @@ -7520,6 +7520,15 @@ ins_compl_enable_autocomplete(void) #endif } +/* + * Disable autocompletion + */ + void +ins_compl_disable_autocomplete(void) +{ + compl_autocomplete = FALSE; +} + /* * Remember that Vim is about to start a completion by itself, rather than * because a key was typed to ask for one. diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index 254d6d1cae..866a938817 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -76,6 +76,7 @@ void ins_compl_insert(int move_cursor, int insert_prefix); void ins_compl_check_keys(int frequency, int in_compl_func); int ins_complete(int c, int enable_pum); void ins_compl_enable_autocomplete(void); +void ins_compl_disable_autocomplete(void); void ins_compl_arm_autostart(void); void ins_compl_disarm_autostart(void); bool ins_compl_arm_autocomplete_delay(void); diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index fce28362d8..c73974e621 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -6802,6 +6802,49 @@ func Test_complete_info_auto() bwipe! endfunc +" A completion asked for while 'autocompletedelay' runs is not given the +" implicit "noselect" of autocompletion. +func Test_complete_asked_for_during_delay() + call test_override("char_avail", 1) + new + func! AutoOmni(findstart, base) + if a:findstart + return 4 + endif + return ['alpha', 'alphabet'] + endfunc + func! Selected() + let g:selected = complete_info(['selected']).selected + return '' + endfunc + setlocal omnifunc=AutoOmni + setlocal complete=o + setlocal completeopt=menuone + setlocal autocomplete + call setline(1, ' al') + + " CTRL-X CTRL-O before the delay expires: the first match is selected, + " and taken. + set autocompletedelay=100 + call feedkeys("A\\\=Selected()\\", 'tx') + call assert_equal(0, g:selected) + call assert_equal(' alpha', getline(1)) + + " What autocompletion puts up on its own selects nothing, so the word is + " left as it was. + set autocompletedelay& + call setline(1, ' al') + call feedkeys("A\=Selected()\\", 'tx') + call assert_equal(-1, g:selected) + call assert_equal(' al', getline(1)) + + call test_override("ALL", 0) + unlet g:selected + delfunc AutoOmni + delfunc Selected + bwipe! +endfunc + func Test_complete_fuzzy_resort() new set completeopt=menu,menuone,noselect,fuzzy diff --git a/src/version.c b/src/version.c index ad7f8b8e2d..b978d18bac 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1019, /**/ 1018, /**/ From de5b4ee453806bf56756865446f5d0781d1e0d5d Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 28 Aug 2026 17:10:52 +0000 Subject: [PATCH 456/647] patch 9.2.1020: autocmd: crash when 'eventignore' is changed while it is being set Problem: Vim crashes when an autocommand that is triggered by setting 'eventignore' or 'eventignorewin' changes that option again. This happens with plugins that use ":noautocmd" in an autocommand for an event that is checked in the main loop (Brian E Clow). Solution: Trigger the events with a copy of the old value in effect, so that the value the caller is still using is not freed. Keep the window that holds 'eventignorewin' from being closed while the events are triggered (Hirohito Higashi). fixes: #21169 related: #21074 closes: #21175 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/optionstr.c | 23 +++++++++++---- src/testdir/test_autocmd.vim | 55 ++++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/optionstr.c b/src/optionstr.c index aec6fef55b..b103e39819 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -2412,7 +2412,6 @@ did_set_eventignore(optset_T *args) { char_u **varp = (char_u **)args->os_varp; char_u *oldval = args->os_oldval.string; - char_u *newval; if (check_ei(*varp) == FAIL) return e_invalid_argument; @@ -2424,10 +2423,24 @@ did_set_eventignore(optset_T *args) // state, with the old value in effect: what happened while an event was // ignored must not be reported once it is not ignored anymore, and what // happened before must still be reported. - newval = *varp; - *varp = oldval; - may_trigger_deferred_events(); - *varp = newval; + // Use a copy, the caller owns "oldval" and autocommands may free it. + char_u *save_ei = vim_strsave(oldval); + if (save_ei != NULL) + { + char_u *newval = *varp; + win_T *wp = is_window_local_option(args->os_idx) ? curwin : NULL; + + *varp = save_ei; + // "varp" points into "wp" for 'eventignorewin'. + if (wp != NULL) + ++wp->w_locked; + may_trigger_deferred_events(); + if (wp != NULL) + --wp->w_locked; + + free_string_option(*varp); + *varp = newval; + } return NULL; } diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 52cb334391..cc30b96597 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -6114,6 +6114,61 @@ func Test_eventignore_deferred_events() call StopVimInTerminal(buf) endfunc +" Changing 'eventignore' from an autocommand that is triggered by setting +" 'eventignore' must not crash. +func Test_eventignore_changed_while_triggering() + new + call setline(1, range(1, 10)) + augroup testing + autocmd! + autocmd CursorMoved * set eventignore=WinLeave + augroup END + + " The pending cursor move is reported when the option changes. + set eventignore=WinNew + normal! j + set eventignore=all + call assert_equal('all', &eventignore) + + augroup testing + autocmd! + autocmd CursorMoved * noautocmd echo '' + augroup END + set eventignore=WinNew + normal! j + set eventignore=all + call assert_equal('all', &eventignore) + + set eventignore= + call CleanUpTestAuGroup() + %bw! +endfunc + +" An autocommand that is triggered by setting 'eventignorewin' cannot close +" the window that holds the option. +func Test_eventignorewin_window_not_closed_while_triggering() + new + call setline(1, range(1, 10)) + split + let nwin = winnr('$') + let s:tried = 0 + augroup testing + autocmd! + autocmd CursorMoved * if !s:tried | let s:tried = 1 | close | endif + augroup END + + normal! j + set eventignorewin=WinLeave + call assert_equal(1, s:tried) + call assert_equal(nwin, winnr('$')) + call assert_equal('WinLeave', &eventignorewin) + + set eventignorewin= + unlet s:tried + call CleanUpTestAuGroup() + %bw! +endfunc + func Test_VimResized_and_window_width_not_equalized() CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c index b978d18bac..ff736da02e 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1020, /**/ 1019, /**/ From e3b124499567d5155d8506a48374ba19c649bff7 Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Fri, 28 Aug 2026 17:20:22 +0000 Subject: [PATCH 457/647] patch 9.2.1021: GTK: Cursor blinks irregularly Problem: GTK: Cursor blinks irregularly (Tony Mechelynck) Solution: Only start blinking when the cursor is not blinking already, do not stop blinking when the input loop returns for CursorHold and stop blinking when a character is available (Christoffer Aasted) closes: #21115 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- src/gui.c | 14 ++++++++++++-- src/version.c | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/gui.c b/src/gui.c index a1867753de..c6fae37a14 100644 --- a/src/gui.c +++ b/src/gui.c @@ -3153,6 +3153,7 @@ gui_wait_for_chars_buf( int tb_change_cnt) { int retval; + int keep_blinking; // Guard against restarting blink cycle on CursorHold #ifdef FEAT_MENU // If we're going to wait a bit, update the menus and mouse shape for the @@ -3164,6 +3165,8 @@ gui_wait_for_chars_buf( gui_mch_update(); if (input_available()) // Got char, return immediately { + if (gui_mch_is_blinking()) + gui_mch_stop_blink(TRUE); if (buf != NULL && !typebuf_changed(tb_change_cnt)) return read_from_input_buf(buf, (long)maxlen); return 0; @@ -3175,14 +3178,21 @@ gui_wait_for_chars_buf( gui_mch_flush(); // Blink while waiting for a character. - gui_mch_start_blink(); + if (!gui_mch_is_blinking()) + gui_mch_start_blink(); // Common function to loop until "wtime" is met, while handling timers and // other callbacks. retval = inchar_loop(buf, maxlen, wtime, tb_change_cnt, gui_wait_for_chars_or_timer, NULL); - gui_mch_stop_blink(TRUE); + // Keep blinking when CursorHold wakes the input loop. (See PR #21115) + keep_blinking = retval == 3 && buf != NULL + && buf[0] == K_SPECIAL && buf[1] == KS_EXTRA + && buf[2] == (int)KE_CURSORHOLD; + + if (!keep_blinking) + gui_mch_stop_blink(TRUE); return retval; } diff --git a/src/version.c b/src/version.c index ff736da02e..d9d29b7e6d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1021, /**/ 1020, /**/ From 87069e378c4b51a7d46db397818c8b94c3b3e94a Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sun, 30 Aug 2026 19:22:10 +0000 Subject: [PATCH 458/647] runtime(vim): Update base syntax, improve command-line window highlighting - Contain all matches to a single line. - Define non-extending groups for the command-line window. - Replace &buftype-based detection with win_gettype(). closes: #21189 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 174 +++++++++--------- runtime/syntax/help.vim | 6 +- runtime/syntax/testdir/dumps/help_02.dump | 2 +- runtime/syntax/testdir/dumps/help_03.dump | 12 +- .../dumps/vim_commandline_window_00.dump | 20 ++ .../dumps/vim_commandline_window_01.dump | 20 ++ .../dumps/vim_commandline_window_02.dump | 20 ++ .../dumps/vim_commandline_window_03.dump | 20 ++ .../dumps/vim_commandline_window_04.dump | 20 ++ runtime/syntax/testdir/input/help.txt | 9 +- .../testdir/input/vim_commandline_window.vim | 71 +++++++ runtime/syntax/vim.vim | 174 +++++++++--------- 12 files changed, 368 insertions(+), 180 deletions(-) create mode 100644 runtime/syntax/testdir/dumps/vim_commandline_window_00.dump create mode 100644 runtime/syntax/testdir/dumps/vim_commandline_window_01.dump create mode 100644 runtime/syntax/testdir/dumps/vim_commandline_window_02.dump create mode 100644 runtime/syntax/testdir/dumps/vim_commandline_window_03.dump create mode 100644 runtime/syntax/testdir/dumps/vim_commandline_window_04.dump create mode 100644 runtime/syntax/testdir/input/vim_commandline_window.vim diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index c14ed46e20..0bd220f76c 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 27 +" Last Change: 2026 Aug 29 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -18,8 +18,10 @@ set cpo&vim " Feature testing {{{1 -" NOTE: vimsyn_force_vim9 for internal use only -let s:vim9script = get(b:, "vimsyn_force_vim9", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' +" NOTE: vimsyn_force_vim9script and vimsyn_force_cmdline_window for internal use only +let s:vim9script = get(b:, "vimsyn_force_vim9script", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' + +let s:cmdline_window = get(b:, "vimsyn_force_cmdline_window", v:false) || win_gettype() ==# "command" function s:has(feature) return has(a:feature) || index(get(g:, "vimsyn_vim_features", []), a:feature) != -1 @@ -144,6 +146,8 @@ endif com! -nargs=* Vim9 execute s:vim9script ? "" : "contained" com! -nargs=* VimL execute s:vim9script ? "contained" : "" +com! -nargs=* VimExtend execute s:cmdline_window ? "" : "extend" + if exists("g:vimsyn_folding") && g:vimsyn_folding =~# '[acefhiHlmpPrt]' if g:vimsyn_folding =~# 'a' com! -nargs=* VimFolda fold @@ -380,60 +384,56 @@ syn match vimShiftRightCount contained "\d\+" skipwhite nextgroup=vimPrintFlag " :append, :change, :insert {{{3 " ========================= -" (buftype != nofile test avoids having append, change, insert show up in the command window) - -if &buftype != 'nofile' - syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand_ contained "a\%[ppend]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand_ contained "c\%[hange]\>" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand_ contained "i\%[nsert]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - - syn match vimChangeCount contained "\d\+" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimChangeBang contained + +syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand_ contained "a\%[ppend]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand_ contained "c\%[hange]\>" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand_ contained "i\%[nsert]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + +syn match vimChangeCount contained "\d\+" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimChangeBang contained \ "\a\@1<=!" \ skipwhite skipnl skipempty nextgroup=vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimTextInputBang contained "\a\@1<=!" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimTextInputText contained "|\@1<=.*" skipnl skipempty nextgroup=@vimTextInputText +syn match vimTextInputBang contained "\a\@1<=!" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimTextInputText contained "|\@1<=.*" skipnl skipempty nextgroup=@vimTextInputText +VimExtend syn region vimTextInputText contained + \ start="^." + \ matchgroup=vimCommand + \ end="^\.$" +" NOTE: 'autoindent' end marker not supported +syn match vimTextInputEnd contained "^\.$" +syn cluster vimTextInputText contains=vimTextInputText,vimTextInputEnd + +syn match vimTextInputComment contained + \ /".*/ + \ skipnl skipempty nextgroup=@vimTextInputText +syn match vimTextInputBar contained + \ "\s*\zs|" + \ nextgroup=@vimTextInputText + +if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'T' + " excludes "extend" option, handled by wrapper syn region vimTextInputText contained \ start="^." \ matchgroup=vimCommand \ end="^\.$" - \ extend - " NOTE: 'autoindent' end marker not supported - syn match vimTextInputEnd contained "^\.$" - syn cluster vimTextInputText contains=vimTextInputText,vimTextInputEnd - - syn match vimTextInputComment contained - \ /".*/ - \ skipnl skipempty nextgroup=@vimTextInputText - syn match vimTextInputBar contained - \ "\s*\zs|" - \ nextgroup=@vimTextInputText - - if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'T' - " excludes "extend" option, handled by wrapper - syn region vimTextInputText contained - \ start="^." - \ matchgroup=vimCommand - \ end="^\.$" - syn region vimTextInputFold contained - \ start="\" - \ start="\" - \ start="\" - \ end="^\.$" - \ contains=vimCommand - \ extend fold keepend transparent - syn region vimTextInputFold_ contained - \ start="a\%[ppend]\>" - \ start="c\%[hange]\>" - \ start="i\%[nsert]\>" - \ end="^\.$" - \ contains=vimCommand_ - \ extend fold keepend transparent - endif + VimExtend syn region vimTextInputFold contained + \ start="\" + \ start="\" + \ start="\" + \ end="^\.$" + \ contains=vimCommand + \ fold keepend transparent + syn region vimTextInputFold_ contained + \ start="a\%[ppend]\>" + \ start="c\%[hange]\>" + \ start="i\%[nsert]\>" + \ end="^\.$" + \ contains=vimCommand_ + \ fold keepend transparent endif " :argdo, :bufdo, :tabdo, :windo, :cdo, :cfdo, :ldo, :lfdo, :folddoopen, :folddoclosed {{{3 @@ -1481,14 +1481,13 @@ syn region vimSynRegion contained 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 +VimExtend syn region vimSynRegPat contained \ matchgroup=Delimiter \ start="\z([-`~!@#$%^&*_=+;:'",./?]\)" \ skip=/\\\\\|\\\z1\|\n\s*\%(\\\|"\\ \)/ \ end="\z1" \ skipwhite nextgroup=vimSynPatMod,vimSynReg \ contains=@vimSynRegPatGroup - \ extend 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\+" @@ -1802,20 +1801,20 @@ syn keyword vimEndfunction contained endf[unction] skipwhite nextgroup=vimCmdSep syn keyword vimEnddef contained enddef skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vimFunctionFold contained + VimExtend syn region vimFunctionFold contained \ start="\]*>\=>" syn match vimQuoteEscape contained "''" -syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape extend -syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup extend +VimExtend syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape +VimExtend syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList syn match vimStringInterpolationBrace contained "{{" syn match vimStringInterpolationBrace contained "}}" @@ -2185,31 +2182,27 @@ syn region vimUnletVars contained \ contains=@vimContinue,vimEnvvar,vimVar,vimVimVar " TODO: type error after register or environment variables (strings) -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop \ end="^\z1\=\z2$" - \ extend -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="=<<\%(\s*\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop end="^\z1$" - \ extend -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop \ end="^\z1\=\z2$" \ contains=@vimStringInterpolation - \ extend -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop \ end="^\z1$" \ contains=@vimStringInterpolation - \ extend Vim9 syn keyword vim9Const contained const skipwhite nextgroup=vim9Variable,vim9VariableList Vim9 syn keyword vim9Final contained final skipwhite nextgroup=vim9Variable,vim9VariableList @@ -2348,11 +2341,12 @@ syn keyword vimSynLink contained SynLink skipwhite nextgroup=vimSynLinkGroup syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup " runtime/syntax/vim.vim -syn keyword vimVim9 contained Vim9 skipwhite nextgroup=vimSyntax -syn keyword vimVimL contained VimL skipwhite nextgroup=vimSyntax -syn match vimVimFold contained "\" skipwhite nextgroup=vimSyntax +syn keyword vimVim9 contained Vim9 skipwhite nextgroup=@vimExUserCmdList,vimSyntax +syn keyword vimVimL contained VimL skipwhite nextgroup=@vimExUserCmdList,vimSyntax +syn keyword vimVimExtend contained VimExtend skipwhite nextgroup=@vimExUserCmdList,vimSyntax +syn match vimVimFold contained "\" skipwhite nextgroup=@vimExUserCmdList,vimSyntax -syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu,vimVimFold,vimVim9,vimVimL +syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu,vimVimExtend,vimVimFold,vimVim9,vimVimL " Errors And Warnings: {{{2 " ==================== @@ -2733,15 +2727,15 @@ unlet s:interfaces " ========= syn cluster vimCommand_ contains=vimCommand_,vim\u\w\+_ -Vim9 syn region vim9LineComment contained start=+\%#=1#\%({\@!\|{{\).*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend -VimL syn region vimLineComment contained start=+".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle extend +VimExtend Vim9 syn region vim9LineComment contained start=+\%#=1#\%({\@!\|{{\).*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle +VimExtend VimL syn region vimLineComment contained start=+".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup syn match vim9CommentTitle '#\s*\%([sS]:\|\h\w*#\)\=\%([A-DF-Z]\w*\|E\%(\d\{1,4}\>\)\@!\w*\)\(\s\+\u\w*\)*:'hs=s+1 contained contains=vim9CommentTitleLeader,vimTodo,@vimCommentGroup syn match vimContinue "^\s*\zs\\" contains=vimLeadingWhitespace "skipwhite nextgroup=vimCmdSep -syn match vimContinueComment '^\s*\zs["#]\\ .*' extend contains=vimLeadingWhitespace -syn match vim9ContinueComment "^\s*\zs#\\ .*" extend contains=vimLeadingWhitespace +VimExtend syn match vimContinueComment '^\s*\zs["#]\\ .*' contains=vimLeadingWhitespace +VimExtend syn match vim9ContinueComment "^\s*\zs#\\ .*" contains=vimLeadingWhitespace syn cluster vimContinue contains=vimContinue,vimContinueComment syn cluster vim9Continue contains=vimContinue,vim9ContinueComment @@ -2845,6 +2839,18 @@ if s:vim9script syn keyword vim9Vim9Script vim9s[cript] nextgroup=vim9Vim9ScriptArg skipwhite endif +" Command-line Window Lines: {{{2 +" ========================= + +if s:cmdline_window + syn region vimCommandLineWindowLine + \ start="^" + \ end="$" + \ contains=TOP,vimCommandLineWindowLine + \ oneline + \ keepend +endif + " Synchronize (speed) {{{2 "============ @@ -3370,6 +3376,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimWincmd_ vimWincmd hi def link vimCompilerSet vimCommand + hi def link vimVimExtend vimCommand hi def link vimSynColor vimCommand hi def link vimSynLink vimCommand hi def link vimSynMenu vimCommand @@ -3387,6 +3394,7 @@ let b:current_syntax = "vim" " Cleanup: {{{1 delc Vim9 delc VimL +delc VimExtend delc VimFolda delc VimFoldc delc VimFolde diff --git a/runtime/syntax/help.vim b/runtime/syntax/help.vim index 9eae50a9a6..62cd468b47 100644 --- a/runtime/syntax/help.vim +++ b/runtime/syntax/help.vim @@ -34,7 +34,7 @@ for [s:lang, s:syntax] in g:help_example_languages->items() unlet! b:current_syntax if s:lang == "vim9" - let b:vimsyn_force_vim9 = v:true + let b:vimsyn_force_vim9script = v:true endif " silent! to prevent E403 @@ -42,7 +42,7 @@ for [s:lang, s:syntax] in g:help_example_languages->items() \ $'syntax/{s:syntax}.vim' if s:lang == "vim9" - unlet b:vimsyn_force_vim9 + unlet b:vimsyn_force_vim9script endif execute $'syn region helpExampleHighlight_{s:lang} matchgroup=helpIgnore' @@ -56,7 +56,7 @@ unlet! s:lang s:syntax if has_key(g:help_example_languages, "vim9") " for example at :help vim9-mix syn region vim9LegacyHeader_HelpExample - \ start=+" legacy Vim script comments may go here+ + \ start=+" _legacy Vim script_ comments are placed here+ \ end="^\ze\s*vim9s\%[cript]\>" \ contains=@vimLegacyTop,vimComment,vimLineComment,vimLineStart syn cluster helpExampleHighlight_vim9 add=vim9LegacyHeader_HelpExample diff --git a/runtime/syntax/testdir/dumps/help_02.dump b/runtime/syntax/testdir/dumps/help_02.dump index 252425368b..9c6049adc2 100644 --- a/runtime/syntax/testdir/dumps/help_02.dump +++ b/runtime/syntax/testdir/dumps/help_02.dump @@ -17,4 +17,4 @@ |E+0#e000e06&|X|A|M|P|L|E| |L|A|N|G|U|A|G|E|S| +0#0000000&@57 @56|v+0#e000002&|i|m|9|-|m|i|x| +0#0000000&@10 |T|h|e|r|e| |i|s| |o|n|e| |w|a|y| |t|o| |u|s|e| |b|o|t|h| |l|e|g|a|c|y| |a|n|d| |V|i|m|9| |s|y|n|t|a|x| |i|n| |o|n|e| |s|c|r|i|p|t| |f|i|l|e|:| |@+0#4040ff13&@2 -| +0#0000000&@56|3|6|,|0|-|1| @7|6|8|%| +| +0#0000000&@56|3|6|,|0|-|1| @7|6|7|%| diff --git a/runtime/syntax/testdir/dumps/help_03.dump b/runtime/syntax/testdir/dumps/help_03.dump index c2885ffb44..4790729a84 100644 --- a/runtime/syntax/testdir/dumps/help_03.dump +++ b/runtime/syntax/testdir/dumps/help_03.dump @@ -1,13 +1,14 @@ |T+0&#ffffff0|h|e|r|e| |i|s| |o|n|e| |w|a|y| |t|o| |u|s|e| |b|o|t|h| |l|e|g|a|c|y| |a|n|d| |V|i|m|9| |s|y|n|t|a|x| |i|n| |o|n|e| |s|c|r|i|p|t| |f|i|l|e|:| @3 @75 @75 -@8|"+0#0000e05&| |l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t| |c|o|m@1|e|n|t|s| |m|a|y| |g|o| |h|e|r|e| +0#0000000&@26 +@8|"+0#0000e05&| |_|l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t|_| |c|o|m@1|e|n|t|s| |a|r|e| |p|l|a|c|e|d| |h|e|r|e| +0#0000000&@20 @8|i+0#af5f00255&|f| +0#0000000&|!+0#af5f00255&|h+0#00e0e07&|a|s|(+0#e000e06&|'+0#e000002&|v|i|m|9|s|c|r|i|p|t|'|)+0#e000e06&| +0#0000000&@45 -@11>"+0#0000e05&| |l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t| |c|o|m@1|a|n|d|s| |g|o| |h|e|r|e| +0#0000000&@27 -@11|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@57 +@10>"+0#0000e05&| |_|l|e|g|a|c|y| |V|i|m| |s|c|r|i|p|t|_| |c|o|m@1|e|n|t|s| |a|n|d| |c|o|m@1|a|n|d|s| |a|r|e| |p|l|a|c|e|d| |h|e|r|e| +0#0000000&@5 +@10|f+0#af5f00255&|i|n|i|s|h| +0#0000000&@58 @8|e+0#af5f00255&|n|d|i|f| +0#0000000&@61 @8|v+0#af5f00255&|i|m|9|s|c|r|i|p|t| +0#0000000&@56 -@8|#+0#0000e05&| |V|i|m|9| |s|c|r|i|p|t| |c|o|m@1|a|n|d|s| |g|o| |h|e|r|e| +0#0000000&@36 +@8|#+0#0000e05&| |_|V|i|m|9| |s|c|r|i|p|t|_| |c|o|m@1|a|n|d|s|/|c|o|m@1|a|n|d|s| |f|r|o|m| |h|e|r|e| |o|n|w|a|r|d|s| +0#0000000&@15 +@8|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&|$+0#e000002&|"|h|a|s|(|'|v|i|m|9|s|c|r|i|p|t|'|)| |=@1| |{+0#e000e06&|h+0#00e0e07&|a|s|(+0#e000e06&|'+0#e000002&|v|i|m|9|s|c|r|i|p|t|'|)+0#e000e06&|}|"+0#e000002&| +0#0000000&@12 @75 |T|h|i|s| |a|l@1|o|w|s| |f|o|r| |w|r|i|t|i|n|g| |a| |s|c|r|i|p|t| |t|h|a|t| |t|a|k|e|s| |a|d|v|a|n|t|a|g|e| |o|f| |t|h|e| |V|i|m|9| |s|c|r|i|p|t| @2 |s|y|n|t|a|x| |i|f| |p|o|s@1|i|b|l|e|,| |b|u|t| |w|i|l@1| |a|l|s|o| |w|o|r|k| |o|n| |a| |V|i|m| |v|e|r|s|i|o|n| |w|i|t|h|o|u|t| |i|t|.| @7 @@ -16,5 +17,4 @@ |~+0#4040ff13&| @73 |~| @73 |~| @73 -|~| @73 -| +0#0000000&@56|5|2|,|5|-|1|2| @6|B|o|t| +| +0#0000000&@56|5|2|,|4|-|1@1| @6|B|o|t| diff --git a/runtime/syntax/testdir/dumps/vim_commandline_window_00.dump b/runtime/syntax/testdir/dumps/vim_commandline_window_00.dump new file mode 100644 index 0000000000..21efac9f6c --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_commandline_window_00.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1>"+0&#ffffff0| |S|i|m|u|l|a|t|e|d| |V|i|m| |c|o|m@1|a|n|d|-|l|i|n|e| |w|i|n|d|o|w| +0#0000000&@37 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |b|:|v|i|m|s|y|n|_|f|o|r|c|e|_|c|m|d|l|i|n|e|_|w|i|n|d|o|w| |=| |v|:|t|r|u|e| +0#0000000&@13 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |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&|a|c|e|f|h|i|H|l|m|p|P|r|t|T|"| +0#0000000&@16 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s|e|t|l| |f|d|c|=|2| |f|d|l|=|9@2| |f|d|m|=|s|y|n|t|a|x| +0#0000000&@26 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |s|i|m|p|l|e| |c|o|m@1|a|n|d|s| +0#0000000&@55 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@62 +| +0#0000e05#a8a8a8255@1|l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@62 +| +0#0000e05#a8a8a8255@1|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|e+0#00e0e07&|x|e|c|u|t|e|(+0#e000e06&|"+0#e000002&|:|"|)+0#e000e06&| +0#0000000&@55 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |r|e|g|i|o|n| |o|p|e|n|e|r|s| +0#0000000&@56 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +@57|1|,|1| @10|T|o|p| diff --git a/runtime/syntax/testdir/dumps/vim_commandline_window_01.dump b/runtime/syntax/testdir/dumps/vim_commandline_window_01.dump new file mode 100644 index 0000000000..f348b8d36e --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_commandline_window_01.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1|a+0#af5f00255#ffffff0|p@1|e|n|d| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|c+0#af5f00255#ffffff0|h|a|n|g|e| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|i+0#af5f00255#ffffff0|n|s|e|r|t| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1>"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#e000e06&|<@1| |E|O|F| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#e000e06&|<@1| |t|r|i|m| |E|O|F| +0#0000000&@54 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#e000e06&|<@1| |e|v|a|l| |E|O|F| +0#0000000&@54 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#e000e06&|<@1| |t|r|i|m| |e|v|a|l| |E|O|F| +0#0000000&@49 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|a+0#af5f00255#ffffff0|u|g|r|o|u|p| +0#0000000&|F|o@1| @61 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|a+0#af5f00255#ffffff0|u|t|o|c|m|d| +0#0000000&|B+0#00e0003&|u|f|R|e|a|d| +0#0000000&|*+0#e000e06&| +0#0000000&|{+0#e000e06&| +0#0000000&@53 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|c+0#af5f00255#ffffff0|o|m@1|a|n|d| +0#0000000&|F|o@1| |{+0#e000e06&| +0#0000000&@59 +@57|1|9|,|1| @9|2|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_commandline_window_02.dump b/runtime/syntax/testdir/dumps/vim_commandline_window_02.dump new file mode 100644 index 0000000000..5e0ff48751 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_commandline_window_02.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1|c+0#af5f00255#ffffff0|o|m@1|a|n|d| +0#0000000&|F|o@1| |{+0#e000e06&| +0#0000000&@59 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|f+0#af5f00255#ffffff0|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@58 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1>l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#af5f00255&| +0#0000000&|"+0#e000002&|.@2| +0#0000000&@60 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|l+0#af5f00255#ffffff0|e|t| +0#0000000&|x| |=+0#af5f00255&| +0#0000000&|(+0#e000e06&| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |R|e|g|i|o|n| |c|l|o|s|e|r|s| +0#0000000&@56 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|\+0#e000e06&| +0#0000000&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@63 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@5|\+0#e000e06&| +0#0000000&|.+0#af5f00255&@2|"+0#0000e05&| +0#0000000&@60 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|n|d@1|e|f| +0#0000000&@66 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 +@57|3|7|,|1| @9|5|9|%| diff --git a/runtime/syntax/testdir/dumps/vim_commandline_window_03.dump b/runtime/syntax/testdir/dumps/vim_commandline_window_03.dump new file mode 100644 index 0000000000..a24209f2c7 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_commandline_window_03.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1|e+0#af5f00255#ffffff0|n|d|f|u|n|c|t|i|o|n| +0#0000000&@61 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71 +| +0#0000e05#a8a8a8255@1>"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|u|g|r|o|u|p| |E|N|D| @61 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|E+0#0000000#ffffff0|O|F| @69 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|E+0#0000000#ffffff0|O|F| @69 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|E+0#0000000#ffffff0|O|F| @69 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|E+0#0000000#ffffff0|O|F| @69 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|.+0#e000002#ffffff0| +0#0000000&@71 +@57|5@1|,|1| @9|9|4|%| diff --git a/runtime/syntax/testdir/dumps/vim_commandline_window_04.dump b/runtime/syntax/testdir/dumps/vim_commandline_window_04.dump new file mode 100644 index 0000000000..482693b167 --- /dev/null +++ b/runtime/syntax/testdir/dumps/vim_commandline_window_04.dump @@ -0,0 +1,20 @@ +| +0#0000e05#a8a8a8255@1|.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1|"+0&#ffffff0| |c|o|m@1|e|n|t| +0#0000000&@63 +| +0#0000e05#a8a8a8255@1|.+0#e000002#ffffff0| +0#0000000&@71 +| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|7|1|,|0|-|1| @7|B|o|t| diff --git a/runtime/syntax/testdir/input/help.txt b/runtime/syntax/testdir/input/help.txt index 2338bbcc94..981d33c972 100644 --- a/runtime/syntax/testdir/input/help.txt +++ b/runtime/syntax/testdir/input/help.txt @@ -47,13 +47,14 @@ EXAMPLE LANGUAGES~ *vim9-mix* There is one way to use both legacy and Vim9 syntax in one script file: >vim9 - " legacy Vim script comments may go here + " _legacy Vim script_ comments are placed here if !has('vim9script') - " legacy Vim script commands go here - finish + " _legacy Vim script_ comments and commands are placed here + finish endif vim9script - # Vim9 script commands go here + # _Vim9 script_ commands/commands from here onwards + echowindow $"has('vim9script') == {has('vim9script')}" This allows for writing a script that takes advantage of the Vim9 script syntax if possible, but will also work on a Vim version without it. diff --git a/runtime/syntax/testdir/input/vim_commandline_window.vim b/runtime/syntax/testdir/input/vim_commandline_window.vim new file mode 100644 index 0000000000..90f598d837 --- /dev/null +++ b/runtime/syntax/testdir/input/vim_commandline_window.vim @@ -0,0 +1,71 @@ +" Simulated Vim command-line window +" VIM_TEST_SETUP let b:vimsyn_force_cmdline_window = v:true +" VIM_TEST_SETUP let g:vimsyn_folding = "acefhiHlmpPrtT" +" VIM_TEST_SETUP setl fdc=2 fdl=999 fdm=syntax + +" simple commands + +echo "..." +let x = 42 +call execute(":") + +" region openers + +append +" comment +change +" comment +insert +" comment +let x =<< EOF +" comment +let x =<< trim EOF +" comment +let x =<< eval EOF +" comment +let x =<< trim eval EOF +" comment +augroup Foo +" comment +autocmd BufRead * { +" comment +command Foo { +" comment +function Foo() +" comment +def Foo() +let x = "... +" comment +let x = ( +" comment + +" Region closers + + \ ) +" comment + \ ..." +" comment +enddef +" comment +endfunction +" comment +} +" comment +} +" comment +augroup END +" comment +EOF +" comment +EOF +" comment +EOF +" comment +EOF +" comment +. +" comment +. +" comment +. + diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 1877e8dc06..ef39fb5bc8 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 27 +" Last Change: 2026 Aug 29 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -18,8 +18,10 @@ set cpo&vim " Feature testing {{{1 -" NOTE: vimsyn_force_vim9 for internal use only -let s:vim9script = get(b:, "vimsyn_force_vim9", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' +" NOTE: vimsyn_force_vim9script and vimsyn_force_cmdline_window for internal use only +let s:vim9script = get(b:, "vimsyn_force_vim9script", v:false) || "\n" .. getline(1, 32)->join("\n") =~# '\nvim9s\%[cript]\>' + +let s:cmdline_window = get(b:, "vimsyn_force_cmdline_window", v:false) || win_gettype() ==# "command" function s:has(feature) return has(a:feature) || index(get(g:, "vimsyn_vim_features", []), a:feature) != -1 @@ -224,6 +226,8 @@ endif com! -nargs=* Vim9 execute s:vim9script ? "" : "contained" com! -nargs=* VimL execute s:vim9script ? "contained" : "" +com! -nargs=* VimExtend execute s:cmdline_window ? "" : "extend" + if exists("g:vimsyn_folding") && g:vimsyn_folding =~# '[acefhiHlmpPrt]' if g:vimsyn_folding =~# 'a' com! -nargs=* VimFolda fold @@ -462,60 +466,56 @@ syn keyword vimAbb contained abc[lear] cabc[lear] iabc[lear] skipwhite nextgroup " :append, :change, :insert {{{3 " ========================= -" (buftype != nofile test avoids having append, change, insert show up in the command window) - -if &buftype != 'nofile' - syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand_ contained "a\%[ppend]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand_ contained "c\%[hange]\>" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimCommand_ contained "i\%[nsert]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar - - syn match vimChangeCount contained "\d\+" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimChangeBang contained + +syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand_ contained "a\%[ppend]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand_ contained "c\%[hange]\>" skipwhite skipnl skipempty nextgroup=vimChangeBang,vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand contained "\" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimCommand_ contained "i\%[nsert]\>" skipwhite skipnl skipempty nextgroup=vimTextInputBang,@vimTextInputText,vimTextInputComment,vimTextInputBar + +syn match vimChangeCount contained "\d\+" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimChangeBang contained \ "\a\@1<=!" \ skipwhite skipnl skipempty nextgroup=vimChangeCount,@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimTextInputBang contained "\a\@1<=!" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar - syn match vimTextInputText contained "|\@1<=.*" skipnl skipempty nextgroup=@vimTextInputText +syn match vimTextInputBang contained "\a\@1<=!" skipwhite skipnl skipempty nextgroup=@vimTextInputText,vimTextInputComment,vimTextInputBar +syn match vimTextInputText contained "|\@1<=.*" skipnl skipempty nextgroup=@vimTextInputText +VimExtend syn region vimTextInputText contained + \ start="^." + \ matchgroup=vimCommand + \ end="^\.$" +" NOTE: 'autoindent' end marker not supported +syn match vimTextInputEnd contained "^\.$" +syn cluster vimTextInputText contains=vimTextInputText,vimTextInputEnd + +syn match vimTextInputComment contained + \ /".*/ + \ skipnl skipempty nextgroup=@vimTextInputText +syn match vimTextInputBar contained + \ "\s*\zs|" + \ nextgroup=@vimTextInputText + +if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'T' + " excludes "extend" option, handled by wrapper syn region vimTextInputText contained \ start="^." \ matchgroup=vimCommand \ end="^\.$" - \ extend - " NOTE: 'autoindent' end marker not supported - syn match vimTextInputEnd contained "^\.$" - syn cluster vimTextInputText contains=vimTextInputText,vimTextInputEnd - - syn match vimTextInputComment contained - \ /".*/ - \ skipnl skipempty nextgroup=@vimTextInputText - syn match vimTextInputBar contained - \ "\s*\zs|" - \ nextgroup=@vimTextInputText - - if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'T' - " excludes "extend" option, handled by wrapper - syn region vimTextInputText contained - \ start="^." - \ matchgroup=vimCommand - \ end="^\.$" - syn region vimTextInputFold contained - \ start="\" - \ start="\" - \ start="\" - \ end="^\.$" - \ contains=vimCommand - \ extend fold keepend transparent - syn region vimTextInputFold_ contained - \ start="a\%[ppend]\>" - \ start="c\%[hange]\>" - \ start="i\%[nsert]\>" - \ end="^\.$" - \ contains=vimCommand_ - \ extend fold keepend transparent - endif + VimExtend syn region vimTextInputFold contained + \ start="\" + \ start="\" + \ start="\" + \ end="^\.$" + \ contains=vimCommand + \ fold keepend transparent + syn region vimTextInputFold_ contained + \ start="a\%[ppend]\>" + \ start="c\%[hange]\>" + \ start="i\%[nsert]\>" + \ end="^\.$" + \ contains=vimCommand_ + \ fold keepend transparent endif " :argdo, :bufdo, :tabdo, :windo, :cdo, :cfdo, :ldo, :lfdo, :folddoopen, :folddoclosed {{{3 @@ -1580,14 +1580,13 @@ syn region vimSynRegion contained 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 +VimExtend syn region vimSynRegPat contained \ matchgroup=Delimiter \ start="\z([-`~!@#$%^&*_=+;:'",./?]\)" \ skip=/\\\\\|\\\z1\|\n\s*\%(\\\|"\\ \)/ \ end="\z1" \ skipwhite nextgroup=vimSynPatMod,vimSynReg \ contains=@vimSynRegPatGroup - \ extend 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\+" @@ -1901,20 +1900,20 @@ syn keyword vimEndfunction contained endf[unction] skipwhite nextgroup=vimCmdSep syn keyword vimEnddef contained enddef skipwhite nextgroup=vimCmdSep,vim9Comment,vimCommentError if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f' - syn region vimFunctionFold contained + VimExtend syn region vimFunctionFold contained \ start="\]*>\=>" syn match vimQuoteEscape contained "''" -syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape extend -syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup extend +VimExtend syn region vimString oneline matchgroup=vimString start=+$'+ end=+'+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,vimQuoteEscape +VimExtend syn region vimString oneline matchgroup=vimString start=+$"+ end=+"+ nextgroup=vimSubscriptBrackets contains=@vimStringInterpolation,@vimStringGroup syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList syn match vimStringInterpolationBrace contained "{{" syn match vimStringInterpolationBrace contained "}}" @@ -2284,31 +2281,27 @@ syn region vimUnletVars contained \ contains=@vimContinue,vimEnvvar,vimVar,vimVimVar " TODO: type error after register or environment variables (strings) -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop \ end="^\z1\=\z2$" - \ extend -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="=<<\%(\s*\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop end="^\z1$" - \ extend -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop \ end="^\z1\=\z2$" \ contains=@vimStringInterpolation - \ extend -VimFoldh syn region vimLetHeredoc contained +VimExtend VimFoldh syn region vimLetHeredoc contained \ matchgroup=vimLetHeredocStart \ start="=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)" \ matchgroup=vimLetHeredocStop \ end="^\z1$" \ contains=@vimStringInterpolation - \ extend Vim9 syn keyword vim9Const contained const skipwhite nextgroup=vim9Variable,vim9VariableList Vim9 syn keyword vim9Final contained final skipwhite nextgroup=vim9Variable,vim9VariableList @@ -2447,11 +2440,12 @@ syn keyword vimSynLink contained SynLink skipwhite nextgroup=vimSynLinkGroup syn match vimSynLinkGroup contained "\<\h\w*\>" skipwhite nextgroup=vimGroup contains=vimGroup " runtime/syntax/vim.vim -syn keyword vimVim9 contained Vim9 skipwhite nextgroup=vimSyntax -syn keyword vimVimL contained VimL skipwhite nextgroup=vimSyntax -syn match vimVimFold contained "\" skipwhite nextgroup=vimSyntax +syn keyword vimVim9 contained Vim9 skipwhite nextgroup=@vimExUserCmdList,vimSyntax +syn keyword vimVimL contained VimL skipwhite nextgroup=@vimExUserCmdList,vimSyntax +syn keyword vimVimExtend contained VimExtend skipwhite nextgroup=@vimExUserCmdList,vimSyntax +syn match vimVimFold contained "\" skipwhite nextgroup=@vimExUserCmdList,vimSyntax -syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu,vimVimFold,vimVim9,vimVimL +syn cluster vimExUserCmdList contains=vimCompilerSet,vimSynColor,vimSynLink,vimSynMenu,vimVimExtend,vimVimFold,vimVim9,vimVimL " Errors And Warnings: {{{2 " ==================== @@ -2832,15 +2826,15 @@ unlet s:interfaces " ========= syn cluster vimCommand_ contains=vimCommand_,vim\u\w\+_ -Vim9 syn region vim9LineComment contained start=+\%#=1#\%({\@!\|{{\).*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend -VimL syn region vimLineComment contained start=+".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle extend +VimExtend Vim9 syn region vim9LineComment contained start=+\%#=1#\%({\@!\|{{\).*$+ skip=+\n\s*\%(\\\|#\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle +VimExtend VimL syn region vimLineComment contained start=+".*$+ skip=+\n\s*\%(\\\|"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString,vimCommentTitle syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup syn match vim9CommentTitle '#\s*\%([sS]:\|\h\w*#\)\=\%([A-DF-Z]\w*\|E\%(\d\{1,4}\>\)\@!\w*\)\(\s\+\u\w*\)*:'hs=s+1 contained contains=vim9CommentTitleLeader,vimTodo,@vimCommentGroup syn match vimContinue "^\s*\zs\\" contains=vimLeadingWhitespace "skipwhite nextgroup=vimCmdSep -syn match vimContinueComment '^\s*\zs["#]\\ .*' extend contains=vimLeadingWhitespace -syn match vim9ContinueComment "^\s*\zs#\\ .*" extend contains=vimLeadingWhitespace +VimExtend syn match vimContinueComment '^\s*\zs["#]\\ .*' contains=vimLeadingWhitespace +VimExtend syn match vim9ContinueComment "^\s*\zs#\\ .*" contains=vimLeadingWhitespace syn cluster vimContinue contains=vimContinue,vimContinueComment syn cluster vim9Continue contains=vimContinue,vim9ContinueComment @@ -2944,6 +2938,18 @@ if s:vim9script syn keyword vim9Vim9Script vim9s[cript] nextgroup=vim9Vim9ScriptArg skipwhite endif +" Command-line Window Lines: {{{2 +" ========================= + +if s:cmdline_window + syn region vimCommandLineWindowLine + \ start="^" + \ end="$" + \ contains=TOP,vimCommandLineWindowLine + \ oneline + \ keepend +endif + " Synchronize (speed) {{{2 "============ @@ -3469,6 +3475,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimWincmd_ vimWincmd hi def link vimCompilerSet vimCommand + hi def link vimVimExtend vimCommand hi def link vimSynColor vimCommand hi def link vimSynLink vimCommand hi def link vimSynMenu vimCommand @@ -3486,6 +3493,7 @@ let b:current_syntax = "vim" " Cleanup: {{{1 delc Vim9 delc VimL +delc VimExtend delc VimFolda delc VimFoldc delc VimFolde From b6bdc0f5320bac004425526a0d000aa62a1d32f4 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 30 Aug 2026 19:24:56 +0000 Subject: [PATCH 459/647] runtime(doc): terminal: the ruler in Terminal-Job mode Problem: Nothing says why the cursor position shown by the 'ruler' does not follow the cursor in a terminal window while the job runs. Solution: Say that what the terminal shows reaches the buffer only when Vim takes over, so there is no position to report until then. fixes: #21174 closes: #21190 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/terminal.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index 9a8df69e35..db626dd64d 100644 --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -1,4 +1,4 @@ -*terminal.txt* For Vim version 9.2. Last change: 2026 Aug 27 +*terminal.txt* For Vim version 9.2. Last change: 2026 Aug 30 VIM REFERENCE MANUAL by Bram Moolenaar @@ -381,6 +381,11 @@ job. That includes the cursor position. Typed keys are sent to the job. The terminal contents can change at any time. This is called Terminal-Job mode. +In Terminal-Job mode the cursor position you see belongs to the terminal job, +not to Vim. The window's cursor position is only updated when Vim takes over +in |Terminal-Normal| mode, so the 'ruler' and the 'statusline' show a stale +cursor position. + Use CTRL-W N (or 'termwinkey' N) to switch to Terminal-Normal mode. Now the contents of the terminal window is under control of Vim, the job output is suspended. CTRL-\ CTRL-N does the same. From 3052bdb9a648c5223b62a3650f42cea5ab180e1f Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 30 Aug 2026 19:38:08 +0000 Subject: [PATCH 460/647] runtime(doc): update the default value for 'isk' on Windows Since commit f883d9027c750967b115b the default 'encoding' on MS-Windows has been changed to utf-8, which causes the default value of 'iskeyword' to be overwritten inside option.c in set_init_default_encoding(). fixes: #21172 Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index a6de39886e..e2d4f6e99a 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.2. Last change: 2026 Aug 25 +*options.txt* For Vim version 9.2. Last change: 2026 Aug 30 VIM REFERENCE MANUAL by Bram Moolenaar @@ -5400,9 +5400,7 @@ A jump table for the options with a short description can be found at |Q_op|. expand "$HOME/.viminfo". Maybe you should change 'iskeyword' instead. *'iskeyword'* *'isk'* -'iskeyword' 'isk' string (Vim default for Win32: - "@,48-57,_,128-167,224-235" - otherwise: "@,48-57,_,192-255" +'iskeyword' 'isk' string (Vim default: "@,48-57,_,192-255" Vi default: "@,48-57,_") local to buffer Keywords are used in searching and recognizing with many commands: From 3e06209e5e65d3c951381c180bf85e63a0c12e8a Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Sun, 30 Aug 2026 19:47:44 +0000 Subject: [PATCH 461/647] runtime(doc): usr_05: packadd in a vimrc needs the "!" Problem: Four of the package sections tell the reader to load the plugin with "packadd", and the comment one goes on to talk about putting that line in the vimrc file. Without the "!" the package is loaded there and then rather than during the usual startup, which is not what a vimrc wants. The matchit section then explains the help file being found by saying ":packadd" loaded the plugin, which is what the "!" keeps it from doing. Solution: Give every package section the same line to write, correct the reason the help file is found, and say once, where the packages are introduced, which of the two forms belongs in a vimrc. closes: #21186 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/usr_05.txt | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/runtime/doc/usr_05.txt b/runtime/doc/usr_05.txt index 4a3444b61a..01b4cdecb9 100644 --- a/runtime/doc/usr_05.txt +++ b/runtime/doc/usr_05.txt @@ -1,4 +1,4 @@ -*usr_05.txt* For Vim version 9.2. Last change: 2026 May 11 +*usr_05.txt* For Vim version 9.2. Last change: 2026 Aug 30 VIM USER MANUAL by Bram Moolenaar @@ -406,6 +406,10 @@ packages: optional and automatically loaded on startup. The Vim distribution comes with a few packages that you can optionally use. +In your |vimrc| use `:packadd!`: it only adds the package to 'runtimepath' +and leaves the loading to the usual startup. Without the "!" the package is +loaded directly, which is what you want when trying one out. See |:packadd|. + ------------------------------------------------------------------------------ Adding the matchit package *matchit-install* *package-matchit* ------------------------------------------------------------------------------ @@ -413,14 +417,14 @@ For example, the matchit package This plugin makes the "%" command jump to matching HTML tags, if/else/endif in Vim scripts, etc. Very useful, although it's not backwards compatible (that's why it is not enabled by default). -To start using the matchit plugin, add one line to your vimrc file: > +To start using this plugin, add one line to your vimrc file: > packadd! matchit That's all! After restarting Vim you can find help about this plugin: > :help matchit -This works, because when `:packadd` loaded the plugin it also added the -package directory in 'runtimepath', so that the help file can be found. +This works, because `:packadd!` added the package directory in 'runtimepath', +so that the help file can be found. You can find packages on the Internet in various places. It usually comes as an archive or as a repository. For an archive you can follow these steps: @@ -442,11 +446,10 @@ an archive or as a repository. For an archive you can follow these steps: Adding the editorconfig package *editorconfig-install* *package-editorconfig* ------------------------------------------------------------------------------ -Similar to the matchit package, to load the distributed editorconfig plugin -when Vim starts, add the following line to your vimrc file: > +To start using this plugin, add one line to your vimrc file: > packadd! editorconfig -After restarting your Vim, the plugin is active and you can read about it at: > +After restarting Vim the plugin is active and you can read about it at: > :h editorconfig.txt @@ -454,14 +457,13 @@ After restarting your Vim, the plugin is active and you can read about it at: > Adding the comment package *comment-install* *package-comment* ------------------------------------------------------------------------------ -Load the plugin with this command: > - packadd comment +To start using this plugin, add one line to your vimrc file: > + packadd! comment < This way you can use the plugin with the default key bindings `gc` and similar for commenting (which is a well-established mapping in the Vim community). -If you add this line to your vimrc file, then you need to restart Vim to have -the package loaded. Once the package is loaded, read about it at: > +After restarting Vim the plugin is active and you can read about it at: > :h comment.txt @@ -469,8 +471,8 @@ the package loaded. Once the package is loaded, read about it at: > Adding the nohlsearch package *nohlsearch-install* *package-nohlsearch* ------------------------------------------------------------------------------ -Load the plugin with this command: > - packadd nohlsearch +To start using this plugin, add one line to your vimrc file: > + packadd! nohlsearch < Automatically execute |:nohlsearch| after 'updatetime' or getting into |Insert| mode. @@ -485,8 +487,8 @@ To disable the effect of the plugin after it has been loaded: > Adding the highlight-yank package *hlyank-install* *package-hlyank* ------------------------------------------------------------------------------ -Load the plugin with this command: > - packadd hlyank +To start using this plugin, add one line to your vimrc file: > + packadd! hlyank < This package briefly highlights the affected region of the last |yank| command. See |52.6| for a simplified implementation using the @@ -523,8 +525,8 @@ The following configuration variables can be used are "g:hlput_hlgroup" and Adding the osc52 package *osc52-install* *package-osc52* ------------------------------------------------------------------------------ -Load the plugin with this command: > - packadd osc52 +To start using this plugin, add one line to your vimrc file: > + packadd! osc52 < The osc52.vim package provides support for the OSC 52 terminal command, which allows an application to access the clipboard by communicating directly with From 7e820a3e1dad0a4a70b2a194ddc30a534693496e Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sun, 30 Aug 2026 20:11:10 +0000 Subject: [PATCH 462/647] runtime(doc): update :h cmdline-window on how to avoid the q: typo Suggested by Github User @Houl fixes: #21110 Signed-off-by: Christian Brabandt --- runtime/doc/cmdline.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt index 0f1fa50dbd..e624269aae 100644 --- a/runtime/doc/cmdline.txt +++ b/runtime/doc/cmdline.txt @@ -1,4 +1,4 @@ -*cmdline.txt* For Vim version 9.2. Last change: 2026 Jul 18 +*cmdline.txt* For Vim version 9.2. Last change: 2026 Aug 30 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1263,6 +1263,16 @@ In the command-line window the command line can be edited just like editing text in any window. It is a special kind of window, because you cannot leave it in a normal way. +If you often type `q:` when you meant `:q`, you can map `q` so that it puts +":q" on the command line instead of opening the command-line window, while +still ending a recording when one is in progress: > + + nnoremap + + + + + + + + + + + +
+ + + {#if isVisible} +
+

Visible content

+
+ {/if} +
+ + + +{#each items as item} + +
{item.name}
+{/each} + + +
diff --git a/runtime/syntax/typescript.vim b/runtime/syntax/typescript.vim index 03520fd56a..1df29f2edc 100644 --- a/runtime/syntax/typescript.vim +++ b/runtime/syntax/typescript.vim @@ -43,5 +43,11 @@ if main_syntax == 'typescript' unlet main_syntax endif +" Svelte 5 runes ($state, $derived, $props, ...) inside .svelte.ts modules. +if expand('%:t') =~# '\.svelte\.ts$' + syntax match svelteRune "\$\w\+" containedin=ALL + highlight default link svelteRune Statement +endif + let &cpo = s:cpo_save unlet s:cpo_save From 9ced70b42e49b92e712a7851c8ee3f4aa65506ab Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Tue, 8 Sep 2026 18:32:29 +0000 Subject: [PATCH 503/647] patch 9.2.1047: Copying a List is slower than necessary Problem: Copying or slicing a List allocates every item individually, even though the number of items is known in advance. Solution: Allocate the List and all of its items in a single block with list_alloc_with_items(), as list_concat() already does (Julien Voisin). Measured with `perf stat -e instructions` on workloads that model list-heavy plugin usage: - windowed slicing over a 120k-item list (pager/fuzzy-finder): -10.7% - copy() of an 800-item list, repeated (state snapshotting): -39.2% - deepcopy() of a nested list structure (config cloning): -42.6% closes: #21222 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/list.c | 45 +++++++++++++++++++++++++++++---------------- src/version.c | 2 ++ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/list.c b/src/list.c index 76e93cd0cf..42833354d4 100644 --- a/src/list.c +++ b/src/list.c @@ -1297,18 +1297,35 @@ list_concat(list_T *l1, list_T *l2, typval_T *tv) list_slice(list_T *ol, long n1, long n2) { listitem_T *item; - list_T *l = list_alloc(); + list_T *l; + long count; + long idx; + + if (n2 < n1) + return list_alloc(); + if (n1 > INT_MAX - (n2 - n1) - 1) + return NULL; + count = n2 - n1 + 1; + // The length is known, so allocate the list and all items at once. + l = list_alloc_with_items((int)count); if (l == NULL) return NULL; - for (item = list_find(ol, n1); n1 <= n2; ++n1) + + item = list_find(ol, n1); + for (idx = 0; idx < count; ++idx) { + typval_T new_tv; + // "item" is NULL when materializing "ol" stopped early. - if (item == NULL || list_append_tv(l, &item->li_tv) == FAIL) + if (item == NULL) { list_free(l); return NULL; } + + copy_tv(&item->li_tv, &new_tv); + list_set_item(l, (int)idx, &new_tv); item = item->li_next; } return l; @@ -1402,12 +1419,14 @@ list_copy(list_T *orig, int deep, int top, int copyID) { list_T *copy; listitem_T *item; - listitem_T *ni; + int idx = 0; if (orig == NULL) return NULL; - copy = list_alloc(); + // The length is known, so allocate the list and all items at once. + CHECK_LIST_MATERIALIZE(orig); + copy = list_alloc_with_items(orig->lv_len); if (copy == NULL) return NULL; @@ -1422,25 +1441,19 @@ list_copy(list_T *orig, int deep, int top, int copyID) orig->lv_copyID = copyID; orig->lv_copylist = copy; } - CHECK_LIST_MATERIALIZE(orig); for (item = orig->lv_first; item != NULL && !got_int; item = item->li_next) { - ni = listitem_alloc(); - if (ni == NULL) - break; + typval_T new_tv; + if (deep) { - if (item_copy(&item->li_tv, &ni->li_tv, - deep, FALSE, copyID) == FAIL) - { - vim_free(ni); + if (item_copy(&item->li_tv, &new_tv, deep, FALSE, copyID) == FAIL) break; - } } else - copy_tv(&item->li_tv, &ni->li_tv); - list_append(copy, ni); + copy_tv(&item->li_tv, &new_tv); + list_set_item(copy, idx++, &new_tv); } ++copy->lv_refcount; if (item != NULL) diff --git a/src/version.c b/src/version.c index e79de5db14..597db2952b 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1047, /**/ 1046, /**/ From af2c41558cb6569c6a91dc67746023b91edce7b0 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Tue, 8 Sep 2026 18:36:50 +0000 Subject: [PATCH 504/647] runtime(vimcomplete): do not autocomplete on space e.g. if autocomplete is on set shouldn't trigger completion, while i_CTRL-X_CTRL-O still completes after a space. closes: #21247 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/autoload/vimcomplete.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/autoload/vimcomplete.vim b/runtime/autoload/vimcomplete.vim index 47c3168298..f0ab31b6d7 100644 --- a/runtime/autoload/vimcomplete.vim +++ b/runtime/autoload/vimcomplete.vim @@ -3,7 +3,7 @@ vim9script # Vim completion script # Language: Vim script # Maintainer: Maxim Kim -# Last Change: 2026 Sep 07 +# Last Change: 2026 Sep 08 # # Usage: # setlocal omnifunc=vimcomplete#Complete @@ -30,7 +30,7 @@ def GetTrigger(line: string): list elseif line =~ '[lvgsb]:\k*$' result = 'var' result_len = 2 - elseif line !~ '^\s*$' + elseif line !~ '^\s*$' && !complete_info(["auto"]).auto result = getcompletiontype(line) ?? 'cmdline' endif return [result, result_len] From 375e4388139cff5a13430727b0dcedb1f7f43d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Lindstr=C3=B6m?= Date: Tue, 8 Sep 2026 18:41:51 +0000 Subject: [PATCH 505/647] patch 9.2.1048: session: syntax error when restoring session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Session files use vim9script, which requires the ".." string concatenation syntax, but the legacy "." form was used when a session file was opened in multiple windows. Solution: Use proper string concatenation "..", update test (Niklas Lindström). closes: #21224 Signed-off-by: Niklas Lindström Signed-off-by: Christian Brabandt --- src/terminal.c | 2 +- src/testdir/test_mksession.vim | 11 ++++++++++- src/version.c | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/terminal.c b/src/terminal.c index 8bdaa1b4c1..87a8066e95 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1107,7 +1107,7 @@ term_write_session(FILE *fd, win_T *wp, hashtab_T *terminal_bufs) if (!HASHITEM_EMPTY(entry)) { // we've already opened this terminal buffer - if (fprintf(fd, "execute 'buffer ' . term_buf_%d", bufnr) < 0) + if (fprintf(fd, "execute 'buffer ' .. term_buf_%d", bufnr) < 0) return FAIL; return put_eol(fd); } diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 032157d51d..5e7a33a8c9 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -602,7 +602,7 @@ func Test_mksession_terminal_shared_windows() call assert_match('exe '':terminal ++curwin ++cols='' \.\. ((&columns \* \d\+ + \d\+) \/ \d\+) \.\. '' ++rows='' \.\. ((&lines \* \d\+ + \d\+) \/ \d\+)', line) elseif line =~ $"^var term_buf_{term_buf}: number = bufnr()$" let found_var = 1 - elseif line =~ "^execute 'buffer ' . term_buf_" . term_buf . "$" + elseif line =~ "^execute 'buffer ' \\.\\. term_buf_" . term_buf . "$" let found_use = 1 endif endfor @@ -610,6 +610,15 @@ func Test_mksession_terminal_shared_windows() call assert_true(found_creation && found_use && found_var) call StopShellInTerminal(term_buf) + + source Xtest_mks.out + + let restored = bufnr() + call assert_equal('terminal', getbufvar(restored, '&buftype')) + call WaitForAssert({-> assert_match('running', term_getstatus(restored))}) + call StopShellInTerminal(restored) + + %bwipe! call delete('Xtest_mks.out') endfunc diff --git a/src/version.c b/src/version.c index 597db2952b..638b2968f1 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1048, /**/ 1047, /**/ From 673be365fd1f94caa60fabd9ebc7a1083b9a88d2 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 8 Sep 2026 18:59:17 +0000 Subject: [PATCH 506/647] patch 9.2.1049: Cannot use the stdin and stdout of Vim as a channel Problem: A Vim started by another program cannot talk to it over its stdin and stdout the way a language server does; a script has to make it connect to a socket instead. Solution: Add the --stdio-channel argument and the "stdio" address for ch_open(). Vim then serves the channel instead of reading Ex commands and exits when it is closed. Stdin and stdout are redirected to the null device so that other output cannot get into the channel (Hirohito Higashi). closes: #21245 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/channel.txt | 23 +++- runtime/doc/starting.txt | 12 ++- runtime/doc/tags | 4 + runtime/doc/version9.txt | 7 +- runtime/doc/vim.1 | 10 +- runtime/doc/vim.man | 10 +- src/channel.c | 196 ++++++++++++++++++++++++++++++++++- src/errors.h | 6 ++ src/globals.h | 5 + src/main.c | 27 +++++ src/po/vim.pot | 11 +- src/proto/channel.pro | 1 + src/testdir/test_channel.vim | 44 ++++++++ src/version.c | 2 + 14 files changed, 347 insertions(+), 11 deletions(-) diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt index ee0fe673bf..a413da0820 100644 --- a/runtime/doc/channel.txt +++ b/runtime/doc/channel.txt @@ -1,4 +1,4 @@ -*channel.txt* For Vim version 9.2. Last change: 2026 Apr 29 +*channel.txt* For Vim version 9.2. Last change: 2026 Sep 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -139,6 +139,24 @@ From another Vim instance (or any program) you can connect to it: > When done, close the server channel: > call ch_close(server) +< + *channel-stdio* +Vim can also be the other end of a channel on its own stdin and stdout, like a +language server that is started by an editor. Start Vim with +|--stdio-channel| and a script that opens the channel: > + vim --stdio-channel -S server.vim +And in server.vim: > + func OnMessage(ch, msg) + ... + endfunc + let ch = ch_open('stdio', #{mode: 'lsp', callback: 'OnMessage'}) +< + *E1582* *E1583* +The address "stdio" can only be used when Vim was started with +|--stdio-channel|, and only once. The stdin and stdout of Vim are then +redirected to the null device, so that messages from Vim and from the commands +it starts do not get into the channel. Stderr is left alone and can be used +for error messages. ============================================================================== 3. Opening a channel *channel-open* @@ -152,11 +170,12 @@ Use |ch_status()| to see if the channel could be opened. *channel-address* {address} can be a domain name or an IP address, followed by a port number, or -a Unix-domain socket path prefixed by "unix:". E.g. > +a Unix-domain socket path prefixed by "unix:", or "stdio". E.g. > www.example.com:80 " domain + port 127.0.0.1:1234 " IPv4 + port [2001:db8::1]:8765 " IPv6 + port unix:/tmp/my-socket " Unix-domain socket path + stdio " stdin and stdout of Vim, see |channel-stdio| When a domain name resolves to multiple addresses (e.g., both IPv6 and IPv4), Vim tries each address in order. If a connection is slow or unreachable, it diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index 840b065ed9..da01ad674c 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -1,4 +1,4 @@ -*starting.txt* For Vim version 9.2. Last change: 2026 Jun 02 +*starting.txt* For Vim version 9.2. Last change: 2026 Sep 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -443,6 +443,16 @@ a slash. Thus "-R" means recovery and "-/R" readonly. --ttyfail When the stdin or stdout is not a terminal (tty) then exit right away. + *--stdio-channel* +--stdio-channel Use the stdin and stdout of Vim for a channel instead of for a + terminal. Implies "-es": nothing is displayed, no Ex commands + are read and the GUI is not started. A script opens the + channel with |ch_open()| and the address "stdio". + See |channel-stdio|. + After the startup commands and scripts have been executed Vim + waits for messages on the channel and exits when it is closed. + {only available when compiled with the |+channel| feature} + *-d* -d Start in diff mode, like |vimdiff|. {not available when compiled without the |+diff| feature} diff --git a/runtime/doc/tags b/runtime/doc/tags index 1b5d35b4e0..a1148e2612 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -1623,6 +1623,7 @@ $quote eval.txt /*$quote* --servername remote.txt /*--servername* --socketid starting.txt /*--socketid* --startuptime starting.txt /*--startuptime* +--stdio-channel starting.txt /*--stdio-channel* --ttyfail starting.txt /*--ttyfail* --version starting.txt /*--version* --windowid starting.txt /*--windowid* @@ -4790,6 +4791,8 @@ E1577 options.txt /*E1577* E1578 spell.txt /*E1578* E158 sign.txt /*E158* E1581 vim9.txt /*E1581* +E1582 channel.txt /*E1582* +E1583 channel.txt /*E1583* E159 sign.txt /*E159* E16 cmdline.txt /*E16* E160 sign.txt /*E160* @@ -6669,6 +6672,7 @@ channel-onetime-callback channel.txt /*channel-onetime-callback* channel-open channel.txt /*channel-open* channel-open-options channel.txt /*channel-open-options* channel-raw channel.txt /*channel-raw* +channel-stdio channel.txt /*channel-stdio* channel-timeout channel.txt /*channel-timeout* channel-use channel.txt /*channel-use* channel.txt channel.txt /*channel.txt* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 0f5bb70a9b..59cfb7f787 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.2. Last change: 2026 Sep 07 +*version9.txt* For Vim version 9.2. Last change: 2026 Sep 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -52660,6 +52660,7 @@ Other ~ - Generated Session and View files are written in Vim9 script, see |:mksession|, |:mkview| and |:mkvimrc| - The "term_finish" option of term_start() supports a "noclose" value. +- Control Vim via a channel using stdin/stdout |channel-stdio|. Platform specific ~ ----------------- @@ -52754,6 +52755,10 @@ Highlighting: ~ |hl-PopupBorder| Popup window border. |hl-PopupTitle| Popup window title. +Vim Arguments: ~ +|--stdio-channel| Control Vim via a channel using stdin/stdout + |channel-stdio| + Configure Switches: ~ --enable-hardcopy-pango Enable the Pango |:hardcopy| backend |pango-printing| diff --git a/runtime/doc/vim.1 b/runtime/doc/vim.1 index c6d6527c06..33bf89a9c4 100644 --- a/runtime/doc/vim.1 +++ b/runtime/doc/vim.1 @@ -1,4 +1,4 @@ -.TH VIM 1 "2026 Jun 05" +.TH VIM 1 "2026 Sep 08" .SH NAME vim \- Vi IMproved, a programmer's text editor .SH SYNOPSIS @@ -531,6 +531,14 @@ GTK GUI only: Use the GtkPlug mechanism to run gVim in another window. \-\-startuptime {file} During startup write timing messages to the file {fname}. .TP +\-\-stdio\-channel +Use the stdin and stdout of +.B Vim +for a channel instead of for a terminal. Implies "\-es": nothing is +displayed, no Ex commands are read and the GUI is not started. A script +opens the channel with ch_open() and the address "stdio", see ":help +\-\-stdio\-channel". Only available when compiled with the channel feature. +.TP \-\-ttyfail When stdin or stdout is not a terminal (tty) then exit right away. .TP diff --git a/runtime/doc/vim.man b/runtime/doc/vim.man index 2bcd8d6b59..e9efe632f2 100644 --- a/runtime/doc/vim.man +++ b/runtime/doc/vim.man @@ -408,6 +408,14 @@ OPTIONS --startuptime {file} During startup write timing messages to the file {fname}. + --stdio-channel + Use the stdin and stdout of Vim for a channel instead of + for a terminal. Implies "-es": nothing is displayed, no Ex + commands are read and the GUI is not started. A script + opens the channel with ch_open() and the address "stdio", + see ":help --stdio-channel". Only available when compiled + with the channel feature. + --ttyfail When stdin or stdout is not a terminal (tty) then exit right away. @@ -498,4 +506,4 @@ BUGS vi_diff.txt when in Vim). Also have a look at the 'compatible' and 'cpoptions' options. - 2026 Jun 05 VIM(1) + 2026 Sep 08 VIM(1) diff --git a/src/channel.c b/src/channel.c index a8ffe2b306..45ed971c3b 100644 --- a/src/channel.c +++ b/src/channel.c @@ -64,6 +64,7 @@ typedef struct sockaddr_un { static void channel_read(channel_T *channel, ch_part_T part, char *func); static ch_mode_T channel_get_mode(channel_T *channel, ch_part_T part); static int channel_get_timeout(channel_T *channel, ch_part_T part); +static channel_T *channel_open_stdio(void); static ch_part_T channel_part_send(channel_T *channel); static ch_part_T channel_part_read(channel_T *channel); @@ -1346,6 +1347,7 @@ channel_open_func(typval_T *argvars) int port = 0; int is_ipv6 = FALSE; int is_unix = FALSE; + int is_stdio = FALSE; jobopt_T opt; channel_T *channel = NULL; @@ -1365,7 +1367,9 @@ channel_open_func(typval_T *argvars) return NULL; } - if (STRNCMP(address, "unix:", 5) == 0) + if (STRCMP(address, "stdio") == 0) + is_stdio = TRUE; + else if (STRNCMP(address, "unix:", 5) == 0) { is_unix = TRUE; address += 5; @@ -1392,7 +1396,7 @@ channel_open_func(typval_T *argvars) } } - if (!is_unix) + if (!is_unix && !is_stdio) { port = strtol((char *)(p + 1), &rest, 10); if (port <= 0 || port >= 65536 || *rest != NUL) @@ -1416,7 +1420,7 @@ channel_open_func(typval_T *argvars) opt.jo_timeout = 2000; if (get_job_options(&argvars[1], &opt, JO_MODE_ALL + JO_CB_ALL + JO_TIMEOUT_ALL - + (is_unix? 0 : JO_WAITTIME), 0) == FAIL) + + (is_unix || is_stdio ? 0 : JO_WAITTIME), 0) == FAIL) goto theend; if (opt.jo_timeout < 0) { @@ -1424,13 +1428,22 @@ channel_open_func(typval_T *argvars) goto theend; } - if (is_unix) + if (is_stdio) + channel = channel_open_stdio(); + else if (is_unix) channel = channel_open_unix((char *)address, NULL); else channel = channel_open((char *)address, port, opt.jo_waittime, NULL); if (channel != NULL) { + int user_set = opt.jo_set; + opt.jo_set = JO_ALL; + if (is_stdio) + // "mode" and "timeout" apply to both reading and writing, unless + // given for a part specifically. + opt.jo_set &= ~((JO_IN_MODE | JO_OUT_MODE | JO_ERR_MODE + | JO_OUT_TIMEOUT | JO_ERR_TIMEOUT) & ~user_set); channel_set_options(channel, &opt); } theend: @@ -1438,6 +1451,118 @@ channel_open_func(typval_T *argvars) return channel; } +// The channel on the stdin and stdout of Vim, see --stdio-channel. +static channel_T *stdio_channel = NULL; + +/* + * Open a channel that reads from the stdin of Vim and writes to its stdout. + * Only when started with --stdio-channel, and only once. + * Returns the channel for success. + * Returns NULL for failure. + */ + static channel_T * +channel_open_stdio(void) +{ + channel_T *channel; + sock_T in_fd; // our stdin, the channel reads from it + sock_T out_fd; // our stdout, the channel writes to it + + if (!use_stdio_channel) + { + emsg(_(e_not_started_with_stdio_channel)); + return NULL; + } + if (stdio_channel != NULL) + { + emsg(_(e_cannot_open_stdio_channel)); + return NULL; + } + + // Point the original stdin and stdout at the null device, so that neither + // Vim nor the commands it starts can use the channel. +#ifdef MSWIN + { + HANDLE proc = GetCurrentProcess(); + HANDLE hin; + HANDLE hout; + HANDLE hnul; + int nul_fd; + + if (!DuplicateHandle(proc, GetStdHandle(STD_INPUT_HANDLE), proc, &hin, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + emsg(_(e_cannot_open_stdio_channel)); + return NULL; + } + if (!DuplicateHandle(proc, GetStdHandle(STD_OUTPUT_HANDLE), proc, + &hout, 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + CloseHandle(hin); + emsg(_(e_cannot_open_stdio_channel)); + return NULL; + } + hnul = CreateFile("NUL", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, + NULL); + if (hnul != INVALID_HANDLE_VALUE) + { + SetStdHandle(STD_INPUT_HANDLE, hnul); + SetStdHandle(STD_OUTPUT_HANDLE, hnul); + } + // The C runtime keeps its own stdout, used for messages. + nul_fd = _open("NUL", _O_RDWR); + if (nul_fd >= 0) + { + _dup2(nul_fd, 1); + _close(nul_fd); + } + in_fd = (sock_T)hin; + out_fd = (sock_T)hout; + } +#else + { + int nul_fd; + + in_fd = dup(0); + out_fd = dup(1); + if (in_fd < 0 || out_fd < 0) + { + if (in_fd >= 0) + close(in_fd); + if (out_fd >= 0) + close(out_fd); + emsg(_(e_cannot_open_stdio_channel)); + return NULL; + } + (void)fcntl(in_fd, F_SETFD, FD_CLOEXEC); + (void)fcntl(out_fd, F_SETFD, FD_CLOEXEC); + nul_fd = open("/dev/null", O_RDWR); + if (nul_fd >= 0) + { + dup2(nul_fd, 0); + dup2(nul_fd, 1); + close(nul_fd); + } + } +#endif + + channel = add_channel(); + if (channel == NULL) + { + ch_error(NULL, "Cannot allocate channel."); + fd_close(in_fd); + fd_close(out_fd); + return NULL; + } + channel_set_pipes(channel, out_fd, in_fd, INVALID_FD); + ch_log(channel, "Using stdin and stdout as a channel"); + + // Keep a reference for channel_stdio_loop(). + ++channel->ch_refcount; + stdio_channel = channel; + return channel; +} + /* * Implements ch_listen(). */ @@ -5512,6 +5637,69 @@ channel_select_check(int ret_in, void *rfds_in, void *wfds_in) } #endif // !MSWIN && HAVE_SELECT +/* + * Wait up to "msec" for something to read on any channel and read it. + * For channel_stdio_loop(), which has no terminal to wait for. + */ + static void +channel_wait_any(long msec) +{ +#ifdef MSWIN + // A pipe cannot be waited for, channel_wait() polls it. + if (stdio_channel->CH_OUT_FD != INVALID_FD) + (void)channel_wait(stdio_channel, stdio_channel->CH_OUT_FD, + (int)(msec > 20 ? 20 : msec)); + channel_handle_events(FALSE); +#elif defined(HAVE_SELECT) + fd_set rfds; + fd_set wfds; + struct timeval tv; + struct timeval *tvp = &tv; + int maxfd; + int ret; + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + tv.tv_sec = msec / 1000; + tv.tv_usec = (msec % 1000) * 1000; + maxfd = channel_select_setup(-1, &rfds, &wfds, &tv, &tvp); + ret = select(maxfd + 1, &rfds, &wfds, NULL, tvp); + if (ret >= 0) + (void)channel_select_check(ret, &rfds, &wfds); +#else + struct pollfd fds[4 * MAX_OPEN_CHANNELS + MAX_CLIENT_CHANNELS]; + int nfd; + int towait = (int)msec; + int ret; + + nfd = channel_poll_setup(0, fds, &towait); + ret = poll(fds, nfd, towait); + if (ret >= 0) + (void)channel_poll_check(ret, fds); +#endif +} + +/* + * Wait for messages on the stdio channel and handle them, until the channel + * is closed. Takes the place of the main loop with --stdio-channel. + */ + void +channel_stdio_loop(void) +{ + while (stdio_channel != NULL && channel_is_open(stdio_channel)) + { + long msec = 1000; +#ifdef FEAT_TIMERS + long due_time = check_due_timer(); + + if (due_time > 0 && due_time < msec) + msec = due_time; +#endif + channel_wait_any(msec); + parse_queued_messages(); + } +} + /* * Execute queued up commands. * Invoked from the main loop when it's safe to execute received commands, diff --git a/src/errors.h b/src/errors.h index b0e56608de..fdfe3a14c5 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3826,3 +3826,9 @@ EXTERN char e_too_many_text_properties_on_a_single_line[] EXTERN char e_cannot_extend_null_blob[] INIT(= N_("E1581: Cannot extend a null blob")); #endif +#ifdef FEAT_JOB_CHANNEL +EXTERN char e_not_started_with_stdio_channel[] + INIT(= N_("E1582: Not started with --stdio-channel")); +EXTERN char e_cannot_open_stdio_channel[] + INIT(= N_("E1583: Cannot open stdio channel")); +#endif diff --git a/src/globals.h b/src/globals.h index 305725c3e5..2b34c4f596 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1198,6 +1198,11 @@ EXTERN int sandbox INIT(= 0); EXTERN int silent_mode INIT(= FALSE); // set to TRUE when "-s" commandline argument // used for ex +#ifdef FEAT_JOB_CHANNEL +EXTERN int use_stdio_channel INIT(= FALSE); + // set to TRUE for the "--stdio-channel" + // commandline argument +#endif EXTERN pos_T VIsual; // start position of active Visual selection EXTERN int VIsual_active INIT(= FALSE); diff --git a/src/main.c b/src/main.c index ba863a3f0c..81e9adff76 100644 --- a/src/main.c +++ b/src/main.c @@ -971,6 +971,16 @@ vim_main2(void) TIME_MSG("before starting main loop"); +# ifdef FEAT_JOB_CHANNEL + if (use_stdio_channel) + { + // Serve the stdio channel instead of reading Ex commands, exit when + // it is closed. + channel_stdio_loop(); + getout(0); + } +# endif + /* * Call the main command loop. This never returns. */ @@ -2217,6 +2227,7 @@ command_line_scan(mparm_T *parmp) // "--not-a-term" don't warn for not a term // "--gui-dialog-file fname" write dialog text // "--ttyfail" exit if not a term + // "--stdio-channel" use stdin/stdout as channel // "--noplugin[s]" skip plugins // "--cmd " execute cmd before vimrc if (STRICMP(argv[0] + argv_idx, "help") == 0) @@ -2267,6 +2278,19 @@ command_line_scan(mparm_T *parmp) } else if (STRNICMP(argv[0] + argv_idx, "ttyfail", 7) == 0) parmp->tty_fail = TRUE; +# ifdef FEAT_JOB_CHANNEL + else if (STRNICMP(argv[0] + argv_idx, "stdio-channel", 13) == 0) + { + // Like "-es": no terminal, but the channel is served + // instead of reading Ex commands. + use_stdio_channel = TRUE; + exmode_active = EXMODE_NORMAL; + silent_mode = TRUE; +# if defined(FEAT_GUI) && !defined(VIMDLL) + gui.starting = false; // don't start GUI +# endif + } +# endif else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0) { want_argument = TRUE; @@ -3758,6 +3782,9 @@ usage(void) main_msg(_("--gui-dialog-file {fname} For testing: write dialog text")); # endif main_msg(_("--ttyfail\t\tExit if input or output is not a terminal")); +# ifdef FEAT_JOB_CHANNEL + main_msg(_("--stdio-channel\tUse stdin and stdout as a channel")); +# endif main_msg(_("-u \t\tUse instead of any .vimrc")); # ifdef FEAT_GUI main_msg(_("-U \t\tUse instead of any .gvimrc")); diff --git a/src/po/vim.pot b/src/po/vim.pot index fbf6c473f1..ffe6e36165 100644 --- a/src/po/vim.pot +++ b/src/po/vim.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: vim-dev@vim.org\n" -"POT-Creation-Date: 2026-08-18 20:22+0000\n" +"POT-Creation-Date: 2026-09-08 18:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1671,6 +1671,9 @@ msgstr "" msgid "--ttyfail\t\tExit if input or output is not a terminal" msgstr "" +msgid "--stdio-channel\tUse stdin and stdout as a channel" +msgstr "" + msgid "-u \t\tUse instead of any .vimrc" msgstr "" @@ -8905,6 +8908,12 @@ msgstr "" msgid "E1581: Cannot extend a null blob" msgstr "" +msgid "E1582: Not started with --stdio-channel" +msgstr "" + +msgid "E1583: Cannot open stdio channel" +msgstr "" + #. type of cmdline window or 0 #. result of cmdline window or 0 #. buffer of cmdline window or NULL diff --git a/src/proto/channel.pro b/src/proto/channel.pro index cd58f2c317..29618da0a9 100644 --- a/src/proto/channel.pro +++ b/src/proto/channel.pro @@ -45,6 +45,7 @@ int channel_poll_setup(int nfd_in, void *fds_in, int *towait); int channel_poll_check(int ret_in, void *fds_in); int channel_select_setup(int maxfd_in, void *rfds_in, void *wfds_in, struct timeval *tv, struct timeval **tvp); int channel_select_check(int ret_in, void *rfds_in, void *wfds_in); +void channel_stdio_loop(void); int channel_parse_messages(void); int channel_any_readahead(void); int set_ref_in_channel(int copyID); diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index 9d2eb5a08a..fd05259bbe 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -2933,6 +2933,50 @@ func Test_listen_unix_first_socket() call delete('Xlistensock') endfunc +" A Vim started with --stdio-channel answers on its stdin and stdout. +func Test_stdio_channel() + if has('win32') && has('gui_running') + throw 'Skipped: gvim.exe cannot run without the GUI' + endif + let lines =<< trim END + func OnMessage(ch, msg) + if a:msg.method == 'ping' + call ch_sendexpr(a:ch, #{id: a:msg.id, result: 'pong ' .. a:msg.params}) + elseif a:msg.method == 'again' + try + call ch_open('stdio') + let err = 'none' + catch + let err = v:exception + endtry + call ch_sendexpr(a:ch, #{id: a:msg.id, result: err}) + endif + endfunc + let ch = ch_open('stdio', #{mode: 'lsp', callback: 'OnMessage'}) + " Output of Vim itself must not get into the channel. + set verbose=1 + echo 'noise' + END + call writefile(lines, 'Xstdio_server.vim', 'D') + + let job = job_start([GetVimProg(), '--clean', '--stdio-channel', + \ '-S', 'Xstdio_server.vim'], #{in_mode: 'lsp', out_mode: 'lsp'}) + call assert_equal('run', job_status(job)) + + let resp = ch_evalexpr(job, #{method: 'ping', params: 'x'}, #{timeout: 5000}) + call assert_equal('pong x', resp->get('result', resp)) + let resp = ch_evalexpr(job, #{method: 'again'}, #{timeout: 5000}) + call assert_match('E1583:', resp->get('result', '')) + + " Without --stdio-channel the address cannot be used. + call assert_fails("call ch_open('stdio')", 'E1582:') + + " The child exits when its stdin is closed. + call ch_close(job) + call WaitForAssert({-> assert_equal('dead', job_status(job))}) + call job_stop(job) +endfunc + func Test_channel_lsp_mode() " The channel lsp mode test is flaky and gives the same error. let g:giveup_same_error = 0 diff --git a/src/version.c b/src/version.c index 638b2968f1..c4686cf5a8 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1049, /**/ 1048, /**/ From f95fe08115445e900891c6aa684022368e76892a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Marek?= Date: Tue, 8 Sep 2026 20:02:55 +0000 Subject: [PATCH 507/647] patch 9.2.1050: tests: test_suspend() fails on Solaris MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Test_suspend() and Test_suspend_autocmd() wait for a shell prompt that ends in either $ or #, however on Solaris /bin/sh does not provide the expected prompt Solution: Unset PS1 so the shell uses its default prompt instead of an environment-provided custom prompt (Vladimír Marek). closes: #20569 Signed-off-by: Vladimír Marek Signed-off-by: Christian Brabandt --- src/testdir/test_suspend.vim | 3 +++ src/version.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/testdir/test_suspend.vim b/src/testdir/test_suspend.vim index 69abeaed6e..0b8388bb1d 100644 --- a/src/testdir/test_suspend.vim +++ b/src/testdir/test_suspend.vim @@ -1,5 +1,8 @@ " Test :suspend +" Use the shell's default prompt, which should match the '[$#] $' pattern. +silent! unlet $PS1 + func CheckSuspended(buf, fileExists) call WaitForAssert({-> assert_match('[$#] $', term_getline(a:buf, '.'))}) diff --git a/src/version.c b/src/version.c index c4686cf5a8..e4f7ca0d0c 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1050, /**/ 1049, /**/ From deb7b0553ee00b0f0ae73b9a9962ab9636038392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Marek?= Date: Tue, 8 Sep 2026 20:12:00 +0000 Subject: [PATCH 508/647] patch 9.2.1051: getdigits() overflow behaviour is not portable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: getdigits() uses atol(), whose overflow behavior is not portable. On Solaris, overflowing atol() can return a wrapped positive value without ERANGE, so Ex address parsing does not detect the out-of-range condition and Test_address_line_overflow() fails. Solution: Use strtol(), which is specified to return LONG_MAX or LONG_MIN on overflow (Vladimír Marek). closes: #20602 Signed-off-by: Vladimír Marek Signed-off-by: Christian Brabandt --- src/charset.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/charset.c b/src/charset.c index 8a8b930c3d..70db94fe49 100644 --- a/src/charset.c +++ b/src/charset.c @@ -2262,7 +2262,7 @@ getdigits(char_u **pp) long retval; p = *pp; - retval = atol((char *)p); + retval = strtol((char *)p, NULL, 10); if (*p == '-') // skip negative sign ++p; p = skipdigits(p); // skip to next non-digit diff --git a/src/version.c b/src/version.c index e4f7ca0d0c..76f4cbb570 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1051, /**/ 1050, /**/ From e6bc60ce1b24954ebead198ba0afe41f94bbcf89 Mon Sep 17 00:00:00 2001 From: "Wu, Zhenyu" Date: Tue, 8 Sep 2026 20:16:55 +0000 Subject: [PATCH 509/647] patch 9.2.1052: filetype: evcxr history files are not recognized Problem: filetype: evcxr history files are not recognized Solution: Detect evcxr/history.txt as rust filetype (Wu, Zhenyu). Reference: https://github.com/evcxr/evcxr/blob/main/evcxr_repl/README.md closes: #21164 Signed-off-by: Wu, Zhenyu Signed-off-by: Christian Brabandt --- runtime/filetype.vim | 5 ++++- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 46fca304cd..5c6cffd265 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: The Vim Project -" Last Change: 2026 Aug 25 +" Last Change: 2026 Sep 08 " Former Maintainer: Bram Moolenaar " If the filetype can be detected from extension or file name(the final path component), @@ -308,6 +308,9 @@ if has("fname_case") au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW call dist#ft#EuphoriaCheck() endif +" Evcxr history +au BufNewFile,BufRead */evcxr/history.txt setf rust + " Execline (s6) scripts au BufNewFile,BufRead *s6*/\(up\|down\|run\|finish\) setf execline diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index c97f0a285f..1420b628f9 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -729,7 +729,7 @@ def s:GetFilenameChecks(): dict> ruby: ['.irbrc', 'irbrc', '.irb_history', 'irb_history', 'file.rb', 'file.rbi', 'file.rbw', 'file.gemspec', 'file.ru', 'Gemfile', 'file.builder', 'file.rxml', 'file.rjs', 'file.rant', 'file.rake', 'rakefile', 'Rakefile', 'rantfile', 'Rantfile', 'rakefile-file', 'Rakefile-file', 'Puppetfile', 'Vagrantfile', 'Brewfile'], - rust: ['file.rs'], + rust: ['file.rs', 'any/.config/evcxr/history.txt'], sage: ['file.sage'], salt: ['file.sls'], samba: ['smb.conf'], diff --git a/src/version.c b/src/version.c index 76f4cbb570..f8e8255e75 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1052, /**/ 1051, /**/ From e53a8161d344c14a7c262c42137a01b523dc3234 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Tue, 8 Sep 2026 20:41:09 +0000 Subject: [PATCH 510/647] patch 9.2.1053: libvterm: characters can get a different width in a terminal window Problem: Some characters get a different width in a terminal window than in an ordinary window. Solution: When the application provides a width function, use it as the only source for the width of a character (Hirohito Higashi). libvterm looks up its own "fullwidth" table before calling the wcwidth() function that Vim provides. That table holds Unicode 12 data, while Vim follows a newer version, so U+1F93B and U+1F946 are two cells wide in a terminal window and one cell wide everywhere else. U+302A-302D and U+3099-309A are affected as well: both tables list them as wide, but the function Vim provides reports zero for a composing character. Skipping the table when a wcwidth() function is provided makes that function the only authority, so a terminal cell gets the same width as the character gets in a buffer. A build of libvterm without such a function keeps using the table. closes: #21213 Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/libvterm/src/unicode.c | 7 +++++++ src/testdir/test_terminal.vim | 26 ++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 35 insertions(+) diff --git a/src/libvterm/src/unicode.c b/src/libvterm/src/unicode.c index a6a46e131c..8c43a9ef70 100644 --- a/src/libvterm/src/unicode.c +++ b/src/libvterm/src/unicode.c @@ -417,6 +417,7 @@ static int bisearch(uint32_t ucs, const struct interval *table, int max) { #ifdef WCWIDTH_FUNCTION // use a provided wcwidth() function int WCWIDTH_FUNCTION(uint32_t ucs); +# define HAVE_PROVIDED_WCWIDTH #else # define WCWIDTH_FUNCTION mk_wcwidth @@ -564,14 +565,20 @@ vterm_get_special_pty_type_placeholder(void) // ################################ // ### The rest added by Paul Evans +#ifndef HAVE_PROVIDED_WCWIDTH static const struct interval fullwidth[] = { #include "fullwidth.inc" }; +#endif INTERNAL int vterm_unicode_width(uint32_t codepoint) { + // The fullwidth table is outdated. When a wcwidth() function is provided + // it is the only authority on the width of a character. +#ifndef HAVE_PROVIDED_WCWIDTH if(bisearch(codepoint, fullwidth, sizeof(fullwidth) / sizeof(fullwidth[0]) - 1)) return 2; +#endif return WCWIDTH_FUNCTION(codepoint); } diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim index 706fb1ebca..0e12aae822 100644 --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -436,6 +436,32 @@ func Test_terminal_scrape_multibyte() exe buf . 'bwipe' endfunc +func Test_terminal_scrape_char_width() + " These characters do not come through a Windows console. + CheckUnix + + " U+1F93B and U+1F946 have East Asian Width "Neutral", the surrounding + " emoji are "Wide". A terminal cell must get the same width as the + " character gets in an ordinary buffer. + let chars = ["\U0001F93A", "\U0001F93B", "\U0001F945", "\U0001F946"] + call writefile([join(chars, '')], 'Xwidth', 'D') + let buf = term_start("cat Xwidth") + + call WaitFor({-> len(term_scrape(buf, 1)) >= len(chars) + \ && term_scrape(buf, 1)[0].chars == chars[0]}) + let l = term_scrape(buf, 1) + for i in range(len(chars)) + call assert_equal(chars[i], l[i].chars) + call assert_equal(strdisplaywidth(chars[i]), l[i].width, chars[i]) + endfor + + let job = term_getjob(buf) + call WaitForAssert({-> assert_equal("dead", job_status(job))}) + call TermWait(buf) + + exe buf . 'bwipe' +endfunc + func Test_terminal_one_column() " This creates a terminal, displays a double-wide character and makes the " window one column wide. This used to cause a crash. diff --git a/src/version.c b/src/version.c index f8e8255e75..a90ffc4bb3 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1053, /**/ 1052, /**/ From 5d934b1bdb803c652a521f04481f92b2c2fa029e Mon Sep 17 00:00:00 2001 From: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:45:30 +0000 Subject: [PATCH 511/647] patch 9.2.1054: Virtual Replace mode: BS over multi-byte text eats the padding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: In Virtual Replace mode, backspacing over a character that replaced several multi-byte characters deletes the padding that follows it, so the text after the cursor loses its alignment. Solution: In replace_do_bs() advance by the length of the character at the current offset instead of always measuring the first restored character (Volodymyr Chernetskyi). After the original characters are restored, replace_do_bs() adds up their screen width so it knows how much of the alignment padding to drop again. The loop advanced "i" by mb_ptr2len(p) - 1, which always returns the length of the *first* restored character rather than the length of the character at the offset being looked at. One backspace can restore more than one character, because a wide character may have replaced several narrow ones. When those characters do not all have the same byte length the index lands in the middle of a character: chartabsize() then measures a trailing byte, counts it as an unprintable worth four cells, and the inflated width makes the following loop delete padding spaces that should have been kept. call setline(1, 'aé xyz') call feedkeys("gR\u4e00\\e", 'xt') leaves "aéxyz" instead of restoring the original line. Going the other way round ('éa') happens to work, since there the first character is the longer one. This has been wrong since the loop was added in Vim 7.0. closes: #21211 Co-Authored-By: Claude Opus 5 Signed-off-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com> Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/edit.c | 2 +- src/testdir/test_edit.vim | 14 ++++++++++++++ src/version.c | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/edit.c b/src/edit.c index 697262976c..05d4a42bd5 100644 --- a/src/edit.c +++ b/src/edit.c @@ -3492,7 +3492,7 @@ replace_do_bs(int limit_col) for (i = 0; i < ins_len; ++i) { vcol += chartabsize(p + i, vcol); - i += (*mb_ptr2len)(p) - 1; + i += (*mb_ptr2len)(p + i) - 1; } vcol -= start_vcol; diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index ef68d66336..ecb990b798 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -1810,6 +1810,20 @@ func Test_edit_startinsert_in_terminal() bwipe! endfunc +" Backspacing in Virtual Replace mode over a wide character that replaced +" several narrower ones must not eat the padding that follows. +func Test_edit_vreplace_bs_multibyte() + new + call setline(1, 'aé xyz') + call feedkeys("gR\u4e00\\e", 'xt') + call assert_equal('aé xyz', getline(1)) + + call setline(1, 'a€ xyz') + call feedkeys("gR\u4e00\\e", 'xt') + call assert_equal('a€ xyz', getline(1)) + bwipe! +endfunc + " Test for :startreplace and :startgreplace func Test_edit_startreplace() new diff --git a/src/version.c b/src/version.c index a90ffc4bb3..42697dcfa2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1054, /**/ 1053, /**/ From 1cb30afd951e36c1d66e9015891845d3e33866c8 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 9 Sep 2026 18:49:08 +0000 Subject: [PATCH 512/647] patch 9.2.1055: Vim9: a lambda with a block body fails to compile after error Problem: When ":defcompile" compiles several functions and one of them fails, a function after it that contains a lambda with a block body fails as well, with E1028 and nothing else. Solution: In get_function_body() only consider errors that were given while reading the body. Keep define_function() from defining a function whose header had an error (Hirohito Higashi). closes: #21252 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_expr.vim | 24 ++++++++++++++++++++++++ src/userfunc.c | 14 ++++++++------ src/version.c | 2 ++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 3613c1a2ea..a318a841f1 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2862,6 +2862,30 @@ def Test_expr9_lambda_block() END v9.CheckDefFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 0) v9.CheckScriptFailure(['vim9script'] + lines, 'E1145: Missing heredoc end marker: ENDIT', 2) + + # An error in one function must not make the block lambda in the next + # function fail to compile in the same :defcompile. Class methods are + # compiled in the order they are defined. + lines =<< trim END + vim9script + class C + static def Broken(): number + return 'x' + enddef + static def Healthy(): list + return [1, 2]->map((_, v) => { + return v * 2 + }) + enddef + endclass + try + defcompile C + catch + assert_match('E1012:', v:exception) + endtry + assert_equal([2, 4], C.Healthy()) + END + v9.CheckScriptSuccess(lines) enddef def NewLambdaWithComments(): func diff --git a/src/userfunc.c b/src/userfunc.c index 08f696fad2..17b56f4434 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -994,6 +994,7 @@ get_function_body( garray_T heredoc_ga; char_u *heredoc_trimmed = NULL; size_t heredoc_trimmedlen = 0; + int did_emsg_start = did_emsg; ga_init2(&heredoc_ga, 1, 500); @@ -1422,8 +1423,9 @@ get_function_body( line_arg = NULL; } - // Return OK when no error was detected. - if (!did_emsg) + // Return OK when no error was detected here; "did_emsg" may already be + // set by an earlier error in the same command. + if (did_emsg == did_emsg_start) ret = OK; theend: @@ -5412,12 +5414,12 @@ define_function( // Save the starting line number. sourcing_lnum_top = SOURCING_LNUM; - // Do not define the function when getting the body fails and when - // skipping. + // Do not define the function when getting the body fails, when the header + // had an error (the body is still read to find the end) and when skipping. if (((class_flags & CF_INTERFACE) == 0 && (class_flags & CF_ABSTRACT_METHOD) == 0 - && get_function_body(eap, &newlines, line_arg, lines_to_free) - == FAIL) + && (get_function_body(eap, &newlines, line_arg, lines_to_free) + == FAIL || did_emsg)) || eap->skip) goto erret; diff --git a/src/version.c b/src/version.c index 42697dcfa2..4dfc61c501 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1055, /**/ 1054, /**/ From b6e742aec5c22dbd19103620b3e5d4ddd6ae064d Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 9 Sep 2026 18:56:06 +0000 Subject: [PATCH 513/647] patch 9.2.1056: terminalprops() does not report a direct color terminal Problem: A terminal entry with 16777216 colors, such as xterm-direct, needs 'termguicolors' to show its colors, and a vimrc has no way to tell that it is such a terminal. Solution: Add "rgb" to terminalprops(), 'y' when 't_Co' is 16777216, and document setting 'termguicolors' from it (Hirohito Higashi). related: #21251 closes: #21251 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 6 +++++- runtime/doc/term.txt | 11 ++++++++++- src/term.c | 21 ++++++++++++++++++++- src/testdir/test_termcodes.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 93d543d23d..4cfb79071b 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.2. Last change: 2026 Sep 06 +*builtin.txt* For Vim version 9.2. Last change: 2026 Sep 09 VIM REFERENCE MANUAL by Bram Moolenaar @@ -12196,6 +12196,7 @@ terminalprops() *terminalprops()* mouse mouse type supported kitty whether Kitty terminal was detected decrqm whether sending DECRQM sequences work + rgb whether the terminal has true color ** ** value 'u' for unknown, 'y' for yes, 'n' for no @@ -12218,6 +12219,9 @@ terminalprops() *terminalprops()* If "decrqm" is 'y', then Vim will query support for the 'termsync' and 'termresize' ("inband") options. + "rgb" is 'y' when 't_Co' is 16777216, as it is for the + "xterm-direct" terminal entry. See |xterm-true-color|. + Also see: - 'ambiwidth' - detected by using |t_u7|. - |v:termstyleresp| and |v:termblinkresp| for the response to diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt index a20143efa8..c0e3687931 100644 --- a/runtime/doc/term.txt +++ b/runtime/doc/term.txt @@ -1,4 +1,4 @@ -*term.txt* For Vim version 9.2. Last change: 2026 Jul 25 +*term.txt* For Vim version 9.2. Last change: 2026 Sep 09 VIM REFERENCE MANUAL by Bram Moolenaar @@ -690,6 +690,15 @@ work the 'termguicolors' option needs to be set. See https://github.com/termstandard/colors for a list of terminals that support true colors. +The entry of a direct color terminal, such as "xterm-direct", has 16777216 +colors. Then 't_Co' is 16777216 and |terminalprops()| reports "rgb" as 'y'. +Vim does not set 'termguicolors' by itself. To have it set for such a +terminal, put this in the vimrc: > + if terminalprops().rgb == 'y' + set termguicolors + endif +< + For telling the terminal what RGB color to use the |t_8f|, |t_8b|, and |t_8u| termcap entries are used. These are set by default to values that work for most terminals. If that does not work for your terminal you can set them diff --git a/src/term.c b/src/term.c index b789f39248..c049f2f288 100644 --- a/src/term.c +++ b/src/term.c @@ -1549,11 +1549,24 @@ typedef struct { #define TPR_KITTY 4 // can send DECRQM requests to terminal #define TPR_DECRQM 5 +// true color, from the color count of the terminal entry +#define TPR_RGB 6 // table size -#define TPR_COUNT 6 +#define TPR_COUNT 7 static termprop_T term_props[TPR_COUNT]; +/* + * Set the "rgb" terminal property from the color count. The entry of a + * direct color terminal, such as xterm-direct, has 16777216 colors. + */ + static void +set_rgb_term_prop(void) +{ + term_props[TPR_RGB].tpr_status = t_colors == 0x1000000 + ? TPR_YES : TPR_UNKNOWN; +} + /* * Initialize the term_props table. * When "all" is FALSE only set those that are detected from the version @@ -1576,10 +1589,15 @@ init_term_props(int all) term_props[TPR_KITTY].tpr_set_by_termresponse = FALSE; term_props[TPR_DECRQM].tpr_name = "decrqm"; term_props[TPR_DECRQM].tpr_set_by_termresponse = TRUE; + term_props[TPR_RGB].tpr_name = "rgb"; + term_props[TPR_RGB].tpr_set_by_termresponse = FALSE; for (i = 0; i < TPR_COUNT; ++i) if (all || term_props[i].tpr_set_by_termresponse) term_props[i].tpr_status = TPR_UNKNOWN; + + // Derived from the color count, not reset. + set_rgb_term_prop(); } #if defined(FEAT_EVAL) @@ -3567,6 +3585,7 @@ ttest(int pairs) set_color_count(colors); } } + set_rgb_term_prop(); } #if defined(FEAT_GUI) && (defined(FEAT_MENU) || !defined(USE_ON_FLY_SCROLL)) diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index 8dd33a6fd7..2291e3a050 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -1720,6 +1720,7 @@ func Test_xx01_term_style_response() \ underline_rgb: 'u', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) @@ -1756,6 +1757,7 @@ func Test_xx02_iTerm2_response() \ underline_rgb: 'u', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'y' \ }, terminalprops()) @@ -1777,6 +1779,7 @@ func Run_libvterm_konsole_response(code) \ underline_rgb: 'u', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) endfunc @@ -1821,6 +1824,7 @@ func Test_xx04_Mac_Terminal_response() \ underline_rgb: 'y', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'n' \ }, terminalprops()) call assert_equal("\[58;2;%lu;%lu;%lum", &t_8u) @@ -1853,6 +1857,7 @@ func Test_xx05_mintty_response() \ underline_rgb: 'y', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) @@ -1890,6 +1895,7 @@ func Test_xx06_screen_response() \ underline_rgb: 'y', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'n' \ }, terminalprops()) @@ -1916,6 +1922,7 @@ func Do_check_t_8u_set_reset(set_by_user) \ underline_rgb: 'u', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) call assert_equal(a:set_by_user ? default_value : '', &t_8u) @@ -1956,6 +1963,7 @@ func Test_xx07_xterm_response() \ underline_rgb: 'y', \ mouse: 'u', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) @@ -1973,6 +1981,7 @@ func Test_xx07_xterm_response() \ underline_rgb: 'u', \ mouse: '2', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) @@ -1990,6 +1999,7 @@ func Test_xx07_xterm_response() \ underline_rgb: 'u', \ mouse: 's', \ kitty: 'u', + \ rgb: 'u', \ decrqm: 'u' \ }, terminalprops()) @@ -2020,6 +2030,7 @@ func Test_xx08_kitty_response() \ underline_rgb: 'y', \ mouse: 's', \ kitty: 'y', + \ rgb: 'u', \ decrqm: 'y' \ }, terminalprops()) @@ -2970,6 +2981,16 @@ func Test_da1_handling() call assert_equal("\[?62,52;c", v:termda1) endfunc +" Test that terminalprops().rgb follows the color count. +func Test_terminalprops_rgb() + let save_t_Co = &t_Co + set t_Co=16777216 + call assert_equal('y', terminalprops().rgb) + set t_Co=256 + call assert_equal('u', terminalprops().rgb) + let &t_Co = save_t_Co +endfunc + " Test if OSC terminal responses are captured correctly func Test_term_response_osc() " Test if large OSC responses (that must be processed in chunks) are handled diff --git a/src/version.c b/src/version.c index 4dfc61c501..8484e70940 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1056, /**/ 1055, /**/ From 094ddff921294d366162a9d6bf9bb8137b298b8e Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Wed, 9 Sep 2026 19:09:57 +0000 Subject: [PATCH 514/647] patch 9.2.1057: backtracking engine stack push is slower than necessary Problem: The backtracking regexp engine calls ga_grow() as an out-of-line function on every regstack/backpos push, even in the common case where the growable array already has room. Solution: Use the inlined GA_GROW_FAILS() macro, which checks the capacity inline and only calls ga_grow_inner() when the array actually needs to grow, matching the pattern already used in vim9execute.c (Julien Voisin). The backtracking engine is used for patterns with backreferences, look-behind and an explicit \%#=1, most visibly by syntax files that force it (yaml, python, ruby). Converting the four hot ga_grow() call sites in regmatch()/regstack_push() to GA_GROW_FAILS() removes the per-push call overhead. On a \%#=1-forced substitute/match benchmark this is about -3.6%; on real-world YAML syntax highlighting, whose number/float/timestamp rules use \%#=1 heavily, about -1.9%. closes: #21249 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/regexp_bt.c | 8 ++++---- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/regexp_bt.c b/src/regexp_bt.c index 1dd6b066d6..067c0346a5 100644 --- a/src/regexp_bt.c +++ b/src/regexp_bt.c @@ -3188,7 +3188,7 @@ regstack_push(regstate_T state, char_u *scan) emsg(_(e_pattern_uses_more_memory_than_maxmempattern)); return NULL; } - if (ga_grow(®stack, sizeof(regitem_T)) == FAIL) + if (GA_GROW_FAILS(®stack, (int)sizeof(regitem_T))) return NULL; rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len); @@ -3924,7 +3924,7 @@ regmatch( if (i == backpos.ga_len) { // First time at this BACK, make room to store the pos. - if (ga_grow(&backpos, 1) == FAIL) + if (GA_GROW_FAILS(&backpos, 1)) status = RA_FAIL; else { @@ -4324,7 +4324,7 @@ regmatch( emsg(_(e_pattern_uses_more_memory_than_maxmempattern)); status = RA_FAIL; } - else if (ga_grow(®stack, sizeof(regstar_T)) == FAIL) + else if (GA_GROW_FAILS(®stack, (int)sizeof(regstar_T))) status = RA_FAIL; else { @@ -4369,7 +4369,7 @@ regmatch( emsg(_(e_pattern_uses_more_memory_than_maxmempattern)); status = RA_FAIL; } - else if (ga_grow(®stack, sizeof(regbehind_T)) == FAIL) + else if (GA_GROW_FAILS(®stack, (int)sizeof(regbehind_T))) status = RA_FAIL; else { diff --git a/src/version.c b/src/version.c index 8484e70940..b9240bcd6f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1057, /**/ 1056, /**/ From f874bf9e352b43126875b7fa94181c74edd2f860 Mon Sep 17 00:00:00 2001 From: dyingc Date: Wed, 9 Sep 2026 20:04:15 +0000 Subject: [PATCH 515/647] patch 9.2.1058: string_reduce() leaves a stale funccall on error Problem: reduce() on a String with a compiled closure or lambda that fails returns from string_reduce() without calling remove_funccal(). The funccall_T created by eval_expr_get_funccal() stays on the current_funccal chain and its fc_ectx points at the stack frame of a call_def_function() that has already returned. Solution: Use break instead of return, like list_reduce() does, so the funccall is removed on the error path as well. Add a test that runs the failing path, so the ASan CI catches a regression (dyingc). closes: #21255 Signed-off-by: dyingc Signed-off-by: Christian Brabandt --- src/strings.c | 2 +- src/testdir/test_vim9_builtin.vim | 8 ++++++++ src/testdir/test_vim9_script.vim | 19 +++++++++++++++++++ src/testdir/util/check.vim | 8 ++++++++ src/version.c | 2 ++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/strings.c b/src/strings.c index e3f76503ef..44d753e4a0 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1053,7 +1053,7 @@ string_reduce( clear_tv(&argv[0]); clear_tv(&argv[1]); if (r == FAIL || called_emsg != called_emsg_start) - return; + break; } if (fc != NULL) diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index a2e414b0f5..f131b82f03 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -3514,6 +3514,14 @@ def Test_reduce() v9.CheckSourceDefAndScriptFailure(['reduce({a: 10}, "1")'], ['E1013: Argument 1: type mismatch, expected list but got dict', 'E1253: String, List, Tuple or Blob required for argument 1']) assert_equal(6, [1, 2, 3]->reduce((r, c) => r + c, 0)) assert_equal(11, 0z0506->reduce((r, c) => r + c, 0)) + + # A closure that fails part way through a String must not leave the + # funccall_T behind on the current_funccal chain. + var lines =<< trim END + vim9script + echo reduce('abc', (acc, c) => [][0]) + END + v9.CheckScriptFailure(lines, 'E684:') enddef def Test_reltime() diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index ad25a0a621..0ac475120c 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -6196,6 +6196,25 @@ def Test_builtin_fullcommand() assert_equal('', fullcommand('finall', true)) enddef +" This used to cause a stack-use-after-return under ASAN +" Set custom ASAN_OPTIONS, to force an abort +def Test_string_reduce_error_funccal() + CheckAsan + + var save = $ASAN_OPTIONS + defer setenv('ASAN_OPTIONS', save) + $ASAN_OPTIONS = 'detect_stack_use_after_return=1:abort_on_error=1:' .. save + + var lines =<< trim END + vim9script + silent! echo reduce("abc", (acc, c) => [][0]) + qall! + END + writefile(lines, 'Xreducefc.vim', 'D') + g:RunVim([], [], '-u NONE -S Xreducefc.vim') + assert_equal(0, v:shell_error) +enddef + " Keep this last, it messes up highlighting. def Test_substitute_cmd() new diff --git a/src/testdir/util/check.vim b/src/testdir/util/check.vim index 7400563f5c..2cb2fc8725 100644 --- a/src/testdir/util/check.vim +++ b/src/testdir/util/check.vim @@ -309,6 +309,14 @@ func CheckNotAsan() endif endfunc +" Command to check for running under ASAN +command CheckAsan call CheckAsan() +func CheckAsan() + if execute('version') !~# '-fsanitize=[a-z,]*\' + throw 'Skipped: requires an ASAN build' + endif +endfunc + " Command to check for not running under valgrind command CheckNotValgrind call CheckNotValgrind() func CheckNotValgrind() diff --git a/src/version.c b/src/version.c index b9240bcd6f..b7f78e3306 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1058, /**/ 1057, /**/ From b831d4b762db5265a4f02353329a54a0b359cdf3 Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Wed, 9 Sep 2026 20:10:20 +0000 Subject: [PATCH 516/647] patch 9.2.1059: keys(), values() and items() are slower than necessary Problem: Turning a Dictionary into a List with keys(), values() or items() allocates each list item separately, although the number of items is known in advance. Solution: Allocate the list and all its items in a single block with list_alloc_with_items() (Julien Voisin). dict2list() knew the item count up front (the hashtab's ht_used) but still called listitem_alloc() plus list_append() once per element. Pre-allocate the whole list in one go, as list_copy() and get_buffer_lines() already do. Measured with "perf stat -e instructions", an isolated keys()+values()+items() loop over a 2000-entry dict is 33% faster, and a keys()-only loop scales from 27% faster on a 50-entry dict to 43% on a 500-entry one. Running matchfuzzy() over keys() of a 2000-path dict improves ~6%. closes: #21230 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/dict.c | 43 ++++++++++++++++++++++++++++++------------- src/version.c | 2 ++ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/dict.c b/src/dict.c index 4558272acb..00584423ff 100644 --- a/src/dict.c +++ b/src/dict.c @@ -1567,6 +1567,7 @@ typedef enum { static void dict2list(typval_T *argvars, typval_T *rettv, dict2list_T what) { + list_T *l; list_T *l2; dictitem_T *di; hashitem_T *hi; @@ -1574,18 +1575,31 @@ dict2list(typval_T *argvars, typval_T *rettv, dict2list_T what) dict_T *d; int todo; - if (rettv_list_alloc(rettv) == FAIL) - return; - if (check_for_dict_arg(argvars, 0) == FAIL) + { + // invalid argument, return an empty list + (void)rettv_list_alloc(rettv); return; + } + // NULL dict behaves like an empty dict d = argvars[0].vval.v_dict; - if (d == NULL) - // NULL dict behaves like an empty dict + todo = d == NULL ? 0 : (int)d->dv_hashtab.ht_used; + + // The number of items is known, allocate the list and all its items in + // one go for efficiency. + l = list_alloc_with_items(todo); + if (l == NULL) + { + (void)rettv_list_alloc(rettv); + return; + } + rettv_list_set(rettv, l); + if (todo == 0) + // NULL or empty dict, return the empty list return; - todo = (int)d->dv_hashtab.ht_used; + li = l->lv_first; FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo) { if (!HASHITEM_EMPTY(hi)) @@ -1593,11 +1607,6 @@ dict2list(typval_T *argvars, typval_T *rettv, dict2list_T what) --todo; di = HI2DI(hi); - li = listitem_alloc(); - if (li == NULL) - break; - list_append(rettv->vval.v_list, li); - if (what == DICT2LIST_KEYS) { // keys() @@ -1618,15 +1627,23 @@ dict2list(typval_T *argvars, typval_T *rettv, dict2list_T what) li->li_tv.v_lock = 0; li->li_tv.vval.v_list = l2; if (l2 == NULL) - break; + goto alloc_failed; ++l2->lv_refcount; if (list_append_string(l2, di->di_key, -1) == FAIL || list_append_tv(l2, &di->di_tv) == FAIL) - break; + goto alloc_failed; } + li = li->li_next; } } + return; + +alloc_failed: + // On a memory allocation failure some of the pre-allocated items may be + // left unset; free the whole list and return an empty one instead. + list_unref(l); + (void)rettv_list_alloc(rettv); } /* diff --git a/src/version.c b/src/version.c index b7f78e3306..5a0301b24c 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1059, /**/ 1058, /**/ From a464b8c7b1dc2e27206f18a5b1e862ba18f1d4d0 Mon Sep 17 00:00:00 2001 From: thialfi17 Date: Wed, 9 Sep 2026 20:17:13 +0000 Subject: [PATCH 517/647] patch 9.2.1060: always equalize windows when 'equalalways' is set Problem: Windows are not always rebalanced when opening a new window with 'equalalways' set due to incorrect logic which fails to detect when a resize is necessary. Solution: Always rebalance window sizes when opening a new window with 'equalalways' set (thialfi17). The detection logic tries to detect when a resize is necessary by comparing the size of the children of the parent frame of the split window. This fails in certain layouts because the check doesn't recurse into frame trees so cannot get the size of a layout frame. fixes: #3416 fixes: #13076 closes: #21228 Signed-off-by: thialfi17 Signed-off-by: Christian Brabandt --- src/testdir/test_window_cmd.vim | 17 +++++++++++++ src/version.c | 2 ++ src/window.c | 44 ++++++--------------------------- 3 files changed, 27 insertions(+), 36 deletions(-) diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index dc670fa7c1..04115f57b5 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -609,6 +609,23 @@ func Test_equalalways_on_close() set equalalways& endfunc +func Test_equalalways_on_open() + set equalalways + vsplit + split + wincmd l + windo vsplit + + let basewidth = winwidth(1) + + for win in range(2, winnr("$")) + call assert_true(abs(winwidth(win) - basewidth) <= 1) + endfor + + only + set equalalways& +endfunc + func Test_win_screenpos() CheckFeature quickfix diff --git a/src/version.c b/src/version.c index 5a0301b24c..fb09dba12d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1060, /**/ 1059, /**/ diff --git a/src/window.c b/src/window.c index 852a220354..e1c108ff1a 100644 --- a/src/window.c +++ b/src/window.c @@ -1134,25 +1134,11 @@ win_split_ins( if (oldwin->w_p_wfw) win_setwidth_win(oldwin->w_width + new_size + 1, oldwin); - // Only make all windows the same width if one of them (except oldwin) - // is wider than one of the split windows. + // Make all windows the same width if 'equalalways' is set, 'ead' + // not set to 'v', a size was not provided and there is a parent frame. if (!do_equal && p_ea && size == 0 && *p_ead != 'v' - && oldwin->w_frame->fr_parent != NULL) - { - frp = oldwin->w_frame->fr_parent->fr_child; - while (frp != NULL) - { - if (frp->fr_win != oldwin && frp->fr_win != NULL - && (frp->fr_win->w_width > new_size - || frp->fr_win->w_width > oldwin->w_width - - new_size - 1)) - { - do_equal = TRUE; - break; - } - frp = frp->fr_next; - } - } + && oldwin->w_frame->fr_parent != NULL) + do_equal = TRUE; } else { @@ -1236,25 +1222,11 @@ win_split_ins( oldwin_height = oldwin->w_height; } - // Only make all windows the same height if one of them (except oldwin) - // is higher than one of the split windows. + // Make all windows the same height if 'equalalways' is set, 'ead' is + // not set to 'h', a size was not provided and there is a parent frame. if (!do_equal && p_ea && size == 0 && *p_ead != 'h' - && oldwin->w_frame->fr_parent != NULL) - { - frp = oldwin->w_frame->fr_parent->fr_child; - while (frp != NULL) - { - if (frp->fr_win != oldwin && frp->fr_win != NULL - && (frp->fr_win->w_height > new_size - || frp->fr_win->w_height > oldwin_height - new_size - - statusline_height(oldwin))) - { - do_equal = TRUE; - break; - } - frp = frp->fr_next; - } - } + && oldwin->w_frame->fr_parent != NULL) + do_equal = TRUE; } /* From 7c1380a0d4f48cedc1eab23acdfee7b4d4e1b099 Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Wed, 9 Sep 2026 20:24:49 +0000 Subject: [PATCH 518/647] patch 9.2.1061: computing the displayed width of a line is slower than necessary Problem: Computing the displayed width of a line calls win_lbr_chartabsize() for every character, even when the simpler win_nolbr_chartabsize() would return the same result. Solution: In win_linetabsize_cts() determine once whether the line needs the full calculation and otherwise call win_nolbr_chartabsize() directly (Julien Voisin). win_linetabsize_cts() computes the displayed width of a line, which happens very often, for example in plines() while scrolling and positioning the cursor. For every character it called win_lbr_chartabsize(). In the common case where 'wrap' is set and none of 'linebreak', 'breakindent', 'showbreak' or text properties that insert text are active, that function does nothing more than return win_nolbr_chartabsize(). Testing these conditions once per line instead of once per character and then calling win_nolbr_chartabsize() directly avoids the extra work with no change in the computed width. Benchmarked with retired instructions, running a scripted navigation session (page up/down, jump to top/bottom, line stepping and searches) over real files: file (settings) before after change log file, ~250-col lines, 'wrap' 4.857e9 4.026e9 -17.1% C source, syntax on, 'wrap' 9.765e9 9.596e9 -1.7% help file, syntax on, 'wrap' 21.509e9 21.191e9 -1.5% C source, syntax on, 'nowrap' 9.254e9 9.255e9 none The gain is largest for wrapped long lines with little or no syntax highlighting, smaller when syntax highlighting dominates, and none with 'nowrap' since the fast path applies only when 'wrap' is set. closes: #21210 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/charset.c | 43 ++++++++++++++++++++++++++++++++++--------- src/version.c | 2 ++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/charset.c b/src/charset.c index 70db94fe49..4d1e1b0b30 100644 --- a/src/charset.c +++ b/src/charset.c @@ -909,17 +909,49 @@ linetabsize_no_outer(win_T *wp, linenr_T lnum) #endif } +/* + * Return TRUE when win_lbr_chartabsize() does nothing more than + * win_nolbr_chartabsize(): no 'linebreak', 'breakindent', 'showbreak' and no + * text properties that insert text. + */ +#if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) + static int +win_lbr_is_simple_width(chartabsize_T *cts) +{ + return TRUE +# ifdef FEAT_LINEBREAK + && !cts->cts_win->w_p_lbr && !cts->cts_win->w_p_bri + && *get_showbreak_value(cts->cts_win) == NUL +# endif +# ifdef FEAT_PROP_POPUP + && !cts->cts_has_prop_with_text +# endif + ; +} +#endif + void win_linetabsize_cts(chartabsize_T *cts, colnr_T len) { vimlong_T vcol = cts->cts_vcol; +#if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) + // Fast path: when win_lbr_chartabsize() would just return + // win_nolbr_chartabsize() (wrap on; no 'linebreak'/'breakindent'/ + // 'showbreak'/inserted text properties), call it directly. + int simple_width = cts->cts_win->w_p_wrap && win_lbr_is_simple_width(cts); +#endif #ifdef FEAT_PROP_POPUP cts->cts_with_trailing = len == MAXCOL; #endif for ( ; *cts->cts_ptr != NUL && (len == MAXCOL || cts->cts_ptr < cts->cts_line + len); MB_PTR_ADV(cts->cts_ptr)) { - vcol += win_lbr_chartabsize(cts, NULL, NULL); +#if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) + if (simple_width) + vcol += win_nolbr_chartabsize(cts, NULL); + else +#endif + vcol += win_lbr_chartabsize(cts, NULL, NULL); if (vcol > MAXCOL) { cts->cts_vcol = MAXCOL; @@ -1284,14 +1316,7 @@ win_lbr_chartabsize( * No 'linebreak', 'showbreak', 'breakindent' and text properties that * insert text: return quickly. */ - if (1 -# ifdef FEAT_LINEBREAK - && !wp->w_p_lbr && !wp->w_p_bri && *get_showbreak_value(wp) == NUL -# endif -# ifdef FEAT_PROP_POPUP - && !cts->cts_has_prop_with_text -# endif - ) + if (win_lbr_is_simple_width(cts)) #endif { if (wp->w_p_wrap) diff --git a/src/version.c b/src/version.c index fb09dba12d..bff5006307 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1061, /**/ 1060, /**/ From 9a2fc5b9215498a00d46e0c95d64f33823b6fd2b Mon Sep 17 00:00:00 2001 From: Antonio Giovanni Colombo Date: Wed, 9 Sep 2026 21:49:21 +0000 Subject: [PATCH 519/647] translation(it): Update Italian manpage Signed-off-by: Antonio Giovanni Colombo Signed-off-by: Christian Brabandt --- runtime/doc/vim-it.1 | 17 +++++++++++++---- runtime/doc/vim-it.UTF-8.1 | 17 +++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/runtime/doc/vim-it.1 b/runtime/doc/vim-it.1 index b9db187f98..4fc0aefbbb 100644 --- a/runtime/doc/vim-it.1 +++ b/runtime/doc/vim-it.1 @@ -1,4 +1,4 @@ -.TH VIM 1 "05 giugno 2026" +.TH VIM 1 "08 settembre 2026" .SH NOME vim \- VI Migliorato, un editor di testi per programmatori .SH SINTASSI @@ -535,9 +535,9 @@ relativo per arrivare al socket. .TP \-\-clientserver {metodo} Usare {metodo} come interfaccia per la funzionalità client/server. Può valere -"socket" o "x11" o "mswin". Disponibile solo se Vim è stato compilato sia con -la funzionalità socketserver che con quella X11, o se, in ambiente MS-Windows, -è stato compilato con la funzionalità socketserver. +"socket" o "x11" o "mswin". Disponibile solo se compilato sia con +la funzionalità socketserver che con quella X11 o, in ambiente MS-Windows, +con la funzionalità socketserver. Si può anche impostare la variabile d'ambiente $VIM_CLIENTSERVER, che sarà interpretata allo stesso modo, ma specificare l'argomento --clientserver prevarrà sempre su di essa. @@ -549,6 +549,15 @@ finestra. \-\-startuptime {nome_file} Durante la fase iniziale, scrivere messaggi di log al file {nome_file}. .TP +\-\-stdio\-channel +Considerare i file stdin e stdout di +.B Vim +come un canale, e non come un terminale. Implica l'opzione "\-es": non +viene visualizzato niente, non venogno letti eventuali comandi Ex e non +viene fatta partire la GUI. Uno script apre il canale usando ch_open() +con indirizzo "stdio". Vedere ":help \-\-stdio\-channel". +Disponibile solo se compilato con la funzionalità channel. +.TP \-\-ttyfail Quando stdin o stdout non sono un terminale (tty) uscire subito da Vim. .TP diff --git a/runtime/doc/vim-it.UTF-8.1 b/runtime/doc/vim-it.UTF-8.1 index 140223ef9b..3d0342e88d 100644 --- a/runtime/doc/vim-it.UTF-8.1 +++ b/runtime/doc/vim-it.UTF-8.1 @@ -1,4 +1,4 @@ -.TH VIM 1 "05 giugno 2026" +.TH VIM 1 "08 settembre 2026" .SH NOME vim \- VI Migliorato, un editor di testi per programmatori .SH SINTASSI @@ -535,9 +535,9 @@ relativo per arrivare al socket. .TP \-\-clientserver {metodo} Usare {metodo} come interfaccia per la funzionalità client/server. Può valere -"socket" o "x11" o "mswin". Disponibile solo se Vim è stato compilato sia con -la funzionalità socketserver che con quella X11, o se, in ambiente MS-Windows, -è stato compilato con la funzionalità socketserver. +"socket" o "x11" o "mswin". Disponibile solo se compilato sia con +la funzionalità socketserver che con quella X11 o, in ambiente MS-Windows, +con la funzionalità socketserver. Si può anche impostare la variabile d'ambiente $VIM_CLIENTSERVER, che sarà interpretata allo stesso modo, ma specificare l'argomento --clientserver prevarrà sempre su di essa. @@ -549,6 +549,15 @@ finestra. \-\-startuptime {nome_file} Durante la fase iniziale, scrivere messaggi di log al file {nome_file}. .TP +\-\-stdio\-channel +Considerare i file stdin e stdout di +.B Vim +come un canale, e non come un terminale. Implica l'opzione "\-es": non +viene visualizzato niente, non venogno letti eventuali comandi Ex e non +viene fatta partire la GUI. Uno script apre il canale usando ch_open() +con indirizzo "stdio". Vedere ":help \-\-stdio\-channel". +Disponibile solo se compilato con la funzionalità channel. +.TP \-\-ttyfail Quando stdin o stdout non sono un terminale (tty) uscire subito da Vim. .TP From 37aecfeb0d71932c332a29dc2a8992ec79f64088 Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Wed, 9 Sep 2026 21:51:07 +0000 Subject: [PATCH 520/647] patch 9.2.1062: getbufline() is slower than necessary Problem: get_buffer_lines() (getline()/getbufline()) allocates every returned line's List item individually, even though the number of lines is known in advance. Solution: Allocate the List and all of its items in a single block with list_alloc_with_items(), then fill each item in place (Julien Voisin). This uses the same bulk-allocation idiom already present elsewhere in the codebase: list_concat() (list.c), tuple_copy()/tuple_slice() (tuple.c), and several list-construction sites in vim9execute.c. Measured with "perf stat -e instructions" results byte-identical: - getline(1, '$') on a 5000-line buffer, repeated: -36.7% - getbufline() reading a 8000-line background buffer: -37.1% - getline(i, i + 39) 40-line windows over 20000 lines: -21.4% The gain scales with the number of lines per call; whole-buffer reads (the common case for linters and formatters) save the most. closes: #21223 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/evalbuffer.c | 47 +++++++++++++++++++++++++++++------------------ src/version.c | 2 ++ 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/evalbuffer.c b/src/evalbuffer.c index 29d0f92f8a..792d51ba81 100644 --- a/src/evalbuffer.c +++ b/src/evalbuffer.c @@ -785,19 +785,18 @@ get_buffer_lines( int retlist, typval_T *rettv) { - if (retlist) - { - if (rettv_list_alloc(rettv) == FAIL) - return; - } - else + if (!retlist) { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; } if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0) + { + if (retlist) + rettv_list_alloc(rettv); return; + } if (!retlist) { @@ -810,22 +809,34 @@ get_buffer_lines( } else { - if (end < start) - return; + list_T *l; + listitem_T *li; - if (start < 1) - start = 1; - if (end > buf->b_ml.ml_line_count) - end = buf->b_ml.ml_line_count; - while (start <= end) + start = MAX(start, 1); + end = MIN(end, buf->b_ml.ml_line_count); + if (end < start) + goto nolist; + + // The number of lines is known, so allocate the list and its items + // in one allocation. + l = list_alloc_with_items((int)(end - start + 1)); + if (l == NULL) + goto nolist; + rettv_list_set(rettv, l); + + // The items are already linked and zeroed, so only the string needs + // to be filled in. + for (li = l->lv_first; start <= end; ++start, li = li->li_next) { - if (list_append_string(rettv->vval.v_list, - ml_get_buf(buf, start, FALSE), - (int)ml_get_buf_len(buf, start)) == FAIL) - break; - ++start; + li->li_tv.v_type = VAR_STRING; + li->li_tv.vval.v_string = vim_strnsave(ml_get_buf(buf, start, FALSE), + ml_get_buf_len(buf, start)); } } + return; + +nolist: + rettv_list_alloc(rettv); } /* diff --git a/src/version.c b/src/version.c index bff5006307..f36d15e8b9 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1062, /**/ 1061, /**/ From cbcb209221a2e19f674c7b2ed789132606761b7c Mon Sep 17 00:00:00 2001 From: 231tr0n Date: Wed, 9 Sep 2026 22:00:27 +0000 Subject: [PATCH 521/647] runtime(python): missing Python syntax keywords Problem: Missing newer Python keywords and builtins in syntax highlighting. Solution: Add aiter, anext, BaseExceptionGroup, ExceptionGroup, PythonFinalizationError, and EncodingWarning to the Python syntax file (231tr0n). closes: #21254 Signed-off-by: 231tr0n Signed-off-by: Christian Brabandt --- runtime/syntax/python.vim | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/runtime/syntax/python.vim b/runtime/syntax/python.vim index 55c629d56a..fa1e9700e6 100644 --- a/runtime/syntax/python.vim +++ b/runtime/syntax/python.vim @@ -8,6 +8,7 @@ " 2026 Mar 11 by Vim Project: fix number performance #19630 " 2026 May 27 by Vim Project: highlight `lazy` soft keyword (PEP 810) #20342 " 2026 Aug 30 by Vim Project: improve number and ellipsis performance +" 2026 Sep 10 by Vim Project: add new builtins #21254 " Credits: Neil Schemenauer " Dmitry Vasiliev " Rob B @@ -314,7 +315,7 @@ if !exists("python_no_builtin_highlight") " constants added by the `site` module syn keyword pythonBuiltin quit exit copyright credits license " built-in functions - syn keyword pythonBuiltin abs all any ascii bin bool breakpoint bytearray + syn keyword pythonBuiltin abs aiter all anext any ascii bin bool breakpoint bytearray syn keyword pythonBuiltin bytes callable chr classmethod compile complex syn keyword pythonBuiltin delattr dict dir divmod enumerate eval exec syn keyword pythonBuiltin filter float format frozenset getattr globals @@ -339,7 +340,7 @@ endif " http://docs.python.org/library/exceptions.html if !exists("python_no_exception_highlight") " builtin base exceptions (used mostly as base classes for other exceptions) - syn keyword pythonExceptions BaseException Exception + syn keyword pythonExceptions BaseException Exception BaseExceptionGroup ExceptionGroup syn keyword pythonExceptions ArithmeticError BufferError LookupError " builtin exceptions (actually raised) syn keyword pythonExceptions AssertionError AttributeError EOFError @@ -348,7 +349,7 @@ if !exists("python_no_exception_highlight") syn keyword pythonExceptions KeyboardInterrupt MemoryError syn keyword pythonExceptions ModuleNotFoundError NameError syn keyword pythonExceptions NotImplementedError OSError OverflowError - syn keyword pythonExceptions RecursionError ReferenceError RuntimeError + syn keyword pythonExceptions PythonFinalizationError RecursionError ReferenceError RuntimeError syn keyword pythonExceptions StopAsyncIteration StopIteration SyntaxError syn keyword pythonExceptions SystemError SystemExit TabError TypeError syn keyword pythonExceptions UnboundLocalError UnicodeDecodeError @@ -366,7 +367,7 @@ if !exists("python_no_exception_highlight") syn keyword pythonExceptions IsADirectoryError NotADirectoryError syn keyword pythonExceptions PermissionError ProcessLookupError TimeoutError " builtin warnings - syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning + syn keyword pythonExceptions BytesWarning DeprecationWarning EncodingWarning FutureWarning syn keyword pythonExceptions ImportWarning PendingDeprecationWarning syn keyword pythonExceptions ResourceWarning RuntimeWarning syn keyword pythonExceptions SyntaxWarning UnicodeWarning From 71a0e7ca13b3c5a4c260bb43bbe602c26049f160 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Wed, 9 Sep 2026 22:08:32 +0000 Subject: [PATCH 522/647] runtime(netrw): netrw#fs#Glob() cannot list a remote directory Problem: netrw#fs#Glob() calls s:NetrwRemoteListing() and uses s:THINLIST, which are script-local to autoload/netrw.vim and not visible in autoload/netrw/fs.vim. Listing a remote directory in the tree view fails with E117 and E121. Solution: Use netrw#Call() and netrw#Expose(), which exist to reach the script-local functions and variables of netrw.vim. closes: #21259 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Christian Brabandt --- runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim b/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim index 8c002a88c5..dad29f4f30 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim @@ -115,8 +115,8 @@ function! netrw#fs#Glob(direntry, expr, pare) keepalt 1sp keepalt enew let keep_liststyle = w:netrw_liststyle - let w:netrw_liststyle = s:THINLIST - if s:NetrwRemoteListing() == 0 + let w:netrw_liststyle = netrw#Expose('THINLIST') + if netrw#Call('NetrwRemoteListing') == 0 keepj keepalt %s@/@@ let filelist = getline(1,$) q! From 201606d7eb6f2f3d91860417e24e33407303e8d9 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 10 Sep 2026 18:52:28 +0000 Subject: [PATCH 523/647] patch 9.2.1063: Coverity: possible NULL deref after list_find() Problem: Coverity: possible NULL deref after list_find() in f_rand(), execute_for() and execute_storeindex() Solution: Check the return value of list_find() before dereferencing it, reformat a few if statements related: #21258 Signed-off-by: Christian Brabandt --- src/evalfunc.c | 11 +++++++---- src/version.c | 2 ++ src/vim9execute.c | 6 ++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index c0c9a38eeb..aa537e10dd 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -10256,10 +10256,13 @@ f_rand(typval_T *argvars, typval_T *rettv) ly = list_find(l, 1L); lz = list_find(l, 2L); lw = list_find(l, 3L); - if (lx->li_tv.v_type != VAR_NUMBER) goto theend; - if (ly->li_tv.v_type != VAR_NUMBER) goto theend; - if (lz->li_tv.v_type != VAR_NUMBER) goto theend; - if (lw->li_tv.v_type != VAR_NUMBER) goto theend; + if (lx == NULL || ly == NULL || lz == NULL || lw == NULL) + goto theend; + if (lx->li_tv.v_type != VAR_NUMBER + || ly->li_tv.v_type != VAR_NUMBER + || lz->li_tv.v_type != VAR_NUMBER + || lw->li_tv.v_type != VAR_NUMBER) + goto theend; x = (UINT32_T)lx->li_tv.vval.v_number; y = (UINT32_T)ly->li_tv.vval.v_number; z = (UINT32_T)lz->li_tv.vval.v_number; diff --git a/src/version.c b/src/version.c index f36d15e8b9..01b873f7c0 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1063, /**/ 1062, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index ddb6a5240f..f2f324cb9b 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2495,7 +2495,8 @@ execute_storeindex(isn_T *iptr, ectx_T *ectx) if (lidx < list->lv_len) { listitem_T *li = list_find(list, lidx); - + if (li == NULL) + return FAIL; if (error_if_locked(li->li_tv.v_lock, e_cannot_change_locked_list_item)) return FAIL; @@ -2945,7 +2946,8 @@ execute_for(isn_T *iptr, ectx_T *ectx) { listitem_T *li = list_find(list, idxtv->vval.v_number); - + if (li == NULL) + return FAIL; copy_tv(&li->li_tv, STACK_TV_BOT(0)); ++ectx->ec_stack.ga_len; } From e49b4b5c98ddc6549890da165e130c1050df2c2b Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 10 Sep 2026 18:53:12 +0000 Subject: [PATCH 524/647] patch 9.2.1064: Coverity: possible integer underflow in barline_parse() Problem: Coverity: possible integer underflow in barline_parse() Solution: Stop stripping NL/CR at index 2 instead of 0, so that the following subtraction can no longer underflow. The line needs to start with "|<", so strlen() must at least return 2, and we cannot decrement below 2 anyhow. closes: #21258 Signed-off-by: Christian Brabandt --- src/version.c | 2 ++ src/viminfo.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/version.c b/src/version.c index 01b873f7c0..873d927bd4 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1064, /**/ 1063, /**/ diff --git a/src/viminfo.c b/src/viminfo.c index f8292dee50..31baf9e3d1 100644 --- a/src/viminfo.c +++ b/src/viminfo.c @@ -1073,7 +1073,7 @@ barline_parse(vir_T *virp, char_u *text, garray_T *values) } // Get length of text, excluding |< and NL chars. n = STRLEN(virp->vir_line); - while (n > 0 && (virp->vir_line[n - 1] == NL + while (n > 2 && (virp->vir_line[n - 1] == NL || virp->vir_line[n - 1] == CAR)) --n; n -= 2; From 36d01cff54addfe5352221bd39bff1d91af88623 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Thu, 10 Sep 2026 18:57:49 +0000 Subject: [PATCH 525/647] runtime(typst): do not highlight code blocks and raw text Similar to markdown syntax, by default do not highlight raw and code blocks. Syntax highlighting groups are still in place so it is possible for users to add their own if needed. - typstMarkupRawInline - typstMarkupRawBlock closes: #21260 Signed-off-by: Maxim Kim Signed-off-by: Christian Brabandt --- runtime/syntax/typst.vim | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/runtime/syntax/typst.vim b/runtime/syntax/typst.vim index 220544c059..af202eb0c9 100644 --- a/runtime/syntax/typst.vim +++ b/runtime/syntax/typst.vim @@ -1,7 +1,7 @@ " Vim syntax file " Maintainer: Maxim Kim " Language: Typst -" Last Change: 2026 Jun 30 +" Last Change: 2026 Sep 10 " Based on the syntax file from https://github.com/kaarmu/typst.vim if exists('b:current_syntax') @@ -175,8 +175,8 @@ for s:name in get(g:, 'typst_embedded_languages', []) let s:rule = ['syn region' \ ,"typstMarkupRawBlock_"..s:name \ ,'matchgroup=typstMarkupRawDelimiter' - \ ,'start=/```'..s:name..'\>/ end=/```/' - \ ,'contains=@typstEmbedded_'..s:name + \ ,'start=/```'..s:name..'\>/ end=/```/' + \ ,'contains=@typstEmbedded_'..s:name \ ,'keepend' \ ,'concealends'] @@ -303,9 +303,7 @@ hi def link typstExprNumberType Constant hi def link typstExprString String hi def link typstExprLabel Structure -hi def link typstMarkupRawInline PreProc hi def link typstMarkupRawDelimiter Special -hi def link typstMarkupRawBlock PreProc hi def link typstMarkupDollar Special hi def link typstMarkupLabel PreProc hi def link typstMarkupReference Special From 607472e053a0972aaa83b1e4da13052ee0674368 Mon Sep 17 00:00:00 2001 From: Zdenek Dohnal Date: Thu, 10 Sep 2026 19:04:58 +0000 Subject: [PATCH 526/647] patch 9.2.1065: possible heap-use-after-free in ml_setname() Problem: possible heap-use-after-free in ml_setname() Solution: After findswapname() returns, verify that buf->b_ml.ml_mfp is still the same as the copy mfp we hold (Zdenek Dohnal). If findswapname() creates a different swap filename which does not match with the old one, it looks possible to free the mfp in buf. The commit adds additional protection. related: #21171 closes: #21261 Signed-off-by: Zdenek Dohnal Signed-off-by: Christian Brabandt --- src/memline.c | 7 +++++++ src/version.c | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/memline.c b/src/memline.c index c5ef583e64..8e68d3361a 100644 --- a/src/memline.c +++ b/src/memline.c @@ -684,6 +684,13 @@ ml_setname(buf_T *buf) if (*dirp == NUL) // tried all directories, fail break; fname = findswapname(buf, &dirp, mfp->mf_fname); + // autocmd may have freed mfp if findswapname creates + // different swapfile name + if (buf->b_ml.ml_mfp != mfp) + { + vim_free(fname); + return; + } // alloc's fname if (dirp == NULL) // out of memory break; diff --git a/src/version.c b/src/version.c index 873d927bd4..eba87fecfa 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1065, /**/ 1064, /**/ From 3749cfb81442ebcbf85aaea9465cfea1e3a49eec Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 10 Sep 2026 19:11:43 +0000 Subject: [PATCH 527/647] patch 9.2.1066: tests: GUI shell resize can land in the middle of a test Problem: In a GUI build the shell may be resized only after a redraw, so a test that measures windows can see the resize land halfway, Test_window_width for one. Solution: Redraw after setting the size for a test, so that the resize is done before the test starts (Hirohito Higashi). closes: #21263 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/testdir/runtest.vim | 3 +++ src/version.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim index 7822da9150..b7ec480b18 100644 --- a/src/testdir/runtest.vim +++ b/src/testdir/runtest.vim @@ -63,6 +63,9 @@ if has('gui_running') func s:SetDefaultOptionsForGUIBuilds() set columns=80 lines=25 + " The GUI may postpone resizing the shell until after a redraw; a test + " that measures windows must not see the resize land halfway. + redraw endfunc else func s:SetDefaultOptionsForGUIBuilds() diff --git a/src/version.c b/src/version.c index eba87fecfa..5d9da1ab7a 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1066, /**/ 1065, /**/ From cff83f361de471456d98b070ec3e63b0e5e6f17c Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Thu, 10 Sep 2026 19:22:37 +0000 Subject: [PATCH 528/647] patch 9.2.1067: Completion shows an included file by full path Problem: A match found in an included file is shown with the full path of the file, while a match from a buffer is shown with the name under the current directory. A file included as "./file" even has the "./" left in: "dir/./file". Solution: Show the file by its name under the current directory, and simplify the name of a file found relative to the current one (Hirohito Higashi). closes: #21264 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/findfile.c | 8 +++----- src/search.c | 3 ++- src/testdir/test_ins_complete.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/findfile.c b/src/findfile.c index 25ffd115d2..f42980b25e 100644 --- a/src/findfile.c +++ b/src/findfile.c @@ -1861,7 +1861,6 @@ find_file_in_path_option( if (first == TRUE) { int l; - int NameBufflen; int run; size_t rel_fnamelen = 0; char_u *suffix; @@ -1902,7 +1901,6 @@ find_file_in_path_option( // When the file doesn't exist, try adding parts of // 'suffixesadd'. - NameBufflen = l; suffix = suffixes; for (;;) { @@ -1911,13 +1909,13 @@ find_file_in_path_option( || ((find_what == FINDFILE_DIR) == mch_isdir(NameBuff)))) { - file_name = vim_strnsave(NameBuff, NameBufflen); + file_name = vim_strnsave(NameBuff, + simplify_filename(NameBuff)); goto theend; } if (*suffix == NUL) break; - NameBufflen = l + copy_option_part(&suffix, NameBuff + l, - MAXPATHL - l, ","); + copy_option_part(&suffix, NameBuff + l, MAXPATHL - l, ","); } } } diff --git a/src/search.c b/src/search.c index 4f3a5dd9ef..cc938c9a6d 100644 --- a/src/search.c +++ b/src/search.c @@ -3890,7 +3890,8 @@ find_pattern_in_path( } add_r = ins_compl_add_infercase(aux, i, p_ic, - curr_fname == curbuf->b_fname ? NULL : curr_fname, + curr_fname == curbuf->b_fname ? NULL + : shorten_fname1(curr_fname), dir, cont_s_ipos, 0); if (add_r == OK) // if dir was BACKWARD then honor it just once diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index c73974e621..2ae9b109fb 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -3440,6 +3440,26 @@ func s:Tagfunc(t,f,o) return [] endfunc +" A match from an included file shows the file by its name under the current +" directory, without the "./" of the include line. +func Test_complete_included_file_name() + CheckRunVimInTerminal + call mkdir('Xincl/sub', 'pR') + call writefile(['let included_word = 1'], 'Xincl/sub/inc.vim') + call writefile(['source ./sub/inc.vim', ''], 'Xincl/main.vim') + let lines =<< trim END + setlocal include=^\\s*source\\s\\+ complete=i completeopt=menuone,noselect + END + call writefile(lines, 'Xincl/setup.vim') + let buf = RunVimInTerminal('-S Xincl/setup.vim Xincl/main.vim', + \ {'rows': 8, 'cols': 120}) + call term_sendkeys(buf, "Goincluded_\") + call WaitForAssert({-> assert_match('included_word\s\+Xincl/sub/inc.vim\s', + \ term_getline(buf, 4))}) + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + " This was using freed memory, since 'complete' was in a wiped out buffer. " Also using a window that was closed. func Test_tagfunc_wipes_out_buffer() diff --git a/src/version.c b/src/version.c index 5d9da1ab7a..3751cd0525 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1067, /**/ 1066, /**/ From 90fdb79096deecf73916e20fd76f775ff6389a7d Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 10 Sep 2026 19:35:06 +0000 Subject: [PATCH 529/647] runtime(doc): Update terminalprops() example related: #21251 Co-Authored-By: Heptite Signed-off-by: Christian Brabandt --- runtime/doc/term.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt index c0e3687931..32478ee3b1 100644 --- a/runtime/doc/term.txt +++ b/runtime/doc/term.txt @@ -1,4 +1,4 @@ -*term.txt* For Vim version 9.2. Last change: 2026 Sep 09 +*term.txt* For Vim version 9.2. Last change: 2026 Sep 10 VIM REFERENCE MANUAL by Bram Moolenaar @@ -694,7 +694,7 @@ The entry of a direct color terminal, such as "xterm-direct", has 16777216 colors. Then 't_Co' is 16777216 and |terminalprops()| reports "rgb" as 'y'. Vim does not set 'termguicolors' by itself. To have it set for such a terminal, put this in the vimrc: > - if terminalprops().rgb == 'y' + if get(terminalprops(), 'rgb', 'n') == 'y' set termguicolors endif < From f55b509c6597667537569c60730b9b3b018aec5b Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Fri, 11 Sep 2026 19:38:16 +0000 Subject: [PATCH 530/647] patch 9.2.1068: regexp: NFA_MAX_BRACES is defined but unused Problem: regexp: NFA_MAX_BRACES is defined but unused Solution: Remove the define (Julien Voisin) closes: #21268 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/regexp.h | 6 ------ src/version.c | 2 ++ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/regexp.h b/src/regexp.h index aa685a54d0..1d97779598 100644 --- a/src/regexp.h +++ b/src/regexp.h @@ -21,12 +21,6 @@ */ #define NSUBEXP 10 -/* - * In the NFA engine: how many braces are allowed. - * TODO(RE): Use dynamic memory allocation instead of static, like here - */ -#define NFA_MAX_BRACES 20 - /* * In the NFA engine: how many states are allowed */ diff --git a/src/version.c b/src/version.c index 3751cd0525..1976bdbfe5 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1068, /**/ 1067, /**/ From 7f83a539d65c48c31d3f0fdf6460ca412a639727 Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Fri, 11 Sep 2026 19:59:57 +0000 Subject: [PATCH 531/647] patch 9.2.1069: duplicated composing character matching in the NFA engine Problem: The composing character matching logic is duplicated between the NFA_COMPOSING case and the NFA_COMPOSING branch inside NFA_START_COLL in nfa_regmatch(). Solution: Factor the two near-identical paths into a match_composing() helper (Julien Voisin). The two blocks differed only in the composing sub-expression's start state (t->state->out versus t->state->out->out) and in how the NFA_END_COMPOSING end state is selected, so those stay at the call sites while the shared matching body moves into match_composing(). A dead loop advancing a local "sta" past NFA_END_COMPOSING in the \Z branch and a stale commented-out condition are dropped in the process. This was found while looking for optimizations opportunities in the regex engine(s). closes: #21269 Signed-off-by: Julien Voisin Signed-off-by: Christian Brabandt --- src/regexp_nfa.c | 197 ++++++++++++++++------------------------------- src/version.c | 2 + 2 files changed, 67 insertions(+), 132 deletions(-) diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index adbde61dc1..dd6d2bb246 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -5743,6 +5743,68 @@ find_match_text(colnr_T *startcol, int regstart, char_u *match_text) return 0L; } +/* + * Check whether the composing characters at the current input position match + * the NFA composing sub-expression that starts at "sta" (the first state + * after NFA_COMPOSING). "curc" is the base character and "clen" its byte + * length. + * Returns OK when it matches, FAIL otherwise. + */ + static int +match_composing(nfa_state_T *sta, int curc, int clen) +{ + int mc = curc; + int len = 0; + int cchars[MAX_MCO]; + int ccount = 0; + int j; + + if (utf_iscomposing(sta->c)) + // Only match composing character(s), ignore base character. Used + // for ".{composing}" and "{composing}" (no preceding character). + len += mb_char2len(mc); + + if (rex.reg_icombine && len == 0) + // If \Z was present, then ignore composing characters. When + // ignoring the base character this always matches. + return sta->c == curc ? OK : FAIL; + + // Check base character matches first, unless ignored. + if (len == 0 && mc != sta->c) + return FAIL; + + if (len == 0) + { + len += mb_char2len(mc); + sta = sta->out; + } + + // We don't care about the order of composing characters. Get them into + // cchars[] first. + while (len < clen) + { + mc = mb_ptr2char(rex.input + len); + cchars[ccount++] = mc; + len += mb_char2len(mc); + if (ccount == MAX_MCO) + break; + } + + // Check that each composing char in the pattern matches a composing char + // in the text. We do not check if all composing chars are matched. + while (sta->c != NFA_END_COMPOSING) + { + for (j = 0; j < ccount; ++j) + if (cchars[j] == sta->c) + break; + if (j == ccount) + return FAIL; + sta = sta->out; + } + + return OK; +} + /* * Main matching routine. * @@ -6400,74 +6462,9 @@ nfa_regmatch( case NFA_COMPOSING: { - int mc = curc; - int len = 0; nfa_state_T *end; - nfa_state_T *sta; - int cchars[MAX_MCO]; - int ccount = 0; - int j; - - sta = t->state->out; - len = 0; - if (utf_iscomposing(sta->c)) - { - // Only match composing character(s), ignore base - // character. Used for ".{composing}" and "{composing}" - // (no preceding character). - len += mb_char2len(mc); - } - if (rex.reg_icombine && len == 0) - { - // If \Z was present, then ignore composing characters. - // When ignoring the base character this always matches. - if (sta->c != curc) - result = FAIL; - else - result = OK; - while (sta->c != NFA_END_COMPOSING) - sta = sta->out; - } - - // Check base character matches first, unless ignored. - else if (len > 0 || mc == sta->c) - { - if (len == 0) - { - len += mb_char2len(mc); - sta = sta->out; - } - // We don't care about the order of composing characters. - // Get them into cchars[] first. - while (len < clen) - { - mc = mb_ptr2char(rex.input + len); - cchars[ccount++] = mc; - len += mb_char2len(mc); - if (ccount == MAX_MCO) - break; - } - - // Check that each composing char in the pattern matches a - // composing char in the text. We do not check if all - // composing chars are matched. - result = OK; - while (sta->c != NFA_END_COMPOSING) - { - for (j = 0; j < ccount; ++j) - if (cchars[j] == sta->c) - break; - if (j == ccount) - { - result = FAIL; - break; - } - sta = sta->out; - } - } - else - result = FAIL; + result = match_composing(t->state->out, curc, clen); end = t->state->out1; // NFA_END_COMPOSING ADD_STATE_IF_MATCH(end); @@ -6512,74 +6509,10 @@ nfa_regmatch( { if (state->c == NFA_COMPOSING) { - int mc = curc; - int len = 0; nfa_state_T *end; - nfa_state_T *sta; - int cchars[MAX_MCO]; - int ccount = 0; - int j; - - sta = t->state->out->out; - len = 0; - if (utf_iscomposing(sta->c)) - { - // Only match composing character(s), ignore base - // character. Used for ".{composing}" and "{composing}" - // (no preceding character). - len += mb_char2len(mc); - } - if (rex.reg_icombine && len == 0) - { - // If \Z was present, then ignore composing characters. - // When ignoring the base character this always matches. - if (sta->c != curc) - result = FAIL; - else - result = OK; - while (sta->c != NFA_END_COMPOSING) - sta = sta->out; - } - // Check base character matches first, unless ignored. - else if (len > 0 || mc == sta->c) -// if (len > 0 || mc == sta->c) - { - if (len == 0) - { - len += mb_char2len(mc); - sta = sta->out; - } - - // We don't care about the order of composing characters. - // Get them into cchars[] first. - while (len < clen) - { - mc = mb_ptr2char(rex.input + len); - cchars[ccount++] = mc; - len += mb_char2len(mc); - if (ccount == MAX_MCO) - break; - } - // Check that each composing char in the pattern matches a - // composing char in the text. We do not check if all - // composing chars are matched. - result = OK; - while (sta->c != NFA_END_COMPOSING) - { - for (j = 0; j < ccount; ++j) - if (cchars[j] == sta->c) - break; - if (j == ccount) - { - result = FAIL; - break; - } - sta = sta->out; - } - } - else - result = FAIL; + result = match_composing(t->state->out->out, curc, + clen); if (t->state->out->out1 != NULL && t->state->out->out1->c == NFA_END_COMPOSING) diff --git a/src/version.c b/src/version.c index 1976bdbfe5..1fde04ade7 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1069, /**/ 1068, /**/ From 35bf24c52e9ffc7c6ff39b54116d1d77621bd837 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 20:23:44 +0000 Subject: [PATCH 532/647] patch 9.2.1070: Other channels are not read while waiting for a response on one Problem: While ch_evalexpr() waits for a response, nothing is read from the other channels: what they receive stays in the pipe, and a message of theirs that was only partly read is dropped as garbage after 100 msec, along with what follows it. Solution: Wait for the response and for the other channels together, reading what arrives on any of them; count the timeout over the whole wait. closes: #21262 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/channel.c | 75 +++++++++++++++++++++++------------- src/testdir/test_channel.vim | 60 +++++++++++++++++++++++++++++ src/version.c | 2 + 3 files changed, 110 insertions(+), 27 deletions(-) diff --git a/src/channel.c b/src/channel.c index 45ed971c3b..cbdc194614 100644 --- a/src/channel.c +++ b/src/channel.c @@ -62,6 +62,7 @@ typedef struct sockaddr_un { #endif static void channel_read(channel_T *channel, ch_part_T part, char *func); +static void channel_wait_any(long msec); static ch_mode_T channel_get_mode(channel_T *channel, ch_part_T part); static int channel_get_timeout(channel_T *channel, ch_part_T part); static channel_T *channel_open_stdio(void); @@ -4641,6 +4642,23 @@ channel_in_blocking_wait(void) return channel_blocking_wait > 0; } +/* + * Wait up to "timeout" msec for something to read on "fd" of "channel", and + * read what arrives on any channel meanwhile. + */ + static void +channel_wait_reading(channel_T *channel UNUSED, sock_T fd UNUSED, int timeout) +{ +#ifdef MSWIN + // A pipe cannot be waited for, channel_wait() polls it; the other + // channels are looked at every 10 msec. + (void)channel_wait(channel, fd, timeout > 10 ? 10 : timeout); + channel_handle_events(FALSE); +#else + channel_wait_any(timeout); +#endif +} + /* * Read one JSON message with ID "id" from "channel"/"part" and store the * result in "rettv". @@ -4663,6 +4681,11 @@ channel_read_json_block( chanpart_T *chanpart = &channel->ch_part[part]; ch_mode_T mode = channel->ch_part[part].ch_mode; int retval = FAIL; +#ifdef ELAPSED_FUNC + elapsed_T start_tv; + + ELAPSED_INIT(start_tv); +#endif ch_log(channel, "Blocking read JSON for id %d", id); ++channel_blocking_wait; @@ -4705,48 +4728,46 @@ channel_read_json_block( if (readahead_ptr != NULL && readahead_ptr != prev_readahead_ptr) continue; - // Wait for up to the timeout. If there was an incomplete message - // use the deadline for that. + // Wait for up to what is left of the timeout. timeout = timeout_arg; +#ifdef ELAPSED_FUNC + timeout -= (int)ELAPSED_FUNC(start_tv); +#endif + fd = chanpart->ch_fd; + if (timeout <= 0 || fd == INVALID_FD) + { + if (fd != INVALID_FD) + ch_log(channel, "Timed out on id %d", id); + break; + } + // If there was an incomplete message use the deadline for that. if (chanpart->ch_wait_len > 0) { + int left; #ifdef MSWIN - timeout = chanpart->ch_deadline - GetTickCount() + 1; + left = chanpart->ch_deadline - GetTickCount() + 1; #else { struct timeval now_tv; gettimeofday(&now_tv, NULL); - timeout = (chanpart->ch_deadline.tv_sec - - now_tv.tv_sec) * 1000 - + (chanpart->ch_deadline.tv_usec - - now_tv.tv_usec) / 1000 - + 1; + left = (chanpart->ch_deadline.tv_sec - now_tv.tv_sec) * 1000 + + (chanpart->ch_deadline.tv_usec - now_tv.tv_usec) + / 1000 + 1; } #endif - if (timeout < 0) - { + if (left < 0) // Something went wrong, channel_parse_json() didn't // discard message. Cancel waiting. chanpart->ch_wait_len = 0; - timeout = timeout_arg; - } - else if (timeout > timeout_arg) - timeout = timeout_arg; + else if (left < timeout) + timeout = left; } - fd = chanpart->ch_fd; - if (fd == INVALID_FD - || channel_wait(channel, fd, timeout) != CW_READY) - { - if (timeout == timeout_arg) - { - if (fd != INVALID_FD) - ch_log(channel, "Timed out on id %d", id); - break; - } - } - else - channel_read(channel, part, "channel_read_json_block"); + channel_wait_reading(channel, fd, timeout); +#ifndef ELAPSED_FUNC + // Without a clock the wait counts as the whole timeout. + timeout_arg = 0; +#endif } } if (id >= 0) diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index fd05259bbe..8ffe28a993 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -2977,6 +2977,66 @@ func Test_stdio_channel() call job_stop(job) endfunc +" A message that is only partly read when Vim gets busy with blocking reads +" on another channel is not dropped: the rest of it was there to be read. +func Test_lsp_incomplete_message_while_blocked() + if has('win32') && has('gui_running') + throw 'Skipped: gvim.exe cannot run without the GUI' + endif + let lines =<< trim END + func OnMessage(ch, msg) + if a:msg.method == 'quick' + call timer_start(10, {-> ch_sendexpr(a:ch, #{id: a:msg.id, result: 1})}) + endif + endfunc + call ch_open('stdio', #{mode: 'lsp', callback: 'OnMessage'}) + END + call writefile(lines, 'Xstdio_child.vim', 'D') + let lines =<< trim END + let notes = 0 + let child = job_start([v:progpath, '--clean', '--stdio-channel', + \ '-S', 'Xstdio_child.vim'], #{in_mode: 'lsp', out_mode: 'lsp'}) + func Block(timer) + for i in range(30) + call ch_evalexpr(g:child, #{method: 'quick'}, #{timeout: 5000}) + endfor + endfunc + func OnMessage(ch, msg) + if a:msg.method == 'note' + let g:notes += 1 + elseif a:msg.method == 'count' + call ch_sendexpr(a:ch, #{id: a:msg.id, result: g:notes}) + elseif a:msg.method == 'block' + call ch_sendexpr(a:ch, #{id: a:msg.id, result: 'ok'}) + call timer_start(10, 'Block') + endif + endfunc + call ch_open('stdio', #{mode: 'lsp', callback: 'OnMessage'}) + END + call writefile(lines, 'Xstdio_busy.vim', 'D') + let job = job_start([GetVimProg(), '--clean', '--stdio-channel', + \ '-S', 'Xstdio_busy.vim'], #{in_mode: 'lsp', out_mode: 'lsp'}) + call assert_equal('run', job_status(job)) + + " The first half of a notification is read before the blocking reads + " start, the second half arrives while they go on. + call ch_evalexpr(job, #{method: 'block'}, #{timeout: 5000}) + let body = json_encode(#{method: 'note', jsonrpc: '2.0', + \ params: #{text: repeat('x', 1000)}}) + let framed = 'Content-Length: ' .. strlen(body) .. "\r\n\r\n" .. body + let half = strlen(framed) / 2 + call ch_sendraw(job, framed[: half - 1]) + sleep 50m + call ch_sendraw(job, framed[half :]) + sleep 500m + let resp = ch_evalexpr(job, #{method: 'count'}, #{timeout: 5000}) + call assert_equal(1, resp->get('result', resp)) + + call ch_close(job) + call WaitForAssert({-> assert_equal('dead', job_status(job))}) + call job_stop(job) +endfunc + func Test_channel_lsp_mode() " The channel lsp mode test is flaky and gives the same error. let g:giveup_same_error = 0 diff --git a/src/version.c b/src/version.c index 1fde04ade7..cc97de0c0f 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1070, /**/ 1069, /**/ From 77fd5fdbabcb49ba85de4e36248130d535c1abb1 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 11 Sep 2026 20:30:33 +0000 Subject: [PATCH 533/647] patch 9.2.1071: Session creates spurious simplified mappings Problem: Session creates spurious simplified mappings. Solution: Don't create simplified mappings explicitly (zeertzjq). fixes: #21267 closes: #21270 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/map.c | 4 +++ src/testdir/test_mksession.vim | 52 ++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 58 insertions(+) diff --git a/src/map.c b/src/map.c index b19f747d0c..d36207abc2 100644 --- a/src/map.c +++ b/src/map.c @@ -1978,6 +1978,10 @@ makemap( for ( ; mp; mp = mp->m_next) { + // simplified map blocks are not created explicitly + if (mp->m_simplified) + continue; + // skip script-local mappings if (mp->m_noremap == REMAP_SCRIPT) continue; diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index 5e7a33a8c9..d6be38aae9 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -1605,6 +1605,58 @@ func Test_mksession_cursor_position() %bwipe endfunc +func Test_mksession_with_Ctrl_I_map() + set sessionoptions=options + + " and g not mapped explicitly + imapclear + inoremap foo + inoremap g bar + imap + imap g g + mksession! Xtest_mks.out + + " Check that the session doesn't create spurious simplified mappings + imapclear + source Xtest_mks.out + call assert_equal('i * foo', execute('imap ')->trim()) + call assert_equal('No mapping found', execute('imap ')->trim()) + call assert_equal('i g * bar', execute('imap g')->trim()) + call assert_equal('No mapping found', execute('imap g')->trim()) + + " Check that the restored mappings are working properly + new + call feedkeys("i\<*C-I>\g\<*C-I>g\\", 'tx') + call assert_equal('foofoobarbar', getline('.')) + bwipe! + + " and g mapped explicitly + imapclear + inoremap foo + inoremap FOO + inoremap g bar + inoremap g BAR + mksession! Xtest_mks.out + + " Check that the session restores mappings properly + imapclear + source Xtest_mks.out + call assert_equal('i * foo', execute('imap ')->trim()) + call assert_equal('i * FOO', execute('imap ')->trim()) + call assert_equal('i g * bar', execute('imap g')->trim()) + call assert_equal('i g * BAR', execute('imap g')->trim()) + + " Check that the restored mappings are working properly + new + call feedkeys("i\<*C-I>\g\<*C-I>g\\", 'tx') + call assert_equal('fooFOObarBAR', getline('.')) + bwipe! + + call delete('Xtest_mks.out') + imapclear + set sessionoptions& +endfunc + " Test sessions global and local mappings func Test_mksession_localmappings() diff --git a/src/version.c b/src/version.c index cc97de0c0f..9ac53cd889 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1071, /**/ 1070, /**/ From ad289eece7b9e7aab1ef005b2c21c454010280ea Mon Sep 17 00:00:00 2001 From: Christoffer Aasted Date: Fri, 11 Sep 2026 20:43:18 +0000 Subject: [PATCH 534/647] patch 9.2.1072: runtime(synload): recursion error when setting ft=syntax Problem: recursion error when setting ft=syntax Solution: Skip the special syntax filetype (Christoffer Aasted) This: vim -Nu NONE \ +'set filetype=syntax' \ +'syntax on' yields E127: Cannot redefine function 2_SynSet: It is in use Setting filetype=syntax will try to reload synload.vim while SynSet() is still executing which causes this error. closes: #21271 Signed-off-by: Christoffer Aasted Signed-off-by: Christian Brabandt --- runtime/syntax/synload.vim | 4 ++-- src/testdir/test_syntax.vim | 7 +++++++ src/version.c | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/runtime/syntax/synload.vim b/runtime/syntax/synload.vim index 553e8b209e..b9930c164a 100644 --- a/runtime/syntax/synload.vim +++ b/runtime/syntax/synload.vim @@ -1,6 +1,6 @@ " Vim syntax support file " Maintainer: The Vim Project -" Last Change: 2023 Aug 10 +" Last Change: 2026 Sep 11 " Former Maintainer: Bram Moolenaar " This file sets up for syntax highlighting. @@ -55,7 +55,7 @@ fun! s:SynSet() " Load the syntax file(s). When there are several, separated by dots, " load each in sequence. Skip empty entries. for name in split(s, '\.') - if !empty(name) + if !empty(name) && name !=# 'syntax' exe "runtime! syntax/" . name . ".vim syntax/" . name . "/*.vim" endif endfor diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim index d4a81dd656..5750361ea1 100644 --- a/src/testdir/test_syntax.vim +++ b/src/testdir/test_syntax.vim @@ -101,6 +101,13 @@ func Test_syntax_after_reload() call delete('Xsomefile') endfunc +func Test_syntax_filetype_syntax() + set filetype=syntax + syntax on + syntax off + set filetype= syntax= +endfunc + func Test_syntime() CheckFeature profile diff --git a/src/version.c b/src/version.c index 9ac53cd889..a2317e77c3 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1072, /**/ 1071, /**/ From 737b761ee6180a94c1ed31860660e8b468fadd40 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 21:03:48 +0000 Subject: [PATCH 535/647] patch 9.2.1073: MS-Windows: testing.obj and sound.obj are not rebuilt on header changes Problem: With Make_mvc.mak, testing.obj and sound.obj are only rebuilt when their own source file changes. The rule for testing.obj names term.obj as its target, sound.obj has no rule at all, so both are built by the inference rule, which does not depend on the header files. Linking fails with an unresolved in_vim9script() after patch 9.2.1044 unless the old object is deleted by hand. Solution: Name testing.obj in its rule and add a rule for sound.obj (Hirohito Higashi). closes: #21272 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/Make_mvc.mak | 4 +++- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 1b91f5b292..6f885bc3d8 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -1782,6 +1782,8 @@ $(OUTDIR)/cairo.obj: $(OUTDIR) cairo.c $(INCL) $(OUTDIR)/socketserver.obj: $(OUTDIR) socketserver.c $(INCL) +$(OUTDIR)/sound.obj: $(OUTDIR) sound.c $(INCL) + $(OUTDIR)/spell.obj: $(OUTDIR) spell.c $(INCL) $(OUTDIR)/spellfile.obj: $(OUTDIR) spellfile.c $(INCL) @@ -1798,7 +1800,7 @@ $(OUTDIR)/tag.obj: $(OUTDIR) tag.c $(INCL) $(OUTDIR)/term.obj: $(OUTDIR) term.c $(INCL) -$(OUTDIR)/term.obj: $(OUTDIR) testing.c $(INCL) +$(OUTDIR)/testing.obj: $(OUTDIR) testing.c $(INCL) $(OUTDIR)/textformat.obj: $(OUTDIR) textformat.c $(INCL) diff --git a/src/version.c b/src/version.c index a2317e77c3..6a81327c38 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1073, /**/ 1072, /**/ From 3362c8c89fc3c2cee6e893d1ff4b95308cd50e7c Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 21:15:43 +0000 Subject: [PATCH 536/647] patch 9.2.1074: popup: image stays on the screen in another tab page Problem: The image of a tab-local popup window stays on the screen after switching to another tab page, while the border and the background of the popup are gone. The image backends keep an image until it is removed: a kitty placement and a GTK4 texture until they are deleted, GDI and cairo pixels until the area is repainted, sixel pixels until the screen is cleared. Solution: Remove the images of the popups local to a tab page when the tab page is left, they are emitted again when it is entered. (Hirohito Higashi). related: #21234 closes: #21273 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/popupwin.c | 37 ++++++++++++ src/proto/popupwin.pro | 1 + src/testdir/test_popupwin.vim | 107 ++++++++++++++++++++++++++++++++++ src/version.c | 2 + src/window.c | 3 + 5 files changed, 150 insertions(+) diff --git a/src/popupwin.c b/src/popupwin.c index e7ad8f279e..aacde4b652 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -4645,6 +4645,43 @@ popup_close(int id, int force) return FAIL; } +#ifdef FEAT_IMAGE +/* + * Remove the images of the popups local to tabpage "tp", it is about to be + * left. The popups are not drawn in another tabpage, their images stay until + * they are removed. They are emitted again when the tabpage is entered. + */ + void +popup_leave_tabpage(tabpage_T *tp) +{ + win_T *wp; + + FOR_ALL_POPUPWINS_IN_TAB(tp, wp) + { + if ((wp->w_popup_flags & POPF_HIDDEN) || wp->w_popup_image_data == NULL) + continue; +# ifdef FEAT_IMAGE_KITTY + popup_image_clear_kitty(wp, false); +# endif +# ifdef FEAT_IMAGE_GDK + if (gui.in_use) + gui_gtk4_remove_image(wp); +# endif +# ifdef POPUP_IMAGE_CLEAR_GUI + popup_image_clear_gui(wp); +# endif +# ifdef FEAT_IMAGE_SIXEL + // Sixel pixels only go away with a clear of the screen. +# ifdef FEAT_GUI + if (!gui.in_use) +# endif + if (popup_image_backend() == IMAGE_BACKEND_SIXEL) + redraw_later_clear(); +# endif + } +} +#endif + /* * Close a popup window with Window-id "id" in tabpage "tp". */ diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro index f29aef9d08..d61727d1ac 100644 --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -39,6 +39,7 @@ void f_popup_settext(typval_T *argvars, typval_T *rettv); void f_popup_setbuf(typval_T *argvars, typval_T *rettv); int error_if_popup_window(int also_with_term); int popup_close(int id, int force); +void popup_leave_tabpage(tabpage_T *tp); int popup_close_tabpage(tabpage_T *tp, int id, int force); void close_all_popups(int force); void f_popup_move(typval_T *argvars, typval_T *rettv); diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index b43bbae66e..271a6e7e8e 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -6310,6 +6310,113 @@ func Test_popup_image_clipwindow_scroll() call prop_type_delete('imgclipprop') endfunc +" The kitty and sixel image backends cannot be tested in a terminal window: +" it does not show the escape sequences Vim writes and does not answer the +" probe for the kitty graphics protocol. Run Vim on a pty as a job instead +" and look at what it writes there. + +" The sequences of the kitty graphics protocol Vim writes, "a=" is the action. +" See https://sw.kovidgoyal.net/kitty/graphics-protocol/ +" a=q: does the terminal support the protocol? +let s:kitty_probe = "\_Gi=31" +" What a terminal that supports the protocol answers, followed by the reply to +" the DA1 request that ends the probe. +let s:kitty_probe_answer = "\_Gi=31;OK\\\\[?62;4c" +" a=t: transmit the pixels of an image. +let s:kitty_transmit = "\_Ga=t," +" a=p: place a transmitted image on the screen. +let s:kitty_place = "\_Ga=p," +" a=d,d=i: delete the placement of an image, the terminal keeps the pixels. +let s:kitty_delete = "\_Ga=d,d=i," + +" The start of a sixel image, a DCS with the "q" command. +let s:sixel_start_pat = "\P[0-9;]*q" +" Clear the screen, the only way to remove sixel pixels on some terminals. +let s:clear_screen = "\[2J" + +" The script for the Vim on the pty: create a popup with an image. +let s:image_popup_script =<< trim END + let img = repeat([0xff, 0, 0], 16 * 32)->list2blob() + call popup_create('', #{image: #{data: img, width: 16, height: 32}}) + redraw +END + +" Collect what the Vim on the pty writes in s:pty_out. With "kitty" the probe +" is answered like a terminal that supports the protocol, otherwise Vim gets +" no answer and uses sixel. +func s:PtyOutput(job, msg, kitty) + let s:pty_out ..= a:msg + if a:kitty && !s:pty_answered && stridx(s:pty_out, s:kitty_probe) >= 0 + call ch_sendraw(a:job, s:kitty_probe_answer) + let s:pty_answered = 1 + endif +endfunc + +" Start Vim on a pty with the script written to XpopupImageTab. +func s:StartVimWithImageOnPty(kitty) + let s:pty_out = '' + let s:pty_answered = 0 + return job_start(GetVimCommandCleanTerm() .. ' -S XpopupImageTab', #{ + \ pty: 1, + \ out_mode: 'raw', + \ env: #{TERM: 'xterm', LINES: '24', COLUMNS: '80'}, + \ out_cb: {job, msg -> s:PtyOutput(job, msg, a:kitty)}, + \ }) +endfunc + +" Wait for the Vim on the pty to write "seq" after the first "start" bytes. +func s:WaitForPtyOutput(seq, start) + call WaitForAssert({-> assert_notequal(-1, + \ stridx(s:pty_out, a:seq, a:start))}) +endfunc + +func Test_popup_image_kitty_leave_tabpage() + CheckUnix + CheckFeature job + CheckFeature image_kitty + + call writefile(s:image_popup_script, 'XpopupImageTab', 'D') + let job = s:StartVimWithImageOnPty(1) + try + call s:WaitForPtyOutput(s:kitty_transmit, 0) + call s:WaitForPtyOutput(s:kitty_place, 0) + + " Leaving the tab page deletes the placement. + let start = len(s:pty_out) + call ch_sendraw(job, ":tabedit\") + call s:WaitForPtyOutput(s:kitty_delete, start) + + " Entering the tab page places the image again without transmitting it. + let start = len(s:pty_out) + call ch_sendraw(job, ":tabnext\") + call s:WaitForPtyOutput(s:kitty_place, start) + call assert_equal(-1, stridx(s:pty_out, s:kitty_transmit, start)) + finally + call job_stop(job, 'kill') + call WaitForAssert({-> assert_equal('dead', job_status(job))}) + endtry +endfunc + +func Test_popup_image_sixel_leave_tabpage() + CheckUnix + CheckFeature job + CheckFeature image_sixel + + call writefile(s:image_popup_script, 'XpopupImageTab', 'D') + let job = s:StartVimWithImageOnPty(0) + try + call WaitForAssert({-> assert_match(s:sixel_start_pat, s:pty_out)}) + + " Leaving the tab page clears the screen. + let start = len(s:pty_out) + call ch_sendraw(job, ":tabedit\") + call s:WaitForPtyOutput(s:clear_screen, start) + finally + call job_stop(job, 'kill') + call WaitForAssert({-> assert_equal('dead', job_status(job))}) + endtry +endfunc + func Test_popupwin_textprop_redraw() CheckScreendump diff --git a/src/version.c b/src/version.c index 6a81327c38..956539eb1d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1074, /**/ 1073, /**/ diff --git a/src/window.c b/src/window.c index e1c108ff1a..85bb5ea460 100644 --- a/src/window.c +++ b/src/window.c @@ -5116,6 +5116,9 @@ leave_tabpage( return FAIL; } +#ifdef FEAT_IMAGE + popup_leave_tabpage(tp); +#endif reset_dragwin(); #if defined(FEAT_GUI) // Remove the scrollbars. They may be added back later. From e4410181387e7941fac9f75d3c3002243b5394d4 Mon Sep 17 00:00:00 2001 From: Shantanu Raj Date: Fri, 11 Sep 2026 21:24:54 +0000 Subject: [PATCH 537/647] patch 9.2.1075: :write fails when a BufWritePre autocmd changes directory Problem: :write fails with E212 when a BufWritePre autocmd changes to a directory that does not contain the file. The directory change drops the buffer's short name, and buf_write() uses that NULL short name when it re-reads the buffer's names after the autocommands. Solution: Use b_fname, which is the short name when there is one and the full name otherwise (Shantanu Raj). fixes: #21275 closes: #21276 Signed-off-by: Shantanu Raj Signed-off-by: Christian Brabandt --- src/bufwrite.c | 7 ++++--- src/testdir/test_writefile.vim | 16 ++++++++++++++++ src/version.c | 2 ++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/bufwrite.c b/src/bufwrite.c index 51537010d6..4423365ad5 100644 --- a/src/bufwrite.c +++ b/src/bufwrite.c @@ -965,15 +965,16 @@ buf_write( } // The autocommands may have changed the name of the buffer, which may - // be kept in fname, ffname and sfname. + // be kept in fname, ffname and sfname. A ":cd" may also have dropped + // the short name, then b_fname is the full name. if (buf_ffname) ffname = buf->b_ffname; if (buf_sfname) - sfname = buf->b_sfname; + sfname = buf->b_fname; if (buf_fname_f) fname = buf->b_ffname; if (buf_fname_s) - fname = buf->b_sfname; + fname = buf->b_fname; } if (cmdmod.cmod_flags & CMOD_LOCKMARKS) diff --git a/src/testdir/test_writefile.vim b/src/testdir/test_writefile.vim index a2491f9300..72c754c2a5 100644 --- a/src/testdir/test_writefile.vim +++ b/src/testdir/test_writefile.vim @@ -1017,4 +1017,20 @@ func Test_backupcopy_auto_restrictive_umask() \ systemlist('ls -i Xumaskfile')[0]->matchstr('^\s*\zs\d\+')) endfunc +" Test for :write when a BufWritePre autocmd changes to a directory that does +" not contain the file: the short file name is dropped and the full name must +" be used. +func Test_write_BufWritePre_cd_away() + call mkdir('Xcdaway/other', 'pR') + let save_cwd = getcwd() + defer chdir(save_cwd) + cd Xcdaway + new file.txt + call setline(1, 'hello') + autocmd BufWritePre cd other + write + call assert_equal(['hello'], readfile('../file.txt')) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 956539eb1d..1306f7b720 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1075, /**/ 1074, /**/ From a162f24a1b0579a022da642b7190a0293d41460e Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 21:31:06 +0000 Subject: [PATCH 538/647] patch 9.2.1076: Regenerate prototypes using "//" comments Problem: The first and the last line of the generated .pro files are "/* */" comments. Solution: Regenerate the files with "make proto", update the hand written protoype files to match the style, update the generator to use // comments instead, add socketserver to PROTO_FILES (Hirohito Higashi) closes: #21277 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/Makefile | 1 + src/proto/alloc.pro | 4 ++-- src/proto/arabic.pro | 4 ++-- src/proto/arglist.pro | 4 ++-- src/proto/autocmd.pro | 4 ++-- src/proto/beval.pro | 4 ++-- src/proto/blob.pro | 4 ++-- src/proto/blowfish.pro | 4 ++-- src/proto/buffer.pro | 4 ++-- src/proto/bufwrite.pro | 4 ++-- src/proto/cairo.pro | 4 ++-- src/proto/change.pro | 4 ++-- src/proto/channel.pro | 4 ++-- src/proto/charset.pro | 4 ++-- src/proto/cindent.pro | 4 ++-- src/proto/clientserver.pro | 4 ++-- src/proto/clipboard.pro | 4 ++-- src/proto/cmdexpand.pro | 4 ++-- src/proto/cmdhist.pro | 4 ++-- src/proto/crypt.pro | 4 ++-- src/proto/crypt_zip.pro | 4 ++-- src/proto/debugger.pro | 4 ++-- src/proto/dict.pro | 4 ++-- src/proto/diff.pro | 4 ++-- src/proto/digraph.pro | 4 ++-- src/proto/drawline.pro | 4 ++-- src/proto/drawscreen.pro | 4 ++-- src/proto/edit.pro | 4 ++-- src/proto/eval.pro | 4 ++-- src/proto/evalbuffer.pro | 4 ++-- src/proto/evalfunc.pro | 4 ++-- src/proto/evalvars.pro | 4 ++-- src/proto/evalwindow.pro | 4 ++-- src/proto/ex_cmds.pro | 4 ++-- src/proto/ex_cmds2.pro | 4 ++-- src/proto/ex_docmd.pro | 4 ++-- src/proto/ex_eval.pro | 4 ++-- src/proto/ex_getln.pro | 4 ++-- src/proto/fileio.pro | 4 ++-- src/proto/filepath.pro | 4 ++-- src/proto/findfile.pro | 4 ++-- src/proto/float.pro | 4 ++-- src/proto/fold.pro | 4 ++-- src/proto/fuzzy.pro | 4 ++-- src/proto/gc.pro | 4 ++-- src/proto/gen_prototypes.py | 4 ++-- src/proto/getchar.pro | 4 ++-- src/proto/gui.pro | 4 ++-- src/proto/gui_beval.pro | 4 ++-- src/proto/gui_gtk.pro | 4 ++-- src/proto/gui_gtk4.pro | 4 ++-- src/proto/gui_gtk_gresources.pro | 4 ++-- src/proto/gui_gtk_x11.pro | 4 ++-- src/proto/gui_haiku.pro | 3 ++- src/proto/gui_motif.pro | 4 ++-- src/proto/gui_photon.pro | 4 ++-- src/proto/gui_w32.pro | 4 ++-- src/proto/gui_x11.pro | 4 ++-- src/proto/gui_xim.pro | 4 ++-- src/proto/gui_xmdlg.pro | 4 ++-- src/proto/hardcopy.pro | 4 ++-- src/proto/hardcopy_pango.pro | 4 ++-- src/proto/hardcopy_postscript.pro | 4 ++-- src/proto/hashtab.pro | 4 ++-- src/proto/help.pro | 4 ++-- src/proto/highlight.pro | 4 ++-- src/proto/if_cscope.pro | 4 ++-- src/proto/if_lua.pro | 4 ++-- src/proto/if_mzsch.pro | 4 ++-- src/proto/if_ole.pro | 3 ++- src/proto/if_perl.pro | 3 ++- src/proto/if_python.pro | 4 ++-- src/proto/if_python3.pro | 4 ++-- src/proto/if_ruby.pro | 4 ++-- src/proto/if_tcl.pro | 4 ++-- src/proto/if_xcmdsrv.pro | 4 ++-- src/proto/indent.pro | 4 ++-- src/proto/insexpand.pro | 4 ++-- src/proto/job.pro | 4 ++-- src/proto/json.pro | 4 ++-- src/proto/kitty.pro | 4 ++-- src/proto/linematch.pro | 4 ++-- src/proto/list.pro | 4 ++-- src/proto/locale.pro | 4 ++-- src/proto/logfile.pro | 4 ++-- src/proto/main.pro | 4 ++-- src/proto/map.pro | 4 ++-- src/proto/mark.pro | 4 ++-- src/proto/match.pro | 4 ++-- src/proto/mbyte.pro | 4 ++-- src/proto/memfile.pro | 4 ++-- src/proto/memline.pro | 4 ++-- src/proto/menu.pro | 4 ++-- src/proto/message.pro | 4 ++-- src/proto/misc1.pro | 4 ++-- src/proto/misc2.pro | 4 ++-- src/proto/mouse.pro | 4 ++-- src/proto/move.pro | 4 ++-- src/proto/netbeans.pro | 4 ++-- src/proto/normal.pro | 4 ++-- src/proto/ops.pro | 4 ++-- src/proto/option.pro | 4 ++-- src/proto/optionstr.pro | 4 ++-- src/proto/os_amiga.pro | 4 ++-- src/proto/os_mac_conv.pro | 4 ++-- src/proto/os_macosx.pro | 4 ++-- src/proto/os_mswin.pro | 4 ++-- src/proto/os_qnx.pro | 4 ++-- src/proto/os_unix.pro | 4 ++-- src/proto/os_vms.pro | 4 ++-- src/proto/os_win32.pro | 4 ++-- src/proto/popupmenu.pro | 4 ++-- src/proto/popupwin.pro | 4 ++-- src/proto/profiler.pro | 4 ++-- src/proto/pty.pro | 4 ++-- src/proto/quickfix.pro | 4 ++-- src/proto/regexp.pro | 4 ++-- src/proto/register.pro | 4 ++-- src/proto/screen.pro | 4 ++-- src/proto/scriptfile.pro | 4 ++-- src/proto/search.pro | 4 ++-- src/proto/session.pro | 4 ++-- src/proto/sha256.pro | 4 ++-- src/proto/sign.pro | 4 ++-- src/proto/sixel.pro | 4 ++-- src/proto/socketserver.pro | 4 ++-- src/proto/sound.pro | 4 ++-- src/proto/spell.pro | 4 ++-- src/proto/spellfile.pro | 4 ++-- src/proto/spellsuggest.pro | 4 ++-- src/proto/strings.pro | 4 ++-- src/proto/syntax.pro | 4 ++-- src/proto/tabpanel.pro | 4 ++-- src/proto/tag.pro | 4 ++-- src/proto/term.pro | 4 ++-- src/proto/terminal.pro | 4 ++-- src/proto/termlib.pro | 4 ++-- src/proto/testing.pro | 4 ++-- src/proto/textformat.pro | 4 ++-- src/proto/textobject.pro | 4 ++-- src/proto/textprop.pro | 4 ++-- src/proto/time.pro | 4 ++-- src/proto/tuple.pro | 4 ++-- src/proto/typval.pro | 4 ++-- src/proto/ui.pro | 4 ++-- src/proto/undo.pro | 4 ++-- src/proto/usercmd.pro | 4 ++-- src/proto/userfunc.pro | 4 ++-- src/proto/version.pro | 4 ++-- src/proto/vim9class.pro | 4 ++-- src/proto/vim9cmds.pro | 4 ++-- src/proto/vim9compile.pro | 4 ++-- src/proto/vim9execute.pro | 4 ++-- src/proto/vim9expr.pro | 4 ++-- src/proto/vim9generics.pro | 4 ++-- src/proto/vim9instr.pro | 4 ++-- src/proto/vim9script.pro | 4 ++-- src/proto/vim9type.pro | 4 ++-- src/proto/viminfo.pro | 4 ++-- src/proto/wayland.pro | 4 ++-- src/proto/winclip.pro | 4 ++-- src/proto/window.pro | 4 ++-- src/version.c | 2 ++ 163 files changed, 325 insertions(+), 319 deletions(-) diff --git a/src/Makefile b/src/Makefile index 98baecf6f4..9e91a9f39e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1988,6 +1988,7 @@ PROTO_FILES = \ proto/sixel.pro \ proto/kitty.pro \ proto/cairo.pro \ + proto/socketserver.pro \ proto/sound.pro \ proto/spell.pro \ proto/spellfile.pro \ diff --git a/src/proto/alloc.pro b/src/proto/alloc.pro index fe20810c14..742fabb831 100644 --- a/src/proto/alloc.pro +++ b/src/proto/alloc.pro @@ -1,4 +1,4 @@ -/* alloc.c */ +// alloc.c void vim_mem_profile_dump(void); int alloc_does_fail(size_t size); void *alloc(size_t size); @@ -28,4 +28,4 @@ void ga_concat(garray_T *gap, char_u *s); void ga_concat_len(garray_T *gap, char_u *s, size_t len); int ga_append(garray_T *gap, int c); void append_ga_line(garray_T *gap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/arabic.pro b/src/proto/arabic.pro index c93e24650b..694421bfda 100644 --- a/src/proto/arabic.pro +++ b/src/proto/arabic.pro @@ -1,5 +1,5 @@ -/* arabic.c */ +// arabic.c int arabic_maycombine(int two); int arabic_combine(int one, int two); int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1, int next_c); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/arglist.pro b/src/proto/arglist.pro index aeb839992f..3e79d5add8 100644 --- a/src/proto/arglist.pro +++ b/src/proto/arglist.pro @@ -1,4 +1,4 @@ -/* arglist.c */ +// arglist.c void alist_clear(alist_T *al); void alist_init(alist_T *al); void alist_unlink(alist_T *al); @@ -30,4 +30,4 @@ void f_argc(typval_T *argvars, typval_T *rettv); void f_argidx(typval_T *argvars, typval_T *rettv); void f_arglistid(typval_T *argvars, typval_T *rettv); void f_argv(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/autocmd.pro b/src/proto/autocmd.pro index 143c731d28..c796cfdb17 100644 --- a/src/proto/autocmd.pro +++ b/src/proto/autocmd.pro @@ -1,4 +1,4 @@ -/* autocmd.c */ +// autocmd.c void aubuflocal_remove(buf_T *buf); int au_has_group(char_u *name); void do_augroup(char_u *arg, int del_group); @@ -51,4 +51,4 @@ int au_exists(char_u *arg); void f_autocmd_add(typval_T *argvars, typval_T *rettv); void f_autocmd_delete(typval_T *argvars, typval_T *rettv); void f_autocmd_get(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/beval.pro b/src/proto/beval.pro index 8b67e383db..1856d93508 100644 --- a/src/proto/beval.pro +++ b/src/proto/beval.pro @@ -1,7 +1,7 @@ -/* beval.c */ +// beval.c int find_word_under_cursor(int mouserow, int mousecol, int getword, int flags, win_T **winp, linenr_T *lnump, char_u **textp, int *colp, int *startcolp); int get_beval_info(BalloonEval *beval, int getword, win_T **winp, linenr_T *lnump, char_u **textp, int *colp); void post_balloon(BalloonEval *beval, char_u *mesg, list_T *list); int can_use_beval(void); void general_beval_cb(BalloonEval *beval, int state); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/blob.pro b/src/proto/blob.pro index cd32dcba74..ace08b4927 100644 --- a/src/proto/blob.pro +++ b/src/proto/blob.pro @@ -1,4 +1,4 @@ -/* blob.c */ +// blob.c blob_T *blob_alloc(void); int rettv_blob_alloc(typval_T *rettv); void rettv_blob_set(typval_T *rettv, blob_T *b); @@ -28,4 +28,4 @@ void blob_reduce(typval_T *argvars, typval_T *expr, typval_T *rettv); void blob_reverse(blob_T *b, typval_T *rettv); void f_blob2list(typval_T *argvars, typval_T *rettv); void f_list2blob(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/blowfish.pro b/src/proto/blowfish.pro index fbaa3dc594..1319f8550c 100644 --- a/src/proto/blowfish.pro +++ b/src/proto/blowfish.pro @@ -1,6 +1,6 @@ -/* blowfish.c */ +// blowfish.c void crypt_blowfish_encode(cryptstate_T *state, char_u *from, size_t len, char_u *to, int last); void crypt_blowfish_decode(cryptstate_T *state, char_u *from, size_t len, char_u *to, int last); int crypt_blowfish_init(cryptstate_T *state, char_u *key, crypt_arg_T *arg); int blowfish_self_test(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/buffer.pro b/src/proto/buffer.pro index 7c29256426..7fc13f0332 100644 --- a/src/proto/buffer.pro +++ b/src/proto/buffer.pro @@ -1,4 +1,4 @@ -/* buffer.c */ +// buffer.c int get_highest_fnum(void); void buffer_ensure_loaded(buf_T *buf); int open_buffer(int read_stdin, exarg_T *eap, int flags_arg); @@ -74,4 +74,4 @@ char_u *buf_get_fname(buf_T *buf); void set_buflisted(int on); int buf_contents_changed(buf_T *buf); void wipe_buffer(buf_T *buf, int aucmd); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/bufwrite.pro b/src/proto/bufwrite.pro index 72c08daf39..23474d3ad2 100644 --- a/src/proto/bufwrite.pro +++ b/src/proto/bufwrite.pro @@ -1,4 +1,4 @@ -/* bufwrite.c */ +// bufwrite.c char *new_file_message(void); int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/cairo.pro b/src/proto/cairo.pro index 1aad52c2bd..155c606acd 100644 --- a/src/proto/cairo.pro +++ b/src/proto/cairo.pro @@ -1,6 +1,6 @@ -/* cairo.c */ +// cairo.c bool cairo_popup_image_ensure(win_T *wp); bool cairo_popup_image_update(win_T *wp); void cairo_popup_image_free(win_T *wp); void cairo_popup_image_paint(win_T *wp, void *target, int x, int y, double src_x, double src_y, double draw_w, double draw_h); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/change.pro b/src/proto/change.pro index f24d74cd59..9b57c16a96 100644 --- a/src/proto/change.pro +++ b/src/proto/change.pro @@ -1,4 +1,4 @@ -/* change.c */ +// change.c void change_warning(int col); void changed(void); void changed_internal(void); @@ -30,4 +30,4 @@ int del_bytes(long count, int fixpos_arg, int use_delcombine); int open_line(int dir, int flags, int second_line_indent, int *did_do_comment); int truncate_line(int fixpos); void del_lines(long nlines, int undo); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/channel.pro b/src/proto/channel.pro index 29618da0a9..a96028f3ba 100644 --- a/src/proto/channel.pro +++ b/src/proto/channel.pro @@ -1,4 +1,4 @@ -/* channel.c */ +// channel.c channel_T *add_channel(void); int has_any_channel(void); int channel_still_useful(channel_T *channel); @@ -68,4 +68,4 @@ void f_ch_setoptions(typval_T *argvars, typval_T *rettv); void f_ch_status(typval_T *argvars, typval_T *rettv); char_u *channel_to_string_buf(typval_T *varp, char_u *buf); channel_T *channel_find(int ch_id); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/charset.pro b/src/proto/charset.pro index bc09b01b8c..68ac1554a6 100644 --- a/src/proto/charset.pro +++ b/src/proto/charset.pro @@ -1,4 +1,4 @@ -/* charset.c */ +// charset.c int init_chartab(void); int buf_init_chartab(buf_T *buf, int global); int check_isopt(char_u *var); @@ -74,4 +74,4 @@ int hexhex2nr(char_u *p); int rem_backslash(char_u *str); void backslash_halve(char_u *p); char_u *backslash_halve_save(char_u *p); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/cindent.pro b/src/proto/cindent.pro index 98721b1f2d..4e031059fa 100644 --- a/src/proto/cindent.pro +++ b/src/proto/cindent.pro @@ -1,4 +1,4 @@ -/* cindent.c */ +// cindent.c int cin_is_cinword(char_u *line); int is_pos_in_string(char_u *line, colnr_T col); int check_linecomment(char_u *line); @@ -9,4 +9,4 @@ int get_c_indent(void); int in_cinkeys(int keytyped, int when, int line_is_empty); void do_c_expr_indent(void); void f_cindent(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/clientserver.pro b/src/proto/clientserver.pro index 2c71b130ee..6961871bc3 100644 --- a/src/proto/clientserver.pro +++ b/src/proto/clientserver.pro @@ -1,4 +1,4 @@ -/* clientserver.c */ +// clientserver.c void server_to_input_buf(char_u *str); char_u *eval_client_expr_to_string(char_u *expr); int sendToLocalVim(char_u *cmd, int asExpr, char_u **result); @@ -14,4 +14,4 @@ void f_remote_startserver(typval_T *argvars, typval_T *rettv); void f_server2client(typval_T *argvars, typval_T *rettv); void f_serverlist(typval_T *argvars, typval_T *rettv); void check_clientserver_method_env(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/clipboard.pro b/src/proto/clipboard.pro index 46dc72edeb..5bd25b2180 100644 --- a/src/proto/clipboard.pro +++ b/src/proto/clipboard.pro @@ -1,4 +1,4 @@ -/* clipboard.c */ +// clipboard.c void clip_init(int can_use); void clip_update_selection(Clipboard_T *clip); void clip_own_selection(Clipboard_T *cbd); @@ -46,4 +46,4 @@ void call_clip_provider_set(int reg); void inc_clip_provider(void); void dec_clip_provider(void); int clip_convert_data(char_u **buf, long *len_store, int *motion, bool vim, bool vimenc, char_u **tofree); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/cmdexpand.pro b/src/proto/cmdexpand.pro index 390868a51f..aed59e1db2 100644 --- a/src/proto/cmdexpand.pro +++ b/src/proto/cmdexpand.pro @@ -1,4 +1,4 @@ -/* cmdexpand.c */ +// cmdexpand.c int cmdline_fuzzy_complete(char_u *fuzzystr); int nextwild(expand_T *xp, int type, int options, int escape); void cmdline_pum_display(void); @@ -28,4 +28,4 @@ void wildmenu_cleanup(cmdline_info_T *cclp); void f_getcompletion(typval_T *argvars, typval_T *rettv); void f_getcompletiontype(typval_T *argvars, typval_T *rettv); void f_cmdcomplete_info(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/cmdhist.pro b/src/proto/cmdhist.pro index 5bf4b8da44..ab883865e7 100644 --- a/src/proto/cmdhist.pro +++ b/src/proto/cmdhist.pro @@ -1,4 +1,4 @@ -/* cmdhist.c */ +// cmdhist.c int get_hislen(void); histentry_T *get_histentry(int hist_type); void set_histentry(int hist_type, histentry_T *entry); @@ -16,4 +16,4 @@ void f_histget(typval_T *argvars, typval_T *rettv); void f_histnr(typval_T *argvars, typval_T *rettv); void remove_key_from_history(void); void ex_history(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/crypt.pro b/src/proto/crypt.pro index f710800dbc..bdce95194d 100644 --- a/src/proto/crypt.pro +++ b/src/proto/crypt.pro @@ -1,4 +1,4 @@ -/* crypt.c */ +// crypt.c int sodium_enabled(int verbose); int crypt_method_nr_from_name(char_u *name); int crypt_method_nr_from_magic(char *ptr, int len); @@ -31,4 +31,4 @@ int crypt_sodium_munlock(void *const addr, const size_t len); void crypt_sodium_randombytes_buf(void *const buf, const size_t size); int crypt_sodium_init(void); UINT32_T crypt_sodium_randombytes_random(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/crypt_zip.pro b/src/proto/crypt_zip.pro index eb29dbf760..2c4957aab6 100644 --- a/src/proto/crypt_zip.pro +++ b/src/proto/crypt_zip.pro @@ -1,5 +1,5 @@ -/* crypt_zip.c */ +// crypt_zip.c int crypt_zip_init(cryptstate_T *state, char_u *key, crypt_arg_T *arg); void crypt_zip_encode(cryptstate_T *state, char_u *from, size_t len, char_u *to, int last); void crypt_zip_decode(cryptstate_T *state, char_u *from, size_t len, char_u *to, int last); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/debugger.pro b/src/proto/debugger.pro index 5ff23eb0f0..2a57bcb6c9 100644 --- a/src/proto/debugger.pro +++ b/src/proto/debugger.pro @@ -1,4 +1,4 @@ -/* debugger.c */ +// debugger.c int has_watchexpr(void); void do_debug(char_u *cmd); void ex_debug(exarg_T *eap); @@ -12,4 +12,4 @@ void ex_breaklist(exarg_T *eap); linenr_T dbg_find_breakpoint(int file, char_u *fname, linenr_T after); int has_profiling(int file, char_u *fname, int *fp, hash_T *hashp); void dbg_breakpoint(char_u *name, linenr_T lnum); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/dict.pro b/src/proto/dict.pro index 2507f6af1b..c7c854db60 100644 --- a/src/proto/dict.pro +++ b/src/proto/dict.pro @@ -1,4 +1,4 @@ -/* dict.c */ +// dict.c dict_T *dict_alloc(void); dict_T *dict_alloc_id(alloc_id_T id); dict_T *dict_alloc_lock(int lock); @@ -51,4 +51,4 @@ void f_keys(typval_T *argvars, typval_T *rettv); void f_values(typval_T *argvars, typval_T *rettv); void dict_set_items_ro(dict_T *di); void f_has_key(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/diff.pro b/src/proto/diff.pro index 3a4929b0cc..347bdd4730 100644 --- a/src/proto/diff.pro +++ b/src/proto/diff.pro @@ -1,4 +1,4 @@ -/* diff.c */ +// diff.c void diff_buf_delete(buf_T *buf); void diff_buf_adjust(win_T *win); void diff_buf_add(buf_T *buf); @@ -34,4 +34,4 @@ linenr_T diff_lnum_win(linenr_T lnum, win_T *wp); void f_diff_filler(typval_T *argvars, typval_T *rettv); void f_diff_hlID(typval_T *argvars, typval_T *rettv); void f_diff(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/digraph.pro b/src/proto/digraph.pro index 09089352d6..c5568521d9 100644 --- a/src/proto/digraph.pro +++ b/src/proto/digraph.pro @@ -1,4 +1,4 @@ -/* digraph.c */ +// digraph.c int do_digraph(int c); char_u *get_digraph_for_char(int val_arg); int get_digraph(int cmdline); @@ -12,4 +12,4 @@ void f_digraph_setlist(typval_T *argvars, typval_T *rettv); char *keymap_init(void); void ex_loadkeymap(exarg_T *eap); void keymap_clear(garray_T *kmap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/drawline.pro b/src/proto/drawline.pro index abda9cf74a..fbd1728926 100644 --- a/src/proto/drawline.pro +++ b/src/proto/drawline.pro @@ -1,5 +1,5 @@ -/* drawline.c */ +// drawline.c int text_prop_position(win_T *wp, textprop_T *tp, int vcol, int scr_col, int *n_extra, char_u **p_extra, int *n_attr, int *n_attr_skip, int do_skip); int text_prop_no_showbreak(textprop_T *tp); int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int number_only, spellvars_T *spv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/drawscreen.pro b/src/proto/drawscreen.pro index da2662aca7..37283175f5 100644 --- a/src/proto/drawscreen.pro +++ b/src/proto/drawscreen.pro @@ -1,4 +1,4 @@ -/* drawscreen.c */ +// drawscreen.c int update_screen(int type_arg); int statusline_row(win_T *wp); void win_redr_status(win_T *wp, int ignore_pum); @@ -28,4 +28,4 @@ void redraw_win_range_later(win_T *wp, linenr_T first, linenr_T last); void redraw_win_range_now(win_T *wp, linenr_T first, linenr_T last); void f_redraw_listener_add(typval_T *argvars, typval_T *rettv); void f_redraw_listener_remove(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/edit.pro b/src/proto/edit.pro index 6b2b75a743..ce3621bcee 100644 --- a/src/proto/edit.pro +++ b/src/proto/edit.pro @@ -1,4 +1,4 @@ -/* edit.c */ +// edit.c int edit(int cmdchar, int startln, long count); int ins_need_undo_get(void); void ins_redraw(int ready); @@ -39,4 +39,4 @@ colnr_T get_nolist_virtcol(void); int get_can_cindent(void); void set_can_cindent(int val); int ins_apply_autocmds(event_T event); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/eval.pro b/src/proto/eval.pro index 4481109814..d9e3462a26 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -1,4 +1,4 @@ -/* eval.c */ +// eval.c varnumber_T num_divide(varnumber_T n1, varnumber_T n2, int *failed); varnumber_T num_modulus(varnumber_T n1, varnumber_T n2, int *failed); void eval_init(void); @@ -77,4 +77,4 @@ void ex_execute(exarg_T *eap); char_u *find_option_end(char_u **arg, int *scope); void last_set_msg(sctx_T script_ctx); char_u *do_string_sub(char_u *str, size_t len, char_u *pat, char_u *sub, typval_T *expr, char_u *flags, size_t *ret_len); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/evalbuffer.pro b/src/proto/evalbuffer.pro index d8ccdecc7f..03331bb7a6 100644 --- a/src/proto/evalbuffer.pro +++ b/src/proto/evalbuffer.pro @@ -1,4 +1,4 @@ -/* evalbuffer.c */ +// evalbuffer.c int set_ref_in_buffers(int copyID); buf_T *buflist_find_by_name(char_u *name, int curtab_only); buf_T *find_buffer(typval_T *avar); @@ -24,4 +24,4 @@ void switch_buffer(bufref_T *save_curbuf, buf_T *buf); void restore_buffer(bufref_T *save_curbuf); void switch_to_win_for_buf(buf_T *buf, switchwin_T *switchwin, bufref_T *save_curbuf); void restore_win_for_buf(switchwin_T *switchwin, bufref_T *save_curbuf); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/evalfunc.pro b/src/proto/evalfunc.pro index dad8c6771a..c9d0b89309 100644 --- a/src/proto/evalfunc.pro +++ b/src/proto/evalfunc.pro @@ -1,4 +1,4 @@ -/* evalfunc.c */ +// evalfunc.c int arg_type_modifiable(type_T *type, int arg_idx); char_u *get_function_name(expand_T *xp, int idx); char_u *get_expr_name(expand_T *xp, int idx); @@ -29,4 +29,4 @@ void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv); void range_list_materialize(list_T *list); long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, typval_T *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit); int get_yank_type(char_u **pp, char_u *yank_type, long *block_len); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/evalvars.pro b/src/proto/evalvars.pro index e8840d1e26..adf8b83f9d 100644 --- a/src/proto/evalvars.pro +++ b/src/proto/evalvars.pro @@ -1,4 +1,4 @@ -/* evalvars.c */ +// evalvars.c void evalvars_init(void); void evalvars_clear(void); int garbage_collect_globvars(int copyID); @@ -112,4 +112,4 @@ void set_callback(callback_T *dest, callback_T *src); void copy_callback(callback_T *dest, callback_T *src); void expand_autload_callback(callback_T *cb); void free_callback(callback_T *callback); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/evalwindow.pro b/src/proto/evalwindow.pro index b2f8981758..27790db6c3 100644 --- a/src/proto/evalwindow.pro +++ b/src/proto/evalwindow.pro @@ -1,4 +1,4 @@ -/* evalwindow.c */ +// evalwindow.c win_T *win_id2wp(int id); win_T *win_id2wp_tp(int id, tabpage_T **tpp); void win_findbuf(typval_T *argvars, list_T *list); @@ -38,4 +38,4 @@ int switch_win(switchwin_T *switchwin, win_T *win, tabpage_T *tp, int no_display int switch_win_noblock(switchwin_T *switchwin, win_T *win, tabpage_T *tp, int no_display); void restore_win(switchwin_T *switchwin, int no_display); void restore_win_noblock(switchwin_T *switchwin, int no_display); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro index 36cb6bd0b8..969c63edab 100644 --- a/src/proto/ex_cmds.pro +++ b/src/proto/ex_cmds.pro @@ -1,4 +1,4 @@ -/* ex_cmds.c */ +// ex_cmds.c void do_ascii(exarg_T *eap); void ex_align(exarg_T *eap); void ex_sort(exarg_T *eap); @@ -42,4 +42,4 @@ void ex_drop(exarg_T *eap); char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags); char_u *skip_vimgrep_pat_ext(char_u *p, char_u **s, int *flags, char_u **nulp, int *cp); void ex_oldfiles(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro index 127e018074..51e4157fba 100644 --- a/src/proto/ex_cmds2.pro +++ b/src/proto/ex_cmds2.pro @@ -1,4 +1,4 @@ -/* ex_cmds2.c */ +// ex_cmds2.c int autowrite(buf_T *buf, int forceit); void autowrite_all(void); int check_changed(buf_T *buf, int flags); @@ -15,4 +15,4 @@ void ex_pyxfile(exarg_T *eap); void ex_pyx(exarg_T *eap); void ex_pyxdo(exarg_T *eap); void ex_checktime(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index 299820077a..bfcd9480dc 100644 --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -1,4 +1,4 @@ -/* ex_docmd.c */ +// ex_docmd.c void do_exmode(int improved); int do_cmdline_cmd(char_u *cmd); int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie, int flags); @@ -80,4 +80,4 @@ void set_no_hlsearch(int flag); int is_loclist_cmd(int cmdidx); int get_pressedreturn(void); void set_pressedreturn(int val); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ex_eval.pro b/src/proto/ex_eval.pro index feffc8fb02..9b8ecf5472 100644 --- a/src/proto/ex_eval.pro +++ b/src/proto/ex_eval.pro @@ -1,4 +1,4 @@ -/* ex_eval.c */ +// ex_eval.c int aborting(void); void update_force_abort(void); int should_abort(int retcode); @@ -40,4 +40,4 @@ int cleanup_conditionals(cstack_T *cstack, int searched_cond, int inclusive); void rewind_conditionals(cstack_T *cstack, int idx, int cond_type, int *cond_level); void ex_endfunction(exarg_T *eap); int has_loop_cmd(char_u *p); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro index d37be4bc9b..02d486986e 100644 --- a/src/proto/ex_getln.pro +++ b/src/proto/ex_getln.pro @@ -1,4 +1,4 @@ -/* ex_getln.c */ +// ex_getln.c int parse_pattern_and_range(pos_T *incsearch_start, int *search_delim, int *skiplen, int *patlen); void cmdline_init(void); char_u *getcmdline(int firstc, long count, int indent, getline_opt_T do_concat); @@ -47,4 +47,4 @@ int is_in_cmdwin(void); char_u *script_get(exarg_T *eap, char_u *cmd); void get_user_input(typval_T *argvars, typval_T *rettv, int inputdialog, int secret); void f_wildtrigger(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro index 8d978709fc..d1dd2144c6 100644 --- a/src/proto/fileio.pro +++ b/src/proto/fileio.pro @@ -1,4 +1,4 @@ -/* fileio.c */ +// fileio.c void filemess(buf_T *buf, char_u *name, char_u *s, int attr); int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_skip, linenr_T lines_to_read, exarg_T *eap, int flags); int is_dev_fd_file(char_u *fname); @@ -42,4 +42,4 @@ int match_file_list(char_u *list, char_u *sfname, char_u *ffname); char_u *file_pat_to_reg_pat(char_u *pat, char_u *pat_end, char *allow_dirs, int no_bslash); long read_eintr(int fd, void *buf, size_t bufsize); long write_eintr(int fd, void *buf, size_t bufsize); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/filepath.pro b/src/proto/filepath.pro index ac87623834..34109f0e75 100644 --- a/src/proto/filepath.pro +++ b/src/proto/filepath.pro @@ -1,4 +1,4 @@ -/* filepath.c */ +// filepath.c int modify_fname(char_u *src, int tilde_file, size_t *usedlen, char_u **fnamep, char_u **bufp, size_t *fnamelen); void shorten_dir(char_u *str); int file_is_readable(char_u *fname); @@ -63,4 +63,4 @@ void FreeWild(int count, char_u **files); int pathcmp(const char *p, const char *q, int maxlen); int vim_isAbsName(char_u *name); int vim_FullName(char_u *fname, char_u *buf, int len, int force); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/findfile.pro b/src/proto/findfile.pro index 628042c133..3ec212d287 100644 --- a/src/proto/findfile.pro +++ b/src/proto/findfile.pro @@ -1,4 +1,4 @@ -/* findfile.c */ +// findfile.c void *vim_findfile_init(char_u *path, char_u *filename, size_t filenamelen, char_u *stopdirs, int level, int free_visited, int find_what, void *search_ctx_arg, int tagfile, char_u *rel_fname); char_u *vim_findfile_stopdir(char_u *buf); void vim_findfile_cleanup(void *ctx); @@ -16,4 +16,4 @@ void uniquefy_paths(garray_T *gap, char_u *pattern, char_u *path_option); int expand_in_path(garray_T *gap, char_u *pattern, int flags); size_t simplify_filename(char_u *filename); void f_simplify(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/float.pro b/src/proto/float.pro index cceb157870..749de8521d 100644 --- a/src/proto/float.pro +++ b/src/proto/float.pro @@ -1,4 +1,4 @@ -/* float.c */ +// float.c int string2float(char_u *text, float_T *value, int skip_quotes); void f_abs(typval_T *argvars, typval_T *rettv); void f_acos(typval_T *argvars, typval_T *rettv); @@ -26,4 +26,4 @@ void f_str2float(typval_T *argvars, typval_T *rettv); void f_tan(typval_T *argvars, typval_T *rettv); void f_tanh(typval_T *argvars, typval_T *rettv); void f_trunc(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/fold.pro b/src/proto/fold.pro index 93d1dc5cb4..a7fed3634d 100644 --- a/src/proto/fold.pro +++ b/src/proto/fold.pro @@ -1,4 +1,4 @@ -/* fold.c */ +// fold.c void copyFoldingState(win_T *wp_from, win_T *wp_to); int hasAnyFolding(win_T *win); int hasFolding(linenr_T lnum, linenr_T *firstp, linenr_T *lastp); @@ -42,4 +42,4 @@ void f_foldclosedend(typval_T *argvars, typval_T *rettv); void f_foldlevel(typval_T *argvars, typval_T *rettv); void f_foldtext(typval_T *argvars, typval_T *rettv); void f_foldtextresult(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/fuzzy.pro b/src/proto/fuzzy.pro index dc78af52d1..240e2355ff 100644 --- a/src/proto/fuzzy.pro +++ b/src/proto/fuzzy.pro @@ -1,4 +1,4 @@ -/* fuzzy.c */ +// fuzzy.c int fuzzy_match(char_u *str, char_u *pat_arg, int matchseq, int *outScore, int_u *matches, int maxMatches); void f_matchfuzzy(typval_T *argvars, typval_T *rettv); void f_matchfuzzypos(typval_T *argvars, typval_T *rettv); @@ -8,4 +8,4 @@ int fuzzy_match_str_in_line(char_u **ptr, char_u *pat, int *len, pos_T *current_ int search_for_fuzzy_match(buf_T *buf, pos_T *pos, char_u *pattern, int dir, pos_T *start_pos, int *len, char_u **ptr, int *score); void fuzmatch_str_free(fuzmatch_str_T *fuzmatch, int count); int fuzzymatches_to_strmatches(fuzmatch_str_T *fuzmatch, char_u ***matches, int count, int funcsort); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gc.pro b/src/proto/gc.pro index 8c8f73f244..7893d32e72 100644 --- a/src/proto/gc.pro +++ b/src/proto/gc.pro @@ -1,4 +1,4 @@ -/* gc.c */ +// gc.c int get_copyID(void); int garbage_collect(int testing); int set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack, tuple_stack_T **tuple_stack); @@ -10,4 +10,4 @@ int set_ref_in_tuple_items(tuple_T *tuple, int copyID, ht_stack_T **ht_stack, li int set_ref_in_callback(callback_T *cb, int copyID); int set_ref_in_item_class(class_T *cl, int copyID, ht_stack_T **ht_stack, list_stack_T **list_stack, tuple_stack_T **tuple_stack); int set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack, list_stack_T **list_stack, tuple_stack_T **tuple_stack); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gen_prototypes.py b/src/proto/gen_prototypes.py index 0458b4f88a..72f756b0ec 100644 --- a/src/proto/gen_prototypes.py +++ b/src/proto/gen_prototypes.py @@ -459,10 +459,10 @@ def write_prototypes(out_path: Path, headers: List[str], src_name: str) -> None: out_path.parent.mkdir(parents=True, exist_ok=True) try: with out_path.open("w", encoding="utf-8", newline="\n") as f: - f.write(f"/* {src_name} */\n") + f.write(f"// {src_name}\n") for h in headers: f.write(h + "\n") - f.write("/* vim: set ft=c : */\n") + f.write("// vim: ft=c\n") except Exception as e: print(f"write failed: {e}", file=sys.stderr) sys.exit(4) diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro index cf5ef7fe02..daafc041e8 100644 --- a/src/proto/getchar.pro +++ b/src/proto/getchar.pro @@ -1,4 +1,4 @@ -/* getchar.c */ +// getchar.c char_u *get_recorded(void); string_T get_inserted(void); int stuff_empty(void); @@ -59,4 +59,4 @@ int input_available(void); void may_add_last_used_map_to_redobuff(void); int do_cmdkey_command(int key, int flags); void reset_last_used_map(mapblock_T *mp); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui.pro b/src/proto/gui.pro index 47613f5972..3e30dc6f02 100644 --- a/src/proto/gui.pro +++ b/src/proto/gui.pro @@ -1,4 +1,4 @@ -/* gui.c */ +// gui.c void gui_start(char_u *arg); void gui_prepare(int *argc, char **argv); int gui_init_check(void); @@ -65,4 +65,4 @@ int gui_do_findrepl(int flags, char_u *find_text, char_u *repl_text, int down); void gui_handle_drop(int x, int y, int_u modifiers, char_u **fnames, int count); int check_for_interrupt(int key, int modifiers_arg); int gui_dialog_log(char_u *title, char_u *message); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_beval.pro b/src/proto/gui_beval.pro index 4edb45c169..9faf0f5456 100644 --- a/src/proto/gui_beval.pro +++ b/src/proto/gui_beval.pro @@ -1,4 +1,4 @@ -/* gui_beval.c */ +// gui_beval.c BalloonEval *gui_mch_create_beval_area(void *target, char_u *mesg, void (*mesgCB)(BalloonEval *, int), void *clientData); void gui_mch_destroy_beval_area(BalloonEval *beval); void gui_mch_enable_beval_area(BalloonEval *beval); @@ -6,4 +6,4 @@ void gui_mch_disable_beval_area(BalloonEval *beval); BalloonEval *gui_mch_currently_showing_beval(void); void gui_mch_post_balloon(BalloonEval *beval, char_u *mesg); void gui_mch_unpost_balloon(BalloonEval *beval); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_gtk.pro b/src/proto/gui_gtk.pro index 9b69c69418..ea607da8e1 100644 --- a/src/proto/gui_gtk.pro +++ b/src/proto/gui_gtk.pro @@ -1,4 +1,4 @@ -/* gui_gtk.c */ +// gui_gtk.c void gui_gtk_register_stock_icons(void); void gui_mch_add_menu(vimmenu_T *menu, int idx); void gui_mch_add_menu_item(vimmenu_T *menu, int idx); @@ -22,4 +22,4 @@ void gui_mch_find_dialog(exarg_T *eap); void gui_mch_replace_dialog(exarg_T *eap); void ex_helpfind(exarg_T *eap); void gui_mch_set_fullscreen(int flag); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_gtk4.pro b/src/proto/gui_gtk4.pro index d4a9b52832..4f40ff57ef 100644 --- a/src/proto/gui_gtk4.pro +++ b/src/proto/gui_gtk4.pro @@ -1,4 +1,4 @@ -/* gui_gtk4.c */ +// gui_gtk4.c void gui_mch_prepare(int *argc, char **argv); void gui_mch_free_all(void); int gui_mch_is_blinking(void); @@ -111,4 +111,4 @@ void gui_mch_replace_dialog(exarg_T *eap); void ex_helpfind(exarg_T *eap); char_u *gui_gtk4_print_dialog(prt_settings_T *psettings, char_u *jobname, double *page_width, double *page_height); void gui_gtk4_print_finish(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_gtk_gresources.pro b/src/proto/gui_gtk_gresources.pro index 5a004134d8..8cc40788cf 100644 --- a/src/proto/gui_gtk_gresources.pro +++ b/src/proto/gui_gtk_gresources.pro @@ -1,5 +1,5 @@ -/* gui_gtk_gresources.c */ +// gui_gtk_gresources.c GResource *gui_gtk_get_resource(void); void gui_gtk_unregister_resource(void); void gui_gtk_register_resource(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_gtk_x11.pro b/src/proto/gui_gtk_x11.pro index 037bc02e36..476751ca1c 100644 --- a/src/proto/gui_gtk_x11.pro +++ b/src/proto/gui_gtk_x11.pro @@ -1,4 +1,4 @@ -/* gui_gtk_x11.c */ +// gui_gtk_x11.c void gui_mch_prepare(int *argc, char **argv); void gui_mch_free_all(void); int gui_mch_is_blinking(void); @@ -82,4 +82,4 @@ void mch_set_mouse_shape(int shape); void gui_mch_drawsign(int row, int col, int typenr); void *gui_mch_register_sign(char_u *signfile); void gui_mch_destroy_sign(void *sign); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_haiku.pro b/src/proto/gui_haiku.pro index 51ee93ad70..e98e04a17e 100644 --- a/src/proto/gui_haiku.pro +++ b/src/proto/gui_haiku.pro @@ -1,4 +1,4 @@ -/* gui_haiku.cc - hand crafted */ +// manually generated from gui_haiku.cc void gui_mch_prepare(int *argc, char **argv); int gui_mch_init(void); @@ -95,3 +95,4 @@ void gui_mch_set_tabline_pos(int x, int y, int w, int h); int gui_mch_showing_tabline(void); void gui_mch_update_tabline(void); void gui_mch_set_curtab(int nr); +// vim: ft=c diff --git a/src/proto/gui_motif.pro b/src/proto/gui_motif.pro index 400fa86099..f7a3a8d5f6 100644 --- a/src/proto/gui_motif.pro +++ b/src/proto/gui_motif.pro @@ -1,4 +1,4 @@ -/* gui_motif.c */ +// gui_motif.c void gui_x11_create_widgets(void); void gui_x11_destroy_widgets(void); void gui_mch_set_text_area_pos(int x, int y, int w, int h); @@ -43,4 +43,4 @@ void gui_motif_menu_fontlist(Widget id); void gui_mch_find_dialog(exarg_T *eap); void gui_mch_replace_dialog(exarg_T *eap); void gui_motif_synch_fonts(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_photon.pro b/src/proto/gui_photon.pro index 5fcc9ba8d8..dbafd29a43 100644 --- a/src/proto/gui_photon.pro +++ b/src/proto/gui_photon.pro @@ -1,4 +1,4 @@ -/* gui_photon.c */ +// gui_photon.c void gui_ph_encoding_changed(int new_encoding); void gui_mch_prepare(int *argc, char **argv); int gui_mch_init(void); @@ -69,4 +69,4 @@ GuiFont gui_mch_get_font(char_u *vim_font_name, int report_error); char_u *gui_mch_get_fontname(GuiFont font, char_u *name); void gui_mch_set_font(GuiFont font); void gui_mch_free_font(GuiFont font); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_w32.pro b/src/proto/gui_w32.pro index 0a1628df30..2a64c37798 100644 --- a/src/proto/gui_w32.pro +++ b/src/proto/gui_w32.pro @@ -1,4 +1,4 @@ -/* gui_w32.c */ +// gui_w32.c int gui_mch_set_rendering_options(char_u *s); int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); @@ -104,4 +104,4 @@ BalloonEval *gui_mch_create_beval_area(void *target, char_u *mesg, void (*mesgCB void gui_mch_destroy_beval_area(BalloonEval *beval); void netbeans_draw_multisign_indicator(int row); int test_gui_w32_sendevent(char_u *event, dict_T *args); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_x11.pro b/src/proto/gui_x11.pro index 6e8974e0c8..b2586520a9 100644 --- a/src/proto/gui_x11.pro +++ b/src/proto/gui_x11.pro @@ -1,4 +1,4 @@ -/* gui_x11.c */ +// gui_x11.c void gui_x11_key_hit_cb(Widget w, XtPointer dud, XEvent *event, Boolean *dum); void gui_mch_prepare(int *argc, char **argv); int gui_mch_init_check(void); @@ -69,4 +69,4 @@ void gui_mch_destroy_sign(void *sign); void gui_mch_mousehide(int hide); void mch_set_mouse_shape(int shape); void gui_mch_menu_set_tip(vimmenu_T *menu); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_xim.pro b/src/proto/gui_xim.pro index bac7321de9..9bfb1f3a5c 100644 --- a/src/proto/gui_xim.pro +++ b/src/proto/gui_xim.pro @@ -1,4 +1,4 @@ -/* gui_xim.c */ +// gui_xim.c char *did_set_imactivatefunc(optset_T *args); char *did_set_imstatusfunc(optset_T *args); void free_xim_stuff(void); @@ -18,4 +18,4 @@ int preedit_get_status(void); int im_is_preediting(void); void xim_set_status_area(void); int xim_get_status_area_height(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/gui_xmdlg.pro b/src/proto/gui_xmdlg.pro index 256fad78c9..937aabd21e 100644 --- a/src/proto/gui_xmdlg.pro +++ b/src/proto/gui_xmdlg.pro @@ -1,3 +1,3 @@ -/* gui_xmdlg.c */ +// gui_xmdlg.c char_u *gui_xm_select_font(char_u *current); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/hardcopy.pro b/src/proto/hardcopy.pro index 369aab398c..f03095d9f8 100644 --- a/src/proto/hardcopy.pro +++ b/src/proto/hardcopy.pro @@ -1,4 +1,4 @@ -/* hardcopy.c */ +// hardcopy.c char *parse_printoptions(optset_T *args); char *parse_printmbfont(optset_T *args); int prt_header_height(void); @@ -6,4 +6,4 @@ int prt_use_number(void); int prt_get_unit(int idx); void prt_message(char_u *s); void ex_hardcopy(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/hardcopy_pango.pro b/src/proto/hardcopy_pango.pro index 072faa55a9..7ed42dac6a 100644 --- a/src/proto/hardcopy_pango.pro +++ b/src/proto/hardcopy_pango.pro @@ -1,4 +1,4 @@ -/* hardcopy_pango.c */ +// hardcopy_pango.c int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); int mch_print_begin(prt_settings_T *psettings); void mch_print_end(prt_settings_T *psettings); @@ -11,4 +11,4 @@ void mch_print_set_font(int bold, int italic, int underline); void mch_print_set_bg(long_u bgcol); void mch_print_set_fg(long_u fgcol); void mch_print_cleanup(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/hardcopy_postscript.pro b/src/proto/hardcopy_postscript.pro index 70d7bb8649..f5db220343 100644 --- a/src/proto/hardcopy_postscript.pro +++ b/src/proto/hardcopy_postscript.pro @@ -1,4 +1,4 @@ -/* hardcopy_postscript.c */ +// hardcopy_postscript.c void mch_print_cleanup(void); int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit); int mch_print_begin(prt_settings_T *psettings); @@ -11,4 +11,4 @@ int mch_print_text_out(char_u *textp, int len); void mch_print_set_font(int iBold, int iItalic, int iUnderline); void mch_print_set_bg(long_u bgcol); void mch_print_set_fg(long_u fgcol); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/hashtab.pro b/src/proto/hashtab.pro index 320889edce..265419bf44 100644 --- a/src/proto/hashtab.pro +++ b/src/proto/hashtab.pro @@ -1,4 +1,4 @@ -/* hashtab.c */ +// hashtab.c void hash_init(hashtab_T *ht); int check_hashtab_frozen(hashtab_T *ht, char *command); void hash_clear(hashtab_T *ht); @@ -13,4 +13,4 @@ void hash_lock(hashtab_T *ht); void hash_lock_size(hashtab_T *ht, int size); void hash_unlock(hashtab_T *ht); hash_T hash_hash(char_u *key); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/help.pro b/src/proto/help.pro index d5fa8d6acb..cb4fa80372 100644 --- a/src/proto/help.pro +++ b/src/proto/help.pro @@ -1,4 +1,4 @@ -/* help.c */ +// help.c void ex_help(exarg_T *eap); void ex_helpclose(exarg_T *eap); char_u *check_help_lang(char_u *arg); @@ -10,4 +10,4 @@ void fix_help_buffer(void); void ex_exusage(exarg_T *eap); void ex_viusage(exarg_T *eap); void ex_helptags(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/highlight.pro b/src/proto/highlight.pro index 856ce86b37..7e7c2c279e 100644 --- a/src/proto/highlight.pro +++ b/src/proto/highlight.pro @@ -1,4 +1,4 @@ -/* highlight.c */ +// highlight.c int highlight_num_groups(void); char_u *highlight_group_name(int id); int highlight_link_id(int id); @@ -56,4 +56,4 @@ void pop_highlight_overrides(void); char *update_winhighlight(win_T *wp, char_u *opt); int hlf_get_id(win_T *wp, int hlf); char *update_wincolor(win_T *wp, char_u *opt); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_cscope.pro b/src/proto/if_cscope.pro index cfabc3cca8..8d88493b26 100644 --- a/src/proto/if_cscope.pro +++ b/src/proto/if_cscope.pro @@ -1,4 +1,4 @@ -/* if_cscope.c */ +// if_cscope.c char_u *get_cscope_name(expand_T *xp, int idx); void set_context_in_cscope_cmd(expand_T *xp, char_u *arg, cmdidx_T cmdidx); void ex_cscope(exarg_T *eap); @@ -9,4 +9,4 @@ void cs_free_tags(void); void cs_print_tags(void); void cs_end(void); void f_cscope_connection(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_lua.pro b/src/proto/if_lua.pro index 2e5da0c48f..17798308b2 100644 --- a/src/proto/if_lua.pro +++ b/src/proto/if_lua.pro @@ -1,4 +1,4 @@ -/* if_lua.c */ +// if_lua.c int lua_enabled(int verbose); void lua_end(void); void ex_lua(exarg_T *eap); @@ -9,4 +9,4 @@ void lua_window_free(win_T *o); void do_luaeval(char_u *str, typval_T *arg, typval_T *rettv); int set_ref_in_lua(int copyID); void update_package_paths_in_lua(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_mzsch.pro b/src/proto/if_mzsch.pro index 26ffa77c87..876047352c 100644 --- a/src/proto/if_mzsch.pro +++ b/src/proto/if_mzsch.pro @@ -1,4 +1,4 @@ -/* if_mzsch.c */ +// if_mzsch.c int mzscheme_enabled(int verbose); void mzvim_check_threads(void); char *did_set_mzquantum(optset_T *args); @@ -14,4 +14,4 @@ void raise_if_error(void); buf_T *get_valid_buffer(void *obj); win_T *get_valid_window(void *obj); int mzthreads_allowed(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_ole.pro b/src/proto/if_ole.pro index 375ccc0f31..431a4c3cd6 100644 --- a/src/proto/if_ole.pro +++ b/src/proto/if_ole.pro @@ -1,5 +1,6 @@ -/* manually generated from if_ole.cpp */ +// manually generated from if_ole.cpp void InitOLE(int* pbDoRestart); void UninitOLE(void); void RegisterMe(int silent); void UnregisterMe(int bNotifyUser); +// vim: ft=c diff --git a/src/proto/if_perl.pro b/src/proto/if_perl.pro index 64e421f135..518e4ebbef 100644 --- a/src/proto/if_perl.pro +++ b/src/proto/if_perl.pro @@ -1,4 +1,4 @@ -/* manually generated if_perl.c from if_perl.xs */ +// manually generated if_perl.c from if_perl.xs int perl_enabled(int verbose); void perl_end(void); void msg_split(char_u *s, int attr); @@ -7,3 +7,4 @@ void perl_buf_free(buf_T *bp); void ex_perl(exarg_T *eap); void do_perleval(char_u *str, typval_T *rettv); void ex_perldo(exarg_T *eap); +// vim: ft=c diff --git a/src/proto/if_python.pro b/src/proto/if_python.pro index 90d878a993..1585e27df6 100644 --- a/src/proto/if_python.pro +++ b/src/proto/if_python.pro @@ -1,4 +1,4 @@ -/* if_python.c */ +// if_python.c int python_enabled(int verbose); void python_end(void); int python_loaded(void); @@ -10,4 +10,4 @@ void python_window_free(win_T *win); void python_tabpage_free(tabpage_T *tab); void do_pyeval(char_u *str, dict_T *locals, typval_T *rettv); int set_ref_in_python(int copyID); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_python3.pro b/src/proto/if_python3.pro index 0487c57b68..498464c5a2 100644 --- a/src/proto/if_python3.pro +++ b/src/proto/if_python3.pro @@ -1,4 +1,4 @@ -/* if_python3.c */ +// if_python3.c int python3_enabled(int verbose); void python3_end(void); int python3_loaded(void); @@ -11,4 +11,4 @@ void python3_tabpage_free(tabpage_T *tab); void do_py3eval(char_u *str, dict_T *locals, typval_T *rettv); int set_ref_in_python3(int copyID); int python3_version(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_ruby.pro b/src/proto/if_ruby.pro index cc7c7e6c15..630cb80a9f 100644 --- a/src/proto/if_ruby.pro +++ b/src/proto/if_ruby.pro @@ -1,4 +1,4 @@ -/* if_ruby.c */ +// if_ruby.c int ruby_enabled(int verbose); void ruby_end(void); void ex_ruby(exarg_T *eap); @@ -8,4 +8,4 @@ void ruby_buffer_free(buf_T *buf); void ruby_window_free(win_T *win); void vim_ruby_init(void *stack_start); void do_rubyeval(char_u *str, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_tcl.pro b/src/proto/if_tcl.pro index b5f1cc2b71..b1c4e1bebc 100644 --- a/src/proto/if_tcl.pro +++ b/src/proto/if_tcl.pro @@ -1,4 +1,4 @@ -/* if_tcl.c */ +// if_tcl.c void vim_tcl_init(char *arg); int tcl_enabled(int verbose); void vim_tcl_finalize(void); @@ -8,4 +8,4 @@ void ex_tclfile(exarg_T *eap); void ex_tcldo(exarg_T *eap); void tcl_buffer_free(buf_T *buf); void tcl_window_free(win_T *win); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/if_xcmdsrv.pro b/src/proto/if_xcmdsrv.pro index d8ce00259b..e415df4b7e 100644 --- a/src/proto/if_xcmdsrv.pro +++ b/src/proto/if_xcmdsrv.pro @@ -1,4 +1,4 @@ -/* if_xcmdsrv.c */ +// if_xcmdsrv.c int serverRegisterName(Display *dpy, char_u *name); void serverChangeRegisteredWindow(Display *dpy, Window newwin); int serverSendToVim(Display *dpy, char_u *name, char_u *cmd, char_u **result, Window *server, Bool asExpr, int timeout, Bool localLoop, int silent); @@ -10,4 +10,4 @@ int serverPeekReply(Display *dpy, Window win, char_u **str); void serverEventProc(Display *dpy, XEvent *eventPtr, int immediate); void server_parse_messages(void); int server_waiting(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/indent.pro b/src/proto/indent.pro index f187ec5fc1..1a6f8f1d8b 100644 --- a/src/proto/indent.pro +++ b/src/proto/indent.pro @@ -1,4 +1,4 @@ -/* indent.c */ +// indent.c int tabstop_set(char_u *var, int **array); int tabstop_padding(colnr_T col, int ts_arg, int *vts); int tabstop_at(colnr_T col, int ts, int *vts, int left); @@ -35,4 +35,4 @@ int use_indentexpr_for_lisp(void); void fix_indent(void); void f_indent(typval_T *argvars, typval_T *rettv); void f_lispindent(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index 866a938817..afb05a41c4 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -1,4 +1,4 @@ -/* insexpand.c */ +// insexpand.c void ins_ctrl_x(void); int ctrl_x_mode_none(void); int ctrl_x_mode_normal(void); @@ -85,4 +85,4 @@ bool ins_compl_autocomplete_pending(void); long ins_compl_autocomplete_elapsed(void); void free_insexpand_stuff(void); void f_preinserted(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/job.pro b/src/proto/job.pro index f740bd23d3..425d0bce5c 100644 --- a/src/proto/job.pro +++ b/src/proto/job.pro @@ -1,4 +1,4 @@ -/* job.c */ +// job.c void clear_job_options(jobopt_T *opt); void free_job_options(jobopt_T *opt); int get_job_options(typval_T *tv, jobopt_T *opt, int supported, int supported2); @@ -34,4 +34,4 @@ void f_job_start(typval_T *argvars, typval_T *rettv); void f_job_status(typval_T *argvars, typval_T *rettv); void f_job_stop(typval_T *argvars, typval_T *rettv); char_u *job_to_string_buf(typval_T *varp, char_u *buf); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/json.pro b/src/proto/json.pro index f05c131452..36bab0b36e 100644 --- a/src/proto/json.pro +++ b/src/proto/json.pro @@ -1,4 +1,4 @@ -/* json.c */ +// json.c char_u *json_encode(typval_T *val, int options); char_u *json_encode_nr_expr(int nr, typval_T *val, int options); char_u *json_encode_lsp_msg(typval_T *val); @@ -8,4 +8,4 @@ void f_js_decode(typval_T *argvars, typval_T *rettv); void f_js_encode(typval_T *argvars, typval_T *rettv); void f_json_decode(typval_T *argvars, typval_T *rettv); void f_json_encode(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/kitty.pro b/src/proto/kitty.pro index 001e79c311..0db19cf1cc 100644 --- a/src/proto/kitty.pro +++ b/src/proto/kitty.pro @@ -1,6 +1,6 @@ -/* kitty.c */ +// kitty.c int kitty_transmit(image_rgb_T *img, int id); void kitty_place(int id, int row, int col, int src_x, int src_y, int w, int h, int z); void kitty_delete(int id, bool del_data); int kitty_probe_parse(char *buf, int n); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/linematch.pro b/src/proto/linematch.pro index 56d0037797..45975350f1 100644 --- a/src/proto/linematch.pro +++ b/src/proto/linematch.pro @@ -1,3 +1,3 @@ -/* linematch.c */ +// linematch.c size_t linematch_nbuffers(const mmfile_t **diff_blk, const int *diff_len, const size_t ndiffs, int **decisions, int iwhite); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/list.pro b/src/proto/list.pro index cb052030b2..f18e111d27 100644 --- a/src/proto/list.pro +++ b/src/proto/list.pro @@ -1,4 +1,4 @@ -/* list.c */ +// list.c void list_add_watch(list_T *l, listwatch_T *lw); void list_rem_watch(list_T *l, listwatch_T *lwrem); list_T *list_alloc(void); @@ -68,4 +68,4 @@ void f_remove(typval_T *argvars, typval_T *rettv); void f_reverse(typval_T *argvars, typval_T *rettv); void f_reduce(typval_T *argvars, typval_T *rettv); void f_slice(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/locale.pro b/src/proto/locale.pro index 151e68a1b9..90ac514679 100644 --- a/src/proto/locale.pro +++ b/src/proto/locale.pro @@ -1,4 +1,4 @@ -/* locale.c */ +// locale.c char_u *get_mess_lang(void); void set_lang_var(void); void init_locale(void); @@ -6,4 +6,4 @@ void ex_language(exarg_T *eap); void free_locales(void); char_u *get_lang_arg(expand_T *xp, int idx); char_u *get_locales(expand_T *xp, int idx); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/logfile.pro b/src/proto/logfile.pro index 1c4334ea48..5112a606e2 100644 --- a/src/proto/logfile.pro +++ b/src/proto/logfile.pro @@ -1,7 +1,7 @@ -/* logfile.c */ +// logfile.c void ch_logfile(char_u *fname, char_u *opt); int ch_log_active(void); void ch_log_literal(char *lead, channel_T *ch, ch_part_T part, char_u *buf, int len); void f_ch_log(typval_T *argvars, typval_T *rettv); void f_ch_logfile(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/main.pro b/src/proto/main.pro index 025a9994f8..076dfd8f03 100644 --- a/src/proto/main.pro +++ b/src/proto/main.pro @@ -1,4 +1,4 @@ -/* main.c */ +// main.c int vim_main2(void); void common_init_1(void); void common_init_2(mparm_T *paramp); @@ -18,4 +18,4 @@ void getout_preserve_modified(int exitval); void getout(int exitval); int process_env(char_u *env, int is_viminit); void mainerr_arg_missing(char_u *str); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/map.pro b/src/proto/map.pro index 5f736f5047..d55b653d32 100644 --- a/src/proto/map.pro +++ b/src/proto/map.pro @@ -1,4 +1,4 @@ -/* map.c */ +// map.c mapblock_T *get_maphash_list(int state, int c); mapblock_T *get_buf_maphash_list(int state, int c); int is_maphash_valid(void); @@ -32,4 +32,4 @@ void ex_map(exarg_T *eap); void ex_unmap(exarg_T *eap); void ex_mapclear(exarg_T *eap); void ex_abclear(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/mark.pro b/src/proto/mark.pro index ce83fa0b1c..a6bf0730d3 100644 --- a/src/proto/mark.pro +++ b/src/proto/mark.pro @@ -1,4 +1,4 @@ -/* mark.c */ +// mark.c int setmark(int c); int setmark_pos(int c, pos_T *pos, int fnum); void mark_forget_file(win_T *wp, int fnum); @@ -29,4 +29,4 @@ void set_last_cursor(win_T *win); void free_all_marks(void); xfmark_T *get_namedfm(void); void f_getmarklist(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/match.pro b/src/proto/match.pro index f96a4e6425..381604dd9b 100644 --- a/src/proto/match.pro +++ b/src/proto/match.pro @@ -1,4 +1,4 @@ -/* match.c */ +// match.c void clear_matches(win_T *wp); void init_search_hl(win_T *wp, match_T *search_hl); void prepare_search_hl(win_T *wp, match_T *search_hl, linenr_T lnum); @@ -14,4 +14,4 @@ void f_matchaddpos(typval_T *argvars, typval_T *rettv); void f_matcharg(typval_T *argvars, typval_T *rettv); void f_matchdelete(typval_T *argvars, typval_T *rettv); void ex_match(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/mbyte.pro b/src/proto/mbyte.pro index b0309dd009..7450fb08fe 100644 --- a/src/proto/mbyte.pro +++ b/src/proto/mbyte.pro @@ -1,4 +1,4 @@ -/* mbyte.c */ +// mbyte.c int enc_canon_props(char_u *name); char *mb_init(void); int bomb_size(void); @@ -92,4 +92,4 @@ void f_setcellwidths(typval_T *argvars, typval_T *rettv); void f_getcellwidths(typval_T *argvars, typval_T *rettv); void f_charclass(typval_T *argvars, typval_T *rettv); char_u *get_encoding_name(expand_T *xp, int idx); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/memfile.pro b/src/proto/memfile.pro index 4662194a70..23f0b73b97 100644 --- a/src/proto/memfile.pro +++ b/src/proto/memfile.pro @@ -1,4 +1,4 @@ -/* memfile.c */ +// memfile.c memfile_T *mf_open(char_u *fname, int flags); int mf_open_file(memfile_T *mfp, char_u *fname); void mf_close(memfile_T *mfp, int del_file); @@ -15,4 +15,4 @@ blocknr_T mf_trans_del(memfile_T *mfp, blocknr_T old_nr); void mf_set_ffname(memfile_T *mfp); void mf_fullname(memfile_T *mfp); int mf_need_trans(memfile_T *mfp); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/memline.pro b/src/proto/memline.pro index 238bceafbb..8edda57dad 100644 --- a/src/proto/memline.pro +++ b/src/proto/memline.pro @@ -1,4 +1,4 @@ -/* memline.c */ +// memline.c int ml_open(buf_T *buf); void ml_set_crypt_key(buf_T *buf, char_u *old_key, char_u *old_cm); void ml_setname(buf_T *buf); @@ -44,4 +44,4 @@ char_u *ml_encrypt_data(memfile_T *mfp, char_u *data, off_T offset, unsigned siz void ml_decrypt_data(memfile_T *mfp, char_u *data, off_T offset, unsigned size); long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp); void goto_byte(long cnt); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/menu.pro b/src/proto/menu.pro index b95f5316de..401c12d8a1 100644 --- a/src/proto/menu.pro +++ b/src/proto/menu.pro @@ -1,4 +1,4 @@ -/* menu.c */ +// menu.c int winbar_height(win_T *wp); void ex_menu(exarg_T *eap); void remove_winbar(win_T *wp); @@ -24,4 +24,4 @@ void winbar_click(win_T *wp, int col); vimmenu_T *gui_find_menu(char_u *path_name); void ex_menutranslate(exarg_T *eap); void f_menu_info(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/message.pro b/src/proto/message.pro index 29519a2af6..9e214a9f7d 100644 --- a/src/proto/message.pro +++ b/src/proto/message.pro @@ -1,4 +1,4 @@ -/* message.c */ +// message.c int msg(char *s); int verb_msg(char *s); int msg_attr(char *s, int attr); @@ -79,4 +79,4 @@ int do_dialog(int type, char_u *title, char_u *message, char_u *buttons, int dfl int vim_dialog_yesno(int type, char_u *title, char_u *message, int dflt); int vim_dialog_yesnocancel(int type, char_u *title, char_u *message, int dflt); int vim_dialog_yesnoallcancel(int type, char_u *title, char_u *message, int dflt); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro index 706629490d..17bcf49925 100644 --- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -1,4 +1,4 @@ -/* misc1.c */ +// misc1.c int get_leader_len(char_u *line, char_u **flags, int backward, int include_space); int get_last_leader_offset(char_u *line, char_u **flags); int plines(linenr_T lnum); @@ -56,4 +56,4 @@ void restore_v_event(dict_T *v_event, save_v_event_T *sve); void may_trigger_modechanged(void); int vim_append_digit_long(long *value, int digit); int trim_to_int(vimlong_T x); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro index 95a5a8fd40..848a67cee2 100644 --- a/src/proto/misc2.pro +++ b/src/proto/misc2.pro @@ -1,4 +1,4 @@ -/* misc2.c */ +// misc2.c int virtual_active(void); int getviscol(void); int coladvance_force(colnr_T wcol); @@ -69,4 +69,4 @@ void *mergesort_list(void *head, void *(*get_next)(void *), void (*set_next)(voi long base64_encode_buf(char_u *dst, const char_u *src, size_t len); char_u *base64_encode(const char_u *data, size_t len); int base64_decode(const char_u *data, size_t len, garray_T *out); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/mouse.pro b/src/proto/mouse.pro index 0c320769ba..5276ba40cf 100644 --- a/src/proto/mouse.pro +++ b/src/proto/mouse.pro @@ -1,4 +1,4 @@ -/* mouse.c */ +// mouse.c void mouse_set_vert_scroll_step(long step); void mouse_set_hor_scroll_step(long step); int do_mouse(oparg_T *oap, int c, int dir, long count, int fixindent); @@ -24,4 +24,4 @@ int mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump, int *pline win_T *mouse_find_win(int *rowp, int *colp, mouse_find_T popup); int vcol2col(win_T *wp, linenr_T lnum, int vcol, colnr_T *coladdp); void f_getmousepos(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/move.pro b/src/proto/move.pro index 489e850108..0dc7e2e6ed 100644 --- a/src/proto/move.pro +++ b/src/proto/move.pro @@ -1,4 +1,4 @@ -/* move.c */ +// move.c int plines_correct_topline(win_T *wp, linenr_T lnum, int limit_winheight); void set_valid_virtcol(win_T *wp, colnr_T vcol); int sms_marker_overlap(win_T *wp, int extra2); @@ -51,4 +51,4 @@ void scroll_cursor_halfway(int atend, int prefer_above); void cursor_correct(void); int pagescroll(int dir, long count, int half); void do_check_cursorbind(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/netbeans.pro b/src/proto/netbeans.pro index 869e9663c5..b7a3947a08 100644 --- a/src/proto/netbeans.pro +++ b/src/proto/netbeans.pro @@ -1,4 +1,4 @@ -/* netbeans.c */ +// netbeans.c void netbeans_parse_messages(void); int isNetbeansBuffer(buf_T *bufp); int isNetbeansModified(buf_T *bufp); @@ -25,4 +25,4 @@ void netbeans_deleted_all_lines(buf_T *bufp); int netbeans_is_guarded(linenr_T top, linenr_T bot); void netbeans_draw_multisign_indicator(int row); void netbeans_gutter_click(linenr_T lnum); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/normal.pro b/src/proto/normal.pro index 6f45b1a3ad..4696ba2dfc 100644 --- a/src/proto/normal.pro +++ b/src/proto/normal.pro @@ -1,4 +1,4 @@ -/* normal.c */ +// normal.c int check_text_or_curbuf_locked(oparg_T *oap); void normal_cmd(oparg_T *oap, int toplevel); void check_visual_highlight(void); @@ -34,4 +34,4 @@ void nv_g_home_m_cmd(cmdarg_T *cap); int unadjust_for_sel(void); int unadjust_for_sel_inner(pos_T *pp); void set_cursor_for_append_to_line(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ops.pro b/src/proto/ops.pro index 49c7f04691..681ef49d2b 100644 --- a/src/proto/ops.pro +++ b/src/proto/ops.pro @@ -1,4 +1,4 @@ -/* ops.c */ +// ops.c int get_op_type(int char1, int char2); int op_is_change(int op); int get_op_char(int optype); @@ -24,4 +24,4 @@ char *did_set_operatorfunc(optset_T *args); void free_operatorfunc_option(void); int set_ref_in_opfunc(int copyID); void do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/option.pro b/src/proto/option.pro index c6945d80fe..dbb77d4d21 100644 --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -1,4 +1,4 @@ -/* option.c */ +// option.c void set_init_1(int clean_arg); void set_fencs_unicode(void); void set_string_default(char *name, char_u *val); @@ -157,4 +157,4 @@ int fill_culopt_flags(char_u *val, win_T *wp); int magic_isset(void); int option_set_callback_func(char_u *optval, callback_T *optcb); char *did_set_showtabpanel(optset_T *args); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/optionstr.pro b/src/proto/optionstr.pro index c8a8b12ff5..6c1a56313f 100644 --- a/src/proto/optionstr.pro +++ b/src/proto/optionstr.pro @@ -1,4 +1,4 @@ -/* optionstr.c */ +// optionstr.c void didset_string_options(void); void trigger_optionset_string(int opt_idx, int opt_flags, char_u *oldval, char_u *oldval_l, char_u *oldval_g, char_u *newval); void check_buf_options(buf_T *buf); @@ -220,4 +220,4 @@ int check_ff_value(char_u *p); void save_clear_shm_value(void); void restore_shm_value(void); void export_myvimdir(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_amiga.pro b/src/proto/os_amiga.pro index 514b258019..8651dd696e 100644 --- a/src/proto/os_amiga.pro +++ b/src/proto/os_amiga.pro @@ -1,4 +1,4 @@ -/* os_amiga.c */ +// os_amiga.c void win_resize_on(void); void win_resize_off(void); void mch_write(char_u *p, int len); @@ -43,4 +43,4 @@ int mch_has_wildcard(char_u *p); char_u *mch_getenv(char_u *var); int mch_setenv(char *var, char *value, int x); int mch_get_random(char_u *buf, int len); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_mac_conv.pro b/src/proto/os_mac_conv.pro index e86e40870b..7275a531bb 100644 --- a/src/proto/os_mac_conv.pro +++ b/src/proto/os_mac_conv.pro @@ -1,4 +1,4 @@ -/* os_mac_conv.c */ +// os_mac_conv.c char_u *mac_string_convert(char_u *ptr, int len, int *lenp, int fail_on_error, int from_enc, int to_enc, int *unconvlenp); int macroman2enc(char_u *ptr, long *sizep, long real_size); int enc2macroman(char_u *from, size_t fromlen, char_u *to, int *tolenp, int maxtolen, char_u *rest, int *restlenp); @@ -9,4 +9,4 @@ unsigned short *mac_enc_to_utf16(char_u *from, size_t fromLen, size_t *actualLen void *mac_enc_to_cfstring(char_u *from, size_t fromLen); char_u *mac_precompose_path(char_u *decompPath, size_t decompLen, size_t *precompLen); void mac_lang_init(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_macosx.pro b/src/proto/os_macosx.pro index 4a83a0b598..cf4c05a966 100644 --- a/src/proto/os_macosx.pro +++ b/src/proto/os_macosx.pro @@ -1,7 +1,7 @@ -/* manually generated from os_macosx.m */ +// manually generated from os_macosx.m void process_cfrunloop(void); bool sound_mch_play(const char_u* event, long sound_id, soundcb_T *callback, bool playfile); void sound_mch_stop(long sound_id); void sound_mch_clear(void); void sound_mch_free(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro index 32b4aff009..2d666f2660 100644 --- a/src/proto/os_mswin.pro +++ b/src/proto/os_mswin.pro @@ -1,4 +1,4 @@ -/* os_mswin.c */ +// os_mswin.c void SaveInst(HINSTANCE hInst); void mch_exit_g(int r); void mch_early_init(void); @@ -60,4 +60,4 @@ void gui_mch_expand_font(optexpand_T *args, void *param, int (*add_match)(char_u UINT WINAPI vimGetDpiForSystem(void); int get_logfont(LOGFONTW *lf, char_u *name, HDC printer_dc, int verbose); void channel_init_winsock(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_qnx.pro b/src/proto/os_qnx.pro index c752a16463..298944ffaf 100644 --- a/src/proto/os_qnx.pro +++ b/src/proto/os_qnx.pro @@ -1,8 +1,8 @@ -/* os_qnx.c */ +// os_qnx.c void qnx_init(void); void qnx_clip_init(void); int clip_mch_own_selection(Clipboard_T *cbd); void clip_mch_lose_selection(Clipboard_T *cbd); void clip_mch_request_selection(Clipboard_T *cbd); void clip_mch_set_selection(Clipboard_T *cbd); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_unix.pro b/src/proto/os_unix.pro index 69e620b981..b9afdfea51 100644 --- a/src/proto/os_unix.pro +++ b/src/proto/os_unix.pro @@ -1,4 +1,4 @@ -/* os_unix.c */ +// os_unix.c sighandler_T mch_signal(int sig, sighandler_T func); int mch_chdir(char *path); void mch_write(char_u *s, int len); @@ -95,4 +95,4 @@ void xsmp_close(void); void stop_timeout(void); volatile sig_atomic_t *start_timeout(long msec); void delete_timer(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_vms.pro b/src/proto/os_vms.pro index b58118d88e..5433cdf2ad 100644 --- a/src/proto/os_vms.pro +++ b/src/proto/os_vms.pro @@ -1,4 +1,4 @@ -/* os_vms.c */ +// os_vms.c void mch_settmode(tmode_T tmode); int mch_get_shellsize(void); void mch_set_shellsize(void); @@ -13,4 +13,4 @@ int mch_expandpath(garray_T *gap, char_u *path, int flags); void *vms_fixfilename(void *instring); void vms_remove_version(void *fname); int RealWaitForChar(int fd, long msec, int *check_for_gpm, int *interrupted); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro index 4850ea02fe..cc9d3089f0 100644 --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -1,4 +1,4 @@ -/* os_win32.c */ +// os_win32.c void mch_get_exe_name(void); HINSTANCE vimLoadLib(const char *name); int mch_is_gui_executable(void); @@ -92,4 +92,4 @@ void resize_console_buf(void); char *GetWin32Error(void); void stop_timeout(void); volatile sig_atomic_t *start_timeout(long msec); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/popupmenu.pro b/src/proto/popupmenu.pro index f7a00511cf..d547933100 100644 --- a/src/proto/popupmenu.pro +++ b/src/proto/popupmenu.pro @@ -1,4 +1,4 @@ -/* popupmenu.c */ +// popupmenu.c void pum_set_border(int enable); void pum_set_shadow(int enable); void pum_set_margin(int enable); @@ -23,4 +23,4 @@ void pum_show_popupmenu(vimmenu_T *menu); void pum_make_popup(char_u *path_name, int use_mouse_pos); void pum_set_border_chars(int top, int right, int bottom, int left, int top_left, int top_right, int bottom_right, int bottom_left); void put_shadow_char(int row, int col); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro index d61727d1ac..9bed013a5d 100644 --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -1,4 +1,4 @@ -/* popupwin.c */ +// popupwin.c int popup_on_border(win_T *wp, int row, int col); int popup_close_if_on_X(win_T *wp, int row, int col); void popup_start_drag(win_T *wp, int row, int col); @@ -86,4 +86,4 @@ void end_echowindow(void); int popup_win_closed(win_T *win); void popup_set_title(win_T *wp); void popup_update_preview_title(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/profiler.pro b/src/proto/profiler.pro index a7d065edb2..742602b8aa 100644 --- a/src/proto/profiler.pro +++ b/src/proto/profiler.pro @@ -1,4 +1,4 @@ -/* profiler.c */ +// profiler.c void profile_start(proftime_T *tm); void profile_end(proftime_T *tm); void profile_sub(proftime_T *tm, proftime_T *tm2); @@ -32,4 +32,4 @@ void profile_dump(void); void script_line_start(void); void script_line_exec(void); void script_line_end(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/pty.pro b/src/proto/pty.pro index 52e20ef674..e4d99f9cb0 100644 --- a/src/proto/pty.pro +++ b/src/proto/pty.pro @@ -1,5 +1,5 @@ -/* pty.c */ +// pty.c int setup_slavepty(int fd); int mch_openpty(char **ttyn); int mch_isatty(int fd); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/quickfix.pro b/src/proto/quickfix.pro index 6cd7cfcc04..884d083993 100644 --- a/src/proto/quickfix.pro +++ b/src/proto/quickfix.pro @@ -1,4 +1,4 @@ -/* quickfix.c */ +// quickfix.c int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title, char_u *enc); int qf_stack_get_bufnr(void); void qf_free_all(win_T *wp); @@ -43,4 +43,4 @@ void f_getloclist(typval_T *argvars, typval_T *rettv); void f_getqflist(typval_T *argvars, typval_T *rettv); void f_setloclist(typval_T *argvars, typval_T *rettv); void f_setqflist(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/regexp.pro b/src/proto/regexp.pro index ffd5a07783..de9d22b93f 100644 --- a/src/proto/regexp.pro +++ b/src/proto/regexp.pro @@ -1,4 +1,4 @@ -/* regexp.c */ +// regexp.c void init_regexp_timeout(long msec); void disable_regexp_timeout(void); void save_timeout_for_debugging(void); @@ -24,4 +24,4 @@ int vim_regexec_prog(regprog_T **prog, int ignore_case, char_u *line, colnr_T co int vim_regexec(regmatch_T *rmp, char_u *line, colnr_T col); int vim_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col); long vim_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, int *timed_out); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/register.pro b/src/proto/register.pro index d9f166994f..3c22ccceb2 100644 --- a/src/proto/register.pro +++ b/src/proto/register.pro @@ -1,4 +1,4 @@ -/* register.c */ +// register.c yankreg_T *get_y_regs(void); yankreg_T *get_y_register(int reg); yankreg_T *get_y_current(void); @@ -39,4 +39,4 @@ void write_reg_contents(int name, char_u *str, int maxlen, int must_append); void write_reg_contents_lst(int name, char_u **strings, int maxlen, int must_append, int yank_type, long block_len); void write_reg_contents_ex(int name, char_u *str, int maxlen, int must_append, int yank_type, long block_len); void str_to_reg(yankreg_T *y_ptr, int yank_type, char_u *str, long len, long blocklen, int str_list); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/screen.pro b/src/proto/screen.pro index 4a10729e21..9eabeff64b 100644 --- a/src/proto/screen.pro +++ b/src/proto/screen.pro @@ -1,4 +1,4 @@ -/* screen.c */ +// screen.c int conceal_cursor_line(win_T *wp); void conceal_check_cursor_line(int was_concealed); int get_win_attr(win_T *wp); @@ -61,4 +61,4 @@ char *set_listchars_option(win_T *wp, char_u *val, int apply, char *errbuf, size char_u *get_fillchars_name(expand_T *xp, int idx); char_u *get_listchars_name(expand_T *xp, int idx); char *check_chars_options(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/scriptfile.pro b/src/proto/scriptfile.pro index e81d16b976..a85933bd4e 100644 --- a/src/proto/scriptfile.pro +++ b/src/proto/scriptfile.pro @@ -1,4 +1,4 @@ -/* scriptfile.c */ +// scriptfile.c void estack_init(void); estack_T *estack_push(etype_T type, char_u *name, long lnum); estack_T *estack_push_ufunc(ufunc_T *ufunc, long lnum); @@ -50,4 +50,4 @@ char_u *get_autoload_prefix(scriptitem_T *si); char_u *may_prefix_autoload(char_u *name); char_u *autoload_name(char_u *name); int script_autoload(char_u *name, int reload); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/search.pro b/src/proto/search.pro index 8830c86466..7e39986191 100644 --- a/src/proto/search.pro +++ b/src/proto/search.pro @@ -1,4 +1,4 @@ -/* search.c */ +// search.c int search_regcomp(char_u *pat, size_t patlen, char_u **used_pat, int pat_save, int pat_use, int options, regmmatch_T *regmatch); char_u *get_search_pat(void); void save_re_pat(int idx, char_u *pat, size_t patlen, int magic); @@ -37,4 +37,4 @@ void find_pattern_in_path(char_u *ptr, int dir, int len, int whole, int skip_com spat_T *get_spat(int idx); int get_spat_last_idx(void); void f_searchcount(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/session.pro b/src/proto/session.pro index 3c5ee2cbf1..4c509e63fc 100644 --- a/src/proto/session.pro +++ b/src/proto/session.pro @@ -1,8 +1,8 @@ -/* session.c */ +// session.c void ex_loadview(exarg_T *eap); int write_session_file(char_u *filename); void ex_mkrc(exarg_T *eap); var_flavour_T var_flavour(char_u *varname); int put_eol(FILE *fd); int put_line(FILE *fd, char *s); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/sha256.pro b/src/proto/sha256.pro index 157fa73c8c..a67c444437 100644 --- a/src/proto/sha256.pro +++ b/src/proto/sha256.pro @@ -1,4 +1,4 @@ -/* sha256.c */ +// sha256.c void sha256_start(context_sha256_T *ctx); void sha256_update(context_sha256_T *ctx, char_u *input, UINT32_T length); void sha256_finish(context_sha256_T *ctx, char_u digest[32]); @@ -6,4 +6,4 @@ char_u *sha256_bytes(char_u *buf, int buf_len, char_u *salt, int salt_len); char_u *sha256_key(char_u *buf, char_u *salt, int salt_len); int sha256_self_test(void); void sha2_seed(char_u *header, int header_len, char_u *salt, int salt_len); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/sign.pro b/src/proto/sign.pro index 1cca0a6963..8a45d659dc 100644 --- a/src/proto/sign.pro +++ b/src/proto/sign.pro @@ -1,4 +1,4 @@ -/* sign.c */ +// sign.c void init_signs(void); int buf_get_signattrs(win_T *wp, linenr_T lnum, sign_attrs_T *sattr); linenr_T buf_delsign(buf_T *buf, linenr_T atlnum, int id, char_u *group); @@ -30,4 +30,4 @@ sign_entry_T *get_first_valid_sign(win_T *wp); int signcolumn_on(win_T *wp); void f_sign_unplace(typval_T *argvars, typval_T *rettv); void f_sign_unplacelist(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/sixel.pro b/src/proto/sixel.pro index 71947ffaf5..39dc00ef92 100644 --- a/src/proto/sixel.pro +++ b/src/proto/sixel.pro @@ -1,5 +1,5 @@ -/* sixel.c */ +// sixel.c char_u *sixel_resize_rgb(char_u *src, int sw, int sh, int dw, int dh); char_u *sixel_encode(image_rgb_T *img); void sixel_free_all(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/socketserver.pro b/src/proto/socketserver.pro index c1cb3d9a10..c5f6afb814 100644 --- a/src/proto/socketserver.pro +++ b/src/proto/socketserver.pro @@ -1,4 +1,4 @@ -/* socketserver.c */ +// socketserver.c int socketserver_start(char_u *name, bool quiet); void socketserver_stop(void); list_T *socketserver_list(void); @@ -8,4 +8,4 @@ int socketserver_send(char_u *name, char_u *str, char_u **result, bool is_expr, int socketserver_send_reply(char_u *client, char_u *str); int socketserver_read_reply(char_u *client, char_u **str, int timeout, bool remotewait); int socketserver_peek_reply(char_u *sender, char_u **str); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/sound.pro b/src/proto/sound.pro index 68c1fde77c..82d67ab8c5 100644 --- a/src/proto/sound.pro +++ b/src/proto/sound.pro @@ -1,4 +1,4 @@ -/* sound.c */ +// sound.c int has_any_sound_callback(void); void call_sound_callback(soundcb_T *soundcb, long snd_id, int result); void delete_sound_callback(soundcb_T *soundcb); @@ -9,4 +9,4 @@ void f_sound_playfile(typval_T *argvars, typval_T *rettv); void f_sound_stop(typval_T *argvars, typval_T *rettv); void f_sound_clear(typval_T *argvars, typval_T *rettv); void sound_free(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/spell.pro b/src/proto/spell.pro index a7e547bf40..a7c8490013 100644 --- a/src/proto/spell.pro +++ b/src/proto/spell.pro @@ -1,4 +1,4 @@ -/* spell.c */ +// spell.c int spell_check(win_T *wp, char_u *ptr, hlf_T *attrp, int *capcol, int docount); int match_checkcompoundpattern(char_u *ptr, int wlen, garray_T *gap); int can_compound(slang_T *slang, char_u *word, char_u *flags); @@ -48,4 +48,4 @@ int valid_spelllang(char_u *val); int valid_spellfile(char_u *val); char *did_set_spell_option(void); char *compile_cap_prog(synblock_T *synblock); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/spellfile.pro b/src/proto/spellfile.pro index 552582afeb..f6265421a6 100644 --- a/src/proto/spellfile.pro +++ b/src/proto/spellfile.pro @@ -1,4 +1,4 @@ -/* spellfile.c */ +// spellfile.c slang_T *spell_load_file(char_u *fname, char_u *lang, slang_T *old_lp, int silent); void suggest_load_files(void); int spell_check_msm(void); @@ -6,4 +6,4 @@ void ex_mkspell(exarg_T *eap); void mkspell(int fcount, char_u **fnames, int ascii, int over_write, int added_word); void ex_spell(exarg_T *eap); void spell_add_word(char_u *word, int len, int what, int idx, int undo); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/spellsuggest.pro b/src/proto/spellsuggest.pro index 745d407764..c80309c392 100644 --- a/src/proto/spellsuggest.pro +++ b/src/proto/spellsuggest.pro @@ -1,5 +1,5 @@ -/* spellsuggest.c */ +// spellsuggest.c int spell_check_sps(void); void spell_suggest(int count); void spell_suggest_list(garray_T *gap, char_u *word, int maxcount, int need_cap, int interactive); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/strings.pro b/src/proto/strings.pro index aeb2e641e3..188d096892 100644 --- a/src/proto/strings.pro +++ b/src/proto/strings.pro @@ -1,4 +1,4 @@ -/* strings.c */ +// strings.c char_u *vim_strsave(char_u *string); char_u *vim_strnsave(char_u *string, size_t len); char_u *vim_strsave_escaped(char_u *string, char_u *esc_chars); @@ -54,4 +54,4 @@ void f_tr(typval_T *argvars, typval_T *rettv); void f_trim(typval_T *argvars, typval_T *rettv); void f_uridecode(typval_T *argvars, typval_T *rettv); void f_uriencode(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro index c51da7ab87..0259a0d39a 100644 --- a/src/proto/syntax.pro +++ b/src/proto/syntax.pro @@ -1,4 +1,4 @@ -/* syntax.c */ +// syntax.c void syntax_start(win_T *wp, linenr_T lnum); void syn_stack_free_all(synblock_T *block); void syn_stack_apply_changes(buf_T *buf); @@ -21,4 +21,4 @@ int syn_get_stack_item(int i); int syn_get_foldlevel(win_T *wp, long lnum); void ex_syntime(exarg_T *eap); char_u *get_syntime_arg(expand_T *xp, int idx); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/tabpanel.pro b/src/proto/tabpanel.pro index 42f4dd8b66..8b253fc938 100644 --- a/src/proto/tabpanel.pro +++ b/src/proto/tabpanel.pro @@ -1,4 +1,4 @@ -/* tabpanel.c */ +// tabpanel.c int tabpanelopt_changed(void); void tabpanel_forget_tabpage(const tabpage_T *tp); int tabpanel_width(void); @@ -12,4 +12,4 @@ bool tabpanel_scroll(int dir, int count); bool tabpanel_set_offset(int offset); void f_tabpanel_getinfo(typval_T *argvars, typval_T *rettv); void f_tabpanel_scroll(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/tag.pro b/src/proto/tag.pro index 4ab2e00db6..085182c289 100644 --- a/src/proto/tag.pro +++ b/src/proto/tag.pro @@ -1,4 +1,4 @@ -/* tag.c */ +// tag.c char *did_set_tagfunc(optset_T *args); void free_tagfunc_option(void); int set_ref_in_tagfunc(int copyID); @@ -15,4 +15,4 @@ int expand_tags(int tagnames, char_u *pat, int *num_file, char_u ***file); int get_tags(list_T *list, char_u *pat, char_u *buf_fname); void get_tagstack(win_T *wp, dict_T *retdict); int set_tagstack(win_T *wp, dict_T *d, int action); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/term.pro b/src/proto/term.pro index 1e453f09c5..a76cf57fd9 100644 --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -1,4 +1,4 @@ -/* term.c */ +// term.c guicolor_T termgui_get_color(char_u *name); guicolor_T termgui_mch_get_rgb(guicolor_T color); void init_term_props(int all); @@ -100,4 +100,4 @@ void term_disable_dec(void); void term_set_win_resize(bool state); int sync_output_active(void); void term_set_sync_output(int flags); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro index 6429ffadd5..7363fcfdf2 100644 --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -1,4 +1,4 @@ -/* terminal.c */ +// terminal.c void init_job_options(jobopt_T *opt); buf_T *term_start(typval_T *argvar, char **argv, jobopt_T *opt, int flags); void ex_terminal(exarg_T *eap); @@ -74,4 +74,4 @@ void term_send_eof(channel_T *ch); job_T *term_getjob(term_T *term); int use_conpty(void); int terminal_enabled(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/termlib.pro b/src/proto/termlib.pro index 3dd120f183..4a7d918872 100644 --- a/src/proto/termlib.pro +++ b/src/proto/termlib.pro @@ -1,8 +1,8 @@ -/* termlib.c */ +// termlib.c int tgetent(char *tbuf, char *term); int tgetflag(char *id); int tgetnum(char *id); char *tgetstr(char *id, char **buf); char *tgoto(char *cm, int col, int line); int tputs(char *cp, int affcnt, void (*outc)(unsigned int)); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/testing.pro b/src/proto/testing.pro index 1c93f8cddf..1495cf6cf3 100644 --- a/src/proto/testing.pro +++ b/src/proto/testing.pro @@ -1,4 +1,4 @@ -/* testing.c */ +// testing.c void f_assert_beeps(typval_T *argvars, typval_T *rettv); void f_assert_nobeep(typval_T *argvars, typval_T *rettv); void f_assert_equal(typval_T *argvars, typval_T *rettv); @@ -37,4 +37,4 @@ void f_test_setmouse(typval_T *argvars, typval_T *rettv); void f_test_mswin_event(typval_T *argvars, typval_T *rettv); void f_test_gui_event(typval_T *argvars, typval_T *rettv); void f_test_settime(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/textformat.pro b/src/proto/textformat.pro index 6f358fadf5..0fff8510cd 100644 --- a/src/proto/textformat.pro +++ b/src/proto/textformat.pro @@ -1,4 +1,4 @@ -/* textformat.c */ +// textformat.c int has_format_option(int x); void internal_format(int textwidth, int second_indent, int flags, int format_only, int c); void auto_format(int trailblank, int prev_line); @@ -8,4 +8,4 @@ void op_format(oparg_T *oap, int keep_cursor); void op_formatexpr(oparg_T *oap); int fex_format(linenr_T lnum, long count, int c); void format_lines(linenr_T line_count, int avoid_fex); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/textobject.pro b/src/proto/textobject.pro index 59116353da..8d3bb17fd4 100644 --- a/src/proto/textobject.pro +++ b/src/proto/textobject.pro @@ -1,4 +1,4 @@ -/* textobject.c */ +// textobject.c int findsent(int dir, long count); int findpar(int *pincl, int dir, long count, int what, int both); int startPS(linenr_T lnum, int para, int both); @@ -12,4 +12,4 @@ int current_block(oparg_T *oap, long count, int include, int what, int other); int current_tagblock(oparg_T *oap, long count_arg, int include); int current_par(oparg_T *oap, long count, int include, int type); int current_quote(oparg_T *oap, long count, int include, int quotechar); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/textprop.pro b/src/proto/textprop.pro index 511d3b5065..12c7d2876f 100644 --- a/src/proto/textprop.pro +++ b/src/proto/textprop.pro @@ -1,4 +1,4 @@ -/* textprop.c */ +// textprop.c unpacked_memline_T um_open(buf_T *buf); bool um_goto_line(unpacked_memline_T *um, linenr_T lnum, int extra_props); unpacked_memline_T um_open_at(buf_T *buf, linenr_T lnum, int extra_props); @@ -38,4 +38,4 @@ void adjust_props_for_split(linenr_T lnum_props, linenr_T lnum_top, int kept, in void prepend_joined_props(unpacked_memline_T *um, linenr_T lnum, int last_line, long col, int removed); bool text_prop_count_valid(int prop_count, size_t propdata_len); bool text_prop_vtext_valid(char_u *props, int prop_count, size_t propdata_len); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/time.pro b/src/proto/time.pro index 7e44bca1b7..785b54290b 100644 --- a/src/proto/time.pro +++ b/src/proto/time.pro @@ -1,4 +1,4 @@ -/* time.c */ +// time.c time_T vim_time(void); char *get_ctime(time_t thetime, int add_newline); void f_localtime(typval_T *argvars, typval_T *rettv); @@ -27,4 +27,4 @@ time_T get8ctime(FILE *fd); int put_time(FILE *fd, time_T the_time); void time_to_bytes(time_T the_time, char_u *buf); void add_time(char_u *buf, size_t buflen, time_t tt); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/tuple.pro b/src/proto/tuple.pro index 1ba0295486..9e03cb7208 100644 --- a/src/proto/tuple.pro +++ b/src/proto/tuple.pro @@ -1,4 +1,4 @@ -/* tuple.c */ +// tuple.c tuple_T *tuple_alloc(void); tuple_T *tuple_alloc_with_items(int count); void tuple_set_item(tuple_T *tuple, int idx, typval_T *tv); @@ -31,4 +31,4 @@ void tuple_repeat(tuple_T *tuple, int n, typval_T *rettv); void tuple_reverse(tuple_T *tuple, typval_T *rettv); void tuple_reduce(typval_T *argvars, typval_T *expr, typval_T *rettv); int check_tuples_addable(type_T *type1, type_T *type2); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/typval.pro b/src/proto/typval.pro index 1b5eb2905c..090ccd8158 100644 --- a/src/proto/typval.pro +++ b/src/proto/typval.pro @@ -1,4 +1,4 @@ -/* typval.c */ +// typval.c typval_T *alloc_tv(void); typval_T *alloc_string_tv(char_u *s); void free_tv(typval_T *varp); @@ -92,4 +92,4 @@ linenr_T tv_get_lnum(typval_T *argvars); linenr_T tv_get_lnum_buf(typval_T *argvars, buf_T *buf); buf_T *tv_get_buf(typval_T *tv, int curtab_only); buf_T *tv_get_buf_from_arg(typval_T *tv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/ui.pro b/src/proto/ui.pro index 7ad7c75edc..1902f881e7 100644 --- a/src/proto/ui.pro +++ b/src/proto/ui.pro @@ -1,4 +1,4 @@ -/* ui.c */ +// ui.c void ui_write(char_u *s, int len, int console); void ui_inchar_undo(char_u *s, int len); int ui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt); @@ -34,4 +34,4 @@ long scroll_line_len(linenr_T lnum); linenr_T ui_find_longest_lnum(void); void ui_focus_change(int in_focus); void im_save_status(long *psave); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/undo.pro b/src/proto/undo.pro index 14c233c83b..7deeec08b4 100644 --- a/src/proto/undo.pro +++ b/src/proto/undo.pro @@ -1,4 +1,4 @@ -/* undo.c */ +// undo.c int u_save_cursor(void); int u_save(linenr_T top, linenr_T bot); int u_savesub(linenr_T lnum); @@ -28,4 +28,4 @@ int curbufIsChanged(void); void f_undofile(typval_T *argvars, typval_T *rettv); void u_undofile_reset_and_delete(buf_T *buf); void f_undotree(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/usercmd.pro b/src/proto/usercmd.pro index fa45ad152c..79b56c83c7 100644 --- a/src/proto/usercmd.pro +++ b/src/proto/usercmd.pro @@ -1,4 +1,4 @@ -/* usercmd.c */ +// usercmd.c char_u *find_ucmd(exarg_T *eap, char_u *p, int *full, expand_T *xp, int *complp); char_u *set_context_in_user_cmd(expand_T *xp, char_u *arg_in); char_u *set_context_in_user_cmdarg(char_u *cmd, char_u *arg, long argt, int context, expand_T *xp, int forceit); @@ -22,4 +22,4 @@ void ex_delcommand(exarg_T *eap); size_t add_win_cmd_modifiers(char_u *buf, cmdmod_T *cmod, int *multi_mods); size_t produce_cmdmods(char_u *buf, cmdmod_T *cmod, int quote); void do_ucmd(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/userfunc.pro b/src/proto/userfunc.pro index da5a90f774..29181bb8c2 100644 --- a/src/proto/userfunc.pro +++ b/src/proto/userfunc.pro @@ -1,4 +1,4 @@ -/* userfunc.c */ +// userfunc.c void func_init(void); hashtab_T *func_tbl_get(void); char_u *make_ufunc_name_readable(char_u *name, char_u *buf, size_t bufsize); @@ -95,4 +95,4 @@ int set_ref_in_call_stack(int copyID); int set_ref_in_functions(int copyID); int set_ref_in_func_args(int copyID); int set_ref_in_func(char_u *name, ufunc_T *fp_in, int copyID); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/version.pro b/src/proto/version.pro index 417000c38e..1ede374c6e 100644 --- a/src/proto/version.pro +++ b/src/proto/version.pro @@ -1,4 +1,4 @@ -/* version.c */ +// version.c void init_longVersion(void); int highest_patch(void); int has_patch(int n); @@ -7,4 +7,4 @@ void list_in_columns(char_u **items, int size, int current); void list_version(void); void maybe_intro_message(void); void ex_intro(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9class.pro b/src/proto/vim9class.pro index a6e5f6772e..b44b677a1f 100644 --- a/src/proto/vim9class.pro +++ b/src/proto/vim9class.pro @@ -1,4 +1,4 @@ -/* vim9class.c */ +// vim9class.c int object_index_from_itf_index(class_T *itf, int is_method, int idx, class_T *cl); int is_valid_builtin_obj_methodname(char_u *funcname); ufunc_T *class_get_builtin_method(class_T *cl, class_builtin_T builtin_method, int *method_idx); @@ -44,4 +44,4 @@ int object_equal(object_T *o1, object_T *o2, int ic); char_u *object2string(object_T *obj, char_u *numbuf, int copyID, int echo_style, int restore_copyID, int composite_val); int class_instance_of(class_T *cl, class_T *other_cl); void f_instanceof(typval_T *argvars, typval_T *rettv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9cmds.pro b/src/proto/vim9cmds.pro index 12f0560ace..f8c4bc2697 100644 --- a/src/proto/vim9cmds.pro +++ b/src/proto/vim9cmds.pro @@ -1,4 +1,4 @@ -/* vim9cmds.c */ +// vim9cmds.c void free_locals(cctx_T *cctx); int check_vim9_unlet(char_u *name); char_u *compile_unletlock(char_u *arg, exarg_T *eap, cctx_T *cctx); @@ -34,4 +34,4 @@ char_u *compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx); char_u *compile_cexpr(char_u *line, exarg_T *eap, cctx_T *cctx); char_u *compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx); int check_global_and_subst(char_u *cmd, char_u *arg); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro index e8b9cdd197..d2cd463cfc 100644 --- a/src/proto/vim9compile.pro +++ b/src/proto/vim9compile.pro @@ -1,4 +1,4 @@ -/* vim9compile.c */ +// vim9compile.c int lookup_local(char_u *name, size_t len, lvar_T *lvar, cctx_T *cctx); int arg_exists(char_u *name, size_t len, int *idxp, type_T **type, int *gen_load_outer, cctx_T *cctx); void update_script_var_block_id(char_u *name, int block_id); @@ -33,4 +33,4 @@ void set_function_type(ufunc_T *ufunc); void unlink_def_function(ufunc_T *ufunc); void link_def_function(ufunc_T *ufunc); void free_def_functions(void); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9execute.pro b/src/proto/vim9execute.pro index e08e436911..8c006c4011 100644 --- a/src/proto/vim9execute.pro +++ b/src/proto/vim9execute.pro @@ -1,4 +1,4 @@ -/* vim9execute.c */ +// vim9execute.c void to_string_error(vartype_T vartype); void update_has_breakpoint(ufunc_T *ufunc); int funcstack_check_refcount(funcstack_T *funcstack); @@ -27,4 +27,4 @@ void ex_disassemble(exarg_T *eap); int tv2bool(typval_T *tv); void emsg_using_string_as(typval_T *tv, int as_number); int check_not_string(typval_T *tv); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9expr.pro b/src/proto/vim9expr.pro index 055723ce4e..3f219e0c4e 100644 --- a/src/proto/vim9expr.pro +++ b/src/proto/vim9expr.pro @@ -1,4 +1,4 @@ -/* vim9expr.c */ +// vim9expr.c int generate_ppconst(cctx_T *cctx, ppconst_T *ppconst); void clear_ppconst(ppconst_T *ppconst); int compile_member(int is_slice, int *keeping_dict, cctx_T *cctx); @@ -17,4 +17,4 @@ void error_white_both(char_u *op, int len); int compile_expr1(char_u **arg, cctx_T *cctx, ppconst_T *ppconst); int compile_expr0_ext(char_u **arg, cctx_T *cctx, int *is_const); int compile_expr0(char_u **arg, cctx_T *cctx); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9generics.pro b/src/proto/vim9generics.pro index 2d7c5d79cc..5b095bae1c 100644 --- a/src/proto/vim9generics.pro +++ b/src/proto/vim9generics.pro @@ -1,4 +1,4 @@ -/* vim9generics.c */ +// vim9generics.c char_u *generic_func_find_open_bracket(char_u *name); int skip_generic_func_type_args(char_u **argp); char_u *append_generic_func_type_args(char_u *funcname, size_t namelen, char_u **argp); @@ -16,4 +16,4 @@ ufunc_T *generic_func_get(ufunc_T *fp, gfargs_tab_T *gfatab); ufunc_T *find_generic_func(ufunc_T *ufunc, char_u *name, char_u **argp); type_T *find_generic_type(char_u *gt_name, size_t name_len, ufunc_T *ufunc, cctx_T *cctx); void generic_func_clear_items(ufunc_T *fp); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9instr.pro b/src/proto/vim9instr.pro index f4b587d8cb..0550f99618 100644 --- a/src/proto/vim9instr.pro +++ b/src/proto/vim9instr.pro @@ -1,4 +1,4 @@ -/* vim9instr.c */ +// vim9instr.c isn_T *generate_instr(cctx_T *cctx, isntype_T isn_type); isn_T *generate_instr_drop(cctx_T *cctx, isntype_T isn_type, int drop); isn_T *generate_instr_type(cctx_T *cctx, isntype_T isn_type, type_T *type); @@ -86,4 +86,4 @@ int generate_SCRIPTCTX_SET(cctx_T *cctx, sctx_T new_sctx); void may_generate_prof_end(cctx_T *cctx, int prof_lnum); void delete_instr(isn_T *isn); void clear_instr_ga(garray_T *gap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9script.pro b/src/proto/vim9script.pro index c75cc0c785..e94a43eed5 100644 --- a/src/proto/vim9script.pro +++ b/src/proto/vim9script.pro @@ -1,4 +1,4 @@ -/* vim9script.c */ +// vim9script.c int in_old_script(int max_version); int current_script_is_vim9(void); void clear_vim9_scriptlocal_vars(int sid); @@ -19,4 +19,4 @@ void hide_script_var(scriptitem_T *si, int idx, int func_defined); svar_T *find_typval_in_script(typval_T *dest, scid_T sid, int must_find); int check_script_var_type(svar_T *sv, typval_T *value, char_u *name, where_T where); int check_reserved_name(char_u *name, int is_objm_access); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/vim9type.pro b/src/proto/vim9type.pro index c32da26ab6..5bfd034d54 100644 --- a/src/proto/vim9type.pro +++ b/src/proto/vim9type.pro @@ -1,4 +1,4 @@ -/* vim9type.c */ +// vim9type.c type_T *get_type_ptr(garray_T *type_gap); type_T *copy_type(type_T *type, garray_T *type_gap); type_T *copy_type_deep(type_T *type, garray_T *type_gap); @@ -42,4 +42,4 @@ char *type_name(type_T *type, char **tofree); void f_typename(typval_T *argvars, typval_T *rettv); int check_typval_is_value(typval_T *tv); int check_type_is_value(type_T *type); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/viminfo.pro b/src/proto/viminfo.pro index c33af5f05d..2909106a73 100644 --- a/src/proto/viminfo.pro +++ b/src/proto/viminfo.pro @@ -1,8 +1,8 @@ -/* viminfo.c */ +// viminfo.c int get_viminfo_parameter(int type); int buf_compare(const void *s1, const void *s2); void check_marks_read(void); int read_viminfo(char_u *file, int flags); void write_viminfo(char_u *file, int forceit); void ex_viminfo(exarg_T *eap); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/wayland.pro b/src/proto/wayland.pro index 770b5e1114..c55f41ab0d 100644 --- a/src/proto/wayland.pro +++ b/src/proto/wayland.pro @@ -1,4 +1,4 @@ -/* wayland.c */ +// wayland.c int vwl_connection_flush(vwl_connection_T *self); int vwl_connection_dispatch(vwl_connection_T *self); int vwl_connection_roundtrip(vwl_connection_T *self); @@ -23,4 +23,4 @@ void vwl_data_offer_add_listener(vwl_data_offer_T *self, const vwl_data_offer_li void vwl_data_device_set_selection(vwl_data_device_T *self, vwl_data_source_T *source, uint32_t serial, wayland_selection_T selection); void vwl_data_source_offer(vwl_data_source_T *self, const char *mime_type); void vwl_data_offer_receive(vwl_data_offer_T *self, const char *mime_type, int32_t fd); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/winclip.pro b/src/proto/winclip.pro index c7cba71a29..7d3bca66ce 100644 --- a/src/proto/winclip.pro +++ b/src/proto/winclip.pro @@ -1,4 +1,4 @@ -/* winclip.c */ +// winclip.c int utf8_to_utf16(char_u *instr, int inlen, short_u *outstr, int *unconvlenp); int utf16_to_utf8(short_u *instr, int inlen, char_u *outstr); void MultiByteToWideChar_alloc(UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen); @@ -12,4 +12,4 @@ short_u *enc_to_utf16(char_u *str, int *lenp); char_u *utf16_to_enc(short_u *str, int *lenp); void acp_to_enc(char_u *str, int str_size, char_u **out, int *outlen); void enc_to_acp(char_u *str, int str_size, char_u **out, int *outlen); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/proto/window.pro b/src/proto/window.pro index cf060c20d1..74f1f30143 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -1,4 +1,4 @@ -/* window.c */ +// window.c void window_layout_lock(void); void window_layout_unlock(void); int frames_locked(void); @@ -111,4 +111,4 @@ int get_tab_number(tabpage_T *tp); char *check_colorcolumn(char_u *cc, win_T *wp); int get_last_winid(void); int win_locked(win_T *wp); -/* vim: set ft=c : */ +// vim: ft=c diff --git a/src/version.c b/src/version.c index 1306f7b720..763badf2d7 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1076, /**/ 1075, /**/ From f15ebc01af2dc8b915e1e0cb60ec93e720aab642 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 21:37:02 +0000 Subject: [PATCH 539/647] patch 9.2.1077: GUI: gui_mch_wait_for_chars() takes an int on some systems Problem: gui_wait_for_chars() passes a long to gui_mch_wait_for_chars(), the GTK and X11 implementations take a long, the MS-Windows, Photon and Haiku ones take an int. Solution: Take a long everywhere (Hirohito Higashi). closes: #21278 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_haiku.cc | 2 +- src/gui_photon.c | 2 +- src/gui_w32.c | 2 +- src/proto/gui_haiku.pro | 2 +- src/proto/gui_photon.pro | 2 +- src/proto/gui_w32.pro | 2 +- src/version.c | 2 ++ 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/gui_haiku.cc b/src/gui_haiku.cc index 8ab66bc913..9e59287ed4 100644 --- a/src/gui_haiku.cc +++ b/src/gui_haiku.cc @@ -4329,7 +4329,7 @@ gui_mch_update() */ int gui_mch_wait_for_chars( - int wtime) + long wtime) { int focus; bigtime_t until, timeout; diff --git a/src/gui_photon.c b/src/gui_photon.c index 096f6ac54c..74d7c5d3dd 100644 --- a/src/gui_photon.c +++ b/src/gui_photon.c @@ -1353,7 +1353,7 @@ gui_mch_update(void) } int -gui_mch_wait_for_chars(int wtime) +gui_mch_wait_for_chars(long wtime) { is_timeout = FALSE; diff --git a/src/gui_w32.c b/src/gui_w32.c index 0960b0d82f..dcac9c4497 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -2666,7 +2666,7 @@ server_flush_input(void) * or FAIL otherwise. */ int -gui_mch_wait_for_chars(int wtime) +gui_mch_wait_for_chars(long wtime) { int focus; diff --git a/src/proto/gui_haiku.pro b/src/proto/gui_haiku.pro index e98e04a17e..c598b58cc0 100644 --- a/src/proto/gui_haiku.pro +++ b/src/proto/gui_haiku.pro @@ -54,7 +54,7 @@ void gui_mch_settitle(char_u *title, char_u *icon); void gui_mch_draw_hollow_cursor(guicolor_T color); void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_update(void); -int gui_mch_wait_for_chars(int wtime); +int gui_mch_wait_for_chars(long wtime); void gui_mch_clear_block(int row1, int col1, int row2, int col2); void gui_mch_clear_all(void); void gui_mch_delete_lines(int row, int num_lines); diff --git a/src/proto/gui_photon.pro b/src/proto/gui_photon.pro index dbafd29a43..a6bdc9b86c 100644 --- a/src/proto/gui_photon.pro +++ b/src/proto/gui_photon.pro @@ -6,7 +6,7 @@ int gui_mch_init_check(void); int gui_mch_open(void); void gui_mch_exit(int rc); void gui_mch_update(void); -int gui_mch_wait_for_chars(int wtime); +int gui_mch_wait_for_chars(long wtime); char_u *gui_mch_browse(int saving, char_u *title, char_u *default_name, char_u *ext, char_u *initdir, char_u *filter); int gui_mch_dialog(int type, char_u *title, char_u *message, char_u *buttons, int default_button, char_u *textfield, int ex_cmd); int gui_mch_get_winpos(int *x, int *y); diff --git a/src/proto/gui_w32.pro b/src/proto/gui_w32.pro index 2a64c37798..415a3b1aa4 100644 --- a/src/proto/gui_w32.pro +++ b/src/proto/gui_w32.pro @@ -31,7 +31,7 @@ void gui_mch_draw_hollow_cursor(guicolor_T color); void gui_mch_draw_part_cursor(int w, int h, guicolor_T color); void gui_mch_update(void); void server_add_input(char_u *str); -int gui_mch_wait_for_chars(int wtime); +int gui_mch_wait_for_chars(long wtime); void gui_mch_clear_block(int row1, int col1, int row2, int col2); void gui_mch_free_popup_image(win_T *wp); bool gui_mch_update_popup_image_pixels(win_T *wp); diff --git a/src/version.c b/src/version.c index 763badf2d7..4fa9dbecd9 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1077, /**/ 1076, /**/ From fee1b700ba722244e5990da648bbea3e2a5ed977 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 21:41:59 +0000 Subject: [PATCH 540/647] patch 9.2.1078: MS-Windows: warning for a size_t to int conversion in insexpand.c Problem: get_user_highlight_id() passes the size_t of STRLEN() to syn_check_group(), which takes an int. MSVC warns with C4267. (after v9.2.1001). Solution: Cast to int, like the other callers do (Hirohito Higashi). related: #21105 closes: #21279 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/insexpand.c | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/insexpand.c b/src/insexpand.c index bee5d9adf6..9b97380778 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -3877,7 +3877,7 @@ expand_by_function(int type, char_u *base, callback_T *cb) get_user_highlight_id(char_u *hlname) { if (hlname != NULL && *hlname != NUL) - return syn_check_group(hlname, STRLEN(hlname)); + return syn_check_group(hlname, (int)STRLEN(hlname)); return 0; } /* diff --git a/src/version.c b/src/version.c index 4fa9dbecd9..170c8bf8b0 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1078, /**/ 1077, /**/ From 5664658f641ea180d26653d1e9663724d1909272 Mon Sep 17 00:00:00 2001 From: Hirohito Higashi Date: Fri, 11 Sep 2026 21:46:16 +0000 Subject: [PATCH 541/647] patch 9.2.1079: GTK4: popup image stays on the screen when the text scrolls Problem: With the GTK4 GUI, the image of a popup window stays on the screen when the text under it scrolls or is cleared, for example by ":version". The other image backends paint the image once, and the text written over it removes it. Solution: Remove an image from the list of images to render when a cell it covers is cleared or moved. The next redraw emits it again (Hirohito Higashi). related: #21234 closes: #21274 Co-Authored-By: Claude Fable 5.1 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- src/gui_gtk4_da.c | 62 +++++++++++++++++++++++++++++++++++++++++------ src/version.c | 2 ++ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/gui_gtk4_da.c b/src/gui_gtk4_da.c index 6eb9798e27..9117674ec7 100644 --- a/src/gui_gtk4_da.c +++ b/src/gui_gtk4_da.c @@ -22,6 +22,12 @@ typedef struct { int id; int zindex; + // The cells the image covers, to remove it when one of them is cleared + // or moved. + int row; + int col; + int rows; + int cols; GskRenderNode *node; // Cached clip node, which has the texture node as its // child. May be NULL } DrawImage; @@ -165,6 +171,8 @@ struct _VimDrawArea #ifdef FEAT_IMAGE_GDK static void draw_image_free(DrawImage *dimg); +static void vim_draw_area_remove_images_in(VimDrawArea *self, int row1, + int col1, int row2, int col2); #endif static void draw_row_init(DrawRow *drow, int row, int cols); static void draw_row_clear(DrawRow *drow); @@ -1523,6 +1531,9 @@ vim_draw_area_clear_block( || col2 >= self->n_cols)) return; +#ifdef FEAT_IMAGE_GDK + vim_draw_area_remove_images_in(self, row1, col1, row2, col2); +#endif for (int r = row1; r <= row2; r++) draw_row_fill(self->rows + r, col1, col2, NULL, NULL, &self->cursor); } @@ -1564,6 +1575,10 @@ vim_draw_area_move_block( assert(col2 >= col1); assert(row1 != to); +#ifdef FEAT_IMAGE_GDK + vim_draw_area_remove_images_in(self, MIN(row1, to), col1, + MAX(row2, to + offset), col2); +#endif if (row1 > to) { // "row1" is below "to", start moving rows starting at "row1". Rows are @@ -1828,15 +1843,20 @@ vim_draw_area_add_image( gsk_render_node_unref(dimg->node); dimg->node = node; + } + dimg->row = row; + dimg->col = col; + dimg->rows = (int)((draw_h - 1) / gui.char_height) + 1; + dimg->cols = (int)((draw_w - 1) / gui.char_width) + 1; - if (dimg->zindex == zindex) - return; - else - { - dimg->zindex = zindex; - g_queue_unlink(self->images, link); - } + if (dimg->zindex != zindex) + { + dimg->zindex = zindex; + g_queue_unlink(self->images, link); } + else if (link->prev != NULL || self->images->head == link) + // Already queued at the right position. + return; vim_draw_area_queue_image(self, link); } @@ -1855,6 +1875,34 @@ vim_draw_area_remove_image(VimDrawArea *self, int id) draw_image_free(link->data); g_queue_delete_link(self->images, link); } + +/* + * Remove the images that cover a cell in the block (inclusive). + */ + static void +vim_draw_area_remove_images_in( + VimDrawArea *self, + int row1, + int col1, + int row2, + int col2) +{ + GList *s = self->images->head; + + while (s != NULL) + { + GList *next = s->next; + DrawImage *dimg = s->data; + + if (dimg->row <= row2 && dimg->row + dimg->rows > row1 + && dimg->col <= col2 && dimg->col + dimg->cols > col1) + { + draw_image_free(dimg); + g_queue_delete_link(self->images, s); + } + s = next; + } +} #endif /* diff --git a/src/version.c b/src/version.c index 170c8bf8b0..e796603375 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1079, /**/ 1078, /**/ From 86a3567396d6f5fca6b4222363a8201308795a49 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Fri, 11 Sep 2026 21:56:49 +0000 Subject: [PATCH 542/647] patch 9.2.1080: filetype: not all crontab files are recognized Problem: filetype: not all crontab files are recognized (efahl) Solution: Detect crontabs.* as crontab filetype fixes: #21253 Signed-off-by: Christian Brabandt --- runtime/filetype.vim | 4 ++-- src/testdir/test_filetype.vim | 2 +- src/version.c | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 5c6cffd265..6ced3c0a42 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: The Vim Project -" Last Change: 2026 Sep 08 +" Last Change: 2026 Sep 11 " Former Maintainer: Bram Moolenaar " If the filetype can be detected from extension or file name(the final path component), @@ -1427,7 +1427,7 @@ au BufNewFile,BufRead [cC]hange[lL]og* \|endif " Crontab -au BufNewFile,BufRead crontab,crontab.*,*/etc/cron.d/* call s:StarSetf('crontab') +au BufNewFile,BufRead crontab,crontab.*,crontabs.*,*/etc/cron.d/* call s:StarSetf('crontab') " dnsmasq(8) configuration au BufNewFile,BufRead */etc/dnsmasq.d/* call s:StarSetf('dnsmasq') diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 1420b628f9..93fee65bfa 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -207,7 +207,7 @@ def s:GetFilenameChecks(): dict> cpp: ['file.cxx', 'file.c++', 'file.hh', 'file.hxx', 'file.hpp', 'file.ipp', 'file.ixx', 'file.moc', 'file.tcc', 'file.inl', 'file.tlh', 'file.cppm', 'file.ccm', 'file.cxxm', 'file.c++m', 'file.mpp'], cqlang: ['file.cql'], crm: ['file.crm'], - crontab: ['crontab', 'crontab.file', '/etc/cron.d/file', 'any/etc/cron.d/file'], + crontab: ['crontab', 'crontab.file', '/etc/cron.d/file', 'any/etc/cron.d/file', 'var/spool/cron/crontabs.9999'], crystal: ['file.cr'], cs: ['file.cs', 'file.csx', 'file.cake'], csc: ['file.csc'], diff --git a/src/version.c b/src/version.c index e796603375..0da90302ec 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1080, /**/ 1079, /**/ From d5b24f50846e1728503a6c6d3d2670e0f2cada4e Mon Sep 17 00:00:00 2001 From: dyingc Date: Fri, 11 Sep 2026 22:20:29 +0000 Subject: [PATCH 543/647] patch 9.2.1081: memory leak in f_setmatches() Problem: f_setmatches() increments lv_refcount of the position list "s" once for every "posN" entry it appends, but match_add() does not keep a reference and list_unref() is called only once. With two or more positions the list, and the position lists it references, are not released until the next garbage collection. When a "posN" value is not a List the function returns without releasing "s" at all. Solution: Take one reference right after list_alloc(), drop the per-item increment, and list_unref() the list on the early return. Add a test that reads the reference counts (dyingc). closes: #21284 Signed-off-by: dyingc Signed-off-by: Christian Brabandt --- src/match.c | 5 ++++- src/testdir/test_match.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/match.c b/src/match.c index 6bd5ff8d90..1ff9b8349f 100644 --- a/src/match.c +++ b/src/match.c @@ -1135,6 +1135,7 @@ f_setmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED) s = list_alloc(); if (s == NULL) return; + ++s->lv_refcount; } // match from matchaddpos() @@ -1144,10 +1145,12 @@ f_setmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED) if ((di = dict_find(d, (char_u *)buf, -1)) != NULL) { if (di->di_tv.v_type != VAR_LIST) + { + list_unref(s); return; + } list_append_tv(s, &di->di_tv); - s->lv_refcount++; } else break; diff --git a/src/testdir/test_match.vim b/src/testdir/test_match.vim index 5d598eb233..d2a64c712e 100644 --- a/src/testdir/test_match.vim +++ b/src/testdir/test_match.vim @@ -314,6 +314,27 @@ func Test_matchaddpos_error() call assert_fails("call matchaddpos('Search', [[3, 4, {}]])", 'E728:') endfunc +" setmatches() with more than one "posN" entry used to keep a reference to +" every position list, so they were not released until the next garbage +" collection. A "posN" value that is not a List made it bail out early +" without releasing the list at all. +func Test_setmatches_pos_refcount() + let p1 = [1, 1, 1] + let p2 = [2, 1, 1] + call assert_equal(1, test_refcount(p1)) + call assert_equal(1, test_refcount(p2)) + + call setmatches([#{group: 'Search', priority: 10, id: 4, pos1: p1, pos2: p2}]) + call clearmatches() + call assert_equal(1, test_refcount(p1)) + call assert_equal(1, test_refcount(p2)) + + let p3 = [3, 1, 1] + call assert_equal(-1, setmatches([#{group: 'Search', priority: 10, id: 4, pos1: p3, pos2: {}}])) + call clearmatches() + call assert_equal(1, test_refcount(p3)) +endfunc + func OtherWindowCommon() let lines =<< trim END call setline(1, 'Hello Vim world') diff --git a/src/version.c b/src/version.c index 0da90302ec..d0baf248ac 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1081, /**/ 1080, /**/ From c6333215b22c5a71e849bc1c98450a5f60d2b377 Mon Sep 17 00:00:00 2001 From: dyingc Date: Sat, 12 Sep 2026 15:29:27 +0000 Subject: [PATCH 544/647] patch 9.2.1082: use-after-free when appending a new list fails Problem: Seven functions free a freshly allocated list with vim_free() when appending it fails. list_alloc() has already linked the header into the global list of lists used for garbage collection, and only list_free_list() unlinks it, so first_list is left pointing at freed memory. Solution: Free those lists with list_free(), as add_regionpos_range() does since patch 9.2.0808 (dyingc). closes: #21283 Signed-off-by: dyingc Signed-off-by: Christian Brabandt --- src/blob.c | 2 +- src/evalfunc.c | 4 ++-- src/list.c | 4 ++-- src/tuple.c | 2 +- src/version.c | 2 ++ src/vim9execute.c | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/blob.c b/src/blob.c index 3f7417409e..1f9d470e08 100644 --- a/src/blob.c +++ b/src/blob.c @@ -331,7 +331,7 @@ blob2items(typval_T *argvars, typval_T *rettv) if (list_append_list(rettv->vval.v_list, l2) == FAIL) { - vim_free(l2); + list_free(l2); return; } diff --git a/src/evalfunc.c b/src/evalfunc.c index aa537e10dd..d0d8e3027f 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -5670,7 +5670,7 @@ f_getchangelist(typval_T *argvars, typval_T *rettv) return; if (list_append_list(rettv->vval.v_list, l) == FAIL) { - vim_free(l); + list_free(l); return; } @@ -5910,7 +5910,7 @@ f_getjumplist(typval_T *argvars, typval_T *rettv) return; if (list_append_list(rettv->vval.v_list, l) == FAIL) { - vim_free(l); + list_free(l); return; } diff --git a/src/list.c b/src/list.c index 42833354d4..372aa88aca 100644 --- a/src/list.c +++ b/src/list.c @@ -1147,7 +1147,7 @@ list2items(typval_T *argvars, typval_T *rettv) break; if (list_append_list(rettv->vval.v_list, l2) == FAIL) { - vim_free(l2); + list_free(l2); break; } if (list_append_number(l2, idx) == FAIL @@ -1183,7 +1183,7 @@ string2items(typval_T *argvars, typval_T *rettv) break; if (list_append_list(rettv->vval.v_list, l2) == FAIL) { - vim_free(l2); + list_free(l2); break; } if (list_append_number(l2, idx) == FAIL diff --git a/src/tuple.c b/src/tuple.c index 8e5a9fcfad..8fd670c4d7 100644 --- a/src/tuple.c +++ b/src/tuple.c @@ -874,7 +874,7 @@ tuple2items(typval_T *argvars, typval_T *rettv) if (list_append_list(rettv->vval.v_list, l) == FAIL) { - vim_free(l); + list_free(l); break; } if (list_append_number(l, idx) == FAIL diff --git a/src/version.c b/src/version.c index d0baf248ac..136aa8c1bc 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1082, /**/ 1081, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index f2f324cb9b..2fc6cc9f18 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1104,7 +1104,7 @@ add_defer_item(int var_idx, int argcount, ectx_T *ectx) listval.v_lock = 0; if (list_insert_tv(defer_l, &listval, defer_l->lv_first) == FAIL) { - vim_free(l); + list_free(l); return NULL; } From af6f220da5c8dfc8368c654d9e67330ea4b7b68e Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sat, 12 Sep 2026 16:06:49 +0000 Subject: [PATCH 545/647] runtime(vim): Update base syntax, improve autoload prefix matching - Tighten autoload prefix matching, e.g., foo#bar#baz - Disallow erroneously concatenated map special arguments, e.g., :map lhs rhs closes: #21285 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt --- runtime/syntax/generator/vim.vim.base | 17 ++++++++++++----- .../dumps/vim9_super_this_keywords_03.dump | 2 +- .../dumps/vim9_super_this_keywords_04.dump | 4 ++-- runtime/syntax/testdir/dumps/vim_ex_map_00.dump | 4 ++-- runtime/syntax/testdir/dumps/vim_ex_map_01.dump | 8 ++++---- runtime/syntax/testdir/dumps/vim_ex_map_02.dump | 14 +++++++------- runtime/syntax/testdir/dumps/vim_ex_map_03.dump | 12 ++++++------ runtime/syntax/testdir/dumps/vim_ex_map_04.dump | 12 ++++++------ runtime/syntax/testdir/dumps/vim_ex_map_05.dump | 14 +++++++------- runtime/syntax/testdir/dumps/vim_ex_map_06.dump | 14 +++++++------- runtime/syntax/testdir/dumps/vim_ex_map_07.dump | 8 ++++---- runtime/syntax/testdir/input/vim_ex_map.vim | 3 +++ runtime/syntax/vim.vim | 17 ++++++++++++----- 13 files changed, 73 insertions(+), 56 deletions(-) diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base index 0bd220f76c..6be0488d1d 100644 --- a/runtime/syntax/generator/vim.vim.base +++ b/runtime/syntax/generator/vim.vim.base @@ -2,7 +2,7 @@ " Language: Vim script " Maintainer: Hirohito Higashi " Doug Kearns -" Last Change: 2026 Aug 29 +" Last Change: 2026 Sep 12 " Former Maintainer: Charles E. Campbell " DO NOT CHANGE DIRECTLY. @@ -271,12 +271,18 @@ syn region vimSubscriptBrackets contained \ contains=@vimExprList syn match vimSubscriptDot contained "\." nextgroup=vimVar,vimVarKey,vimUserFunc,vimUserFuncKey -syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vim9Super,vim9This +syn match vimVar contained "\<\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vim9Super,vim9This " dict-key only syn match vimVarKey contained "\<\d\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot -syn match vimVar "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope +syn match vimVar "\<[bwglstav]:\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope +" autoload prefix +syn match vimVar + \ "\<\%(g:\)\=\h\w*\%(#\w\+\)\+\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope syn match vimVar "\" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope -syn match vimFBVar contained "\<[bwglsta]:\h[a-zA-Z0-9#_]*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope +syn match vimFBVar contained "\<[bwglsta]:\h\w*\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope +" autoload prefix +syn match vimFBVar contained + \ "\<\%(g:\)\=\h\w*\%(#\w\+\)\+\>" nextgroup=vimSubscriptBrackets,vimSubscriptDot contains=vimVarScope " match the scope prefix independently of the retrofitted scope dictionary syn match vimVarScope contained "\<[bwglstav]:" @@ -1059,7 +1065,8 @@ syn match vimMapLhs contained "\%(.\|\S\)\+" contains=vimCtrlChar,vimNotation syn match vimMapLhs contained +\%(.\|\S\)\+\ze\s*\n\s*\%(\\\|["#]\\ \)+ contains=vimCtrlChar,vimNotation,vimMapLeader skipwhite skipnl nextgroup=vimMapRhsContinue syn match vimMapBang contained "\a\@1<=!" skipwhite nextgroup=vimMapMod,vimMapLhs -syn match vimMapMod contained "\%#=1<\%(buffer\|expr\|nowait\|script\|silent\|special\|unique\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs +syn match vimMapMod contained + \ "\%#=1<\%(buffer\|expr\|nowait\|script\|silent\|special\|unique\)>" skipwhite nextgroup=vimMapMod,vimMapLhs contains=vimMapModKey,vimMapModErr syn region vimMapRhs contained \ start="\S" \ skip=+\\|\|\@1<=|\|\n\s*\%(\\\|["#]\\ \)+ diff --git a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_03.dump b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_03.dump index f501920b1e..de52fa5ed5 100644 --- a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_03.dump +++ b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_03.dump @@ -16,5 +16,5 @@ @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 @75 @2|d+0#af5f00255&|e|f| +0#0000000&|D|e|f|6|(+0#e000e06&|)| +0#0000000&@62 -@4|v+0#af5f00255&|a|r| +0#0000000&|x+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#0000001#ffff4012|h|i|s|#+0#00e0e07#ffffff0|s|u|p|e|r|#|x| +0#0000000&@50 +@4|v+0#af5f00255&|a|r| +0#0000000&|x+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#00e0e07&|h|i|s|#|s|u|p|e|r|#|x| +0#0000000&@50 @57|5@1|,|5| @9|7|2|%| diff --git a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_04.dump b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_04.dump index 551c9f6c25..8b896f4344 100644 --- a/runtime/syntax/testdir/dumps/vim9_super_this_keywords_04.dump +++ b/runtime/syntax/testdir/dumps/vim9_super_this_keywords_04.dump @@ -1,5 +1,5 @@ -| +0&#ffffff0@3|v+0#af5f00255&|a|r| +0#0000000&|x+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#0000001#ffff4012|h|i|s|#+0#00e0e07#ffffff0|s|u|p|e|r|#|x| +0#0000000&@50 -@4|v+0#af5f00255&|a|r| +0#0000000&|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|u|p|e|r|#|t+0#0000001#ffff4012|h|i|s|#+0#00e0e07#ffffff0|y| +0#0000000&@50 +| +0&#ffffff0@3|v+0#af5f00255&|a|r| +0#0000000&|x+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|t+0#00e0e07&|h|i|s|#|s|u|p|e|r|#|x| +0#0000000&@50 +@4|v+0#af5f00255&|a|r| +0#0000000&|y+0#00e0e07&| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|u|p|e|r|#|t|h|i|s|#|y| +0#0000000&@50 @4|t|h|i|s|#|s|u|p|e|r|#|F|u|n|c|(+0#e000e06&|)| +0#0000000&@53 @4|s|u|p|e|r|#|t|h|i|s|#|F|u|n|c|(+0#e000e06&|)| +0#0000000&@53 @2|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@66 diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_00.dump b/runtime/syntax/testdir/dumps/vim_ex_map_00.dump index 80b2d5353a..3f3b357328 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_00.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_00.dump @@ -15,6 +15,6 @@ |"+0#0000e05&| |:|m|a|p| |s|p|e|c|i|a|l| |a|r|g|u|m|e|n|t|s| |a|r|e| |c|a|s|e| |s|e|n|s|i|t|i|v|e|,| |<|B|U|F@1|E|R|>| |i|s| |t|h|e| |L|H|S| +0#0000000&@10 |m+0#af5f00255&|a|p| +0#0000000&|<+0#00e0e07&|B|U|F@1|E|R|>| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@58 @75 -|m+0#af5f00255&|a|p| +0#0000000&|<+0#e000e06&|L|e|a|d|e|r|>|l+0#00e0e07&|h|s| +0#0000000&@5|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@50 -|m+0#af5f00255&|a|p| +0#0000000&|<+0#e000e06&|L|o|c|a|l|L|e|a|d|e|r|>|l+0#00e0e07&|h|s| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@50 +|"+0#0000e05&| |c|o|n|c|a|t|e|n|a|t|e|d| |s|p|e|c|i|a|l| |a|r|g|u|m|e|n|t| |n|a|m|e|s|,| |<|b|u|f@1|e|r|e|x|p|r|>| |i|s| |t|h|e| |L|H|S| +0#0000000&@12 +|m+0#af5f00255&|a|p| +0#0000000&|<+0#00e0e07&|b|u|f@1|e|r|e|x|p|r|>| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@54 @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 index b7b32c1863..65620fc768 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_01.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_01.dump @@ -2,8 +2,11 @@ |"+0#0000e05&| |:|m|a|p| |s|p|e|c|i|a|l| |a|r|g|u|m|e|n|t|s| |a|r|e| |c|a|s|e| |s|e|n|s|i|t|i|v|e|,| |<|B|U|F@1|E|R|>| |i|s| |t|h|e| |L|H|S| +0#0000000&@10 |m+0#af5f00255&|a|p| +0#0000000&|<+0#00e0e07&|B|U|F@1|E|R|>| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@58 @75 +|"+0#0000e05&| |c|o|n|c|a|t|e|n|a|t|e|d| |s|p|e|c|i|a|l| |a|r|g|u|m|e|n|t| |n|a|m|e|s|,| |<|b|u|f@1|e|r|e|x|p|r|>| |i|s| |t|h|e| |L|H|S| +0#0000000&@12 +>m+0#af5f00255&|a|p| +0#0000000&|<+0#00e0e07&|b|u|f@1|e|r|e|x|p|r|>| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@54 +@75 |m+0#af5f00255&|a|p| +0#0000000&|<+0#e000e06&|L|e|a|d|e|r|>|l+0#00e0e07&|h|s| +0#0000000&@5|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@50 ->m+0#af5f00255&|a|p| +0#0000000&|<+0#e000e06&|L|o|c|a|l|L|e|a|d|e|r|>|l+0#00e0e07&|h|s| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@50 +|m+0#af5f00255&|a|p| +0#0000000&|<+0#e000e06&|L|o|c|a|l|L|e|a|d|e|r|>|l+0#00e0e07&|h|s| +0#0000000&|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@50 @75 |m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s| +0#0000000&|<+0#e000e06&|L|e|a|d|e|r|>|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@55 |m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s| +0#0000000&|<+0#e000e06&|L|o|c|a|l|L|e|a|d|e|r|>|r+0#0000001#ffff4012|h|s| +0#0000000#ffffff0@50 @@ -14,7 +17,4 @@ |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 @57|1|9|,|1| @9|1|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_02.dump b/runtime/syntax/testdir/dumps/vim_ex_map_02.dump index 07257b6db3..5014984a68 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_02.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_02.dump @@ -1,9 +1,12 @@ -|o+0#af5f00255#ffffff0|m|a|p|c|l|e|a|r| +0#0000000&|<+0#e000e06&|b|u|f@1|e|r|>| +0#0000000&@56 +|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 +>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 -> @74 +@75 @75 |"+0#0000e05&| |:|h|e|l|p| |m|a|p|-|b|a|r| +0#0000000&@59 @75 @@ -14,7 +17,4 @@ |"+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&|_+0#00e0e07&|l| +0#0000000&|:+0#0000001#ffff4012|!|l|s| |^+0#0000e05#ffffff0|V||+0#0000001#ffff4012| |m|o|r|e|^|M|:|e|c|h|o| |"|r|h|s|"|<+0#e000e06#ffffff0|C|R|>| +0#0000000&@37 @75 -|m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s| +0#0000000&|:+0#0000001#ffff4012|s|e|a|r|c|h|(|'|f|o@1|\@1|||b|a|r|'|)|<+0#e000e06#ffffff0|C|R|>|:+0#0000001#ffff4012|e|c|h|o| |"|r|h|s|"|<+0#e000e06#ffffff0|C|R|>| +0#0000000&@27 -@75 -@75 -@57|3|7|,|0|-|1| @7|2|9|%| +@57|3|7|,|1| @9|2|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_03.dump b/runtime/syntax/testdir/dumps/vim_ex_map_03.dump index 86d4d0ae59..a293505879 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_03.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_03.dump @@ -1,9 +1,12 @@ | +0&#ffffff0@74 -|"+0#0000e05&| |M|u|l|t|i|l|i|n|e| |R|H|S| +0#0000000&@59 +|m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s| +0#0000000&|:+0#0000001#ffff4012|s|e|a|r|c|h|(|'|f|o@1|\@1|||b|a|r|'|)|<+0#e000e06#ffffff0|C|R|>|:+0#0000001#ffff4012|e|c|h|o| |"|r|h|s|"|<+0#e000e06#ffffff0|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#00e0e07&|a|z| +0#0000000&@59 | +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|:|e|c|h|o| |(|<+0#e000e06#ffffff0|B|a|r|>| +0#0000000&@58 -| +0#0000001#ffff4012@1>\+0#e000e06#ffffff0| +0#0000000&@71 +| +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000000&@71 | +0#0000001#ffff4012@1|\+0#e000e06#ffffff0|'+0#0000001#ffff4012|b|a|r|'|)|<+0#e000e06#ffffff0|C|R|>| +0#0000000&@61 | +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 @75 @@ -14,7 +17,4 @@ |m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s| +0#0000000&@67 | +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 | +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|e|c|h|o| |"|f|o@1|"| +0#0000000#ffffff0@60 -@75 -|m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s|^+0#0000e05&|V| +0#00e0e07&| +0#0000000&@64 -| +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 -@57|5@1|,|3| @9|4|6|%| +@57|5@1|,|0|-|1| @7|4|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_04.dump b/runtime/syntax/testdir/dumps/vim_ex_map_04.dump index c742d09742..195ef6acdf 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_04.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_04.dump @@ -1,9 +1,12 @@ -| +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 | +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|e|c|h|o| |"|f|o@1|"| +0#0000000#ffffff0@60 @75 +|m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s|^+0#0000e05&|V| +0#00e0e07&| +0#0000000&@64 +| +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 +| +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|e|c|h|o| |"|f|o@1|"| +0#0000000#ffffff0@60 +> @74 |m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|^+0#0000e05&|V| +0#00e0e07&|h|s| +0#0000000&@64 | +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 -| +0#0000001#ffff4012@1>\+0#e000e06#ffffff0| +0#0000001#ffff4012|e|c|h|o| |"|f|o@1|"| +0#0000000#ffffff0@60 +| +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|e|c|h|o| |"|f|o@1|"| +0#0000000#ffffff0@60 @75 |m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|^+0#0000e05&|V| +0#00e0e07&|h|s| +0#0000000&@64 | +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 @@ -14,7 +17,4 @@ @75 |m+0#af5f00255&|a|p| +0#0000000&|l+0#00e0e07&|h|s| +0#0000000&@67 | +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |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 -@57|7|3|,|3| @9|6|3|%| +@57|7|3|,|0|-|1| @7|6|2|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_05.dump b/runtime/syntax/testdir/dumps/vim_ex_map_05.dump index c3765cea2a..d30f714c99 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_05.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_05.dump @@ -1,9 +1,12 @@ -| +0&#ffffff0@74 -|"+0#0000e05&| |D|i|f@1|e|r|e|n|t|i|a|t|e| |m|a|p|(|)| |f|r|o|m| |:|m|a|p| +0#0000000&@43 +| +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |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&| |D|i|f@1|e|r|e|n|t|i|a|t|e| |m|a|p|(|)| |f|r|o|m| |:|m|a|p| +0#0000000&@43 +> @74 |m+0#af5f00255&|a|p| +0#0000000&|(+0#00e0e07&| +0#0000000&|:+0#0000001#ffff4012|e|c|h|o| |"|o|p|e|n|-|p|a|r|e|n|"|<+0#e000e06#ffffff0|C|R|>| +0#0000000&@46 @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#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 |f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60 @@ -14,7 +17,4 @@ @75 |d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65 @2|m+0#af5f00255&|a|p| +0#0000000&|(+0#00e0e07&| +0#0000000&|:+0#0000001#ffff4012|e|c|h|o| |"|o|p|e|n|-|p|a|r|e|n|"|<+0#e000e06#ffffff0|C|R|>| +0#0000000&@44 -@2|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&@54 -@2|#+0#0000e05&| |:|m|a|p| |L|H|S|=|(|l|i|s|t|,| |R|H|S|=|'|v|:|v|a|l|'|)| +0#0000000&@42 -@2|m+0#af5f00255&|a|p| +0#0000000&|(+0#00e0e07&|l|i|s|t|,| +0#0000000&|'+0#0000001#ffff4012|v|:|v|a|l|'|)| +0#0000000#ffffff0@53 -@57|9|1|,|1| @9|8|0|%| +@57|9|1|,|0|-|1| @7|7|8|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_06.dump b/runtime/syntax/testdir/dumps/vim_ex_map_06.dump index 4e5b057440..c3e9c56389 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_06.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_06.dump @@ -1,9 +1,12 @@ -| +0&#ffffff0@1|m+0#af5f00255&|a|p| +0#0000000&|(+0#00e0e07&|l|i|s|t|,| +0#0000000&|'+0#0000001#ffff4012|v|:|v|a|l|'|)| +0#0000000#ffffff0@53 +| +0&#ffffff0@1|m+0#af5f00255&|a|p| +0#0000000&|(+0#00e0e07&| +0#0000000&|:+0#0000001#ffff4012|e|c|h|o| |"|o|p|e|n|-|p|a|r|e|n|"|<+0#e000e06#ffffff0|C|R|>| +0#0000000&@44 +@2|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&@54 +@2|#+0#0000e05&| |:|m|a|p| |L|H|S|=|(|l|i|s|t|,| |R|H|S|=|'|v|:|v|a|l|'|)| +0#0000000&@42 +@2|m+0#af5f00255&|a|p| +0#0000000&|(+0#00e0e07&|l|i|s|t|,| +0#0000000&|'+0#0000001#ffff4012|v|:|v|a|l|'|)| +0#0000000#ffffff0@53 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68 -@75 +> @74 @75 |"+0#0000e05&| |I|s@1|u|e| @1|#|1|2|6|7|2| +0#0000000&@59 -> @74 +@75 |n+0#af5f00255&@1|o|r|e|m|a|p| +0#0000000&|<+0#e000e06&|L|e|a|d|e|r|>|f+0#00e0e07&|o@1| +0#0000000&|:+0#0000001#ffff4012|e|c|h|o| |c|a|l@1|(| +0#0000000#ffffff0@42 | +0#0000001#ffff4012@1|"+0#0000e05#ffffff0|\| |c|o|m@1|e|n|t| +0#0000000&@62 | +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|{|x|-|>|x|}|,| +0#0000000#ffffff0@63 @@ -14,7 +17,4 @@ | +0#0000001#ffff4012@1|\+0#e000e06#ffffff0| +0#0000001#ffff4012|'|b|a|r|'|)|<+0#e000e06#ffffff0|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|1|0|9|,|0|-|1| @6|9|8|%| +@57|1|0|9|,|0|-|1| @6|9|5|%| diff --git a/runtime/syntax/testdir/dumps/vim_ex_map_07.dump b/runtime/syntax/testdir/dumps/vim_ex_map_07.dump index c8476d82db..4a9b49dcb1 100644 --- a/runtime/syntax/testdir/dumps/vim_ex_map_07.dump +++ b/runtime/syntax/testdir/dumps/vim_ex_map_07.dump @@ -1,4 +1,7 @@ | +0&#ffffff0@74 +|"+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#00e0e07&| +0#0000000&|<+0#e000e06&|P|l|u|g|>|N+0#0000001#ffff4012|e|t|r|w|O|p|e|n|F|i|l|e||+0#0000000#ffffff0|e+0#af5f00255&|n|d|i|f| +0#0000000&@44 > @74 @@ -14,7 +17,4 @@ |~| @73 |~| @73 |~| @73 -|~| @73 -|~| @73 -|~| @73 -| +0#0000000&@56|1|2|4|,|0|-|1| @6|B|o|t| +| +0#0000000&@56|1|2|7|,|0|-|1| @6|B|o|t| diff --git a/runtime/syntax/testdir/input/vim_ex_map.vim b/runtime/syntax/testdir/input/vim_ex_map.vim index b7c33ef498..40aae408d5 100644 --- a/runtime/syntax/testdir/input/vim_ex_map.vim +++ b/runtime/syntax/testdir/input/vim_ex_map.vim @@ -15,6 +15,9 @@ map