mirror of
https://github.com/neovim/neovim
synced 2025-07-17 17:51:48 +00:00
fix(inccommand): ignore trailing commands only for *previewed* command #15638
Since the `State` is global, other scripts are unexpectedly affected during the 'inccommand' preview. This commit introduces a new flag for `do_cmdline`, in order to ignore trailing '|'-separated commands only for the command invoking the preview. fix #8796, update #7494
This commit is contained in:
@ -304,6 +304,7 @@ int do_cmdline_cmd(const char *cmd)
|
|||||||
/// DOCMD_KEYTYPED - Don't reset KeyTyped.
|
/// DOCMD_KEYTYPED - Don't reset KeyTyped.
|
||||||
/// DOCMD_EXCRESET - Reset the exception environment (used for debugging).
|
/// DOCMD_EXCRESET - Reset the exception environment (used for debugging).
|
||||||
/// DOCMD_KEEPLINE - Store first typed line (for repeating with ".").
|
/// DOCMD_KEEPLINE - Store first typed line (for repeating with ".").
|
||||||
|
/// DOCMD_PREVIEW - During 'inccommand' preview.
|
||||||
///
|
///
|
||||||
/// @param cookie argument for fgetline()
|
/// @param cookie argument for fgetline()
|
||||||
///
|
///
|
||||||
@ -606,7 +607,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, void *cookie, int flags)
|
|||||||
recursive--;
|
recursive--;
|
||||||
|
|
||||||
// Ignore trailing '|'-separated commands in preview-mode ('inccommand').
|
// Ignore trailing '|'-separated commands in preview-mode ('inccommand').
|
||||||
if (State & CMDPREVIEW) {
|
if ((State & CMDPREVIEW) && (flags & DOCMD_PREVIEW)) {
|
||||||
next_cmdline = NULL;
|
next_cmdline = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#define DOCMD_KEYTYPED 0x08 // don't reset KeyTyped
|
#define DOCMD_KEYTYPED 0x08 // don't reset KeyTyped
|
||||||
#define DOCMD_EXCRESET 0x10 // reset exception environment (for debugging
|
#define DOCMD_EXCRESET 0x10 // reset exception environment (for debugging
|
||||||
#define DOCMD_KEEPLINE 0x20 // keep typed line for repeating with "."
|
#define DOCMD_KEEPLINE 0x20 // keep typed line for repeating with "."
|
||||||
|
#define DOCMD_PREVIEW 0x40 // during 'inccommand' preview
|
||||||
|
|
||||||
/* defines for eval_vars() */
|
/* defines for eval_vars() */
|
||||||
#define VALID_PATH 1
|
#define VALID_PATH 1
|
||||||
|
@ -2254,7 +2254,7 @@ static int command_line_changed(CommandLineState *s)
|
|||||||
State |= CMDPREVIEW;
|
State |= CMDPREVIEW;
|
||||||
emsg_silent++; // Block error reporting as the command may be incomplete
|
emsg_silent++; // Block error reporting as the command may be incomplete
|
||||||
msg_silent++; // Block messages, namely ones that prompt
|
msg_silent++; // Block messages, namely ones that prompt
|
||||||
do_cmdline(ccline.cmdbuff, NULL, NULL, DOCMD_KEEPLINE|DOCMD_NOWAIT);
|
do_cmdline(ccline.cmdbuff, NULL, NULL, DOCMD_KEEPLINE|DOCMD_NOWAIT|DOCMD_PREVIEW);
|
||||||
msg_silent--; // Unblock messages
|
msg_silent--; // Unblock messages
|
||||||
emsg_silent--; // Unblock error reporting
|
emsg_silent--; // Unblock error reporting
|
||||||
|
|
||||||
|
@ -1487,6 +1487,29 @@ describe("inccommand=nosplit", function()
|
|||||||
]])
|
]])
|
||||||
eq(eval('v:null'), eval('v:exiting'))
|
eq(eval('v:null'), eval('v:exiting'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("does not break bar-separated command #8796", function()
|
||||||
|
source([[
|
||||||
|
function! F()
|
||||||
|
if v:false | return | endif
|
||||||
|
endfun
|
||||||
|
]])
|
||||||
|
command('call timer_start(10, {-> F()}, {"repeat":-1})')
|
||||||
|
feed(':%s/')
|
||||||
|
sleep(20) -- Allow some timer activity.
|
||||||
|
screen:expect([[
|
||||||
|
Inc substitution on |
|
||||||
|
two lines |
|
||||||
|
Inc substitution on |
|
||||||
|
two lines |
|
||||||
|
|
|
||||||
|
{15:~ }|
|
||||||
|
{15:~ }|
|
||||||
|
{15:~ }|
|
||||||
|
{15:~ }|
|
||||||
|
:%s/^ |
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe(":substitute, 'inccommand' with a failing expression", function()
|
describe(":substitute, 'inccommand' with a failing expression", function()
|
||||||
|
Reference in New Issue
Block a user