mirror of
https://github.com/neovim/neovim.git
synced 2025-10-08 10:56:31 +00:00
Merge #11319 'inccommand: fix issues with modifiers and prompting'
This commit is contained in:
@@ -5540,6 +5540,7 @@ static buf_T *show_sub(exarg_T *eap, pos_T old_cusr,
|
||||
|
||||
// We keep a special-purpose buffer around, but don't assume it exists.
|
||||
buf_T *preview_buf = bufnr ? buflist_findnr(bufnr) : 0;
|
||||
cmdmod.split = 0; // disable :leftabove/botright modifiers
|
||||
cmdmod.tab = 0; // disable :tab modifier
|
||||
cmdmod.noswapfile = true; // disable swap for preview buffer
|
||||
// disable file info message
|
||||
@@ -5586,6 +5587,9 @@ static buf_T *show_sub(exarg_T *eap, pos_T old_cusr,
|
||||
highest_num_line = kv_last(lines.subresults).end.lnum;
|
||||
col_width = log10(highest_num_line) + 1 + 3;
|
||||
}
|
||||
} else {
|
||||
// Failed to split the window, don't show 'inccommand' preview.
|
||||
preview_buf = NULL;
|
||||
}
|
||||
|
||||
char *str = NULL; // construct the line to show in here
|
||||
@@ -5598,7 +5602,7 @@ static buf_T *show_sub(exarg_T *eap, pos_T old_cusr,
|
||||
for (size_t matchidx = 0; matchidx < lines.subresults.size; matchidx++) {
|
||||
SubResult match = lines.subresults.items[matchidx];
|
||||
|
||||
if (split && preview_buf) {
|
||||
if (preview_buf) {
|
||||
lpos_T p_start = { 0, match.start.col }; // match starts here in preview
|
||||
lpos_T p_end = { 0, match.end.col }; // ... and ends here
|
||||
|
||||
|
@@ -1201,6 +1201,23 @@ static void get_wincmd_addr_type(char_u *arg, exarg_T *eap)
|
||||
}
|
||||
}
|
||||
|
||||
/// Skip colons and trailing whitespace, returning a pointer to the first
|
||||
/// non-colon, non-whitespace character.
|
||||
//
|
||||
/// @param skipleadingwhite Skip leading whitespace too
|
||||
static char_u *skip_colon_white(const char_u *p, bool skipleadingwhite)
|
||||
{
|
||||
if (skipleadingwhite) {
|
||||
p = skipwhite(p);
|
||||
}
|
||||
|
||||
while (*p == ':') {
|
||||
p = skipwhite(p + 1);
|
||||
}
|
||||
|
||||
return (char_u *)p;
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute one Ex command.
|
||||
*
|
||||
@@ -1705,9 +1722,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
|
||||
/*
|
||||
* Skip ':' and any white space
|
||||
*/
|
||||
ea.cmd = skipwhite(ea.cmd);
|
||||
while (*ea.cmd == ':')
|
||||
ea.cmd = skipwhite(ea.cmd + 1);
|
||||
ea.cmd = skip_colon_white(ea.cmd, true);
|
||||
|
||||
/*
|
||||
* If we got a line, but no command, then go to the line.
|
||||
@@ -3580,9 +3595,8 @@ char_u *skip_range(
|
||||
++cmd;
|
||||
}
|
||||
|
||||
/* Skip ":" and white space. */
|
||||
while (*cmd == ':')
|
||||
cmd = skipwhite(cmd + 1);
|
||||
// Skip ":" and white space.
|
||||
cmd = skip_colon_white(cmd, false);
|
||||
|
||||
return (char_u *)cmd;
|
||||
}
|
||||
@@ -10206,10 +10220,13 @@ bool cmd_can_preview(char_u *cmd)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Ignore additional colons at the start...
|
||||
cmd = skip_colon_white(cmd, true);
|
||||
|
||||
// Ignore any leading modifiers (:keeppatterns, :verbose, etc.)
|
||||
for (int len = modifier_len(cmd); len != 0; len = modifier_len(cmd)) {
|
||||
cmd += len;
|
||||
cmd = skipwhite(cmd);
|
||||
cmd = skip_colon_white(cmd, true);
|
||||
}
|
||||
|
||||
exarg_T ea;
|
||||
|
@@ -1927,7 +1927,9 @@ static int command_line_changed(CommandLineState *s)
|
||||
// - Immediately undo the effects.
|
||||
State |= CMDPREVIEW;
|
||||
emsg_silent++; // Block error reporting as the command may be incomplete
|
||||
msg_silent++; // Block messages, namely ones that prompt
|
||||
do_cmdline(ccline.cmdbuff, NULL, NULL, DOCMD_KEEPLINE|DOCMD_NOWAIT);
|
||||
msg_silent--; // Unblock messages
|
||||
emsg_silent--; // Unblock error reporting
|
||||
|
||||
// Restore the window "view".
|
||||
|
Reference in New Issue
Block a user