diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-12-29 18:53:55 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-12-29 18:53:55 +0100 |
commit | 7d83bf4f2b785b46d87c7bc376fc9d0a862af782 (patch) | |
tree | 0676cfef64951ed975c086173f1099998b7dfb94 /src/buffer.c | |
parent | 01e51e5b305c13c68b5ea2b9e14779e1e88664ef (diff) |
patch 8.1.0658: deleting signs and completion for :sign is insufficientv8.1.0658
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)
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/src/buffer.c b/src/buffer.c index c35477f662..07b89e3207 100644 --- 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 *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); } /* |