vi: allow backward search to specify line address
It should be possible to use a backward search as a line address in colon commands. function old new delta colon 3661 3701 +40 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 40/0) Total: 40 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d488def0e4
commit
47f78913f7
21
editors/vi.c
21
editors/vi.c
@ -2346,9 +2346,9 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present
|
|||||||
{
|
{
|
||||||
int st;
|
int st;
|
||||||
# if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH
|
# if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH
|
||||||
char *q;
|
char *q, c;
|
||||||
# endif
|
# endif
|
||||||
IF_FEATURE_VI_YANKMARK(char c;)
|
IF_FEATURE_VI_SEARCH(int dir;)
|
||||||
|
|
||||||
*addr = -1; // assume no addr
|
*addr = -1; // assume no addr
|
||||||
if (*p == '.') { // the current line
|
if (*p == '.') { // the current line
|
||||||
@ -2372,18 +2372,25 @@ 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 == '/' || *p == '?') { // a search pattern
|
||||||
q = strchrnul(p + 1, '/');
|
c = *p;
|
||||||
|
q = strchrnul(p + 1, c);
|
||||||
if (p + 1 != q) {
|
if (p + 1 != q) {
|
||||||
// save copy of new pattern
|
// save copy of new pattern
|
||||||
free(last_search_pattern);
|
free(last_search_pattern);
|
||||||
last_search_pattern = xstrndup(p, q - p);
|
last_search_pattern = xstrndup(p, q - p);
|
||||||
}
|
}
|
||||||
p = q;
|
p = q;
|
||||||
if (*p == '/')
|
if (*p == c)
|
||||||
p++;
|
p++;
|
||||||
q = char_search(next_line(dot), last_search_pattern + 1,
|
if (c == '/') {
|
||||||
(FORWARD << 1) | FULL);
|
q = next_line(dot);
|
||||||
|
dir = (FORWARD << 1) | FULL;
|
||||||
|
} else {
|
||||||
|
q = begin_line(dot);
|
||||||
|
dir = ((unsigned)BACK << 1) | FULL;
|
||||||
|
}
|
||||||
|
q = char_search(q, last_search_pattern + 1, dir);
|
||||||
if (q == NULL)
|
if (q == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
*addr = count_lines(text, q);
|
*addr = count_lines(text, q);
|
||||||
|
Loading…
Reference in New Issue
Block a user