aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/message.txt13
-rw-r--r--src/nvim/ex_cmds.lua5
-rw-r--r--src/nvim/ex_cmds_defs.h1
-rw-r--r--src/nvim/message.c41
-rw-r--r--src/nvim/testdir/test_alot.vim1
-rw-r--r--src/nvim/testdir/test_messages.vim40
-rw-r--r--src/nvim/version.c6
7 files changed, 96 insertions, 11 deletions
diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt
index d3eeecaf7c..fd66a5dafb 100644
--- a/runtime/doc/message.txt
+++ b/runtime/doc/message.txt
@@ -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*
diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua
index 95ede4bdc5..b056fff667 100644
--- a/src/nvim/ex_cmds.lua
+++ b/src/nvim/ex_cmds.lua
@@ -35,6 +35,7 @@ local ADDR_LOADED_BUFFERS = 3
local ADDR_BUFFERS = 4
local ADDR_TABS = 5
local ADDR_QUICKFIX = 6
+local ADDR_OTHER = 99
-- The following table is described in ex_cmds_defs.h file.
return {
@@ -1604,8 +1605,8 @@ return {
},
{
command='messages',
- flags=bit.bor(TRLBAR, CMDWIN),
- addr_type=ADDR_LINES,
+ flags=bit.bor(EXTRA, TRLBAR, RANGE, CMDWIN),
+ addr_type=ADDR_OTHER,
func='ex_messages',
},
{
diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h
index 8148eb5cee..c6389a0c8b 100644
--- a/src/nvim/ex_cmds_defs.h
+++ b/src/nvim/ex_cmds_defs.h
@@ -73,6 +73,7 @@
#define ADDR_BUFFERS 4
#define ADDR_TABS 5
#define ADDR_QUICKFIX 6
+#define ADDR_OTHER 99
typedef struct exarg exarg_T;
diff --git a/src/nvim/message.c b/src/nvim/message.c
index f9cfc49197..3163a797ed 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -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;
+
+ 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--) {
+ }
+ }
- for (p = first_msg_hist; p != NULL && !got_int; p = p->next)
- if (p->msg != NULL)
+ // 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;
}
/*
diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim
index d460134fb9..083f57aec1 100644
--- a/src/nvim/testdir/test_alot.vim
+++ b/src/nvim/testdir/test_alot.vim
@@ -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
diff --git a/src/nvim/testdir/test_messages.vim b/src/nvim/testdir/test_messages.vim
new file mode 100644
index 0000000000..188406e440
--- /dev/null
+++ b/src/nvim/testdir/test_messages.vim
@@ -0,0 +1,40 @@
+" Tests for :messages
+
+function Test_messages()
+ let oldmore = &more
+ try
+ set nomore
+ " Avoid the "message maintainer" line.
+ let $LANG = ''
+
+ let arr = map(range(10), '"hello" . v:val')
+ for s in arr
+ echomsg s | redraw
+ endfor
+ let result = ''
+
+ " get last two messages
+ redir => result
+ 2messages | redraw
+ redir END
+ let msg_list = split(result, "\n")
+ call assert_equal(["hello8", "hello9"], msg_list)
+
+ " clear messages without last one
+ 1messages clear
+ redir => result
+ redraw | messages
+ redir END
+ let msg_list = split(result, "\n")
+ call assert_equal(['hello9'], msg_list)
+
+ " clear all messages
+ messages clear
+ redir => result
+ redraw | messages
+ redir END
+ call assert_equal('', result)
+ finally
+ let &more = oldmore
+ endtry
+endfunction
diff --git a/src/nvim/version.c b/src/nvim/version.c
index a0e2d5dc2c..05855ee385 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -705,11 +705,11 @@ static int included_patches[] = {
1742,
1741,
1740,
- // 1739,
- // 1738,
+ 1739,
+ 1738,
// 1737 NA
// 1736 NA
- // 1735,
+ 1735,
1734,
// 1733 NA
1732,