summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--catgirl.14
-rw-r--r--chat.h1
-rw-r--r--edit.c13
-rw-r--r--ui.c2
4 files changed, 19 insertions, 1 deletions
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));