diff --git a/7.3.776 b/7.3.776 new file mode 100644 index 00000000..fb052168 --- /dev/null +++ b/7.3.776 @@ -0,0 +1,435 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.776 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.776 +Problem: ml_get error when searching, caused by curwin not matching curbuf. +Solution: Avoid changing curbuf. (Lech Lorens) +Files: src/charset.c, src/eval.c, src/mark.c, src/proto/charset.pro, + src/proto/mark.pro, src/regexp.c, src/syntax.c + + +*** ../vim-7.3.775/src/charset.c 2012-05-25 11:56:06.000000000 +0200 +--- src/charset.c 2013-01-23 15:43:37.000000000 +0100 +*************** +*** 905,910 **** +--- 905,918 ---- + 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,920 **** + return utf_class(c) >= 2; + } + #endif +! return (c > 0 && c < 0x100 && GET_CHARTAB(curbuf, c) != 0); + } + + /* +--- 922,928 ---- + return utf_class(c) >= 2; + } + #endif +! return (c > 0 && c < 0x100 && GET_CHARTAB(buf, c) != 0); + } + + /* +*************** +*** 933,939 **** + + #if defined(FEAT_SYN_HL) || defined(PROTO) + int +! vim_iswordc_buf(p, buf) + char_u *p; + buf_T *buf; + { +--- 941,947 ---- + + #if defined(FEAT_SYN_HL) || defined(PROTO) + int +! vim_iswordp_buf(p, buf) + char_u *p; + buf_T *buf; + { +*** ../vim-7.3.775/src/eval.c 2012-12-05 16:10:21.000000000 +0100 +--- src/eval.c 2013-01-23 14:24:08.000000000 +0100 +*************** +*** 18884,18890 **** + #endif + if (name[0] == '\'') /* mark */ + { +! pp = getmark_fnum(name[1], FALSE, fnum); + if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) + return NULL; + return pp; +--- 18884,18890 ---- + #endif + if (name[0] == '\'') /* mark */ + { +! pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum); + if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) + return NULL; + return pp; +*** ../vim-7.3.775/src/mark.c 2012-07-06 17:51:24.000000000 +0200 +--- src/mark.c 2013-01-23 14:24:16.000000000 +0100 +*************** +*** 304,310 **** + #endif + + /* +! * Find mark "c". + * 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. +--- 304,310 ---- + #endif + + /* +! * 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,329 **** + * - -1 if mark is in other file and jumped there (only if changefile is TRUE) + */ + pos_T * + getmark(c, changefile) + int c; + int changefile; + { +! return getmark_fnum(c, changefile, NULL); + } + + pos_T * +! getmark_fnum(c, changefile, fnum) + int c; + int changefile; + int *fnum; +--- 315,339 ---- + * - -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_buf_fnum(curbuf, c, changefile, NULL); + } + + pos_T * +! getmark_buf_fnum(buf, c, changefile, fnum) +! buf_T *buf; + int c; + int changefile; + int *fnum; +*************** +*** 351,365 **** + posp = &pos_copy; /* w_pcmark may be changed soon */ + } + else if (c == '"') /* to pos when leaving buffer */ +! posp = &(curbuf->b_last_cursor); + else if (c == '^') /* to where Insert mode stopped */ +! posp = &(curbuf->b_last_insert); + else if (c == '.') /* to where last change was made */ +! posp = &(curbuf->b_last_change); + else if (c == '[') /* to start of previous operator */ +! posp = &(curbuf->b_op_start); + else if (c == ']') /* to end of previous operator */ +! posp = &(curbuf->b_op_end); + else if (c == '{' || c == '}') /* to previous/next paragraph */ + { + pos_T pos; +--- 361,375 ---- + posp = &pos_copy; /* w_pcmark may be changed soon */ + } + else if (c == '"') /* to pos when leaving buffer */ +! posp = &(buf->b_last_cursor); + else if (c == '^') /* to where Insert mode stopped */ +! posp = &(buf->b_last_insert); + else if (c == '.') /* to where last change was made */ +! posp = &(buf->b_last_change); + else if (c == '[') /* to start of previous operator */ +! posp = &(buf->b_op_start); + else if (c == ']') /* to end of previous operator */ +! posp = &(buf->b_op_end); + else if (c == '{' || c == '}') /* to previous/next paragraph */ + { + pos_T pos; +*************** +*** 395,402 **** + #ifdef FEAT_VISUAL + else if (c == '<' || c == '>') /* start/end of visual area */ + { +! startp = &curbuf->b_visual.vi_start; +! endp = &curbuf->b_visual.vi_end; + if ((c == '<') == lt(*startp, *endp)) + posp = startp; + else +--- 405,412 ---- + #ifdef FEAT_VISUAL + else if (c == '<' || c == '>') /* start/end of visual area */ + { +! startp = &buf->b_visual.vi_start; +! endp = &buf->b_visual.vi_end; + if ((c == '<') == lt(*startp, *endp)) + posp = startp; + else +*************** +*** 404,410 **** + /* + * For Visual line mode, set mark at begin or end of line + */ +! if (curbuf->b_visual.vi_mode == 'V') + { + pos_copy = *posp; + posp = &pos_copy; +--- 414,420 ---- + /* + * For Visual line mode, set mark at begin or end of line + */ +! if (buf->b_visual.vi_mode == 'V') + { + pos_copy = *posp; + posp = &pos_copy; +*************** +*** 420,426 **** + #endif + else if (ASCII_ISLOWER(c)) /* normal named mark */ + { +! posp = &(curbuf->b_namedm[c - 'a']); + } + else if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) /* named file mark */ + { +--- 430,436 ---- + #endif + else if (ASCII_ISLOWER(c)) /* normal named mark */ + { +! posp = &(buf->b_namedm[c - 'a']); + } + else if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) /* named file mark */ + { +*************** +*** 435,441 **** + + if (fnum != NULL) + *fnum = namedfm[c].fmark.fnum; +! else if (namedfm[c].fmark.fnum != curbuf->b_fnum) + { + /* mark is in another file */ + posp = &pos_copy; +--- 445,451 ---- + + if (fnum != NULL) + *fnum = namedfm[c].fmark.fnum; +! else if (namedfm[c].fmark.fnum != buf->b_fnum) + { + /* mark is in another file */ + posp = &pos_copy; +*** ../vim-7.3.775/src/proto/charset.pro 2010-08-15 21:57:28.000000000 +0200 +--- src/proto/charset.pro 2013-01-23 15:43:25.000000000 +0100 +*************** +*** 19,26 **** + 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_iswordp __ARGS((char_u *p)); +! int vim_iswordc_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)); +--- 19,27 ---- + 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_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)); +*** ../vim-7.3.775/src/proto/mark.pro 2010-08-15 21:57:28.000000000 +0200 +--- src/proto/mark.pro 2013-01-23 14:24:23.000000000 +0100 +*************** +*** 5,12 **** + void checkpcmark __ARGS((void)); + pos_T *movemark __ARGS((int count)); + pos_T *movechangelist __ARGS((int count)); + pos_T *getmark __ARGS((int c, int changefile)); +! pos_T *getmark_fnum __ARGS((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)); +--- 5,13 ---- + 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_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)); +*** ../vim-7.3.775/src/regexp.c 2011-07-20 17:58:14.000000000 +0200 +--- src/regexp.c 2013-01-23 14:19:15.000000000 +0100 +*************** +*** 3623,3629 **** + proftime_T *tm; /* timeout limit or NULL */ + { + long r; +- buf_T *save_curbuf = curbuf; + + reg_match = NULL; + reg_mmatch = rmp; +--- 3623,3628 ---- +*************** +*** 3638,3647 **** + #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; + } +--- 3637,3643 ---- +*************** +*** 4185,4191 **** + int cmp = OPERAND(scan)[1]; + pos_T *pos; + +! pos = getmark(mark, FALSE); + if (pos == NULL /* mark doesn't exist */ + || pos->lnum <= 0 /* mark isn't set (in curbuf) */ + || (pos->lnum == reglnum + reg_firstlnum +--- 4181,4187 ---- + int cmp = OPERAND(scan)[1]; + pos_T *pos; + +! 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,4322 **** + #endif + else + { +! if (!vim_iswordc(c) +! || (reginput > regline && vim_iswordc(reginput[-1]))) + status = RA_NOMATCH; + } + break; +--- 4311,4318 ---- + #endif + else + { +! if (!vim_iswordc_buf(c, reg_buf) +! || (reginput > regline && vim_iswordc_buf(reginput[-1], reg_buf))) + status = RA_NOMATCH; + } + break; +*************** +*** 4339,4346 **** + #endif + else + { +! if (!vim_iswordc(reginput[-1]) +! || (reginput[0] != NUL && vim_iswordc(c))) + status = RA_NOMATCH; + } + break; /* Matched with EOW */ +--- 4335,4342 ---- + #endif + else + { +! if (!vim_iswordc_buf(reginput[-1], reg_buf) +! || (reginput[0] != NUL && vim_iswordc_buf(c, reg_buf))) + status = RA_NOMATCH; + } + break; /* Matched with EOW */ +*** ../vim-7.3.775/src/syntax.c 2012-10-21 21:25:17.000000000 +0200 +--- src/syntax.c 2013-01-23 14:19:15.000000000 +0100 +*************** +*** 1954,1962 **** + if (do_keywords) + { + line = syn_getcurline(); +! if (vim_iswordc_buf(line + current_col, syn_buf) + && (current_col == 0 +! || !vim_iswordc_buf(line + current_col - 1 + #ifdef FEAT_MBYTE + - (has_mbyte + ? (*mb_head_off)(line, line + current_col - 1) +--- 1954,1962 ---- + if (do_keywords) + { + line = syn_getcurline(); +! if (vim_iswordp_buf(line + current_col, syn_buf) + && (current_col == 0 +! || !vim_iswordp_buf(line + current_col - 1 + #ifdef FEAT_MBYTE + - (has_mbyte + ? (*mb_head_off)(line, line + current_col - 1) +*************** +*** 3280,3286 **** + #endif + ++kwlen; + } +! while (vim_iswordc_buf(kwp + kwlen, syn_buf)); + + if (kwlen > MAXKEYWLEN) + return 0; +--- 3280,3286 ---- + #endif + ++kwlen; + } +! while (vim_iswordp_buf(kwp + kwlen, syn_buf)); + + if (kwlen > MAXKEYWLEN) + return 0; +*** ../vim-7.3.775/src/version.c 2013-01-23 13:55:16.000000000 +0100 +--- src/version.c 2013-01-23 14:19:44.000000000 +0100 +*************** +*** 727,728 **** +--- 727,730 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 776, + /**/ + +-- +Q: How does a UNIX Guru do Sex ? +A: unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///