summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0709
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0709')
-rw-r--r--data/vim/patches/8.1.0709328
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 ///