From 47f78913f7576596d44c602a015735cb9c49f4f0 Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Thu, 15 Apr 2021 12:06:11 +0100 Subject: 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 Signed-off-by: Denys Vlasenko --- editors/vi.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'editors') diff --git a/editors/vi.c b/editors/vi.c index 1d326f4..0866e0f 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -2346,9 +2346,9 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present { int st; # if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH - char *q; + char *q, c; # endif - IF_FEATURE_VI_YANKMARK(char c;) + IF_FEATURE_VI_SEARCH(int dir;) *addr = -1; // assume no addr if (*p == '.') { // the current line @@ -2372,18 +2372,25 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present } # endif # if ENABLE_FEATURE_VI_SEARCH - else if (*p == '/') { // a search pattern - q = strchrnul(p + 1, '/'); + else if (*p == '/' || *p == '?') { // a search pattern + c = *p; + q = strchrnul(p + 1, c); if (p + 1 != q) { // save copy of new pattern free(last_search_pattern); last_search_pattern = xstrndup(p, q - p); } p = q; - if (*p == '/') + if (*p == c) p++; - q = char_search(next_line(dot), last_search_pattern + 1, - (FORWARD << 1) | FULL); + if (c == '/') { + 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) return NULL; *addr = count_lines(text, q); -- cgit v1.1