aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/options.txt1
-rw-r--r--runtime/lua/vim/_meta/options.lua1
-rw-r--r--src/nvim/message.c15
-rw-r--r--src/nvim/option.c7
-rw-r--r--src/nvim/options.lua2
-rw-r--r--test/old/testdir/test_cmdline.vim26
6 files changed, 47 insertions, 5 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 64ad2d2956..ea56633c77 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -4295,6 +4295,7 @@ A jump table for the options with a short description can be found at |Q_op|.
global
Determines how many entries are remembered in the |:messages| history.
The maximum value is 10000.
+ Setting it to zero clears the message history.
*'nrformats'* *'nf'*
'nrformats' 'nf' string (default "bin,hex")
diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua
index e485009ca2..c635d9bd3b 100644
--- a/runtime/lua/vim/_meta/options.lua
+++ b/runtime/lua/vim/_meta/options.lua
@@ -4381,6 +4381,7 @@ vim.go.mouset = vim.go.mousetime
--- Determines how many entries are remembered in the `:messages` history.
--- The maximum value is 10000.
+--- Setting it to zero clears the message history.
---
--- @type integer
vim.o.msghistory = 500
diff --git a/src/nvim/message.c b/src/nvim/message.c
index c758d5d76f..0b1156a6bd 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -982,11 +982,6 @@ static void add_msg_hist_multihl(const char *s, int len, int hl_id, bool multili
return;
}
- // Don't let the message history get too big
- while (msg_hist_len > p_mhi) {
- delete_first_msg();
- }
-
// allocate an entry and add the message at the end of the history
struct msg_hist *p = xmalloc(sizeof(struct msg_hist));
if (s) {
@@ -1018,6 +1013,8 @@ static void add_msg_hist_multihl(const char *s, int len, int hl_id, bool multili
first_msg_hist = last_msg_hist;
}
msg_hist_len++;
+
+ check_msg_hist();
}
/// Delete the first (oldest) message from the history.
@@ -1041,6 +1038,14 @@ int delete_first_msg(void)
return OK;
}
+void check_msg_hist(void)
+{
+ // Don't let the message history get too big
+ while (msg_hist_len > 0 && msg_hist_len > p_mhi) {
+ (void)delete_first_msg();
+ }
+}
+
/// :messages command implementation
void ex_messages(exarg_T *eap)
FUNC_ATTR_NONNULL_ALL
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 669dac9773..fdc2d8da7d 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -2199,6 +2199,13 @@ static const char *did_set_modified(optset_T *args)
return NULL;
}
+/// Process the updated 'msghistory' option value.
+static const char *did_set_msghistory(optset_T *args FUNC_ATTR_UNUSED)
+{
+ check_msg_hist();
+ return NULL;
+}
+
/// Process the updated 'number' or 'relativenumber' option value.
static const char *did_set_number_relativenumber(optset_T *args)
{
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index 2d712ee101..bcb05b107b 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -5894,10 +5894,12 @@ return {
},
{
abbreviation = 'mhi',
+ cb = 'did_set_msghistory',
defaults = { if_true = 500 },
desc = [=[
Determines how many entries are remembered in the |:messages| history.
The maximum value is 10000.
+ Setting it to zero clears the message history.
]=],
full_name = 'msghistory',
scope = { 'global' },
diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim
index 290af4a4ca..6fa3ee5250 100644
--- a/test/old/testdir/test_cmdline.vim
+++ b/test/old/testdir/test_cmdline.vim
@@ -4160,4 +4160,30 @@ func Test_cd_bslash_completion_windows()
let &shellslash = save_shellslash
endfunc
+func Test_msghistory()
+ " After setting 'msghistory' to 2 and outputting a message 4 times with
+ " :echomsg, is the number of output lines of :messages 2?
+ set msghistory=2
+ echomsg 'foo'
+ echomsg 'bar'
+ echomsg 'baz'
+ echomsg 'foobar'
+ call assert_equal(['baz', 'foobar'], GetMessages())
+
+ " When the number of messages is 10 and 'msghistory' is changed to 5, is the
+ " number of output lines of :messages 5?
+ set msghistory=10
+ for num in range(1, 10)
+ echomsg num
+ endfor
+ set msghistory=5
+ call assert_equal(5, len(GetMessages()))
+
+ " Check empty list
+ set msghistory=0
+ call assert_true(empty(GetMessages()))
+
+ set msghistory&
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab