summaryrefslogtreecommitdiffstats
path: root/linenoise/linenoise.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-21 21:05:35 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-21 21:05:35 -0700
commitb0467383501c9d99d36b1882edf6d2997105cdee (patch)
tree323620dd4f5aa6de0fda914c5b62e2d4f693f63a /linenoise/linenoise.c
parent515b0cdcc0b4c61c2636444b08d3868e902d380d (diff)
downloadtxr-b0467383501c9d99d36b1882edf6d2997105cdee.tar.gz
txr-b0467383501c9d99d36b1882edf6d2997105cdee.tar.bz2
txr-b0467383501c9d99d36b1882edf6d2997105cdee.zip
linenoise: multi-line behavior for del to bol/eol.
* linenoise/linenoise.c (edit_delete_prev_all): In multi-line mode, delete only to beginning of physical line, not the entire logical line. Also, detect noop cases and don't do record undo or produce any effect. (edit_delete_to_eol): New function. (edit): Use edit_delete_to_eol function for Ctrl-K instead of inline code. * txr.1: Documented.
Diffstat (limited to 'linenoise/linenoise.c')
-rw-r--r--linenoise/linenoise.c66
1 files changed, 54 insertions, 12 deletions
diff --git a/linenoise/linenoise.c b/linenoise/linenoise.c
index 18106463..5753e7a4 100644
--- a/linenoise/linenoise.c
+++ b/linenoise/linenoise.c
@@ -1293,13 +1293,59 @@ static void edit_backspace(lino_t *l) {
/* Delete all characters to left of cursor. */
static void edit_delete_prev_all(lino_t *l)
{
- record_undo(l);
- delete_sel(l);
+ clear_sel(l);
+
+ if (!l->mlmode) {
+ if (l->dpos > 0) {
+ record_undo(l);
+ memmove(l->data, l->data + l->dpos, l->dlen - l->dpos + 1);
+ l->dlen -= l->dpos;
+ l->dpos = 0;
+ l->need_refresh = 1;
+ }
+ } else {
+ char *e = l->data + l->dpos, *s = e;
+ size_t delta;
+
+ while (s > l->data && s[-1] != '\r')
+ s--;
+
+ delta = e - s;
+
+ if (delta > 0) {
+ record_undo(l);
+ memmove(s, e, l->data + l->dlen - e);
+ l->dlen -= delta;
+ l->dpos -= delta;
+ l->data[l->dlen] = 0;
+ l->need_refresh = 1;
+ }
+ }
+}
+
+static void edit_delete_to_eol(lino_t *l)
+{
+ clear_sel(l);
- memmove(l->data, l->data + l->dpos, l->dlen - l->dpos + 1);
- l->dlen -= l->dpos;
- l->dpos = 0;
- l->need_refresh = 1;
+ if (l->dlen != l->dpos) {
+ if (!l->mlmode) {
+ record_undo(l);
+ l->data[l->dpos] = '\0';
+ l->dlen = l->dpos;
+ l->need_refresh = 1;
+ } else {
+ size_t delsize = strcspn(l->data + l->dpos, "\r");
+ if (delsize != 0) {
+ record_undo(l);
+ if (l->dlen - delsize)
+ memmove(l->data + l->dpos, l->data + l->dpos + delsize,
+ l->dlen - l->dpos - delsize);
+ l->dlen -= delsize;
+ l->data[l->dlen] = 0;
+ l->need_refresh = 1;
+ }
+ }
+ }
}
/* Delete the previosu word, maintaining the cursor at the start of the
@@ -1742,12 +1788,8 @@ static int edit(lino_t *l, const char *prompt)
if (l->clip != 0)
edit_insert_str(l, l->clip, strlen(l->clip));
break;
- case CTL('K'): /* delete from current to end of line. */
- record_undo(l);
- clear_sel(l);
- l->data[l->dpos] = '\0';
- l->dlen = l->dpos;
- l->need_refresh = 1;
+ case CTL('K'):
+ edit_delete_to_eol(l);
break;
case CTL('A'):
edit_move_home(l);