comparison src/buffer.c @ 15209:3a99b2e6d136 v8.1.0614

patch 8.1.0614: placing signs can be complicated commit https://github.com/vim/vim/commit/162b71479bd4dcdb3a2ef9198a1444f6f99e6843 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Dec 21 15:17:36 2018 +0100 patch 8.1.0614: placing signs can be complicated Problem: Placing signs can be complicated. Solution: Add functions for defining and placing signs. Introduce a group name to avoid different plugins using the same signs. (Yegappan Lakshmanan, closes #3652)
author Bram Moolenaar <Bram@vim.org>
date Fri, 21 Dec 2018 15:30:07 +0100
parents 6ab9c18708c4
children 336728a577f5
comparison
equal deleted inserted replaced
15208:acf68008ca43 15209:3a99b2e6d136
934 #endif 934 #endif
935 #ifdef FEAT_USR_CMDS 935 #ifdef FEAT_USR_CMDS
936 uc_clear(&buf->b_ucmds); /* clear local user commands */ 936 uc_clear(&buf->b_ucmds); /* clear local user commands */
937 #endif 937 #endif
938 #ifdef FEAT_SIGNS 938 #ifdef FEAT_SIGNS
939 buf_delete_signs(buf); /* delete any signs */ 939 buf_delete_signs(buf, (char_u *)"*"); // delete any signs */
940 #endif 940 #endif
941 #ifdef FEAT_NETBEANS_INTG 941 #ifdef FEAT_NETBEANS_INTG
942 netbeans_file_killed(buf); 942 netbeans_file_killed(buf);
943 #endif 943 #endif
944 #ifdef FEAT_LOCALMAP 944 #ifdef FEAT_LOCALMAP
5864 } 5864 }
5865 #endif 5865 #endif
5866 5866
5867 #if defined(FEAT_SIGNS) || defined(PROTO) 5867 #if defined(FEAT_SIGNS) || defined(PROTO)
5868 /* 5868 /*
5869 * Insert the sign into the signlist. 5869 * Insert a new sign into the signlist for buffer 'buf' between the 'prev' and
5870 * 'next' signs.
5870 */ 5871 */
5871 static void 5872 static void
5872 insert_sign( 5873 insert_sign(
5873 buf_T *buf, /* buffer to store sign in */ 5874 buf_T *buf, // buffer to store sign in
5874 signlist_T *prev, /* previous sign entry */ 5875 signlist_T *prev, // previous sign entry
5875 signlist_T *next, /* next sign entry */ 5876 signlist_T *next, // next sign entry
5876 int id, /* sign ID */ 5877 int id, // sign ID
5877 linenr_T lnum, /* line number which gets the mark */ 5878 char_u *group, // sign group; NULL for global group
5878 int typenr) /* typenr of sign we are adding */ 5879 int prio, // sign priority
5880 linenr_T lnum, // line number which gets the mark
5881 int typenr) // typenr of sign we are adding
5879 { 5882 {
5880 signlist_T *newsign; 5883 signlist_T *newsign;
5881 5884
5882 newsign = (signlist_T *)lalloc((long_u)sizeof(signlist_T), FALSE); 5885 newsign = (signlist_T *)lalloc_id((long_u)sizeof(signlist_T), FALSE,
5886 aid_insert_sign);
5883 if (newsign != NULL) 5887 if (newsign != NULL)
5884 { 5888 {
5885 newsign->id = id; 5889 newsign->id = id;
5886 newsign->lnum = lnum; 5890 newsign->lnum = lnum;
5887 newsign->typenr = typenr; 5891 newsign->typenr = typenr;
5892 if (group != NULL)
5893 newsign->group = vim_strsave(group);
5894 else
5895 newsign->group = NULL;
5896 newsign->priority = prio;
5888 newsign->next = next; 5897 newsign->next = next;
5889 newsign->prev = prev; 5898 newsign->prev = prev;
5890 if (next != NULL) 5899 if (next != NULL)
5891 next->prev = newsign; 5900 next->prev = newsign;
5892 5901
5893 if (prev == NULL) 5902 if (prev == NULL)
5894 { 5903 {
5895 /* When adding first sign need to redraw the windows to create the 5904 // When adding first sign need to redraw the windows to create the
5896 * column for signs. */ 5905 // column for signs.
5897 if (buf->b_signlist == NULL) 5906 if (buf->b_signlist == NULL)
5898 { 5907 {
5899 redraw_buf_later(buf, NOT_VALID); 5908 redraw_buf_later(buf, NOT_VALID);
5900 changed_cline_bef_curs(); 5909 changed_cline_bef_curs();
5901 } 5910 }
5902 5911
5903 /* first sign in signlist */ 5912 // first sign in signlist
5904 buf->b_signlist = newsign; 5913 buf->b_signlist = newsign;
5905 #ifdef FEAT_NETBEANS_INTG 5914 #ifdef FEAT_NETBEANS_INTG
5906 if (netbeans_active()) 5915 if (netbeans_active())
5907 buf->b_has_sign_column = TRUE; 5916 buf->b_has_sign_column = TRUE;
5908 #endif 5917 #endif
5911 prev->next = newsign; 5920 prev->next = newsign;
5912 } 5921 }
5913 } 5922 }
5914 5923
5915 /* 5924 /*
5916 * Add the sign into the signlist. Find the right spot to do it though. 5925 * Insert a new sign sorted by line number and sign priority.
5917 */ 5926 */
5918 void 5927 static void
5919 buf_addsign( 5928 insert_sign_by_lnum_prio(
5920 buf_T *buf, /* buffer to store sign in */ 5929 buf_T *buf, // buffer to store sign in
5921 int id, /* sign ID */ 5930 signlist_T *prev, // previous sign entry
5922 linenr_T lnum, /* line number which gets the mark */ 5931 int id, // sign ID
5923 int typenr) /* typenr of sign we are adding */ 5932 char_u *group, // sign group; NULL for global group
5924 { 5933 int prio, // sign priority
5925 signlist_T *sign; /* a sign in the signlist */ 5934 linenr_T lnum, // line number which gets the mark
5926 signlist_T *prev; /* the previous sign */ 5935 int typenr) // typenr of sign we are adding
5927 5936 {
5928 prev = NULL; 5937 signlist_T *sign;
5929 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 5938
5930 { 5939 // keep signs sorted by lnum and by priority: insert new sign at
5931 if (lnum == sign->lnum && id == sign->id) 5940 // the proper position in the list for this lnum.
5932 { 5941 while (prev != NULL && prev->lnum == lnum && prev->priority <= prio)
5933 sign->typenr = typenr;
5934 return;
5935 }
5936 else if (lnum < sign->lnum)
5937 {
5938 // keep signs sorted by lnum: insert new sign at head of list for
5939 // this lnum
5940 while (prev != NULL && prev->lnum == lnum)
5941 prev = prev->prev;
5942 if (prev == NULL)
5943 sign = buf->b_signlist;
5944 else
5945 sign = prev->next;
5946 insert_sign(buf, prev, sign, id, lnum, typenr);
5947 return;
5948 }
5949 prev = sign;
5950 }
5951
5952 // insert new sign at head of list for this lnum
5953 while (prev != NULL && prev->lnum == lnum)
5954 prev = prev->prev; 5942 prev = prev->prev;
5955 if (prev == NULL) 5943 if (prev == NULL)
5956 sign = buf->b_signlist; 5944 sign = buf->b_signlist;
5957 else 5945 else
5958 sign = prev->next; 5946 sign = prev->next;
5959 insert_sign(buf, prev, sign, id, lnum, typenr); 5947
5948 insert_sign(buf, prev, sign, id, group, prio, lnum, typenr);
5949 }
5950
5951 /*
5952 * Returns TRUE if 'sign' is in 'group'.
5953 * A sign can either be in the global group (sign->group == NULL)
5954 * or in a named group. If 'group' is '*', then the sign is part of the group.
5955 */
5956 int
5957 sign_in_group(signlist_T *sign, char_u *group)
5958 {
5959 return ((group != NULL && STRCMP(group, "*") == 0) ||
5960 (group == NULL && sign->group == NULL) ||
5961 (group != NULL && sign->group != NULL &&
5962 STRCMP(group, sign->group) == 0));
5963 }
5964
5965 /*
5966 * Return information about a sign in a Dict
5967 */
5968 dict_T *
5969 sign_get_info(signlist_T *sign)
5970 {
5971 dict_T *d;
5972
5973 if ((d = dict_alloc_id(aid_sign_getinfo)) == NULL)
5974 return NULL;
5975 dict_add_number(d, "id", sign->id);
5976 dict_add_string(d, "group", (sign->group == NULL) ?
5977 (char_u *)"" : sign->group);
5978 dict_add_number(d, "lnum", sign->lnum);
5979 dict_add_string(d, "name", sign_typenr2name(sign->typenr));
5980 dict_add_number(d, "priority", sign->priority);
5981
5982 return d;
5983 }
5984
5985 /*
5986 * Add the sign into the signlist. Find the right spot to do it though.
5987 */
5988 void
5989 buf_addsign(
5990 buf_T *buf, // buffer to store sign in
5991 int id, // sign ID
5992 char_u *group, // sign group
5993 int prio, // sign priority
5994 linenr_T lnum, // line number which gets the mark
5995 int typenr) // typenr of sign we are adding
5996 {
5997 signlist_T *sign; // a sign in the signlist
5998 signlist_T *prev; // the previous sign
5999
6000 prev = NULL;
6001 FOR_ALL_SIGNS_IN_BUF(buf)
6002 {
6003 if (lnum == sign->lnum && id == sign->id &&
6004 sign_in_group(sign, group))
6005 {
6006 // Update an existing sign
6007 sign->typenr = typenr;
6008 return;
6009 }
6010 else if (lnum < sign->lnum)
6011 {
6012 insert_sign_by_lnum_prio(buf, prev, id, group, prio, lnum, typenr);
6013 return;
6014 }
6015 prev = sign;
6016 }
6017
6018 insert_sign_by_lnum_prio(buf, prev, id, group, prio, lnum, typenr);
5960 6019
5961 return; 6020 return;
5962 } 6021 }
5963 6022
5964 /* 6023 /*
5965 * For an existing, placed sign "markId" change the type to "typenr". 6024 * For an existing, placed sign "markId" change the type to "typenr".
5966 * Returns the line number of the sign, or zero if the sign is not found. 6025 * Returns the line number of the sign, or zero if the sign is not found.
5967 */ 6026 */
5968 linenr_T 6027 linenr_T
5969 buf_change_sign_type( 6028 buf_change_sign_type(
5970 buf_T *buf, /* buffer to store sign in */ 6029 buf_T *buf, // buffer to store sign in
5971 int markId, /* sign ID */ 6030 int markId, // sign ID
5972 int typenr) /* typenr of sign we are adding */ 6031 char_u *group, // sign group
5973 { 6032 int typenr) // typenr of sign we are adding
5974 signlist_T *sign; /* a sign in the signlist */ 6033 {
5975 6034 signlist_T *sign; // a sign in the signlist
5976 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 6035
5977 { 6036 FOR_ALL_SIGNS_IN_BUF(buf)
5978 if (sign->id == markId) 6037 {
6038 if (sign->id == markId && sign_in_group(sign, group))
5979 { 6039 {
5980 sign->typenr = typenr; 6040 sign->typenr = typenr;
5981 return sign->lnum; 6041 return sign->lnum;
5982 } 6042 }
5983 } 6043 }
5984 6044
5985 return (linenr_T)0; 6045 return (linenr_T)0;
5986 } 6046 }
5987 6047
6048 /*
6049 * Return the type number of the sign at line number 'lnum' in buffer 'buf'
6050 * which has the attribute specifed by 'type'. Returns 0 if a sign is not found
6051 * at the line number or it doesn't have the specified attribute.
6052 */
5988 int 6053 int
5989 buf_getsigntype( 6054 buf_getsigntype(
5990 buf_T *buf, 6055 buf_T *buf,
5991 linenr_T lnum, 6056 linenr_T lnum,
5992 int type) /* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */ 6057 int type) /* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */
5993 { 6058 {
5994 signlist_T *sign; /* a sign in a b_signlist */ 6059 signlist_T *sign; /* a sign in a b_signlist */
5995 6060
5996 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 6061 FOR_ALL_SIGNS_IN_BUF(buf)
5997 if (sign->lnum == lnum 6062 if (sign->lnum == lnum
5998 && (type == SIGN_ANY 6063 && (type == SIGN_ANY
5999 # ifdef FEAT_SIGN_ICONS 6064 # ifdef FEAT_SIGN_ICONS
6000 || (type == SIGN_ICON 6065 || (type == SIGN_ICON
6001 && sign_get_image(sign->typenr) != NULL) 6066 && sign_get_image(sign->typenr) != NULL)
6006 && sign_get_attr(sign->typenr, TRUE) != 0))) 6071 && sign_get_attr(sign->typenr, TRUE) != 0)))
6007 return sign->typenr; 6072 return sign->typenr;
6008 return 0; 6073 return 0;
6009 } 6074 }
6010 6075
6011 6076 /*
6077 * Delete sign 'id' in group 'group' from buffer 'buf'.
6078 * If 'id' is zero, then delete all the signs in group 'group'. Otherwise
6079 * delete only the specified sign.
6080 * If 'group' is '*', then delete the sign in all the groups. If 'group' is
6081 * NULL, then delete the sign in the global group. Otherwise delete the sign in
6082 * the specified group.
6083 * Returns the line number of the deleted sign. If multiple signs are deleted,
6084 * then returns the line number of the last sign deleted.
6085 */
6012 linenr_T 6086 linenr_T
6013 buf_delsign( 6087 buf_delsign(
6014 buf_T *buf, /* buffer sign is stored in */ 6088 buf_T *buf, // buffer sign is stored in
6015 int id) /* sign id */ 6089 int id, // sign id
6016 { 6090 char_u *group) // sign group
6017 signlist_T **lastp; /* pointer to pointer to current sign */ 6091 {
6018 signlist_T *sign; /* a sign in a b_signlist */ 6092 signlist_T **lastp; // pointer to pointer to current sign
6019 signlist_T *next; /* the next sign in a b_signlist */ 6093 signlist_T *sign; // a sign in a b_signlist
6020 linenr_T lnum; /* line number whose sign was deleted */ 6094 signlist_T *next; // the next sign in a b_signlist
6095 linenr_T lnum; // line number whose sign was deleted
6021 6096
6022 lastp = &buf->b_signlist; 6097 lastp = &buf->b_signlist;
6023 lnum = 0; 6098 lnum = 0;
6024 for (sign = buf->b_signlist; sign != NULL; sign = next) 6099 for (sign = buf->b_signlist; sign != NULL; sign = next)
6025 { 6100 {
6026 next = sign->next; 6101 next = sign->next;
6027 if (sign->id == id) 6102 if ((id == 0 || sign->id == id) && sign_in_group(sign, group))
6103
6028 { 6104 {
6029 *lastp = next; 6105 *lastp = next;
6030 if (next != NULL) 6106 if (next != NULL)
6031 next->prev = sign->prev; 6107 next->prev = sign->prev;
6032 lnum = sign->lnum; 6108 lnum = sign->lnum;
6109 vim_free(sign->group);
6033 vim_free(sign); 6110 vim_free(sign);
6034 break; 6111 // Check whether only one sign needs to be deleted
6112 if (group == NULL || (*group != '*' && id != 0))
6113 break;
6035 } 6114 }
6036 else 6115 else
6037 lastp = &sign->next; 6116 lastp = &sign->next;
6038 } 6117 }
6039 6118
6040 /* When deleted the last sign need to redraw the windows to remove the 6119 // When deleted the last sign need to redraw the windows to remove the
6041 * sign column. */ 6120 // sign column.
6042 if (buf->b_signlist == NULL) 6121 if (buf->b_signlist == NULL)
6043 { 6122 {
6044 redraw_buf_later(buf, NOT_VALID); 6123 redraw_buf_later(buf, NOT_VALID);
6045 changed_cline_bef_curs(); 6124 changed_cline_bef_curs();
6046 } 6125 }
6048 return lnum; 6127 return lnum;
6049 } 6128 }
6050 6129
6051 6130
6052 /* 6131 /*
6053 * Find the line number of the sign with the requested id. If the sign does 6132 * Find the line number of the sign with the requested id in group 'group'. If
6054 * not exist, return 0 as the line number. This will still let the correct file 6133 * the sign does not exist, return 0 as the line number. This will still let
6055 * get loaded. 6134 * the correct file get loaded.
6056 */ 6135 */
6057 int 6136 int
6058 buf_findsign( 6137 buf_findsign(
6059 buf_T *buf, /* buffer to store sign in */ 6138 buf_T *buf, // buffer to store sign in
6060 int id) /* sign ID */ 6139 int id, // sign ID
6061 { 6140 char_u *group) // sign group
6062 signlist_T *sign; /* a sign in the signlist */ 6141 {
6063 6142 signlist_T *sign; // a sign in the signlist
6064 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 6143
6065 if (sign->id == id) 6144 FOR_ALL_SIGNS_IN_BUF(buf)
6145 if (sign->id == id && sign_in_group(sign, group))
6066 return sign->lnum; 6146 return sign->lnum;
6067 6147
6068 return 0; 6148 return 0;
6069 } 6149 }
6070 6150
6151 /*
6152 * Return the sign at line 'lnum' in buffer 'buf'. Returns NULL if a sign is
6153 * not found at the line.
6154 */
6155 static signlist_T *
6156 buf_getsign_at_line(
6157 buf_T *buf, // buffer whose sign we are searching for
6158 linenr_T lnum) // line number of sign
6159 {
6160 signlist_T *sign; // a sign in the signlist
6161
6162 FOR_ALL_SIGNS_IN_BUF(buf)
6163 if (sign->lnum == lnum)
6164 return sign;
6165
6166 return NULL;
6167 }
6168
6169 /*
6170 * Return the sign with identifier 'id' in group 'group' placed in buffer 'buf'
6171 */
6172 signlist_T *
6173 buf_getsign_with_id(
6174 buf_T *buf, // buffer whose sign we are searching for
6175 int id, // sign identifier
6176 char_u *group) // sign group
6177 {
6178 signlist_T *sign; // a sign in the signlist
6179
6180 FOR_ALL_SIGNS_IN_BUF(buf)
6181 if (sign->id == id && sign_in_group(sign, group))
6182 return sign;
6183
6184 return NULL;
6185 }
6186
6187 /*
6188 * Return the identifier of the sign at line number 'lnum' in buffer 'buf'.
6189 */
6071 int 6190 int
6072 buf_findsign_id( 6191 buf_findsign_id(
6073 buf_T *buf, /* buffer whose sign we are searching for */ 6192 buf_T *buf, // buffer whose sign we are searching for
6074 linenr_T lnum) /* line number of sign */ 6193 linenr_T lnum) // line number of sign
6075 { 6194 {
6076 signlist_T *sign; /* a sign in the signlist */ 6195 signlist_T *sign; // a sign in the signlist
6077 6196
6078 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 6197 sign = buf_getsign_at_line(buf, lnum);
6079 if (sign->lnum == lnum) 6198 if (sign != NULL)
6080 return sign->id; 6199 return sign->id;
6081 6200
6082 return 0; 6201 return 0;
6083 } 6202 }
6084
6085 6203
6086 # if defined(FEAT_NETBEANS_INTG) || defined(PROTO) 6204 # if defined(FEAT_NETBEANS_INTG) || defined(PROTO)
6087 /* 6205 /*
6088 * See if a given type of sign exists on a specific line. 6206 * See if a given type of sign exists on a specific line.
6089 */ 6207 */
6093 linenr_T lnum, /* line number of sign */ 6211 linenr_T lnum, /* line number of sign */
6094 int typenr) /* sign type number */ 6212 int typenr) /* sign type number */
6095 { 6213 {
6096 signlist_T *sign; /* a sign in the signlist */ 6214 signlist_T *sign; /* a sign in the signlist */
6097 6215
6098 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 6216 FOR_ALL_SIGNS_IN_BUF(buf)
6099 if (sign->lnum == lnum && sign->typenr == typenr) 6217 if (sign->lnum == lnum && sign->typenr == typenr)
6100 return sign->id; 6218 return sign->id;
6101 6219
6102 return 0; 6220 return 0;
6103 } 6221 }
6108 * Return the number of icons on the given line. 6226 * Return the number of icons on the given line.
6109 */ 6227 */
6110 int 6228 int
6111 buf_signcount(buf_T *buf, linenr_T lnum) 6229 buf_signcount(buf_T *buf, linenr_T lnum)
6112 { 6230 {
6113 signlist_T *sign; /* a sign in the signlist */ 6231 signlist_T *sign; // a sign in the signlist
6114 int count = 0; 6232 int count = 0;
6115 6233
6116 for (sign = buf->b_signlist; sign != NULL; sign = sign->next) 6234 FOR_ALL_SIGNS_IN_BUF(buf)
6117 if (sign->lnum == lnum) 6235 if (sign->lnum == lnum)
6118 if (sign_get_image(sign->typenr) != NULL) 6236 if (sign_get_image(sign->typenr) != NULL)
6119 count++; 6237 count++;
6120 6238
6121 return count; 6239 return count;
6122 } 6240 }
6123 # endif /* FEAT_SIGN_ICONS */ 6241 # endif /* FEAT_SIGN_ICONS */
6124 # endif /* FEAT_NETBEANS_INTG */ 6242 # endif /* FEAT_NETBEANS_INTG */
6125 6243
6126 6244 /*
6127 /* 6245 * Delete signs in group 'group' in buffer "buf". If 'group' is '*', then
6128 * Delete signs in buffer "buf". 6246 * delete all the signs.
6129 */ 6247 */
6130 void 6248 void
6131 buf_delete_signs(buf_T *buf) 6249 buf_delete_signs(buf_T *buf, char_u *group)
6132 { 6250 {
6251 signlist_T *sign;
6252 signlist_T **lastp; // pointer to pointer to current sign
6133 signlist_T *next; 6253 signlist_T *next;
6134 6254
6135 /* When deleting the last sign need to redraw the windows to remove the 6255 // When deleting the last sign need to redraw the windows to remove the
6136 * sign column. Not when curwin is NULL (this means we're exiting). */ 6256 // sign column. Not when curwin is NULL (this means we're exiting).
6137 if (buf->b_signlist != NULL && curwin != NULL) 6257 if (buf->b_signlist != NULL && curwin != NULL)
6138 { 6258 {
6139 redraw_buf_later(buf, NOT_VALID); 6259 redraw_buf_later(buf, NOT_VALID);
6140 changed_cline_bef_curs(); 6260 changed_cline_bef_curs();
6141 } 6261 }
6142 6262
6143 while (buf->b_signlist != NULL) 6263 lastp = &buf->b_signlist;
6144 { 6264 for (sign = buf->b_signlist; sign != NULL; sign = next)
6145 next = buf->b_signlist->next; 6265 {
6146 vim_free(buf->b_signlist); 6266 next = sign->next;
6147 buf->b_signlist = next; 6267 if (sign_in_group(sign, group))
6268 {
6269 *lastp = next;
6270 if (next != NULL)
6271 next->prev = sign->prev;
6272 vim_free(sign->group);
6273 vim_free(sign);
6274 }
6275 else
6276 lastp = &sign->next;
6148 } 6277 }
6149 } 6278 }
6150 6279
6151 /* 6280 /*
6152 * Delete all signs in all buffers. 6281 * Delete all signs in all buffers.
6156 { 6285 {
6157 buf_T *buf; /* buffer we are checking for signs */ 6286 buf_T *buf; /* buffer we are checking for signs */
6158 6287
6159 FOR_ALL_BUFFERS(buf) 6288 FOR_ALL_BUFFERS(buf)
6160 if (buf->b_signlist != NULL) 6289 if (buf->b_signlist != NULL)
6161 buf_delete_signs(buf); 6290 buf_delete_signs(buf, (char_u *)"*");
6162 } 6291 }
6163 6292
6164 /* 6293 /*
6165 * List placed signs for "rbuf". If "rbuf" is NULL do it for all buffers. 6294 * List placed signs for "rbuf". If "rbuf" is NULL do it for all buffers.
6166 */ 6295 */
6167 void 6296 void
6168 sign_list_placed(buf_T *rbuf) 6297 sign_list_placed(buf_T *rbuf, char_u *sign_group)
6169 { 6298 {
6170 buf_T *buf; 6299 buf_T *buf;
6171 signlist_T *p; 6300 signlist_T *sign;
6172 char lbuf[BUFSIZ]; 6301 char lbuf[BUFSIZ];
6302 char group[BUFSIZ];
6173 6303
6174 MSG_PUTS_TITLE(_("\n--- Signs ---")); 6304 MSG_PUTS_TITLE(_("\n--- Signs ---"));
6175 msg_putchar('\n'); 6305 msg_putchar('\n');
6176 if (rbuf == NULL) 6306 if (rbuf == NULL)
6177 buf = firstbuf; 6307 buf = firstbuf;
6183 { 6313 {
6184 vim_snprintf(lbuf, BUFSIZ, _("Signs for %s:"), buf->b_fname); 6314 vim_snprintf(lbuf, BUFSIZ, _("Signs for %s:"), buf->b_fname);
6185 MSG_PUTS_ATTR(lbuf, HL_ATTR(HLF_D)); 6315 MSG_PUTS_ATTR(lbuf, HL_ATTR(HLF_D));
6186 msg_putchar('\n'); 6316 msg_putchar('\n');
6187 } 6317 }
6188 for (p = buf->b_signlist; p != NULL && !got_int; p = p->next) 6318 FOR_ALL_SIGNS_IN_BUF(buf)
6189 { 6319 {
6190 vim_snprintf(lbuf, BUFSIZ, _(" line=%ld id=%d name=%s"), 6320 if (!sign_in_group(sign, sign_group))
6191 (long)p->lnum, p->id, sign_typenr2name(p->typenr)); 6321 continue;
6322 if (sign->group != NULL)
6323 vim_snprintf(group, BUFSIZ, " group=%s", sign->group);
6324 else
6325 group[0] = '\0';
6326 vim_snprintf(lbuf, BUFSIZ, _(" line=%ld id=%d%s name=%s "
6327 "priority=%d"),
6328 (long)sign->lnum, sign->id, group,
6329 sign_typenr2name(sign->typenr), sign->priority);
6192 MSG_PUTS(lbuf); 6330 MSG_PUTS(lbuf);
6193 msg_putchar('\n'); 6331 msg_putchar('\n');
6194 } 6332 }
6195 if (rbuf != NULL) 6333 if (rbuf != NULL)
6196 break; 6334 break;
6208 long amount, 6346 long amount,
6209 long amount_after) 6347 long amount_after)
6210 { 6348 {
6211 signlist_T *sign; /* a sign in a b_signlist */ 6349 signlist_T *sign; /* a sign in a b_signlist */
6212 6350
6213 for (sign = curbuf->b_signlist; sign != NULL; sign = sign->next) 6351 FOR_ALL_SIGNS_IN_BUF(curbuf)
6214 { 6352 {
6215 if (sign->lnum >= line1 && sign->lnum <= line2) 6353 if (sign->lnum >= line1 && sign->lnum <= line2)
6216 { 6354 {
6217 if (amount == MAXLNUM) 6355 if (amount == MAXLNUM)
6218 sign->lnum = line1; 6356 sign->lnum = line1;