diff options
| author | C. McEnroe | 2021-06-17 18:43:26 -0400 | 
|---|---|---|
| committer | C. McEnroe | 2021-06-17 18:52:47 -0400 | 
| commit | 0d888b88d0d8e4853e0d23e00b3183a7b60ab877 (patch) | |
| tree | 42c2cb300ce6439a9d00e0293e2acb1c1a5abc38 | |
| parent | a8c1f0297657e34b825cdce4dbe32e56c9a50984 (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.1 | 7 | ||||
| -rw-r--r-- | chat.h | 1 | ||||
| -rw-r--r-- | command.c | 12 | ||||
| -rw-r--r-- | complete.c | 9 | 
4 files changed, 25 insertions, 4 deletions
| @@ -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 @@ -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); @@ -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; +		}  	}  } @@ -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; | 
