summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorC. McEnroe2021-06-17 18:43:26 -0400
committerC. McEnroe2021-06-17 18:52:47 -0400
commit0d888b88d0d8e4853e0d23e00b3183a7b60ab877 (patch)
tree42c2cb300ce6439a9d00e0293e2acb1c1a5abc38
parenta8c1f0297657e34b825cdce4dbe32e56c9a50984 (diff)
Match windows by substring in /window
This could just iterate over idNames instead, but using complete means more recently used windows will match first.
-rw-r--r--catgirl.17
-rw-r--r--chat.h1
-rw-r--r--command.c12
-rw-r--r--complete.c9
4 files changed, 25 insertions, 4 deletions
diff --git a/catgirl.1 b/catgirl.1
index 213b504..19a12f2 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -1,4 +1,4 @@
-.Dd May 28, 2021
+.Dd June 17, 2021
.Dt CATGIRL 1
.Os
.
@@ -521,8 +521,9 @@ Temporarily remove a message highlight pattern.
Temporarily remove a message ignore pattern.
.It Ic /window
List all windows.
-.It Ic /window Ar name
-Switch to window by name.
+.It Ic /window Ar name | substring
+Switch to window by name
+or matching substring.
.It Ic /window Ar num | Ic / Ns Ar num
Switch to window by number.
.El
diff --git a/chat.h b/chat.h
index 8c99cf5..3b6ac6a 100644
--- a/chat.h
+++ b/chat.h
@@ -360,6 +360,7 @@ char *editBuffer(size_t *pos);
void editCompleteAdd(void);
const char *complete(uint id, const char *prefix);
+const char *completeSubstr(uint id, const char *substr);
void completeAccept(void);
void completeReject(void);
void completeAdd(uint id, const char *str, enum Color color);
diff --git a/command.c b/command.c
index b345e11..84cb68f 100644
--- a/command.c
+++ b/command.c
@@ -379,7 +379,17 @@ static void commandWindow(uint id, char *params) {
uiShowNum(strtoul(params, NULL, 10));
} else {
id = idFind(params);
- if (id) uiShowID(id);
+ if (id) {
+ uiShowID(id);
+ return;
+ }
+ for (const char *match; (match = completeSubstr(None, params));) {
+ id = idFind(match);
+ if (!id) continue;
+ completeAccept();
+ uiShowID(id);
+ break;
+ }
}
}
diff --git a/complete.c b/complete.c
index 5835926..ead2457 100644
--- a/complete.c
+++ b/complete.c
@@ -119,6 +119,15 @@ const char *complete(uint id, const char *prefix) {
return NULL;
}
+const char *completeSubstr(uint id, const char *substr) {
+ for (match = (match ? match->next : head); match; match = match->next) {
+ if (match->id && match->id != id) continue;
+ if (!strcasestr(match->str, substr)) continue;
+ return match->str;
+ }
+ return NULL;
+}
+
void completeAccept(void) {
if (match) prepend(detach(match));
match = NULL;