=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window-copy.c,v retrieving revision 1.324 retrieving revision 1.325 diff -c -r1.324 -r1.325 *** src/usr.bin/tmux/window-copy.c 2021/06/10 07:58:42 1.324 --- src/usr.bin/tmux/window-copy.c 2021/08/09 13:08:08 1.325 *************** *** 1,4 **** ! /* $OpenBSD: window-copy.c,v 1.324 2021/06/10 07:58:42 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window-copy.c,v 1.325 2021/08/09 13:08:08 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 966,971 **** --- 966,1007 ---- struct session *s = cs->s; struct winlink *wl = cs->wl; struct window_pane *wp = wme->wp; + u_int np = wme->prefix, ocx, ocy, ooy; + struct window_copy_mode_data *data = wme->data; + char *prefix = NULL; + + if (cs->args->argc == 2) + prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); + + ocx = data->cx; + ocy = data->cy; + ooy = data->oy; + + window_copy_start_selection(wme); + for (; np > 1; np--) + window_copy_cursor_down(wme, 0); + window_copy_cursor_end_of_line(wme); + + if (s != NULL) + window_copy_copy_selection(wme, prefix); + window_copy_clear_selection(wme); + + data->cx = ocx; + data->cy = ocy; + data->oy = ooy; + + free(prefix); + return (WINDOW_COPY_CMD_REDRAW); + } + + static enum window_copy_cmd_action + window_copy_cmd_copy_end_of_line_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; u_int np = wme->prefix; char *prefix = NULL; *************** *** 997,1002 **** --- 1033,1076 ---- struct winlink *wl = cs->wl; struct window_pane *wp = wme->wp; struct window_copy_mode_data *data = wme->data; + u_int np = wme->prefix, ocx, ocy, ooy; + char *prefix = NULL; + + if (cs->args->argc == 2) + prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); + + ocx = data->cx; + ocy = data->cy; + ooy = data->oy; + + data->selflag = SEL_CHAR; + window_copy_cursor_start_of_line(wme); + window_copy_start_selection(wme); + for (; np > 1; np--) + window_copy_cursor_down(wme, 0); + window_copy_cursor_end_of_line(wme); + + if (s != NULL) + window_copy_copy_selection(wme, prefix); + window_copy_clear_selection(wme); + + data->cx = ocx; + data->cy = ocy; + data->oy = ooy; + + free(prefix); + return (WINDOW_COPY_CMD_REDRAW); + } + + static enum window_copy_cmd_action + window_copy_cmd_copy_line_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; + struct window_copy_mode_data *data = wme->data; u_int np = wme->prefix; char *prefix = NULL; *************** *** 2264,2271 **** --- 2338,2349 ---- window_copy_cmd_clear_selection }, { "copy-end-of-line", 0, 1, WINDOW_COPY_CMD_CLEAR_ALWAYS, window_copy_cmd_copy_end_of_line }, + { "copy-end-of-line-and-cancel", 0, 1, WINDOW_COPY_CMD_CLEAR_ALWAYS, + window_copy_cmd_copy_end_of_line_and_cancel }, { "copy-line", 0, 1, WINDOW_COPY_CMD_CLEAR_ALWAYS, window_copy_cmd_copy_line }, + { "copy-line-and-cancel", 0, 1, WINDOW_COPY_CMD_CLEAR_ALWAYS, + window_copy_cmd_copy_line_and_cancel }, { "copy-pipe-no-clear", 0, 2, WINDOW_COPY_CMD_CLEAR_NEVER, window_copy_cmd_copy_pipe_no_clear }, { "copy-pipe", 0, 2, WINDOW_COPY_CMD_CLEAR_ALWAYS,