summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0658
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0658')
-rw-r--r--data/vim/patches/8.1.06581382
1 files changed, 1382 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0658 b/data/vim/patches/8.1.0658
new file mode 100644
index 000000000..6048cc5fd
--- /dev/null
+++ b/data/vim/patches/8.1.0658
@@ -0,0 +1,1382 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0658
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.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)
+Files: runtime/doc/sign.txt, src/buffer.c, src/evalfunc.c, src/ex_cmds.c,
+ src/netbeans.c, src/proto/buffer.pro, src/proto/ex_cmds.pro,
+ src/testdir/test_signs.vim
+
+
+*** ../vim-8.1.0657/runtime/doc/sign.txt 2018-12-21 15:16:57.475579814 +0100
+--- runtime/doc/sign.txt 2018-12-29 18:36:00.268781805 +0100
+***************
+*** 251,263 ****
+ all the files it appears in.
+
+ :sign unplace *
+! Remove all placed signs in the global group.
+
+ :sign unplace * group=*
+! Remove all placed signs in all the groups.
+
+ :sign unplace
+! Remove the placed sign at the cursor position.
+
+
+ LISTING PLACED SIGNS *:sign-place-list*
+--- 251,274 ----
+ all the files it appears in.
+
+ :sign unplace *
+! Remove placed signs in the global group from all the files.
+!
+! :sign unplace * group={group}
+! Remove placed signs in group {group} from all the files.
+
+ :sign unplace * group=*
+! Remove placed signs in all the groups from all the files.
+
+ :sign unplace
+! Remove a placed sign at the cursor position. If multiple signs
+! are placed in the line, then only one is removed.
+!
+! :sign unplace group={group}
+! Remove a placed sign in group {group} at the cursor
+! position.
+!
+! :sign unplace group=*
+! Remove a placed sign in any group at the cursor position.
+
+
+ LISTING PLACED SIGNS *:sign-place-list*
+***************
+*** 271,286 ****
+ :sign place group={group} file={fname}
+ List signs in group {group} placed in file {fname}.
+
+ :sign place buffer={nr}
+ List signs placed in buffer {nr}.
+
+ :sign place group={group} buffer={nr}
+ List signs in group {group} placed in buffer {nr}.
+
+! :sign place List placed signs in all files.
+
+ :sign place group={group}
+! List placed signs in all sign groups in all the files.
+
+
+ JUMPING TO A SIGN *:sign-jump* *E157*
+--- 282,306 ----
+ :sign place group={group} file={fname}
+ List signs in group {group} placed in file {fname}.
+
++ :sign place group=* file={fname}
++ List signs in all the groups placed in file {fname}.
++
+ :sign place buffer={nr}
+ List signs placed in buffer {nr}.
+
+ :sign place group={group} buffer={nr}
+ List signs in group {group} placed in buffer {nr}.
+
+! :sign place group=* buffer={nr}
+! List signs in all the groups placed in buffer {nr}.
+!
+! :sign place List placed signs in the global group in all files.
+
+ :sign place group={group}
+! List placed signs with sign group {group} in all files.
+!
+! :sign place group=*
+! List placed signs in all sign groups in all files.
+
+
+ JUMPING TO A SIGN *:sign-jump* *E157*
+***************
+*** 292,300 ****
+--- 312,326 ----
+ If the file isn't displayed in window and the current file can
+ not be |abandon|ed this fails.
+
++ :sign jump {id} group={group} file={fname}
++ Same but jump to the sign in group {group}
++
+ :sign jump {id} buffer={nr} *E934*
+ Same, but use buffer {nr}. This fails if buffer {nr} does not
+ have a name.
+
++ :sign jump {id} group={group} buffer={nr}
++ Same but jump to the sign in group {group}
++
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
+*** ../vim-8.1.0657/src/buffer.c 2018-12-27 00:28:27.497299324 +0100
+--- src/buffer.c 2018-12-29 18:38:43.291325605 +0100
+***************
+*** 6077,6086 ****
+ 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));
+ }
+
+ /*
+--- 6077,6086 ----
+ 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));
+ }
+
+ /*
+***************
+*** 6207,6212 ****
+--- 6207,6213 ----
+ 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,6226 ****
+ for (sign = buf->b_signlist; sign != NULL; sign = next)
+ {
+ next = sign->next;
+! if ((id == 0 || sign->id == id) && sign_in_group(sign, group))
+
+ {
+ *lastp = next;
+--- 6221,6229 ----
+ 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;
+***************
+*** 6230,6237 ****
+ if (sign->group != NULL)
+ sign_group_unref(sign->group->sg_name);
+ vim_free(sign);
+ // Check whether only one sign needs to be deleted
+! if (group == NULL || (*group != '*' && id != 0))
+ break;
+ }
+ else
+--- 6233,6246 ----
+ 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
+! // only one sign.
+! if (group == NULL
+! || (*group != '*' && id != 0)
+! || (*group == '*' && atlnum != 0))
+ break;
+ }
+ else
+***************
+*** 6272,6288 ****
+
+ /*
+ * Return the sign at line 'lnum' in buffer 'buf'. Returns NULL if a sign is
+! * not found at the line.
+ */
+ static signlist_T *
+ buf_getsign_at_line(
+ buf_T *buf, // buffer whose sign we are searching for
+! linenr_T lnum) // line number of sign
+ {
+ signlist_T *sign; // a sign in the signlist
+
+ FOR_ALL_SIGNS_IN_BUF(buf, sign)
+! if (sign->lnum == lnum)
+ return sign;
+
+ return NULL;
+--- 6281,6298 ----
+
+ /*
+ * Return the sign at line 'lnum' in buffer 'buf'. Returns NULL if a sign is
+! * 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
+! 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 && sign_in_group(sign, groupname))
+ return sign;
+
+ return NULL;
+***************
+*** 6312,6322 ****
+ int
+ buf_findsign_id(
+ buf_T *buf, // buffer whose sign we are searching for
+! linenr_T lnum) // line number of sign
+ {
+ signlist_T *sign; // a sign in the signlist
+
+! sign = buf_getsign_at_line(buf, lnum);
+ if (sign != NULL)
+ return sign->id;
+
+--- 6322,6333 ----
+ int
+ buf_findsign_id(
+ buf_T *buf, // buffer whose sign we are searching for
+! 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, groupname);
+ if (sign != NULL)
+ return sign->id;
+
+***************
+*** 6401,6416 ****
+ }
+
+ /*
+! * Delete all signs in all buffers.
+ */
+ void
+! buf_delete_all_signs(void)
+ {
+ buf_T *buf; /* buffer we are checking for signs */
+
+ FOR_ALL_BUFFERS(buf)
+ if (buf->b_signlist != NULL)
+! buf_delete_signs(buf, (char_u *)"*");
+ }
+
+ /*
+--- 6412,6427 ----
+ }
+
+ /*
+! * Delete all the signs in the specified group in all the buffers.
+ */
+ 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, groupname);
+ }
+
+ /*
+*** ../vim-8.1.0657/src/evalfunc.c 2018-12-27 23:44:34.797953474 +0100
+--- src/evalfunc.c 2018-12-29 18:36:00.272781771 +0100
+***************
+*** 11600,11611 ****
+ {
+ // Delete the sign in all the buffers
+ FOR_ALL_BUFFERS(buf)
+! if (sign_unplace(sign_id, group, buf) == OK)
+ rettv->vval.v_number = 0;
+ }
+ else
+ {
+! if (sign_unplace(sign_id, group, buf) == OK)
+ rettv->vval.v_number = 0;
+ }
+ vim_free(group);
+--- 11600,11611 ----
+ {
+ // Delete the sign in all the buffers
+ FOR_ALL_BUFFERS(buf)
+! if (sign_unplace(sign_id, group, buf, 0) == OK)
+ rettv->vval.v_number = 0;
+ }
+ else
+ {
+! if (sign_unplace(sign_id, group, buf, 0) == OK)
+ rettv->vval.v_number = 0;
+ }
+ vim_free(group);
+*** ../vim-8.1.0657/src/ex_cmds.c 2018-12-27 00:28:27.497299324 +0100
+--- src/ex_cmds.c 2018-12-29 18:36:00.272781771 +0100
+***************
+*** 7895,7901 ****
+ * Unplace the specified sign
+ */
+ int
+! sign_unplace(int sign_id, char_u *sign_group, buf_T *buf)
+ {
+ if (sign_id == 0)
+ {
+--- 7895,7901 ----
+ * Unplace the specified sign
+ */
+ int
+! sign_unplace(int sign_id, char_u *sign_group, buf_T *buf, linenr_T atlnum)
+ {
+ if (sign_id == 0)
+ {
+***************
+*** 7908,7923 ****
+ linenr_T lnum;
+
+ // Delete only the specified signs
+! lnum = buf_delsign(buf, sign_id, sign_group);
+ if (lnum == 0)
+ return FAIL;
+- update_debug_sign(buf, lnum);
+ }
+
+ return OK;
+ }
+
+ /*
+ * ":sign" command
+ */
+ void
+--- 7908,7937 ----
+ linenr_T lnum;
+
+ // Delete only the specified signs
+! lnum = buf_delsign(buf, atlnum, sign_id, sign_group);
+ if (lnum == 0)
+ return FAIL;
+ }
+
+ return OK;
+ }
+
+ /*
++ * Unplace the sign at the current cursor line.
++ */
++ static void
++ sign_unplace_at_cursor(char_u *groupname)
++ {
++ int id = -1;
++
++ id = buf_findsign_id(curwin->w_buffer, curwin->w_cursor.lnum, groupname);
++ if (id > 0)
++ sign_unplace(id, groupname, curwin->w_buffer, curwin->w_cursor.lnum);
++ else
++ EMSG(_("E159: Missing sign number"));
++ }
++
++ /*
+ * ":sign" command
+ */
+ void
+***************
+*** 8047,8060 ****
+ sign_list_placed(NULL, NULL);
+ }
+ else if (idx == SIGNCMD_UNPLACE)
+- {
+ /* ":sign unplace": remove placed sign at cursor */
+! id = buf_findsign_id(curwin->w_buffer, curwin->w_cursor.lnum);
+! if (id > 0)
+! sign_unplace(id, NULL, curwin->w_buffer);
+! else
+! EMSG(_("E159: Missing sign number"));
+! }
+ else
+ EMSG(_(e_argreq));
+ return;
+--- 8061,8068 ----
+ sign_list_placed(NULL, NULL);
+ }
+ else if (idx == SIGNCMD_UNPLACE)
+ /* ":sign unplace": remove placed sign at cursor */
+! sign_unplace_at_cursor(NULL);
+ else
+ EMSG(_(e_argreq));
+ return;
+***************
+*** 8063,8069 ****
+ if (idx == SIGNCMD_UNPLACE && arg[0] == '*' && arg[1] == NUL)
+ {
+ /* ":sign unplace *": remove all placed signs */
+! buf_delete_all_signs();
+ return;
+ }
+
+--- 8071,8077 ----
+ if (idx == SIGNCMD_UNPLACE && arg[0] == '*' && arg[1] == NUL)
+ {
+ /* ":sign unplace *": remove all placed signs */
+! buf_delete_all_signs(NULL);
+ return;
+ }
+
+***************
+*** 8084,8090 ****
+ {
+ /* ":sign unplace {id}": remove placed sign by number */
+ FOR_ALL_BUFFERS(buf)
+! sign_unplace(id, NULL, buf);
+ return;
+ }
+ }
+--- 8092,8098 ----
+ {
+ /* ":sign unplace {id}": remove placed sign by number */
+ FOR_ALL_BUFFERS(buf)
+! sign_unplace(id, NULL, buf, 0);
+ return;
+ }
+ }
+***************
+*** 8183,8189 ****
+ }
+ else if (idx == SIGNCMD_JUMP)
+ {
+! /* ":sign jump {id} file={fname}" */
+ if (lnum >= 0 || sign_name != NULL || buf == NULL)
+ EMSG(_(e_invarg));
+ else if ((lnum = buf_findsign(buf, id, group)) > 0)
+--- 8191,8198 ----
+ }
+ else if (idx == SIGNCMD_JUMP)
+ {
+! // ":sign jump {id} file={fname}"
+! // ":sign jump {id} group={group} file={fname}"
+ if (lnum >= 0 || sign_name != NULL || buf == NULL)
+ EMSG(_(e_invarg));
+ else if ((lnum = buf_findsign(buf, id, group)) > 0)
+***************
+*** 8225,8231 ****
+ {
+ if (buf != NULL)
+ // ":sign unplace * file={fname}"
+! sign_unplace(0, group, buf);
+ else
+ // ":sign unplace * group=*": remove all placed signs
+ FOR_ALL_BUFFERS(buf)
+--- 8234,8240 ----
+ {
+ if (buf != NULL)
+ // ":sign unplace * file={fname}"
+! sign_unplace(0, group, buf, 0);
+ else
+ // ":sign unplace * group=*": remove all placed signs
+ FOR_ALL_BUFFERS(buf)
+***************
+*** 8238,8251 ****
+ // ":sign unplace {id} file={fname}"
+ // ":sign unplace {id} group={group} file={fname}"
+ // ":sign unplace {id} group=* file={fname}"
+! sign_unplace(id, group, buf);
+ else
+! // ":sign unplace {id} group={group}":
+! // ":sign unplace {id} group=*":
+! // remove all placed signs in this group.
+! FOR_ALL_BUFFERS(buf)
+! if (buf->b_signlist != NULL)
+! sign_unplace(id, group, buf);
+ }
+ }
+ /* idx == SIGNCMD_PLACE */
+--- 8247,8272 ----
+ // ":sign unplace {id} file={fname}"
+ // ":sign unplace {id} group={group} file={fname}"
+ // ":sign unplace {id} group=* file={fname}"
+! sign_unplace(id, group, buf, 0);
+ else
+! {
+! if (id == -1)
+! {
+! // ":sign unplace group={group}":
+! // ":sign unplace group=*":
+! // remove sign in the current line in specified group
+! sign_unplace_at_cursor(group);
+! }
+! else
+! {
+! // ":sign unplace {id} group={group}":
+! // ":sign unplace {id} group=*":
+! // remove all placed signs in this group.
+! FOR_ALL_BUFFERS(buf)
+! if (buf->b_signlist != NULL)
+! sign_unplace(id, group, buf, 0);
+! }
+! }
+ }
+ }
+ /* idx == SIGNCMD_PLACE */
+***************
+*** 8581,8593 ****
+ {
+ char *place_arg[] =
+ {
+! "line=", "name=", "file=", "buffer=", NULL
+ };
+ return (char_u *)place_arg[idx];
+ }
+ case EXP_UNPLACE:
+ {
+! char *unplace_arg[] = { "file=", "buffer=", NULL };
+ return (char_u *)unplace_arg[idx];
+ }
+ case EXP_SIGN_NAMES:
+--- 8602,8615 ----
+ {
+ char *place_arg[] =
+ {
+! "line=", "name=", "group=", "priority=", "file=",
+! "buffer=", NULL
+ };
+ return (char_u *)place_arg[idx];
+ }
+ case EXP_UNPLACE:
+ {
+! char *unplace_arg[] = { "group=", "file=", "buffer=", NULL };
+ return (char_u *)unplace_arg[idx];
+ }
+ case EXP_SIGN_NAMES:
+*** ../vim-8.1.0657/src/netbeans.c 2018-12-21 15:16:57.479579788 +0100
+--- src/netbeans.c 2018-12-29 18:36:00.272781771 +0100
+***************
+*** 1251,1262 ****
+ /* delete signs from the lines being deleted */
+ for (i = del_from_lnum; i <= del_to_lnum; i++)
+ {
+! int id = buf_findsign_id(buf->bufp, (linenr_T)i);
+ if (id > 0)
+ {
+ nbdebug((" Deleting sign %d on line %d\n",
+ id, i));
+! buf_delsign(buf->bufp, id, NULL);
+ }
+ else
+ {
+--- 1251,1262 ----
+ /* delete signs from the lines being deleted */
+ for (i = del_from_lnum; i <= del_to_lnum; i++)
+ {
+! int id = buf_findsign_id(buf->bufp, (linenr_T)i, NULL);
+ if (id > 0)
+ {
+ nbdebug((" Deleting sign %d on line %d\n",
+ id, i));
+! buf_delsign(buf->bufp, 0, id, NULL);
+ }
+ else
+ {
+*** ../vim-8.1.0657/src/proto/buffer.pro 2018-12-27 00:28:27.501299292 +0100
+--- src/proto/buffer.pro 2018-12-29 18:40:08.310566333 +0100
+***************
+*** 69,91 ****
+ void switch_to_win_for_buf(buf_T *buf, win_T **save_curwinp, tabpage_T **save_curtabp, bufref_T *save_curbuf);
+ void restore_win_for_buf(win_T *save_curwin, tabpage_T *save_curtab, bufref_T *save_curbuf);
+ int find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp);
+- void buf_addsign(buf_T *buf, int id, char_u *group, int prio, linenr_T lnum, int typenr);
+- linenr_T buf_change_sign_type(buf_T *buf, int markId, char_u *group, int typenr);
+- int buf_getsigntype(buf_T *buf, linenr_T lnum, int type);
+- linenr_T buf_delsign(buf_T *buf, int id, char_u *group);
+- int buf_findsign(buf_T *buf, int id, char_u *group);
+- #ifdef FEAT_SIGNS
+ void init_signs(void);
+ int sign_group_get_next_signid(buf_T *buf, char_u *groupname);
+ int sign_in_group(signlist_T *sign, char_u *group);
+ dict_T *sign_get_info(signlist_T *sign);
+ signlist_T *buf_getsign_with_id(buf_T *buf, int id, char_u *group);
+! #endif
+! int buf_findsign_id(buf_T *buf, linenr_T lnum);
+ int buf_findsigntype_id(buf_T *buf, linenr_T lnum, int typenr);
+ int buf_signcount(buf_T *buf, linenr_T lnum);
+ void buf_delete_signs(buf_T *buf, char_u *group);
+! void buf_delete_all_signs(void);
+ void sign_list_placed(buf_T *rbuf, char_u *sign_group);
+ void sign_mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after);
+ void set_buflisted(int on);
+--- 69,89 ----
+ void switch_to_win_for_buf(buf_T *buf, win_T **save_curwinp, tabpage_T **save_curtabp, bufref_T *save_curbuf);
+ void restore_win_for_buf(win_T *save_curwin, tabpage_T *save_curtab, bufref_T *save_curbuf);
+ int find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp);
+ void init_signs(void);
+ int sign_group_get_next_signid(buf_T *buf, char_u *groupname);
+ int sign_in_group(signlist_T *sign, char_u *group);
+ dict_T *sign_get_info(signlist_T *sign);
++ void buf_addsign(buf_T *buf, int id, char_u *groupname, int prio, linenr_T lnum, int typenr);
++ linenr_T buf_change_sign_type(buf_T *buf, int markId, char_u *group, int typenr);
++ int buf_getsigntype(buf_T *buf, linenr_T lnum, int type);
++ linenr_T buf_delsign(buf_T *buf, linenr_T atlnum, int id, char_u *group);
++ int buf_findsign(buf_T *buf, int id, char_u *group);
+ signlist_T *buf_getsign_with_id(buf_T *buf, int id, char_u *group);
+! int buf_findsign_id(buf_T *buf, linenr_T lnum, char_u *groupname);
+ int buf_findsigntype_id(buf_T *buf, linenr_T lnum, int typenr);
+ int buf_signcount(buf_T *buf, linenr_T lnum);
+ void buf_delete_signs(buf_T *buf, char_u *group);
+! void buf_delete_all_signs(char_u *groupname);
+ void sign_list_placed(buf_T *rbuf, char_u *sign_group);
+ void sign_mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after);
+ void set_buflisted(int on);
+*** ../vim-8.1.0657/src/proto/ex_cmds.pro 2018-12-21 15:16:57.479579788 +0100
+--- src/proto/ex_cmds.pro 2018-12-29 18:40:16.218495713 +0100
+***************
+*** 54,77 ****
+ void ex_exusage(exarg_T *eap);
+ void ex_viusage(exarg_T *eap);
+ void ex_helptags(exarg_T *eap);
+ void ex_sign(exarg_T *eap);
+ void sign_gui_started(void);
+ int sign_get_attr(int typenr, int line);
+ char_u *sign_get_text(int typenr);
+ void *sign_get_image(int typenr);
+ char_u *sign_typenr2name(int typenr);
+ void free_signs(void);
+- void free_signs(void);
+ char_u *get_sign_name(expand_T *xp, int idx);
+ void set_context_in_sign_cmd(expand_T *xp, char_u *arg);
+ void ex_smile(exarg_T *eap);
+ void ex_drop(exarg_T *eap);
+ char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags);
+ void ex_oldfiles(exarg_T *eap);
+- int sign_define_by_name(char_u *name, char_u *icon, char_u *linehl, char_u *text, char_u *texthl);
+- int sign_undefine_by_name(char_u *name);
+- void sign_getlist(char_u *name, list_T *retlist);
+- int sign_place(int *sign_id, char_u *group, char_u *sign_name, buf_T *buf, linenr_T lnum, int prio);
+- int sign_unplace(int id, char_u *group, buf_T *buf);
+- void sign_get_placed(buf_T *buf, linenr_T lnum, int id, char_u *group, list_T *retlist);
+ /* vim: set ft=c : */
+--- 54,76 ----
+ void ex_exusage(exarg_T *eap);
+ void ex_viusage(exarg_T *eap);
+ void ex_helptags(exarg_T *eap);
++ int sign_define_by_name(char_u *name, char_u *icon, char_u *linehl, char_u *text, char_u *texthl);
++ int sign_undefine_by_name(char_u *name);
++ int sign_place(int *sign_id, char_u *sign_group, char_u *sign_name, buf_T *buf, linenr_T lnum, int prio);
++ int sign_unplace(int sign_id, char_u *sign_group, buf_T *buf, linenr_T atlnum);
+ void ex_sign(exarg_T *eap);
++ void sign_getlist(char_u *name, list_T *retlist);
++ void sign_get_placed(buf_T *buf, linenr_T lnum, int sign_id, char_u *sign_group, list_T *retlist);
+ void sign_gui_started(void);
+ int sign_get_attr(int typenr, int line);
+ char_u *sign_get_text(int typenr);
+ void *sign_get_image(int typenr);
+ char_u *sign_typenr2name(int typenr);
+ void free_signs(void);
+ char_u *get_sign_name(expand_T *xp, int idx);
+ void set_context_in_sign_cmd(expand_T *xp, char_u *arg);
+ void ex_smile(exarg_T *eap);
+ void ex_drop(exarg_T *eap);
+ char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags);
+ void ex_oldfiles(exarg_T *eap);
+ /* vim: set ft=c : */
+*** ../vim-8.1.0657/src/testdir/test_signs.vim 2018-12-27 00:28:27.501299292 +0100
+--- src/testdir/test_signs.vim 2018-12-29 18:36:00.272781771 +0100
+***************
+*** 28,35 ****
+ let a=execute('sign list Sign1')
+ call assert_equal("\nsign Sign1 text=x ", a)
+
+! " Split the window to the bottom to verify sign jump will stay in the current window
+! " if the buffer is displayed there.
+ let bn = bufnr('%')
+ let wn = winnr()
+ exe 'sign place 41 line=3 name=Sign1 buffer=' . bn
+--- 28,35 ----
+ let a=execute('sign list Sign1')
+ call assert_equal("\nsign Sign1 text=x ", a)
+
+! " Split the window to the bottom to verify sign jump will stay in the
+! " current window if the buffer is displayed there.
+ let bn = bufnr('%')
+ let wn = winnr()
+ exe 'sign place 41 line=3 name=Sign1 buffer=' . bn
+***************
+*** 211,229 ****
+ call assert_equal('"sign undefine Sign1 Sign2', @:)
+
+ call feedkeys(":sign place 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+! call assert_equal('"sign place 1 buffer= file= line= name=', @:)
+
+ call feedkeys(":sign place 1 name=\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign place 1 name=Sign1 Sign2', @:)
+
+ call feedkeys(":sign unplace 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+! call assert_equal('"sign unplace 1 buffer= file=', @:)
+
+ call feedkeys(":sign list \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign list Sign1 Sign2', @:)
+
+ call feedkeys(":sign jump 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+! call assert_equal('"sign jump 1 buffer= file=', @:)
+
+ sign undefine Sign1
+ sign undefine Sign2
+--- 211,230 ----
+ call assert_equal('"sign undefine Sign1 Sign2', @:)
+
+ call feedkeys(":sign place 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+! call assert_equal('"sign place 1 buffer= file= group= line= name= priority=',
+! \ @:)
+
+ call feedkeys(":sign place 1 name=\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign place 1 name=Sign1 Sign2', @:)
+
+ call feedkeys(":sign unplace 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+! call assert_equal('"sign unplace 1 buffer= file= group=', @:)
+
+ call feedkeys(":sign list \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign list Sign1 Sign2', @:)
+
+ call feedkeys(":sign jump 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+! call assert_equal('"sign jump 1 buffer= file= group=', @:)
+
+ sign undefine Sign1
+ sign undefine Sign2
+***************
+*** 449,455 ****
+
+ edit Xsign
+ let bnum = bufnr('%')
+- let fname = fnamemodify('Xsign', ':p')
+
+ " Error case
+ call assert_fails("call sign_place(5, [], 'sign1', 'Xsign',
+--- 450,455 ----
+***************
+*** 466,471 ****
+--- 466,475 ----
+ let s = sign_getplaced('Xsign')
+ call assert_equal(1, len(s[0].signs))
+ call assert_equal(s[0].signs[0].group, '')
++ let s = sign_getplaced(bnum, {'group' : ''})
++ call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
++ \ 'priority' : 10}], s[0].signs)
++ call assert_equal(1, len(s[0].signs))
+ let s = sign_getplaced(bnum, {'group' : 'g2'})
+ call assert_equal('g2', s[0].signs[0].group)
+ let s = sign_getplaced(bnum, {'group' : 'g3'})
+***************
+*** 584,717 ****
+ sign place 5 group=g1 line=10 name=sign1 file=Xsign
+ sign place 5 group=g2 line=10 name=sign1 file=Xsign
+
+! " Test for :sign place group={group} file={fname}
+ let a = execute('sign place file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 name=sign1 priority=10\n", a)
+
+ let a = execute('sign place group=g2 file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 group=g2 name=sign1 priority=10\n", a)
+
+ let a = execute('sign place group=* file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+ \ " line=10 id=5 group=g2 name=sign1 priority=10\n" .
+ \ " line=10 id=5 group=g1 name=sign1 priority=10\n" .
+ \ " line=10 id=5 name=sign1 priority=10\n", a)
+
+ let a = execute('sign place group=xyz file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
+
+ call sign_unplace('*')
+-
+- " Test for :sign place group={group} buffer={nr}
+ let bnum = bufnr('Xsign')
+ exe 'sign place 5 line=10 name=sign1 buffer=' . bnum
+ exe 'sign place 5 group=g1 line=11 name=sign1 buffer=' . bnum
+ exe 'sign place 5 group=g2 line=12 name=sign1 buffer=' . bnum
+
+ let a = execute('sign place buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 name=sign1 priority=10\n", a)
+
+ let a = execute('sign place group=g2 buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=12 id=5 group=g2 name=sign1 priority=10\n", a)
+
+ let a = execute('sign place group=* buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+ \ " line=10 id=5 name=sign1 priority=10\n" .
+ \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
+ \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
+
+ let a = execute('sign place group=xyz buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
+
+ let a = execute('sign place group=*')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+ \ " line=10 id=5 name=sign1 priority=10\n" .
+ \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
+ \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
+
+! " Test for :sign unplace
+! sign unplace 5 group=g2 file=Xsign
+! call assert_equal([], sign_getplaced(bnum, {'group' : 'g2'})[0].signs)
+!
+! exe 'sign unplace 5 group=g1 buffer=' . bnum
+! call assert_equal([], sign_getplaced(bnum, {'group' : 'g1'})[0].signs)
+!
+! sign unplace 5 group=xy file=Xsign
+! call assert_equal(1, len(sign_getplaced(bnum, {'group' : '*'})[0].signs))
+!
+! " Test for removing all the signs. Place the signs again for this test
+! sign place 5 group=g1 line=11 name=sign1 file=Xsign
+! sign place 5 group=g2 line=12 name=sign1 file=Xsign
+! sign place 6 line=20 name=sign1 file=Xsign
+! sign place 6 group=g1 line=21 name=sign1 file=Xsign
+! sign place 6 group=g2 line=22 name=sign1 file=Xsign
+! sign unplace 5 group=* file=Xsign
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+! \ " line=20 id=6 name=sign1 priority=10\n" .
+! \ " line=21 id=6 group=g1 name=sign1 priority=10\n" .
+! \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a)
+
+! " Remove all the signs from the global group
+! sign unplace * file=Xsign
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+! \ " line=21 id=6 group=g1 name=sign1 priority=10\n" .
+! \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a)
+
+! " Remove all the signs from a particular group
+! sign place 5 line=10 name=sign1 file=Xsign
+! sign place 5 group=g1 line=11 name=sign1 file=Xsign
+! sign place 5 group=g2 line=12 name=sign1 file=Xsign
+! sign unplace * group=g1 file=Xsign
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+! \ " line=10 id=5 name=sign1 priority=10\n" .
+! \ " line=12 id=5 group=g2 name=sign1 priority=10\n" .
+! \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a)
+
+! " Remove all the signs from all the groups in a file
+! sign place 5 group=g1 line=11 name=sign1 file=Xsign
+! sign place 6 line=20 name=sign1 file=Xsign
+! sign place 6 group=g1 line=21 name=sign1 file=Xsign
+! sign unplace * group=* file=Xsign
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\n", a)
+
+! " Remove a particular sign id in a group from all the files
+! sign place 5 group=g1 line=11 name=sign1 file=Xsign
+! sign unplace 5 group=g1
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\n", a)
+
+! " Remove a particular sign id in all the groups from all the files
+! sign place 5 line=10 name=sign1 file=Xsign
+! sign place 5 group=g1 line=11 name=sign1 file=Xsign
+! sign place 5 group=g2 line=12 name=sign1 file=Xsign
+! sign place 6 line=20 name=sign1 file=Xsign
+! sign place 6 group=g1 line=21 name=sign1 file=Xsign
+! sign place 6 group=g2 line=22 name=sign1 file=Xsign
+ sign unplace 5 group=*
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+! \ " line=20 id=6 name=sign1 priority=10\n" .
+! \ " line=21 id=6 group=g1 name=sign1 priority=10\n" .
+! \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a)
+
+! " Remove all the signs from all the groups in all the files
+! sign place 5 line=10 name=sign1 file=Xsign
+! sign place 5 group=g1 line=11 name=sign1 file=Xsign
+ sign unplace * group=*
+! let a = execute('sign place group=*')
+! call assert_equal("\n--- Signs ---\n", a)
+
+! " Error cases
+! call assert_fails("sign place 3 group= name=sign1 buffer=" . bnum, 'E474:')
+
+- call delete("Xsign")
+ call sign_unplace('*')
+ call sign_undefine()
+ enew | only
+ endfunc
+
+ " Tests for auto-generating the sign identifier
+--- 588,1021 ----
+ sign place 5 group=g1 line=10 name=sign1 file=Xsign
+ sign place 5 group=g2 line=10 name=sign1 file=Xsign
+
+! " Tests for the ':sign place' command
+!
+! " :sign place file={fname}
+ let a = execute('sign place file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 name=sign1 priority=10\n", a)
+
++ " :sign place group={group} file={fname}
+ let a = execute('sign place group=g2 file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 group=g2 name=sign1 priority=10\n", a)
+
++ " :sign place group=* file={fname}
+ let a = execute('sign place group=* file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+ \ " line=10 id=5 group=g2 name=sign1 priority=10\n" .
+ \ " line=10 id=5 group=g1 name=sign1 priority=10\n" .
+ \ " line=10 id=5 name=sign1 priority=10\n", a)
+
++ " Error case: non-existing group
+ let a = execute('sign place group=xyz file=Xsign')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
+
+ call sign_unplace('*')
+ let bnum = bufnr('Xsign')
+ exe 'sign place 5 line=10 name=sign1 buffer=' . bnum
+ exe 'sign place 5 group=g1 line=11 name=sign1 buffer=' . bnum
+ exe 'sign place 5 group=g2 line=12 name=sign1 buffer=' . bnum
+
++ " :sign place buffer={fname}
+ let a = execute('sign place buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 name=sign1 priority=10\n", a)
+
++ " :sign place group={group} buffer={fname}
+ let a = execute('sign place group=g2 buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=12 id=5 group=g2 name=sign1 priority=10\n", a)
+
++ " :sign place group=* buffer={fname}
+ let a = execute('sign place group=* buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+ \ " line=10 id=5 name=sign1 priority=10\n" .
+ \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
+ \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
+
++ " Error case: non-existing group
+ let a = execute('sign place group=xyz buffer=' . bnum)
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
+
++ " :sign place
++ let a = execute('sign place')
++ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
++ \ " line=10 id=5 name=sign1 priority=10\n", a)
++
++ " :sign place group={group}
++ let a = execute('sign place group=g1')
++ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
++ \ " line=11 id=5 group=g1 name=sign1 priority=10\n", a)
++
++ " :sign place group=*
+ let a = execute('sign place group=*')
+ call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+ \ " line=10 id=5 name=sign1 priority=10\n" .
+ \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
+ \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
+
+! " Test for ':sign jump' command with groups
+! sign jump 5 group=g1 file=Xsign
+! call assert_equal(11, line('.'))
+! call assert_equal('Xsign', bufname(''))
+! sign jump 5 group=g2 file=Xsign
+! call assert_equal(12, line('.'))
+
+! " Error cases
+! call assert_fails("sign place 3 group= name=sign1 buffer=" . bnum, 'E474:')
+
+! call delete("Xsign")
+! call sign_unplace('*')
+! call sign_undefine()
+! enew | only
+! endfunc
+
+! " Place signs used for ":sign unplace" command test
+! func Place_signs_for_test()
+! call sign_unplace('*')
+
+! sign place 3 line=10 name=sign1 file=Xsign1
+! sign place 3 group=g1 line=11 name=sign1 file=Xsign1
+! sign place 3 group=g2 line=12 name=sign1 file=Xsign1
+! sign place 4 line=15 name=sign1 file=Xsign1
+! sign place 4 group=g1 line=16 name=sign1 file=Xsign1
+! sign place 4 group=g2 line=17 name=sign1 file=Xsign1
+! sign place 5 line=20 name=sign1 file=Xsign2
+! sign place 5 group=g1 line=21 name=sign1 file=Xsign2
+! sign place 5 group=g2 line=22 name=sign1 file=Xsign2
+! sign place 6 line=25 name=sign1 file=Xsign2
+! sign place 6 group=g1 line=26 name=sign1 file=Xsign2
+! sign place 6 group=g2 line=27 name=sign1 file=Xsign2
+! endfunc
+
+! " Place multiple signs in a single line for test
+! func Place_signs_at_line_for_test()
+! call sign_unplace('*')
+! sign place 3 line=13 name=sign1 file=Xsign1
+! sign place 3 group=g1 line=13 name=sign1 file=Xsign1
+! sign place 3 group=g2 line=13 name=sign1 file=Xsign1
+! sign place 4 line=13 name=sign1 file=Xsign1
+! sign place 4 group=g1 line=13 name=sign1 file=Xsign1
+! sign place 4 group=g2 line=13 name=sign1 file=Xsign1
+! endfunc
+!
+! " Tests for the ':sign unplace' command
+! func Test_sign_unplace()
+! enew | only
+! " Remove all the signs
+! call sign_unplace('*')
+! call sign_undefine()
+!
+! " Create two files and define signs
+! call writefile(repeat(["Sun is shining"], 30), "Xsign1")
+! call writefile(repeat(["It is beautiful"], 30), "Xsign2")
+!
+! let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
+! call sign_define("sign1", attr)
+!
+! edit Xsign1
+! let bnum1 = bufnr('%')
+! split Xsign2
+! let bnum2 = bufnr('%')
+!
+! let signs1 = [{'id' : 3, 'name' : 'sign1', 'lnum' : 10, 'group' : '',
+! \ 'priority' : 10},
+! \ {'id' : 3, 'name' : 'sign1', 'lnum' : 11, 'group' : 'g1',
+! \ 'priority' : 10},
+! \ {'id' : 3, 'name' : 'sign1', 'lnum' : 12, 'group' : 'g2',
+! \ 'priority' : 10},
+! \ {'id' : 4, 'name' : 'sign1', 'lnum' : 15, 'group' : '',
+! \ 'priority' : 10},
+! \ {'id' : 4, 'name' : 'sign1', 'lnum' : 16, 'group' : 'g1',
+! \ 'priority' : 10},
+! \ {'id' : 4, 'name' : 'sign1', 'lnum' : 17, 'group' : 'g2',
+! \ 'priority' : 10},]
+! let signs2 = [{'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : '',
+! \ 'priority' : 10},
+! \ {'id' : 5, 'name' : 'sign1', 'lnum' : 21, 'group' : 'g1',
+! \ 'priority' : 10},
+! \ {'id' : 5, 'name' : 'sign1', 'lnum' : 22, 'group' : 'g2',
+! \ 'priority' : 10},
+! \ {'id' : 6, 'name' : 'sign1', 'lnum' : 25, 'group' : '',
+! \ 'priority' : 10},
+! \ {'id' : 6, 'name' : 'sign1', 'lnum' : 26, 'group' : 'g1',
+! \ 'priority' : 10},
+! \ {'id' : 6, 'name' : 'sign1', 'lnum' : 27, 'group' : 'g2',
+! \ 'priority' : 10},]
+!
+! " Test for :sign unplace {id} file={fname}
+! call Place_signs_for_test()
+! sign unplace 3 file=Xsign1
+! sign unplace 6 file=Xsign2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 3 || val.group != ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 6 || val.group != ''}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} group={group} file={fname}
+! call Place_signs_for_test()
+! sign unplace 4 group=g1 file=Xsign1
+! sign unplace 5 group=g2 file=Xsign2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group != 'g1'}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 5 || val.group != 'g2'}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} group=* file={fname}
+! call Place_signs_for_test()
+! sign unplace 3 group=* file=Xsign1
+! sign unplace 6 group=* file=Xsign2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 3}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 6}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * file={fname}
+! call Place_signs_for_test()
+! sign unplace * file=Xsign1
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(signs2, sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * group={group} file={fname}
+! call Place_signs_for_test()
+! sign unplace * group=g1 file=Xsign1
+! sign unplace * group=g2 file=Xsign2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != 'g1'}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.group != 'g2'}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * group=* file={fname}
+! call Place_signs_for_test()
+! sign unplace * group=* file=Xsign2
+! call assert_equal(signs1, sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal([], sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} buffer={nr}
+! call Place_signs_for_test()
+! exe 'sign unplace 3 buffer=' . bnum1
+! exe 'sign unplace 6 buffer=' . bnum2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 3 || val.group != ''}),
+! \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 6 || val.group != ''}),
+! \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} group={group} buffer={nr}
+! call Place_signs_for_test()
+! exe 'sign unplace 4 group=g1 buffer=' . bnum1
+! exe 'sign unplace 5 group=g2 buffer=' . bnum2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group != 'g1'}),
+! \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 5 || val.group != 'g2'}),
+! \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} group=* buffer={nr}
+! call Place_signs_for_test()
+! exe 'sign unplace 3 group=* buffer=' . bnum1
+! exe 'sign unplace 6 group=* buffer=' . bnum2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 3}),
+! \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 6}),
+! \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * buffer={nr}
+! call Place_signs_for_test()
+! exe 'sign unplace * buffer=' . bnum1
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != ''}),
+! \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
+! call assert_equal(signs2, sign_getplaced(bnum2, {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * group={group} buffer={nr}
+! call Place_signs_for_test()
+! exe 'sign unplace * group=g1 buffer=' . bnum1
+! exe 'sign unplace * group=g2 buffer=' . bnum2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != 'g1'}),
+! \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.group != 'g2'}),
+! \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * group=* buffer={nr}
+! call Place_signs_for_test()
+! exe 'sign unplace * group=* buffer=' . bnum2
+! call assert_equal(signs1, sign_getplaced(bnum1, {'group' : '*'})[0].signs)
+! call assert_equal([], sign_getplaced(bnum2, {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id}
+! call Place_signs_for_test()
+! sign unplace 4
+! sign unplace 6
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group != ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 6 || val.group != ''}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} group={group}
+! call Place_signs_for_test()
+! sign unplace 4 group=g1
+! sign unplace 6 group=g2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group != 'g1'}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 6 || val.group != 'g2'}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace {id} group=*
+! call Place_signs_for_test()
+! sign unplace 3 group=*
+ sign unplace 5 group=*
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 3}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.id != 5}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+
+! " Test for :sign unplace *
+! call Place_signs_for_test()
+! sign unplace *
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.group != ''}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * group={group}
+! call Place_signs_for_test()
+! sign unplace * group=g1
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != 'g1'}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(
+! \ filter(copy(signs2),
+! \ {idx, val -> val.group != 'g1'}),
+! \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Test for :sign unplace * group=*
+! call Place_signs_for_test()
+ sign unplace * group=*
+! call assert_equal([], sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal([], sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+
+! " Negative test cases
+! call Place_signs_for_test()
+! sign unplace 3 group=xy file=Xsign1
+! sign unplace * group=xy file=Xsign1
+! silent! sign unplace * group=* file=FileNotPresent
+! call assert_equal(signs1, sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! call assert_equal(signs2, sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
+!
+! " Tests for removing sign at the current cursor position
+!
+! " Test for ':sign unplace'
+! let signs1 = [{'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g2',
+! \ 'priority' : 10},
+! \ {'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g1',
+! \ 'priority' : 10},
+! \ {'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : '',
+! \ 'priority' : 10},
+! \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g2',
+! \ 'priority' : 10},
+! \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g1',
+! \ 'priority' : 10},
+! \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : '',
+! \ 'priority' : 10},]
+! exe bufwinnr('Xsign1') . 'wincmd w'
+! call cursor(13, 1)
+!
+! " Should remove only one sign in the global group
+! call Place_signs_at_line_for_test()
+! sign unplace
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group != ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! " Should remove the second sign in the global group
+! sign unplace
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.group != ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+!
+! " Test for ':sign unplace group={group}'
+! call Place_signs_at_line_for_test()
+! " Should remove only one sign in group g1
+! sign unplace group=g1
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group != 'g1'}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! sign unplace group=g2
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4 || val.group == ''}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+!
+! " Test for ':sign unplace group=*'
+! call Place_signs_at_line_for_test()
+! sign unplace group=*
+! sign unplace group=*
+! sign unplace group=*
+! call assert_equal(
+! \ filter(copy(signs1),
+! \ {idx, val -> val.id != 4}),
+! \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+! sign unplace group=*
+! sign unplace group=*
+! sign unplace group=*
+! call assert_equal([], sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
+
+ call sign_unplace('*')
+ call sign_undefine()
+ enew | only
++ call delete("Xsign1")
++ call delete("Xsign2")
+ endfunc
+
+ " Tests for auto-generating the sign identifier
+***************
+*** 762,768 ****
+ " Place three signs with different priority in the same line
+ call writefile(repeat(["Sun is shining"], 30), "Xsign")
+ edit Xsign
+- let fname = fnamemodify('Xsign', ':p')
+
+ call sign_place(1, 'g1', 'sign1', 'Xsign',
+ \ {'lnum' : 11, 'priority' : 50})
+--- 1066,1071 ----
+*** ../vim-8.1.0657/src/version.c 2018-12-29 13:09:43.242347695 +0100
+--- src/version.c 2018-12-29 18:51:45.504342343 +0100
+***************
+*** 801,802 ****
+--- 801,804 ----
+ { /* Add new patch number below this line */
++ /**/
++ 658,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+76. Your ISP regards you as a business partner rather than as a customer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///