diff options
Diffstat (limited to 'Src/Zle/deltochar.c')
-rw-r--r-- | Src/Zle/deltochar.c | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/Src/Zle/deltochar.c b/Src/Zle/deltochar.c index 87f8593b8..054e7fe23 100644 --- a/Src/Zle/deltochar.c +++ b/Src/Zle/deltochar.c @@ -31,21 +31,24 @@ #include "deltochar.pro" static Widget w_deletetochar; +static Widget w_zaptochar; /**/ -static void -deltochar(void) +static int +deltochar(UNUSED(char **args)) { int c = getkey(0), dest = cs, ok = 0, n = zmult; + int zap = (bindk->widget == w_zaptochar); if (n > 0) { while (n-- && dest != ll) { while (dest != ll && line[dest] != c) dest++; if (dest != ll) { - dest++; + if (!zap || n > 0) + dest++; if (!n) { - foredel(dest - cs); + forekill(dest - cs, 0); ok++; } } @@ -57,35 +60,56 @@ deltochar(void) while (n++ && dest != 0) { while (dest != 0 && line[dest] != c) dest--; - if (line[dest] == c && !n) { - backdel(cs - dest); - ok++; + if (line[dest] == c) { + if (!n) { + backkill(cs - dest - zap, 1); + ok++; + } + if (dest) + dest--; } } } - if (!ok) - feep(); + return !ok; +} + +/**/ +int +setup_(UNUSED(Module m)) +{ + return 0; } /**/ int -boot_deltochar(Module m) +boot_(Module m) { - w_deletetochar = addzlefunction("delete-to-char", deltochar, ZLE_KEEPSUFFIX); - if (w_deletetochar) - return 0; - zwarnnam(m->nam, "name clash when adding ZLE function `delete-to-char'", + w_deletetochar = addzlefunction("delete-to-char", deltochar, + ZLE_KILL | ZLE_KEEPSUFFIX); + if (w_deletetochar) { + w_zaptochar = addzlefunction("zap-to-char", deltochar, + ZLE_KILL | ZLE_KEEPSUFFIX); + if (w_zaptochar) + return 0; + deletezlefunction(w_deletetochar); + } + zwarnnam(m->nam, "deltochar: name clash when adding ZLE functions", NULL, 0); return -1; } -#ifdef MODULE - /**/ int -cleanup_deltochar(Module m) +cleanup_(UNUSED(Module m)) { deletezlefunction(w_deletetochar); + deletezlefunction(w_zaptochar); + return 0; +} + +/**/ +int +finish_(UNUSED(Module m)) +{ return 0; } -#endif |