# HG changeset patch # User Christian Brabandt # Date 1460647807 -7200 # Node ID a410390e340b2ae6bdb37a56590b825e509b0888 # Parent fc57c7ed06423d4b63dbc6d2f174ba1c6590e176 commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6 Author: Bram Moolenaar Date: Thu Apr 14 17:16:22 2016 +0200 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) diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt --- a/runtime/doc/message.txt +++ b/runtime/doc/message.txt @@ -1,4 +1,4 @@ -*message.txt* For Vim version 7.4. Last change: 2016 Feb 27 +*message.txt* For Vim version 7.4. Last change: 2016 Apr 14 VIM REFERENCE MANUAL by Bram Moolenaar @@ -19,6 +19,15 @@ The ":messages" command can be used to v 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,8 +67,9 @@ 2. Error messages *error-messages* *e 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 diff --git a/src/ex_cmds.h b/src/ex_cmds.h --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -886,7 +886,7 @@ EX(CMD_menutranslate, "menutranslate", e EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN, ADDR_LINES), EX(CMD_messages, "messages", ex_messages, - TRLBAR|CMDWIN, + EXTRA|TRLBAR|RANGE|CMDWIN, ADDR_LINES), EX(CMD_mkexrc, "mkexrc", ex_mkrc, BANG|FILE1|TRLBAR|CMDWIN, diff --git a/src/message.c b/src/message.c --- a/src/message.c +++ b/src/message.c @@ -770,6 +770,22 @@ ex_messages(exarg_T *eap UNUSED) { struct msg_hist *p; char_u *s; + int c = 0; + + if (STRCMP(eap->arg, "clear") == 0) + { + int keep = eap->addr_count == 0 ? 0 : eap->line2; + + while (msg_hist_len > keep) + (void)delete_first_msg(); + return; + } + + if (*eap->arg != NUL) + { + EMSG(_(e_invarg)); + return; + } msg_hist_off = TRUE; @@ -779,7 +795,23 @@ ex_messages(exarg_T *eap UNUSED) _("Messages maintainer: Bram Moolenaar "), hl_attr(HLF_T)); - for (p = first_msg_hist; p != NULL && !got_int; p = p->next) + 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); diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim --- a/src/testdir/test_alot.vim +++ b/src/testdir/test_alot.vim @@ -17,6 +17,7 @@ source test_join.vim source test_lispwords.vim source test_matchstrpos.vim source test_menu.vim +source test_messages.vim source test_partial.vim source test_reltime.vim source test_searchpos.vim diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim new file mode 100644 --- /dev/null +++ b/src/testdir/test_messages.vim @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1735, +/**/ 1734, /**/ 1733,