summary refs log tree commit diff
diff options
context:
space:
mode:
authorC. McEnroe2020-04-07 10:48:44 -0400
committerC. McEnroe2020-04-07 10:48:44 -0400
commite3f7362241a82d2089a45d119b86109c9d89ec8f (patch)
treec07c14f663ae4d21c2c5eb38353c72161051b99a
parent0bf49817f6c0c069ddee1b1e40ebfc1bae9c2639 (diff)
Add M-q to collapse whitespace
-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));