]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.776 v7.3.776
authorBram Moolenaar <Bram@vim.org>
Wed, 23 Jan 2013 14:53:15 +0000 (15:53 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 23 Jan 2013 14:53:15 +0000 (15:53 +0100)
Problem:    ml_get error when searching, caused by curwin not matching curbuf.
Solution:   Avoid changing curbuf. (Lech Lorens)

src/charset.c
src/eval.c
src/mark.c
src/proto/charset.pro
src/proto/mark.pro
src/regexp.c
src/syntax.c
src/version.c

index d3ebfbf765bf5d49637671609d13eb3baaf6a2b9..6f39cf6d076d283f561c86ba6eb543df42e2b287 100644 (file)
@@ -904,6 +904,14 @@ vim_isIDc(c)
     int
 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;
 {
index 7c575576548484a09cbffbb65a27c083a7ea6097..f645e9683e8090abd9f8f68b3cce229a17c65d0d 100644 (file)
@@ -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;
index 9b304f3d3860f293b4e8a4ed690dec7786b30136..540f70b97bb8bd2f94406c9b5e0c124db7154ed9 100644 (file)
@@ -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.
@@ -314,16 +314,26 @@ movechangelist(count)
  * - NULL if there is no mark called 'c'.
  * - -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;
index 472f1cd44edf8799ffee89f251b3644d889227ef..72eed4b071555a3c0c79f70e4a71a57edf0c0416 100644 (file)
@@ -19,8 +19,9 @@ int linetabsize_col __ARGS((int startcol, char_u *s));
 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));
index 1457829a74e90508e69742745dc370afafae62e6..e8cef9dd26f721cfd3b9ae0afb63bf34d0102a18 100644 (file)
@@ -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));
index b078de385be34ddc9a0921b1fb79768dedefe9a6..bb63c942f0df17d654a6980ab49fdfc3a487e1aa 100644 (file)
@@ -3623,7 +3623,6 @@ vim_regexec_multi(rmp, win, buf, lnum, col, tm)
     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, col, tm)
 #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 */
index 4adbaf087b92dd5ea894b9c6fe7c2e066f2b84a5..8e2930cf50be9d5ebf5d075d914e4af14532d16f 100644 (file)
@@ -1954,9 +1954,9 @@ syn_current_attr(syncing, displaying, can_spell, keep_state)
            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, flagsp, next_listp, cur_si, ccharp)
 #endif
            ++kwlen;
     }
-    while (vim_iswordc_buf(kwp + kwlen, syn_buf));
+    while (vim_iswordp_buf(kwp + kwlen, syn_buf));
 
     if (kwlen > MAXKEYWLEN)
        return 0;
index 725506e33cdebf89788b3948ca0cd9d1dee6d1db..03a483314608cb53e2bc5b83feab7662a2af0473 100644 (file)
@@ -725,6 +725,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    776,
 /**/
     775,
 /**/