diff options
author | June McEnroe <june@causal.agency> | 2021-11-19 14:44:16 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2021-11-19 14:44:16 -0500 |
commit | 9c1b241c17ac867a49b4bf48ae6537ebe37d6a11 (patch) | |
tree | 17dbc0e30bf1d51715ca02209f1c15c03bbeabb7 | |
parent | Make the /ops response more flavourful (diff) | |
download | catgirl-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.c | 14 |
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); |