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 |
			
			
This commit is contained in:
		
							parent
							
								
									bd3e0ac76b
								
							
						
					
					
						commit
						9c1b241c17
					
				
							
								
								
									
										14
									
								
								edit.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								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);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user