vim-patch:7.4.1735

Problem:    It is not possible to only see part of the message history.  It is
            not possible to clear messages.
Solution:   Add a count to ":messages" and a clear argument. (Yasuhiro
            Matsumoto)

451f849fd6
This commit is contained in:
Michael Ennen 2016-11-26 16:34:52 -07:00
parent 3979c6cbed
commit d2be11fbf2
6 changed files with 93 additions and 8 deletions

View File

@ -19,6 +19,15 @@ The ":messages" command can be used to view previously given messages. This
is especially useful when messages have been overwritten or truncated. This
depends on the 'shortmess' option.
:messages Show all messages.
:{count}messages Show the {count} most recent messages.
:messages clear Clear all messages.
:{count}messages clear Clear messages, keeping only the {count} most
recent ones.
The number of remembered messages is fixed at 20 for the tiny version and 200
for other versions.
@ -58,9 +67,9 @@ If you are lazy, it also works without the shift key: >
When an error message is displayed, but it is removed before you could read
it, you can see it again with: >
:echo errmsg
or view a list of recent messages with: >
Or view a list of recent messages with: >
:messages
See `:messages` above.
LIST OF MESSAGES
*E222* *E228* *E232* *E256* *E293* *E298* *E304* *E317*

View File

@ -1604,7 +1604,7 @@ return {
},
{
command='messages',
flags=bit.bor(TRLBAR, CMDWIN),
flags=bit.bor(EXTRA, TRLBAR, RANGE, CMDWIN),
addr_type=ADDR_LINES,
func='ex_messages',
},

View File

@ -720,14 +720,47 @@ int delete_first_msg(void)
void ex_messages(exarg_T *eap)
{
struct msg_hist *p;
int c = 0;
msg_hist_off = TRUE;
if (STRCMP(eap->arg, "clear") == 0) {
int keep = eap->addr_count == 0 ? 0 : eap->line2;
for (p = first_msg_hist; p != NULL && !got_int; p = p->next)
if (p->msg != NULL)
while (msg_hist_len > keep) {
(void)delete_first_msg();
}
return;
}
if (*eap->arg != NUL) {
EMSG(_(e_invarg));
return;
}
msg_hist_off = true;
p = first_msg_hist;
if (eap->addr_count != 0) {
// Count total messages
for (; p != NULL && !got_int; p = p->next) {
c++;
}
c -= eap->line2;
// Skip without number of messages specified
for (p = first_msg_hist; p != NULL && !got_int && c > 0; p = p->next, c--) {
}
}
// Display what was not skipped.
for (; p != NULL && !got_int; p = p->next) {
if (p->msg != NULL) {
msg_attr(p->msg, p->attr);
}
}
msg_hist_off = FALSE;
msg_hist_off = false;
}
/*

View File

@ -9,6 +9,7 @@ source test_expr.vim
source test_expr_utf8.vim
source test_feedkeys.vim
source test_menu.vim
source test_messages.vim
source test_options.vim
source test_popup.vim
source test_regexp_utf8.vim

View File

@ -0,0 +1,42 @@
" Tests for :messages
function Test_messages()
let oldmore = &more
try
set nomore
let arr = map(range(10), '"hello" . v:val')
for s in arr
echomsg s | redraw
endfor
let result = ''
redir => result
2messages | redraw
redir END
" get last two messages
let msg = split(result, "\n")[1:][-2:]
call assert_equal(["hello8", "hello9"], msg)
" clear messages without last one
1messages clear
redir => result
redraw | 1messages
redir END
" get last last message
let msg = split(result, "\n")[1:][-1:]
call assert_equal(['hello9'], msg)
" clear all messages
messages clear
redir => result
redraw | 1messages
redir END
" get last last message
let msg = split(result, "\n")[1:][-1:]
call assert_equal([], msg)
finally
let &more = oldmore
endtry
endfunction

View File

@ -709,7 +709,7 @@ static int included_patches[] = {
// 1738,
// 1737 NA
// 1736 NA
// 1735,
1735,
1734,
// 1733 NA
1732,