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.

Raspunde prin e-mail lui