mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 9.1.0557: moving in the buffer list doesn't work as documented
Problem: moving in the buffer list doesn't work as documented (SenileFelineS) Solution: Skip non-help buffers, when run from normal buffers, else only move from help buffers to the next help buffer (LemonBoy) As explained in the help section for :bnext and :bprev the commands should jump from help buffers to help buffers (and from regular ones to regular ones). fixes: #4478 closes: #15198 Signed-off-by: LemonBoy <thatlemon@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
parent
7a85e343d2
commit
893eeeb445
@ -1,4 +1,4 @@
|
|||||||
*version9.txt* For Vim version 9.1. Last change: 2024 Jul 09
|
*version9.txt* For Vim version 9.1. Last change: 2024 Jul 10
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -41580,6 +41580,9 @@ Changed~
|
|||||||
- provide information about function arguments using the get(func, "arity")
|
- provide information about function arguments using the get(func, "arity")
|
||||||
function |get()-func|
|
function |get()-func|
|
||||||
- |:bwipe| also wipes jumplist and tagstack data
|
- |:bwipe| also wipes jumplist and tagstack data
|
||||||
|
- moving in the buffer list using |:bnext| and similar commands, behaves as
|
||||||
|
documented and skips help buffers (if not run from a help buffer, else
|
||||||
|
moves to the next/previous help buffer).
|
||||||
|
|
||||||
*added-9.2*
|
*added-9.2*
|
||||||
Added ~
|
Added ~
|
||||||
|
29
src/buffer.c
29
src/buffer.c
@ -50,6 +50,7 @@ static void free_buffer(buf_T *);
|
|||||||
static void free_buffer_stuff(buf_T *buf, int free_options);
|
static void free_buffer_stuff(buf_T *buf, int free_options);
|
||||||
static int bt_nofileread(buf_T *buf);
|
static int bt_nofileread(buf_T *buf);
|
||||||
static void no_write_message_buf(buf_T *buf);
|
static void no_write_message_buf(buf_T *buf);
|
||||||
|
static int do_buffer_ext(int action, int start, int dir, int count, int flags);
|
||||||
|
|
||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
# define dev_T dev_t
|
# define dev_T dev_t
|
||||||
@ -1106,13 +1107,30 @@ goto_buffer(
|
|||||||
{
|
{
|
||||||
bufref_T old_curbuf;
|
bufref_T old_curbuf;
|
||||||
int save_sea = swap_exists_action;
|
int save_sea = swap_exists_action;
|
||||||
|
int skip_help_buf;
|
||||||
|
|
||||||
|
switch (eap->cmdidx)
|
||||||
|
{
|
||||||
|
case CMD_bnext:
|
||||||
|
case CMD_sbnext:
|
||||||
|
case CMD_bNext:
|
||||||
|
case CMD_bprevious:
|
||||||
|
case CMD_sbNext:
|
||||||
|
case CMD_sbprevious:
|
||||||
|
skip_help_buf = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
skip_help_buf = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
set_bufref(&old_curbuf, curbuf);
|
set_bufref(&old_curbuf, curbuf);
|
||||||
|
|
||||||
if (swap_exists_action == SEA_NONE)
|
if (swap_exists_action == SEA_NONE)
|
||||||
swap_exists_action = SEA_DIALOG;
|
swap_exists_action = SEA_DIALOG;
|
||||||
(void)do_buffer(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO,
|
(void)do_buffer_ext(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO, start, dir, count,
|
||||||
start, dir, count, eap->forceit);
|
(eap->forceit ? DOBUF_FORCEIT : 0) |
|
||||||
|
(skip_help_buf ? DOBUF_SKIPHELP : 0));
|
||||||
if (swap_exists_action == SEA_QUIT && *eap->cmd == 's')
|
if (swap_exists_action == SEA_QUIT && *eap->cmd == 's')
|
||||||
{
|
{
|
||||||
#if defined(FEAT_EVAL)
|
#if defined(FEAT_EVAL)
|
||||||
@ -1343,8 +1361,11 @@ do_buffer_ext(
|
|||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
buf = lastbuf;
|
buf = lastbuf;
|
||||||
}
|
}
|
||||||
// don't count unlisted buffers
|
// Don't count unlisted buffers.
|
||||||
if (unload || buf->b_p_bl)
|
// Avoid non-help buffers if the starting point was a non-help buffer and
|
||||||
|
// vice-versa.
|
||||||
|
if (unload || (buf->b_p_bl
|
||||||
|
&& ((flags & DOBUF_SKIPHELP) == 0 || buf->b_help == bp->b_help)))
|
||||||
{
|
{
|
||||||
--count;
|
--count;
|
||||||
bp = NULL; // use this buffer as new starting point
|
bp = NULL; // use this buffer as new starting point
|
||||||
|
@ -126,6 +126,52 @@ func Test_buflist_browse()
|
|||||||
%bwipe!
|
%bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for :bnext and :bprev when called from help and non-help buffers.
|
||||||
|
func Test_bnext_bprev_help()
|
||||||
|
%bwipe!
|
||||||
|
|
||||||
|
e XHelp1 | set bt=help
|
||||||
|
let b1 = bufnr()
|
||||||
|
e Xbuf1
|
||||||
|
let b2 = bufnr()
|
||||||
|
|
||||||
|
" There's only one buffer of each type.
|
||||||
|
b XHelp1
|
||||||
|
bnext | call assert_equal(b1, bufnr())
|
||||||
|
bprev | call assert_equal(b1, bufnr())
|
||||||
|
b Xbuf1
|
||||||
|
bnext | call assert_equal(b2, bufnr())
|
||||||
|
bprev | call assert_equal(b2, bufnr())
|
||||||
|
|
||||||
|
" Add one more buffer of each type.
|
||||||
|
e XHelp2 | set bt=help
|
||||||
|
let b3 = bufnr()
|
||||||
|
e Xbuf2
|
||||||
|
let b4 = bufnr()
|
||||||
|
|
||||||
|
" Help buffer jumps to help buffer.
|
||||||
|
b XHelp1
|
||||||
|
bnext | call assert_equal(b3, bufnr())
|
||||||
|
bnext | call assert_equal(b1, bufnr())
|
||||||
|
bprev | call assert_equal(b3, bufnr())
|
||||||
|
bprev | call assert_equal(b1, bufnr())
|
||||||
|
|
||||||
|
" Regular buffer jumps to regular buffer.
|
||||||
|
b Xbuf1
|
||||||
|
bnext | call assert_equal(b4, bufnr())
|
||||||
|
bnext | call assert_equal(b2, bufnr())
|
||||||
|
bprev | call assert_equal(b4, bufnr())
|
||||||
|
bprev | call assert_equal(b2, bufnr())
|
||||||
|
|
||||||
|
" :brewind and :blast are not affected by the buffer type.
|
||||||
|
b Xbuf2
|
||||||
|
brewind | call assert_equal(b1, bufnr())
|
||||||
|
b XHelp1
|
||||||
|
blast | call assert_equal(b4, bufnr())
|
||||||
|
|
||||||
|
%bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for :bdelete
|
" Test for :bdelete
|
||||||
func Test_bdelete_cmd()
|
func Test_bdelete_cmd()
|
||||||
%bwipe!
|
%bwipe!
|
||||||
|
@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
557,
|
||||||
/**/
|
/**/
|
||||||
556,
|
556,
|
||||||
/**/
|
/**/
|
||||||
|
@ -1074,6 +1074,8 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
|
|||||||
// Values for flags argument of do_buffer()
|
// Values for flags argument of do_buffer()
|
||||||
#define DOBUF_FORCEIT 1 // :cmd!
|
#define DOBUF_FORCEIT 1 // :cmd!
|
||||||
#define DOBUF_NOPOPUP 2 // skip popup window buffers
|
#define DOBUF_NOPOPUP 2 // skip popup window buffers
|
||||||
|
#define DOBUF_SKIPHELP 4 // skip or keep help buffers depending on b_help of the
|
||||||
|
// starting buffer
|
||||||
|
|
||||||
// Values for sub_cmd and which_pat argument for search_regcomp()
|
// Values for sub_cmd and which_pat argument for search_regcomp()
|
||||||
// Also used for which_pat argument for searchit()
|
// Also used for which_pat argument for searchit()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user