add key bindings for moving to the word start or end
Mod1+b/^Left and Mod1+f/^Right
This commit is contained in:
		
				
					committed by
					
						
						Hiltjo Posthuma
					
				
			
			
				
	
			
			
			
						parent
						
							889512811d
						
					
				
				
					commit
					e2a280541e
				
			
							
								
								
									
										12
									
								
								dmenu.1
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								dmenu.1
									
									
									
									
									
								
							@@ -100,6 +100,12 @@ Confirm input.  Prints the input text to stdout and exits, returning success.
 | 
			
		||||
.B Escape
 | 
			
		||||
Exit without selecting an item, returning failure.
 | 
			
		||||
.TP
 | 
			
		||||
.B Ctrl-Left
 | 
			
		||||
Move cursor to the start of the current word
 | 
			
		||||
.TP
 | 
			
		||||
.B Ctrl-Right
 | 
			
		||||
Move cursor to the end of the current word
 | 
			
		||||
.TP
 | 
			
		||||
C\-a
 | 
			
		||||
Home
 | 
			
		||||
.TP
 | 
			
		||||
@@ -160,6 +166,12 @@ Paste from primary X selection
 | 
			
		||||
C\-Y
 | 
			
		||||
Paste from X clipboard
 | 
			
		||||
.TP
 | 
			
		||||
M\-b
 | 
			
		||||
Move cursor to the start of the current word
 | 
			
		||||
.TP
 | 
			
		||||
M\-f
 | 
			
		||||
Move cursor to the end of the current word
 | 
			
		||||
.TP
 | 
			
		||||
M\-g
 | 
			
		||||
Home
 | 
			
		||||
.TP
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								dmenu.c
									
									
									
									
									
								
							@@ -287,6 +287,22 @@ nextrune(int inc)
 | 
			
		||||
	return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
movewordedge(int dir)
 | 
			
		||||
{
 | 
			
		||||
	if (dir < 0) { /* move cursor to the start of the word*/
 | 
			
		||||
		while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
 | 
			
		||||
			cursor = nextrune(-1);
 | 
			
		||||
		while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
 | 
			
		||||
			cursor = nextrune(-1);
 | 
			
		||||
	} else { /* move cursor to the end of the word */
 | 
			
		||||
		while (text[cursor] && strchr(worddelimiters, text[cursor]))
 | 
			
		||||
			cursor = nextrune(+1);
 | 
			
		||||
		while (text[cursor] && !strchr(worddelimiters, text[cursor]))
 | 
			
		||||
			cursor = nextrune(+1);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
keypress(XKeyEvent *ev)
 | 
			
		||||
{
 | 
			
		||||
@@ -334,6 +350,14 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
			XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
 | 
			
		||||
			                  utf8, utf8, win, CurrentTime);
 | 
			
		||||
			return;
 | 
			
		||||
		case XK_Left:
 | 
			
		||||
			movewordedge(-1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_Right:
 | 
			
		||||
			movewordedge(+1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_Return:
 | 
			
		||||
		case XK_KP_Enter:
 | 
			
		||||
			break;
 | 
			
		||||
@@ -345,6 +369,14 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
		}
 | 
			
		||||
	else if (ev->state & Mod1Mask)
 | 
			
		||||
		switch(ksym) {
 | 
			
		||||
		case XK_b:
 | 
			
		||||
			movewordedge(-1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_f:
 | 
			
		||||
			movewordedge(+1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_g: ksym = XK_Home;  break;
 | 
			
		||||
		case XK_G: ksym = XK_End;   break;
 | 
			
		||||
		case XK_h: ksym = XK_Up;    break;
 | 
			
		||||
@@ -359,6 +391,8 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
		if (!iscntrl(*buf))
 | 
			
		||||
			insert(buf, len);
 | 
			
		||||
		break;
 | 
			
		||||
	case NoSymbol:
 | 
			
		||||
		break;
 | 
			
		||||
	case XK_Delete:
 | 
			
		||||
		if (text[cursor] == '\0')
 | 
			
		||||
			return;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user