From f27c0343fcb44e6c4449f1410c781ac0a416a3e1 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 10 Apr 2015 16:00:08 +0000 Subject: [PATCH] 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. --- usr.bin/tmux/cmd-bind-key.c | 30 +++++++++++++++++++++++------- usr.bin/tmux/tmux.1 | 20 ++++++++++++++++---- usr.bin/tmux/window-copy.c | 29 ++++++++++++++++++++++------- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/usr.bin/tmux/cmd-bind-key.c b/usr.bin/tmux/cmd-bind-key.c index 243741fbd4a..8987db400ac 100644 --- a/usr.bin/tmux/cmd-bind-key.c +++ b/usr.bin/tmux/cmd-bind-key.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-bind-key.c,v 1.19 2014/10/20 22:29:25 nicm Exp $ */ +/* $OpenBSD: cmd-bind-key.c,v 1.20 2015/04/10 16:00:08 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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; diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index e35ebe4fa34..9d8105df5c1 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.416 2015/04/10 07:23:14 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.417 2015/04/10 16:00:08 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -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 diff --git a/usr.bin/tmux/window-copy.c b/usr.bin/tmux/window-copy.c index 5de33519471..95b2f048544 100644 --- a/usr.bin/tmux/window-copy.c +++ b/usr.bin/tmux/window-copy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window-copy.c,v 1.124 2015/03/31 17:45:10 nicm Exp $ */ +/* $OpenBSD: window-copy.c,v 1.125 2015/04/10 16:00:08 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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'; -- 2.20.1