diff options
author | Sam Bingner <sam@bingner.com> | 2018-12-13 15:11:52 -1000 |
---|---|---|
committer | Sam Bingner <sam@bingner.com> | 2018-12-13 15:11:52 -1000 |
commit | 957aa75d05c00731d7112bed7b68ce4568667d0c (patch) | |
tree | 0445216818495a7864eaa3acde1a1570d34b958d /data/vim/patches/8.1.0431 | |
parent | c54a909c8b5a8519130803cf55f68603c0ad3682 (diff) |
Update vim
Diffstat (limited to 'data/vim/patches/8.1.0431')
-rw-r--r-- | data/vim/patches/8.1.0431 | 562 |
1 files changed, 562 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0431 b/data/vim/patches/8.1.0431 new file mode 100644 index 000000000..3ccc35c90 --- /dev/null +++ b/data/vim/patches/8.1.0431 @@ -0,0 +1,562 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0431 +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.0431 +Problem: The qf_jump() function is too long. +Solution: Refactor to split it into several functions. (Yegappan Lakshmanan) +Files: src/quickfix.c + + +*** ../vim-8.1.0430/src/quickfix.c 2018-09-19 21:55:58.681068412 +0200 +--- src/quickfix.c 2018-09-24 21:46:42.589868380 +0200 +*************** +*** 2521,2530 **** + get_nth_valid_entry( + qf_list_T *qfl, + int errornr, +! qfline_T *qf_ptr, +! int *qf_index, +! int dir) + { + qfline_T *prev_qf_ptr; + int prev_index; + static char_u *e_no_more_items = (char_u *)N_("E553: No more items"); +--- 2521,2531 ---- + get_nth_valid_entry( + qf_list_T *qfl, + int errornr, +! int dir, +! int *new_qfidx) + { ++ qfline_T *qf_ptr = qfl->qf_ptr; ++ int qf_idx = qfl->qf_index; + qfline_T *prev_qf_ptr; + int prev_index; + static char_u *e_no_more_items = (char_u *)N_("E553: No more items"); +*************** +*** 2533,2548 **** + while (errornr--) + { + prev_qf_ptr = qf_ptr; +! prev_index = *qf_index; + + if (dir == FORWARD || dir == FORWARD_FILE) +! qf_ptr = get_next_valid_entry(qfl, qf_ptr, qf_index, dir); + else +! qf_ptr = get_prev_valid_entry(qfl, qf_ptr, qf_index, dir); + if (qf_ptr == NULL) + { + qf_ptr = prev_qf_ptr; +! *qf_index = prev_index; + if (err != NULL) + { + EMSG(_(err)); +--- 2534,2549 ---- + while (errornr--) + { + prev_qf_ptr = qf_ptr; +! prev_index = qf_idx; + + if (dir == FORWARD || dir == FORWARD_FILE) +! qf_ptr = get_next_valid_entry(qfl, qf_ptr, &qf_idx, dir); + else +! qf_ptr = get_prev_valid_entry(qfl, qf_ptr, &qf_idx, dir); + if (qf_ptr == NULL) + { + qf_ptr = prev_qf_ptr; +! qf_idx = prev_index; + if (err != NULL) + { + EMSG(_(err)); +*************** +*** 2554,2581 **** + err = NULL; + } + + return qf_ptr; + } + + /* +! * Get n'th (errornr) quickfix entry + */ + static qfline_T * +! get_nth_entry( +! qf_list_T *qfl, +! int errornr, +! qfline_T *qf_ptr, +! int *cur_qfidx) + { +! int qf_idx = *cur_qfidx; + +! /* New error number is less than the current error number */ + while (errornr < qf_idx && qf_idx > 1 && qf_ptr->qf_prev != NULL) + { + --qf_idx; + qf_ptr = qf_ptr->qf_prev; + } +! /* New error number is greater than the current error number */ + while (errornr > qf_idx && qf_idx < qfl->qf_count && + qf_ptr->qf_next != NULL) + { +--- 2555,2581 ---- + err = NULL; + } + ++ *new_qfidx = qf_idx; + return qf_ptr; + } + + /* +! * Get n'th (errornr) quickfix entry from the current entry in the quickfix +! * list 'qfl'. Returns a pointer to the new entry and the index in 'new_qfidx' + */ + static qfline_T * +! get_nth_entry(qf_list_T *qfl, int errornr, int *new_qfidx) + { +! qfline_T *qf_ptr = qfl->qf_ptr; +! int qf_idx = qfl->qf_index; + +! // New error number is less than the current error number + while (errornr < qf_idx && qf_idx > 1 && qf_ptr->qf_prev != NULL) + { + --qf_idx; + qf_ptr = qf_ptr->qf_prev; + } +! // New error number is greater than the current error number + while (errornr > qf_idx && qf_idx < qfl->qf_count && + qf_ptr->qf_next != NULL) + { +*************** +*** 2583,2589 **** + qf_ptr = qf_ptr->qf_next; + } + +! *cur_qfidx = qf_idx; + return qf_ptr; + } + +--- 2583,2615 ---- + qf_ptr = qf_ptr->qf_next; + } + +! *new_qfidx = qf_idx; +! return qf_ptr; +! } +! +! /* +! * Get a entry specied by 'errornr' and 'dir' from the current +! * quickfix/location list. 'errornr' specifies the index of the entry and 'dir' +! * specifies the direction (FORWARD/BACKWARD/FORWARD_FILE/BACKWARD_FILE). +! * Returns a pointer to the entry and the index of the new entry is stored in +! * 'new_qfidx'. +! */ +! static qfline_T * +! qf_get_entry( +! qf_list_T *qfl, +! int errornr, +! int dir, +! int *new_qfidx) +! { +! qfline_T *qf_ptr = qfl->qf_ptr; +! int qfidx = qfl->qf_index; +! +! if (dir != 0) // next/prev valid entry +! qf_ptr = get_nth_valid_entry(qfl, errornr, dir, &qfidx); +! else if (errornr != 0) // go to specified number +! qf_ptr = get_nth_entry(qfl, errornr, &qfidx); +! +! *new_qfidx = qfidx; + return qf_ptr; + } + +*************** +*** 2881,2886 **** +--- 2907,2915 ---- + + /* + * Edit the selected file or help file. ++ * Returns OK if successfully edited the file, FAIL on failing to open the ++ * buffer and NOTDONE if the quickfix/location list was freed by an autocmd ++ * when opening the buffer. + */ + static int + qf_jump_edit_buffer( +*************** +*** 2888,2895 **** + qfline_T *qf_ptr, + int forceit, + win_T *oldwin, +! int *opened_window, +! int *abort) + { + qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist]; + int retval = OK; +--- 2917,2923 ---- + qfline_T *qf_ptr, + int forceit, + win_T *oldwin, +! int *opened_window) + { + qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist]; + int retval = OK; +*************** +*** 2925,2937 **** + if (!win_valid_any_tab(oldwin)) + { + EMSG(_("E924: Current window was closed")); +- *abort = TRUE; + *opened_window = FALSE; + } + else if (!qflist_valid(oldwin, save_qfid)) + { + EMSG(_(e_loc_list_changed)); +! *abort = TRUE; + } + } + else if (old_qf_curlist != qi->qf_curlist +--- 2953,2965 ---- + if (!win_valid_any_tab(oldwin)) + { + EMSG(_("E924: Current window was closed")); + *opened_window = FALSE; ++ return NOTDONE; + } + else if (!qflist_valid(oldwin, save_qfid)) + { + EMSG(_(e_loc_list_changed)); +! return NOTDONE; + } + } + else if (old_qf_curlist != qi->qf_curlist +*************** +*** 2941,2951 **** + EMSG(_("E925: Current quickfix was changed")); + else + EMSG(_(e_loc_list_changed)); +! *abort = TRUE; + } +- +- if (*abort) +- retval = FAIL; + } + + return retval; +--- 2969,2976 ---- + EMSG(_("E925: Current quickfix was changed")); + else + EMSG(_(e_loc_list_changed)); +! return NOTDONE; + } + } + + return retval; +*************** +*** 3066,3071 **** +--- 3091,3180 ---- + } + + /* ++ * Find a usable window for opening a file from the quickfix/location list. If ++ * a window is not found then open a new window. ++ * Returns OK if successfully jumped or opened a window. Returns FAIL if not ++ * able to jump/open a window. Returns NOTDONE if a file is not associated ++ * with the entry. ++ */ ++ static int ++ qf_jump_open_window(qf_info_T *qi, qfline_T *qf_ptr, int *opened_window) ++ { ++ // For ":helpgrep" find a help window or open one. ++ if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)) ++ if (jump_to_help_window(qi, opened_window) == FAIL) ++ return FAIL; ++ ++ // If currently in the quickfix window, find another window to show the ++ // file in. ++ if (bt_quickfix(curbuf) && !*opened_window) ++ { ++ // If there is no file specified, we don't know where to go. ++ // But do advance, otherwise ":cn" gets stuck. ++ if (qf_ptr->qf_fnum == 0) ++ return NOTDONE; ++ ++ if (qf_jump_to_usable_window(qf_ptr->qf_fnum, opened_window) == FAIL) ++ return FAIL; ++ } ++ ++ return OK; ++ } ++ ++ /* ++ * Edit a selected file from the quickfix/location list and jump to a ++ * particular line/column, adjust the folds and display a message about the ++ * jump. ++ * Returns OK on success and FAIL on failing to open the file/buffer. Returns ++ * NOTDONE if the quickfix/location list is freed by an autocmd when opening ++ * the file. ++ */ ++ static int ++ qf_jump_to_buffer( ++ qf_info_T *qi, ++ int qf_index, ++ qfline_T *qf_ptr, ++ int forceit, ++ win_T *oldwin, ++ int *opened_window, ++ int openfold, ++ int print_message) ++ { ++ buf_T *old_curbuf; ++ linenr_T old_lnum; ++ int retval = OK; ++ ++ // If there is a file name, read the wanted file if needed, and check ++ // autowrite etc. ++ old_curbuf = curbuf; ++ old_lnum = curwin->w_cursor.lnum; ++ ++ if (qf_ptr->qf_fnum != 0) ++ { ++ retval = qf_jump_edit_buffer(qi, qf_ptr, forceit, oldwin, ++ opened_window); ++ if (retval != OK) ++ return retval; ++ } ++ ++ // When not switched to another buffer, still need to set pc mark ++ if (curbuf == old_curbuf) ++ setpcmark(); ++ ++ qf_jump_goto_line(qf_ptr->qf_lnum, qf_ptr->qf_col, qf_ptr->qf_viscol, ++ qf_ptr->qf_pattern); ++ ++ #ifdef FEAT_FOLDING ++ if ((fdo_flags & FDO_QUICKFIX) && openfold) ++ foldOpenCursor(); ++ #endif ++ if (print_message) ++ qf_jump_print_msg(qi, qf_index, qf_ptr, old_curbuf, old_lnum); ++ ++ return retval; ++ } ++ ++ /* + * jump to a quickfix line + * if dir == FORWARD go "errornr" valid entries forward + * if dir == BACKWARD go "errornr" valid entries backward +*************** +*** 3085,3099 **** + qfline_T *old_qf_ptr; + int qf_index; + int old_qf_index; +- buf_T *old_curbuf; +- linenr_T old_lnum; + char_u *old_swb = p_swb; + unsigned old_swb_flags = swb_flags; + int opened_window = FALSE; + win_T *oldwin = curwin; + int print_message = TRUE; + #ifdef FEAT_FOLDING +! int old_KeyTyped = KeyTyped; /* getting file may reset it */ + #endif + int retval = OK; + +--- 3194,3206 ---- + qfline_T *old_qf_ptr; + int qf_index; + int old_qf_index; + char_u *old_swb = p_swb; + unsigned old_swb_flags = swb_flags; + int opened_window = FALSE; + win_T *oldwin = curwin; + int print_message = TRUE; + #ifdef FEAT_FOLDING +! int old_KeyTyped = KeyTyped; // getting file may reset it + #endif + int retval = OK; + +*************** +*** 3113,3208 **** + old_qf_ptr = qf_ptr; + qf_index = qfl->qf_index; + old_qf_index = qf_index; +! if (dir != 0) /* next/prev valid entry */ + { +! qf_ptr = get_nth_valid_entry(qfl, errornr, qf_ptr, &qf_index, dir); +! if (qf_ptr == NULL) +! { +! qf_ptr = old_qf_ptr; +! qf_index = old_qf_index; +! goto theend; +! } + } +- else if (errornr != 0) /* go to specified number */ +- qf_ptr = get_nth_entry(qfl, errornr, qf_ptr, &qf_index); + + qfl->qf_index = qf_index; + if (qf_win_pos_update(qi, old_qf_index)) +! /* No need to print the error message if it's visible in the error +! * window */ + print_message = FALSE; + +! /* +! * For ":helpgrep" find a help window or open one. +! */ +! if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)) +! if (jump_to_help_window(qi, &opened_window) == FAIL) +! goto theend; +! +! /* +! * If currently in the quickfix window, find another window to show the +! * file in. +! */ +! if (bt_quickfix(curbuf) && !opened_window) +! { +! /* +! * If there is no file specified, we don't know where to go. +! * But do advance, otherwise ":cn" gets stuck. +! */ +! if (qf_ptr->qf_fnum == 0) +! goto theend; +! +! if (qf_jump_to_usable_window(qf_ptr->qf_fnum, &opened_window) == FAIL) +! goto failed; + } + +! /* +! * If there is a file name, +! * read the wanted file if needed, and check autowrite etc. +! */ +! old_curbuf = curbuf; +! old_lnum = curwin->w_cursor.lnum; +! +! if (qf_ptr->qf_fnum != 0) +! { +! int abort = FALSE; +! +! retval = qf_jump_edit_buffer(qi, qf_ptr, forceit, oldwin, +! &opened_window, &abort); +! if (abort) +! { +! qi = NULL; +! qf_ptr = NULL; +! } +! } +! +! if (retval == OK) +! { +! /* When not switched to another buffer, still need to set pc mark */ +! if (curbuf == old_curbuf) +! setpcmark(); +! +! if (qf_ptr != NULL) +! qf_jump_goto_line(qf_ptr->qf_lnum, qf_ptr->qf_col, +! qf_ptr->qf_viscol, qf_ptr->qf_pattern); +! +! #ifdef FEAT_FOLDING +! if ((fdo_flags & FDO_QUICKFIX) && old_KeyTyped) +! foldOpenCursor(); +! #endif +! if (print_message) +! qf_jump_print_msg(qi, qf_index, qf_ptr, old_curbuf, old_lnum); +! } +! else + { + if (opened_window) +! win_close(curwin, TRUE); /* Close opened window */ + if (qf_ptr != NULL && qf_ptr->qf_fnum != 0) + { +! /* +! * Couldn't open file, so put index back where it was. This could +! * happen if the file was readonly and we changed something. +! */ + failed: + qf_ptr = old_qf_ptr; + qf_index = old_qf_index; +--- 3220,3263 ---- + old_qf_ptr = qf_ptr; + qf_index = qfl->qf_index; + old_qf_index = qf_index; +! +! qf_ptr = qf_get_entry(qfl, errornr, dir, &qf_index); +! if (qf_ptr == NULL) + { +! qf_ptr = old_qf_ptr; +! qf_index = old_qf_index; +! goto theend; + } + + qfl->qf_index = qf_index; + if (qf_win_pos_update(qi, old_qf_index)) +! // No need to print the error message if it's visible in the error +! // window + print_message = FALSE; + +! retval = qf_jump_open_window(qi, qf_ptr, &opened_window); +! if (retval == FAIL) +! goto failed; +! if (retval == NOTDONE) +! goto theend; +! +! retval = qf_jump_to_buffer(qi, qf_index, qf_ptr, forceit, oldwin, +! &opened_window, old_KeyTyped, print_message); +! if (retval == NOTDONE) +! { +! // Quickfix/location list is freed by an autocmd +! qi = NULL; +! qf_ptr = NULL; + } + +! if (retval != OK) + { + if (opened_window) +! win_close(curwin, TRUE); // Close opened window + if (qf_ptr != NULL && qf_ptr->qf_fnum != 0) + { +! // Couldn't open file, so put index back where it was. This could +! // happen if the file was readonly and we changed something. + failed: + qf_ptr = old_qf_ptr; + qf_index = old_qf_index; +*************** +*** 3216,3223 **** + } + if (p_swb != old_swb && opened_window) + { +! /* Restore old 'switchbuf' value, but not when an autocommand or +! * modeline has changed the value. */ + if (p_swb == empty_option) + { + p_swb = old_swb; +--- 3271,3278 ---- + } + if (p_swb != old_swb && opened_window) + { +! // Restore old 'switchbuf' value, but not when an autocommand or +! // modeline has changed the value. + if (p_swb == empty_option) + { + p_swb = old_swb; +*** ../vim-8.1.0430/src/version.c 2018-09-24 21:32:07.321727079 +0200 +--- src/version.c 2018-09-24 21:47:33.241429809 +0200 +*************** +*** 796,797 **** +--- 796,799 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 431, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +92. It takes you two hours to check all 14 of your mailboxes. + + /// 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 /// |