1
0
forked from aniani/vim

patch 7.4.1997

Problem:    Cannot easily scroll the quickfix window.
Solution:   Add ":cbottom".
This commit is contained in:
Bram Moolenaar 2016-07-07 18:58:59 +02:00
parent 1e5e1231ac
commit dcb1700186
7 changed files with 66 additions and 15 deletions

View File

@ -437,6 +437,12 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
:lw[indow] [height] Same as ":cwindow", except use the window showing the
location list for the current window.
:cbo[ttom] Put the cursor in the last line of the quickfix window
and scroll to make it visible. This is useful for
when errors are added by an asynchronous callback.
Only call it once in a while if there are many
updates to avoid a lot of redrawing.
Normally the quickfix window is at the bottom of the screen. If there are
vertical splits, it's at the bottom of the rightmost column of windows. To
make it always occupy the full width: >

View File

@ -259,6 +259,9 @@ EX(CMD_catch, "catch", ex_catch,
EX(CMD_cbuffer, "cbuffer", ex_cbuffer,
BANG|RANGE|NOTADR|WORD1|TRLBAR,
ADDR_LINES),
EX(CMD_cbottom, "cbottom", ex_cbottom,
TRLBAR,
ADDR_LINES),
EX(CMD_cc, "cc", ex_cc,
RANGE|NOTADR|COUNT|TRLBAR|BANG,
ADDR_LINES),

View File

@ -129,6 +129,7 @@ static int getargopt(exarg_T *eap);
# define ex_cclose ex_ni
# define ex_copen ex_ni
# define ex_cwindow ex_ni
# define ex_cbottom ex_ni
#endif
#if !defined(FEAT_QUICKFIX) || !defined(FEAT_EVAL)
# define ex_cexpr ex_ni

View File

@ -9,6 +9,7 @@ void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long
void ex_cwindow(exarg_T *eap);
void ex_cclose(exarg_T *eap);
void ex_copen(exarg_T *eap);
void ex_cbottom(exarg_T *eap);
linenr_T qf_current_entry(win_T *wp);
int bt_quickfix(buf_T *buf);
int bt_nofile(buf_T *buf);

View File

@ -2807,6 +2807,41 @@ ex_copen(exarg_T *eap)
update_topline(); /* scroll to show the line */
}
/*
* Move the cursor in the quickfix window to "lnum".
*/
static void
qf_win_goto(win_T *win, linenr_T lnum)
{
win_T *old_curwin = curwin;
curwin = win;
curbuf = win->w_buffer;
curwin->w_cursor.lnum = lnum;
curwin->w_cursor.col = 0;
#ifdef FEAT_VIRTUALEDIT
curwin->w_cursor.coladd = 0;
#endif
curwin->w_curswant = 0;
update_topline(); /* scroll to show the line */
redraw_later(VALID);
curwin->w_redr_status = TRUE; /* update ruler */
curwin = old_curwin;
curbuf = curwin->w_buffer;
}
/*
* :cbottom command.
*/
void
ex_cbottom(exarg_T *eap UNUSED)
{
win_T *win = qf_find_win(&ql_info);
if (win != NULL && win->w_cursor.lnum != win->w_buffer->b_ml.ml_line_count)
qf_win_goto(win, win->w_buffer->b_ml.ml_line_count);
}
/*
* Return the number of the current entry (line number in the quickfix
* window).
@ -2844,27 +2879,17 @@ qf_win_pos_update(
&& qf_index <= win->w_buffer->b_ml.ml_line_count
&& old_qf_index != qf_index)
{
win_T *old_curwin = curwin;
curwin = win;
curbuf = win->w_buffer;
if (qf_index > old_qf_index)
{
curwin->w_redraw_top = old_qf_index;
curwin->w_redraw_bot = qf_index;
win->w_redraw_top = old_qf_index;
win->w_redraw_bot = qf_index;
}
else
{
curwin->w_redraw_top = qf_index;
curwin->w_redraw_bot = old_qf_index;
win->w_redraw_top = qf_index;
win->w_redraw_bot = old_qf_index;
}
curwin->w_cursor.lnum = qf_index;
curwin->w_cursor.col = 0;
update_topline(); /* scroll to show the line */
redraw_later(VALID);
curwin->w_redr_status = TRUE; /* update ruler */
curwin = old_curwin;
curbuf = curwin->w_buffer;
qf_win_goto(win, qf_index);
}
return win != NULL;
}

View File

@ -1414,3 +1414,16 @@ echo string(loc_two)
call delete('Xone', 'rf')
call delete('Xtwo', 'rf')
endfunc
function Test_cbottom()
call setqflist([{'filename': 'foo', 'lnum': 42}])
copen
let wid = win_getid()
call assert_equal(1, line('.'))
wincmd w
call setqflist([{'filename': 'var', 'lnum': 24}], 'a')
cbottom
call win_gotoid(wid)
call assert_equal(2, line('.'))
cclose
endfunc

View File

@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1997,
/**/
1996,
/**/