add key bindings for moving to the word start or end
Mod1+b/^Left and Mod1+f/^Rightmain
							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; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue