diff src/buffer.c @ 15300:890203d87ee5 v8.1.0658

patch 8.1.0658: deleting signs and completion for :sign is insufficient commit https://github.com/vim/vim/commit/7d83bf4f2b785b46d87c7bc376fc9d0a862af782 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Dec 29 18:53:55 2018 +0100 patch 8.1.0658: deleting signs and completion for :sign is insufficient Problem: Deleting signs and completion for :sign is insufficient. Solution: Add deleting signs in a specified or any group from the current cursor location. Add group and priority to sign command completion. Add tests for different sign unplace commands. Update help text. Add tests for sign jump with group. Update help for sign jump. (Yegappan Lakshmanan, closes #3731)
author Bram Moolenaar <Bram@vim.org>
date Sat, 29 Dec 2018 19:00:08 +0100
parents a6319aca721b
children a6330a49e036
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -6077,10 +6077,10 @@ insert_sign_by_lnum_prio(
     int
 sign_in_group(signlist_T *sign, char_u *group)
 {
-    return ((group != NULL && STRCMP(group, "*") == 0) ||
-	    (group == NULL && sign->group == NULL) ||
-	    (group != NULL && sign->group != NULL &&
-				STRCMP(group, sign->group->sg_name) == 0));
+    return ((group != NULL && STRCMP(group, "*") == 0)
+	    || (group == NULL && sign->group == NULL)
+	    || (group != NULL && sign->group != NULL
+				 && STRCMP(group, sign->group->sg_name) == 0));
 }
 
 /*
@@ -6207,6 +6207,7 @@ buf_getsigntype(
     linenr_T
 buf_delsign(
     buf_T	*buf,		// buffer sign is stored in
+    linenr_T	atlnum,		// sign at this line, 0 - at any line
     int		id,		// sign id
     char_u	*group)		// sign group
 {
@@ -6220,7 +6221,9 @@ buf_delsign(
     for (sign = buf->b_signlist; sign != NULL; sign = next)
     {
 	next = sign->next;
-	if ((id == 0 || sign->id == id) && sign_in_group(sign, group))
+	if ((id == 0 || sign->id == id) &&
+		(atlnum == 0 || sign->lnum == atlnum) &&
+		sign_in_group(sign, group))
 
 	{
 	    *lastp = next;
@@ -6230,8 +6233,14 @@ buf_delsign(
 	    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 (group == NULL || (*group != '*' && id != 0))
+	    // If deleting a sign with a specific identifer in a particular
+	    // group or deleting any sign at a particular line number, delete
+	    // only one sign.
+	    if (group == NULL
+		    || (*group != '*' && id != 0)
+		    || (*group == '*' && atlnum != 0))
 		break;
 	}
 	else
@@ -6272,17 +6281,18 @@ buf_findsign(
 
 /*
  * Return the sign at line 'lnum' in buffer 'buf'. Returns NULL if a sign is
- * not found at the line.
+ * not found at the line. If 'groupname' is NULL, searches in the global group.
  */
     static signlist_T *
 buf_getsign_at_line(
     buf_T	*buf,		// buffer whose sign we are searching for
-    linenr_T	lnum)		// line number of sign
+    linenr_T	lnum,		// line number of sign
+    char_u	*groupname)	// sign group name
 {
     signlist_T	*sign;		// a sign in the signlist
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
-	if (sign->lnum == lnum)
+	if (sign->lnum == lnum && sign_in_group(sign, groupname))
 	    return sign;
 
     return NULL;
@@ -6312,11 +6322,12 @@ buf_getsign_with_id(
     int
 buf_findsign_id(
     buf_T	*buf,		// buffer whose sign we are searching for
-    linenr_T	lnum)		// line number of sign
+    linenr_T	lnum,		// line number of sign
+    char_u	*groupname)	// sign group name
 {
     signlist_T	*sign;		// a sign in the signlist
 
-    sign = buf_getsign_at_line(buf, lnum);
+    sign = buf_getsign_at_line(buf, lnum, groupname);
     if (sign != NULL)
 	return sign->id;
 
@@ -6401,16 +6412,16 @@ buf_delete_signs(buf_T *buf, char_u *gro
 }
 
 /*
- * Delete all signs in all buffers.
+ * Delete all the signs in the specified group in all the buffers.
  */
     void
-buf_delete_all_signs(void)
+buf_delete_all_signs(char_u *groupname)
 {
     buf_T	*buf;		/* buffer we are checking for signs */
 
     FOR_ALL_BUFFERS(buf)
 	if (buf->b_signlist != NULL)
-	    buf_delete_signs(buf, (char_u *)"*");
+	    buf_delete_signs(buf, groupname);
 }
 
 /*