diff options
author | Ron Yorston | 2021-04-15 12:06:11 +0100 |
---|---|---|
committer | Denys Vlasenko | 2021-04-15 13:09:12 +0200 |
commit | 47f78913f7576596d44c602a015735cb9c49f4f0 (patch) | |
tree | cbc4b77208ce31c124f2634253d58564518c2938 /editors | |
parent | d488def0e453781e0471cfb0971ad709a95c7919 (diff) | |
download | busybox-47f78913f7576596d44c602a015735cb9c49f4f0.zip busybox-47f78913f7576596d44c602a015735cb9c49f4f0.tar.gz |
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>
Diffstat (limited to 'editors')
-rw-r--r-- | editors/vi.c | 21 |
1 files changed, 14 insertions, 7 deletions
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); |