diff options
author | nicm <nicm> | 2019-04-23 09:39:07 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-04-23 09:39:07 +0000 |
commit | 564e44adc6816282cd40d59d1bc642937e53dc54 (patch) | |
tree | e5ee1f0ca5605d19c3a670bcb33b9611b53acc8d | |
parent | 6752f41c2a5ddfe2ac41ffd6a658a0f387b75804 (diff) | |
download | rtmux-564e44adc6816282cd40d59d1bc642937e53dc54.tar.gz rtmux-564e44adc6816282cd40d59d1bc642937e53dc54.tar.bz2 rtmux-564e44adc6816282cd40d59d1bc642937e53dc54.zip |
Add -no-clear variants of copy-selection and copy-pipe which do not
clear the selection after copying. Make copy-pipe clear the selection by
default to be consistent with copy-selection. From Avi Halachmi.
-rw-r--r-- | tmux.1 | 4 | ||||
-rw-r--r-- | window-copy.c | 63 |
2 files changed, 33 insertions, 34 deletions
@@ -1143,8 +1143,10 @@ The following commands are supported in copy mode: .It Li "copy-end-of-line [<prefix>]" Ta "D" Ta "C-k" .It Li "copy-line [<prefix>]" Ta "" Ta "" .It Li "copy-pipe <command> [<prefix>]" Ta "" Ta "" +.It Li "copy-pipe-no-clear <command> [<prefix>]" Ta "" Ta "" .It Li "copy-pipe-and-cancel <command> [<prefix>]" Ta "" Ta "" .It Li "copy-selection [<prefix>]" Ta "" Ta "" +.It Li "copy-selection-no-clear [<prefix>]" Ta "" Ta "" .It Li "copy-selection-and-cancel [<prefix>]" Ta "Enter" Ta "M-w" .It Li "cursor-down" Ta "j" Ta "Down" .It Li "cursor-left" Ta "h" Ta "Left" @@ -1206,6 +1208,8 @@ The .Ql -and-cancel variants of some commands exit copy mode after they have completed (for copy commands) or when the cursor reaches the bottom (for scrolling commands). +.Ql -no-clear +variants do not clear the selection. .Pp The next and previous word keys use space and the .Ql - , diff --git a/window-copy.c b/window-copy.c index aacea5c5..53dd97d3 100644 --- a/window-copy.c +++ b/window-copy.c @@ -734,7 +734,7 @@ window_copy_cmd_copy_line(struct window_copy_cmd_state *cs) } static enum window_copy_cmd_action -window_copy_cmd_copy_selection(struct window_copy_cmd_state *cs) +window_copy_cmd_copy_selection_no_clear(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct client *c = cs->c; @@ -748,9 +748,18 @@ window_copy_cmd_copy_selection(struct window_copy_cmd_state *cs) if (s != NULL) window_copy_copy_selection(wme, prefix); - window_copy_clear_selection(wme); free(prefix); + return (WINDOW_COPY_CMD_NOTHING); +} + +static enum window_copy_cmd_action +window_copy_cmd_copy_selection(struct window_copy_cmd_state *cs) +{ + struct window_mode_entry *wme = cs->wme; + + window_copy_cmd_copy_selection_no_clear(cs); + window_copy_clear_selection(wme); return (WINDOW_COPY_CMD_REDRAW); } @@ -758,20 +767,9 @@ static enum window_copy_cmd_action window_copy_cmd_copy_selection_and_cancel(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; - struct client *c = cs->c; - struct session *s = cs->s; - struct winlink *wl = cs->wl; - struct window_pane *wp = wme->wp; - char *prefix = NULL; - if (cs->args->argc == 2) - prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); - - if (s != NULL) - window_copy_copy_selection(wme, prefix); + window_copy_cmd_copy_selection_no_clear(cs); window_copy_clear_selection(wme); - - free(prefix); return (WINDOW_COPY_CMD_CANCEL); } @@ -1256,7 +1254,7 @@ window_copy_cmd_top_line(struct window_copy_cmd_state *cs) } static enum window_copy_cmd_action -window_copy_cmd_copy_pipe(struct window_copy_cmd_state *cs) +window_copy_cmd_copy_pipe_no_clear(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct client *c = cs->c; @@ -1280,30 +1278,23 @@ window_copy_cmd_copy_pipe(struct window_copy_cmd_state *cs) } static enum window_copy_cmd_action -window_copy_cmd_copy_pipe_and_cancel(struct window_copy_cmd_state *cs) +window_copy_cmd_copy_pipe(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; - struct client *c = cs->c; - struct session *s = cs->s; - struct winlink *wl = cs->wl; - struct window_pane *wp = wme->wp; - char *command = NULL; - char *prefix = NULL; - if (cs->args->argc == 3) - prefix = format_single(NULL, cs->args->argv[2], c, s, wl, wp); - - if (s != NULL && *cs->args->argv[1] != '\0') { - command = format_single(NULL, cs->args->argv[1], c, s, wl, wp); - window_copy_copy_pipe(wme, s, prefix, command); - free(command); + window_copy_cmd_copy_pipe_no_clear(cs); + window_copy_clear_selection(wme); + return (WINDOW_COPY_CMD_REDRAW); +} - free(prefix); - return (WINDOW_COPY_CMD_CANCEL); - } +static enum window_copy_cmd_action +window_copy_cmd_copy_pipe_and_cancel(struct window_copy_cmd_state *cs) +{ + struct window_mode_entry *wme = cs->wme; - free(prefix); - return (WINDOW_COPY_CMD_NOTHING); + window_copy_cmd_copy_pipe_no_clear(cs); + window_copy_clear_selection(wme); + return (WINDOW_COPY_CMD_CANCEL); } static enum window_copy_cmd_action @@ -1542,10 +1533,14 @@ static const struct { window_copy_cmd_copy_end_of_line }, { "copy-line", 0, 1, window_copy_cmd_copy_line }, + { "copy-pipe-no-clear", 1, 2, + window_copy_cmd_copy_pipe_no_clear }, { "copy-pipe", 1, 2, window_copy_cmd_copy_pipe }, { "copy-pipe-and-cancel", 1, 2, window_copy_cmd_copy_pipe_and_cancel }, + { "copy-selection-no-clear", 0, 1, + window_copy_cmd_copy_selection_no_clear }, { "copy-selection", 0, 1, window_copy_cmd_copy_selection }, { "copy-selection-and-cancel", 0, 1, |