diff options
Diffstat (limited to 'data/vim/patches/8.1.0709')
-rw-r--r-- | data/vim/patches/8.1.0709 | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0709 b/data/vim/patches/8.1.0709 new file mode 100644 index 000000000..db0b58cb2 --- /dev/null +++ b/data/vim/patches/8.1.0709 @@ -0,0 +1,328 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0709 +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.0709 +Problem: Windows are updated for every added/deleted sign. +Solution: Do not call update_debug_sign(). Only redraw when the line with + the sign is visible. (idea from neovim #9479) +Files: src/sign.c, src/screen.c, src/proto/screen.pro + + +*** ../vim-8.1.0708/src/sign.c 2019-01-07 22:09:54.439460880 +0100 +--- src/sign.c 2019-01-09 21:39:13.363740272 +0100 +*************** +*** 327,334 **** + prev = NULL; + FOR_ALL_SIGNS_IN_BUF(buf, sign) + { +! if (lnum == sign->lnum && id == sign->id && +! sign_in_group(sign, groupname)) + { + // Update an existing sign + sign->typenr = typenr; +--- 327,334 ---- + prev = NULL; + FOR_ALL_SIGNS_IN_BUF(buf, sign) + { +! if (lnum == sign->lnum && id == sign->id +! && sign_in_group(sign, groupname)) + { + // Update an existing sign + sign->typenr = typenr; +*************** +*** 427,435 **** + for (sign = buf->b_signlist; sign != NULL; sign = next) + { + next = sign->next; +! if ((id == 0 || sign->id == id) && +! (atlnum == 0 || sign->lnum == atlnum) && +! sign_in_group(sign, group)) + + { + *lastp = next; +--- 427,435 ---- + for (sign = buf->b_signlist; sign != NULL; sign = next) + { + next = sign->next; +! if ((id == 0 || sign->id == id) +! && (atlnum == 0 || sign->lnum == atlnum) +! && sign_in_group(sign, group)) + + { + *lastp = next; +*************** +*** 439,445 **** + if (sign->group != NULL) + sign_group_unref(sign->group->sg_name); + vim_free(sign); +! update_debug_sign(buf, lnum); + // Check whether only one sign needs to be deleted + // If deleting a sign with a specific identifer in a particular + // group or deleting any sign at a particular line number, delete +--- 439,446 ---- + if (sign->group != NULL) + sign_group_unref(sign->group->sg_name); + vim_free(sign); +! redraw_buf_line_later(buf, lnum); +! + // Check whether only one sign needs to be deleted + // If deleting a sign with a specific identifer in a particular + // group or deleting any sign at a particular line number, delete +*************** +*** 453,465 **** + lastp = &sign->next; + } + +! // When deleted the last sign need to redraw the windows to remove the +! // sign column. + if (buf->b_signlist == NULL) +- { +- redraw_buf_later(buf, NOT_VALID); + changed_cline_bef_curs(); +- } + + return lnum; + } +--- 454,463 ---- + lastp = &sign->next; + } + +! // When deleting the last sign the cursor position may change, because the +! // sign columns no longer shows. + if (buf->b_signlist == NULL) + changed_cline_bef_curs(); + + return lnum; + } +*************** +*** 932,938 **** + // ":sign place {id} file={fname}": change sign type + lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr); + if (lnum > 0) +! update_debug_sign(buf, lnum); + else + { + EMSG2(_("E885: Not possible to change sign %s"), sign_name); +--- 930,936 ---- + // ":sign place {id} file={fname}": change sign type + lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr); + if (lnum > 0) +! redraw_buf_line_later(buf, lnum); + else + { + EMSG2(_("E885: Not possible to change sign %s"), sign_name); +*************** +*** 1068,1075 **** + // :sign place + // :sign place group={group} + // :sign place group=* +! if (lnum >= 0 || sign_name != NULL || +! (group != NULL && *group == '\0')) + EMSG(_(e_invarg)); + else + sign_list_placed(buf, group); +--- 1066,1073 ---- + // :sign place + // :sign place group={group} + // :sign place group=* +! if (lnum >= 0 || sign_name != NULL +! || (group != NULL && *group == '\0')) + EMSG(_(e_invarg)); + else + sign_list_placed(buf, group); +*************** +*** 1077,1084 **** + else + { + // Place a new sign +! if (sign_name == NULL || buf == NULL || +! (group != NULL && *group == '\0')) + { + EMSG(_(e_invarg)); + return; +--- 1075,1082 ---- + else + { + // Place a new sign +! if (sign_name == NULL || buf == NULL +! || (group != NULL && *group == '\0')) + { + EMSG(_(e_invarg)); + return; +*************** +*** 1174,1181 **** + return; + } + +! if (buf == NULL || (group != NULL && *group == '\0') || +! lnum >= 0 || sign_name != NULL) + { + // File or buffer is not specified or an empty group is used + // or a line number or a sign name is specified. +--- 1172,1179 ---- + return; + } + +! if (buf == NULL || (group != NULL && *group == '\0') +! || lnum >= 0 || sign_name != NULL) + { + // File or buffer is not specified or an empty group is used + // or a line number or a sign name is specified. +*************** +*** 1330,1336 **** + // If the filename is not supplied for the sign place or the sign jump + // command, then use the current buffer. + if (filename == NULL && ((cmd == SIGNCMD_PLACE && lnum_arg) +! || cmd == SIGNCMD_JUMP)) + *buf = curwin->w_buffer; + + return OK; +--- 1328,1334 ---- + // If the filename is not supplied for the sign place or the sign jump + // command, then use the current buffer. + if (filename == NULL && ((cmd == SIGNCMD_PLACE && lnum_arg) +! || cmd == SIGNCMD_JUMP)) + *buf = curwin->w_buffer; + + return OK; +*************** +*** 1522,1531 **** + { + if (!sign_in_group(sign, sign_group)) + continue; +! if ((lnum == 0 && sign_id == 0) || +! (sign_id == 0 && lnum == sign->lnum) || +! (lnum == 0 && sign_id == sign->id) || +! (lnum == sign->lnum && sign_id == sign->id)) + { + if ((sdict = sign_get_info(sign)) != NULL) + list_append_dict(l, sdict); +--- 1520,1529 ---- + { + if (!sign_in_group(sign, sign_group)) + continue; +! if ((lnum == 0 && sign_id == 0) +! || (sign_id == 0 && lnum == sign->lnum) +! || (lnum == 0 && sign_id == sign->id) +! || (lnum == sign->lnum && sign_id == sign->id)) + { + if ((sdict = sign_get_info(sign)) != NULL) + list_append_dict(l, sdict); +*************** +*** 1864,1871 **** + switch (cmd_idx) + { + case SIGNCMD_DEFINE: +! if (STRNCMP(last, "texthl", p - last) == 0 || +! STRNCMP(last, "linehl", p - last) == 0) + xp->xp_context = EXPAND_HIGHLIGHT; + else if (STRNCMP(last, "icon", p - last) == 0) + xp->xp_context = EXPAND_FILES; +--- 1862,1869 ---- + switch (cmd_idx) + { + case SIGNCMD_DEFINE: +! if (STRNCMP(last, "texthl", p - last) == 0 +! || STRNCMP(last, "linehl", p - last) == 0) + xp->xp_context = EXPAND_HIGHLIGHT; + else if (STRNCMP(last, "icon", p - last) == 0) + xp->xp_context = EXPAND_FILES; +*** ../vim-8.1.0708/src/screen.c 2019-01-09 20:51:00.321398815 +0100 +--- src/screen.c 2019-01-09 21:47:15.772416499 +0100 +*************** +*** 264,269 **** +--- 264,280 ---- + } + + void ++ redraw_buf_line_later(buf_T *buf, linenr_T lnum) ++ { ++ win_T *wp; ++ ++ FOR_ALL_WINDOWS(wp) ++ if (wp->w_buffer == buf && lnum >= wp->w_topline ++ && lnum < wp->w_botline) ++ redrawWinline(wp, lnum); ++ } ++ ++ void + redraw_buf_and_status_later(buf_T *buf, int type) + { + win_T *wp; +*************** +*** 978,1003 **** + win_foldinfo.fi_level = 0; + # endif + +! /* update/delete a specific mark */ + FOR_ALL_WINDOWS(wp) +- { +- if (buf != NULL && lnum > 0) +- { +- if (wp->w_buffer == buf && lnum >= wp->w_topline +- && lnum < wp->w_botline) +- { +- if (wp->w_redraw_top == 0 || wp->w_redraw_top > lnum) +- wp->w_redraw_top = lnum; +- if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < lnum) +- wp->w_redraw_bot = lnum; +- redraw_win_later(wp, VALID); +- } +- } +- else +- redraw_win_later(wp, VALID); + if (wp->w_redr_type != 0) + doit = TRUE; +- } + + /* Return when there is nothing to do, screen updating is already + * happening (recursive call), messages on the screen or still starting up. +--- 989,1001 ---- + win_foldinfo.fi_level = 0; + # endif + +! // update/delete a specific sign +! redraw_buf_line_later(buf, lnum); +! +! // check if it resulted in the need to redraw a window + FOR_ALL_WINDOWS(wp) + if (wp->w_redr_type != 0) + doit = TRUE; + + /* Return when there is nothing to do, screen updating is already + * happening (recursive call), messages on the screen or still starting up. +*** ../vim-8.1.0708/src/proto/screen.pro 2019-01-09 20:51:00.321398815 +0100 +--- src/proto/screen.pro 2019-01-09 21:39:29.319633988 +0100 +*************** +*** 5,10 **** +--- 5,11 ---- + void redraw_all_later(int type); + void redraw_curbuf_later(int type); + void redraw_buf_later(buf_T *buf, int type); ++ void redraw_buf_line_later(buf_T *buf, linenr_T lnum); + void redraw_buf_and_status_later(buf_T *buf, int type); + int redraw_asap(int type); + void redraw_after_callback(int call_update_screen); +*** ../vim-8.1.0708/src/version.c 2019-01-09 20:51:00.321398815 +0100 +--- src/version.c 2019-01-09 21:25:07.452472773 +0100 +*************** +*** 801,802 **** +--- 801,804 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 709, + /**/ + +-- +The coffee just wasn't strong enough to defend itself -- Tom Waits + + /// 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 /// |