[git commit] vi: searches in colon commands should wrap

Denys Vlasenko vda.linux at googlemail.com
Sat Aug 21 22:09:57 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=08ad934ac4e341c35497497f4d617a514de524a1
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

The '/' and '?' search commands wrap to the other end of the buffer
if the search target isn't found.  When searches are used to specify
addresses in colon commands they should do the same.

(In traditional vi and vim this behaviour is controlled by the
'wrapscan' option.  BusyBox vi doesn't have this option and always
uses the default behaviour.)

function                                             old     new   delta
colon                                               4033    4077     +44
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 44/0)               Total: 44 bytes

Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/vi.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index 508477954..eee5e0ed2 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -2527,8 +2527,13 @@ static char *get_one_address(char *p, int *result)	// get colon addr, if present
 				dir = ((unsigned)BACK << 1) | FULL;
 			}
 			q = char_search(q, last_search_pattern + 1, dir);
-			if (q == NULL)
-				return NULL;
+			if (q == NULL) {
+				// no match, continue from other end of file
+				q = char_search(dir > 0 ? text : end - 1,
+								last_search_pattern + 1, dir);
+				if (q == NULL)
+					return NULL;
+			}
 			new_addr = count_lines(text, q);
 		}
 # endif


More information about the busybox-cvs mailing list