aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-04-17 09:25:47 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2021-04-20 11:21:43 +0200
commitf277c9eebb91a46cbd795c34aa64ee8b6a2e448c (patch)
tree184512a390ddbe64607d2bd60fbcd26b5aa1b083
parent310ef232809b34a75c120629b7b2c0d4af0dd50f (diff)
downloadbusybox-w32-f277c9eebb91a46cbd795c34aa64ee8b6a2e448c.tar.gz
busybox-w32-f277c9eebb91a46cbd795c34aa64ee8b6a2e448c.tar.bz2
busybox-w32-f277c9eebb91a46cbd795c34aa64ee8b6a2e448c.zip
vi: make de-indentation with ctrl-D more like vim
Commit ac6495f6f (vi: allow ctrl-D to reduce indentation) treated ctrl-D during autoindent as a backspace. This was adequate for indentation using tabs but doesn't work well with the expandtab option. In the latter case it's necessary to backspace over all the spaces. Make ctrl-D work correctly when spaces are present in the indent. Also, make it behave more like vim: - ctrl-D is independent of autoindent; - indentation is reduced even when the cursor isn't positioned at the end of the indent. function old new delta char_insert 679 717 +38 get_column - 37 +37 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/0 up/down: 75/0) Total: 75 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/vi.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/editors/vi.c b/editors/vi.c
index de7a43325..caf01acd3 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -763,6 +763,11 @@ static int next_tabstop(int col)
763 return col + ((tabstop - 1) - (col % tabstop)); 763 return col + ((tabstop - 1) - (col % tabstop));
764} 764}
765 765
766static int prev_tabstop(int col)
767{
768 return col - ((col % tabstop) ?: tabstop);
769}
770
766static int next_column(char c, int co) 771static int next_column(char c, int co)
767{ 772{
768 if (c == '\t') 773 if (c == '\t')
@@ -772,7 +777,6 @@ static int next_column(char c, int co)
772 return co + 1; 777 return co + 1;
773} 778}
774 779
775#if ENABLE_FEATURE_VI_SETOPTS
776static int get_column(char *p) 780static int get_column(char *p)
777{ 781{
778 const char *r; 782 const char *r;
@@ -782,7 +786,6 @@ static int get_column(char *p)
782 co = next_column(*r, co); 786 co = next_column(*r, co);
783 return co; 787 return co;
784} 788}
785#endif
786 789
787//----- Erase the Screen[] memory ------------------------------ 790//----- Erase the Screen[] memory ------------------------------
788static void screen_erase(void) 791static void screen_erase(void)
@@ -2113,14 +2116,23 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
2113 if ((p[-1] != '\n') && (dot > text)) { 2116 if ((p[-1] != '\n') && (dot > text)) {
2114 p--; 2117 p--;
2115 } 2118 }
2116#if ENABLE_FEATURE_VI_SETOPTS 2119 } else if (c == 4) { // ctrl-D reduces indentation
2117 } else if (c == 4 && autoindent) { // ctrl-D reduces indentation 2120 int prev;
2118 q = begin_line(p); 2121 char *r, *bol;
2119 len = strspn(q, " \t"); 2122 bol = begin_line(p);
2120 if (len && q + len == p) { 2123 for (r = bol; r < end_line(p); ++r) {
2121 p--; 2124 if (!isblank(*r))
2122 p = text_hole_delete(p, p, ALLOW_UNDO_QUEUED); 2125 break;
2123 } 2126 }
2127
2128 prev = prev_tabstop(get_column(r));
2129 while (r > bol && get_column(r) > prev) {
2130 if (p > bol)
2131 p--;
2132 r--;
2133 r = text_hole_delete(r, r, ALLOW_UNDO_QUEUED);
2134 }
2135#if ENABLE_FEATURE_VI_SETOPTS
2124 } else if (c == '\t' && expandtab) { // expand tab 2136 } else if (c == '\t' && expandtab) { // expand tab
2125 int col = get_column(p); 2137 int col = get_column(p);
2126 col = next_tabstop(col) - col + 1; 2138 col = next_tabstop(col) - col + 1;