summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0877
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0877')
-rw-r--r--data/vim/patches/8.1.0877376
1 files changed, 376 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0877 b/data/vim/patches/8.1.0877
new file mode 100644
index 000000000..a1b35b762
--- /dev/null
+++ b/data/vim/patches/8.1.0877
@@ -0,0 +1,376 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0877
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0877
+Problem: New buffer used every time the quickfix window is opened.
+Solution: Reuse the buffer. (Yegappan Lakshmanan, closes #3902)
+Files: src/buffer.c, src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+
+*** ../vim-8.1.0876/src/buffer.c 2019-01-26 17:28:22.220599167 +0100
+--- src/buffer.c 2019-02-05 20:49:04.364708960 +0100
+***************
+*** 5753,5769 ****
+ #if defined(FEAT_QUICKFIX)
+ if (bt_quickfix(buf))
+ {
+- win_T *win;
+- tabpage_T *tp;
+-
+ /*
+! * For location list window, w_llist_ref points to the location list.
+! * For quickfix window, w_llist_ref is NULL.
+ */
+! if (find_win_for_buf(buf, &win, &tp) == OK && win->w_llist_ref != NULL)
+! return (char_u *)_(msg_loclist);
+! else
+ return (char_u *)_(msg_qflist);
+ }
+ #endif
+
+--- 5753,5766 ----
+ #if defined(FEAT_QUICKFIX)
+ if (bt_quickfix(buf))
+ {
+ /*
+! * Differentiate between the quickfix and location list buffers using
+! * the buffer number stored in the global quickfix stack.
+ */
+! if (buf->b_fnum == qf_stack_get_bufnr())
+ return (char_u *)_(msg_qflist);
++ else
++ return (char_u *)_(msg_loclist);
+ }
+ #endif
+
+*** ../vim-8.1.0876/src/proto/quickfix.pro 2018-11-11 22:50:20.806297851 +0100
+--- src/proto/quickfix.pro 2019-02-05 20:49:04.364708960 +0100
+***************
+*** 1,5 ****
+--- 1,6 ----
+ /* quickfix.c */
+ int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title, char_u *enc);
++ int qf_stack_get_bufnr(void);
+ void qf_free_all(win_T *wp);
+ void check_quickfix_busy(void);
+ void copy_loclist_stack(win_T *from, win_T *to);
+*** ../vim-8.1.0876/src/quickfix.c 2019-01-31 14:27:01.238142723 +0100
+--- src/quickfix.c 2019-02-05 20:49:04.364708960 +0100
+***************
+*** 48,53 ****
+--- 48,54 ----
+ */
+ #define LISTCOUNT 10
+ #define INVALID_QFIDX (-1)
++ #define INVALID_QFBUFNR (0)
+
+ /*
+ * Quickfix list type.
+***************
+*** 107,112 ****
+--- 108,114 ----
+ int qf_curlist; // current error list
+ qf_list_T qf_lists[LISTCOUNT];
+ qfltype_T qfl_type; // type of list
++ int qf_bufnr; // quickfix window buffer number
+ };
+
+ static qf_info_T ql_info; // global quickfix list
+***************
+*** 1853,1858 ****
+--- 1855,1891 ----
+ }
+
+ /*
++ * Return the global quickfix stack window buffer number.
++ */
++ int
++ qf_stack_get_bufnr(void)
++ {
++ return ql_info.qf_bufnr;
++ }
++
++ /*
++ * Wipe the quickfix window buffer (if present) for the specified
++ * quickfix/location list.
++ */
++ static void
++ wipe_qf_buffer(qf_info_T *qi)
++ {
++ buf_T *qfbuf;
++
++ if (qi->qf_bufnr != INVALID_QFBUFNR)
++ {
++ qfbuf = buflist_findnr(qi->qf_bufnr);
++ if (qfbuf != NULL && qfbuf->b_nwindows == 0)
++ {
++ // If the quickfix buffer is not loaded in any window, then
++ // wipe the buffer.
++ close_buffer(NULL, qfbuf, DOBUF_WIPE, FALSE);
++ qi->qf_bufnr = INVALID_QFBUFNR;
++ }
++ }
++ }
++
++ /*
+ * Free a location list stack
+ */
+ static void
+***************
+*** 1876,1881 ****
+--- 1909,1917 ----
+ locstack_queue_delreq(qi);
+ else
+ {
++ // If the quickfix window buffer is loaded, then wipe it
++ wipe_qf_buffer(qi);
++
+ for (i = 0; i < qi->qf_listcount; ++i)
+ qf_free(&qi->qf_lists[i]);
+ vim_free(qi);
+***************
+*** 2066,2071 ****
+--- 2102,2108 ----
+ {
+ qi->qf_refcount++;
+ qi->qfl_type = qfltype;
++ qi->qf_bufnr = INVALID_QFBUFNR;
+ }
+ return qi;
+ }
+***************
+*** 2741,2747 ****
+ }
+
+ /*
+! * Find a non-quickfix window using the given location list.
+ * Returns NULL if a matching window is not found.
+ */
+ static win_T *
+--- 2778,2785 ----
+ }
+
+ /*
+! * Find a non-quickfix window in the current tabpage using the given location
+! * list stack.
+ * Returns NULL if a matching window is not found.
+ */
+ static win_T *
+***************
+*** 3988,3994 ****
+ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+ set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+ OPT_LOCAL);
+! set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
+ RESET_BINDING(curwin);
+ #ifdef FEAT_DIFF
+ curwin->w_p_diff = FALSE;
+--- 4026,4032 ----
+ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+ set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+ OPT_LOCAL);
+! set_option_value((char_u *)"bh", 0L, (char_u *)"hide", OPT_LOCAL);
+ RESET_BINDING(curwin);
+ #ifdef FEAT_DIFF
+ curwin->w_p_diff = FALSE;
+***************
+*** 3997,4002 ****
+--- 4035,4042 ----
+ set_option_value((char_u *)"fdm", 0L, (char_u *)"manual",
+ OPT_LOCAL);
+ #endif
++ // save the number of the new buffer
++ qi->qf_bufnr = curbuf->b_fnum;
+ }
+
+ // Only set the height when still in the same tab page and there is no
+***************
+*** 4212,4217 ****
+--- 4252,4267 ----
+ tabpage_T *tp;
+ win_T *win;
+
++ if (qi->qf_bufnr != INVALID_QFBUFNR)
++ {
++ buf_T *qfbuf;
++ qfbuf = buflist_findnr(qi->qf_bufnr);
++ if (qfbuf != NULL)
++ return qfbuf;
++ // buffer is no longer present
++ qi->qf_bufnr = INVALID_QFBUFNR;
++ }
++
+ FOR_ALL_TAB_WINDOWS(tp, win)
+ if (is_qf_win(win, qi))
+ return win->w_buffer;
+***************
+*** 6581,6602 ****
+ }
+
+ /*
+- * Find the non-location list window with the specified location list stack in
+- * the current tabpage.
+- */
+- static win_T *
+- find_win_with_ll(qf_info_T *qi)
+- {
+- win_T *wp = NULL;
+-
+- FOR_ALL_WINDOWS(wp)
+- if ((wp->w_llist == qi) && !bt_quickfix(wp->w_buffer))
+- return wp;
+-
+- return NULL;
+- }
+-
+- /*
+ * Free the entire quickfix/location list stack.
+ * If the quickfix/location list window is open, then clear it.
+ */
+--- 6631,6636 ----
+***************
+*** 6605,6611 ****
+ {
+ win_T *qfwin = qf_find_win(qi);
+ win_T *llwin = NULL;
+- win_T *orig_wp = wp;
+
+ if (qfwin != NULL)
+ {
+--- 6639,6644 ----
+***************
+*** 6619,6625 ****
+ {
+ // If in the location list window, then use the non-location list
+ // window with this location list (if present)
+! llwin = find_win_with_ll(qi);
+ if (llwin != NULL)
+ wp = llwin;
+ }
+--- 6652,6658 ----
+ {
+ // If in the location list window, then use the non-location list
+ // window with this location list (if present)
+! llwin = qf_find_win_with_loclist(qi);
+ if (llwin != NULL)
+ wp = llwin;
+ }
+***************
+*** 6631,6649 ****
+ qi->qf_curlist = 0;
+ qi->qf_listcount = 0;
+ }
+! else if (IS_LL_WINDOW(orig_wp))
+ {
+ // If the location list window is open, then create a new empty
+ // location list
+ qf_info_T *new_ll = qf_alloc_stack(QFLT_LOCATION);
+
+ // first free the list reference in the location list window
+! ll_free_all(&orig_wp->w_llist_ref);
+
+! orig_wp->w_llist_ref = new_ll;
+! if (llwin != NULL)
+ {
+! llwin->w_llist = new_ll;
+ new_ll->qf_refcount++;
+ }
+ }
+--- 6664,6683 ----
+ qi->qf_curlist = 0;
+ qi->qf_listcount = 0;
+ }
+! else if (qfwin != NULL)
+ {
+ // If the location list window is open, then create a new empty
+ // location list
+ qf_info_T *new_ll = qf_alloc_stack(QFLT_LOCATION);
++ new_ll->qf_bufnr = qfwin->w_buffer->b_fnum;
+
+ // first free the list reference in the location list window
+! ll_free_all(&qfwin->w_llist_ref);
+
+! qfwin->w_llist_ref = new_ll;
+! if (wp != qfwin)
+ {
+! wp->w_llist = new_ll;
+ new_ll->qf_refcount++;
+ }
+ }
+*** ../vim-8.1.0876/src/testdir/test_quickfix.vim 2019-01-31 14:27:01.238142723 +0100
+--- src/testdir/test_quickfix.vim 2019-02-05 20:49:04.364708960 +0100
+***************
+*** 3899,3901 ****
+--- 3899,3944 ----
+ set efm&
+ call delete('Xfile1')
+ endfunc
++
++ " Test for the quickfix window buffer
++ func Xqfbuf_test(cchar)
++ call s:setup_commands(a:cchar)
++
++ " Quickfix buffer should be reused across closing and opening a quickfix
++ " window
++ Xexpr "F1:10:Line10"
++ Xopen
++ let qfbnum = bufnr('')
++ Xclose
++ " Even after the quickfix window is closed, the buffer should be loaded
++ call assert_true(bufloaded(qfbnum))
++ Xopen
++ " Buffer should be reused when opening the window again
++ call assert_equal(qfbnum, bufnr(''))
++ Xclose
++
++ if a:cchar == 'l'
++ %bwipe
++ " For a location list, when both the file window and the location list
++ " window for the list are closed, then the buffer should be freed.
++ new | only
++ lexpr "F1:10:Line10"
++ let wid = win_getid()
++ lopen
++ let qfbnum = bufnr('')
++ call assert_match(qfbnum . ' %a- "\[Location List]"', execute('ls'))
++ close
++ " When the location list window is closed, the buffer name should not
++ " change to 'Quickfix List'
++ call assert_match(qfbnum . ' h- "\[Location List]"', execute('ls'))
++ call assert_true(bufloaded(qfbnum))
++
++ new | only
++ call assert_false(bufloaded(qfbnum))
++ endif
++ endfunc
++
++ func Test_qfbuf()
++ call Xqfbuf_test('c')
++ call Xqfbuf_test('l')
++ endfunc
+*** ../vim-8.1.0876/src/version.c 2019-02-05 20:11:57.355368329 +0100
+--- src/version.c 2019-02-05 20:45:38.242078612 +0100
+***************
+*** 785,786 ****
+--- 785,788 ----
+ { /* Add new patch number below this line */
++ /**/
++ 877,
+ /**/
+
+--
+To the optimist, the glass is half full.
+To the pessimist, the glass is half empty.
+To the engineer, the glass is twice as big as it needs to be.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///