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 |
master
C. McEnroe 2021-11-19 14:44:16 -05:00
parent bd3e0ac76b
commit 9c1b241c17
1 changed files with 11 additions and 3 deletions

14
edit.c
View File

@ -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);