| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.776 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| { |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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 */ |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 /// |