From 9c1b241c17ac867a49b4bf48ae6537ebe37d6a11 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 19 Nov 2021 14:44:16 -0500 Subject: 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 | --- edit.c | 14 +++++++++++--- 1 file 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); -- cgit 1.4.1