summaryrefslogtreecommitdiffstats
path: root/window-copy.c
diff options
context:
space:
mode:
authornicm <nicm>2021-08-09 13:08:08 +0000
committernicm <nicm>2021-08-09 13:08:08 +0000
commitbe5988457f2993d5a6efa5f6d5add37690ea6a30 (patch)
treefbb54cad39ce83bd8d8b1719d5a54661993138aa /window-copy.c
parent24cd6851f6a4e0152f59d22bf446e553cd7f23f9 (diff)
Change copy-line and copy-end-of-line not to cancel and add -and-cancel
variants, like the other copy commands. GitHub issue 2799.
Diffstat (limited to 'window-copy.c')
-rw-r--r--window-copy.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/window-copy.c b/window-copy.c
index 31875739..5c74cc2d 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -966,6 +966,42 @@ window_copy_cmd_copy_end_of_line(struct window_copy_cmd_state *cs)
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,6 +1033,44 @@ window_copy_cmd_copy_line(struct window_copy_cmd_state *cs)
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,8 +2338,12 @@ static const struct {
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,