diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2022-09-28 07:59:51 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2022-09-28 07:59:51 +0000 |
commit | fbfb21ce79308d054326b1268ccc22629363dc93 (patch) | |
tree | 4378f608145a15ffa32692828a8c9142fb5b7e2f /usr.bin | |
parent | aa264d2824fae548e9fde243c360ef165c4bfa60 (diff) |
Add scroll-top and scroll-bottom commands to scroll so cursor is at top
or bottom. From Anindya Mukherjee, GitHub issue 3334.
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/tmux/tmux.1 | 4 | ||||
-rw-r--r-- | usr.bin/tmux/window-copy.c | 58 |
2 files changed, 54 insertions, 8 deletions
diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 8e4dac44e2b..32a08a0ba92 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.902 2022/09/28 07:55:29 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.903 2022/09/28 07:59:50 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> .\" @@ -1808,7 +1808,9 @@ The following commands are supported in copy mode: .It Li "search-forward <for>" Ta "/" Ta "" .It Li "search-forward-incremental <for>" Ta "" Ta "C-s" .It Li "search-forward-text <for>" Ta "" Ta "" +.It Li "scroll-bottom" Ta "" Ta "" .It Li "scroll-middle" Ta "z" Ta "" +.It Li "scroll-top" Ta "" Ta "" .It Li "search-reverse" Ta "N" Ta "N" .It Li "select-line" Ta "V" Ta "" .It Li "select-word" Ta "" Ta "" diff --git a/usr.bin/tmux/window-copy.c b/usr.bin/tmux/window-copy.c index 56551d24430..401d7fcaa74 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.339 2022/08/23 08:14:19 nicm Exp $ */ +/* $OpenBSD: window-copy.c,v 1.340 2022/09/28 07:59:50 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -1250,20 +1250,23 @@ window_copy_cmd_cursor_right(struct window_copy_cmd_state *cs) return (WINDOW_COPY_CMD_NOTHING); } +/* Scroll line containing the cursor to the given position. */ static enum window_copy_cmd_action -window_copy_cmd_scroll_middle(struct window_copy_cmd_state *cs) +window_copy_cmd_scroll_to(struct window_copy_cmd_state *cs, u_int to) { struct window_mode_entry *wme = cs->wme; struct window_copy_mode_data *data = wme->data; - u_int mid_value, oy, delta; + u_int oy, delta; int scroll_up; /* >0 up, <0 down */ - mid_value = (screen_size_y(&data->screen) - 1) / 2; - scroll_up = data->cy - mid_value; + scroll_up = data->cy - to; delta = abs(scroll_up); - oy = screen_hsize(data->backing) + data->cy - data->oy; + oy = screen_hsize(data->backing) - data->oy; - log_debug ("XXX %u %u %u %d %u", mid_value, oy, delta, scroll_up, data->oy); + /* + * oy is the maximum scroll down amount, while data->oy is the maximum + * scroll up amount. + */ if (scroll_up > 0 && data->oy >= delta) { window_copy_scroll_up(wme, delta); data->cy -= delta; @@ -1276,6 +1279,35 @@ window_copy_cmd_scroll_middle(struct window_copy_cmd_state *cs) return (WINDOW_COPY_CMD_REDRAW); } +/* Scroll line containing the cursor to the bottom. */ +static enum window_copy_cmd_action +window_copy_cmd_scroll_bottom(struct window_copy_cmd_state *cs) +{ + struct window_copy_mode_data *data = cs->wme->data; + u_int bottom; + + bottom = screen_size_y(&data->screen) - 1; + return (window_copy_cmd_scroll_to(cs, bottom)); +} + +/* Scroll line containing the cursor to the middle. */ +static enum window_copy_cmd_action +window_copy_cmd_scroll_middle(struct window_copy_cmd_state *cs) +{ + struct window_copy_mode_data *data = cs->wme->data; + u_int mid_value; + + mid_value = (screen_size_y(&data->screen) - 1) / 2; + return (window_copy_cmd_scroll_to(cs, mid_value)); +} + +/* Scroll line containing the cursor to the top. */ +static enum window_copy_cmd_action +window_copy_cmd_scroll_top(struct window_copy_cmd_state *cs) +{ + return (window_copy_cmd_scroll_to(cs, 0)); +} + static enum window_copy_cmd_action window_copy_cmd_cursor_up(struct window_copy_cmd_state *cs) { @@ -2794,6 +2826,12 @@ static const struct { .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .f = window_copy_cmd_refresh_from_pane }, + { .command = "scroll-bottom", + .minargs = 0, + .maxargs = 0, + .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, + .f = window_copy_cmd_scroll_bottom + }, { .command = "scroll-down", .minargs = 0, .maxargs = 0, @@ -2812,6 +2850,12 @@ static const struct { .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .f = window_copy_cmd_scroll_middle }, + { .command = "scroll-top", + .minargs = 0, + .maxargs = 0, + .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, + .f = window_copy_cmd_scroll_top + }, { .command = "scroll-up", .minargs = 0, .maxargs = 0, |