To reproduce:
$ ./vim --clean # at latest commit on master
:set hidden shortmess+=F
:e file1
:e file2
" Notice, no messages are output, as expected.
:bn
:bp
" Notice fileinfo messages are output.
The main problem appears to be in the enter_buffer() function:
/* Make sure the buffer is loaded. */
if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */
{
/* If there is no filetype, allow for detecting one. Esp. useful for
* ":ball" used in a autocommand. If there already is a filetype we
* might prefer to keep it. */
if (*curbuf->b_p_ft == NUL)
did_filetype = FALSE;
open_buffer(FALSE, NULL, 0);
}
else
{
if (!msg_silent)
need_fileinfo = TRUE; /* display file info after redraw */
(void)buf_check_timestamp(curbuf, FALSE); /* check if file changed */
When 'nohidden', the first path is executed (we have to load
the buffer). When 'hidden' is set, the "else" is executed, and so
we rely on msg_silent to avoid the fileinfo message. However, msg_silent
is not reliably set for shortmess+=F in all scenarios.
Thus, I recommend the following patch:
diff --git a/src/buffer.c b/src/buffer.c
index e825a99..08595a9 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1742,9 +1742,9 @@ enter_buffer(buf_T *buf)
}
else
{
- if (!msg_silent)
- need_fileinfo = TRUE; /* display file info after redraw */
- (void)buf_check_timestamp(curbuf, FALSE); /* check if file changed */
+ if (!msg_silent && !shortmess(SHM_FILEINFO))
+ need_fileinfo = TRUE;
+ (void)buf_check_timestamp(curbuf, FALSE);
curwin->w_topline = 1;
#ifdef FEAT_DIFF
curwin->w_topfill = 0;
This fixes the problem with :bn/:bp, and all of the tests still pass.
At this point, I also want to point out a problem with the existing test,
reproduced below:
func Test_shortmess_F2()
e file1
e file2
call assert_match('file1', execute('bn', ''))
call assert_match('file2', execute('bn', ''))
set shortmess+=F
call assert_true(empty(execute('bn', '')))
call assert_true(empty(execute('bn', '')))
set hidden
call assert_true(empty(execute('bn', '')))
call assert_true(empty(execute('bn', '')))
set nohidden
call assert_true(empty(execute('bn', '')))
call assert_true(empty(execute('bn', '')))
set shortmess&
call assert_match('file1', execute('bn', ''))
call assert_match('file2', execute('bn', ''))
bwipe
bwipe
endfunc
This test is correct, meaning it should pass for the commands to be considered
working properly. The question is: Why doesn't this test catch the problem I
noticed here?
Well, we can go back to the master branch (no patch) and see:
$ ./vim --clean
:set hidden
:e file1
:e file2
:let x = execute('bn', '')
" Notice, the message appears, as expected.
:echo x
" But, it wasn't captured!
I'm not sure how to fix this problem. The bug appears to be that execute()
does not capture messages that are set to be printed after the next redraw,
as opposed to being printed immediately. Is my understanding correct here?
Thanks,
Jason Franklin
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/50b36ba4-ddfa-4a14-acae-dd8aa062e72f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.