diff options
-rw-r--r-- | editors/vi.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/editors/vi.c b/editors/vi.c index fd4526dda..4fda6aebf 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
@@ -2817,10 +2817,8 @@ static void colon(char *buf) | |||
2817 | } else if (cmd[0] == 's') { // substitute a pattern with a replacement pattern | 2817 | } else if (cmd[0] == 's') { // substitute a pattern with a replacement pattern |
2818 | char *F, *R, *flags; | 2818 | char *F, *R, *flags; |
2819 | size_t len_F, len_R; | 2819 | size_t len_F, len_R; |
2820 | int gflag; // global replace flag | 2820 | int gflag = 0; // global replace flag |
2821 | # if ENABLE_FEATURE_VI_UNDO | 2821 | int subs = 0; // number of substitutions |
2822 | int dont_chain_first_item = ALLOW_UNDO; | ||
2823 | # endif | ||
2824 | 2822 | ||
2825 | // F points to the "find" pattern | 2823 | // F points to the "find" pattern |
2826 | // R points to the "replace" pattern | 2824 | // R points to the "replace" pattern |
@@ -2833,11 +2831,11 @@ static void colon(char *buf) | |||
2833 | len_F = R - F; | 2831 | len_F = R - F; |
2834 | *R++ = '\0'; // terminate "find" | 2832 | *R++ = '\0'; // terminate "find" |
2835 | flags = strchr(R, c); | 2833 | flags = strchr(R, c); |
2836 | if (!flags) | 2834 | if (flags) { |
2837 | goto colon_s_fail; | 2835 | *flags++ = '\0'; // terminate "replace" |
2838 | len_R = flags - R; | 2836 | gflag = *flags; |
2839 | *flags++ = '\0'; // terminate "replace" | 2837 | } |
2840 | gflag = *flags; | 2838 | len_R = strlen(R); |
2841 | 2839 | ||
2842 | q = begin_line(q); | 2840 | q = begin_line(q); |
2843 | if (b < 0) { // maybe :s/foo/bar/ | 2841 | if (b < 0) { // maybe :s/foo/bar/ |
@@ -2856,14 +2854,15 @@ static void colon(char *buf) | |||
2856 | uintptr_t bias; | 2854 | uintptr_t bias; |
2857 | // we found the "find" pattern - delete it | 2855 | // we found the "find" pattern - delete it |
2858 | // For undo support, the first item should not be chained | 2856 | // For undo support, the first item should not be chained |
2859 | text_hole_delete(found, found + len_F - 1, dont_chain_first_item); | 2857 | text_hole_delete(found, found + len_F - 1, |
2860 | # if ENABLE_FEATURE_VI_UNDO | 2858 | subs ? ALLOW_UNDO_CHAIN: ALLOW_UNDO); |
2861 | dont_chain_first_item = ALLOW_UNDO_CHAIN; | 2859 | // can't do this above, no undo => no third argument |
2862 | # endif | 2860 | subs++; |
2863 | // insert the "replace" patern | 2861 | // insert the "replace" patern |
2864 | bias = string_insert(found, R, ALLOW_UNDO_CHAIN); | 2862 | bias = string_insert(found, R, ALLOW_UNDO_CHAIN); |
2865 | found += bias; | 2863 | found += bias; |
2866 | ls += bias; | 2864 | ls += bias; |
2865 | dot = ls; | ||
2867 | //q += bias; - recalculated anyway | 2866 | //q += bias; - recalculated anyway |
2868 | // check for "global" :s/foo/bar/g | 2867 | // check for "global" :s/foo/bar/g |
2869 | if (gflag == 'g') { | 2868 | if (gflag == 'g') { |
@@ -2875,6 +2874,11 @@ static void colon(char *buf) | |||
2875 | } | 2874 | } |
2876 | q = next_line(ls); | 2875 | q = next_line(ls); |
2877 | } | 2876 | } |
2877 | if (subs == 0) { | ||
2878 | status_line_bold("No match"); | ||
2879 | } else { | ||
2880 | dot_skip_over_ws(); | ||
2881 | } | ||
2878 | # endif /* FEATURE_VI_SEARCH */ | 2882 | # endif /* FEATURE_VI_SEARCH */ |
2879 | } else if (strncmp(cmd, "version", i) == 0) { // show software version | 2883 | } else if (strncmp(cmd, "version", i) == 0) { // show software version |
2880 | status_line(BB_VER); | 2884 | status_line(BB_VER); |