# HG changeset patch # User Bram Moolenaar # Date 1358952795 -3600 # Node ID 80b041b994d156360992666110964e74f7473d3e # Parent 874910cb3cf55cb6a1bb91515068b53ff74455dc updated for version 7.3.776 Problem: ml_get error when searching, caused by curwin not matching curbuf. Solution: Avoid changing curbuf. (Lech Lorens) diff --git a/src/charset.c b/src/charset.c --- a/src/charset.c +++ b/src/charset.c @@ -905,6 +905,14 @@ vim_isIDc(c) vim_iswordc(c) int c; { + return vim_iswordc_buf(c, curbuf); +} + + int +vim_iswordc_buf(c, buf) + int c; + buf_T *buf; +{ #ifdef FEAT_MBYTE if (c >= 0x100) { @@ -914,7 +922,7 @@ vim_iswordc(c) return utf_class(c) >= 2; } #endif - return (c > 0 && c < 0x100 && GET_CHARTAB(curbuf, c) != 0); + return (c > 0 && c < 0x100 && GET_CHARTAB(buf, c) != 0); } /* @@ -933,7 +941,7 @@ vim_iswordp(p) #if defined(FEAT_SYN_HL) || defined(PROTO) int -vim_iswordc_buf(p, buf) +vim_iswordp_buf(p, buf) char_u *p; buf_T *buf; { diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -18884,7 +18884,7 @@ var2fpos(varp, dollar_lnum, fnum) #endif if (name[0] == '\'') /* mark */ { - pp = getmark_fnum(name[1], FALSE, fnum); + pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum); if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) return NULL; return pp; diff --git a/src/mark.c b/src/mark.c --- a/src/mark.c +++ b/src/mark.c @@ -304,7 +304,7 @@ movechangelist(count) #endif /* - * Find mark "c". + * Find mark "c" in buffer pointed to by "buf". * If "changefile" is TRUE it's allowed to edit another file for '0, 'A, etc. * If "fnum" is not NULL store the fnum there for '0, 'A etc., don't edit * another file. @@ -315,15 +315,25 @@ movechangelist(count) * - -1 if mark is in other file and jumped there (only if changefile is TRUE) */ pos_T * +getmark_buf(buf, c, changefile) + buf_T *buf; + int c; + int changefile; +{ + return getmark_buf_fnum(buf, c, changefile, NULL); +} + + pos_T * getmark(c, changefile) int c; int changefile; { - return getmark_fnum(c, changefile, NULL); + return getmark_buf_fnum(curbuf, c, changefile, NULL); } pos_T * -getmark_fnum(c, changefile, fnum) +getmark_buf_fnum(buf, c, changefile, fnum) + buf_T *buf; int c; int changefile; int *fnum; @@ -351,15 +361,15 @@ getmark_fnum(c, changefile, fnum) posp = &pos_copy; /* w_pcmark may be changed soon */ } else if (c == '"') /* to pos when leaving buffer */ - posp = &(curbuf->b_last_cursor); + posp = &(buf->b_last_cursor); else if (c == '^') /* to where Insert mode stopped */ - posp = &(curbuf->b_last_insert); + posp = &(buf->b_last_insert); else if (c == '.') /* to where last change was made */ - posp = &(curbuf->b_last_change); + posp = &(buf->b_last_change); else if (c == '[') /* to start of previous operator */ - posp = &(curbuf->b_op_start); + posp = &(buf->b_op_start); else if (c == ']') /* to end of previous operator */ - posp = &(curbuf->b_op_end); + posp = &(buf->b_op_end); else if (c == '{' || c == '}') /* to previous/next paragraph */ { pos_T pos; @@ -395,8 +405,8 @@ getmark_fnum(c, changefile, fnum) #ifdef FEAT_VISUAL else if (c == '<' || c == '>') /* start/end of visual area */ { - startp = &curbuf->b_visual.vi_start; - endp = &curbuf->b_visual.vi_end; + startp = &buf->b_visual.vi_start; + endp = &buf->b_visual.vi_end; if ((c == '<') == lt(*startp, *endp)) posp = startp; else @@ -404,7 +414,7 @@ getmark_fnum(c, changefile, fnum) /* * For Visual line mode, set mark at begin or end of line */ - if (curbuf->b_visual.vi_mode == 'V') + if (buf->b_visual.vi_mode == 'V') { pos_copy = *posp; posp = &pos_copy; @@ -420,7 +430,7 @@ getmark_fnum(c, changefile, fnum) #endif else if (ASCII_ISLOWER(c)) /* normal named mark */ { - posp = &(curbuf->b_namedm[c - 'a']); + posp = &(buf->b_namedm[c - 'a']); } else if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) /* named file mark */ { @@ -435,7 +445,7 @@ getmark_fnum(c, changefile, fnum) if (fnum != NULL) *fnum = namedfm[c].fmark.fnum; - else if (namedfm[c].fmark.fnum != curbuf->b_fnum) + else if (namedfm[c].fmark.fnum != buf->b_fnum) { /* mark is in another file */ posp = &pos_copy; diff --git a/src/proto/charset.pro b/src/proto/charset.pro --- a/src/proto/charset.pro +++ b/src/proto/charset.pro @@ -19,8 +19,9 @@ int linetabsize_col __ARGS((int startcol int win_linetabsize __ARGS((win_T *wp, char_u *p, colnr_T len)); int vim_isIDc __ARGS((int c)); int vim_iswordc __ARGS((int c)); +int vim_iswordc_buf __ARGS((int c, buf_T *buf)); int vim_iswordp __ARGS((char_u *p)); -int vim_iswordc_buf __ARGS((char_u *p, buf_T *buf)); +int vim_iswordp_buf __ARGS((char_u *p, buf_T *buf)); int vim_isfilec __ARGS((int c)); int vim_isfilec_or_wc __ARGS((int c)); int vim_isprintc __ARGS((int c)); diff --git a/src/proto/mark.pro b/src/proto/mark.pro --- a/src/proto/mark.pro +++ b/src/proto/mark.pro @@ -5,8 +5,9 @@ void setpcmark __ARGS((void)); void checkpcmark __ARGS((void)); pos_T *movemark __ARGS((int count)); pos_T *movechangelist __ARGS((int count)); +pos_T *getmark_buf __ARGS((buf_T *buf, int c, int changefile)); pos_T *getmark __ARGS((int c, int changefile)); -pos_T *getmark_fnum __ARGS((int c, int changefile, int *fnum)); +pos_T *getmark_buf_fnum __ARGS((buf_T *buf, int c, int changefile, int *fnum)); pos_T *getnextmark __ARGS((pos_T *startpos, int dir, int begin_line)); void fmarks_check_names __ARGS((buf_T *buf)); int check_mark __ARGS((pos_T *pos)); diff --git a/src/regexp.c b/src/regexp.c --- a/src/regexp.c +++ b/src/regexp.c @@ -3623,7 +3623,6 @@ vim_regexec_multi(rmp, win, buf, lnum, c proftime_T *tm; /* timeout limit or NULL */ { long r; - buf_T *save_curbuf = curbuf; reg_match = NULL; reg_mmatch = rmp; @@ -3638,10 +3637,7 @@ vim_regexec_multi(rmp, win, buf, lnum, c #endif ireg_maxcol = rmp->rmm_maxcol; - /* Need to switch to buffer "buf" to make vim_iswordc() work. */ - curbuf = buf; r = vim_regexec_both(NULL, col, tm); - curbuf = save_curbuf; return r; } @@ -4185,7 +4181,7 @@ regmatch(scan) int cmp = OPERAND(scan)[1]; pos_T *pos; - pos = getmark(mark, FALSE); + pos = getmark_buf(reg_buf, mark, FALSE); if (pos == NULL /* mark doesn't exist */ || pos->lnum <= 0 /* mark isn't set (in curbuf) */ || (pos->lnum == reglnum + reg_firstlnum @@ -4315,8 +4311,8 @@ regmatch(scan) #endif else { - if (!vim_iswordc(c) - || (reginput > regline && vim_iswordc(reginput[-1]))) + if (!vim_iswordc_buf(c, reg_buf) + || (reginput > regline && vim_iswordc_buf(reginput[-1], reg_buf))) status = RA_NOMATCH; } break; @@ -4339,8 +4335,8 @@ regmatch(scan) #endif else { - if (!vim_iswordc(reginput[-1]) - || (reginput[0] != NUL && vim_iswordc(c))) + if (!vim_iswordc_buf(reginput[-1], reg_buf) + || (reginput[0] != NUL && vim_iswordc_buf(c, reg_buf))) status = RA_NOMATCH; } break; /* Matched with EOW */ diff --git a/src/syntax.c b/src/syntax.c --- a/src/syntax.c +++ b/src/syntax.c @@ -1954,9 +1954,9 @@ syn_current_attr(syncing, displaying, ca if (do_keywords) { line = syn_getcurline(); - if (vim_iswordc_buf(line + current_col, syn_buf) + if (vim_iswordp_buf(line + current_col, syn_buf) && (current_col == 0 - || !vim_iswordc_buf(line + current_col - 1 + || !vim_iswordp_buf(line + current_col - 1 #ifdef FEAT_MBYTE - (has_mbyte ? (*mb_head_off)(line, line + current_col - 1) @@ -3280,7 +3280,7 @@ check_keyword_id(line, startcol, endcolp #endif ++kwlen; } - while (vim_iswordc_buf(kwp + kwlen, syn_buf)); + while (vim_iswordp_buf(kwp + kwlen, syn_buf)); if (kwlen > MAXKEYWLEN) return 0; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -726,6 +726,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 776, +/**/ 775, /**/ 774,