]> granicus.if.org Git - vim/commitdiff
patch 7.4.1997 v7.4.1997
authorBram Moolenaar <Bram@vim.org>
Thu, 7 Jul 2016 16:58:59 +0000 (18:58 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 7 Jul 2016 16:58:59 +0000 (18:58 +0200)
Problem:    Cannot easily scroll the quickfix window.
Solution:   Add ":cbottom".

runtime/doc/quickfix.txt
src/ex_cmds.h
src/ex_docmd.c
src/proto/quickfix.pro
src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c

index 61b86567367de9342bb8707c745881d2135fd619..9fb6b18c4182036f6abe10127db4d2beb3e6bc74 100644 (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: >
index 5053e602e6110bea7e9182920d858243f03ff0de..8c64d331ad51a691ab8a639a4e91afdc971ae4aa 100644 (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),
index ad4ba7c4e547dca4b5324b899c01d244a8e1d774..0be3a69102177dc48e6353912b9f110d375b1e4d 100644 (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
index cc60eddbd2298f820b1d6ef35c7915a29df7d6a0..a2b6b76cbcca6a2d4d75d5cff9597e7398432444 100644 (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);
index 7bfd488051b2b7ee132cdb9e6d2633a972115fe2..45659a024225d8c2fd8bdfa8ffde7b4dc638f48e 100644 (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;
 }
index d624baf80a1696bbdc5368bf8003bb72aeec58f9..01e21106ede1c37738f681d2dc7f8e98529478b1 100644 (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
index b6b9e59eb2852129a8bce16fa9b3a405ed15ef48..d606bab2abddc05e6de4e96f65987f88f997e1a6 100644 (file)
@@ -758,6 +758,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1997,
 /**/
     1996,
 /**/