From 4331f6a3c3e83160044ad75bf6d8ffcc05edab34 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 21 Sep 2015 21:11:32 -0700 Subject: linenoise: new Ctrl-X Ctrl-K command to delete line. * linenoise/linenoise.c (edit_delete_line): New static function. (edit): New Ctrl-K extended command case implemented using edit_delete_line. * txr.1: Documented. --- linenoise/linenoise.c | 31 +++++++++++++++++++++++++++++++ txr.1 | 7 +++++++ 2 files changed, 38 insertions(+) diff --git a/linenoise/linenoise.c b/linenoise/linenoise.c index 5753e7a4..fedb7805 100644 --- a/linenoise/linenoise.c +++ b/linenoise/linenoise.c @@ -1369,6 +1369,33 @@ static void edit_delete_prev_word(lino_t *l) { } } +static void edit_delete_line(lino_t *l) +{ + clear_sel(l); + + if (l->mlmode) { + char *e = l->data + l->dpos, *s = e; + size_t delta; + + while (s > l->data && s[-1] != '\r') + s--; + e += strcspn(e, "\r"); + if (*e == '\r') + e++; + + delta = e - s; + + if (delta > 0) { + record_undo(l); + memmove(s, e, l->data + l->dlen - e); + l->dlen -= delta; + l->dpos = s - l->data; + l->data[l->dlen] = 0; + l->need_refresh = 1; + } + } +} + static void tr(char *s, int find, int rep) { for (; *s; s++) @@ -1524,6 +1551,10 @@ static int edit(lino_t *l, const char *prompt) extended = 0; edit_in_editor(l); break; + case CTL('K'): + extended = 0; + edit_delete_line(l); + break; case CTL('V'): extended = 0; paste = 1; diff --git a/txr.1 b/txr.1 index 673c1d5e..53d7e32a 100644 --- a/txr.1 +++ b/txr.1 @@ -33653,6 +33653,13 @@ appears as such in multi-line mode, or as .code ^M in line mode. +.NP* Delete Current Line + +The Ctrl-X, Ctrl-K command sequence may be used in multi-line mode +to delete the entire physical line under the cursor. Any lines below that +line move up to close the gap. In line mode, the command has no effect, +other than canceling select mode. + .NP* History Recall By default, the most recent 500 lines submitted to the interactive listener are -- cgit v1.2.3