mirror of
https://github.com/neovim/neovim.git
synced 2026-02-20 01:09:56 +10:00
Merge pull request #10150 from bfredl/extcount
make msg_advance and search_count not crash with ext_messages, fixes #10069
This commit is contained in:
@@ -706,6 +706,7 @@ events, which the UI must handle.
|
||||
"rpc_error" Error response from |rpcrequest()|
|
||||
"return_prompt" |press-enter| prompt after a multiple messages
|
||||
"quickfix" Quickfix navigation message
|
||||
"search_count" Search count message ("S" flag of 'shortmess')
|
||||
"wmsg" Warning ("search hit BOTTOM", |W10|, …)
|
||||
New kinds may be added in the future; clients should treat unknown
|
||||
kinds as the empty kind.
|
||||
|
||||
@@ -116,6 +116,7 @@ static const char *msg_ext_kind = NULL;
|
||||
static Array msg_ext_chunks = ARRAY_DICT_INIT;
|
||||
static garray_T msg_ext_last_chunk = GA_INIT(sizeof(char), 40);
|
||||
static sattr_T msg_ext_last_attr = -1;
|
||||
static size_t msg_ext_cur_len = 0;
|
||||
|
||||
static bool msg_ext_overwrite = false; ///< will overwrite last message
|
||||
static int msg_ext_visible = 0; ///< number of messages currently visible
|
||||
@@ -1877,8 +1878,9 @@ static void msg_puts_display(const char_u *str, int maxlen, int attr,
|
||||
msg_ext_last_attr = attr;
|
||||
}
|
||||
// Concat pieces with the same highlight
|
||||
ga_concat_len(&msg_ext_last_chunk, (char *)str,
|
||||
strnlen((char *)str, maxlen)); // -V781
|
||||
size_t len = strnlen((char *)str, maxlen);
|
||||
ga_concat_len(&msg_ext_last_chunk, (char *)str, len); // -V781
|
||||
msg_ext_cur_len += len;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2770,6 +2772,7 @@ void msg_ext_ui_flush(void)
|
||||
}
|
||||
msg_ext_kind = NULL;
|
||||
msg_ext_chunks = (Array)ARRAY_DICT_INIT;
|
||||
msg_ext_cur_len = 0;
|
||||
msg_ext_overwrite = false;
|
||||
}
|
||||
}
|
||||
@@ -2782,6 +2785,7 @@ void msg_ext_flush_showmode(void)
|
||||
msg_ext_emit_chunk();
|
||||
ui_call_msg_showmode(msg_ext_chunks);
|
||||
msg_ext_chunks = (Array)ARRAY_DICT_INIT;
|
||||
msg_ext_cur_len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3018,7 +3022,10 @@ void give_warning(char_u *message, bool hl) FUNC_ATTR_NONNULL_ARG(1)
|
||||
} else {
|
||||
keep_msg_attr = 0;
|
||||
}
|
||||
msg_ext_set_kind("wmsg");
|
||||
|
||||
if (msg_ext_kind == NULL) {
|
||||
msg_ext_set_kind("wmsg");
|
||||
}
|
||||
|
||||
if (msg_attr((const char *)message, keep_msg_attr) && msg_scrolled == 0) {
|
||||
set_keep_msg(message, keep_msg_attr);
|
||||
@@ -3045,6 +3052,14 @@ void msg_advance(int col)
|
||||
msg_col = col; /* for redirection, may fill it up later */
|
||||
return;
|
||||
}
|
||||
if (ui_has(kUIMessages)) {
|
||||
// TODO(bfredl): use byte count as a basic proxy.
|
||||
// later on we might add proper support for formatted messages.
|
||||
while (msg_ext_cur_len < (size_t)col) {
|
||||
msg_putchar(' ');
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (col >= Columns) /* not enough room */
|
||||
col = Columns - 1;
|
||||
if (cmdmsg_rl)
|
||||
|
||||
@@ -1168,7 +1168,9 @@ int do_search(
|
||||
// search stat. Use all the space available, so that the
|
||||
// search state is right aligned. If there is not enough space
|
||||
// msg_strtrunc() will shorten in the middle.
|
||||
if (msg_scrolled != 0) {
|
||||
if (ui_has(kUIMessages)) {
|
||||
len = 0; // adjusted below
|
||||
} else if (msg_scrolled != 0) {
|
||||
// Use all the columns.
|
||||
len = (int)(Rows - msg_row) * Columns - 1;
|
||||
} else {
|
||||
@@ -4328,6 +4330,7 @@ static void search_stat(int dirc, pos_T *pos,
|
||||
|
||||
// keep the message even after redraw, but don't put in history
|
||||
msg_hist_off = true;
|
||||
msg_ext_set_kind("search_count");
|
||||
give_warning(msgbuf, false);
|
||||
msg_hist_off = false;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ describe('ui/ext_messages', function()
|
||||
[4] = {bold = true, foreground = Screen.colors.SeaGreen4},
|
||||
[5] = {foreground = Screen.colors.Blue1},
|
||||
[6] = {bold = true, reverse = true},
|
||||
[7] = {background = Screen.colors.Yellow},
|
||||
[8] = {foreground = Screen.colors.Red},
|
||||
})
|
||||
end)
|
||||
after_each(function()
|
||||
@@ -303,6 +305,49 @@ describe('ui/ext_messages', function()
|
||||
}}
|
||||
end)
|
||||
|
||||
it('shortmess-=S', function()
|
||||
command('set shortmess-=S')
|
||||
feed('iline 1\nline 2<esc>')
|
||||
|
||||
feed('/line<cr>')
|
||||
screen:expect{grid=[[
|
||||
{7:^line} 1 |
|
||||
{7:line} 2 |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]], messages={
|
||||
{content = {{"/line [1/2] W"}}, kind = "search_count"}
|
||||
}}
|
||||
|
||||
feed('n')
|
||||
screen:expect{grid=[[
|
||||
{7:line} 1 |
|
||||
{7:^line} 2 |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]], messages={
|
||||
{content = {{"/line [2/2]"}}, kind = "search_count"}
|
||||
}}
|
||||
end)
|
||||
|
||||
it("doesn't crash with column adjustment #10069", function()
|
||||
feed(':let [x,y] = [1,2]<cr>')
|
||||
feed(':let x y<cr>')
|
||||
screen:expect{grid=[[
|
||||
^ |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]], messages={
|
||||
{content = {{ "x #1" }}, kind = ""},
|
||||
{content = {{ "y #2" }}, kind = ""},
|
||||
{content = {{ "Press ENTER or type command to continue", 4 }}, kind = "return_prompt"}
|
||||
}}
|
||||
end)
|
||||
|
||||
it('&showmode', function()
|
||||
command('imap <f2> <cmd>echomsg "stuff"<cr>')
|
||||
feed('i')
|
||||
|
||||
Reference in New Issue
Block a user