# HG changeset patch # User vimboss # Date 1203511381 0 # Node ID fc42d9cc7ad054a21ac8bab2584732ebb191e5a6 # Parent 6c73a0d9f5119c5c52c7547af443d53642ff2b0f updated for version 7.1-258 diff --git a/src/search.c b/src/search.c --- a/src/search.c +++ b/src/search.c @@ -624,7 +624,7 @@ searchit(win, buf, pos, dir, pat, count, #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, 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 + 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); + pos->col -= (*mb_head_off)(ptr, ptr + pos->col); + } +#endif } -#endif } else {