mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Add a -x flag to copy-selection, append-selection and start-named-buffer
to prevent it exiting copy mode after copying. From J Raynor with a few tweaks by me.
This commit is contained in:
		| @@ -104,18 +104,34 @@ cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, int key) | ||||
| 		return (CMD_RETURN_ERROR); | ||||
| 	} | ||||
|  | ||||
| 	if (cmd != MODEKEYCOPY_COPYPIPE) { | ||||
| 		if (args->argc != 2) { | ||||
| 			cmdq_error(cmdq, "no argument allowed"); | ||||
| 			return (CMD_RETURN_ERROR); | ||||
| 	switch (cmd) { | ||||
| 	case MODEKEYCOPY_APPENDSELECTION: | ||||
| 	case MODEKEYCOPY_COPYSELECTION: | ||||
| 	case MODEKEYCOPY_STARTNAMEDBUFFER: | ||||
| 		if (args->argc == 2) | ||||
| 			arg = NULL; | ||||
| 		else { | ||||
| 			arg = args->argv[2]; | ||||
| 			if (strcmp(arg, "-x") != 0) { | ||||
| 				cmdq_error(cmdq, "unknown argument"); | ||||
| 				return (CMD_RETURN_ERROR); | ||||
| 			} | ||||
| 		} | ||||
| 		arg = NULL; | ||||
| 	} else { | ||||
| 		break; | ||||
| 	case MODEKEYCOPY_COPYPIPE: | ||||
| 		if (args->argc != 3) { | ||||
| 			cmdq_error(cmdq, "no argument given"); | ||||
| 			return (CMD_RETURN_ERROR); | ||||
| 		} | ||||
| 		arg = args->argv[2]; | ||||
| 		break; | ||||
| 	default: | ||||
| 		if (args->argc != 2) { | ||||
| 			cmdq_error(cmdq, "no argument allowed"); | ||||
| 			return (CMD_RETURN_ERROR); | ||||
| 		} | ||||
| 		arg = NULL; | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	mtmp.key = key; | ||||
|   | ||||
							
								
								
									
										18
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -987,15 +987,27 @@ command and keys modified or removed with | ||||
| .Ic bind-key | ||||
| and | ||||
| .Ic unbind-key . | ||||
| One command accepts an argument, | ||||
| .Ic copy-pipe , | ||||
| which copies the selection and pipes it to a command. | ||||
| If | ||||
| .Ic append-selection , | ||||
| .Ic copy-selection , | ||||
| or | ||||
| .Ic start-named-buffer | ||||
| are given the | ||||
| .Fl x | ||||
| flag, | ||||
| .Nm | ||||
| will not exit copy mode after copying. | ||||
| .Ic copy-pipe | ||||
| copies the selection and pipes it to a command. | ||||
| For example the following will bind | ||||
| .Ql C-w | ||||
| not to exit after copying and | ||||
| .Ql C-q | ||||
| to copy the selection into | ||||
| .Pa /tmp | ||||
| as well as the paste buffer: | ||||
| .Bd -literal -offset indent | ||||
| bind-key -temacs-copy C-w copy-selection -x | ||||
| bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out" | ||||
| .Ed | ||||
| .Pp | ||||
|   | ||||
| @@ -147,6 +147,7 @@ struct window_copy_mode_data { | ||||
| 	enum window_copy_input_type inputtype; | ||||
| 	const char     *inputprompt; | ||||
| 	char	       *inputstr; | ||||
| 	int		inputexit; | ||||
|  | ||||
| 	int		numprefix; | ||||
|  | ||||
| @@ -424,8 +425,12 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) | ||||
| 	case MODEKEYCOPY_APPENDSELECTION: | ||||
| 		if (sess != NULL) { | ||||
| 			window_copy_append_selection(wp, NULL); | ||||
| 			window_pane_reset_mode(wp); | ||||
| 			return; | ||||
| 			if (arg == NULL) { | ||||
| 				window_pane_reset_mode(wp); | ||||
| 				return; | ||||
| 			} | ||||
| 			window_copy_clear_selection(wp); | ||||
| 			window_copy_redraw_screen(wp); | ||||
| 		} | ||||
| 		break; | ||||
| 	case MODEKEYCOPY_CANCEL: | ||||
| @@ -572,8 +577,12 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) | ||||
| 	case MODEKEYCOPY_COPYSELECTION: | ||||
| 		if (sess != NULL) { | ||||
| 			window_copy_copy_selection(wp, NULL); | ||||
| 			window_pane_reset_mode(wp); | ||||
| 			return; | ||||
| 			if (arg == NULL) { | ||||
| 				window_pane_reset_mode(wp); | ||||
| 				return; | ||||
| 			} | ||||
| 			window_copy_clear_selection(wp); | ||||
| 			window_copy_redraw_screen(wp); | ||||
| 		} | ||||
| 		break; | ||||
| 	case MODEKEYCOPY_STARTOFLINE: | ||||
| @@ -718,6 +727,7 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) | ||||
| 		goto input_on; | ||||
| 	case MODEKEYCOPY_STARTNAMEDBUFFER: | ||||
| 		data->inputtype = WINDOW_COPY_NAMEDBUFFER; | ||||
| 		data->inputexit = (arg == NULL); | ||||
| 		data->inputprompt = "Buffer"; | ||||
| 		*data->inputstr = '\0'; | ||||
| 		goto input_on; | ||||
| @@ -828,8 +838,13 @@ window_copy_key_input(struct window_pane *wp, int key) | ||||
| 		case WINDOW_COPY_NAMEDBUFFER: | ||||
| 			window_copy_copy_selection(wp, data->inputstr); | ||||
| 			*data->inputstr = '\0'; | ||||
| 			window_pane_reset_mode(wp); | ||||
| 			return (0); | ||||
| 			if (data->inputexit) { | ||||
| 				window_pane_reset_mode(wp); | ||||
| 				return (0); | ||||
| 			} | ||||
| 			window_copy_clear_selection(wp); | ||||
| 			window_copy_redraw_screen(wp); | ||||
| 			break; | ||||
| 		case WINDOW_COPY_GOTOLINE: | ||||
| 			window_copy_goto_line(wp, data->inputstr); | ||||
| 			*data->inputstr = '\0'; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm