From e3f7362241a82d2089a45d119b86109c9d89ec8f Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Tue, 7 Apr 2020 10:48:44 -0400 Subject: Add M-q to collapse whitespace --- catgirl.1 | 4 +++- chat.h | 1 + edit.c | 13 +++++++++++++ ui.c | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/catgirl.1 b/catgirl.1 index 5ec8db1..a7c096c 100644 --- a/catgirl.1 +++ b/catgirl.1 @@ -1,4 +1,4 @@ -.Dd April 6, 2020 +.Dd April 7, 2020 .Dt CATGIRL 1 .Os . @@ -429,6 +429,8 @@ Move to previous word. Delete next word. .It Ic M-f Move to next word. +.It Ic M-q +Collapse all whitespace. .It Ic Tab Complete nick, channel, command or macro. .El diff --git a/chat.h b/chat.h index 7bcac3b..764f8ec 100644 --- a/chat.h +++ b/chat.h @@ -234,6 +234,7 @@ enum Edit { EditDeleteNextWord, EditPaste, EditTranspose, + EditCollapse, EditInsert, EditComplete, EditExpand, diff --git a/edit.c b/edit.c index 1b23737..a37a3e4 100644 --- a/edit.c +++ b/edit.c @@ -232,6 +232,19 @@ void edit(uint id, enum Edit op, wchar_t ch) { buf[pos - 1] = buf[pos]; buf[pos++] = t; } + break; case EditCollapse: { + size_t ws; + for (pos = 0; pos < len;) { + for (; pos < len && !iswspace(buf[pos]); ++pos); + for (ws = pos; ws < len && iswspace(buf[ws]); ++ws); + if (pos && ws < len) { + delete(false, pos, ws - pos - 1); + buf[pos++] = L' '; + } else { + delete(false, pos, ws - pos); + } + } + } break; case EditInsert: { if (reserve(pos, 1)) { diff --git a/ui.c b/ui.c index 03fa776..da6cd18 100644 --- a/ui.c +++ b/ui.c @@ -211,6 +211,7 @@ static short colorPair(short fg, short bg) { X(KeyMetaF, "\33f", NULL) \ X(KeyMetaL, "\33l", NULL) \ X(KeyMetaM, "\33m", NULL) \ + X(KeyMetaQ, "\33q", NULL) \ X(KeyMetaU, "\33u", NULL) \ X(KeyMetaV, "\33v", NULL) \ X(KeyMetaEnter, "\33\r", "\33\n") \ @@ -911,6 +912,7 @@ static void keyCode(int code) { break; case KeyMetaF: edit(id, EditNextWord, 0); break; case KeyMetaL: bufferList(&window->buffer); break; case KeyMetaM: waddch(window->pad, '\n'); + break; case KeyMetaQ: edit(id, EditCollapse, 0); break; case KeyMetaU: windowScrollUnread(window); break; case KeyMetaV: windowScroll(window, +(PAGE_LINES - 2)); -- cgit 1.4.1