vi: fixes to string search in colon commands, closes 10321
Handling of string searches in colon commands (e.g ':/pat1/,/pat2/cmd') differ from standard vi: - As reported in bug 10321 such searches can't be repeated using the 'n' command. This is because the last search pattern isn't updated. - The search also can't be repeated using the command '://' because an empty search pattern doesn't imply the use of the last search pattern. - Such searches should start on the line after the current line, otherwise '://' never moves to the next occurrence of the pattern. This can also affect other cases where line ranges are specified using search patterns. Fix these various issues. function old new delta get_one_address 325 342 +17 Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
b0c711e64f
commit
16bcd504a3
13
editors/vi.c
13
editors/vi.c
@ -2251,7 +2251,6 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present
|
|||||||
int st;
|
int st;
|
||||||
char *q;
|
char *q;
|
||||||
IF_FEATURE_VI_YANKMARK(char c;)
|
IF_FEATURE_VI_YANKMARK(char c;)
|
||||||
IF_FEATURE_VI_SEARCH(char *pat;)
|
|
||||||
|
|
||||||
*addr = -1; // assume no addr
|
*addr = -1; // assume no addr
|
||||||
if (*p == '.') { // the current line
|
if (*p == '.') { // the current line
|
||||||
@ -2276,16 +2275,20 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present
|
|||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_VI_SEARCH
|
#if ENABLE_FEATURE_VI_SEARCH
|
||||||
else if (*p == '/') { // a search pattern
|
else if (*p == '/') { // a search pattern
|
||||||
q = strchrnul(++p, '/');
|
q = strchrnul(p + 1, '/');
|
||||||
pat = xstrndup(p, q - p); // save copy of pattern
|
if (p + 1 != q) {
|
||||||
|
// save copy of new pattern
|
||||||
|
free(last_search_pattern);
|
||||||
|
last_search_pattern = xstrndup(p, q - p);
|
||||||
|
}
|
||||||
p = q;
|
p = q;
|
||||||
if (*p == '/')
|
if (*p == '/')
|
||||||
p++;
|
p++;
|
||||||
q = char_search(dot, pat, (FORWARD << 1) | FULL);
|
q = char_search(next_line(dot), last_search_pattern + 1,
|
||||||
|
(FORWARD << 1) | FULL);
|
||||||
if (q != NULL) {
|
if (q != NULL) {
|
||||||
*addr = count_lines(text, q);
|
*addr = count_lines(text, q);
|
||||||
}
|
}
|
||||||
free(pat);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (*p == '$') { // the last line in file
|
else if (*p == '$') { // the last line in file
|
||||||
|
Loading…
Reference in New Issue
Block a user