vi: allow ctrl-D to reduce indentation
When whitespace has been automatically added to a new line due to autoindent entering ctrl-D should reduce the level of indentation. Implement an approximation of this by treating ctrl-D as backspace. For the common case of indentation using tabs this is good enough. My attempt at a full implementation was three times bigger. function old new delta char_insert 476 531 +55 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 55/0) Total: 55 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d6e653d667
commit
ac6495f6fb
16
editors/vi.c
16
editors/vi.c
@ -2072,6 +2072,11 @@ static uintptr_t stupid_insert(char *p, char c) // stupidly insert the char c at
|
|||||||
#endif
|
#endif
|
||||||
static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
|
static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
|
||||||
{
|
{
|
||||||
|
#if ENABLE_FEATURE_VI_SETOPTS
|
||||||
|
char *q;
|
||||||
|
size_t len;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (c == 22) { // Is this an ctrl-V?
|
if (c == 22) { // Is this an ctrl-V?
|
||||||
p += stupid_insert(p, '^'); // use ^ to indicate literal next
|
p += stupid_insert(p, '^'); // use ^ to indicate literal next
|
||||||
refresh(FALSE); // show the ^
|
refresh(FALSE); // show the ^
|
||||||
@ -2092,6 +2097,15 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
|
|||||||
if ((p[-1] != '\n') && (dot > text)) {
|
if ((p[-1] != '\n') && (dot > text)) {
|
||||||
p--;
|
p--;
|
||||||
}
|
}
|
||||||
|
#if ENABLE_FEATURE_VI_SETOPTS
|
||||||
|
} else if (c == 4 && autoindent) { // ctrl-D reduces indentation
|
||||||
|
q = begin_line(p);
|
||||||
|
len = strspn(q, " \t");
|
||||||
|
if (len && q + len == p) {
|
||||||
|
p--;
|
||||||
|
p = text_hole_delete(p, p, ALLOW_UNDO_QUEUED);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { // Is this a BS
|
} else if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { // Is this a BS
|
||||||
if (p > text) {
|
if (p > text) {
|
||||||
p--;
|
p--;
|
||||||
@ -2116,8 +2130,6 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
|
|||||||
showmatching(p - 1);
|
showmatching(p - 1);
|
||||||
}
|
}
|
||||||
if (autoindent && c == '\n') { // auto indent the new line
|
if (autoindent && c == '\n') { // auto indent the new line
|
||||||
char *q;
|
|
||||||
size_t len;
|
|
||||||
q = prev_line(p); // use prev line as template
|
q = prev_line(p); // use prev line as template
|
||||||
len = strspn(q, " \t"); // space or tab
|
len = strspn(q, " \t"); // space or tab
|
||||||
if (len) {
|
if (len) {
|
||||||
|
Loading…
Reference in New Issue
Block a user