Mercurial > vim
comparison src/window.c @ 1326:22886f3d882d v7.1.040
updated for version 7.1-040
author | vimboss |
---|---|
date | Thu, 26 Jul 2007 20:58:42 +0000 |
parents | f89c43568067 |
children | 06e0f7482cef |
comparison
equal
deleted
inserted
replaced
1325:f26d0c74a329 | 1326:22886f3d882d |
---|---|
73 static void restore_snapshot __ARGS((int close_curwin)); | 73 static void restore_snapshot __ARGS((int close_curwin)); |
74 static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); | 74 static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); |
75 static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); | 75 static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); |
76 | 76 |
77 #endif /* FEAT_WINDOWS */ | 77 #endif /* FEAT_WINDOWS */ |
78 | |
78 static win_T *win_alloc __ARGS((win_T *after)); | 79 static win_T *win_alloc __ARGS((win_T *after)); |
79 static void win_new_height __ARGS((win_T *, int)); | 80 static void win_new_height __ARGS((win_T *, int)); |
80 | 81 |
81 #define URL_SLASH 1 /* path_is_url() has found "://" */ | 82 #define URL_SLASH 1 /* path_is_url() has found "://" */ |
82 #define URL_BACKSLASH 2 /* path_is_url() has found ":\\" */ | 83 #define URL_BACKSLASH 2 /* path_is_url() has found ":\\" */ |
4126 foldInitWin(newwin); | 4127 foldInitWin(newwin); |
4127 #endif | 4128 #endif |
4128 #ifdef FEAT_AUTOCMD | 4129 #ifdef FEAT_AUTOCMD |
4129 --autocmd_block; | 4130 --autocmd_block; |
4130 #endif | 4131 #endif |
4132 #ifdef FEAT_SEARCH_EXTRA | |
4133 newwin->w_match_head = NULL; | |
4134 newwin->w_next_match_id = 4; | |
4135 #endif | |
4131 } | 4136 } |
4132 return newwin; | 4137 return newwin; |
4133 } | 4138 } |
4134 | 4139 |
4135 #if defined(FEAT_WINDOWS) || defined(PROTO) | 4140 #if defined(FEAT_WINDOWS) || defined(PROTO) |
4183 | 4188 |
4184 for (i = 0; i < wp->w_tagstacklen; ++i) | 4189 for (i = 0; i < wp->w_tagstacklen; ++i) |
4185 vim_free(wp->w_tagstack[i].tagname); | 4190 vim_free(wp->w_tagstack[i].tagname); |
4186 | 4191 |
4187 vim_free(wp->w_localdir); | 4192 vim_free(wp->w_localdir); |
4193 | |
4188 #ifdef FEAT_SEARCH_EXTRA | 4194 #ifdef FEAT_SEARCH_EXTRA |
4189 vim_free(wp->w_match[0].regprog); | 4195 clear_matches(wp); |
4190 vim_free(wp->w_match[1].regprog); | 4196 #endif |
4191 vim_free(wp->w_match[2].regprog); | 4197 |
4192 #endif | |
4193 #ifdef FEAT_JUMPLIST | 4198 #ifdef FEAT_JUMPLIST |
4194 free_jumplist(wp); | 4199 free_jumplist(wp); |
4195 #endif | 4200 #endif |
4196 | 4201 |
4197 #ifdef FEAT_QUICKFIX | 4202 #ifdef FEAT_QUICKFIX |
6172 return TRUE; | 6177 return TRUE; |
6173 | 6178 |
6174 return FALSE; | 6179 return FALSE; |
6175 } | 6180 } |
6176 #endif | 6181 #endif |
6182 | |
6183 #if defined(FEAT_SEARCH_EXTRA) || defined(PROTO) | |
6184 /* | |
6185 * Add match to the match list of window 'wp'. The pattern 'pat' will be | |
6186 * highligted with the group 'grp' with priority 'prio'. | |
6187 * Optionally, a desired ID 'id' can be specified (greater than or equal to 1). | |
6188 * If no particular ID is desired, -1 must be specified for 'id'. | |
6189 * Return ID of added match, -1 on failure. | |
6190 */ | |
6191 int | |
6192 match_add(wp, grp, pat, prio, id) | |
6193 win_T *wp; | |
6194 char_u *grp; | |
6195 char_u *pat; | |
6196 int prio; | |
6197 int id; | |
6198 { | |
6199 matchitem_T *cur; | |
6200 matchitem_T *prev; | |
6201 matchitem_T *m; | |
6202 int hlg_id; | |
6203 regmmatch_T match; | |
6204 | |
6205 if (*grp == NUL || *pat == NUL) | |
6206 return -1; | |
6207 if (id < -1 || id == 0) | |
6208 { | |
6209 EMSGN("E799: Invalid ID: %ld (must be greater than or equal to 1)", id); | |
6210 return -1; | |
6211 } | |
6212 if (id != -1) | |
6213 { | |
6214 cur = wp->w_match_head; | |
6215 while (cur != NULL) | |
6216 { | |
6217 if (cur->id == id) | |
6218 { | |
6219 EMSGN("E801: ID already taken: %ld", id); | |
6220 return -1; | |
6221 } | |
6222 cur = cur->next; | |
6223 } | |
6224 } | |
6225 if ((hlg_id = syn_namen2id(grp, STRLEN(grp))) == 0) | |
6226 { | |
6227 EMSG2(_(e_nogroup), grp); | |
6228 return -1; | |
6229 } | |
6230 if ((match.regprog = vim_regcomp(pat, RE_MAGIC)) == NULL) | |
6231 { | |
6232 EMSG2(_(e_invarg2), pat); | |
6233 return -1; | |
6234 } | |
6235 | |
6236 /* Find available match ID. */ | |
6237 while (id == -1) | |
6238 { | |
6239 cur = wp->w_match_head; | |
6240 while (cur != NULL && cur->id != wp->w_next_match_id) | |
6241 cur = cur->next; | |
6242 if (cur == NULL) | |
6243 id = wp->w_next_match_id; | |
6244 wp->w_next_match_id++; | |
6245 } | |
6246 | |
6247 /* Build new match. */ | |
6248 m = (matchitem_T *)alloc(sizeof(matchitem_T)); | |
6249 m->id = id; | |
6250 m->priority = prio; | |
6251 m->pattern = vim_strsave(pat); | |
6252 m->hlg_id = hlg_id; | |
6253 m->match.regprog = match.regprog; | |
6254 | |
6255 /* Insert new match. The match list is in ascending order with regard to | |
6256 * the match priorities. */ | |
6257 cur = wp->w_match_head; | |
6258 prev = cur; | |
6259 while (cur != NULL && prio >= cur->priority) | |
6260 { | |
6261 prev = cur; | |
6262 cur = cur->next; | |
6263 } | |
6264 if (cur == prev) | |
6265 wp->w_match_head = m; | |
6266 else | |
6267 prev->next = m; | |
6268 m->next = cur; | |
6269 | |
6270 redraw_later(SOME_VALID); | |
6271 return id; | |
6272 } | |
6273 | |
6274 /* | |
6275 * Delete match with ID 'id' in the match list of window 'wp'. | |
6276 * Print error messages if 'perr' is TRUE. | |
6277 */ | |
6278 int | |
6279 match_delete(wp, id, perr) | |
6280 win_T *wp; | |
6281 int id; | |
6282 int perr; | |
6283 { | |
6284 matchitem_T *cur = wp->w_match_head; | |
6285 matchitem_T *prev = cur; | |
6286 | |
6287 if (id < 1) | |
6288 { | |
6289 if (perr == TRUE) | |
6290 EMSGN("E802: Invalid ID: %ld (must be greater than or equal to 1)", | |
6291 id); | |
6292 return -1; | |
6293 } | |
6294 while (cur != NULL && cur->id != id) | |
6295 { | |
6296 prev = cur; | |
6297 cur = cur->next; | |
6298 } | |
6299 if (cur == NULL) | |
6300 { | |
6301 if (perr == TRUE) | |
6302 EMSGN("E803: ID not found: %ld", id); | |
6303 return -1; | |
6304 } | |
6305 if (cur == prev) | |
6306 wp->w_match_head = cur->next; | |
6307 else | |
6308 prev->next = cur->next; | |
6309 vim_free(cur->match.regprog); | |
6310 vim_free(cur->pattern); | |
6311 vim_free(cur); | |
6312 redraw_later(SOME_VALID); | |
6313 return 0; | |
6314 } | |
6315 | |
6316 /* | |
6317 * Delete all matches in the match list of window 'wp'. | |
6318 */ | |
6319 void | |
6320 clear_matches(wp) | |
6321 win_T *wp; | |
6322 { | |
6323 matchitem_T *m; | |
6324 | |
6325 while (wp->w_match_head != NULL) | |
6326 { | |
6327 m = wp->w_match_head->next; | |
6328 vim_free(wp->w_match_head->match.regprog); | |
6329 vim_free(wp->w_match_head->pattern); | |
6330 vim_free(wp->w_match_head); | |
6331 wp->w_match_head = m; | |
6332 } | |
6333 redraw_later(SOME_VALID); | |
6334 } | |
6335 | |
6336 /* | |
6337 * Get match from ID 'id' in window 'wp'. | |
6338 * Return NULL if match not found. | |
6339 */ | |
6340 matchitem_T * | |
6341 get_match(wp, id) | |
6342 win_T *wp; | |
6343 int id; | |
6344 { | |
6345 matchitem_T *cur = wp->w_match_head; | |
6346 | |
6347 while (cur != NULL && cur->id != id) | |
6348 cur = cur->next; | |
6349 return cur; | |
6350 } | |
6351 #endif |