From dcb170018642ec144cd87d9d9fe076575b8d1263 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 7 Jul 2016 18:58:59 +0200 Subject: [PATCH] patch 7.4.1997 Problem: Cannot easily scroll the quickfix window. Solution: Add ":cbottom". --- runtime/doc/quickfix.txt | 6 ++++ src/ex_cmds.h | 3 ++ src/ex_docmd.c | 1 + src/proto/quickfix.pro | 1 + src/quickfix.c | 55 +++++++++++++++++++++++++---------- src/testdir/test_quickfix.vim | 13 +++++++++ src/version.c | 2 ++ 7 files changed, 66 insertions(+), 15 deletions(-) diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt index 61b8656736..9fb6b18c41 100644 --- a/runtime/doc/quickfix.txt +++ b/runtime/doc/quickfix.txt @@ -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: > diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 5053e602e6..8c64d331ad 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -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), diff --git a/src/ex_docmd.c b/src/ex_docmd.c index ad4ba7c4e5..0be3a69102 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -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 diff --git a/src/proto/quickfix.pro b/src/proto/quickfix.pro index cc60eddbd2..a2b6b76cbc 100644 --- a/src/proto/quickfix.pro +++ b/src/proto/quickfix.pro @@ -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); diff --git a/src/quickfix.c b/src/quickfix.c index 7bfd488051..45659a0242 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -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; } diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim index d624baf80a..01e21106ed 100644 --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -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 diff --git a/src/version.c b/src/version.c index b6b9e59eb2..d606bab2ab 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1997, /**/ 1996, /**/