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 -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.