1
0
forked from aniani/vim

patch 9.1.0934: hard to view an existing buffer in the preview window

Problem:  hard to view an existing buffer in the preview window
Solution: add the :pbuffer command (Yinzuo Jiang)

Similar as `:pedit` and `:buffer` command. `:pbuffer` edits buffer [N]
from the buffer list in the preview window.

`:pbuffer` can also open special buffer, for example terminal buffer.

closes: #16222

Signed-off-by: Yinzuo Jiang <jiangyinzuo@foxmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yinzuo Jiang
2024-12-16 21:22:09 +01:00
committed by Christian Brabandt
parent 3920bb4356
commit a2a2fe841e
27 changed files with 287 additions and 72 deletions

View File

@@ -36,6 +36,7 @@ static void ex_autocmd(exarg_T *eap);
static void ex_doautocmd(exarg_T *eap);
static void ex_bunload(exarg_T *eap);
static void ex_buffer(exarg_T *eap);
static void do_exbuffer(exarg_T *eap);
static void ex_bmodified(exarg_T *eap);
static void ex_bnext(exarg_T *eap);
static void ex_bprevious(exarg_T *eap);
@@ -101,10 +102,14 @@ static void ex_tabs(exarg_T *eap);
static void ex_pclose(exarg_T *eap);
static void ex_ptag(exarg_T *eap);
static void ex_pedit(exarg_T *eap);
static void ex_pbuffer(exarg_T *eap);
static void prepare_preview_window(void);
static void back_to_current_window(win_T *curwin_save);
#else
# define ex_pclose ex_ni
# define ex_ptag ex_ni
# define ex_pedit ex_ni
# define ex_pbuffer ex_ni
#endif
static void ex_hide(exarg_T *eap);
static void ex_exit(exarg_T *eap);
@@ -5734,6 +5739,15 @@ ex_buffer(exarg_T *eap)
{
if (ERROR_IF_ANY_POPUP_WINDOW)
return;
do_exbuffer(eap);
}
/*
* ":buffer" command and alike.
*/
static void
do_exbuffer(exarg_T *eap)
{
if (*eap->arg)
eap->errmsg = ex_errmsg(e_trailing_characters_str, eap->arg);
else
@@ -9437,17 +9451,43 @@ ex_ptag(exarg_T *eap)
ex_pedit(exarg_T *eap)
{
win_T *curwin_save = curwin;
prepare_preview_window();
// Edit the file.
do_exedit(eap, NULL);
back_to_current_window(curwin_save);
}
/*
* ":pbuffer"
*/
static void
ex_pbuffer(exarg_T *eap)
{
win_T *curwin_save = curwin;
prepare_preview_window();
// Go to the buffer.
do_exbuffer(eap);
back_to_current_window(curwin_save);
}
static void
prepare_preview_window(void)
{
if (ERROR_IF_ANY_POPUP_WINDOW)
return;
// Open the preview window or popup and make it the current window.
g_do_tagpreview = p_pvh;
prepare_tagpreview(TRUE, TRUE, FALSE);
}
// Edit the file.
do_exedit(eap, NULL);
static void
back_to_current_window(win_T *curwin_save)
{
if (curwin != curwin_save && win_valid(curwin_save))
{
// Return cursor to where we were