patch 7.4.1997
Problem:    Cannot easily scroll the quickfix window.
Solution:   Add ":cbottom".
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
index 61b8656..9fb6b18 100644
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -437,6 +437,12 @@
 :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 5053e60..8c64d33 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -259,6 +259,9 @@
 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 ad4ba7c..0be3a69 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -129,6 +129,7 @@
 # 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 cc60edd..a2b6b76 100644
--- a/src/proto/quickfix.pro
+++ b/src/proto/quickfix.pro
@@ -9,6 +9,7 @@
 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 7bfd488..45659a0 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2808,6 +2808,41 @@
 }
 
 /*
+ * 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_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 d624baf..01e2110 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1414,3 +1414,16 @@
   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 b6b9e59..d606bab 100644
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1997,
+/**/
     1996,
 /**/
     1995,