about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-11-19 14:44:16 -0500
committerJune McEnroe <june@causal.agency>2021-11-19 14:44:16 -0500
commit9c1b241c17ac867a49b4bf48ae6537ebe37d6a11 (patch)
tree17dbc0e30bf1d51715ca02209f1c15c03bbeabb7
parentMake the /ops response more flavourful (diff)
downloadcatgirl-9c1b241c17ac867a49b4bf48ae6537ebe37d6a11.tar.gz
catgirl-9c1b241c17ac867a49b4bf48ae6537ebe37d6a11.zip
Cycle between adding colon suffix and not in tab complete
Allows completing a nick at the beginning of a message without a
colon by continuing to press tab, as well as after another nick
already followed by a colon without turning it into a comma-separated
list of nicks all followed by a colon. For example, tab can be used
to cycle between the following pairs:

    nick1: |
	nick1 |

	nick1, nick2: |
	nick1: nick2 |
-rw-r--r--edit.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/edit.c b/edit.c
index 7dc0d34..71c5cca 100644
--- a/edit.c
+++ b/edit.c
@@ -130,6 +130,7 @@ static struct {
 	size_t pos;
 	size_t pre;
 	size_t len;
+	bool suffix;
 } tab;
 
 static void tabComplete(uint id) {
@@ -139,6 +140,7 @@ static void tabComplete(uint id) {
 		if (tab.pos == pos) return;
 		tab.pre = pos - tab.pos;
 		tab.len = tab.pre;
+		tab.suffix = true;
 	}
 
 	char mbs[MB_LEN_MAX * Cap];
@@ -148,7 +150,10 @@ static void tabComplete(uint id) {
 	mbs[n] = '\0';
 
 	const char *comp = complete(id, mbs);
-	if (!comp) comp = complete(id, mbs);
+	if (!comp) {
+		comp = complete(id, mbs);
+		tab.suffix ^= true;
+	}
 	if (!comp) {
 		tab.len = 0;
 		return;
@@ -169,12 +174,12 @@ static void tabComplete(uint id) {
 	tab.len = n;
 	if (wcs[0] == L'\\' || wcschr(wcs, L' ')) {
 		reserve(tab.pos, tab.len);
-	} else if (wcs[0] != L'/' && (!tab.pos || colon)) {
+	} else if (wcs[0] != L'/' && tab.suffix && (!tab.pos || colon)) {
 		tab.len += 2;
 		reserve(tab.pos, tab.len);
 		buf[tab.pos + n + 0] = L':';
 		buf[tab.pos + n + 1] = L' ';
-	} else if (tab.pos >= 2 && buf[tab.pos - 2] == L':') {
+	} else if (tab.suffix && tab.pos >= 2 && buf[tab.pos - 2] == L':') {
 		tab.len += 2;
 		reserve(tab.pos, tab.len);
 		buf[tab.pos - 2] = L',';
@@ -183,6 +188,9 @@ static void tabComplete(uint id) {
 	} else {
 		tab.len++;
 		reserve(tab.pos, tab.len);
+		if (!tab.suffix && tab.pos >= 2 && buf[tab.pos - 2] == L',') {
+			buf[tab.pos - 2] = L':';
+		}
 		buf[tab.pos + n] = L' ';
 	}
 	wmemcpy(&buf[tab.pos], wcs, n);
le='2021-01-20 18:37:21 +0000'>2021-01-20Add all target to git.causal.agency MakefileJune McEnroe 2021-01-20Remove Lua supportJune McEnroe Lua support is unused and the dlsym fwrite/write hacks horrify me. Clean it up. 2021-01-20Fix tests for diff spansJune McEnroe 2021-01-20Avoid matching ':' in make tagsJune McEnroe Otherwise a :: rule includes one of the ':'s in the tag name. 2021-01-19Prefer tag matches not preceded by [[:alnum:]]June McEnroe Otherwise the "id" in "void" matches for "void id". 2021-01-19Escape \ and / in mtags search patternsJune McEnroe 2021-01-20Use mtags in source-filterJune McEnroe 2021-01-19Add mtags to generate tags for make and mdocJune McEnroe 2021-01-19Map tags to IDs using only [[:alnum:]-._]June McEnroe 2021-01-19Don't use a pager if reading standard inputJune McEnroe 2021-01-19Support BSD make syntax and match *.amJune McEnroe These don't really go together, but... 2021-01-19Match tab following escaped newline in make assignmentsJune McEnroe Otherwise it ends up going into Shell state. 2021-01-18Allow matching lexers using first input lineJune McEnroe