summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-01-23 15:53:15 +0100
committerBram Moolenaar <Bram@vim.org>2013-01-23 15:53:15 +0100
commit9d182dd0a666f7cb706cd54dd78df3f59a160fff (patch)
tree53eb72dd576979b4fdde34e2b0eaff7f972a028f /src
parent4da70dbc4ddef9b2a2815cc0f6f09a283b65e671 (diff)
downloadvim-9d182dd0a666f7cb706cd54dd78df3f59a160fff.zip
updated for version 7.3.776
Problem: ml_get error when searching, caused by curwin not matching curbuf. Solution: Avoid changing curbuf. (Lech Lorens)
Diffstat (limited to 'src')
-rw-r--r--src/charset.c12
-rw-r--r--src/eval.c2
-rw-r--r--src/mark.c36
-rw-r--r--src/proto/charset.pro3
-rw-r--r--src/proto/mark.pro3
-rw-r--r--src/regexp.c14
-rw-r--r--src/syntax.c6
-rw-r--r--src/version.c2
8 files changed, 48 insertions, 30 deletions
diff --git a/src/charset.c b/src/charset.c
index d3ebfbf76..6f39cf6d0 100644
--- 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
index 7c5755765..f645e9683 100644
--- 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
index 9b304f3d3..540f70b97 100644
--- 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
index 472f1cd44..72eed4b07 100644
--- a/src/proto/charset.pro
+++ b/src/proto/charset.pro
@@ -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));
diff --git a/src/proto/mark.pro b/src/proto/mark.pro
index 1457829a7..e8cef9dd2 100644
--- 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
index b078de385..bb63c942f 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -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 */
diff --git a/src/syntax.c b/src/syntax.c
index 4adbaf087..8e2930cf5 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -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;
diff --git a/src/version.c b/src/version.c
index 725506e33..03a483314 100644
--- 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,