Mercurial > vim
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; |