From 0d888b88d0d8e4853e0d23e00b3183a7b60ab877 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Thu, 17 Jun 2021 18:43:26 -0400 Subject: Match windows by substring in /window This could just iterate over idNames instead, but using complete means more recently used windows will match first. --- catgirl.1 | 7 ++++--- chat.h | 1 + command.c | 12 +++++++++++- complete.c | 9 +++++++++ 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; -- cgit 1.4.1