about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--catgirl.14
-rw-r--r--chat.h2
-rw-r--r--edit.c17
-rw-r--r--ui.c7
4 files changed, 26 insertions, 4 deletions
diff --git a/catgirl.1 b/catgirl.1
index 9cb208e..6f8256b 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -211,8 +211,12 @@ Move right.
 Delete to end of line.
 .It Ic C-u
 Delete to beginning of line.
+.It Ic C-w
+Delete previous word.
 .It Ic M-b
 Move to previous word.
+.It Ic M-d
+Delete next word.
 .It Ic M-f
 Move to next word.
 .El
diff --git a/chat.h b/chat.h
index ac56f51..fc18b15 100644
--- a/chat.h
+++ b/chat.h
@@ -155,6 +155,8 @@ enum Edit {
 	EditDeleteTail,
 	EditDeletePrev,
 	EditDeleteNext,
+	EditDeletePrevWord,
+	EditDeleteNextWord,
 	EditInsert,
 	EditComplete,
 	EditEnter,
diff --git a/edit.c b/edit.c
index 7b20079..47478ec 100644
--- a/edit.c
+++ b/edit.c
@@ -146,10 +146,23 @@ void edit(size_t id, enum Edit op, wchar_t ch) {
 			while (pos < len && buf[pos] != L' ') pos++;
 		}
 
-		break; case EditDeletePrev: if (pos) delete(--pos, 1);
-		break; case EditDeleteNext: delete(pos, 1);
 		break; case EditDeleteHead: delete(0, pos); pos = 0;
 		break; case EditDeleteTail: delete(pos, len - pos);
+		break; case EditDeletePrev: if (pos) delete(--pos, 1);
+		break; case EditDeleteNext: delete(pos, 1);
+		break; case EditDeletePrevWord: {
+			if (!pos) break;
+			size_t word = pos - 1;
+			while (word && buf[word - 1] != L' ') word--;
+			delete(word, pos - word);
+			pos = word;
+		}
+		break; case EditDeleteNextWord: {
+			if (pos == len) break;
+			size_t word = pos + 1;
+			while (word < len && buf[word] != L' ') word++;
+			delete(pos, word - pos);
+		}
 
 		break; case EditInsert: {
 			reserve(pos, 1);
diff --git a/ui.c b/ui.c
index e3b9cb5..65b4760 100644
--- a/ui.c
+++ b/ui.c
@@ -192,8 +192,9 @@ static void errExit(void) {
 	X(KeyMeta7, "\0337") \
 	X(KeyMeta8, "\0338") \
 	X(KeyMeta9, "\0339") \
-	X(KeyMetaB, "\033b") \
-	X(KeyMetaF, "\033f") \
+	X(KeyMetaB, "\33b") \
+	X(KeyMetaD, "\33d") \
+	X(KeyMetaF, "\33f") \
 	X(KeyMetaM, "\33m") \
 	X(KeyFocusIn, "\33[I") \
 	X(KeyFocusOut, "\33[O") \
@@ -625,6 +626,7 @@ static void keyCode(int code) {
 		break; case KeyPasteOff:; // TODO
 
 		break; case KeyMetaB: edit(id, EditPrevWord, 0);
+		break; case KeyMetaD: edit(id, EditDeleteNextWord, 0);
 		break; case KeyMetaF: edit(id, EditNextWord, 0);
 		break; case KeyMetaM: waddch(windows.active->pad, '\n');
 
@@ -659,6 +661,7 @@ static void keyCtrl(wchar_t ch) {
 		break; case L'K': edit(id, EditDeleteTail, 0);
 		break; case L'L': clearok(curscr, true);
 		break; case L'U': edit(id, EditDeleteHead, 0);
+		break; case L'W': edit(id, EditDeletePrevWord, 0);
 	}
 }