diff options
author | Bram Moolenaar <Bram@vim.org> | 2008-02-20 12:43:01 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2008-02-20 12:43:01 +0000 |
commit | 5bcbd537b4f4c61621db36341a20f867473aa582 (patch) | |
tree | 17f8a11344a97505e5763bfc6bdca44ee5901609 /src/search.c | |
parent | c7486c858dd8d94b83461bb0cd762adcf5ce4441 (diff) | |
download | vim-git-5bcbd537b4f4c61621db36341a20f867473aa582.tar.gz |
updated for version 7.1-258v7.1.258
Diffstat (limited to 'src/search.c')
-rw-r--r-- | src/search.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/src/search.c b/src/search.c index 1ad1df31f..9bdd03796 100644 --- a/src/search.c +++ b/src/search.c @@ -624,7 +624,7 @@ searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm) #ifdef FEAT_EVAL submatch = first_submatch(®match); #endif - /* Line me be past end of buffer for "\n\zs". */ + /* "lnum" may be past end of buffer for "\n\zs". */ if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) ptr = (char_u *)""; else @@ -833,21 +833,38 @@ searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm) continue; } - if (options & SEARCH_END && !(options & SEARCH_NOOF)) + /* With the SEARCH_END option move to the last character + * of the match. Don't do it for an empty match, end + * should be same as start then. */ + if (options & SEARCH_END && !(options & SEARCH_NOOF) + && !(matchpos.lnum == endpos.lnum + && matchpos.col == endpos.col)) { + /* For a match in the first column, set the position + * on the NUL in the previous line. */ pos->lnum = lnum + endpos.lnum; - pos->col = endpos.col - 1; -#ifdef FEAT_MBYTE - if (has_mbyte) + pos->col = endpos.col; + if (endpos.col == 0) { - /* 'e' offset may put us just below the last line */ - if (pos->lnum > buf->b_ml.ml_line_count) - ptr = (char_u *)""; - else - ptr = ml_get_buf(buf, pos->lnum, FALSE); - pos->col -= (*mb_head_off)(ptr, ptr + pos->col); + if (pos->lnum > 1) /* just in case */ + { + --pos->lnum; + pos->col = (colnr_T)STRLEN(ml_get_buf(buf, + pos->lnum, FALSE)); + } } + else + { + --pos->col; +#ifdef FEAT_MBYTE + if (has_mbyte + && pos->lnum <= buf->b_ml.ml_line_count) + { + ptr = ml_get_buf(buf, pos->lnum, FALSE); + pos->col -= (*mb_head_off)(ptr, ptr + pos->col); + } #endif + } } else { |