0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2018-12-29 18:53:55 +01:00
parent 01e51e5b30
commit 7d83bf4f2b
9 changed files with 506 additions and 148 deletions

View File

@@ -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 *group)
}
/*
* 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);
}
/*